Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 40 additions & 2 deletions f5/bigip/tm/cm/device_group.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand All @@ -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'] = {
Expand Down Expand Up @@ -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)
19 changes: 9 additions & 10 deletions f5/bigip/tm/cm/test/functional/test_device_group.py
Original file line number Diff line number Diff line change
Expand Up @@ -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():
Expand All @@ -34,21 +34,20 @@ 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


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
Expand All @@ -63,20 +62,20 @@ 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.
assert this_device.name in d1.name

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
Expand All @@ -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
Expand All @@ -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)
Expand Down