});
}
- $scope.AddTenant = function(serviceType) {
- CpeuiSvc.addTenant($scope.tenantId, serviceType, function() {
+ $scope.AddTenant = function() {
+ CpeuiSvc.addTenant($scope.tenantId, function() {
$scope.updateView();
});
};
$scope.tenantDialog = new CpeuiDialogs.Dialog('AddTenant', {},
function(obj) {
- CpeuiSvc.addTenant(obj.id, obj.service_type, function() {
+ CpeuiSvc.addTenant(obj.id, function() {
$scope.updateView();
});
});
});
}
+ $scope.assignNetworkToTenant = function(svc) {
+ CpeuiDialogs.customConfirm("Are You Sure?",
+ "Are you sure you want to assign service "+ svc['svc-id'] +" to tenant " + $scope.selectedTenant[svc['svc-id']] +"?",
+ function() {
+ CpeuiSvc.addTenantToService(svc['svc-id'], $scope.selectedTenant[svc['svc-id']], function(){
+ svc['tenant-id'] = $scope.selectedTenant[svc['svc-id']];
+ },function(){
+ $scope.selectedTenant[svc['svc-id']] = undefined;
+ });
+ }, function() {
+ $scope.selectedTenant[svc['svc-id']] = undefined;
+ });
+ };
+
function updateCpeTenants(unis) {
// update tenant cpe tenant column
var hasMultipleTenants = [];
// UNIs
$scope.updateUniView = function() {
CpeuiSvc.getUnis(function(unis) {
- $scope.unis = unis;
- $scope.unis.forEach(function(u) {
- u.prettyID = u['uni-id'].split(":")[u['uni-id']
- .split(":").length - 1];
- });
+ $scope.unis = unis;
updateCpeTenants(unis);
});
};
});
};
+ $scope.addCEName = function(ce){
+ ce._naming = true;
+ var input = $('#INPUT_' +ce['dev-id']);
+ // hack to focus input after show is complete
+ setTimeout(function(){input.focus();},20);
+ input.parent().on('blur',function(){
+ setTimeout(function(){
+ ce._naming = false;
+ delete ce._new_name;
+ },20);
+ });
+
+ input.bind("keyup", function (eventSubmit) {
+ if(eventSubmit.which === 13) {
+ $('#OK_' +ce['dev-id']).click();
+ } else if(eventSubmit.which === 27) {
+ input.parent().blur();
+ }
+ });
+ }
+
+ $scope.renameCE = function(ce){
+ CpeuiSvc.addCeName(ce, ce._new_name, function(){
+ ce['device-name'] = ce._new_name;
+ });
+ ce._naming = false;
+ }
+
+ $scope.services = [];
+ $scope.networkNames = {};
+
+ $scope.updateNetworksView = function() {
+ CpeuiSvc.getAllServices(function(services) {
+ $scope.services = services;
+ });
+ CpeuiSvc.getNetworkNames(function(networks){
+ networks.forEach(function(net){
+ $scope.networkNames[net.uuid] = net.name;
+ });
+ });
+ };
+
// General
$scope.updateView = function() {
+ if ($scope.isTabSet('admin',4)){
+ $scope.updateNetworksView();
+ }
$scope.updateTenantView();
$scope.updateCesView();
$scope.updateUniView();
<i class="icon-tasks"></i> CPEs (Devices)</a></li>
<li ng-class="{ active: isTabSet('admin',3)}"
ng-click="setTab('admin',3);updateView()"><a id="dashboard-tab" href="#/cpeui/admin/unis">
- <i class="icon-signal"></i> UNIs</a></li>
+ <i class="icon-exchange"></i> UNIs</a>
+ </li>
+ <li ng-class="{ active: isTabSet('admin',4)}"
+ ng-click="setTab('admin',4);updateNetworksView()"><a id="dashboard-tab" href="#/cpeui/admin/networks">
+ <i class="icon-signal"></i> Networks</a>
+ </li>
<li id="refresh_btn" class="active refresh-btn"
ng-click="updateView()"><button class="btn add-row"> <i class="icon-refresh"></i> Refresh</button>
</li>
<tbody id="ces_table">
<tr ng-repeat="item in ces | orderBy: '[\'dev-id\']'">
<td class="minimal-width">{{ item['dev-id'] }}</td>
- <td>{{ item['device-name'] }}</td>
+ <td>{{ item['device-name'] }}
+ <button ng-if="!(item['device-name'] || item._naming)" class="btn right" ng-click="addCEName(item)"><i class="icon-edit"></i> Add Name</button>
+ <i class="clear"></i>
+ <md-input-container class="md-block no-error-spacer left" ng-show="item._naming" style="width:79%">
+ <label>Device Name</label>
+ <input id="INPUT_{{item['dev-id']}}" type="text" ng-model="item._new_name"/>
+ </md-input-container>
+ <button id="OK_{{item['dev-id']}}" ng-show="item._naming" class="btn right" style="max-width:20%" ng-click="renameCE(item)"><i class="icon-ok"></i> OK</button>
+ </td>
<td>
- <!--
- <button class="btn add-row btn-block" ng-click="assignCpeToTenant(item['dev-id'], )">SHOW OF RULES ...</button>
- -->
<md-input-container class="md-block">
<label>Multiple</label>
<md-select ng-change="assignCpeToTenant(item['dev-id'])" ng-model="selectedTenant[item['dev-id']]" name="selectedTenant">
</tbody>
</table>
</div>
+ <div ng-show="isTabSet('admin',4)">
+ <div class="table-header">Networks</div>
+ <table class="footable table table-striped">
+ <thead>
+ <tr>
+ <th>Network ID</th>
+ <th>Network name</th>
+ <th>Tenant</th>
+ </tr>
+ </thead>
+ <tbody id="ces_table">
+ <tr ng-repeat="svc in services ">
+ <td class="minimal-width">{{ svc['svc-id'] }}</td>
+ <td class="minimal-width">{{ networkNames[svc['svc-id']] }}</td>
+ <td ng-if="svc['tenant-id']" class="minimal-width">{{ svc['tenant-id'] }}</td>
+ <td ng-if="!(svc['tenant-id'])" class="minimal-width">
+ <md-input-container class="md-block">
+ <label>Assign Tenant</label>
+ <md-select ng-change="assignNetworkToTenant(svc)" ng-model="selectedTenant[svc['svc-id']]" name="selectedTenant">
+ <md-option ng-repeat="tenant in tenantArray" value="{{ tenant.name }}">{{ tenant.name }}</md-option>
+ </md-select>
+ </md-input-container>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
</div>
var mainTabIndexs = {
"tenants" : 1,
"cpes" : 2,
- "unis" : 3
+ "unis" : 3,
+ "networks" : 4
}
$scope.tab = {
<div ng-message="pattern">name must be only numbers and English characters</div>
<div ng-message="md-maxlength">The name has to be less than 30 characters long.</div>
</div>
- </md-input-container>
- <md-input-container class="md-block">
- <label>Service Type</label>
- <md-select ng-model="obj.service_type" name="servicetype">
- <md-option value="L2" default>Layer 2 VPN</md-option>
- <md-option value="L3">Layer 3 VPN</md-option>
- </md-select>
- </md-input-container>
-
-
+
+
+
+
+
+ </md-input-container>
</md-content>
</div>
</md-dialog-content>
});
};
- svc.addTenant = function(name, serviceType, callback){
+ svc.addTenant = function(name, callback){
$http({
method:'POST',
url:baseUrl + "tenants-instances/",
data: {"tenant-list":[{
- "name": name,
- "service_type": serviceType
+ "name": name
}]}
}).then(function successCallback(response) {
if (callback != undefined) {
}
});
};
+
+ svc.addCeName = function(ce, new_name, callback) {
+ $http({
+ method:'POST',
+ url:"/restconf/config/mef-topology:mef-topology/devices/device/" + ce['dev-id'],
+ data: {"device-name": new_name}
+ }).then(function successCallback(response) {
+ if (callback != undefined) {
+ callback();
+ }
+ }, function errorCallback(response) {
+ console.log(response);
+ $http({
+ method:'GET',
+ url:"/restconf/config/mef-topology:mef-topology/devices/device/" + ce['dev-id']
+ }).then(function successCallback(response) {
+ ce["device-name"] = response.data["device"][0]["device-name"];
+ });
+ });
+ };
svc.getCes = function(callback) {
var ces;
}
}
}
-
+ unis.forEach(function(u) {
+ u.prettyID = u['uni-id'].split(":")[u['uni-id'].split(":").length - 1];
+ });
if (callback != undefined) {
callback(unis);
}
});
};
- svc.getEvc = function(tenantid, callback) {
+ svc.getServices = function(tenantid, callback) {
var evcs;
$http({
method:'GET',
if (evcs != undefined) {
evcs = evcs.filter(function(evc){return evc["tenant-id"] == tenantid;});
for (i=0; i < evcs.length; i++) {
- var unis = evcs[i].evc.unis.uni;
- if (unis != undefined) {
+ if ((evcs[i].evc != undefined) && (evcs[i].evc.unis.uni != undefined)) {
+ var unis = evcs[i].evc.unis.uni;
for (j=0; j < unis.length; j++) {
if ((unis[j]['evc-uni-ce-vlans'] != undefined) && (unis[j]['evc-uni-ce-vlans']['evc-uni-ce-vlan'] != undefined)){
unis[j].vlans = unis[j]['evc-uni-ce-vlans']['evc-uni-ce-vlan'].map(function(u){return u.vid;}).sort();
return evcs;
};
+
+ svc.getAllServices = function(callback) {
+ $http({
+ method:'GET',
+ url:"/restconf/config/mef-services:mef-services/"
+ }).then(function successCallback(response) {
+ if (callback != undefined) {
+ callback(response.data["mef-services"]["mef-service"]);
+ }
+ }, function errorCallback(response) {
+ console.log(response);
+ });
+ };
+
+ svc.addTenantToService = function(svcId, tenantName, callbackSuccess, callbackFailure){
+ $http({
+ method:'POST',
+ url:"/restconf/config/mef-services:mef-services/mef-service/" + svcId,
+ data:{"tenant-id":tenantName}
+ }).then(function() {
+ if (callbackSuccess != undefined) {
+ callbackSuccess();
+ }
+ }, function() {
+ if (callbackFailure != undefined) {
+ callbackFailure();
+ } else {
+ console.log(response);
+ }
+ });
+ };
+
svc.removeEvc = function(svcid, callback) {
$http({
method:'DELETE',
});
};
+ svc.getNetworkNames = function(callback){
+ $http({
+ method:'GET',
+ url:"/restconf/config/neutron:neutron/networks/"
+ }).then(function successCallback(response) {
+ if (callback != undefined) {
+ callback(response.data.networks.network);
+ }
+ });
+ };
+
return svc;
});
min-width: 30% !important;
}
+.no-error-spacer .md-errors-spacer {
+ display: none;
+}
+
+
MD-TOOLBAR {
cursor: move; /* fallback if grab cursor is unsupported */
cursor: grab;
.showmm label, .showmm input, .showmm div{
height:inherit;
}
-.hidemm label, .hidemm input, .hidemm div{{
+.hidemm label, .hidemm input, .hidemm div{
height:0;
}
.animate-if.ng-leave,
.animate-if.ng-enter.ng-enter-active {
height:0;
-}
+}
\ No newline at end of file
$scope.unisTables = {};
$scope.unis = [];
$scope.ces = [];
+ $scope.ipvcs = []
$scope.cesDisplayNames = {};
$scope.unisMap = {};
+ $scope.networkNames = {};
function init(){
$scope.updateUnis(function(unis){
CpeuiSvc.getCes(function(ces) {
$scope.ces = ces.filter(function(item) {
- return (unis.filterByField('device', item["dev-id"]).length);
+
+ var filteredUnis = unis.filterByField('device', item["dev-id"]);
+ filteredUnis = filteredUnis.filterByField('prettyID', 'br-int', true);
+ filteredUnis = filteredUnis.filter(function(i){return !(i.prettyID && i.prettyID.startsWith('tun'));});
+
+ return (filteredUnis.length);
});
ces.forEach(function(ce){
$scope.cesDisplayNames[ce['dev-id']] = ce['device-name'] ? ce['device-name'] : ce['dev-id'];
$scope.updateEvcView();
});
});
+
+ CpeuiSvc.getNetworkNames(function(networks){
+ networks.forEach(function(net){
+ $scope.networkNames[net.uuid] = net.name;
+ });
+ });
}
$scope.updateUnis = function(callback) {
};
$scope.updateEvcView = function() {
- CpeuiSvc.getEvc($scope.curTenant, function(evcs) {
- $scope.evcs = evcs;
+ CpeuiSvc.getServices($scope.curTenant, function(services) {
+
+ $scope.evcs = services.filter(function(svc){ return svc.evc != undefined;});
+ $scope.ipvcs = services.filter(function(svc){ return svc.ipvc != undefined;});
$scope.updateUnis();
+ $scope.ipvcs.forEach(function(e){
+ e.isTree = (e.ipvc['ipvc-type'] == 'rooted-multipoint');
+ });
+
$scope.evcs.forEach(function(e){
e.isTree = (e.evc['evc-type'] == 'rooted-multipoint');
e.device2unis = {};
if (e.device2unis[$scope.unisMap[u['uni-id']].device] == undefined){
e.device2unis[$scope.unisMap[u['uni-id']].device] = [];
}
+ u.prettyID = u['uni-id'].split(":")[u['uni-id'].split(":").length - 1];
e.device2unis[$scope.unisMap[u['uni-id']].device].push(u);
});
}
};
$scope.title = function(str) {
+ if (!str) {
+ return str;
+ }
return str.split('-').map(function(s) {
return s[0].toUpperCase() + s.slice(1);
}).join(' ');
};
$scope.filterUsedUnis = function(evc){
- return function(u) {
- if (evc.evc.unis.uni == undefined) {
- evc.evc.unis.uni = [];
+ return function(u) {
+ if (u.prettyID == 'br-int') {
+ return false;
+ }
+ if (u.prettyID && u.prettyID.startsWith('tun')) {
+ return false;
+ }
+ if (evc.evc.unis.uni == undefined){
+ evc.evc.unis.uni = [];
}
return evc.evc.unis.uni.filterByField('uni-id',u['uni-id']).length == 0;
};
$scope.sortUni = function(uni) {
return uni['uni-id'];
};
+ $scope.sortIpvc = function(ipvc) {
+ return ipvc['ipvc-id'];
+ };
init();
});
<div class="menu">
<ul id="EVCs-tab" class="nav nav-pills" role="tablist">
<li ng-class="{ active: isTabSet('tenantData',1)}" ng-click="setTab('tenantData',1)" >
- <a id="evcs-configure-tab" > <i class="icon-tasks"></i> Services</a>
+ <a id="evcs-configure-tab" > <i class="icon-tasks"></i> L2 Services</a>
</li>
+ <!-- UnComment to add L3 Services
<li ng-class="{ active: isTabSet('tenantData',2)}" ng-click="setTab('tenantData',2)" >
- <a id="dashboard-tab" > <i class="icon-signal"></i> Dashboard</a>
- </li>
+ <a id="evcs-configure-tab" > <i class="icon-tasks"></i> L3 Services</a>
+ </li>
+ END of UnComment to add L3 Services-->
<li id="refresh_btn" class="active refresh-btn" ng-click="updateEvcView()">
<button class="btn add-row"> <i class="icon-refresh"></i> Refresh</button>
</li>
<tr>
<th>EVC ID</th>
<th>UNIs</th>
+ <th>Network Name</th>
<th>SVC Type</th>
<th>EVC Type</th>
<th colspan="2" >Tenant</th>
<button ng-show="!unisTables[item['svc-id']]" class="btn add-row btn-block" ng-click="unisTables[item['svc-id']] = true;">Show Unis</button>
<button ng-show="unisTables[item['svc-id']]" class="btn add-row btn-block" ng-click="unisTables[item['svc-id']] = false;">Hide Unis</button>
</td>
+ <td >{{ networkNames[item['svc-id']] }}</td>
<td >{{ item['svc-type'] }}</td>
<td >{{ title(item.evc['evc-type']) }}</td>
<td>{{ item['tenant-id'] }}</td>
<td class="delete-tr"><button class="btn btn-md btn-danger" ng-click="deleteEvc(item['svc-id'])"> <i class="icon-trash"></i> </button></td>
</tr>
<tr ng-repeat-end ng-show="unisTables[item['svc-id']]">
- <td colspan="5">
+ <td colspan="6">
<table class="footable table table-striped inner-table">
<thead>
<tr>
<tbody id="l2_table">
<tr ng-repeat-start="(ce, unis) in item.device2unis | orderBy : ce ">
<td rowspan="{{unis.length}}">{{ cesDisplayNames[ce] }}</td>
- <td ng-repeat-start="uni in unis | orderBy: sortUni | limitTo :1">{{ uni['uni-id'] }}</td>
+ <td ng-repeat-start="uni in unis | orderBy: sortUni | limitTo :1">{{ uni.prettyID }}</td>
<td ng-if="item.isTree">{{ uni['role'] }}</td>
<td class="clickable" ng-click="!item.evc['preserve-ce-vlan-id'] ? editVlanDialog.show($event, {svcid:item['svc-id'], uniid:uni['uni-id'], vlans:uni.vlans}) : 0">
{{ uni.vlans.join(', ') }} {{item.evc['preserve-ce-vlan-id'] ? '(Preserved)' : ''}}
</td>
- <td ng-repeat-end class="delete-tr"><button class="btn btn-md btn-danger" ng-click="deleteEvcUni(item['svc-id'], uni['uni-id'])"> <i class="icon-trash"></i> </button></td>
+ <td ng-repeat-end class="delete-tr" style="white-space: nowrap;">
+ <button class="btn btn-md btn-danger" ng-click="deleteEvcUni(item['svc-id'], uni['uni-id'])"> <i class="icon-trash"></i> </button>
+ </td>
</tr>
<tr ng-repeat-end ng-repeat="uni in unis | orderBy: sortUni | limitTo :(unis.length-1) :1">
- <td>{{ uni['uni-id'] }}</td>
+ <td>{{ uni.prettyID }}</td>
<td ng-if="item.isTree">{{ uni['role'] }}</td>
<td class="clickable" ng-click="!item.evc['preserve-ce-vlan-id'] ? editVlanDialog.show($event, {svcid:item['svc-id'], uniid:uni['uni-id'], vlans:uni.vlans}) : 0">
{{ uni.vlans.join(', ') }} {{item.evc['preserve-ce-vlan-id'] ? '(Preserved)' : ''}}
</td>
- <td class="delete-tr"><button class="btn btn-md btn-danger" ng-click="deleteEvcUni(item['svc-id'], uni['uni-id'])"> <i class="icon-trash"></i> </button></td>
+ <td class="delete-tr" style="white-space: nowrap;">
+ <button class="btn btn-md btn-danger" ng-click="deleteEvcUni(item['svc-id'], uni['uni-id'])"> <i class="icon-trash"></i> </button>
+ </td>
</tr>
</tbody>
</table>
</table>
<div><a class="btn btn-info add-row" ng-click="evcDialog.show($event,{'svcTypes':svcTypes})" >Create EVC</a></div>
</div>
+ <!-- UnComment to add L3 Services
<div ng-show="isTabSet('tenantData',2)">
- <h3>To Be Implemented...</h3>
+ <div class="table-header">IPVCs Table</div>
+ <table class="footable table table-striped">
+ <thead>
+ <tr>
+ <th>IPVC ID</th>
+ <th>UNIs</th>
+ <th>IPVC Type</th>
+ <th colspan="2" >Tenant</th>
+ </tr>
+ </thead>
+ <tbody id="l2_table">
+ <tr ng-repeat-start="ipvc in ipvcs | orderBy : sortIpvc">
+ <td rowspan="{{ 1 + unisTables[ipvc.ipvc['ipvc-id']] }}">{{ ipvc.ipvc['ipvc-id'] }}</td>
+ <td >
+ <button ng-show="!unisTables[ipvc.ipvc['ipvc-id']]" class="btn add-row btn-block" ng-click="unisTables[ipvc.ipvc['ipvc-id']] = true;">Show Unis</button>
+ <button ng-show="unisTables[ipvc.ipvc['ipvc-id']]" class="btn add-row btn-block" ng-click="unisTables[ipvc.ipvc['ipvc-id']] = false;">Hide Unis</button>
+ </td>
+ <td >{{ ipvc.ipvc['ipvc-type'] }}</td>
+ <td>{{ ipvc['tenant-id'] }}</td>
+ <td class="delete-tr"><button class="btn btn-md btn-danger" ng-click="deleteEvc(ipvc['svc-id'])"> <i class="icon-trash"></i> </button></td>
+ </tr>
+ <tr ng-repeat-end ng-show="unisTables[ipvc.ipvc['ipvc-id']]">
+ <td colspan="5">
+ <table class="footable table table-striped inner-table">
+ <thead>
+ <tr>
+ <th>Device</th>
+ <th>UNI</th>
+ <th ng-if="ipvc.isTree" >Role</th>
+ <th>Vlans <span style="font-size:small;color:inherit;"> (click to edit)</span></th>
+ <th class="delete-tr"><button class="btn btn-md btn-info" ng-click="linkEvcUniDialog.show($event, {'ipvc':ipvc,'unis':unis,'ces':ces})"> <i class="icon-plus"></i> </button></th>
+ </tr>
+ </thead>
+ <tbody id="l2_table">
+ <tr ng-repeat-start="(ce, unis) in ipvc.device2unis | orderBy : ce ">
+ <td rowspan="{{unis.length}}">{{ cesDisplayNames[ce] }}</td>
+ <td ng-repeat-start="uni in unis | orderBy: sortUni | limitTo :1">{{ uni['uni-id'] }}</td>
+ <td ng-if="ipvc.isTree">{{ uni['role'] }}</td>
+ <td class="clickable" ng-click="!ipvc.evc['preserve-ce-vlan-id'] ? editVlanDialog.show($event, {svcid:ipvc['svc-id'], uniid:uni['uni-id'], vlans:uni.vlans}) : 0">
+ {{ uni.vlans.join(', ') }} {{ipvc.evc['preserve-ce-vlan-id'] ? '(Preserved)' : ''}}
+ </td>
+ <td ng-repeat-end class="delete-tr"><button class="btn btn-md btn-danger" ng-click="deleteEvcUni(ipvc['svc-id'], uni['uni-id'])"> <i class="icon-trash"></i> </button></td>
+ </tr>
+ <tr ng-repeat-end ng-repeat="uni in unis | orderBy: sortUni | limitTo :(unis.length-1) :1">
+ <td>{{ uni['uni-id'] }}</td>
+ <td ng-if="item.isTree">{{ uni['role'] }}</td>
+ <td class="clickable" ng-click="!item.evc['preserve-ce-vlan-id'] ? editVlanDialog.show($event, {svcid:ipvc['svc-id'], uniid:uni['uni-id'], vlans:uni.vlans}) : 0">
+ {{ uni.vlans.join(', ') }} {{ipvc.evc['preserve-ce-vlan-id'] ? '(Preserved)' : ''}}
+ </td>
+ <td class="delete-tr"><button class="btn btn-md btn-danger" ng-click="deleteEvcUni(ipvc['svc-id'], uni['uni-id'])"> <i class="icon-trash"></i> </button></td>
+ </tr>
+ </tbody>
+ </table>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ <div><a class="btn btn-info add-row" ng-click="evcDialog.show($event,{'svcTypes':svcTypes})" >Create IPVC</a></div>
</div>
+ END OF UnComment to add L3 Services -->
</div>
<div class="clear">
<button class="btn btn-default pull-right" onclick="window.location='#/cpeui/admin/tenants'" > Back </button>
});
}
- $scope.AddTenant = function(serviceType) {
- CpeuiSvc.addTenant($scope.tenantId, serviceType, function() {
+ $scope.AddTenant = function() {
+ CpeuiSvc.addTenant($scope.tenantId, function() {
$scope.updateTenantView();
});
};
$scope.tenantDialog = new CpeuiDialogs.Dialog('AddTenant', {},
function(obj) {
- CpeuiSvc.addTenant(obj.id, obj.service_type, function() {
+ CpeuiSvc.addTenant(obj.id, function() {
$scope.updateTenantView();
});
});
<thead>
<tr>
<th>Tenant name</th>
- <th>Service Type</th>
<th colspan="2">Open ...</th>
</tr>
</thead>
<tbody id="tenants_table">
<tr ng-repeat="item in tenantArray | orderBy : 'name'">
<td>{{ item.name }}</td>
- <td>{{ item.service_type }}</td>
<td><button class="btn add-row btn-block" ng-click="OpenTenantPortal(item)">Open ...</button></td>
<td class="delete-tr"><button class="btn btn-md btn-danger" ng-click="DeleteTenant(item.name)"> <i class="icon-trash"></i> </button></td>
</tr>
<artifactId>maven-bundle-plugin</artifactId>
<configuration>
<instructions>
- <Export-Package>
- org.opendaylight.unimgr.mef.nrp.common,
- org.opendaylight.unimgr.mef.nrp.api,
- org.opendaylight.unimgr.api
- </Export-Package>
+<!-- <Export-Package> -->
+<!-- org.opendaylight.unimgr.mef.nrp.common, -->
+<!-- org.opendaylight.unimgr.mef.nrp.api, -->
+<!-- org.opendaylight.unimgr.api -->
+<!-- </Export-Package> -->
</instructions>
</configuration>
</plugin>
type string;\r
description "Tenant Name";\r
}\r
- leaf service_type {\r
- type enumeration {\r
- enum L2 {\r
- description "Layer 2 VPN";\r
- }\r
- enum L3 {\r
- description "Layer 3 VPN";\r
- }\r
- }\r
- }\r
}\r
\r
container tenants-instances {\r