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;
50 import org.slf4j.Logger;
51 import org.slf4j.LoggerFactory;
53 public final class NeutronPortInterface extends AbstractNeutronInterface<Port, Ports, PortKey, NeutronPort>
54 implements INeutronPortCRUD {
55 private static final Logger LOGGER = LoggerFactory.getLogger(NeutronPortInterface.class);
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();
62 NeutronPortInterface(DataBroker db) {
63 super(PortBuilder.class, db);
66 // IfNBPortCRUD methods
68 protected List<Port> getDataObjectList(Ports ports) {
69 return ports.getPort();
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());
80 result.setVIFDetails(details);
82 result.setBindingvifType(binding.getVifType());
83 result.setBindingvnicType(binding.getVnicType());
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());
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());
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());
111 result.setAllowedAddressPairs(pairs);
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()));
124 result.setExtraDHCPOptions(options);
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());
134 result.setFixedIPs(ips);
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());
145 final List<NeutronSecurityGroup> groups = new ArrayList<NeutronSecurityGroup>();
146 groups.addAll(allGroups);
147 result.setSecurityGroups(groups);
149 addExtensions(port, result);
150 portSecurityExtension(port, result);
151 qosExtension(port, result);
156 protected Port toMd(NeutronPort neutronPort) {
157 final PortBindingExtensionBuilder bindingBuilder = new PortBindingExtensionBuilder();
158 if (neutronPort.getBindinghostID() != null) {
159 bindingBuilder.setHostId(neutronPort.getBindinghostID());
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());
169 if (vifDetail.getValue() != null) {
170 vifDetailsBuilder.setValue(vifDetail.getValue());
172 listVifDetail.add(vifDetailsBuilder.build());
174 bindingBuilder.setVifDetails(listVifDetail);
176 if (neutronPort.getBindingvifType() != null) {
177 bindingBuilder.setVifType(neutronPort.getBindingvifType());
179 if (neutronPort.getBindingvnicType() != null) {
180 bindingBuilder.setVnicType(neutronPort.getBindingvnicType());
183 final PortSecurityExtensionBuilder portSecurityBuilder = new PortSecurityExtensionBuilder();
184 if (neutronPort.getPortSecurityEnabled() != null) {
185 portSecurityBuilder.setPortSecurityEnabled(neutronPort.getPortSecurityEnabled());
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());
201 portBuilder.setAllowedAddressPairs(listAllowedAddressPairs);
203 if (neutronPort.getDeviceID() != null) {
204 portBuilder.setDeviceId(neutronPort.getDeviceID());
206 if (neutronPort.getDeviceOwner() != null) {
207 portBuilder.setDeviceOwner(neutronPort.getDeviceOwner());
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
221 extraDHCPOptsBuilder.setIpVersion((Class<? extends IpVersionBase>) mapper.get(ipVersion));
222 listExtraDHCPOptions.add(extraDHCPOptsBuilder.build());
224 portBuilder.setExtraDhcpOpts(listExtraDHCPOptions);
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());
234 portBuilder.setFixedIps(listNeutronIPs);
236 if (neutronPort.getMacAddress() != null) {
237 portBuilder.setMacAddress(new MacAddress(neutronPort.getMacAddress()));
239 if (neutronPort.getNetworkUUID() != null) {
240 portBuilder.setNetworkId(toUuid(neutronPort.getNetworkUUID()));
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()));
247 portBuilder.setSecurityGroups(listSecurityGroups);
249 if (neutronPort.getQosPolicyId() != null) {
250 final QosPortExtensionBuilder qosExtensionBuilder = new QosPortExtensionBuilder();
251 qosExtensionBuilder.setQosPolicyId(toUuid(neutronPort.getQosPolicyId()));
252 portBuilder.addAugmentation(QosPortExtension.class, qosExtensionBuilder.build());
254 return portBuilder.build();