blob: 012b250a7231ada840a55f690efc09a93a621fd7 [file] [log] [blame]
Thomas Vachuska33979fd2015-07-31 11:41:14 -07001/*
Brian O'Connor5ab426f2016-04-09 01:19:45 -07002 * Copyright 2015-present Open Networking Laboratory
Thomas Vachuska33979fd2015-07-31 11:41:14 -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.incubator.net.virtual.impl;
17
18import org.apache.felix.scr.annotations.Activate;
19import org.apache.felix.scr.annotations.Component;
20import org.apache.felix.scr.annotations.Deactivate;
21import org.apache.felix.scr.annotations.Reference;
22import org.apache.felix.scr.annotations.ReferenceCardinality;
23import org.apache.felix.scr.annotations.Service;
Thomas Vachuska33979fd2015-07-31 11:41:14 -070024import org.onosproject.incubator.net.tunnel.TunnelId;
25import org.onosproject.incubator.net.virtual.NetworkId;
26import org.onosproject.incubator.net.virtual.TenantId;
27import org.onosproject.incubator.net.virtual.VirtualDevice;
28import org.onosproject.incubator.net.virtual.VirtualLink;
29import org.onosproject.incubator.net.virtual.VirtualNetwork;
30import org.onosproject.incubator.net.virtual.VirtualNetworkAdminService;
31import org.onosproject.incubator.net.virtual.VirtualNetworkEvent;
32import org.onosproject.incubator.net.virtual.VirtualNetworkListener;
Thomas Vachuska3d62fd72015-09-25 14:58:13 -070033import org.onosproject.incubator.net.virtual.VirtualNetworkProvider;
34import org.onosproject.incubator.net.virtual.VirtualNetworkProviderRegistry;
35import org.onosproject.incubator.net.virtual.VirtualNetworkProviderService;
Thomas Vachuska33979fd2015-07-31 11:41:14 -070036import org.onosproject.incubator.net.virtual.VirtualNetworkService;
37import org.onosproject.incubator.net.virtual.VirtualNetworkStore;
38import org.onosproject.incubator.net.virtual.VirtualNetworkStoreDelegate;
39import org.onosproject.incubator.net.virtual.VirtualPort;
40import org.onosproject.net.ConnectPoint;
41import org.onosproject.net.DeviceId;
42import org.onosproject.net.Port;
43import org.onosproject.net.PortNumber;
Thomas Vachuska3d62fd72015-09-25 14:58:13 -070044import org.onosproject.net.provider.AbstractListenerProviderRegistry;
45import org.onosproject.net.provider.AbstractProviderService;
Thomas Vachuska33979fd2015-07-31 11:41:14 -070046import org.slf4j.Logger;
47import org.slf4j.LoggerFactory;
48
49import java.util.Set;
50
51import static com.google.common.base.Preconditions.checkNotNull;
52
53/**
54 * Implementation of the virtual network service.
55 */
56@Component(immediate = true)
57@Service
58public class VirtualNetworkManager
Thomas Vachuska3d62fd72015-09-25 14:58:13 -070059 extends AbstractListenerProviderRegistry<VirtualNetworkEvent, VirtualNetworkListener,
Brian Stanke0e5c94e2016-03-08 11:20:04 -050060 VirtualNetworkProvider, VirtualNetworkProviderService>
Thomas Vachuska3d62fd72015-09-25 14:58:13 -070061 implements VirtualNetworkService, VirtualNetworkAdminService, VirtualNetworkProviderRegistry {
Thomas Vachuska33979fd2015-07-31 11:41:14 -070062
63 private final Logger log = LoggerFactory.getLogger(getClass());
64
65 private static final String TENANT_NULL = "Tenant ID cannot be null";
66 private static final String NETWORK_NULL = "Network ID cannot be null";
67 private static final String DEVICE_NULL = "Device ID cannot be null";
68 private static final String LINK_POINT_NULL = "Link end-point cannot be null";
Brian Stanke9a108972016-04-11 15:25:17 -040069 private static final String VIRTUAL_LINK_NULL = "Virtual Link cannot be null";
Thomas Vachuska33979fd2015-07-31 11:41:14 -070070
71 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
72 protected VirtualNetworkStore store;
73
Brian Stanke0e5c94e2016-03-08 11:20:04 -050074 private VirtualNetworkStoreDelegate delegate = this::post;
Thomas Vachuska33979fd2015-07-31 11:41:14 -070075
Thomas Vachuska3d62fd72015-09-25 14:58:13 -070076 // TODO: figure out how to coordinate "implementation" of a virtual network in a cluster
Thomas Vachuska33979fd2015-07-31 11:41:14 -070077
78 @Activate
79 protected void activate() {
80 store.setDelegate(delegate);
Brian Stanke0e5c94e2016-03-08 11:20:04 -050081 eventDispatcher.addSink(VirtualNetworkEvent.class, listenerRegistry);
82
Thomas Vachuska33979fd2015-07-31 11:41:14 -070083 log.info("Started");
84 }
85
86 @Deactivate
87 protected void deactivate() {
88 store.unsetDelegate(delegate);
Brian Stanke0e5c94e2016-03-08 11:20:04 -050089 eventDispatcher.removeSink(VirtualNetworkEvent.class);
90
Thomas Vachuska33979fd2015-07-31 11:41:14 -070091 log.info("Stopped");
92 }
93
94 @Override
95 public void registerTenantId(TenantId tenantId) {
96 checkNotNull(tenantId, TENANT_NULL);
97 store.addTenantId(tenantId);
98 }
99
100 @Override
101 public void unregisterTenantId(TenantId tenantId) {
102 checkNotNull(tenantId, TENANT_NULL);
103 store.removeTenantId(tenantId);
104 }
105
106 @Override
107 public Set<TenantId> getTenantIds() {
108 return store.getTenantIds();
109 }
110
111 @Override
112 public VirtualNetwork createVirtualNetwork(TenantId tenantId) {
113 checkNotNull(tenantId, TENANT_NULL);
114 return store.addNetwork(tenantId);
115 }
116
117 @Override
118 public void removeVirtualNetwork(NetworkId networkId) {
119 checkNotNull(networkId, NETWORK_NULL);
120 store.removeNetwork(networkId);
121 }
122
123 @Override
124 public VirtualDevice createVirtualDevice(NetworkId networkId, DeviceId deviceId) {
125 checkNotNull(networkId, NETWORK_NULL);
126 checkNotNull(deviceId, DEVICE_NULL);
127 return store.addDevice(networkId, deviceId);
128 }
129
130 @Override
131 public void removeVirtualDevice(NetworkId networkId, DeviceId deviceId) {
132 checkNotNull(networkId, NETWORK_NULL);
133 checkNotNull(deviceId, DEVICE_NULL);
134 store.removeDevice(networkId, deviceId);
135 }
136
137 @Override
138 public VirtualLink createVirtualLink(NetworkId networkId,
Brian Stanke9a108972016-04-11 15:25:17 -0400139 ConnectPoint src, ConnectPoint dst) {
Thomas Vachuska33979fd2015-07-31 11:41:14 -0700140 checkNotNull(networkId, NETWORK_NULL);
141 checkNotNull(src, LINK_POINT_NULL);
142 checkNotNull(dst, LINK_POINT_NULL);
Brian Stanke9a108972016-04-11 15:25:17 -0400143 VirtualLink virtualLink = store.addLink(networkId, src, dst, null);
144 checkNotNull(virtualLink, VIRTUAL_LINK_NULL);
145
146 if (virtualLink.providerId() != null) {
147 VirtualNetworkProvider provider = getProvider(virtualLink.providerId());
148 if (provider != null) {
149 TunnelId tunnelId = provider.createTunnel(networkId, mapVirtualToPhysicalPort(networkId, src),
150 mapVirtualToPhysicalPort(networkId, dst));
151 store.updateLink(virtualLink, tunnelId);
152 }
153 }
154 return virtualLink;
155 }
156
157 /**
158 * Maps the virtual connect point to a physical connect point.
159 *
160 * @param networkId network identifier
161 * @param virtualCp virtual connect point
162 * @return physical connect point
163 */
164 private ConnectPoint mapVirtualToPhysicalPort(NetworkId networkId,
165 ConnectPoint virtualCp) {
166 Set<VirtualPort> ports = store.getPorts(networkId, virtualCp.deviceId());
167 for (VirtualPort port : ports) {
168 if (port.element().id().equals(virtualCp.elementId()) &&
169 port.number().equals(virtualCp.port())) {
170 return new ConnectPoint(port.realizedBy().element().id(), port.realizedBy().number());
171 }
172 }
173 return null;
Thomas Vachuska33979fd2015-07-31 11:41:14 -0700174 }
175
176 @Override
177 public void removeVirtualLink(NetworkId networkId, ConnectPoint src, ConnectPoint dst) {
178 checkNotNull(networkId, NETWORK_NULL);
179 checkNotNull(src, LINK_POINT_NULL);
180 checkNotNull(dst, LINK_POINT_NULL);
Brian Stanke9a108972016-04-11 15:25:17 -0400181 VirtualLink virtualLink = store.removeLink(networkId, src, dst);
182
183 if (virtualLink != null && virtualLink.providerId() != null) {
184 VirtualNetworkProvider provider = getProvider(virtualLink.providerId());
185 if (provider != null) {
186 provider.destroyTunnel(networkId, virtualLink.tunnelId());
187 }
188 }
Thomas Vachuska33979fd2015-07-31 11:41:14 -0700189 }
190
191 @Override
192 public VirtualPort createVirtualPort(NetworkId networkId, DeviceId deviceId,
193 PortNumber portNumber, Port realizedBy) {
194 checkNotNull(networkId, NETWORK_NULL);
195 checkNotNull(deviceId, DEVICE_NULL);
196 checkNotNull(portNumber, "Port description cannot be null");
197 return store.addPort(networkId, deviceId, portNumber, realizedBy);
198 }
199
200 @Override
201 public void removeVirtualPort(NetworkId networkId, DeviceId deviceId, PortNumber portNumber) {
202 checkNotNull(networkId, NETWORK_NULL);
203 checkNotNull(deviceId, DEVICE_NULL);
204 checkNotNull(portNumber, "Port number cannot be null");
205 store.removePort(networkId, deviceId, portNumber);
206 }
207
208 @Override
209 public Set<VirtualNetwork> getVirtualNetworks(TenantId tenantId) {
210 checkNotNull(tenantId, TENANT_NULL);
211 return store.getNetworks(tenantId);
212 }
213
214 @Override
215 public Set<VirtualDevice> getVirtualDevices(NetworkId networkId) {
216 checkNotNull(networkId, NETWORK_NULL);
217 return store.getDevices(networkId);
218 }
219
220 @Override
221 public Set<VirtualLink> getVirtualLinks(NetworkId networkId) {
222 checkNotNull(networkId, NETWORK_NULL);
223 return store.getLinks(networkId);
224 }
225
226 @Override
227 public Set<VirtualPort> getVirtualPorts(NetworkId networkId, DeviceId deviceId) {
228 checkNotNull(networkId, NETWORK_NULL);
229 checkNotNull(deviceId, DEVICE_NULL);
230 return store.getPorts(networkId, deviceId);
231 }
232
233 @Override
234 public <T> T get(NetworkId networkId, Class<T> serviceClass) {
235 checkNotNull(networkId, NETWORK_NULL);
236 return null;
237 }
238
Thomas Vachuska3d62fd72015-09-25 14:58:13 -0700239 @Override
240 protected VirtualNetworkProviderService createProviderService(VirtualNetworkProvider provider) {
241 return new InternalVirtualNetworkProviderService(provider);
242 }
243
244 // Service issued to registered virtual network providers so that they
245 // can interact with the core.
246 private class InternalVirtualNetworkProviderService
247 extends AbstractProviderService<VirtualNetworkProvider>
248 implements VirtualNetworkProviderService {
249 InternalVirtualNetworkProviderService(VirtualNetworkProvider provider) {
250 super(provider);
251 }
Brian Stanke4d579882016-04-22 13:28:46 -0400252
253 @Override
254 public void tunnelUp(NetworkId networkId, ConnectPoint src, ConnectPoint dst) {
255
256 }
257
258 @Override
259 public void tunnelDown(NetworkId networkId, ConnectPoint src, ConnectPoint dst) {
260
261 }
Thomas Vachuska3d62fd72015-09-25 14:58:13 -0700262 }
263
Thomas Vachuska33979fd2015-07-31 11:41:14 -0700264}