2  * ============LICENSE_START=======================================================
 
   3  * ONAP : ccsdk features
 
   4  * ================================================================================
 
   5  * Copyright (C) 2020 highstreet technologies GmbH Intellectual Property.
 
   7  * ================================================================================
 
   8  * Licensed under the Apache License, Version 2.0 (the "License");
 
   9  * you may not use this file except in compliance with the License.
 
  10  * You may obtain a copy of the License at
 
  12  *     http://www.apache.org/licenses/LICENSE-2.0
 
  14  * Unless required by applicable law or agreed to in writing, software
 
  15  * distributed under the License is distributed on an "AS IS" BASIS,
 
  16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 
  17  * See the License for the specific language governing permissions and
 
  18  * limitations under the License.
 
  19  * ============LICENSE_END=========================================================
 
  22 package org.onap.ccsdk.features.sdnr.wt.devicemanager.openroadm.impl;
 
  24 import java.util.ArrayList;
 
  25 import java.util.Hashtable;
 
  26 import java.util.List;
 
  27 import java.util.Optional;
 
  28 import org.eclipse.jdt.annotation.NonNull;
 
  29 import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.DataProvider;
 
  30 import org.onap.ccsdk.features.sdnr.wt.devicemanager.ne.service.NetworkElement;
 
  31 import org.onap.ccsdk.features.sdnr.wt.devicemanager.ne.service.NetworkElementService;
 
  32 import org.onap.ccsdk.features.sdnr.wt.devicemanager.service.DeviceManagerServiceProvider;
 
  33 import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.NetconfAccessor;
 
  34 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 
  35 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev191129.OrgOpenroadmDevice;
 
  36 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev191129.circuit.packs.CircuitPacks;
 
  37 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev191129.interfaces.grp.Interface;
 
  38 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev191129.org.openroadm.device.Xponder;
 
  39 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev191129.shelf.Slots;
 
  40 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev191129.shelves.Shelves;
 
  41 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev191129.xponder.XpdrPort;
 
  42 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.NetworkElementDeviceType;
 
  43 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.PmdataEntity;
 
  44 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
 
  45 import org.opendaylight.yangtools.concepts.ListenerRegistration;
 
  46 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 
  47 import org.opendaylight.yangtools.yang.binding.NotificationListener;
 
  48 import org.slf4j.Logger;
 
  49 import org.slf4j.LoggerFactory;
 
  52  * @author Shabnam Sultana
 
  54  *         Creating the openroadm device as an optical network element and writing inventory, fault, pm data to elastic
 
  58 public class OpenroadmNetworkElement implements NetworkElement {
 
  61     private final long equipmentLevel = 0;
 
  62     private static final Logger log = LoggerFactory.getLogger(OpenroadmNetworkElement.class);
 
  63     private final NetconfAccessor netconfAccessor;
 
  64     private final DataProvider databaseService;
 
  65     private Hashtable<String, Long> circuitPacksRecord;
 
  66     private Hashtable<String, Long> shelfProvisionedcircuitPacks;
 
  67     private ListenerRegistration<NotificationListener> openRdmListenerRegistrationResult;
 
  68     private @NonNull final OpenroadmChangeNotificationListener openRdmListener;
 
  69     private ListenerRegistration<NotificationListener> opnRdmFaultListenerRegistrationResult;
 
  70     private @NonNull OpenroadmFaultNotificationListener opnRdmFaultListener;
 
  71     private ListenerRegistration<NotificationListener> opnRdmDeviceListenerRegistrationResult;
 
  72     private OpenroadmDeviceChangeNotificationListener opnRdmDeviceListener;
 
  73     private OpenroadmInventoryInput opnRdmInventoryInput;
 
  74     private PmDataBuilderOpenRoadm openRoadmPmData;
 
  75     private InitialDeviceAlarmReader initialAlarmReader;
 
  76     private List<PmdataEntity> pmDataEntity = new ArrayList<PmdataEntity>();
 
  80     public OpenroadmNetworkElement(NetconfAccessor netconfAccess, DeviceManagerServiceProvider serviceProvider) {
 
  82         log.info("Create {}", OpenroadmNetworkElement.class.getSimpleName());
 
  83         this.netconfAccessor = netconfAccess;
 
  84         this.databaseService = serviceProvider.getDataProvider();
 
  85         this.openRdmListenerRegistrationResult = null;
 
  86         this.openRdmListener = new OpenroadmChangeNotificationListener(netconfAccessor, databaseService);
 
  87         this.opnRdmFaultListenerRegistrationResult = null;
 
  88         this.opnRdmFaultListener = new OpenroadmFaultNotificationListener(netconfAccessor, serviceProvider);
 
  89         this.opnRdmDeviceListenerRegistrationResult = null;
 
  90         this.opnRdmDeviceListener = new OpenroadmDeviceChangeNotificationListener(netconfAccessor, databaseService);
 
  91         this.opnRdmInventoryInput = new OpenroadmInventoryInput(netconfAccess, readDevice(netconfAccess));
 
  92         this.circuitPacksRecord = new Hashtable<String, Long>();
 
  93         this.shelfProvisionedcircuitPacks = new Hashtable<String, Long>();
 
  94         this.openRoadmPmData = new PmDataBuilderOpenRoadm(this.netconfAccessor);
 
  95         this.initialAlarmReader = new InitialDeviceAlarmReader(this.netconfAccessor, serviceProvider);
 
  96         log.info("NodeId {}", this.netconfAccessor.getNodeId().getValue());
 
  97         log.info("oScaMapper details{}", this.opnRdmInventoryInput.getClass().getName());
 
 100     // end of constructors
 
 103     public void initialReadFromNetworkElement() {
 
 104         OrgOpenroadmDevice device = readDevice(this.netconfAccessor);
 
 105         databaseService.writeInventory(this.opnRdmInventoryInput.getInventoryData(equipmentLevel));
 
 107         readShelvesData(device);
 
 108         readXpndrData(device);
 
 109         readCircuitPacketData(device);
 
 110         readInterfaceData(device);
 
 111         // Writing initial alarms at the time of device registration
 
 112         initialAlarmReader.faultService();
 
 113         // faultEventListener.initCurrentProblemStatus(this.netconfAccessor.getNodeId(),
 
 114         // oScaFaultListener.writeFaultData(this.sequenceNumber));
 
 115         // oScaFaultListener.writeAlarmLog(oScaFaultListener.writeFaultData(this.sequenceNumber));
 
 116         // this.sequenceNumber = this.sequenceNumber + 1;
 
 118         pmDataEntity = this.openRoadmPmData.buildPmDataEntity(this.openRoadmPmData.getPmData(this.netconfAccessor));
 
 119         if (!pmDataEntity.isEmpty()) {
 
 120             this.databaseService.doWritePerformanceData(pmDataEntity);
 
 121             log.info("PmDatEntity is written with size {}", pmDataEntity.size());
 
 122             for (PmdataEntity ent : pmDataEntity) {
 
 123                 log.info("GetNode: {}, granPeriod: {}", ent.getNodeName(), ent.getGranularityPeriod().getName());
 
 126             log.info("PmDatEntity is empty");
 
 132     public NetworkElementDeviceType getDeviceType() {
 
 133         return NetworkElementDeviceType.OROADM;
 
 137     public void register() {
 
 138         initialReadFromNetworkElement();
 
 140         this.openRdmListenerRegistrationResult = netconfAccessor.doRegisterNotificationListener(openRdmListener);
 
 141         this.opnRdmFaultListenerRegistrationResult =
 
 142                 netconfAccessor.doRegisterNotificationListener(opnRdmFaultListener);
 
 143         this.opnRdmDeviceListenerRegistrationResult =
 
 144                 netconfAccessor.doRegisterNotificationListener(opnRdmDeviceListener);
 
 145         // Register netconf stream
 
 146         netconfAccessor.registerNotificationsStream(NetconfAccessor.DefaultNotificationsStream);
 
 151     public void deregister() {
 
 152         if (openRdmListenerRegistrationResult != null) {
 
 153             this.openRdmListenerRegistrationResult.close();
 
 155         if (opnRdmFaultListenerRegistrationResult != null) {
 
 156             this.opnRdmFaultListenerRegistrationResult.close();
 
 158         if (opnRdmDeviceListenerRegistrationResult != null) {
 
 159             this.opnRdmDeviceListenerRegistrationResult.close();
 
 164     public NodeId getNodeId() {
 
 165         return netconfAccessor.getNodeId();
 
 169     public <L extends NetworkElementService> Optional<L> getService(Class<L> clazz) {
 
 170         return Optional.empty();
 
 174     public void warmstart() {}
 
 177     public Optional<NetconfAccessor> getAcessor() {
 
 178         return Optional.of(netconfAccessor);
 
 180     // end of public methods
 
 183     private void readShelvesData(OrgOpenroadmDevice device) {
 
 184         List<Shelves> shelves = device.getShelves();
 
 185         if (shelves != null) {
 
 186             for (Shelves shelf : shelves) {
 
 188                         "Shelf Name: {}, \n Serial Id:{}, \n Product Code;{}, \n Position:{}, \n EquipmetState: {}, \n Hardware version: {}"
 
 189                                 + "\n ShelfType:{}, \n Vendor: {}, \n LifecycleState: {} ",
 
 190                         shelf.getShelfName(), shelf.getSerialId(), shelf.getProductCode(), shelf.getShelfPosition(),
 
 191                         shelf.getEquipmentState(), shelf.getHardwareVersion(), shelf.getShelfType(), shelf.getVendor(),
 
 192                         shelf.getLifecycleState());
 
 194                         .writeInventory(this.opnRdmInventoryInput.getShelvesInventory(shelf, equipmentLevel + 1));
 
 195                 List<Slots> slotList = shelf.getSlots();
 
 196                 if (slotList != null) {
 
 197                     for (Slots slot : slotList) {
 
 198                         if (!slot.getProvisionedCircuitPack().isEmpty()) {
 
 199                             this.shelfProvisionedcircuitPacks.put(slot.getProvisionedCircuitPack(), equipmentLevel + 2);
 
 201                         log.info("Slots for the shelf: {}", shelf.getShelfName());
 
 202                         log.info("\n Slot Name: {}, \n Status: {}, \n Slot label: {} ", slot.getSlotName(),
 
 203                                 slot.getSlotStatus(), slot.getLabel());
 
 206                 log.info("size of shelfProvisionedcircuitPacks: {} ", shelfProvisionedcircuitPacks.size());
 
 213     private void readXpndrData(OrgOpenroadmDevice device) {
 
 214         List<Xponder> xponderList = device.getXponder();
 
 215         if (xponderList != null) {
 
 216             for (Xponder xponder : xponderList) {
 
 218                         .writeInventory(this.opnRdmInventoryInput.getXponderInventory(xponder, equipmentLevel + 1));
 
 219                 log.info("Xponders: No.: {} , \n Port: {} ,\n Type: {}", xponder.getXpdrNumber(), xponder.getXpdrPort(),
 
 220                         xponder.getXpdrType());
 
 221                 List<XpdrPort> xpdrportlist = xponder.getXpdrPort();
 
 222                 if (xpdrportlist != null) {
 
 223                     for (XpdrPort xpdrport : xpdrportlist)
 
 224                         if (!xpdrport.getCircuitPackName().isEmpty()) {
 
 225                             this.shelfProvisionedcircuitPacks.put(xpdrport.getCircuitPackName(), equipmentLevel + 2);
 
 226                             log.info("Size of dict{}", this.shelfProvisionedcircuitPacks.size());
 
 236     private void readCircuitPacketData(OrgOpenroadmDevice device) {
 
 237         List<CircuitPacks> circuitpacklist = device.getCircuitPacks();
 
 239         if (circuitpacklist != null) {
 
 240             for (CircuitPacks cp : circuitpacklist) {
 
 241                 log.info("CP Name:{}", cp.getCircuitPackName());
 
 242                 if (!this.shelfProvisionedcircuitPacks.isEmpty()
 
 243                         && this.shelfProvisionedcircuitPacks.containsKey(cp.getCircuitPackName())) {
 
 245                     this.circuitPacksRecord.put(cp.getCircuitPackName(), (equipmentLevel + 2));
 
 246                     databaseService.writeInventory(this.opnRdmInventoryInput.getCircuitPackInventory(cp,
 
 247                             this.shelfProvisionedcircuitPacks.get(cp.getCircuitPackName())));
 
 248                     log.info("shelf has circuit pack");
 
 250                     if (cp.getParentCircuitPack() == null) {
 
 251                         this.circuitPacksRecord.put(cp.getCircuitPackName(), (equipmentLevel + 1));
 
 252                         databaseService.writeInventory(
 
 253                                 this.opnRdmInventoryInput.getCircuitPackInventory(cp, equipmentLevel + 1));
 
 254                         log.info("Cp has no parent circuit pack and no shelf");
 
 257                         if (this.shelfProvisionedcircuitPacks
 
 258                                 .containsKey(cp.getParentCircuitPack().getCircuitPackName())) {
 
 259                             this.circuitPacksRecord.put(cp.getCircuitPackName(), (equipmentLevel + 3));
 
 260                             databaseService.writeInventory(
 
 261                                     this.opnRdmInventoryInput.getCircuitPackInventory(cp, equipmentLevel + 3));
 
 262                             log.info("Cp {} has parent circuit pack and shelf", cp.getCircuitPackName());
 
 264                             this.circuitPacksRecord.put(cp.getCircuitPackName(), (equipmentLevel + 2));
 
 265                             databaseService.writeInventory(
 
 266                                     this.opnRdmInventoryInput.getCircuitPackInventory(cp, equipmentLevel + 2));
 
 267                             log.info("Cp {} has parent circuit pack but no shelf", cp.getCircuitPackName());
 
 282     private void readInterfaceData(OrgOpenroadmDevice device) {
 
 283         List<Interface> interfaceList = device.getInterface();
 
 284         if (interfaceList != null) {
 
 285             for (Interface deviceInterface : interfaceList) {
 
 287                 log.info("\n InterfaceName: {}", deviceInterface.getName());
 
 288                 log.info("Supporting CP {}", this.circuitPacksRecord.size());
 
 289                 for (String s : this.circuitPacksRecord.keySet()) {
 
 290                     log.info("{} value {}", s, this.circuitPacksRecord.get(s));
 
 292                 log.info("Interface {} and their supporting CP {}", deviceInterface.getName(),
 
 293                         deviceInterface.getSupportingCircuitPackName());
 
 296                 if (deviceInterface.getSupportingCircuitPackName() != null) {
 
 297                     if (this.circuitPacksRecord.containsKey(deviceInterface.getSupportingCircuitPackName())) {
 
 298                         databaseService.writeInventory(this.opnRdmInventoryInput.getInterfacesInventory(deviceInterface,
 
 299                                 this.circuitPacksRecord.get(deviceInterface.getSupportingCircuitPackName()) + 1));
 
 303                     databaseService.writeInventory(
 
 304                             this.opnRdmInventoryInput.getInterfacesInventory(deviceInterface, equipmentLevel + 1));
 
 311     private OrgOpenroadmDevice readDevice(NetconfAccessor accessor) {
 
 313         final Class<OrgOpenroadmDevice> openRoadmDev = OrgOpenroadmDevice.class;
 
 314         InstanceIdentifier<OrgOpenroadmDevice> deviceId = InstanceIdentifier.builder(openRoadmDev).build();
 
 316         OrgOpenroadmDevice device = accessor.getTransactionUtils().readData(accessor.getDataBroker(),
 
 317                 LogicalDatastoreType.OPERATIONAL, deviceId);
 
 322     // end of private methods