Add implementation for addding GPE entry 39/58139/7
authorShakib Ahmed <sheikahm@cisco.com>
Thu, 1 Jun 2017 19:02:09 +0000 (12:02 -0700)
committerShakib Ahmed <sheikahm@cisco.com>
Thu, 15 Jun 2017 15:38:15 +0000 (08:38 -0700)
Change-Id: Ifac7c4c652f1f1891b17cc737e2de493789a2e7e
Signed-off-by: Shakib Ahmed <sheikahm@cisco.com>
renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/commands/lisp/ConfigureGpeCommand.java [new file with mode: 0644]
renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/commands/lisp/ConfigureGpeEntryCommand.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/GbpGpeEntryDom.java [new file with mode: 0644]
renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/commands/lisp/dom/GpeEnableDom.java [new file with mode: 0644]
renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/lisp/LispState.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/loopback/LoopbackManager.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/LispUtil.java
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/ConfigureGpeCommand.java b/renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/commands/lisp/ConfigureGpeCommand.java
new file mode 100644 (file)
index 0000000..3a2bc60
--- /dev/null
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 2017 Cisco Systems. 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.GpeEnableDom;
+import org.opendaylight.groupbasedpolicy.renderer.vpp.util.VppIidFactory;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.gpe.rev170518.gpe.feature.data.grouping.GpeFeatureData;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+
+/**
+ * Created by Shakib Ahmed on 6/1/17.
+ */
+public class ConfigureGpeCommand extends AbstractLispCommand<GpeFeatureData> {
+
+    private GpeEnableDom gpeEnableDom;
+
+    public ConfigureGpeCommand(GpeEnableDom gpeEnableDom) {
+        this.gpeEnableDom = gpeEnableDom;
+    }
+
+    @Override
+    public InstanceIdentifier<GpeFeatureData> getIid() {
+        return VppIidFactory.getGpeFeatureDataIid();
+    }
+
+    @Override
+    public GpeFeatureData getData() {
+        return gpeEnableDom.getSALObject();
+    }
+}
diff --git a/renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/commands/lisp/ConfigureGpeEntryCommand.java b/renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/commands/lisp/ConfigureGpeEntryCommand.java
new file mode 100644 (file)
index 0000000..24fb263
--- /dev/null
@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 2017 Cisco Systems. 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.GbpGpeEntryDom;
+import org.opendaylight.groupbasedpolicy.renderer.vpp.util.VppIidFactory;
+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.yangtools.yang.binding.InstanceIdentifier;
+
+/**
+ * Created by Shakib Ahmed on 6/1/17.
+ */
+public class ConfigureGpeEntryCommand extends AbstractLispCommand<GpeEntry> {
+
+    private GbpGpeEntryDom gpeEntryDom;
+
+    public ConfigureGpeEntryCommand(GbpGpeEntryDom gpeEntryDom) {
+        this.gpeEntryDom = gpeEntryDom;
+    }
+
+    @Override
+    public InstanceIdentifier<GpeEntry> getIid() {
+        return VppIidFactory.getGpeEntryIid(new GpeEntryKey(gpeEntryDom.getId()));
+    }
+
+    @Override
+    public GpeEntry getData() {
+        return gpeEntryDom.getSALObject();
+    }
+}
index 33dd40d8837dcb02b2c9e4b50bb7395f0942ea25..ca744038a9749ad4bde2d5c9305d74d2efdb6d3f 100644 (file)
@@ -8,6 +8,8 @@
 
 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.LispDom;
 import org.opendaylight.groupbasedpolicy.renderer.vpp.commands.lisp.dom.LocalMappingDom;
@@ -18,7 +20,11 @@ import org.opendaylight.groupbasedpolicy.renderer.vpp.commands.lisp.dom.MapServe
 import org.opendaylight.groupbasedpolicy.renderer.vpp.commands.lisp.dom.VniTableDom;
 import org.opendaylight.groupbasedpolicy.renderer.vpp.commands.lisp.dom.VrfSubtableDom;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
+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.gpe.entry.RemoteEid;
+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.Lisp;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev170315.MapReplyAction;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev170315.MappingId;
 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;
@@ -113,4 +119,32 @@ public class LispCommandWrapper {
     public static AbstractLispCommand<LispFeatureData> deleteLispFeatureData() {
         return new DeleteLispFeatureDataCommand();
     }
+
+    public static AbstractLispCommand<GpeFeatureData> enableGpe() {
+        GpeEnableDom gpeEnableDom = new GpeEnableDom();
+        gpeEnableDom.setEnabled(true);
+
+        return new ConfigureGpeCommand(gpeEnableDom);
+    }
+
+    public static AbstractLispCommand<GpeEntry> addGpeSendMapregisterAction(String entryName,
+                                                                            RemoteEid rEid,
+                                                                            long vni,
+                                                                            long vrf) {
+        GbpGpeEntryDom gpeEntryDom = new GbpGpeEntryDom();
+        gpeEntryDom.setId(entryName);
+        gpeEntryDom.setRemoteEid(rEid);
+        gpeEntryDom.setVni(vni);
+        gpeEntryDom.setVrf(vrf);
+        gpeEntryDom.setAction(MapReplyAction.SendMapRequest);
+
+        return new ConfigureGpeEntryCommand(gpeEntryDom);
+    }
+
+    public static AbstractLispCommand<GpeEntry> deleteGpeEntry(String entryName) {
+        GbpGpeEntryDom gpeEntryDom = new GbpGpeEntryDom();
+        gpeEntryDom.setId(entryName);
+
+        return new ConfigureGpeEntryCommand(gpeEntryDom);
+    }
 }
diff --git a/renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/commands/lisp/dom/GbpGpeEntryDom.java b/renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/commands/lisp/dom/GbpGpeEntryDom.java
new file mode 100644 (file)
index 0000000..75d91e8
--- /dev/null
@@ -0,0 +1,89 @@
+/*
+ * Copyright (c) 2017 Cisco Systems. 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 com.google.common.base.Preconditions;
+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.GpeEntryBuilder;
+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.entry.table.grouping.gpe.entry.table.gpe.entry.LocalEid;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.gpe.rev170518.gpe.entry.table.grouping.gpe.entry.table.gpe.entry.RemoteEid;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev170315.MapReplyAction;
+
+/**
+ * Created by Shakib Ahmed on 6/1/17.
+ */
+public class GbpGpeEntryDom implements CommandModel{
+    private String id;
+    private Long vrf;
+    private Long vni;
+    private LocalEid localEid;
+    private RemoteEid remoteEid;
+    private MapReplyAction action;
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public Long getVrf() {
+        return vrf;
+    }
+
+    public void setVrf(Long vrf) {
+        this.vrf = vrf;
+    }
+
+    public Long getVni() {
+        return vni;
+    }
+
+    public void setVni(Long vni) {
+        this.vni = vni;
+    }
+
+    public RemoteEid getRemoteEid() {
+        return remoteEid;
+    }
+
+    public void setRemoteEid(RemoteEid remoteEid) {
+        this.remoteEid = remoteEid;
+    }
+
+    public MapReplyAction getAction() {
+        return action;
+    }
+
+    public LocalEid getLocalEid() {
+        return localEid;
+    }
+
+    public void setLocalEid(LocalEid localEid) {
+        this.localEid = localEid;
+    }
+
+    public void setAction(MapReplyAction action) {
+        this.action = action;
+    }
+
+    @Override
+    public GpeEntry getSALObject() {
+        Preconditions.checkNotNull(id, "Gpe Entry Id need to be set!");
+        return new GpeEntryBuilder()
+                    .setKey(new GpeEntryKey(id))
+                    .setId(id)
+                    .setDpTable(vrf)
+                    .setVni(vni)
+                    .setRemoteEid(remoteEid)
+                    .setLocalEid(localEid)
+                    .setAction(action).build();
+    }
+}
diff --git a/renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/commands/lisp/dom/GpeEnableDom.java b/renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/commands/lisp/dom/GpeEnableDom.java
new file mode 100644 (file)
index 0000000..7ad4ca2
--- /dev/null
@@ -0,0 +1,31 @@
+/*
+ * Copyright (c) 2017 Cisco Systems. 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.gpe.rev170518.gpe.feature.data.grouping.GpeFeatureData;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.gpe.rev170518.gpe.feature.data.grouping.GpeFeatureDataBuilder;
+
+/**
+ * Created by Shakib Ahmed on 6/1/17.
+ */
+public class GpeEnableDom implements CommandModel {
+    private boolean enabled;
+
+    public boolean isEnabled() {
+        return enabled;
+    }
+
+    public void setEnabled(boolean enabled) {
+        this.enabled = enabled;
+    }
+
+    @Override
+    public GpeFeatureData getSALObject() {
+        return new GpeFeatureDataBuilder().setEnable(enabled).build();
+    }
+}
index 418fc56e89db564fb352f2feade7391d516e27d8..3dd38185c0856d4894e66970a10c7c1d4f4160ba 100644 (file)
@@ -22,6 +22,7 @@ import java.util.Set;
 public class LispState {
     private String hostName;
     private boolean lispEnabled;
+    private boolean gpeEnabled;
     private HashMap<String, String> locIntfToLocSetNameMapping;
     private Set<IpAddress> mapServerIpAddressSet;
     private Set<IpAddress> mapResolverIpAddressSet;
@@ -54,6 +55,14 @@ public class LispState {
         this.lispEnabled = lispEnabled;
     }
 
+    public boolean isGpeEnabled() {
+        return gpeEnabled;
+    }
+
+    public void setGpeEnabled(boolean gpeEnabled) {
+        this.gpeEnabled = gpeEnabled;
+    }
+
     public String getLocIntfToLocSetNameMapping(String locatorIntf) {
         return locIntfToLocSetNameMapping.get(locatorIntf);
     }
index c8684b4d8dd04453acf0138836be3ae4c19456c4..6e7dbf4cca53f413180c6ff96985fe6cf4a151bf 100644 (file)
@@ -21,6 +21,7 @@ import org.opendaylight.groupbasedpolicy.renderer.vpp.util.General;
 import org.opendaylight.groupbasedpolicy.renderer.vpp.util.MountedDataBrokerProvider;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.endpoints.AddressEndpointWithLocation;
+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.Lisp;
 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;
@@ -92,6 +93,11 @@ public class LispStateManager {
             lispStateOfNode = new LispState(hostName);
             try {
                 enableLispForNode(vppDataBroker, lispStateOfNode);
+
+                if (ConfigUtil.getInstance().isL3FlatEnabled()) {
+                    enableGpeForNode(vppDataBroker, lispStateOfNode);
+                }
+
                 addLocatorSet(vppDataBroker, lispStateOfNode);
                 addMapResolver(vppDataBroker, lispStateOfNode);
                 if (ConfigUtil.getInstance().isLispMapRegisterEnabled()) {
@@ -143,6 +149,16 @@ public class LispStateManager {
         }
     }
 
+    private void enableGpeForNode(DataBroker vppDataBroker, LispState lispState) throws LispConfigCommandFailedException {
+        AbstractLispCommand<GpeFeatureData>
+                gpeEnableCommand = LispCommandWrapper.enableGpe();
+        if (LispStateCommandExecutor.executePutCommand(vppDataBroker, gpeEnableCommand)) {
+            lispState.setGpeEnabled(true);
+        } else {
+            throw new LispConfigCommandFailedException("GPE Enable Command failed execution!");
+        }
+    }
+
     private void addLocatorSet(DataBroker vppDataBroker, LispState lispState) throws LispNotFoundException, LispConfigCommandFailedException {
         try {
             String locatorSetName = lispStateHelper.constructLocatorSetName(lispState.getLocatorCount());
index 84c2ca98524ad6098b1c73846231b1d6d8315a08..ba66a74c258efece927a98e1d50a1f8a8d45795f 100644 (file)
@@ -14,7 +14,11 @@ import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.groupbasedpolicy.renderer.vpp.commands.LoopbackCommand;
 import org.opendaylight.groupbasedpolicy.renderer.vpp.commands.LoopbackCommandWrapper;
 import org.opendaylight.groupbasedpolicy.renderer.vpp.commands.ProxyRangeCommand;
+import org.opendaylight.groupbasedpolicy.renderer.vpp.commands.lisp.AbstractLispCommand;
+import org.opendaylight.groupbasedpolicy.renderer.vpp.commands.lisp.LispCommandWrapper;
+import org.opendaylight.groupbasedpolicy.renderer.vpp.lisp.LispStateCommandExecutor;
 import org.opendaylight.groupbasedpolicy.renderer.vpp.lisp.exception.LispConfigCommandFailedException;
+import org.opendaylight.groupbasedpolicy.renderer.vpp.lisp.exception.LispHelperArgumentException;
 import org.opendaylight.groupbasedpolicy.renderer.vpp.lisp.mappers.LoopbackHostSpecificInfoMapper;
 import org.opendaylight.groupbasedpolicy.renderer.vpp.lisp.mappers.NeutronTenantToVniMapper;
 import org.opendaylight.groupbasedpolicy.renderer.vpp.lisp.mappers.SubnetUuidToGbpSubnetMapper;
@@ -22,6 +26,7 @@ import org.opendaylight.groupbasedpolicy.renderer.vpp.lisp.util.ConfigManagerHel
 import org.opendaylight.groupbasedpolicy.renderer.vpp.lisp.util.IpAddressUtil;
 import org.opendaylight.groupbasedpolicy.renderer.vpp.util.GbpNetconfTransaction;
 import org.opendaylight.groupbasedpolicy.renderer.vpp.util.General;
+import org.opendaylight.groupbasedpolicy.renderer.vpp.util.LispUtil;
 import org.opendaylight.groupbasedpolicy.renderer.vpp.util.MountedDataBrokerProvider;
 import org.opendaylight.groupbasedpolicy.renderer.vpp.util.VppIidFactory;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;
@@ -29,8 +34,11 @@ 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.interfaces.rev140508.interfaces.Interface;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceBuilder;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceKey;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.Ipv4PrefixAfi;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.endpoints.AddressEndpointWithLocation;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.GbpSubnet;
+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.gpe.entry.RemoteEid;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.unnumbered.interfaces.rev170510.InterfaceUnnumberedAugmentation;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.unnumbered.interfaces.rev170510.InterfaceUnnumberedAugmentationBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.unnumbered.interfaces.rev170510.unnumbered.config.attributes.UnnumberedBuilder;
@@ -54,6 +62,7 @@ public class LoopbackManager {
     private SubnetUuidToGbpSubnetMapper subnetUuidToGbpSubnetMapper;
 
     private static final String LOOP_NAME_PREFIX = "loop-";
+    private static final String GPE_ENTRY_PREFIX = "gpe-entry-";
 
     public LoopbackManager(@Nonnull MountedDataBrokerProvider mountedDataBrokerProvider) {
         this.loopbackManagerHelper = new ConfigManagerHelper(mountedDataBrokerProvider);
@@ -116,6 +125,7 @@ public class LoopbackManager {
 
             createLoopbackInterface(hostName, subnetUuid, vppDataBroker, simpleLoopbackCommand);
             addProxyArpRange(vppDataBroker, vrf, gbpSubnetInfo, hostName);
+            addGpeEntry(vppDataBroker, gbpSubnetInfo, vni);
             addUnnumberedInterface(addressEp, interfaceName);
         } catch (LispConfigCommandFailedException e) {
             LOG.warn("LISP couldn't be configured: {}", e.getMessage());
@@ -167,6 +177,8 @@ public class LoopbackManager {
             try {
                 deleteSpecificLoopback(vppDataBroker, interfaceName);
                 deleteProxyArpRange(vppDataBroker, vni, gbpSubnetInfo, hostId);
+                deleteGpeEntry(vppDataBroker, GPE_ENTRY_PREFIX + gbpSubnetInfo.getId() + "_1");
+                deleteGpeEntry(vppDataBroker, GPE_ENTRY_PREFIX + gbpSubnetInfo.getId() + "_2");
             } catch (LispConfigCommandFailedException e) {
                 LOG.warn("Loopback not deleted properly: {}", e.getMessage());
             }
@@ -281,6 +293,42 @@ public class LoopbackManager {
                 GbpNetconfTransaction.RETRY_COUNT);
     }
 
+    private void addGpeEntry(DataBroker vppDataBroker, GbpSubnet gbpSubnetInfo, long vni) {
+        try {
+            Pair<Ipv4Prefix, Ipv4Prefix> delegatingSubnets = IpAddressUtil
+                    .getSmallerSubnet(gbpSubnetInfo.getCidr().getIpv4Prefix());
+
+            RemoteEid firstREid = LispUtil.toRemoteEid(LispUtil.toLispIpv4Prefix(delegatingSubnets.getLeft()),
+                                                       vni,
+                                                       Ipv4PrefixAfi.class);
+            putGpeEntry(vppDataBroker, GPE_ENTRY_PREFIX + gbpSubnetInfo.getId() + "_1", firstREid, vni, vni);
+
+            if (delegatingSubnets.getLeft().equals(delegatingSubnets.getRight())) {
+                return;
+            }
+
+            RemoteEid secondREid = LispUtil.toRemoteEid(LispUtil.toLispIpv4Prefix(delegatingSubnets.getRight()),
+                                                        vni,
+                                                        Ipv4PrefixAfi.class);
+
+            putGpeEntry(vppDataBroker, GPE_ENTRY_PREFIX + gbpSubnetInfo.getId() + "_2", secondREid, vni, vni);
+        } catch (LispHelperArgumentException e) {
+            e.printStackTrace();
+        }
+    }
+
+    private boolean putGpeEntry(DataBroker vppDataBroker, String id, RemoteEid rEid, long vni, long vrf) {
+        AbstractLispCommand<GpeEntry> gpeEntryCommand = LispCommandWrapper
+                .addGpeSendMapregisterAction(id, rEid, vni, vrf);
+        return LispStateCommandExecutor.executePutCommand(vppDataBroker, gpeEntryCommand);
+    }
+
+    private boolean deleteGpeEntry(DataBroker vppDataBroker, String id) {
+        AbstractLispCommand<GpeEntry> gpeEntryDeletionCommand = LispCommandWrapper
+                .deleteGpeEntry(id);
+        return LispStateCommandExecutor.executeDeleteCommand(vppDataBroker, gpeEntryDeletionCommand);
+    }
+
     private long getVni(String tenantUuid) {
         return neutronTenantToVniMapper.getVni(tenantUuid);
     }
index 7d135cf35e182808ed0a62891520b91029415f3d..2660b634f1696969bafd7aa231813d1794028b5b 100644 (file)
@@ -8,16 +8,24 @@
 
 package org.opendaylight.groupbasedpolicy.renderer.vpp.lisp.util;
 
+import com.google.common.net.InetAddresses;
 import org.apache.commons.lang3.tuple.ImmutablePair;
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.commons.net.util.SubnetUtils;
+import org.opendaylight.groupbasedpolicy.renderer.vpp.lisp.exception.LispHelperArgumentException;
 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.Ipv4Prefix;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.net.InetAddress;
+import java.net.UnknownHostException;
 
 /**
  * Created by Shakib Ahmed on 5/3/17.
  */
 public class IpAddressUtil {
+    private static final Logger LOG = LoggerFactory.getLogger(IpAddressUtil.class);
 
     public static Pair<Ipv4Address, Ipv4Address> getStartAndEndIp(Ipv4Prefix ipv4Prefix) {
         SubnetUtils subnetUtils = new SubnetUtils(ipv4Prefix.getValue());
@@ -26,4 +34,32 @@ public class IpAddressUtil {
         Ipv4Address highIp = new Ipv4Address(prefixSubnetInfo.getHighAddress());
         return new ImmutablePair<>(lowIp, highIp);
     }
+
+    public static Pair<Ipv4Prefix, Ipv4Prefix> getSmallerSubnet(Ipv4Prefix ipv4Prefix) throws LispHelperArgumentException {
+        String cidrNotion = ipv4Prefix.getValue();
+
+        SubnetUtils subnetUtils = new SubnetUtils(cidrNotion);
+        String firstSubnet;
+        String secondSubnet;
+        int maskLen = Integer.valueOf(cidrNotion.split("/")[1]) + 1;
+
+        if (maskLen > 32) {
+            return new ImmutablePair<>(ipv4Prefix, ipv4Prefix);
+        }
+
+        SubnetUtils.SubnetInfo subnetInfo = subnetUtils.getInfo();
+        try {
+            int lowValue = InetAddresses.coerceToInteger(InetAddress.getByName(subnetInfo.getNetworkAddress()));
+            int highValue = InetAddresses.coerceToInteger(InetAddress.getByName(subnetInfo.getHighAddress())) + 1;
+            InetAddress middleAddress = InetAddresses.fromInteger(lowValue + (highValue - lowValue + 1) / 2);
+            String firstAddress = subnetInfo.getNetworkAddress();
+            String secondAddress = middleAddress.getHostAddress();
+            firstSubnet = firstAddress + "/" + maskLen;
+            secondSubnet = secondAddress + "/" + maskLen;
+        } catch (UnknownHostException e) {
+            LOG.warn("Failed to translate IP address " + cidrNotion+ " to smaller subnet");
+            throw new LispHelperArgumentException("Invalid argument for subnet " + cidrNotion);
+        }
+        return new ImmutablePair<>(new Ipv4Prefix(firstSubnet), new Ipv4Prefix(secondSubnet));
+    }
 }
\ No newline at end of file
index 59be81f2c9f3f0e89151cfd3a9abda2e60a9455b..874376d16c49c50d5a9f18589b69f42d9acc4d23 100644 (file)
@@ -11,10 +11,17 @@ package org.opendaylight.groupbasedpolicy.renderer.vpp.util;
 import org.opendaylight.groupbasedpolicy.renderer.vpp.commands.lisp.dom.EidDom;
 import org.opendaylight.groupbasedpolicy.renderer.vpp.commands.lisp.dom.HmacKeyDom;
 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.lisp.address.types.rev151105.InstanceIdType;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.LispAddressFamily;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.Address;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv4;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv4Builder;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv4Prefix;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv4PrefixBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.gpe.rev170518.gpe.entry.table.grouping.gpe.entry.table.gpe.entry.LocalEid;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.gpe.rev170518.gpe.entry.table.grouping.gpe.entry.table.gpe.entry.LocalEidBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.gpe.rev170518.gpe.entry.table.grouping.gpe.entry.table.gpe.entry.RemoteEid;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.gpe.rev170518.gpe.entry.table.grouping.gpe.entry.table.gpe.entry.RemoteEidBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev170315.HmacKeyType;
 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.hmac.key.grouping.HmacKey;
@@ -37,6 +44,22 @@ public class LispUtil {
         return eidDom.getSALObject();
     }
 
+    public static RemoteEid toRemoteEid(Address address, long vni, Class<? extends LispAddressFamily> addressType) {
+        RemoteEidBuilder remoteEidBuilder = new RemoteEidBuilder();
+        remoteEidBuilder.setAddress(address);
+        remoteEidBuilder.setVirtualNetworkId(new InstanceIdType(vni));
+        remoteEidBuilder.setAddressType(addressType);
+        return remoteEidBuilder.build();
+    }
+
+    public static LocalEid toLocalEid(Address address, long vni, Class<? extends LispAddressFamily> addressType) {
+        LocalEidBuilder localEidBuilder = new LocalEidBuilder();
+        localEidBuilder.setAddress(address);
+        localEidBuilder.setVirtualNetworkId(new InstanceIdType(vni));
+        localEidBuilder.setAddressType(addressType);
+        return localEidBuilder.build();
+    }
+
     public static HmacKey toHmacKey(HmacKeyType keyType, String key) {
         HmacKeyDom hmacKeyDom = new HmacKeyDom();
         hmacKeyDom.setKey(key);
@@ -59,4 +82,9 @@ public class LispUtil {
 
         return new Ipv4Builder().setIpv4(new Ipv4Address(strArray[0])).build();
     }
+
+    public static Ipv4Prefix toLispIpv4Prefix(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf
+                                                  .inet.types.rev130715.Ipv4Prefix ipv4Prefix) {
+        return new Ipv4PrefixBuilder().setIpv4Prefix(ipv4Prefix).build();
+    }
 }
index 2a65378966e61141603e1bb1e566b001f2774522..847be64ea9351969078f4439090fe35ca590aa9f 100644 (file)
@@ -38,6 +38,11 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.nodes.RendererNode;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.nodes.RendererNodeKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang._interface.acl.rev161214.VppAclInterfaceAugmentation;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.gpe.rev170518.Gpe;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.gpe.rev170518.gpe.entry.table.grouping.GpeEntryTable;
+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.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;
@@ -237,4 +242,17 @@ public class VppIidFactory {
                 .augmentation(InterfaceUnnumberedAugmentation.class)
                 .child(Unnumbered.class);
     }
+
+    public static InstanceIdentifier<GpeFeatureData> getGpeFeatureDataIid() {
+        return InstanceIdentifier.builder(Gpe.class)
+                .child(GpeFeatureData.class).build();
+    }
+
+    public static InstanceIdentifier<GpeEntry> getGpeEntryIid(GpeEntryKey gpeEntryKey) {
+        return InstanceIdentifier.builder(Gpe.class)
+                .child(GpeFeatureData.class)
+                .child(GpeEntryTable.class)
+                .child(GpeEntry.class, gpeEntryKey)
+                .build();
+    }
 }