Bug 6449 - Issues in Service Function Forwarder translation 32/44132/1
authorAnil Vishnoi <vishnoianil@gmail.com>
Wed, 17 Aug 2016 09:43:52 +0000 (02:43 -0700)
committerAnil Vishnoi <vishnoianil@gmail.com>
Wed, 17 Aug 2016 10:25:59 +0000 (03:25 -0700)
Change-Id: I7ca466ae65aa36c732d74a26def73bd64981b133
Signed-off-by: Anil Vishnoi <vishnoianil@gmail.com>
openstack/sfc-translator/impl/src/main/java/org/opendaylight/netvirt/openstack/sfc/translator/OvsdbMdsalHelper.java
openstack/sfc-translator/impl/src/main/java/org/opendaylight/netvirt/openstack/sfc/translator/SfcMdsalHelper.java
openstack/sfc-translator/impl/src/main/java/org/opendaylight/netvirt/openstack/sfc/translator/portchain/NeutronPortChainListener.java
openstack/sfc-translator/impl/src/main/java/org/opendaylight/netvirt/openstack/sfc/translator/portchain/PortPairGroupTranslator.java
openstack/sfc-translator/impl/src/main/java/org/opendaylight/netvirt/openstack/sfc/translator/portchain/PortPairTranslator.java

index 433f2e94207224dc6a94a4ac69afb7b440d0a4bd..b9bcaeaed6f0b8c9cfb1a85130a2ca907b2e1925 100644 (file)
@@ -58,7 +58,8 @@ public class OvsdbMdsalHelper {
         return getOvsdbPortMetadata(ingressPort, ovsdbTopology);
     }
     public OvsdbPortMetadata getOvsdbPortMetadata(Uuid ingressPort, Topology ovsdbTopology) {
-        LOG.info("Extract ovsdb port details for neutron port {}", ingressPort.getValue());
+        LOG.debug("Extract ovsdb port details for neutron port {} from Topology {}",
+                ingressPort.getValue(), ovsdbTopology);
         OvsdbPortMetadata ovsdbPortMetadata = new OvsdbPortMetadata();
         OvsdbBridgeAugmentation bridgeAugmentation = null;
         if (ovsdbTopology != null) {
@@ -69,15 +70,18 @@ public class OvsdbMdsalHelper {
                         OvsdbTerminationPointAugmentation tpAugmentation
                                 = tp.getAugmentation(OvsdbTerminationPointAugmentation.class);
                         List<InterfaceExternalIds> externalIds = tpAugmentation.getInterfaceExternalIds();
-                        for (InterfaceExternalIds externalId : externalIds) {
-                            if(externalId.getExternalIdValue().equals(ingressPort.getValue())) {
-                                ovsdbPortMetadata.setOvsdbPort(tpAugmentation);
+                        if (externalIds != null ) {
+                            for (InterfaceExternalIds externalId : externalIds) {
+                                if(externalId.getExternalIdValue().equals(ingressPort.getValue())) {
+                                    LOG.info("OVSDB port found for neutron port {} : {}", ingressPort, tpAugmentation);
+                                    ovsdbPortMetadata.setOvsdbPort(tpAugmentation);
+                                    break;
+                                }
+                            }
+                            if (ovsdbPortMetadata.getOvsdbPort() != null) {
                                 break;
                             }
                         }
-                        if (ovsdbPortMetadata.getOvsdbPort() != null) {
-                            break;
-                        }
                     }
                 }
                 if (ovsdbPortMetadata.getOvsdbPort() != null) {
@@ -109,7 +113,7 @@ public class OvsdbMdsalHelper {
         } else {
             LOG.warn("OVSDB Operational topology not avaialble.");
         }
-        LOG.info("Neutron port's {} respective Ovsdb metadata {}", ovsdbPortMetadata);
+        LOG.info("Neutron port's {} respective Ovsdb metadata {}", ingressPort, ovsdbPortMetadata);
         return ovsdbPortMetadata;
     }
 
index fa7e41f3822617ed39d1855cfaaf15f0a3ee16d4..5dc8e0a44501988ac8a6b232e3a266140a247166 100644 (file)
@@ -26,6 +26,7 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.cont
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160218.access.lists.Acl;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160218.access.lists.AclKey;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;
+import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -58,7 +59,7 @@ public class SfcMdsalHelper {
     public void addAclFlowClassifier(Acl aclFlowClassifier) {
         InstanceIdentifier<Acl> aclIid = getAclPath(aclFlowClassifier.getKey());
         LOG.info("Write ACL FlowClassifier {} to config data store at {}",aclFlowClassifier, aclIid);
-        mdsalUtils.put(LogicalDatastoreType.CONFIGURATION, aclIid, aclFlowClassifier);
+        mdsalPutWrapper(LogicalDatastoreType.CONFIGURATION, aclIid, aclFlowClassifier);
     }
 
     public void updateAclFlowClassifier(Acl aclFlowClassifier) {
@@ -77,7 +78,7 @@ public class SfcMdsalHelper {
     public void addServiceFunction(ServiceFunction sf) {
         InstanceIdentifier<ServiceFunction> sfIid = getSFPath(sf.getKey());
         LOG.info("Write Service Function {} to config data store at {}",sf, sfIid);
-        mdsalUtils.put(LogicalDatastoreType.CONFIGURATION, sfIid, sf);
+        mdsalPutWrapper(LogicalDatastoreType.CONFIGURATION, sfIid, sf);
     }
 
     public void updateServiceFunction(ServiceFunction sf) {
@@ -130,13 +131,13 @@ public class SfcMdsalHelper {
     public void addServiceFunctionForwarder(ServiceFunctionForwarder sff) {
         InstanceIdentifier<ServiceFunctionForwarder> sffIid = getSFFPath(sff.getKey());
         LOG.info("Write Service Function Forwarder {} to config data store at {}",sff, sffIid);
-        mdsalUtils.put(LogicalDatastoreType.CONFIGURATION, sffIid, sff);
+        mdsalPutWrapper(LogicalDatastoreType.CONFIGURATION, sffIid, sff);
     }
 
     public void addServiceFunctionChain(ServiceFunctionChain sfc) {
         InstanceIdentifier<ServiceFunctionChain> sfcIid = getSFCPath(sfc.getKey());
         LOG.info("Write Service Function Chain {} to config data store at {}",sfc, sfcIid);
-        mdsalUtils.put(LogicalDatastoreType.CONFIGURATION, sfcIid, sfc);
+        mdsalPutWrapper(LogicalDatastoreType.CONFIGURATION, sfcIid, sfc);
     }
 
     public void removeServiceFunctionChain(ServiceFunctionChainKey sfcKey) {
@@ -148,6 +149,14 @@ public class SfcMdsalHelper {
     public void addServiceFunctionPath(ServiceFunctionPath sfp) {
         InstanceIdentifier<ServiceFunctionPath> sfpIid = getSFPPath(sfp.getKey());
         LOG.info("Write Service Function Path {} to config data store at {}",sfp, sfpIid);
-        mdsalUtils.put(LogicalDatastoreType.CONFIGURATION, sfpIid, sfp);
+        mdsalPutWrapper(LogicalDatastoreType.CONFIGURATION, sfpIid, sfp);
+    }
+
+    private <D extends DataObject> void mdsalPutWrapper(LogicalDatastoreType dataStore, InstanceIdentifier<D> iid, D data) {
+        try {
+            mdsalUtils.put(dataStore, iid, data);
+        } catch (Exception e) {
+            LOG.error("Exception while putting data in data store {} : {}",iid, data, e);
+        }
     }
 }
index 49ca299c6aa2e115015389ffab986c992ac61ef5..ddd201b23817623aee68b28fc7e558738724bf81 100644 (file)
@@ -7,6 +7,7 @@
  */
 package org.opendaylight.netvirt.openstack.sfc.translator.portchain;
 
+import com.google.common.util.concurrent.ThreadFactoryBuilder;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.binding.api.DataTreeIdentifier;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
@@ -44,8 +45,12 @@ import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.concurrent.Callable;
 import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
 import java.util.concurrent.Future;
+import java.util.concurrent.ThreadFactory;
 
 /**
  * OpenDaylight Neutron Port Chain yang models data change listener
@@ -56,6 +61,7 @@ public class NeutronPortChainListener extends DelegatingDataTreeListener<PortCha
 
     private static final InstanceIdentifier<PortChain> portChainIid =
             InstanceIdentifier.create(Neutron.class).child(PortChains.class).child(PortChain.class);
+    private final ExecutorService eventProcessor;
     private final SfcMdsalHelper sfcMdsalHelper;
     private final NeutronMdsalHelper neutronMdsalHelper;
     private final OvsdbMdsalHelper ovsdbMdsalHelper;
@@ -63,10 +69,12 @@ public class NeutronPortChainListener extends DelegatingDataTreeListener<PortCha
 
     public NeutronPortChainListener(DataBroker db, RenderedServicePathService rspService) {
         super(db,new DataTreeIdentifier<>(LogicalDatastoreType.CONFIGURATION, portChainIid));
-        sfcMdsalHelper = new SfcMdsalHelper(db);
-        neutronMdsalHelper = new NeutronMdsalHelper(db);
-        ovsdbMdsalHelper = new OvsdbMdsalHelper(db);
+        this.sfcMdsalHelper = new SfcMdsalHelper(db);
+        this.neutronMdsalHelper = new NeutronMdsalHelper(db);
+        this.ovsdbMdsalHelper = new OvsdbMdsalHelper(db);
         this.rspService = rspService;
+        ThreadFactory threadFactory = new ThreadFactoryBuilder().setNameFormat("Port-Chain-Event-Processor").build();
+        this.eventProcessor = Executors.newSingleThreadExecutor(threadFactory);
     }
 
     /**
@@ -101,8 +109,14 @@ public class NeutronPortChainListener extends DelegatingDataTreeListener<PortCha
      * @param newPortChain        - new PortChain
      */
     @Override
-    public void add(InstanceIdentifier<PortChain> path, PortChain newPortChain) {
+    public void add(final InstanceIdentifier<PortChain> path, final PortChain newPortChain) {
         processPortChain(newPortChain);
+        eventProcessor.submit(new Runnable() {
+            @Override
+            public void run() {
+                processPortChain(newPortChain);
+            }
+        });
     }
 
     private void processPortChain(PortChain newPortChain) {
@@ -126,13 +140,13 @@ public class NeutronPortChainListener extends DelegatingDataTreeListener<PortCha
                 List<PortPair> portPairList = new ArrayList<>();
                 portPairGroupList.add(ppg);
                 for(Uuid ppUuid : ppg.getPortPairs()) {
-                    PortPair pp = neutronMdsalHelper.getNeutronPortPair(ppgUuid);
+                    PortPair pp = neutronMdsalHelper.getNeutronPortPair(ppUuid);
                     if (pp != null) {
                         portPairList.add(pp);
                         //NOTE:Assuming that ingress and egress port is same.
                         Port neutronPort = neutronMdsalHelper.getNeutronPort(pp.getIngress());
                         if (neutronPort != null) {
-                            portPairToNeutronPortMap.put(ppgUuid, neutronPort);
+                            portPairToNeutronPortMap.put(pp.getIngress(), neutronPort);
                         }
                     }
                 }
@@ -174,7 +188,7 @@ public class NeutronPortChainListener extends DelegatingDataTreeListener<PortCha
             //Build the SFF Builder from port pair group
             ServiceFunctionForwarderBuilder sffBuilder =
                     PortPairGroupTranslator.buildServiceFunctionForwarder(ppg,portPairList, metadataList);
-
+            LOG.info("SFF generated for Port Pair Group {} :: {}",ppg, sffBuilder);
             //Check if SFF already exist
             ServiceFunctionForwarder existingSff =
                     sfcMdsalHelper.getExistingSFF(sffBuilder.getIpMgmtAddress().getIpv4Address().getValue());
@@ -196,6 +210,7 @@ public class NeutronPortChainListener extends DelegatingDataTreeListener<PortCha
                         sffBuilder.build());
 
                 if (sfBuilder != null) {
+                    LOG.info("Service Function generated for the Port Pair {} :: {}", portPair, sfBuilder);
                     //Write the Service Function to SFC data store.
                     sfcMdsalHelper.addServiceFunction(sfBuilder.build());
 
@@ -212,6 +227,7 @@ public class NeutronPortChainListener extends DelegatingDataTreeListener<PortCha
             //Update the Service Function Dictionary of SFF
             for (ServiceFunctionBuilder sf : portPairSFList) {
                 PortPairGroupTranslator.buildServiceFunctionDictonary(sffBuilder, sf.build());
+                LOG.info("Updating Service Function dictionary of SFF {} for SF {}", sffBuilder, sf);
             }
             // Send SFF create request
             LOG.info("Add Service Function Forwarder {} for Port Pair Group {}", sffBuilder.build(), ppg);
@@ -223,6 +239,7 @@ public class NeutronPortChainListener extends DelegatingDataTreeListener<PortCha
 
         //Write SFC to data store
         if (sfc != null) {
+            LOG.info("Add service function chain {}", sfc);
             sfcMdsalHelper.addServiceFunctionChain(sfc);
         } else {
             LOG.warn("Service Function Chain building failed for Port Chain {}", newPortChain);
@@ -232,6 +249,7 @@ public class NeutronPortChainListener extends DelegatingDataTreeListener<PortCha
         ServiceFunctionPath sfp = PortChainTranslator.buildServiceFunctionPath(sfc);
         //Write SFP to data store
         if (sfp != null) {
+            LOG.info("Add service function path {}", sfp);
            sfcMdsalHelper.addServiceFunctionPath(sfp);
         } else {
             LOG.warn("Service Function Path building failed for Service Chain {}", sfc);
@@ -245,6 +263,7 @@ public class NeutronPortChainListener extends DelegatingDataTreeListener<PortCha
 
             //Call Create Rendered Service Path RPC call
             if (rpInput != null) {
+                LOG.info("Call RPC for creating RSP :{}", rpInput);
                 Future<RpcResult<CreateRenderedPathOutput>> result =  this.rspService.createRenderedPath(rpInput);
                 try {
                     result.get();
index 25a1b94f330cd116e2219f7e0cdc7e6ece774b81..39ab5af69ef3c47cc6fde115fc854ae1e003f4b2 100644 (file)
@@ -10,6 +10,7 @@ package org.opendaylight.netvirt.openstack.sfc.translator.portchain;
 import com.google.common.base.Preconditions;
 import org.opendaylight.netvirt.openstack.sfc.translator.OvsdbMdsalHelper;
 import org.opendaylight.netvirt.openstack.sfc.translator.OvsdbPortMetadata;
+import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.common.rev151017.SffDataPlaneLocatorName;
 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.SnName;
 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sf.rev140701.service.functions.ServiceFunction;
@@ -25,6 +26,7 @@ import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.ovs.rev
 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.rev140701.Open;
 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.rev140701.service.function.forwarder.base.SffDataPlaneLocator;
 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.SffDataPlaneLocatorKey;
 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;
@@ -59,6 +61,7 @@ public class PortPairGroupTranslator {
 
     private static final AtomicInteger counter = new AtomicInteger(0);
     private static final String SFF_DEFAULT_NAME = "sff";
+    private static final String SFF_DPL_SUFFIX = "-dpl";
 
     public static ServiceFunctionForwarderBuilder buildServiceFunctionForwarder(
             PortPairGroup portPairGroup,
@@ -137,7 +140,8 @@ public class PortPairGroupTranslator {
 
         //Set management ip, same to the ovsdb  node ip
         sffBuilder.setIpMgmtAddress(sffLocator.getIp());
-
+        sffDplBuilder.setName(new SffDataPlaneLocatorName(sffBuilder.getName().getValue() + SFF_DPL_SUFFIX));
+        sffDplBuilder.setKey(new SffDataPlaneLocatorKey(sffDplBuilder.getName()));
         sffDataPlaneLocator.add(sffDplBuilder.build());
         //set SFF key
         sffBuilder.setKey(new ServiceFunctionForwarderKey(sffBuilder.getName()));
@@ -162,22 +166,21 @@ public class PortPairGroupTranslator {
 
         //NOTE: fail mode is set to Open by default
         sfdBuilder.setFailmode(Open.class);
+        sfdList.add(sfdBuilder.build());
 
         //TODO: set interface name list
 
-        for (Iterator<ServiceFunctionDictionary> sfdItr = sffBuilder.getServiceFunctionDictionary().iterator();sfdItr
-                .hasNext();) {
-            ServiceFunctionDictionary sfd = sfdItr.next();
-            if (sfd.getName().equals(sfdBuilder.getName())) {
-                LOG.info("Existing SF dictionary {} found in SFF {}, removing the SF dictionary", sfd.getName(),
-                        sffBuilder.getName());
-                sfdItr.remove();
-                break;
-            }
-        }
-        sfdList.add(sfdBuilder.build());
-
         if (sffBuilder.getServiceFunctionDictionary() != null) {
+            for (Iterator<ServiceFunctionDictionary> sfdItr = sffBuilder.getServiceFunctionDictionary().iterator();sfdItr
+                    .hasNext();) {
+                ServiceFunctionDictionary sfd = sfdItr.next();
+                if (sfd.getName().equals(sfdBuilder.getName())) {
+                    LOG.info("Existing SF dictionary {} found in SFF {}, removing the SF dictionary", sfd.getName(),
+                            sffBuilder.getName());
+                    sfdItr.remove();
+                    break;
+                }
+            }
             sffBuilder.getServiceFunctionDictionary().addAll(sfdList);
         } else {
             sffBuilder.setServiceFunctionDictionary(sfdList);
index e16ca14372a4a08c757cd3ab2b4f602a4c4888cb..f98cf95cfc929d9ae5e8def408fc1542330a175b 100644 (file)
@@ -32,6 +32,7 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.PortNumber;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.port.attributes.AllowedAddressPairs;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.port.attributes.FixedIps;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.ports.attributes.ports.Port;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.sfc.rev160511.port.pair.attributes.ServiceFunctionParameters;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.sfc.rev160511.sfc.attributes.port.pair.groups.PortPairGroup;
@@ -104,19 +105,24 @@ public class PortPairTranslator {
 
         //Set locator type
         if (neutronPort != null) {
+            List<FixedIps> fixedIps = neutronPort.getFixedIps();
             List<AllowedAddressPairs> attachedIpAddresses = neutronPort.getAllowedAddressPairs();
-            //Pick up the first ip address
             IpAddress ipAddress;
-            if (attachedIpAddresses != null && !attachedIpAddresses.isEmpty()) {
+            if (fixedIps != null && !fixedIps.isEmpty()){
+                ipAddress = fixedIps.get(0).getIpAddress();
+                sfLocator.setIp(ipAddress);
+
+            } else if (attachedIpAddresses != null && !attachedIpAddresses.isEmpty()) {
+                //Pick up the first ip address
                 ipAddress = attachedIpAddresses.get(0).getIpAddress().getIpAddress();
                 sfLocator.setIp(ipAddress);
-                sfLocator.setPort(new PortNumber(SF_LOCATOR_PORT));
             } else {
                 LOG.warn("No ip address attached to Neutron Port {} related to Port Pair {}", neutronPort, portPair);
                 //Ideally we should exit here, because without IP address OpenDaylight SFC won't be able to find the
                 //respective overlay. But if user passes additional parameter through service_function_param
                 //that can be leveraged here. Parameter passed through service_function_param will take precedence.
             }
+            sfLocator.setPort(new PortNumber(SF_LOCATOR_PORT));
 
         } else {
             LOG.warn("Neutron port mapped to Port pair ingress/egress port is not found : {}", portPair);
@@ -135,29 +141,31 @@ public class PortPairTranslator {
         }
 
         //But if user pass specific param using service_function_parameters, set/override it accordingly
-        for(ServiceFunctionParameters sfParam : sfParams) {
-            if (sfParam.getServiceFunctionParameter().equals(NSH_AWARE_PARAM)) {
-                serviceFunctionBuilder.setNshAware(new Boolean(sfParam.getServiceFunctionParameterValue()));
-            }
-            //There is by default type set to port pair group name, override it if user pass it specific type
-            if (sfParam.getServiceFunctionParameter().equals(SF_TYPE_PARAM)) {
-                serviceFunctionBuilder.setType(new SftTypeName(sfParam.getServiceFunctionParameterValue()));
-            }
-            if (sfParam.getServiceFunctionParameter().equals(DPL_TRANSPORT_PARAM)) {
-                Class transportTypeClass
-                        = DPL_TRANSPORT_TYPE.get(sfParam.getServiceFunctionParameterValue());
-                sfDataPlaneLocatorBuilder.setTransport(transportTypeClass);
-            }
-            if (sfParam.getServiceFunctionParameter().equals(DPL_IP_PARAM)) {
-                IpAddress ipAddress = new IpAddress(new Ipv4Address(sfParam.getServiceFunctionParameterValue()));
-                sfLocator.setIp(ipAddress);
-            }
-            if (sfParam.getServiceFunctionParameter().equals(DPL_PORT_PARAM)) {
-                sfLocator.setPort(new PortNumber(new Integer(sfParam.getServiceFunctionParameterValue())));
-            }
-            if (sfParam.getServiceFunctionParameter().equals(SFF_NAME_PARAM)) {
-                sfDataPlaneLocatorBuilder.setServiceFunctionForwarder(
-                        new SffName(sfParam.getServiceFunctionParameterValue()));
+        if (sfParams != null) {
+            for(ServiceFunctionParameters sfParam : sfParams) {
+                if (sfParam.getServiceFunctionParameter().equals(NSH_AWARE_PARAM)) {
+                    serviceFunctionBuilder.setNshAware(new Boolean(sfParam.getServiceFunctionParameterValue()));
+                }
+                //There is by default type set to port pair group name, override it if user pass it specific type
+                if (sfParam.getServiceFunctionParameter().equals(SF_TYPE_PARAM)) {
+                    serviceFunctionBuilder.setType(new SftTypeName(sfParam.getServiceFunctionParameterValue()));
+                }
+                if (sfParam.getServiceFunctionParameter().equals(DPL_TRANSPORT_PARAM)) {
+                    Class transportTypeClass
+                            = DPL_TRANSPORT_TYPE.get(sfParam.getServiceFunctionParameterValue());
+                    sfDataPlaneLocatorBuilder.setTransport(transportTypeClass);
+                }
+                if (sfParam.getServiceFunctionParameter().equals(DPL_IP_PARAM)) {
+                    IpAddress ipAddress = new IpAddress(new Ipv4Address(sfParam.getServiceFunctionParameterValue()));
+                    sfLocator.setIp(ipAddress);
+                }
+                if (sfParam.getServiceFunctionParameter().equals(DPL_PORT_PARAM)) {
+                    sfLocator.setPort(new PortNumber(new Integer(sfParam.getServiceFunctionParameterValue())));
+                }
+                if (sfParam.getServiceFunctionParameter().equals(SFF_NAME_PARAM)) {
+                    sfDataPlaneLocatorBuilder.setServiceFunctionForwarder(
+                            new SffName(sfParam.getServiceFunctionParameterValue()));
+                }
             }
         }