Remove extra get_active_zoneset query from Brocade CLI

A recent brocade zoning driver patch for bug-1465207 has introduced
an extra query for the "active_zone_set" from the switch for
every add_zone operation.

Performance can be optimized by comparing the "active_zone_set",
already passed in, with the zones to be updated instead. Removing
the need to re-query for the "active_zone_set" to determine if
the "active_cfg" requires recreation.

Closes-bug #1532272
Change-Id: Ic9a7ce8c3f4bbaddccf42e9640eab4750acce484
This commit is contained in:
Yucong Feng 2016-01-11 20:44:41 +01:00
parent bcbfe05a95
commit df5419069f
2 changed files with 25 additions and 5 deletions

View File

@ -96,7 +96,7 @@ class TestBrcdFCZoneClientCLI(client_cli.BrcdFCZoneClientCLI, test.TestCase):
get_active_zs_mock):
get_active_zs_mock.return_value = active_zoneset
self.add_zones(new_zones, False, None)
self.assertEqual(2, get_active_zs_mock.call_count)
self.assertEqual(1, get_active_zs_mock.call_count)
self.assertEqual(3, apply_zone_change_mock.call_count)
cfg_save_mock.assert_called_once_with()
@ -138,6 +138,22 @@ class TestBrcdFCZoneClientCLI(client_cli.BrcdFCZoneClientCLI, test.TestCase):
self.assertEqual(2, apply_zone_change_mock.call_count)
self.assertEqual(1, delete_zones_mock.call_count)
@mock.patch.object(client_cli.BrcdFCZoneClientCLI, 'get_active_zone_set')
@mock.patch.object(client_cli.BrcdFCZoneClientCLI, 'delete_zones')
@mock.patch.object(client_cli.BrcdFCZoneClientCLI, 'activate_zoneset')
@mock.patch.object(client_cli.BrcdFCZoneClientCLI, 'apply_zone_change')
def test_add_zone_all_exists_memb_not_same(self, apply_zone_change_mock,
activate_zoneset_mock,
delete_zones_mock,
get_active_zs_mock):
self.add_zones(new_zone_memb_not_same, True, active_zoneset)
call_args = apply_zone_change_mock.call_args[0][0]
self.assertEqual(0, get_active_zs_mock.call_count)
self.assertEqual(2, apply_zone_change_mock.call_count)
self.assertEqual(1, delete_zones_mock.call_count)
self.assertTrue('cfgcreate' in call_args)
@mock.patch.object(client_cli.BrcdFCZoneClientCLI, '_ssh_execute')
def test_activate_zoneset(self, ssh_execute_mock):
ssh_execute_mock.return_value = True

View File

@ -139,6 +139,7 @@ class BrcdFCZoneClientCLI(object):
active_zone_set = self.get_active_zone_set()
LOG.debug("Active zone set: %s", active_zone_set)
zone_list = active_zone_set[zone_constant.CFG_ZONES]
zone_updated = []
LOG.debug("zone list: %s", zone_list)
for zone in zones.keys():
# If zone exists, its an update. Delete & insert
@ -150,6 +151,7 @@ class BrcdFCZoneClientCLI(object):
break
try:
self.delete_zones(zone, activate, active_zone_set)
zone_updated.append(zone)
except exception.BrocadeZoningCliException:
with excutils.save_and_reraise_exception():
LOG.error(_LE("Deleting zone failed %s"), zone)
@ -170,10 +172,12 @@ class BrcdFCZoneClientCLI(object):
if not zone_with_sep:
return
try:
# Get active zone set from device, as some of the zones
# could be deleted.
active_zone_set = self.get_active_zone_set()
cfg_name = active_zone_set[zone_constant.ACTIVE_ZONE_CONFIG]
# If all existing zones are to be updated, the active zone config
# will require a recreate, since all zones have been deleted.
if len(zone_list) == len(zone_updated):
cfg_name = None
else:
cfg_name = active_zone_set[zone_constant.ACTIVE_ZONE_CONFIG]
cmd = None
if not cfg_name:
cfg_name = zone_constant.OPENSTACK_CFG_NAME