Merge "Get sec group ids after address group update"
This commit is contained in:
commit
f84d2f74f5
@ -248,13 +248,17 @@ class SecurityGroupAgentRpc(object):
|
||||
|
||||
def address_group_updated(self, address_group_id):
|
||||
LOG.info("Address group updated %r", address_group_id)
|
||||
# TODO(mlavalle) A follow up patch in the address groups implementation
|
||||
# series will add more code here
|
||||
security_group_ids = (
|
||||
self.plugin_rpc.get_secgroup_ids_for_address_group(
|
||||
address_group_id))
|
||||
self.security_groups_rule_updated(security_group_ids)
|
||||
|
||||
def address_group_deleted(self, address_group_id):
|
||||
LOG.info("Address group deleted %r", address_group_id)
|
||||
# TODO(mlavalle) A follow up patch in the address groups implementation
|
||||
# series will add more code here
|
||||
security_group_ids = (
|
||||
self.plugin_rpc.get_secgroup_ids_for_address_group(
|
||||
address_group_id))
|
||||
self.security_groups_rule_updated(security_group_ids)
|
||||
|
||||
def remove_devices_filter(self, device_ids):
|
||||
if not device_ids:
|
||||
|
@ -276,13 +276,10 @@ class SecurityGroupServerAPIShim(sg_rpc_base.SecurityGroupInfoAPIMixin):
|
||||
# error.
|
||||
raise NotImplementedError()
|
||||
|
||||
def get_address_group_details(self, address_group_id):
|
||||
ag_obj = self.rcache.get_resource_by_id(resources.ADDRESSGROUP,
|
||||
address_group_id)
|
||||
if not ag_obj:
|
||||
LOG.debug("Address group %s does not exist in cache.",
|
||||
address_group_id)
|
||||
return ag_obj
|
||||
def get_secgroup_ids_for_address_group(self, address_group_id):
|
||||
filters = {'remote_address_group_id': (address_group_id, )}
|
||||
return set([rule.security_group_id for rule in
|
||||
self.rcache.get_resources('SecurityGroupRule', filters)])
|
||||
|
||||
def _add_child_sg_rules(self, rtype, event, trigger, context, updated,
|
||||
**kwargs):
|
||||
|
@ -108,6 +108,12 @@ class AddressGroupDbMixin(ag_ext.AddressGroupPluginBase):
|
||||
addr_assoc = ag_obj.AddressAssociation(context, **args)
|
||||
addr_assoc.create()
|
||||
ag.update() # reload synthetic fields
|
||||
# TODO(hangyang) this notification should be updated to publish when
|
||||
# the callback handler handle_event, class _ObjectChangeHandler in
|
||||
# neutron.plugins.ml2.ovo_rpc is updated to receive notifications with
|
||||
# new style payload objects as argument.
|
||||
registry.notify(ADDRESS_GROUP, events.AFTER_UPDATE, self,
|
||||
context=context, address_group_id=ag.id)
|
||||
return {'address_group': self._make_address_group_dict(ag)}
|
||||
|
||||
def remove_addresses(self, context, address_group_id, addresses):
|
||||
@ -121,6 +127,12 @@ class AddressGroupDbMixin(ag_ext.AddressGroupPluginBase):
|
||||
ag_obj.AddressAssociation.delete_objects(
|
||||
context, address_group_id=address_group_id, address=addr)
|
||||
ag.update() # reload synthetic fields
|
||||
# TODO(hangyang) this notification should be updated to publish when
|
||||
# the callback handler handle_event, class _ObjectChangeHandler in
|
||||
# neutron.plugins.ml2.ovo_rpc is updated to receive notifications with
|
||||
# new style payload objects as argument.
|
||||
registry.notify(ADDRESS_GROUP, events.AFTER_UPDATE, self,
|
||||
context=context, address_group_id=ag.id)
|
||||
return {'address_group': self._make_address_group_dict(ag)}
|
||||
|
||||
def create_address_group(self, context, address_group):
|
||||
@ -132,15 +144,15 @@ class AddressGroupDbMixin(ag_ext.AddressGroupPluginBase):
|
||||
'description': fields['description']}
|
||||
ag = ag_obj.AddressGroup(context, **args)
|
||||
ag.create()
|
||||
if fields.get('addresses') is not constants.ATTR_NOT_SPECIFIED:
|
||||
self.add_addresses(context, ag.id, fields)
|
||||
ag.update() # reload synthetic fields
|
||||
# TODO(mlavalle) this notification should be updated to publish when
|
||||
# the callback handler handle_event, class _ObjectChangeHandler in
|
||||
# neutron.plugins.ml2.ovo_rpc is updated to receive notifications with
|
||||
# new style payload objects as argument.
|
||||
registry.notify(ADDRESS_GROUP, events.AFTER_CREATE, self,
|
||||
context=context, address_group_id=ag.id)
|
||||
if fields.get('addresses') is not constants.ATTR_NOT_SPECIFIED:
|
||||
self.add_addresses(context, ag.id, fields)
|
||||
ag.update() # reload synthetic fields
|
||||
return self._make_address_group_dict(ag)
|
||||
|
||||
def update_address_group(self, context, id, address_group):
|
||||
|
@ -126,6 +126,8 @@ class SecurityGroupServerAPIShimTestCase(base.BaseTestCase):
|
||||
port_range_min=400,
|
||||
remote_group_id=attrs['id'],
|
||||
revision_number=1,
|
||||
remote_address_group_id=kwargs.get('remote_address_group_id',
|
||||
None),
|
||||
)
|
||||
attrs['rules'] = [sg_rule]
|
||||
attrs.update(**kwargs)
|
||||
@ -194,16 +196,15 @@ class SecurityGroupServerAPIShimTestCase(base.BaseTestCase):
|
||||
self.sg_agent.security_groups_member_updated.assert_called_with(
|
||||
{s1.id})
|
||||
|
||||
def test_get_address_group_details(self):
|
||||
def test_get_secgroup_ids_for_address_group(self):
|
||||
ag = self._make_address_group_ovo()
|
||||
retrieved_ag = self.shim.get_address_group_details(ag.id)
|
||||
self.assertEqual(ag.id, retrieved_ag.id)
|
||||
self.assertEqual(ag.name, retrieved_ag.name)
|
||||
self.assertEqual(ag.description, retrieved_ag.description)
|
||||
self.assertEqual(ag.addresses[0].address,
|
||||
retrieved_ag.addresses[0].address)
|
||||
self.assertEqual(ag.addresses[1].address,
|
||||
retrieved_ag.addresses[1].address)
|
||||
sg1 = self._make_security_group_ovo(remote_address_group_id=ag.id)
|
||||
sg2 = self._make_security_group_ovo(remote_address_group_id=ag.id)
|
||||
sg3 = self._make_security_group_ovo()
|
||||
sec_group_ids = self.shim.get_secgroup_ids_for_address_group(ag.id)
|
||||
self.assertEqual(set([sg1.id, sg2.id]), set(sec_group_ids))
|
||||
self.assertEqual(2, len(sec_group_ids))
|
||||
self.assertNotIn(sg3.id, sec_group_ids)
|
||||
|
||||
def test_address_group_update_events(self):
|
||||
ag = self._make_address_group_ovo()
|
||||
|
@ -39,14 +39,24 @@ class OVOServerRpcInterfaceTestCase(test_plugin.Ml2PluginV2TestCase):
|
||||
self.ovo_push_interface_p.stop()
|
||||
self.plugin.ovo_notifier = ovo_rpc.OVOServerRpcInterface()
|
||||
|
||||
def _assert_object_received(self, ovotype, oid=None, event=None):
|
||||
def _assert_object_received(self, ovotype, oid=None, event=None,
|
||||
count=1):
|
||||
self.plugin.ovo_notifier.wait()
|
||||
match = 0
|
||||
for obj, evt in self.received:
|
||||
if isinstance(obj, ovotype):
|
||||
if (obj.id == oid or not oid) and (not event or event == evt):
|
||||
return obj
|
||||
self.fail("Could not find OVO %s with ID %s in %s" %
|
||||
(ovotype, oid, self.received))
|
||||
match += 1
|
||||
if count == 1:
|
||||
return obj
|
||||
if count > 1:
|
||||
self.assertEqual(
|
||||
match, count,
|
||||
"Could not find match %s for OVO %s with ID %s in %s" %
|
||||
(match, ovotype, oid, self.received))
|
||||
return
|
||||
self.fail("Could not find OVO %s with ID %s or event %s in %s" %
|
||||
(ovotype, oid, event, self.received))
|
||||
|
||||
def test_network_lifecycle(self):
|
||||
with self.network() as n:
|
||||
@ -112,11 +122,19 @@ class OVOServerRpcInterfaceTestCase(test_plugin.Ml2PluginV2TestCase):
|
||||
'addresses': ['10.0.0.1/32',
|
||||
'2001:db8::/32']}})
|
||||
self._assert_object_received(
|
||||
address_group.AddressGroup, ag['id'], 'updated')
|
||||
address_group.AddressGroup, ag['id'], 'updated', 2)
|
||||
self.plugin.update_address_group(self.ctx, ag['id'],
|
||||
{'address_group': {'name': 'an-address-group-other-name'}})
|
||||
self._assert_object_received(
|
||||
address_group.AddressGroup, ag['id'], 'updated')
|
||||
address_group.AddressGroup, ag['id'], 'updated', 3)
|
||||
self.plugin.add_addresses(self.ctx, ag['id'],
|
||||
{'addresses': ['10.0.0.2/32']})
|
||||
self._assert_object_received(
|
||||
address_group.AddressGroup, ag['id'], 'updated', 4)
|
||||
self.plugin.remove_addresses(self.ctx, ag['id'],
|
||||
{'addresses': ['10.0.0.1/32']})
|
||||
self._assert_object_received(
|
||||
address_group.AddressGroup, ag['id'], 'updated', 5)
|
||||
self.plugin.delete_address_group(self.ctx, ag['id'])
|
||||
self._assert_object_received(
|
||||
address_group.AddressGroup, ag['id'], 'deleted')
|
||||
|
Loading…
x
Reference in New Issue
Block a user