716c0ef0599fd298968b1beb5d0ea735688fa7ec
[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.apache.aries.blueprint.annotation.service.Service;
16 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
17 import org.opendaylight.controller.md.sal.binding.api.ReadTransaction;
18 import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
19 import org.opendaylight.neutron.spi.INeutronNetworkCRUD;
20 import org.opendaylight.neutron.spi.NeutronNetwork;
21 import org.opendaylight.neutron.spi.NeutronNetworkSegment;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.l3.ext.rev150712.NetworkL3Extension;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.l3.ext.rev150712.NetworkL3ExtensionBuilder;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.mtu.ext.rev181114.NetworkMtuExtension;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.mtu.ext.rev181114.NetworkMtuExtensionBuilder;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.NetworkTypeBase;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.NetworkTypeFlat;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.NetworkTypeGre;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.NetworkTypeVlan;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.NetworkTypeVxlan;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.networks.attributes.Networks;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.networks.attributes.networks.Network;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.networks.attributes.networks.NetworkBuilder;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.networks.attributes.networks.NetworkKey;
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.provider.ext.rev150712.neutron.networks.network.Segments;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.provider.ext.rev150712.neutron.networks.network.SegmentsBuilder;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.qos.ext.rev160613.QosNetworkExtension;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.qos.ext.rev160613.QosNetworkExtensionBuilder;
41
42 @Singleton
43 @Service(classes = INeutronNetworkCRUD.class)
44 public final class NeutronNetworkInterface
45         extends AbstractNeutronInterface<Network, Networks, NetworkKey, NeutronNetwork>
46         implements INeutronNetworkCRUD {
47
48     private static final ImmutableBiMap<Class<? extends NetworkTypeBase>,
49             String> NETWORK_MAP = new ImmutableBiMap.Builder<Class<? extends NetworkTypeBase>, String>()
50                     .put(NetworkTypeFlat.class, "flat").put(NetworkTypeGre.class, "gre")
51                     .put(NetworkTypeVlan.class, "vlan").put(NetworkTypeVxlan.class, "vxlan").build();
52
53     private final NeutronQosPolicyInterface qosPolicyInterface;
54
55     @Inject
56     public NeutronNetworkInterface(DataBroker db, NeutronQosPolicyInterface qosPolicyInterface) {
57         super(NetworkBuilder.class, db);
58         this.qosPolicyInterface = qosPolicyInterface;
59     }
60
61     // IfNBNetworkCRUD methods
62     @Override
63     protected List<Network> getDataObjectList(Networks networks) {
64         return networks.getNetwork();
65     }
66
67     @Override
68     protected NeutronNetwork fromMd(Network network) {
69         final NeutronNetwork result = new NeutronNetwork();
70         result.initDefaults();
71         fromMdAdminAttributes(network, result);
72         result.setShared(network.isShared());
73         result.setVlanTransparent(network.isVlanTransparent());
74
75         final NetworkL3Extension l3Extension = network.augmentation(NetworkL3Extension.class);
76         result.setRouterExternal(l3Extension.isExternal());
77
78         final NetworkProviderExtension providerExtension = network.augmentation(NetworkProviderExtension.class);
79         result.setProviderPhysicalNetwork(providerExtension.getPhysicalNetwork());
80         result.setProviderSegmentationID(providerExtension.getSegmentationId());
81         result.setProviderNetworkType(NETWORK_MAP.get(providerExtension.getNetworkType()));
82         final List<NeutronNetworkSegment> segments = new ArrayList<>();
83         if (providerExtension.getSegments() != null) {
84             for (final Segments segment : providerExtension.getSegments()) {
85                 final NeutronNetworkSegment neutronSegment = new NeutronNetworkSegment();
86                 neutronSegment.setProviderPhysicalNetwork(segment.getPhysicalNetwork());
87                 neutronSegment.setProviderSegmentationID(segment.getSegmentationId());
88                 neutronSegment.setProviderNetworkType(NETWORK_MAP.get(segment.getNetworkType()));
89                 segments.add(neutronSegment);
90             }
91         }
92         final QosNetworkExtension qos = network.augmentation(QosNetworkExtension.class);
93         if (qos != null && qos.getQosPolicyId() != null) {
94             result.setQosPolicyId(qos.getQosPolicyId().getValue());
95         }
96         final NetworkMtuExtension mtu = network.augmentation(NetworkMtuExtension.class);
97         if (mtu != null && mtu.getMtu() != null) {
98             result.setMtu(mtu.getMtu());
99         }
100         result.setSegments(segments);
101         return result;
102     }
103
104     private void fillExtensions(NetworkBuilder networkBuilder, NeutronNetwork network) {
105         final NetworkL3ExtensionBuilder l3ExtensionBuilder = new NetworkL3ExtensionBuilder();
106         if (network.getRouterExternal() != null) {
107             l3ExtensionBuilder.setExternal(network.getRouterExternal());
108         }
109
110         final NetworkProviderExtensionBuilder providerExtensionBuilder = new NetworkProviderExtensionBuilder();
111         if (network.getProviderPhysicalNetwork() != null) {
112             providerExtensionBuilder.setPhysicalNetwork(network.getProviderPhysicalNetwork());
113         }
114         if (network.getProviderSegmentationID() != null) {
115             providerExtensionBuilder.setSegmentationId(network.getProviderSegmentationID());
116         }
117         if (network.getProviderNetworkType() != null) {
118             final ImmutableBiMap<String, Class<? extends NetworkTypeBase>> mapper = NETWORK_MAP.inverse();
119             providerExtensionBuilder
120                     .setNetworkType(mapper.get(network.getProviderNetworkType()));
121         }
122         if (network.getSegments() != null) {
123             final List<Segments> segments = new ArrayList<>();
124             long count = 0;
125             for (final NeutronNetworkSegment segment : network.getSegments()) {
126                 count++;
127                 final SegmentsBuilder segmentsBuilder = new SegmentsBuilder();
128                 if (segment.getProviderPhysicalNetwork() != null) {
129                     segmentsBuilder.setPhysicalNetwork(segment.getProviderPhysicalNetwork());
130                 }
131                 if (segment.getProviderSegmentationID() != null) {
132                     segmentsBuilder.setSegmentationId(segment.getProviderSegmentationID());
133                 }
134                 if (segment.getProviderNetworkType() != null) {
135                     final ImmutableBiMap<String, Class<? extends NetworkTypeBase>> mapper = NETWORK_MAP.inverse();
136                     segmentsBuilder.setNetworkType(
137                             mapper.get(segment.getProviderNetworkType()));
138                 }
139                 segmentsBuilder.setSegmentationIndex(Long.valueOf(count));
140                 segments.add(segmentsBuilder.build());
141             }
142             providerExtensionBuilder.setSegments(segments);
143         }
144         if (network.getProviderSegmentationID() != null) {
145             providerExtensionBuilder.setSegmentationId(network.getProviderSegmentationID());
146         }
147         if (network.getQosPolicyId() != null) {
148             final QosNetworkExtensionBuilder qosExtensionBuilder = new QosNetworkExtensionBuilder();
149             qosExtensionBuilder.setQosPolicyId(toUuid(network.getQosPolicyId()));
150             networkBuilder.addAugmentation(QosNetworkExtension.class, qosExtensionBuilder.build());
151         }
152         networkBuilder.addAugmentation(NetworkL3Extension.class, l3ExtensionBuilder.build());
153         networkBuilder.addAugmentation(NetworkProviderExtension.class, providerExtensionBuilder.build());
154         if (network.getMtu() != null) {
155             final NetworkMtuExtensionBuilder mtuExtensionBuilder = new NetworkMtuExtensionBuilder();
156             mtuExtensionBuilder.setMtu(network.getMtu());
157             networkBuilder.addAugmentation(NetworkMtuExtension.class, mtuExtensionBuilder.build());
158         }
159     }
160
161     @Override
162     protected Network toMd(NeutronNetwork network) {
163         final NetworkBuilder networkBuilder = new NetworkBuilder();
164         toMdAdminAttributes(network, networkBuilder);
165         fillExtensions(networkBuilder, network);
166
167         if (network.getShared() != null) {
168             networkBuilder.setShared(network.getShared());
169         }
170
171         if (network.getVlanTransparent() != null) {
172             networkBuilder.setVlanTransparent(network.getVlanTransparent());
173         }
174
175         return networkBuilder.build();
176     }
177
178     @Override
179     protected boolean areAllDependenciesAvailable(ReadTransaction tx, NeutronNetwork network)
180             throws ReadFailedException {
181         return ifNonNull(network.getQosPolicyId(), qosPolicyId -> qosPolicyInterface.exists(qosPolicyId, tx));
182     }
183 }