Plugin provider functionality
[netvirt.git] / vpnservice / sfc / classifier / impl / src / main / java / org / opendaylight / netvirt / sfc / classifier / providers / SfcProvider.java
index 430932e12a56f5e8806a873fd41f3efb4944875e..10eed0b7f467a50d2c7a05a56ff0d5d4711ff868 100644 (file)
@@ -8,16 +8,25 @@
 
 package org.opendaylight.netvirt.sfc.classifier.providers;
 
-import com.google.common.util.concurrent.CheckedFuture;
+import java.util.List;
 import java.util.Optional;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
+import org.opendaylight.genius.mdsalutil.MDSALUtil;
+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.rsp.rev140701.RenderedServicePaths;
 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.rsp.rev140701.rendered.service.paths.RenderedServicePath;
+import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.rsp.rev140701.rendered.service.paths.RenderedServicePathKey;
+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.sf.rev140701.ServiceFunctions;
+import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sf.rev140701.service.function.base.SfDataPlaneLocator;
+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.ericsson.params.xml.ns.yang.sfc.sff.logical.rev160620.LogicalInterfaceLocator;
+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.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -34,30 +43,78 @@ public class SfcProvider {
     }
 
     public Optional<RenderedServicePath> getRenderedServicePath(String rspName) {
+        RenderedServicePathKey renderedServicePathKey = new RenderedServicePathKey(new RspName(rspName));
+        InstanceIdentifier<RenderedServicePath> rspIid = InstanceIdentifier.builder(RenderedServicePaths.class)
+                .child(RenderedServicePath.class, renderedServicePathKey).build();
+
+
+        return Optional.ofNullable(MDSALUtil.read(dataBroker, LogicalDatastoreType.OPERATIONAL, rspIid).orNull());
+    }
+
+    public Optional<RenderedServicePath> getRenderedServicePathFromSfc(String sfcName) {
         Optional<RenderedServicePath> rsp = Optional.empty();
 
-        InstanceIdentifier<RenderedServicePath> rspIid = InstanceIdentifier
-                .builder(RenderedServicePaths.class).child(RenderedServicePath.class).build();
+        // TODO need to finish this
+
+        return rsp;
+    }
+
+    // This is for Logical SFFs
+    public Optional<String> getFirstHopSfInterfaceFromRsp(RenderedServicePath rsp) {
+        Optional<RenderedServicePathHop> firstHop = getRspFirstHop(rsp);
+        if (!firstHop.isPresent()) {
+            LOG.warn("getFirstHopSfInterfaceFromRsp RSP [{}] cant get first hop", rsp.getName().getValue());
+            return Optional.empty();
+        }
 
-        ReadOnlyTransaction readTx = dataBroker.newReadOnlyTransaction();
-        CheckedFuture<com.google.common.base.Optional<RenderedServicePath>, ReadFailedException> submitFuture =
-                readTx.read(LogicalDatastoreType.OPERATIONAL, rspIid);
+        SfName sfName = firstHop.get().getServiceFunctionName();
+        if (sfName == null) {
+            LOG.warn("getFirstHopSfInterfaceFromRsp RSP [{}] first hop has no SF", rsp.getName().getValue());
+            return Optional.empty();
+        }
 
-        try {
-            com.google.common.base.Optional<RenderedServicePath> optionalRet = submitFuture.checkedGet();
-            if (optionalRet.isPresent()) {
-                rsp = Optional.of(optionalRet.get());
+        Optional<ServiceFunction> sf = getServiceFunction(sfName);
+        if (!sf.isPresent()) {
+            LOG.warn("getFirstHopSfInterfaceFromRsp RSP [{}] SF [{}] does not exist", rsp.getName().getValue(),
+                    sfName.getValue());
+            return Optional.empty();
+        }
+
+        List<SfDataPlaneLocator> sfDplList = sf.get().getSfDataPlaneLocator();
+        if (sfDplList == null || sfDplList.isEmpty()) {
+            LOG.warn("getFirstHopSfInterfaceFromRsp RSP [{}] SF [{}] has no SfDpl", rsp.getName().getValue(),
+                    sfName.getValue());
+            return Optional.empty();
+        }
+
+        // Get the first LogicalInterface locator, if there is one
+        for (SfDataPlaneLocator sfDpl : sfDplList) {
+            if (sfDpl.getLocatorType() instanceof LogicalInterface) {
+                LogicalInterfaceLocator locator = (LogicalInterfaceLocator) sfDpl.getLocatorType();
+                if (locator != null) {
+                    return Optional.ofNullable(locator.getInterfaceName());
+                }
             }
-        } catch (ReadFailedException e) {
-            LOG.warn("Error reading RSP: {}", e.getMessage());
         }
 
-        return rsp;
+        return Optional.empty();
     }
 
-    public Optional<RenderedServicePath> getRenderedServicePathFromSfc(String sfcName) {
-        Optional<RenderedServicePath> rsp = Optional.empty();
+    private Optional<ServiceFunction> getServiceFunction(SfName name) {
+        ServiceFunctionKey serviceFunctionKey = new ServiceFunctionKey(new SfName(name));
+        InstanceIdentifier<ServiceFunction> sfIid = InstanceIdentifier.builder(ServiceFunctions.class)
+                .child(ServiceFunction.class, serviceFunctionKey).build();
 
-        return rsp;
+        return Optional.ofNullable(MDSALUtil.read(dataBroker, LogicalDatastoreType.CONFIGURATION, sfIid).orNull());
+    }
+
+    private Optional<RenderedServicePathHop> getRspFirstHop(RenderedServicePath rsp) {
+        List<RenderedServicePathHop> hops = rsp.getRenderedServicePathHop();
+        if (hops == null || hops.isEmpty()) {
+            LOG.warn("getRspFirstHop RSP [{}] has no hops list", rsp.getName().getValue());
+            return Optional.empty();
+        }
+
+        return Optional.ofNullable(hops.get(0));
     }
 }