Bug 4996 - Wrong flows when using SFC coexistence 68/37068/1
authorSam Hague <shague@redhat.com>
Thu, 11 Feb 2016 23:13:31 +0000 (18:13 -0500)
committerSam Hague <shague@redhat.com>
Mon, 4 Apr 2016 13:06:02 +0000 (09:06 -0400)
Signed-off-by: Sam Hague <shague@redhat.com>
openstack/net-virt-sfc/impl/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/sfc/SfcUtils.java
openstack/net-virt-sfc/impl/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/sfc/workaround/NetvirtSfcWorkaroundOF13Provider.java
openstack/net-virt-sfc/it/src/test/java/org/opendaylight/ovsdb/openstack/netvirt/sfc/it/NetvirtSfcIT.java

index 642a7574d33121d9eca1e63129725369a8cd5655..2ccac9fa36c4c395803c70c99c16da1be70da2b8 100644 (file)
@@ -13,10 +13,12 @@ import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.ovsdb.utils.mdsal.utils.MdsalUtils;
 import org.opendaylight.sfc.provider.api.SfcProviderAclAPI;
 import org.opendaylight.sfc.provider.api.SfcProviderRenderedPathAPI;
+import org.opendaylight.sfc.provider.api.SfcProviderServiceForwarderAPI;
 import org.opendaylight.sfc.provider.api.SfcProviderServiceFunctionAPI;
 import org.opendaylight.sfc.provider.api.SfcProviderServicePathAPI;
 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.common.rev151017.RspName;
 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.common.rev151017.SfName;
+import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.common.rev151017.SffName;
 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.rsp.rev140701.RenderedServicePaths;
 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.rsp.rev140701.rendered.service.path.first.hop.info.RenderedServicePathFirstHop;
 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.rsp.rev140701.rendered.service.paths.RenderedServicePath;
@@ -26,6 +28,7 @@ import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sf.rev14070
 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sf.rev140701.service.functions.ServiceFunction;
 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sf.rev140701.service.functions.ServiceFunctionKey;
 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.rev140701.service.function.forwarders.ServiceFunctionForwarder;
+import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.rev140701.service.function.forwarders.service.function.forwarder.SffDataPlaneLocator;
 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.service.function.paths.ServiceFunctionPath;
 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sl.rev140701.data.plane.locator.locator.type.Ip;
@@ -196,12 +199,22 @@ public class SfcUtils {
     }
 
     public Ip getSffIp(ServiceFunctionForwarder serviceFunctionForwarder) {
-        if (serviceFunctionForwarder == null) {
-            LOG.info("getSfIp: ServicefunctionForwarder is null");
+        if (serviceFunctionForwarder != null &&
+                serviceFunctionForwarder.getSffDataPlaneLocator() != null &&
+                serviceFunctionForwarder.getSffDataPlaneLocator().get(0) != null &&
+                serviceFunctionForwarder.getSffDataPlaneLocator().get(0).getDataPlaneLocator() != null) {
+            return (Ip)serviceFunctionForwarder.getSffDataPlaneLocator().get(0)
+                    .getDataPlaneLocator().getLocatorType();
+        } else {
+            LOG.info("getSffIp: ServiceFunctionForwarder is null");
             return null;
         }
+    }
 
-        return (Ip)serviceFunctionForwarder.getSffDataPlaneLocator().get(0).getDataPlaneLocator().getLocatorType();
+    public Ip getSffIp(SffName sffName) {
+        ServiceFunctionForwarder serviceFunctionForwarder =
+                SfcProviderServiceForwarderAPI.readServiceFunctionForwarder(sffName);
+        return getSffIp(serviceFunctionForwarder);
     }
 
     public RenderedServicePathHop getFirstHop(RenderedServicePath rsp) {
index df315e1d54209aa78897c8dfca13b235fe80c1ff..937494a85ea30544f57747df9d1ad1dba1d34304 100644 (file)
@@ -243,6 +243,8 @@ public class NetvirtSfcWorkaroundOF13Provider implements INetvirtSfcOF13Provider
             NshUtils nshHeader = new NshUtils();
             nshHeader.setNshNsp(rsp.getPathId());
             nshHeader.setNshNsi(firstHop.getServiceIndex());
+            Ip sffIp = sfcUtils.getSffIp(lastHop.getServiceFunctionForwarder());
+            nshHeader.setNshMetaC1(NshUtils.convertIpAddressToLong(sffIp.getIp().getIpv4Address()));
             if (isSffOnBridge(bridgeNode, serviceFunctionForwarder)) {
                 LOG.info("handleSff: sff and bridge are the same: {} - {}, skipping first sff",
                         bridgeNode.getNodeId().getValue(), serviceFunctionForwarder.getName().getValue());
index 1d87997d312078579513f26ada9a4d2418921c7a..07d40734f225073c668395d19dcfe01aabc52593 100644 (file)
@@ -717,6 +717,8 @@ public class NetvirtSfcIT extends AbstractMdsalTestBase {
         flowId = FlowNames.getArpResponder(SF1IP);
         verifyFlow(nodeInfo.datapathId, flowId, Service.ARP_RESPONDER);
 
+        LOG.info("check for flows!!!!!!!!!!!!!");
+        Thread.sleep(30000);
         InstanceIdentifier<Flow> flowIid = createFlowIid(nodeInfo.datapathId, flowId,
                 pipelineOrchestrator.getTable(Service.CLASSIFIER));