blob: d352cb3852c31d067ba022db754a0563d2dd44cd [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 Mandab212bc92016-07-08 16:50:11 +053034import org.onlab.util.KryoNamespace;
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -070035import org.onosproject.core.ApplicationId;
36import org.onosproject.core.CoreService;
Phaneendra Mandab212bc92016-07-08 16:50:11 +053037import org.onosproject.event.AbstractListenerManager;
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -070038import org.onosproject.net.DeviceId;
39import org.onosproject.store.serializers.KryoNamespaces;
Phaneendra Mandab212bc92016-07-08 16:50:11 +053040import org.onosproject.store.service.EventuallyConsistentMap;
41import org.onosproject.store.service.EventuallyConsistentMapEvent;
42import org.onosproject.store.service.EventuallyConsistentMapListener;
43import org.onosproject.store.service.MultiValuedTimestamp;
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -070044import org.onosproject.store.service.StorageService;
Phaneendra Mandab212bc92016-07-08 16:50:11 +053045import org.onosproject.store.service.WallClockTimestamp;
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -070046import org.onosproject.vtnrsc.AllowedAddressPair;
47import org.onosproject.vtnrsc.BindingHostId;
48import org.onosproject.vtnrsc.DefaultVirtualPort;
49import org.onosproject.vtnrsc.FixedIp;
50import org.onosproject.vtnrsc.SecurityGroup;
51import org.onosproject.vtnrsc.SubnetId;
52import org.onosproject.vtnrsc.TenantId;
53import org.onosproject.vtnrsc.TenantNetworkId;
54import org.onosproject.vtnrsc.VirtualPort;
55import org.onosproject.vtnrsc.VirtualPortId;
56import org.onosproject.vtnrsc.tenantnetwork.TenantNetworkService;
Phaneendra Mandab212bc92016-07-08 16:50:11 +053057import org.onosproject.vtnrsc.virtualport.VirtualPortEvent;
58import org.onosproject.vtnrsc.virtualport.VirtualPortListener;
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -070059import org.onosproject.vtnrsc.virtualport.VirtualPortService;
60import org.slf4j.Logger;
61import org.slf4j.LoggerFactory;
62
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -070063/**
64 * Provides implementation of the VirtualPort APIs.
65 */
66@Component(immediate = true)
67@Service
Phaneendra Mandab212bc92016-07-08 16:50:11 +053068public class VirtualPortManager extends AbstractListenerManager<VirtualPortEvent, VirtualPortListener>
69implements VirtualPortService {
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -070070
71 private final Logger log = LoggerFactory.getLogger(getClass());
72
73 private static final String VIRTUALPORT = "vtn-virtual-port";
74 private static final String VTNRSC_APP = "org.onosproject.vtnrsc";
75
76 private static final String VIRTUALPORT_ID_NULL = "VirtualPort ID cannot be null";
77 private static final String VIRTUALPORT_NOT_NULL = "VirtualPort cannot be null";
78 private static final String TENANTID_NOT_NULL = "TenantId cannot be null";
79 private static final String NETWORKID_NOT_NULL = "NetworkId cannot be null";
80 private static final String DEVICEID_NOT_NULL = "DeviceId cannot be null";
lishuai69b36d52015-10-21 16:50:16 +080081 private static final String FIXEDIP_NOT_NULL = "FixedIp cannot be null";
lishuai858efd32015-12-04 14:30:36 +080082 private static final String IP_NOT_NULL = "Ip cannot be null";
Phaneendra Mandab212bc92016-07-08 16:50:11 +053083 private static final String EVENT_NOT_NULL = "event cannot be null";
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -070084
Phaneendra Mandab212bc92016-07-08 16:50:11 +053085 protected EventuallyConsistentMap<VirtualPortId, VirtualPort> vPortStore;
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -070086 protected ApplicationId appId;
87
88 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
89 protected StorageService storageService;
90
91 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
92 protected TenantNetworkService networkService;
93
94 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
95 protected CoreService coreService;
96
Phaneendra Mandab212bc92016-07-08 16:50:11 +053097 private EventuallyConsistentMapListener<VirtualPortId, VirtualPort> virtualPortListener =
98 new InnerVirtualPortStoreListener();
99
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -0700100 @Activate
101 public void activate() {
102
103 appId = coreService.registerApplication(VTNRSC_APP);
104
Phaneendra Mandab212bc92016-07-08 16:50:11 +0530105 eventDispatcher.addSink(VirtualPortEvent.class, listenerRegistry);
106
107 vPortStore = storageService.<VirtualPortId, VirtualPort>eventuallyConsistentMapBuilder()
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -0700108 .withName(VIRTUALPORT)
Phaneendra Mandab212bc92016-07-08 16:50:11 +0530109 .withSerializer(KryoNamespace.newBuilder().register(KryoNamespaces.API)
110 .register(MultiValuedTimestamp.class)
111 .register(VirtualPortId.class,
112 TenantNetworkId.class,
113 VirtualPort.State.class,
114 TenantId.class,
115 AllowedAddressPair.class,
116 FixedIp.class,
117 BindingHostId.class,
118 SecurityGroup.class,
119 SubnetId.class,
120 IpAddress.class,
121 DefaultVirtualPort.class))
122 .withTimestampProvider((k, v) ->new WallClockTimestamp())
123 .build();
124
125 vPortStore.addListener(virtualPortListener);
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -0700126 log.info("Started");
127 }
128
129 @Deactivate
130 public void deactivate() {
131 vPortStore.clear();
132 log.info("Stoppped");
133 }
134
135 @Override
136 public boolean exists(VirtualPortId vPortId) {
137 checkNotNull(vPortId, VIRTUALPORT_ID_NULL);
138 return vPortStore.containsKey(vPortId);
139 }
140
141 @Override
142 public VirtualPort getPort(VirtualPortId vPortId) {
143 checkNotNull(vPortId, VIRTUALPORT_ID_NULL);
144 return vPortStore.get(vPortId);
145 }
146
147 @Override
lishuai69b36d52015-10-21 16:50:16 +0800148 public VirtualPort getPort(FixedIp fixedIP) {
149 checkNotNull(fixedIP, FIXEDIP_NOT_NULL);
150 List<VirtualPort> vPorts = new ArrayList<>();
151 vPortStore.values().stream().forEach(p -> {
152 Iterator<FixedIp> fixedIps = p.fixedIps().iterator();
153 while (fixedIps.hasNext()) {
154 if (fixedIps.next().equals(fixedIP)) {
155 vPorts.add(p);
156 break;
157 }
158 }
159 });
160 if (vPorts.size() == 0) {
161 return null;
162 }
163 return vPorts.get(0);
164 }
165
166 @Override
lishuai858efd32015-12-04 14:30:36 +0800167 public VirtualPort getPort(TenantNetworkId networkId, IpAddress ip) {
168 checkNotNull(networkId, NETWORKID_NOT_NULL);
169 checkNotNull(ip, IP_NOT_NULL);
170 List<VirtualPort> vPorts = new ArrayList<>();
171 vPortStore.values().stream().filter(p -> p.networkId().equals(networkId))
172 .forEach(p -> {
173 Iterator<FixedIp> fixedIps = p.fixedIps().iterator();
174 while (fixedIps.hasNext()) {
175 if (fixedIps.next().ip().equals(ip)) {
176 vPorts.add(p);
177 break;
178 }
179 }
180 });
181 if (vPorts.size() == 0) {
182 return null;
183 }
184 return vPorts.get(0);
185 }
186
187 @Override
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -0700188 public Collection<VirtualPort> getPorts() {
189 return Collections.unmodifiableCollection(vPortStore.values());
190 }
191
192 @Override
193 public Collection<VirtualPort> getPorts(TenantNetworkId networkId) {
194 checkNotNull(networkId, NETWORKID_NOT_NULL);
lishuaid2f6a252015-09-14 15:30:49 +0800195 return vPortStore.values().stream().filter(d -> d.networkId().equals(networkId))
196 .collect(Collectors.toList());
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -0700197 }
198
199 @Override
200 public Collection<VirtualPort> getPorts(TenantId tenantId) {
201 checkNotNull(tenantId, TENANTID_NOT_NULL);
lishuaid2f6a252015-09-14 15:30:49 +0800202 return vPortStore.values().stream().filter(d -> d.tenantId().equals(tenantId))
203 .collect(Collectors.toList());
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -0700204 }
205
206 @Override
207 public Collection<VirtualPort> getPorts(DeviceId deviceId) {
208 checkNotNull(deviceId, DEVICEID_NOT_NULL);
lishuaid2f6a252015-09-14 15:30:49 +0800209 return vPortStore.values().stream().filter(d -> d.deviceId().equals(deviceId))
210 .collect(Collectors.toList());
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -0700211 }
212
213 @Override
214 public boolean createPorts(Iterable<VirtualPort> vPorts) {
215 checkNotNull(vPorts, VIRTUALPORT_NOT_NULL);
216 for (VirtualPort vPort : vPorts) {
217 log.debug("vPortId is {} ", vPort.portId().toString());
218 vPortStore.put(vPort.portId(), vPort);
219 if (!vPortStore.containsKey(vPort.portId())) {
220 log.debug("The virtualPort is created failed whose identifier is {} ",
221 vPort.portId().toString());
222 return false;
223 }
224 }
225 return true;
226 }
227
228 @Override
229 public boolean updatePorts(Iterable<VirtualPort> vPorts) {
230 checkNotNull(vPorts, VIRTUALPORT_NOT_NULL);
Sho SHIMIZU0fa6d3b2015-10-27 11:38:37 -0700231 for (VirtualPort vPort : vPorts) {
232 vPortStore.put(vPort.portId(), vPort);
233 if (!vPortStore.containsKey(vPort.portId())) {
234 log.debug("The virtualPort is not exist whose identifier is {}",
235 vPort.portId().toString());
236 return false;
237 }
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -0700238
Sho SHIMIZU0fa6d3b2015-10-27 11:38:37 -0700239 vPortStore.put(vPort.portId(), vPort);
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -0700240
Sho SHIMIZU0fa6d3b2015-10-27 11:38:37 -0700241 if (!vPort.equals(vPortStore.get(vPort.portId()))) {
242 log.debug("The virtualPort is updated failed whose identifier is {}",
243 vPort.portId().toString());
244 return false;
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -0700245 }
246 }
247 return true;
248 }
249
250 @Override
251 public boolean removePorts(Iterable<VirtualPortId> vPortIds) {
252 checkNotNull(vPortIds, VIRTUALPORT_ID_NULL);
Sho SHIMIZU0fa6d3b2015-10-27 11:38:37 -0700253 for (VirtualPortId vPortId : vPortIds) {
254 vPortStore.remove(vPortId);
255 if (vPortStore.containsKey(vPortId)) {
256 log.debug("The virtualPort is removed failed whose identifier is {}",
257 vPortId.toString());
258 return false;
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -0700259 }
260 }
261 return true;
262 }
263
Phaneendra Mandab212bc92016-07-08 16:50:11 +0530264 private class InnerVirtualPortStoreListener
265 implements
266 EventuallyConsistentMapListener<VirtualPortId, VirtualPort> {
267
268 @Override
269 public void event(EventuallyConsistentMapEvent<VirtualPortId, VirtualPort> event) {
270 checkNotNull(event, EVENT_NOT_NULL);
271 log.info("virtual port event raised");
272 VirtualPort virtualPort = event.value();
273 if (EventuallyConsistentMapEvent.Type.PUT == event.type()) {
274 notifyListeners(new VirtualPortEvent(
275 VirtualPortEvent.Type.VIRTUAL_PORT_PUT,
276 virtualPort));
277 }
278 if (EventuallyConsistentMapEvent.Type.REMOVE == event.type()) {
279 notifyListeners(new VirtualPortEvent(
280 VirtualPortEvent.Type.VIRTUAL_PORT_DELETE,
281 virtualPort));
282 }
283 }
284 }
285
286 /**
287 * Notifies specify event to all listeners.
288 *
289 * @param event virtual port event
290 */
291 private void notifyListeners(VirtualPortEvent event) {
292 checkNotNull(event, EVENT_NOT_NULL);
293 post(event);
294 }
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -0700295}