From 2d372810f91269011a3d10e79f6fce148bfcc53e Mon Sep 17 00:00:00 2001 From: David Goldberg Date: Thu, 8 Dec 2016 15:01:33 +0200 Subject: [PATCH] Add support for choosing segmentation id Change-Id: I149410ccec55c02b8cbd84e2075bfd56dd5ff3dd Signed-off-by: David Goldberg --- .../resources/cpeui/dialogs/AddEvc.tpl.html | 14 ++++++++++++-- .../resources/cpeui/dialogs/AddIpUni.tpl.html | 7 +++++++ .../resources/cpeui/services/cpeui.services.js | 14 ++++++++++++-- .../main/resources/cpeui/tenant.controller.js | 2 +- legato-api/src/main/yang/mef-interfaces.yang | 3 +++ legato-api/src/main/yang/mef-services.yang | 6 ++++++ .../unimgr/mef/netvirt/EvcListener.java | 2 +- .../unimgr/mef/netvirt/IpvcListener.java | 9 ++++----- .../unimgr/mef/netvirt/NetvirtUtils.java | 17 ++++++++++++++--- .../unimgr/mef/netvirt/NetvirtVpnUtils.java | 7 +++---- 10 files changed, 63 insertions(+), 18 deletions(-) diff --git a/dlux/cpeui/cpeui-module/src/main/resources/cpeui/dialogs/AddEvc.tpl.html b/dlux/cpeui/cpeui-module/src/main/resources/cpeui/dialogs/AddEvc.tpl.html index 4ee79769..ff56a390 100644 --- a/dlux/cpeui/cpeui-module/src/main/resources/cpeui/dialogs/AddEvc.tpl.html +++ b/dlux/cpeui/cpeui-module/src/main/resources/cpeui/dialogs/AddEvc.tpl.html @@ -34,9 +34,19 @@ - {{advancedCollapsed ? 'Show' : 'Hide'}} Advanced Options -
+ + + + + + + +
+
IP/Mask is required! (ex. 127.0.0.1/32)
+
+
+
{{obj.is_preserve_vlan ? "" : "Do Not"}} Preserve VLAN diff --git a/dlux/cpeui/cpeui-module/src/main/resources/cpeui/dialogs/AddIpUni.tpl.html b/dlux/cpeui/cpeui-module/src/main/resources/cpeui/dialogs/AddIpUni.tpl.html index 16f2ae98..a2ef9838 100644 --- a/dlux/cpeui/cpeui-module/src/main/resources/cpeui/dialogs/AddIpUni.tpl.html +++ b/dlux/cpeui/cpeui-module/src/main/resources/cpeui/dialogs/AddIpUni.tpl.html @@ -34,6 +34,13 @@
Vlan is required when there are other ip-unis with vlans
+ + + +
+
Number is required!
+
+
diff --git a/dlux/cpeui/cpeui-module/src/main/resources/cpeui/services/cpeui.services.js b/dlux/cpeui/cpeui-module/src/main/resources/cpeui/services/cpeui.services.js index 5fd57448..78c25809 100644 --- a/dlux/cpeui/cpeui-module/src/main/resources/cpeui/services/cpeui.services.js +++ b/dlux/cpeui/cpeui-module/src/main/resources/cpeui/services/cpeui.services.js @@ -317,7 +317,7 @@ define(['app/cpeui/cpeui.module'],function(cpeui) { }); }; - svc.addIpUni = function(uniid, ipuni_id, ip_address, vlan, callback) { + svc.addIpUni = function(uniid, ipuni_id, ip_address, vlan, segmentation_id, callback) { var data = {"ip-uni":{ "ip-uni-id": ipuni_id, "ip-address": ip_address @@ -325,6 +325,9 @@ define(['app/cpeui/cpeui.module'],function(cpeui) { if (vlan){ data["ip-uni"].vlan = vlan; } + if (segmentation_id) { + data["ip-uni"]["segmentation-id"] = segmentation_id; + } $http({ method:'POST', url:"/restconf/config/mef-interfaces:mef-interfaces/unis/uni/"+uniid+"/ip-unis/", @@ -429,7 +432,8 @@ define(['app/cpeui/cpeui.module'],function(cpeui) { unis.forEach(function(i){uni_json.push({"uni-id":i});}); return uni_json; } - svc.addEvc = function(evc, evc_type, tenant, callback) { + + svc.addEvc = function(evc, evc_type, tenant, callback) { var uni_json = getJsonUnis(evc.unis); // preserved-vlan var data = { @@ -454,6 +458,12 @@ define(['app/cpeui/cpeui.module'],function(cpeui) { if (evc.is_preserve_vlan) { data["mef-service"]["evc"]["preserved-vlan"] = evc.preserved_vlan; } + if (evc.subnet) { + data["mef-service"]["evc"].subnet = evc.subnet; + } + if (evc.segmentation_id) { + data["mef-service"]["evc"]["segmentation-id"] = evc.segmentation_id; + } $http({ method:'POST', url:"/restconf/config/mef-services:mef-services/", diff --git a/dlux/cpeui/cpeui-module/src/main/resources/cpeui/tenant.controller.js b/dlux/cpeui/cpeui-module/src/main/resources/cpeui/tenant.controller.js index 6ad9df21..ab92668c 100644 --- a/dlux/cpeui/cpeui-module/src/main/resources/cpeui/tenant.controller.js +++ b/dlux/cpeui/cpeui-module/src/main/resources/cpeui/tenant.controller.js @@ -162,7 +162,7 @@ define([ 'app/cpeui/cpeui.module' ], function(cpeui) { }; $scope.ipUniDialog = new CpeuiDialogs.Dialog('AddIpUni', {}, function(obj) { - CpeuiSvc.addIpUni(obj['uni-id'], obj['ip-uni-id'], obj['ip-address'], obj.vlan, function() { + CpeuiSvc.addIpUni(obj['uni-id'], obj['ip-uni-id'], obj['ip-address'], obj.vlan, obj['segmentation-id'], function() { var uni = $scope.unis.filterByField('uni-id',obj['uni-id'])[0]; if (uni['ip-unis'] == undefined || uni['ip-unis']['ip-uni'] == undefined){ uni['ip-unis'] = {'ip-uni':[]}; diff --git a/legato-api/src/main/yang/mef-interfaces.yang b/legato-api/src/main/yang/mef-interfaces.yang index 514ac517..9fcc41c0 100644 --- a/legato-api/src/main/yang/mef-interfaces.yang +++ b/legato-api/src/main/yang/mef-interfaces.yang @@ -125,6 +125,9 @@ module mef-interfaces { leaf vlan { type ethertype:vlan-id; } + leaf segmentation-id { + type uint32; + } } } container physical-layers { diff --git a/legato-api/src/main/yang/mef-services.yang b/legato-api/src/main/yang/mef-services.yang index cba6a560..b77ae3ab 100644 --- a/legato-api/src/main/yang/mef-services.yang +++ b/legato-api/src/main/yang/mef-services.yang @@ -1514,6 +1514,12 @@ module mef-services { "This value must be 2 for point-to-point mode."; reference "[MEF10.3] [R14]. [MEF7.3] Section 12.2.2."; } + leaf subnet { + type inet:ip-prefix; + } + leaf segmentation-id { + type uint32; + } leaf preserved-vlan { type uint32; } diff --git a/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/EvcListener.java b/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/EvcListener.java index 852c184c..568a7d7f 100644 --- a/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/EvcListener.java +++ b/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/EvcListener.java @@ -104,7 +104,7 @@ public class EvcListener extends UnimgrDataTreeChangeListener { InstanceIdentifier evcId = newDataObject.getRootPath().getRootIdentifier(); synchronized (instanceName.intern()) { - NetvirtUtils.createElanInstance(dataBroker, instanceName, isEtree); + NetvirtUtils.createElanInstance(dataBroker, instanceName, isEtree, data.getSegmentationId()); // Create interfaces if (data.getUnis() == null) { diff --git a/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/IpvcListener.java b/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/IpvcListener.java index 4626a53a..d10a8c3d 100644 --- a/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/IpvcListener.java +++ b/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/IpvcListener.java @@ -251,19 +251,18 @@ public class IpvcListener extends UnimgrDataTreeChangeListener { .getIpAddressFromPrefix(NetvirtVpnUtils.ipPrefixToString(ipUni.getIpAddress())); IpAddress ipAddress = new IpAddress(srcIpAddressStr.toCharArray()); - String interfaceName = createElanInterface(vpnName, ipvcId, uniId, elanName, vlan, ipAddress, tx); - + String interfaceName = createElanInterface(vpnName, ipvcId, uniId, elanName, vlan, ipAddress, tx, + ipUni.getSegmentationId()); uniQosManager.mapUniPortBandwidthLimits(uniId, interfaceName, uniInService.getIngressBwProfile()); - createVpnInterface(vpnName, uni, ipUni, interfaceName, elanName, tx); MefServicesUtils.addOperIpvcVpnElan(ipvcId, vpnName, uniInService.getUniId(), uniInService.getIpUniId(), elanName, interfaceName, null, tx); } private String createElanInterface(String vpnName, InstanceIdentifier ipvcId, String uniId, String elanName, - Long vlan, IpAddress ipAddress, WriteTransaction tx) { + Long vlan, IpAddress ipAddress, WriteTransaction tx, Long segmentationId) { Log.info("Adding elan instance: " + elanName); - NetvirtUtils.updateElanInstance(elanName, tx); + NetvirtUtils.updateElanInstance(elanName, tx, segmentationId); NetvirtVpnUtils.registerDirectSubnetForVpn(dataBroker, new Uuid(elanName), ipAddress); Log.info("Added trunk interface for uni {} vlan: {}", uniId, vlan); diff --git a/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/NetvirtUtils.java b/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/NetvirtUtils.java index 71e26d3a..c86c8b52 100644 --- a/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/NetvirtUtils.java +++ b/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/NetvirtUtils.java @@ -49,8 +49,8 @@ public class NetvirtUtils { private static final Logger logger = LoggerFactory.getLogger(NetvirtUtils.class); private static final long DEFAULT_MAC_TIMEOUT = 300; - public static void createElanInstance(DataBroker dataBroker, String instanceName, boolean isEtree) { - ElanInstanceBuilder einstBuilder = createElanInstance(instanceName); + public static void createElanInstance(DataBroker dataBroker, String instanceName, boolean isEtree, Long segmentationId) { + ElanInstanceBuilder einstBuilder = createElanInstance(instanceName, segmentationId); if (isEtree) { EtreeInstance etreeInstance = new EtreeInstanceBuilder().build(); @@ -74,6 +74,13 @@ public class NetvirtUtils { einstBuilder.build()); } + public static void updateElanInstance(String instanceName, WriteTransaction tx, Long segmentationId) { + ElanInstanceBuilder einstBuilder = createElanInstance(instanceName, segmentationId); + + tx.merge(LogicalDatastoreType.CONFIGURATION, getElanInstanceInstanceIdentifier(instanceName), + einstBuilder.build()); + } + public static void updateElanInterface(DataBroker dataBroker, String instanceName, String interfaceName) { ElanInterfaceBuilder einterfaceBuilder = createElanInterface(instanceName, interfaceName); @@ -123,11 +130,15 @@ public class NetvirtUtils { } private static ElanInstanceBuilder createElanInstance(String instanceName) { + return createElanInstance(instanceName, Long.valueOf(Math.abs((short) instanceName.hashCode()))); + } + + private static ElanInstanceBuilder createElanInstance(String instanceName, Long segmentationId) { ElanInstanceBuilder einstBuilder = new ElanInstanceBuilder(); einstBuilder.setElanInstanceName(instanceName); einstBuilder.setKey(new ElanInstanceKey(instanceName)); einstBuilder.setMacTimeout(DEFAULT_MAC_TIMEOUT); - einstBuilder.setSegmentationId(Long.valueOf(Math.abs((short) instanceName.hashCode()))); + einstBuilder.setSegmentationId(segmentationId); einstBuilder.setSegmentType(SegmentTypeVxlan.class); return einstBuilder; } diff --git a/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/NetvirtVpnUtils.java b/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/NetvirtVpnUtils.java index e8b6665d..9aaad0e5 100644 --- a/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/NetvirtVpnUtils.java +++ b/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/NetvirtVpnUtils.java @@ -189,7 +189,7 @@ public class NetvirtVpnUtils { InstanceIdentifier identifier = getVpnInterfaceInstanceIdentifier(interfaceName); InstanceIdentifier path = identifier.augmentation(Adjacencies.class); Optional adjacencies = MdsalUtils.read(dataBroker, LogicalDatastoreType.OPERATIONAL, path); - List adjacenciesList = (adjacencies.isPresent() && adjacencies.get().getAdjacency() != null) + List adjacenciesList = adjacencies.isPresent() && adjacencies.get().getAdjacency() != null ? adjacencies.get().getAdjacency() : Collections.emptyList(); adjacenciesList.forEach(a -> { String ipStr = getIpAddressFromPrefix(a.getIpAddress()); @@ -260,8 +260,7 @@ public class NetvirtVpnUtils { InstanceIdentifier id = getVpnPortipToPortIdentifier(vpnName, fixedIp); VpnPortipToPortBuilder builder = new VpnPortipToPortBuilder() .setKey(new VpnPortipToPortKey(fixedIp, vpnName)).setVpnName(vpnName).setPortFixedip(fixedIp) - .setPortName(portName).setMacAddress(macAddress.getValue()).setSubnetIp(true).setConfig(true) - .setLearnt(false); + .setPortName(portName).setMacAddress(macAddress.getValue()).setSubnetIp(true); tx.put(LogicalDatastoreType.OPERATIONAL, id, builder.build()); logger.debug( "Interface to fixedIp added: {}, vpn {}, interface {}, mac {} added to " + "VpnPortipToPort DS", @@ -309,7 +308,7 @@ public class NetvirtVpnUtils { InstanceIdentifier elanIdentifierId = NetvirtUtils.getElanInstanceInstanceIdentifier(subnetName); @SuppressWarnings("resource") // AutoCloseable - DataWaitListener elanTagWaiter = new DataWaitListener( + DataWaitListener elanTagWaiter = new DataWaitListener<>( dataBroker, elanIdentifierId, 10, LogicalDatastoreType.CONFIGURATION, el -> el.getElanTag()); if ( !elanTagWaiter.waitForData()) { logger.error("Trying to add invalid elan {} to vpn {}", subnetName, vpnName); -- 2.36.6