Add blueprint wiring for openstack/net-virt
[netvirt.git] / openstack / net-virt / src / main / java / org / opendaylight / netvirt / openstack / netvirt / translator / crud / impl / 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.netvirt.openstack.netvirt.translator.crud.impl;
10
11 import java.util.ArrayList;
12 import java.util.HashSet;
13 import java.util.List;
14 import java.util.Set;
15 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
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;
40
41 import com.google.common.collect.ImmutableBiMap;
42
43 public class NeutronNetworkInterface extends AbstractNeutronInterface<Network,NeutronNetwork> implements INeutronNetworkCRUD {
44     private static final Logger LOGGER = LoggerFactory.getLogger(NeutronNetworkInterface.class);
45
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")
52             .build();
53
54     NeutronNetworkInterface(final DataBroker dataBroker) {
55         super(dataBroker);
56     }
57
58     // IfNBNetworkCRUD methods
59
60     @Override
61     public boolean networkExists(String uuid) {
62         Network network = readMd(createInstanceIdentifier(toMd(uuid)));
63         if (network == null) {
64             return false;
65         }
66         return true;
67     }
68
69     @Override
70     public NeutronNetwork getNetwork(String uuid) {
71         Network network = readMd(createInstanceIdentifier(toMd(uuid)));
72         if (network == null) {
73             return null;
74         }
75         return fromMd(network);
76     }
77
78     @Override
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));
85             }
86         }
87         LOGGER.debug("Exiting getAllNetworks, Found {} OpenStackNetworks", allNetworks.size());
88         List<NeutronNetwork> ans = new ArrayList<>();
89         ans.addAll(allNetworks);
90         return ans;
91     }
92
93     @Override
94     public boolean addNetwork(NeutronNetwork input) {
95         if (networkExists(input.getID())) {
96             return false;
97         }
98         addMd(input);
99         return true;
100     }
101
102     @Override
103     public boolean removeNetwork(String uuid) {
104         if (!networkExists(uuid)) {
105             return false;
106         }
107         return removeMd(toMd(uuid));
108     }
109
110     @Override
111     public boolean updateNetwork(String uuid, NeutronNetwork delta) {
112         if (!networkExists(uuid)) {
113             return false;
114         }
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
117  * with it */
118         updateMd(delta);
119         return true;
120     }
121
122     @Override
123     public boolean networkInUse(String netUUID) {
124         if (!networkExists(netUUID)) {
125             return true;
126         }
127         return false;
128     }
129
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());
139
140         NetworkL3Extension l3Extension = network.getAugmentation(NetworkL3Extension.class);
141         result.setRouterExternal(l3Extension.isExternal());
142
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);
155             }
156         }
157         result.setSegments(segments);
158         return result;
159     }
160
161     private void fillExtensions(NetworkBuilder networkBuilder,
162                                 NeutronNetwork network) {
163         NetworkL3ExtensionBuilder l3ExtensionBuilder = new NetworkL3ExtensionBuilder();
164         if (network.getRouterExternal() != null) {
165             l3ExtensionBuilder.setExternal(network.getRouterExternal());
166         }
167
168         NetworkProviderExtensionBuilder providerExtensionBuilder = new NetworkProviderExtensionBuilder();
169         if (network.getProviderPhysicalNetwork() != null) {
170             providerExtensionBuilder.setPhysicalNetwork(network.getProviderPhysicalNetwork());
171         }
172         if (network.getProviderSegmentationID() != null) {
173             providerExtensionBuilder.setSegmentationId(network.getProviderSegmentationID());
174         }
175         if (network.getProviderNetworkType() != null) {
176             ImmutableBiMap<String, Class<? extends NetworkTypeBase>> mapper =
177                 NETWORK_MAP.inverse();
178             providerExtensionBuilder.setNetworkType(mapper.get(network.getProviderNetworkType()));
179         }
180         if (network.getSegments() != null) {
181             List<Segments> segments = new ArrayList<>();
182             long count = 0;
183             for( NeutronNetwork_Segment segment : network.getSegments()) {
184                 count++;
185                 SegmentsBuilder segmentsBuilder = new SegmentsBuilder();
186                 if (segment.getProviderPhysicalNetwork() != null) {
187                     segmentsBuilder.setPhysicalNetwork(segment.getProviderPhysicalNetwork());
188                 }
189                 if (segment.getProviderSegmentationID() != null) {
190                     segmentsBuilder.setSegmentationId(segment.getProviderSegmentationID());
191                 }
192                 if (segment.getProviderNetworkType() != null) {
193                     ImmutableBiMap<String, Class<? extends NetworkTypeBase>> mapper =
194                         NETWORK_MAP.inverse();
195                     segmentsBuilder.setNetworkType(mapper.get(segment.getProviderNetworkType()));
196                 }
197                 segmentsBuilder.setSegmentationIndex(count);
198                 segments.add(segmentsBuilder.build());
199             }
200             providerExtensionBuilder.setSegments(segments);
201         }
202         if (network.getProviderSegmentationID() != null) {
203             providerExtensionBuilder.setSegmentationId(network.getProviderSegmentationID());
204         }
205
206         networkBuilder.addAugmentation(NetworkL3Extension.class,
207                                        l3ExtensionBuilder.build());
208         networkBuilder.addAugmentation(NetworkProviderExtension.class,
209                                        providerExtensionBuilder.build());
210     }
211
212     protected Network toMd(NeutronNetwork network) {
213         NetworkBuilder networkBuilder = new NetworkBuilder();
214         fillExtensions(networkBuilder, network);
215
216         networkBuilder.setAdminStateUp(network.getAdminStateUp());
217         if (network.getNetworkName() != null) {
218             networkBuilder.setName(network.getNetworkName());
219         }
220         if (network.getShared() != null) {
221             networkBuilder.setShared(network.getShared());
222         }
223         if (network.getStatus() != null) {
224             networkBuilder.setStatus(network.getStatus());
225         }
226         if (network.getTenantID() != null) {
227             networkBuilder.setTenantId(toUuid(network.getTenantID()));
228         }
229         if (network.getNetworkUUID() != null) {
230             networkBuilder.setUuid(toUuid(network.getNetworkUUID()));
231         } else {
232             LOGGER.warn("Attempting to write neutron network without UUID");
233         }
234         return networkBuilder.build();
235     }
236
237     protected Network toMd(String uuid) {
238         NetworkBuilder networkBuilder = new NetworkBuilder();
239         networkBuilder.setUuid(toUuid(uuid));
240         return networkBuilder.build();
241     }
242
243     @Override
244     protected InstanceIdentifier<Network> createInstanceIdentifier(Network network) {
245         return InstanceIdentifier.create(Neutron.class)
246                 .child(Networks.class)
247                 .child(Network.class,network.getKey());
248     }
249
250     protected InstanceIdentifier<Networks> createInstanceIdentifier() {
251         return InstanceIdentifier.create(Neutron.class)
252                 .child(Networks.class);
253     }
254
255     public static void registerNewInterface(BundleContext context,
256                                             final DataBroker dataBroker,
257                                             List<ServiceRegistration<?>> registrations) {
258         NeutronNetworkInterface neutronNetworkInterface = new NeutronNetworkInterface(dataBroker);
259         ServiceRegistration<INeutronNetworkCRUD> neutronNetworkInterfaceRegistration = context.registerService(INeutronNetworkCRUD.class, neutronNetworkInterface, null);
260         if(neutronNetworkInterfaceRegistration != null) {
261             registrations.add(neutronNetworkInterfaceRegistration);
262         }
263     }
264 }