blob: fdeed257cca887f510e108040bc6b65de396a706 [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";
69
70 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
71 protected VirtualNetworkStore store;
72
Brian Stanke0e5c94e2016-03-08 11:20:04 -050073 private VirtualNetworkStoreDelegate delegate = this::post;
Thomas Vachuska33979fd2015-07-31 11:41:14 -070074
Thomas Vachuska3d62fd72015-09-25 14:58:13 -070075 // TODO: figure out how to coordinate "implementation" of a virtual network in a cluster
Thomas Vachuska33979fd2015-07-31 11:41:14 -070076
77 @Activate
78 protected void activate() {
79 store.setDelegate(delegate);
Brian Stanke0e5c94e2016-03-08 11:20:04 -050080 eventDispatcher.addSink(VirtualNetworkEvent.class, listenerRegistry);
81
Thomas Vachuska33979fd2015-07-31 11:41:14 -070082 log.info("Started");
83 }
84
85 @Deactivate
86 protected void deactivate() {
87 store.unsetDelegate(delegate);
Brian Stanke0e5c94e2016-03-08 11:20:04 -050088 eventDispatcher.removeSink(VirtualNetworkEvent.class);
89
Thomas Vachuska33979fd2015-07-31 11:41:14 -070090 log.info("Stopped");
91 }
92
93 @Override
94 public void registerTenantId(TenantId tenantId) {
95 checkNotNull(tenantId, TENANT_NULL);
96 store.addTenantId(tenantId);
97 }
98
99 @Override
100 public void unregisterTenantId(TenantId tenantId) {
101 checkNotNull(tenantId, TENANT_NULL);
102 store.removeTenantId(tenantId);
103 }
104
105 @Override
106 public Set<TenantId> getTenantIds() {
107 return store.getTenantIds();
108 }
109
110 @Override
111 public VirtualNetwork createVirtualNetwork(TenantId tenantId) {
112 checkNotNull(tenantId, TENANT_NULL);
113 return store.addNetwork(tenantId);
114 }
115
116 @Override
117 public void removeVirtualNetwork(NetworkId networkId) {
118 checkNotNull(networkId, NETWORK_NULL);
119 store.removeNetwork(networkId);
120 }
121
122 @Override
123 public VirtualDevice createVirtualDevice(NetworkId networkId, DeviceId deviceId) {
124 checkNotNull(networkId, NETWORK_NULL);
125 checkNotNull(deviceId, DEVICE_NULL);
126 return store.addDevice(networkId, deviceId);
127 }
128
129 @Override
130 public void removeVirtualDevice(NetworkId networkId, DeviceId deviceId) {
131 checkNotNull(networkId, NETWORK_NULL);
132 checkNotNull(deviceId, DEVICE_NULL);
133 store.removeDevice(networkId, deviceId);
134 }
135
136 @Override
137 public VirtualLink createVirtualLink(NetworkId networkId,
138 ConnectPoint src, ConnectPoint dst,
139 TunnelId realizedBy) {
140 checkNotNull(networkId, NETWORK_NULL);
141 checkNotNull(src, LINK_POINT_NULL);
142 checkNotNull(dst, LINK_POINT_NULL);
143 checkNotNull(realizedBy, "Tunnel ID cannot be null");
144 return store.addLink(networkId, src, dst, realizedBy);
145 }
146
147 @Override
148 public void removeVirtualLink(NetworkId networkId, ConnectPoint src, ConnectPoint dst) {
149 checkNotNull(networkId, NETWORK_NULL);
150 checkNotNull(src, LINK_POINT_NULL);
151 checkNotNull(dst, LINK_POINT_NULL);
152 store.removeLink(networkId, src, dst);
153 }
154
155 @Override
156 public VirtualPort createVirtualPort(NetworkId networkId, DeviceId deviceId,
157 PortNumber portNumber, Port realizedBy) {
158 checkNotNull(networkId, NETWORK_NULL);
159 checkNotNull(deviceId, DEVICE_NULL);
160 checkNotNull(portNumber, "Port description cannot be null");
161 return store.addPort(networkId, deviceId, portNumber, realizedBy);
162 }
163
164 @Override
165 public void removeVirtualPort(NetworkId networkId, DeviceId deviceId, PortNumber portNumber) {
166 checkNotNull(networkId, NETWORK_NULL);
167 checkNotNull(deviceId, DEVICE_NULL);
168 checkNotNull(portNumber, "Port number cannot be null");
169 store.removePort(networkId, deviceId, portNumber);
170 }
171
172 @Override
173 public Set<VirtualNetwork> getVirtualNetworks(TenantId tenantId) {
174 checkNotNull(tenantId, TENANT_NULL);
175 return store.getNetworks(tenantId);
176 }
177
178 @Override
179 public Set<VirtualDevice> getVirtualDevices(NetworkId networkId) {
180 checkNotNull(networkId, NETWORK_NULL);
181 return store.getDevices(networkId);
182 }
183
184 @Override
185 public Set<VirtualLink> getVirtualLinks(NetworkId networkId) {
186 checkNotNull(networkId, NETWORK_NULL);
187 return store.getLinks(networkId);
188 }
189
190 @Override
191 public Set<VirtualPort> getVirtualPorts(NetworkId networkId, DeviceId deviceId) {
192 checkNotNull(networkId, NETWORK_NULL);
193 checkNotNull(deviceId, DEVICE_NULL);
194 return store.getPorts(networkId, deviceId);
195 }
196
197 @Override
198 public <T> T get(NetworkId networkId, Class<T> serviceClass) {
199 checkNotNull(networkId, NETWORK_NULL);
200 return null;
201 }
202
Thomas Vachuska3d62fd72015-09-25 14:58:13 -0700203 @Override
204 protected VirtualNetworkProviderService createProviderService(VirtualNetworkProvider provider) {
205 return new InternalVirtualNetworkProviderService(provider);
206 }
207
208 // Service issued to registered virtual network providers so that they
209 // can interact with the core.
210 private class InternalVirtualNetworkProviderService
211 extends AbstractProviderService<VirtualNetworkProvider>
212 implements VirtualNetworkProviderService {
213 InternalVirtualNetworkProviderService(VirtualNetworkProvider provider) {
214 super(provider);
215 }
216 }
217
Thomas Vachuska33979fd2015-07-31 11:41:14 -0700218}