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
8 package org.opendaylight.neutron.transcriber;
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;
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;
54 @OsgiServiceProvider(classes = INeutronPortCRUD.class)
55 public final class NeutronPortInterface extends AbstractNeutronInterface<Port, Ports, PortKey, NeutronPort>
56 implements INeutronPortCRUD {
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();
64 public NeutronPortInterface(DataBroker db) {
65 super(PortBuilder.class, db);
68 // IfNBPortCRUD methods
70 protected List<Port> getDataObjectList(Ports ports) {
71 return ports.getPort();
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());
82 result.setVIFDetails(details);
84 result.setProfile(binding.getProfile());
85 result.setBindingvifType(binding.getVifType());
86 result.setBindingvnicType(binding.getVnicType());
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());
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());
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());
115 result.setAllowedAddressPairs(pairs);
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()));
128 result.setExtraDHCPOptions(options);
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());
138 result.setFixedIps(ips);
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());
149 final List<NeutronSecurityGroup> groups = new ArrayList<>();
150 groups.addAll(allGroups);
151 result.setSecurityGroups(groups);
153 addExtensions(port, result);
154 portSecurityExtension(port, result);
155 qosExtension(port, result);
160 protected Port toMd(NeutronPort neutronPort) {
161 final PortBindingExtensionBuilder bindingBuilder = new PortBindingExtensionBuilder();
162 if (neutronPort.getBindinghostID() != null) {
163 bindingBuilder.setHostId(neutronPort.getBindinghostID());
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());
173 if (vifDetail.getValue() != null) {
174 vifDetailsBuilder.setValue(vifDetail.getValue());
176 listVifDetail.add(vifDetailsBuilder.build());
178 bindingBuilder.setVifDetails(listVifDetail);
180 if (neutronPort.getBindingvifType() != null) {
181 bindingBuilder.setVifType(neutronPort.getBindingvifType());
183 if (neutronPort.getBindingvnicType() != null) {
184 bindingBuilder.setVnicType(neutronPort.getBindingvnicType());
186 if (neutronPort.getProfile() != null) {
187 bindingBuilder.setProfile(neutronPort.getProfile());
190 final PortSecurityExtensionBuilder portSecurityBuilder = new PortSecurityExtensionBuilder();
191 if (neutronPort.getPortSecurityEnabled() != null) {
192 portSecurityBuilder.setPortSecurityEnabled(neutronPort.getPortSecurityEnabled());
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());
208 portBuilder.setAllowedAddressPairs(listAllowedAddressPairs);
210 if (neutronPort.getDeviceID() != null) {
211 portBuilder.setDeviceId(neutronPort.getDeviceID());
213 if (neutronPort.getDeviceOwner() != null) {
214 portBuilder.setDeviceOwner(neutronPort.getDeviceOwner());
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
228 extraDHCPOptsBuilder.setIpVersion(mapper.get(ipVersion));
229 listExtraDHCPOptions.add(extraDHCPOptsBuilder.build());
231 portBuilder.setExtraDhcpOpts(listExtraDHCPOptions);
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());
241 portBuilder.setFixedIps(listNeutronIps);
243 if (neutronPort.getMacAddress() != null) {
244 portBuilder.setMacAddress(new MacAddress(neutronPort.getMacAddress()));
246 if (neutronPort.getNetworkUUID() != null) {
247 portBuilder.setNetworkId(toUuid(neutronPort.getNetworkUUID()));
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()));
254 portBuilder.setSecurityGroups(listSecurityGroups);
256 if (neutronPort.getQosPolicyId() != null) {
257 final QosPortExtensionBuilder qosExtensionBuilder = new QosPortExtensionBuilder();
258 qosExtensionBuilder.setQosPolicyId(toUuid(neutronPort.getQosPolicyId()));
259 portBuilder.addAugmentation(QosPortExtension.class, qosExtensionBuilder.build());
261 return portBuilder.build();