Merge "neutron-spi: Introduce base class for Neutron object"
[neutron.git] / transcriber / src / main / java / org / opendaylight / neutron / transcriber / NeutronNetworkInterface.java
1 /*
2  * Copyright (c) 2013, 2015 IBM Corporation and others.  All rights reserved.
3  *
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
7  */
8
9 package org.opendaylight.neutron.transcriber;
10
11 import com.google.common.collect.ImmutableBiMap;
12
13 import java.util.ArrayList;
14 import java.util.HashSet;
15 import java.util.List;
16 import java.util.Set;
17
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;
43
44 public class NeutronNetworkInterface extends AbstractNeutronInterface<Network,NeutronNetwork> implements INeutronNetworkCRUD {
45     private static final Logger LOGGER = LoggerFactory.getLogger(NeutronNetworkInterface.class);
46
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")
53             .build();
54
55     NeutronNetworkInterface(ProviderContext providerContext) {
56         super(providerContext);
57     }
58
59     // IfNBNetworkCRUD methods
60
61     @Override
62     public boolean networkExists(String uuid) {
63         Network network = readMd(createInstanceIdentifier(toMd(uuid)));
64         if (network == null) {
65             return false;
66         }
67         return true;
68     }
69
70     @Override
71     public NeutronNetwork getNetwork(String uuid) {
72         return get(uuid);
73     }
74
75     @Override
76     public List<NeutronNetwork> getAll() {
77         Set<NeutronNetwork> allNetworks = new HashSet<NeutronNetwork>();
78         Networks networks = readMd(createInstanceIdentifier());
79         if (networks != null) {
80             for (Network network: networks.getNetwork()) {
81                 allNetworks.add(fromMd(network));
82             }
83         }
84         LOGGER.debug("Exiting getAllNetworks, Found {} OpenStackNetworks", allNetworks.size());
85         List<NeutronNetwork> ans = new ArrayList<NeutronNetwork>();
86         ans.addAll(allNetworks);
87         return ans;
88     }
89
90     @Override
91     public List<NeutronNetwork> getAllNetworks() {
92         return getAll();
93     }
94
95     @Override
96     public boolean addNetwork(NeutronNetwork input) {
97         return add(input);
98     }
99
100     @Override
101     public boolean removeNetwork(String uuid) {
102         return remove(uuid);
103     }
104
105     @Override
106     public boolean updateNetwork(String uuid, NeutronNetwork delta) {
107 /* note: because what we get is *not* a delta but (at this point) the updated
108  * object, this is much simpler - just replace the value and update the mdsal
109  * with it */
110         return update(uuid, delta);
111     }
112
113     @Override
114     public boolean networkInUse(String netUUID) {
115         return !exists(netUUID);
116     }
117
118     protected NeutronNetwork fromMd(Network network) {
119         NeutronNetwork result = new NeutronNetwork();
120         result.setAdminStateUp(network.isAdminStateUp());
121         result.setNetworkName(network.getName());
122         result.setShared(network.isShared());
123         result.setStatus(network.getStatus());
124         if (network.getSubnets() != null) {
125             List<String> neutronSubnets = new ArrayList<String>();
126             for( Uuid subnet : network.getSubnets()) {
127                neutronSubnets.add(subnet.getValue());
128             }
129             result.setSubnets(neutronSubnets);
130         }
131 // todo remove '-' chars as tenant id doesn't use them
132         result.setTenantID(network.getTenantId().getValue());
133         result.setID(network.getUuid().getValue());
134
135         NetworkL3Extension l3Extension = network.getAugmentation(NetworkL3Extension.class);
136         result.setRouterExternal(l3Extension.isExternal());
137
138         NetworkProviderExtension providerExtension = network.getAugmentation(NetworkProviderExtension.class);
139         result.setProviderPhysicalNetwork(providerExtension.getPhysicalNetwork());
140         result.setProviderSegmentationID(providerExtension.getSegmentationId());
141         result.setProviderNetworkType(NETWORK_MAP.get(providerExtension.getNetworkType()));
142         List<NeutronNetwork_Segment> segments = new ArrayList<NeutronNetwork_Segment>();
143         if (providerExtension.getSegments() != null) {
144             for (Segments segment: providerExtension.getSegments()) {
145                 NeutronNetwork_Segment neutronSegment = new NeutronNetwork_Segment();
146                 neutronSegment.setProviderPhysicalNetwork(segment.getPhysicalNetwork());
147                 neutronSegment.setProviderSegmentationID(segment.getSegmentationId());
148                 neutronSegment.setProviderNetworkType(NETWORK_MAP.get(segment.getNetworkType()));
149                 segments.add(neutronSegment);
150             }
151         }
152         result.setSegments(segments);
153         return result;
154     }
155
156     private void fillExtensions(NetworkBuilder networkBuilder,
157                                 NeutronNetwork network) {
158         NetworkL3ExtensionBuilder l3ExtensionBuilder = new NetworkL3ExtensionBuilder();
159         if (network.getRouterExternal() != null) {
160             l3ExtensionBuilder.setExternal(network.getRouterExternal());
161         }
162
163         NetworkProviderExtensionBuilder providerExtensionBuilder = new NetworkProviderExtensionBuilder();
164         if (network.getProviderPhysicalNetwork() != null) {
165             providerExtensionBuilder.setPhysicalNetwork(network.getProviderPhysicalNetwork());
166         }
167         if (network.getProviderSegmentationID() != null) {
168             providerExtensionBuilder.setSegmentationId(network.getProviderSegmentationID());
169         }
170         if (network.getProviderNetworkType() != null) {
171             ImmutableBiMap<String, Class<? extends NetworkTypeBase>> mapper =
172                 NETWORK_MAP.inverse();
173             providerExtensionBuilder.setNetworkType((Class<? extends NetworkTypeBase>) mapper.get(network.getProviderNetworkType()));
174         }
175         if (network.getSegments() != null) {
176             List<Segments> segments = new ArrayList<Segments>();
177             long count = 0;
178             for( NeutronNetwork_Segment segment : network.getSegments()) {
179                 count++;
180                 SegmentsBuilder segmentsBuilder = new SegmentsBuilder();
181                 if (segment.getProviderPhysicalNetwork() != null) {
182                     segmentsBuilder.setPhysicalNetwork(segment.getProviderPhysicalNetwork());
183                 }
184                 if (segment.getProviderSegmentationID() != null) {
185                     segmentsBuilder.setSegmentationId(segment.getProviderSegmentationID());
186                 }
187                 if (segment.getProviderNetworkType() != null) {
188                     ImmutableBiMap<String, Class<? extends NetworkTypeBase>> mapper =
189                         NETWORK_MAP.inverse();
190                     segmentsBuilder.setNetworkType((Class<? extends NetworkTypeBase>) mapper.get(segment.getProviderNetworkType()));
191                 }
192                 segmentsBuilder.setSegmentationIndex(Long.valueOf(count));
193                 segments.add(segmentsBuilder.build());
194             }
195             providerExtensionBuilder.setSegments(segments);
196         }
197         if (network.getProviderSegmentationID() != null) {
198             providerExtensionBuilder.setSegmentationId(network.getProviderSegmentationID());
199         }
200
201         networkBuilder.addAugmentation(NetworkL3Extension.class,
202                                        l3ExtensionBuilder.build());
203         networkBuilder.addAugmentation(NetworkProviderExtension.class,
204                                        providerExtensionBuilder.build());
205     }
206
207     protected Network toMd(NeutronNetwork network) {
208         NetworkBuilder networkBuilder = new NetworkBuilder();
209         fillExtensions(networkBuilder, network);
210
211         networkBuilder.setAdminStateUp(network.getAdminStateUp());
212         if (network.getNetworkName() != null) {
213             networkBuilder.setName(network.getNetworkName());
214         }
215         if (network.getShared() != null) {
216             networkBuilder.setShared(network.getShared());
217         }
218         if (network.getStatus() != null) {
219             networkBuilder.setStatus(network.getStatus());
220         }
221         if (network.getSubnets() != null) {
222             List<Uuid> subnets = new ArrayList<Uuid>();
223             for( String subnet : network.getSubnets()) {
224                 subnets.add(toUuid(subnet));
225             }
226             networkBuilder.setSubnets(subnets);
227         }
228         if (network.getTenantID() != null) {
229             networkBuilder.setTenantId(toUuid(network.getTenantID()));
230         }
231         if (network.getID() != null) {
232             networkBuilder.setUuid(toUuid(network.getID()));
233         } else {
234             LOGGER.warn("Attempting to write neutron network without UUID");
235         }
236         return networkBuilder.build();
237     }
238
239     protected Network toMd(String uuid) {
240         NetworkBuilder networkBuilder = new NetworkBuilder();
241         networkBuilder.setUuid(toUuid(uuid));
242         return networkBuilder.build();
243     }
244
245     @Override
246     protected InstanceIdentifier<Network> createInstanceIdentifier(Network network) {
247         return InstanceIdentifier.create(Neutron.class)
248                 .child(Networks.class)
249                 .child(Network.class,network.getKey());
250     }
251
252     protected InstanceIdentifier<Networks> createInstanceIdentifier() {
253         return InstanceIdentifier.create(Neutron.class)
254                 .child(Networks.class);
255     }
256
257     public static void registerNewInterface(BundleContext context,
258                                             ProviderContext providerContext,
259                                             List<ServiceRegistration<?>> registrations) {
260         NeutronNetworkInterface neutronNetworkInterface = new NeutronNetworkInterface(providerContext);
261         ServiceRegistration<INeutronNetworkCRUD> neutronNetworkInterfaceRegistration = context.registerService(INeutronNetworkCRUD.class, neutronNetworkInterface, null);
262         if(neutronNetworkInterfaceRegistration != null) {
263             registrations.add(neutronNetworkInterfaceRegistration);
264         }
265     }
266 }