diff --git a/gbpservice/neutron/plugins/ml2plus/drivers/apic_aim/mechanism_driver.py b/gbpservice/neutron/plugins/ml2plus/drivers/apic_aim/mechanism_driver.py index a159c4ede..8e71fc1a6 100644 --- a/gbpservice/neutron/plugins/ml2plus/drivers/apic_aim/mechanism_driver.py +++ b/gbpservice/neutron/plugins/ml2plus/drivers/apic_aim/mechanism_driver.py @@ -186,8 +186,9 @@ class KeystoneNotificationEndpoint(object): return None disp_name = aim_utils.sanitize_display_name(prj_details[0]) - self._driver.aim.update(aim_ctx, tenant, display_name - = disp_name, descr=prj_details[1]) + descr = aim_utils.sanitize_description(prj_details[1]) + self._driver.aim.update( + aim_ctx, tenant, display_name=disp_name, descr=descr) return oslo_messaging.NotificationResult.HANDLED if event_type == 'identity.project.deleted': @@ -560,15 +561,13 @@ class ApicMechanismDriver(api_plus.MechanismDriver, tenant_aname = self.name_mapper.project(session, project_id) project_details = (self.project_details_cache. get_project_details(project_id)) + disp_name = aim_utils.sanitize_display_name(project_details[0]) + descr = aim_utils.sanitize_description(project_details[1]) aim_ctx = aim_context.AimContext(session) tenant = aim_resource.Tenant( - name=tenant_aname, descr=project_details[1], display_name= - aim_utils.sanitize_display_name(project_details[0])) - # NOTE(ivar): by overwriting the existing tenant, we make sure - # existing deployments will update their description value. This - # however negates any change to the Tenant object done by direct - # use of aimctl. - self.aim.create(aim_ctx, tenant, overwrite=True) + name=tenant_aname, descr=descr, display_name=disp_name) + if not self.aim.get(aim_ctx, tenant): + self.aim.create(aim_ctx, tenant) # REVISIT: Setting of display_name was added here to match # aim_lib behavior when it creates APs, but the # display_name aim_lib uses might vary. @@ -5960,7 +5959,7 @@ class ApicMechanismDriver(api_plus.MechanismDriver, project_id) tenant.display_name = aim_utils.sanitize_display_name( project_details[0]) - tenant.descr = project_details[1] + tenant.descr = aim_utils.sanitize_description(project_details[1]) tenant.monitored = False mgr.expect_aim_resource(tenant) diff --git a/gbpservice/neutron/tests/unit/plugins/ml2plus/test_apic_aim.py b/gbpservice/neutron/tests/unit/plugins/ml2plus/test_apic_aim.py index a7d887dea..62f0a7274 100644 --- a/gbpservice/neutron/tests/unit/plugins/ml2plus/test_apic_aim.py +++ b/gbpservice/neutron/tests/unit/plugins/ml2plus/test_apic_aim.py @@ -159,7 +159,7 @@ TEST_TENANT_NAMES = { # REVISIT(rkukura): Use mock for this instead? class FakeProject(object): - def __init__(self, id, name, description=''): + def __init__(self, id, name, description='bad\"\'descr'): self.id = id self.name = name self.description = description @@ -1426,6 +1426,10 @@ class TestAimMapping(ApicAimTestCase): sg_id = sg['id'] self._check_sg(sg) + tenant_aname = self.name_mapper.project(None, sg['tenant_id']) + aim_tenant = self._get_tenant(tenant_aname) + self.assertEqual(aim_tenant.descr, "bad__descr") + # Test show. sg = self._show('security-groups', sg_id)['security_group'] self._check_sg(sg) @@ -2123,10 +2127,10 @@ class TestAimMapping(ApicAimTestCase): # Test project.updated event. Update both name and description. FakeProjectManager.set('test-tenant-update', - 'new-tenant', 'new-descr') + 'new-tenant', 'bad\"\'descr') keystone_ep.info(None, None, 'identity.project.updated', payload, None) assert(self.driver.aim.update.call_args_list[0] == mock.call( - mock.ANY, tenant, display_name='new-tenant', descr = 'new-descr')) + mock.ANY, tenant, display_name='new-tenant', descr = 'bad__descr')) # Test project.updated event. Update only the project name. FakeProjectManager.set('test-tenant-update', 'name123', 'new-descr')