blob: 5206e3f569f6b7a040f2dba5c6cd3e5fac456b51 [file] [log] [blame]
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -07001/*
Brian O'Connora09fe5b2017-08-03 21:12:30 -07002 * Copyright 2015-present Open Networking Foundation
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -07003 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16package org.onosproject.vtnrsc.virtualport.impl;
17
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -070018import org.onlab.packet.IpAddress;
Phaneendra Mandabd09d6e2016-07-15 19:47:51 +053019import org.onlab.packet.MacAddress;
Phaneendra Mandab212bc92016-07-08 16:50:11 +053020import org.onlab.util.KryoNamespace;
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -070021import org.onosproject.core.ApplicationId;
22import org.onosproject.core.CoreService;
Phaneendra Mandab212bc92016-07-08 16:50:11 +053023import org.onosproject.event.AbstractListenerManager;
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -070024import org.onosproject.net.DeviceId;
bobzhou16144ba2016-09-02 17:34:16 +080025import org.onosproject.net.Host;
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -070026import org.onosproject.store.serializers.KryoNamespaces;
Phaneendra Mandab212bc92016-07-08 16:50:11 +053027import org.onosproject.store.service.EventuallyConsistentMap;
28import org.onosproject.store.service.EventuallyConsistentMapEvent;
29import org.onosproject.store.service.EventuallyConsistentMapListener;
30import org.onosproject.store.service.MultiValuedTimestamp;
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -070031import org.onosproject.store.service.StorageService;
Phaneendra Mandab212bc92016-07-08 16:50:11 +053032import org.onosproject.store.service.WallClockTimestamp;
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -070033import org.onosproject.vtnrsc.AllowedAddressPair;
34import org.onosproject.vtnrsc.BindingHostId;
bobzhou16144ba2016-09-02 17:34:16 +080035import org.onosproject.vtnrsc.DefaultFloatingIp;
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -070036import org.onosproject.vtnrsc.DefaultVirtualPort;
37import org.onosproject.vtnrsc.FixedIp;
bobzhou16144ba2016-09-02 17:34:16 +080038import org.onosproject.vtnrsc.FloatingIp;
39import org.onosproject.vtnrsc.FloatingIpId;
40import org.onosproject.vtnrsc.RouterId;
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -070041import org.onosproject.vtnrsc.SecurityGroup;
42import org.onosproject.vtnrsc.SubnetId;
43import org.onosproject.vtnrsc.TenantId;
bobzhou16144ba2016-09-02 17:34:16 +080044import org.onosproject.vtnrsc.TenantNetwork;
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -070045import org.onosproject.vtnrsc.TenantNetworkId;
bobzhou16144ba2016-09-02 17:34:16 +080046import org.onosproject.vtnrsc.TenantRouter;
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -070047import org.onosproject.vtnrsc.VirtualPort;
48import org.onosproject.vtnrsc.VirtualPortId;
49import org.onosproject.vtnrsc.tenantnetwork.TenantNetworkService;
Phaneendra Mandab212bc92016-07-08 16:50:11 +053050import org.onosproject.vtnrsc.virtualport.VirtualPortEvent;
51import org.onosproject.vtnrsc.virtualport.VirtualPortListener;
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -070052import org.onosproject.vtnrsc.virtualport.VirtualPortService;
Ray Milkeyd84f89b2018-08-17 14:54:17 -070053import org.osgi.service.component.annotations.Activate;
54import org.osgi.service.component.annotations.Component;
55import org.osgi.service.component.annotations.Deactivate;
56import org.osgi.service.component.annotations.Reference;
57import org.osgi.service.component.annotations.ReferenceCardinality;
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -070058import org.slf4j.Logger;
59import org.slf4j.LoggerFactory;
60
Ray Milkeyd84f89b2018-08-17 14:54:17 -070061import java.util.ArrayList;
62import java.util.Collection;
63import java.util.Collections;
64import java.util.Iterator;
65import java.util.List;
66import java.util.UUID;
67import java.util.stream.Collectors;
68
69import static com.google.common.base.Preconditions.checkNotNull;
70
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -070071/**
72 * Provides implementation of the VirtualPort APIs.
73 */
Ray Milkeyd84f89b2018-08-17 14:54:17 -070074@Component(immediate = true, service = VirtualPortService.class)
Phaneendra Mandab212bc92016-07-08 16:50:11 +053075public class VirtualPortManager extends AbstractListenerManager<VirtualPortEvent, VirtualPortListener>
76implements VirtualPortService {
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -070077
78 private final Logger log = LoggerFactory.getLogger(getClass());
79
bobzhou16144ba2016-09-02 17:34:16 +080080 private static final String VIRTUALPORT = "vtn-virtual-port-store";
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -070081 private static final String VTNRSC_APP = "org.onosproject.vtnrsc";
82
83 private static final String VIRTUALPORT_ID_NULL = "VirtualPort ID cannot be null";
84 private static final String VIRTUALPORT_NOT_NULL = "VirtualPort cannot be null";
85 private static final String TENANTID_NOT_NULL = "TenantId cannot be null";
86 private static final String NETWORKID_NOT_NULL = "NetworkId cannot be null";
87 private static final String DEVICEID_NOT_NULL = "DeviceId cannot be null";
lishuai69b36d52015-10-21 16:50:16 +080088 private static final String FIXEDIP_NOT_NULL = "FixedIp cannot be null";
Phaneendra Mandabd09d6e2016-07-15 19:47:51 +053089 private static final String MAC_NOT_NULL = "Mac address cannot be null";
lishuai858efd32015-12-04 14:30:36 +080090 private static final String IP_NOT_NULL = "Ip cannot be null";
Phaneendra Mandab212bc92016-07-08 16:50:11 +053091 private static final String EVENT_NOT_NULL = "event cannot be null";
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -070092
Phaneendra Mandab212bc92016-07-08 16:50:11 +053093 protected EventuallyConsistentMap<VirtualPortId, VirtualPort> vPortStore;
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -070094 protected ApplicationId appId;
95
Ray Milkeyd84f89b2018-08-17 14:54:17 -070096 @Reference(cardinality = ReferenceCardinality.MANDATORY)
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -070097 protected StorageService storageService;
98
Ray Milkeyd84f89b2018-08-17 14:54:17 -070099 @Reference(cardinality = ReferenceCardinality.MANDATORY)
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -0700100 protected TenantNetworkService networkService;
101
Ray Milkeyd84f89b2018-08-17 14:54:17 -0700102 @Reference(cardinality = ReferenceCardinality.MANDATORY)
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -0700103 protected CoreService coreService;
104
Phaneendra Mandab212bc92016-07-08 16:50:11 +0530105 private EventuallyConsistentMapListener<VirtualPortId, VirtualPort> virtualPortListener =
106 new InnerVirtualPortStoreListener();
107
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -0700108 @Activate
109 public void activate() {
110
111 appId = coreService.registerApplication(VTNRSC_APP);
112
Phaneendra Mandab212bc92016-07-08 16:50:11 +0530113 eventDispatcher.addSink(VirtualPortEvent.class, listenerRegistry);
114
bobzhou16144ba2016-09-02 17:34:16 +0800115 KryoNamespace.Builder serializer = KryoNamespace.newBuilder()
116 .register(KryoNamespaces.API)
117 .register(MultiValuedTimestamp.class)
118 .register(TenantNetworkId.class)
119 .register(Host.class)
120 .register(TenantNetwork.class)
121 .register(TenantNetworkId.class)
122 .register(TenantId.class)
123 .register(SubnetId.class)
124 .register(VirtualPortId.class)
125 .register(VirtualPort.State.class)
126 .register(AllowedAddressPair.class)
127 .register(FixedIp.class)
128 .register(FloatingIp.class)
129 .register(FloatingIpId.class)
130 .register(FloatingIp.Status.class)
131 .register(UUID.class)
132 .register(DefaultFloatingIp.class)
133 .register(BindingHostId.class)
134 .register(SecurityGroup.class)
135 .register(IpAddress.class)
136 .register(DefaultVirtualPort.class)
137 .register(RouterId.class)
138 .register(TenantRouter.class)
139 .register(VirtualPort.class);
140 vPortStore = storageService
141 .<VirtualPortId, VirtualPort>eventuallyConsistentMapBuilder()
142 .withName(VIRTUALPORT).withSerializer(serializer)
143 .withTimestampProvider((k, v) -> new WallClockTimestamp())
144 .build();
Phaneendra Mandab212bc92016-07-08 16:50:11 +0530145
146 vPortStore.addListener(virtualPortListener);
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -0700147 log.info("Started");
148 }
149
150 @Deactivate
151 public void deactivate() {
bobzhou16144ba2016-09-02 17:34:16 +0800152 vPortStore.removeListener(virtualPortListener);
153 vPortStore.destroy();
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -0700154 log.info("Stoppped");
155 }
156
157 @Override
158 public boolean exists(VirtualPortId vPortId) {
159 checkNotNull(vPortId, VIRTUALPORT_ID_NULL);
160 return vPortStore.containsKey(vPortId);
161 }
162
163 @Override
164 public VirtualPort getPort(VirtualPortId vPortId) {
165 checkNotNull(vPortId, VIRTUALPORT_ID_NULL);
166 return vPortStore.get(vPortId);
167 }
168
169 @Override
lishuai69b36d52015-10-21 16:50:16 +0800170 public VirtualPort getPort(FixedIp fixedIP) {
171 checkNotNull(fixedIP, FIXEDIP_NOT_NULL);
172 List<VirtualPort> vPorts = new ArrayList<>();
Sho SHIMIZUa09e1bb2016-08-01 14:25:25 -0700173 vPortStore.values().forEach(p -> {
lishuai69b36d52015-10-21 16:50:16 +0800174 Iterator<FixedIp> fixedIps = p.fixedIps().iterator();
175 while (fixedIps.hasNext()) {
176 if (fixedIps.next().equals(fixedIP)) {
177 vPorts.add(p);
178 break;
179 }
180 }
181 });
Jon Hallcbd1b392017-01-18 20:15:44 -0800182 if (vPorts.isEmpty()) {
lishuai69b36d52015-10-21 16:50:16 +0800183 return null;
184 }
185 return vPorts.get(0);
186 }
187
188 @Override
Phaneendra Mandabd09d6e2016-07-15 19:47:51 +0530189 public VirtualPort getPort(MacAddress mac) {
190 checkNotNull(mac, MAC_NOT_NULL);
191 List<VirtualPort> vPorts = new ArrayList<>();
Sho SHIMIZU8ebb04a2016-10-06 15:58:29 -0700192 vPortStore.values().forEach(p -> {
Phaneendra Mandabd09d6e2016-07-15 19:47:51 +0530193 if (p.macAddress().equals(mac)) {
194 vPorts.add(p);
195 }
196 });
Jon Hallcbd1b392017-01-18 20:15:44 -0800197 if (vPorts.isEmpty()) {
Phaneendra Mandabd09d6e2016-07-15 19:47:51 +0530198 return null;
199 }
200 return vPorts.get(0);
201 }
202
203 @Override
lishuai858efd32015-12-04 14:30:36 +0800204 public VirtualPort getPort(TenantNetworkId networkId, IpAddress ip) {
205 checkNotNull(networkId, NETWORKID_NOT_NULL);
206 checkNotNull(ip, IP_NOT_NULL);
207 List<VirtualPort> vPorts = new ArrayList<>();
208 vPortStore.values().stream().filter(p -> p.networkId().equals(networkId))
209 .forEach(p -> {
210 Iterator<FixedIp> fixedIps = p.fixedIps().iterator();
211 while (fixedIps.hasNext()) {
212 if (fixedIps.next().ip().equals(ip)) {
213 vPorts.add(p);
214 break;
215 }
216 }
217 });
Jon Hallcbd1b392017-01-18 20:15:44 -0800218 if (vPorts.isEmpty()) {
lishuai858efd32015-12-04 14:30:36 +0800219 return null;
220 }
221 return vPorts.get(0);
222 }
223
224 @Override
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -0700225 public Collection<VirtualPort> getPorts() {
226 return Collections.unmodifiableCollection(vPortStore.values());
227 }
228
229 @Override
230 public Collection<VirtualPort> getPorts(TenantNetworkId networkId) {
231 checkNotNull(networkId, NETWORKID_NOT_NULL);
lishuaid2f6a252015-09-14 15:30:49 +0800232 return vPortStore.values().stream().filter(d -> d.networkId().equals(networkId))
233 .collect(Collectors.toList());
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -0700234 }
235
236 @Override
237 public Collection<VirtualPort> getPorts(TenantId tenantId) {
238 checkNotNull(tenantId, TENANTID_NOT_NULL);
lishuaid2f6a252015-09-14 15:30:49 +0800239 return vPortStore.values().stream().filter(d -> d.tenantId().equals(tenantId))
240 .collect(Collectors.toList());
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -0700241 }
242
243 @Override
244 public Collection<VirtualPort> getPorts(DeviceId deviceId) {
245 checkNotNull(deviceId, DEVICEID_NOT_NULL);
lishuaid2f6a252015-09-14 15:30:49 +0800246 return vPortStore.values().stream().filter(d -> d.deviceId().equals(deviceId))
247 .collect(Collectors.toList());
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -0700248 }
249
250 @Override
251 public boolean createPorts(Iterable<VirtualPort> vPorts) {
252 checkNotNull(vPorts, VIRTUALPORT_NOT_NULL);
253 for (VirtualPort vPort : vPorts) {
254 log.debug("vPortId is {} ", vPort.portId().toString());
255 vPortStore.put(vPort.portId(), vPort);
256 if (!vPortStore.containsKey(vPort.portId())) {
257 log.debug("The virtualPort is created failed whose identifier is {} ",
258 vPort.portId().toString());
259 return false;
260 }
261 }
262 return true;
263 }
264
265 @Override
266 public boolean updatePorts(Iterable<VirtualPort> vPorts) {
267 checkNotNull(vPorts, VIRTUALPORT_NOT_NULL);
Sho SHIMIZU0fa6d3b2015-10-27 11:38:37 -0700268 for (VirtualPort vPort : vPorts) {
269 vPortStore.put(vPort.portId(), vPort);
270 if (!vPortStore.containsKey(vPort.portId())) {
271 log.debug("The virtualPort is not exist whose identifier is {}",
272 vPort.portId().toString());
273 return false;
274 }
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -0700275
Sho SHIMIZU0fa6d3b2015-10-27 11:38:37 -0700276 vPortStore.put(vPort.portId(), vPort);
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -0700277
Sho SHIMIZU0fa6d3b2015-10-27 11:38:37 -0700278 if (!vPort.equals(vPortStore.get(vPort.portId()))) {
279 log.debug("The virtualPort is updated failed whose identifier is {}",
280 vPort.portId().toString());
281 return false;
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -0700282 }
283 }
284 return true;
285 }
286
287 @Override
288 public boolean removePorts(Iterable<VirtualPortId> vPortIds) {
289 checkNotNull(vPortIds, VIRTUALPORT_ID_NULL);
Sho SHIMIZU0fa6d3b2015-10-27 11:38:37 -0700290 for (VirtualPortId vPortId : vPortIds) {
291 vPortStore.remove(vPortId);
292 if (vPortStore.containsKey(vPortId)) {
293 log.debug("The virtualPort is removed failed whose identifier is {}",
294 vPortId.toString());
295 return false;
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -0700296 }
297 }
298 return true;
299 }
300
Phaneendra Mandab212bc92016-07-08 16:50:11 +0530301 private class InnerVirtualPortStoreListener
302 implements
303 EventuallyConsistentMapListener<VirtualPortId, VirtualPort> {
304
305 @Override
306 public void event(EventuallyConsistentMapEvent<VirtualPortId, VirtualPort> event) {
307 checkNotNull(event, EVENT_NOT_NULL);
308 log.info("virtual port event raised");
309 VirtualPort virtualPort = event.value();
310 if (EventuallyConsistentMapEvent.Type.PUT == event.type()) {
311 notifyListeners(new VirtualPortEvent(
312 VirtualPortEvent.Type.VIRTUAL_PORT_PUT,
313 virtualPort));
314 }
315 if (EventuallyConsistentMapEvent.Type.REMOVE == event.type()) {
316 notifyListeners(new VirtualPortEvent(
317 VirtualPortEvent.Type.VIRTUAL_PORT_DELETE,
318 virtualPort));
319 }
320 }
321 }
322
323 /**
324 * Notifies specify event to all listeners.
325 *
326 * @param event virtual port event
327 */
328 private void notifyListeners(VirtualPortEvent event) {
329 checkNotNull(event, EVENT_NOT_NULL);
330 post(event);
331 }
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -0700332}