blob: daec7839533ad067d4286ecb32ba8125f116da25 [file] [log] [blame]
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -07001/*
2 * Copyright 2015 Open Networking Laboratory
3 *
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.Arrays;
22import java.util.Collection;
23import java.util.Collections;
lishuai69b36d52015-10-21 16:50:16 +080024import java.util.Iterator;
25import java.util.List;
lishuaid2f6a252015-09-14 15:30:49 +080026import java.util.Map;
27import java.util.stream.Collectors;
28
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -070029import org.apache.felix.scr.annotations.Activate;
30import org.apache.felix.scr.annotations.Component;
31import org.apache.felix.scr.annotations.Deactivate;
32import org.apache.felix.scr.annotations.Reference;
33import org.apache.felix.scr.annotations.ReferenceCardinality;
34import org.apache.felix.scr.annotations.Service;
35import org.onlab.packet.IpAddress;
36import org.onosproject.core.ApplicationId;
37import org.onosproject.core.CoreService;
38import org.onosproject.net.DeviceId;
39import org.onosproject.store.serializers.KryoNamespaces;
40import org.onosproject.store.service.Serializer;
41import org.onosproject.store.service.StorageService;
42import org.onosproject.vtnrsc.AllowedAddressPair;
43import org.onosproject.vtnrsc.BindingHostId;
44import org.onosproject.vtnrsc.DefaultVirtualPort;
45import org.onosproject.vtnrsc.FixedIp;
46import org.onosproject.vtnrsc.SecurityGroup;
47import org.onosproject.vtnrsc.SubnetId;
48import org.onosproject.vtnrsc.TenantId;
49import org.onosproject.vtnrsc.TenantNetworkId;
50import org.onosproject.vtnrsc.VirtualPort;
51import org.onosproject.vtnrsc.VirtualPortId;
52import org.onosproject.vtnrsc.tenantnetwork.TenantNetworkService;
53import org.onosproject.vtnrsc.virtualport.VirtualPortService;
54import org.slf4j.Logger;
55import org.slf4j.LoggerFactory;
56
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -070057/**
58 * Provides implementation of the VirtualPort APIs.
59 */
60@Component(immediate = true)
61@Service
62public class VirtualPortManager implements VirtualPortService {
63
64 private final Logger log = LoggerFactory.getLogger(getClass());
65
66 private static final String VIRTUALPORT = "vtn-virtual-port";
67 private static final String VTNRSC_APP = "org.onosproject.vtnrsc";
68
69 private static final String VIRTUALPORT_ID_NULL = "VirtualPort ID cannot be null";
70 private static final String VIRTUALPORT_NOT_NULL = "VirtualPort cannot be null";
71 private static final String TENANTID_NOT_NULL = "TenantId cannot be null";
72 private static final String NETWORKID_NOT_NULL = "NetworkId cannot be null";
73 private static final String DEVICEID_NOT_NULL = "DeviceId cannot be null";
lishuai69b36d52015-10-21 16:50:16 +080074 private static final String FIXEDIP_NOT_NULL = "FixedIp cannot be null";
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -070075
76 protected Map<VirtualPortId, VirtualPort> vPortStore;
77 protected ApplicationId appId;
78
79 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
80 protected StorageService storageService;
81
82 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
83 protected TenantNetworkService networkService;
84
85 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
86 protected CoreService coreService;
87
88 @Activate
89 public void activate() {
90
91 appId = coreService.registerApplication(VTNRSC_APP);
92
93 vPortStore = storageService.<VirtualPortId, VirtualPort>consistentMapBuilder()
94 .withName(VIRTUALPORT)
95 .withApplicationId(appId)
96 .withPurgeOnUninstall()
97 .withSerializer(Serializer.using(Arrays.asList(KryoNamespaces.API),
98 VirtualPortId.class,
99 TenantNetworkId.class,
100 VirtualPort.State.class,
101 TenantId.class,
102 AllowedAddressPair.class,
103 FixedIp.class,
104 BindingHostId.class,
105 SecurityGroup.class,
106 SubnetId.class,
107 IpAddress.class,
108 DefaultVirtualPort.class))
109 .build().asJavaMap();
110 log.info("Started");
111 }
112
113 @Deactivate
114 public void deactivate() {
115 vPortStore.clear();
116 log.info("Stoppped");
117 }
118
119 @Override
120 public boolean exists(VirtualPortId vPortId) {
121 checkNotNull(vPortId, VIRTUALPORT_ID_NULL);
122 return vPortStore.containsKey(vPortId);
123 }
124
125 @Override
126 public VirtualPort getPort(VirtualPortId vPortId) {
127 checkNotNull(vPortId, VIRTUALPORT_ID_NULL);
128 return vPortStore.get(vPortId);
129 }
130
131 @Override
lishuai69b36d52015-10-21 16:50:16 +0800132 public VirtualPort getPort(FixedIp fixedIP) {
133 checkNotNull(fixedIP, FIXEDIP_NOT_NULL);
134 List<VirtualPort> vPorts = new ArrayList<>();
135 vPortStore.values().stream().forEach(p -> {
136 Iterator<FixedIp> fixedIps = p.fixedIps().iterator();
137 while (fixedIps.hasNext()) {
138 if (fixedIps.next().equals(fixedIP)) {
139 vPorts.add(p);
140 break;
141 }
142 }
143 });
144 if (vPorts.size() == 0) {
145 return null;
146 }
147 return vPorts.get(0);
148 }
149
150 @Override
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -0700151 public Collection<VirtualPort> getPorts() {
152 return Collections.unmodifiableCollection(vPortStore.values());
153 }
154
155 @Override
156 public Collection<VirtualPort> getPorts(TenantNetworkId networkId) {
157 checkNotNull(networkId, NETWORKID_NOT_NULL);
lishuaid2f6a252015-09-14 15:30:49 +0800158 return vPortStore.values().stream().filter(d -> d.networkId().equals(networkId))
159 .collect(Collectors.toList());
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -0700160 }
161
162 @Override
163 public Collection<VirtualPort> getPorts(TenantId tenantId) {
164 checkNotNull(tenantId, TENANTID_NOT_NULL);
lishuaid2f6a252015-09-14 15:30:49 +0800165 return vPortStore.values().stream().filter(d -> d.tenantId().equals(tenantId))
166 .collect(Collectors.toList());
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -0700167 }
168
169 @Override
170 public Collection<VirtualPort> getPorts(DeviceId deviceId) {
171 checkNotNull(deviceId, DEVICEID_NOT_NULL);
lishuaid2f6a252015-09-14 15:30:49 +0800172 return vPortStore.values().stream().filter(d -> d.deviceId().equals(deviceId))
173 .collect(Collectors.toList());
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -0700174 }
175
176 @Override
177 public boolean createPorts(Iterable<VirtualPort> vPorts) {
178 checkNotNull(vPorts, VIRTUALPORT_NOT_NULL);
179 for (VirtualPort vPort : vPorts) {
180 log.debug("vPortId is {} ", vPort.portId().toString());
181 vPortStore.put(vPort.portId(), vPort);
182 if (!vPortStore.containsKey(vPort.portId())) {
183 log.debug("The virtualPort is created failed whose identifier is {} ",
184 vPort.portId().toString());
185 return false;
186 }
187 }
188 return true;
189 }
190
191 @Override
192 public boolean updatePorts(Iterable<VirtualPort> vPorts) {
193 checkNotNull(vPorts, VIRTUALPORT_NOT_NULL);
Sho SHIMIZU0fa6d3b2015-10-27 11:38:37 -0700194 for (VirtualPort vPort : vPorts) {
195 vPortStore.put(vPort.portId(), vPort);
196 if (!vPortStore.containsKey(vPort.portId())) {
197 log.debug("The virtualPort is not exist whose identifier is {}",
198 vPort.portId().toString());
199 return false;
200 }
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -0700201
Sho SHIMIZU0fa6d3b2015-10-27 11:38:37 -0700202 vPortStore.put(vPort.portId(), vPort);
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -0700203
Sho SHIMIZU0fa6d3b2015-10-27 11:38:37 -0700204 if (!vPort.equals(vPortStore.get(vPort.portId()))) {
205 log.debug("The virtualPort is updated failed whose identifier is {}",
206 vPort.portId().toString());
207 return false;
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -0700208 }
209 }
210 return true;
211 }
212
213 @Override
214 public boolean removePorts(Iterable<VirtualPortId> vPortIds) {
215 checkNotNull(vPortIds, VIRTUALPORT_ID_NULL);
Sho SHIMIZU0fa6d3b2015-10-27 11:38:37 -0700216 for (VirtualPortId vPortId : vPortIds) {
217 vPortStore.remove(vPortId);
218 if (vPortStore.containsKey(vPortId)) {
219 log.debug("The virtualPort is removed failed whose identifier is {}",
220 vPortId.toString());
221 return false;
Sho SHIMIZUb2b2d982015-09-11 15:35:06 -0700222 }
223 }
224 return true;
225 }
226
227}