blob: 76a42047a21c7940af10c4297d06bdc81c0422ad [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
lishuaid2f6a252015-09-14 15:30:49 +080018import static com.google.common.base.Preconditions.checkNotNull;
19
lishuai69b36d52015-10-21 16:50:16 +080020import java.util.ArrayList;
lishuaid2f6a252015-09-14 15:30:49 +080021import java.util.Collection;
22import java.util.Collections;
lishuai69b36d52015-10-21 16:50:16 +080023import java.util.Iterator;
24import java.util.List;
bobzhou16144ba2016-09-02 17:34:16 +080025import java.util.UUID;
lishuaid2f6a252015-09-14 15:30:49 +080026import java.util.stream.Collectors;
27
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -070028import org.apache.felix.scr.annotations.Activate;
29import org.apache.felix.scr.annotations.Component;
30import org.apache.felix.scr.annotations.Deactivate;
31import org.apache.felix.scr.annotations.Reference;
32import org.apache.felix.scr.annotations.ReferenceCardinality;
33import org.apache.felix.scr.annotations.Service;
34import org.onlab.packet.IpAddress;
Phaneendra Mandabd09d6e2016-07-15 19:47:51 +053035import org.onlab.packet.MacAddress;
Phaneendra Mandab212bc92016-07-08 16:50:11 +053036import org.onlab.util.KryoNamespace;
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -070037import org.onosproject.core.ApplicationId;
38import org.onosproject.core.CoreService;
Phaneendra Mandab212bc92016-07-08 16:50:11 +053039import org.onosproject.event.AbstractListenerManager;
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -070040import org.onosproject.net.DeviceId;
bobzhou16144ba2016-09-02 17:34:16 +080041import org.onosproject.net.Host;
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -070042import org.onosproject.store.serializers.KryoNamespaces;
Phaneendra Mandab212bc92016-07-08 16:50:11 +053043import org.onosproject.store.service.EventuallyConsistentMap;
44import org.onosproject.store.service.EventuallyConsistentMapEvent;
45import org.onosproject.store.service.EventuallyConsistentMapListener;
46import org.onosproject.store.service.MultiValuedTimestamp;
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -070047import org.onosproject.store.service.StorageService;
Phaneendra Mandab212bc92016-07-08 16:50:11 +053048import org.onosproject.store.service.WallClockTimestamp;
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -070049import org.onosproject.vtnrsc.AllowedAddressPair;
50import org.onosproject.vtnrsc.BindingHostId;
bobzhou16144ba2016-09-02 17:34:16 +080051import org.onosproject.vtnrsc.DefaultFloatingIp;
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -070052import org.onosproject.vtnrsc.DefaultVirtualPort;
53import org.onosproject.vtnrsc.FixedIp;
bobzhou16144ba2016-09-02 17:34:16 +080054import org.onosproject.vtnrsc.FloatingIp;
55import org.onosproject.vtnrsc.FloatingIpId;
56import org.onosproject.vtnrsc.RouterId;
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -070057import org.onosproject.vtnrsc.SecurityGroup;
58import org.onosproject.vtnrsc.SubnetId;
59import org.onosproject.vtnrsc.TenantId;
bobzhou16144ba2016-09-02 17:34:16 +080060import org.onosproject.vtnrsc.TenantNetwork;
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -070061import org.onosproject.vtnrsc.TenantNetworkId;
bobzhou16144ba2016-09-02 17:34:16 +080062import org.onosproject.vtnrsc.TenantRouter;
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -070063import org.onosproject.vtnrsc.VirtualPort;
64import org.onosproject.vtnrsc.VirtualPortId;
65import org.onosproject.vtnrsc.tenantnetwork.TenantNetworkService;
Phaneendra Mandab212bc92016-07-08 16:50:11 +053066import org.onosproject.vtnrsc.virtualport.VirtualPortEvent;
67import org.onosproject.vtnrsc.virtualport.VirtualPortListener;
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -070068import org.onosproject.vtnrsc.virtualport.VirtualPortService;
69import org.slf4j.Logger;
70import org.slf4j.LoggerFactory;
71
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -070072/**
73 * Provides implementation of the VirtualPort APIs.
74 */
75@Component(immediate = true)
76@Service
Phaneendra Mandab212bc92016-07-08 16:50:11 +053077public class VirtualPortManager extends AbstractListenerManager<VirtualPortEvent, VirtualPortListener>
78implements VirtualPortService {
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -070079
80 private final Logger log = LoggerFactory.getLogger(getClass());
81
bobzhou16144ba2016-09-02 17:34:16 +080082 private static final String VIRTUALPORT = "vtn-virtual-port-store";
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -070083 private static final String VTNRSC_APP = "org.onosproject.vtnrsc";
84
85 private static final String VIRTUALPORT_ID_NULL = "VirtualPort ID cannot be null";
86 private static final String VIRTUALPORT_NOT_NULL = "VirtualPort cannot be null";
87 private static final String TENANTID_NOT_NULL = "TenantId cannot be null";
88 private static final String NETWORKID_NOT_NULL = "NetworkId cannot be null";
89 private static final String DEVICEID_NOT_NULL = "DeviceId cannot be null";
lishuai69b36d52015-10-21 16:50:16 +080090 private static final String FIXEDIP_NOT_NULL = "FixedIp cannot be null";
Phaneendra Mandabd09d6e2016-07-15 19:47:51 +053091 private static final String MAC_NOT_NULL = "Mac address cannot be null";
lishuai858efd32015-12-04 14:30:36 +080092 private static final String IP_NOT_NULL = "Ip cannot be null";
Phaneendra Mandab212bc92016-07-08 16:50:11 +053093 private static final String EVENT_NOT_NULL = "event cannot be null";
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -070094
Phaneendra Mandab212bc92016-07-08 16:50:11 +053095 protected EventuallyConsistentMap<VirtualPortId, VirtualPort> vPortStore;
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -070096 protected ApplicationId appId;
97
98 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
99 protected StorageService storageService;
100
101 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
102 protected TenantNetworkService networkService;
103
104 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
105 protected CoreService coreService;
106
Phaneendra Mandab212bc92016-07-08 16:50:11 +0530107 private EventuallyConsistentMapListener<VirtualPortId, VirtualPort> virtualPortListener =
108 new InnerVirtualPortStoreListener();
109
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -0700110 @Activate
111 public void activate() {
112
113 appId = coreService.registerApplication(VTNRSC_APP);
114
Phaneendra Mandab212bc92016-07-08 16:50:11 +0530115 eventDispatcher.addSink(VirtualPortEvent.class, listenerRegistry);
116
bobzhou16144ba2016-09-02 17:34:16 +0800117 KryoNamespace.Builder serializer = KryoNamespace.newBuilder()
118 .register(KryoNamespaces.API)
119 .register(MultiValuedTimestamp.class)
120 .register(TenantNetworkId.class)
121 .register(Host.class)
122 .register(TenantNetwork.class)
123 .register(TenantNetworkId.class)
124 .register(TenantId.class)
125 .register(SubnetId.class)
126 .register(VirtualPortId.class)
127 .register(VirtualPort.State.class)
128 .register(AllowedAddressPair.class)
129 .register(FixedIp.class)
130 .register(FloatingIp.class)
131 .register(FloatingIpId.class)
132 .register(FloatingIp.Status.class)
133 .register(UUID.class)
134 .register(DefaultFloatingIp.class)
135 .register(BindingHostId.class)
136 .register(SecurityGroup.class)
137 .register(IpAddress.class)
138 .register(DefaultVirtualPort.class)
139 .register(RouterId.class)
140 .register(TenantRouter.class)
141 .register(VirtualPort.class);
142 vPortStore = storageService
143 .<VirtualPortId, VirtualPort>eventuallyConsistentMapBuilder()
144 .withName(VIRTUALPORT).withSerializer(serializer)
145 .withTimestampProvider((k, v) -> new WallClockTimestamp())
146 .build();
Phaneendra Mandab212bc92016-07-08 16:50:11 +0530147
148 vPortStore.addListener(virtualPortListener);
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -0700149 log.info("Started");
150 }
151
152 @Deactivate
153 public void deactivate() {
bobzhou16144ba2016-09-02 17:34:16 +0800154 vPortStore.removeListener(virtualPortListener);
155 vPortStore.destroy();
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -0700156 log.info("Stoppped");
157 }
158
159 @Override
160 public boolean exists(VirtualPortId vPortId) {
161 checkNotNull(vPortId, VIRTUALPORT_ID_NULL);
162 return vPortStore.containsKey(vPortId);
163 }
164
165 @Override
166 public VirtualPort getPort(VirtualPortId vPortId) {
167 checkNotNull(vPortId, VIRTUALPORT_ID_NULL);
168 return vPortStore.get(vPortId);
169 }
170
171 @Override
lishuai69b36d52015-10-21 16:50:16 +0800172 public VirtualPort getPort(FixedIp fixedIP) {
173 checkNotNull(fixedIP, FIXEDIP_NOT_NULL);
174 List<VirtualPort> vPorts = new ArrayList<>();
Sho SHIMIZUa09e1bb2016-08-01 14:25:25 -0700175 vPortStore.values().forEach(p -> {
lishuai69b36d52015-10-21 16:50:16 +0800176 Iterator<FixedIp> fixedIps = p.fixedIps().iterator();
177 while (fixedIps.hasNext()) {
178 if (fixedIps.next().equals(fixedIP)) {
179 vPorts.add(p);
180 break;
181 }
182 }
183 });
Jon Hallcbd1b392017-01-18 20:15:44 -0800184 if (vPorts.isEmpty()) {
lishuai69b36d52015-10-21 16:50:16 +0800185 return null;
186 }
187 return vPorts.get(0);
188 }
189
190 @Override
Phaneendra Mandabd09d6e2016-07-15 19:47:51 +0530191 public VirtualPort getPort(MacAddress mac) {
192 checkNotNull(mac, MAC_NOT_NULL);
193 List<VirtualPort> vPorts = new ArrayList<>();
Sho SHIMIZU8ebb04a2016-10-06 15:58:29 -0700194 vPortStore.values().forEach(p -> {
Phaneendra Mandabd09d6e2016-07-15 19:47:51 +0530195 if (p.macAddress().equals(mac)) {
196 vPorts.add(p);
197 }
198 });
Jon Hallcbd1b392017-01-18 20:15:44 -0800199 if (vPorts.isEmpty()) {
Phaneendra Mandabd09d6e2016-07-15 19:47:51 +0530200 return null;
201 }
202 return vPorts.get(0);
203 }
204
205 @Override
lishuai858efd32015-12-04 14:30:36 +0800206 public VirtualPort getPort(TenantNetworkId networkId, IpAddress ip) {
207 checkNotNull(networkId, NETWORKID_NOT_NULL);
208 checkNotNull(ip, IP_NOT_NULL);
209 List<VirtualPort> vPorts = new ArrayList<>();
210 vPortStore.values().stream().filter(p -> p.networkId().equals(networkId))
211 .forEach(p -> {
212 Iterator<FixedIp> fixedIps = p.fixedIps().iterator();
213 while (fixedIps.hasNext()) {
214 if (fixedIps.next().ip().equals(ip)) {
215 vPorts.add(p);
216 break;
217 }
218 }
219 });
Jon Hallcbd1b392017-01-18 20:15:44 -0800220 if (vPorts.isEmpty()) {
lishuai858efd32015-12-04 14:30:36 +0800221 return null;
222 }
223 return vPorts.get(0);
224 }
225
226 @Override
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -0700227 public Collection<VirtualPort> getPorts() {
228 return Collections.unmodifiableCollection(vPortStore.values());
229 }
230
231 @Override
232 public Collection<VirtualPort> getPorts(TenantNetworkId networkId) {
233 checkNotNull(networkId, NETWORKID_NOT_NULL);
lishuaid2f6a252015-09-14 15:30:49 +0800234 return vPortStore.values().stream().filter(d -> d.networkId().equals(networkId))
235 .collect(Collectors.toList());
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -0700236 }
237
238 @Override
239 public Collection<VirtualPort> getPorts(TenantId tenantId) {
240 checkNotNull(tenantId, TENANTID_NOT_NULL);
lishuaid2f6a252015-09-14 15:30:49 +0800241 return vPortStore.values().stream().filter(d -> d.tenantId().equals(tenantId))
242 .collect(Collectors.toList());
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -0700243 }
244
245 @Override
246 public Collection<VirtualPort> getPorts(DeviceId deviceId) {
247 checkNotNull(deviceId, DEVICEID_NOT_NULL);
lishuaid2f6a252015-09-14 15:30:49 +0800248 return vPortStore.values().stream().filter(d -> d.deviceId().equals(deviceId))
249 .collect(Collectors.toList());
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -0700250 }
251
252 @Override
253 public boolean createPorts(Iterable<VirtualPort> vPorts) {
254 checkNotNull(vPorts, VIRTUALPORT_NOT_NULL);
255 for (VirtualPort vPort : vPorts) {
256 log.debug("vPortId is {} ", vPort.portId().toString());
257 vPortStore.put(vPort.portId(), vPort);
258 if (!vPortStore.containsKey(vPort.portId())) {
259 log.debug("The virtualPort is created failed whose identifier is {} ",
260 vPort.portId().toString());
261 return false;
262 }
263 }
264 return true;
265 }
266
267 @Override
268 public boolean updatePorts(Iterable<VirtualPort> vPorts) {
269 checkNotNull(vPorts, VIRTUALPORT_NOT_NULL);
Sho SHIMIZU0fa6d3b2015-10-27 11:38:37 -0700270 for (VirtualPort vPort : vPorts) {
271 vPortStore.put(vPort.portId(), vPort);
272 if (!vPortStore.containsKey(vPort.portId())) {
273 log.debug("The virtualPort is not exist whose identifier is {}",
274 vPort.portId().toString());
275 return false;
276 }
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -0700277
Sho SHIMIZU0fa6d3b2015-10-27 11:38:37 -0700278 vPortStore.put(vPort.portId(), vPort);
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -0700279
Sho SHIMIZU0fa6d3b2015-10-27 11:38:37 -0700280 if (!vPort.equals(vPortStore.get(vPort.portId()))) {
281 log.debug("The virtualPort is updated failed whose identifier is {}",
282 vPort.portId().toString());
283 return false;
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -0700284 }
285 }
286 return true;
287 }
288
289 @Override
290 public boolean removePorts(Iterable<VirtualPortId> vPortIds) {
291 checkNotNull(vPortIds, VIRTUALPORT_ID_NULL);
Sho SHIMIZU0fa6d3b2015-10-27 11:38:37 -0700292 for (VirtualPortId vPortId : vPortIds) {
293 vPortStore.remove(vPortId);
294 if (vPortStore.containsKey(vPortId)) {
295 log.debug("The virtualPort is removed failed whose identifier is {}",
296 vPortId.toString());
297 return false;
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -0700298 }
299 }
300 return true;
301 }
302
Phaneendra Mandab212bc92016-07-08 16:50:11 +0530303 private class InnerVirtualPortStoreListener
304 implements
305 EventuallyConsistentMapListener<VirtualPortId, VirtualPort> {
306
307 @Override
308 public void event(EventuallyConsistentMapEvent<VirtualPortId, VirtualPort> event) {
309 checkNotNull(event, EVENT_NOT_NULL);
310 log.info("virtual port event raised");
311 VirtualPort virtualPort = event.value();
312 if (EventuallyConsistentMapEvent.Type.PUT == event.type()) {
313 notifyListeners(new VirtualPortEvent(
314 VirtualPortEvent.Type.VIRTUAL_PORT_PUT,
315 virtualPort));
316 }
317 if (EventuallyConsistentMapEvent.Type.REMOVE == event.type()) {
318 notifyListeners(new VirtualPortEvent(
319 VirtualPortEvent.Type.VIRTUAL_PORT_DELETE,
320 virtualPort));
321 }
322 }
323 }
324
325 /**
326 * Notifies specify event to all listeners.
327 *
328 * @param event virtual port event
329 */
330 private void notifyListeners(VirtualPortEvent event) {
331 checkNotNull(event, EVENT_NOT_NULL);
332 post(event);
333 }
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -0700334}