Allows the client to specifiy port with 'port-device-name' and
'port-name' (see example down below).
The feature is implemented in PceOpticalNode. The rest are
classes being updated since there is a new argument in
the method PceOpticalNode.initSrgTps():
initSrgTps(Preference portPreference) {...}
Feature implementation overview
The feature uses the classes in package:
org.opendaylight.transportpce.pce.networkanalyzer.port
* PceCalculation instantiates an instance of Preference using
PreferenceFactory and passing it on to the constructor in
PceOpticalNode.
* PreferenceFactory in turn uses PathComputationRequestInput
to return either 'NoPreference' or 'ClientPreference'.
* Returning an instance of 'NoPreference' is the backwards compatible
approach. The class 'NoPreference' is currently implemented as
the equivalent of 'port-device-name' and 'port-name' being absent
from the client request.
* If the client uses 'port-device-name' and 'port-name' an instance
of ClientPreference is returned.
* PceOpticalNode uses the method preferredPort(...) defined by
the interface Preference (implemented by NoPreference/
ClientPreference) when building a list of avilable ports.
If a port is not in the preferred list, it's treated as
unavailable by PceOpticalNode.
APIImpact
POST /rests/operations/org-openroadm-service:service-create
{
"input": {
...
"port": {
"port-device-name": "ROADM-B-SRG1",
"port-name": "SRG1-PP2-TXRX",
}
...
}
}
The above will result in port SRG1-PP2-TXRX on node ROADM-B-SRG1
being used in the service. All other ports on ROADM-B-SRG1
will be treated as "unavailable".
JIRA: TRNSPRTPCE-176
Change-Id: I453a92fda2977ac86c5c5ff47e1a7f6cd322334d
Signed-off-by: Joakim Törnqvist <joakim.tornqvist@smartoptics.com>
import org.opendaylight.transportpce.common.service.ServiceTypes;
import org.opendaylight.transportpce.pce.PceComplianceCheck;
import org.opendaylight.transportpce.pce.constraints.PceConstraints;
import org.opendaylight.transportpce.common.service.ServiceTypes;
import org.opendaylight.transportpce.pce.PceComplianceCheck;
import org.opendaylight.transportpce.pce.constraints.PceConstraints;
+import org.opendaylight.transportpce.pce.networkanalyzer.port.Factory;
+import org.opendaylight.transportpce.pce.networkanalyzer.port.Preference;
+import org.opendaylight.transportpce.pce.networkanalyzer.port.PreferenceFactory;
import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.PathComputationRequestInput;
import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.path.computation.reroute.request.input.Endpoints;
import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mc.capabilities.McCapabilities;
import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.PathComputationRequestInput;
import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.path.computation.reroute.request.input.Endpoints;
import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mc.capabilities.McCapabilities;
case StringConstants.SERVICE_TYPE_OTUC2:
case StringConstants.SERVICE_TYPE_OTUC3:
case StringConstants.SERVICE_TYPE_OTUC4:
case StringConstants.SERVICE_TYPE_OTUC2:
case StringConstants.SERVICE_TYPE_OTUC3:
case StringConstants.SERVICE_TYPE_OTUC4:
+ Factory portPreferenceFactory = new PreferenceFactory();
+ Preference portPreference = portPreferenceFactory.portPreference(input);
// 100GE service and OTU4 service are handled at the openroadm-topology layer
for (Node node : allNodes) {
// 100GE service and OTU4 service are handled at the openroadm-topology layer
for (Node node : allNodes) {
+ validateNode(node, portPreference);
}
LOG.debug("analyzeNw: allPceNodes size {}", allPceNodes.size());
}
LOG.debug("analyzeNw: allPceNodes size {}", allPceNodes.size());
- private void validateNode(Node node) {
+ private void validateNode(Node node, Preference portPreference) {
LOG.debug("validateNode: node {} ", node);
// PceNode will be used in Graph algorithm
Node1 node1 = node.augmentation(Node1.class);
LOG.debug("validateNode: node {} ", node);
// PceNode will be used in Graph algorithm
Node1 node1 = node.augmentation(Node1.class);
- if (endPceNode(nodeType, pceNode.getNodeId(), pceNode)) {
+ if (endPceNode(nodeType, pceNode.getNodeId(), pceNode, portPreference)) {
if (this.aendPceNode == null && isAZendPceNode(this.serviceFormatA, pceNode, anodeId, "A")) {
// Added to ensure A-node has a addlink in the topology
List<Link> links = this.allLinks.stream()
if (this.aendPceNode == null && isAZendPceNode(this.serviceFormatA, pceNode, anodeId, "A")) {
// Added to ensure A-node has a addlink in the topology
List<Link> links = this.allLinks.stream()
- private Boolean endPceNode(OpenroadmNodeType openroadmNodeType, NodeId nodeId, PceOpticalNode pceNode) {
+ private Boolean endPceNode(OpenroadmNodeType openroadmNodeType, NodeId nodeId, PceOpticalNode pceNode,
+ Preference portPreference) {
switch (openroadmNodeType) {
case SRG:
switch (openroadmNodeType) {
case SRG:
+ pceNode.initSrgTps(portPreference);
this.azSrgs.add(nodeId);
break;
case XPONDER:
this.azSrgs.add(nodeId);
break;
case XPONDER:
import org.opendaylight.transportpce.common.fixedflex.GridConstant;
import org.opendaylight.transportpce.common.mapping.PortMapping;
import org.opendaylight.transportpce.pce.SortPortsByName;
import org.opendaylight.transportpce.common.fixedflex.GridConstant;
import org.opendaylight.transportpce.common.mapping.PortMapping;
import org.opendaylight.transportpce.pce.SortPortsByName;
+import org.opendaylight.transportpce.pce.networkanalyzer.port.Preference;
import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.path.computation.reroute.request.input.Endpoints;
import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mapping.Mapping;
import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.TerminationPoint1;
import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.path.computation.reroute.request.input.Endpoints;
import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mapping.Mapping;
import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.TerminationPoint1;
- public void initSrgTps() {
+ public void initSrgTps(Preference portPreference) {
this.availableSrgPp.clear();
this.availableSrgCp.clear();
if (!isValid()) {
this.availableSrgPp.clear();
this.availableSrgCp.clear();
if (!isValid()) {
case SRGTXPP:
case SRGTXRXPP:
LOG.debug("initSrgTpList: SRG-PP tp = {} found", tp.getTpId().getValue());
case SRGTXPP:
case SRGTXRXPP:
LOG.debug("initSrgTpList: SRG-PP tp = {} found", tp.getTpId().getValue());
+ if (!portPreference.isPreferredPort(nodeId.getValue(), tp.getTpId().getValue())) {
+ LOG.warn("initSrgTpList: SRG-PP tp = {} is rejected by the client", tp.getTpId().getValue());
+ break;
+ }
if (isTerminationPointAvailable(nttp1)) {
LOG.debug("initSrgTpList: adding SRG-PP tp '{}'", tp.getTpId().getValue());
this.availableSrgPp.put(tp.getTpId().getValue(), cntp1.getTpType());
if (isTerminationPointAvailable(nttp1)) {
LOG.debug("initSrgTpList: adding SRG-PP tp '{}'", tp.getTpId().getValue());
this.availableSrgPp.put(tp.getTpId().getValue(), cntp1.getTpType());
import org.opendaylight.transportpce.common.fixedflex.GridConstant;
import org.opendaylight.transportpce.common.fixedflex.GridUtils;
import org.opendaylight.transportpce.common.mapping.PortMapping;
import org.opendaylight.transportpce.common.fixedflex.GridConstant;
import org.opendaylight.transportpce.common.fixedflex.GridUtils;
import org.opendaylight.transportpce.common.mapping.PortMapping;
+import org.opendaylight.transportpce.pce.networkanalyzer.port.NoPreference;
+import org.opendaylight.transportpce.pce.networkanalyzer.port.Preference;
import org.opendaylight.transportpce.test.AbstractTest;
import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Node1;
import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.TerminationPoint1Builder;
import org.opendaylight.transportpce.test.AbstractTest;
import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Node1;
import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.TerminationPoint1Builder;
private String serviceType = "100GE";
@Mock
private PortMapping portMapping;
private String serviceType = "100GE";
@Mock
private PortMapping portMapping;
+ private final Preference portPreference = new NoPreference();
@BeforeEach
void setUp() {
@BeforeEach
void setUp() {
pceOpticalNode = new PceOpticalNode(deviceNodeId, serviceType, portMapping, node,
OpenroadmNodeType.ROADM, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1,
GridConstant.SLOT_WIDTH_50, GridConstant.SLOT_WIDTH_50);
pceOpticalNode = new PceOpticalNode(deviceNodeId, serviceType, portMapping, node,
OpenroadmNodeType.ROADM, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1,
GridConstant.SLOT_WIDTH_50, GridConstant.SLOT_WIDTH_50);
- pceOpticalNode.initSrgTps();
+ pceOpticalNode.initSrgTps(portPreference);
pceOpticalNode.initXndrTps(ServiceFormat.OMS);
pceOpticalNode.initFrequenciesBitSet();
assertFalse(pceOpticalNode.isValid());
pceOpticalNode.initXndrTps(ServiceFormat.OMS);
pceOpticalNode.initFrequenciesBitSet();
assertFalse(pceOpticalNode.isValid());
pceOpticalNode = new PceOpticalNode(null, null, null, node,
OpenroadmNodeType.ROADM, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1,
GridConstant.SLOT_WIDTH_50, GridConstant.SLOT_WIDTH_50);
pceOpticalNode = new PceOpticalNode(null, null, null, node,
OpenroadmNodeType.ROADM, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1,
GridConstant.SLOT_WIDTH_50, GridConstant.SLOT_WIDTH_50);
- pceOpticalNode.initSrgTps();
+ pceOpticalNode.initSrgTps(portPreference);
assertNull(pceOpticalNode.getRdmSrgClient("7", StringConstants.SERVICE_DIRECTION_AZ));
assertFalse(pceOpticalNode.isValid());
assertNull(pceOpticalNode.getBitSetData());
assertNull(pceOpticalNode.getRdmSrgClient("7", StringConstants.SERVICE_DIRECTION_AZ));
assertFalse(pceOpticalNode.isValid());
assertNull(pceOpticalNode.getBitSetData());
pceOpticalNode = new PceOpticalNode(null, null, null, specificNode,
OpenroadmNodeType.ROADM, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1,
GridConstant.SLOT_WIDTH_50, GridConstant.SLOT_WIDTH_50);
pceOpticalNode = new PceOpticalNode(null, null, null, specificNode,
OpenroadmNodeType.ROADM, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1,
GridConstant.SLOT_WIDTH_50, GridConstant.SLOT_WIDTH_50);
- pceOpticalNode.initSrgTps();
+ pceOpticalNode.initSrgTps(portPreference);
pceOpticalNode.initFrequenciesBitSet();
pceOpticalNode.initXndrTps(ServiceFormat.OMS);
assertNull(pceOpticalNode.getRdmSrgClient("7" ,StringConstants.SERVICE_DIRECTION_AZ));
pceOpticalNode.initFrequenciesBitSet();
pceOpticalNode.initXndrTps(ServiceFormat.OMS);
assertNull(pceOpticalNode.getRdmSrgClient("7" ,StringConstants.SERVICE_DIRECTION_AZ));
pceOpticalNode = new PceOpticalNode(null, null, null, node,
OpenroadmNodeType.DEGREE, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1,
GridConstant.SLOT_WIDTH_50, GridConstant.SLOT_WIDTH_50);
pceOpticalNode = new PceOpticalNode(null, null, null, node,
OpenroadmNodeType.DEGREE, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1,
GridConstant.SLOT_WIDTH_50, GridConstant.SLOT_WIDTH_50);
- pceOpticalNode.initSrgTps();
+ pceOpticalNode.initSrgTps(portPreference);
assertNull(pceOpticalNode.getRdmSrgClient("7" ,StringConstants.SERVICE_DIRECTION_AZ));
assertFalse(pceOpticalNode.isValid());
assertNull(pceOpticalNode.getBitSetData());
assertNull(pceOpticalNode.getRdmSrgClient("7" ,StringConstants.SERVICE_DIRECTION_AZ));
assertFalse(pceOpticalNode.isValid());
assertNull(pceOpticalNode.getBitSetData());
pceOpticalNode = new PceOpticalNode(null, null, null, specificNode,
OpenroadmNodeType.ROADM, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1,
GridConstant.SLOT_WIDTH_50, GridConstant.SLOT_WIDTH_50);
pceOpticalNode = new PceOpticalNode(null, null, null, specificNode,
OpenroadmNodeType.ROADM, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1,
GridConstant.SLOT_WIDTH_50, GridConstant.SLOT_WIDTH_50);
- pceOpticalNode.initSrgTps();
+ pceOpticalNode.initSrgTps(portPreference);
assertFalse(pceOpticalNode.isValid());
assertNull(pceOpticalNode.getBitSetData());
assertTrue(pceOpticalNode.checkTP("testTP"));
assertFalse(pceOpticalNode.isValid());
assertNull(pceOpticalNode.getBitSetData());
assertTrue(pceOpticalNode.checkTP("testTP"));
pceOpticalNode = new PceOpticalNode(null, null, null, node,
OpenroadmNodeType.ROADM, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1,
GridConstant.SLOT_WIDTH_50, GridConstant.SLOT_WIDTH_50);
pceOpticalNode = new PceOpticalNode(null, null, null, node,
OpenroadmNodeType.ROADM, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1,
GridConstant.SLOT_WIDTH_50, GridConstant.SLOT_WIDTH_50);
- pceOpticalNode.initSrgTps();
+ pceOpticalNode.initSrgTps(portPreference);
assertNull(pceOpticalNode.getRdmSrgClient("2" ,StringConstants.SERVICE_DIRECTION_AZ));
assertFalse(pceOpticalNode.isValid());
assertNull(pceOpticalNode.getBitSetData());
assertNull(pceOpticalNode.getRdmSrgClient("2" ,StringConstants.SERVICE_DIRECTION_AZ));
assertFalse(pceOpticalNode.isValid());
assertNull(pceOpticalNode.getBitSetData());