BUG: Adapt SFC translator to SFC code in Nitrogen 04/61504/8
authorManuel Buil <mbuil@suse.com>
Thu, 10 Aug 2017 14:47:31 +0000 (16:47 +0200)
committerSam Hague <shague@redhat.com>
Thu, 17 Aug 2017 12:10:11 +0000 (12:10 +0000)
BUG: 8966

SFC Translator must start using logical SFF otherwise it will not work

Change-Id: Iec8dd6ae757d230464162dd1612bcda3a8fd0f26
Signed-off-by: Manuel Buil <mbuil@suse.com>
Signed-off-by: Jaime CaamaƱo Ruiz <jaime.caamano.ruiz@ericsson.com>
vpnservice/sfc/translator/src/main/java/org/opendaylight/netvirt/sfc/translator/OpenStackSFCTranslatorProvider.java
vpnservice/sfc/translator/src/main/java/org/opendaylight/netvirt/sfc/translator/OvsdbMdsalHelper.java
vpnservice/sfc/translator/src/main/java/org/opendaylight/netvirt/sfc/translator/SfcMdsalHelper.java
vpnservice/sfc/translator/src/main/java/org/opendaylight/netvirt/sfc/translator/portchain/PortPairTranslator.java

index c97b54205269f128529f0289bc643e6c93b44c8a..29ebec95d871b8fadb646c27699de81990b5a79d 100644 (file)
@@ -45,6 +45,8 @@ public class OpenStackSFCTranslatorProvider extends AbstractLifecycle {
         neutronPortPairListener = new NeutronPortPairListener(dataBroker);
         neutronPortPairGroupListener = new NeutronPortPairGroupListener(dataBroker);
         neutronPortChainListener = new NeutronPortChainListener(dataBroker, rspService);
+        SfcMdsalHelper sfcMdsal = new SfcMdsalHelper(dataBroker);
+        sfcMdsal.addNetvirLogicalSff();
         if (this.rspService == null) {
             LOG.warn("RenderedServicePath Service is not available. Translation layer might not work as expected.");
         }
index 8f37d8d00c23e131492bbaa45df69f28eb5b6f7d..d5ba09b8cfb29a3e38540b6c552cb8a1ad3a28b2 100644 (file)
@@ -33,7 +33,7 @@ import org.slf4j.LoggerFactory;
  * Utility methods to read OpenDaylight OVSDB models.
  */
 public class OvsdbMdsalHelper {
-    private static final Logger LOG = LoggerFactory.getLogger(SfcMdsalHelper.class);
+    private static final Logger LOG = LoggerFactory.getLogger(OvsdbMdsalHelper.class);
     private static final String OVSDB_TOPOLOGY_ID = "ovsdb:1";
     private static final InstanceIdentifier<Topology> TOPOLOGY_PATH
             = InstanceIdentifier.create(NetworkTopology.class)
index 053aa0db0ca6e3382399a9e04b011d32dfc272b1..6e8a6d7561ddcaafe872d2b6cc906d40402561d6 100644 (file)
@@ -8,11 +8,12 @@
 
 package org.opendaylight.netvirt.sfc.translator;
 
-import java.util.List;
+import java.util.Objects;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
 import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
+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.sf.rev140701.ServiceFunctions;
 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;
@@ -21,6 +22,7 @@ import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sfc.rev1407
 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sfc.rev140701.service.function.chain.grouping.ServiceFunctionChainKey;
 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.rev140701.ServiceFunctionForwarders;
 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.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.service.function.paths.ServiceFunctionPath;
@@ -46,6 +48,7 @@ public class SfcMdsalHelper {
             InstanceIdentifier.create(ServiceFunctionChains.class);
     private static InstanceIdentifier<ServiceFunctionPaths> sfpIid
             = InstanceIdentifier.create(ServiceFunctionPaths.class);
+    public static final String NETVIRT_LOGICAL_SFF_NAME = "Netvirt-Logical-SFF";
 
     private final DataBroker dataBroker;
 
@@ -216,17 +219,20 @@ public class SfcMdsalHelper {
         ServiceFunctionForwarders existingSffs =
                 SingleTransactionDataBroker.syncReadOptionalAndTreatReadFailedExceptionAsAbsentOptional(dataBroker,
                         LogicalDatastoreType.CONFIGURATION, sffIid).orNull();
-        if (existingSffs != null
-                && existingSffs.getServiceFunctionForwarder() != null
-                && !existingSffs.getServiceFunctionForwarder().isEmpty()) {
-
-            List<ServiceFunctionForwarder> existingSffList = existingSffs.getServiceFunctionForwarder();
-            for (ServiceFunctionForwarder sff : existingSffList) {
-                if (sff.getIpMgmtAddress().getIpv4Address().equals(new Ipv4Address(ipAddress))) {
-                    return sff;
-                }
-            }
-        }
-        return null;
+
+        return existingSffs == null || existingSffs.getServiceFunctionForwarder() == null
+                ? null
+                : existingSffs.getServiceFunctionForwarder().stream()
+                    .filter(sff -> Objects.nonNull(sff.getIpMgmtAddress()))
+                    .filter(sff -> new Ipv4Address(ipAddress).equals(sff.getIpMgmtAddress().getIpv4Address()))
+                    .findFirst()
+                    .orElse(null);
+    }
+
+    public void addNetvirLogicalSff() {
+        ServiceFunctionForwarderBuilder sffBuilder = new ServiceFunctionForwarderBuilder();
+        sffBuilder.setName(new SffName(NETVIRT_LOGICAL_SFF_NAME));
+        ServiceFunctionForwarder sff = sffBuilder.build();
+        this.addServiceFunctionForwarder(sff);
     }
 }
index 78b34200d66a86f0ec9849c2e498d7c40bdbe725..76e93cb784e6a76b4b78bddcbe252b6e82831c3d 100644 (file)
@@ -15,6 +15,7 @@ import java.util.List;
 import java.util.concurrent.atomic.AtomicInteger;
 import org.opendaylight.netvirt.sfc.translator.OvsdbMdsalHelper;
 import org.opendaylight.netvirt.sfc.translator.OvsdbPortMetadata;
+import org.opendaylight.netvirt.sfc.translator.SfcMdsalHelper;
 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.common.rev151017.SfDataPlaneLocatorName;
 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;
@@ -26,12 +27,15 @@ 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.ServiceFunctionBuilder;
 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.sl.rev140701.Mac;
 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sl.rev140701.SlTransportType;
 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sl.rev140701.VxlanGpe;
 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.ericsson.params.xml.ns.yang.sfc.sf.ovs.rev160107.SfDplOvsAugmentation;
 import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.sfc.sf.ovs.rev160107.SfDplOvsAugmentationBuilder;
 import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.sfc.sf.ovs.rev160107.connected.port.OvsPortBuilder;
+import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.sfc.sff.logical.rev160620.service.functions.service.function.sf.data.plane.locator.locator.type.LogicalInterface;
+import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.sfc.sff.logical.rev160620.service.functions.service.function.sf.data.plane.locator.locator.type.LogicalInterfaceBuilder;
 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.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.PortNumber;
@@ -55,6 +59,7 @@ public class PortPairTranslator {
     private static final String DPL_TRANSPORT_PARAM = "dpl-transport";
     private static final String DPL_IP_PARAM = "dpl-ip";
     private static final String DPL_PORT_PARAM = "dpl-port";
+    private static final String SFF_LOGICAL = "-logical";
     private static final String SFF_STR = "sff";
 
     public static final ImmutableBiMap<String, Class<? extends SlTransportType>> DPL_TRANSPORT_TYPE
@@ -173,8 +178,20 @@ public class PortPairTranslator {
 
         sfDataPlaneLocatorBuilder.setLocatorType(sfLocator.build());
 
+        SfDataPlaneLocatorBuilder logicalInterfaceDplBuilder = new SfDataPlaneLocatorBuilder();
+        String dataPlaneName = portPair.getName() + SFF_LOGICAL + DPL_SUFFIX_PARAM;
+        logicalInterfaceDplBuilder.setName(new SfDataPlaneLocatorName(dataPlaneName));
+        logicalInterfaceDplBuilder.setTransport(Mac.class);
+        SffName defaultSffName = new SffName(SfcMdsalHelper.NETVIRT_LOGICAL_SFF_NAME);
+        logicalInterfaceDplBuilder.setServiceFunctionForwarder(defaultSffName);
+        String neutronPortValue = neutronPort.getUuid().getValue();
+        LogicalInterface neutronIntf = new LogicalInterfaceBuilder().setInterfaceName(neutronPortValue).build();
+        logicalInterfaceDplBuilder.setLocatorType(neutronIntf);
+
         List<SfDataPlaneLocator> sfDataPlaneLocatorList = new ArrayList<>();
-        sfDataPlaneLocatorList.add(sfDataPlaneLocatorBuilder.build());
+
+        sfDataPlaneLocatorList.add(logicalInterfaceDplBuilder.build());
+//        sfDataPlaneLocatorList.add(sfDataPlaneLocatorBuilder.build());
         //Set management IP to same as DPL IP.
         serviceFunctionBuilder.setIpMgmtAddress(sfLocator.getIp());