<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>
<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>
});
};
- 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
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/",
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 = {
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/",
};
$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':[]};
leaf vlan {
type ethertype:vlan-id;
}
+ leaf segmentation-id {
+ type uint32;
+ }
}
}
container physical-layers {
"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;
}
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) {
.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);
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();
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);
}
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;
}
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());
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",
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);