Full <> clean-up
[netvirt.git] / openstack / net-virt / src / main / java / org / opendaylight / ovsdb / 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.ovsdb.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
16 import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ProviderContext;
17 import org.opendaylight.ovsdb.openstack.netvirt.translator.NeutronNetwork;
18 import org.opendaylight.ovsdb.openstack.netvirt.translator.NeutronNetwork_Segment;
19 import org.opendaylight.ovsdb.openstack.netvirt.translator.crud.INeutronNetworkCRUD;
20 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.l3.ext.rev150712.NetworkL3Extension;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.l3.ext.rev150712.NetworkL3ExtensionBuilder;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.NetworkTypeBase;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.NetworkTypeFlat;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.NetworkTypeGre;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.NetworkTypeVlan;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.NetworkTypeVxlan;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.networks.attributes.Networks;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.networks.attributes.networks.Network;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.networks.attributes.networks.NetworkBuilder;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.provider.ext.rev150712.NetworkProviderExtension;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.provider.ext.rev150712.NetworkProviderExtensionBuilder;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.provider.ext.rev150712.neutron.networks.network.Segments;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.provider.ext.rev150712.neutron.networks.network.SegmentsBuilder;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.rev150712.Neutron;
36 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
37 import org.osgi.framework.BundleContext;
38 import org.osgi.framework.ServiceRegistration;
39 import org.slf4j.Logger;
40 import org.slf4j.LoggerFactory;
41
42 import com.google.common.collect.ImmutableBiMap;
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         Network network = readMd(createInstanceIdentifier(toMd(uuid)));
73         if (network == null) {
74             return null;
75         }
76         return fromMd(network);
77     }
78
79     @Override
80     public List<NeutronNetwork> getAllNetworks() {
81         Set<NeutronNetwork> allNetworks = new HashSet<>();
82         Networks networks = readMd(createInstanceIdentifier());
83         if (networks != null) {
84             for (Network network: networks.getNetwork()) {
85                 allNetworks.add(fromMd(network));
86             }
87         }
88         LOGGER.debug("Exiting getAllNetworks, Found {} OpenStackNetworks", allNetworks.size());
89         List<NeutronNetwork> ans = new ArrayList<>();
90         ans.addAll(allNetworks);
91         return ans;
92     }
93
94     @Override
95     public boolean addNetwork(NeutronNetwork input) {
96         if (networkExists(input.getID())) {
97             return false;
98         }
99         addMd(input);
100         return true;
101     }
102
103     @Override
104     public boolean removeNetwork(String uuid) {
105         if (!networkExists(uuid)) {
106             return false;
107         }
108         return removeMd(toMd(uuid));
109     }
110
111     @Override
112     public boolean updateNetwork(String uuid, NeutronNetwork delta) {
113         if (!networkExists(uuid)) {
114             return false;
115         }
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
118  * with it */
119         updateMd(delta);
120         return true;
121     }
122
123     @Override
124     public boolean networkInUse(String netUUID) {
125         if (!networkExists(netUUID)) {
126             return true;
127         }
128         return false;
129     }
130
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<>();
139             for( Uuid subnet : network.getSubnets()) {
140                neutronSubnets.add(subnet.getValue());
141             }
142             result.setSubnets(neutronSubnets);
143         }
144 // todo remove '-' chars as tenant id doesn't use them
145         result.setTenantID(network.getTenantId().getValue());
146         result.setID(network.getUuid().getValue());
147
148         NetworkL3Extension l3Extension = network.getAugmentation(NetworkL3Extension.class);
149         result.setRouterExternal(l3Extension.isExternal());
150
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<>();
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);
163             }
164         }
165         result.setSegments(segments);
166         return result;
167     }
168
169     private void fillExtensions(NetworkBuilder networkBuilder,
170                                 NeutronNetwork network) {
171         NetworkL3ExtensionBuilder l3ExtensionBuilder = new NetworkL3ExtensionBuilder();
172         if (network.getRouterExternal() != null) {
173             l3ExtensionBuilder.setExternal(network.getRouterExternal());
174         }
175
176         NetworkProviderExtensionBuilder providerExtensionBuilder = new NetworkProviderExtensionBuilder();
177         if (network.getProviderPhysicalNetwork() != null) {
178             providerExtensionBuilder.setPhysicalNetwork(network.getProviderPhysicalNetwork());
179         }
180         if (network.getProviderSegmentationID() != null) {
181             providerExtensionBuilder.setSegmentationId(network.getProviderSegmentationID());
182         }
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()));
187         }
188         if (network.getSegments() != null) {
189             List<Segments> segments = new ArrayList<>();
190             long count = 0;
191             for( NeutronNetwork_Segment segment : network.getSegments()) {
192                 count++;
193                 SegmentsBuilder segmentsBuilder = new SegmentsBuilder();
194                 if (segment.getProviderPhysicalNetwork() != null) {
195                     segmentsBuilder.setPhysicalNetwork(segment.getProviderPhysicalNetwork());
196                 }
197                 if (segment.getProviderSegmentationID() != null) {
198                     segmentsBuilder.setSegmentationId(segment.getProviderSegmentationID());
199                 }
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()));
204                 }
205                 segmentsBuilder.setSegmentationIndex(Long.valueOf(count));
206                 segments.add(segmentsBuilder.build());
207             }
208             providerExtensionBuilder.setSegments(segments);
209         }
210         if (network.getProviderSegmentationID() != null) {
211             providerExtensionBuilder.setSegmentationId(network.getProviderSegmentationID());
212         }
213
214         networkBuilder.addAugmentation(NetworkL3Extension.class,
215                                        l3ExtensionBuilder.build());
216         networkBuilder.addAugmentation(NetworkProviderExtension.class,
217                                        providerExtensionBuilder.build());
218     }
219
220     protected Network toMd(NeutronNetwork network) {
221         NetworkBuilder networkBuilder = new NetworkBuilder();
222         fillExtensions(networkBuilder, network);
223
224         networkBuilder.setAdminStateUp(network.getAdminStateUp());
225         if (network.getNetworkName() != null) {
226             networkBuilder.setName(network.getNetworkName());
227         }
228         if (network.getShared() != null) {
229             networkBuilder.setShared(network.getShared());
230         }
231         if (network.getStatus() != null) {
232             networkBuilder.setStatus(network.getStatus());
233         }
234         if (network.getSubnets() != null) {
235             List<Uuid> subnets = new ArrayList<>();
236             for( String subnet : network.getSubnets()) {
237                 subnets.add(toUuid(subnet));
238             }
239             networkBuilder.setSubnets(subnets);
240         }
241         if (network.getTenantID() != null) {
242             networkBuilder.setTenantId(toUuid(network.getTenantID()));
243         }
244         if (network.getNetworkUUID() != null) {
245             networkBuilder.setUuid(toUuid(network.getNetworkUUID()));
246         } else {
247             LOGGER.warn("Attempting to write neutron network without UUID");
248         }
249         return networkBuilder.build();
250     }
251
252     protected Network toMd(String uuid) {
253         NetworkBuilder networkBuilder = new NetworkBuilder();
254         networkBuilder.setUuid(toUuid(uuid));
255         return networkBuilder.build();
256     }
257
258     @Override
259     protected InstanceIdentifier<Network> createInstanceIdentifier(Network network) {
260         return InstanceIdentifier.create(Neutron.class)
261                 .child(Networks.class)
262                 .child(Network.class,network.getKey());
263     }
264
265     protected InstanceIdentifier<Networks> createInstanceIdentifier() {
266         return InstanceIdentifier.create(Neutron.class)
267                 .child(Networks.class);
268     }
269
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);
277         }
278     }
279 }