Add support for choosing segmentation id 15/50015/5
authorDavid Goldberg <gdavid@hpe.com>
Thu, 8 Dec 2016 13:01:33 +0000 (15:01 +0200)
committerDavid Goldberg <gdavid@hpe.com>
Wed, 4 Jan 2017 17:35:57 +0000 (19:35 +0200)
Change-Id: I149410ccec55c02b8cbd84e2075bfd56dd5ff3dd
Signed-off-by: David Goldberg <gdavid@hpe.com>
dlux/cpeui/cpeui-module/src/main/resources/cpeui/dialogs/AddEvc.tpl.html
dlux/cpeui/cpeui-module/src/main/resources/cpeui/dialogs/AddIpUni.tpl.html
dlux/cpeui/cpeui-module/src/main/resources/cpeui/services/cpeui.services.js
dlux/cpeui/cpeui-module/src/main/resources/cpeui/tenant.controller.js
legato-api/src/main/yang/mef-interfaces.yang
legato-api/src/main/yang/mef-services.yang
netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/EvcListener.java
netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/IpvcListener.java
netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/NetvirtUtils.java
netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/NetvirtVpnUtils.java

index 4ee797695595a8e9f0d12638ea9586fe256a21d5..ff56a3909fbe1c0fc364882c98e1f8a835c84b0e 100644 (file)
         <input type="number" step="1" name="max_uni" ng-model="obj.max_uni">
       </md-input-container>
 
-
      <a ng-init="advancedCollapsed=true" ng-click="advancedCollapsed = !advancedCollapsed" class="btn btn-navbar btn-info">{{advancedCollapsed ? 'Show' : 'Hide'}} Advanced Options</a>
-       <div layout-gt-sm="row" ng-if-start="!advancedCollapsed">
+     <md-input-container class="md-block" ng-if-start="!advancedCollapsed">
+        <label>Segmentation ID</label>
+        <input type="number" step="1" name="segmentation_id" ng-model="obj.segmentation_id">
+      </md-input-container>
+      <md-input-container class="md-block">
+        <label>Subnet</label>
+        <input type="text" name="subnet" ng-model="obj.subnet" ng-pattern="/\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\/(?:[1-2]?[0-9]|3[0-2])\b/">
+        <div ng-messages="projectForm.subnet.$error">
+               <div ng-message="pattern">IP/Mask is required! (ex. 127.0.0.1/32)</div>
+       </div>
+      </md-input-container>
+       <div layout-gt-sm="row">
                <md-input-container class="md-block" flex-gt-sm>
                        <md-switch name="is_preserve_vlan" ng-model="obj.is_preserve_vlan">{{obj.is_preserve_vlan ? "" : "Do Not"}} Preserve VLAN</md-switch>
                </md-input-container>
index 16f2ae986428fb9eee4bc4605ee522c98abf6a5d..a2ef9838afde75ba3460132a4968c8acc3eec115 100644 (file)
                <div ng-message="required">Vlan is required when there are other ip-unis with vlans</div>
        </div>
       </md-input-container>
+      <md-input-container class="md-block">
+        <label>Segmentation ID</label>
+        <input type="number" name="segmentationid" ng-model="obj['segmentation-id']">
+        <div ng-messages="projectForm.segmentationid.$error">
+               <div ng-message="number">Number is required!</div>
+       </div>
+      </md-input-container>
   </md-content>
 </div>
     </md-dialog-content>
index 5fd5744851f5e61096612064da7c2c6fb442952a..78c25809bae47d1bb8f3d6079923cb72d57dd576 100644 (file)
@@ -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/",
index 6ad9df21759d03807ee67170f2929f36b3740afe..ab92668c8e98ac370023da620c34e4912eca9f75 100644 (file)
@@ -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':[]};
index 514ac51747c2658e3148b6e740802c3561e910e7..9fcc41c03c173556b31e01927ccac020d8b8b254 100644 (file)
@@ -125,6 +125,9 @@ module mef-interfaces {
             leaf vlan {
               type ethertype:vlan-id;
             }
+            leaf segmentation-id {
+              type uint32;
+            }
           }
         }
         container physical-layers {
index cba6a56041ef8dfd5d2ae29282d9c8bccfab9214..b77ae3ab08e2c321d609fb90b7ad62aa5ed8c129 100644 (file)
@@ -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;
             }
index 852c184cee801c53a4de55cd391a0d1c4bce008c..568a7d7fad9985b0505efecb007d569035ea46b7 100644 (file)
@@ -104,7 +104,7 @@ public class EvcListener extends UnimgrDataTreeChangeListener<Evc> {
             InstanceIdentifier<Evc> 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) {
index 4626a53a046ced3ad9069a2c97c0e7a9938c7eff..d10a8c3ddbbb309016ad1331cf562221e7656ad4 100644 (file)
@@ -251,19 +251,18 @@ public class IpvcListener extends UnimgrDataTreeChangeListener<Ipvc> {
                 .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<Ipvc> 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);
index 71e26d3a92879c248c12103bb43f34b913cf5da7..c86c8b52d1b6b9121df11b928646c5c30d9e46c9 100644 (file)
@@ -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;
     }
index e8b6665daec50f75cb00601fb0bf79373e224462..9aaad0e5e3601013a50a6fd0176848eee4989bc9 100644 (file)
@@ -189,7 +189,7 @@ public class NetvirtVpnUtils {
         InstanceIdentifier<VpnInterface> identifier = getVpnInterfaceInstanceIdentifier(interfaceName);
         InstanceIdentifier<Adjacencies> path = identifier.augmentation(Adjacencies.class);
         Optional<Adjacencies> adjacencies = MdsalUtils.read(dataBroker, LogicalDatastoreType.OPERATIONAL, path);
-        List<Adjacency> adjacenciesList = (adjacencies.isPresent() && adjacencies.get().getAdjacency() != null)
+        List<Adjacency> 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<VpnPortipToPort> 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<ElanInstance> elanIdentifierId = NetvirtUtils.getElanInstanceInstanceIdentifier(subnetName);
 
         @SuppressWarnings("resource") // AutoCloseable
-        DataWaitListener<ElanInstance> elanTagWaiter = new DataWaitListener<ElanInstance>(
+        DataWaitListener<ElanInstance> 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);