Reversion yang model
[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.rev150712.NetworkL3Extension;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.l3.ext.rev150712.NetworkL3ExtensionBuilder;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.networks.attributes.Networks;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.networks.attributes.networks.Network;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.networks.attributes.networks.NetworkBuilder;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.provider.ext.rev150712.neutron.networks.network.Segments;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.provider.ext.rev150712.neutron.networks.network.SegmentsBuilder;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.NetworkTypeBase;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.NetworkTypeFlat;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.NetworkTypeGre;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.NetworkTypeVlan;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.NetworkTypeVxlan;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.provider.ext.rev150712.NetworkProviderExtension;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.provider.ext.rev150712.NetworkProviderExtensionBuilder;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.rev150712.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, Networks, 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         return exists(uuid);
64     }
65
66     @Override
67     public NeutronNetwork getNetwork(String uuid) {
68         return get(uuid);
69     }
70
71     @Override
72     protected List<Network> getDataObjectList(Networks networks) {
73         return networks.getNetwork();
74     }
75
76     @Override
77     public List<NeutronNetwork> getAllNetworks() {
78         return getAll();
79     }
80
81     @Override
82     public boolean addNetwork(NeutronNetwork input) {
83         return add(input);
84     }
85
86     @Override
87     public boolean removeNetwork(String uuid) {
88         return remove(uuid);
89     }
90
91     @Override
92     public boolean updateNetwork(String uuid, NeutronNetwork delta) {
93 /* note: because what we get is *not* a delta but (at this point) the updated
94  * object, this is much simpler - just replace the value and update the mdsal
95  * with it */
96         return update(uuid, delta);
97     }
98
99     @Override
100     public boolean networkInUse(String netUUID) {
101         return !exists(netUUID);
102     }
103
104     protected NeutronNetwork fromMd(Network network) {
105         NeutronNetwork result = new NeutronNetwork();
106         result.initDefaults();
107         result.setAdminStateUp(network.isAdminStateUp());
108         result.setNetworkName(network.getName());
109         result.setShared(network.isShared());
110         result.setStatus(network.getStatus());
111         if (network.getSubnets() != null) {
112             List<String> neutronSubnets = new ArrayList<String>();
113             for( Uuid subnet : network.getSubnets()) {
114                neutronSubnets.add(subnet.getValue());
115             }
116             result.setSubnets(neutronSubnets);
117         }
118         result.setTenantID(network.getTenantId());
119         result.setID(network.getUuid().getValue());
120
121         NetworkL3Extension l3Extension = network.getAugmentation(NetworkL3Extension.class);
122         result.setRouterExternal(l3Extension.isExternal());
123
124         NetworkProviderExtension providerExtension = network.getAugmentation(NetworkProviderExtension.class);
125         result.setProviderPhysicalNetwork(providerExtension.getPhysicalNetwork());
126         result.setProviderSegmentationID(providerExtension.getSegmentationId());
127         result.setProviderNetworkType(NETWORK_MAP.get(providerExtension.getNetworkType()));
128         List<NeutronNetwork_Segment> segments = new ArrayList<NeutronNetwork_Segment>();
129         if (providerExtension.getSegments() != null) {
130             for (Segments segment: providerExtension.getSegments()) {
131                 NeutronNetwork_Segment neutronSegment = new NeutronNetwork_Segment();
132                 neutronSegment.setProviderPhysicalNetwork(segment.getPhysicalNetwork());
133                 neutronSegment.setProviderSegmentationID(segment.getSegmentationId());
134                 neutronSegment.setProviderNetworkType(NETWORK_MAP.get(segment.getNetworkType()));
135                 segments.add(neutronSegment);
136             }
137         }
138         result.setSegments(segments);
139         return result;
140     }
141
142     private void fillExtensions(NetworkBuilder networkBuilder,
143                                 NeutronNetwork network) {
144         NetworkL3ExtensionBuilder l3ExtensionBuilder = new NetworkL3ExtensionBuilder();
145         if (network.getRouterExternal() != null) {
146             l3ExtensionBuilder.setExternal(network.getRouterExternal());
147         }
148
149         NetworkProviderExtensionBuilder providerExtensionBuilder = new NetworkProviderExtensionBuilder();
150         if (network.getProviderPhysicalNetwork() != null) {
151             providerExtensionBuilder.setPhysicalNetwork(network.getProviderPhysicalNetwork());
152         }
153         if (network.getProviderSegmentationID() != null) {
154             providerExtensionBuilder.setSegmentationId(network.getProviderSegmentationID());
155         }
156         if (network.getProviderNetworkType() != null) {
157             ImmutableBiMap<String, Class<? extends NetworkTypeBase>> mapper =
158                 NETWORK_MAP.inverse();
159             providerExtensionBuilder.setNetworkType((Class<? extends NetworkTypeBase>) mapper.get(network.getProviderNetworkType()));
160         }
161         if (network.getSegments() != null) {
162             List<Segments> segments = new ArrayList<Segments>();
163             long count = 0;
164             for( NeutronNetwork_Segment segment : network.getSegments()) {
165                 count++;
166                 SegmentsBuilder segmentsBuilder = new SegmentsBuilder();
167                 if (segment.getProviderPhysicalNetwork() != null) {
168                     segmentsBuilder.setPhysicalNetwork(segment.getProviderPhysicalNetwork());
169                 }
170                 if (segment.getProviderSegmentationID() != null) {
171                     segmentsBuilder.setSegmentationId(segment.getProviderSegmentationID());
172                 }
173                 if (segment.getProviderNetworkType() != null) {
174                     ImmutableBiMap<String, Class<? extends NetworkTypeBase>> mapper =
175                         NETWORK_MAP.inverse();
176                     segmentsBuilder.setNetworkType((Class<? extends NetworkTypeBase>) mapper.get(segment.getProviderNetworkType()));
177                 }
178                 segmentsBuilder.setSegmentationIndex(Long.valueOf(count));
179                 segments.add(segmentsBuilder.build());
180             }
181             providerExtensionBuilder.setSegments(segments);
182         }
183         if (network.getProviderSegmentationID() != null) {
184             providerExtensionBuilder.setSegmentationId(network.getProviderSegmentationID());
185         }
186
187         networkBuilder.addAugmentation(NetworkL3Extension.class,
188                                        l3ExtensionBuilder.build());
189         networkBuilder.addAugmentation(NetworkProviderExtension.class,
190                                        providerExtensionBuilder.build());
191     }
192
193     protected Network toMd(NeutronNetwork network) {
194         NetworkBuilder networkBuilder = new NetworkBuilder();
195         fillExtensions(networkBuilder, network);
196
197         networkBuilder.setAdminStateUp(network.getAdminStateUp());
198         if (network.getNetworkName() != null) {
199             networkBuilder.setName(network.getNetworkName());
200         }
201         if (network.getShared() != null) {
202             networkBuilder.setShared(network.getShared());
203         }
204         if (network.getStatus() != null) {
205             networkBuilder.setStatus(network.getStatus());
206         }
207         if (network.getSubnets() != null) {
208             List<Uuid> subnets = new ArrayList<Uuid>();
209             for( String subnet : network.getSubnets()) {
210                 subnets.add(toUuid(subnet));
211             }
212             networkBuilder.setSubnets(subnets);
213         }
214         if (network.getTenantID() != null) {
215             networkBuilder.setTenantId(toUuid(network.getTenantID()));
216         }
217         if (network.getID() != null) {
218             networkBuilder.setUuid(toUuid(network.getID()));
219         } else {
220             LOGGER.warn("Attempting to write neutron network without UUID");
221         }
222         return networkBuilder.build();
223     }
224
225     protected Network toMd(String uuid) {
226         NetworkBuilder networkBuilder = new NetworkBuilder();
227         networkBuilder.setUuid(toUuid(uuid));
228         return networkBuilder.build();
229     }
230
231     @Override
232     protected InstanceIdentifier<Network> createInstanceIdentifier(Network network) {
233         return InstanceIdentifier.create(Neutron.class)
234                 .child(Networks.class)
235                 .child(Network.class,network.getKey());
236     }
237
238     @Override
239     protected InstanceIdentifier<Networks> createInstanceIdentifier() {
240         return InstanceIdentifier.create(Neutron.class)
241                 .child(Networks.class);
242     }
243
244     public static void registerNewInterface(BundleContext context,
245                                             ProviderContext providerContext,
246                                             List<ServiceRegistration<?>> registrations) {
247         NeutronNetworkInterface neutronNetworkInterface = new NeutronNetworkInterface(providerContext);
248         ServiceRegistration<INeutronNetworkCRUD> neutronNetworkInterfaceRegistration = context.registerService(INeutronNetworkCRUD.class, neutronNetworkInterface, null);
249         if(neutronNetworkInterfaceRegistration != null) {
250             registrations.add(neutronNetworkInterfaceRegistration);
251         }
252     }
253 }