Ethernet Ring Protection provides for protection and switching in a ring topology for Ethernet traffic (services)
Here described is an example of creating an ERP
In the example shown in below figure an ERP is created with a simple configuration. Here we have a two node ring which can be created using two links.
The link's user labels are provided by the user in the json inout. The ERP is created across links : cloud_link_2 and cloud_link_3. The RPL Owner NE is CLOUD_3 and owner node being 11QPE24-1-4-X2
The input is provided in json format by means of a json file in format of the input object
For the example shown above we provide input as :
{
"ringName":"ALA-ERP-RESTCLIENT5",
"ringDescription":"FROM REST CLIENT",
"erpTemplateContext":"My Templates+ERP Templates+ERPTemplate10",
"linkNames":[
"cloud_link_2",
"cloud_link_3"
],
"cvlanId":"911",
"svlanId":"901",
"linkType":"PORT",
"reserveResource":"1",
"jobName":"REST-CLIENT-JOB2",
"deployNow":"Yes",
"ownerNEName":"CLOUD_3",
"ownerTPName":"11QPE24-1-4-X2"
}
From the given json input links for ERP creation are derived. We derive all the available links and select only those links provided in the input.
REST call : /esmBrowser/topoService/GetAllNodes/
Input parameters : a string indicating type of end points ; possible values are : LINK / LAG
public OtnInterfaceLinkUIDataList getAllTopologicalLinks (OMSRestTemplate restTemplate) {
String getAllTopologicalLinksUrl = restTemplate.getUrlPrefix() + "/esmBrowser/topoService/GetAllNodes/Link";
OtnInterfaceLinkUIDataList otnInterfaceLinkUIDataList = restTemplate.getForObject(getAllTopologicalLinksUrl, OtnInterfaceLinkUIDataList.class);
System.out.println("All LInks " + otnInterfaceLinkUIDataList);
return otnInterfaceLinkUIDataList;
}
public List<OtnInterfaceLinkUIData> getTopologicalLinkDetails(OMSRestTemplate restTemplate,CreateERPInfo createErpInfo) {
OtnInterfaceLinkUIDataList otnInterfaceLinkUIDataList = getAllTopologicalLinks(restTemplate);
List<OtnInterfaceLinkUIData> linkList = otnInterfaceLinkUIDataList.getOtnLinksData();
List<OtnInterfaceLinkUIData> filteredList = new ArrayList <OtnInterfaceLinkUIData> ();
Iterator<OtnInterfaceLinkUIData> it = linkList.iterator();
ArrayList <String> ilinkList = new ArrayList <String> (createErpInfo.getLinkNames());
while (it.hasNext() && ilinkList.size() > 0) {
OtnInterfaceLinkUIData d = it.next();
if (ilinkList.contains(d.getUSERLABEL())) {
ilinkList.remove(d.getUSERLABEL());
filteredList.add(d);
}
}
System.out.println("filterred List = " + filteredList);
return filteredList;
}
The ERP template mentioned in json input is used to derive other parameters for deploying ERP like protection type, revert timer etc.
REST call : /esmBrowser/topoTemplate/getERPTemplate/
Input Parameters : Entire path to the ERP template as stored in system
public ERPTemplateHolder getERPTemplate (OMSRestTemplate restTemplate, String context) {
String getERPTemplateURL = restTemplate.getUrlPrefix() + "/esmBrowser/topoTemplate/getERPTemplate/" + context;
return restTemplate.getForObject(getERPTemplateURL, ERPTemplateHolder.class);
}
Generating generic Info :
private nERPInstMapper create_nERPInstMapper(OMSRestTemplate restTemplate, CreateERPInfo erpCreateInfo, List<OtnInterfaceLinkUIData>
linksDetail, ERPTemplateHolder erpTemplate) {
nERPInstMapper req = new nERPInstMapper();
/** auther and description from erpTemplate if any*/
req.setAuthor(erpTemplate.getAuthor());
req.setRingDescription(erpTemplate.getDescr());
/** set ringName, ringDescription (if provided), cvlanid, svlanid, linkType from CreateERPInfo object*/
req.setRingName(erpCreateInfo.getRingName());
if (!erpCreateInfo.getRingDescription().equals(""))req.setRingDescription(erpCreateInfo.getRingDescription());
req.setCvlanId(erpCreateInfo.getCvlanId());
req.setSvlanId(erpCreateInfo.getSvlanId());
req.setLinkType(erpCreateInfo.getLinkType());
if (erpCreateInfo.getReserveResource().equals("0")) req.setReserveResource(false);
req.setPropogateTopoChange("false");
req.setRingType(erpTemplate.getRingType());
List<nNEDataMapper> neDataList = create_neDataList_and_update_owner (restTemplate, erpCreateInfo, linksDetail, req);
req.setNeDataList(neDataList);
/** management state*/
req.setManagementState("New");
req.setTargetMgmtState("Deploying");
/** populate protection data from erp template*/
nProtectionParamsMapper protectiondata = new nProtectionParamsMapper();
req.setProtectiondata(protectiondata);
protectiondata.setGuardtime(erpTemplate.getGuardtime());
protectiondata.setProtectionSwitchState(erpTemplate.getProtectionSwitchState());
protectiondata.setRevertive(erpTemplate.isRevertive());
protectiondata.setRevertTime(erpTemplate.getRevertTime());
return req;
Generating RPL information like RPL Owner and Neighbour details
Owner TPID are derived from the link information obtained before. User provided owner NE Name and TPID are used to find the owner details like owner NE name and owner TP Name. Corresponding other end of the link (sink) is set a neighbor NE Name and neighbor Node.
private List<nNEDataMapper> create_neDataList_and_update_owner(OMSRestTemplate restTemplate, CreateERPInfo erpCreateInfo, List<OtnInterfaceLinkUIData>
linksDetail, nERPInstMapper req) {
List<nNEDataMapper> neDataList = new ArrayList<nNEDataMapper>();
Iterator<OtnInterfaceLinkUIData> linksIter = linksDetail.iterator();
boolean foundOwnerLink = false;
while (linksIter.hasNext()) {
OtnInterfaceLinkUIData detail = linksIter.next ();
nNEDataMapper neDataMapper = new nNEDataMapper ();
neDataMapper.setRingNode(detail.getSRCNENAME());
neDataMapper.setFarEndNode(detail.getSINKNENAME());
neDataMapper.setRingPort(detail.getSRCTPNATIVENAME());
neDataMapper.setFarEndPort(detail.getSINKTPNATIVENAME());
neDataMapper.setRingLinkHandle(detail.getLINKID());
neDataMapper.setRingLink(detail.getUSERLABEL());
neDataList.add(neDataMapper);
/** upate owner and also update ownerTPID and nbr TPID in req*/
if ( !foundOwnerLink && detail.getSRCNENAME().equals(erpCreateInfo.getOwnerNEName())
&& detail.getSRCTPNATIVENAME().equals(erpCreateInfo.getOwnerTPName())) {
req.setOwnerNeName(erpCreateInfo.getOwnerNEName());
req.setOwnerTPName(erpCreateInfo.getOwnerTPName());
req.setOwnerTPID(detail.getSRCTPID());
req.setNeighbourName(detail.getSINKTPNATIVENAME());
req.setNeighbourTPID(detail.getSINKTPID());
neDataMapper.setPortRole("owner");
} else if ( !foundOwnerLink && detail.getSINKNENAME().equals(erpCreateInfo.getOwnerNEName())
&& detail.getSINKTPNATIVENAME().equals(erpCreateInfo.getOwnerTPName())) {
req.setOwnerNeName(erpCreateInfo.getOwnerNEName());
req.setOwnerTPName(erpCreateInfo.getOwnerTPName());
req.setOwnerTPID(detail.getSRCTPID());
req.setNeighbourName(detail.getSRCTPNATIVENAME());
req.setNeighbourTPID(detail.getSRCTPID());
neDataMapper.setPortRole("owner");
}
}
return neDataList;
}
Below snippet describes how basic scheduler information is generated for creation of a job
private SchedReqMapper create_SchedReqMapper(CreateERPInfo erpCreateInfo) {
/**create SchedReqMapper required by nERPInstHolderMapper (scheduler)*/
SchedReqMapper scheduler = new SchedReqMapper();
Date d = new Date();
int sec = d.getSeconds();
/**set jobName and jobDscription from erpCreateInfo*/
scheduler.setJobName(erpCreateInfo.getJobName() + "_" + sec);
scheduler.setJobDescription(erpCreateInfo.getJobDescription());
SchedTriggerMapper trigger = new SchedTriggerMapper();
trigger.setDeployNow(erpCreateInfo.getDeployNow());
trigger.setName(erpCreateInfo.getJobName() + "_" + sec + "Trigger");
scheduler.setTrigger(trigger);
return scheduler;
}
OAM attributes are derived from the ERP template and input is generated for the same
REST call : /oamTemplateBrowser/GetOamMaDetailsFromTemplateAndMaName/
Input Parameters : Template Name along with path as derived from the erp template,
Ma Name as obtained from erp template
public OAMTemplateMAHolderList getOamMaDetailsFromTemplateAndMaName (OMSRestTemplate restTemplate, String templateName, String MaName ) {
String oamMaDetails = restTemplate.getUrlPrefix() + "/oamTemplateBrowser/GetOamMaDetailsFromTemplateAndMaName/" + templateName + "/" + MaName;
return restTemplate.getForObject(oamMaDetails, OAMTemplateMAHolderList.class);
}
private nOAMInstMapper create_nOAMInstMapper(OMSRestTemplate restTemplate, CreateERPInfo erpCreateInfo, ERPTemplateHolder erpTemplate) {
nOAMInstMapper oam = new nOAMInstMapper();
oam.setMdLevel(erpTemplate.getOamMdLevel());
oam.setMdFormat("NONE"); // currently only NONE is supported.
/*create MA instance*/
nMAInstMapper maInst = new nMAInstMapper ();
oam.setMaInst(maInst);
/*Retrieve MA details from template**/
String templateName = erpTemplate.getOamTemplatePath().replaceAll("/", "+") + "+" + erpTemplate.getOamTemplateName();
String maName = erpTemplate.getOamMaNAme();
OAMTemplateMAHolderList oamMaDetails = getOamMaDetailsFromTemplateAndMaName (restTemplate, templateName, maName);
OAMTemplateMAHolder maHolder = null;
if ( oamMaDetails.getOAMTemplateMAHolders().size() > 0 ) {
maHolder = oamMaDetails.getOAMTemplateMAHolders().get(0);
}
/***set all MA related attributes from the details*/
if ( maHolder != null ) {
maInst.setCcmInterval(maHolder.getCcmInterval());
maInst.setMaName(maHolder.getMaName() + "3999");// + UUID.randomUUID().toString());
maInst.setMaFormat(maHolder.getMaFormat());
/**create MEP instance and populate the required fields*/
nMEPInstMapper mepInst = new nMEPInstMapper();
maInst.setMep(mepInst);
/**set active and controle mep*/
mepInst.setActive(true);
if ( maHolder.getActive().equals("false") ) mepInst.setActive(false);
mepInst.setControlMepEnabled(true);
if ( maHolder.getControlMep().equals(false) mepInst.setControlMepEnabled(false);
mepInst.setInterfaceType(maHolder.getInterfaceType());
mepInst.setLowestPriorityDeffect(maHolder.getLowestPriorityDefect());
mepInst.setUpDirectionally(true);
if (maHolder.getDirection().equals("DOWN")) mepInst.setUpDirectionally(false);
/** create ccm and populate required fields*/
nMepCCMInstMapper ccm = new nMepCCMInstMapper();
mepInst.setCcm(ccm);
ccm.setCcmEnabled(true);
if ( maHolder.getCcmEnable().equals("false") ) ccm.setCcmEnabled(false);
ccm.setPriority(maHolder.getCcmPriority());
/**create ais instance and populate required fields*/
nMepAISInstMapper ais = new nMepAISInstMapper();
mepInst.setAis(ais);
ais.setAisEnabled(true);
if (maHolder.getAisEnable().equals("false")) ais.setAisEnabled(false);
ais.setInterval(maHolder.getAisInterval());
ais.setPriority(maHolder.getAisPriority());
ais.setLevels(new ArrayList<Integer>());
}
//erpTemplate.getOamTemplatePath()
return oam;
}