Fix odlparent 3 Checkstyle issues
[groupbasedpolicy.git] / renderers / ios-xe / src / test / java / org / opendaylight / groupbasedpolicy / renderer / ios_xe_provider / impl / util / ServiceChainingUtilTest.java
index 2b436b6e4bb521e2909b9bdacfbdee8aa8accf56..27e73d6e799a86de712868b0d1bd74584defb02f 100644 (file)
@@ -8,32 +8,43 @@
 
 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 com.google.common.base.Optional;
-import com.google.common.collect.Lists;
-import com.google.common.util.concurrent.Futures;
+import javax.annotation.Nonnull;
+import java.util.ArrayList;
 import java.util.Collections;
-import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import org.junit.Assert;
+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.Matchers;
 import org.mockito.Mock;
-import org.mockito.Mockito;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
-import org.opendaylight.groupbasedpolicy.api.sf.ChainActionDefinition;
+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.writer.PolicyWriter;
+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;
@@ -47,35 +58,37 @@ import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.rsp.rev1407
 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.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
+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.ServiceChainBuilder;
 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.ServicePathBuilder;
-import org.opendaylight.yang.gen.v1.urn.ios.rev160308._native.service.chain.service.function.forwarder.Local;
-import org.opendaylight.yang.gen.v1.urn.ios.rev160308._native.service.chain.service.function.forwarder.LocalBuilder;
 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.path.config.service.chain.path.mode.service.index.services.ServiceTypeChoice;
-import org.opendaylight.yang.gen.v1.urn.ios.rev160308._native.service.chain.service.path.config.service.chain.path.mode.service.index.services.service.type.choice.ServiceFunction;
-import org.opendaylight.yang.gen.v1.urn.ios.rev160308._native.service.chain.service.path.config.service.chain.path.mode.service.index.services.service.type.choice.ServiceFunctionForwarder;
+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.renderer.endpoint.PeerEndpointWithPolicy;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.endpoints.renderer.endpoint.PeerEndpointWithPolicyBuilder;
+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.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.powermock.api.mockito.PowerMockito;
 import org.powermock.core.classloader.annotations.PrepareForTest;
 import org.powermock.modules.junit4.PowerMockRunner;
@@ -85,13 +98,25 @@ import org.powermock.modules.junit4.PowerMockRunner;
  */
 @RunWith(PowerMockRunner.class)
 @PrepareForTest({
-        ServiceChainingUtil.class,
+        SfcProviderServiceForwarderAPI.class,
         SfcProviderServicePathAPI.class,
         SfcProviderRenderedPathAPI.class,
-        SfcProviderServiceForwarderAPI.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
@@ -103,537 +128,825 @@ public class ServiceChainingUtilTest {
     @Captor
     private ArgumentCaptor<RenderedServicePath> rspCaptor;
     @Captor
-    private ArgumentCaptor<List<Class>> listClassCaptor;
-    @Mock
-    private PolicyWriter policyWriter;
-    @Mock
-    private DataBroker dataBroker;
+    private ArgumentCaptor<Class> listClassCaptor;
+    @Captor
+    private ArgumentCaptor<ClassMap> classMapCaptor;
     @Mock
     private ReadWriteTransaction rwTx;
 
     @Before
-    public void setUp() throws Exception {
-        final NodeId currentNodeId = new NodeId("unit-node-01");
-        Mockito.when(policyWriter.getCurrentNodeId()).thenReturn(currentNodeId);
-
-        final String managementIpAddress = "1.2.3.5";
-        Mockito.when(policyWriter.getManagementIpAddress()).thenReturn(managementIpAddress);
-
-        Mockito.when(policyWriter.getCurrentMountpoint()).thenReturn(dataBroker);
-        Mockito.when(dataBroker.newReadWriteTransaction()).thenReturn(rwTx);
+    public void setUp() {
+        dataBroker = mock(DataBroker.class);
+        policyWriterUtil = mock(PolicyWriterUtil.class);
     }
 
     @Test
-    public void testGetServicePath() throws Exception {
-        final String sfcNameValue = "123";
-        final ServiceFunctionPath sfcPath = createSfp(sfcNameValue, false);
-        final ServiceFunctionPaths sfcPaths = new ServiceFunctionPathsBuilder()
-                .setServiceFunctionPath(Collections.singletonList(sfcPath))
-                .build();
+    public void testResolveNewChainAction_actionAllow() {
+        final PeerEndpoint peerEndpoint = peerEndpointBuilder();
+        final Action action = actionBuilder(null);
+        final PolicyConfigurationContext context = policyConfigurationContextBuilder();
 
-        stub(method(SfcProviderServicePathAPI.class, "readAllServiceFunctionPaths")).toReturn(sfcPaths);
+        ServiceChainingUtil.newChainAction(peerEndpoint, sgtBuilder(10), sgtBuilder(20),
+                resolvedActionBuilder(RULE_NAME, ALLOW, action, In), context, dataBroker);
 
-        final ServiceFunctionPath servicePath = ServiceChainingUtil.getServicePath(Lists.newArrayList(
-                createParameterValue("sfc-chain-name", sfcNameValue)
-        ));
-        Assert.assertEquals(sfcPath, servicePath);
+        verifyNoMoreInteractions(policyWriterUtil);
+        verifyNoMoreInteractions(dataBroker);
     }
 
-    private ParameterValue createParameterValue(final String name, final String value) {
-        return new ParameterValueBuilder().setName(new ParameterName(name)).setStringValue(value).build();
+    @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 testResolveChainAction_full() throws Exception {
-        final PeerEndpointWithPolicy peerEndpoint = createPeerEndpointWithPolicy();
-        final Sgt sourceSgt = new Sgt(1);
-        final Sgt destinationSgt = new Sgt(2);
-        final Map<PolicyManagerImpl.ActionCase, Action> actionMap = createActionMap();
-        final String classMapName = "unit-class-map-name-01";
+    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 String sfcNameValue = "123";
-        final ServiceFunctionPath sfcPath = createSfp(sfcNameValue, false);
-        final ServiceFunctionPaths sfcPaths = new ServiceFunctionPathsBuilder()
-                .setServiceFunctionPath(Collections.singletonList(sfcPath))
-                .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()));
 
-        stub(method(SfcProviderServicePathAPI.class, "readAllServiceFunctionPaths")).toReturn(sfcPaths);
+        final PeerEndpoint peerEndpoint = peerEndpointBuilder();
+        final Action action = actionBuilder(Collections.singletonList(parameterValue));
+        final PolicyConfigurationContext context = policyConfigurationContextBuilder();
 
-        final RenderedServicePath rsp = createRsp("unit-rsp-02");
-        stub(method(SfcProviderRenderedPathAPI.class, "readRenderedServicePath")).toReturn(rsp);
-        stub(method(ServiceChainingUtil.class, "setSfcPart")).toReturn(true);
+        stub(method(SfcProviderServicePathAPI.class, "readAllServiceFunctionPaths"))
+            .toReturn(pathsBuilder.build());
+        stub(method(PolicyManagerUtil.class, "getTenantId")).toReturn(null);
 
-        ServiceChainingUtil.resolveChainAction(peerEndpoint, sourceSgt, destinationSgt, actionMap, classMapName, policyWriter);
+        ServiceChainingUtil.newChainAction(peerEndpoint, sgtBuilder(10), sgtBuilder(20),
+                resolvedActionBuilder(RULE_NAME, CHAIN, action, In), context, dataBroker);
 
-        Mockito.verify(policyWriter).cache(listClassCaptor.capture());
-        Mockito.verifyNoMoreInteractions(policyWriter);
-        Assert.assertEquals(1, listClassCaptor.getValue().size());
+        verifyNoMoreInteractions(policyWriterUtil);
+        verifyNoMoreInteractions(dataBroker);
     }
 
     @Test
-    public void testResolveChainAction_fullSymmetric() throws Exception {
-        final PeerEndpointWithPolicy peerEndpoint = createPeerEndpointWithPolicy();
-        final Sgt sourceSgt = new Sgt(1);
-        final Sgt destinationSgt = new Sgt(2);
-        final Map<PolicyManagerImpl.ActionCase, Action> actionMap = createActionMap();
-        final String classMapName = "unit-class-map-name-01";
+    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 String sfcNameValue = "123";
-        final ServiceFunctionPath sfcPath = createSfp(sfcNameValue, true);
-        final ServiceFunctionPaths sfcPaths = new ServiceFunctionPathsBuilder()
-                .setServiceFunctionPath(Collections.singletonList(sfcPath))
-                .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()));
 
-        stub(method(SfcProviderServicePathAPI.class, "readAllServiceFunctionPaths")).toReturn(sfcPaths);
+        final PeerEndpoint peerEndpoint = peerEndpointBuilder();
+        final Action action = actionBuilder(Collections.singletonList(parameterValue));
+        final PolicyConfigurationContext context = policyConfigurationContextBuilder();
 
-        final RenderedServicePath rsp = createRsp("unit-rsp-02");
-        stub(method(SfcProviderRenderedPathAPI.class, "readRenderedServicePath")).toReturn(rsp);
-        stub(method(ServiceChainingUtil.class, "setSfcPart")).toReturn(true);
+        stub(method(SfcProviderServicePathAPI.class, "readAllServiceFunctionPaths")).toReturn(pathsBuilder.build());
+        stub(method(PolicyManagerUtil.class, "getTenantId")).toReturn(new TenantId(TENANT_ID));
 
-        ServiceChainingUtil.resolveChainAction(peerEndpoint, sourceSgt, destinationSgt, actionMap, classMapName, policyWriter);
+        ServiceChainingUtil.newChainAction(peerEndpoint, sgtBuilder(10), sgtBuilder(20),
+                resolvedActionBuilder(RULE_NAME, CHAIN, action, In), context, dataBroker);
 
-        Mockito.verify(policyWriter).cache(listClassCaptor.capture());
-        Mockito.verifyNoMoreInteractions(policyWriter);
-        Assert.assertEquals(2, listClassCaptor.getValue().size());
+        verifyNoMoreInteractions(policyWriterUtil);
+        verifyNoMoreInteractions(dataBroker);
     }
 
     @Test
-    public void testResolveChainAction_partial01() throws Exception {
-        final PeerEndpointWithPolicy peerEndpoint = createPeerEndpointWithPolicy();
-        final Sgt sourceSgt = new Sgt(1);
-        final Sgt destinationSgt = new Sgt(2);
-        final Map<PolicyManagerImpl.ActionCase, Action> actionMap = createActionMap();
-        final String classMapName = "unit-class-map-name-01";
+    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));
+    }
 
-        final String sfcNameValue = "123";
-        final ServiceFunctionPath sfcPath = createSfp(sfcNameValue, true);
-        final ServiceFunctionPaths sfcPaths = new ServiceFunctionPathsBuilder()
-                .setServiceFunctionPath(Collections.singletonList(sfcPath))
-                .build();
+    @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));
+    }
 
-        stub(method(SfcProviderServicePathAPI.class, "readAllServiceFunctionPaths")).toReturn(sfcPaths);
+    @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));
+    }
 
-        final RenderedServicePath rsp = createRsp("unit-rsp-02");
-        stub(method(SfcProviderRenderedPathAPI.class, "readRenderedServicePath")).toReturn(rsp);
-        stub(method(ServiceChainingUtil.class, "setSfcPart")).toReturn(true);
-        stub(method(ServiceChainingUtil.class, "createSymmetricRenderedPath")).toReturn(null);
+    @Test
+    public void testResolveRemovedChainAction_noParameterValue() {
+        final PolicyConfigurationContext context = new PolicyConfigurationContext();
+        context.setPolicyMapLocation(getLocation());
+        final PeerEndpoint peerEndpoint = peerEndpointBuilder();
+        final Action action = actionBuilder(null);
 
-        ServiceChainingUtil.resolveChainAction(peerEndpoint, sourceSgt, destinationSgt, actionMap, classMapName, policyWriter);
+        ServiceChainingUtil.resolveRemovedChainAction(peerEndpoint, sgtBuilder(10), sgtBuilder(20),
+                resolvedActionBuilder(new RuleName("rule-name"), CHAIN, action, In), context);
 
-        Mockito.verifyNoMoreInteractions(policyWriter);
+        verifyNoMoreInteractions(policyWriterUtil);
     }
 
     @Test
-    public void testResolveChainAction_partial02() throws Exception {
-        final PeerEndpointWithPolicy peerEndpoint = createPeerEndpointWithPolicy();
-        final Sgt sourceSgt = new Sgt(1);
-        final Sgt destinationSgt = new Sgt(2);
-        final Map<PolicyManagerImpl.ActionCase, Action> actionMap = createActionMap();
-        final String classMapName = "unit-class-map-name-01";
+    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 String sfcNameValue = "123";
-        final ServiceFunctionPath sfcPath = createSfp(sfcNameValue, false);
-        final ServiceFunctionPaths sfcPaths = new ServiceFunctionPathsBuilder()
-                .setServiceFunctionPath(Collections.singletonList(sfcPath))
-                .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()));
 
-        stub(method(SfcProviderServicePathAPI.class, "readAllServiceFunctionPaths")).toReturn(sfcPaths);
+        final PeerEndpoint peerEndpoint = peerEndpointBuilder();
+        final Action action = actionBuilder(Collections.singletonList(parameterValue));
 
-        final RenderedServicePath rsp = createRsp("unit-rsp-02");
-        stub(method(SfcProviderRenderedPathAPI.class, "readRenderedServicePath")).toReturn(rsp);
-        stub(method(ServiceChainingUtil.class, "setSfcPart")).toReturn(false);
+        stub(method(SfcProviderServicePathAPI.class, "readAllServiceFunctionPaths")).toReturn(pathsBuilder.build());
+        stub(method(PolicyManagerUtil.class, "getTenantId")).toReturn(null);
 
-        ServiceChainingUtil.resolveChainAction(peerEndpoint, sourceSgt, destinationSgt, actionMap, classMapName, policyWriter);
+        ServiceChainingUtil.resolveRemovedChainAction(peerEndpoint, sgtBuilder(10), sgtBuilder(20),
+                resolvedActionBuilder(new RuleName("rule-name"), CHAIN, action, In), context);
 
-        Mockito.verifyNoMoreInteractions(policyWriter);
+        verifyNoMoreInteractions(policyWriterUtil);
     }
 
     @Test
-    public void testResolveChainAction_partial03() throws Exception {
-        final PeerEndpointWithPolicy peerEndpoint = createPeerEndpointWithPolicy(null);
-        final Sgt sourceSgt = new Sgt(1);
-        final Sgt destinationSgt = new Sgt(2);
-        final Map<PolicyManagerImpl.ActionCase, Action> actionMap = createActionMap();
-        final String classMapName = "unit-class-map-name-01";
+    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 String sfcNameValue = "123";
-        final ServiceFunctionPath sfcPath = createSfp(sfcNameValue, false);
-        final ServiceFunctionPaths sfcPaths = new ServiceFunctionPathsBuilder()
-                .setServiceFunctionPath(Collections.singletonList(sfcPath))
-                .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()));
 
-        stub(method(SfcProviderServicePathAPI.class, "readAllServiceFunctionPaths")).toReturn(sfcPaths);
+        final PeerEndpoint peerEndpoint = peerEndpointBuilder();
+        final Action action = actionBuilder(Collections.singletonList(parameterValue));
 
-        final RenderedServicePath rsp = createRsp("unit-rsp-02");
-        stub(method(SfcProviderRenderedPathAPI.class, "readRenderedServicePath")).toReturn(rsp);
+        stub(method(SfcProviderServicePathAPI.class, "readAllServiceFunctionPaths")).toReturn(pathsBuilder.build());
+        stub(method(PolicyManagerUtil.class, "getTenantId")).toReturn(new TenantId(TENANT_ID));
 
-        ServiceChainingUtil.resolveChainAction(peerEndpoint, sourceSgt, destinationSgt, actionMap, classMapName, policyWriter);
+        ServiceChainingUtil.resolveRemovedChainAction(peerEndpoint, sgtBuilder(10), sgtBuilder(20),
+                resolvedActionBuilder(new RuleName("rule-name"), CHAIN, action, In), context);
 
-        Mockito.verifyNoMoreInteractions(policyWriter);
+        verifyNoMoreInteractions(policyWriterUtil);
     }
 
     @Test
-    public void testResolveChainAction_partial04() throws Exception {
-        final PeerEndpointWithPolicy peerEndpoint = createPeerEndpointWithPolicy(null);
-        final Sgt sourceSgt = new Sgt(1);
-        final Sgt destinationSgt = new Sgt(2);
-        final Map<PolicyManagerImpl.ActionCase, Action> actionMap = createActionMap(false);
-        final String classMapName = "unit-class-map-name-01";
-
-        ServiceChainingUtil.resolveChainAction(peerEndpoint, sourceSgt, destinationSgt, actionMap, classMapName, policyWriter);
-
-        Mockito.verifyNoMoreInteractions(policyWriter);
+    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));
     }
 
-    private Map<PolicyManagerImpl.ActionCase, Action> createActionMap() {
-        return createActionMap(true);
+    @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));
     }
 
-    private Map<PolicyManagerImpl.ActionCase, Action> createActionMap(final boolean fillParamValue) {
-        final Map<PolicyManagerImpl.ActionCase,Action> actionMap = new HashMap<>();
-        final ActionBuilder actionValue = new ActionBuilder();
-        if (fillParamValue) {
-            actionValue.setParameterValue(Collections.singletonList(new ParameterValueBuilder()
-                    .setName(new ParameterName(ChainActionDefinition.SFC_CHAIN_NAME))
-                    .setStringValue("123")
-                    .build()));
-        }
-        actionMap.put(PolicyManagerImpl.ActionCase.CHAIN, actionValue.build());
-        return actionMap;
+    @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));
     }
 
-    private PeerEndpointWithPolicy createPeerEndpointWithPolicy() {
-        return createPeerEndpointWithPolicy(new TenantId("unit-tenant-06"));
+    @Test
+    public void testResolveRemoteSfcComponents_noForwarder() {
+        final PolicyConfigurationContext context = new PolicyConfigurationContext();
+        context.setPolicyMapLocation(getLocation());
+        boolean result = ServiceChainingUtil.resolveRemoteSfcComponents(buildRsp(), context);
+        assertFalse(result);
     }
 
-    private PeerEndpointWithPolicy createPeerEndpointWithPolicy(final TenantId tenantId) {
-        return new PeerEndpointWithPolicyBuilder()
-                .setRuleGroupWithRendererEndpointParticipation(Collections.singletonList(
-                        new RuleGroupWithRendererEndpointParticipationBuilder()
-                                .setTenantId(tenantId)
-                                .build()
-                ))
-                .build();
+    @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 testCreateRenderedPath() throws Exception {
-        final String sfcNameValue = "123";
-        final ServiceFunctionPath sfp = createSfp(sfcNameValue, false);
-        final TenantId tenantId = new TenantId("unit-tennant-01");
-
-        final RenderedServicePath rsp = createRsp("unit-rsp-01");
-
-        PowerMockito.mockStatic(SfcProviderRenderedPathAPI.class);
-        final SfcProviderRenderedPathAPI api = PowerMockito.mock(SfcProviderRenderedPathAPI.class);
-        PowerMockito.when(api.readRenderedServicePath(rspNameCaptor.capture())).thenReturn(rsp);
-
-        final RenderedServicePath renderedPath = ServiceChainingUtil.createRenderedPath(sfp, tenantId);
-
-        Assert.assertEquals("123_plainunit-tennant-01-gbp-rsp", rspNameCaptor.getValue().getValue());
-        Assert.assertEquals(rsp, renderedPath);
+    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 testCreateRenderedPath_notExisting() throws Exception {
-        final String sfcNameValue = "123";
-        final ServiceFunctionPath sfp = createSfp(sfcNameValue, false);
-        final TenantId tenantId = new TenantId("unit-tennant-01");
-
-        final RenderedServicePath rsp = createRsp("unit-rsp-01");
-
-        PowerMockito.mockStatic(SfcProviderRenderedPathAPI.class);
-        final SfcProviderRenderedPathAPI api = PowerMockito.mock(SfcProviderRenderedPathAPI.class);
-        PowerMockito.when(api.readRenderedServicePath(rspNameCaptor.capture())).thenReturn(null);
-        PowerMockito.when(api.createRenderedServicePathAndState(
-                sfpCaptor.capture(), createRspCaptor.capture()
-        )).thenReturn(rsp);
-
-        final RenderedServicePath renderedPath = ServiceChainingUtil.createRenderedPath(sfp, tenantId);
-
-        Assert.assertEquals("123_plainunit-tennant-01-gbp-rsp", rspNameCaptor.getValue().getValue());
-
-        final ServiceFunctionPath serviceFunctionPath = sfpCaptor.getValue();
-        Assert.assertEquals("123_plain", serviceFunctionPath.getName().getValue());
-        Assert.assertFalse(serviceFunctionPath.isSymmetric());
-
-        final CreateRenderedPathInput createRPInput = createRspCaptor.getValue();
-        Assert.assertFalse(createRPInput.isSymmetric());
-        Assert.assertEquals("123_plain", createRPInput.getParentServiceFunctionPath());
-        Assert.assertEquals("123_plainunit-tennant-01-gbp-rsp", createRPInput.getName());
-
-        Assert.assertEquals(rsp, renderedPath);
+    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);
     }
 
-    private RenderedServicePath createRsp(final String rspNameValue) {
-        return new RenderedServicePathBuilder()
-                .setName(new RspName(rspNameValue))
-                .setRenderedServicePathHop(Lists.newArrayList(createRspHop("rsp-hop-01-sf")))
-                .build();
+    @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);
     }
 
-    private RenderedServicePathHop createRspHop(final String sfNameValue) {
-        return new RenderedServicePathHopBuilder()
-                .setServiceFunctionName(new SfName(sfNameValue))
-                .setServiceFunctionForwarder(new SffName(sfNameValue + "+sff"))
-                .build();
+    @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));
     }
 
-    private ServiceFunctionPath createSfp(final String sfcNameValue, final boolean symmetric) {
-        return new ServiceFunctionPathBuilder()
-                .setServiceChainName(new SfcName(sfcNameValue))
-                .setName(new SfpName(sfcNameValue + "_plain"))
-                .setSymmetric(symmetric)
-                .build();
+    @Test
+    public void testFindServicePathFromParameterValues_noParams() {
+        final ServiceFunctionPath result =
+            ServiceChainingUtil.findServicePathFromParameterValues(Collections.emptyList());
+        assertNull(result);
     }
 
     @Test
-    public void testCreateSymmetricRenderedPath() throws Exception {
-        final ServiceFunctionPath sfp = createSfp("unit-sfp-02", false);
-        final RenderedServicePath rsp = createRsp("unit-rsp-02");
-        final TenantId tennantId = new TenantId("tenant-02");
-
-        PowerMockito.mockStatic(SfcProviderRenderedPathAPI.class);
-        final SfcProviderRenderedPathAPI api = PowerMockito.mock(SfcProviderRenderedPathAPI.class);
-        PowerMockito.when(api.readRenderedServicePath(rspNameCaptor.capture())).thenReturn(rsp);
-
-        final RenderedServicePath symmetricRenderedPath = ServiceChainingUtil.createSymmetricRenderedPath(sfp, rsp, tennantId);
+    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);
+    }
 
-        Assert.assertEquals("unit-sfp-02_plaintenant-02-gbp-rsp-Reverse", rspNameCaptor.getValue().getValue());
-        Assert.assertEquals(rsp, symmetricRenderedPath);
+    @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 testCreateSymmetricRenderedPath_notExisting() throws Exception {
-        final ServiceFunctionPath sfp = createSfp("unit-sfp-02", false);
-        final RenderedServicePath rsp = createRsp("unit-rsp-02");
-        final TenantId tennantId = new TenantId("tenant-02");
+    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);
+    }
 
-        PowerMockito.mockStatic(SfcProviderRenderedPathAPI.class);
-        final SfcProviderRenderedPathAPI api = PowerMockito.mock(SfcProviderRenderedPathAPI.class);
-        PowerMockito.when(api.readRenderedServicePath(rspNameCaptor.capture())).thenReturn(null);
-        PowerMockito.when(api.createSymmetricRenderedServicePathAndState(rspCaptor.capture())).thenReturn(rsp);
+    @Test
+    public void findServiceFunctionPathFromServiceChainName_noPaths() {
+        stub(method(SfcProviderServicePathAPI.class, "readAllServiceFunctionPaths")).toReturn(null);
 
-        final RenderedServicePath symmetricRenderedPath = ServiceChainingUtil.createSymmetricRenderedPath(sfp, rsp, tennantId);
+        final ServiceFunctionPath result =
+            ServiceChainingUtil.findServiceFunctionPathFromServiceChainName(new SfcName(SFC_CHAIN_NAME));
+        assertNull(result);
+    }
 
-        Assert.assertEquals("unit-sfp-02_plaintenant-02-gbp-rsp-Reverse", rspNameCaptor.getValue().getValue());
-        Assert.assertEquals(rsp, rspCaptor.getValue());
-        Assert.assertEquals(rsp, symmetricRenderedPath);
+    @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 testCheckLocalForwarderPresence() throws Exception {
-        final Local local = new LocalBuilder().build();
+    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);
+    }
 
-        Mockito.when(rwTx.read(Matchers.eq(LogicalDatastoreType.CONFIGURATION), Matchers.<InstanceIdentifier<Local>>any()))
-                .thenReturn(Futures.<Optional<Local>, ReadFailedException>immediateCheckedFuture(Optional.of(local)))
-                .thenReturn(Futures.<Optional<Local>, ReadFailedException>immediateCheckedFuture(Optional.absent()))
-                .thenReturn(Futures.<Optional<Local>, ReadFailedException>immediateFailedCheckedFuture(new ReadFailedException("n/a")));
+    @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",RspName.class))
+            .toReturn(new RenderedServicePathBuilder().build());
+
+        final RenderedServicePath result = ServiceChainingUtil.resolveRenderedServicePath(serviceFunctionPath, tenantId,
+                dataBroker, sourceSgt, destinationSgt, context);
+        assertNotNull(result);
+    }
 
-        Assert.assertTrue(ServiceChainingUtil.checkLocalForwarderPresence(dataBroker));
-        Assert.assertFalse(ServiceChainingUtil.checkLocalForwarderPresence(dataBroker));
-        Assert.assertFalse(ServiceChainingUtil.checkLocalForwarderPresence(dataBroker));
-        Assert.assertFalse(ServiceChainingUtil.checkLocalForwarderPresence(dataBroker));
+    @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",RspName.class))
+            .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 testCheckServicePathPresence() throws Exception {
-        final ServiceChain serviceChainOk = new ServiceChainBuilder()
-                .setServicePath(Collections.singletonList(new ServicePathBuilder().build()))
-                .build();
-        final ServiceChain serviceChainBad1 = new ServiceChainBuilder()
-                .setServicePath(Collections.emptyList())
-                .build();
-        final ServiceChain serviceChainBad2 = new ServiceChainBuilder().build();
+    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",RspName.class))
+            .toReturn(new RenderedServicePathBuilder().build());
+
+        final RenderedServicePath result = ServiceChainingUtil.resolveReversedRenderedServicePath(serviceFunctionPath,
+                tenantId, dataBroker, sourceSgt, destinationSgt, context);
+        assertNotNull(result);
+    }
 
-        Mockito.when(rwTx.read(Matchers.eq(LogicalDatastoreType.CONFIGURATION), Matchers.<InstanceIdentifier<ServiceChain>>any()))
-                .thenReturn(Futures.<Optional<ServiceChain>, ReadFailedException>immediateCheckedFuture(Optional.of(serviceChainOk)))
-                .thenReturn(Futures.<Optional<ServiceChain>, ReadFailedException>immediateCheckedFuture(Optional.of(serviceChainBad1)))
-                .thenReturn(Futures.<Optional<ServiceChain>, ReadFailedException>immediateCheckedFuture(Optional.of(serviceChainBad2)))
-                .thenReturn(Futures.<Optional<ServiceChain>, ReadFailedException>immediateCheckedFuture(Optional.absent()))
-                .thenReturn(Futures.<Optional<ServiceChain>, ReadFailedException>immediateFailedCheckedFuture(new ReadFailedException("n/a")));
+    @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",RspName.class))
+            .toReturn(null);
+        stub(method(SfcProviderRenderedPathAPI.class, "createReverseRenderedServicePathEntry"))
+                .toReturn(new RenderedServicePathBuilder().build());
+
+        final RenderedServicePath result = ServiceChainingUtil.resolveReversedRenderedServicePath(serviceFunctionPath,
+                tenantId, dataBroker, sourceSgt, destinationSgt, context);
+        assertNotNull(result);
+    }
 
-        Assert.assertFalse(ServiceChainingUtil.checkServicePathPresence(dataBroker));
-        Assert.assertTrue(ServiceChainingUtil.checkServicePathPresence(dataBroker));
-        Assert.assertTrue(ServiceChainingUtil.checkServicePathPresence(dataBroker));
-        Assert.assertTrue(ServiceChainingUtil.checkServicePathPresence(dataBroker));
-        Assert.assertFalse(ServiceChainingUtil.checkServicePathPresence(dataBroker));
+    @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 testFindServiceFunctionPath() throws Exception {
+    public void testGetServicePath() throws Exception {
         final String sfcNameValue = "123";
-        final ServiceFunctionPath sfcPath = createSfp(sfcNameValue, false);
+        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.findServiceFunctionPath(new SfcName(sfcNameValue));
-        Assert.assertEquals(sfcPath, servicePath);
+        final ServiceFunctionPath servicePath =
+            ServiceChainingUtil.findServicePathFromParameterValues(
+                Lists.newArrayList(createParameterValue(sfcNameValue)));
+        assertEquals(sfcPath, servicePath);
     }
 
-    @Test
-    public void testSetSfcPart_success() throws Exception {
-        final RenderedServicePath rsp = createRsp("unit-rsp-03");
-        final org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.rev140701.service.function.forwarders.ServiceFunctionForwarder
-                sff = new ServiceFunctionForwarderBuilder()
-                .setName(new SffName("unit-sff-03"))
-                .setIpMgmtAddress(new IpAddress(new Ipv4Address("1.2.3.4")))
-                .build();
-
-        stub(method(ServiceChainingUtil.class, "checkLocalForwarderPresence")).toReturn(true);
-
-        PowerMockito.mockStatic(SfcProviderServiceForwarderAPI.class);
-        final SfcProviderServiceForwarderAPI api = PowerMockito.mock(SfcProviderServiceForwarderAPI.class);
-        PowerMockito.when(api.readServiceFunctionForwarder(sffNameCaptor.capture())).thenReturn(sff);
-
-
-        final boolean outcome = ServiceChainingUtil.setSfcPart(rsp, policyWriter);
-
-        Assert.assertEquals("rsp-hop-01-sf+sff", sffNameCaptor.getValue().getValue());
-        Assert.assertTrue(outcome);
-
-        Mockito.verify(policyWriter).cache(Matchers.<ServiceFfName>any());
-        Mockito.verify(policyWriter).cache(Matchers.<ServiceChain>any());
-        Mockito.verify(policyWriter).getCurrentNodeId();
-        Mockito.verify(policyWriter).getCurrentMountpoint();
-        Mockito.verify(policyWriter).getManagementIpAddress();
-        Mockito.verifyNoMoreInteractions(policyWriter);
+    private ParameterValue createParameterValue(final String value) {
+        return new ParameterValueBuilder().setName(new ParameterName("sfc-chain-name")).setStringValue(value).build();
     }
 
     @Test
-    public void testSetSfcPart_success_newRsp() throws Exception {
-        final RenderedServicePath rsp = createRsp("unit-rsp-03");
-        final org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.rev140701.service.function.forwarders.ServiceFunctionForwarder
-                sff = new ServiceFunctionForwarderBuilder()
-                .setName(new SffName("unit-sff-03"))
-                .setIpMgmtAddress(new IpAddress(new Ipv4Address("1.2.3.4")))
-                .build();
-
-        stub(method(ServiceChainingUtil.class, "checkLocalForwarderPresence")).toReturn(false);
-
-        PowerMockito.mockStatic(SfcProviderServiceForwarderAPI.class);
-        final SfcProviderServiceForwarderAPI api = PowerMockito.mock(SfcProviderServiceForwarderAPI.class);
-        PowerMockito.when(api.readServiceFunctionForwarder(sffNameCaptor.capture())).thenReturn(sff);
+    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");
 
-        final boolean outcome = ServiceChainingUtil.setSfcPart(rsp, policyWriter);
+        PowerMockito.mockStatic(SfcProviderRenderedPathAPI.class);
+        PowerMockito.when(SfcProviderRenderedPathAPI.readRenderedServicePath(rspNameCaptor.capture())).thenReturn(rsp);
 
-        Assert.assertEquals("rsp-hop-01-sf+sff", sffNameCaptor.getValue().getValue());
-        Assert.assertTrue(outcome);
+        final RenderedServicePath renderedPath = ServiceChainingUtil.resolveRenderedServicePath(sfp, tenantId,
+                dataBroker, sourceSgt, destinationSgt, context);
 
-        Mockito.verify(policyWriter).cache(Matchers.<Local>any());
-        Mockito.verify(policyWriter).cache(Matchers.<ServiceFfName>any());
-        Mockito.verify(policyWriter).cache(Matchers.<ServiceChain>any());
-        Mockito.verify(policyWriter).getCurrentMountpoint();
-        Mockito.verify(policyWriter, Mockito.times(2)).getManagementIpAddress();
-        Mockito.verifyNoMoreInteractions(policyWriter);
+        assertEquals("123_plain-unit-tenant-01-gbp-rsp", rspNameCaptor.getValue().getValue());
+        assertEquals(rsp, renderedPath);
     }
 
     @Test
-    public void testSetSfcPart_fail01() throws Exception {
-        Assert.assertFalse(ServiceChainingUtil.setSfcPart(null, policyWriter));
-
-        final RenderedServicePathBuilder rspBuilder = new RenderedServicePathBuilder().setName(new RspName("unit-rsp-05"));
-        Assert.assertFalse(ServiceChainingUtil.setSfcPart(rspBuilder.build(), policyWriter));
+    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());
 
-        rspBuilder.setRenderedServicePathHop(Collections.emptyList());
-        Assert.assertFalse(ServiceChainingUtil.setSfcPart(rspBuilder.build(), policyWriter));
+        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());
 
-        rspBuilder.setRenderedServicePathHop(Collections.singletonList(null));
-        Assert.assertFalse(ServiceChainingUtil.setSfcPart(rspBuilder.build(), policyWriter));
+        final RenderedServicePath symmetricRenderedPath = ServiceChainingUtil.resolveReversedRenderedServicePath(sfp,
+                tenantId, dataBroker, sourceSgt, destinationSgt, context);
 
-        Mockito.verifyNoMoreInteractions(policyWriter);
+        assertEquals("unit-sfp-02_plain-tenant-02-gbp-rsp-Reverse", rspNameCaptor.getValue().getValue());
+        assertEquals(rsp, symmetricRenderedPath);
     }
 
     @Test
-    public void testSetSfcPart_fail02() throws Exception {
-        final RenderedServicePath rsp = createRsp("unit-rsp-03");
-
-        Mockito.doReturn(Futures.immediateCheckedFuture(Optional.absent()))
-                .when(rwTx).read(Mockito.eq(LogicalDatastoreType.CONFIGURATION), Mockito.<InstanceIdentifier<Local>>any());
-
-        PowerMockito.mockStatic(SfcProviderServiceForwarderAPI.class);
-        final SfcProviderServiceForwarderAPI api = PowerMockito.mock(SfcProviderServiceForwarderAPI.class);
-        PowerMockito.when(api.readServiceFunctionForwarder(sffNameCaptor.capture())).thenReturn(null);
-
-        final boolean outcome = ServiceChainingUtil.setSfcPart(rsp, policyWriter);
+    public void testFindServiceFunctionPath() throws Exception {
+        final String sfcNameValue = "123";
+        final ServiceFunctionPath sfcPath = createSfp(sfcNameValue);
+        final ServiceFunctionPaths sfcPaths = new ServiceFunctionPathsBuilder()
+                .setServiceFunctionPath(Collections.singletonList(sfcPath))
+                .build();
 
-        Assert.assertEquals("rsp-hop-01-sf+sff", sffNameCaptor.getValue().getValue());
-        Assert.assertFalse(outcome);
+        stub(method(SfcProviderServicePathAPI.class, "readAllServiceFunctionPaths")).toReturn(sfcPaths);
 
-        Mockito.verify(policyWriter).getCurrentMountpoint();
-        Mockito.verify(policyWriter).getManagementIpAddress();
-        Mockito.verify(policyWriter).cache(Matchers.<Local>any());
-        Mockito.verifyNoMoreInteractions(policyWriter);
+        final ServiceFunctionPath servicePath =
+            ServiceChainingUtil.findServiceFunctionPathFromServiceChainName(new SfcName(sfcNameValue));
+        assertEquals(sfcPath, servicePath);
     }
 
-    @Test
-    public void testSetSfcPart_fail03() throws Exception {
-        final RenderedServicePath rsp = createRsp("unit-rsp-03");
-        final ServiceFunctionForwarderBuilder sffBuilder = new ServiceFunctionForwarderBuilder()
-                .setName(new SffName("unit-sff-03"))
-                .setIpMgmtAddress(null);
-
-        stub(method(ServiceChainingUtil.class, "checkLocalForwarderPresence")).toReturn(true);
+    // Auxiliary methods
 
-        PowerMockito.mockStatic(SfcProviderServiceForwarderAPI.class);
-        final SfcProviderServiceForwarderAPI api = PowerMockito.mock(SfcProviderServiceForwarderAPI.class);
-        PowerMockito.when(api.readServiceFunctionForwarder(sffNameCaptor.capture())).thenReturn(
-                sffBuilder.build());
-
-        Assert.assertFalse(ServiceChainingUtil.setSfcPart(rsp, policyWriter));
-
-        Assert.assertEquals("rsp-hop-01-sf+sff", sffNameCaptor.getValue().getValue());
-
-        Mockito.verify(policyWriter).getCurrentMountpoint();
-        Mockito.verify(policyWriter).getCurrentNodeId();
-        Mockito.verifyNoMoreInteractions(policyWriter);
+    private RenderedServicePath buildRsp() {
+        RenderedServicePathBuilder renderedServicePathBuilder = new RenderedServicePathBuilder();
+        renderedServicePathBuilder.setRenderedServicePathHop(null);
+        return renderedServicePathBuilder.build();
     }
 
-    @Test
-    public void testSetSfcPart_fail04() throws Exception {
-        final RenderedServicePath rsp = createRsp("unit-rsp-03");
-        final ServiceFunctionForwarderBuilder sffBuilder = new ServiceFunctionForwarderBuilder()
-                .setName(new SffName("unit-sff-03"))
-                .setIpMgmtAddress(new IpAddress((Ipv4Address) null));
-
-        stub(method(ServiceChainingUtil.class, "checkLocalForwarderPresence")).toReturn(true);
-
-        PowerMockito.mockStatic(SfcProviderServiceForwarderAPI.class);
-        final SfcProviderServiceForwarderAPI api = PowerMockito.mock(SfcProviderServiceForwarderAPI.class);
-        PowerMockito.when(api.readServiceFunctionForwarder(sffNameCaptor.capture())).thenReturn(
-                sffBuilder.build());
+    private RenderedServicePath createRsp(final String rspNameValue) {
+        return new RenderedServicePathBuilder()
+                .setName(new RspName(rspNameValue))
+                .setRenderedServicePathHop(Lists.newArrayList(createRspHop()))
+                .build();
+    }
 
-        Assert.assertFalse(ServiceChainingUtil.setSfcPart(rsp, policyWriter));
+    private RenderedServicePathHop createRspHop() {
+        return new RenderedServicePathHopBuilder()
+                .setServiceFunctionName(new SfName("rsp-hop-01-sf"))
+                .setServiceFunctionForwarder(new SffName("rsp-hop-01-sf" + "+sff"))
+                .build();
+    }
 
-        Assert.assertEquals("rsp-hop-01-sf+sff", sffNameCaptor.getValue().getValue());
+    private ServiceFunctionPath createSfp(final String sfcNameValue) {
+        return new ServiceFunctionPathBuilder()
+                .setServiceChainName(new SfcName(sfcNameValue))
+                .setName(new SfpName(sfcNameValue + "_plain"))
+                .setSymmetric(false)
+                .build();
+    }
 
-        Mockito.verify(policyWriter).getCurrentMountpoint();
-        Mockito.verify(policyWriter).getCurrentNodeId();
-        Mockito.verifyNoMoreInteractions(policyWriter);
+    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);
+    }
 
-    @Test
-    public void testForwarderTypeChoice() throws Exception {
-        final String sffValue = "unit-xx";
-        final ServiceTypeChoice fwChoice = ServiceChainingUtil.forwarderTypeChoice(sffValue);
+    private PolicyConfigurationContext policyConfigurationContextBuilder() {
+        final RendererEndpointBuilder rendererEndpointBuilder = new RendererEndpointBuilder();
+        final PolicyConfigurationContext context = new PolicyConfigurationContext();
+        context.setCurrentRendererEP(rendererEndpointBuilder.build());
+        return context;
+    }
 
-        Assert.assertTrue(fwChoice instanceof ServiceFunctionForwarder);
-        final ServiceFunctionForwarder sff = (ServiceFunctionForwarder) fwChoice;
-        Assert.assertEquals(sffValue, sff.getServiceFunctionForwarder());
+    private Sgt sgtBuilder(final int value) {
+        return new Sgt(value);
     }
 
-    @Test
-    public void testFunctionTypeChoice() throws Exception {
-        final String stcValue = "unit-xx";
-        final ServiceTypeChoice srvTypeChoice = ServiceChainingUtil.functionTypeChoice(stcValue);
+    private Action actionBuilder(final List<ParameterValue> parameters) {
+        final ActionBuilder actionBuilder = new ActionBuilder();
+        actionBuilder.setParameterValue(parameters);
+        return actionBuilder.build();
+    }
 
-        Assert.assertTrue(srvTypeChoice instanceof ServiceFunction);
-        final ServiceFunction stc = (ServiceFunction) srvTypeChoice;
-        Assert.assertEquals(stcValue, stc.getServiceFunction());
+    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);
     }
-}
\ No newline at end of file
+}