2 * Copyright (c) 2013, 2015 IBM Corporation and others. All rights reserved.
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
9 package org.opendaylight.neutron.transcriber;
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;
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;
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();
58 NeutronPortInterface(DataBroker db) {
59 super(PortBuilder.class, db);
62 // IfNBPortCRUD methods
64 protected List<Port> getDataObjectList(Ports ports) {
65 return ports.getPort();
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());
76 result.setVIFDetails(details);
78 result.setBindingvifType(binding.getVifType());
79 result.setBindingvnicType(binding.getVnicType());
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());
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());
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<>();
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());
107 result.setAllowedAddressPairs(pairs);
109 result.setDeviceID(port.getDeviceId());
110 result.setDeviceOwner(port.getDeviceOwner());
111 if (port.getExtraDhcpOpts() != null) {
112 final List<NeutronPortExtraDHCPOption> options = new ArrayList<>();
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()));
120 result.setExtraDHCPOptions(options);
122 if (port.getFixedIps() != null) {
123 final List<NeutronIps> ips = new ArrayList<>();
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());
130 result.setFixedIps(ips);
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<>();
136 for (final Uuid sgUuid : port.getSecurityGroups()) {
137 final NeutronSecurityGroup sg = new NeutronSecurityGroup();
138 sg.setID(sgUuid.getValue());
141 final List<NeutronSecurityGroup> groups = new ArrayList<>();
142 groups.addAll(allGroups);
143 result.setSecurityGroups(groups);
145 addExtensions(port, result);
146 portSecurityExtension(port, result);
147 qosExtension(port, result);
152 protected Port toMd(NeutronPort neutronPort) {
153 final PortBindingExtensionBuilder bindingBuilder = new PortBindingExtensionBuilder();
154 if (neutronPort.getBindinghostID() != null) {
155 bindingBuilder.setHostId(neutronPort.getBindinghostID());
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());
165 if (vifDetail.getValue() != null) {
166 vifDetailsBuilder.setValue(vifDetail.getValue());
168 listVifDetail.add(vifDetailsBuilder.build());
170 bindingBuilder.setVifDetails(listVifDetail);
172 if (neutronPort.getBindingvifType() != null) {
173 bindingBuilder.setVifType(neutronPort.getBindingvifType());
175 if (neutronPort.getBindingvnicType() != null) {
176 bindingBuilder.setVnicType(neutronPort.getBindingvnicType());
179 final PortSecurityExtensionBuilder portSecurityBuilder = new PortSecurityExtensionBuilder();
180 if (neutronPort.getPortSecurityEnabled() != null) {
181 portSecurityBuilder.setPortSecurityEnabled(neutronPort.getPortSecurityEnabled());
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());
197 portBuilder.setAllowedAddressPairs(listAllowedAddressPairs);
199 if (neutronPort.getDeviceID() != null) {
200 portBuilder.setDeviceId(neutronPort.getDeviceID());
202 if (neutronPort.getDeviceOwner() != null) {
203 portBuilder.setDeviceOwner(neutronPort.getDeviceOwner());
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
217 extraDHCPOptsBuilder.setIpVersion((Class<? extends IpVersionBase>) mapper.get(ipVersion));
218 listExtraDHCPOptions.add(extraDHCPOptsBuilder.build());
220 portBuilder.setExtraDhcpOpts(listExtraDHCPOptions);
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());
230 portBuilder.setFixedIps(listNeutronIps);
232 if (neutronPort.getMacAddress() != null) {
233 portBuilder.setMacAddress(new MacAddress(neutronPort.getMacAddress()));
235 if (neutronPort.getNetworkUUID() != null) {
236 portBuilder.setNetworkId(toUuid(neutronPort.getNetworkUUID()));
238 if (neutronPort.getSecurityGroups() != null) {
239 final List<Uuid> listSecurityGroups = new ArrayList<>();
240 for (final NeutronSecurityGroup neutronSecurityGroup : neutronPort.getSecurityGroups()) {
241 listSecurityGroups.add(toUuid(neutronSecurityGroup.getID()));
243 portBuilder.setSecurityGroups(listSecurityGroups);
245 if (neutronPort.getQosPolicyId() != null) {
246 final QosPortExtensionBuilder qosExtensionBuilder = new QosPortExtensionBuilder();
247 qosExtensionBuilder.setQosPolicyId(toUuid(neutronPort.getQosPolicyId()));
248 portBuilder.addAugmentation(QosPortExtension.class, qosExtensionBuilder.build());
250 return portBuilder.build();