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.netvirt.openstack.netvirt.translator.crud.impl;
11 import java.util.ArrayList;
12 import java.util.HashMap;
13 import java.util.HashSet;
14 import java.util.List;
18 import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ProviderContext;
19 import org.opendaylight.netvirt.openstack.netvirt.translator.NeutronPort_AllowedAddressPairs;
20 import org.opendaylight.netvirt.openstack.netvirt.translator.NeutronPort_ExtraDHCPOption;
21 import org.opendaylight.netvirt.openstack.netvirt.translator.NeutronPort_VIFDetail;
22 import org.opendaylight.netvirt.openstack.netvirt.translator.crud.INeutronPortCRUD;
23 import org.opendaylight.netvirt.openstack.netvirt.translator.crud.INeutronSecurityGroupCRUD;
24 import org.opendaylight.netvirt.openstack.netvirt.translator.crud.NeutronCRUDInterfaces;
25 import org.opendaylight.netvirt.openstack.netvirt.translator.NeutronPort;
26 import org.opendaylight.netvirt.openstack.netvirt.translator.NeutronSecurityGroup;
27 import org.opendaylight.netvirt.openstack.netvirt.translator.Neutron_IPs;
28 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress;
29 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress;
30 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.binding.rev150712.PortBindingExtension;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.binding.rev150712.PortBindingExtensionBuilder;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.binding.rev150712.binding.attributes.VifDetails;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.binding.rev150712.binding.attributes.VifDetailsBuilder;
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.portsecurity.rev150712.PortSecurityExtension;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.portsecurity.rev150712.PortSecurityExtensionBuilder;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.rev150712.Neutron;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.types.rev160517.IpPrefixOrAddress;
48 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
49 import org.osgi.framework.BundleContext;
50 import org.osgi.framework.ServiceRegistration;
51 import org.slf4j.Logger;
52 import org.slf4j.LoggerFactory;
54 public class NeutronPortInterface extends AbstractNeutronInterface<Port, NeutronPort> implements INeutronPortCRUD {
55 private static final Logger LOGGER = LoggerFactory.getLogger(NeutronPortInterface.class);
57 NeutronPortInterface(ProviderContext providerContext) {
58 super(providerContext);
61 // IfNBPortCRUD methods
64 public boolean portExists(String uuid) {
65 Port port = readMd(createInstanceIdentifier(toMd(uuid)));
70 public NeutronPort getPort(String uuid) {
71 Port port = readMd(createInstanceIdentifier(toMd(uuid)));
79 public List<NeutronPort> getAllPorts() {
80 Set<NeutronPort> allPorts = new HashSet<>();
81 Ports ports = readMd(createInstanceIdentifier());
83 for (Port port : ports.getPort()) {
84 allPorts.add(fromMd(port));
87 LOGGER.debug("Exiting getAllPorts, Found {} OpenStackPorts", allPorts.size());
88 List<NeutronPort> ans = new ArrayList<>();
94 public boolean addPort(NeutronPort input) {
95 if (portExists(input.getID())) {
103 public boolean removePort(String uuid) {
104 if (!portExists(uuid)) {
107 return removeMd(toMd(uuid));
111 public boolean updatePort(String uuid, NeutronPort delta) {
112 if (!portExists(uuid)) {
119 // @deprecated, will be removed in Boron
121 public boolean macInUse(String macAddress) {
125 // @deprecated, will be removed in Boron
127 public NeutronPort getGatewayPort(String subnetUUID) {
132 protected InstanceIdentifier<Port> createInstanceIdentifier(Port port) {
133 return InstanceIdentifier.create(Neutron.class)
135 .child(Port.class, port.getKey());
138 protected InstanceIdentifier<Ports> createInstanceIdentifier() {
139 return InstanceIdentifier.create(Neutron.class)
143 protected void addExtensions(Port port, NeutronPort result) {
144 PortBindingExtension binding = port.getAugmentation(PortBindingExtension.class);
145 result.setBindinghostID(binding.getHostId());
146 if (binding.getVifDetails() != null) {
147 final Map<String, String> details = new HashMap<String, String>(binding.getVifDetails().size());
148 for (final VifDetails vifDetail : binding.getVifDetails()) {
149 details.put(vifDetail.getDetailsKey(), vifDetail.getValue());
151 result.setVIFDetails(details);
153 result.setBindingvifType(binding.getVifType());
154 result.setBindingvnicType(binding.getVnicType());
157 private void portSecurityExtension(Port port, NeutronPort result) {
158 PortSecurityExtension portSecurity = port.getAugmentation(PortSecurityExtension.class);
159 if(portSecurity != null && portSecurity.isPortSecurityEnabled() != null) {
160 result.setPortSecurityEnabled(portSecurity.isPortSecurityEnabled());
164 protected NeutronPort fromMd(Port port) {
165 NeutronPort result = new NeutronPort();
166 result.setAdminStateUp(port.isAdminStateUp());
167 if (port.getAllowedAddressPairs() != null) {
168 List<NeutronPort_AllowedAddressPairs> pairs = new ArrayList<>();
169 for (AllowedAddressPairs mdPair : port.getAllowedAddressPairs()) {
170 NeutronPort_AllowedAddressPairs pair = new NeutronPort_AllowedAddressPairs();
171 pair.setIpAddress(String.valueOf(mdPair.getIpAddress().getValue()));
172 pair.setMacAddress(mdPair.getMacAddress().getValue());
175 result.setAllowedAddressPairs(pairs);
177 result.setDeviceID(port.getDeviceId());
178 result.setDeviceOwner(port.getDeviceOwner());
179 if (port.getExtraDhcpOpts() != null) {
180 List<NeutronPort_ExtraDHCPOption> options = new ArrayList<>();
181 for (ExtraDhcpOpts opt : port.getExtraDhcpOpts()) {
182 NeutronPort_ExtraDHCPOption arg = new NeutronPort_ExtraDHCPOption();
183 arg.setName(opt.getOptName());
184 arg.setValue(opt.getOptValue());
187 result.setExtraDHCPOptions(options);
189 if (port.getFixedIps() != null) {
190 List<Neutron_IPs> ips = new ArrayList<>();
191 for (FixedIps mdIP : port.getFixedIps()) {
192 Neutron_IPs ip = new Neutron_IPs();
193 ip.setIpAddress(String.valueOf(mdIP.getIpAddress().getValue()));
194 ip.setSubnetUUID(mdIP.getSubnetId().getValue());
197 result.setFixedIPs(ips);
199 result.setMacAddress(port.getMacAddress().getValue());
200 result.setName(port.getName());
201 result.setNetworkUUID(String.valueOf(port.getNetworkId().getValue()));
202 if (port.getSecurityGroups() != null) {
203 Set<NeutronSecurityGroup> allGroups = new HashSet<>();
204 NeutronCRUDInterfaces interfaces = new NeutronCRUDInterfaces().fetchINeutronSecurityGroupCRUD(this);
205 INeutronSecurityGroupCRUD sgIf = interfaces.getSecurityGroupInterface();
206 for (Uuid sgUuid : port.getSecurityGroups()) {
207 NeutronSecurityGroup secGroup = sgIf.getNeutronSecurityGroup(sgUuid.getValue());
208 if (secGroup != null) {
209 allGroups.add(sgIf.getNeutronSecurityGroup(sgUuid.getValue()));
212 List<NeutronSecurityGroup> groups = new ArrayList<>();
213 groups.addAll(allGroups);
214 result.setSecurityGroups(groups);
216 result.setStatus(port.getStatus());
217 if (port.getTenantId() != null) {
218 result.setTenantID(String.valueOf(port.getTenantId().getValue()).replace("-", ""));
220 result.setPortUUID(String.valueOf(port.getUuid().getValue()));
221 addExtensions(port, result);
222 portSecurityExtension(port, result);
227 protected Port toMd(NeutronPort neutronPort) {
228 PortBindingExtensionBuilder bindingBuilder = new PortBindingExtensionBuilder();
229 if (neutronPort.getBindinghostID() != null) {
230 bindingBuilder.setHostId(neutronPort.getBindinghostID());
232 if (neutronPort.getVIFDetails() != null) {
233 final Map<String, String> vifDetails = neutronPort.getVIFDetails();
234 final List<VifDetails> listVifDetail = new ArrayList<VifDetails>(vifDetails.size());
235 for (final Map.Entry<String, String> vifDetail : vifDetails.entrySet()) {
236 final VifDetailsBuilder vifDetailsBuilder = new VifDetailsBuilder();
237 if (vifDetail.getKey() != null) {
238 vifDetailsBuilder.setDetailsKey(vifDetail.getKey());
240 if (vifDetail.getValue() != null) {
241 vifDetailsBuilder.setValue(vifDetail.getValue());
243 listVifDetail.add(vifDetailsBuilder.build());
245 bindingBuilder.setVifDetails(listVifDetail);
247 if (neutronPort.getBindingvifType() != null) {
248 bindingBuilder.setVifType(neutronPort.getBindingvifType());
250 if (neutronPort.getBindingvnicType() != null) {
251 bindingBuilder.setVnicType(neutronPort.getBindingvnicType());
254 PortSecurityExtensionBuilder portSecurityBuilder = new PortSecurityExtensionBuilder();
255 if (neutronPort.getPortSecurityEnabled() != null) {
256 portSecurityBuilder.setPortSecurityEnabled(neutronPort.getPortSecurityEnabled());
258 PortBuilder portBuilder = new PortBuilder();
259 portBuilder.addAugmentation(PortBindingExtension.class,
260 bindingBuilder.build());
261 portBuilder.addAugmentation(PortSecurityExtension.class, portSecurityBuilder.build());
262 portBuilder.setAdminStateUp(neutronPort.isAdminStateUp());
263 if(neutronPort.getAllowedAddressPairs() != null) {
264 List<AllowedAddressPairs> listAllowedAddressPairs = new ArrayList<>();
265 for (NeutronPort_AllowedAddressPairs allowedAddressPairs : neutronPort.getAllowedAddressPairs()) {
266 AllowedAddressPairsBuilder allowedAddressPairsBuilder = new AllowedAddressPairsBuilder();
267 allowedAddressPairsBuilder.setIpAddress(new IpPrefixOrAddress(allowedAddressPairs.getIpAddress().toCharArray()));
268 allowedAddressPairsBuilder.setMacAddress(new MacAddress(allowedAddressPairs.getMacAddress()));
269 listAllowedAddressPairs.add(allowedAddressPairsBuilder.build());
271 portBuilder.setAllowedAddressPairs(listAllowedAddressPairs);
273 if (neutronPort.getDeviceID() != null) {
274 portBuilder.setDeviceId(neutronPort.getDeviceID());
276 if (neutronPort.getDeviceOwner() != null) {
277 portBuilder.setDeviceOwner(neutronPort.getDeviceOwner());
279 if (neutronPort.getExtraDHCPOptions() != null) {
280 List<ExtraDhcpOpts> listExtraDHCPOptions = new ArrayList<>();
281 for (NeutronPort_ExtraDHCPOption extraDHCPOption : neutronPort.getExtraDHCPOptions()) {
282 ExtraDhcpOptsBuilder extraDHCPOptsBuilder = new ExtraDhcpOptsBuilder();
283 extraDHCPOptsBuilder.setOptName(extraDHCPOption.getName());
284 extraDHCPOptsBuilder.setOptValue(extraDHCPOption.getValue());
285 listExtraDHCPOptions.add(extraDHCPOptsBuilder.build());
287 portBuilder.setExtraDhcpOpts(listExtraDHCPOptions);
289 if (neutronPort.getFixedIPs() != null) {
290 List<FixedIps> listNeutronIPs = new ArrayList<>();
291 for (Neutron_IPs neutron_IPs : neutronPort.getFixedIPs()) {
292 FixedIpsBuilder fixedIpsBuilder = new FixedIpsBuilder();
293 fixedIpsBuilder.setIpAddress(new IpAddress(neutron_IPs.getIpAddress().toCharArray()));
294 fixedIpsBuilder.setSubnetId(toUuid(neutron_IPs.getSubnetUUID()));
295 listNeutronIPs.add(fixedIpsBuilder.build());
297 portBuilder.setFixedIps(listNeutronIPs);
299 if (neutronPort.getMacAddress() != null) {
300 portBuilder.setMacAddress(new MacAddress(neutronPort.getMacAddress()));
302 if (neutronPort.getName() != null) {
303 portBuilder.setName(neutronPort.getName());
305 if (neutronPort.getNetworkUUID() != null) {
306 portBuilder.setNetworkId(toUuid(neutronPort.getNetworkUUID()));
308 if (neutronPort.getSecurityGroups() != null) {
309 List<Uuid> listSecurityGroups = new ArrayList<>();
310 for (NeutronSecurityGroup neutronSecurityGroup : neutronPort.getSecurityGroups()) {
311 listSecurityGroups.add(toUuid(neutronSecurityGroup.getID()));
313 portBuilder.setSecurityGroups(listSecurityGroups);
315 if (neutronPort.getStatus() != null) {
316 portBuilder.setStatus(neutronPort.getStatus());
318 if (neutronPort.getTenantID() != null) {
319 portBuilder.setTenantId(toUuid(neutronPort.getTenantID()));
321 if (neutronPort.getPortUUID() != null) {
322 portBuilder.setUuid(toUuid(neutronPort.getPortUUID()));
324 LOGGER.warn("Attempting to write neutron port without UUID");
326 return portBuilder.build();
330 protected Port toMd(String uuid) {
331 PortBuilder portBuilder = new PortBuilder();
332 portBuilder.setUuid(toUuid(uuid));
333 return portBuilder.build();
336 public static void registerNewInterface(BundleContext context,
337 ProviderContext providerContext,
338 List<ServiceRegistration<?>> registrations) {
339 NeutronPortInterface neutronPortInterface = new NeutronPortInterface(providerContext);
340 ServiceRegistration<INeutronPortCRUD> neutronPortInterfaceRegistration = context.registerService(INeutronPortCRUD.class, neutronPortInterface, null);
341 if(neutronPortInterfaceRegistration != null) {
342 registrations.add(neutronPortInterfaceRegistration);