def test_context_no_management(self): # Verify Context attributes for simple config plugin_context = n_context.get_admin_context() plugin_context.is_admin = False plugin_context.is_advsvc = False plugin_context.tenant_id = 'test-tenant' node = self._create_profiled_servicechain_node()['servicechain_node'] spec = self.create_servicechain_spec( nodes=[node['id']])['servicechain_spec'] provider = self.create_policy_target_group()['policy_target_group'] consumer = self.create_policy_target_group()['policy_target_group'] # Verify admin created SM is None management = self.create_policy_target_group( service_management=True, tenant_id='admin', is_admin_context=True)['policy_target_group'] pc = self.create_policy_classifier()['policy_classifier'] instance = self.create_servicechain_instance( provider_ptg_id=provider['id'], consumer_ptg_id=consumer['id'], servicechain_specs=[spec['id']], classifier_id=pc['id'])['servicechain_instance'] ctx = ncp_context.get_node_driver_context(self.plugin, plugin_context, instance, node) self.assertIsNone(ctx.management) self.delete_policy_target_group(management['id'], is_admin_context=True) shared_management = self.create_policy_target_group( service_management=True, tenant_id='admin', is_admin_context=True, shared=True)['policy_target_group'] instance = self.create_servicechain_instance( provider_ptg_id=provider['id'], consumer_ptg_id=consumer['id'], servicechain_specs=[spec['id']], classifier_id=pc['id'])['servicechain_instance'] # Now admin Service Management PTG is visible ctx = ncp_context.get_node_driver_context(self.plugin, plugin_context, instance, node) self.assertEqual(shared_management['id'], ctx.management['id']) # Private management overrides shared one private_management = self.create_policy_target_group( service_management=True, is_admin_context=True)['policy_target_group'] instance = self.create_servicechain_instance( provider_ptg_id=provider['id'], consumer_ptg_id=consumer['id'], servicechain_specs=[spec['id']], classifier_id=pc['id'])['servicechain_instance'] ctx = ncp_context.get_node_driver_context(self.plugin, plugin_context, instance, node) self.assertEqual(private_management['id'], ctx.management['id'])
def test_context_no_management(self): # Verify Context attributes for simple config plugin_context = n_context.get_admin_context() plugin_context.is_admin = False plugin_context.is_advsvc = False plugin_context.tenant_id = 'test-tenant' node = self._create_profiled_servicechain_node()['servicechain_node'] spec = self.create_servicechain_spec( nodes=[node['id']])['servicechain_spec'] provider = self.create_policy_target_group()['policy_target_group'] consumer = self.create_policy_target_group()['policy_target_group'] # Verify admin created SM is None management = self.create_policy_target_group( service_management=True, tenant_id='admin', is_admin_context=True)['policy_target_group'] pc = self.create_policy_classifier()['policy_classifier'] instance = self.create_servicechain_instance( provider_ptg_id=provider['id'], consumer_ptg_id=consumer['id'], servicechain_specs=[spec['id']], classifier_id=pc['id'])['servicechain_instance'] ctx = ncp_context.get_node_driver_context( self.plugin, plugin_context, instance, node) self.assertIsNone(ctx.management) self.delete_policy_target_group(management['id'], is_admin_context=True) shared_management = self.create_policy_target_group( service_management=True, tenant_id='admin', is_admin_context=True, shared=True)['policy_target_group'] instance = self.create_servicechain_instance( provider_ptg_id=provider['id'], consumer_ptg_id=consumer['id'], servicechain_specs=[spec['id']], classifier_id=pc['id'])['servicechain_instance'] # Now admin Service Management PTG is visible ctx = ncp_context.get_node_driver_context( self.plugin, plugin_context, instance, node) self.assertEqual(shared_management['id'], ctx.management['id']) # Private management overrides shared one private_management = self.create_policy_target_group( service_management=True, is_admin_context=True)['policy_target_group'] instance = self.create_servicechain_instance( provider_ptg_id=provider['id'], consumer_ptg_id=consumer['id'], servicechain_specs=[spec['id']], classifier_id=pc['id'])['servicechain_instance'] ctx = ncp_context.get_node_driver_context( self.plugin, plugin_context, instance, node) self.assertEqual(private_management['id'], ctx.management['id'])
def test_context_attributes(self): # Verify Context attributes for simple config plugin_context = n_context.get_admin_context() profile = self._create_service_profile( service_type="LOADBALANCERV2", vendor=self.SERVICE_PROFILE_VENDOR)['service_profile'] node = self.create_servicechain_node( service_profile_id=profile['id'], config=self.DEFAULT_LB_CONFIG)['servicechain_node'] spec = self.create_servicechain_spec( nodes=[node['id']])['servicechain_spec'] provider = self.create_policy_target_group()['policy_target_group'] self.create_policy_target_group() management = self.create_policy_target_group( service_management=True, is_admin_context=True)['policy_target_group'] classifier = self.create_policy_classifier()['policy_classifier'] instance = self.create_servicechain_instance( provider_ptg_id=provider['id'], consumer_ptg_id='N/A', servicechain_specs=[spec['id']], classifier_id=classifier['id'])['servicechain_instance'] # Verify created without errors ctx = ncp_context.get_node_driver_context(self.plugin, plugin_context, instance, node) self.assertIsNotNone(ctx.gbp_plugin) self.assertIsNotNone(ctx.sc_plugin) self.assertIsNotNone(ctx.core_plugin) self.assertIsNotNone(ctx.plugin_context) self.assertIsNotNone(ctx.plugin_session) self.assertIsNotNone(ctx.session) self.assertIsNotNone(ctx.admin_context) self.assertIsNotNone(ctx.admin_session) del ctx.current_profile['nodes'] self.assertEqual(ctx.current_profile['id'], profile['id']) self.assertEqual(instance['id'], ctx.instance['id']) self.assertEqual(provider['id'], ctx.provider['id']) self.assertIsNone(ctx.consumer) self.assertEqual(management['id'], ctx.management['id']) self.assertEqual([spec['id']], [x['id'] for x in ctx.relevant_specs]) self.assertIsNone(ctx.original_node) self.assertEqual(0, len(ctx.get_service_targets())) instance['provider_ptg_id'] = 'dummy-id' ctx = ncp_context.get_node_driver_context(self.plugin, plugin_context, instance, node) self.assertIsNone(ctx.provider) self.assertIsNone(ctx.consumer)
def test_context_attributes(self): # Verify Context attributes for simple config plugin_context = n_context.get_admin_context() profile = self._create_service_profile( service_type="LOADBALANCER", vendor=self.SERVICE_PROFILE_VENDOR)['service_profile'] node = self.create_servicechain_node( service_profile_id=profile['id'], config=self.DEFAULT_LB_CONFIG)['servicechain_node'] spec = self.create_servicechain_spec( nodes=[node['id']])['servicechain_spec'] provider = self.create_policy_target_group()['policy_target_group'] self.create_policy_target_group() management = self.create_policy_target_group( service_management=True, is_admin_context=True)['policy_target_group'] classifier = self.create_policy_classifier()['policy_classifier'] instance = self.create_servicechain_instance( provider_ptg_id=provider['id'], consumer_ptg_id='N/A', servicechain_specs=[spec['id']], classifier_id=classifier['id'])[ 'servicechain_instance'] # Verify created without errors ctx = ncp_context.get_node_driver_context( self.plugin, plugin_context, instance, node) self.assertIsNotNone(ctx.gbp_plugin) self.assertIsNotNone(ctx.sc_plugin) self.assertIsNotNone(ctx.core_plugin) self.assertIsNotNone(ctx.plugin_context) self.assertIsNotNone(ctx.plugin_session) self.assertIsNotNone(ctx.session) self.assertIsNotNone(ctx.admin_context) self.assertIsNotNone(ctx.admin_session) del ctx.current_profile['nodes'] self.assertEqual(ctx.current_profile, profile) self.assertEqual(instance['id'], ctx.instance['id']) self.assertEqual(provider['id'], ctx.provider['id']) self.assertIsNone(ctx.consumer) self.assertEqual(management['id'], ctx.management['id']) self.assertEqual([spec['id']], [x['id'] for x in ctx.relevant_specs]) self.assertIsNone(ctx.original_node) self.assertEqual(0, len(ctx.get_service_targets())) instance['provider_ptg_id'] = 'dummy-id' ctx = ncp_context.get_node_driver_context( self.plugin, plugin_context, instance, node) self.assertIsNone(ctx.provider) self.assertIsNone(ctx.consumer)
def update_servicechain_node(self, context, servicechain_node_id, servicechain_node): """Node Update. When a Servicechain Node is updated, all the corresponding instances need to be updated as well. This usually results in a node reconfiguration. """ session = context.session updaters = {} with session.begin(subtransactions=True): original_sc_node = self.get_servicechain_node(context, servicechain_node_id) updated_sc_node = super(NodeCompositionPlugin, self).update_servicechain_node( context, servicechain_node_id, servicechain_node ) self._validate_shared_update(context, original_sc_node, updated_sc_node, "servicechain_node") instances = self._get_node_instances(context, updated_sc_node) for instance in instances: node_context = ctx.get_node_driver_context(self, context, instance, updated_sc_node, original_sc_node) # TODO(ivar): Validate that the node driver understands the # update. driver = self.driver_manager.schedule_update(node_context) if not driver: raise exc.NoDriverAvailableForAction(action="update", node_id=original_sc_node["id"]) updaters[instance["id"]] = {} updaters[instance["id"]]["context"] = node_context updaters[instance["id"]]["driver"] = driver updaters[instance["id"]]["plumbing_info"] = driver.get_plumbing_info(node_context) # Update the nodes for update in updaters.values(): try: update["driver"].update(update["context"]) except exc.NodeDriverError as ex: LOG.error(_("Node Update failed, %s"), ex.message) return updated_sc_node
def _get_scheduled_drivers(self, context, instance, action, nodes=None): if nodes is None: nodes = self._get_instance_nodes(context, instance) result = {} func = getattr(self.driver_manager, "schedule_" + action) for node in nodes or []: node_context = ctx.get_node_driver_context(self, context, instance, node) driver = func(node_context) if not driver: raise exc.NoDriverAvailableForAction(action=action, node_id=node["id"]) result[node["id"]] = {} result[node["id"]]["driver"] = driver result[node["id"]]["context"] = node_context result[node["id"]]["plumbing_info"] = driver.get_plumbing_info(node_context) return result
def test_context_relevant_specs(self): plugin_context = n_context.get_admin_context() node_used = self._create_profiled_servicechain_node( service_type="TYPE", config='{}')['servicechain_node'] spec_used = self.create_servicechain_spec( nodes=[node_used['id']])['servicechain_spec'] provider = self.create_policy_target_group()['policy_target_group'] instance = self.create_servicechain_instance( provider_ptg_id=provider['id'], servicechain_specs=[spec_used['id']])['servicechain_instance'] ctx = ncp_context.get_node_driver_context(self.plugin, plugin_context, instance, node_used) self.assertEqual([spec_used['id']], [x['id'] for x in ctx.relevant_specs])
def test_context_relevant_specs(self): plugin_context = n_context.get_admin_context() node_used = self._create_profiled_servicechain_node( service_type="TYPE", config='{}')['servicechain_node'] spec_used = self.create_servicechain_spec( nodes=[node_used['id']])['servicechain_spec'] provider = self.create_policy_target_group()['policy_target_group'] instance = self.create_servicechain_instance( provider_ptg_id=provider['id'], servicechain_specs=[spec_used['id']])['servicechain_instance'] ctx = ncp_context.get_node_driver_context( self.plugin, plugin_context, instance, node_used) self.assertEqual([spec_used['id']], [x['id'] for x in ctx.relevant_specs])
def _get_scheduled_drivers(self, context, instance, action): nodes = self._get_instance_nodes(context, instance) result = {} func = getattr(self.driver_manager, 'schedule_' + action) for node in nodes: node_context = ctx.get_node_driver_context( self, context, instance, node) driver = func(node_context) if not driver: raise exc.NoDriverAvailableForAction(action=action, node_id=node['id']) result[node['id']] = {} result[node['id']]['driver'] = driver result[node['id']]['context'] = node_context result[node['id']]['plumbing_info'] = driver.get_plumbing_info( node_context) return result
def _get_scheduled_drivers(self, context, instance, action): nodes = self._get_instance_nodes(context, instance) result = {} func = getattr(self.driver_manager, 'schedule_' + action) for node in nodes: node_context = ctx.get_node_driver_context(self, context, instance, node) driver = func(node_context) if not driver: raise exc.NoDriverAvailableForAction(action=action, node_id=node['id']) result[node['id']] = {} result[node['id']]['driver'] = driver result[node['id']]['context'] = node_context result[node['id']]['plumbing_info'] = driver.get_plumbing_info( node_context) return result
def update_servicechain_node(self, context, servicechain_node_id, servicechain_node): """Node Update. When a Servicechain Node is updated, all the corresponding instances need to be updated as well. This usually results in a node reconfiguration. """ session = context.session updaters = {} with session.begin(subtransactions=True): original_sc_node = self.get_servicechain_node( context, servicechain_node_id) updated_sc_node = super(NodeCompositionPlugin, self).update_servicechain_node( context, servicechain_node_id, servicechain_node) self._validate_shared_update(context, original_sc_node, updated_sc_node, 'servicechain_node') instances = self._get_node_instances(context, updated_sc_node) for instance in instances: node_context = ctx.get_node_driver_context( self, context, instance, updated_sc_node, original_sc_node) # TODO(ivar): Validate that the node driver understands the # update. driver = self.driver_manager.schedule_update(node_context) if not driver: raise exc.NoDriverAvailableForAction( action='update', node_id=original_sc_node['id']) updaters[instance['id']] = {} updaters[instance['id']]['context'] = node_context updaters[instance['id']]['driver'] = driver updaters[instance['id']]['plumbing_info'] = ( driver.get_plumbing_info(node_context)) # Update the nodes for update in updaters.values(): try: update['driver'].update(update['context']) except exc.NodeDriverError as ex: LOG.error(_LE("Node Update failed, %s"), ex.message) return updated_sc_node
def update_servicechain_node(self, context, servicechain_node_id, servicechain_node): """Node Update. When a Servicechain Node is updated, all the corresponding instances need to be updated as well. This usually results in a node reconfiguration. """ updaters = {} with db_api.context_manager.writer.using(context): original_sc_node = self.get_servicechain_node( context, servicechain_node_id) updated_sc_node = super(NodeCompositionPlugin, self).update_servicechain_node( context, servicechain_node_id, servicechain_node) self._validate_shared_update(context, original_sc_node, updated_sc_node, 'servicechain_node') instances = self._get_node_instances(context, updated_sc_node) for instance in instances: node_context = ctx.get_node_driver_context( self, context, instance, updated_sc_node, original_sc_node) # TODO(ivar): Validate that the node driver understands the # update. driver = self.driver_manager.schedule_update(node_context) if not driver: raise exc.NoDriverAvailableForAction( action='update', node_id=original_sc_node['id']) updaters[instance['id']] = {} updaters[instance['id']]['context'] = node_context updaters[instance['id']]['driver'] = driver updaters[instance['id']]['plumbing_info'] = ( driver.get_plumbing_info(node_context)) # Update the nodes for update in updaters.values(): try: update['driver'].update(update['context']) except exc.NodeDriverError as ex: LOG.error("Node Update failed, %s", ex.message) return updated_sc_node
def test_context_attributes(self): # Verify Context attributes for simple config plugin_context = n_context.get_admin_context() profile = self.create_service_profile( service_type="TYPE")['service_profile'] node = self.create_servicechain_node(service_profile_id=profile['id'], config='{}')['servicechain_node'] spec = self.create_servicechain_spec( nodes=[node['id']])['servicechain_spec'] provider = self.create_policy_target_group()['policy_target_group'] consumer = self.create_policy_target_group()['policy_target_group'] management = self.create_policy_target_group()['policy_target_group'] instance = self.create_servicechain_instance( provider_ptg_id=provider['id'], consumer_ptg_id=consumer['id'], servicechain_specs=[spec['id']])['servicechain_instance'] # Verify created without errors ctx = ncp_context.get_node_driver_context(self.plugin, plugin_context, instance, node, management_group=management) self.assertIsNotNone(ctx.gbp_plugin) self.assertIsNotNone(ctx.sc_plugin) self.assertIsNotNone(ctx.core_plugin) self.assertIsNotNone(ctx.plugin_context) self.assertIsNotNone(ctx.plugin_session) self.assertIsNotNone(ctx.session) self.assertIsNotNone(ctx.admin_context) self.assertIsNotNone(ctx.admin_session) del ctx.current_profile['nodes'] self.assertEqual(ctx.current_profile, profile) self.assertEqual(instance['id'], ctx.instance['id']) self.assertEqual(provider['id'], ctx.provider['id']) self.assertEqual(consumer['id'], ctx.consumer['id']) self.assertEqual(management['id'], ctx.management['id']) self.assertEqual([spec['id']], [x['id'] for x in ctx.relevant_specs]) self.assertIsNone(ctx.original_node) self.assertEqual(0, len(ctx.get_service_targets()))
def test_context_attributes(self): # Verify Context attributes for simple config plugin_context = n_context.get_admin_context() profile = self.create_service_profile( service_type="TYPE")['service_profile'] node = self.create_servicechain_node( service_profile_id=profile['id'], config='{}')['servicechain_node'] spec = self.create_servicechain_spec( nodes=[node['id']])['servicechain_spec'] provider = self.create_policy_target_group()['policy_target_group'] consumer = self.create_policy_target_group()['policy_target_group'] management = self.create_policy_target_group()['policy_target_group'] instance = self.create_servicechain_instance( provider_ptg_id=provider['id'], consumer_ptg_id=consumer['id'], servicechain_specs=[spec['id']])['servicechain_instance'] # Verify created without errors ctx = ncp_context.get_node_driver_context( self.plugin, plugin_context, instance, node, management_group=management) self.assertIsNotNone(ctx.gbp_plugin) self.assertIsNotNone(ctx.sc_plugin) self.assertIsNotNone(ctx.core_plugin) self.assertIsNotNone(ctx.plugin_context) self.assertIsNotNone(ctx.plugin_session) self.assertIsNotNone(ctx.session) self.assertIsNotNone(ctx.admin_context) self.assertIsNotNone(ctx.admin_session) del ctx.current_profile['nodes'] self.assertEqual(ctx.current_profile, profile) self.assertEqual(instance['id'], ctx.instance['id']) self.assertEqual(provider['id'], ctx.provider['id']) self.assertEqual(consumer['id'], ctx.consumer['id']) self.assertEqual(management['id'], ctx.management['id']) self.assertEqual([spec['id']], [x['id'] for x in ctx.relevant_specs]) self.assertIsNone(ctx.original_node) self.assertEqual(0, len(ctx.get_service_targets()))