--- /dev/null
+/*
+ * 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.NativeForwardPathDom;
+import org.opendaylight.groupbasedpolicy.renderer.vpp.util.VppIidFactory;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.gpe.rev170518._native.forward.paths.tables._native.forward.paths.table.NativeForwardPath;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.gpe.rev170518._native.forward.paths.tables._native.forward.paths.table.NativeForwardPathKey;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+
+/**
+ * Created by Shakib Ahmed on 6/13/17.
+ */
+public class ConfigureNativeForwardPathCommand extends AbstractLispCommand<NativeForwardPath> {
+ private NativeForwardPathDom nativeForwardPathDom;
+
+ public ConfigureNativeForwardPathCommand(NativeForwardPathDom nativeForwardPathDom) {
+ this.nativeForwardPathDom = nativeForwardPathDom;
+ }
+
+ @Override
+ public InstanceIdentifier<NativeForwardPath> getIid() {
+ return VppIidFactory.getNativeForwardPathIid(nativeForwardPathDom.getVrfId(),
+ new NativeForwardPathKey(nativeForwardPathDom.getNextHopIp()));
+ }
+
+ @Override
+ public NativeForwardPath getData() {
+ return nativeForwardPathDom.getSALObject();
+ }
+}
--- /dev/null
+/*
+ * 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.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;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Created by Shakib Ahmed on 6/21/17.
+ */
+public class DeleteGpeFeatureDataCommand extends AbstractLispCommand<GpeFeatureData> {
+ private static final Logger LOG = LoggerFactory.getLogger(DeleteGpeFeatureDataCommand.class);
+
+ @Override
+ public InstanceIdentifier<GpeFeatureData> getIid() {
+ return VppIidFactory.getGpeFeatureDataIid();
+ }
+
+ @Override
+ public GpeFeatureData getData() {
+ LOG.debug("Delete commands should not invoke getData()");
+ return null;
+ }
+}
--- /dev/null
+/*
+ * 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.util.VppIidFactory;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.gpe.rev170518.NativeForwardPathsTables;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Created by Shakib Ahmed on 6/21/17.
+ */
+public class DeleteNativeForwardPathsTablesDeleteCommand extends AbstractLispCommand<NativeForwardPathsTables> {
+ private static final Logger LOG = LoggerFactory.getLogger(DeleteNativeForwardPathsTablesDeleteCommand.class);
+
+
+ @Override
+ public InstanceIdentifier<NativeForwardPathsTables> getIid() {
+ return VppIidFactory.getNativeForwardPathsTablesIid();
+ }
+
+ @Override
+ public NativeForwardPathsTables getData() {
+ LOG.debug("Delete commands should not invoke getData()");
+ return null;
+ }
+}
import org.opendaylight.groupbasedpolicy.renderer.vpp.commands.lisp.dom.MapRegisterDom;
import org.opendaylight.groupbasedpolicy.renderer.vpp.commands.lisp.dom.MapResolverDom;
import org.opendaylight.groupbasedpolicy.renderer.vpp.commands.lisp.dom.MapServerDom;
+import org.opendaylight.groupbasedpolicy.renderer.vpp.commands.lisp.dom.NativeForwardPathDom;
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.NativeForwardPathsTables;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.gpe.rev170518._native.forward.paths.tables._native.forward.paths.table.NativeForwardPath;
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;
return new ConfigureItrRemoteLocatorSetCommand(itrRemoteLocatorSetDom);
}
+
+ public static AbstractLispCommand<NativeForwardPath> addNativeForwardEntry(long vrf,
+ IpAddress nextHopIp) {
+ NativeForwardPathDom nativeForwardPathDom = new NativeForwardPathDom();
+ nativeForwardPathDom.setVrfId(vrf);
+ nativeForwardPathDom.setNextHopIp(nextHopIp);
+ return new ConfigureNativeForwardPathCommand(nativeForwardPathDom);
+ }
+
+ public static AbstractLispCommand<GpeFeatureData> deleteGpeFeatureData() {
+ return new DeleteGpeFeatureDataCommand();
+ }
+
+ public static AbstractLispCommand<NativeForwardPathsTables> deleteNativeForwardPathsTables() {
+ return new DeleteNativeForwardPathsTablesDeleteCommand();
+ }
}
--- /dev/null
+/*
+ * 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.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.gpe.rev170518._native.forward.paths.tables._native.forward.paths.table.NativeForwardPath;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.gpe.rev170518._native.forward.paths.tables._native.forward.paths.table.NativeForwardPathBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.gpe.rev170518._native.forward.paths.tables._native.forward.paths.table.NativeForwardPathKey;
+
+/**
+ * Created by Shakib Ahmed on 6/13/17.
+ */
+public class NativeForwardPathDom implements CommandModel {
+ private IpAddress nextHopIp;
+ private String nextHopInterface;
+ private long vrfId;
+
+ public IpAddress getNextHopIp() {
+ return nextHopIp;
+ }
+
+ public void setNextHopIp(IpAddress nextHopIp) {
+ this.nextHopIp = nextHopIp;
+ }
+
+ public String getNextHopInterface() {
+ return nextHopInterface;
+ }
+
+ public void setNextHopInterface(String nextHopInterface) {
+ this.nextHopInterface = nextHopInterface;
+ }
+
+ public long getVrfId() {
+ return vrfId;
+ }
+
+ public void setVrfId(long vrfId) {
+ this.vrfId = vrfId;
+ }
+
+ @Override
+ public NativeForwardPath getSALObject() {
+ return new NativeForwardPathBuilder()
+ .setKey(new NativeForwardPathKey(nextHopIp))
+ .setNextHopAddress(nextHopIp)
+ .setNextHopInterface(nextHopInterface).build();
+ }
+}
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.gpe.rev170518.NativeForwardPathsTables;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.gpe.rev170518._native.forward.paths.tables._native.forward.paths.table.NativeForwardPath;
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;
}
}
+ private void addNativeForwardPath(EndpointHost endpointHost, long vrf, IpAddress nativeForwardIp)
+ throws LispConfigCommandFailedException {
+
+ AbstractLispCommand<NativeForwardPath> lispCommand =
+ LispCommandWrapper.addNativeForwardEntry(vrf, nativeForwardIp);
+ if (LispStateCommandExecutor.executePutCommand(endpointHost.getHostDataBroker(), lispCommand)) {
+ LOG.debug("Added {} as native forwarding IP");
+ } else {
+ throw new LispConfigCommandFailedException("Lisp add Native forward failed for VNI " + vrf);
+ }
+ }
+
private void addEidInEidTable(DataBroker vppDataBroker,
LispState lispState,
Eid eid,
if (lispState.eidCount() == 0) {
deleteLispStatesFromHost(endpointHost);
+ deleteNativeForwardPathsTables(endpointHost);
}
}
} catch (LispConfigCommandFailedException e) {
}
}
+ private void deleteNativeForwardPathsTables(EndpointHost endpointHost)
+ throws LispConfigCommandFailedException {
+ AbstractLispCommand<NativeForwardPathsTables> deleteNativeForwardPathsTables = LispCommandWrapper
+ .deleteNativeForwardPathsTables();
+
+ if (!LispStateCommandExecutor.executeDeleteCommand(endpointHost.getHostDataBroker(),
+ deleteNativeForwardPathsTables)) {
+ throw new LispConfigCommandFailedException("Delete Native Forward Paths Tables command failed!");
+ }
+ }
+
private long getVni(String tenantUuid) {
return neutronTenantToVniMapper.getVni(tenantUuid);
}
import org.opendaylight.groupbasedpolicy.renderer.vpp.commands.StaticArpCommand;
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.info.container.states.PhysicalInterfaces;
import org.opendaylight.groupbasedpolicy.renderer.vpp.lisp.info.container.states.PortInterfaces;
import org.opendaylight.groupbasedpolicy.renderer.vpp.lisp.info.container.states.PortRouteState;
import org.opendaylight.groupbasedpolicy.renderer.vpp.lisp.info.container.states.SubnetState;
import org.opendaylight.groupbasedpolicy.renderer.vpp.lisp.mappers.NeutronTenantToVniMapper;
import org.opendaylight.groupbasedpolicy.renderer.vpp.lisp.util.ConfigManagerHelper;
import org.opendaylight.groupbasedpolicy.renderer.vpp.lisp.util.Constants;
+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.MountedDataBrokerProvider;
if (!vrfHolderOfHost.hasVrf(vrfId)) {
if (!staticRoutingHelper.addRoutingProtocolForVrf(vppDataBroker, vrfId, vrfHolderOfHost)) {
+ addStaticRouteToPublicInterface(vppDataBroker, hostName, vrfId);
LOG.warn("Failed to add Routing protocol for host {} and vrf {}!", hostName, vrfId);
}
}
}
}
+ private void addStaticRouteToPublicInterface(DataBroker vppDataBroker, String hostName, long vrfId) {
+ Ipv4Address physicalInterfaceIp = hostRelatedInfoContainer
+ .getPhysicalInterfaceState(hostName)
+ .getIp(PhysicalInterfaces.PhysicalInterfaceType.PUBLIC).getIpv4Address();
+ String physicalInterfaceName = hostRelatedInfoContainer
+ .getPhysicalInterfaceState(hostName)
+ .getName(PhysicalInterfaces.PhysicalInterfaceType.PUBLIC);
+ if (physicalInterfaceName != null && !physicalInterfaceName.isEmpty()) {
+ if (!staticRoutingHelper.addSingleStaticRouteInRoutingProtocol(vppDataBroker,
+ hostName, vrfId, Constants.PUBLIC_SUBNET_UUID, physicalInterfaceIp,
+ IpAddressUtil.toIpV4Prefix(physicalInterfaceIp), physicalInterfaceName)) {
+ LOG.warn("Failed to add route for physical interface in vrf {} compute host {}", vrfId, hostName);
+ } else {
+ LOG.debug("Added route for physical interface {} in vrf {}", physicalInterfaceName, vrfId);
+ }
+ }
+ }
+
private void deleteStaticRoute(AddressEndpointWithLocation addressEp) {
DataBroker vppDataBroker = overlayHelper.getPotentialExternalDataBroker(addressEp).get();
String hostName = overlayHelper.getHostName(addressEp).get();
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";
-
+ public static final String PUBLIC_SUBNET_UUID = "public-interface-subnet-uuid";
}
return new ImmutablePair<>(new Ipv4Prefix(firstSubnet), new Ipv4Prefix(secondSubnet));
}
+ public static Ipv4Prefix toIpV4Prefix(Ipv4Address ipv4Address) {
+ return new Ipv4Prefix(ipv4Address.getValue() + "/32");
+ }
+
public static boolean ipInRange(Ipv4Address ip, String startIpStr, String endIpStr) {
String ipStr = ip.getValue();
fwManager.createDhcpRelay(rendererForwarding, vppNodesByL2Fd);
}
+ rEpKeys.forEach(rEpKey -> fwManager.createForwardingForEndpoint(rEpKey, policyCtx));
fwManager.syncNatEntries(policyCtx);
fwManager.syncRouting(policyCtx);
- rEpKeys.forEach(rEpKey -> fwManager.createForwardingForEndpoint(rEpKey, policyCtx));
}
private void rendererPolicyDeleted(RendererPolicy rendererPolicy) {
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.groupbasedpolicy.vpp_renderer.rev160425.Config;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.VppEndpoint;
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.NativeForwardPathsTables;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.gpe.rev170518._native.forward.paths.tables.NativeForwardPathsTable;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.gpe.rev170518._native.forward.paths.tables.NativeForwardPathsTableKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.gpe.rev170518._native.forward.paths.tables._native.forward.paths.table.NativeForwardPath;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.gpe.rev170518._native.forward.paths.tables._native.forward.paths.table.NativeForwardPathKey;
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;
.child(ItrRemoteLocatorSet.class);
}
+ public static InstanceIdentifier<NativeForwardPath> getNativeForwardPathIid(Long vrf,
+ NativeForwardPathKey nativeForwardPathKey) {
+ return InstanceIdentifier.builder(NativeForwardPathsTables.class)
+ .child(NativeForwardPathsTable.class, new NativeForwardPathsTableKey(vrf))
+ .child(NativeForwardPath.class, nativeForwardPathKey).build();
+ }
+
+ public static InstanceIdentifier<NativeForwardPathsTables> getNativeForwardPathsTablesIid() {
+ return InstanceIdentifier.builder(NativeForwardPathsTables.class).build();
+ }
+
}