Fix ODL itr rloc for supporting LISP CP over admin 36/60536/3
authorShakib Ahmed <sheikahm@cisco.com>
Tue, 18 Jul 2017 04:10:24 +0000 (21:10 -0700)
committerShakib Ahmed <sheikahm@cisco.com>
Sun, 23 Jul 2017 17:50:35 +0000 (10:50 -0700)
Change-Id: I71ebfae6137100968c9ab4aebc624cfc564aa6f5
Signed-off-by: Shakib Ahmed <sheikahm@cisco.com>
renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/commands/lisp/ConfigureItrRemoteLocatorSetCommand.java [new file with mode: 0644]
renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/commands/lisp/LispCommandWrapper.java
renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/commands/lisp/dom/ItrRemoteLocatorSetDom.java [new file with mode: 0644]
renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/config/ConfigUtil.java
renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/config/ConfigurationService.java
renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/lisp/LispStateManager.java
renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/lisp/util/ConfigManagerHelper.java
renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/lisp/util/Constants.java
renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/lisp/util/IpAddressUtil.java
renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/util/InterfaceUtil.java [new file with mode: 0644]
renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/util/VppIidFactory.java

diff --git a/renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/commands/lisp/ConfigureItrRemoteLocatorSetCommand.java b/renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/commands/lisp/ConfigureItrRemoteLocatorSetCommand.java
new file mode 100644 (file)
index 0000000..589a86b
--- /dev/null
@@ -0,0 +1,34 @@
+/*
+ * Copyright (c) 2017 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.groupbasedpolicy.renderer.vpp.commands.lisp;
+
+import org.opendaylight.groupbasedpolicy.renderer.vpp.commands.lisp.dom.ItrRemoteLocatorSetDom;
+import org.opendaylight.groupbasedpolicy.renderer.vpp.util.VppIidFactory;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev170315.itr.remote.locator.sets.grouping.ItrRemoteLocatorSet;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+
+/**
+ * Created by Shakib Ahmed on 7/18/17.
+ */
+public class ConfigureItrRemoteLocatorSetCommand extends AbstractLispCommand<ItrRemoteLocatorSet> {
+    ItrRemoteLocatorSetDom itrRemoteLocatorSetDom;
+
+    public ConfigureItrRemoteLocatorSetCommand(ItrRemoteLocatorSetDom itrRemoteLocatorSetDom) {
+        this.itrRemoteLocatorSetDom = itrRemoteLocatorSetDom;
+    }
+
+    @Override
+    public InstanceIdentifier<ItrRemoteLocatorSet> getIid() {
+        return VppIidFactory.getItrRemoteLocatorSetIid();
+    }
+
+    @Override
+    public ItrRemoteLocatorSet getData() {
+        return itrRemoteLocatorSetDom.getSALObject();
+    }
+}
index ca744038a9749ad4bde2d5c9305d74d2efdb6d3f..776bdfc01f9f63933a967a86cfb2d3414bc99e31 100644 (file)
@@ -11,6 +11,7 @@ package org.opendaylight.groupbasedpolicy.renderer.vpp.commands.lisp;
 import org.opendaylight.groupbasedpolicy.renderer.vpp.commands.lisp.dom.GbpGpeEntryDom;
 import org.opendaylight.groupbasedpolicy.renderer.vpp.commands.lisp.dom.GpeEnableDom;
 import org.opendaylight.groupbasedpolicy.renderer.vpp.commands.lisp.dom.InterfaceDom;
+import org.opendaylight.groupbasedpolicy.renderer.vpp.commands.lisp.dom.ItrRemoteLocatorSetDom;
 import org.opendaylight.groupbasedpolicy.renderer.vpp.commands.lisp.dom.LispDom;
 import org.opendaylight.groupbasedpolicy.renderer.vpp.commands.lisp.dom.LocalMappingDom;
 import org.opendaylight.groupbasedpolicy.renderer.vpp.commands.lisp.dom.LocatorSetDom;
@@ -30,6 +31,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev170315.dp.subtable.grouping.local.mappings.local.mapping.Eid;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev170315.eid.table.grouping.eid.table.VniTable;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev170315.hmac.key.grouping.HmacKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev170315.itr.remote.locator.sets.grouping.ItrRemoteLocatorSet;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev170315.lisp.feature.data.grouping.LispFeatureData;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev170315.locator.sets.grouping.locator.sets.LocatorSet;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev170315.map.register.grouping.MapRegister;
@@ -147,4 +149,11 @@ public class LispCommandWrapper {
 
         return new ConfigureGpeEntryCommand(gpeEntryDom);
     }
+
+    public static AbstractLispCommand<ItrRemoteLocatorSet> addItrRloc(String locatorSetName) {
+        ItrRemoteLocatorSetDom itrRemoteLocatorSetDom = new ItrRemoteLocatorSetDom();
+        itrRemoteLocatorSetDom.setLocatorSetName(locatorSetName);
+
+        return new ConfigureItrRemoteLocatorSetCommand(itrRemoteLocatorSetDom);
+    }
 }
diff --git a/renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/commands/lisp/dom/ItrRemoteLocatorSetDom.java b/renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/commands/lisp/dom/ItrRemoteLocatorSetDom.java
new file mode 100644 (file)
index 0000000..66cc980
--- /dev/null
@@ -0,0 +1,33 @@
+/*
+ * Copyright (c) 2017 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.groupbasedpolicy.renderer.vpp.commands.lisp.dom;
+
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev170315.itr.remote.locator.sets.grouping.ItrRemoteLocatorSet;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev170315.itr.remote.locator.sets.grouping.ItrRemoteLocatorSetBuilder;
+import org.opendaylight.yangtools.yang.binding.DataObject;
+
+/**
+ * Created by Shakib Ahmed on 7/18/17.
+ */
+public class ItrRemoteLocatorSetDom implements CommandModel {
+    private String locatorSetName;
+
+    public String getLocatorSetName() {
+        return locatorSetName;
+    }
+
+    public void setLocatorSetName(String locatorSetName) {
+        this.locatorSetName = locatorSetName;
+    }
+
+    @Override
+    public ItrRemoteLocatorSet getSALObject() {
+        return new ItrRemoteLocatorSetBuilder()
+                .setRemoteLocatorSetName(locatorSetName).build();
+    }
+}
index 1f9118ee65d151391f716e78a691f97b369db85c..3ba5c4653dfcf0fbe19ff62a5bf5a44e02c26220 100644 (file)
@@ -25,7 +25,7 @@ public class ConfigUtil {
     private static final boolean DEFAULT_L3_FLAT_ENABLED = false;
     private static final String DEFAULT_TRUE_STRING_VALUE = "true";
     private static final String CONFIGURATION_VARIABLE_MESSAGE =
-        "Configuration variable {} is being unset. Setting the variable to {}";
+            "Configuration variable {} is being unset. Setting the variable to {}";
 
     private IpAddress odlTenantIp;
     private boolean lispOverlayEnabled = DEFAULT_LISP_OVERLAY_ENABLED;
@@ -40,7 +40,7 @@ public class ConfigUtil {
     private static final ConfigUtil INSTANCE = new ConfigUtil();
 
     private ConfigUtil() {
-        configureOdlTenantIp(null);
+        configureOdlIp(null);
         configureLispOverlayEnabled(null);
         configureMapRegister(null);
         configL3FlatEnabled(null);
@@ -63,7 +63,7 @@ public class ConfigUtil {
         lispOverlayEnabled = configStr.trim().equalsIgnoreCase(DEFAULT_TRUE_STRING_VALUE);
     }
 
-    void configureOdlTenantIp(String configStr) {
+    void configureOdlIp(String configStr) {
         if (configStr == null) {
             odlTenantIp = null;
             LOG.debug("Configuration variable {} is being unset. Setting the variable to null",
@@ -91,7 +91,7 @@ public class ConfigUtil {
         l3FlatEnabled = configStr.trim().equalsIgnoreCase(DEFAULT_TRUE_STRING_VALUE);
     }
 
-    public IpAddress getOdlTenantIp() {
+    public IpAddress getOdlIp() {
         return odlTenantIp;
     }
 
index c6b44e927ae936a94ea635236c635ff599b4f011..fd42c5084b609bed1af49679c54ff4453b07e478 100644 (file)
@@ -72,7 +72,7 @@ public class ConfigurationService implements ManagedService{
         configMethods = new HashMap<>();
 
         configMethods.put(ConfigUtil.ODL_IP,
-                ip -> configUtil.configureOdlTenantIp((String) ip));
+                ip -> configUtil.configureOdlIp((String) ip));
         configMethods.put(ConfigUtil.LISP_MAPREGISTER_ENABLED,
                 mrConfig -> configUtil.configureMapRegister((String) mrConfig));
         configMethods.put(ConfigUtil.LISP_OVERLAY_ENABLED,
index 4277bd02476a539e0503beca9fa226add3a0110f..6fcc044224c9e24357b1621205fb3395172bc430 100644 (file)
@@ -30,6 +30,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev170315.dp.subtable.grouping.local.mappings.LocalMapping;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev170315.dp.subtable.grouping.local.mappings.local.mapping.Eid;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev170315.eid.table.grouping.eid.table.VniTable;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev170315.itr.remote.locator.sets.grouping.ItrRemoteLocatorSet;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev170315.lisp.feature.data.grouping.LispFeatureData;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev170315.locator.sets.grouping.locator.sets.LocatorSet;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev170315.map.register.grouping.MapRegister;
@@ -166,25 +167,55 @@ public class LispStateManager {
             throws LispNotFoundException, LispConfigCommandFailedException {
         try {
             String locatorSetName = lispStateHelper.constructLocatorSetName(lispState.getLocatorCount());
-            String interfaceName = lispStateHelper
-                    .readRlocInterface(endpointHost.getHostName(), endpointHost.getHostDataBroker()).get();
+            String lispDataInterfaceName = lispStateHelper
+                    .getLispDataRlocInterfaceName(endpointHost.getHostName(), endpointHost.getHostDataBroker()).get();
             AbstractLispCommand<LocatorSet> addLocatorSetCommand = LispCommandWrapper.addLocatorSet(locatorSetName,
-                    interfaceName, DEFAULT_PRIORITY, DEFAULT_WEIGHT);
+                    lispDataInterfaceName, DEFAULT_PRIORITY, DEFAULT_WEIGHT);
             if (LispStateCommandExecutor.executePutCommand(endpointHost.getHostDataBroker(), addLocatorSetCommand)) {
-                lispState.setLocIntfToLocSetNameMapping(interfaceName, locatorSetName);
+                lispState.setLocIntfToLocSetNameMapping(lispDataInterfaceName, locatorSetName);
             } else {
                 throw new LispConfigCommandFailedException("Lisp add locator set failed for host "
-                        + endpointHost.getHostName() + " and locator interface " + interfaceName);
+                        + endpointHost.getHostName() + " and locator interface " + lispDataInterfaceName);
             }
+
+            addExtraItrRlocLocatorSetIfNeeded(endpointHost, lispDataInterfaceName);
         } catch (InterruptedException | ExecutionException e) {
             throw new LispNotFoundException("No interface with Ip Address found!");
         }
+    }
+
+    private void addExtraItrRlocLocatorSetIfNeeded(EndpointHost endpointHost, String lispDataInterfaceName)
+            throws LispNotFoundException, LispConfigCommandFailedException {
+        String lispCpRlocInterfaceName = lispStateHelper.getLispCpRlocInterfaceName(endpointHost.getHostDataBroker());
+        if (lispCpRlocInterfaceName == null
+                || lispCpRlocInterfaceName.isEmpty()
+                || lispCpRlocInterfaceName.equals(lispDataInterfaceName)) {
+            return;
+        }
 
+        addItrLocatorSet(endpointHost, lispCpRlocInterfaceName);
+    }
+
+    private void addItrLocatorSet(EndpointHost endpointHost, String lispCpInterfaceName)
+            throws LispNotFoundException, LispConfigCommandFailedException {
+        String locatorSetName = lispStateHelper.constructLocatorSetNameForItrRloc();
+        AbstractLispCommand<LocatorSet> addLocatorSetCommand = LispCommandWrapper.addLocatorSet(locatorSetName,
+                lispCpInterfaceName, DEFAULT_PRIORITY, DEFAULT_WEIGHT);
+        if (!LispStateCommandExecutor.executePutCommand(endpointHost.getHostDataBroker(), addLocatorSetCommand)) {
+            throw new LispConfigCommandFailedException("Lisp add locator set failed for host "
+                    + endpointHost.getHostName() + " and locator interface " + lispCpInterfaceName);
+        }
+
+        AbstractLispCommand<ItrRemoteLocatorSet> addItrRlocCommand = LispCommandWrapper.addItrRloc(locatorSetName);
+        if (!LispStateCommandExecutor.executePutCommand(endpointHost.getHostDataBroker(), addItrRlocCommand)) {
+            throw new LispConfigCommandFailedException("Lisp add Itr Rloc command failed for host "
+                    + endpointHost.getHostName() + " and locator set " + locatorSetName);
+        }
     }
 
     private void addMapResolverOnHost(EndpointHost endpointHost, LispState lispState)
             throws LispConfigCommandFailedException {
-        IpAddress mapResolverIpAddress = ConfigUtil.getInstance().getOdlTenantIp();
+        IpAddress mapResolverIpAddress = ConfigUtil.getInstance().getOdlIp();
         Preconditions.checkNotNull(mapResolverIpAddress, "Map Resolver ip not properly configured!");
 
         AbstractLispCommand<MapResolver> addMapResolverCommand = LispCommandWrapper.
@@ -210,7 +241,7 @@ public class LispStateManager {
     }
 
     private void addMapServer(EndpointHost endpointHost, LispState lispState) throws LispConfigCommandFailedException {
-        IpAddress mapServerIpAddress = ConfigUtil.getInstance().getOdlTenantIp();
+        IpAddress mapServerIpAddress = ConfigUtil.getInstance().getOdlIp();
         Preconditions.checkNotNull(mapServerIpAddress, "Mapserver ip not properly configured!");
         AbstractLispCommand<MapServer> addMapServerCommand = LispCommandWrapper.addMapServer(mapServerIpAddress);
 
index 761949dab4ae8231a40b1cc51ea1eb3886674e69..a06acad9d208dd4409ac55c8df46a9b5fa7822d7 100644 (file)
@@ -14,6 +14,7 @@ import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.ListenableFuture;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.groupbasedpolicy.renderer.vpp.config.ConfigUtil;
 import org.opendaylight.groupbasedpolicy.renderer.vpp.iface.VppPathMapper;
 import org.opendaylight.groupbasedpolicy.renderer.vpp.lisp.info.container.EndpointHost;
 import org.opendaylight.groupbasedpolicy.renderer.vpp.lisp.info.container.HostRelatedInfoContainer;
@@ -22,6 +23,7 @@ import org.opendaylight.groupbasedpolicy.renderer.vpp.lisp.LispStateManager;
 import org.opendaylight.groupbasedpolicy.renderer.vpp.lisp.exception.LispNotFoundException;
 import org.opendaylight.groupbasedpolicy.renderer.vpp.lisp.info.container.states.PhysicalInterfaces;
 import org.opendaylight.groupbasedpolicy.renderer.vpp.util.GbpNetconfTransaction;
+import org.opendaylight.groupbasedpolicy.renderer.vpp.util.InterfaceUtil;
 import org.opendaylight.groupbasedpolicy.renderer.vpp.util.LispUtil;
 import org.opendaylight.groupbasedpolicy.renderer.vpp.util.MountedDataBrokerProvider;
 import org.opendaylight.groupbasedpolicy.renderer.vpp.util.VppIidFactory;
@@ -36,6 +38,7 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ip.rev14061
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ip.rev140616.Interface2;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ip.rev140616.interfaces.state._interface.Ipv4;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ip.rev140616.interfaces.state._interface.ipv4.Address;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ip.rev140616.interfaces.state._interface.ipv4.address.subnet.PrefixLength;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.Ipv4Afi;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.common.endpoint.fields.network.containment.Containment;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.common.endpoint.fields.network.containment.containment.NetworkDomainContainment;
@@ -162,7 +165,8 @@ public class ConfigManagerHelper {
     }
 
     //This is almost identical to VBD's equivalent method
-    public ListenableFuture<String> readRlocInterface(@Nonnull String hostName, @Nonnull DataBroker vppDataBroker) {
+    public ListenableFuture<String> getLispDataRlocInterfaceName(@Nonnull String hostName,
+                                                                 @Nonnull DataBroker vppDataBroker) {
         Preconditions.checkNotNull(hostName, "Hostname is null!");
         Preconditions.checkNotNull(vppDataBroker, "Vpp DataBroker is null!");
 
@@ -248,6 +252,39 @@ public class ConfigManagerHelper {
         return ip != null;
     }
 
+    private String ipCidr(Interface intf) {
+        Interface2 augIntf = intf.getAugmentation(Interface2.class);
+
+        if (augIntf == null) {
+            return null;
+        }
+
+        Ipv4 ipv4 = augIntf.getIpv4();
+
+        if (ipv4 == null) {
+            return null;
+        }
+
+        final List<Address> addresses = ipv4.getAddress();
+
+        if (addresses == null || addresses.isEmpty()) {
+            return null;
+        }
+
+        Address firstAddress = addresses.get(0);
+        String ipString = firstAddress.getIp().getValue();
+        String length = "";
+        if (firstAddress.getSubnet().getImplementedInterface().equals(PrefixLength.class)) {
+            length = "" + ((PrefixLength)firstAddress.getSubnet()).getPrefixLength();
+        }
+
+        if (length.isEmpty()) {
+            return null;
+        }
+
+        return ipString + "/" + length;
+    }
+
     private boolean ipAddressPresent(final org.opendaylight.yang.gen.v1.urn.ietf.
             params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface intf) {
         final Interface1 augIntf = intf.getAugmentation(Interface1.class);
@@ -273,10 +310,43 @@ public class ConfigManagerHelper {
         return ip != null;
     }
 
+    public String getLispCpRlocInterfaceName(@Nonnull DataBroker vppDataBroker) {
+        List<Interface> operationalInterfaceList = InterfaceUtil.getOperationalInterfaces(vppDataBroker);
+
+        if (operationalInterfaceList == null) {
+            return null;
+        } else {
+            int maxLen = -1;
+            String outgoingInterface = "";
+
+            for (Interface intf : operationalInterfaceList) {
+                String ipCidr = ipCidr(intf);
+
+                if (ipCidr == null) {
+                    continue;
+                }
+
+                if (IpAddressUtil.ipInRange(ConfigUtil.getInstance().getOdlIp().getIpv4Address(),
+                        IpAddressUtil.startIpOfSubnet(ipCidr), IpAddressUtil.endIpOfSubnet(ipCidr))) {
+                    int tmpLen = IpAddressUtil.maskLen(ipCidr);
+                    if (tmpLen > maxLen) {
+                        maxLen = tmpLen;
+                        outgoingInterface = intf.getName();
+                    }
+                }
+            }
+            return outgoingInterface;
+        }
+    }
+
     public String constructLocatorSetName(int locatorSetCount) {
         return LispStateManager.DEFAULT_LOCATOR_SET_NAME_PREFIX + (locatorSetCount + 1);
     }
 
+    public String constructLocatorSetNameForItrRloc() {
+        return LispStateManager.DEFAULT_LOCATOR_SET_NAME_PREFIX + "_itr_rloc";
+    }
+
     public String constructEidMappingName(AddressEndpointWithLocation addressEp) {
         String interfaceName = getInterfaceName(addressEp).get();
         String ipAddress = getInterfaceIp(addressEp).getValue();
index ba40a8b19e1d565fb73904f65666cd81dc03ffcc..11e306aefd0e8f1cf625ebdf839393c31210c3c1 100644 (file)
@@ -20,4 +20,6 @@ public class Constants {
     public static final String GPE_ENTRY_PREFIX = "gpe-entry-";
     public static final String DUMMY_PROTOCOL_BRIDGE_DOMAIN = "bridge-domain-dummy-protocol";
     public static final String TENANT_INTERFACE = "tenant-interface";
+
+
 }
index b28104da75edb2c41b87b605cd8ff073b988324e..9795347874e68b1d4c8b0b1a75dc7144eb70db57 100644 (file)
@@ -66,4 +66,30 @@ public class IpAddressUtil {
         }
         return new ImmutablePair<>(new Ipv4Prefix(firstSubnet), new Ipv4Prefix(secondSubnet));
     }
+
+    public static boolean ipInRange(Ipv4Address ip, String startIpStr, String endIpStr) {
+        String ipStr = ip.getValue();
+
+        int startLim = InetAddresses.coerceToInteger(InetAddresses.forString(startIpStr));
+        int endLim = InetAddresses.coerceToInteger(InetAddresses.forString(endIpStr));
+        int ipNum = InetAddresses.coerceToInteger(InetAddresses.forString(ipStr));
+
+        long startUnsigned = Integer.toUnsignedLong(startLim);
+        long endUnsigned = Integer.toUnsignedLong(endLim);
+        long ipNumUnsigned = Integer.toUnsignedLong(ipNum);
+
+        return (startUnsigned <= ipNumUnsigned) && (ipNumUnsigned <= endUnsigned);
+    }
+
+    public static String startIpOfSubnet(String cidrNotion) {
+        return new SubnetUtils(cidrNotion).getInfo().getLowAddress();
+    }
+
+    public static String endIpOfSubnet(String cidrNotion) {
+        return new SubnetUtils(cidrNotion).getInfo().getHighAddress();
+    }
+
+    public static int maskLen(String cidrNotion) {
+        return Integer.valueOf(cidrNotion.split("/")[1]);
+    }
 }
\ No newline at end of file
diff --git a/renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/util/InterfaceUtil.java b/renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/util/InterfaceUtil.java
new file mode 100644 (file)
index 0000000..8a9f4cb
--- /dev/null
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 2017 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.groupbasedpolicy.renderer.vpp.util;
+
+import com.google.common.base.Optional;
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.InterfacesState;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+
+import java.util.List;
+
+/**
+ * Created by Shakib Ahmed on 7/18/17.
+ */
+public class InterfaceUtil {
+
+    public static List<Interface> getOperationalInterfaces(DataBroker vppDataBroker) {
+        final Optional<InterfacesState> opInterfaceState = GbpNetconfTransaction.read(vppDataBroker,
+                LogicalDatastoreType.OPERATIONAL, InstanceIdentifier.create(InterfacesState.class),
+                GbpNetconfTransaction.RETRY_COUNT);
+
+        if (!opInterfaceState.isPresent()) {
+            return null;
+        }
+
+        return opInterfaceState.get().getInterface();
+    }
+}
index a149b8fee9bd2ae14951e1cbded7643eaed56417..f2f8f21f8f471ec4f52dcbb6d436d8d36d5da4ed 100644 (file)
@@ -45,6 +45,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.gpe.rev1
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.gpe.rev170518.gpe.entry.table.grouping.gpe.entry.table.GpeEntry;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.gpe.rev170518.gpe.entry.table.grouping.gpe.entry.table.GpeEntryKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.gpe.rev170518.gpe.feature.data.grouping.GpeFeatureData;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev170315.ItrRemoteLocatorSetsGrouping;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev170315.Lisp;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev170315.dp.subtable.grouping.LocalMappings;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev170315.dp.subtable.grouping.local.mappings.LocalMapping;
@@ -53,6 +54,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev170315.eid.table.grouping.eid.table.VniTable;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev170315.eid.table.grouping.eid.table.VniTableKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev170315.eid.table.grouping.eid.table.vni.table.VrfSubtable;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev170315.itr.remote.locator.sets.grouping.ItrRemoteLocatorSet;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev170315.lisp.feature.data.grouping.LispFeatureData;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev170315.locator.sets.grouping.LocatorSets;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev170315.locator.sets.grouping.locator.sets.LocatorSet;
@@ -273,4 +275,9 @@ public class VppIidFactory {
                 .build();
     }
 
+    public static InstanceIdentifier<ItrRemoteLocatorSet> getItrRemoteLocatorSetIid() {
+        return getLispFeatureDataIid()
+                .child(ItrRemoteLocatorSet.class);
+    }
+
 }