Fixup Augmentable and Identifiable methods changing
[neutron.git] / transcriber / src / main / java / org / opendaylight / neutron / transcriber / NeutronPortInterface.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.HashMap;
13 import java.util.HashSet;
14 import java.util.List;
15 import java.util.Map;
16 import java.util.Set;
17 import javax.inject.Inject;
18 import javax.inject.Singleton;
19 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
20 import org.opendaylight.neutron.spi.INeutronPortCRUD;
21 import org.opendaylight.neutron.spi.NeutronIps;
22 import org.opendaylight.neutron.spi.NeutronPort;
23 import org.opendaylight.neutron.spi.NeutronPortAllowedAddressPairs;
24 import org.opendaylight.neutron.spi.NeutronPortExtraDHCPOption;
25 import org.opendaylight.neutron.spi.NeutronSecurityGroup;
26 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
27 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress;
28 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.binding.rev150712.PortBindingExtension;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.binding.rev150712.PortBindingExtensionBuilder;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.binding.rev150712.binding.attributes.VifDetails;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.binding.rev150712.binding.attributes.VifDetailsBuilder;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.constants.rev150712.IpVersionBase;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.constants.rev150712.IpVersionV4;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.constants.rev150712.IpVersionV6;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.port.attributes.AllowedAddressPairs;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.port.attributes.AllowedAddressPairsBuilder;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.port.attributes.ExtraDhcpOpts;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.port.attributes.ExtraDhcpOptsBuilder;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.port.attributes.FixedIps;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.port.attributes.FixedIpsBuilder;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.ports.attributes.Ports;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.ports.attributes.ports.Port;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.ports.attributes.ports.PortBuilder;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.ports.attributes.ports.PortKey;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.portsecurity.rev150712.PortSecurityExtension;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.portsecurity.rev150712.PortSecurityExtensionBuilder;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.qos.ext.rev160613.QosPortExtension;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.qos.ext.rev160613.QosPortExtensionBuilder;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.types.rev160517.IpPrefixOrAddress;
51 import org.ops4j.pax.cdi.api.OsgiServiceProvider;
52
53 @Singleton
54 @OsgiServiceProvider(classes = INeutronPortCRUD.class)
55 public final class NeutronPortInterface extends AbstractNeutronInterface<Port, Ports, PortKey, NeutronPort>
56         implements INeutronPortCRUD {
57
58     // TODO: consolidate this map with NeutronSubnetInterface.IPV_MAP
59     private static final ImmutableBiMap<Class<? extends IpVersionBase>,
60             Integer> IPV_MAP = new ImmutableBiMap.Builder<Class<? extends IpVersionBase>, Integer>()
61                     .put(IpVersionV4.class, Integer.valueOf(4)).put(IpVersionV6.class, Integer.valueOf(6)).build();
62
63     @Inject
64     public NeutronPortInterface(DataBroker db) {
65         super(PortBuilder.class, db);
66     }
67
68     // IfNBPortCRUD methods
69     @Override
70     protected List<Port> getDataObjectList(Ports ports) {
71         return ports.getPort();
72     }
73
74     protected void addExtensions(Port port, NeutronPort result) {
75         final PortBindingExtension binding = port.augmentation(PortBindingExtension.class);
76         result.setBindinghostID(binding.getHostId());
77         if (binding.getVifDetails() != null) {
78             final Map<String, String> details = new HashMap<>(binding.getVifDetails().size());
79             for (final VifDetails vifDetail : binding.getVifDetails()) {
80                 details.put(vifDetail.getDetailsKey(), vifDetail.getValue());
81             }
82             result.setVIFDetails(details);
83         }
84         result.setProfile(binding.getProfile());
85         result.setBindingvifType(binding.getVifType());
86         result.setBindingvnicType(binding.getVnicType());
87     }
88
89     private void portSecurityExtension(Port port, NeutronPort result) {
90         final PortSecurityExtension portSecurity = port.augmentation(PortSecurityExtension.class);
91         if (portSecurity != null && portSecurity.isPortSecurityEnabled() != null) {
92             result.setPortSecurityEnabled(portSecurity.isPortSecurityEnabled());
93         }
94     }
95
96     private void qosExtension(Port port, NeutronPort result) {
97         final QosPortExtension qos = port.augmentation(QosPortExtension.class);
98         if (qos != null && qos.getQosPolicyId() != null) {
99             result.setQosPolicyId(qos.getQosPolicyId().getValue());
100         }
101     }
102
103     @Override
104     protected NeutronPort fromMd(Port port) {
105         final NeutronPort result = new NeutronPort();
106         fromMdAdminAttributes(port, result);
107         if (port.getAllowedAddressPairs() != null) {
108             final List<NeutronPortAllowedAddressPairs> pairs = new ArrayList<>();
109             for (final AllowedAddressPairs mdPair : port.getAllowedAddressPairs()) {
110                 final NeutronPortAllowedAddressPairs pair = new NeutronPortAllowedAddressPairs();
111                 pair.setIpAddress(String.valueOf(mdPair.getIpAddress().getValue()));
112                 pair.setMacAddress(mdPair.getMacAddress().getValue());
113                 pairs.add(pair);
114             }
115             result.setAllowedAddressPairs(pairs);
116         }
117         result.setDeviceID(port.getDeviceId());
118         result.setDeviceOwner(port.getDeviceOwner());
119         if (port.getExtraDhcpOpts() != null) {
120             final List<NeutronPortExtraDHCPOption> options = new ArrayList<>();
121             for (final ExtraDhcpOpts opt : port.getExtraDhcpOpts()) {
122                 final NeutronPortExtraDHCPOption arg = new NeutronPortExtraDHCPOption();
123                 arg.setName(opt.getOptName());
124                 arg.setValue(opt.getOptValue());
125                 arg.setIpVersion(IPV_MAP.get(opt.getIpVersion()));
126                 options.add(arg);
127             }
128             result.setExtraDHCPOptions(options);
129         }
130         if (port.getFixedIps() != null) {
131             final List<NeutronIps> ips = new ArrayList<>();
132             for (final FixedIps mdIp : port.getFixedIps()) {
133                 final NeutronIps ip = new NeutronIps();
134                 ip.setIpAddress(String.valueOf(mdIp.getIpAddress().getValue()));
135                 ip.setSubnetUUID(mdIp.getSubnetId().getValue());
136                 ips.add(ip);
137             }
138             result.setFixedIps(ips);
139         }
140         result.setMacAddress(port.getMacAddress().getValue());
141         result.setNetworkUUID(String.valueOf(port.getNetworkId().getValue()));
142         if (port.getSecurityGroups() != null) {
143             final Set<NeutronSecurityGroup> allGroups = new HashSet<>();
144             for (final Uuid sgUuid : port.getSecurityGroups()) {
145                 final NeutronSecurityGroup sg = new NeutronSecurityGroup();
146                 sg.setID(sgUuid.getValue());
147                 allGroups.add(sg);
148             }
149             final List<NeutronSecurityGroup> groups = new ArrayList<>();
150             groups.addAll(allGroups);
151             result.setSecurityGroups(groups);
152         }
153         addExtensions(port, result);
154         portSecurityExtension(port, result);
155         qosExtension(port, result);
156         return result;
157     }
158
159     @Override
160     protected Port toMd(NeutronPort neutronPort) {
161         final PortBindingExtensionBuilder bindingBuilder = new PortBindingExtensionBuilder();
162         if (neutronPort.getBindinghostID() != null) {
163             bindingBuilder.setHostId(neutronPort.getBindinghostID());
164         }
165         if (neutronPort.getVIFDetails() != null) {
166             final Map<String, String> vifDetails = neutronPort.getVIFDetails();
167             final List<VifDetails> listVifDetail = new ArrayList<>(vifDetails.size());
168             for (final Map.Entry<String, String> vifDetail : vifDetails.entrySet()) {
169                 final VifDetailsBuilder vifDetailsBuilder = new VifDetailsBuilder();
170                 if (vifDetail.getKey() != null) {
171                     vifDetailsBuilder.setDetailsKey(vifDetail.getKey());
172                 }
173                 if (vifDetail.getValue() != null) {
174                     vifDetailsBuilder.setValue(vifDetail.getValue());
175                 }
176                 listVifDetail.add(vifDetailsBuilder.build());
177             }
178             bindingBuilder.setVifDetails(listVifDetail);
179         }
180         if (neutronPort.getBindingvifType() != null) {
181             bindingBuilder.setVifType(neutronPort.getBindingvifType());
182         }
183         if (neutronPort.getBindingvnicType() != null) {
184             bindingBuilder.setVnicType(neutronPort.getBindingvnicType());
185         }
186         if (neutronPort.getProfile() != null) {
187             bindingBuilder.setProfile(neutronPort.getProfile());
188         }
189
190         final PortSecurityExtensionBuilder portSecurityBuilder = new PortSecurityExtensionBuilder();
191         if (neutronPort.getPortSecurityEnabled() != null) {
192             portSecurityBuilder.setPortSecurityEnabled(neutronPort.getPortSecurityEnabled());
193         }
194
195         final PortBuilder portBuilder = new PortBuilder();
196         toMdAdminAttributes(neutronPort, portBuilder);
197         portBuilder.addAugmentation(PortBindingExtension.class, bindingBuilder.build());
198         portBuilder.addAugmentation(PortSecurityExtension.class, portSecurityBuilder.build());
199         if (neutronPort.getAllowedAddressPairs() != null) {
200             final List<AllowedAddressPairs> listAllowedAddressPairs = new ArrayList<>();
201             for (final NeutronPortAllowedAddressPairs allowedAddressPairs : neutronPort.getAllowedAddressPairs()) {
202                 final AllowedAddressPairsBuilder allowedAddressPairsBuilder = new AllowedAddressPairsBuilder();
203                 allowedAddressPairsBuilder
204                         .setIpAddress(new IpPrefixOrAddress(allowedAddressPairs.getIpAddress().toCharArray()));
205                 allowedAddressPairsBuilder.setMacAddress(new MacAddress(allowedAddressPairs.getMacAddress()));
206                 listAllowedAddressPairs.add(allowedAddressPairsBuilder.build());
207             }
208             portBuilder.setAllowedAddressPairs(listAllowedAddressPairs);
209         }
210         if (neutronPort.getDeviceID() != null) {
211             portBuilder.setDeviceId(neutronPort.getDeviceID());
212         }
213         if (neutronPort.getDeviceOwner() != null) {
214             portBuilder.setDeviceOwner(neutronPort.getDeviceOwner());
215         }
216         if (neutronPort.getExtraDHCPOptions() != null) {
217             final List<ExtraDhcpOpts> listExtraDHCPOptions = new ArrayList<>();
218             final ImmutableBiMap<Integer, Class<? extends IpVersionBase>> mapper = IPV_MAP.inverse();
219             for (final NeutronPortExtraDHCPOption extraDHCPOption : neutronPort.getExtraDHCPOptions()) {
220                 final ExtraDhcpOptsBuilder extraDHCPOptsBuilder = new ExtraDhcpOptsBuilder();
221                 extraDHCPOptsBuilder.setOptName(extraDHCPOption.getName());
222                 extraDHCPOptsBuilder.setOptValue(extraDHCPOption.getValue());
223                 Integer ipVersion = extraDHCPOption.getIpVersion();
224                 if (ipVersion == null) {
225                     // default as v4 for neutron api evolves
226                     ipVersion = 4;
227                 }
228                 extraDHCPOptsBuilder.setIpVersion(mapper.get(ipVersion));
229                 listExtraDHCPOptions.add(extraDHCPOptsBuilder.build());
230             }
231             portBuilder.setExtraDhcpOpts(listExtraDHCPOptions);
232         }
233         if (neutronPort.getFixedIps() != null) {
234             final List<FixedIps> listNeutronIps = new ArrayList<>();
235             for (final NeutronIps neutronIPs : neutronPort.getFixedIps()) {
236                 final FixedIpsBuilder fixedIpsBuilder = new FixedIpsBuilder();
237                 fixedIpsBuilder.setIpAddress(new IpAddress(neutronIPs.getIpAddress().toCharArray()));
238                 fixedIpsBuilder.setSubnetId(toUuid(neutronIPs.getSubnetUUID()));
239                 listNeutronIps.add(fixedIpsBuilder.build());
240             }
241             portBuilder.setFixedIps(listNeutronIps);
242         }
243         if (neutronPort.getMacAddress() != null) {
244             portBuilder.setMacAddress(new MacAddress(neutronPort.getMacAddress()));
245         }
246         if (neutronPort.getNetworkUUID() != null) {
247             portBuilder.setNetworkId(toUuid(neutronPort.getNetworkUUID()));
248         }
249         if (neutronPort.getSecurityGroups() != null) {
250             final List<Uuid> listSecurityGroups = new ArrayList<>();
251             for (final NeutronSecurityGroup neutronSecurityGroup : neutronPort.getSecurityGroups()) {
252                 listSecurityGroups.add(toUuid(neutronSecurityGroup.getID()));
253             }
254             portBuilder.setSecurityGroups(listSecurityGroups);
255         }
256         if (neutronPort.getQosPolicyId() != null) {
257             final QosPortExtensionBuilder qosExtensionBuilder = new QosPortExtensionBuilder();
258             qosExtensionBuilder.setQosPolicyId(toUuid(neutronPort.getQosPolicyId()));
259             portBuilder.addAugmentation(QosPortExtension.class, qosExtensionBuilder.build());
260         }
261         return portBuilder.build();
262     }
263 }