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.neutron.transcriber;
11 import com.google.common.collect.ImmutableBiMap;
13 import java.util.ArrayList;
14 import java.util.List;
16 import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ProviderContext;
17 import org.opendaylight.neutron.spi.INeutronNetworkCRUD;
18 import org.opendaylight.neutron.spi.NeutronNetwork;
19 import org.opendaylight.neutron.spi.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.networks.attributes.Networks;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.networks.attributes.networks.Network;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.networks.attributes.networks.NetworkBuilder;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.provider.ext.rev150712.neutron.networks.network.Segments;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.provider.ext.rev150712.neutron.networks.network.SegmentsBuilder;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.NetworkTypeBase;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.NetworkTypeFlat;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.NetworkTypeGre;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.NetworkTypeVlan;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.NetworkTypeVxlan;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.provider.ext.rev150712.NetworkProviderExtension;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.provider.ext.rev150712.NetworkProviderExtensionBuilder;
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 public class NeutronNetworkInterface extends AbstractNeutronInterface<Network, Networks, NeutronNetwork> implements INeutronNetworkCRUD {
42 private static final Logger LOGGER = LoggerFactory.getLogger(NeutronNetworkInterface.class);
44 private static final ImmutableBiMap<Class<? extends NetworkTypeBase>,String> NETWORK_MAP
45 = new ImmutableBiMap.Builder<Class<? extends NetworkTypeBase>,String>()
46 .put(NetworkTypeFlat.class,"flat")
47 .put(NetworkTypeGre.class,"gre")
48 .put(NetworkTypeVlan.class,"vlan")
49 .put(NetworkTypeVxlan.class,"vxlan")
52 NeutronNetworkInterface(ProviderContext providerContext) {
53 super(providerContext);
56 // IfNBNetworkCRUD methods
59 public boolean networkExists(String uuid) {
64 public NeutronNetwork getNetwork(String uuid) {
69 protected List<Network> getDataObjectList(Networks networks) {
70 return networks.getNetwork();
74 public List<NeutronNetwork> getAllNetworks() {
79 public boolean addNetwork(NeutronNetwork input) {
84 public boolean removeNetwork(String uuid) {
89 public boolean updateNetwork(String uuid, NeutronNetwork delta) {
90 /* note: because what we get is *not* a delta but (at this point) the updated
91 * object, this is much simpler - just replace the value and update the mdsal
93 return update(uuid, delta);
97 public boolean networkInUse(String netUUID) {
98 return !exists(netUUID);
101 protected NeutronNetwork fromMd(Network network) {
102 final NeutronNetwork result = new NeutronNetwork();
103 result.initDefaults();
104 result.setAdminStateUp(network.isAdminStateUp());
105 result.setNetworkName(network.getName());
106 result.setShared(network.isShared());
107 result.setStatus(network.getStatus());
108 result.setTenantID(network.getTenantId());
109 result.setID(network.getUuid().getValue());
111 final NetworkL3Extension l3Extension = network.getAugmentation(NetworkL3Extension.class);
112 result.setRouterExternal(l3Extension.isExternal());
114 final NetworkProviderExtension providerExtension = network.getAugmentation(NetworkProviderExtension.class);
115 result.setProviderPhysicalNetwork(providerExtension.getPhysicalNetwork());
116 result.setProviderSegmentationID(providerExtension.getSegmentationId());
117 result.setProviderNetworkType(NETWORK_MAP.get(providerExtension.getNetworkType()));
118 final List<NeutronNetwork_Segment> segments = new ArrayList<NeutronNetwork_Segment>();
119 if (providerExtension.getSegments() != null) {
120 for (final Segments segment: providerExtension.getSegments()) {
121 final NeutronNetwork_Segment neutronSegment = new NeutronNetwork_Segment();
122 neutronSegment.setProviderPhysicalNetwork(segment.getPhysicalNetwork());
123 neutronSegment.setProviderSegmentationID(segment.getSegmentationId());
124 neutronSegment.setProviderNetworkType(NETWORK_MAP.get(segment.getNetworkType()));
125 segments.add(neutronSegment);
128 result.setSegments(segments);
132 private void fillExtensions(NetworkBuilder networkBuilder,
133 NeutronNetwork network) {
134 final NetworkL3ExtensionBuilder l3ExtensionBuilder = new NetworkL3ExtensionBuilder();
135 if (network.getRouterExternal() != null) {
136 l3ExtensionBuilder.setExternal(network.getRouterExternal());
139 final NetworkProviderExtensionBuilder providerExtensionBuilder = new NetworkProviderExtensionBuilder();
140 if (network.getProviderPhysicalNetwork() != null) {
141 providerExtensionBuilder.setPhysicalNetwork(network.getProviderPhysicalNetwork());
143 if (network.getProviderSegmentationID() != null) {
144 providerExtensionBuilder.setSegmentationId(network.getProviderSegmentationID());
146 if (network.getProviderNetworkType() != null) {
147 final ImmutableBiMap<String, Class<? extends NetworkTypeBase>> mapper =
148 NETWORK_MAP.inverse();
149 providerExtensionBuilder.setNetworkType((Class<? extends NetworkTypeBase>) mapper.get(network.getProviderNetworkType()));
151 if (network.getSegments() != null) {
152 final List<Segments> segments = new ArrayList<Segments>();
154 for( final NeutronNetwork_Segment segment : network.getSegments()) {
156 final SegmentsBuilder segmentsBuilder = new SegmentsBuilder();
157 if (segment.getProviderPhysicalNetwork() != null) {
158 segmentsBuilder.setPhysicalNetwork(segment.getProviderPhysicalNetwork());
160 if (segment.getProviderSegmentationID() != null) {
161 segmentsBuilder.setSegmentationId(segment.getProviderSegmentationID());
163 if (segment.getProviderNetworkType() != null) {
164 final ImmutableBiMap<String, Class<? extends NetworkTypeBase>> mapper =
165 NETWORK_MAP.inverse();
166 segmentsBuilder.setNetworkType((Class<? extends NetworkTypeBase>) mapper.get(segment.getProviderNetworkType()));
168 segmentsBuilder.setSegmentationIndex(Long.valueOf(count));
169 segments.add(segmentsBuilder.build());
171 providerExtensionBuilder.setSegments(segments);
173 if (network.getProviderSegmentationID() != null) {
174 providerExtensionBuilder.setSegmentationId(network.getProviderSegmentationID());
177 networkBuilder.addAugmentation(NetworkL3Extension.class,
178 l3ExtensionBuilder.build());
179 networkBuilder.addAugmentation(NetworkProviderExtension.class,
180 providerExtensionBuilder.build());
183 protected Network toMd(NeutronNetwork network) {
184 final NetworkBuilder networkBuilder = new NetworkBuilder();
185 fillExtensions(networkBuilder, network);
187 networkBuilder.setAdminStateUp(network.getAdminStateUp());
188 if (network.getNetworkName() != null) {
189 networkBuilder.setName(network.getNetworkName());
191 if (network.getShared() != null) {
192 networkBuilder.setShared(network.getShared());
194 if (network.getStatus() != null) {
195 networkBuilder.setStatus(network.getStatus());
197 if (network.getTenantID() != null) {
198 networkBuilder.setTenantId(toUuid(network.getTenantID()));
200 if (network.getID() != null) {
201 networkBuilder.setUuid(toUuid(network.getID()));
203 LOGGER.warn("Attempting to write neutron network without UUID");
205 return networkBuilder.build();
208 protected Network toMd(String uuid) {
209 final NetworkBuilder networkBuilder = new NetworkBuilder();
210 networkBuilder.setUuid(toUuid(uuid));
211 return networkBuilder.build();
215 protected InstanceIdentifier<Network> createInstanceIdentifier(Network network) {
216 return InstanceIdentifier.create(Neutron.class)
217 .child(Networks.class)
218 .child(Network.class,network.getKey());
222 protected InstanceIdentifier<Networks> createInstanceIdentifier() {
223 return InstanceIdentifier.create(Neutron.class)
224 .child(Networks.class);
227 public static void registerNewInterface(BundleContext context,
228 ProviderContext providerContext,
229 List<ServiceRegistration<?>> registrations) {
230 final NeutronNetworkInterface neutronNetworkInterface = new NeutronNetworkInterface(providerContext);
231 final ServiceRegistration<INeutronNetworkCRUD> neutronNetworkInterfaceRegistration = context.registerService(INeutronNetworkCRUD.class, neutronNetworkInterface, null);
232 if(neutronNetworkInterfaceRegistration != null) {
233 registrations.add(neutronNetworkInterfaceRegistration);