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