Merge "Fixup Augmentable and Identifiable methods changing"
[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 package org.opendaylight.neutron.transcriber;
9
10 import com.google.common.collect.ImmutableBiMap;
11 import java.util.ArrayList;
12 import java.util.List;
13 import javax.inject.Inject;
14 import javax.inject.Singleton;
15 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
16 import org.opendaylight.neutron.spi.INeutronNetworkCRUD;
17 import org.opendaylight.neutron.spi.NeutronNetwork;
18 import org.opendaylight.neutron.spi.NeutronNetworkSegment;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.l3.ext.rev150712.NetworkL3Extension;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.l3.ext.rev150712.NetworkL3ExtensionBuilder;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.NetworkTypeBase;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.NetworkTypeFlat;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.NetworkTypeGre;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.NetworkTypeVlan;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.NetworkTypeVxlan;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.networks.attributes.Networks;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.networks.attributes.networks.Network;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.networks.attributes.networks.NetworkBuilder;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.networks.attributes.networks.NetworkKey;
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.qos.ext.rev160613.QosNetworkExtension;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.qos.ext.rev160613.QosNetworkExtensionBuilder;
36 import org.ops4j.pax.cdi.api.OsgiServiceProvider;
37
38 @Singleton
39 @OsgiServiceProvider(classes = INeutronNetworkCRUD.class)
40 public final class NeutronNetworkInterface
41         extends AbstractNeutronInterface<Network, Networks, NetworkKey, NeutronNetwork>
42         implements INeutronNetworkCRUD {
43
44     private static final ImmutableBiMap<Class<? extends NetworkTypeBase>,
45             String> NETWORK_MAP = new ImmutableBiMap.Builder<Class<? extends NetworkTypeBase>, String>()
46                     .put(NetworkTypeFlat.class, "flat").put(NetworkTypeGre.class, "gre")
47                     .put(NetworkTypeVlan.class, "vlan").put(NetworkTypeVxlan.class, "vxlan").build();
48
49     @Inject
50     public NeutronNetworkInterface(DataBroker db) {
51         super(NetworkBuilder.class, db);
52     }
53
54     // IfNBNetworkCRUD methods
55     @Override
56     protected List<Network> getDataObjectList(Networks networks) {
57         return networks.getNetwork();
58     }
59
60     @Override
61     protected NeutronNetwork fromMd(Network network) {
62         final NeutronNetwork result = new NeutronNetwork();
63         result.initDefaults();
64         fromMdAdminAttributes(network, result);
65         result.setShared(network.isShared());
66         result.setVlanTransparent(network.isVlanTransparent());
67
68         final NetworkL3Extension l3Extension = network.augmentation(NetworkL3Extension.class);
69         result.setRouterExternal(l3Extension.isExternal());
70
71         final NetworkProviderExtension providerExtension = network.augmentation(NetworkProviderExtension.class);
72         result.setProviderPhysicalNetwork(providerExtension.getPhysicalNetwork());
73         result.setProviderSegmentationID(providerExtension.getSegmentationId());
74         result.setProviderNetworkType(NETWORK_MAP.get(providerExtension.getNetworkType()));
75         final List<NeutronNetworkSegment> segments = new ArrayList<>();
76         if (providerExtension.getSegments() != null) {
77             for (final Segments segment : providerExtension.getSegments()) {
78                 final NeutronNetworkSegment neutronSegment = new NeutronNetworkSegment();
79                 neutronSegment.setProviderPhysicalNetwork(segment.getPhysicalNetwork());
80                 neutronSegment.setProviderSegmentationID(segment.getSegmentationId());
81                 neutronSegment.setProviderNetworkType(NETWORK_MAP.get(segment.getNetworkType()));
82                 segments.add(neutronSegment);
83             }
84         }
85         final QosNetworkExtension qos = network.augmentation(QosNetworkExtension.class);
86         if (qos != null && qos.getQosPolicyId() != null) {
87             result.setQosPolicyId(qos.getQosPolicyId().getValue());
88         }
89         result.setSegments(segments);
90         return result;
91     }
92
93     private void fillExtensions(NetworkBuilder networkBuilder, NeutronNetwork network) {
94         final NetworkL3ExtensionBuilder l3ExtensionBuilder = new NetworkL3ExtensionBuilder();
95         if (network.getRouterExternal() != null) {
96             l3ExtensionBuilder.setExternal(network.getRouterExternal());
97         }
98
99         final NetworkProviderExtensionBuilder providerExtensionBuilder = new NetworkProviderExtensionBuilder();
100         if (network.getProviderPhysicalNetwork() != null) {
101             providerExtensionBuilder.setPhysicalNetwork(network.getProviderPhysicalNetwork());
102         }
103         if (network.getProviderSegmentationID() != null) {
104             providerExtensionBuilder.setSegmentationId(network.getProviderSegmentationID());
105         }
106         if (network.getProviderNetworkType() != null) {
107             final ImmutableBiMap<String, Class<? extends NetworkTypeBase>> mapper = NETWORK_MAP.inverse();
108             providerExtensionBuilder
109                     .setNetworkType(mapper.get(network.getProviderNetworkType()));
110         }
111         if (network.getSegments() != null) {
112             final List<Segments> segments = new ArrayList<>();
113             long count = 0;
114             for (final NeutronNetworkSegment segment : network.getSegments()) {
115                 count++;
116                 final SegmentsBuilder segmentsBuilder = new SegmentsBuilder();
117                 if (segment.getProviderPhysicalNetwork() != null) {
118                     segmentsBuilder.setPhysicalNetwork(segment.getProviderPhysicalNetwork());
119                 }
120                 if (segment.getProviderSegmentationID() != null) {
121                     segmentsBuilder.setSegmentationId(segment.getProviderSegmentationID());
122                 }
123                 if (segment.getProviderNetworkType() != null) {
124                     final ImmutableBiMap<String, Class<? extends NetworkTypeBase>> mapper = NETWORK_MAP.inverse();
125                     segmentsBuilder.setNetworkType(
126                             mapper.get(segment.getProviderNetworkType()));
127                 }
128                 segmentsBuilder.setSegmentationIndex(Long.valueOf(count));
129                 segments.add(segmentsBuilder.build());
130             }
131             providerExtensionBuilder.setSegments(segments);
132         }
133         if (network.getProviderSegmentationID() != null) {
134             providerExtensionBuilder.setSegmentationId(network.getProviderSegmentationID());
135         }
136         if (network.getQosPolicyId() != null) {
137             final QosNetworkExtensionBuilder qosExtensionBuilder = new QosNetworkExtensionBuilder();
138             qosExtensionBuilder.setQosPolicyId(toUuid(network.getQosPolicyId()));
139             networkBuilder.addAugmentation(QosNetworkExtension.class, qosExtensionBuilder.build());
140         }
141         networkBuilder.addAugmentation(NetworkL3Extension.class, l3ExtensionBuilder.build());
142         networkBuilder.addAugmentation(NetworkProviderExtension.class, providerExtensionBuilder.build());
143     }
144
145     @Override
146     protected Network toMd(NeutronNetwork network) {
147         final NetworkBuilder networkBuilder = new NetworkBuilder();
148         toMdAdminAttributes(network, networkBuilder);
149         fillExtensions(networkBuilder, network);
150
151         if (network.getShared() != null) {
152             networkBuilder.setShared(network.getShared());
153         }
154
155         if (network.getVlanTransparent() != null) {
156             networkBuilder.setVlanTransparent(network.getVlanTransparent());
157         }
158
159         return networkBuilder.build();
160     }
161 }