/* * Copyright (c) 2013, 2015 IBM Corporation and others. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html */ package org.opendaylight.netvirt.openstack.netvirt.translator.crud.impl; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import org.opendaylight.controller.md.sal.binding.api.DataBroker; import org.opendaylight.netvirt.openstack.netvirt.translator.NeutronPort; import org.opendaylight.netvirt.openstack.netvirt.translator.NeutronPort_AllowedAddressPairs; import org.opendaylight.netvirt.openstack.netvirt.translator.NeutronPort_ExtraDHCPOption; import org.opendaylight.netvirt.openstack.netvirt.translator.NeutronPort_VIFDetail; import org.opendaylight.netvirt.openstack.netvirt.translator.NeutronSecurityGroup; import org.opendaylight.netvirt.openstack.netvirt.translator.Neutron_IPs; import org.opendaylight.netvirt.openstack.netvirt.translator.crud.INeutronPortCRUD; import org.opendaylight.netvirt.openstack.netvirt.translator.crud.INeutronSecurityGroupCRUD; import org.opendaylight.netvirt.openstack.netvirt.translator.crud.NeutronCRUDInterfaces; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid; import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.binding.rev150712.PortBindingExtension; import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.binding.rev150712.PortBindingExtensionBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.binding.rev150712.binding.attributes.VifDetails; import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.binding.rev150712.binding.attributes.VifDetailsBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.port.attributes.AllowedAddressPairs; import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.port.attributes.AllowedAddressPairsBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.port.attributes.ExtraDhcpOpts; import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.port.attributes.ExtraDhcpOptsBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.port.attributes.FixedIps; import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.port.attributes.FixedIpsBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.ports.attributes.Ports; import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.ports.attributes.ports.Port; import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.ports.attributes.ports.PortBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.portsecurity.rev150712.PortSecurityExtension; import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.portsecurity.rev150712.PortSecurityExtensionBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.rev150712.Neutron; import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.types.rev160517.IpPrefixOrAddress; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.osgi.framework.BundleContext; import org.osgi.framework.ServiceRegistration; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class NeutronPortInterface extends AbstractNeutronInterface implements INeutronPortCRUD { private static final Logger LOG = LoggerFactory.getLogger(NeutronPortInterface.class); NeutronPortInterface(final DataBroker dataBroker) { super(dataBroker); } // IfNBPortCRUD methods @Override public boolean portExists(String uuid) { Port port = readMd(createInstanceIdentifier(toMd(uuid))); return port != null; } @Override public NeutronPort getPort(String uuid) { Port port = readMd(createInstanceIdentifier(toMd(uuid))); if (port == null) { return null; } return fromMd(port); } @Override public List getAllPorts() { Set allPorts = new HashSet<>(); Ports ports = readMd(createInstanceIdentifier()); if (ports != null) { for (Port port : ports.getPort()) { allPorts.add(fromMd(port)); } } LOG.debug("Exiting getAllPorts, Found {} OpenStackPorts", allPorts.size()); List ans = new ArrayList<>(); ans.addAll(allPorts); return ans; } @Override public boolean addPort(NeutronPort input) { if (portExists(input.getID())) { return false; } addMd(input); return true; } @Override public boolean removePort(String uuid) { if (!portExists(uuid)) { return false; } return removeMd(toMd(uuid)); } @Override public boolean updatePort(String uuid, NeutronPort delta) { if (!portExists(uuid)) { return false; } updateMd(delta); return true; } // @deprecated, will be removed in Boron @Override public boolean macInUse(String macAddress) { return false; } // @deprecated, will be removed in Boron @Override public NeutronPort getGatewayPort(String subnetUUID) { return null; } @Override protected InstanceIdentifier createInstanceIdentifier(Port port) { return InstanceIdentifier.create(Neutron.class) .child(Ports.class) .child(Port.class, port.getKey()); } protected InstanceIdentifier createInstanceIdentifier() { return InstanceIdentifier.create(Neutron.class) .child(Ports.class); } protected void addExtensions(Port port, NeutronPort result) { PortBindingExtension binding = port.getAugmentation(PortBindingExtension.class); result.setBindinghostID(binding.getHostId()); if (binding.getVifDetails() != null) { final Map details = new HashMap(binding.getVifDetails().size()); for (final VifDetails vifDetail : binding.getVifDetails()) { details.put(vifDetail.getDetailsKey(), vifDetail.getValue()); } result.setVIFDetails(details); } result.setBindingvifType(binding.getVifType()); result.setBindingvnicType(binding.getVnicType()); } private void portSecurityExtension(Port port, NeutronPort result) { PortSecurityExtension portSecurity = port.getAugmentation(PortSecurityExtension.class); if(portSecurity != null && portSecurity.isPortSecurityEnabled() != null) { result.setPortSecurityEnabled(portSecurity.isPortSecurityEnabled()); } } protected NeutronPort fromMd(Port port) { NeutronPort result = new NeutronPort(); result.setAdminStateUp(port.isAdminStateUp()); if (port.getAllowedAddressPairs() != null) { List pairs = new ArrayList<>(); for (AllowedAddressPairs mdPair : port.getAllowedAddressPairs()) { NeutronPort_AllowedAddressPairs pair = new NeutronPort_AllowedAddressPairs(); pair.setIpAddress(String.valueOf(mdPair.getIpAddress().getValue())); pair.setMacAddress(mdPair.getMacAddress().getValue()); pairs.add(pair); } result.setAllowedAddressPairs(pairs); } result.setDeviceID(port.getDeviceId()); result.setDeviceOwner(port.getDeviceOwner()); if (port.getExtraDhcpOpts() != null) { List options = new ArrayList<>(); for (ExtraDhcpOpts opt : port.getExtraDhcpOpts()) { NeutronPort_ExtraDHCPOption arg = new NeutronPort_ExtraDHCPOption(); arg.setName(opt.getOptName()); arg.setValue(opt.getOptValue()); options.add(arg); } result.setExtraDHCPOptions(options); } if (port.getFixedIps() != null) { List ips = new ArrayList<>(); for (FixedIps mdIP : port.getFixedIps()) { Neutron_IPs ip = new Neutron_IPs(); ip.setIpAddress(String.valueOf(mdIP.getIpAddress().getValue())); ip.setSubnetUUID(mdIP.getSubnetId().getValue()); ips.add(ip); } result.setFixedIPs(ips); } result.setMacAddress(port.getMacAddress().getValue()); result.setName(port.getName()); result.setNetworkUUID(String.valueOf(port.getNetworkId().getValue())); if (port.getSecurityGroups() != null) { Set allGroups = new HashSet<>(); NeutronCRUDInterfaces interfaces = new NeutronCRUDInterfaces().fetchINeutronSecurityGroupCRUD(this); INeutronSecurityGroupCRUD sgIf = interfaces.getSecurityGroupInterface(); for (Uuid sgUuid : port.getSecurityGroups()) { NeutronSecurityGroup secGroup = sgIf.getNeutronSecurityGroup(sgUuid.getValue()); if (secGroup != null) { allGroups.add(sgIf.getNeutronSecurityGroup(sgUuid.getValue())); } } List groups = new ArrayList<>(); groups.addAll(allGroups); result.setSecurityGroups(groups); } result.setStatus(port.getStatus()); if (port.getTenantId() != null) { result.setTenantID(String.valueOf(port.getTenantId().getValue()).replace("-", "")); } result.setPortUUID(String.valueOf(port.getUuid().getValue())); addExtensions(port, result); portSecurityExtension(port, result); return result; } @Override protected Port toMd(NeutronPort neutronPort) { PortBindingExtensionBuilder bindingBuilder = new PortBindingExtensionBuilder(); if (neutronPort.getBindinghostID() != null) { bindingBuilder.setHostId(neutronPort.getBindinghostID()); } if (neutronPort.getVIFDetails() != null) { final Map vifDetails = neutronPort.getVIFDetails(); final List listVifDetail = new ArrayList(vifDetails.size()); for (final Map.Entry vifDetail : vifDetails.entrySet()) { final VifDetailsBuilder vifDetailsBuilder = new VifDetailsBuilder(); if (vifDetail.getKey() != null) { vifDetailsBuilder.setDetailsKey(vifDetail.getKey()); } if (vifDetail.getValue() != null) { vifDetailsBuilder.setValue(vifDetail.getValue()); } listVifDetail.add(vifDetailsBuilder.build()); } bindingBuilder.setVifDetails(listVifDetail); } if (neutronPort.getBindingvifType() != null) { bindingBuilder.setVifType(neutronPort.getBindingvifType()); } if (neutronPort.getBindingvnicType() != null) { bindingBuilder.setVnicType(neutronPort.getBindingvnicType()); } PortSecurityExtensionBuilder portSecurityBuilder = new PortSecurityExtensionBuilder(); if (neutronPort.getPortSecurityEnabled() != null) { portSecurityBuilder.setPortSecurityEnabled(neutronPort.getPortSecurityEnabled()); } PortBuilder portBuilder = new PortBuilder(); portBuilder.addAugmentation(PortBindingExtension.class, bindingBuilder.build()); portBuilder.addAugmentation(PortSecurityExtension.class, portSecurityBuilder.build()); portBuilder.setAdminStateUp(neutronPort.isAdminStateUp()); if(neutronPort.getAllowedAddressPairs() != null) { List listAllowedAddressPairs = new ArrayList<>(); for (NeutronPort_AllowedAddressPairs allowedAddressPairs : neutronPort.getAllowedAddressPairs()) { AllowedAddressPairsBuilder allowedAddressPairsBuilder = new AllowedAddressPairsBuilder(); allowedAddressPairsBuilder.setIpAddress(new IpPrefixOrAddress(allowedAddressPairs.getIpAddress().toCharArray())); allowedAddressPairsBuilder.setMacAddress(new MacAddress(allowedAddressPairs.getMacAddress())); listAllowedAddressPairs.add(allowedAddressPairsBuilder.build()); } portBuilder.setAllowedAddressPairs(listAllowedAddressPairs); } if (neutronPort.getDeviceID() != null) { portBuilder.setDeviceId(neutronPort.getDeviceID()); } if (neutronPort.getDeviceOwner() != null) { portBuilder.setDeviceOwner(neutronPort.getDeviceOwner()); } if (neutronPort.getExtraDHCPOptions() != null) { List listExtraDHCPOptions = new ArrayList<>(); for (NeutronPort_ExtraDHCPOption extraDHCPOption : neutronPort.getExtraDHCPOptions()) { ExtraDhcpOptsBuilder extraDHCPOptsBuilder = new ExtraDhcpOptsBuilder(); extraDHCPOptsBuilder.setOptName(extraDHCPOption.getName()); extraDHCPOptsBuilder.setOptValue(extraDHCPOption.getValue()); listExtraDHCPOptions.add(extraDHCPOptsBuilder.build()); } portBuilder.setExtraDhcpOpts(listExtraDHCPOptions); } if (neutronPort.getFixedIPs() != null) { List listNeutronIPs = new ArrayList<>(); for (Neutron_IPs neutron_IPs : neutronPort.getFixedIPs()) { FixedIpsBuilder fixedIpsBuilder = new FixedIpsBuilder(); fixedIpsBuilder.setIpAddress(new IpAddress(neutron_IPs.getIpAddress().toCharArray())); fixedIpsBuilder.setSubnetId(toUuid(neutron_IPs.getSubnetUUID())); listNeutronIPs.add(fixedIpsBuilder.build()); } portBuilder.setFixedIps(listNeutronIPs); } if (neutronPort.getMacAddress() != null) { portBuilder.setMacAddress(new MacAddress(neutronPort.getMacAddress())); } if (neutronPort.getName() != null) { portBuilder.setName(neutronPort.getName()); } if (neutronPort.getNetworkUUID() != null) { portBuilder.setNetworkId(toUuid(neutronPort.getNetworkUUID())); } if (neutronPort.getSecurityGroups() != null) { List listSecurityGroups = new ArrayList<>(); for (NeutronSecurityGroup neutronSecurityGroup : neutronPort.getSecurityGroups()) { listSecurityGroups.add(toUuid(neutronSecurityGroup.getID())); } portBuilder.setSecurityGroups(listSecurityGroups); } if (neutronPort.getStatus() != null) { portBuilder.setStatus(neutronPort.getStatus()); } if (neutronPort.getTenantID() != null) { portBuilder.setTenantId(toUuid(neutronPort.getTenantID())); } if (neutronPort.getPortUUID() != null) { portBuilder.setUuid(toUuid(neutronPort.getPortUUID())); } else { LOG.warn("Attempting to write neutron port without UUID"); } return portBuilder.build(); } @Override protected Port toMd(String uuid) { PortBuilder portBuilder = new PortBuilder(); portBuilder.setUuid(toUuid(uuid)); return portBuilder.build(); } public static void registerNewInterface(BundleContext context, final DataBroker dataBroker, List> registrations) { NeutronPortInterface neutronPortInterface = new NeutronPortInterface(dataBroker); ServiceRegistration neutronPortInterfaceRegistration = context.registerService(INeutronPortCRUD.class, neutronPortInterface, null); if(neutronPortInterfaceRegistration != null) { registrations.add(neutronPortInterfaceRegistration); } } }