mirror of
https://github.com/opennetworkinglab/onos.git
synced 2025-11-03 17:51:26 +01:00
[ONOS-2818] add implementation of VtnRscService api
Change-Id: I0d5b87813cf0edb1fd5ebefe1eedf8b50fda7a5e
This commit is contained in:
parent
b150da5c09
commit
f675cd45a1
@ -0,0 +1,472 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2015 Open Networking Laboratory
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.onosproject.vtnrsc.service.impl;
|
||||||
|
|
||||||
|
import static com.google.common.base.Preconditions.checkNotNull;
|
||||||
|
import static org.slf4j.LoggerFactory.getLogger;
|
||||||
|
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import org.apache.felix.scr.annotations.Activate;
|
||||||
|
import org.apache.felix.scr.annotations.Component;
|
||||||
|
import org.apache.felix.scr.annotations.Deactivate;
|
||||||
|
import org.apache.felix.scr.annotations.Reference;
|
||||||
|
import org.apache.felix.scr.annotations.ReferenceCardinality;
|
||||||
|
import org.apache.felix.scr.annotations.Service;
|
||||||
|
import org.onlab.packet.IpAddress;
|
||||||
|
import org.onlab.packet.MacAddress;
|
||||||
|
import org.onlab.util.KryoNamespace;
|
||||||
|
import org.onosproject.core.CoreService;
|
||||||
|
import org.onosproject.net.Device;
|
||||||
|
import org.onosproject.net.DeviceId;
|
||||||
|
import org.onosproject.net.Host;
|
||||||
|
import org.onosproject.net.HostId;
|
||||||
|
import org.onosproject.net.host.HostEvent;
|
||||||
|
import org.onosproject.net.host.HostListener;
|
||||||
|
import org.onosproject.net.host.HostService;
|
||||||
|
import org.onosproject.net.device.DeviceService;
|
||||||
|
import org.onosproject.store.serializers.KryoNamespaces;
|
||||||
|
import org.onosproject.store.service.EventuallyConsistentMap;
|
||||||
|
import org.onosproject.store.service.LogicalClockService;
|
||||||
|
import org.onosproject.store.service.StorageService;
|
||||||
|
import org.onosproject.vtnrsc.FixedIp;
|
||||||
|
import org.onosproject.vtnrsc.FloatingIp;
|
||||||
|
import org.onosproject.vtnrsc.Router;
|
||||||
|
import org.onosproject.vtnrsc.RouterInterface;
|
||||||
|
import org.onosproject.vtnrsc.SegmentationId;
|
||||||
|
import org.onosproject.vtnrsc.Subnet;
|
||||||
|
import org.onosproject.vtnrsc.SubnetId;
|
||||||
|
import org.onosproject.vtnrsc.TenantId;
|
||||||
|
import org.onosproject.vtnrsc.VirtualPort;
|
||||||
|
import org.onosproject.vtnrsc.VirtualPortId;
|
||||||
|
import org.onosproject.vtnrsc.event.VtnRscEvent;
|
||||||
|
import org.onosproject.vtnrsc.event.VtnRscEventFeedback;
|
||||||
|
import org.onosproject.vtnrsc.event.VtnRscListener;
|
||||||
|
import org.onosproject.vtnrsc.floatingip.FloatingIpEvent;
|
||||||
|
import org.onosproject.vtnrsc.floatingip.FloatingIpListener;
|
||||||
|
import org.onosproject.vtnrsc.floatingip.FloatingIpService;
|
||||||
|
import org.onosproject.vtnrsc.router.RouterEvent;
|
||||||
|
import org.onosproject.vtnrsc.router.RouterListener;
|
||||||
|
import org.onosproject.vtnrsc.router.RouterService;
|
||||||
|
import org.onosproject.vtnrsc.routerinterface.RouterInterfaceEvent;
|
||||||
|
import org.onosproject.vtnrsc.routerinterface.RouterInterfaceListener;
|
||||||
|
import org.onosproject.vtnrsc.routerinterface.RouterInterfaceService;
|
||||||
|
import org.onosproject.vtnrsc.service.VtnRscService;
|
||||||
|
import org.onosproject.vtnrsc.subnet.SubnetService;
|
||||||
|
import org.onosproject.vtnrsc.tenantnetwork.TenantNetworkService;
|
||||||
|
import org.onosproject.vtnrsc.virtualport.VirtualPortService;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
|
||||||
|
import com.google.common.collect.Sets;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provides implementation of the VtnRsc service.
|
||||||
|
*/
|
||||||
|
@Component(immediate = true)
|
||||||
|
@Service
|
||||||
|
public class VtnRscManager implements VtnRscService {
|
||||||
|
@Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
|
||||||
|
protected CoreService coreService;
|
||||||
|
@Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
|
||||||
|
protected StorageService storageService;
|
||||||
|
@Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
|
||||||
|
protected LogicalClockService clockService;
|
||||||
|
|
||||||
|
private final Logger log = getLogger(getClass());
|
||||||
|
private final Set<VtnRscListener> listeners = Sets.newCopyOnWriteArraySet();
|
||||||
|
private HostListener hostListener = new InnerHostListener();
|
||||||
|
private FloatingIpListener floatingIpListener = new InnerFloatingIpListener();
|
||||||
|
private RouterListener routerListener = new InnerRouterListener();
|
||||||
|
private RouterInterfaceListener routerInterfaceListener = new InnerRouterInterfaceListener();
|
||||||
|
|
||||||
|
private EventuallyConsistentMap<TenantId, SegmentationId> l3vniMap;
|
||||||
|
private EventuallyConsistentMap<TenantId, Set<DeviceId>> classifierOvsMap;
|
||||||
|
private EventuallyConsistentMap<TenantId, Set<DeviceId>> sffOvsMap;
|
||||||
|
|
||||||
|
private static final String IFACEID = "ifaceid";
|
||||||
|
private static final String RUNNELOPTOPOIC = "tunnel-ops-ids";
|
||||||
|
private static final String LISTENER_NOT_NULL = "listener cannot be null";
|
||||||
|
private static final String EVENT_NOT_NULL = "event cannot be null";
|
||||||
|
private static final String TENANTID_NOT_NULL = "tenantId cannot be null";
|
||||||
|
private static final String DEVICEID_NOT_NULL = "deviceId cannot be null";
|
||||||
|
private static final String OVSMAP_NOT_NULL = "ovsMap cannot be null";
|
||||||
|
private static final String L3VNIMAP = "l3vniMap";
|
||||||
|
private static final String CLASSIFIEROVSMAP = "classifierOvsMap";
|
||||||
|
private static final String SFFOVSMAP = "sffOvsMap";
|
||||||
|
|
||||||
|
@Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
|
||||||
|
protected RouterService routerService;
|
||||||
|
@Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
|
||||||
|
protected FloatingIpService floatingIpService;
|
||||||
|
@Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
|
||||||
|
protected RouterInterfaceService routerInterfaceService;
|
||||||
|
@Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
|
||||||
|
protected VirtualPortService virtualPortService;
|
||||||
|
@Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
|
||||||
|
protected HostService hostService;
|
||||||
|
@Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
|
||||||
|
protected SubnetService subnetService;
|
||||||
|
@Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
|
||||||
|
protected TenantNetworkService tenantNetworkService;
|
||||||
|
@Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
|
||||||
|
protected DeviceService deviceService;
|
||||||
|
|
||||||
|
@Activate
|
||||||
|
public void activate() {
|
||||||
|
hostService.addListener(hostListener);
|
||||||
|
floatingIpService.addListener(floatingIpListener);
|
||||||
|
routerService.addListener(routerListener);
|
||||||
|
routerInterfaceService.addListener(routerInterfaceListener);
|
||||||
|
|
||||||
|
KryoNamespace.Builder serializer = KryoNamespace.newBuilder()
|
||||||
|
.register(KryoNamespaces.API)
|
||||||
|
.register(TenantId.class, DeviceId.class);
|
||||||
|
l3vniMap = storageService
|
||||||
|
.<TenantId, SegmentationId>eventuallyConsistentMapBuilder()
|
||||||
|
.withName(L3VNIMAP).withSerializer(serializer)
|
||||||
|
.withTimestampProvider((k, v) -> clockService.getTimestamp())
|
||||||
|
.build();
|
||||||
|
|
||||||
|
classifierOvsMap = storageService
|
||||||
|
.<TenantId, Set<DeviceId>>eventuallyConsistentMapBuilder()
|
||||||
|
.withName(CLASSIFIEROVSMAP).withSerializer(serializer)
|
||||||
|
.withTimestampProvider((k, v) -> clockService.getTimestamp())
|
||||||
|
.build();
|
||||||
|
|
||||||
|
sffOvsMap = storageService
|
||||||
|
.<TenantId, Set<DeviceId>>eventuallyConsistentMapBuilder()
|
||||||
|
.withName(SFFOVSMAP).withSerializer(serializer)
|
||||||
|
.withTimestampProvider((k, v) -> clockService.getTimestamp())
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Deactivate
|
||||||
|
public void deactivate() {
|
||||||
|
hostService.removeListener(hostListener);
|
||||||
|
floatingIpService.removeListener(floatingIpListener);
|
||||||
|
routerService.removeListener(routerListener);
|
||||||
|
routerInterfaceService.removeListener(routerInterfaceListener);
|
||||||
|
l3vniMap.destroy();
|
||||||
|
classifierOvsMap.destroy();
|
||||||
|
sffOvsMap.destroy();
|
||||||
|
listeners.clear();
|
||||||
|
log.info("Stopped");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void addListener(VtnRscListener listener) {
|
||||||
|
checkNotNull(listener, LISTENER_NOT_NULL);
|
||||||
|
listeners.add(listener);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void removeListener(VtnRscListener listener) {
|
||||||
|
checkNotNull(listener, LISTENER_NOT_NULL);
|
||||||
|
listeners.add(listener);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SegmentationId getL3vni(TenantId tenantId) {
|
||||||
|
checkNotNull(tenantId, "tenantId cannot be null");
|
||||||
|
SegmentationId l3vni = l3vniMap.get(tenantId);
|
||||||
|
if (l3vni == null) {
|
||||||
|
long segmentationId = coreService.getIdGenerator(RUNNELOPTOPOIC)
|
||||||
|
.getNewId();
|
||||||
|
l3vni = SegmentationId.segmentationId(String
|
||||||
|
.valueOf(segmentationId));
|
||||||
|
l3vniMap.put(tenantId, l3vni);
|
||||||
|
}
|
||||||
|
return l3vni;
|
||||||
|
}
|
||||||
|
|
||||||
|
private class InnerHostListener implements HostListener {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void event(HostEvent event) {
|
||||||
|
checkNotNull(event, EVENT_NOT_NULL);
|
||||||
|
Host host = event.subject();
|
||||||
|
String ifaceId = host.annotations().value(IFACEID);
|
||||||
|
VirtualPortId hPortId = VirtualPortId.portId(ifaceId);
|
||||||
|
TenantId tenantId = virtualPortService.getPort(hPortId).tenantId();
|
||||||
|
DeviceId deviceId = host.location().deviceId();
|
||||||
|
if (HostEvent.Type.HOST_ADDED == event.type()) {
|
||||||
|
if (isServiceFunction(hPortId)) {
|
||||||
|
addDeviceIdOfOvsMap(tenantId, deviceId, sffOvsMap);
|
||||||
|
} else {
|
||||||
|
addDeviceIdOfOvsMap(tenantId, deviceId, classifierOvsMap);
|
||||||
|
}
|
||||||
|
} else if (HostEvent.Type.HOST_REMOVED == event.type()) {
|
||||||
|
if (isLastSFHostOfTenant(host, deviceId, tenantId)) {
|
||||||
|
removeDeviceIdOfOvsMap(tenantId, deviceId, sffOvsMap);
|
||||||
|
}
|
||||||
|
if (isLastClassifierHostOfTenant(host, deviceId, tenantId)) {
|
||||||
|
removeDeviceIdOfOvsMap(tenantId, deviceId, classifierOvsMap);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private class InnerFloatingIpListener implements FloatingIpListener {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void event(FloatingIpEvent event) {
|
||||||
|
checkNotNull(event, EVENT_NOT_NULL);
|
||||||
|
FloatingIp floatingIp = event.subject();
|
||||||
|
if (FloatingIpEvent.Type.FLOATINGIP_PUT == event.type()) {
|
||||||
|
notifyListeners(new VtnRscEvent(
|
||||||
|
VtnRscEvent.Type.FLOATINGIP_PUT,
|
||||||
|
new VtnRscEventFeedback(
|
||||||
|
floatingIp)));
|
||||||
|
}
|
||||||
|
if (FloatingIpEvent.Type.FLOATINGIP_DELETE == event.type()) {
|
||||||
|
notifyListeners(new VtnRscEvent(
|
||||||
|
VtnRscEvent.Type.FLOATINGIP_DELETE,
|
||||||
|
new VtnRscEventFeedback(
|
||||||
|
floatingIp)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private class InnerRouterListener implements RouterListener {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void event(RouterEvent event) {
|
||||||
|
checkNotNull(event, EVENT_NOT_NULL);
|
||||||
|
Router router = event.subject();
|
||||||
|
if (RouterEvent.Type.ROUTER_PUT == event.type()) {
|
||||||
|
notifyListeners(new VtnRscEvent(VtnRscEvent.Type.ROUTER_PUT,
|
||||||
|
new VtnRscEventFeedback(router)));
|
||||||
|
}
|
||||||
|
if (RouterEvent.Type.ROUTER_DELETE == event.type()) {
|
||||||
|
notifyListeners(new VtnRscEvent(VtnRscEvent.Type.ROUTER_DELETE,
|
||||||
|
new VtnRscEventFeedback(router)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private class InnerRouterInterfaceListener
|
||||||
|
implements RouterInterfaceListener {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void event(RouterInterfaceEvent event) {
|
||||||
|
checkNotNull(event, EVENT_NOT_NULL);
|
||||||
|
RouterInterface routerInterface = event.subject();
|
||||||
|
if (RouterInterfaceEvent.Type.ROUTER_INTERFACE_PUT == event.type()) {
|
||||||
|
notifyListeners(new VtnRscEvent(
|
||||||
|
VtnRscEvent.Type.ROUTER_INTERFACE_PUT,
|
||||||
|
new VtnRscEventFeedback(
|
||||||
|
routerInterface)));
|
||||||
|
}
|
||||||
|
if (RouterInterfaceEvent.Type.ROUTER_INTERFACE_DELETE == event
|
||||||
|
.type()) {
|
||||||
|
notifyListeners(new VtnRscEvent(
|
||||||
|
VtnRscEvent.Type.ROUTER_INTERFACE_DELETE,
|
||||||
|
new VtnRscEventFeedback(
|
||||||
|
routerInterface)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Iterator<Device> getClassifierOfTenant(TenantId tenantId) {
|
||||||
|
checkNotNull(tenantId, TENANTID_NOT_NULL);
|
||||||
|
Set<DeviceId> deviceIdSet = classifierOvsMap.get(tenantId);
|
||||||
|
Set<Device> deviceSet = new HashSet<>();
|
||||||
|
if (deviceIdSet != null) {
|
||||||
|
for (DeviceId deviceId : deviceIdSet) {
|
||||||
|
deviceSet.add(deviceService.getDevice(deviceId));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return deviceSet.iterator();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Iterator<Device> getSFFOfTenant(TenantId tenantId) {
|
||||||
|
checkNotNull(tenantId, TENANTID_NOT_NULL);
|
||||||
|
Set<DeviceId> deviceIdSet = sffOvsMap.get(tenantId);
|
||||||
|
Set<Device> deviceSet = new HashSet<>();
|
||||||
|
if (deviceIdSet != null) {
|
||||||
|
for (DeviceId deviceId : deviceIdSet) {
|
||||||
|
deviceSet.add(deviceService.getDevice(deviceId));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return deviceSet.iterator();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public MacAddress getGatewayMac(HostId hostId) {
|
||||||
|
checkNotNull(hostId, "hostId cannot be null");
|
||||||
|
Host host = hostService.getHost(hostId);
|
||||||
|
String ifaceId = host.annotations().value(IFACEID);
|
||||||
|
VirtualPortId hPortId = VirtualPortId.portId(ifaceId);
|
||||||
|
VirtualPort hPort = virtualPortService.getPort(hPortId);
|
||||||
|
SubnetId subnetId = hPort.fixedIps().iterator().next().subnetId();
|
||||||
|
Subnet subnet = subnetService.getSubnet(subnetId);
|
||||||
|
IpAddress gatewayIp = subnet.gatewayIp();
|
||||||
|
Iterable<VirtualPort> virtualPorts = virtualPortService.getPorts();
|
||||||
|
MacAddress macAddress = null;
|
||||||
|
for (VirtualPort port : virtualPorts) {
|
||||||
|
Set<FixedIp> fixedIpSet = port.fixedIps();
|
||||||
|
for (FixedIp fixedIp : fixedIpSet) {
|
||||||
|
if (fixedIp.ip().equals(gatewayIp)) {
|
||||||
|
macAddress = port.macAddress();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return macAddress;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isServiceFunction(VirtualPortId portId) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public DeviceId getSFToSFFMaping(VirtualPortId portId) {
|
||||||
|
checkNotNull(portId, "portId cannot be null");
|
||||||
|
VirtualPort vmPort = virtualPortService.getPort(portId);
|
||||||
|
Set<Host> hostSet = hostService.getHostsByMac(vmPort.macAddress());
|
||||||
|
for (Host host : hostSet) {
|
||||||
|
if (host.annotations().value(IFACEID).equals(vmPort.portId())) {
|
||||||
|
return host.location().deviceId();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks whether the last Service Function host of a specific tenant in
|
||||||
|
* this device.
|
||||||
|
*
|
||||||
|
* @param host the host on device
|
||||||
|
* @param deviceId the device identifier
|
||||||
|
* @param tenantId the tenant identifier
|
||||||
|
* @return true or false
|
||||||
|
*/
|
||||||
|
private boolean isLastSFHostOfTenant(Host host, DeviceId deviceId,
|
||||||
|
TenantId tenantId) {
|
||||||
|
checkNotNull(host, "host cannot be null");
|
||||||
|
checkNotNull(deviceId, DEVICEID_NOT_NULL);
|
||||||
|
checkNotNull(tenantId, TENANTID_NOT_NULL);
|
||||||
|
Set<Host> hostSet = hostService.getConnectedHosts(deviceId);
|
||||||
|
for (Host h : hostSet) {
|
||||||
|
String ifaceId = h.annotations().value(IFACEID);
|
||||||
|
VirtualPortId hPortId = VirtualPortId.portId(ifaceId);
|
||||||
|
if (virtualPortService.getPort(hPortId).tenantId() != tenantId) {
|
||||||
|
hostSet.remove(h);
|
||||||
|
} else {
|
||||||
|
if (!isServiceFunction(hPortId)) {
|
||||||
|
hostSet.remove(h);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (hostSet.size() == 1 && hostSet.contains(host)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks whether the last Classifier host of a specific tenant in this
|
||||||
|
* device.
|
||||||
|
*
|
||||||
|
* @param host the host on device
|
||||||
|
* @param deviceId the device identifier
|
||||||
|
* @param tenantId the tenant identifier
|
||||||
|
* @return true or false
|
||||||
|
*/
|
||||||
|
private boolean isLastClassifierHostOfTenant(Host host, DeviceId deviceId,
|
||||||
|
TenantId tenantId) {
|
||||||
|
checkNotNull(host, "host cannot be null");
|
||||||
|
checkNotNull(deviceId, DEVICEID_NOT_NULL);
|
||||||
|
checkNotNull(tenantId, TENANTID_NOT_NULL);
|
||||||
|
Set<Host> hostSet = hostService.getConnectedHosts(deviceId);
|
||||||
|
for (Host h : hostSet) {
|
||||||
|
String ifaceId = h.annotations().value(IFACEID);
|
||||||
|
VirtualPortId hPortId = VirtualPortId.portId(ifaceId);
|
||||||
|
if (virtualPortService.getPort(hPortId).tenantId() != tenantId) {
|
||||||
|
hostSet.remove(h);
|
||||||
|
} else {
|
||||||
|
if (isServiceFunction(hPortId)) {
|
||||||
|
hostSet.remove(h);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (hostSet.size() == 1 && hostSet.contains(host)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds specify Device identifier to OvsMap.
|
||||||
|
*
|
||||||
|
* @param tenantId the tenant identifier
|
||||||
|
* @param deviceId the device identifier
|
||||||
|
* @param ovsMap the instance of map to store device identifier
|
||||||
|
*/
|
||||||
|
private void addDeviceIdOfOvsMap(TenantId tenantId,
|
||||||
|
DeviceId deviceId,
|
||||||
|
EventuallyConsistentMap<TenantId, Set<DeviceId>> ovsMap) {
|
||||||
|
checkNotNull(tenantId, TENANTID_NOT_NULL);
|
||||||
|
checkNotNull(deviceId, DEVICEID_NOT_NULL);
|
||||||
|
checkNotNull(ovsMap, OVSMAP_NOT_NULL);
|
||||||
|
if (ovsMap.containsKey(tenantId)) {
|
||||||
|
Set<DeviceId> deviceIdSet = ovsMap.get(tenantId);
|
||||||
|
deviceIdSet.add(deviceId);
|
||||||
|
ovsMap.put(tenantId, deviceIdSet);
|
||||||
|
} else {
|
||||||
|
Set<DeviceId> deviceIdSet = new HashSet<>();
|
||||||
|
deviceIdSet.add(deviceId);
|
||||||
|
ovsMap.put(tenantId, deviceIdSet);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes specify Device identifier from OvsMap.
|
||||||
|
*
|
||||||
|
* @param tenantId the tenant identifier
|
||||||
|
* @param deviceId the device identifier
|
||||||
|
* @param ovsMap the instance of map to store device identifier
|
||||||
|
*/
|
||||||
|
private void removeDeviceIdOfOvsMap(TenantId tenantId,
|
||||||
|
DeviceId deviceId,
|
||||||
|
EventuallyConsistentMap<TenantId, Set<DeviceId>> ovsMap) {
|
||||||
|
checkNotNull(tenantId, TENANTID_NOT_NULL);
|
||||||
|
checkNotNull(deviceId, DEVICEID_NOT_NULL);
|
||||||
|
checkNotNull(ovsMap, OVSMAP_NOT_NULL);
|
||||||
|
Set<DeviceId> deviceIdSet = ovsMap.get(tenantId);
|
||||||
|
if (deviceIdSet.size() > 1) {
|
||||||
|
deviceIdSet.remove(deviceId);
|
||||||
|
ovsMap.put(tenantId, deviceIdSet);
|
||||||
|
} else {
|
||||||
|
ovsMap.remove(tenantId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Notifies specify event to all listeners.
|
||||||
|
*
|
||||||
|
* @param event VtnRsc event
|
||||||
|
*/
|
||||||
|
private void notifyListeners(VtnRscEvent event) {
|
||||||
|
checkNotNull(event, EVENT_NOT_NULL);
|
||||||
|
listeners.forEach(listener -> listener.event(event));
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,20 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2015 Open Networking Laboratory
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provides implementation of the VtnRsc service.
|
||||||
|
*/
|
||||||
|
package org.onosproject.vtnrsc.service.impl;
|
||||||
Loading…
x
Reference in New Issue
Block a user