--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright (c) 2017 Inocybe Technologies 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
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.opendaylight.netvirt</groupId>
+ <artifactId>binding-parent</artifactId>
+ <version>0.6.0-SNAPSHOT</version>
+ <relativePath>../../commons/binding-parent</relativePath>
+ </parent>
+
+ <artifactId>cache-impl</artifactId>
+ <name>ODL :: netvirt :: ${project.artifactId}</name>
+ <packaging>bundle</packaging>
+
+ <dependencies>
+ <dependency>
+ <groupId>${project.groupId}</groupId>
+ <artifactId>neutronvpn-api</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.ops4j.pax.cdi</groupId>
+ <artifactId>pax-cdi-api</artifactId>
+ <optional>true</optional>
+ </dependency>
+ </dependencies>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.aries.blueprint</groupId>
+ <artifactId>blueprint-maven-plugin</artifactId>
+ </plugin>
+ </plugins>
+ </build>
+
+</project>
--- /dev/null
+/*
+ * Copyright (c) 2017 Inocybe Technologies 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.netvirt.cache.impl.l2gw;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+import javax.inject.Singleton;
+import org.opendaylight.netvirt.neutronvpn.api.l2gw.L2GatewayCache;
+import org.opendaylight.netvirt.neutronvpn.api.l2gw.L2GatewayDevice;
+import org.ops4j.pax.cdi.api.OsgiServiceProvider;
+
+/**
+ * Implementation of L2GatewayCache.
+ *
+ * @author Thomas Pantelis
+ */
+@Singleton
+@OsgiServiceProvider(classes = L2GatewayCache.class)
+public class L2GatewayCacheImpl implements L2GatewayCache {
+ private final ConcurrentMap<String, L2GatewayDevice> cache = new ConcurrentHashMap<>();
+
+ @Override
+ public L2GatewayDevice addOrGet(String deviceName) {
+ return cache.computeIfAbsent(deviceName, key -> new L2GatewayDevice(deviceName));
+ }
+
+ @Override
+ public L2GatewayDevice remove(String deviceName) {
+ return deviceName != null ? cache.remove(deviceName) : null;
+ }
+
+ @Override
+ public L2GatewayDevice get(String deviceName) {
+ return deviceName != null ? cache.get(deviceName) : null;
+ }
+
+ @Override
+ public Collection<L2GatewayDevice> getAll() {
+ return Collections.unmodifiableCollection(cache.values());
+ }
+}
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
+ <!-- The bundle uses blueprint annotations but we still need an empty file here so the plugin
+ puts the generated xml file under org/opendaylight/blueprint.
+ -->
+</blueprint>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright (c) 2017 Inocybe Technologies 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
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.opendaylight.odlparent</groupId>
+ <artifactId>odlparent-lite</artifactId>
+ <version>2.0.5</version>
+ <relativePath/>
+ </parent>
+
+ <groupId>org.opendaylight.netvirt</groupId>
+ <artifactId>cache</artifactId>
+ <version>0.6.0-SNAPSHOT</version>
+ <name>ODL :: netvirt :: ${project.artifactId}</name>
+ <packaging>pom</packaging>
+
+ <modules>
+ <module>impl</module>
+ </modules>
+
+ <!-- DO NOT install or deploy the repo root pom as it's only needed to initiate a build -->
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-deploy-plugin</artifactId>
+ <configuration>
+ <skip>true</skip>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-install-plugin</artifactId>
+ <configuration>
+ <skip>true</skip>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+
+</project>
import org.opendaylight.mdsal.eos.binding.api.EntityOwnershipService;
import org.opendaylight.netvirt.dhcpservice.api.DhcpMConstants;
import org.opendaylight.netvirt.elanmanager.utils.ElanL2GwCacheUtils;
+import org.opendaylight.netvirt.neutronvpn.api.l2gw.L2GatewayCache;
import org.opendaylight.netvirt.neutronvpn.api.l2gw.L2GatewayDevice;
-import org.opendaylight.netvirt.neutronvpn.api.l2gw.utils.L2GatewayCacheUtils;
import org.opendaylight.netvirt.neutronvpn.api.utils.NeutronUtils;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface;
private final EntityOwnershipUtils entityOwnershipUtils;
private final IInterfaceManager interfaceManager;
private final JobCoordinator jobCoordinator;
+ private final L2GatewayCache l2GatewayCache;
private final ConcurrentMap<BigInteger, Set<Pair<IpAddress, String>>> designatedDpnsToTunnelIpElanNameCache =
new ConcurrentHashMap<>();
public DhcpExternalTunnelManager(final DataBroker broker,
final IMdsalApiManager mdsalUtil, final ItmRpcService itmRpcService,
final EntityOwnershipService entityOwnershipService, final IInterfaceManager interfaceManager,
- final JobCoordinator jobCoordinator) {
+ final JobCoordinator jobCoordinator, final L2GatewayCache l2GatewayCache) {
this.broker = broker;
this.mdsalUtil = mdsalUtil;
this.itmRpcService = itmRpcService;
this.entityOwnershipUtils = new EntityOwnershipUtils(entityOwnershipService);
this.interfaceManager = interfaceManager;
this.jobCoordinator = jobCoordinator;
+ this.l2GatewayCache = l2GatewayCache;
}
@PostConstruct
}
private L2GatewayDevice getDeviceFromTunnelIp(String elanInstanceName, IpAddress tunnelIp) {
- ConcurrentMap<String, L2GatewayDevice> devices = L2GatewayCacheUtils.getCache();
+ Collection<L2GatewayDevice> devices = l2GatewayCache.getAll();
LOG.trace("In getDeviceFromTunnelIp devices {}", devices);
- for (L2GatewayDevice device : devices.values()) {
+ for (L2GatewayDevice device : devices) {
if (tunnelIp.equals(device.getTunnelIp())) {
return device;
}
import com.google.common.base.Optional;
import java.util.List;
-import java.util.concurrent.ConcurrentMap;
import java.util.function.Predicate;
import javax.inject.Inject;
import javax.inject.Singleton;
import org.opendaylight.controller.md.sal.binding.api.DataBroker;
import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
import org.opendaylight.genius.mdsalutil.MDSALUtil;
+import org.opendaylight.netvirt.neutronvpn.api.l2gw.L2GatewayCache;
import org.opendaylight.netvirt.neutronvpn.api.l2gw.L2GatewayDevice;
-import org.opendaylight.netvirt.neutronvpn.api.l2gw.utils.L2GatewayCacheUtils;
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.ovsdb.hwvtep.rev150901.HwvtepGlobalAugmentation;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.PhysicalSwitchAugmentation;
};
private final DataBroker dataBroker;
+ private final L2GatewayCache l2GatewayCache;
@Inject
- public DhcpL2GwUtil(DataBroker dataBroker) {
+ public DhcpL2GwUtil(DataBroker dataBroker, L2GatewayCache l2GatewayCache) {
this.dataBroker = dataBroker;
+ this.l2GatewayCache = l2GatewayCache;
}
public IpAddress getHwvtepNodeTunnelIp(InstanceIdentifier<Node> nodeIid) {
- ConcurrentMap<String, L2GatewayDevice> devices = L2GatewayCacheUtils.getCache();
String nodeId = nodeIid.firstKeyOf(Node.class).getNodeId().getValue();
L2GatewayDevice targetDevice = null;
- for (L2GatewayDevice device : devices.values()) {
+ for (L2GatewayDevice device : l2GatewayCache.getAll()) {
if (nodeId.equals(device.getHwvtepNodeId())) {
targetDevice = device;
break;
interface="org.opendaylight.netvirt.elanmanager.api.IElanService" />
<reference id="jobCoordinator"
interface="org.opendaylight.infrautils.jobcoordinator.JobCoordinator" />
+ <reference id="l2GatewayCache"
+ interface="org.opendaylight.netvirt.neutronvpn.api.l2gw.L2GatewayCache"/>
<odl:rpc-service id="odlInterfaceRpcService"
interface="org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rpcs.rev160406.OdlInterfaceRpcService" />
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintStream;
+import java.util.Collection;
import java.util.Map;
import java.util.Map.Entry;
import java.util.concurrent.ConcurrentMap;
import org.opendaylight.genius.utils.cache.CacheUtil;
import org.opendaylight.genius.utils.hwvtep.HwvtepHACache;
import org.opendaylight.netvirt.elanmanager.utils.ElanL2GwCacheUtils;
+import org.opendaylight.netvirt.neutronvpn.api.l2gw.L2GatewayCache;
import org.opendaylight.netvirt.neutronvpn.api.l2gw.L2GatewayDevice;
-import org.opendaylight.netvirt.neutronvpn.api.l2gw.utils.L2GatewayCacheUtils;
import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
@Command(scope = "l2gw", name = "show-cache", description = "display l2gateways cache")
public class L2GwUtilsCacheCli extends OsgiCommandSupport {
+ private static final String L2GATEWAY_CACHE_NAME = "L2GW";
private static final String DEMARCATION = "=================================";
@Option(name = "-cache", aliases = {"--cache"}, description = "cache name",
required = false, multiValued = false)
String elanName;
+ private final L2GatewayCache l2GatewayCache;
+
+ public L2GwUtilsCacheCli(L2GatewayCache l2GatewayCache) {
+ this.l2GatewayCache = l2GatewayCache;
+ }
+
@Override
protected Object doExecute() throws IOException {
if (cacheName == null) {
session.getConsole().println("Available caches");
session.getConsole().println(ElanL2GwCacheUtils.L2GATEWAY_CONN_CACHE_NAME);
- session.getConsole().println(L2GatewayCacheUtils.L2GATEWAY_CACHE_NAME);
+ session.getConsole().println(L2GATEWAY_CACHE_NAME);
session.getConsole().println("HA");
session.getConsole().println("HA_EVENTS");
return null;
case ElanL2GwCacheUtils.L2GATEWAY_CONN_CACHE_NAME:
dumpElanL2GwCache();
break;
- case L2GatewayCacheUtils.L2GATEWAY_CACHE_NAME:
+ case L2GATEWAY_CACHE_NAME:
dumpL2GwCache();
break;
case "HA":
}
private void dumpL2GwCache() {
- ConcurrentMap<String, L2GatewayDevice> devices = (ConcurrentMap<String, L2GatewayDevice>) CacheUtil
- .getCache(L2GatewayCacheUtils.L2GATEWAY_CACHE_NAME);
- if (devices == null) {
+ Collection<L2GatewayDevice> devices = l2GatewayCache.getAll();
+ if (devices.isEmpty()) {
session.getConsole().println("no devices are present in cache");
return;
}
- for (L2GatewayDevice device : devices.values()) {
+ for (L2GatewayDevice device : devices) {
session.getConsole().println("device " + device);
}
}
import org.opendaylight.netvirt.elan.l2gw.utils.L2GatewayConnectionUtils;
import org.opendaylight.netvirt.elan.utils.ElanConstants;
import org.opendaylight.netvirt.elanmanager.utils.ElanL2GwCacheUtils;
+import org.opendaylight.netvirt.neutronvpn.api.l2gw.L2GatewayCache;
import org.opendaylight.netvirt.neutronvpn.api.l2gw.L2GatewayDevice;
-import org.opendaylight.netvirt.neutronvpn.api.l2gw.utils.L2GatewayCacheUtils;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Uri;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
private final Map<InstanceIdentifier<Node>, Map<InstanceIdentifier, DataObject>> configNodesData =
new HashMap<>();
+ private final DataBroker dataBroker;
+ private final L2GatewayCache l2GatewayCache;
+
private List<L2gateway> l2gateways;
private List<L2gatewayConnection> l2gatewayConnections;
- private DataBroker dataBroker;
private PrintWriter pw;
- public void setDataBroker(DataBroker dataBroker) {
+ public L2GwValidateCli(DataBroker dataBroker, L2GatewayCache l2GatewayCache) {
this.dataBroker = dataBroker;
+ this.l2GatewayCache = l2GatewayCache;
}
@Override
for (Devices device : devices) {
- L2GatewayDevice l2GatewayDevice = L2GatewayCacheUtils.getL2DeviceFromCache(device.getDeviceName());
+ L2GatewayDevice l2GatewayDevice = l2GatewayCache.get(device.getDeviceName());
isValid = verifyL2GatewayDevice(l2gateway, device, l2GatewayDevice);
if (!isValid) {
continue;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
-import java.util.Map.Entry;
import java.util.Set;
-import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.ExecutionException;
import org.opendaylight.controller.md.sal.binding.api.DataObjectModification;
import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
import org.opendaylight.genius.utils.hwvtep.HwvtepHACache;
import org.opendaylight.netvirt.elan.l2gw.ha.commands.SwitchesCmd;
-import org.opendaylight.netvirt.neutronvpn.api.l2gw.L2GatewayDevice;
-import org.opendaylight.netvirt.neutronvpn.api.l2gw.utils.L2GatewayCacheUtils;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Uri;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.HwvtepGlobalAugmentation;
}
}
- public static void updateL2GwCacheNodeId(Node updatedChildNode, InstanceIdentifier<Node> iid) {
- String haNodeIdVal = getNodeIdVal(iid);
- ConcurrentMap<String, L2GatewayDevice> l2Devices = L2GatewayCacheUtils.getCache();
- if (l2Devices != null) {
- for (Entry<String, L2GatewayDevice> entry : l2Devices.entrySet()) {
- String psName = entry.getKey();
- L2GatewayDevice l2Device = entry.getValue();
- if (updatedChildNode.getNodeId().getValue().equals(l2Device.getHwvtepNodeId())) {
- LOG.info("Replaced the l2gw device cache entry for device {} with val {}",
- l2Device.getDeviceName(), l2Device.getHwvtepNodeId());
- l2Device.setHwvtepNodeId(haNodeIdVal);
- L2GatewayCacheUtils.addL2DeviceToCache(psName, l2Device);
- }
- }
- }
- }
-
/**
* Delete switches from Node in Operational Data Tree .
*
import java.util.Collections;
import java.util.HashSet;
+import java.util.List;
import java.util.Objects;
import java.util.Set;
import java.util.concurrent.ExecutionException;
import org.opendaylight.netvirt.elan.l2gw.utils.L2gwServiceProvider;
import org.opendaylight.netvirt.elan.utils.ElanClusterUtils;
import org.opendaylight.netvirt.elanmanager.utils.ElanL2GwCacheUtils;
+import org.opendaylight.netvirt.neutronvpn.api.l2gw.L2GatewayCache;
import org.opendaylight.netvirt.neutronvpn.api.l2gw.L2GatewayDevice;
-import org.opendaylight.netvirt.neutronvpn.api.l2gw.utils.L2GatewayCacheUtils;
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.genius.itm.rpcs.rev160406.ItmRpcService;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.PhysicalSwitchAugmentation;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.physical._switch.attributes.TunnelIps;
import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology;
import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
private final HAOpClusteredListener haOpClusteredListener;
+ private final L2GatewayCache l2GatewayCache;
/**
* Instantiates a new hwvtep physical switch listener.
@Inject
public HwvtepPhysicalSwitchListener(final DataBroker dataBroker, ItmRpcService itmRpcService,
ElanClusterUtils elanClusterUtils, L2gwServiceProvider l2gwServiceProvider,
- HAOpClusteredListener haListener) {
+ HAOpClusteredListener haListener, L2GatewayCache l2GatewayCache) {
super(PhysicalSwitchAugmentation.class, HwvtepPhysicalSwitchListener.class);
this.dataBroker = dataBroker;
this.itmRpcService = itmRpcService;
this.elanClusterUtils = elanClusterUtils;
this.l2gwServiceProvider = l2gwServiceProvider;
this.haOpClusteredListener = haListener;
+ this.l2GatewayCache = l2GatewayCache;
}
@Override
String psName = phySwitchDeleted.getHwvtepNodeName().getValue();
LOG.info("Received physical switch {} removed event for node {}", psName, nodeId.getValue());
- L2GatewayDevice l2GwDevice = L2GatewayCacheUtils.getL2DeviceFromCache(psName);
+ L2GatewayDevice l2GwDevice = l2GatewayCache.get(psName);
if (l2GwDevice != null) {
if (!L2GatewayConnectionUtils.isGatewayAssociatedToL2Device(l2GwDevice)) {
- L2GatewayCacheUtils.removeL2DeviceFromCache(psName);
+ l2GatewayCache.remove(psName);
LOG.debug("{} details removed from L2Gateway Cache", psName);
MDSALUtil.syncDelete(this.dataBroker, LogicalDatastoreType.CONFIGURATION,
HwvtepSouthboundUtils.createInstanceIdentifier(nodeId));
LOG.error("Could not find the physical switch name for node {}", nodeId.getValue());
return;
}
- L2GatewayDevice existingDevice = L2GatewayCacheUtils.getL2DeviceFromCache(psName);
+ L2GatewayDevice existingDevice = l2GatewayCache.get(psName);
LOG.info("Received physical switch {} update event for node {}", psName, nodeId.getValue());
InstanceIdentifier<Node> globalNodeIid = getManagedByNodeIid(identifier);
return;
}
LOG.trace("Updating cache for node {}", globalNodeIid);
- L2GatewayDevice l2GwDevice = L2GatewayCacheUtils.getL2DeviceFromCache(psName);
+ L2GatewayDevice l2GwDevice = l2GatewayCache.get(psName);
if (childConnectedAfterParent.test(l2GwDevice, globalNodeIid)) {
LOG.trace("Device {} {} is already Connected by ",
psName, globalNodeId, l2GwDevice.getHwvtepNodeId());
existingIid, psName, globalNodeIid);
ElanL2GwCacheUtils.removeL2GatewayDeviceFromAllElanCache(l2GwDevice.getHwvtepNodeId());
}
- l2GwDevice = L2GatewayCacheUtils.updateL2GatewayCache(
- psName, globalNodeId, phySwitchAdded.getTunnelIps());
+
+ l2GwDevice = l2GatewayCache.addOrGet(psName);
+ l2GwDevice.setConnected(true);
+ l2GwDevice.setHwvtepNodeId(globalNodeId);
+
+ List<TunnelIps> tunnelIps = phySwitchAdded.getTunnelIps();
+ if (tunnelIps != null) {
+ for (TunnelIps tunnelIp : tunnelIps) {
+ IpAddress tunnelIpAddr = tunnelIp.getTunnelIpsKey();
+ l2GwDevice.addTunnelIp(tunnelIpAddr);
+ }
+ }
+
handleAdd(l2GwDevice);
return;
});
import org.opendaylight.netvirt.elan.l2gw.utils.L2GatewayConnectionUtils;
import org.opendaylight.netvirt.elan.l2gw.utils.SettableFutureCallback;
import org.opendaylight.netvirt.elan.utils.ElanClusterUtils;
+import org.opendaylight.netvirt.neutronvpn.api.l2gw.L2GatewayCache;
import org.opendaylight.netvirt.neutronvpn.api.l2gw.L2GatewayDevice;
-import org.opendaylight.netvirt.neutronvpn.api.l2gw.utils.L2GatewayCacheUtils;
import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.l2gateways.rev150712.l2gateway.attributes.Devices;
import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.l2gateways.rev150712.l2gateway.attributes.devices.Interfaces;
import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.l2gateways.rev150712.l2gateway.connections.attributes.l2gatewayconnections.L2gatewayConnection;
private final DataBroker broker;
private final ElanL2GatewayUtils elanL2GatewayUtils;
private final ElanClusterUtils elanClusterUtils;
+ private final L2GatewayCache l2GatewayCache;
@Inject
public HwvtepTerminationPointListener(DataBroker broker, ElanL2GatewayUtils elanL2GatewayUtils,
- ElanClusterUtils elanClusterUtils) {
+ ElanClusterUtils elanClusterUtils, L2GatewayCache l2GatewayCache) {
super(TerminationPoint.class, HwvtepTerminationPointListener.class);
this.broker = broker;
this.elanL2GatewayUtils = elanL2GatewayUtils;
this.elanClusterUtils = elanClusterUtils;
+ this.l2GatewayCache = l2GatewayCache;
//No longer needed as port reconciliation is added in plugin
//registerListener(LogicalDatastoreType.OPERATIONAL, broker);
LOG.debug("created HwvtepTerminationPointListener");
Node psNode = HwvtepUtils.getHwVtepNode(broker, LogicalDatastoreType.OPERATIONAL, psNodeId);
if (psNode != null) {
String psName = psNode.getAugmentation(PhysicalSwitchAugmentation.class).getHwvtepNodeName().getValue();
- L2GatewayDevice l2GwDevice = L2GatewayCacheUtils.getL2DeviceFromCache(psName);
+ L2GatewayDevice l2GwDevice = l2GatewayCache.get(psName);
if (l2GwDevice != null) {
if (isL2GatewayConfigured(l2GwDevice)) {
List<L2gatewayConnection> l2GwConns = L2GatewayConnectionUtils.getAssociatedL2GwConnections(broker,
import org.opendaylight.netvirt.elan.l2gw.listeners.HwvtepLogicalSwitchListener;
import org.opendaylight.netvirt.elan.utils.ElanClusterUtils;
import org.opendaylight.netvirt.elanmanager.utils.ElanL2GwCacheUtils;
+import org.opendaylight.netvirt.neutronvpn.api.l2gw.L2GatewayCache;
import org.opendaylight.netvirt.neutronvpn.api.l2gw.L2GatewayDevice;
-import org.opendaylight.netvirt.neutronvpn.api.l2gw.utils.L2GatewayCacheUtils;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.instances.ElanInstance;
import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.l2gateways.rev150712.l2gateway.attributes.Devices;
private final ElanClusterUtils elanClusterUtils;
private final ElanL2GatewayMulticastUtils elanL2GatewayMulticastUtils;
private final JobCoordinator jobCoordinator;
+ private final L2GatewayCache l2GatewayCache;
private final List<AutoCloseable> closeables = new CopyOnWriteArrayList<>();
@Inject
public L2GatewayConnectionUtils(DataBroker dataBroker, ElanInstanceManager elanInstanceManager,
ElanClusterUtils elanClusterUtils, ElanL2GatewayUtils elanL2GatewayUtils,
- JobCoordinator jobCoordinator, ElanL2GatewayMulticastUtils elanL2GatewayMulticastUtils) {
+ JobCoordinator jobCoordinator, ElanL2GatewayMulticastUtils elanL2GatewayMulticastUtils,
+ L2GatewayCache l2GatewayCache) {
this.broker = dataBroker;
this.elanInstanceManager = elanInstanceManager;
this.elanL2GatewayUtils = elanL2GatewayUtils;
this.elanClusterUtils = elanClusterUtils;
this.elanL2GatewayMulticastUtils = elanL2GatewayMulticastUtils;
this.jobCoordinator = jobCoordinator;
+ this.l2GatewayCache = l2GatewayCache;
}
@Override
}
for (Devices l2Device : l2gwDevicesToBeDeleted) {
String l2DeviceName = l2Device.getDeviceName();
- L2GatewayDevice l2GatewayDevice = L2GatewayCacheUtils.getL2DeviceFromCache(l2DeviceName);
+ L2GatewayDevice l2GatewayDevice = l2GatewayCache.get(l2DeviceName);
String hwvtepNodeId = l2GatewayDevice.getHwvtepNodeId();
boolean isLastL2GwConnDeleted = false;
L2GatewayDevice elanL2GwDevice = ElanL2GwCacheUtils.getL2GatewayDeviceFromCache(elanName, hwvtepNodeId);
l2DeviceName, l2GwDeviceName);
continue;
}
- L2GatewayDevice l2GatewayDevice = L2GatewayCacheUtils.getL2DeviceFromCache(l2DeviceName);
+ L2GatewayDevice l2GatewayDevice = l2GatewayCache.get(l2DeviceName);
if (isL2GwDeviceConnected(l2GatewayDevice)) {
NodeId hwvtepNodeId = new NodeId(l2GatewayDevice.getHwvtepNodeId());
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
xmlns:odl="http://opendaylight.org/xmlns/blueprint/v1.0.0">
- <reference id="elanProviderRef" interface="org.opendaylight.netvirt.elanmanager.api.IElanService"
- availability="optional"/>
- <reference id="interfaceManagerRef"
- interface="org.opendaylight.genius.interfacemanager.interfaces.IInterfaceManager"
- availability="optional"/>
- <reference id="dataBrokerRef"
- interface="org.opendaylight.controller.md.sal.binding.api.DataBroker"
- odl:type="pingpong"/>
-
-
<command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0">
<command>
<action class="org.opendaylight.netvirt.elan.cli.ElanAdd">
- <property name="elanProvider" ref="elanProviderRef" />
+ <property name="elanProvider" ref="elanServiceProvider" />
</action>
</command>
<command>
<action class="org.opendaylight.netvirt.elan.cli.ElanDelete">
- <property name="elanProvider" ref="elanProviderRef" />
+ <property name="elanProvider" ref="elanServiceProvider" />
</action>
</command>
<command>
<action class="org.opendaylight.netvirt.elan.cli.ElanUpdate">
- <property name="elanProvider" ref="elanProviderRef" />
+ <property name="elanProvider" ref="elanServiceProvider" />
</action>
</command>
<command>
<action class="org.opendaylight.netvirt.elan.cli.ElanInterfaceAdd">
- <property name="elanProvider" ref="elanProviderRef" />
+ <property name="elanProvider" ref="elanServiceProvider" />
</action>
</command>
<command>
<action class="org.opendaylight.netvirt.elan.cli.ElanInterfaceDelete">
- <property name="elanProvider" ref="elanProviderRef" />
+ <property name="elanProvider" ref="elanServiceProvider" />
</action>
</command>
<command>
<action class="org.opendaylight.netvirt.elan.cli.ElanInterfaceUpdate">
- <property name="elanProvider" ref="elanProviderRef" />
+ <property name="elanProvider" ref="elanServiceProvider" />
</action>
</command>
<command>
<action class="org.opendaylight.netvirt.elan.cli.StaticMacAdd">
- <property name="elanProvider" ref="elanProviderRef" />
+ <property name="elanProvider" ref="elanServiceProvider" />
</action>
</command>
<command>
<action class="org.opendaylight.netvirt.elan.cli.StaticMacDelete">
- <property name="elanProvider" ref="elanProviderRef" />
+ <property name="elanProvider" ref="elanServiceProvider" />
</action>
</command>
<command>
<action class="org.opendaylight.netvirt.elan.cli.ElanMacTableGet">
- <property name="elanProvider" ref="elanProviderRef" />
+ <property name="elanProvider" ref="elanServiceProvider" />
</action>
</command>
<command>
<action class="org.opendaylight.netvirt.elan.cli.ElanMacTableFlush">
- <property name="elanProvider" ref="elanProviderRef" />
+ <property name="elanProvider" ref="elanServiceProvider" />
</action>
</command>
<command>
<action class="org.opendaylight.netvirt.elan.cli.ElanGet">
- <property name="elanProvider" ref="elanProviderRef" />
+ <property name="elanProvider" ref="elanServiceProvider" />
</action>
</command>
<command>
<action class="org.opendaylight.netvirt.elan.cli.ElanInterfaceGet">
- <property name="elanProvider" ref="elanProviderRef" />
- <property name="interfaceManager" ref="interfaceManagerRef" />
+ <property name="elanProvider" ref="elanServiceProvider" />
+ <property name="interfaceManager" ref="iInterfaceManager" />
</action>
</command>
<command>
<action class="org.opendaylight.netvirt.elan.cli.l2gw.L2GwUtilsCacheCli">
+ <argument ref="l2GatewayCache"/>
</action>
</command>
<command>
<action class="org.opendaylight.netvirt.elan.cli.etree.EtreeDelete">
- <property name="elanProvider" ref="elanProviderRef" />
+ <property name="elanProvider" ref="elanServiceProvider" />
</action>
</command>
<command>
<action class="org.opendaylight.netvirt.elan.cli.etree.EtreeAdd">
- <property name="elanProvider" ref="elanProviderRef" />
+ <property name="elanProvider" ref="elanServiceProvider" />
</action>
</command>
<command>
<action class="org.opendaylight.netvirt.elan.cli.etree.EtreeGet">
- <property name="elanProvider" ref="elanProviderRef" />
+ <property name="elanProvider" ref="elanServiceProvider" />
</action>
</command>
<command>
<action class="org.opendaylight.netvirt.elan.cli.etree.EtreeInterfaceAdd">
- <property name="elanProvider" ref="elanProviderRef" />
+ <property name="elanProvider" ref="elanServiceProvider" />
</action>
</command>
<command>
<action class="org.opendaylight.netvirt.elan.cli.etree.EtreeInterfaceGet">
- <property name="elanProvider" ref="elanProviderRef" />
- <property name="interfaceManager" ref="interfaceManagerRef" />
+ <property name="elanProvider" ref="elanServiceProvider" />
+ <property name="interfaceManager" ref="iInterfaceManager" />
</action>
</command>
<command>
<action class="org.opendaylight.netvirt.elan.cli.etree.EtreeInterfaceDelete">
- <property name="elanProvider" ref="elanProviderRef" />
+ <property name="elanProvider" ref="elanServiceProvider" />
</action>
</command>
<command>
<action class="org.opendaylight.netvirt.elan.cli.l2gw.NetworkL2gwDeviceInfoCli">
- <property name="dataBroker" ref="dataBrokerRef"/>
+ <property name="dataBroker" ref="dataBroker"/>
</action>
</command>
<command>
<action class="org.opendaylight.netvirt.elan.cli.l2gw.L2GwValidateCli">
- <property name="dataBroker" ref="dataBrokerRef"/>
+ <argument ref="dataBroker"/>
+ <argument ref="l2GatewayCache"/>
</action>
</command>
</command-bundle>
-</blueprint>
\ No newline at end of file
+</blueprint>
interface="org.opendaylight.infrautils.diagstatus.DiagStatusService" />
<reference id="jobCoordinator"
interface="org.opendaylight.infrautils.jobcoordinator.JobCoordinator"/>
+ <reference id="l2GatewayCache"
+ interface="org.opendaylight.netvirt.neutronvpn.api.l2gw.L2GatewayCache"/>
<odl:rpc-service id="odlInterfaceRpcService"
interface="org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rpcs.rev160406.OdlInterfaceRpcService" />
<artifactId>coe-impl</artifactId>
<version>${project.version}</version>
</dependency>
+ <dependency>
+ <groupId>${project.groupId}</groupId>
+ <artifactId>cache-impl</artifactId>
+ <version>${project.version}</version>
+ </dependency>
<dependency>
<!-- finalname="etc/opendaylight/datastore/initial/config/netvirt-aclservice-config.xml" -->
<groupId>${project.groupId}</groupId>
--- /dev/null
+/*
+ * Copyright (c) 2016 Ericsson India Global Services Pvt Ltd. 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.netvirt.neutronvpn.api.l2gw;
+
+import java.util.Collection;
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+public interface L2GatewayCache {
+ @Nonnull
+ L2GatewayDevice addOrGet(@Nonnull String deviceName);
+
+ @Nullable
+ L2GatewayDevice remove(String deviceName);
+
+ @Nullable
+ L2GatewayDevice get(String deviceName);
+
+ @Nonnull
+ Collection<L2GatewayDevice> getAll();
+}
+++ /dev/null
-/*
- * Copyright (c) 2016 Ericsson India Global Services Pvt Ltd. 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.netvirt.neutronvpn.api.l2gw.utils;
-
-import java.util.List;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
-import org.opendaylight.netvirt.neutronvpn.api.l2gw.L2GatewayDevice;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.physical._switch.attributes.TunnelIps;
-
-public final class L2GatewayCacheUtils {
- public static final String L2GATEWAY_CACHE_NAME = "L2GW";
-
- private static final ConcurrentMap<String, L2GatewayDevice> CACHE = new ConcurrentHashMap<>();
-
- private L2GatewayCacheUtils() { }
-
- public static void addL2DeviceToCache(String devicename, L2GatewayDevice l2GwDevice) {
- CACHE.put(devicename, l2GwDevice);
- }
-
- public static L2GatewayDevice removeL2DeviceFromCache(String devicename) {
- return CACHE.remove(devicename);
- }
-
- public static L2GatewayDevice getL2DeviceFromCache(String devicename) {
- return CACHE.get(devicename);
- }
-
- public static ConcurrentMap<String, L2GatewayDevice> getCache() {
- return CACHE;
- }
-
- public static L2GatewayDevice updateCacheUponL2GatewayAdd(final String psName, final Uuid l2gwUuid) {
- final L2GatewayDevice l2GwDevice = CACHE.computeIfAbsent(psName, key -> new L2GatewayDevice(psName));
- l2GwDevice.addL2GatewayId(l2gwUuid);
- return l2GwDevice;
- }
-
- public static L2GatewayDevice updateCacheUponSwitchConnect(final String psName, final String
- hwvtepNodeId, final List<TunnelIps> tunnelIps) {
- final L2GatewayDevice l2GwDevice = CACHE.computeIfAbsent(psName, key -> new L2GatewayDevice(psName));
- l2GwDevice.setConnected(true);
- l2GwDevice.setHwvtepNodeId(hwvtepNodeId);
-
- if (tunnelIps != null) {
- for (TunnelIps tunnelIp : tunnelIps) {
- IpAddress tunnelIpAddr = tunnelIp.getTunnelIpsKey();
- l2GwDevice.addTunnelIp(tunnelIpAddr);
- }
- }
-
- return l2GwDevice;
- }
-
- public static L2GatewayDevice updateL2GatewayCache(String psName, String hwvtepNodeId, List<TunnelIps> tunnelIps) {
- final L2GatewayDevice l2GwDevice = CACHE.computeIfAbsent(psName, key -> new L2GatewayDevice(psName));
- l2GwDevice.setConnected(true);
- l2GwDevice.setHwvtepNodeId(hwvtepNodeId);
-
- if (tunnelIps != null) {
- for (TunnelIps tunnelIp : tunnelIps) {
- IpAddress tunnelIpAddr = tunnelIp.getTunnelIpsKey();
- l2GwDevice.addTunnelIp(tunnelIpAddr);
- }
- }
-
- return l2GwDevice;
- }
-}
import java.util.Collections;
import java.util.List;
import java.util.concurrent.Callable;
-import java.util.concurrent.ConcurrentMap;
+import org.opendaylight.netvirt.neutronvpn.api.l2gw.L2GatewayCache;
import org.opendaylight.netvirt.neutronvpn.api.l2gw.L2GatewayDevice;
-import org.opendaylight.netvirt.neutronvpn.api.l2gw.utils.L2GatewayCacheUtils;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.transport.zones.TransportZone;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rpcs.rev160406.ItmRpcService;
import org.slf4j.Logger;
private static final Logger LOG = LoggerFactory.getLogger(AddL2GwDevicesToTransportZoneJob.class);
private final ItmRpcService itmRpcService;
private final TransportZone transportZone;
+ private final L2GatewayCache l2GatewayCache;
/**
* Instantiates a new adds the l2 gw devices to transport zone job.
* @param itmRpcService the itm rpc service
* @param transportZone the transport zone
*/
- public AddL2GwDevicesToTransportZoneJob(ItmRpcService itmRpcService,
- TransportZone transportZone) {
+ public AddL2GwDevicesToTransportZoneJob(ItmRpcService itmRpcService, TransportZone transportZone,
+ L2GatewayCache l2GatewayCache) {
this.itmRpcService = itmRpcService;
this.transportZone = transportZone;
+ this.l2GatewayCache = l2GatewayCache;
LOG.debug("created AddL2GwDevicesToTransportZone Job for tZone {}", transportZone.getZoneName());
}
try {
// When vxlan transport zone is added, add all l2gw devices to that
// transport zone. Doesn't matter if tz already has data or not.
- ConcurrentMap<String, L2GatewayDevice> l2GwDevices = L2GatewayCacheUtils.getCache();
- for (L2GatewayDevice l2gwDevice : l2GwDevices.values()) {
+ for (L2GatewayDevice l2gwDevice : l2GatewayCache.getAll()) {
if (!l2gwDevice.getL2GatewayIds().isEmpty()) {
LOG.debug("Adding l2gw device [{}] to transport zone [{}]", l2gwDevice.getDeviceName(),
this.transportZone.getZoneName());
import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
import org.opendaylight.mdsal.eos.binding.api.EntityOwnershipService;
import org.opendaylight.netvirt.elanmanager.api.IL2gwService;
+import org.opendaylight.netvirt.neutronvpn.api.l2gw.L2GatewayCache;
import org.opendaylight.netvirt.neutronvpn.api.l2gw.L2GatewayDevice;
-import org.opendaylight.netvirt.neutronvpn.api.l2gw.utils.L2GatewayCacheUtils;
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.genius.itm.rpcs.rev160406.ItmRpcService;
import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.l2gateways.rev150712.l2gateway.attributes.Devices;
private final IL2gwService l2gwService;
private final EntityOwnershipUtils entityOwnershipUtils;
private final JobCoordinator jobCoordinator;
+ private final L2GatewayCache l2GatewayCache;
@Inject
public L2GatewayListener(final DataBroker dataBroker, final EntityOwnershipService entityOwnershipService,
final ItmRpcService itmRpcService, final IL2gwService l2gwService,
- final JobCoordinator jobCoordinator) {
+ final JobCoordinator jobCoordinator, final L2GatewayCache l2GatewayCache) {
this.dataBroker = dataBroker;
this.entityOwnershipUtils = new EntityOwnershipUtils(entityOwnershipService);
this.itmRpcService = itmRpcService;
this.l2gwService = l2gwService;
this.jobCoordinator = jobCoordinator;
+ this.l2GatewayCache = l2GatewayCache;
}
@PostConstruct
.filter((originalDevice) -> originalDevice.getInterfaces() != null)
.forEach((originalDevice) -> {
String deviceName = originalDevice.getDeviceName();
- L2GatewayDevice l2GwDevice = L2GatewayCacheUtils.getL2DeviceFromCache(deviceName);
+ L2GatewayDevice l2GwDevice = l2GatewayCache.get(deviceName);
NodeId physicalSwitchNodeId = HwvtepSouthboundUtils.createManagedNodeId(
new NodeId(l2GwDevice.getHwvtepNodeId()), deviceName);
originalDevice.getInterfaces()
private synchronized void addL2Device(Devices l2Device, L2gateway input) {
String l2DeviceName = l2Device.getDeviceName();
- L2GatewayDevice l2GwDevice = L2GatewayCacheUtils.updateCacheUponL2GatewayAdd(l2DeviceName, input.getUuid());
+
+ L2GatewayDevice l2GwDevice = l2GatewayCache.addOrGet(l2DeviceName);
+ l2GwDevice.addL2GatewayId(input.getUuid());
if (l2GwDevice.getHwvtepNodeId() == null) {
LOG.info("L2GW provisioning skipped for device {}",l2DeviceName);
} else {
private void removeL2Device(Devices l2Device, L2gateway input) {
final String l2DeviceName = l2Device.getDeviceName();
- L2GatewayDevice l2GwDevice = L2GatewayCacheUtils.getL2DeviceFromCache(l2DeviceName);
+ L2GatewayDevice l2GwDevice = l2GatewayCache.get(l2DeviceName);
if (l2GwDevice != null) {
// Delete ITM tunnels if it's last Gateway deleted and device is connected
// Also, do not delete device from cache if it's connected
return null;
});
} else {
- L2GatewayCacheUtils.removeL2DeviceFromCache(l2DeviceName);
+ l2GatewayCache.remove(l2DeviceName);
// Cleaning up the config DS
NodeId nodeId = new NodeId(l2GwDevice.getHwvtepNodeId());
NodeId psNodeId = HwvtepSouthboundUtils.createManagedNodeId(nodeId, l2DeviceName);
import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
+import org.opendaylight.netvirt.neutronvpn.api.l2gw.L2GatewayCache;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.TunnelTypeVxlan;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.TransportZones;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.transport.zones.TransportZone;
private final DataBroker dataBroker;
private final ItmRpcService itmRpcService;
private final JobCoordinator jobCoordinator;
+ private final L2GatewayCache l2GatewayCache;
/**
* Instantiates a new l2 gw transport zone listener.
*/
@Inject
public L2GwTransportZoneListener(final DataBroker dataBroker, final ItmRpcService itmRpcService,
- final JobCoordinator jobCoordinator) {
+ final JobCoordinator jobCoordinator, final L2GatewayCache l2GatewayCache) {
super(TransportZone.class, L2GwTransportZoneListener.class);
this.dataBroker = dataBroker;
this.itmRpcService = itmRpcService;
this.jobCoordinator = jobCoordinator;
+ this.l2GatewayCache = l2GatewayCache;
}
@Override
LOG.trace("Received Transport Zone Add Event: {}", tzNew);
if (tzNew.getTunnelType().equals(TunnelTypeVxlan.class)) {
AddL2GwDevicesToTransportZoneJob job =
- new AddL2GwDevicesToTransportZoneJob(itmRpcService, tzNew);
+ new AddL2GwDevicesToTransportZoneJob(itmRpcService, tzNew, l2GatewayCache);
jobCoordinator.enqueueJob(job.getJobKey(), job);
}
}
interface="org.opendaylight.netvirt.vpnmanager.api.IVpnManager" />
<reference id="jobCoordinator"
interface="org.opendaylight.infrautils.jobcoordinator.JobCoordinator" />
+ <reference id="l2GatewayCache"
+ interface="org.opendaylight.netvirt.neutronvpn.api.l2gw.L2GatewayCache"/>
<odl:rpc-service id="idManagerService"
interface="org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.IdManagerService" />
<packaging>pom</packaging>
<modelVersion>4.0.0</modelVersion>
<modules>
+ <module>cache</module>
<module>coe</module>
<module>commons</module>
<module>model-bgp</module>