--- /dev/null
+/*
+ * 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();
+ }
+}
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;
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;
return new ConfigureGpeEntryCommand(gpeEntryDom);
}
+
+ public static AbstractLispCommand<ItrRemoteLocatorSet> addItrRloc(String locatorSetName) {
+ ItrRemoteLocatorSetDom itrRemoteLocatorSetDom = new ItrRemoteLocatorSetDom();
+ itrRemoteLocatorSetDom.setLocatorSetName(locatorSetName);
+
+ return new ConfigureItrRemoteLocatorSetCommand(itrRemoteLocatorSetDom);
+ }
}
--- /dev/null
+/*
+ * 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();
+ }
+}
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;
private static final ConfigUtil INSTANCE = new ConfigUtil();
private ConfigUtil() {
- configureOdlTenantIp(null);
+ configureOdlIp(null);
configureLispOverlayEnabled(null);
configureMapRegister(null);
configL3FlatEnabled(null);
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",
l3FlatEnabled = configStr.trim().equalsIgnoreCase(DEFAULT_TRUE_STRING_VALUE);
}
- public IpAddress getOdlTenantIp() {
+ public IpAddress getOdlIp() {
return odlTenantIp;
}
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,
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;
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.
}
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);
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;
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;
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;
}
//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!");
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);
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();
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";
+
+
}
}
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
--- /dev/null
+/*
+ * 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();
+ }
+}
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;
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;
.build();
}
+ public static InstanceIdentifier<ItrRemoteLocatorSet> getItrRemoteLocatorSetIid() {
+ return getLispFeatureDataIid()
+ .child(ItrRemoteLocatorSet.class);
+ }
+
}