From c293f4ba7467099c1d08c5bff0846a25216c709a Mon Sep 17 00:00:00 2001 From: Fernando Ojeda Date: Thu, 18 Jun 2020 17:16:48 -0400 Subject: [PATCH 1/5] Implement slcli vlan edit functionality. --- SoftLayer/CLI/routes.py | 1 + SoftLayer/CLI/vlan/edit.py | 41 ++++++++++++++++++++ SoftLayer/fixtures/SoftLayer_Network_Vlan.py | 3 ++ SoftLayer/managers/network.py | 40 +++++++++++++++++++ tests/CLI/modules/vlan_tests.py | 18 +++++++++ tests/managers/network_tests.py | 9 +++++ 6 files changed, 112 insertions(+) create mode 100644 SoftLayer/CLI/vlan/edit.py diff --git a/SoftLayer/CLI/routes.py b/SoftLayer/CLI/routes.py index cc67a7d2f..604841144 100644 --- a/SoftLayer/CLI/routes.py +++ b/SoftLayer/CLI/routes.py @@ -322,6 +322,7 @@ ('vlan', 'SoftLayer.CLI.vlan'), ('vlan:detail', 'SoftLayer.CLI.vlan.detail:cli'), + ('vlan:edit', 'SoftLayer.CLI.vlan.edit:cli'), ('vlan:list', 'SoftLayer.CLI.vlan.list:cli'), ('summary', 'SoftLayer.CLI.summary:cli'), diff --git a/SoftLayer/CLI/vlan/edit.py b/SoftLayer/CLI/vlan/edit.py new file mode 100644 index 000000000..20a004921 --- /dev/null +++ b/SoftLayer/CLI/vlan/edit.py @@ -0,0 +1,41 @@ +"""Edit a vlan's details.""" +# :license: MIT, see LICENSE for more details. + +import click + +import SoftLayer +from SoftLayer.CLI import environment, exceptions +from SoftLayer.CLI import formatting +from SoftLayer.CLI import helpers + + +@click.command() +@click.argument('identifier') +@click.option('--name', '-n', + help="The optional name for this VLAN") +@click.option('--note', '-e', + help="The note for this vlan.") +@click.option('--tags', '-g', + multiple=True, + help='Tags to set e.g. "tag1,tag2", or empty string to remove all' + ) +@environment.pass_env +def cli(env, identifier, name, note, tags): + """Edit a vlan's details.""" + + data = { + 'name': name, + 'note': note + } + + if tags: + data['tags'] = ','.join(tags) + + mgr = SoftLayer.NetworkManager(env.client) + vlan_id = helpers.resolve_id(mgr.resolve_vlan_ids, identifier, 'VLAN') + vlan = mgr.edit(vlan_id, **data) + + if vlan: + click.secho("Vlan edited successfully", fg='green') + else: + click.secho("Failed to edit the vlan", fg='red') diff --git a/SoftLayer/fixtures/SoftLayer_Network_Vlan.py b/SoftLayer/fixtures/SoftLayer_Network_Vlan.py index 5c7d7232a..b18632534 100644 --- a/SoftLayer/fixtures/SoftLayer_Network_Vlan.py +++ b/SoftLayer/fixtures/SoftLayer_Network_Vlan.py @@ -7,3 +7,6 @@ 'vlanNumber': 4444, 'firewallInterfaces': None } + +editObject = True +setTags = True diff --git a/SoftLayer/managers/network.py b/SoftLayer/managers/network.py index dbfb9c3f6..49dde11d7 100644 --- a/SoftLayer/managers/network.py +++ b/SoftLayer/managers/network.py @@ -7,12 +7,17 @@ """ import collections import json +import logging + +from SoftLayer.decoration import retry from SoftLayer import exceptions from SoftLayer import utils from SoftLayer.managers import event_log +LOGGER = logging.getLogger(__name__) + DEFAULT_SUBNET_MASK = ','.join(['hardware', 'datacenter', 'ipAddressCount', @@ -685,3 +690,38 @@ def get_nas_credentials(self, identifier, **kwargs): """ result = self.network_storage.getObject(id=identifier, **kwargs) return result + + def edit(self, instance_id, name=None, note=None, tags=None): + """Edit a vlan. + + :param integer instance_id: the instance ID to edit. + :param string name: valid name. + :param string note: note about this particular v;am. + :param string tags: tags to set on the vlan as a comma separated list. + Use the empty string to remove all tags. + :returns: bool -- True or an Exception + """ + + obj = {} + + if tags is not None: + self.set_tags(tags, vlan_id=instance_id) + + if name: + obj['name'] = name + + if note: + obj['note'] = note + + if not obj: + return True + + return self.vlan.editObject(obj, id=instance_id) + + @retry(logger=LOGGER) + def set_tags(self, tags, vlan_id): + """Sets tags on a vlan with a retry decorator + + Just calls vlan.setTags, but if it fails from an APIError will retry. + """ + self.vlan.setTags(tags, id=vlan_id) diff --git a/tests/CLI/modules/vlan_tests.py b/tests/CLI/modules/vlan_tests.py index 86b15507a..1cdd3f3f5 100644 --- a/tests/CLI/modules/vlan_tests.py +++ b/tests/CLI/modules/vlan_tests.py @@ -4,6 +4,8 @@ :license: MIT, see LICENSE for more details. """ +import mock + from SoftLayer import testing @@ -76,3 +78,19 @@ def test_detail_hardware_without_hostname(self): vlan_mock.return_value = getObject result = self.run_command(['vlan', 'detail', '1234']) self.assert_no_fail(result) + + @mock.patch('SoftLayer.CLI.vlan.edit.click') + def test_vlan_edit(self, click): + result = self.run_command(['vlan', 'edit', '--name=nameTest', '--note=noteTest', '--tags=tag1,tag2', '100']) + click.secho.assert_called_with('Vlan edited successfully', fg='green') + self.assert_no_fail(result) + self.assert_called_with('SoftLayer_Network_Vlan', 'editObject', identifier=100) + + @mock.patch('SoftLayer.CLI.vlan.edit.click') + def test_vlan_edit_failure(self, click): + mock = self.set_mock('SoftLayer_Network_Vlan', 'editObject') + mock.return_value = False + result = self.run_command(['vlan', 'edit', '--name=nameTest', '--note=noteTest', '--tags=tag1,tag2', '100']) + click.secho.assert_called_with('Failed to edit the vlan', fg='red') + self.assert_no_fail(result) + self.assert_called_with('SoftLayer_Network_Vlan', 'editObject', identifier=100) diff --git a/tests/managers/network_tests.py b/tests/managers/network_tests.py index fd986e2ea..165d04b71 100644 --- a/tests/managers/network_tests.py +++ b/tests/managers/network_tests.py @@ -625,3 +625,12 @@ def test_get_cci_event_logs(self): _filter = {'objectName': {'operation': 'CCI'}} self.assert_called_with('SoftLayer_Event_Log', 'getAllObjects', filter=_filter) self.assertEqual(100, log['accountId']) + + def test_vlan_edit(self): + vlan_id = 100 + name = "test" + note = "test note" + tags = "tag1,tag2" + + self.network.edit(vlan_id, name, note, tags) + self.assert_called_with('SoftLayer_Network_Vlan', 'editObject') From 303a63072b4a967203d333105d367e5398f7859c Mon Sep 17 00:00:00 2001 From: Fernando Ojeda Date: Thu, 18 Jun 2020 17:31:49 -0400 Subject: [PATCH 2/5] Add documentation and fix tox analysis. --- SoftLayer/CLI/vlan/edit.py | 3 +-- docs/cli/vlan.rst | 4 ++++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/SoftLayer/CLI/vlan/edit.py b/SoftLayer/CLI/vlan/edit.py index 20a004921..3d043615d 100644 --- a/SoftLayer/CLI/vlan/edit.py +++ b/SoftLayer/CLI/vlan/edit.py @@ -4,8 +4,7 @@ import click import SoftLayer -from SoftLayer.CLI import environment, exceptions -from SoftLayer.CLI import formatting +from SoftLayer.CLI import environment from SoftLayer.CLI import helpers diff --git a/docs/cli/vlan.rst b/docs/cli/vlan.rst index 1733f40e4..6fc084da7 100644 --- a/docs/cli/vlan.rst +++ b/docs/cli/vlan.rst @@ -7,6 +7,10 @@ VLANs :prog: vlan detail :show-nested: +.. click:: SoftLayer.CLI.vlan.edit:cli + :prog: vlan edit + :show-nested: + .. click:: SoftLayer.CLI.vlan.list:cli :prog: vlan list :show-nested: From 38d4dd49bdcb391854f33bc5251a80e6d2cbc065 Mon Sep 17 00:00:00 2001 From: Fernando Ojeda Date: Thu, 18 Jun 2020 17:59:43 -0400 Subject: [PATCH 3/5] Fix tox analysis. --- SoftLayer/managers/network.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/SoftLayer/managers/network.py b/SoftLayer/managers/network.py index 49dde11d7..4c22aa678 100644 --- a/SoftLayer/managers/network.py +++ b/SoftLayer/managers/network.py @@ -18,6 +18,8 @@ LOGGER = logging.getLogger(__name__) +# pylint: disable=no-self-use,too-many-lines + DEFAULT_SUBNET_MASK = ','.join(['hardware', 'datacenter', 'ipAddressCount', From b5a8dd00acbaf11b43a9595da78430995ef07bd2 Mon Sep 17 00:00:00 2001 From: Fernando Ojeda Date: Thu, 18 Jun 2020 18:02:51 -0400 Subject: [PATCH 4/5] Fix tox analysis. --- SoftLayer/managers/network.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SoftLayer/managers/network.py b/SoftLayer/managers/network.py index 4c22aa678..abe625f85 100644 --- a/SoftLayer/managers/network.py +++ b/SoftLayer/managers/network.py @@ -18,7 +18,7 @@ LOGGER = logging.getLogger(__name__) -# pylint: disable=no-self-use,too-many-lines +# pylint: disable=too-many-public-methods DEFAULT_SUBNET_MASK = ','.join(['hardware', 'datacenter', From 38e61a2a4245de9bb07f68a9cb05e00e0bfa4b36 Mon Sep 17 00:00:00 2001 From: Fernando Ojeda Date: Mon, 22 Jun 2020 09:59:19 -0400 Subject: [PATCH 5/5] Refactor vlan edit functionality. --- SoftLayer/CLI/vlan/edit.py | 9 +++------ SoftLayer/managers/network.py | 2 +- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/SoftLayer/CLI/vlan/edit.py b/SoftLayer/CLI/vlan/edit.py index 3d043615d..c623e5d2d 100644 --- a/SoftLayer/CLI/vlan/edit.py +++ b/SoftLayer/CLI/vlan/edit.py @@ -22,17 +22,14 @@ def cli(env, identifier, name, note, tags): """Edit a vlan's details.""" - data = { - 'name': name, - 'note': note - } + new_tags = None if tags: - data['tags'] = ','.join(tags) + new_tags = ','.join(tags) mgr = SoftLayer.NetworkManager(env.client) vlan_id = helpers.resolve_id(mgr.resolve_vlan_ids, identifier, 'VLAN') - vlan = mgr.edit(vlan_id, **data) + vlan = mgr.edit(vlan_id, name=name, note=note, tags=new_tags) if vlan: click.secho("Vlan edited successfully", fg='green') diff --git a/SoftLayer/managers/network.py b/SoftLayer/managers/network.py index abe625f85..b3f6f7b6d 100644 --- a/SoftLayer/managers/network.py +++ b/SoftLayer/managers/network.py @@ -698,7 +698,7 @@ def edit(self, instance_id, name=None, note=None, tags=None): :param integer instance_id: the instance ID to edit. :param string name: valid name. - :param string note: note about this particular v;am. + :param string note: note about this particular vlan. :param string tags: tags to set on the vlan as a comma separated list. Use the empty string to remove all tags. :returns: bool -- True or an Exception