2 * Copyright (c) 2013, 2015 IBM Corporation and others. 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.netvirt.openstack.netvirt.translator.crud.impl;
11 import java.util.ArrayList;
12 import java.util.HashSet;
13 import java.util.List;
16 import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ProviderContext;
17 import org.opendaylight.netvirt.openstack.netvirt.translator.NeutronNetwork;
18 import org.opendaylight.netvirt.openstack.netvirt.translator.crud.INeutronNetworkCRUD;
19 import org.opendaylight.netvirt.openstack.netvirt.translator.NeutronNetwork_Segment;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.l3.ext.rev150712.NetworkL3Extension;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.l3.ext.rev150712.NetworkL3ExtensionBuilder;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.NetworkTypeBase;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.NetworkTypeFlat;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.NetworkTypeGre;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.NetworkTypeVlan;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.NetworkTypeVxlan;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.networks.attributes.Networks;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.networks.attributes.networks.Network;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.networks.attributes.networks.NetworkBuilder;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.provider.ext.rev150712.NetworkProviderExtension;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.provider.ext.rev150712.NetworkProviderExtensionBuilder;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.provider.ext.rev150712.neutron.networks.network.Segments;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.provider.ext.rev150712.neutron.networks.network.SegmentsBuilder;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.rev150712.Neutron;
35 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
36 import org.osgi.framework.BundleContext;
37 import org.osgi.framework.ServiceRegistration;
38 import org.slf4j.Logger;
39 import org.slf4j.LoggerFactory;
41 import com.google.common.collect.ImmutableBiMap;
43 public class NeutronNetworkInterface extends AbstractNeutronInterface<Network,NeutronNetwork> implements INeutronNetworkCRUD {
44 private static final Logger LOGGER = LoggerFactory.getLogger(NeutronNetworkInterface.class);
46 private static final ImmutableBiMap<Class<? extends NetworkTypeBase>,String> NETWORK_MAP
47 = new ImmutableBiMap.Builder<Class<? extends NetworkTypeBase>,String>()
48 .put(NetworkTypeFlat.class,"flat")
49 .put(NetworkTypeGre.class,"gre")
50 .put(NetworkTypeVlan.class,"vlan")
51 .put(NetworkTypeVxlan.class,"vxlan")
54 NeutronNetworkInterface(ProviderContext providerContext) {
55 super(providerContext);
58 // IfNBNetworkCRUD methods
61 public boolean networkExists(String uuid) {
62 Network network = readMd(createInstanceIdentifier(toMd(uuid)));
63 if (network == null) {
70 public NeutronNetwork getNetwork(String uuid) {
71 Network network = readMd(createInstanceIdentifier(toMd(uuid)));
72 if (network == null) {
75 return fromMd(network);
79 public List<NeutronNetwork> getAllNetworks() {
80 Set<NeutronNetwork> allNetworks = new HashSet<>();
81 Networks networks = readMd(createInstanceIdentifier());
82 if (networks != null) {
83 for (Network network: networks.getNetwork()) {
84 allNetworks.add(fromMd(network));
87 LOGGER.debug("Exiting getAllNetworks, Found {} OpenStackNetworks", allNetworks.size());
88 List<NeutronNetwork> ans = new ArrayList<>();
89 ans.addAll(allNetworks);
94 public boolean addNetwork(NeutronNetwork input) {
95 if (networkExists(input.getID())) {
103 public boolean removeNetwork(String uuid) {
104 if (!networkExists(uuid)) {
107 return removeMd(toMd(uuid));
111 public boolean updateNetwork(String uuid, NeutronNetwork delta) {
112 if (!networkExists(uuid)) {
115 /* note: because what we get is *not* a delta but (at this point) the updated
116 * object, this is much simpler - just replace the value and update the mdsal
123 public boolean networkInUse(String netUUID) {
124 if (!networkExists(netUUID)) {
130 protected NeutronNetwork fromMd(Network network) {
131 NeutronNetwork result = new NeutronNetwork();
132 result.setAdminStateUp(network.isAdminStateUp());
133 result.setNetworkName(network.getName());
134 result.setShared(network.isShared());
135 result.setStatus(network.getStatus());
136 // todo remove '-' chars as tenant id doesn't use them
137 result.setTenantID(network.getTenantId().getValue());
138 result.setID(network.getUuid().getValue());
140 NetworkL3Extension l3Extension = network.getAugmentation(NetworkL3Extension.class);
141 result.setRouterExternal(l3Extension.isExternal());
143 NetworkProviderExtension providerExtension = network.getAugmentation(NetworkProviderExtension.class);
144 result.setProviderPhysicalNetwork(providerExtension.getPhysicalNetwork());
145 result.setProviderSegmentationID(providerExtension.getSegmentationId());
146 result.setProviderNetworkType(NETWORK_MAP.get(providerExtension.getNetworkType()));
147 List<NeutronNetwork_Segment> segments = new ArrayList<>();
148 if (providerExtension.getSegments() != null) {
149 for (Segments segment: providerExtension.getSegments()) {
150 NeutronNetwork_Segment neutronSegment = new NeutronNetwork_Segment();
151 neutronSegment.setProviderPhysicalNetwork(segment.getPhysicalNetwork());
152 neutronSegment.setProviderSegmentationID(segment.getSegmentationId());
153 neutronSegment.setProviderNetworkType(NETWORK_MAP.get(segment.getNetworkType()));
154 segments.add(neutronSegment);
157 result.setSegments(segments);
161 private void fillExtensions(NetworkBuilder networkBuilder,
162 NeutronNetwork network) {
163 NetworkL3ExtensionBuilder l3ExtensionBuilder = new NetworkL3ExtensionBuilder();
164 if (network.getRouterExternal() != null) {
165 l3ExtensionBuilder.setExternal(network.getRouterExternal());
168 NetworkProviderExtensionBuilder providerExtensionBuilder = new NetworkProviderExtensionBuilder();
169 if (network.getProviderPhysicalNetwork() != null) {
170 providerExtensionBuilder.setPhysicalNetwork(network.getProviderPhysicalNetwork());
172 if (network.getProviderSegmentationID() != null) {
173 providerExtensionBuilder.setSegmentationId(network.getProviderSegmentationID());
175 if (network.getProviderNetworkType() != null) {
176 ImmutableBiMap<String, Class<? extends NetworkTypeBase>> mapper =
177 NETWORK_MAP.inverse();
178 providerExtensionBuilder.setNetworkType(mapper.get(network.getProviderNetworkType()));
180 if (network.getSegments() != null) {
181 List<Segments> segments = new ArrayList<>();
183 for( NeutronNetwork_Segment segment : network.getSegments()) {
185 SegmentsBuilder segmentsBuilder = new SegmentsBuilder();
186 if (segment.getProviderPhysicalNetwork() != null) {
187 segmentsBuilder.setPhysicalNetwork(segment.getProviderPhysicalNetwork());
189 if (segment.getProviderSegmentationID() != null) {
190 segmentsBuilder.setSegmentationId(segment.getProviderSegmentationID());
192 if (segment.getProviderNetworkType() != null) {
193 ImmutableBiMap<String, Class<? extends NetworkTypeBase>> mapper =
194 NETWORK_MAP.inverse();
195 segmentsBuilder.setNetworkType(mapper.get(segment.getProviderNetworkType()));
197 segmentsBuilder.setSegmentationIndex(count);
198 segments.add(segmentsBuilder.build());
200 providerExtensionBuilder.setSegments(segments);
202 if (network.getProviderSegmentationID() != null) {
203 providerExtensionBuilder.setSegmentationId(network.getProviderSegmentationID());
206 networkBuilder.addAugmentation(NetworkL3Extension.class,
207 l3ExtensionBuilder.build());
208 networkBuilder.addAugmentation(NetworkProviderExtension.class,
209 providerExtensionBuilder.build());
212 protected Network toMd(NeutronNetwork network) {
213 NetworkBuilder networkBuilder = new NetworkBuilder();
214 fillExtensions(networkBuilder, network);
216 networkBuilder.setAdminStateUp(network.getAdminStateUp());
217 if (network.getNetworkName() != null) {
218 networkBuilder.setName(network.getNetworkName());
220 if (network.getShared() != null) {
221 networkBuilder.setShared(network.getShared());
223 if (network.getStatus() != null) {
224 networkBuilder.setStatus(network.getStatus());
226 if (network.getTenantID() != null) {
227 networkBuilder.setTenantId(toUuid(network.getTenantID()));
229 if (network.getNetworkUUID() != null) {
230 networkBuilder.setUuid(toUuid(network.getNetworkUUID()));
232 LOGGER.warn("Attempting to write neutron network without UUID");
234 return networkBuilder.build();
237 protected Network toMd(String uuid) {
238 NetworkBuilder networkBuilder = new NetworkBuilder();
239 networkBuilder.setUuid(toUuid(uuid));
240 return networkBuilder.build();
244 protected InstanceIdentifier<Network> createInstanceIdentifier(Network network) {
245 return InstanceIdentifier.create(Neutron.class)
246 .child(Networks.class)
247 .child(Network.class,network.getKey());
250 protected InstanceIdentifier<Networks> createInstanceIdentifier() {
251 return InstanceIdentifier.create(Neutron.class)
252 .child(Networks.class);
255 public static void registerNewInterface(BundleContext context,
256 ProviderContext providerContext,
257 List<ServiceRegistration<?>> registrations) {
258 NeutronNetworkInterface neutronNetworkInterface = new NeutronNetworkInterface(providerContext);
259 ServiceRegistration<INeutronNetworkCRUD> neutronNetworkInterfaceRegistration = context.registerService(INeutronNetworkCRUD.class, neutronNetworkInterface, null);
260 if(neutronNetworkInterfaceRegistration != null) {
261 registrations.add(neutronNetworkInterfaceRegistration);