2 * Copyright IBM Corporation, 2013. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
9 package org.opendaylight.neutron.transcriber;
11 import com.google.common.collect.ImmutableBiMap;
13 import java.util.ArrayList;
14 import java.util.HashSet;
15 import java.util.List;
18 import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ProviderContext;
19 import org.opendaylight.neutron.spi.INeutronNetworkCRUD;
20 import org.opendaylight.neutron.spi.NeutronNetwork;
21 import org.opendaylight.neutron.spi.NeutronNetwork_Segment;
22 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.l3.ext.rev141002.NetworkL3Extension;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.l3.ext.rev141002.NetworkL3ExtensionBuilder;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev141002.networks.attributes.Networks;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev141002.networks.attributes.networks.Network;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev141002.networks.attributes.networks.NetworkBuilder;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.provider.ext.rev141002.neutron.networks.network.Segments;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.provider.ext.rev141002.neutron.networks.network.SegmentsBuilder;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev141002.NetworkTypeBase;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev141002.NetworkTypeFlat;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev141002.NetworkTypeGre;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev141002.NetworkTypeVlan;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev141002.NetworkTypeVxlan;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.provider.ext.rev141002.NetworkProviderExtension;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.provider.ext.rev141002.NetworkProviderExtensionBuilder;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.rev150325.Neutron;
38 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
39 import org.osgi.framework.BundleContext;
40 import org.osgi.framework.ServiceRegistration;
41 import org.slf4j.Logger;
42 import org.slf4j.LoggerFactory;
44 public class NeutronNetworkInterface extends AbstractNeutronInterface<Network,NeutronNetwork> implements INeutronNetworkCRUD {
45 private static final Logger LOGGER = LoggerFactory.getLogger(NeutronNetworkInterface.class);
47 private static final ImmutableBiMap<Class<? extends NetworkTypeBase>,String> NETWORK_MAP
48 = new ImmutableBiMap.Builder<Class<? extends NetworkTypeBase>,String>()
49 .put(NetworkTypeFlat.class,"flat")
50 .put(NetworkTypeGre.class,"gre")
51 .put(NetworkTypeVlan.class,"vlan")
52 .put(NetworkTypeVxlan.class,"vxlan")
55 NeutronNetworkInterface(ProviderContext providerContext) {
56 super(providerContext);
59 // IfNBNetworkCRUD methods
62 public boolean networkExists(String uuid) {
63 Network network = readMd(createInstanceIdentifier(toMd(uuid)));
64 if (network == null) {
71 public NeutronNetwork getNetwork(String uuid) {
72 Network network = readMd(createInstanceIdentifier(toMd(uuid)));
73 if (network == null) {
76 return fromMd(network);
80 public List<NeutronNetwork> getAllNetworks() {
81 Set<NeutronNetwork> allNetworks = new HashSet<NeutronNetwork>();
82 Networks networks = readMd(createInstanceIdentifier());
83 if (networks != null) {
84 for (Network network: networks.getNetwork()) {
85 allNetworks.add(fromMd(network));
88 LOGGER.debug("Exiting getAllNetworks, Found {} OpenStackNetworks", allNetworks.size());
89 List<NeutronNetwork> ans = new ArrayList<NeutronNetwork>();
90 ans.addAll(allNetworks);
95 public boolean addNetwork(NeutronNetwork input) {
96 if (networkExists(input.getID())) {
104 public boolean removeNetwork(String uuid) {
105 if (!networkExists(uuid)) {
108 return removeMd(toMd(uuid));
112 public boolean updateNetwork(String uuid, NeutronNetwork delta) {
113 if (!networkExists(uuid)) {
116 /* note: because what we get is *not* a delta but (at this point) the updated
117 * object, this is much simpler - just replace the value and update the mdsal
124 public boolean networkInUse(String netUUID) {
125 if (!networkExists(netUUID)) {
131 protected NeutronNetwork fromMd(Network network) {
132 NeutronNetwork result = new NeutronNetwork();
133 result.setAdminStateUp(network.isAdminStateUp());
134 result.setNetworkName(network.getName());
135 result.setShared(network.isShared());
136 result.setStatus(network.getStatus());
137 if (network.getSubnets() != null) {
138 List<String> neutronSubnets = new ArrayList<String>();
139 for( Uuid subnet : network.getSubnets()) {
140 neutronSubnets.add(String.valueOf(subnet));
142 result.setSubnets(neutronSubnets);
144 // todo remove '-' chars as tenant id doesn't use them
145 result.setTenantID(String.valueOf(network.getTenantId()));
146 result.setID(String.valueOf(network.getUuid()));
148 NetworkL3Extension l3Extension = network.getAugmentation(NetworkL3Extension.class);
149 result.setRouterExternal(l3Extension.isExternal());
151 NetworkProviderExtension providerExtension = network.getAugmentation(NetworkProviderExtension.class);
152 result.setProviderPhysicalNetwork(providerExtension.getPhysicalNetwork());
153 result.setProviderSegmentationID(providerExtension.getSegmentationId());
154 result.setProviderNetworkType(NETWORK_MAP.get(providerExtension.getNetworkType()));
155 List<NeutronNetwork_Segment> segments = new ArrayList<NeutronNetwork_Segment>();
156 if (providerExtension.getSegments() != null) {
157 for (Segments segment: providerExtension.getSegments()) {
158 NeutronNetwork_Segment neutronSegment = new NeutronNetwork_Segment();
159 neutronSegment.setProviderPhysicalNetwork(segment.getPhysicalNetwork());
160 neutronSegment.setProviderSegmentationID(segment.getSegmentationId());
161 neutronSegment.setProviderNetworkType(NETWORK_MAP.get(segment.getNetworkType()));
162 segments.add(neutronSegment);
165 result.setSegments(segments);
169 private void fillExtensions(NetworkBuilder networkBuilder,
170 NeutronNetwork network) {
171 NetworkL3ExtensionBuilder l3ExtensionBuilder = new NetworkL3ExtensionBuilder();
172 if (network.getRouterExternal() != null) {
173 l3ExtensionBuilder.setExternal(network.getRouterExternal());
176 NetworkProviderExtensionBuilder providerExtensionBuilder = new NetworkProviderExtensionBuilder();
177 if (network.getProviderPhysicalNetwork() != null) {
178 providerExtensionBuilder.setPhysicalNetwork(network.getProviderPhysicalNetwork());
180 if (network.getProviderSegmentationID() != null) {
181 providerExtensionBuilder.setSegmentationId(network.getProviderSegmentationID());
183 if (network.getProviderNetworkType() != null) {
184 ImmutableBiMap<String, Class<? extends NetworkTypeBase>> mapper =
185 NETWORK_MAP.inverse();
186 providerExtensionBuilder.setNetworkType((Class<? extends NetworkTypeBase>) mapper.get(network.getProviderNetworkType()));
188 if (network.getSegments() != null) {
189 List<Segments> segments = new ArrayList<Segments>();
191 for( NeutronNetwork_Segment segment : network.getSegments()) {
193 SegmentsBuilder segmentsBuilder = new SegmentsBuilder();
194 if (segment.getProviderPhysicalNetwork() != null) {
195 segmentsBuilder.setPhysicalNetwork(segment.getProviderPhysicalNetwork());
197 if (segment.getProviderSegmentationID() != null) {
198 segmentsBuilder.setSegmentationId(segment.getProviderSegmentationID());
200 if (segment.getProviderNetworkType() != null) {
201 ImmutableBiMap<String, Class<? extends NetworkTypeBase>> mapper =
202 NETWORK_MAP.inverse();
203 segmentsBuilder.setNetworkType((Class<? extends NetworkTypeBase>) mapper.get(segment.getProviderNetworkType()));
205 segmentsBuilder.setSegmentationIndex(Long.valueOf(count));
206 segments.add(segmentsBuilder.build());
208 providerExtensionBuilder.setSegments(segments);
210 if (network.getProviderSegmentationID() != null) {
211 providerExtensionBuilder.setSegmentationId(network.getProviderSegmentationID());
214 networkBuilder.addAugmentation(NetworkL3Extension.class,
215 l3ExtensionBuilder.build());
216 networkBuilder.addAugmentation(NetworkProviderExtension.class,
217 providerExtensionBuilder.build());
220 protected Network toMd(NeutronNetwork network) {
221 NetworkBuilder networkBuilder = new NetworkBuilder();
222 fillExtensions(networkBuilder, network);
224 networkBuilder.setAdminStateUp(network.getAdminStateUp());
225 if (network.getNetworkName() != null) {
226 networkBuilder.setName(network.getNetworkName());
228 if (network.getShared() != null) {
229 networkBuilder.setShared(network.getShared());
231 if (network.getStatus() != null) {
232 networkBuilder.setStatus(network.getStatus());
234 if (network.getSubnets() != null) {
235 List<Uuid> subnets = new ArrayList<Uuid>();
236 for( String subnet : network.getSubnets()) {
237 subnets.add(toUuid(subnet));
239 networkBuilder.setSubnets(subnets);
241 if (network.getTenantID() != null) {
242 networkBuilder.setTenantId(toUuid(network.getTenantID()));
244 if (network.getNetworkUUID() != null) {
245 networkBuilder.setUuid(toUuid(network.getNetworkUUID()));
247 LOGGER.warn("Attempting to write neutron network without UUID");
249 return networkBuilder.build();
252 protected Network toMd(String uuid) {
253 NetworkBuilder networkBuilder = new NetworkBuilder();
254 networkBuilder.setUuid(toUuid(uuid));
255 return networkBuilder.build();
259 protected InstanceIdentifier<Network> createInstanceIdentifier(Network network) {
260 return InstanceIdentifier.create(Neutron.class)
261 .child(Networks.class)
262 .child(Network.class,network.getKey());
265 protected InstanceIdentifier<Networks> createInstanceIdentifier() {
266 return InstanceIdentifier.create(Neutron.class)
267 .child(Networks.class);
270 public static void registerNewInterface(BundleContext context,
271 ProviderContext providerContext,
272 List<ServiceRegistration<?>> registrations) {
273 NeutronNetworkInterface neutronNetworkInterface = new NeutronNetworkInterface(providerContext);
274 ServiceRegistration<INeutronNetworkCRUD> neutronNetworkInterfaceRegistration = context.registerService(INeutronNetworkCRUD.class, neutronNetworkInterface, null);
275 if(neutronNetworkInterfaceRegistration != null) {
276 registrations.add(neutronNetworkInterfaceRegistration);