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