Bug 3902 : Local variables to be declared final.
[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.List;
15
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;
40
41 public class NeutronNetworkInterface extends AbstractNeutronInterface<Network, Networks, NeutronNetwork> implements INeutronNetworkCRUD {
42     private static final Logger LOGGER = LoggerFactory.getLogger(NeutronNetworkInterface.class);
43
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")
50             .build();
51
52     NeutronNetworkInterface(ProviderContext providerContext) {
53         super(providerContext);
54     }
55
56     // IfNBNetworkCRUD methods
57
58     @Override
59     public boolean networkExists(String uuid) {
60         return exists(uuid);
61     }
62
63     @Override
64     public NeutronNetwork getNetwork(String uuid) {
65         return get(uuid);
66     }
67
68     @Override
69     protected List<Network> getDataObjectList(Networks networks) {
70         return networks.getNetwork();
71     }
72
73     @Override
74     public List<NeutronNetwork> getAllNetworks() {
75         return getAll();
76     }
77
78     @Override
79     public boolean addNetwork(NeutronNetwork input) {
80         return add(input);
81     }
82
83     @Override
84     public boolean removeNetwork(String uuid) {
85         return remove(uuid);
86     }
87
88     @Override
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
92  * with it */
93         return update(uuid, delta);
94     }
95
96     @Override
97     public boolean networkInUse(String netUUID) {
98         return !exists(netUUID);
99     }
100
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());
110
111         final NetworkL3Extension l3Extension = network.getAugmentation(NetworkL3Extension.class);
112         result.setRouterExternal(l3Extension.isExternal());
113
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);
126             }
127         }
128         result.setSegments(segments);
129         return result;
130     }
131
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());
137         }
138
139         final NetworkProviderExtensionBuilder providerExtensionBuilder = new NetworkProviderExtensionBuilder();
140         if (network.getProviderPhysicalNetwork() != null) {
141             providerExtensionBuilder.setPhysicalNetwork(network.getProviderPhysicalNetwork());
142         }
143         if (network.getProviderSegmentationID() != null) {
144             providerExtensionBuilder.setSegmentationId(network.getProviderSegmentationID());
145         }
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()));
150         }
151         if (network.getSegments() != null) {
152             final List<Segments> segments = new ArrayList<Segments>();
153             long count = 0;
154             for( final NeutronNetwork_Segment segment : network.getSegments()) {
155                 count++;
156                 final SegmentsBuilder segmentsBuilder = new SegmentsBuilder();
157                 if (segment.getProviderPhysicalNetwork() != null) {
158                     segmentsBuilder.setPhysicalNetwork(segment.getProviderPhysicalNetwork());
159                 }
160                 if (segment.getProviderSegmentationID() != null) {
161                     segmentsBuilder.setSegmentationId(segment.getProviderSegmentationID());
162                 }
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()));
167                 }
168                 segmentsBuilder.setSegmentationIndex(Long.valueOf(count));
169                 segments.add(segmentsBuilder.build());
170             }
171             providerExtensionBuilder.setSegments(segments);
172         }
173         if (network.getProviderSegmentationID() != null) {
174             providerExtensionBuilder.setSegmentationId(network.getProviderSegmentationID());
175         }
176
177         networkBuilder.addAugmentation(NetworkL3Extension.class,
178                                        l3ExtensionBuilder.build());
179         networkBuilder.addAugmentation(NetworkProviderExtension.class,
180                                        providerExtensionBuilder.build());
181     }
182
183     protected Network toMd(NeutronNetwork network) {
184         final NetworkBuilder networkBuilder = new NetworkBuilder();
185         fillExtensions(networkBuilder, network);
186
187         networkBuilder.setAdminStateUp(network.getAdminStateUp());
188         if (network.getNetworkName() != null) {
189             networkBuilder.setName(network.getNetworkName());
190         }
191         if (network.getShared() != null) {
192             networkBuilder.setShared(network.getShared());
193         }
194         if (network.getStatus() != null) {
195             networkBuilder.setStatus(network.getStatus());
196         }
197         if (network.getTenantID() != null) {
198             networkBuilder.setTenantId(toUuid(network.getTenantID()));
199         }
200         if (network.getID() != null) {
201             networkBuilder.setUuid(toUuid(network.getID()));
202         } else {
203             LOGGER.warn("Attempting to write neutron network without UUID");
204         }
205         return networkBuilder.build();
206     }
207
208     protected Network toMd(String uuid) {
209         final NetworkBuilder networkBuilder = new NetworkBuilder();
210         networkBuilder.setUuid(toUuid(uuid));
211         return networkBuilder.build();
212     }
213
214     @Override
215     protected InstanceIdentifier<Network> createInstanceIdentifier(Network network) {
216         return InstanceIdentifier.create(Neutron.class)
217                 .child(Networks.class)
218                 .child(Network.class,network.getKey());
219     }
220
221     @Override
222     protected InstanceIdentifier<Networks> createInstanceIdentifier() {
223         return InstanceIdentifier.create(Neutron.class)
224                 .child(Networks.class);
225     }
226
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);
234         }
235     }
236 }