X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=neutronvpn%2Fneutronvpn-impl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fvpnservice%2Fneutronvpn%2FNeutronvpnUtils.java;h=3acc5ce43b90c8ca480945b7110a2f34266a497d;hb=5d9a52407447e8656f58ff5df8612dc59afe1508;hp=042b0ea19f28dd22f0e400f892d715692b59c79b;hpb=da3cdd407725998c68924908006d31da84cac330;p=vpnservice.git diff --git a/neutronvpn/neutronvpn-impl/src/main/java/org/opendaylight/vpnservice/neutronvpn/NeutronvpnUtils.java b/neutronvpn/neutronvpn-impl/src/main/java/org/opendaylight/vpnservice/neutronvpn/NeutronvpnUtils.java index 042b0ea1..3acc5ce4 100644 --- a/neutronvpn/neutronvpn-impl/src/main/java/org/opendaylight/vpnservice/neutronvpn/NeutronvpnUtils.java +++ b/neutronvpn/neutronvpn-impl/src/main/java/org/opendaylight/vpnservice/neutronvpn/NeutronvpnUtils.java @@ -13,18 +13,31 @@ import com.google.common.base.Optional; import org.opendaylight.controller.md.sal.binding.api.DataBroker; import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; +import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.VpnInterfaces; +import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.interfaces.VpnInterface; +import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.interfaces.VpnInterfaceKey; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.Interfaces; 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.InterfaceKey; 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.l3.rev150712.routers.attributes.Routers; import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.l3.rev150712.routers.attributes.routers.Router; import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.l3.rev150712.routers.attributes.routers.RouterKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.NetworkTypeBase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.NetworkTypeVxlan; import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.networks.attributes.Networks; import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.networks.attributes.networks.Network; import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.networks.attributes.networks.NetworkKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.provider.ext.rev150712.NetworkProviderExtension; +import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.provider.ext.rev150712.neutron.networks.network.Segments; +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.PortKey; import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.rev150712.Neutron; +import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.subnets.rev150712.subnets.attributes.Subnets; +import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.subnets.rev150712.subnets.attributes.subnets.Subnet; +import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.subnets.rev150712.subnets.attributes.subnets.SubnetKey; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.lockmanager.rev150819.LockManagerService; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.lockmanager.rev150819.TimeUnits; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.lockmanager.rev150819.TryLockInput; @@ -41,10 +54,6 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.neutronvpn.rev15 .PortFixedipToPortName; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.neutronvpn.rev150602.neutron.port.data .PortFixedipToPortNameKey; -import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.neutronvpn.rev150602.neutron.port.data - .PortNameToPortUuid; -import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.neutronvpn.rev150602.neutron.port.data - .PortNameToPortUuidKey; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.neutronvpn.rev150602.subnetmaps.Subnetmap; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.neutronvpn.rev150602.subnetmaps.SubnetmapKey; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.neutronvpn.rev150602.vpnmaps.VpnMap; @@ -60,13 +69,10 @@ import java.util.List; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; -//import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.port.ext.rev151125.TrunkportExt; -//import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.port.ext.rev151125.TrunkportTypeBase; -//import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.port.ext.rev151125.TrunkportTypeSubport; - public class NeutronvpnUtils { private static final Logger logger = LoggerFactory.getLogger(NeutronvpnUtils.class); + public static final String VNIC_TYPE_NORMAL = "normal"; protected static Subnetmap getSubnetmap(DataBroker broker, Uuid subnetId) { InstanceIdentifier id = buildSubnetMapIdentifier(subnetId); @@ -92,11 +98,11 @@ public class NeutronvpnUtils { protected static Uuid getVpnForNetwork(DataBroker broker, Uuid network) { InstanceIdentifier vpnMapsIdentifier = InstanceIdentifier.builder(VpnMaps.class).build(); Optional optionalVpnMaps = read(broker, LogicalDatastoreType.CONFIGURATION, vpnMapsIdentifier); - if (optionalVpnMaps.isPresent()) { - VpnMaps vpnMaps = optionalVpnMaps.get(); - List allMaps = vpnMaps.getVpnMap(); + if (optionalVpnMaps.isPresent() && optionalVpnMaps.get().getVpnMap() != null) { + List allMaps = optionalVpnMaps.get().getVpnMap(); for (VpnMap vpnMap : allMaps) { - if (vpnMap.getNetworkIds().contains(network)) { + List netIds = vpnMap.getNetworkIds(); + if ((netIds != null) && (netIds.contains(network))) { return vpnMap.getVpnId(); } } @@ -104,16 +110,25 @@ public class NeutronvpnUtils { return null; } - protected static Uuid getVpnForRouter(DataBroker broker, Uuid router) { + // true for external vpn, false for internal vpn + protected static Uuid getVpnForRouter(DataBroker broker, Uuid routerId, Boolean externalVpn) { InstanceIdentifier vpnMapsIdentifier = InstanceIdentifier.builder(VpnMaps.class).build(); - Optional optionalVpnMaps = read(broker, LogicalDatastoreType.CONFIGURATION, vpnMapsIdentifier); - if (optionalVpnMaps.isPresent()) { - VpnMaps vpnNets = optionalVpnMaps.get(); - List allMaps = vpnNets.getVpnMap(); - if (router != null) { + Optional optionalVpnMaps = read(broker, LogicalDatastoreType.CONFIGURATION, + vpnMapsIdentifier); + if (optionalVpnMaps.isPresent() && optionalVpnMaps.get().getVpnMap() != null) { + List allMaps = optionalVpnMaps.get().getVpnMap(); + if (routerId != null) { for (VpnMap vpnMap : allMaps) { - if (router.equals(vpnMap.getRouterId())) { - return vpnMap.getVpnId(); + if (routerId.equals(vpnMap.getRouterId())) { + if (externalVpn == true) { + if (!routerId.equals(vpnMap.getVpnId())) { + return vpnMap.getVpnId(); + } + } else { + if (routerId.equals(vpnMap.getVpnId())) { + return vpnMap.getVpnId(); + } + } } } } @@ -132,15 +147,6 @@ public class NeutronvpnUtils { return null; } - protected static Uuid getNeutronPortIdfromPortName(DataBroker broker, String portname) { - InstanceIdentifier id = buildPortNameToPortUuidIdentifier(portname); - Optional portNameToPortUuidData = read(broker, LogicalDatastoreType.CONFIGURATION, id); - if (portNameToPortUuidData.isPresent()) { - return portNameToPortUuidData.get().getPortId(); - } - return null; - } - protected static String getNeutronPortNamefromPortFixedIp(DataBroker broker, String fixedIp) { InstanceIdentifier id = buildFixedIpToPortNameIdentifier(fixedIp); Optional portFixedipToPortNameData = read(broker, LogicalDatastoreType.CONFIGURATION, @@ -160,22 +166,6 @@ public class NeutronvpnUtils { return null; } - //TODO - //Will be done once integrated with TrunkPort Extensions - protected static int getVlanFromNeutronPort(Port port) { - int vlanId = 0; - /* - TrunkportExt trunkportExt = port.getAugmentation(TrunkportExt.class); - if (trunkportExt != null) { - Class trunkportType = trunkportExt.getType(); - if (trunkportType != null && trunkportType.isAssignableFrom(TrunkportTypeSubport.class)) { - vlanId = trunkportExt.getVid(); - } - } - */ - return vlanId; - } - protected static Router getNeutronRouter(DataBroker broker, Uuid routerId) { InstanceIdentifier inst = InstanceIdentifier.create(Neutron.class).child(Routers.class).child(Router @@ -198,23 +188,54 @@ public class NeutronvpnUtils { return null; } + protected static String getSegmentationIdFromNeutronNetwork(Network network) { + String segmentationId = null; + NetworkProviderExtension providerExtension = network.getAugmentation(NetworkProviderExtension.class); + if (providerExtension != null) { + segmentationId = providerExtension.getSegmentationId(); + if (segmentationId == null) { + List providerSegments = providerExtension.getSegments(); + if (providerSegments != null && providerSegments.size() > 0) { + for (Segments providerSegment: providerSegments) { + if (isNetworkSegmentTypeVxlan(providerSegment)) { + segmentationId = providerSegment.getSegmentationId(); + break; + } + } + } + } + } + return segmentationId; + } + protected static List getNeutronRouterSubnetIds(DataBroker broker, Uuid routerId) { logger.info("getNeutronRouterSubnetIds for {}", routerId.getValue()); - List subnetNames = new ArrayList(); + List subnetIdList = new ArrayList(); Router router = getNeutronRouter(broker, routerId); if (router != null) { List ifs = router.getInterfaces(); - if (!ifs.isEmpty()) { + .Interfaces> interfacesList = router.getInterfaces(); + if (interfacesList != null) { for (org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.l3.rev150712.routers.attributes.routers - .router.Interfaces iff : ifs) { - subnetNames.add(iff.getSubnetId()); + .router.Interfaces interfaces : interfacesList) { + subnetIdList.add(interfaces.getSubnetId()); } } } logger.info("returning from getNeutronRouterSubnetIds for {}", routerId.getValue()); - return subnetNames; + return subnetIdList; + } + + protected static Port getNeutronPort(DataBroker broker, Uuid portId) { + logger.debug("getNeutronPort for {}", portId.getValue()); + InstanceIdentifier inst = InstanceIdentifier.create(Neutron.class).child(Ports.class).child(Port.class, + new PortKey(portId)); + Optional port = read(broker, LogicalDatastoreType.CONFIGURATION, inst); + if (port.isPresent()) { + return port.get(); + } + return null; } protected static String uuidToTapPortName(Uuid id) { @@ -222,37 +243,51 @@ public class NeutronvpnUtils { return new StringBuilder().append("tap").append(tapId).toString(); } - protected static void lockVpnInterface(LockManagerService lockManager, String vpnInterfaceName) { - TryLockInput input = new TryLockInputBuilder().setLockName(vpnInterfaceName).setTime(5L).setTimeUnit + protected static boolean isPortVnicTypeNormal(Port port) { + PortBindingExtension portBinding = port.getAugmentation(PortBindingExtension.class); + if(portBinding == null || portBinding.getVnicType() == null) { + // By default, VNIC_TYPE is NORMAL + return true; + } + String vnicType = portBinding.getVnicType().trim().toLowerCase(); + return vnicType.equals(VNIC_TYPE_NORMAL); + } + + protected static boolean lock(LockManagerService lockManager, String lockName) { + TryLockInput input = new TryLockInputBuilder().setLockName(lockName).setTime(5L).setTimeUnit (TimeUnits.Milliseconds).build(); - Future> result = lockManager.tryLock(input); + boolean islockAcquired = false; try { + Future> result = lockManager.tryLock(input); if ((result != null) && (result.get().isSuccessful())) { - logger.debug("Acquired lock for vpninterface {}", vpnInterfaceName); + logger.debug("Acquired lock for {}", lockName); + islockAcquired = true; } else { - throw new RuntimeException(String.format("Unable to getLock for vpninterface %s", vpnInterfaceName)); + logger.error("Unable to acquire lock for {}", lockName); } } catch (InterruptedException | ExecutionException e) { - logger.error("Unable to getLock for vpninterface {}", vpnInterfaceName); - throw new RuntimeException(String.format("Unable to getLock for vpninterface %s", vpnInterfaceName), e - .getCause()); + logger.error("Unable to acquire lock for {}", lockName); + throw new RuntimeException(String.format("Unable to acquire lock for %s", lockName), e.getCause()); } + return islockAcquired; } - protected static void unlockVpnInterface(LockManagerService lockManager, String vpnInterfaceName) { - UnlockInput input = new UnlockInputBuilder().setLockName(vpnInterfaceName).build(); - Future> result = lockManager.unlock(input); + protected static boolean unlock(LockManagerService lockManager, String lockName) { + UnlockInput input = new UnlockInputBuilder().setLockName(lockName).build(); + boolean islockAcquired = false; try { + Future> result = lockManager.unlock(input); if ((result != null) && (result.get().isSuccessful())) { - logger.debug("Unlocked vpninterface{}", vpnInterfaceName); + logger.debug("Unlocked {}", lockName); + islockAcquired = true; } else { - logger.debug("Unable to unlock vpninterface {}", vpnInterfaceName); + logger.error("Unable to unlock {}", lockName); } } catch (InterruptedException | ExecutionException e) { - logger.error("Unable to unlock vpninterface {}", vpnInterfaceName); - throw new RuntimeException(String.format("Unable to unlock vpninterface %s", vpnInterfaceName), e - .getCause()); + logger.error("Unable to unlock {}", lockName); + throw new RuntimeException(String.format("Unable to unlock %s", lockName), e.getCause()); } + return islockAcquired; } protected static Short getIPPrefixFromPort(DataBroker broker, Port port) { @@ -261,17 +296,10 @@ public class NeutronvpnUtils { try { Uuid subnetUUID = port.getFixedIps().get(0).getSubnetId(); - org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.subnets.rev150712.subnets.attributes.subnets - .SubnetKey subnetkey = new org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.subnets - .rev150712.subnets.attributes.subnets.SubnetKey(subnetUUID); - InstanceIdentifier subnetidentifier = InstanceIdentifier.create(Neutron.class).child(org - .opendaylight.yang.gen.v1.urn.opendaylight.neutron.subnets.rev150712.subnets.attributes.Subnets - .class).child(org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.subnets.rev150712.subnets - .attributes.subnets.Subnet.class, subnetkey); - Optional subnet = read(broker, LogicalDatastoreType.CONFIGURATION, subnetidentifier); - + SubnetKey subnetkey = new SubnetKey(subnetUUID); + InstanceIdentifier subnetidentifier = InstanceIdentifier.create(Neutron.class).child(Subnets + .class).child(Subnet.class, subnetkey); + Optional subnet = read(broker, LogicalDatastoreType.CONFIGURATION,subnetidentifier); if (subnet.isPresent()) { cidr = subnet.get().getCidr(); // Extract the prefix length from cidr @@ -287,18 +315,12 @@ public class NeutronvpnUtils { logger.trace("Unable to read on subnet datastore"); } } catch (Exception e) { - logger.trace("Failed to retrieve IP prefix from port : ", e); + logger.error("Failed to retrieve IP prefix from port : ", e); System.out.println("Failed to retrieve IP prefix from port : " + e.getMessage()); } return null; } - static InstanceIdentifier buildPortNameToPortUuidIdentifier(String portname) { - InstanceIdentifier id = InstanceIdentifier.builder(NeutronPortData.class).child - (PortNameToPortUuid.class, new PortNameToPortUuidKey(portname)).build(); - return id; - } - static InstanceIdentifier buildFixedIpToPortNameIdentifier(String fixedIp) { InstanceIdentifier id = InstanceIdentifier.builder(NeutronPortData.class).child (PortFixedipToPortName.class, new PortFixedipToPortNameKey(fixedIp)).build(); @@ -311,6 +333,12 @@ public class NeutronvpnUtils { return id; } + static InstanceIdentifier buildVpnInterfaceIdentifier(String ifName) { + InstanceIdentifier id = InstanceIdentifier.builder(VpnInterfaces.class). + child(VpnInterface.class, new VpnInterfaceKey(ifName)).build(); + return id; + } + static InstanceIdentifier buildSubnetMapIdentifier(Uuid subnetId) { InstanceIdentifier id = InstanceIdentifier.builder(Subnetmaps.class).child(Subnetmap.class, new SubnetmapKey(subnetId)).build(); @@ -338,4 +366,8 @@ public class NeutronvpnUtils { return result; } + static boolean isNetworkSegmentTypeVxlan(Segments providerSegment) { + Class networkType = providerSegment.getNetworkType(); + return (networkType != null && networkType.isAssignableFrom(NetworkTypeVxlan.class)); + } }