X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=neutronvpn%2Fimpl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fnetvirt%2Fneutronvpn%2FNeutronPortChangeListener.java;h=b62774984dc26240791a97e8ef7a6d7aabaf1905;hb=0aeb1f56e0d385aca4e65d658584c2d56b5f2a69;hp=2c5fd96567eabe99b49564aa1d469e4d1c030f5e;hpb=1d32cb3f0ed3ef4f9a67924fd6335e4995e6ed0c;p=netvirt.git diff --git a/neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/NeutronPortChangeListener.java b/neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/NeutronPortChangeListener.java index 2c5fd96567..b62774984d 100644 --- a/neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/NeutronPortChangeListener.java +++ b/neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/NeutronPortChangeListener.java @@ -15,7 +15,6 @@ import com.google.gson.Gson; import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; - import java.time.Duration; import java.util.ArrayList; import java.util.Collections; @@ -29,6 +28,7 @@ import java.util.stream.Collectors; import javax.annotation.PostConstruct; import javax.inject.Singleton; import org.apache.commons.lang3.ObjectUtils; +import org.eclipse.jdt.annotation.Nullable; import org.opendaylight.controller.md.sal.binding.api.DataBroker; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException; @@ -46,12 +46,17 @@ import org.opendaylight.netvirt.elanmanager.api.IElanService; import org.opendaylight.netvirt.neutronvpn.api.enums.IpVersionChoice; import org.opendaylight.netvirt.neutronvpn.api.utils.NeutronConstants; import org.opendaylight.netvirt.neutronvpn.api.utils.NeutronUtils; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.iana._if.type.rev140508.L2vlan; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.iana._if.type.rev170119.L2vlan; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceBuilder; 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.genius.interfacemanager.rev160406.IfL2vlan; import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.IfL2vlanBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.ParentRefs; +import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.ParentRefsBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.SplitHorizon; +import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.SplitHorizonBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanId; import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.aclservice.rev160608.InterfaceAcl; import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.aclservice.rev160608.InterfaceAclBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.aclservice.rev160608.interfaces._interface.AllowedAddressPairs; @@ -64,6 +69,8 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev16011 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.ext.routers.RoutersBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.floating.ip.port.info.FloatingIpIdToPortMappingBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.floating.ip.port.info.FloatingIpIdToPortMappingKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.config.rev160806.NeutronvpnConfig; +import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.neutron.vpn.port.id.subport.data.PortIdToSubport; import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.subnetmaps.Subnetmap; import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.binding.rev150712.PortBindingExtension; import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.hostconfig.rev150712.hostconfig.attributes.hostconfigs.Hostconfig; @@ -90,6 +97,7 @@ public class NeutronPortChangeListener extends AsyncDataTreeChangeListenerBase

identifier, Port input) { + LOG.trace("Received port add event: port={}", input); String portName = input.getUuid().getValue(); LOG.trace("Adding Port : key: {}, value={}", identifier, input); Network network = neutronvpnUtils.getNeutronNetwork(input.getNetworkId()); @@ -152,7 +164,7 @@ public class NeutronPortChangeListener extends AsyncDataTreeChangeListenerBase

identifier, Port original, Port update) { + LOG.trace("Received port update event: original={}, update={}", original, update); // Switchdev ports need to be bounded to a host before creation // in order to validate the supported vnic types from the hostconfig if (isPortTypeSwitchdev(original) @@ -211,7 +225,6 @@ public class NeutronPortChangeListener extends AsyncDataTreeChangeListenerBase

interfaceIdentifier = NeutronvpnUtils.buildVlanInterfaceIdentifier(portName); jobCoordinator.enqueueJob("PORT- " + portName, () -> Collections.singletonList(txRunner.callWithNewReadWriteTransactionAndSubmit(CONFIGURATION, @@ -253,9 +267,18 @@ public class NeutronPortChangeListener extends AsyncDataTreeChangeListenerBase

oldIPs = getFixedIpSet(original.getFixedIps()); + Set newIPs = getFixedIpSet(update.getFixedIps()); + if (!oldIPs.equals(newIPs)) { + InterfaceAcl infAcl = neutronvpnUtils.getDhcpInterfaceAcl(update); + interfaceBuilder.addAugmentation(InterfaceAcl.class, infAcl); + } + } LOG.info("update: Of-port-interface updation for port {}", portName); // Update OFPort interface for this neutron port confTx.put(interfaceIdentifier, interfaceBuilder.build()); @@ -266,9 +289,9 @@ public class NeutronPortChangeListener extends AsyncDataTreeChangeListenerBase

subnetMapList = new ArrayList<>(); - List portIps = routerPort.getFixedIps(); boolean portIsIpv6 = false; - for (FixedIps portIP : portIps) { + for (FixedIps portIP : routerPort.nonnullFixedIps()) { // NOTE: Please donot change the order of calls to updateSubnetNodeWithFixedIP // and addSubnetToVpn here if (internetVpnId != null && portIP.getIpAddress().getIpv6Address() != null) { portIsIpv6 = true; } - String ipValue = String.valueOf(portIP.getIpAddress().getValue()); + String ipValue = portIP.getIpAddress().stringValue(); Uuid subnetId = portIP.getSubnetId(); nvpnManager.updateSubnetNodeWithFixedIp(subnetId, routerId, routerPort.getUuid(), ipValue, routerPort.getMacAddress().getValue(), vpnId); @@ -311,24 +333,21 @@ public class NeutronPortChangeListener extends AsyncDataTreeChangeListenerBase

{ + nvpnNatManager.handleSubnetsForExternalRouter(routerId); + return Collections.emptyList(); + }); ListenableFutures.addErrorLogging(txRunner.callWithNewWriteOnlyTransactionAndSubmit(CONFIGURATION, confTx -> { String portInterfaceName = createOfPortInterface(routerPort, confTx); @@ -358,8 +385,9 @@ public class NeutronPortChangeListener extends AsyncDataTreeChangeListenerBase

portIps = routerPort.getFixedIps(); + Uuid vpnId = ObjectUtils.defaultIfNull(neutronvpnUtils.getVpnForRouter(routerId, true), + routerId); + List portIps = routerPort.nonnullFixedIps(); boolean vpnInstanceInternetIpVersionRemoved = false; Uuid vpnInstanceInternetUuid = null; for (FixedIps portIP : portIps) { @@ -383,64 +411,75 @@ public class NeutronPortChangeListener extends AsyncDataTreeChangeListenerBase

{ - boolean vpnInstanceIpVersionRemoved = false; - IpVersionChoice vpnInstanceIpVersionToRemove = IpVersionChoice.UNDEFINED; + IpVersionChoice ipVersion = IpVersionChoice.UNDEFINED; for (FixedIps portIP : portIps) { Subnetmap sn = neutronvpnUtils.getSubnetmap(portIP.getSubnetId()); // router Port have either IPv4 or IPv6, never both - if (neutronvpnUtils.shouldVpnHandleIpVersionChangeToRemove(sn, vpnId)) { - vpnInstanceIpVersionRemoved = true; - vpnInstanceIpVersionToRemove = neutronvpnUtils.getIpVersionFromString(sn.getSubnetIp()); - } - String ipValue = String.valueOf(portIP.getIpAddress().getValue()); + ipVersion = neutronvpnUtils.getIpVersionFromString(sn.getSubnetIp()); + String ipValue = portIP.getIpAddress().stringValue(); neutronvpnUtils.removeVpnPortFixedIpToPort(vpnId.getValue(), ipValue, confTx); // NOTE: Please donot change the order of calls to removeSubnetFromVpn and // and updateSubnetNodeWithFixedIP - nvpnManager.removeSubnetFromVpn(vpnId, portIP.getSubnetId(), - sn != null ? sn.getInternetVpnId() : null); + nvpnManager.removeSubnetFromVpn(vpnId, portIP.getSubnetId(), internetVpnId); nvpnManager.updateSubnetNodeWithFixedIp(portIP.getSubnetId(), null, null, null, null, null); } nvpnManager.removeFromNeutronRouterInterfacesMap(routerId, routerPort.getUuid().getValue()); deleteElanInterface(routerPort.getUuid().getValue(), confTx); deleteOfPortInterface(routerPort, confTx); - nvpnNatManager.handleSubnetsForExternalRouter(routerId); - if (vpnInstanceIpVersionRemoved) { - neutronvpnUtils.updateVpnInstanceWithIpFamily(vpnId.getValue(), vpnInstanceIpVersionToRemove, - false); + jobCoordinator.enqueueJob(routerId.toString(), () -> { + nvpnNatManager.handleSubnetsForExternalRouter(routerId); + return Collections.emptyList(); + }); + if (neutronvpnUtils.shouldVpnHandleIpVersionChoiceChange(ipVersion, routerId, false)) { + LOG.debug("vpnInstanceOpDataEntry is getting update with ip address family {} for VPN {}", + ipVersion, vpnId.getValue()); + neutronvpnUtils.updateVpnInstanceWithIpFamily(vpnId.getValue(), ipVersion, false); } }), LOG, "Error handling interface removal"); if (vpnInstanceInternetIpVersionRemoved) { neutronvpnUtils.updateVpnInstanceWithIpFamily(vpnInstanceInternetUuid.getValue(), IpVersionChoice.IPV6, false); - neutronvpnUtils.updateVpnInstanceWithFallback(vpnInstanceInternetUuid.getValue(), false); + neutronvpnUtils.updateVpnInstanceWithFallback(routerId, vpnInstanceInternetUuid, false); } } } - private void handleRouterGatewayUpdated(Port routerGwPort) { + private void handleRouterGatewayUpdated(Port routerGwPort, boolean isRtrGwRemoved) { Uuid routerId = new Uuid(routerGwPort.getDeviceId()); Uuid networkId = routerGwPort.getNetworkId(); Network network = neutronvpnUtils.getNeutronNetwork(networkId); if (network == null) { return; } - boolean isExternal = neutronvpnUtils.getIsExternal(network); + boolean isExternal = NeutronvpnUtils.getIsExternal(network); if (isExternal) { Uuid vpnInternetId = neutronvpnUtils.getVpnForNetwork(networkId); if (vpnInternetId != null) { + if (!isRtrGwRemoved) { + nvpnManager.updateVpnMaps(vpnInternetId, null, routerId, null, null); + } List snList = neutronvpnUtils.getNeutronRouterSubnetMaps(routerId); for (Subnetmap sn : snList) { if (sn.getNetworkId() == networkId) { continue; } - if (neutronvpnUtils.getIpVersionFromString(sn.getSubnetIp()) != IpVersionChoice.IPV6) { + if (NeutronvpnUtils.getIpVersionFromString(sn.getSubnetIp()) != IpVersionChoice.IPV6) { continue; } - nvpnManager.addSubnetToVpn(null, sn.getId(), vpnInternetId); + if (isRtrGwRemoved) { + nvpnManager.removeV6PrivateSubnetToExtNetwork(routerId, vpnInternetId, sn); + } else { + nvpnManager.addV6PrivateSubnetToExtNetwork(routerId, vpnInternetId, sn); + } + } + //Update Internet BGP-VPN + if (isRtrGwRemoved) { + nvpnManager.updateVpnMaps(vpnInternetId, null, null, null, null); } } } @@ -465,8 +504,10 @@ public class NeutronPortChangeListener extends AsyncDataTreeChangeListenerBase

{ + setExternalGwMac(routerGwPort, routerId); + return Collections.emptyList(); + }); } private void setExternalGwMac(Port routerGwPort, Uuid routerId) { @@ -489,6 +530,7 @@ public class NeutronPortChangeListener extends AsyncDataTreeChangeListenerBase

unmarshal(final String profile) { if (null == profile) { return null; } Gson gson = new Gson(); JsonObject jsonObject = gson.fromJson(profile, JsonObject.class); - Map map = new HashMap(); + Map map = new HashMap<>(); for (Map.Entry entry : jsonObject.entrySet()) { map.put(entry.getKey(), entry.getValue()); } @@ -581,15 +625,15 @@ public class NeutronPortChangeListener extends AsyncDataTreeChangeListenerBase

portIpAddrsList = port.getFixedIps(); + final List portIpAddrsList = port.nonnullFixedIps(); if (NeutronConstants.IS_ODL_DHCP_PORT.test(port)) { return; } jobCoordinator.enqueueJob("PORT- " + portName, () -> { // add direct port to subnetMaps config DS if (!(NeutronUtils.isPortVnicTypeNormal(port) - || (isPortTypeSwitchdev(port) - && isSupportedVnicTypeByHost(port, NeutronConstants.VNIC_TYPE_DIRECT)))) { + || isPortTypeSwitchdev(port) + && isSupportedVnicTypeByHost(port, NeutronConstants.VNIC_TYPE_DIRECT))) { for (FixedIps ip: portIpAddrsList) { nvpnManager.updateSubnetmapNodeWithPorts(ip.getSubnetId(), null, portId); } @@ -642,7 +686,7 @@ public class NeutronPortChangeListener extends AsyncDataTreeChangeListenerBase

portIpsList = port.getFixedIps(); + final List portIpsList = port.nonnullFixedIps(); jobCoordinator.enqueueJob("PORT- " + portName, () -> Collections.singletonList(txRunner.callWithNewWriteOnlyTransactionAndSubmit(CONFIGURATION, confTx -> { if (!(NeutronUtils.isPortVnicTypeNormal(port) || isPortTypeSwitchdev(port))) { @@ -674,7 +718,7 @@ public class NeutronPortChangeListener extends AsyncDataTreeChangeListenerBase

Collections.singletonList(txRunner.callWithNewWriteOnlyTransactionAndSubmit(CONFIGURATION, confTx -> { final List originalSnMapsIds = portoriginalIps.stream().map(FixedIps::getSubnetId) @@ -741,7 +790,7 @@ public class NeutronPortChangeListener extends AsyncDataTreeChangeListenerBase

newVpnIds = new HashSet(); + Set newVpnIds = new HashSet<>(); Set newRouterIds = new HashSet<>(); for (Uuid snId: updateSnMapsIds) { Subnetmap subnetMapNew = nvpnManager.updateSubnetmapNodeWithPorts(snId, portupdate.getUuid(), null); @@ -780,6 +829,7 @@ public class NeutronPortChangeListener extends AsyncDataTreeChangeListenerBase

()); interfaceAclBuilder.setAllowedAddressPairs(new ArrayList<>()); + interfaceAclBuilder.setSubnetInfo(new ArrayList<>()); } } else { if (updatedSecurityEnabled) { @@ -813,7 +863,7 @@ public class NeutronPortChangeListener extends AsyncDataTreeChangeListenerBase