blob: b0c5df871ced4ad184c1c107a06bbf58808ea304 [file] [log] [blame]
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -07001/*
Brian O'Connor5ab426f2016-04-09 01:19:45 -07002 * Copyright 2015-present Open Networking Laboratory
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;
lishuaid2f6a252015-09-14 15:30:49 +080025import java.util.stream.Collectors;
26
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -070027import org.apache.felix.scr.annotations.Activate;
28import org.apache.felix.scr.annotations.Component;
29import org.apache.felix.scr.annotations.Deactivate;
30import org.apache.felix.scr.annotations.Reference;
31import org.apache.felix.scr.annotations.ReferenceCardinality;
32import org.apache.felix.scr.annotations.Service;
33import org.onlab.packet.IpAddress;
Phaneendra Mandabd09d6e2016-07-15 19:47:51 +053034import org.onlab.packet.MacAddress;
Phaneendra Mandab212bc92016-07-08 16:50:11 +053035import org.onlab.util.KryoNamespace;
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -070036import org.onosproject.core.ApplicationId;
37import org.onosproject.core.CoreService;
Phaneendra Mandab212bc92016-07-08 16:50:11 +053038import org.onosproject.event.AbstractListenerManager;
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -070039import org.onosproject.net.DeviceId;
40import org.onosproject.store.serializers.KryoNamespaces;
Phaneendra Mandab212bc92016-07-08 16:50:11 +053041import org.onosproject.store.service.EventuallyConsistentMap;
42import org.onosproject.store.service.EventuallyConsistentMapEvent;
43import org.onosproject.store.service.EventuallyConsistentMapListener;
44import org.onosproject.store.service.MultiValuedTimestamp;
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -070045import org.onosproject.store.service.StorageService;
Phaneendra Mandab212bc92016-07-08 16:50:11 +053046import org.onosproject.store.service.WallClockTimestamp;
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -070047import org.onosproject.vtnrsc.AllowedAddressPair;
48import org.onosproject.vtnrsc.BindingHostId;
49import org.onosproject.vtnrsc.DefaultVirtualPort;
50import org.onosproject.vtnrsc.FixedIp;
51import org.onosproject.vtnrsc.SecurityGroup;
52import org.onosproject.vtnrsc.SubnetId;
53import org.onosproject.vtnrsc.TenantId;
54import org.onosproject.vtnrsc.TenantNetworkId;
55import org.onosproject.vtnrsc.VirtualPort;
56import org.onosproject.vtnrsc.VirtualPortId;
57import org.onosproject.vtnrsc.tenantnetwork.TenantNetworkService;
Phaneendra Mandab212bc92016-07-08 16:50:11 +053058import org.onosproject.vtnrsc.virtualport.VirtualPortEvent;
59import org.onosproject.vtnrsc.virtualport.VirtualPortListener;
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -070060import org.onosproject.vtnrsc.virtualport.VirtualPortService;
61import org.slf4j.Logger;
62import org.slf4j.LoggerFactory;
63
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -070064/**
65 * Provides implementation of the VirtualPort APIs.
66 */
67@Component(immediate = true)
68@Service
Phaneendra Mandab212bc92016-07-08 16:50:11 +053069public class VirtualPortManager extends AbstractListenerManager<VirtualPortEvent, VirtualPortListener>
70implements VirtualPortService {
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -070071
72 private final Logger log = LoggerFactory.getLogger(getClass());
73
74 private static final String VIRTUALPORT = "vtn-virtual-port";
75 private static final String VTNRSC_APP = "org.onosproject.vtnrsc";
76
77 private static final String VIRTUALPORT_ID_NULL = "VirtualPort ID cannot be null";
78 private static final String VIRTUALPORT_NOT_NULL = "VirtualPort cannot be null";
79 private static final String TENANTID_NOT_NULL = "TenantId cannot be null";
80 private static final String NETWORKID_NOT_NULL = "NetworkId cannot be null";
81 private static final String DEVICEID_NOT_NULL = "DeviceId cannot be null";
lishuai69b36d52015-10-21 16:50:16 +080082 private static final String FIXEDIP_NOT_NULL = "FixedIp cannot be null";
Phaneendra Mandabd09d6e2016-07-15 19:47:51 +053083 private static final String MAC_NOT_NULL = "Mac address cannot be null";
lishuai858efd32015-12-04 14:30:36 +080084 private static final String IP_NOT_NULL = "Ip cannot be null";
Phaneendra Mandab212bc92016-07-08 16:50:11 +053085 private static final String EVENT_NOT_NULL = "event cannot be null";
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -070086
Phaneendra Mandab212bc92016-07-08 16:50:11 +053087 protected EventuallyConsistentMap<VirtualPortId, VirtualPort> vPortStore;
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -070088 protected ApplicationId appId;
89
90 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
91 protected StorageService storageService;
92
93 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
94 protected TenantNetworkService networkService;
95
96 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
97 protected CoreService coreService;
98
Phaneendra Mandab212bc92016-07-08 16:50:11 +053099 private EventuallyConsistentMapListener<VirtualPortId, VirtualPort> virtualPortListener =
100 new InnerVirtualPortStoreListener();
101
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -0700102 @Activate
103 public void activate() {
104
105 appId = coreService.registerApplication(VTNRSC_APP);
106
Phaneendra Mandab212bc92016-07-08 16:50:11 +0530107 eventDispatcher.addSink(VirtualPortEvent.class, listenerRegistry);
108
109 vPortStore = storageService.<VirtualPortId, VirtualPort>eventuallyConsistentMapBuilder()
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -0700110 .withName(VIRTUALPORT)
Phaneendra Mandab212bc92016-07-08 16:50:11 +0530111 .withSerializer(KryoNamespace.newBuilder().register(KryoNamespaces.API)
112 .register(MultiValuedTimestamp.class)
113 .register(VirtualPortId.class,
114 TenantNetworkId.class,
115 VirtualPort.State.class,
116 TenantId.class,
117 AllowedAddressPair.class,
118 FixedIp.class,
119 BindingHostId.class,
120 SecurityGroup.class,
121 SubnetId.class,
122 IpAddress.class,
123 DefaultVirtualPort.class))
124 .withTimestampProvider((k, v) ->new WallClockTimestamp())
125 .build();
126
127 vPortStore.addListener(virtualPortListener);
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -0700128 log.info("Started");
129 }
130
131 @Deactivate
132 public void deactivate() {
133 vPortStore.clear();
134 log.info("Stoppped");
135 }
136
137 @Override
138 public boolean exists(VirtualPortId vPortId) {
139 checkNotNull(vPortId, VIRTUALPORT_ID_NULL);
140 return vPortStore.containsKey(vPortId);
141 }
142
143 @Override
144 public VirtualPort getPort(VirtualPortId vPortId) {
145 checkNotNull(vPortId, VIRTUALPORT_ID_NULL);
146 return vPortStore.get(vPortId);
147 }
148
149 @Override
lishuai69b36d52015-10-21 16:50:16 +0800150 public VirtualPort getPort(FixedIp fixedIP) {
151 checkNotNull(fixedIP, FIXEDIP_NOT_NULL);
152 List<VirtualPort> vPorts = new ArrayList<>();
153 vPortStore.values().stream().forEach(p -> {
154 Iterator<FixedIp> fixedIps = p.fixedIps().iterator();
155 while (fixedIps.hasNext()) {
156 if (fixedIps.next().equals(fixedIP)) {
157 vPorts.add(p);
158 break;
159 }
160 }
161 });
162 if (vPorts.size() == 0) {
163 return null;
164 }
165 return vPorts.get(0);
166 }
167
168 @Override
Phaneendra Mandabd09d6e2016-07-15 19:47:51 +0530169 public VirtualPort getPort(MacAddress mac) {
170 checkNotNull(mac, MAC_NOT_NULL);
171 List<VirtualPort> vPorts = new ArrayList<>();
172 vPortStore.values().stream().forEach(p -> {
173 if (p.macAddress().equals(mac)) {
174 vPorts.add(p);
175 }
176 });
177 if (vPorts.size() == 0) {
178 return null;
179 }
180 return vPorts.get(0);
181 }
182
183 @Override
lishuai858efd32015-12-04 14:30:36 +0800184 public VirtualPort getPort(TenantNetworkId networkId, IpAddress ip) {
185 checkNotNull(networkId, NETWORKID_NOT_NULL);
186 checkNotNull(ip, IP_NOT_NULL);
187 List<VirtualPort> vPorts = new ArrayList<>();
188 vPortStore.values().stream().filter(p -> p.networkId().equals(networkId))
189 .forEach(p -> {
190 Iterator<FixedIp> fixedIps = p.fixedIps().iterator();
191 while (fixedIps.hasNext()) {
192 if (fixedIps.next().ip().equals(ip)) {
193 vPorts.add(p);
194 break;
195 }
196 }
197 });
198 if (vPorts.size() == 0) {
199 return null;
200 }
201 return vPorts.get(0);
202 }
203
204 @Override
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -0700205 public Collection<VirtualPort> getPorts() {
206 return Collections.unmodifiableCollection(vPortStore.values());
207 }
208
209 @Override
210 public Collection<VirtualPort> getPorts(TenantNetworkId networkId) {
211 checkNotNull(networkId, NETWORKID_NOT_NULL);
lishuaid2f6a252015-09-14 15:30:49 +0800212 return vPortStore.values().stream().filter(d -> d.networkId().equals(networkId))
213 .collect(Collectors.toList());
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -0700214 }
215
216 @Override
217 public Collection<VirtualPort> getPorts(TenantId tenantId) {
218 checkNotNull(tenantId, TENANTID_NOT_NULL);
lishuaid2f6a252015-09-14 15:30:49 +0800219 return vPortStore.values().stream().filter(d -> d.tenantId().equals(tenantId))
220 .collect(Collectors.toList());
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -0700221 }
222
223 @Override
224 public Collection<VirtualPort> getPorts(DeviceId deviceId) {
225 checkNotNull(deviceId, DEVICEID_NOT_NULL);
lishuaid2f6a252015-09-14 15:30:49 +0800226 return vPortStore.values().stream().filter(d -> d.deviceId().equals(deviceId))
227 .collect(Collectors.toList());
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -0700228 }
229
230 @Override
231 public boolean createPorts(Iterable<VirtualPort> vPorts) {
232 checkNotNull(vPorts, VIRTUALPORT_NOT_NULL);
233 for (VirtualPort vPort : vPorts) {
234 log.debug("vPortId is {} ", vPort.portId().toString());
235 vPortStore.put(vPort.portId(), vPort);
236 if (!vPortStore.containsKey(vPort.portId())) {
237 log.debug("The virtualPort is created failed whose identifier is {} ",
238 vPort.portId().toString());
239 return false;
240 }
241 }
242 return true;
243 }
244
245 @Override
246 public boolean updatePorts(Iterable<VirtualPort> vPorts) {
247 checkNotNull(vPorts, VIRTUALPORT_NOT_NULL);
Sho SHIMIZU0fa6d3b2015-10-27 11:38:37 -0700248 for (VirtualPort vPort : vPorts) {
249 vPortStore.put(vPort.portId(), vPort);
250 if (!vPortStore.containsKey(vPort.portId())) {
251 log.debug("The virtualPort is not exist whose identifier is {}",
252 vPort.portId().toString());
253 return false;
254 }
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -0700255
Sho SHIMIZU0fa6d3b2015-10-27 11:38:37 -0700256 vPortStore.put(vPort.portId(), vPort);
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -0700257
Sho SHIMIZU0fa6d3b2015-10-27 11:38:37 -0700258 if (!vPort.equals(vPortStore.get(vPort.portId()))) {
259 log.debug("The virtualPort is updated failed whose identifier is {}",
260 vPort.portId().toString());
261 return false;
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -0700262 }
263 }
264 return true;
265 }
266
267 @Override
268 public boolean removePorts(Iterable<VirtualPortId> vPortIds) {
269 checkNotNull(vPortIds, VIRTUALPORT_ID_NULL);
Sho SHIMIZU0fa6d3b2015-10-27 11:38:37 -0700270 for (VirtualPortId vPortId : vPortIds) {
271 vPortStore.remove(vPortId);
272 if (vPortStore.containsKey(vPortId)) {
273 log.debug("The virtualPort is removed failed whose identifier is {}",
274 vPortId.toString());
275 return false;
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -0700276 }
277 }
278 return true;
279 }
280
Phaneendra Mandab212bc92016-07-08 16:50:11 +0530281 private class InnerVirtualPortStoreListener
282 implements
283 EventuallyConsistentMapListener<VirtualPortId, VirtualPort> {
284
285 @Override
286 public void event(EventuallyConsistentMapEvent<VirtualPortId, VirtualPort> event) {
287 checkNotNull(event, EVENT_NOT_NULL);
288 log.info("virtual port event raised");
289 VirtualPort virtualPort = event.value();
290 if (EventuallyConsistentMapEvent.Type.PUT == event.type()) {
291 notifyListeners(new VirtualPortEvent(
292 VirtualPortEvent.Type.VIRTUAL_PORT_PUT,
293 virtualPort));
294 }
295 if (EventuallyConsistentMapEvent.Type.REMOVE == event.type()) {
296 notifyListeners(new VirtualPortEvent(
297 VirtualPortEvent.Type.VIRTUAL_PORT_DELETE,
298 virtualPort));
299 }
300 }
301 }
302
303 /**
304 * Notifies specify event to all listeners.
305 *
306 * @param event virtual port event
307 */
308 private void notifyListeners(VirtualPortEvent event) {
309 checkNotNull(event, EVENT_NOT_NULL);
310 post(event);
311 }
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -0700312}