/* * Copyright © 2017 AT&T and others. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html */ package org.opendaylight.transportpce.olm; import com.google.common.base.Optional; import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; import org.opendaylight.controller.md.sal.binding.api.DataBroker; import org.opendaylight.controller.md.sal.binding.api.MountPointService; import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; import org.opendaylight.transportpce.olm.spanloss.RoadmLinks; import org.opendaylight.transportpce.olm.spanloss.SpanLoss; import org.opendaylight.transportpce.renderer.mapping.PortMapping; import org.opendaylight.yang.gen.v1.http.org.openroadm.pm.rev161014.CurrentPmlist; import org.opendaylight.yang.gen.v1.http.org.openroadm.pm.rev161014.current.pm.Measurements; import org.opendaylight.yang.gen.v1.http.org.openroadm.pm.rev161014.currentpmlist.CurrentPm; import org.opendaylight.yang.gen.v1.http.org.openroadm.pm.types.rev161014.PmNamesEnum; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.olm.rev170418.GetPmInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.olm.rev170418.GetPmOutput; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.olm.rev170418.GetPmOutputBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.olm.rev170418.OlmService; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.olm.rev170418.ServicePowerSetupInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.olm.rev170418.ServicePowerSetupOutput; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.olm.rev170418.ServicePowerSetupOutputBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.olm.rev170418.get.pm.output.MeasurementsBuilder; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.common.RpcResult; import org.opendaylight.yangtools.yang.common.RpcResultBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * The Class OlmPowerSetupImpl. */ public class OlmPowerSetupImpl implements OlmService { /** The Constant LOG. */ private static final Logger LOG = LoggerFactory.getLogger(OlmPowerSetupImpl.class); /** The db. */ private final DataBroker db; /** The mps. */ private final MountPointService mps; /** * Instantiates a new olm power setup impl. * * @param db * the db * @param mps * the mps */ public OlmPowerSetupImpl(DataBroker db, MountPointService mps) { this.db = db; this.mps = mps; } /** * This method is the implementation of the 'get-pm' RESTCONF service, which * is one of the external APIs into the olm application. * *

* 1. get-pm This operation traverse through current PM list and gets PM for * given NodeId and Resource name * *

* The signature for this method was generated by yang tools from the * renderer API model. * * @param input * Input parameter from the olm yang model * * @return Result of the request */ @Override public Future> getPm(GetPmInput input) { LOG.info("Getting PM Data for NodeId: {} ResouceType: {} ResourceName: {}", input.getNodeId(),input.getResourceType(),input.getResourceName()); new PortMapping(db, mps, input.getNodeId()); DataBroker deviceDb = PortMapping.getDeviceDataBroker(input.getNodeId(), mps); InstanceIdentifier currentPmsIID = InstanceIdentifier.create(CurrentPmlist.class); ReadOnlyTransaction rtx = deviceDb.newReadOnlyTransaction(); Optional currentPmList; String methodName = ""; List currentPms = new ArrayList<>(); GetPmOutputBuilder pmOutputBuilder = new GetPmOutputBuilder(); List measrements = new ArrayList(); try { currentPmList = rtx.read(LogicalDatastoreType.OPERATIONAL, currentPmsIID).get(); if (currentPmList.isPresent()) { currentPms.addAll(currentPmList.get().getCurrentPm()); for (CurrentPm pm : currentPms) { MeasurementsBuilder measurement = new MeasurementsBuilder(); if (pm.getResource().getResourceType().getType().toString().equals(input.getResourceType())) { switch (pm.getResource().getResourceType().getType()) { case CircuitPack: methodName = "getCircuitPackName"; break; case Connection: methodName = "getConnectionNumber"; break; case Degree: methodName = "getDegreeNumber"; break; case Interface: methodName = "getInterfaceName"; break; case InternalLink: methodName = "getInternalLinkName"; break; case PhysicalLink: methodName = "getPhysicalLinkName"; break; case Service: methodName = "getServiceName"; break; case Shelf: methodName = "getShelfName"; break; case SharedRiskGroup: methodName = "getSrgNumber"; break; default: methodName = "getPort"; break; } try { String pmResourceId = pm.getResource().getResource().getResource().getImplementedInterface() .getMethod(methodName).invoke(pm.getResource().getResource().getResource()).toString(); if (pmResourceId.equals(input.getResourceName()) && pm.getGranularity() != null) { if (pm.getGranularity().getName().equals(input.getGranularity())) { for (Measurements measure : pm.getMeasurements()) { if (!measure.getMeasurement().getPmParameterName().getType().equals( PmNamesEnum.VendorExtension)) { measurement.setPmparameterName(measure.getMeasurement().getPmParameterName() .getType().toString()); measurement.setPmparameterValue(measure.getMeasurement() .getPmParameterValue().getDecimal64().toString()); measrements.add(measurement.build()); } } } } } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException | SecurityException ex) { LOG.warn("Unable to find PM for NodeID: {} ResourceName: {} ",input.getNodeId(), input.getResourceName(),ex); } } } if (measrements.size() > 0) { pmOutputBuilder.setNodeId(input.getNodeId()).setResourceType(input.getResourceType()).setResourceId( input.getResourceName()).setGranularity(input.getGranularity()).setMeasurements(measrements); } } else { LOG.info("Device PM Data is not available"); } } catch (InterruptedException | ExecutionException ex) { LOG.warn("Unable to get currentPmList for NodeID: {}",input.getNodeId(),ex); } LOG.info("PM Data found successfully for {}-{}",pmOutputBuilder.getNodeId(),pmOutputBuilder.getResourceId()); return RpcResultBuilder.success(pmOutputBuilder).buildFuture(); } /** * This method is the implementation of the 'service-power-setup' RESTCONF service, which * is one of the external APIs into the olm application. * *

* 1. service-power-setup: This operation performs following steps: * Step1: Calculate Spanloss on all links which are part of service. * TODO Step2: Calculate power levels for each Tp-Id * TODO Step3: Post power values on roadm connections * *

* The signature for this method was generated by yang tools from the * renderer API model. * * @param input * Input parameter from the olm yang model * Input will contain nodeId and termination point * * @return Result of the request */ @Override public Future> servicePowerSetup( ServicePowerSetupInput input) { List roadmLinks = new ArrayList(); ServicePowerSetupOutputBuilder output = new ServicePowerSetupOutputBuilder(); //Finds degree TpID from node and generates a list of links for (int i = 0; i < input.getNodes().size(); i++) { if (input.getNodes().get(i).getDestTp().toLowerCase().contains("deg")) { RoadmLinks rdmLink = new RoadmLinks(); rdmLink.setSrcNodeId(input.getNodes().get(i).getNodeId()); rdmLink.setSrcTpId(input.getNodes().get(i).getDestTp()); rdmLink.setDestNodeId(input.getNodes().get(i + 1).getNodeId()); rdmLink.setDestTpid(input.getNodes().get(i + 1).getSrcTp()); roadmLinks.add(rdmLink); } } boolean successVal = new SpanLoss(db, mps).getLinkSpanloss(roadmLinks); if (successVal) { output.setResult("Success"); } else { output.setResult("Failed"); } return RpcResultBuilder.success(output).buildFuture(); } }