From 6f88bae9b278000312f909475f97a5d3050ae2e5 Mon Sep 17 00:00:00 2001 From: Tim Rupp Date: Fri, 19 Jan 2018 12:38:32 -0800 Subject: [PATCH] Removes partition requirement from device groups Issues: Fixes #1365 Problem: DGs required partition arg Analysis: Removes partition arg and defaults everything to Common Tests: functional --- f5/bigip/tm/cm/device_group.py | 42 ++++++++++++++++++- .../cm/test/functional/test_device_group.py | 19 ++++----- 2 files changed, 49 insertions(+), 12 deletions(-) diff --git a/f5/bigip/tm/cm/device_group.py b/f5/bigip/tm/cm/device_group.py index af7c20c1d..c8fb1d9dd 100644 --- a/f5/bigip/tm/cm/device_group.py +++ b/f5/bigip/tm/cm/device_group.py @@ -27,10 +27,17 @@ ``tm:cm:device-group:*`` """ +from distutils.version import LooseVersion from f5.bigip.resource import Collection from f5.bigip.resource import Resource +def fqdn_name(partition, value): + if value is not None and not value.startswith('/'): + return '/{0}/{1}'.format(partition, value) + return value + + class Device_Groups(Collection): """BIG-IPĀ® cluster device-groups collection.""" def __init__(self, cm): @@ -45,7 +52,6 @@ class Device_Group(Resource): def __init__(self, device_groups): super(Device_Group, self).__init__(device_groups) self._meta_data['read_only_attributes'].append('type') - self._meta_data['required_creation_parameters'].update(('partition',)) self._meta_data['required_json_kind'] =\ 'tm:cm:device-group:device-groupstate' self._meta_data['attribute_registry'] = { @@ -104,4 +110,36 @@ def __init__(self, devices_s): super(Devices, self).__init__(devices_s) self._meta_data['required_json_kind'] =\ 'tm:cm:device-group:devices:devicesstate' - self._meta_data['required_creation_parameters'].update(('partition',)) + + def create(self, **kwargs): + # Name munging is required < 11.6.0 and on versions (and sub versions) + # of 11.6.1. + # TODO(Remove this when 11.6.1 is no longer supported) + tmos_v = self._meta_data['bigip']._meta_data['tmos_version'] + tmos_v = LooseVersion(tmos_v) + if tmos_v < LooseVersion('11.6.0'): + self._fixup_name(kwargs) + elif tmos_v > LooseVersion('11.6.0') and tmos_v < LooseVersion('12.0.0'): + self._fixup_name(kwargs) + return self._create(**kwargs) + + def _fixup_name(self, kwargs): + # Name munging is required < 11.6.0 and on versions (and sub versions) + # of 11.6.1. + # TODO(Remove this when 11.6.1 is no longer supported) + if 'name' in kwargs: + kwargs['name'] = fqdn_name('Common', kwargs['name']) + else: + self.__dict__['name'] = fqdn_name('Common', self.__dict__['name']) + + def delete(self, **kwargs): + # Name munging is required < 11.6.0 and on versions (and sub versions) + # of 11.6.1. + # TODO(Remove this when 11.6.1 is no longer supported) + tmos_v = self._meta_data['bigip']._meta_data['tmos_version'] + tmos_v = LooseVersion(tmos_v) + if tmos_v < LooseVersion('11.6.0'): + self._fixup_name(kwargs) + elif tmos_v > LooseVersion('11.6.0') and tmos_v < LooseVersion('12.0.0'): + self._fixup_name(kwargs) + return self._delete(**kwargs) diff --git a/f5/bigip/tm/cm/test/functional/test_device_group.py b/f5/bigip/tm/cm/test/functional/test_device_group.py index 9258abe06..6c89e326f 100644 --- a/f5/bigip/tm/cm/test/functional/test_device_group.py +++ b/f5/bigip/tm/cm/test/functional/test_device_group.py @@ -22,7 +22,7 @@ TEST_DESCR = "TEST DESCRIPTION" -def setup_device_group_test(request, mgmt_root, name, partition): +def setup_device_group_test(request, mgmt_root, name): def teardown(): try: for d in dg.devices_s.get_collection(): @@ -34,7 +34,7 @@ def teardown(): request.addfinalizer(teardown) dgs = mgmt_root.tm.cm.device_groups - dg = dgs.device_group.create(name=name, partition=partition) + dg = dgs.device_group.create(name=name) return dg, dgs @@ -42,13 +42,12 @@ class TestDeviceGroup(object): def test_device_group_CURDL(self, request, mgmt_root): # Create and delete are taken care of by setup dg1, dgs = setup_device_group_test( - request, mgmt_root, name='test-device-group', partition='Common') + request, mgmt_root, name='test-device-group') assert dg1.generation > 0 assert dg1.name == 'test-device-group' # Load - dg2 = mgmt_root.tm.cm.device_groups.device_group.load( - name=dg1.name, partition=dg1.partition) + dg2 = mgmt_root.tm.cm.device_groups.device_group.load(name=dg1.name) assert dg1.generation == dg2.generation # Update @@ -63,12 +62,12 @@ def test_device_group_CURDL(self, request, mgmt_root): def test_add_device(self, request, mgmt_root): dg1, dgs = setup_device_group_test( - request, mgmt_root, name='test-device-group', partition='Common') + request, mgmt_root, name='test-device-group') devices = mgmt_root.tm.cm.devices.get_collection() this_device = devices[0] assert this_device.selfDevice == 'true' d1 = dg1.devices_s.devices.create( - name=this_device.name, partition=this_device.partition) + name=this_device.name) assert len(dg1.devices_s.get_collection()) == 1 # This needs to be in this format due to the change between # 11.6.0 Final and other versions. @@ -76,7 +75,7 @@ def test_add_device(self, request, mgmt_root): def test_cm_sync_to_group(self, request, mgmt_root): dg1, dgs = setup_device_group_test( - request, mgmt_root, name='test-device-group', partition='Common') + request, mgmt_root, name='test-device-group') sync_cmd = 'config-sync to-group %s' % dg1.name cm_obj = mgmt_root.tm.cm.exec_cmd('run', utilCmdArgs=sync_cmd) assert cm_obj.utilCmdArgs == sync_cmd @@ -88,7 +87,7 @@ def test_cm_sync_to_group(self, request, mgmt_root): reason='Skip test if on a version greater than or equal to 11.6.1') def test_cm_sync_from_group_pre_12_0(self, request, mgmt_root): dg1, dgs = setup_device_group_test( - request, mgmt_root, name='test-device-group', partition='Common') + request, mgmt_root, name='test-device-group') sync_cmd = 'config-sync from-group %s' % dg1.name cm_obj = mgmt_root.tm.cm.exec_cmd('run', utilCmdArgs=sync_cmd) assert cm_obj.utilCmdArgs == sync_cmd @@ -100,7 +99,7 @@ def test_cm_sync_from_group_pre_12_0(self, request, mgmt_root): reason='Skip test if on a version earlier than 12.0.0') def test_cm_sync_from_group_post_11_6(self, request, mgmt_root): dg1, dgs = setup_device_group_test( - request, mgmt_root, name='test-device-group', partition='Common') + request, mgmt_root, name='test-device-group') with pytest.raises(iControlUnexpectedHTTPError) as err: sync_cmd = 'config-sync from-group %s' % dg1.name mgmt_root.tm.cm.exec_cmd('run', utilCmdArgs=sync_cmd)