Handle Policy Action value update(Service Chain Spec update)

Change-Id: Ic06ae4bf617a5a9a1956b34e0e72d00793502c8b
Closes-bug: #1397804
This commit is contained in:
Magesh GV
2014-12-02 17:56:11 +05:30
parent 3eaf550069
commit 373d5d748b
3 changed files with 111 additions and 7 deletions

View File

@@ -510,7 +510,7 @@ class ResourceMappingDriver(api.PolicyDriver):
@log.log
def update_policy_action_postcommit(self, context):
# TODO(ivar): Should affect related SGs
pass
self._handle_redirect_spec_id_update(context)
@log.log
def delete_policy_action_precommit(self, context):
@@ -878,6 +878,29 @@ class ResourceMappingDriver(api.PolicyDriver):
for ip_map in mappings:
session.delete(ip_map)
def _handle_redirect_spec_id_update(self, context):
if (context.current['action_type'] != gconst.GP_ACTION_REDIRECT
or context.current['action_value'] ==
context.original['action_value']):
return
spec = self._servicechain_plugin._get_servicechain_spec(
context._plugin_context, context.original['action_value'])
servicechain_instances = spec.instances
for servicechain_instance in servicechain_instances:
sc_instance_update = {
'servicechain_spec': context.current['action_value']}
self._update_resource(self._servicechain_plugin,
context._plugin_context,
'servicechain_instance',
servicechain_instance['id'],
sc_instance_update)
def _get_rule_ids_for_actions(self, context, action_id):
policy_rule_qry = context.session.query(
gpdb.PolicyRuleActionAssociation.policy_rule_id)
policy_rule_qry.filter_by(policy_action_id=action_id)
return policy_rule_qry.all()
def _handle_redirect_action(self, context, policy_rule_sets):
for policy_rule_set_id in policy_rule_sets:
ptgs_consuming_policy_rule_set = (

View File

@@ -63,8 +63,7 @@ class ServiceChainPlugin(servicechain_db.ServiceChainDbPlugin):
servicechain_node):
session = context.session
with session.begin(subtransactions=True):
original_sc_node = super(ServiceChainPlugin,
self).get_servicechain_node(
original_sc_node = self.get_servicechain_node(
context, servicechain_node_id)
updated_sc_node = super(ServiceChainPlugin,
self).update_servicechain_node(
@@ -130,8 +129,7 @@ class ServiceChainPlugin(servicechain_db.ServiceChainDbPlugin):
servicechain_spec):
session = context.session
with session.begin(subtransactions=True):
original_sc_spec = super(ServiceChainPlugin,
self).get_servicechain_spec(
original_sc_spec = self.get_servicechain_spec(
context, servicechain_spec_id)
updated_sc_spec = super(ServiceChainPlugin,
self).update_servicechain_spec(
@@ -200,8 +198,7 @@ class ServiceChainPlugin(servicechain_db.ServiceChainDbPlugin):
servicechain_instance):
session = context.session
with session.begin(subtransactions=True):
original_sc_instance = super(ServiceChainPlugin,
self).get_servicechain_instance(
original_sc_instance = self.get_servicechain_instance(
context, servicechain_instance_id)
updated_sc_instance = super(ServiceChainPlugin,
self).update_servicechain_instance(

View File

@@ -52,6 +52,9 @@ class ResourceMappingTestCase(
config.cfg.CONF.set_override('policy_drivers',
['implicit_policy', 'resource_mapping'],
group='group_policy')
config.cfg.CONF.set_override('servicechain_drivers',
['dummy'],
group='servicechain')
config.cfg.CONF.set_override('allow_overlapping_ips', True)
super(ResourceMappingTestCase, self).setUp(core_plugin=CORE_PLUGIN)
self.__plugin = manager.NeutronManager.get_plugin()
@@ -911,6 +914,87 @@ class TestPolicyRuleSet(ResourceMappingTestCase):
sc_instances = self.deserialize(self.fmt, res)
self.assertEqual(len(sc_instances['servicechain_instances']), 0)
def test_action_spec_value_update(self):
data = {'servicechain_node': {'service_type': "LOADBALANCER",
'tenant_id': self._tenant_id,
'config': "{}"}}
scn_req = self.new_create_request(SERVICECHAIN_NODES, data, self.fmt)
node = self.deserialize(self.fmt, scn_req.get_response(self.ext_api))
scn_id = node['servicechain_node']['id']
data = {'servicechain_spec': {'tenant_id': self._tenant_id,
'nodes': [scn_id]}}
scs_req = self.new_create_request(SERVICECHAIN_SPECS, data, self.fmt)
spec = self.deserialize(self.fmt, scs_req.get_response(self.ext_api))
scs_id = spec['servicechain_spec']['id']
classifier = self.create_policy_classifier(
name="class1", protocol="tcp", direction="in", port_range="20:90")
classifier_id = classifier['policy_classifier']['id']
action = self.create_policy_action(
name="action1", action_type=gconst.GP_ACTION_REDIRECT,
action_value=scs_id)
action_id = action['policy_action']['id']
action_id_list = [action_id]
policy_rule = self.create_policy_rule(
name='pr1', policy_classifier_id=classifier_id,
policy_actions=action_id_list)
policy_rule_id = policy_rule['policy_rule']['id']
policy_rule_list = [policy_rule_id]
policy_rule_set = self.create_policy_rule_set(
name="c1", policy_rules=policy_rule_list)
policy_rule_set_id = policy_rule_set['policy_rule_set']['id']
provider_ptg = self.create_policy_target_group(
name="ptg1", provided_policy_rule_sets={policy_rule_set_id: None})
provider_ptg_id = provider_ptg['policy_target_group']['id']
consumer_ptg = self.create_policy_target_group(
name="ptg2",
consumed_policy_rule_sets={policy_rule_set_id: None})
consumer_ptg_id = consumer_ptg['policy_target_group']['id']
sc_instance_list_req = self.new_list_request(SERVICECHAIN_INSTANCES)
res = sc_instance_list_req.get_response(self.ext_api)
sc_instances = self.deserialize(self.fmt, res)
# We should have one service chain instance created now
self.assertEqual(len(sc_instances['servicechain_instances']), 1)
sc_instance = sc_instances['servicechain_instances'][0]
self.assertEqual(sc_instance['provider_ptg_id'], provider_ptg_id)
self.assertEqual(sc_instance['consumer_ptg_id'], consumer_ptg_id)
self.assertEqual(scs_id, sc_instance['servicechain_spec'])
data = {'servicechain_node': {'service_type': "FIREWALL",
'tenant_id': self._tenant_id,
'config': "{}"}}
scn_req = self.new_create_request(SERVICECHAIN_NODES, data, self.fmt)
new_node = self.deserialize(
self.fmt, scn_req.get_response(self.ext_api))
new_scn_id = new_node['servicechain_node']['id']
data = {'servicechain_spec': {'tenant_id': self._tenant_id,
'nodes': [new_scn_id]}}
scs_req = self.new_create_request(SERVICECHAIN_SPECS, data, self.fmt)
new_spec = self.deserialize(
self.fmt, scs_req.get_response(self.ext_api))
new_scs_id = new_spec['servicechain_spec']['id']
action = {'policy_action': {'action_value': new_scs_id}}
req = self.new_update_request('policy_actions', action, action_id)
action = self.deserialize(self.fmt,
req.get_response(self.ext_api))
sc_instance_list_req = self.new_list_request(SERVICECHAIN_INSTANCES)
res = sc_instance_list_req.get_response(self.ext_api)
new_sc_instances = self.deserialize(self.fmt, res)
# We should have one service chain instance created now
self.assertEqual(len(new_sc_instances['servicechain_instances']), 1)
new_sc_instance = new_sc_instances['servicechain_instances'][0]
self.assertEqual(sc_instance['id'], new_sc_instance['id'])
self.assertEqual(new_scs_id, new_sc_instance['servicechain_spec'])
req = self.new_delete_request(
'policy_target_groups', consumer_ptg_id)
res = req.get_response(self.ext_api)
self.assertEqual(res.status_int, webob.exc.HTTPNoContent.code)
sc_instance_list_req = self.new_list_request(SERVICECHAIN_INSTANCES)
res = sc_instance_list_req.get_response(self.ext_api)
sc_instances = self.deserialize(self.fmt, res)
self.assertEqual(len(sc_instances['servicechain_instances']), 0)
def test_shared_policy_rule_set_create_negative(self):
self.create_policy_rule_set(shared=True, expected_res_status=400)