revision-date 2020-11-16;
}
- import org-openroadm-common-types {
- prefix org-openroadm-common-types;
- revision-date 2018-10-19;
+ import org-openroadm-common-state-types {
+ prefix org-openroadm-common-state-types;
+ revision-date 2019-11-29;
}
organization
description "Id of abstracted element that changed in the topology";
}
leaf state {
- type org-openroadm-common-types:state;
+ type org-openroadm-common-state-types:state;
mandatory true;
description "Operational state of the affected element";
}
OpenRoadmInterfaces openRoadmInterfaces = initOpenRoadmInterfaces(mappingUtils);
PortMapping portMapping = initPortMapping(lightyServices, openRoadmInterfaces);
NetworkModelService networkModelService = new NetworkModelServiceImpl(networkTransaction, linkDiscoveryImpl,
- portMapping);
+ portMapping, lightyServices.getBindingNotificationPublishService());
FrequenciesService networkModelWavelengthService =
new FrequenciesServiceImpl(lightyServices.getBindingDataBroker());
NetConfTopologyListener netConfTopologyListener = new NetConfTopologyListener(networkModelService,
import org.opendaylight.transportpce.networkmodel.util.TopologyUtils;
import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkutils.rev170818.links.input.grouping.LinksInput;
import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Link1Builder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.equipment.states.types.rev191129.AdminStates;
import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev200529.Link1;
import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev200529.TerminationPoint1;
import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev200529.TerminationPoint1Builder;
String destTp = linksInput.getTerminationPointNum();
// update tail-equipment-id for tp of link
TerminationPoint xpdrTp = getTpofNode(srcNode, srcTp, dataBroker);
+ TerminationPoint rdmTp = getTpofNode(destNode, destTp, dataBroker);
- Network topoNetowkLayer = createNetworkBuilder(srcNode, srcTp, destNode, destTp, false, xpdrTp).build();
+ Network topoNetowkLayer = createNetworkBuilder(srcNode, srcTp, destNode, destTp, false, xpdrTp,
+ rdmTp).build();
InstanceIdentifier.InstanceIdentifierBuilder<Network> nwIID = InstanceIdentifier.builder(Networks.class)
.child(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID)));
WriteTransaction wrtx = dataBroker.newWriteOnlyTransaction();
String destTp = new StringBuilder("XPDR").append(linksInput.getXpdrNum()).append("-NETWORK")
.append(linksInput.getNetworkNum()).toString();
TerminationPoint xpdrTp = getTpofNode(destNode, destTp, dataBroker);
+ TerminationPoint rdmTp = getTpofNode(srcNode, srcTp, dataBroker);
- Network topoNetowkLayer = createNetworkBuilder(srcNode, srcTp, destNode, destTp, true, xpdrTp).build();
+ Network topoNetowkLayer = createNetworkBuilder(srcNode, srcTp, destNode, destTp, true, xpdrTp,
+ rdmTp).build();
InstanceIdentifier.InstanceIdentifierBuilder<Network> nwIID =
InstanceIdentifier.builder(Networks.class).child(Network.class,
new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID)));
}
private static NetworkBuilder createNetworkBuilder(String srcNode, String srcTp, String destNode, String destTp,
- boolean isXponderInput, TerminationPoint xpdrTp) {
+ boolean isXponderInput, TerminationPoint xpdrTp, TerminationPoint rdmTp) {
//update tp of nodes
TerminationPointBuilder xpdrTpBldr = new TerminationPointBuilder(xpdrTp);
if (xpdrTpBldr.augmentation(TerminationPoint1.class) != null) {
= new Link1Builder()
.setLinkType(isXponderInput ? OpenroadmLinkType.XPONDERINPUT : OpenroadmLinkType.XPONDEROUTPUT)
.setOppositeLink(LinkIdUtil.getOppositeLinkId(srcNode, srcTp, destNode, destTp));
+ // If both TPs of the Xpdr2Rdm link are inService --> link inService. Otherwise outOfService
+ if (State.InService.equals(xpdrTp.augmentation(org.opendaylight.yang.gen.v1.http
+ .org.openroadm.common.network.rev200529.TerminationPoint1.class).getOperationalState())
+ && State.InService.equals(rdmTp.augmentation(org.opendaylight.yang.gen.v1.http
+ .org.openroadm.common.network.rev200529.TerminationPoint1.class).getOperationalState())) {
+ lnk2bldr.setOperationalState(State.InService).setAdministrativeState(AdminStates.InService);
+ } else {
+ lnk2bldr.setOperationalState(State.OutOfService).setAdministrativeState(AdminStates.OutOfService);
+ }
LinkBuilder linkBuilder = TopologyUtils.createLink(srcNode, destNode, srcTp, destTp, null)
.addAugmentation(lnk2bldr.build());
package org.opendaylight.transportpce.networkmodel.service;
import com.google.common.util.concurrent.ListenableFuture;
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.concurrent.TimeoutException;
import java.util.stream.Collectors;
import org.eclipse.jdt.annotation.Nullable;
+import org.opendaylight.mdsal.binding.api.NotificationPublishService;
import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
import org.opendaylight.transportpce.common.NetworkUtils;
import org.opendaylight.transportpce.common.mapping.PortMapping;
import org.opendaylight.transportpce.networkmodel.util.OpenRoadmNetwork;
import org.opendaylight.transportpce.networkmodel.util.OpenRoadmOtnTopology;
import org.opendaylight.transportpce.networkmodel.util.OpenRoadmTopology;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkmodel.rev201116.TopologyUpdateResult;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkmodel.rev201116.TopologyUpdateResultBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkmodel.rev201116.topology.update.result.OrdTopologyChanges;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkmodel.rev201116.topology.update.result.OrdTopologyChangesBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkmodel.rev201116.topology.update.result.OrdTopologyChangesKey;
import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev201012.network.nodes.NodeInfo;
import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev201012.network.nodes.NodeInfo.OpenroadmVersion;
import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Link1Builder;
import org.opendaylight.yang.gen.v1.http.org.openroadm.equipment.states.types.rev191129.AdminStates;
import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev200529.Link1;
import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev200529.TerminationPoint1;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.d._interface.ord.topology.types.rev201116.TopologyNotificationTypes;
import org.opendaylight.yang.gen.v1.http.transportpce.topology.rev201019.OtnLinkType;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NetworkId;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.Networks;
// Maps that include topology component changed with its new operational state <id, state>
private Map<String, State> linksChanged;
private Map<String, State> terminationPointsChanged;
+ // Variables for creating and sending topology update notification
+ private final NotificationPublishService notificationPublishService;
+ private Map<OrdTopologyChangesKey, OrdTopologyChanges> topologyChanges;
+ private TopologyUpdateResult notification = null;
public NetworkModelServiceImpl(final NetworkTransactionService networkTransactionService,
- final R2RLinkDiscovery linkDiscovery, PortMapping portMapping) {
+ final R2RLinkDiscovery linkDiscovery, PortMapping portMapping,
+ final NotificationPublishService notificationPublishService) {
this.networkTransactionService = networkTransactionService;
this.linkDiscovery = linkDiscovery;
this.otnTopologyShardMountedDevice = new HashMap<String, TopologyShard>();
this.linksChanged = new HashMap<String, State>();
this.terminationPointsChanged = new HashMap<String, State>();
+ this.notificationPublishService = notificationPublishService;
+ this.topologyChanges = new HashMap<OrdTopologyChangesKey, OrdTopologyChanges>();
}
public void init() {
// Clear maps for each NETCONF notification received
this.linksChanged.clear();
this.terminationPointsChanged.clear();
+ this.topologyChanges.clear();
// 1. Get the list links and nodes of the current openroadm network topology
List<Link> linkList = null;
List<Node> nodesList = null;
updateOpenRoadmNetworkTopologyTPs(nodesList, nodeId);
// 4. Update the links of the topology affected by the changes on TPs (if any)
updateOpenRoadmNetworkTopologyLinks(linkList, nodesList);
- // TODO: send notification to service handler
+ // Send notification to service handler
+ sendNotification(TopologyNotificationTypes.OpenroadmTopologyUpdate, this.topologyChanges);
break;
case "port":
LOG.info("port circuit pack modified");
newTpOperationalState = State.InService;
// Add TP and state inService to the links Map
this.linksChanged.put(tpId, State.InService);
- // TODO: update change list for service handler notification
+ // Update topology change list for service handler notification
+ this.topologyChanges.put(
+ new OrdTopologyChangesKey(node.getNodeId().getValue() + "-" + tpId),
+ new OrdTopologyChangesBuilder()
+ .setId(node.getNodeId().getValue() + "-" + tpId)
+ .setState(newTpOperationalState)
+ .build());
break;
case OutOfService:
newTpAdminState = AdminStates.OutOfService;
newTpOperationalState = State.OutOfService;
// Add TP and state outOfService to the links Map
this.linksChanged.put(tpId, State.OutOfService);
- // TODO: update change list for service handler notification
+ // Update topology change list for service handler notification
+ this.topologyChanges.put(
+ new OrdTopologyChangesKey(node.getNodeId().getValue() + "-" + tpId),
+ new OrdTopologyChangesBuilder()
+ .setId(node.getNodeId().getValue() + "-" + tpId)
+ .setState(newTpOperationalState)
+ .build());
break;
case Degraded:
LOG.warn("Operational state Degraded not handled");
private void updateLinkStates(Link link, State state, AdminStates adminStates) {
// TODO: add change to list of changes
+ // Update topology change list
+ this.topologyChanges.put(new OrdTopologyChangesKey(link.getLinkId().getValue()),
+ new OrdTopologyChangesBuilder().setId(link.getLinkId().getValue()).setState(state).build());
org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Link1 link1 = new Link1Builder()
.setOperationalState(state).setAdministrativeState(adminStates).build();
Link updLink = new LinkBuilder().withKey(link.key()).addAugmentation(link1).build();
LOG.error("Couldnt commit changed to openroadm topology. Error={}", e.getMessage());
}
}
+
+ @SuppressFBWarnings(
+ value = "UPM_UNCALLED_PRIVATE_METHOD",
+ justification = "false positive, this method is used by public updateOpenRoadmNetworkTopology")
+ private void sendNotification(TopologyNotificationTypes notificationType,
+ Map<OrdTopologyChangesKey, OrdTopologyChanges> topologyChangesMap) {
+ if (topologyChangesMap.isEmpty()) {
+ LOG.warn("Empty Topology Change map. No updates in topology");
+ return;
+ }
+ TopologyUpdateResultBuilder topologyUpdateResultBuilder = new TopologyUpdateResultBuilder()
+ .setNotificationType(notificationType).setOrdTopologyChanges(topologyChangesMap);
+ this.notification = topologyUpdateResultBuilder.build();
+ try {
+ notificationPublishService.putNotification(this.notification);
+ } catch (InterruptedException e) {
+ LOG.error("Notification offer rejected. Error={}", e.getMessage());
+ }
+ }
}
<reference id="networkTransactionImpl" interface="org.opendaylight.transportpce.common.network.NetworkTransactionService" />
<reference id="mappingUtils" interface="org.opendaylight.transportpce.common.mapping.MappingUtils" />
<reference id="notificationService" interface="org.opendaylight.mdsal.binding.api.NotificationService"/>
+ <reference id="notificationPublishService" interface="org.opendaylight.mdsal.binding.api.NotificationPublishService"/>
<bean id="networkModelService" class="org.opendaylight.transportpce.networkmodel.service.NetworkModelServiceImpl">
<argument ref="networkTransactionImpl" />
<argument ref="linkDiscoveryImpl" />
<argument ref="portMapping" />
+ <argument ref="notificationPublishService" />
</bean>
<bean id="provider" class="org.opendaylight.transportpce.networkmodel.NetworkModelProvider"
this.pceListenerImpl.setserviceDataStoreOperations(this.serviceDataStoreOperations);
this.rendererListenerImpl.setserviceDataStoreOperations(serviceDataStoreOperations);
this.rendererListenerImpl.setServiceInput(new ServiceInput(input));
+ this.networkModelListenerImpl.setserviceDataStoreOperations(serviceDataStoreOperations);
org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev201125
.ServiceDeleteInput serviceDeleteInput =
ModelMappingUtils.createServiceDeleteInput(new ServiceInput(input));
this.pceListenerImpl.setserviceDataStoreOperations(this.serviceDataStoreOperations);
this.rendererListenerImpl.setserviceDataStoreOperations(serviceDataStoreOperations);
this.rendererListenerImpl.setServiceInput(new ServiceInput(input));
+ this.networkModelListenerImpl.setserviceDataStoreOperations(serviceDataStoreOperations);
LOG.debug(SERVICE_FEASABILITY_CHECK_MSG, LogMessages.PCE_CALLING);
PathComputationRequestOutput output = this.pceServiceWrapper.performPCE(input, true);
if (output == null) {
this.pceListenerImpl.setserviceDataStoreOperations(this.serviceDataStoreOperations);
this.rendererListenerImpl.setserviceDataStoreOperations(serviceDataStoreOperations);
this.rendererListenerImpl.setServiceInput(new ServiceInput(input));
+ this.networkModelListenerImpl.setserviceDataStoreOperations(serviceDataStoreOperations);
org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev201125
.ServiceDeleteInput serviceDeleteInput =
ModelMappingUtils.createServiceDeleteInput(new ServiceInput(input));
this.pceListenerImpl.setserviceDataStoreOperations(this.serviceDataStoreOperations);
this.rendererListenerImpl.setServiceInput(serviceInput);
this.rendererListenerImpl.setserviceDataStoreOperations(this.serviceDataStoreOperations);
+ this.networkModelListenerImpl.setserviceDataStoreOperations(serviceDataStoreOperations);
org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev201125
.ServiceDeleteInput serviceDeleteInput = ModelMappingUtils.createServiceDeleteInput(
new ServiceInput(deleteInputBldr.build()));
this.pceListenerImpl.setserviceDataStoreOperations(this.serviceDataStoreOperations);
this.rendererListenerImpl.setServiceInput(serviceInput);
this.rendererListenerImpl.setserviceDataStoreOperations(this.serviceDataStoreOperations);
+ this.networkModelListenerImpl.setserviceDataStoreOperations(serviceDataStoreOperations);
org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev201125
.ServiceDeleteInput serviceDeleteInput = ModelMappingUtils.createServiceDeleteInput(
new ServiceInput(deleteInputBldr.build()));
this.rendererListenerImpl.setserviceDataStoreOperations(this.serviceDataStoreOperations);
this.rendererListenerImpl.setServiceInput(new ServiceInput(input));
this.rendererListenerImpl.setTempService(true);
+ this.networkModelListenerImpl.setserviceDataStoreOperations(serviceDataStoreOperations);
org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev201125.ServiceDeleteOutput output =
this.rendererServiceWrapper.performRenderer(input, ServiceNotificationTypes.ServiceDeleteResult);
if (output == null) {
this.rendererListenerImpl.setserviceDataStoreOperations(serviceDataStoreOperations);
this.rendererListenerImpl.setServiceInput(new ServiceInput(input));
this.rendererListenerImpl.setTempService(true);
+ this.networkModelListenerImpl.setserviceDataStoreOperations(serviceDataStoreOperations);
PathComputationRequestOutput output = this.pceServiceWrapper.performPCE(input, true);
if (output == null) {
LOG.warn(TEMP_SERVICE_CREATE_MSG, LogMessages.ABORT_PCE_FAILED);