/* * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html */ package org.opendaylight.groupbasedpolicy.renderer.ios_xe_provider.impl.util; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.mockito.Matchers.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.opendaylight.groupbasedpolicy.renderer.ios_xe_provider.impl.manager.PolicyManagerImpl.ActionCase.ALLOW; import static org.opendaylight.groupbasedpolicy.renderer.ios_xe_provider.impl.manager.PolicyManagerImpl.ActionCase.CHAIN; import static org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.HasDirection.Direction.In; import static org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.HasDirection.Direction.Out; import static org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.EndpointPolicyParticipation.PROVIDER; import static org.powermock.api.mockito.PowerMockito.verifyStatic; import static org.powermock.api.support.membermodification.MemberMatcher.method; import static org.powermock.api.support.membermodification.MemberModifier.stub; import javax.annotation.Nonnull; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Map; import com.google.common.collect.Lists; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.mockito.Captor; import org.mockito.Mock; import org.opendaylight.controller.md.sal.binding.api.DataBroker; import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction; import org.opendaylight.groupbasedpolicy.renderer.ios_xe_provider.impl.manager.PolicyConfigurationContext; import org.opendaylight.groupbasedpolicy.renderer.ios_xe_provider.impl.manager.PolicyManagerImpl; import org.opendaylight.groupbasedpolicy.renderer.ios_xe_provider.impl.manager.PolicyManagerImpl.ActionCase; import org.opendaylight.groupbasedpolicy.renderer.ios_xe_provider.impl.util.PolicyManagerUtil.ActionInDirection; import org.opendaylight.groupbasedpolicy.renderer.ios_xe_provider.impl.writer.PolicyWriterUtil; import org.opendaylight.sfc.provider.api.SfcProviderRenderedPathAPI; import org.opendaylight.sfc.provider.api.SfcProviderServiceForwarderAPI; import org.opendaylight.sfc.provider.api.SfcProviderServicePathAPI; import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.common.rev151017.RspName; import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.common.rev151017.SfName; import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.common.rev151017.SfcName; import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.common.rev151017.SffName; import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.common.rev151017.SfpName; import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.rsp.rev140701.CreateRenderedPathInput; import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.rsp.rev140701.rendered.service.paths.RenderedServicePath; import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.rsp.rev140701.rendered.service.paths.RenderedServicePathBuilder; import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.rsp.rev140701.rendered.service.paths.rendered.service.path.RenderedServicePathHop; import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.rsp.rev140701.rendered.service.paths.rendered.service.path.RenderedServicePathHopBuilder; import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.rev140701.service.function.forwarder.base.SffDataPlaneLocatorBuilder; import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.rev140701.service.function.forwarder.base.sff.data.plane.locator.DataPlaneLocatorBuilder; import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.rev140701.service.function.forwarders.ServiceFunctionForwarderBuilder; import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.rev140701.service.function.forwarders.ServiceFunctionForwarderKey; import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sfp.rev140701.ServiceFunctionPaths; import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sfp.rev140701.ServiceFunctionPathsBuilder; import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sfp.rev140701.service.function.paths.ServiceFunctionPath; import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sfp.rev140701.service.function.paths.ServiceFunctionPathBuilder; import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sl.rev140701.data.plane.locator.locator.type.IpBuilder; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address; import org.opendaylight.yang.gen.v1.urn.ios.rev160308._native.ClassMap; import org.opendaylight.yang.gen.v1.urn.ios.rev160308._native.ServiceChain; import org.opendaylight.yang.gen.v1.urn.ios.rev160308._native.policy.map.Class; import org.opendaylight.yang.gen.v1.urn.ios.rev160308._native.service.chain.service.function.forwarder.ServiceFfName; import org.opendaylight.yang.gen.v1.urn.ios.rev160308._native.service.chain.service.function.forwarder.ServiceFfNameBuilder; import org.opendaylight.yang.gen.v1.urn.ios.rev160308._native.service.chain.service.function.forwarder.ServiceFfNameKey; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ParameterName; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.RuleName; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.TenantId; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.HasDirection.Direction; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.subject.feature.instance.ParameterValue; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.subject.feature.instance.ParameterValueBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.has.rule.group.with.renderer.endpoint.participation.RuleGroupWithRendererEndpointParticipationBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.endpoints.RendererEndpointBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.endpoints.renderer.endpoint.PeerEndpoint; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.endpoints.renderer.endpoint.PeerEndpointBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.has.actions.Action; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.has.actions.ActionBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.database.rev160308.Sgt; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId; import org.powermock.api.mockito.PowerMockito; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; /** * Test for {@link ServiceChainingUtil}. */ @RunWith(PowerMockRunner.class) @PrepareForTest({ SfcProviderServiceForwarderAPI.class, SfcProviderServicePathAPI.class, SfcProviderRenderedPathAPI.class, PolicyManagerUtil.class, PolicyWriterUtil.class }) public class ServiceChainingUtilTest { private final String SFC_CHAIN_NAME = "sfc-chain-name"; private final String SFC_PATH_NAME = "sfc-path-name"; private final String TENANT_ID = "tenant-id"; private final String IP_ADDRESS = "170.0.0.1"; private final String SERVICE_FUNCTION_FORWARDER = "service-function-forwarder"; private final RuleName RULE_NAME = new RuleName("rule-name"); private DataBroker dataBroker; private PolicyWriterUtil policyWriterUtil; @Captor private ArgumentCaptor<RspName> rspNameCaptor; @Captor private ArgumentCaptor<SffName> sffNameCaptor; @Captor private ArgumentCaptor<ServiceFunctionPath> sfpCaptor; @Captor private ArgumentCaptor<CreateRenderedPathInput> createRspCaptor; @Captor private ArgumentCaptor<RenderedServicePath> rspCaptor; @Captor private ArgumentCaptor<Class> listClassCaptor; @Captor private ArgumentCaptor<ClassMap> classMapCaptor; @Mock private ReadWriteTransaction rwTx; @Before public void setUp() { dataBroker = mock(DataBroker.class); policyWriterUtil = mock(PolicyWriterUtil.class); } @Test public void testResolveNewChainAction_actionAllow() { final PeerEndpoint peerEndpoint = peerEndpointBuilder(); final Action action = actionBuilder(null); final PolicyConfigurationContext context = policyConfigurationContextBuilder(); ServiceChainingUtil.newChainAction(peerEndpoint, sgtBuilder(10), sgtBuilder(20), resolvedActionBuilder(RULE_NAME, ALLOW, action, In), context, dataBroker); verifyNoMoreInteractions(policyWriterUtil); verifyNoMoreInteractions(dataBroker); } @Test public void testResolveNewChainAction_noParameterValue() { final PeerEndpoint peerEndpoint = peerEndpointBuilder(); final Action action = actionBuilder(null); final PolicyConfigurationContext context = policyConfigurationContextBuilder(); ServiceChainingUtil.newChainAction(peerEndpoint, sgtBuilder(10), sgtBuilder(20), resolvedActionBuilder(RULE_NAME, CHAIN, action, In), context, dataBroker); verifyNoMoreInteractions(policyWriterUtil); verifyNoMoreInteractions(dataBroker); } @Test public void testResolveNewChainAction_noTenantId() { final ParameterValueBuilder parameterValueBuilder = new ParameterValueBuilder(); parameterValueBuilder.setName(new ParameterName(SFC_CHAIN_NAME)).setStringValue(SFC_CHAIN_NAME); final ParameterValue parameterValue = parameterValueBuilder.build(); final ServiceFunctionPathBuilder pathBuilder = new ServiceFunctionPathBuilder(); pathBuilder.setName(new SfpName(SFC_PATH_NAME)).setServiceChainName(new SfcName(SFC_CHAIN_NAME)); final ServiceFunctionPathsBuilder pathsBuilder = new ServiceFunctionPathsBuilder(); pathsBuilder.setServiceFunctionPath(Collections.singletonList(pathBuilder.build())); final PeerEndpoint peerEndpoint = peerEndpointBuilder(); final Action action = actionBuilder(Collections.singletonList(parameterValue)); final PolicyConfigurationContext context = policyConfigurationContextBuilder(); stub(method(SfcProviderServicePathAPI.class, "readAllServiceFunctionPaths")).toReturn(pathsBuilder.build()); stub(method(PolicyManagerUtil.class, "getTenantId")).toReturn(null); ServiceChainingUtil.newChainAction(peerEndpoint, sgtBuilder(10), sgtBuilder(20), resolvedActionBuilder(RULE_NAME, CHAIN, action, In), context, dataBroker); verifyNoMoreInteractions(policyWriterUtil); verifyNoMoreInteractions(dataBroker); } @Test public void testResolveNewChainAction_asymmetricChainOpposite() { final ParameterValueBuilder parameterValueBuilder = new ParameterValueBuilder(); parameterValueBuilder.setName(new ParameterName(SFC_CHAIN_NAME)).setStringValue(SFC_CHAIN_NAME); final ParameterValue parameterValue = parameterValueBuilder.build(); final ServiceFunctionPathBuilder pathBuilder = new ServiceFunctionPathBuilder(); pathBuilder.setName(new SfpName(SFC_PATH_NAME)).setServiceChainName(new SfcName(SFC_CHAIN_NAME)) .setSymmetric(false); final ServiceFunctionPathsBuilder pathsBuilder = new ServiceFunctionPathsBuilder(); pathsBuilder.setServiceFunctionPath(Collections.singletonList(pathBuilder.build())); final PeerEndpoint peerEndpoint = peerEndpointBuilder(); final Action action = actionBuilder(Collections.singletonList(parameterValue)); final PolicyConfigurationContext context = policyConfigurationContextBuilder(); stub(method(SfcProviderServicePathAPI.class, "readAllServiceFunctionPaths")).toReturn(pathsBuilder.build()); stub(method(PolicyManagerUtil.class, "getTenantId")).toReturn(new TenantId(TENANT_ID)); ServiceChainingUtil.newChainAction(peerEndpoint, sgtBuilder(10), sgtBuilder(20), resolvedActionBuilder(RULE_NAME, CHAIN, action, In), context, dataBroker); verifyNoMoreInteractions(policyWriterUtil); verifyNoMoreInteractions(dataBroker); } @Test public void testResolveNewChainAction_asymmetricChain() { final ParameterValueBuilder parameterValueBuilder = new ParameterValueBuilder(); parameterValueBuilder.setName(new ParameterName(SFC_CHAIN_NAME)).setStringValue(SFC_CHAIN_NAME); final ParameterValue parameterValue = parameterValueBuilder.build(); final ServiceFunctionPathBuilder pathBuilder = new ServiceFunctionPathBuilder(); pathBuilder.setName(new SfpName(SFC_PATH_NAME)).setServiceChainName(new SfcName(SFC_CHAIN_NAME)) .setSymmetric(false); final ServiceFunctionPathsBuilder pathsBuilder = new ServiceFunctionPathsBuilder(); pathsBuilder.setServiceFunctionPath(Collections.singletonList(pathBuilder.build())); final PeerEndpoint peerEndpoint = peerEndpointBuilder(); final Action action = actionBuilder(Collections.singletonList(parameterValue)); final PolicyConfigurationContext context = policyConfigurationContextBuilder(); stub(method(SfcProviderServicePathAPI.class, "readAllServiceFunctionPaths")).toReturn(pathsBuilder.build()); stub(method(PolicyWriterUtil.class, "writeClassMap")).toReturn(true); stub(method(PolicyWriterUtil.class, "writePolicyMapEntry")).toReturn(true); ServiceChainingUtil.newChainAction(peerEndpoint, sgtBuilder(10), sgtBuilder(20), resolvedActionBuilder(RULE_NAME, CHAIN, action, Out), context, dataBroker); verifyStatic(times(1)); PolicyWriterUtil.writeClassMap(any(ClassMap.class), any(PolicyManagerImpl.PolicyMapLocation.class)); PolicyWriterUtil.writePolicyMapEntry(any(Class.class), any(PolicyManagerImpl.PolicyMapLocation.class)); } @Test public void testResolveNewChainAction_symmetricChainDirect() { final ParameterValueBuilder parameterValueBuilder = new ParameterValueBuilder(); parameterValueBuilder.setName(new ParameterName(SFC_CHAIN_NAME)).setStringValue(SFC_CHAIN_NAME); final ParameterValue parameterValue = parameterValueBuilder.build(); final ServiceFunctionPathBuilder pathBuilder = new ServiceFunctionPathBuilder(); pathBuilder.setName(new SfpName(SFC_PATH_NAME)).setServiceChainName(new SfcName(SFC_CHAIN_NAME)) .setSymmetric(true); final ServiceFunctionPathsBuilder pathsBuilder = new ServiceFunctionPathsBuilder(); pathsBuilder.setServiceFunctionPath(Collections.singletonList(pathBuilder.build())); final PeerEndpoint peerEndpoint = peerEndpointBuilder(); final Action action = actionBuilder(Collections.singletonList(parameterValue)); final PolicyConfigurationContext context = policyConfigurationContextBuilder(); stub(method(SfcProviderServicePathAPI.class, "readAllServiceFunctionPaths")).toReturn(pathsBuilder.build()); stub(method(PolicyWriterUtil.class, "writeClassMap")).toReturn(true); stub(method(PolicyWriterUtil.class, "writePolicyMapEntry")).toReturn(true); ServiceChainingUtil.newChainAction(peerEndpoint, sgtBuilder(10), sgtBuilder(20), resolvedActionBuilder(RULE_NAME, CHAIN, action, Out), context, dataBroker); verifyStatic(times(1)); PolicyWriterUtil.writeClassMap(any(ClassMap.class), any(PolicyManagerImpl.PolicyMapLocation.class)); PolicyWriterUtil.writePolicyMapEntry(any(Class.class), any(PolicyManagerImpl.PolicyMapLocation.class)); } @Test public void testResolveNewChainAction_symmetricChainReversed() { final ParameterValueBuilder parameterValueBuilder = new ParameterValueBuilder(); parameterValueBuilder.setName(new ParameterName(SFC_CHAIN_NAME)).setStringValue(SFC_CHAIN_NAME); final ParameterValue parameterValue = parameterValueBuilder.build(); final ServiceFunctionPathBuilder pathBuilder = new ServiceFunctionPathBuilder(); pathBuilder.setName(new SfpName(SFC_PATH_NAME)).setServiceChainName(new SfcName(SFC_CHAIN_NAME)) .setSymmetric(true); final ServiceFunctionPathsBuilder pathsBuilder = new ServiceFunctionPathsBuilder(); pathsBuilder.setServiceFunctionPath(Collections.singletonList(pathBuilder.build())); final PeerEndpoint peerEndpoint = peerEndpointBuilder(); final Action action = actionBuilder(Collections.singletonList(parameterValue)); final PolicyConfigurationContext context = policyConfigurationContextBuilder(); stub(method(SfcProviderServicePathAPI.class, "readAllServiceFunctionPaths")).toReturn(pathsBuilder.build()); stub(method(PolicyWriterUtil.class, "writeClassMap")).toReturn(true); stub(method(PolicyWriterUtil.class, "writePolicyMapEntry")).toReturn(true); ServiceChainingUtil.newChainAction(peerEndpoint, sgtBuilder(10), sgtBuilder(20), resolvedActionBuilder(RULE_NAME, CHAIN, action, In), context, dataBroker); verifyStatic(times(1)); PolicyWriterUtil.writeClassMap(any(ClassMap.class), any(PolicyManagerImpl.PolicyMapLocation.class)); PolicyWriterUtil.writePolicyMapEntry(any(Class.class), any(PolicyManagerImpl.PolicyMapLocation.class)); } @Test public void testResolveRemovedChainAction_noParameterValue() { final PolicyConfigurationContext context = new PolicyConfigurationContext(); context.setPolicyMapLocation(getLocation()); final PeerEndpoint peerEndpoint = peerEndpointBuilder(); final Action action = actionBuilder(null); ServiceChainingUtil.resolveRemovedChainAction(peerEndpoint, sgtBuilder(10), sgtBuilder(20), resolvedActionBuilder(new RuleName("rule-name"), CHAIN, action, In), context); verifyNoMoreInteractions(policyWriterUtil); } @Test public void testResolveRemovedChainAction_noTenantId() { final PolicyConfigurationContext context = new PolicyConfigurationContext(); context.setPolicyMapLocation(getLocation()); final ParameterValueBuilder parameterValueBuilder = new ParameterValueBuilder(); parameterValueBuilder.setName(new ParameterName(SFC_CHAIN_NAME)).setStringValue(SFC_CHAIN_NAME); final ParameterValue parameterValue = parameterValueBuilder.build(); final ServiceFunctionPathBuilder pathBuilder = new ServiceFunctionPathBuilder(); pathBuilder.setName(new SfpName(SFC_PATH_NAME)).setServiceChainName(new SfcName(SFC_CHAIN_NAME)); final ServiceFunctionPathsBuilder pathsBuilder = new ServiceFunctionPathsBuilder(); pathsBuilder.setServiceFunctionPath(Collections.singletonList(pathBuilder.build())); final PeerEndpoint peerEndpoint = peerEndpointBuilder(); final Action action = actionBuilder(Collections.singletonList(parameterValue)); stub(method(SfcProviderServicePathAPI.class, "readAllServiceFunctionPaths")).toReturn(pathsBuilder.build()); stub(method(PolicyManagerUtil.class, "getTenantId")).toReturn(null); ServiceChainingUtil.resolveRemovedChainAction(peerEndpoint, sgtBuilder(10), sgtBuilder(20), resolvedActionBuilder(new RuleName("rule-name"), CHAIN, action, In), context); verifyNoMoreInteractions(policyWriterUtil); } @Test public void testResolveRemovedChainAction_asymmetricChainOpposite() { final PolicyConfigurationContext context = new PolicyConfigurationContext(); context.setPolicyMapLocation(getLocation()); final ParameterValueBuilder parameterValueBuilder = new ParameterValueBuilder(); parameterValueBuilder.setName(new ParameterName(SFC_CHAIN_NAME)).setStringValue(SFC_CHAIN_NAME); final ParameterValue parameterValue = parameterValueBuilder.build(); final ServiceFunctionPathBuilder pathBuilder = new ServiceFunctionPathBuilder(); pathBuilder.setName(new SfpName(SFC_PATH_NAME)).setServiceChainName(new SfcName(SFC_CHAIN_NAME)) .setSymmetric(false); final ServiceFunctionPathsBuilder pathsBuilder = new ServiceFunctionPathsBuilder(); pathsBuilder.setServiceFunctionPath(Collections.singletonList(pathBuilder.build())); final PeerEndpoint peerEndpoint = peerEndpointBuilder(); final Action action = actionBuilder(Collections.singletonList(parameterValue)); stub(method(SfcProviderServicePathAPI.class, "readAllServiceFunctionPaths")).toReturn(pathsBuilder.build()); stub(method(PolicyManagerUtil.class, "getTenantId")).toReturn(new TenantId(TENANT_ID)); ServiceChainingUtil.resolveRemovedChainAction(peerEndpoint, sgtBuilder(10), sgtBuilder(20), resolvedActionBuilder(new RuleName("rule-name"), CHAIN, action, In), context); verifyNoMoreInteractions(policyWriterUtil); } @Test public void testResolveRemovedChainAction_asymmetricChainDirect() { final PolicyConfigurationContext context = new PolicyConfigurationContext(); context.setPolicyMapLocation(getLocation()); final ParameterValueBuilder parameterValueBuilder = new ParameterValueBuilder(); parameterValueBuilder.setName(new ParameterName(SFC_CHAIN_NAME)).setStringValue(SFC_CHAIN_NAME); final ParameterValue parameterValue = parameterValueBuilder.build(); final ServiceFunctionPathBuilder pathBuilder = new ServiceFunctionPathBuilder(); pathBuilder.setName(new SfpName(SFC_PATH_NAME)).setServiceChainName(new SfcName(SFC_CHAIN_NAME)) .setSymmetric(false); final ServiceFunctionPathsBuilder pathsBuilder = new ServiceFunctionPathsBuilder(); pathsBuilder.setServiceFunctionPath(Collections.singletonList(pathBuilder.build())); final PeerEndpoint peerEndpoint = peerEndpointBuilder(); final Action action = actionBuilder(Collections.singletonList(parameterValue)); final RenderedServicePathHopBuilder hopBuilder = new RenderedServicePathHopBuilder(); hopBuilder.setServiceFunctionForwarder(new SffName(SERVICE_FUNCTION_FORWARDER)); final ServiceFunctionForwarderBuilder forwarder = new ServiceFunctionForwarderBuilder(); forwarder.setName(new SffName(SERVICE_FUNCTION_FORWARDER)) .setIpMgmtAddress(new IpAddress(new Ipv4Address(IP_ADDRESS))); stub(method(SfcProviderServicePathAPI.class, "readAllServiceFunctionPaths")).toReturn(pathsBuilder.build()); stub(method(PolicyWriterUtil.class, "removeClassMap")).toReturn(true); stub(method(PolicyWriterUtil.class, "removePolicyMapEntry")).toReturn(true); stub(method(PolicyWriterUtil.class, "removeServicePath")).toReturn(true); stub(method(PolicyWriterUtil.class, "removeRemote")).toReturn(true); ServiceChainingUtil.resolveRemovedChainAction(peerEndpoint, sgtBuilder(10), sgtBuilder(20), resolvedActionBuilder(new RuleName("rule-name"), CHAIN, action, Out), context); verifyStatic(times(1)); PolicyWriterUtil.removeClassMap(any(ClassMap.class), any(PolicyManagerImpl.PolicyMapLocation.class)); PolicyWriterUtil.removePolicyMapEntry(any(Class.class), any(PolicyManagerImpl.PolicyMapLocation.class)); PolicyWriterUtil.removeServicePath(any(ServiceChain.class), any(PolicyManagerImpl.PolicyMapLocation.class)); PolicyWriterUtil.removeRemote(any(ServiceFfName.class), any(PolicyManagerImpl.PolicyMapLocation.class)); } @Test public void testResolveRemovedChainAction_symmetricChainDirect() { final PolicyConfigurationContext context = new PolicyConfigurationContext(); context.setPolicyMapLocation(getLocation()); final ParameterValueBuilder parameterValueBuilder = new ParameterValueBuilder(); parameterValueBuilder.setName(new ParameterName(SFC_CHAIN_NAME)).setStringValue(SFC_CHAIN_NAME); final ParameterValue parameterValue = parameterValueBuilder.build(); final ServiceFunctionPathBuilder pathBuilder = new ServiceFunctionPathBuilder(); pathBuilder.setName(new SfpName(SFC_PATH_NAME)).setServiceChainName(new SfcName(SFC_CHAIN_NAME)) .setSymmetric(true); final ServiceFunctionPathsBuilder pathsBuilder = new ServiceFunctionPathsBuilder(); pathsBuilder.setServiceFunctionPath(Collections.singletonList(pathBuilder.build())); final PeerEndpoint peerEndpoint = peerEndpointBuilder(); final Action action = actionBuilder(Collections.singletonList(parameterValue)); final RenderedServicePathHopBuilder hopBuilder = new RenderedServicePathHopBuilder(); hopBuilder.setServiceFunctionForwarder(new SffName(SERVICE_FUNCTION_FORWARDER)); final ServiceFunctionForwarderBuilder forwarder = new ServiceFunctionForwarderBuilder(); forwarder.setName(new SffName(SERVICE_FUNCTION_FORWARDER)) .setIpMgmtAddress(new IpAddress(new Ipv4Address(IP_ADDRESS))); stub(method(SfcProviderServicePathAPI.class, "readAllServiceFunctionPaths")).toReturn(pathsBuilder.build()); stub(method(PolicyWriterUtil.class, "removeClassMap")).toReturn(true); stub(method(PolicyWriterUtil.class, "removePolicyMapEntry")).toReturn(true); stub(method(PolicyWriterUtil.class, "removeServicePath")).toReturn(true); stub(method(PolicyWriterUtil.class, "removeRemote")).toReturn(true); ServiceChainingUtil.resolveRemovedChainAction(peerEndpoint, sgtBuilder(10), sgtBuilder(20), resolvedActionBuilder(new RuleName("rule-name"), CHAIN, action, Out), context); verifyStatic(times(1)); PolicyWriterUtil.removeClassMap(any(ClassMap.class), any(PolicyManagerImpl.PolicyMapLocation.class)); PolicyWriterUtil.removePolicyMapEntry(any(Class.class), any(PolicyManagerImpl.PolicyMapLocation.class)); PolicyWriterUtil.removeServicePath(any(ServiceChain.class), any(PolicyManagerImpl.PolicyMapLocation.class)); PolicyWriterUtil.removeRemote(any(ServiceFfName.class), any(PolicyManagerImpl.PolicyMapLocation.class)); } @Test public void testResolveRemovedChainAction_symmetricChainReversed() { final PolicyConfigurationContext context = new PolicyConfigurationContext(); context.setPolicyMapLocation(getLocation()); final ParameterValueBuilder parameterValueBuilder = new ParameterValueBuilder(); parameterValueBuilder.setName(new ParameterName(SFC_CHAIN_NAME)).setStringValue(SFC_CHAIN_NAME); final ParameterValue parameterValue = parameterValueBuilder.build(); final ServiceFunctionPathBuilder pathBuilder = new ServiceFunctionPathBuilder(); pathBuilder.setName(new SfpName(SFC_PATH_NAME)).setServiceChainName(new SfcName(SFC_CHAIN_NAME)) .setSymmetric(true); final ServiceFunctionPathsBuilder pathsBuilder = new ServiceFunctionPathsBuilder(); pathsBuilder.setServiceFunctionPath(Collections.singletonList(pathBuilder.build())); final PeerEndpoint peerEndpoint = peerEndpointBuilder(); final Action action = actionBuilder(Collections.singletonList(parameterValue)); final RenderedServicePathHopBuilder hopBuilder = new RenderedServicePathHopBuilder(); hopBuilder.setServiceFunctionForwarder(new SffName(SERVICE_FUNCTION_FORWARDER)); final ServiceFunctionForwarderBuilder forwarder = new ServiceFunctionForwarderBuilder(); forwarder.setName(new SffName(SERVICE_FUNCTION_FORWARDER)) .setIpMgmtAddress(new IpAddress(new Ipv4Address(IP_ADDRESS))); stub(method(SfcProviderServicePathAPI.class, "readAllServiceFunctionPaths")).toReturn(pathsBuilder.build()); stub(method(PolicyWriterUtil.class, "removeClassMap")).toReturn(true); stub(method(PolicyWriterUtil.class, "removePolicyMapEntry")).toReturn(true); stub(method(PolicyWriterUtil.class, "removeServicePath")).toReturn(true); stub(method(PolicyWriterUtil.class, "removeRemote")).toReturn(true); ServiceChainingUtil.resolveRemovedChainAction(peerEndpoint, sgtBuilder(10), sgtBuilder(20), resolvedActionBuilder(new RuleName("rule-name"), CHAIN, action, In), context); verifyStatic(times(1)); PolicyWriterUtil.removeClassMap(any(ClassMap.class), any(PolicyManagerImpl.PolicyMapLocation.class)); PolicyWriterUtil.removePolicyMapEntry(any(Class.class), any(PolicyManagerImpl.PolicyMapLocation.class)); PolicyWriterUtil.removeServicePath(any(ServiceChain.class), any(PolicyManagerImpl.PolicyMapLocation.class)); PolicyWriterUtil.removeRemote(any(ServiceFfName.class), any(PolicyManagerImpl.PolicyMapLocation.class)); } @Test public void testResolveRemoteSfcComponents_noForwarder() { final PolicyConfigurationContext context = new PolicyConfigurationContext(); context.setPolicyMapLocation(getLocation()); boolean result = ServiceChainingUtil.resolveRemoteSfcComponents(buildRsp(), context); assertFalse(result); } @Test public void testResolveRemoteSfcComponents_noForwarderLocator() { final PolicyConfigurationContext context = new PolicyConfigurationContext(); context.setPolicyMapLocation(getLocation()); final ServiceFunctionForwarderBuilder forwarderBuilder = new ServiceFunctionForwarderBuilder(); forwarderBuilder.setName(new SffName(SERVICE_FUNCTION_FORWARDER)); final RenderedServicePathHopBuilder hopBuilder = new RenderedServicePathHopBuilder(); hopBuilder.setServiceFunctionForwarder(new SffName(SERVICE_FUNCTION_FORWARDER)); final RenderedServicePathBuilder rspBuilder = new RenderedServicePathBuilder(); rspBuilder.setRenderedServicePathHop(Collections.singletonList(hopBuilder.build())); stub(method(SfcProviderServiceForwarderAPI.class, "readServiceFunctionForwarder")).toReturn(forwarderBuilder.build()); boolean result = ServiceChainingUtil.resolveRemoteSfcComponents(rspBuilder.build(), context); assertFalse(result); } @Test public void testResolveRemoteSfcComponents_dplWithoutLocatorType() { final PolicyConfigurationContext context = new PolicyConfigurationContext(); context.setPolicyMapLocation(getLocation()); final DataPlaneLocatorBuilder dplBuilder = new DataPlaneLocatorBuilder(); final SffDataPlaneLocatorBuilder sffDplBuilder = new SffDataPlaneLocatorBuilder(); sffDplBuilder.setDataPlaneLocator(dplBuilder.build()); final ServiceFunctionForwarderBuilder forwarderBuilder = new ServiceFunctionForwarderBuilder(); forwarderBuilder.setName(new SffName(SERVICE_FUNCTION_FORWARDER)) .setSffDataPlaneLocator(Collections.singletonList(sffDplBuilder.build())); final RenderedServicePathHopBuilder hopBuilder = new RenderedServicePathHopBuilder(); hopBuilder.setServiceFunctionForwarder(new SffName(SERVICE_FUNCTION_FORWARDER)); final RenderedServicePathBuilder rspBuilder = new RenderedServicePathBuilder(); rspBuilder.setRenderedServicePathHop(Collections.singletonList(hopBuilder.build())); stub(method(SfcProviderServiceForwarderAPI.class, "readServiceFunctionForwarder")).toReturn(forwarderBuilder.build()); boolean result = ServiceChainingUtil.resolveRemoteSfcComponents(rspBuilder.build(), context); assertFalse(result); } @Test public void testResolveRemoteSfcComponents_dplWithoutIp() { final PolicyConfigurationContext context = new PolicyConfigurationContext(); context.setPolicyMapLocation(getLocation()); final DataPlaneLocatorBuilder dplBuilder = new DataPlaneLocatorBuilder(); dplBuilder.setLocatorType(new IpBuilder().build()); final SffDataPlaneLocatorBuilder sffDplBuilder = new SffDataPlaneLocatorBuilder(); sffDplBuilder.setDataPlaneLocator(dplBuilder.build()); final ServiceFunctionForwarderBuilder forwarderBuilder = new ServiceFunctionForwarderBuilder(); forwarderBuilder.setName(new SffName(SERVICE_FUNCTION_FORWARDER)) .setSffDataPlaneLocator(Collections.singletonList(sffDplBuilder.build())); final RenderedServicePathHopBuilder hopBuilder = new RenderedServicePathHopBuilder(); hopBuilder.setServiceFunctionForwarder(new SffName(SERVICE_FUNCTION_FORWARDER)); final RenderedServicePathBuilder rspBuilder = new RenderedServicePathBuilder(); rspBuilder.setRenderedServicePathHop(Collections.singletonList(hopBuilder.build())); stub(method(SfcProviderServiceForwarderAPI.class, "readServiceFunctionForwarder")).toReturn(forwarderBuilder.build()); boolean result = ServiceChainingUtil.resolveRemoteSfcComponents(rspBuilder.build(), context); assertFalse(result); } @Test public void testResolveRemoteSfcComponents_sffWithoutMgmtAddress() { final PolicyConfigurationContext context = new PolicyConfigurationContext(); context.setPolicyMapLocation(getLocation()); final DataPlaneLocatorBuilder dplBuilder = new DataPlaneLocatorBuilder(); dplBuilder.setLocatorType(new IpBuilder().setIp(new IpAddress(new Ipv4Address(IP_ADDRESS))).build()); final SffDataPlaneLocatorBuilder sffDplBuilder = new SffDataPlaneLocatorBuilder(); sffDplBuilder.setDataPlaneLocator(dplBuilder.build()); final ServiceFunctionForwarderBuilder forwarderBuilder = new ServiceFunctionForwarderBuilder(); forwarderBuilder.setName(new SffName(SERVICE_FUNCTION_FORWARDER)) .setSffDataPlaneLocator(Collections.singletonList(sffDplBuilder.build())); final RenderedServicePathHopBuilder hopBuilder = new RenderedServicePathHopBuilder(); hopBuilder.setServiceFunctionForwarder(new SffName(SERVICE_FUNCTION_FORWARDER)); final RenderedServicePathBuilder rspBuilder = new RenderedServicePathBuilder(); rspBuilder.setRenderedServicePathHop(Collections.singletonList(hopBuilder.build())); stub(method(SfcProviderServiceForwarderAPI.class, "readServiceFunctionForwarder")).toReturn(forwarderBuilder.build()); boolean result = ServiceChainingUtil.resolveRemoteSfcComponents(rspBuilder.build(), context); assertFalse(result); } @Test public void testResolveRemoteSfcComponents_remoteCase() { final PolicyConfigurationContext context = new PolicyConfigurationContext(); context.setPolicyMapLocation(getLocation()); final DataPlaneLocatorBuilder dplBuilder = new DataPlaneLocatorBuilder(); dplBuilder.setLocatorType(new IpBuilder().setIp(new IpAddress(new Ipv4Address("190.1.1.12"))).build()); final SffDataPlaneLocatorBuilder sffDplBuilder = new SffDataPlaneLocatorBuilder(); sffDplBuilder.setDataPlaneLocator(dplBuilder.build()); final ServiceFunctionForwarderBuilder forwarderBuilder = new ServiceFunctionForwarderBuilder(); forwarderBuilder.setName(new SffName(SERVICE_FUNCTION_FORWARDER)) .setSffDataPlaneLocator(Collections.singletonList(sffDplBuilder.build())) .setIpMgmtAddress(new IpAddress(new Ipv4Address(IP_ADDRESS))); final RenderedServicePathHopBuilder hopBuilder = new RenderedServicePathHopBuilder(); hopBuilder.setServiceFunctionForwarder(new SffName(SERVICE_FUNCTION_FORWARDER)); final RenderedServicePathBuilder rspBuilder = new RenderedServicePathBuilder(); rspBuilder.setRenderedServicePathHop(Collections.singletonList(hopBuilder.build())); stub(method(SfcProviderServiceForwarderAPI.class, "readServiceFunctionForwarder")).toReturn(forwarderBuilder.build()); stub(method(PolicyWriterUtil.class, "writeServicePath")).toReturn(true); stub(method(PolicyWriterUtil.class, "writeRemote")).toReturn(true); boolean result = ServiceChainingUtil.resolveRemoteSfcComponents(rspBuilder.build(), context); assertTrue(result); verifyStatic(times(1)); PolicyWriterUtil.writeServicePath(any(ServiceChain.class), any(PolicyManagerImpl.PolicyMapLocation.class)); PolicyWriterUtil.writeRemote(any(ServiceFfName.class), any(PolicyManagerImpl.PolicyMapLocation.class)); } @Test public void testFindServicePathFromParameterValues_noParams() { final ServiceFunctionPath result = ServiceChainingUtil.findServicePathFromParameterValues(Collections.emptyList()); assertNull(result); } @Test public void testFindServicePathFromParameterValues_differentActionDefinition() { final ParameterValueBuilder noNamePVBuilder = new ParameterValueBuilder(); final ParameterValue noNamePV = noNamePVBuilder.build(); final ParameterValueBuilder intValuePMBuilder = new ParameterValueBuilder(); String PARAMETER_VALUE_1 = "parameter-value-1"; intValuePMBuilder.setName(new ParameterName(PARAMETER_VALUE_1)) .setIntValue(1L); final ParameterValue intValuePV = intValuePMBuilder.build(); final ParameterValueBuilder stringValuePVBuilder = new ParameterValueBuilder(); String PARAMETER_VALUE_2 = "parameter-value-2"; stringValuePVBuilder.setName(new ParameterName(PARAMETER_VALUE_2)) .setStringValue(PARAMETER_VALUE_2); final ParameterValue stringValuePV = stringValuePVBuilder.build(); final List<ParameterValue> parameterValues = new ArrayList<>(); parameterValues.add(noNamePV); parameterValues.add(intValuePV); parameterValues.add(stringValuePV); final ServiceFunctionPath result = ServiceChainingUtil.findServicePathFromParameterValues(parameterValues); assertNull(result); } @Test public void testFindServicePathFromParameterValues_noPathFound() { final ParameterValueBuilder parameterValueBuilder = new ParameterValueBuilder(); parameterValueBuilder.setName(new ParameterName(SFC_CHAIN_NAME)) .setStringValue(SFC_CHAIN_NAME); final List<ParameterValue> parameterValues = Collections.singletonList(parameterValueBuilder.build()); final ServiceFunctionPathsBuilder serviceFunctionPathsBuilder = new ServiceFunctionPathsBuilder(); final ServiceFunctionPaths serviceFunctionPaths = serviceFunctionPathsBuilder.build(); stub(method(SfcProviderServicePathAPI.class, "readAllServiceFunctionPaths")).toReturn(serviceFunctionPaths); final ServiceFunctionPath result = ServiceChainingUtil.findServicePathFromParameterValues(parameterValues); assertNull(result); } @Test public void testFindServicePathFromParameterValues() { final ParameterValueBuilder parameterValueBuilder = new ParameterValueBuilder(); parameterValueBuilder.setName(new ParameterName(SFC_CHAIN_NAME)) .setStringValue(SFC_CHAIN_NAME); final List<ParameterValue> parameterValues = Collections.singletonList(parameterValueBuilder.build()); final ServiceFunctionPathBuilder serviceFunctionPathBuilder = new ServiceFunctionPathBuilder(); serviceFunctionPathBuilder.setName(new SfpName(SFC_PATH_NAME)).setServiceChainName(new SfcName(SFC_CHAIN_NAME)); final ServiceFunctionPathsBuilder serviceFunctionPathsBuilder = new ServiceFunctionPathsBuilder(); serviceFunctionPathsBuilder.setServiceFunctionPath(Collections.singletonList(serviceFunctionPathBuilder.build())); final ServiceFunctionPaths serviceFunctionPaths = serviceFunctionPathsBuilder.build(); stub(method(SfcProviderServicePathAPI.class, "readAllServiceFunctionPaths")).toReturn(serviceFunctionPaths); final ServiceFunctionPath result = ServiceChainingUtil.findServicePathFromParameterValues(parameterValues); assertNotNull(result); } @Test public void findServiceFunctionPathFromServiceChainName_noPaths() { stub(method(SfcProviderServicePathAPI.class, "readAllServiceFunctionPaths")).toReturn(null); final ServiceFunctionPath result = ServiceChainingUtil.findServiceFunctionPathFromServiceChainName(new SfcName(SFC_CHAIN_NAME)); assertNull(result); } @Test public void findServiceFunctionPathFromServiceChainName_noPathFound() { final ServiceFunctionPathBuilder serviceFunctionPathBuilder = new ServiceFunctionPathBuilder(); final ServiceFunctionPathsBuilder serviceFunctionPathsBuilder = new ServiceFunctionPathsBuilder(); serviceFunctionPathsBuilder.setServiceFunctionPath(Collections.singletonList(serviceFunctionPathBuilder.build())); stub(method(SfcProviderServicePathAPI.class, "readAllServiceFunctionPaths")).toReturn(serviceFunctionPathsBuilder.build()); final ServiceFunctionPath result = ServiceChainingUtil.findServiceFunctionPathFromServiceChainName(new SfcName(SFC_CHAIN_NAME)); assertNull(result); } @Test public void findServiceFunctionPathFromServiceChainName_pathFound() { final ServiceFunctionPathBuilder serviceFunctionPathBuilder = new ServiceFunctionPathBuilder(); serviceFunctionPathBuilder.setName(new SfpName(SFC_PATH_NAME)) .setServiceChainName(new SfcName(SFC_CHAIN_NAME)); final ServiceFunctionPathsBuilder serviceFunctionPathsBuilder = new ServiceFunctionPathsBuilder(); serviceFunctionPathsBuilder.setServiceFunctionPath(Collections.singletonList(serviceFunctionPathBuilder.build())); stub(method(SfcProviderServicePathAPI.class, "readAllServiceFunctionPaths")).toReturn(serviceFunctionPathsBuilder.build()); final ServiceFunctionPath result = ServiceChainingUtil.findServiceFunctionPathFromServiceChainName(new SfcName(SFC_CHAIN_NAME)); assertNotNull(result); } @Test public void testCreateRenderedPath_renderedPathFound() { final Sgt sourceSgt = new Sgt(1); final Sgt destinationSgt = new Sgt(2); final PolicyConfigurationContext context = new PolicyConfigurationContext(); context.setPolicyMapLocation(getLocation()); final ServiceFunctionPathBuilder serviceFunctionPathBuilder = new ServiceFunctionPathBuilder(); serviceFunctionPathBuilder.setName(new SfpName(SFC_PATH_NAME)) .setSymmetric(true); final ServiceFunctionPath serviceFunctionPath = serviceFunctionPathBuilder.build(); final TenantId tenantId = new TenantId(TENANT_ID); stub(method(SfcProviderRenderedPathAPI.class, "readRenderedServicePath")).toReturn(new RenderedServicePathBuilder().build()); final RenderedServicePath result = ServiceChainingUtil.resolveRenderedServicePath(serviceFunctionPath, tenantId, dataBroker, sourceSgt, destinationSgt, context); assertNotNull(result); } @Test public void testCreateRenderedPath_renderedPathCreated() { ServiceChainingUtil.setTimeout(1L); final Sgt sourceSgt = new Sgt(1); final Sgt destinationSgt = new Sgt(2); final PolicyConfigurationContext context = new PolicyConfigurationContext(); context.setPolicyMapLocation(getLocation()); final ServiceFunctionPathBuilder serviceFunctionPathBuilder = new ServiceFunctionPathBuilder(); serviceFunctionPathBuilder.setName(new SfpName(SFC_PATH_NAME)) .setSymmetric(true); final ServiceFunctionPath serviceFunctionPath = serviceFunctionPathBuilder.build(); final TenantId tenantId = new TenantId(TENANT_ID); stub(method(SfcProviderRenderedPathAPI.class, "readRenderedServicePath")).toReturn(null); stub(method(SfcProviderRenderedPathAPI.class, "createRenderedServicePathAndState", ServiceFunctionPath.class, CreateRenderedPathInput.class)).toReturn(new RenderedServicePathBuilder().build()); final RenderedServicePath result = ServiceChainingUtil.resolveRenderedServicePath(serviceFunctionPath, tenantId, dataBroker, sourceSgt, destinationSgt, context); assertNotNull(result); } @Test public void testCreateReversedRenderedPath_renderedPathFound() { final Sgt sourceSgt = new Sgt(1); final Sgt destinationSgt = new Sgt(2); final PolicyConfigurationContext context = new PolicyConfigurationContext(); context.setPolicyMapLocation(getLocation()); final ServiceFunctionPathBuilder serviceFunctionPathBuilder = new ServiceFunctionPathBuilder(); serviceFunctionPathBuilder.setName(new SfpName(SFC_PATH_NAME)) .setSymmetric(true); final ServiceFunctionPath serviceFunctionPath = serviceFunctionPathBuilder.build(); final TenantId tenantId = new TenantId(TENANT_ID); stub(method(SfcProviderRenderedPathAPI.class, "readRenderedServicePath")).toReturn(new RenderedServicePathBuilder().build()); final RenderedServicePath result = ServiceChainingUtil.resolveReversedRenderedServicePath(serviceFunctionPath, tenantId, dataBroker, sourceSgt, destinationSgt, context); assertNotNull(result); } @Test public void testCreateReversedRenderedPath_renderedPathCreated() { ServiceChainingUtil.setTimeout(1L); final Sgt sourceSgt = new Sgt(1); final Sgt destinationSgt = new Sgt(2); final PolicyConfigurationContext context = new PolicyConfigurationContext(); context.setPolicyMapLocation(getLocation()); final ServiceFunctionPathBuilder serviceFunctionPathBuilder = new ServiceFunctionPathBuilder(); serviceFunctionPathBuilder.setName(new SfpName(SFC_PATH_NAME)) .setSymmetric(true); final ServiceFunctionPath serviceFunctionPath = serviceFunctionPathBuilder.build(); final TenantId tenantId = new TenantId(TENANT_ID); stub(method(SfcProviderRenderedPathAPI.class, "readRenderedServicePath")).toReturn(null); stub(method(SfcProviderRenderedPathAPI.class, "createReverseRenderedServicePathEntry")) .toReturn(new RenderedServicePathBuilder().build()); final RenderedServicePath result = ServiceChainingUtil.resolveReversedRenderedServicePath(serviceFunctionPath, tenantId, dataBroker, sourceSgt, destinationSgt, context); assertNotNull(result); } @Test public void testCreateRemoteForwarder() { final ServiceFfNameBuilder serviceFfNameBuilder = new ServiceFfNameBuilder(); serviceFfNameBuilder.setName(SERVICE_FUNCTION_FORWARDER) .setKey(new ServiceFfNameKey(SERVICE_FUNCTION_FORWARDER)); final ServiceFfName testForwarder = serviceFfNameBuilder.build(); final ServiceFunctionForwarderBuilder serviceFunctionForwarderBuilder = new ServiceFunctionForwarderBuilder(); serviceFunctionForwarderBuilder.setName(new SffName(SERVICE_FUNCTION_FORWARDER)) .setKey(new ServiceFunctionForwarderKey(new SffName(SERVICE_FUNCTION_FORWARDER))); final ServiceFfName result = ServiceChainingUtil.createRemoteForwarder(serviceFunctionForwarderBuilder.build()); assertEquals(testForwarder, result); } @Test public void testGetServicePath() throws Exception { final String sfcNameValue = "123"; final ServiceFunctionPath sfcPath = createSfp(sfcNameValue); final ServiceFunctionPaths sfcPaths = new ServiceFunctionPathsBuilder() .setServiceFunctionPath(Collections.singletonList(sfcPath)) .build(); stub(method(SfcProviderServicePathAPI.class, "readAllServiceFunctionPaths")).toReturn(sfcPaths); final ServiceFunctionPath servicePath = ServiceChainingUtil.findServicePathFromParameterValues(Lists.newArrayList( createParameterValue(sfcNameValue) )); assertEquals(sfcPath, servicePath); } private ParameterValue createParameterValue(final String value) { return new ParameterValueBuilder().setName(new ParameterName("sfc-chain-name")).setStringValue(value).build(); } @Test public void testCreateRenderedPath() throws Exception { final String sfcNameValue = "123"; final ServiceFunctionPath sfp = createSfp(sfcNameValue); final TenantId tenantId = new TenantId("unit-tenant-01"); final Sgt sourceSgt = new Sgt(1); final Sgt destinationSgt = new Sgt(2); final PolicyConfigurationContext context = new PolicyConfigurationContext(); context.setPolicyMapLocation(getLocation()); final RenderedServicePath rsp = createRsp("unit-rsp-01"); PowerMockito.mockStatic(SfcProviderRenderedPathAPI.class); PowerMockito.when(SfcProviderRenderedPathAPI.readRenderedServicePath(rspNameCaptor.capture())).thenReturn(rsp); final RenderedServicePath renderedPath = ServiceChainingUtil.resolveRenderedServicePath(sfp, tenantId, dataBroker, sourceSgt, destinationSgt, context); assertEquals("123_plain-unit-tenant-01-gbp-rsp", rspNameCaptor.getValue().getValue()); assertEquals(rsp, renderedPath); } @Test public void testCreateSymmetricRenderedPath() throws Exception { final ServiceFunctionPath sfp = createSfp("unit-sfp-02"); final RenderedServicePath rsp = createRsp("unit-rsp-02"); final TenantId tenantId = new TenantId("tenant-02"); final Sgt sourceSgt = new Sgt(1); final Sgt destinationSgt = new Sgt(2); final PolicyConfigurationContext context = new PolicyConfigurationContext(); context.setPolicyMapLocation(getLocation()); PowerMockito.mockStatic(SfcProviderRenderedPathAPI.class); PowerMockito.when(SfcProviderRenderedPathAPI.readRenderedServicePath(rspNameCaptor.capture())).thenReturn(rsp); stub(method(SfcProviderServiceForwarderAPI.class, "readServiceFunctionForwarder")) .toReturn(new ServiceFunctionForwarderBuilder().setName(new SffName("sff-name")).build()); final RenderedServicePath symmetricRenderedPath = ServiceChainingUtil.resolveReversedRenderedServicePath(sfp, tenantId, dataBroker, sourceSgt, destinationSgt, context); assertEquals("unit-sfp-02_plain-tenant-02-gbp-rsp-Reverse", rspNameCaptor.getValue().getValue()); assertEquals(rsp, symmetricRenderedPath); } @Test public void testFindServiceFunctionPath() throws Exception { final String sfcNameValue = "123"; final ServiceFunctionPath sfcPath = createSfp(sfcNameValue); final ServiceFunctionPaths sfcPaths = new ServiceFunctionPathsBuilder() .setServiceFunctionPath(Collections.singletonList(sfcPath)) .build(); stub(method(SfcProviderServicePathAPI.class, "readAllServiceFunctionPaths")).toReturn(sfcPaths); final ServiceFunctionPath servicePath = ServiceChainingUtil.findServiceFunctionPathFromServiceChainName(new SfcName(sfcNameValue)); assertEquals(sfcPath, servicePath); } // Auxiliary methods private RenderedServicePath buildRsp() { RenderedServicePathBuilder renderedServicePathBuilder = new RenderedServicePathBuilder(); renderedServicePathBuilder.setRenderedServicePathHop(null); return renderedServicePathBuilder.build(); } private RenderedServicePath createRsp(final String rspNameValue) { return new RenderedServicePathBuilder() .setName(new RspName(rspNameValue)) .setRenderedServicePathHop(Lists.newArrayList(createRspHop())) .build(); } private RenderedServicePathHop createRspHop() { return new RenderedServicePathHopBuilder() .setServiceFunctionName(new SfName("rsp-hop-01-sf")) .setServiceFunctionForwarder(new SffName("rsp-hop-01-sf" + "+sff")) .build(); } private ServiceFunctionPath createSfp(final String sfcNameValue) { return new ServiceFunctionPathBuilder() .setServiceChainName(new SfcName(sfcNameValue)) .setName(new SfpName(sfcNameValue + "_plain")) .setSymmetric(false) .build(); } private PeerEndpoint peerEndpointBuilder() { final PeerEndpointBuilder peerEndpointBuilder = new PeerEndpointBuilder(); final RuleGroupWithRendererEndpointParticipationBuilder ruleGroupBuilder = new RuleGroupWithRendererEndpointParticipationBuilder(); peerEndpointBuilder.setRuleGroupWithRendererEndpointParticipation(Collections.singletonList(ruleGroupBuilder.build())); return peerEndpointBuilder.build(); } private Map<ActionCase, ActionInDirection> resolvedActionBuilder(@Nonnull final RuleName ruleName, @Nonnull final ActionCase actionCase, @Nonnull final Action action, @Nonnull final Direction direction) { final ActionInDirection actionInDirection = new ActionInDirection(ruleName, action, PROVIDER, direction); return Collections.singletonMap(actionCase, actionInDirection); } private PolicyConfigurationContext policyConfigurationContextBuilder() { final RendererEndpointBuilder rendererEndpointBuilder = new RendererEndpointBuilder(); final PolicyConfigurationContext context = new PolicyConfigurationContext(); context.setCurrentRendererEP(rendererEndpointBuilder.build()); return context; } private Sgt sgtBuilder(final int value) { return new Sgt(value); } private Action actionBuilder(final List<ParameterValue> parameters) { final ActionBuilder actionBuilder = new ActionBuilder(); actionBuilder.setParameterValue(parameters); return actionBuilder.build(); } private PolicyManagerImpl.PolicyMapLocation getLocation() { final String POLICY_MAP = "policy-map"; final String INTERFACE = "interface"; final NodeId nodeId = new NodeId("node-id"); final String IP_ADDRESS = "ip-address"; return new PolicyManagerImpl.PolicyMapLocation(POLICY_MAP, INTERFACE, nodeId, IP_ADDRESS, dataBroker); } }