Skip to content

Commit

Permalink
Cisco N1kv: Fix update network profile for add tenants
Browse files Browse the repository at this point in the history
This patch makes sure that while updating network profile to add new
tenants, it does not delete the older profile bindings and maintains
them, while adds only the new tenant ids to the bindings.

Change-Id: I862eb1c400e022334a2f6a4078425448bb144843
Closes-bug: #1379609
(cherry picked from commit c97069d)
  • Loading branch information
abhiraut authored and booxter committed Oct 22, 2014
1 parent 830142e commit 560f8f8
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 11 deletions.
22 changes: 16 additions & 6 deletions neutron/plugins/cisco/db/n1kv_db_v2.py
Expand Up @@ -957,14 +957,22 @@ def _get_profile_bindings(db_session, profile_type=None):
If profile type is None, return profile-tenant binding for all
profile types.
"""
LOG.debug(_("_get_profile_bindings()"))
if profile_type:
profile_bindings = (db_session.query(n1kv_models_v2.ProfileBinding).
filter_by(profile_type=profile_type))
return profile_bindings
return (db_session.query(n1kv_models_v2.ProfileBinding).
filter_by(profile_type=profile_type))
return db_session.query(n1kv_models_v2.ProfileBinding)


def _get_profile_bindings_by_uuid(db_session, profile_id):
"""
Retrieve a list of profile bindings.
Get all profile-tenant bindings based on profile UUID.
"""
return (db_session.query(n1kv_models_v2.ProfileBinding).
filter_by(profile_id=profile_id))


class NetworkProfile_db_mixin(object):

"""Network Profile Mixin."""
Expand Down Expand Up @@ -1099,8 +1107,10 @@ def update_network_profile(self, context, id, network_profile):
original_net_p = get_network_profile(context.session, id)
# Update network profile to tenant id binding.
if context.is_admin and c_const.ADD_TENANTS in p:
if context.tenant_id not in p[c_const.ADD_TENANTS]:
p[c_const.ADD_TENANTS].append(context.tenant_id)
profile_bindings = _get_profile_bindings_by_uuid(context.session,
profile_id=id)
for bindings in profile_bindings:
p[c_const.ADD_TENANTS].append(bindings.tenant_id)
update_profile_binding(context.session, id,
p[c_const.ADD_TENANTS], c_const.NETWORK)
is_updated = True
Expand Down
25 changes: 20 additions & 5 deletions neutron/tests/unit/cisco/n1kv/test_n1kv_plugin.py
Expand Up @@ -612,7 +612,7 @@ def test_update_network_profile_multi_tenants(self):
net_p['network_profile']['id'])
update_req.environ['neutron.context'] = context.Context('',
self.tenant_id,
is_admin = True)
is_admin=True)
update_res = update_req.get_response(self.ext_api)
self.assertEqual(200, update_res.status_int)
db_session = db.get_session()
Expand All @@ -623,7 +623,7 @@ def test_update_network_profile_multi_tenants(self):
net_p['network_profile']['id'])
self.assertRaises(c_exc.ProfileTenantBindingNotFound,
n1kv_db_v2.get_profile_binding,
db_session, 'tenant2',
db_session, 'tenant4',
net_p['network_profile']['id'])
tenant3 = n1kv_db_v2.get_profile_binding(db_session, 'tenant3',
net_p['network_profile']['id'])
Expand All @@ -637,24 +637,39 @@ def test_update_network_profile_multi_tenants(self):
net_p['network_profile']['id'])
update_req.environ['neutron.context'] = context.Context('',
self.tenant_id,
is_admin = True)
is_admin=True)
update_res = update_req.get_response(self.ext_api)
self.assertEqual(200, update_res.status_int)
# current tenant_id should always present
tenant_id = n1kv_db_v2.get_profile_binding(db_session, self.tenant_id,
net_p['network_profile']['id'])
self.assertIsNotNone(tenant_id)
self.assertRaises(c_exc.ProfileTenantBindingNotFound,
n1kv_db_v2.get_profile_binding,
db_session, 'tenant1',
net_p['network_profile']['id'])
self.assertRaises(c_exc.ProfileTenantBindingNotFound,
n1kv_db_v2.get_profile_binding,
db_session, 'tenant2',
db_session, 'tenant4',
net_p['network_profile']['id'])
tenant3 = n1kv_db_v2.get_profile_binding(db_session, 'tenant3',
net_p['network_profile']['id'])
self.assertIsNotNone(tenant_id)
self.assertIsNotNone(tenant3)
# Add new tenant4 to network profile and make sure existing tenants
# are not deleted.
data = {'network_profile': {c_const.ADD_TENANTS:
['tenant4']}}
update_req = self.new_update_request('network_profiles',
data,
net_p['network_profile']['id'])
update_req.environ['neutron.context'] = context.Context('',
self.tenant_id,
is_admin=True)
update_res = update_req.get_response(self.ext_api)
self.assertEqual(200, update_res.status_int)
tenant4 = n1kv_db_v2.get_profile_binding(db_session, 'tenant4',
net_p['network_profile']['id'])
self.assertIsNotNone(tenant4)


class TestN1kvBasicGet(test_plugin.TestBasicGet,
Expand Down

0 comments on commit 560f8f8

Please sign in to comment.