From 27fb2d06608fbb070ae2c15a5580a4f5b2423d15 Mon Sep 17 00:00:00 2001 From: demx8as6 Date: Tue, 10 Jul 2018 18:07:44 +0200 Subject: [PATCH] Add seed code for sdnr app based on ONF Centennial At this point in time all the Carbon code from ONF Centennial is added to ONAP. Later it needs to be refactored and modified for ODL Oxygen. Change-Id: Iff85dd940c05c3827f1c4e6f9542ecd060c58a46 Issue-ID: SDNC-374 Signed-off-by: demx8as6 --- .gitignore | 1 + README.md | 9 +- sdnr/wireless-transport/code-Carbon-SR1/README.md | 119 + .../apps/apigateway/features/.gitignore | 1 + .../apps/apigateway/features/pom.xml | 24 + .../features/src/main/features/features.xml | 11 + .../code-Carbon-SR1/apps/apigateway/impl/pom.xml | 35 + .../technologies/apigateway/AaiServlet.java | 264 + .../technologies/apigateway/EsServlet.java | 257 + .../technologies/apigateway/MSServlet.java | 259 + .../technologies/apigateway/MyProperties.java | 126 + .../resources/OSGI-INF/blueprint/blueprint.xml | 36 + .../apigateway/impl/src/main/test/SimpleTests.java | 111 + .../impl/src/test/resources/log4j.properties | 12 + .../code-Carbon-SR1/apps/apigateway/pom.xml | 93 + .../apps/commons/binding-parent/pom.xml | 21 + .../apps/commons/config-parent/pom.xml | 103 + .../apps/commons/configuration/pom.xml | 20 + .../code-Carbon-SR1/apps/devicemanager/README.md | 92 + .../code-Carbon-SR1/apps/devicemanager/api/pom.xml | 30 + .../devicemanager/api/DeviceManagerService.java | 49 + .../api/src/main/yang/devicemanager-api.yang | 21 + .../apps/devicemanager/impl/pom.xml | 349 + .../impl/src/main/config/default-config.xml | 48 + .../mwtn/aaiConnector/impl/AaiProviderClient.java | 155 + .../mwtn/aaiConnector/impl/AaiWebApiClient.java | 182 + .../opendaylight/mwtn/base/database/EsObject.java | 39 + .../mwtn/base/database/HtDataBase.java | 46 + .../base/database/HtDataBaseReaderAndWriter.java | 199 + .../base/database/HtDatabaseClientAbstract.java | 698 + .../mwtn/base/database/HtDatabaseNode.java | 313 + .../mwtn/base/database/HtDatabaseUpdateFile.java | 97 + .../mwtn/base/database/HtDatabaseWebAPIClient.java | 79 + .../opendaylight/mwtn/base/database/HtMapper.java | 160 + .../mwtn/base/database/IndexClientBuilder.java | 150 + .../mwtn/base/database/IsEsObject.java | 35 + .../mwtn/base/database/JsonMapperBase.java | 103 + .../mwtn/base/http/BaseHTTPClient.java | 267 + .../mwtn/base/http/BaseHTTPResponse.java | 21 + .../mwtn/base/internalTypes/Environment.java | 29 + .../mwtn/base/internalTypes/FileWatchdog.java | 121 + .../base/internalTypes/IniConfigurationFile.java | 356 + .../base/internalTypes/InternalDateAndTime.java | 76 + .../mwtn/base/internalTypes/InternalSeverity.java | 85 + .../base/internalTypes/InventoryInformation.java | 51 + .../mwtn/base/internalTypes/Resources.java | 300 + .../mwtn/base/internalTypes/TemplateFile.java | 61 + .../org/opendaylight/mwtn/base/netconf/AllPm.java | 44 + .../mwtn/base/netconf/Capabilities.java | 103 + ...endedAirInterfaceHistoricalPerformanceType.java | 82 + ...dedAirInterfaceHistoricalPerformanceType12.java | 87 + .../mwtn/base/netconf/GenericTransactionUtils.java | 144 + .../netconf/InternGenericCurrentProblemType.java | 12 + .../mwtn/base/netconf/LinkIdentifyingObject.java | 7 + .../mwtn/base/netconf/NetconfTimeStamp.java | 269 + .../mwtn/base/netconf/ONFCoreEmpty.java | 93 + .../mwtn/base/netconf/ONFCoreInterfacePac.java | 20 + .../mwtn/base/netconf/ONFCoreNetworkElement10.java | 770 + .../mwtn/base/netconf/ONFCoreNetworkElement12.java | 1435 ++ .../base/netconf/ONFCoreNetworkElementBase.java | 53 + .../base/netconf/ONFCoreNetworkElementFactory.java | 68 + .../ONFCoreNetworkElementRepresentation.java | 33 + .../mwtn/base/netconf/ONFLayerProtocolName.java | 53 + .../mwtn/config/impl/AaiClientPropertiesFile.java | 57 + .../opendaylight/mwtn/config/impl/AaiConfig.java | 386 + .../opendaylight/mwtn/config/impl/AkkaConfig.java | 260 + .../mwtn/config/impl/BaseSubConfig.java | 91 + .../opendaylight/mwtn/config/impl/DcaeConfig.java | 146 + .../opendaylight/mwtn/config/impl/EsConfig.java | 156 + .../opendaylight/mwtn/config/impl/GeoConfig.java | 141 + .../config/impl/HtDevicemanagerConfiguration.java | 163 + .../opendaylight/mwtn/config/impl/HtLogger.java | 43 + .../opendaylight/mwtn/config/impl/PmConfig.java | 147 + .../mwtn/dcaeConnector/impl/DcaeMessages.java | 329 + .../dcaeConnector/impl/DcaeProviderClient.java | 125 + .../mwtn/dcaeConnector/impl/DcaeProviderTask.java | 33 + .../mwtn/dcaeConnector/impl/DcaeSender.java | 14 + .../mwtn/dcaeConnector/impl/DcaeSenderImpl.java | 211 + .../mwtn/dcaeConnector/test/DcaePrivateTester.java | 98 + .../mwtn/dcaeConnector/test/DcaeTestClient.java | 56 + .../mwtn/dcaeConnector/test/HttpsClient.java | 293 + .../mwtn/deviceMonitor/impl/Checker.java | 31 + .../mwtn/deviceMonitor/impl/DeviceMonitor.java | 46 + .../mwtn/deviceMonitor/impl/DeviceMonitorImpl.java | 151 + .../deviceMonitor/impl/DeviceMonitorProblems.java | 40 + .../deviceMonitor/impl/DeviceMonitorSupport.java | 30 + .../mwtn/deviceMonitor/impl/DeviceMonitorTask.java | 263 + .../mwtn/devicemanager/impl/DeviceManagerImpl.java | 402 + .../mwtn/devicemanager/impl/ProviderClient.java | 22 + .../database/service/HtDatabaseEventsService.java | 204 + .../impl/database/types/EsEventBase.java | 30 + .../impl/database/types/EsFaultCurrent.java | 51 + .../impl/database/types/EsFaultLog.java | 30 + .../impl/database/types/EsVersionInfo.java | 58 + .../impl/listener/MicrowaveEventListener.java | 183 + .../impl/listener/MicrowaveEventListener12.java | 178 + .../impl/listener/NetconfChangeListener.java | 202 + .../impl/listener/ODLEventListener.java | 180 + .../xml/AttributeValueChangedNotificationXml.java | 60 + .../mwtn/devicemanager/impl/xml/GetEventType.java | 12 + .../impl/xml/MwtNotificationBase.java | 76 + .../impl/xml/ObjectCreationNotificationXml.java | 50 + .../impl/xml/ObjectDeletionNotificationXml.java | 53 + .../impl/xml/ProblemNotificationXml.java | 109 + .../impl/xml/WebSocketServiceClient.java | 53 + .../mwtn/devicemanager/impl/xml/XmlMapper.java | 42 + .../mwtn/index/impl/IndexConfigService.java | 40 + .../mwtn/index/impl/IndexMwtnService.java | 43 + .../mwtn/index/impl/IndexUpdateService.java | 99 + .../impl/PerformanceManagerImpl.java | 53 + .../impl/PerformanceManagerTask.java | 220 + ...icrowaveHistoricalPerformanceWriterService.java | 79 + .../types/EsHistoricalPerformance15Minutes.java | 40 + .../types/EsHistoricalPerformance24Hours.java | 30 + .../types/EsHistoricalPerformanceBase.java | 191 + .../types/EsHistoricalPerformanceLogEntry.java | 75 + .../impl/database/types/EsPerformanceData10.java | 219 + .../impl/database/types/EsPerformanceData12.java | 210 + .../opendaylight/mwtn/ptp/impl/GeoLocation.java | 31 + .../mwtn/ptp/impl/LogicalTerminationPoint.java | 38 + .../java/org/opendaylight/mwtn/ptp/impl/Path.java | 37 + .../opendaylight/mwtn/ptp/impl/PtpManagerImpl.java | 12 + .../impl/rev170317/DeviceManagerImplModule.java | 26 + .../rev170317/DeviceManagerImplModuleFactory.java | 13 + .../impl/src/main/resources/aots/addreq.tmpl.xml | 53 + .../impl/src/main/resources/aots/inqreq.tmpl.xml | 36 + .../main/resources/elasticsearch/elasticsearch.yml | 103 + .../elasticsearch/index/config/opendaylight.json | 21 + .../modelDescription/CoreModel-ForMicrowave.json | 751 + .../modelDescription/G.874.1-ForMicrowave.json | 546 + ...rowaveModel-ObjectClasses-AirInterface.yin.json | 45 + ...eModel-ObjectClasses-EthernetContainer.yin.json | 41 + ...el-ObjectClasses-PureEthernetStructure.yin.json | 41 + .../mwtn/modelDescription/MicrowaveModel.json | 2940 ++++ .../core-model.schema-information.json | 2296 +++ .../g.874.1-model.schema-information.json | 602 + .../microwave-model.schema-information.json | 3161 ++++ .../mwtn/modelDescription/microwave-model.yin.json | 223 + ...el-conditional-packages.schema-information.json | 337 + .../onf-core-model-conditional-packages.yin.json | 79 + ...et-conditional-packages.schema-information.json | 76 + .../onf-ethernet-conditional-packages.yin.json | 41 + .../onf-ptp-dataset.schema-information.json | 435 + .../otn-odu-conditional-packages.yin.json | 75 + .../elasticsearch/index/mwtn/mwtnMapping.json | 51 + .../elasticsearch/index/mwtn/mwtnV1Alias.json | 8 + .../index/sdnevents/sdneventsMapping.json | 100 + .../sdnperformance/sdnperformanceMapping.json | 92 + .../elasticsearch/plugins/delete-by-query.zip | Bin 0 -> 27945 bytes .../main/resources/elasticsearch/plugins/head.zip | Bin 0 -> 6203012 bytes .../bbf-tr-196-2-0-3-full@2018-04-08.yang | 17194 +++++++++++++++++++ .../core-model@2017-03-20.yang | 1700 ++ .../g.874.1-model@2017-03-20.yang | 646 + .../ietf-inet-types@2010-09-24.yang | 418 + .../ietf-inet-types@2013-07-15.yang | 457 + .../ietf-netconf-acm@2012-02-22.yang | 449 + .../ietf-netconf-monitoring@2010-10-04.yang | 558 + .../ietf-netconf-partial-lock@2009-10-19.yang | 83 + .../ietf-netconf-with-defaults@2011-06-01.yang | 140 + .../ietf-netconf@2011-06-01.yang | 934 + .../ietf-ptp-dataset@2017-02-08.yang | 605 + .../ietf-restconf@2013-10-19.yang | 689 + .../ietf-system@2014-08-06.yang | 842 + .../ietf-yang-library@2016-04-09.yang | 263 + .../ietf-yang-types@2013-07-15.yang | 467 + .../microwave-model@2017-03-24.yang | 2262 +++ .../nc-notifications@2008-07-14.yang | 95 + .../notifications@2008-07-14.yang | 82 + .../notifications@2018-05-30.yang | 97 + ...core-model-conditional-packages@2017-04-02.yang | 350 + ...core-model-conditional-packages@2018-04-08.yang | 472 + ...f-ethernet-conditional-packages@2017-04-02.yang | 88 + ...nf-otn-odu-conditional-packages@2017-10-20.yang | 361 + .../onf-ptp-dataset@2017-05-08.yang | 125 + .../impl/src/main/resources/version.properties | 3 + .../devicemanager/impl/src/main/test/AaiTest.java | 46 + .../impl/src/main/test/AkkaConfigTest.java | 163 + .../impl/src/main/test/ConfigTest.java | 45 + .../impl/src/main/test/ESWebAPITest.java | 20 + .../impl/src/main/test/GeoConfigTest.java | 68 + .../devicemanager/impl/src/main/test/ResTest.java | 61 + .../src/main/test/TestFileChangeNotification.java | 132 + .../mwtn/base/database/DBPluginExtractTest.java | 14 + .../impl/src/main/yang/devicemanager-impl.yang | 64 + .../code-Carbon-SR1/apps/devicemanager/pom.xml | 55 + .../code-Carbon-SR1/apps/devicemodel/pom.xml | 50 + ...CoreFoundationModule-StateModel@2016-08-09.yang | 99 + ...e-SuperClassesAndCommonPackages@2016-07-10.yang | 145 + ...oundationModule-TypeDefinitions@2016-07-01.yang | 58 + ...CoreNetworkModule-ObjectClasses@2016-08-11.yang | 313 + ...reNetworkModule-TypeDefinitions@2016-07-10.yang | 106 + ...874_1_model-Imported_Data_Types@2016-07-10.yang | 43 + ...nformation_Object_Classes-Q_822@2016-08-11.yang | 62 + ...nformation_Object_Classes-X_721@2016-07-10.yang | 42 + ...nformation_Object_Classes-X_739@2016-07-10.yang | 49 + .../G_874_1_model-Object_Classes@2016-07-10.yang | 50 + .../G_874_1_model-Type_Definitions@2016-07-10.yang | 306 + ...tworkElement-CurrentProblemList@2016-11-20.yang | 67 + .../MicrowaveModel-Notifications@2016-08-09.yang | 113 + ...odel-ObjectClasses-AirInterface@2016-09-01.yang | 521 + ...ctClasses-AirInterfaceDiversity@2016-09-02.yang | 158 + ...ObjectClasses-EthernetContainer@2016-09-02.yang | 246 + ...ObjectClasses-HybridMwStructure@2016-09-02.yang | 162 + ...ctClasses-PureEthernetStructure@2016-09-02.yang | 144 + ...odel-ObjectClasses-SuperClasses@2016-08-09.yang | 45 + ...odel-ObjectClasses-TdmContainer@2016-09-02.yang | 150 + .../MicrowaveModel-TypeDefinitions@2016-09-02.yang | 748 + .../src/main/yang/NetworkElement@2016-02-03.yang | 65 + .../yang/bbf-tr-196-2-0-3-full@2018-04-08.yang | 17194 +++++++++++++++++++ .../src/main/yang/core-model@2017-03-20.yang | 1700 ++ .../src/main/yang/g.874.1-model@2017-03-20.yang | 646 + .../src/main/yang/ietf-ptp-dataset@2017-02-08.yang | 605 + .../main/yang/ltp-path@2017-05-26.yang.wronghere | 138 + .../src/main/yang/microwave-model@2017-03-24.yang | 2262 +++ ...core-model-conditional-packages@2017-04-02.yang | 350 + ...core-model-conditional-packages@2018-04-08.yang | 472 + ...f-ethernet-conditional-packages@2017-04-02.yang | 88 + ...nf-otn-odu-conditional-packages@2017-10-20.yang | 361 + .../src/main/yang/onf-ptp-dataset@2017-05-08.yang | 125 + .../code-Carbon-SR1/apps/dlux/.gitignore | 42 + .../code-Carbon-SR1/apps/dlux/.gitreview | 5 + .../code-Carbon-SR1/apps/dlux/LICENSE | 70 + .../code-Carbon-SR1/apps/dlux/README.md | 51 + ...stribution-karaf-0.6.1-Carbon.dluxloader.tar.gz | Bin 0 -> 2194623 bytes .../code-Carbon-SR1/apps/dlux/dlux-web/.bowerrc | 5 + .../apps/dlux/dlux-web/Gruntfile.js | 725 + .../code-Carbon-SR1/apps/dlux/dlux-web/README.md | 53 + .../code-Carbon-SR1/apps/dlux/dlux-web/bower.json | 58 + .../apps/dlux/dlux-web/bower.json.1.6.5 | 59 + .../apps/dlux/dlux-web/bower.json.1.6.5.2 | 58 + .../apps/dlux/dlux-web/bower.json.orig | 58 + .../apps/dlux/dlux-web/build.config.js | 134 + .../code-Carbon-SR1/apps/dlux/dlux-web/clean | 7 + .../apps/dlux/dlux-web/config/development.json | 6 + .../apps/dlux/dlux-web/config/env.module.js | 37 + .../apps/dlux/dlux-web/config/production.json | 7 + .../apps/dlux/dlux-web/karma/karma-unit.tpl.js | 63 + .../apps/dlux/dlux-web/module.prefix | 1 + .../apps/dlux/dlux-web/module.suffix | 1 + .../code-Carbon-SR1/apps/dlux/dlux-web/optimize.js | 30 + .../apps/dlux/dlux-web/package.json | 67 + .../code-Carbon-SR1/apps/dlux/dlux-web/pom.xml | 211 + .../apps/dlux/dlux-web/src/README.md | 51 + .../apps/dlux/dlux-web/src/app/LICENSE | 208 + .../apps/dlux/dlux-web/src/app/README.md | 51 + .../apps/dlux/dlux-web/src/app/app.controller.js | 23 + .../apps/dlux/dlux-web/src/app/app.module.js | 124 + .../apps/dlux/dlux-web/src/app/core/core.module.js | 10 + .../dlux/dlux-web/src/app/core/core.services.js | 181 + .../apps/dlux/dlux-web/src/app/core/core.spec.js | 89 + .../apps/dlux/dlux-web/src/app/routingConfig.js | 103 + .../apps/dlux/dlux-web/src/common/LICENSE | 208 + .../apps/dlux/dlux-web/src/common/README.md | 51 + .../src/common/authentification/auth.module.js | 19 + .../src/common/authentification/auth.services.js | 199 + .../src/common/authentification/auth.spec.js | 111 + .../dlux/dlux-web/src/common/config/env.module.js | 37 + .../common/general/common.general.directives.js | 43 + .../src/common/general/common.general.filters.js | 15 + .../src/common/general/common.general.module.js | 5 + .../src/common/general/common.general.services.js | 63 + .../common/general/common.navigation.directives.js | 232 + .../src/common/general/common.navigation.module.js | 6 + .../src/common/general/finishRender.module.js | 24 + .../dlux/dlux-web/src/common/layout/index.tpl.html | 17 + .../dlux-web/src/common/layout/layout.module.js | 44 + .../src/common/login/forgot_password.tpl.html | 45 + .../dlux-web/src/common/login/login.controller.js | 67 + .../apps/dlux/dlux-web/src/common/login/login.less | 193 + .../dlux/dlux-web/src/common/login/login.module.js | 56 + .../dlux/dlux-web/src/common/login/login.spec.js | 61 + .../dlux/dlux-web/src/common/login/login.tpl.html | 31 + .../dlux-web/src/common/login/register.tpl.html | 74 + .../common/navigation/nav_item_template.tpl.html | 14 + .../src/common/navigation/navigation-min.less | 225 + .../src/common/navigation/navigation.controller.js | 40 + .../dlux-web/src/common/navigation/navigation.less | 19 + .../src/common/navigation/navigation.module.js | 20 + .../src/common/navigation/navigation.services.js | 14 + .../src/common/navigation/navigation.spec.js | 103 + .../src/common/navigation/navigation.tpl.html | 6 + .../dlux-web/src/common/topbar/messages.tpl.html | 28 + .../src/common/topbar/notifications.tpl.html | 25 + .../dlux/dlux-web/src/common/topbar/tasks.tpl.html | 32 + .../src/common/topbar/topbar.controller.js | 54 + .../src/common/topbar/topbar.directives.js | 40 + .../dlux/dlux-web/src/common/topbar/topbar.less | 40 + .../dlux-web/src/common/topbar/topbar.module.js | 11 + .../dlux-web/src/common/topbar/topbar.services.js | 103 + .../dlux-web/src/common/topbar/topbar.tpl.html | 25 + .../dlux-web/src/common/topbar/user_menu.tpl.html | 1 + .../apps/dlux/dlux-web/src/index.html | 43 + .../apps/dlux/dlux-web/src/less/design.less | 190 + .../apps/dlux/dlux-web/src/less/main.less | 133 + .../apps/dlux/dlux-web/src/less/mixins.less | 37 + .../apps/dlux/dlux-web/src/less/other.less | 209 + .../apps/dlux/dlux-web/src/less/variables.less | 442 + .../code-Carbon-SR1/apps/dlux/dlux-web/src/main.js | 96 + .../apps/dlux/dlux-web/src/test-main.js | 99 + .../apps/dlux/loader/impl/README.md | 11 + .../code-Carbon-SR1/apps/dlux/loader/impl/pom.xml | 198 + .../dlux/loader/exception/DluxLoaderException.java | 20 + .../dlux/loader/implementation/DluxLoader.java | 71 + .../implementation/DluxLoaderIndexServlet.java | 184 + .../src/main/resources/CommonAppModules.properties | 5 + .../resources/OSGI-INF/blueprint/blueprint.xml | 10 + .../dlux/loader/DluxLoaderIndexServletTest.java | 67 + .../code-Carbon-SR1/apps/dlux/pom.xml | 62 + .../apps/helpServer/features/pom.xml | 24 + .../features/src/main/features/features.xml | 11 + .../code-Carbon-SR1/apps/helpServer/impl/pom.xml | 59 + .../technologies/helpserver/HelpServlet.java | 275 + .../technologies/helpserver/data/Environment.java | 24 + .../helpserver/data/ExtactBundleResource.java | 95 + .../helpserver/data/HelpInfrastructureObject.java | 184 + .../helpServer/impl/src/main/resources/.gitignore | 1 + .../resources/OSGI-INF/blueprint/blueprint.xml | 16 + .../helpServer/impl/src/main/test/SimpleTests.java | 153 + .../impl/src/test/resources/log4j.properties | 12 + .../code-Carbon-SR1/apps/helpServer/pom.xml | 93 + .../code-Carbon-SR1/apps/info/features/pom.xml | 28 + .../info/features/src/main/features/features.xml | 12 + .../code-Carbon-SR1/apps/info/impl/pom.xml | 53 + .../highstreet/technologies/info/InfoServlet.java | 430 + .../highstreet/technologies/info/KarafBundle.java | 46 + .../technologies/info/KarafBundleList.java | 63 + .../resources/OSGI-INF/blueprint/blueprint.xml | 17 + .../src/main/resources/html/css/bootstrap.min.css | 7 + .../main/resources/html/css/bootstrap.min.css.map | 1 + .../info/impl/src/main/resources/html/index.html | 73 + .../info/impl/src/main/resources/html/js/app.js | 124 + .../src/main/resources/html/js/bootstrap.min.js | 7 + .../main/resources/html/js/bootstrap.min.js.map | 1 + .../src/main/resources/html/js/jquery-3.3.1.min.js | 2 + .../impl/src/main/resources/html/js/popper.min.js | 5 + .../apps/info/impl/src/main/test/SimpleTests.java | 111 + .../info/impl/src/test/java/BundleListTest.java | 11 + .../info/impl/src/test/java/CompressionTest.java | 84 + .../info/impl/src/test/resources/log4j.properties | 12 + .../code-Carbon-SR1/apps/info/pom.xml | 113 + .../code-Carbon-SR1/apps/pom.xml | 35 + .../code-Carbon-SR1/apps/route/api/pom.xml | 31 + .../api/src/main/yang/ltp-path@2017-05-26.yang | 138 + .../apps/route/api/src/main/yang/route.yang | 94 + .../api/src/main/yang/threshold@2017-06-15.yang | 50 + .../code-Carbon-SR1/apps/route/features/pom.xml | 121 + .../route/features/src/main/features/features.xml | 31 + .../code-Carbon-SR1/apps/route/impl/pom.xml | 68 + .../technologies/odl/app/impl/PathHolder.java | 54 + .../technologies/odl/app/impl/RouteProvider.java | 59 + .../technologies/odl/app/impl/RouteRPC.java | 195 + .../technologies/odl/app/impl/delegates/FC.java | 40 + .../odl/app/impl/delegates/LtpInOdlCreator.java | 38 + .../technologies/odl/app/impl/delegates/Path.java | 28 + .../odl/app/impl/delegates/PathDelegate.java | 100 + .../odl/app/impl/delegates/PredefinePath.java | 26 + .../odl/app/impl/listener/ACMListener.java | 121 + .../odl/app/impl/tools/BandwidthCalculator.java | 42 + .../odl/app/impl/tools/DataBrokerHolder.java | 28 + .../odl/app/impl/tools/FC2Executor.java | 23 + .../technologies/odl/app/impl/tools/JsonUtil.java | 65 + .../app/impl/tools/MountPointServiceHolder.java | 54 + .../odl/app/impl/tools/NeExecutor.java | 370 + .../technologies/odl/app/impl/tools/RPCHolder.java | 18 + .../technologies/odl/app/impl/tools/Unit.java | 36 + .../org/opendaylight/blueprint/impl-blueprint.xml | 28 + .../route/impl/src/main/resources/topology.json | 136 + .../route/TestBandwidthCalculator.java | 30 + .../test/java/org/opendaylight/route/TestJson.java | 38 + .../code-Carbon-SR1/apps/route/pom.xml | 110 + .../apps/websocketmanager/api/pom.xml | 23 + .../api/src/main/yang/websocketmanager.yang | 38 + .../apps/websocketmanager/impl/pom.xml | 90 + .../impl/src/main/config/default-config.xml | 31 + .../org/opendaylight/mwtn/impl/WebsocketImpl.java | 83 + .../mwtn/impl/WebsocketmanagerProvider.java | 155 + .../org/opendaylight/mwtn/impl/dto/UserDto.java | 70 + .../opendaylight/mwtn/impl/utils/AkkaConfig.java | 144 + .../org/opendaylight/mwtn/impl/utils/Utils.java | 31 + .../mwtn/impl/websocket/SyncWebSocketClient.java | 77 + .../impl/websocket/WebSocketServerHandler.java | 238 + .../impl/websocket/WebSocketServerInitializer.java | 25 + .../impl/rev141210/WebsocketmanagerModule.java | 39 + .../rev141210/WebsocketmanagerModuleFactory.java | 13 + .../impl/src/main/test/AkkaConfigTest.java | 22 + .../impl/src/main/test/WebsocketClientTest.java | 29 + .../impl/src/main/yang/websocketmanager-impl.yang | 38 + .../code-Carbon-SR1/apps/websocketmanager/pom.xml | 50 + .../docs/README2CreateApp4Carbon.md | 292 + .../code-Carbon-SR1/docs/README2CreateTarBundle.md | 124 + .../docs/READMEInstallDevelopmentEnvironment.md | 133 + ...InstallDevelopmentEnvironment_1_eclipseinst.png | Bin 0 -> 81116 bytes ...InstallDevelopmentEnvironment_2_secureStore.png | Bin 0 -> 106808 bytes .../docs/READMEMigrateBoronSR1-2-SR3.md | 86 + .../docs/READMEOperateAndDebugODL.md | 63 + .../code-Carbon-SR1/docs/dist.conf | 6 + .../code-Carbon-SR1/docs/installServiceExample.sh | 48 + .../code-Carbon-SR1/docs/software_architecture.png | Bin 0 -> 101495 bytes .../code-Carbon-SR1/features/pom.xml | 138 + .../features/src/main/features/features.xml | 131 + sdnr/wireless-transport/code-Carbon-SR1/odl | 925 + sdnr/wireless-transport/code-Carbon-SR1/pom.xml | 25 + .../ux/ethService/ethService-bundle/pom.xml | 118 + .../resources/OSGI-INF/blueprint/blueprint.xml | 19 + .../ux/ethService/ethService-module/pom.xml | 14 + .../resources/ethService/ethService-custom.css | 58 + .../resources/ethService/ethService.controller.js | 25 + .../main/resources/ethService/ethService.module.js | 56 + .../resources/ethService/ethService.services.js | 20 + .../main/resources/ethService/ethService.tpl.html | 9 + .../resources/ethService/images/ethService.png | Bin 0 -> 2270 bytes .../code-Carbon-SR1/ux/ethService/pom.xml | 23 + .../code-Carbon-SR1/ux/features/pom.xml | 65 + .../ux/features/src/main/features/features.xml | 231 + .../code-Carbon-SR1/ux/help/help-bundle/pom.xml | 89 + .../resources/OSGI-INF/blueprint/blueprint.xml | 19 + .../code-Carbon-SR1/ux/help/help-module/pom.xml | 14 + .../src/main/resources/help/help.controller.js | 284 + .../src/main/resources/help/help.controller.ts | 130 + .../src/main/resources/help/help.custom.css | 105 + .../src/main/resources/help/help.module.js | 33 + .../src/main/resources/help/help.module.ts | 35 + .../src/main/resources/help/help.service.ts | 92 + .../src/main/resources/help/help.tpl.html | 17 + .../src/main/resources/help/help.tree.html | 0 .../src/main/resources/help/help.tree.ts | 55 + .../src/main/resources/help/help.utilities.ts | 63 + .../src/main/resources/help/images/help.png | Bin 0 -> 2121 bytes .../src/main/resources/help/lib/marked.d.ts | 284 + .../src/main/resources/help/lib/marked.js | 1320 ++ .../code-Carbon-SR1/ux/help/pom.xml | 24 + .../ux/mwtnBrowser/mwtnBrowser-bundle/pom.xml | 89 + .../resources/OSGI-INF/blueprint/blueprint.xml | 19 + .../ux/mwtnBrowser/mwtnBrowser-module/pom.xml | 14 + .../resources/mwtnBrowser/images/mwtnBrowser.png | Bin 0 -> 2838 bytes .../resources/mwtnBrowser/images/mwtnConfig.png | Bin 0 -> 2838 bytes .../resources/mwtnBrowser/mwtnBrowser-custom.css | 24 + .../mwtnBrowser/mwtnBrowser.controller.js | 1090 ++ .../resources/mwtnBrowser/mwtnBrowser.module.js | 53 + .../resources/mwtnBrowser/mwtnBrowser.services.js | 37 + .../resources/mwtnBrowser/templates/frame.tpl.html | 191 + .../templates/mwtnPtpClockViewer.tpl.html | 66 + .../mwtnBrowser/templates/mwtnPtpPorts.tpl.html | 23 + .../templates/ptpDefaultDsConfigView.tpl.html | 45 + .../templates/ptpPortConfigView.tpl.html | 53 + .../code-Carbon-SR1/ux/mwtnBrowser/pom.xml | 22 + .../mwtnClosedLoop/mwtnClosedLoop-bundle/pom.xml | 118 + .../resources/OSGI-INF/blueprint/blueprint.xml | 19 + .../mwtnClosedLoop/mwtnClosedLoop-module/pom.xml | 15 + .../mwtnClosedLoop/images/mwtnClosedLoop.png | Bin 0 -> 3524 bytes .../mwtnClosedLoop/mwtnClosedLoop-custom.css | 26 + .../mwtnClosedLoop/mwtnClosedLoop.controller.js | 160 + .../mwtnClosedLoop/mwtnClosedLoop.module.js | 51 + .../mwtnClosedLoop/mwtnClosedLoop.services.js | 74 + .../mwtnClosedLoop/mwtnClosedLoop.tpl.html | 64 + .../code-Carbon-SR1/ux/mwtnClosedLoop/pom.xml | 24 + .../ux/mwtnCommons/mwtnCommons-bundle/pom.xml | 117 + .../resources/OSGI-INF/blueprint/blueprint.xml | 23 + .../ux/mwtnCommons/mwtnCommons-module/pom.xml | 69 + .../src/main/resources/mwtnCommons/README.md | 34 + .../src/main/resources/mwtnCommons/bower.json | 39 + .../src/main/resources/mwtnCommons/bowerInstall.sh | 18 + .../angular-chart.js.patch | 400 + .../resources/mwtnCommons/locale/locale-en_US.json | 924 + .../resources/mwtnCommons/mwtnCommons-custom.css | 108 + .../mwtnCommons/mwtnCommons.controller.js | 25 + .../resources/mwtnCommons/mwtnCommons.module.js | 622 + .../resources/mwtnCommons/mwtnCommons.services.js | 3826 +++++ .../resources/mwtnCommons/mwtnCommons.tpl.html | 7 + .../mwtnCommons/templates/mwtnFooter.tpl.html | 4 + .../mwtnCommons/templates/mwtnGrid.tpl.html | 23 + .../mwtnCommons/templates/mwtnJsonViewer.tpl.html | 110 + .../templates/mwtnSelectNetworkElement.tpl.html | 33 + .../mwtnCommons/templates/openConfigView.html | 69 + .../mwtnCommons/templates/showGridCellDetail.html | 54 + .../src/main/resources/mwtnCommons/xml2json.js | 567 + .../code-Carbon-SR1/ux/mwtnCommons/pom.xml | 26 + .../ux/mwtnCompare/mwtnCompare-bundle/pom.xml | 118 + .../resources/OSGI-INF/blueprint/blueprint.xml | 19 + .../ux/mwtnCompare/mwtnCompare-module/pom.xml | 15 + .../resources/mwtnCompare/images/mwtnCompare.png | Bin 0 -> 3342 bytes .../resources/mwtnCompare/mwtnCompare-custom.css | 36 + .../mwtnCompare/mwtnCompare.controller.js | 526 + .../mwtnCompare/mwtnCompare.directives.js | 21 + .../resources/mwtnCompare/mwtnCompare.module.js | 50 + .../resources/mwtnCompare/mwtnCompare.services.js | 26 + .../resources/mwtnCompare/mwtnCompare.tpl.html | 333 + .../mwtnCompare/templates/compare.tpl.html | 12 + .../code-Carbon-SR1/ux/mwtnCompare/pom.xml | 24 + .../ux/mwtnConnect/mwtnConnect-bundle/pom.xml | 118 + .../resources/OSGI-INF/blueprint/blueprint.xml | 20 + .../ux/mwtnConnect/mwtnConnect-module/pom.xml | 14 + .../resources/mwtnConnect/images/mwtnConnect.png | Bin 0 -> 2271 bytes .../resources/mwtnConnect/images/sdncConnect.png | Bin 0 -> 11379 bytes .../resources/mwtnConnect/mwtnConnect-custom.css | 85 + .../mwtnConnect/mwtnConnect.controller.js | 1143 ++ .../resources/mwtnConnect/mwtnConnect.module.js | 56 + .../resources/mwtnConnect/mwtnConnect.services.js | 75 + .../resources/mwtnConnect/mwtnConnect.tpl.html | 150 + .../mwtnConnect/templates/addToRequired.tpl.html | 79 + .../mwtnConnect/templates/confirmDelete.tpl.html | 23 + .../mwtnConnect/templates/confirmHide.tpl.html | 21 + .../templates/mountPointDetails.tpl.html | 125 + .../code-Carbon-SR1/ux/mwtnConnect/pom.xml | 24 + .../ux/mwtnEvents/mwtnEvents-bundle/pom.xml | 115 + .../resources/OSGI-INF/blueprint/blueprint.xml | 19 + .../ux/mwtnEvents/mwtnEvents-module/pom.xml | 15 + .../resources/mwtnEvents/images/mwtnEvents.png | Bin 0 -> 2224 bytes .../resources/mwtnEvents/mwtnEvents-custom.css | 12 + .../resources/mwtnEvents/mwtnEvents.controller.js | 153 + .../main/resources/mwtnEvents/mwtnEvents.module.js | 53 + .../resources/mwtnEvents/mwtnEvents.services.js | 22 + .../main/resources/mwtnEvents/mwtnEvents.tpl.html | 45 + .../src/main/resources/mwtnEvents/xml2json.js | 567 + .../code-Carbon-SR1/ux/mwtnEvents/pom.xml | 27 + .../ux/mwtnFault/mwtnFault-bundle/pom.xml | 115 + .../resources/OSGI-INF/blueprint/blueprint.xml | 19 + .../ux/mwtnFault/mwtnFault-module/pom.xml | 15 + .../main/resources/mwtnFault/images/mwtnFault.png | Bin 0 -> 2048 bytes .../main/resources/mwtnFault/mwtnFault-custom.css | 100 + .../resources/mwtnFault/mwtnFault.controller.js | 597 + .../resources/mwtnFault/mwtnFault.directives.js | 163 + .../main/resources/mwtnFault/mwtnFault.module.js | 56 + .../main/resources/mwtnFault/mwtnFault.services.js | 100 + .../main/resources/mwtnFault/mwtnFault.tpl.html | 119 + .../mwtnFault/templates/alarmStatus.tpl.html | 21 + .../templates/clearLogConfirmation.tpl.html | 17 + .../code-Carbon-SR1/ux/mwtnFault/pom.xml | 24 + .../ux/mwtnInventory/mwtnInventory-bundle/pom.xml | 115 + .../resources/OSGI-INF/blueprint/blueprint.xml | 19 + .../ux/mwtnInventory/mwtnInventory-module/pom.xml | 15 + .../mwtnInventory/components/equipment.html | 37 + .../mwtnInventory/components/equipment.ts | 28 + .../mwtnInventory/components/equipmentGroup.html | 5 + .../mwtnInventory/components/equipmentGroup.ts | 41 + .../mwtnInventory/images/mwtnInventory.png | Bin 0 -> 2627 bytes .../resources/mwtnInventory/models/equipment.ts | 6 + .../mwtnInventory/mwtnInventory-custom.css | 31 + .../mwtnInventory/mwtnInventory.controller.js | 372 + .../mwtnInventory/mwtnInventory.controller.ts | 116 + .../mwtnInventory/mwtnInventory.module.js | 33 + .../mwtnInventory/mwtnInventory.module.ts | 36 + .../mwtnInventory/mwtnInventory.service.ts | 144 + .../mwtnInventory/mwtnInventory.services.js | 100 + .../resources/mwtnInventory/mwtnInventory.tpl.html | 16 + .../src/main/resources/mwtnInventory/templates/_ | 0 .../templates/accordeonHeader.tpl.html | 13 + .../code-Carbon-SR1/ux/mwtnInventory/pom.xml | 24 + .../ux/mwtnLog/mwtnLog-bundle/pom.xml | 115 + .../resources/OSGI-INF/blueprint/blueprint.xml | 19 + .../ux/mwtnLog/mwtnLog-module/pom.xml | 14 + .../src/main/resources/mwtnLog/images/mwtnLog.png | Bin 0 -> 2261 bytes .../src/main/resources/mwtnLog/mwtnLog-custom.css | 58 + .../main/resources/mwtnLog/mwtnLog.controller.js | 151 + .../src/main/resources/mwtnLog/mwtnLog.module.js | 56 + .../src/main/resources/mwtnLog/mwtnLog.services.js | 40 + .../src/main/resources/mwtnLog/mwtnLog.tpl.html | 26 + .../templates/clearLogConfirmation.tpl.html | 12 + .../code-Carbon-SR1/ux/mwtnLog/pom.xml | 24 + .../ux/mwtnMediator/mwtnMediator-bundle/pom.xml | 89 + .../resources/OSGI-INF/blueprint/blueprint.xml | 19 + .../ux/mwtnMediator/mwtnMediator-module/pom.xml | 14 + .../main/resources/mwtnMediator/class.mediator.js | 569 + .../resources/mwtnMediator/images/mwtnMediator.png | Bin 0 -> 2923 bytes .../resources/mwtnMediator/mwtnMediator-custom.css | 69 + .../mwtnMediator/mwtnMediator.controller.js | 613 + .../resources/mwtnMediator/mwtnMediator.module.js | 54 + .../mwtnMediator/mwtnMediator.services.js | 113 + .../mwtnMediator/templates/frame.tpl.html | 49 + .../templates/mediatorCreateNew.tpl.html | 99 + .../templates/mediatorDetails.tpl.html | 96 + .../templates/mediatorServerConfigCtrl.tpl.html | 41 + .../code-Carbon-SR1/ux/mwtnMediator/pom.xml | 24 + .../mwtnPerformanceCurrent-bundle/pom.xml | 89 + .../resources/OSGI-INF/blueprint/blueprint.xml | 19 + .../mwtnPerformanceCurrent-module/pom.xml | 14 + .../images/mwtnPerformance.png | Bin 0 -> 2974 bytes .../mwtnPerformanceCurrent-custom.css | 13 + .../mwtnPerformanceCurrent.controller.js | 741 + .../mwtnPerformanceCurrent.module.js | 55 + .../mwtnPerformanceCurrent.services.js | 30 + .../mwtnPerformanceCurrent.tpl.html | 119 + .../ux/mwtnPerformanceCurrent/pom.xml | 24 + .../mwtnPerformanceHistory-bundle/pom.xml | 89 + .../resources/OSGI-INF/blueprint/blueprint.xml | 19 + .../mwtnPerformanceHistory-module/pom.xml | 14 + .../images/mwtnPerformance.png | Bin 0 -> 2974 bytes .../mwtnPerformanceHistory-custom.css | 13 + .../mwtnPerformanceHistory.controller.js | 1196 ++ .../mwtnPerformanceHistory.module.js | 55 + .../mwtnPerformanceHistory.services.js | 54 + .../mwtnPerformanceHistory.tpl.html | 127 + .../ux/mwtnPerformanceHistory/pom.xml | 24 + .../mwtnPerformanceLink-bundle/pom.xml | 89 + .../resources/OSGI-INF/blueprint/blueprint.xml | 19 + .../mwtnPerformanceLink-module/pom.xml | 14 + .../mwtnPerformanceLink/images/mwtnPerformance.png | Bin 0 -> 2974 bytes .../mwtnPerformanceLink-custom.css | 17 + .../mwtnPerformanceLink.controller.js | 3346 ++++ .../mwtnPerformanceLink.module.js | 55 + .../mwtnPerformanceLink.services.js | 68 + .../mwtnPerformanceLink.tpl.html | 487 + .../code-Carbon-SR1/ux/mwtnPerformanceLink/pom.xml | 24 + .../ux/mwtnSpectrum/mwtnSpectrum-bundle/pom.xml | 119 + .../resources/OSGI-INF/blueprint/blueprint.xml | 19 + .../ux/mwtnSpectrum/mwtnSpectrum-module/pom.xml | 15 + .../resources/mwtnSpectrum/images/bluelight.gif | Bin 0 -> 61554 bytes .../resources/mwtnSpectrum/images/mwtnSpectrum.png | Bin 0 -> 3229 bytes .../resources/mwtnSpectrum/mwtnSpectrum-custom.css | 45 + .../mwtnSpectrum/mwtnSpectrum.controller.js | 135 + .../resources/mwtnSpectrum/mwtnSpectrum.module.js | 54 + .../mwtnSpectrum/mwtnSpectrum.services.js | 90 + .../resources/mwtnSpectrum/mwtnSpectrum.tpl.html | 64 + .../code-Carbon-SR1/ux/mwtnSpectrum/pom.xml | 24 + .../ux/mwtnTdm/mwtnTdm-bundle/pom.xml | 89 + .../resources/OSGI-INF/blueprint/blueprint.xml | 19 + .../ux/mwtnTdm/mwtnTdm-module/pom.xml | 14 + .../src/main/resources/mwtnTdm/images/mwtnTdm.png | Bin 0 -> 2861 bytes .../src/main/resources/mwtnTdm/mwtnTdm-custom.css | 11 + .../main/resources/mwtnTdm/mwtnTdm.controller.js | 159 + .../src/main/resources/mwtnTdm/mwtnTdm.module.js | 53 + .../src/main/resources/mwtnTdm/mwtnTdm.services.js | 31 + .../resources/mwtnTdm/templates/frame.tpl.html | 52 + .../code-Carbon-SR1/ux/mwtnTdm/pom.xml | 24 + .../ux/mwtnTest/mwtnTest-bundle/pom.xml | 89 + .../resources/OSGI-INF/blueprint/blueprint.xml | 19 + .../ux/mwtnTest/mwtnTest-module/pom.xml | 14 + .../main/resources/mwtnTest/images/mwtnTest.png | Bin 0 -> 2868 bytes .../main/resources/mwtnTest/mwtnTest-custom.css | 24 + .../main/resources/mwtnTest/mwtnTest.controller.js | 477 + .../src/main/resources/mwtnTest/mwtnTest.module.js | 53 + .../main/resources/mwtnTest/mwtnTest.services.js | 32 + .../resources/mwtnTest/templates/frame.tpl.html | 172 + .../code-Carbon-SR1/ux/mwtnTest/pom.xml | 24 + .../ux/mwtnTopology/mwtnTopology-bundle/pom.xml | 117 + .../resources/OSGI-INF/blueprint/blueprint.xml | 19 + .../ux/mwtnTopology/mwtnTopology-module/pom.xml | 14 + .../mwtnTopology/doc/mwtnTopology.builinfo.md | 39 + .../resources/mwtnTopology/doc/mwtnTopology.fs.md | 78 + .../resources/mwtnTopology/images/mwtnTopology.png | Bin 0 -> 3447 bytes .../resources/mwtnTopology/mwtnTopology-custom.css | 102 + .../mwtnTopology/mwtnTopology.controller.js | 4877 ++++++ .../resources/mwtnTopology/mwtnTopology.module.js | 57 + .../main/resources/mwtnTopology/mwtnTopology.rest | 209 + .../mwtnTopology/mwtnTopology.services.js | 1020 ++ .../templates/accordeonHeader.tpl.html | 13 + .../mwtnTopology/templates/clocksGrid.tpl.html | 1 + .../templates/ethConnectionsGrid.tpl.html | 1 + .../mwtnTopology/templates/ethernetView.tpl.html | 18 + .../mwtnTopology/templates/frame.tpl.html | 34 + .../mwtnTopology/templates/ieee1588View.tpl.html | 18 + .../mwtnTopology/templates/linkDetails.tpl.html | 110 + .../mwtnTopology/templates/links.tpl.html | 2 + .../mwtnTopology/templates/linksGrid.tpl.html | 1 + .../resources/mwtnTopology/templates/maps.tpl.html | 59 + .../templates/networkElementsGrid.tpl.html | 1 + .../mwtnTopology/templates/nodes.tpl.html | 2 + .../mwtnTopology/templates/physicalView.tpl.html | 18 + .../mwtnTopology/templates/portsGrid.tpl.html | 1 + .../mwtnTopology/templates/ptpLinksGrid.tpl.html | 1 + .../mwtnTopology/templates/siteDetails.tpl.html | 77 + .../mwtnTopology/templates/siteGrid.tpl.html | 9 + .../mwtnTopology/templates/siteLinkGrid.tpl.html | 8 + .../mwtnTopology/templates/sitePathGrid.tpl.html | 1 + .../mwtnTopology/templates/siteView.tpl.html | 31 + .../mwtnTopology/templates/topology.tpl.html | 2 + .../code-Carbon-SR1/ux/mwtnTopology/pom.xml | 27 + .../ux/odlChat/odlChat-bundle/pom.xml | 116 + .../resources/OSGI-INF/blueprint/blueprint.xml | 19 + .../ux/odlChat/odlChat-module/pom.xml | 14 + .../src/main/resources/odlChat/logo_chat.gif | Bin 0 -> 2046 bytes .../src/main/resources/odlChat/odlChat-custom.css | 3 + .../main/resources/odlChat/odlChat.controller.js | 69 + .../src/main/resources/odlChat/odlChat.module.js | 50 + .../src/main/resources/odlChat/odlChat.png | Bin 0 -> 1862 bytes .../src/main/resources/odlChat/odlChat.services.js | 103 + .../src/main/resources/odlChat/odlChat.tpl.html | 102 + .../code-Carbon-SR1/ux/odlChat/pom.xml | 27 + .../ux/onapAai/onapAai-bundle/pom.xml | 115 + .../resources/OSGI-INF/blueprint/blueprint.xml | 19 + .../ux/onapAai/onapAai-module/pom.xml | 14 + .../src/main/resources/onapAai/images/onapAai.png | Bin 0 -> 12931 bytes .../src/main/resources/onapAai/onapAai-custom.css | 58 + .../main/resources/onapAai/onapAai.controller.js | 49 + .../src/main/resources/onapAai/onapAai.module.js | 56 + .../src/main/resources/onapAai/onapAai.services.js | 162 + .../src/main/resources/onapAai/onapAai.tpl.html | 12 + .../code-Carbon-SR1/ux/onapAai/pom.xml | 24 + .../ux/onapDcae/onapDcae-bundle/pom.xml | 115 + .../resources/OSGI-INF/blueprint/blueprint.xml | 19 + .../ux/onapDcae/onapDcae-module/pom.xml | 14 + .../onapDcae/images/onap-5g-architecture.png | Bin 0 -> 106656 bytes .../main/resources/onapDcae/images/onapDcae.png | Bin 0 -> 14200 bytes .../main/resources/onapDcae/onapDcae-custom.css | 58 + .../main/resources/onapDcae/onapDcae.controller.js | 23 + .../src/main/resources/onapDcae/onapDcae.module.js | 56 + .../main/resources/onapDcae/onapDcae.services.js | 20 + .../src/main/resources/onapDcae/onapDcae.tpl.html | 13 + .../code-Carbon-SR1/ux/onapDcae/pom.xml | 24 + .../ux/onapSo/onapSo-bundle/pom.xml | 115 + .../resources/OSGI-INF/blueprint/blueprint.xml | 19 + .../ux/onapSo/onapSo-module/pom.xml | 14 + .../onapSo/images/onap-end-to-end-slicing.png | Bin 0 -> 115927 bytes .../src/main/resources/onapSo/images/onapSo.png | Bin 0 -> 12003 bytes .../src/main/resources/onapSo/onapSo-custom.css | 78 + .../src/main/resources/onapSo/onapSo.controller.js | 84 + .../src/main/resources/onapSo/onapSo.module.js | 56 + .../src/main/resources/onapSo/onapSo.services.js | 162 + .../src/main/resources/onapSo/onapSo.tpl.html | 103 + .../code-Carbon-SR1/ux/onapSo/pom.xml | 24 + .../ux/otnBrowser/otnBrowser-bundle/pom.xml | 115 + .../resources/OSGI-INF/blueprint/blueprint.xml | 19 + .../ux/otnBrowser/otnBrowser-module/pom.xml | 14 + .../resources/otnBrowser/images/otnBrowser.png | Bin 0 -> 2938 bytes .../resources/otnBrowser/otnBrowser-custom.css | 58 + .../resources/otnBrowser/otnBrowser.controller.js | 25 + .../main/resources/otnBrowser/otnBrowser.module.js | 56 + .../resources/otnBrowser/otnBrowser.services.js | 20 + .../main/resources/otnBrowser/otnBrowser.tpl.html | 9 + .../code-Carbon-SR1/ux/otnBrowser/pom.xml | 24 + sdnr/wireless-transport/code-Carbon-SR1/ux/pom.xml | 139 + .../code-Carbon-SR1/ux/security/pom.xml | 28 + .../ux/security/security-bundle/pom.xml | 80 + .../resources/OSGI-INF/blueprint/blueprint.xml | 19 + .../ux/security/security-module/pom.xml | 18 + .../src/main/resources/security/build.config.js | 42 + .../src/main/resources/security/gulpfile.js | 142 + .../src/main/resources/security/package.json | 29 + .../resources/security/src/security.controller.js | 149 + .../resources/security/src/security.controller.ts | 63 + .../resources/security/src/security.custom.css | 11 + .../main/resources/security/src/security.module.js | 33 + .../main/resources/security/src/security.module.ts | 36 + .../resources/security/src/security.service.ts | 99 + .../main/resources/security/src/security.tpl.html | 50 + .../security/src/templates/userDetails.html | 14 + .../code-Carbon-SR1/ux/ux-dev.sh | 103 + 737 files changed, 140696 insertions(+), 8 deletions(-) create mode 100644 .gitignore mode change 100755 => 100644 README.md create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/README.md create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/apigateway/features/.gitignore create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/apigateway/features/pom.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/apigateway/features/src/main/features/features.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/apigateway/impl/pom.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/apigateway/impl/src/main/java/com/highstreet/technologies/apigateway/AaiServlet.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/apigateway/impl/src/main/java/com/highstreet/technologies/apigateway/EsServlet.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/apigateway/impl/src/main/java/com/highstreet/technologies/apigateway/MSServlet.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/apigateway/impl/src/main/java/com/highstreet/technologies/apigateway/MyProperties.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/apigateway/impl/src/main/resources/OSGI-INF/blueprint/blueprint.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/apigateway/impl/src/main/test/SimpleTests.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/apigateway/impl/src/test/resources/log4j.properties create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/apigateway/pom.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/commons/binding-parent/pom.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/commons/config-parent/pom.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/commons/configuration/pom.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/README.md create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/api/pom.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/api/src/main/java/org/opendaylight/mwtn/devicemanager/api/DeviceManagerService.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/api/src/main/yang/devicemanager-api.yang create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/pom.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/config/default-config.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/aaiConnector/impl/AaiProviderClient.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/aaiConnector/impl/AaiWebApiClient.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/database/EsObject.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/database/HtDataBase.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/database/HtDataBaseReaderAndWriter.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/database/HtDatabaseClientAbstract.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/database/HtDatabaseNode.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/database/HtDatabaseUpdateFile.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/database/HtDatabaseWebAPIClient.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/database/HtMapper.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/database/IndexClientBuilder.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/database/IsEsObject.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/database/JsonMapperBase.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/http/BaseHTTPClient.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/http/BaseHTTPResponse.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/internalTypes/Environment.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/internalTypes/FileWatchdog.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/internalTypes/IniConfigurationFile.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/internalTypes/InternalDateAndTime.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/internalTypes/InternalSeverity.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/internalTypes/InventoryInformation.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/internalTypes/Resources.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/internalTypes/TemplateFile.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/netconf/AllPm.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/netconf/Capabilities.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/netconf/ExtendedAirInterfaceHistoricalPerformanceType.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/netconf/ExtendedAirInterfaceHistoricalPerformanceType12.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/netconf/GenericTransactionUtils.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/netconf/InternGenericCurrentProblemType.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/netconf/LinkIdentifyingObject.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/netconf/NetconfTimeStamp.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/netconf/ONFCoreEmpty.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/netconf/ONFCoreInterfacePac.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/netconf/ONFCoreNetworkElement10.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/netconf/ONFCoreNetworkElement12.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/netconf/ONFCoreNetworkElementBase.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/netconf/ONFCoreNetworkElementFactory.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/netconf/ONFCoreNetworkElementRepresentation.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/netconf/ONFLayerProtocolName.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/config/impl/AaiClientPropertiesFile.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/config/impl/AaiConfig.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/config/impl/AkkaConfig.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/config/impl/BaseSubConfig.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/config/impl/DcaeConfig.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/config/impl/EsConfig.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/config/impl/GeoConfig.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/config/impl/HtDevicemanagerConfiguration.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/config/impl/HtLogger.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/config/impl/PmConfig.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/dcaeConnector/impl/DcaeMessages.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/dcaeConnector/impl/DcaeProviderClient.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/dcaeConnector/impl/DcaeProviderTask.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/dcaeConnector/impl/DcaeSender.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/dcaeConnector/impl/DcaeSenderImpl.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/dcaeConnector/test/DcaePrivateTester.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/dcaeConnector/test/DcaeTestClient.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/dcaeConnector/test/HttpsClient.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/deviceMonitor/impl/Checker.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/deviceMonitor/impl/DeviceMonitor.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/deviceMonitor/impl/DeviceMonitorImpl.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/deviceMonitor/impl/DeviceMonitorProblems.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/deviceMonitor/impl/DeviceMonitorSupport.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/deviceMonitor/impl/DeviceMonitorTask.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/devicemanager/impl/DeviceManagerImpl.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/devicemanager/impl/ProviderClient.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/devicemanager/impl/database/service/HtDatabaseEventsService.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/devicemanager/impl/database/types/EsEventBase.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/devicemanager/impl/database/types/EsFaultCurrent.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/devicemanager/impl/database/types/EsFaultLog.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/devicemanager/impl/database/types/EsVersionInfo.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/devicemanager/impl/listener/MicrowaveEventListener.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/devicemanager/impl/listener/MicrowaveEventListener12.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/devicemanager/impl/listener/NetconfChangeListener.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/devicemanager/impl/listener/ODLEventListener.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/devicemanager/impl/xml/AttributeValueChangedNotificationXml.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/devicemanager/impl/xml/GetEventType.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/devicemanager/impl/xml/MwtNotificationBase.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/devicemanager/impl/xml/ObjectCreationNotificationXml.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/devicemanager/impl/xml/ObjectDeletionNotificationXml.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/devicemanager/impl/xml/ProblemNotificationXml.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/devicemanager/impl/xml/WebSocketServiceClient.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/devicemanager/impl/xml/XmlMapper.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/index/impl/IndexConfigService.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/index/impl/IndexMwtnService.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/index/impl/IndexUpdateService.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/performancemanager/impl/PerformanceManagerImpl.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/performancemanager/impl/PerformanceManagerTask.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/performancemanager/impl/database/service/MicrowaveHistoricalPerformanceWriterService.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/performancemanager/impl/database/types/EsHistoricalPerformance15Minutes.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/performancemanager/impl/database/types/EsHistoricalPerformance24Hours.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/performancemanager/impl/database/types/EsHistoricalPerformanceBase.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/performancemanager/impl/database/types/EsHistoricalPerformanceLogEntry.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/performancemanager/impl/database/types/EsPerformanceData10.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/performancemanager/impl/database/types/EsPerformanceData12.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/ptp/impl/GeoLocation.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/ptp/impl/LogicalTerminationPoint.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/ptp/impl/Path.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/ptp/impl/PtpManagerImpl.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/devicemanager/impl/rev170317/DeviceManagerImplModule.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/devicemanager/impl/rev170317/DeviceManagerImplModuleFactory.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/aots/addreq.tmpl.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/aots/inqreq.tmpl.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/elasticsearch/elasticsearch.yml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/elasticsearch/index/config/opendaylight.json create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/elasticsearch/index/mwtn/modelDescription/CoreModel-ForMicrowave.json create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/elasticsearch/index/mwtn/modelDescription/G.874.1-ForMicrowave.json create mode 100755 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/elasticsearch/index/mwtn/modelDescription/MicrowaveModel-ObjectClasses-AirInterface.yin.json create mode 100755 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/elasticsearch/index/mwtn/modelDescription/MicrowaveModel-ObjectClasses-EthernetContainer.yin.json create mode 100755 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/elasticsearch/index/mwtn/modelDescription/MicrowaveModel-ObjectClasses-PureEthernetStructure.yin.json create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/elasticsearch/index/mwtn/modelDescription/MicrowaveModel.json create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/elasticsearch/index/mwtn/modelDescription/core-model.schema-information.json create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/elasticsearch/index/mwtn/modelDescription/g.874.1-model.schema-information.json create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/elasticsearch/index/mwtn/modelDescription/microwave-model.schema-information.json create mode 100755 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/elasticsearch/index/mwtn/modelDescription/microwave-model.yin.json create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/elasticsearch/index/mwtn/modelDescription/onf-core-model-conditional-packages.schema-information.json create mode 100755 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/elasticsearch/index/mwtn/modelDescription/onf-core-model-conditional-packages.yin.json create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/elasticsearch/index/mwtn/modelDescription/onf-ethernet-conditional-packages.schema-information.json create mode 100755 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/elasticsearch/index/mwtn/modelDescription/onf-ethernet-conditional-packages.yin.json create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/elasticsearch/index/mwtn/modelDescription/onf-ptp-dataset.schema-information.json create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/elasticsearch/index/mwtn/modelDescription/otn-odu-conditional-packages.yin.json create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/elasticsearch/index/mwtn/mwtnMapping.json create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/elasticsearch/index/mwtn/mwtnV1Alias.json create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/elasticsearch/index/sdnevents/sdneventsMapping.json create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/elasticsearch/index/sdnperformance/sdnperformanceMapping.json create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/elasticsearch/plugins/delete-by-query.zip create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/elasticsearch/plugins/head.zip create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/preload.cache.schema/bbf-tr-196-2-0-3-full@2018-04-08.yang create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/preload.cache.schema/core-model@2017-03-20.yang create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/preload.cache.schema/g.874.1-model@2017-03-20.yang create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/preload.cache.schema/ietf-inet-types@2010-09-24.yang create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/preload.cache.schema/ietf-inet-types@2013-07-15.yang create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/preload.cache.schema/ietf-netconf-acm@2012-02-22.yang create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/preload.cache.schema/ietf-netconf-monitoring@2010-10-04.yang create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/preload.cache.schema/ietf-netconf-partial-lock@2009-10-19.yang create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/preload.cache.schema/ietf-netconf-with-defaults@2011-06-01.yang create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/preload.cache.schema/ietf-netconf@2011-06-01.yang create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/preload.cache.schema/ietf-ptp-dataset@2017-02-08.yang create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/preload.cache.schema/ietf-restconf@2013-10-19.yang create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/preload.cache.schema/ietf-system@2014-08-06.yang create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/preload.cache.schema/ietf-yang-library@2016-04-09.yang create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/preload.cache.schema/ietf-yang-types@2013-07-15.yang create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/preload.cache.schema/microwave-model@2017-03-24.yang create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/preload.cache.schema/nc-notifications@2008-07-14.yang create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/preload.cache.schema/notifications@2008-07-14.yang create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/preload.cache.schema/notifications@2018-05-30.yang create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/preload.cache.schema/onf-core-model-conditional-packages@2017-04-02.yang create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/preload.cache.schema/onf-core-model-conditional-packages@2018-04-08.yang create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/preload.cache.schema/onf-ethernet-conditional-packages@2017-04-02.yang create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/preload.cache.schema/onf-otn-odu-conditional-packages@2017-10-20.yang create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/preload.cache.schema/onf-ptp-dataset@2017-05-08.yang create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/version.properties create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/test/AaiTest.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/test/AkkaConfigTest.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/test/ConfigTest.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/test/ESWebAPITest.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/test/GeoConfigTest.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/test/ResTest.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/test/TestFileChangeNotification.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/test/org/opendaylight/mwtn/base/database/DBPluginExtractTest.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/yang/devicemanager-impl.yang create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/pom.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemodel/pom.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemodel/src/main/yang/CoreModel-CoreFoundationModule-StateModel@2016-08-09.yang create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemodel/src/main/yang/CoreModel-CoreFoundationModule-SuperClassesAndCommonPackages@2016-07-10.yang create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemodel/src/main/yang/CoreModel-CoreFoundationModule-TypeDefinitions@2016-07-01.yang create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemodel/src/main/yang/CoreModel-CoreNetworkModule-ObjectClasses@2016-08-11.yang create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemodel/src/main/yang/CoreModel-CoreNetworkModule-TypeDefinitions@2016-07-10.yang create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemodel/src/main/yang/G_874_1_model-Imported_Data_Types@2016-07-10.yang create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemodel/src/main/yang/G_874_1_model-Imported_Information_Object_Classes-Q_822@2016-08-11.yang create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemodel/src/main/yang/G_874_1_model-Imported_Information_Object_Classes-X_721@2016-07-10.yang create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemodel/src/main/yang/G_874_1_model-Imported_Information_Object_Classes-X_739@2016-07-10.yang create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemodel/src/main/yang/G_874_1_model-Object_Classes@2016-07-10.yang create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemodel/src/main/yang/G_874_1_model-Type_Definitions@2016-07-10.yang create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemodel/src/main/yang/MicrowaveModel-NetworkElement-CurrentProblemList@2016-11-20.yang create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemodel/src/main/yang/MicrowaveModel-Notifications@2016-08-09.yang create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemodel/src/main/yang/MicrowaveModel-ObjectClasses-AirInterface@2016-09-01.yang create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemodel/src/main/yang/MicrowaveModel-ObjectClasses-AirInterfaceDiversity@2016-09-02.yang create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemodel/src/main/yang/MicrowaveModel-ObjectClasses-EthernetContainer@2016-09-02.yang create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemodel/src/main/yang/MicrowaveModel-ObjectClasses-HybridMwStructure@2016-09-02.yang create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemodel/src/main/yang/MicrowaveModel-ObjectClasses-PureEthernetStructure@2016-09-02.yang create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemodel/src/main/yang/MicrowaveModel-ObjectClasses-SuperClasses@2016-08-09.yang create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemodel/src/main/yang/MicrowaveModel-ObjectClasses-TdmContainer@2016-09-02.yang create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemodel/src/main/yang/MicrowaveModel-TypeDefinitions@2016-09-02.yang create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemodel/src/main/yang/NetworkElement@2016-02-03.yang create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemodel/src/main/yang/bbf-tr-196-2-0-3-full@2018-04-08.yang create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemodel/src/main/yang/core-model@2017-03-20.yang create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemodel/src/main/yang/g.874.1-model@2017-03-20.yang create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemodel/src/main/yang/ietf-ptp-dataset@2017-02-08.yang create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemodel/src/main/yang/ltp-path@2017-05-26.yang.wronghere create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemodel/src/main/yang/microwave-model@2017-03-24.yang create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemodel/src/main/yang/onf-core-model-conditional-packages@2017-04-02.yang create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemodel/src/main/yang/onf-core-model-conditional-packages@2018-04-08.yang create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemodel/src/main/yang/onf-ethernet-conditional-packages@2017-04-02.yang create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemodel/src/main/yang/onf-otn-odu-conditional-packages@2017-10-20.yang create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/devicemodel/src/main/yang/onf-ptp-dataset@2017-05-08.yang create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/dlux/.gitignore create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/dlux/.gitreview create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/dlux/LICENSE create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/dlux/README.md create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/dlux/distribution-karaf-0.6.1-Carbon.dluxloader.tar.gz create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/dlux/dlux-web/.bowerrc create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/dlux/dlux-web/Gruntfile.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/dlux/dlux-web/README.md create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/dlux/dlux-web/bower.json create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/dlux/dlux-web/bower.json.1.6.5 create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/dlux/dlux-web/bower.json.1.6.5.2 create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/dlux/dlux-web/bower.json.orig create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/dlux/dlux-web/build.config.js create mode 100755 sdnr/wireless-transport/code-Carbon-SR1/apps/dlux/dlux-web/clean create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/dlux/dlux-web/config/development.json create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/dlux/dlux-web/config/env.module.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/dlux/dlux-web/config/production.json create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/dlux/dlux-web/karma/karma-unit.tpl.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/dlux/dlux-web/module.prefix create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/dlux/dlux-web/module.suffix create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/dlux/dlux-web/optimize.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/dlux/dlux-web/package.json create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/dlux/dlux-web/pom.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/dlux/dlux-web/src/README.md create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/dlux/dlux-web/src/app/LICENSE create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/dlux/dlux-web/src/app/README.md create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/dlux/dlux-web/src/app/app.controller.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/dlux/dlux-web/src/app/app.module.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/dlux/dlux-web/src/app/core/core.module.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/dlux/dlux-web/src/app/core/core.services.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/dlux/dlux-web/src/app/core/core.spec.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/dlux/dlux-web/src/app/routingConfig.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/dlux/dlux-web/src/common/LICENSE create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/dlux/dlux-web/src/common/README.md create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/dlux/dlux-web/src/common/authentification/auth.module.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/dlux/dlux-web/src/common/authentification/auth.services.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/dlux/dlux-web/src/common/authentification/auth.spec.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/dlux/dlux-web/src/common/config/env.module.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/dlux/dlux-web/src/common/general/common.general.directives.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/dlux/dlux-web/src/common/general/common.general.filters.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/dlux/dlux-web/src/common/general/common.general.module.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/dlux/dlux-web/src/common/general/common.general.services.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/dlux/dlux-web/src/common/general/common.navigation.directives.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/dlux/dlux-web/src/common/general/common.navigation.module.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/dlux/dlux-web/src/common/general/finishRender.module.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/dlux/dlux-web/src/common/layout/index.tpl.html create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/dlux/dlux-web/src/common/layout/layout.module.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/dlux/dlux-web/src/common/login/forgot_password.tpl.html create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/dlux/dlux-web/src/common/login/login.controller.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/dlux/dlux-web/src/common/login/login.less create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/dlux/dlux-web/src/common/login/login.module.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/dlux/dlux-web/src/common/login/login.spec.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/dlux/dlux-web/src/common/login/login.tpl.html create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/dlux/dlux-web/src/common/login/register.tpl.html create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/dlux/dlux-web/src/common/navigation/nav_item_template.tpl.html create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/dlux/dlux-web/src/common/navigation/navigation-min.less create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/dlux/dlux-web/src/common/navigation/navigation.controller.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/dlux/dlux-web/src/common/navigation/navigation.less create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/dlux/dlux-web/src/common/navigation/navigation.module.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/dlux/dlux-web/src/common/navigation/navigation.services.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/dlux/dlux-web/src/common/navigation/navigation.spec.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/dlux/dlux-web/src/common/navigation/navigation.tpl.html create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/dlux/dlux-web/src/common/topbar/messages.tpl.html create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/dlux/dlux-web/src/common/topbar/notifications.tpl.html create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/dlux/dlux-web/src/common/topbar/tasks.tpl.html create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/dlux/dlux-web/src/common/topbar/topbar.controller.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/dlux/dlux-web/src/common/topbar/topbar.directives.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/dlux/dlux-web/src/common/topbar/topbar.less create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/dlux/dlux-web/src/common/topbar/topbar.module.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/dlux/dlux-web/src/common/topbar/topbar.services.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/dlux/dlux-web/src/common/topbar/topbar.tpl.html create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/dlux/dlux-web/src/common/topbar/user_menu.tpl.html create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/dlux/dlux-web/src/index.html create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/dlux/dlux-web/src/less/design.less create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/dlux/dlux-web/src/less/main.less create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/dlux/dlux-web/src/less/mixins.less create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/dlux/dlux-web/src/less/other.less create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/dlux/dlux-web/src/less/variables.less create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/dlux/dlux-web/src/main.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/dlux/dlux-web/src/test-main.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/dlux/loader/impl/README.md create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/dlux/loader/impl/pom.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/dlux/loader/impl/src/main/java/org/opendaylight/dlux/loader/exception/DluxLoaderException.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/dlux/loader/impl/src/main/java/org/opendaylight/dlux/loader/implementation/DluxLoader.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/dlux/loader/impl/src/main/java/org/opendaylight/dlux/loader/implementation/DluxLoaderIndexServlet.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/dlux/loader/impl/src/main/resources/CommonAppModules.properties create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/dlux/loader/impl/src/main/resources/OSGI-INF/blueprint/blueprint.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/dlux/loader/impl/src/test/java/org/opendaylight/dlux/loader/DluxLoaderIndexServletTest.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/dlux/pom.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/helpServer/features/pom.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/helpServer/features/src/main/features/features.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/helpServer/impl/pom.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/helpServer/impl/src/main/java/com/highstreet/technologies/helpserver/HelpServlet.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/helpServer/impl/src/main/java/com/highstreet/technologies/helpserver/data/Environment.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/helpServer/impl/src/main/java/com/highstreet/technologies/helpserver/data/ExtactBundleResource.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/helpServer/impl/src/main/java/com/highstreet/technologies/helpserver/data/HelpInfrastructureObject.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/helpServer/impl/src/main/resources/.gitignore create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/helpServer/impl/src/main/resources/OSGI-INF/blueprint/blueprint.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/helpServer/impl/src/main/test/SimpleTests.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/helpServer/impl/src/test/resources/log4j.properties create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/helpServer/pom.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/info/features/pom.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/info/features/src/main/features/features.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/info/impl/pom.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/info/impl/src/main/java/com/highstreet/technologies/info/InfoServlet.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/info/impl/src/main/java/com/highstreet/technologies/info/KarafBundle.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/info/impl/src/main/java/com/highstreet/technologies/info/KarafBundleList.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/info/impl/src/main/resources/OSGI-INF/blueprint/blueprint.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/info/impl/src/main/resources/html/css/bootstrap.min.css create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/info/impl/src/main/resources/html/css/bootstrap.min.css.map create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/info/impl/src/main/resources/html/index.html create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/info/impl/src/main/resources/html/js/app.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/info/impl/src/main/resources/html/js/bootstrap.min.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/info/impl/src/main/resources/html/js/bootstrap.min.js.map create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/info/impl/src/main/resources/html/js/jquery-3.3.1.min.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/info/impl/src/main/resources/html/js/popper.min.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/info/impl/src/main/test/SimpleTests.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/info/impl/src/test/java/BundleListTest.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/info/impl/src/test/java/CompressionTest.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/info/impl/src/test/resources/log4j.properties create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/info/pom.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/pom.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/route/api/pom.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/route/api/src/main/yang/ltp-path@2017-05-26.yang create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/route/api/src/main/yang/route.yang create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/route/api/src/main/yang/threshold@2017-06-15.yang create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/route/features/pom.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/route/features/src/main/features/features.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/route/impl/pom.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/route/impl/src/main/java/com/highstreet/technologies/odl/app/impl/PathHolder.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/route/impl/src/main/java/com/highstreet/technologies/odl/app/impl/RouteProvider.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/route/impl/src/main/java/com/highstreet/technologies/odl/app/impl/RouteRPC.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/route/impl/src/main/java/com/highstreet/technologies/odl/app/impl/delegates/FC.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/route/impl/src/main/java/com/highstreet/technologies/odl/app/impl/delegates/LtpInOdlCreator.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/route/impl/src/main/java/com/highstreet/technologies/odl/app/impl/delegates/Path.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/route/impl/src/main/java/com/highstreet/technologies/odl/app/impl/delegates/PathDelegate.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/route/impl/src/main/java/com/highstreet/technologies/odl/app/impl/delegates/PredefinePath.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/route/impl/src/main/java/com/highstreet/technologies/odl/app/impl/listener/ACMListener.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/route/impl/src/main/java/com/highstreet/technologies/odl/app/impl/tools/BandwidthCalculator.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/route/impl/src/main/java/com/highstreet/technologies/odl/app/impl/tools/DataBrokerHolder.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/route/impl/src/main/java/com/highstreet/technologies/odl/app/impl/tools/FC2Executor.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/route/impl/src/main/java/com/highstreet/technologies/odl/app/impl/tools/JsonUtil.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/route/impl/src/main/java/com/highstreet/technologies/odl/app/impl/tools/MountPointServiceHolder.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/route/impl/src/main/java/com/highstreet/technologies/odl/app/impl/tools/NeExecutor.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/route/impl/src/main/java/com/highstreet/technologies/odl/app/impl/tools/RPCHolder.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/route/impl/src/main/java/com/highstreet/technologies/odl/app/impl/tools/Unit.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/route/impl/src/main/resources/org/opendaylight/blueprint/impl-blueprint.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/route/impl/src/main/resources/topology.json create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/route/impl/src/test/java/org/opendaylight/route/TestBandwidthCalculator.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/route/impl/src/test/java/org/opendaylight/route/TestJson.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/route/pom.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/websocketmanager/api/pom.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/websocketmanager/api/src/main/yang/websocketmanager.yang create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/websocketmanager/impl/pom.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/websocketmanager/impl/src/main/config/default-config.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/websocketmanager/impl/src/main/java/org/opendaylight/mwtn/impl/WebsocketImpl.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/websocketmanager/impl/src/main/java/org/opendaylight/mwtn/impl/WebsocketmanagerProvider.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/websocketmanager/impl/src/main/java/org/opendaylight/mwtn/impl/dto/UserDto.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/websocketmanager/impl/src/main/java/org/opendaylight/mwtn/impl/utils/AkkaConfig.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/websocketmanager/impl/src/main/java/org/opendaylight/mwtn/impl/utils/Utils.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/websocketmanager/impl/src/main/java/org/opendaylight/mwtn/impl/websocket/SyncWebSocketClient.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/websocketmanager/impl/src/main/java/org/opendaylight/mwtn/impl/websocket/WebSocketServerHandler.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/websocketmanager/impl/src/main/java/org/opendaylight/mwtn/impl/websocket/WebSocketServerInitializer.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/websocketmanager/impl/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/websocketmanager/impl/rev141210/WebsocketmanagerModule.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/websocketmanager/impl/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/websocketmanager/impl/rev141210/WebsocketmanagerModuleFactory.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/websocketmanager/impl/src/main/test/AkkaConfigTest.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/websocketmanager/impl/src/main/test/WebsocketClientTest.java create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/websocketmanager/impl/src/main/yang/websocketmanager-impl.yang create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/apps/websocketmanager/pom.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/docs/README2CreateApp4Carbon.md create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/docs/README2CreateTarBundle.md create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/docs/READMEInstallDevelopmentEnvironment.md create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/docs/READMEInstallDevelopmentEnvironment_1_eclipseinst.png create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/docs/READMEInstallDevelopmentEnvironment_2_secureStore.png create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/docs/READMEMigrateBoronSR1-2-SR3.md create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/docs/READMEOperateAndDebugODL.md create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/docs/dist.conf create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/docs/installServiceExample.sh create mode 100755 sdnr/wireless-transport/code-Carbon-SR1/docs/software_architecture.png create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/features/pom.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/features/src/main/features/features.xml create mode 100755 sdnr/wireless-transport/code-Carbon-SR1/odl create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/pom.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/ethService/ethService-bundle/pom.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/ethService/ethService-bundle/src/main/resources/OSGI-INF/blueprint/blueprint.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/ethService/ethService-module/pom.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/ethService/ethService-module/src/main/resources/ethService/ethService-custom.css create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/ethService/ethService-module/src/main/resources/ethService/ethService.controller.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/ethService/ethService-module/src/main/resources/ethService/ethService.module.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/ethService/ethService-module/src/main/resources/ethService/ethService.services.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/ethService/ethService-module/src/main/resources/ethService/ethService.tpl.html create mode 100755 sdnr/wireless-transport/code-Carbon-SR1/ux/ethService/ethService-module/src/main/resources/ethService/images/ethService.png create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/ethService/pom.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/features/pom.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/features/src/main/features/features.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/help/help-bundle/pom.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/help/help-bundle/src/main/resources/OSGI-INF/blueprint/blueprint.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/help/help-module/pom.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/help/help-module/src/main/resources/help/help.controller.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/help/help-module/src/main/resources/help/help.controller.ts create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/help/help-module/src/main/resources/help/help.custom.css create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/help/help-module/src/main/resources/help/help.module.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/help/help-module/src/main/resources/help/help.module.ts create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/help/help-module/src/main/resources/help/help.service.ts create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/help/help-module/src/main/resources/help/help.tpl.html create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/help/help-module/src/main/resources/help/help.tree.html create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/help/help-module/src/main/resources/help/help.tree.ts create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/help/help-module/src/main/resources/help/help.utilities.ts create mode 100755 sdnr/wireless-transport/code-Carbon-SR1/ux/help/help-module/src/main/resources/help/images/help.png create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/help/help-module/src/main/resources/help/lib/marked.d.ts create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/help/help-module/src/main/resources/help/lib/marked.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/help/pom.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnBrowser/mwtnBrowser-bundle/pom.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnBrowser/mwtnBrowser-bundle/src/main/resources/OSGI-INF/blueprint/blueprint.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnBrowser/mwtnBrowser-module/pom.xml create mode 100755 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnBrowser/mwtnBrowser-module/src/main/resources/mwtnBrowser/images/mwtnBrowser.png create mode 100755 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnBrowser/mwtnBrowser-module/src/main/resources/mwtnBrowser/images/mwtnConfig.png create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnBrowser/mwtnBrowser-module/src/main/resources/mwtnBrowser/mwtnBrowser-custom.css create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnBrowser/mwtnBrowser-module/src/main/resources/mwtnBrowser/mwtnBrowser.controller.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnBrowser/mwtnBrowser-module/src/main/resources/mwtnBrowser/mwtnBrowser.module.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnBrowser/mwtnBrowser-module/src/main/resources/mwtnBrowser/mwtnBrowser.services.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnBrowser/mwtnBrowser-module/src/main/resources/mwtnBrowser/templates/frame.tpl.html create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnBrowser/mwtnBrowser-module/src/main/resources/mwtnBrowser/templates/mwtnPtpClockViewer.tpl.html create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnBrowser/mwtnBrowser-module/src/main/resources/mwtnBrowser/templates/mwtnPtpPorts.tpl.html create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnBrowser/mwtnBrowser-module/src/main/resources/mwtnBrowser/templates/ptpDefaultDsConfigView.tpl.html create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnBrowser/mwtnBrowser-module/src/main/resources/mwtnBrowser/templates/ptpPortConfigView.tpl.html create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnBrowser/pom.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnClosedLoop/mwtnClosedLoop-bundle/pom.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnClosedLoop/mwtnClosedLoop-bundle/src/main/resources/OSGI-INF/blueprint/blueprint.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnClosedLoop/mwtnClosedLoop-module/pom.xml create mode 100755 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnClosedLoop/mwtnClosedLoop-module/src/main/resources/mwtnClosedLoop/images/mwtnClosedLoop.png create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnClosedLoop/mwtnClosedLoop-module/src/main/resources/mwtnClosedLoop/mwtnClosedLoop-custom.css create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnClosedLoop/mwtnClosedLoop-module/src/main/resources/mwtnClosedLoop/mwtnClosedLoop.controller.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnClosedLoop/mwtnClosedLoop-module/src/main/resources/mwtnClosedLoop/mwtnClosedLoop.module.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnClosedLoop/mwtnClosedLoop-module/src/main/resources/mwtnClosedLoop/mwtnClosedLoop.services.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnClosedLoop/mwtnClosedLoop-module/src/main/resources/mwtnClosedLoop/mwtnClosedLoop.tpl.html create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnClosedLoop/pom.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnCommons/mwtnCommons-bundle/pom.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnCommons/mwtnCommons-bundle/src/main/resources/OSGI-INF/blueprint/blueprint.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnCommons/mwtnCommons-module/pom.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnCommons/mwtnCommons-module/src/main/resources/mwtnCommons/README.md create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnCommons/mwtnCommons-module/src/main/resources/mwtnCommons/bower.json create mode 100755 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnCommons/mwtnCommons-module/src/main/resources/mwtnCommons/bowerInstall.sh create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnCommons/mwtnCommons-module/src/main/resources/mwtnCommons/bower_components_patches/angular-chart.js.patch create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnCommons/mwtnCommons-module/src/main/resources/mwtnCommons/locale/locale-en_US.json create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnCommons/mwtnCommons-module/src/main/resources/mwtnCommons/mwtnCommons-custom.css create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnCommons/mwtnCommons-module/src/main/resources/mwtnCommons/mwtnCommons.controller.js create mode 100755 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnCommons/mwtnCommons-module/src/main/resources/mwtnCommons/mwtnCommons.module.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnCommons/mwtnCommons-module/src/main/resources/mwtnCommons/mwtnCommons.services.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnCommons/mwtnCommons-module/src/main/resources/mwtnCommons/mwtnCommons.tpl.html create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnCommons/mwtnCommons-module/src/main/resources/mwtnCommons/templates/mwtnFooter.tpl.html create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnCommons/mwtnCommons-module/src/main/resources/mwtnCommons/templates/mwtnGrid.tpl.html create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnCommons/mwtnCommons-module/src/main/resources/mwtnCommons/templates/mwtnJsonViewer.tpl.html create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnCommons/mwtnCommons-module/src/main/resources/mwtnCommons/templates/mwtnSelectNetworkElement.tpl.html create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnCommons/mwtnCommons-module/src/main/resources/mwtnCommons/templates/openConfigView.html create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnCommons/mwtnCommons-module/src/main/resources/mwtnCommons/templates/showGridCellDetail.html create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnCommons/mwtnCommons-module/src/main/resources/mwtnCommons/xml2json.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnCommons/pom.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnCompare/mwtnCompare-bundle/pom.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnCompare/mwtnCompare-bundle/src/main/resources/OSGI-INF/blueprint/blueprint.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnCompare/mwtnCompare-module/pom.xml create mode 100755 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnCompare/mwtnCompare-module/src/main/resources/mwtnCompare/images/mwtnCompare.png create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnCompare/mwtnCompare-module/src/main/resources/mwtnCompare/mwtnCompare-custom.css create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnCompare/mwtnCompare-module/src/main/resources/mwtnCompare/mwtnCompare.controller.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnCompare/mwtnCompare-module/src/main/resources/mwtnCompare/mwtnCompare.directives.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnCompare/mwtnCompare-module/src/main/resources/mwtnCompare/mwtnCompare.module.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnCompare/mwtnCompare-module/src/main/resources/mwtnCompare/mwtnCompare.services.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnCompare/mwtnCompare-module/src/main/resources/mwtnCompare/mwtnCompare.tpl.html create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnCompare/mwtnCompare-module/src/main/resources/mwtnCompare/templates/compare.tpl.html create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnCompare/pom.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnConnect/mwtnConnect-bundle/pom.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnConnect/mwtnConnect-bundle/src/main/resources/OSGI-INF/blueprint/blueprint.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnConnect/mwtnConnect-module/pom.xml create mode 100755 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnConnect/mwtnConnect-module/src/main/resources/mwtnConnect/images/mwtnConnect.png create mode 100755 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnConnect/mwtnConnect-module/src/main/resources/mwtnConnect/images/sdncConnect.png create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnConnect/mwtnConnect-module/src/main/resources/mwtnConnect/mwtnConnect-custom.css create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnConnect/mwtnConnect-module/src/main/resources/mwtnConnect/mwtnConnect.controller.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnConnect/mwtnConnect-module/src/main/resources/mwtnConnect/mwtnConnect.module.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnConnect/mwtnConnect-module/src/main/resources/mwtnConnect/mwtnConnect.services.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnConnect/mwtnConnect-module/src/main/resources/mwtnConnect/mwtnConnect.tpl.html create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnConnect/mwtnConnect-module/src/main/resources/mwtnConnect/templates/addToRequired.tpl.html create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnConnect/mwtnConnect-module/src/main/resources/mwtnConnect/templates/confirmDelete.tpl.html create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnConnect/mwtnConnect-module/src/main/resources/mwtnConnect/templates/confirmHide.tpl.html create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnConnect/mwtnConnect-module/src/main/resources/mwtnConnect/templates/mountPointDetails.tpl.html create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnConnect/pom.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnEvents/mwtnEvents-bundle/pom.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnEvents/mwtnEvents-bundle/src/main/resources/OSGI-INF/blueprint/blueprint.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnEvents/mwtnEvents-module/pom.xml create mode 100755 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnEvents/mwtnEvents-module/src/main/resources/mwtnEvents/images/mwtnEvents.png create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnEvents/mwtnEvents-module/src/main/resources/mwtnEvents/mwtnEvents-custom.css create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnEvents/mwtnEvents-module/src/main/resources/mwtnEvents/mwtnEvents.controller.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnEvents/mwtnEvents-module/src/main/resources/mwtnEvents/mwtnEvents.module.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnEvents/mwtnEvents-module/src/main/resources/mwtnEvents/mwtnEvents.services.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnEvents/mwtnEvents-module/src/main/resources/mwtnEvents/mwtnEvents.tpl.html create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnEvents/mwtnEvents-module/src/main/resources/mwtnEvents/xml2json.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnEvents/pom.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnFault/mwtnFault-bundle/pom.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnFault/mwtnFault-bundle/src/main/resources/OSGI-INF/blueprint/blueprint.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnFault/mwtnFault-module/pom.xml create mode 100755 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnFault/mwtnFault-module/src/main/resources/mwtnFault/images/mwtnFault.png create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnFault/mwtnFault-module/src/main/resources/mwtnFault/mwtnFault-custom.css create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnFault/mwtnFault-module/src/main/resources/mwtnFault/mwtnFault.controller.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnFault/mwtnFault-module/src/main/resources/mwtnFault/mwtnFault.directives.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnFault/mwtnFault-module/src/main/resources/mwtnFault/mwtnFault.module.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnFault/mwtnFault-module/src/main/resources/mwtnFault/mwtnFault.services.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnFault/mwtnFault-module/src/main/resources/mwtnFault/mwtnFault.tpl.html create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnFault/mwtnFault-module/src/main/resources/mwtnFault/templates/alarmStatus.tpl.html create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnFault/mwtnFault-module/src/main/resources/mwtnFault/templates/clearLogConfirmation.tpl.html create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnFault/pom.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnInventory/mwtnInventory-bundle/pom.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnInventory/mwtnInventory-bundle/src/main/resources/OSGI-INF/blueprint/blueprint.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnInventory/mwtnInventory-module/pom.xml create mode 100755 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnInventory/mwtnInventory-module/src/main/resources/mwtnInventory/components/equipment.html create mode 100755 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnInventory/mwtnInventory-module/src/main/resources/mwtnInventory/components/equipment.ts create mode 100755 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnInventory/mwtnInventory-module/src/main/resources/mwtnInventory/components/equipmentGroup.html create mode 100755 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnInventory/mwtnInventory-module/src/main/resources/mwtnInventory/components/equipmentGroup.ts create mode 100755 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnInventory/mwtnInventory-module/src/main/resources/mwtnInventory/images/mwtnInventory.png create mode 100755 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnInventory/mwtnInventory-module/src/main/resources/mwtnInventory/models/equipment.ts create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnInventory/mwtnInventory-module/src/main/resources/mwtnInventory/mwtnInventory-custom.css create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnInventory/mwtnInventory-module/src/main/resources/mwtnInventory/mwtnInventory.controller.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnInventory/mwtnInventory-module/src/main/resources/mwtnInventory/mwtnInventory.controller.ts create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnInventory/mwtnInventory-module/src/main/resources/mwtnInventory/mwtnInventory.module.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnInventory/mwtnInventory-module/src/main/resources/mwtnInventory/mwtnInventory.module.ts create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnInventory/mwtnInventory-module/src/main/resources/mwtnInventory/mwtnInventory.service.ts create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnInventory/mwtnInventory-module/src/main/resources/mwtnInventory/mwtnInventory.services.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnInventory/mwtnInventory-module/src/main/resources/mwtnInventory/mwtnInventory.tpl.html create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnInventory/mwtnInventory-module/src/main/resources/mwtnInventory/templates/_ create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnInventory/mwtnInventory-module/src/main/resources/mwtnInventory/templates/accordeonHeader.tpl.html create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnInventory/pom.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnLog/mwtnLog-bundle/pom.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnLog/mwtnLog-bundle/src/main/resources/OSGI-INF/blueprint/blueprint.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnLog/mwtnLog-module/pom.xml create mode 100755 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnLog/mwtnLog-module/src/main/resources/mwtnLog/images/mwtnLog.png create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnLog/mwtnLog-module/src/main/resources/mwtnLog/mwtnLog-custom.css create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnLog/mwtnLog-module/src/main/resources/mwtnLog/mwtnLog.controller.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnLog/mwtnLog-module/src/main/resources/mwtnLog/mwtnLog.module.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnLog/mwtnLog-module/src/main/resources/mwtnLog/mwtnLog.services.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnLog/mwtnLog-module/src/main/resources/mwtnLog/mwtnLog.tpl.html create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnLog/mwtnLog-module/src/main/resources/mwtnLog/templates/clearLogConfirmation.tpl.html create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnLog/pom.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnMediator/mwtnMediator-bundle/pom.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnMediator/mwtnMediator-bundle/src/main/resources/OSGI-INF/blueprint/blueprint.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnMediator/mwtnMediator-module/pom.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnMediator/mwtnMediator-module/src/main/resources/mwtnMediator/class.mediator.js create mode 100755 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnMediator/mwtnMediator-module/src/main/resources/mwtnMediator/images/mwtnMediator.png create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnMediator/mwtnMediator-module/src/main/resources/mwtnMediator/mwtnMediator-custom.css create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnMediator/mwtnMediator-module/src/main/resources/mwtnMediator/mwtnMediator.controller.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnMediator/mwtnMediator-module/src/main/resources/mwtnMediator/mwtnMediator.module.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnMediator/mwtnMediator-module/src/main/resources/mwtnMediator/mwtnMediator.services.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnMediator/mwtnMediator-module/src/main/resources/mwtnMediator/templates/frame.tpl.html create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnMediator/mwtnMediator-module/src/main/resources/mwtnMediator/templates/mediatorCreateNew.tpl.html create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnMediator/mwtnMediator-module/src/main/resources/mwtnMediator/templates/mediatorDetails.tpl.html create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnMediator/mwtnMediator-module/src/main/resources/mwtnMediator/templates/mediatorServerConfigCtrl.tpl.html create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnMediator/pom.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnPerformanceCurrent/mwtnPerformanceCurrent-bundle/pom.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnPerformanceCurrent/mwtnPerformanceCurrent-bundle/src/main/resources/OSGI-INF/blueprint/blueprint.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnPerformanceCurrent/mwtnPerformanceCurrent-module/pom.xml create mode 100755 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnPerformanceCurrent/mwtnPerformanceCurrent-module/src/main/resources/mwtnPerformanceCurrent/images/mwtnPerformance.png create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnPerformanceCurrent/mwtnPerformanceCurrent-module/src/main/resources/mwtnPerformanceCurrent/mwtnPerformanceCurrent-custom.css create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnPerformanceCurrent/mwtnPerformanceCurrent-module/src/main/resources/mwtnPerformanceCurrent/mwtnPerformanceCurrent.controller.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnPerformanceCurrent/mwtnPerformanceCurrent-module/src/main/resources/mwtnPerformanceCurrent/mwtnPerformanceCurrent.module.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnPerformanceCurrent/mwtnPerformanceCurrent-module/src/main/resources/mwtnPerformanceCurrent/mwtnPerformanceCurrent.services.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnPerformanceCurrent/mwtnPerformanceCurrent-module/src/main/resources/mwtnPerformanceCurrent/mwtnPerformanceCurrent.tpl.html create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnPerformanceCurrent/pom.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnPerformanceHistory/mwtnPerformanceHistory-bundle/pom.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnPerformanceHistory/mwtnPerformanceHistory-bundle/src/main/resources/OSGI-INF/blueprint/blueprint.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnPerformanceHistory/mwtnPerformanceHistory-module/pom.xml create mode 100755 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnPerformanceHistory/mwtnPerformanceHistory-module/src/main/resources/mwtnPerformanceHistory/images/mwtnPerformance.png create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnPerformanceHistory/mwtnPerformanceHistory-module/src/main/resources/mwtnPerformanceHistory/mwtnPerformanceHistory-custom.css create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnPerformanceHistory/mwtnPerformanceHistory-module/src/main/resources/mwtnPerformanceHistory/mwtnPerformanceHistory.controller.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnPerformanceHistory/mwtnPerformanceHistory-module/src/main/resources/mwtnPerformanceHistory/mwtnPerformanceHistory.module.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnPerformanceHistory/mwtnPerformanceHistory-module/src/main/resources/mwtnPerformanceHistory/mwtnPerformanceHistory.services.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnPerformanceHistory/mwtnPerformanceHistory-module/src/main/resources/mwtnPerformanceHistory/mwtnPerformanceHistory.tpl.html create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnPerformanceHistory/pom.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnPerformanceLink/mwtnPerformanceLink-bundle/pom.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnPerformanceLink/mwtnPerformanceLink-bundle/src/main/resources/OSGI-INF/blueprint/blueprint.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnPerformanceLink/mwtnPerformanceLink-module/pom.xml create mode 100755 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnPerformanceLink/mwtnPerformanceLink-module/src/main/resources/mwtnPerformanceLink/images/mwtnPerformance.png create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnPerformanceLink/mwtnPerformanceLink-module/src/main/resources/mwtnPerformanceLink/mwtnPerformanceLink-custom.css create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnPerformanceLink/mwtnPerformanceLink-module/src/main/resources/mwtnPerformanceLink/mwtnPerformanceLink.controller.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnPerformanceLink/mwtnPerformanceLink-module/src/main/resources/mwtnPerformanceLink/mwtnPerformanceLink.module.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnPerformanceLink/mwtnPerformanceLink-module/src/main/resources/mwtnPerformanceLink/mwtnPerformanceLink.services.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnPerformanceLink/mwtnPerformanceLink-module/src/main/resources/mwtnPerformanceLink/mwtnPerformanceLink.tpl.html create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnPerformanceLink/pom.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnSpectrum/mwtnSpectrum-bundle/pom.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnSpectrum/mwtnSpectrum-bundle/src/main/resources/OSGI-INF/blueprint/blueprint.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnSpectrum/mwtnSpectrum-module/pom.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnSpectrum/mwtnSpectrum-module/src/main/resources/mwtnSpectrum/images/bluelight.gif create mode 100755 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnSpectrum/mwtnSpectrum-module/src/main/resources/mwtnSpectrum/images/mwtnSpectrum.png create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnSpectrum/mwtnSpectrum-module/src/main/resources/mwtnSpectrum/mwtnSpectrum-custom.css create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnSpectrum/mwtnSpectrum-module/src/main/resources/mwtnSpectrum/mwtnSpectrum.controller.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnSpectrum/mwtnSpectrum-module/src/main/resources/mwtnSpectrum/mwtnSpectrum.module.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnSpectrum/mwtnSpectrum-module/src/main/resources/mwtnSpectrum/mwtnSpectrum.services.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnSpectrum/mwtnSpectrum-module/src/main/resources/mwtnSpectrum/mwtnSpectrum.tpl.html create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnSpectrum/pom.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnTdm/mwtnTdm-bundle/pom.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnTdm/mwtnTdm-bundle/src/main/resources/OSGI-INF/blueprint/blueprint.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnTdm/mwtnTdm-module/pom.xml create mode 100755 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnTdm/mwtnTdm-module/src/main/resources/mwtnTdm/images/mwtnTdm.png create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnTdm/mwtnTdm-module/src/main/resources/mwtnTdm/mwtnTdm-custom.css create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnTdm/mwtnTdm-module/src/main/resources/mwtnTdm/mwtnTdm.controller.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnTdm/mwtnTdm-module/src/main/resources/mwtnTdm/mwtnTdm.module.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnTdm/mwtnTdm-module/src/main/resources/mwtnTdm/mwtnTdm.services.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnTdm/mwtnTdm-module/src/main/resources/mwtnTdm/templates/frame.tpl.html create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnTdm/pom.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnTest/mwtnTest-bundle/pom.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnTest/mwtnTest-bundle/src/main/resources/OSGI-INF/blueprint/blueprint.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnTest/mwtnTest-module/pom.xml create mode 100755 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnTest/mwtnTest-module/src/main/resources/mwtnTest/images/mwtnTest.png create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnTest/mwtnTest-module/src/main/resources/mwtnTest/mwtnTest-custom.css create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnTest/mwtnTest-module/src/main/resources/mwtnTest/mwtnTest.controller.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnTest/mwtnTest-module/src/main/resources/mwtnTest/mwtnTest.module.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnTest/mwtnTest-module/src/main/resources/mwtnTest/mwtnTest.services.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnTest/mwtnTest-module/src/main/resources/mwtnTest/templates/frame.tpl.html create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnTest/pom.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnTopology/mwtnTopology-bundle/pom.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnTopology/mwtnTopology-bundle/src/main/resources/OSGI-INF/blueprint/blueprint.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnTopology/mwtnTopology-module/pom.xml create mode 100755 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnTopology/mwtnTopology-module/src/main/resources/mwtnTopology/doc/mwtnTopology.builinfo.md create mode 100755 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnTopology/mwtnTopology-module/src/main/resources/mwtnTopology/doc/mwtnTopology.fs.md create mode 100755 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnTopology/mwtnTopology-module/src/main/resources/mwtnTopology/images/mwtnTopology.png create mode 100755 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnTopology/mwtnTopology-module/src/main/resources/mwtnTopology/mwtnTopology-custom.css create mode 100755 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnTopology/mwtnTopology-module/src/main/resources/mwtnTopology/mwtnTopology.controller.js create mode 100755 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnTopology/mwtnTopology-module/src/main/resources/mwtnTopology/mwtnTopology.module.js create mode 100755 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnTopology/mwtnTopology-module/src/main/resources/mwtnTopology/mwtnTopology.rest create mode 100755 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnTopology/mwtnTopology-module/src/main/resources/mwtnTopology/mwtnTopology.services.js create mode 100755 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnTopology/mwtnTopology-module/src/main/resources/mwtnTopology/templates/accordeonHeader.tpl.html create mode 100755 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnTopology/mwtnTopology-module/src/main/resources/mwtnTopology/templates/clocksGrid.tpl.html create mode 100755 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnTopology/mwtnTopology-module/src/main/resources/mwtnTopology/templates/ethConnectionsGrid.tpl.html create mode 100755 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnTopology/mwtnTopology-module/src/main/resources/mwtnTopology/templates/ethernetView.tpl.html create mode 100755 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnTopology/mwtnTopology-module/src/main/resources/mwtnTopology/templates/frame.tpl.html create mode 100755 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnTopology/mwtnTopology-module/src/main/resources/mwtnTopology/templates/ieee1588View.tpl.html create mode 100755 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnTopology/mwtnTopology-module/src/main/resources/mwtnTopology/templates/linkDetails.tpl.html create mode 100755 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnTopology/mwtnTopology-module/src/main/resources/mwtnTopology/templates/links.tpl.html create mode 100755 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnTopology/mwtnTopology-module/src/main/resources/mwtnTopology/templates/linksGrid.tpl.html create mode 100755 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnTopology/mwtnTopology-module/src/main/resources/mwtnTopology/templates/maps.tpl.html create mode 100755 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnTopology/mwtnTopology-module/src/main/resources/mwtnTopology/templates/networkElementsGrid.tpl.html create mode 100755 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnTopology/mwtnTopology-module/src/main/resources/mwtnTopology/templates/nodes.tpl.html create mode 100755 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnTopology/mwtnTopology-module/src/main/resources/mwtnTopology/templates/physicalView.tpl.html create mode 100755 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnTopology/mwtnTopology-module/src/main/resources/mwtnTopology/templates/portsGrid.tpl.html create mode 100755 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnTopology/mwtnTopology-module/src/main/resources/mwtnTopology/templates/ptpLinksGrid.tpl.html create mode 100755 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnTopology/mwtnTopology-module/src/main/resources/mwtnTopology/templates/siteDetails.tpl.html create mode 100755 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnTopology/mwtnTopology-module/src/main/resources/mwtnTopology/templates/siteGrid.tpl.html create mode 100755 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnTopology/mwtnTopology-module/src/main/resources/mwtnTopology/templates/siteLinkGrid.tpl.html create mode 100755 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnTopology/mwtnTopology-module/src/main/resources/mwtnTopology/templates/sitePathGrid.tpl.html create mode 100755 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnTopology/mwtnTopology-module/src/main/resources/mwtnTopology/templates/siteView.tpl.html create mode 100755 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnTopology/mwtnTopology-module/src/main/resources/mwtnTopology/templates/topology.tpl.html create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnTopology/pom.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/odlChat/odlChat-bundle/pom.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/odlChat/odlChat-bundle/src/main/resources/OSGI-INF/blueprint/blueprint.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/odlChat/odlChat-module/pom.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/odlChat/odlChat-module/src/main/resources/odlChat/logo_chat.gif create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/odlChat/odlChat-module/src/main/resources/odlChat/odlChat-custom.css create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/odlChat/odlChat-module/src/main/resources/odlChat/odlChat.controller.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/odlChat/odlChat-module/src/main/resources/odlChat/odlChat.module.js create mode 100755 sdnr/wireless-transport/code-Carbon-SR1/ux/odlChat/odlChat-module/src/main/resources/odlChat/odlChat.png create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/odlChat/odlChat-module/src/main/resources/odlChat/odlChat.services.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/odlChat/odlChat-module/src/main/resources/odlChat/odlChat.tpl.html create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/odlChat/pom.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/onapAai/onapAai-bundle/pom.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/onapAai/onapAai-bundle/src/main/resources/OSGI-INF/blueprint/blueprint.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/onapAai/onapAai-module/pom.xml create mode 100755 sdnr/wireless-transport/code-Carbon-SR1/ux/onapAai/onapAai-module/src/main/resources/onapAai/images/onapAai.png create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/onapAai/onapAai-module/src/main/resources/onapAai/onapAai-custom.css create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/onapAai/onapAai-module/src/main/resources/onapAai/onapAai.controller.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/onapAai/onapAai-module/src/main/resources/onapAai/onapAai.module.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/onapAai/onapAai-module/src/main/resources/onapAai/onapAai.services.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/onapAai/onapAai-module/src/main/resources/onapAai/onapAai.tpl.html create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/onapAai/pom.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/onapDcae/onapDcae-bundle/pom.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/onapDcae/onapDcae-bundle/src/main/resources/OSGI-INF/blueprint/blueprint.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/onapDcae/onapDcae-module/pom.xml create mode 100755 sdnr/wireless-transport/code-Carbon-SR1/ux/onapDcae/onapDcae-module/src/main/resources/onapDcae/images/onap-5g-architecture.png create mode 100755 sdnr/wireless-transport/code-Carbon-SR1/ux/onapDcae/onapDcae-module/src/main/resources/onapDcae/images/onapDcae.png create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/onapDcae/onapDcae-module/src/main/resources/onapDcae/onapDcae-custom.css create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/onapDcae/onapDcae-module/src/main/resources/onapDcae/onapDcae.controller.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/onapDcae/onapDcae-module/src/main/resources/onapDcae/onapDcae.module.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/onapDcae/onapDcae-module/src/main/resources/onapDcae/onapDcae.services.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/onapDcae/onapDcae-module/src/main/resources/onapDcae/onapDcae.tpl.html create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/onapDcae/pom.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/onapSo/onapSo-bundle/pom.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/onapSo/onapSo-bundle/src/main/resources/OSGI-INF/blueprint/blueprint.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/onapSo/onapSo-module/pom.xml create mode 100755 sdnr/wireless-transport/code-Carbon-SR1/ux/onapSo/onapSo-module/src/main/resources/onapSo/images/onap-end-to-end-slicing.png create mode 100755 sdnr/wireless-transport/code-Carbon-SR1/ux/onapSo/onapSo-module/src/main/resources/onapSo/images/onapSo.png create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/onapSo/onapSo-module/src/main/resources/onapSo/onapSo-custom.css create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/onapSo/onapSo-module/src/main/resources/onapSo/onapSo.controller.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/onapSo/onapSo-module/src/main/resources/onapSo/onapSo.module.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/onapSo/onapSo-module/src/main/resources/onapSo/onapSo.services.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/onapSo/onapSo-module/src/main/resources/onapSo/onapSo.tpl.html create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/onapSo/pom.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/otnBrowser/otnBrowser-bundle/pom.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/otnBrowser/otnBrowser-bundle/src/main/resources/OSGI-INF/blueprint/blueprint.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/otnBrowser/otnBrowser-module/pom.xml create mode 100755 sdnr/wireless-transport/code-Carbon-SR1/ux/otnBrowser/otnBrowser-module/src/main/resources/otnBrowser/images/otnBrowser.png create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/otnBrowser/otnBrowser-module/src/main/resources/otnBrowser/otnBrowser-custom.css create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/otnBrowser/otnBrowser-module/src/main/resources/otnBrowser/otnBrowser.controller.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/otnBrowser/otnBrowser-module/src/main/resources/otnBrowser/otnBrowser.module.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/otnBrowser/otnBrowser-module/src/main/resources/otnBrowser/otnBrowser.services.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/otnBrowser/otnBrowser-module/src/main/resources/otnBrowser/otnBrowser.tpl.html create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/otnBrowser/pom.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/pom.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/security/pom.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/security/security-bundle/pom.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/security/security-bundle/src/main/resources/OSGI-INF/blueprint/blueprint.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/security/security-module/pom.xml create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/security/security-module/src/main/resources/security/build.config.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/security/security-module/src/main/resources/security/gulpfile.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/security/security-module/src/main/resources/security/package.json create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/security/security-module/src/main/resources/security/src/security.controller.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/security/security-module/src/main/resources/security/src/security.controller.ts create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/security/security-module/src/main/resources/security/src/security.custom.css create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/security/security-module/src/main/resources/security/src/security.module.js create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/security/security-module/src/main/resources/security/src/security.module.ts create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/security/security-module/src/main/resources/security/src/security.service.ts create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/security/security-module/src/main/resources/security/src/security.tpl.html create mode 100644 sdnr/wireless-transport/code-Carbon-SR1/ux/security/security-module/src/main/resources/security/src/templates/userDetails.html create mode 100755 sdnr/wireless-transport/code-Carbon-SR1/ux/ux-dev.sh diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..eb5a316c --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +target diff --git a/README.md b/README.md old mode 100755 new mode 100644 index 79e694fc..2584bd32 --- a/README.md +++ b/README.md @@ -1,8 +1 @@ -This source repository contains the code for CCSDK standalone applications -(e.g. microservices) -To compile this code: - -1. Make sure your local Maven settings file ($HOME/.m2/settings.xml) contains references to the ONAP repositories and OpenDaylight repositories. - -2. To compile, run "mvn clean install". - +Just a test for gerrit!!! diff --git a/sdnr/wireless-transport/code-Carbon-SR1/README.md b/sdnr/wireless-transport/code-Carbon-SR1/README.md new file mode 100644 index 00000000..31fd4999 --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/README.md @@ -0,0 +1,119 @@ +#Setting up Carbon SR1 development environment + +HINT1: Not all applications, available under code/apps are integrated into code-Carbon-SR1/apps. +HINT2: Modify the code under the *code* subdirectory. Modify in a way that it can be used in Boron and Carbon. + +This *code-Carbon-SR1* folder does compile the sources from *code* in a Opendayligh Cabron SR1 context. +Mainly the pom.xml files are adapted. Sources are used from *code* referenced by a symbolic link. + +##Recommended structure + + - $HOME/Downloads + - $HOME/odl + - WirelessTransportEmulator [from here: git MELACON](https://github.com/Melacon/WirelessTransportEmulator.git) + - CENTENNIAL [from here: git](https://github.com/OpenNetworkingFoundation/CENTENNIAL.git) + + +Working location for compiling Carbon code and managing the Carbon karaf container is here: **$HOME/odl/CENTENNIAL/code-Carbon-SR1** +Working directory for source code editing for Boron base is here: **$HOME/odl/CENTENNIAL/code** + +## Steps + +### 0. Do the installation of Java, maven, git npm and so on form the Boron/code description + +Versions of tools that we use today (April 2018): + - Apache Maven 3.3.9 + - Maven home: /usr/share/maven + - Java version: 1.8.0_162, vendor: Oracle Corporation + - Java home: /usr/lib/jvm/java-8-openjdk-amd64/jre + - Default locale: en_US, platform encoding: UTF-8 + - OS name: "linux", version: "4.13.0-37-generic", arch: "amd64", family: "unix" + - git version 2.7.4 + - node: v4.2.6 + - npm: 3.5.2 + - jq: jq-1.5-1-a5b5cbe + - bower 1.8.0 + + +### 1. Download Carbon SR1 container + + cd $HOME/Downloads + wget Carbon tar https://nexus.opendaylight.org/content/groups/public/org/opendaylight/integration/distribution-karaf/0.6.1-Carbon/distribution-karaf-0.6.1-Carbon.tar.gz + +### 2. Creating dist.conf file + + cd $HOME/odl/CENTENNIAL/code-Carbon-SR1 + +Create the file "dist.conf" with VI or any editor. Adapt template: + + #Own configuration + #Mandatory + ODL_KARAF_DIST="distribution-karaf-0.6.1-Carbon" + ODL_KARAF_HOME=$HOME/odl/$ODL_KARAF_DIST + ODL_KARAF_DISTGZ="$HOME/Downloads/"$ODL_KARAF_DIST".tar.gz" + export JAVA_HOME="/usr/lib/jvm/java-8-openjdk-amd64" + #Optional for TAR build file creation + #If system is to slow it may be appropriate to specify a delay + #ODL_KARAF_AFTERCMD_DELAY_SECONDS="20" + ODL_BUILD_HOME="$HOME/build/att" + ODL_KARAF_STARTUP_SCRIPT="karaf_startup_all" + + +### 3. Compile everything to m2 + + cd $HOME/odl/CENTENNIAL/code-Carbon-SR1 + mvn clean install -DskipTests + +Should end without error indication + +### 4. Prepare container + +The *odl* script is replacing the older "install.sh" script collection. It will use the local settings, specified in dist.conf and can manage the karaf container specified by the configuration file. . + +The prepare command will create + - The preconfigured karaf container + - Will create the link "dist" that points to the karaf container root, like $ODL_KARAF_HOME in the Boron environment. + E.g. cd to log directory works via cd dist/data/log + +Execute prepare: + + cd $HOME/odl/CENTENNIAL/code-Carbon-SR1 + ./odl prepare + +### 5. Install the apps and Start the container + +Install from $HOME/.m2/repository into dist/system and install features. + + ./odl im + + +### Further commands of odl script + +List of all ./odl commands: +``` + a for build all and install from M2 + build build subsystem + bower for install bower + cli start karaf command line + env List environment variables + d for devicemanager and install from M2 + dbclean clean db and load with initial data + debug activate debug for netconf and mwtn + distremove remove existing karaf distribution + dlux install DLUX patch + help List this help + ib for install from Build-directory + im for install from M2-directory + imd for install from M2-directory. Delete logs before start command + it fn install tar file to container + karafclean start clean and install apps on karaf + migrate migrate Param1 Param2 Migrate on localhost + prepare to install and prepare a karaf. Packed Version expected in Downloads + test do some testing + start start karaf + status display karaf status + stop stop and wait karaf + restart stop and start karaf + repoclean clean the repositories + v get Versions +``` \ No newline at end of file diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/apigateway/features/.gitignore b/sdnr/wireless-transport/code-Carbon-SR1/apps/apigateway/features/.gitignore new file mode 100644 index 00000000..eacf31a6 --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/apigateway/features/.gitignore @@ -0,0 +1 @@ +/target-ide/ diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/apigateway/features/pom.xml b/sdnr/wireless-transport/code-Carbon-SR1/apps/apigateway/features/pom.xml new file mode 100644 index 00000000..716089ae --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/apigateway/features/pom.xml @@ -0,0 +1,24 @@ + + 4.0.0 + + com.highstreet.technologies.apigateway + apigateway-features + 0.5.1-SNAPSHOT + ${project.artifactId} + + + org.opendaylight.odlparent + features-parent + 1.8.1-Carbon + + + + + + ${project.groupId} + apigateway-impl + ${project.version} + + + diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/apigateway/features/src/main/features/features.xml b/sdnr/wireless-transport/code-Carbon-SR1/apps/apigateway/features/src/main/features/features.xml new file mode 100644 index 00000000..0c3d93b4 --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/apigateway/features/src/main/features/features.xml @@ -0,0 +1,11 @@ + + + + + http + mvn:com.highstreet.technologies.apigateway/apigateway-impl/${project.version} + + + diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/apigateway/impl/pom.xml b/sdnr/wireless-transport/code-Carbon-SR1/apps/apigateway/impl/pom.xml new file mode 100644 index 00000000..99135984 --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/apigateway/impl/pom.xml @@ -0,0 +1,35 @@ + + + + + 4.0.0 + com.highstreet.technologies.apigateway + apigateway-impl + bundle + + + com.highstreet.technologies.apigateway + apigateway-parent + 0.5.1-SNAPSHOT + + + + + javax.servlet + servlet-api + 2.5 + + + org.slf4j + slf4j-log4j12 + 1.6.6 + + + org.json + json + 20131018 + + + + diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/apigateway/impl/src/main/java/com/highstreet/technologies/apigateway/AaiServlet.java b/sdnr/wireless-transport/code-Carbon-SR1/apps/apigateway/impl/src/main/java/com/highstreet/technologies/apigateway/AaiServlet.java new file mode 100644 index 00000000..bf54ae1e --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/apigateway/impl/src/main/java/com/highstreet/technologies/apigateway/AaiServlet.java @@ -0,0 +1,264 @@ +package com.highstreet.technologies.apigateway; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.HttpURLConnection; +import java.net.URL; +import java.net.URLConnection; +import java.nio.charset.StandardCharsets; +import java.security.KeyManagementException; +import java.security.NoSuchAlgorithmException; +import java.util.Enumeration; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; + +import javax.net.ssl.HostnameVerifier; +import javax.net.ssl.HttpsURLConnection; +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLSession; +import javax.net.ssl.TrustManager; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class AaiServlet extends HttpServlet { + + /** + * + */ + private static final long serialVersionUID = 5946205120796162644L; + private static Logger LOG = LoggerFactory.getLogger(AaiServlet.class); + private static final byte[] OFFLINE_RESPONSE_BYTES = "AAI interface is offline".getBytes(StandardCharsets.UTF_8); + private static final int BUFSIZE = 1024; + private static SSLContext sc; + private static boolean TRUSTALL = false; + + /** + * + * @throws NoSuchAlgorithmException + * @throws KeyManagementException + */ + private static void setupSslTrustAll() throws NoSuchAlgorithmException, KeyManagementException { + + sc = SSLContext.getInstance("TLSv1.2"); + TrustManager[] trustCerts = null; + if (TRUSTALL) { + trustCerts = new TrustManager[] { new javax.net.ssl.X509TrustManager() { + public java.security.cert.X509Certificate[] getAcceptedIssuers() { + return null; + } + + public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType) { + } + + public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType) { + } + } }; + + } + // Init the SSLContext with a TrustManager[] and SecureRandom() + sc.init(null, trustCerts, new java.security.SecureRandom()); + + } + + public AaiServlet() { + + try { + MyProperties.Instantiate(MyProperties.PROPFILE); + } catch (Exception e) { + LOG.error(e.getMessage()); + } + + TRUSTALL = MyProperties.getInstance().trustInsecure(); + try { + setupSslTrustAll(); + } catch (Exception e) { + LOG.error("error setting up SSL: " + e.getMessage()); + } + } + + @Override + protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + if (MyProperties.getInstance().isAAIOff()) { + this.sendOffResponse(resp); + } else { + HttpURLConnection http = (HttpURLConnection) this.getConnection(req, "PUT"); + this.handleRequest(http, req, resp, "PUT"); + http.disconnect(); + } + } + + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + if (MyProperties.getInstance().isAAIOff()) { + this.sendOffResponse(resp); + } else { + HttpURLConnection http = (HttpURLConnection) this.getConnection(req, "GET"); + this.handleRequest(http, req, resp, "GET"); + http.disconnect(); + } + } + + @Override + protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + if (MyProperties.getInstance().isAAIOff()) { + this.sendOffResponse(resp); + } else { + HttpURLConnection http = (HttpURLConnection) this.getConnection(req, "POST"); + this.handleRequest(http, req, resp, "POST"); + http.disconnect(); + } + } + + @Override + protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + if (MyProperties.getInstance().isAAIOff()) { + this.sendOffResponse(resp); + } else { + HttpURLConnection http = (HttpURLConnection) this.getConnection(req, "DELETE"); + this.handleRequest(http, req, resp, "DELETE"); + http.disconnect(); + } + + } + + @Override + protected void doOptions(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + // if(MyProperties.getInstance().corsEnabled()) + // resp.addHeader("Access-Control-Allow-Origin","*"); + super.doOptions(req, resp); + } + + private void sendOffResponse(HttpServletResponse response) { + response.setStatus(200);// HTML/OK + response.setHeader("Content-Type", "text/html; charset=utf-8"); + try { + response.getOutputStream().write(OFFLINE_RESPONSE_BYTES); + } catch (IOException e) { + LOG.debug("problem writing offline response"); + } + + } + + private URLConnection getConnection(HttpServletRequest req, final String method) throws IOException { + + LOG.debug(method + " Request"); + // String query = req.getQueryString(); + String uri=req.getRequestURI(); + if(uri.startsWith("/")) + uri=uri.substring(1); + if(uri.startsWith("aai")) + uri=uri.substring("aai".length()); + if(uri.startsWith("/")) + uri=uri.substring(1); + String base=MyProperties.getInstance().getAAIBaseUrl() ; + if(!base.endsWith("/")) + base+="/"; + + String surl =base+uri; + // if (query != null && query.length() > 0) + // surl += "?" + query; + LOG.debug("RemoteURL: " + surl); + URL url = new URL(surl); + URLConnection http = url.openConnection(); + ((HttpURLConnection) http).setRequestMethod(method); + if (url.toString().startsWith("https")) { + ((HttpsURLConnection) http).setSSLSocketFactory(sc.getSocketFactory()); + if (TRUSTALL) { + HostnameVerifier allHostsValid = new HostnameVerifier() { + public boolean verify(String hostname, SSLSession session) { + return true; + } + }; + ((HttpsURLConnection) http).setHostnameVerifier(allHostsValid); + } + } + http.setDoOutput(true); + // copy request headers + String s = ""; + Enumeration headers = req.getHeaderNames(); + while (headers.hasMoreElements()) { + String h = headers.nextElement(); + String v = req.getHeader(h); + if (h != null && h.equals("Host")) + v = url.getAuthority(); + s += String.format("%s:%s;", h, v); + http.setRequestProperty(h, v); + } + Map addHeaders=MyProperties.getInstance().getAAIHeaders(); + if(addHeaders!=null) + { + for(Entry entry:addHeaders.entrySet()) + { + http.setRequestProperty(entry.getKey(), entry.getValue()); + } + } + LOG.debug("Request Headers: " + s); + return http; + } + + private void handleRequest(HttpURLConnection http, HttpServletRequest req, HttpServletResponse resp, String method) + throws IOException { + byte[] buffer = new byte[BUFSIZE]; + int len = 0, lensum = 0; + // send request + // Send the message to destination + if (!method.equals("GET")) { + try (OutputStream output = http.getOutputStream()) { + while (true) { + len = req.getInputStream().read(buffer, 0, BUFSIZE); + if (len <= 0) + break; + lensum += len; + output.write(buffer, 0, len); + } + } + } + LOG.debug("written " + lensum + " data out"); + int responseCode = ((HttpURLConnection) http).getResponseCode(); + // Receive answer + InputStream response; + if (responseCode >= 200 && responseCode < 300) + response = http.getInputStream(); + else { + response = http.getErrorStream(); + if (response == null) + http.getInputStream(); + } + + LOG.debug("ResponseCode: " + responseCode); + resp.setStatus(responseCode); + Map> set = http.getHeaderFields(); + String s = ""; + if (set != null) { + for (Map.Entry> entry : set.entrySet()) { + if (entry.getKey() == null) + continue; + for (String v : entry.getValue()) { + resp.setHeader(entry.getKey(), v); + s += String.format("%s:%s;", entry.getKey(), v); + } + + } + } + LOG.debug("Received Headers: " + s); + lensum = 0; + if (response != null) { + while (true) { + len = response.read(buffer, 0, BUFSIZE); + if (len <= 0) + break; + lensum += len; + resp.getOutputStream().write(buffer, 0, len); + } + } else + LOG.debug("response is null"); + LOG.debug("Received " + lensum + " bytes"); + } +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/apigateway/impl/src/main/java/com/highstreet/technologies/apigateway/EsServlet.java b/sdnr/wireless-transport/code-Carbon-SR1/apps/apigateway/impl/src/main/java/com/highstreet/technologies/apigateway/EsServlet.java new file mode 100644 index 00000000..a1e87274 --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/apigateway/impl/src/main/java/com/highstreet/technologies/apigateway/EsServlet.java @@ -0,0 +1,257 @@ +package com.highstreet.technologies.apigateway; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.HttpURLConnection; +import java.net.URL; +import java.net.URLConnection; +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; +import java.security.KeyManagementException; +import java.security.NoSuchAlgorithmException; +import java.util.Enumeration; +import java.util.List; +import java.util.Map; + +import javax.net.ssl.HostnameVerifier; +import javax.net.ssl.HttpsURLConnection; +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLSession; +import javax.net.ssl.TrustManager; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class EsServlet extends HttpServlet { + + /** + * + */ + private static final long serialVersionUID = -3996363343749995011L; + private static Logger LOG = LoggerFactory.getLogger(EsServlet.class); + private static final int BUFSIZE = 1024; + private static final byte[] OFFLINE_RESPONSE_BYTES = "Database interface is offline" + .getBytes(StandardCharsets.UTF_8); + private static SSLContext sc; + private static boolean TRUSTALL = false; + + /** + * + * @throws NoSuchAlgorithmException + * @throws KeyManagementException + */ + private static void setupSslTrustAll() throws NoSuchAlgorithmException, KeyManagementException { + + sc = SSLContext.getInstance("TLSv1.2"); + TrustManager[] trustCerts = null; + if (TRUSTALL) { + trustCerts = new TrustManager[] { new javax.net.ssl.X509TrustManager() { + public java.security.cert.X509Certificate[] getAcceptedIssuers() { + return null; + } + + public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType) { + } + + public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType) { + } + } }; + + } + // Init the SSLContext with a TrustManager[] and SecureRandom() + sc.init(null, trustCerts, new java.security.SecureRandom()); + + } + + public EsServlet() { + + try { + MyProperties.Instantiate(MyProperties.PROPFILE); + } catch (Exception e) { + LOG.error(e.getMessage()); + } + + TRUSTALL = MyProperties.getInstance().trustInsecure(); + try { + setupSslTrustAll(); + } catch (Exception e) { + LOG.error("error setting up SSL: " + e.getMessage()); + } + } + + @Override + protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + if (MyProperties.getInstance().isEsOff()) { + this.sendOffResponse(resp); + } else { + HttpURLConnection http = (HttpURLConnection) this.getConnection(req, "PUT"); + this.handleRequest(http, req, resp, "PUT"); + http.disconnect(); + } + } + + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + if (MyProperties.getInstance().isEsOff()) { + this.sendOffResponse(resp); + } else { + HttpURLConnection http = (HttpURLConnection) this.getConnection(req, "GET"); + this.handleRequest(http, req, resp, "GET"); + http.disconnect(); + } + } + + @Override + protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + if (MyProperties.getInstance().isEsOff()) { + this.sendOffResponse(resp); + } else { + HttpURLConnection http = (HttpURLConnection) this.getConnection(req, "POST"); + this.handleRequest(http, req, resp, "POST"); + http.disconnect(); + } + } + + @Override + protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + if (MyProperties.getInstance().isEsOff()) { + this.sendOffResponse(resp); + } else { + HttpURLConnection http = (HttpURLConnection) this.getConnection(req, "DELETE"); + this.handleRequest(http, req, resp, "DELETE"); + http.disconnect(); + } + + } + + @Override + protected void doOptions(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + if (MyProperties.getInstance().corsEnabled()) { + resp.addHeader("Access-Control-Allow-Origin", "*"); + resp.addHeader("Access-Control-Allow-Methods", "GET,PUT,POST,DELETE"); + resp.addHeader("Access-Control-Allow-Headers", "Content-Type, Authorization"); + } + super.doOptions(req, resp); + } + + private void sendOffResponse(HttpServletResponse response) { + response.setStatus(200);// HTML/OK + response.setHeader("Content-Type", "text/html; charset=utf-8"); + try { + response.getOutputStream().write(OFFLINE_RESPONSE_BYTES); + } catch (IOException e) { + LOG.debug("problem writing offline response"); + } + + } + + private URLConnection getConnection(HttpServletRequest req, final String method) throws IOException { + + LOG.debug(method + " Request"); + // String query = req.getQueryString(); + String uri = req.getRequestURI(); + if (uri != null && uri.length() > 0) + uri = uri.substring("/database".length()); + String surl = MyProperties.getInstance().getEsBaseUrl() + uri; + // if (query != null && query.length() > 0) + // surl += "?" + query; + LOG.debug("RemoteURL: " + surl); + URL url = new URL(surl); + URLConnection http = url.openConnection(); + ((HttpURLConnection) http).setRequestMethod(method); + if (url.toString().startsWith("https")) { + ((HttpsURLConnection) http).setSSLSocketFactory(sc.getSocketFactory()); + if (TRUSTALL) { + HostnameVerifier allHostsValid = new HostnameVerifier() { + public boolean verify(String hostname, SSLSession session) { + return true; + } + }; + ((HttpsURLConnection) http).setHostnameVerifier(allHostsValid); + } + } + http.setDoOutput(true); + // copy request headers + String s = ""; + Enumeration headers = req.getHeaderNames(); + while (headers.hasMoreElements()) { + String h = headers.nextElement(); + String v = req.getHeader(h); + if (h != null && h.equals("Host")) + v = url.getAuthority(); + s += String.format("%s:%s;", h, v); + http.setRequestProperty(h, v); + } + LOG.debug("Request Headers: " + s); + return http; + } + + private void handleRequest(HttpURLConnection http, HttpServletRequest req, HttpServletResponse resp, String method) + throws IOException { + byte[] buffer = new byte[BUFSIZE]; + int len = 0, lensum = 0; + // send request + // Send the message to destination + if (!method.equals("GET")) { + try (OutputStream output = http.getOutputStream()) { + while (true) { + len = req.getInputStream().read(buffer, 0, BUFSIZE); + if (len <= 0) + break; + lensum += len; + output.write(buffer, 0, len); + } + } + } + LOG.debug("written " + lensum + " data out"); + int responseCode = ((HttpURLConnection) http).getResponseCode(); + // Receive answer + InputStream response; + if (responseCode >= 200 && responseCode < 300) + response = http.getInputStream(); + else { + response = http.getErrorStream(); + if (response == null) + http.getInputStream(); + } + + LOG.debug("ResponseCode: " + responseCode); + resp.setStatus(responseCode); + Map> set = http.getHeaderFields(); + String s = ""; + if (set != null) { + for (Map.Entry> entry : set.entrySet()) { + if (entry.getKey() == null) + continue; + for (String v : entry.getValue()) { + resp.setHeader(entry.getKey(), v); + s += String.format("%s:%s;", entry.getKey(), v); + } + if (MyProperties.getInstance().corsEnabled()) { + resp.setHeader("Access-Control-Allow-Origin", "*"); + //resp.setHeader("Access-Control-Allow-Methods", "GET,PUT,POST,DELETE"); + resp.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization"); + } + + } + } + LOG.debug("Received Headers: " + s); + lensum = 0; + if (response != null) { + while (true) { + len = response.read(buffer, 0, BUFSIZE); + if (len <= 0) + break; + lensum += len; + resp.getOutputStream().write(buffer, 0, len); + } + } else + LOG.debug("response is null"); + LOG.debug("Received " + lensum + " bytes"); + } +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/apigateway/impl/src/main/java/com/highstreet/technologies/apigateway/MSServlet.java b/sdnr/wireless-transport/code-Carbon-SR1/apps/apigateway/impl/src/main/java/com/highstreet/technologies/apigateway/MSServlet.java new file mode 100644 index 00000000..7f087a5a --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/apigateway/impl/src/main/java/com/highstreet/technologies/apigateway/MSServlet.java @@ -0,0 +1,259 @@ +package com.highstreet.technologies.apigateway; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.HttpURLConnection; +import java.net.URL; +import java.net.URLConnection; +import java.nio.charset.StandardCharsets; +import java.security.KeyManagementException; +import java.security.NoSuchAlgorithmException; +import java.util.Enumeration; +import java.util.List; +import java.util.Map; + +import javax.net.ssl.HostnameVerifier; +import javax.net.ssl.HttpsURLConnection; +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLSession; +import javax.net.ssl.TrustManager; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class MSServlet extends HttpServlet { + + /** + * + */ + private static final long serialVersionUID = -5361461082028405171L; + private static Logger LOG = LoggerFactory.getLogger(MSServlet.class); + private static final byte[] OFFLINE_RESPONSE_BYTES = "MediatorServer interface is offline" + .getBytes(StandardCharsets.UTF_8); + private static final int BUFSIZE = 1024; + private static SSLContext sc; + private static boolean TRUSTALL = false; + + /** + * + * @throws NoSuchAlgorithmException + * @throws KeyManagementException + */ + private static void setupSslTrustAll() throws NoSuchAlgorithmException, KeyManagementException { + + sc = SSLContext.getInstance("TLSv1.2"); + TrustManager[] trustCerts = null; + if (TRUSTALL) { + trustCerts = new TrustManager[] { new javax.net.ssl.X509TrustManager() { + public java.security.cert.X509Certificate[] getAcceptedIssuers() { + return null; + } + + public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType) { + } + + public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType) { + } + } }; + + } + // Init the SSLContext with a TrustManager[] and SecureRandom() + sc.init(null, trustCerts, new java.security.SecureRandom()); + + } + + public MSServlet() { + + try { + MyProperties.Instantiate(MyProperties.PROPFILE); + } catch (Exception e) { + LOG.error(e.getMessage()); + } + + TRUSTALL = MyProperties.getInstance().trustInsecure(); + try { + setupSslTrustAll(); + } catch (Exception e) { + LOG.error("error setting up SSL: " + e.getMessage()); + } + } + + @Override + protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + HttpURLConnection http = (HttpURLConnection) this.getConnection(req, "PUT"); + this.handleRequest(http, req, resp, "PUT"); + if (http != null) + http.disconnect(); + } + + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + HttpURLConnection http = (HttpURLConnection) this.getConnection(req, "GET"); + this.handleRequest(http, req, resp, "GET"); + if (http != null) + http.disconnect(); + } + + @Override + protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + HttpURLConnection http = (HttpURLConnection) this.getConnection(req, "POST"); + this.handleRequest(http, req, resp, "POST"); + if (http != null) + http.disconnect(); + } + + @Override + protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + HttpURLConnection http = (HttpURLConnection) this.getConnection(req, "DELETE"); + this.handleRequest(http, req, resp, "DELETE"); + if (http != null) + http.disconnect(); + + } + + @Override + protected void doOptions(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + // if(MyProperties.getInstance().corsEnabled()) + // resp.addHeader("Access-Control-Allow-Origin","*"); + super.doOptions(req, resp); + } + + private void sendOffResponse(HttpServletResponse response) { + response.setStatus(200);// HTML/OK + response.setHeader("Content-Type", "text/html; charset=utf-8"); + try { + response.getOutputStream().write(OFFLINE_RESPONSE_BYTES); + } catch (IOException e) { + LOG.debug("problem writing offline response"); + } + + } + + public String getBaseUrl(long id) { + return "http://mediatorsnmp.fritz.box:7070"; + } + + private URLConnection getConnection(HttpServletRequest req, final String method) throws IOException { + + LOG.debug(method + " Request"); + String query = req.getQueryString(); + String uri = req.getRequestURI(); + // uri=/ms/1/api/; query=task=getconfig + LOG.debug("uri=" + uri + "; query=" + query); + uri = uri.substring("/ms/".length()); + long id = 0; + try { + id = Long.parseLong(uri.substring(0, uri.indexOf("/"))); + uri = uri.substring(uri.indexOf("/")); + } catch (Exception err) { + LOG.debug(err.getMessage()); + } + if (id > 0) { + String surl = this.getBaseUrl(id) + uri; + if (query != null && query.length() > 0) + surl += "?" + query; + LOG.debug("RemoteURL: " + surl); + URL url = new URL(surl); + URLConnection http = url.openConnection(); + ((HttpURLConnection) http).setRequestMethod(method); + if (url.toString().startsWith("https")) { + ((HttpsURLConnection) http).setSSLSocketFactory(sc.getSocketFactory()); + if (TRUSTALL) { + HostnameVerifier allHostsValid = new HostnameVerifier() { + public boolean verify(String hostname, SSLSession session) { + return true; + } + }; + ((HttpsURLConnection) http).setHostnameVerifier(allHostsValid); + } + } + http.setDoOutput(true); + // copy request headers + String s = ""; + Enumeration headers = req.getHeaderNames(); + while (headers.hasMoreElements()) { + String h = headers.nextElement(); + String v = req.getHeader(h); + if (h != null && h.equals("Host")) + v = url.getAuthority(); + s += String.format("%s:%s;", h, v); + http.setRequestProperty(h, v); + } + LOG.debug("Request Headers: " + s); + return http; + } else { + LOG.debug("no ms id found"); + return null; + } + + } + + private void handleRequest(HttpURLConnection http, HttpServletRequest req, HttpServletResponse resp, String method) + throws IOException { + if (http == null) { + LOG.debug("nothing to answer"); + resp.setStatus(404); + } else { + byte[] buffer = new byte[BUFSIZE]; + int len = 0, lensum = 0; + // send request + // Send the message to destination + if (!method.equals("GET")) { + try (OutputStream output = http.getOutputStream()) { + while (true) { + len = req.getInputStream().read(buffer, 0, BUFSIZE); + if (len <= 0) + break; + lensum += len; + output.write(buffer, 0, len); + } + } + } + LOG.debug("written " + lensum + " data out"); + int responseCode = ((HttpURLConnection) http).getResponseCode(); + // Receive answer + InputStream response; + if (responseCode >= 200 && responseCode < 300) + response = http.getInputStream(); + else { + response = http.getErrorStream(); + if (response == null) + http.getInputStream(); + } + + LOG.debug("ResponseCode: " + responseCode); + resp.setStatus(responseCode); + Map> set = http.getHeaderFields(); + String s = ""; + if (set != null) { + for (Map.Entry> entry : set.entrySet()) { + if (entry.getKey() == null) + continue; + for (String v : entry.getValue()) { + resp.setHeader(entry.getKey(), v); + s += String.format("%s:%s;", entry.getKey(), v); + } + + } + } + LOG.debug("Received Headers: " + s); + lensum = 0; + if (response != null) { + while (true) { + len = response.read(buffer, 0, BUFSIZE); + if (len <= 0) + break; + lensum += len; + resp.getOutputStream().write(buffer, 0, len); + } + } else + LOG.debug("response is null"); + LOG.debug("Received " + lensum + " bytes"); + } + } +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/apigateway/impl/src/main/java/com/highstreet/technologies/apigateway/MyProperties.java b/sdnr/wireless-transport/code-Carbon-SR1/apps/apigateway/impl/src/main/java/com/highstreet/technologies/apigateway/MyProperties.java new file mode 100644 index 00000000..81ada7ce --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/apigateway/impl/src/main/java/com/highstreet/technologies/apigateway/MyProperties.java @@ -0,0 +1,126 @@ +package com.highstreet.technologies.apigateway; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileWriter; +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; +import java.util.Properties; + +import org.json.JSONArray; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class MyProperties { + + private static Logger LOG = LoggerFactory.getLogger(MyProperties.class); + public static final String PROPFILE = "etc/apigateway.properties"; + private static final String DEFAULT_AAI_HEADERS = "[\"X-FromAppId:SDNR\",\"Authorization: Basic QUFJOkFBSQ==\"]"; + + @Override + public String toString() { + return "MyProperties [aaiBase=" + aaiBase + ", aaiHeaders=" + aaiHeaders + ", esBase=" + esBase + + ", trustInsecure=" + trustInsecure + ", corsEnabled=" + corsEnabled + "]"; + } + + private static MyProperties mObj; + + private String aaiBase; + private Map aaiHeaders; + private String esBase; + + private boolean trustInsecure; + + private boolean corsEnabled; + + public boolean isAAIOff() { + return this.aaiBase == null ? true : this.aaiBase.equals("off"); + } + + public boolean isEsOff() { + return this.esBase == null ? true : this.esBase.equals("off"); + } + + public String getAAIBaseUrl() { + return this.aaiBase; + } + + public String getEsBaseUrl() { + return this.esBase; + } + + public Map getAAIHeaders() { + return this.aaiHeaders; + } + + public boolean trustInsecure() { + return this.trustInsecure; + } + + public boolean corsEnabled() { + return this.corsEnabled; + } + + public static MyProperties Instantiate(String filename) throws IOException, NumberFormatException { + mObj = new MyProperties(filename); + if (mObj != null) + LOG.debug("instantiated:" + mObj.toString()); + return mObj; + } + + private MyProperties(String filename) throws IOException, NumberFormatException { + this.aaiBase = "off"; + this.trustInsecure = false; + File f = new File(filename); + if (!f.exists()) { + this.writeDefaults(f); + } + Properties defaultProps = new Properties(); + FileInputStream in = new FileInputStream(filename); + defaultProps.load(in); + in.close(); + + this.aaiBase = defaultProps.getProperty("aai", "off"); + this.aaiHeaders = _parseHeadersMap(defaultProps.getProperty("aaiHeaders", DEFAULT_AAI_HEADERS)); + this.esBase = defaultProps.getProperty("database", "off"); + this.trustInsecure = Integer.parseInt(defaultProps.getProperty("insecure", "0")) == 1; + this.corsEnabled = Integer.parseInt(defaultProps.getProperty("cors", "0")) == 1; + } + + private static Map _parseHeadersMap(String s) { + Map r = new HashMap(); + try { + JSONArray a = new JSONArray(s); + if (a != null && a.length() > 0) { + for (int i = 0; i < a.length(); i++) { + String item = a.getString(i); + String[] hlp = item.split(":"); + if (hlp.length > 1) { + r.put(hlp[0], hlp[1]); + } + } + } + } catch (Exception e) { + LOG.warn("problem loading headers map:" + e.getMessage()); + } + return r; + } + + private void writeDefaults(File f) throws IOException { + FileWriter fw = new FileWriter(f); + final String LR = "\n"; + fw.write("aai=off" + LR); + fw.write("aaiHeaders=" + DEFAULT_AAI_HEADERS + LR); + fw.write("database=http://localhost:9200" + LR); + fw.write("insecure=1" + LR); + fw.write("cors=1"); + fw.close(); + + } + + public static MyProperties getInstance() { + return mObj; + } + +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/apigateway/impl/src/main/resources/OSGI-INF/blueprint/blueprint.xml b/sdnr/wireless-transport/code-Carbon-SR1/apps/apigateway/impl/src/main/resources/OSGI-INF/blueprint/blueprint.xml new file mode 100644 index 00000000..c7b3b98d --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/apigateway/impl/src/main/resources/OSGI-INF/blueprint/blueprint.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/apigateway/impl/src/main/test/SimpleTests.java b/sdnr/wireless-transport/code-Carbon-SR1/apps/apigateway/impl/src/main/test/SimpleTests.java new file mode 100644 index 00000000..f2f4e4b8 --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/apigateway/impl/src/main/test/SimpleTests.java @@ -0,0 +1,111 @@ +import java.io.File; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.Iterator; +import org.json.JSONArray; +import org.json.JSONObject; + +public class SimpleTests { + + + private static void testURI() + { + String uri="/ms/1/api/"; + String query="task=getconfig"; + + long id=0; + String remoteUrl=""; + uri = uri.substring("/ms/".length()); + + try { + id = Long.parseLong(uri.substring(0, uri.indexOf("/"))); + uri=uri.substring(uri.indexOf("/")); + } catch (Exception err) { + System.out.println(err.getMessage()); + } + + if(id>0) + { + remoteUrl=baseUrl(id)+uri; + if (query != null && query.length() > 0) + remoteUrl += "?" + query; + } + System.out.println("url="+remoteUrl); + } + private static void testMSDBDataParser() + { + String resp="{\"took\":6,\"timed_out\":false,\"_shards\":{\"total\":5,\"successful\":5,\"failed\":0},\"hits\":{\"total\":2,\"max_score\":1.0,\"hits\":[{\"_index\":\"mwtn_v1\",\"_type\":\"mediator-server\",\"_id\":\"2\",\"_score\":1.0,\"_source\":{\"id\":2,\"name\":\"Server 2\",\"url\":\"http://mediatorsnmp.fritz.box:7070\"}},{\"_index\":\"mwtn_v1\",\"_type\":\"mediator-server\",\"_id\":\"1\",\"_score\":1.0,\"_source\":{\"id\":1,\"name\":\"Server 1\",\"url\":\"http://192.168.11.44:7070\"}}]}}"; + JSONObject ro=new JSONObject(resp); + JSONArray a=ro.getJSONObject("hits").getJSONArray("hits"); + for(int i=0;i results, String path ) { + + File root = new File( path ); + File[] list = root.listFiles(); + + if (list == null) return; + + for ( File f : list ) { + if ( f.isDirectory() ) { + walk(results, f.getAbsolutePath() ); + //System.out.println( "Dir:" + f.getAbsoluteFile() ); + } + else { + //System.out.println( "File:" + f.getAbsoluteFile() ); + if(f.isFile() && f.getName().endsWith(".md") ) + results.add(f); + } + } + } + private static void testFindMDs() + { + final String BASEURI = "/help"; + final int MAX_DEPTH = 10; + String uri="/help/";//req.getRequestURI(); + Path basePath=new File("/home/herbert/odl/distribution-karaf-0.5.3-Boron-SR3").toPath(); + uri=uri.substring(BASEURI.length()); + try + { + ArrayList mdfiles=new ArrayList<>(); + walk(mdfiles,basePath.toAbsolutePath().toString()); + JSONArray a=new JSONArray(); + Iterator it=mdfiles.iterator(); + while(it.hasNext()) + a.put(it.next().toString().substring(basePath.toAbsolutePath().toString().length())); + //resp.getOutputStream().println(a.toString()); + System.out.println(a.toString()); + + } + catch(Exception err) + { + err.printStackTrace(); + } + } + private static void folderTests() + { + Path basePath=new File("/home/herbert/odl/distribution-karaf-0.5.3-Boron-SR3").toPath(); + Path pHelp=basePath.resolve("help/"); + String uri="0.1.0-SNAPSHOT/OpenDaylight"; + System.out.println("phelp="+pHelp.toString()); + Path pUri=pHelp.resolve(uri); + System.out.println("puri="+pUri.toString()); + } + + public static void main(String[] args) + { + //testURI(); + //testMSDBDataParser(); + //testFindMDs(); + } + + private static String baseUrl(long id) { + return "http://test.tld:7021"; + } +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/apigateway/impl/src/test/resources/log4j.properties b/sdnr/wireless-transport/code-Carbon-SR1/apps/apigateway/impl/src/test/resources/log4j.properties new file mode 100644 index 00000000..142663bd --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/apigateway/impl/src/test/resources/log4j.properties @@ -0,0 +1,12 @@ +log4j.rootLogger=INFO, out + +log4j.logger.org.apache.camel.impl.converter=WARN +log4j.logger.org.apache.camel.management=WARN +log4j.logger.org.apache.camel.impl.DefaultPackageScanClassResolver=WARN +log4j.logger.org.springframework=ERROR + +# CONSOLE appender not used by default +log4j.appender.out=org.apache.log4j.ConsoleAppender +log4j.appender.out.layout=org.apache.log4j.PatternLayout +log4j.appender.out.layout.ConversionPattern=%d [%-15.15t] %-5p %-30.30c{1} - %m%n + diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/apigateway/pom.xml b/sdnr/wireless-transport/code-Carbon-SR1/apps/apigateway/pom.xml new file mode 100644 index 00000000..c49e98be --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/apigateway/pom.xml @@ -0,0 +1,93 @@ + + + + + 4.0.0 + + com.highstreet.technologies.apigateway + apigateway-parent + 0.5.1-SNAPSHOT + pom + + + 1.2.16 + 1.6.1 + + + + impl + features + + + + + javax.ws.rs + javax.ws.rs-api + 2.0.1 + + + org.slf4j + slf4j-api + ${slf4j-version} + + + + junit + junit + 4.12 + test + + + org.slf4j + slf4j-log4j12 + ${slf4j-version} + test + + + log4j + log4j + ${log4j-version} + test + + + org.json + json + 20131018 + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.3 + + 1.7 + 1.7 + + + + org.apache.felix + maven-bundle-plugin + 3.0.1 + true + + + <_include>-bnd.bnd + + + + + + diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/commons/binding-parent/pom.xml b/sdnr/wireless-transport/code-Carbon-SR1/apps/commons/binding-parent/pom.xml new file mode 100644 index 00000000..ec39f7eb --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/commons/binding-parent/pom.xml @@ -0,0 +1,21 @@ + + + + + org.opendaylight.mdsal + binding-parent + 0.10.1-Carbon + + + + 4.0.0 + org.opendaylight.mwtn + binding-parent + 0.5.1-SNAPSHOT + ONF :: Wireless :: ${project.artifactId} + pom + diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/commons/config-parent/pom.xml b/sdnr/wireless-transport/code-Carbon-SR1/apps/commons/config-parent/pom.xml new file mode 100644 index 00000000..94251287 --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/commons/config-parent/pom.xml @@ -0,0 +1,103 @@ + + + + + org.opendaylight.controller + config-parent + 0.6.1-Carbon + + + + 4.0.0 + org.opendaylight.mwtn + config-parent + 0.5.1-SNAPSHOT + ONF :: Wireless :: ${project.artifactId} + pom + + + 0.10.1-Carbon + 1.5.1-Carbon + 1.5.1-Carbon + 1.1.1-Carbon + 0.5.1-Carbon + 1.2.1-Carbon + 0.4.1-Carbon + 0.5.1-Carbon + true + 3.0.1 + + 2013.10.21.10.3-Carbon + ONF :: Wireless :: + 4.1.7.Final + 2.3.2 + + + + + + junit + junit + test + + + + org.mockito + mockito-core + test + + + + + + + org.apache.maven.plugins + maven-checkstyle-plugin + + + process-sources + + check + + + + + + ${project.basedir}/../../commons/src/main/resources/checks.xml + + true + **/*.java,**/*.xml,**/*.ini,**/*.sh,**/*.bat + **\/target\/,**\/bin\/,**\/third-party,**\/yang-gen-sal + + + + org.jacoco + jacoco-maven-plugin + + + org.opendaylight.atrium.* + + + + + pre-test + + prepare-agent + + + + post-test + + report + + test + + + + + + diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/commons/configuration/pom.xml b/sdnr/wireless-transport/code-Carbon-SR1/apps/commons/configuration/pom.xml new file mode 100644 index 00000000..dd963391 --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/commons/configuration/pom.xml @@ -0,0 +1,20 @@ + + + + + 4.0.0 + org.opendaylight.mwtn + configuration + 0.5.1-SNAPSHOT + ONF :: Wireless :: ${project.artifactId} + Configuration files for mwtn + jar + + true + true + + diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/README.md b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/README.md new file mode 100644 index 00000000..008ce69a --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/README.md @@ -0,0 +1,92 @@ +# Devicemanager + +The devicemanager application uses a persistent database to store NE related information. + + +### OSS Faultmanagement umbrella + +Destination of fault notifications of the network elements. + +Test environment is the *evel-test-collector*. + +### Configuration "eventprovider.properties" + +Located in karaf under /etc +Content like here: + + ``` + #Properties for Faultmanager. Password admin admin + + eventReveicerUrl=http://127.0.0.1:30000/eventListener/v3 + autorization=Basic YWRtaW46YWRtaW4= + sourceId=de305d54-75b4-431b-adb2-eb6b9e546014 + httpTestUrl=https://plan.fritz.box:9092/ux/# + keyStore=etc/clientkeystore + keyStorePassword=daylight2016 + ``` + +### Configuration "aotsmconnector.properties" + +Located in karaf under /etc +Content like here: + + ``` + #Properties + + #soapurladd=off + soapurladd=http://soapserver.fritz.box/addmobility.php + #http timeout in seconds + soapaddtimeout=10 + + #soapurlinq=off + soapurlinq=http://soapserver.fritz.box/inquire.php + #http timeout in seconds + soapinqtimeout=10 + + #credentials + userName=user + userPassword=passwd + systemuser=user + assignedto=anotheruserid + + #smtp fallback + #comment out if off + smtpHost=smtp.xxx.tld + smtpPort=587 + smtpUsername=user + smtpPassword=passwd + smtpSender=odl@xxx.tld + smtpReceivers=email1@example.com,email2@example.com + ``` + +### evel-test-collector + +Home: [evel-test-collector](https://github.com/att/evel-test-collector) +Environment: Ubuntu 16.04 LTS, Python 2.7.12 + +#### install + +Clone repository and install python packet manager. +``` +git clone https://github.com/att/evel-test-collector.git +sudo apt install python-pip +sudo pip install jsonschema + +``` +Adapt to use the test script. + + * Make the script executable. + * Add user credentials to config file + +``` +cd evel-test-collector/scripts/linux +chmod 775 go-collector.sh +vi ../../config/collector.conf + +``` + + +#### usage + +cd evel-test-collector/scripts/linux + diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/api/pom.xml b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/api/pom.xml new file mode 100644 index 00000000..01a79250 --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/api/pom.xml @@ -0,0 +1,30 @@ + + + + + org.opendaylight.mwtn + config-parent + 0.5.1-SNAPSHOT + ../../commons/config-parent + + + 4.0.0 + devicemanager-api + bundle + + + true + + + + + org.opendaylight.netconf + sal-netconf-connector + ${mdsal.version} + + + diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/api/src/main/java/org/opendaylight/mwtn/devicemanager/api/DeviceManagerService.java b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/api/src/main/java/org/opendaylight/mwtn/devicemanager/api/DeviceManagerService.java new file mode 100644 index 00000000..959445d1 --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/api/src/main/java/org/opendaylight/mwtn/devicemanager/api/DeviceManagerService.java @@ -0,0 +1,49 @@ +/** + * Copyright (c) 2017 highstreet technologies GmbH + * + * 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.mwtn.devicemanager.api; + +import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId; +import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.NetconfNode; + +public interface DeviceManagerService { + + /*@Deprecated + public void startListenerOnNode(String nodeName);*/ + + /*@Deprecated + public void removeListenerOnNode(String nodeName);*/ + + /** + * Managed device is disconnected from node/mountpoint + * @param nNodeId id of the mountpoint + * @param nNode mountpoint contents + */ + public void removeListenerOnNode(NodeId nNodeId, NetconfNode nNode); + + /** + * Managed device is connected to node/mountpoint + * @param nNodeId id of the mountpoint + * @param nNode mountpoint contents + */ + public void startListenerOnNode(NodeId nNodeId, NetconfNode nNode); + + /** + * Creation indication of node/mountpoint + * @param nNodeId id of the mountpoint + * @param nNode mountpoint contents + */ + public void mountpointNodeCreation(NodeId nNodeId, NetconfNode nNode); + + /** + * Removal indication of node/mountpoint + * @param nNodeId id of the mountpoint + */ + public void mountpointNodeRemoved(NodeId nNodeId); + +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/api/src/main/yang/devicemanager-api.yang b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/api/src/main/yang/devicemanager-api.yang new file mode 100644 index 00000000..f39c7594 --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/api/src/main/yang/devicemanager-api.yang @@ -0,0 +1,21 @@ +module devicemanager-api { + + yang-version 1; + namespace "urn:opendaylight:params:xml:ns:yang:devicemanager:api"; + prefix "devicemanager-api"; + + import config { prefix config; revision-date 2013-04-05; } + description + "DeviceManager Api Module"; + + revision "2017-03-17" { + description + "Initial revision"; + } + + identity devicemanager-api { + base config:service-type; + config:java-class org.opendaylight.mwtn.devicemanager.api.DeviceManagerService; + } +} + diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/pom.xml b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/pom.xml new file mode 100644 index 00000000..7f9640f2 --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/pom.xml @@ -0,0 +1,349 @@ + + + + + org.opendaylight.mwtn + config-parent + 0.5.1-SNAPSHOT + ../../commons/config-parent + + + 4.0.0 + devicemanager-impl + bundle + + + yyyy-MM-dd HH:mm + ${maven.build.timestamp} UTC + + + + org.opendaylight.mwtn + devicemodel + ${project.version} + + + org.opendaylight.mwtn + websocketmanager-api + ${project.version} + + + org.opendaylight.mwtn + devicemanager-api + ${project.version} + + + org.opendaylight.netconf + sal-netconf-connector + ${mdsal.version} + + + org.opendaylight.controller.model + model-inventory + + + org.opendaylight.mdsal.model + ietf-topology + + + + org.json + json + + + javax.mail + mail + 1.4.7 + + + org.slf4j + slf4j-log4j12 + + + + commons-beanutils + commons-beanutils + 1.9.3 + + + org.apache.commons + commons-configuration2 + 2.2 + + + + + com.google.guava + guava + + compile + + + + + + org.elasticsearch + elasticsearch + 2.2.0 + + + com.spatial4j + spatial4j + 0.5 + compile + + + org.elasticsearch + securesm + 1.0 + compile + + + com.carrotsearch + hppc + 0.7.1 + compile + + + joda-time + joda-time + 2.8.2 + compile + + + org.joda + joda-convert + 1.2 + compile + + + com.fasterxml.jackson.core + jackson-core + 2.6.3 + compile + + + com.fasterxml.jackson.core + jackson-annotations + 2.6.3 + compile + + + com.fasterxml.jackson.core + jackson-databind + 2.6.3 + compile + + + com.fasterxml.jackson.dataformat + jackson-dataformat-smile + 2.6.3 + compile + + + com.fasterxml.jackson.dataformat + jackson-dataformat-yaml + 2.6.3 + compile + + + com.fasterxml.jackson.dataformat + jackson-dataformat-cbor + 2.6.3 + compile + + + org.yaml + snakeyaml + 1.15 + compile + + + io.netty + netty + 3.10.5.Final + compile + + + com.ning + compress-lzf + 1.0.2 + compile + + + com.tdunning + t-digest + 3.0 + compile + + + org.hdrhistogram + HdrHistogram + 2.1.6 + compile + + + com.twitter + jsr166e + 1.1.0 + compile + + + + + org.apache.lucene + lucene-core + 5.4.1 + + + org.apache.lucene + lucene-backward-codecs + 5.4.1 + + + org.apache.lucene + lucene-analyzers-common + 5.4.1 + + + org.apache.lucene + lucene-queries + 5.4.1 + + + org.apache.lucene + lucene-memory + 5.4.1 + + + org.apache.lucene + lucene-highlighter + 5.4.1 + + + org.apache.lucene + lucene-queryparser + 5.4.1 + + + org.apache.lucene + lucene-sandbox + 5.4.1 + + + org.apache.lucene + lucene-suggest + 5.4.1 + + + org.apache.lucene + lucene-misc + 5.4.1 + + + org.apache.lucene + lucene-join + 5.4.1 + + + org.apache.lucene + lucene-grouping + 5.4.1 + + + org.apache.lucene + lucene-spatial + 5.4.1 + + + org.apache.lucene + lucene-spatial3d + 5.4.1 + + + jakarta-regexp + jakarta-regexp + 1.4 + + + commons-collections + commons-collections + 3.2.2 + + + commons-logging + commons-logging + 1.2 + + + commons-cli + commons-cli + 1.3.1 + + + org.apache.commons + commons-lang3 + 3.4 + + + com.typesafe.akka + akka-actor_2.11 + + + com.typesafe.akka + akka-cluster_2.11 + + + + + + src/main/resources + true + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.8 + 1.8 + + + + org.apache.felix + maven-bundle-plugin + true + + + + com.github.mustachejava;resolution:=optional, + com.sun.jna.*;resolution:=optional, + com.vividsolutions.jts.*;resolution:=optional, + org.apache.log4j.helpers;resolution:=optional, + org.noggit;resolution:=optional, + org.apache.commons.jexl2;resolution:=optional, + org.apache.commons.jxpath.*;resolution:=optional, + org.apache.commons.vfs2.*;resolution:=optional, + org.apache.commons.commons-codec;resolution:=optional, + org.apache.xml.resolver.*;resolution:=optional, + org.apache.log;resolution:=optional, + *;resolution:=optional + + jackson*,ela*,joda*,Hdr*,lucene*, + hppc,jsr166e,t-digest,snakeyaml,securesm,spatial4j,compress-lzf,commons-cli,jakarta-regexp, + commons-lang3,commons-collections,commons-logging,commons-beanutils,commons-configuration2 + {maven-resources},{maven-dependencies},META-INF/git.properties=-target/classes/META-INF/git.properties + true + + + + + + + + diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/config/default-config.xml b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/config/default-config.xml new file mode 100644 index 00000000..09445ec7 --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/config/default-config.xml @@ -0,0 +1,48 @@ + + + + urn:opendaylight:params:xml:ns:yang:devicemanager:api?module=devicemanager-api&revision=2017-03-17 + urn:opendaylight:params:xml:ns:yang:devicemanager:impl?module=devicemanager-impl&revision=2017-03-17 + urn:opendaylight:params:xml:ns:yang:websocketmanager?module=websocketmanager&revision=2015-01-05 + urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding?module=opendaylight-md-sal-binding&revision=2013-10-28 + + + + + + prefix:devicemanager-impl + devicemanager-default + + binding:binding-broker-osgi-registry + binding-osgi-broker + + + + binding:binding-notification-service + + binding-notification-broker + + + binding:binding-async-data-broker + + binding-data-broker + + + + + + prefix:devicemanager-api + + devicemanager-service + /modules/module[type='devicemanager-impl'][name='devicemanager-default'] + + + + + + + + diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/aaiConnector/impl/AaiProviderClient.java b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/aaiConnector/impl/AaiProviderClient.java new file mode 100644 index 00000000..acde506f --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/aaiConnector/impl/AaiProviderClient.java @@ -0,0 +1,155 @@ +package org.opendaylight.mwtn.aaiConnector.impl; + +import java.util.List; + +import org.opendaylight.mwtn.base.http.BaseHTTPResponse; +import org.opendaylight.mwtn.base.internalTypes.InventoryInformation; +import org.opendaylight.mwtn.base.netconf.ONFCoreNetworkElementRepresentation; +import org.opendaylight.mwtn.config.impl.AaiConfig; +import org.opendaylight.mwtn.config.impl.HtDevicemanagerConfiguration; +import org.opendaylight.mwtn.config.impl.HtDevicemanagerConfiguration.IConfigChangedListener; +import org.opendaylight.mwtn.devicemanager.impl.DeviceManagerImpl; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class AaiProviderClient implements AutoCloseable { + + private static Logger LOG = LoggerFactory.getLogger(AaiProviderClient.class); + private static boolean reloadConfigFlag; + private AaiConfig config; + private DeviceManagerImpl deviceManager; + private HtDevicemanagerConfiguration htconfig; + private final IConfigChangedListener configChangedListener = new IConfigChangedListener() { + + @Override + public void onConfigChanged() { + reloadConfigFlag=true; + } + }; + + + public AaiConfig getConfig() {return this.config;} + + private class AaiCreateRequestRunnable implements Runnable { + + private static final int RESPCODE_NOTFOUND = BaseHTTPResponse.CODE404; + private static final int RESPCODE_FOUND = BaseHTTPResponse.CODE200; + private final AaiWebApiClient mClient; + private final String pnfId; + private final String type; + private final String model; + private final String vendor; + private final String oamIp; + private final List ifaces; + private int timeout; + public AaiCreateRequestRunnable(String pnfId, String type, String model, String vendor, String oamIp, + List ifaces) { + this.pnfId = pnfId; + this.type = type; + this.model = model; + this.vendor = vendor; + this.oamIp = oamIp; + this.ifaces = ifaces; + this.timeout=AaiProviderClient.this.config.getConnectionTimeout(); + this.mClient = new AaiWebApiClient( + AaiProviderClient.this.config.getBaseUrl(), + AaiProviderClient.this.config.getHeaders(), + AaiProviderClient.this.config.getTrustAll(), + AaiProviderClient.this.config.getPcks12CertificateFilename(), + AaiProviderClient.this.config.getPcks12CertificatePassphrase() + ); + } + + @Override + public void run() { + LOG.debug("check if pnfid "+pnfId+" exists"); + this.mClient.setTimeout(timeout); + BaseHTTPResponse response=this.mClient.pnfCheckIfExists(pnfId); + if(response.code==RESPCODE_NOTFOUND) + { + LOG.debug("do pnfCreate for "+pnfId); + this.mClient.pnfCreate(pnfId, type, model, vendor, oamIp, ifaces); + } + else if(response.code==RESPCODE_FOUND) + { + LOG.debug("pnfid "+pnfId+" found, nothing to do"); + } + else + { + LOG.warn("unhandled response code: "+response.toString()); + } + } + }; + + private class AaiDeleteRequestRunnable implements Runnable { + + private final AaiWebApiClient mClient; + private final String pnfId; + private int timeout; + + + public AaiDeleteRequestRunnable(String pnfId) { + this.pnfId = pnfId; + this.timeout=AaiProviderClient.this.config.getConnectionTimeout(); + this.mClient = new AaiWebApiClient( + AaiProviderClient.this.config.getBaseUrl(), + AaiProviderClient.this.config.getHeaders(), + AaiProviderClient.this.config.getTrustAll(), + AaiProviderClient.this.config.getPcks12CertificateFilename(), + AaiProviderClient.this.config.getPcks12CertificatePassphrase() + ); + } + + @Override + public void run() { + this.mClient.setTimeout(this.timeout); + this.mClient.pnfDelete(pnfId); + } + }; + + public AaiProviderClient(HtDevicemanagerConfiguration cfg,DeviceManagerImpl devMgr) { + this.config = cfg.getAai(); + this.htconfig=cfg; + this.htconfig.registerConfigChangedListener(configChangedListener); + this.deviceManager = devMgr; + + } + + private void _reload() + { + if(reloadConfigFlag) + { + this.config=AaiConfig.reload(); + LOG.info("config reloaded:"+config==null?"null":config.toString()); + } + reloadConfigFlag=false; + } + public void onDeviceRegistered(String mountPointName) { + this._reload(); + if(this.config.isOff()) + return; + ONFCoreNetworkElementRepresentation ne =this.deviceManager!=null?this.deviceManager.getNeByMountpoint(mountPointName):null; + this.onDeviceRegistered(mountPointName,ne!=null?ne.getInventoryInformation("MWPS"):InventoryInformation.DEFAULT); + + } + public void onDeviceRegistered(String mountPointName,InventoryInformation i) { + this._reload(); + if(this.config.isOff()) + return; + new Thread(new AaiCreateRequestRunnable(mountPointName, i.getType(), i.getModel(), i.getVendor(), i.getDeviceIpv4(), i.getInterfaceUuidList())).start(); + } + public void onDeviceUnregistered(String mountPointName) { + this._reload(); + if(this.config.isOff()) + return; + if(this.config.doDeleteOnMountPointRemoved()) + new Thread(new AaiDeleteRequestRunnable(mountPointName)).start(); + else + LOG.debug("prevent deleting device "+mountPointName+" by config"); + } + + @Override + public void close() throws Exception { + this.htconfig.unregisterConfigChangedListener(configChangedListener); + } +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/aaiConnector/impl/AaiWebApiClient.java b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/aaiConnector/impl/AaiWebApiClient.java new file mode 100644 index 00000000..36cdd1b5 --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/aaiConnector/impl/AaiWebApiClient.java @@ -0,0 +1,182 @@ +package org.opendaylight.mwtn.aaiConnector.impl; + +import java.io.IOException; +import java.util.List; +import java.util.Map; + +import javax.annotation.Nonnull; + +import org.opendaylight.mwtn.base.http.BaseHTTPClient; +import org.opendaylight.mwtn.base.http.BaseHTTPResponse; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class AaiWebApiClient extends BaseHTTPClient{ + + public static class URLParamEncoder { + + public static String encode(String input) { + StringBuilder resultStr = new StringBuilder(); + for (char ch : input.toCharArray()) { + if (isUnsafe(ch)) { + resultStr.append('%'); + resultStr.append(toHex(ch / 16)); + resultStr.append(toHex(ch % 16)); + } else { + resultStr.append(ch); + } + } + return resultStr.toString(); + } + + private static char toHex(int ch) { + return (char) (ch < 10 ? '0' + ch : 'A' + ch - 10); + } + + private static boolean isUnsafe(char ch) { + if (ch > 128 || ch < 0) + return true; + return " %$&+,/:;=?@<>#%".indexOf(ch) >= 0; + } + + } + private static final String pnfJSON_INTERFACE_TEMPLATE = " {\n" + + " \"interface-name\": \"@interface@\",\n" + + " \"speed-value\": \"300\",\n" + + " \"speed-units\": \"MBit/s\",\n" + + " \"port-description\": \"Air Interface (MWPS)\",\n" + + " \"equipment-identifier\": \"@pnfId@-@interface@\",\n" + + " \"interface-role\": \"Wireless\",\n" + + " \"interface-type\": \"Air Interface (MWPS)\",\n" + + " \"resource-version\": \"@model@\",\n" + + " \"relationship-list\": [\n" + + " {\n" + + " \"related-to\": \"A keyword provided by A&AI to indicate type of node.\",\n" + + " \"related-link\": \"URL to the object in A&AI.\",\n" + + " \"relationship-data\": [\n" + + " {\n" + + " \"relationship-key\": \"A keyword provided by A&AI to indicate an attribute.\",\n" + + " \"relationship-value\": \"Value of the attribute\"\n" + + " }\n" + + " ],\n" + + " \"related-to-property\": [\n" + + " {\n" + + " \"property-key\": \"Key part of a key/value pair\",\n" + + " \"property-value\": \"Value part of a key/value pair\"\n" + + " }\n" + + " ]\n" + + " }\n" + + " ]\n" + + " }\n"; + + private static final String pnfJSON_TEMPLATE = "{\n" + + " \"pnf-name\": \"@pnfId@\",\n" + + " \"pnf-id\": \"@pnfId@\",\n" + + " \"equip-type\": \"@type@\",\n" + + " \"equip-model\": \"@model@\",\n" + + " \"equip-vendor\": \"@vendor@\",\n" + + " \"ipaddress-v4-oam\": \"@oamIp@\",\n" + + " \"in-maint\": true,\n" + + " \"p-interfaces\": @interface-list@\n"+ + "}\n" + + ""; + + private static String getPnfTemplateFilled(String pnfId,String type,String model,String vendor,String oamIp,List ifaces) + { + return pnfJSON_TEMPLATE.replace("@pnfId@",pnfId). + replace("@type@", type). + replace("@model@", model). + replace("@vendor@",vendor). + replace("@oamIp@", oamIp). + replace("@interface-list@", getPnfTemplateInterfaceList(pnfId,ifaces,model)); + } + private static String getPnfTemplateInterfaceList(String pnfId,List ifaces,String model) { + String s="["; + if(ifaces!=null) + { + if(ifaces.size()>0) + { + s+=pnfJSON_INTERFACE_TEMPLATE.replace("@interface@", ifaces.get(0)); + } + for(int i=1;i headers; + + public AaiWebApiClient(String baseUrl, Map headers, boolean trustAllCerts) { + this(baseUrl,headers,trustAllCerts,null,null); + } + + public AaiWebApiClient(String baseUrl, Map headers, boolean trustAllCerts, String certFilename, + String passphrase) { + super(baseUrl, trustAllCerts, certFilename, passphrase, BaseHTTPClient.SSLCERT_PCKS); + this.headers = headers; + } + + + public boolean pnfCreate(String pnfId,String type,String model,String vendor,String oamIp,List ifaces) + { + LOG.debug("registering "+pnfId +"(type="+type+", model="+model+", vendor="+vendor+",ip="+oamIp+")"); + Map headers = this.headers; + headers.put("Content-Type","application/json"); + headers.put("Accept","application/json"); + BaseHTTPResponse response=null; + try { + String uri="network/pnfs/pnf/"+URLParamEncoder.encode( pnfId); + String message=getPnfTemplateFilled(pnfId, type, model, vendor, oamIp, ifaces); + response=this.sendRequest(uri,"PUT",message,headers); + LOG.debug("finished with responsecode "+response.code); + } catch (IOException e) { + LOG.warn("problem registering "+pnfId+": "+e.getMessage()); + } + return response!=null?response.code==200:false; + } + + public boolean pnfDelete(String pnfId) + { + LOG.debug("unregistering "+pnfId); + Map headers = this.headers; + headers.put("Content-Type","application/json"); + headers.put("Accept","application/json"); + BaseHTTPResponse response=null; + try { + String uri="network/pnfs/pnf/"+URLParamEncoder.encode( pnfId ); + response=this.sendRequest(uri, + "DELETE", + "",headers); + LOG.debug("finished with responsecode "+response.code); + } catch (IOException e) { + LOG.warn("problem unregistering "+pnfId+": "+e.getMessage()); + } + return response!=null?response.code==200:false; + } + public @Nonnull BaseHTTPResponse pnfCheckIfExists(String pnfId) { + + BaseHTTPResponse response=null; + LOG.debug("check for "+pnfId); + Map headers = this.headers; + headers.put("Content-Type","application/json"); + headers.put("Accept","application/json"); + try { + String uri="network/pnfs/pnf/"+URLParamEncoder.encode( pnfId ); + response=this.sendRequest(uri, + "GET", + "",headers); + LOG.debug("finished with responsecode "+response.code); + } catch (IOException e) { + LOG.warn("problem checking "+pnfId+": "+e.getMessage()); + response = BaseHTTPResponse.UNKNOWN; + } + + return response; + } + + + +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/database/EsObject.java b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/database/EsObject.java new file mode 100644 index 00000000..6c5de23a --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/database/EsObject.java @@ -0,0 +1,39 @@ +/********************************************************************************* + * Copyright © 2015, highstreet technologies GmbH + * All rights reserved! + * + * http://www.highstreet-technologies.com/ + * + * The reproduction, transmission or use of this document or its contents is not + * permitted without express written authority. Offenders will be liable for + * damages. All rights, including rights created by patent grant or registration + * of a utility model or design, are reserved. Technical modifications possible. + * Technical specifications and features are binding only insofar as they are + * specifically and expressly agreed upon in a written contract. + * + * @author: Martin Skorupski [martin@skorupski.de] + *********************************************************************************/ +package org.opendaylight.mwtn.base.database; + +import com.fasterxml.jackson.annotation.JsonIgnore; + +/** + * @author Herbert + * + */ +public class EsObject implements IsEsObject { + + @JsonIgnore + private String esId; + + @Override + public String getEsId() { + return esId; + } + + @Override + public void setEsId(String esId) { + this.esId = esId; + } + +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/database/HtDataBase.java b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/database/HtDataBase.java new file mode 100644 index 00000000..32829fa5 --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/database/HtDataBase.java @@ -0,0 +1,46 @@ +/********************************************************************************* + * Copyright © 2015, highstreet technologies GmbH + * All rights reserved! + * + * http://www.highstreet-technologies.com/ + * + * The reproduction, transmission or use of this document or its contents is not + * permitted without express written authority. Offenders will be liable for + * damages. All rights, including rights created by patent grant or registration + * of a utility model or design, are reserved. Technical modifications possible. + * Technical specifications and features are binding only insofar as they are + * specifically and expressly agreed upon in a written contract. + * + * @author: Martin Skorupski [martin@skorupski.de] + *********************************************************************************/ +package org.opendaylight.mwtn.base.database; + +import org.elasticsearch.client.Client; +import org.elasticsearch.common.bytes.BytesReference; +import org.elasticsearch.index.query.QueryBuilder; +import org.elasticsearch.search.SearchHit; + + +/** + * Interface, used by access one object + * @author Herbert + * + */ +public interface HtDataBase { + + String getNetworkIndex(); + void setNetworkIndex(String networkIndex); + + Client getClient(); + void closeDb(); + + public BytesReference doReadJsonData( String dataTypeName, IsEsObject esId ); + public SearchHit[] doReadAllJsonData( int start, int length, String dataTypeName ); + public SearchHit[] doReadByQueryJsonData( int start, int length, String dataTypeName, QueryBuilder query); + + public String doWrite( String dataTypeName, IsEsObject esId, byte[] json); + public String doWrite( String dataTypeName, IsEsObject esId, String json); + + public boolean doRemove( String dataTypeName, IsEsObject esId ); + +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/database/HtDataBaseReaderAndWriter.java b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/database/HtDataBaseReaderAndWriter.java new file mode 100644 index 00000000..52f389c5 --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/database/HtDataBaseReaderAndWriter.java @@ -0,0 +1,199 @@ +/********************************************************************************* + * Copyright © 2015, highstreet technologies GmbH + * All rights reserved! + * + * http://www.highstreet-technologies.com/ + * + * The reproduction, transmission or use of this document or its contents is not + * permitted without express written authority. Offenders will be liable for + * damages. All rights, including rights created by patent grant or registration + * of a utility model or design, are reserved. Technical modifications possible. + * Technical specifications and features are binding only insofar as they are + * specifically and expressly agreed upon in a written contract. + * + * @author: Martin Skorupski [martin@skorupski.de] + *********************************************************************************/ +package org.opendaylight.mwtn.base.database; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import org.elasticsearch.index.query.QueryBuilder; +import org.elasticsearch.search.SearchHit; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Generic class to write lists of model classes to the database. + * + */ +public class HtDataBaseReaderAndWriter { + + private static final Logger log = LoggerFactory.getLogger(HtDataBaseReaderAndWriter.class); + + + private final HtDataBase db; + private final String dataTypeName; + private final HtMapper mapper; + + /** + * Class specific access to database + * @param db ES database descriptor + * @param dataTypeName datatype name + * @param clazz class of datatype + */ + public HtDataBaseReaderAndWriter(HtDataBase db, String dataTypeName, Class clazz) { + + this.db = db; + this.dataTypeName = dataTypeName; + this.mapper = new HtMapper<>( clazz ); + + } + + /** + * Remove Object from database + * @param object Object with content + * @return true if remove is done + */ + public boolean doRemove( T object) { + + return db.doRemove(dataTypeName, object ); + + } + + /** + * Remove all data that match the filter + * @param query to specify data to be deleted + * @return number of removed objects + */ + public int doRemoveByQuery(QueryBuilder query) { + + int idx = 0; //Idx for getAll + int iterateLength = 100; //Step width for iterate + + SearchHit hits[]; + do { + hits = db.doReadByQueryJsonData(idx, iterateLength, dataTypeName, query); + log.debug("Found: {} elements: {} Failures: {}",dataTypeName,hits.length, mapper.getMappingFailures()); + + T object; + idx += hits.length; + for (SearchHit hit : hits) { + + object = mapper.getObjectFromJson( hit.getSourceRef() ); + + log.debug("Mapp Object: {}\nSource: '{}'\nResult: '{}'\n Failures: {}", hit.getId(), hit.getSourceAsString(), object, mapper.getMappingFailures()); + if (object != null) { + object.setEsId( hit.getId() ); + doRemove(object); + } else { + log.warn("Mapp result null Object: {}\n Source: '{}'\n : '", hit.getId(), hit.getSourceAsString()); + } + } + } while (hits.length == iterateLength); //Do it until end indicated, because less hits than iterateLength allows. + + return idx; + } + + + + /** + * Write one object into Database + * @param object Object with content + * @return This object for chained call pattern. + */ + public T doWrite( T object) { + + log.debug("doWrite {} {}",object.getClass().getSimpleName(), object.getEsId()); + + String json = mapper.objectToJson(object); + if (json != null) { + String esId = db.doWrite(dataTypeName, object, json); + object.setEsId(esId); + log.debug("doWrite done for {} {}",object.getClass().getSimpleName(), object.getEsId()); + return esId == null ? null : object; + } else { + log.warn("Can not map object and write to database. {}",object.getClass().getSimpleName()); + return null; + } + + } + + /** + * Write a list of Objects to the database. + * @param list Object list with content + * @return This object for chained call pattern. + */ + public HtDataBaseReaderAndWriter doWrite( Collection list) { + + int writeError = 0; + String indexName = db.getNetworkIndex(); + + log.debug("Write to ES database {}, {} Class: {} {} elements",indexName,dataTypeName, mapper.getClazz().getSimpleName(), list.size()); + + if (indexName == null) { + throw new IllegalArgumentException("Missing Index"); + } + + if (list != null && !list.isEmpty()) { + for( T s : list ) { + if ( doWrite(s) == null ) { + if ( ++writeError > 5 ) { + log.warn("Leave because of to >5 write errors"); + break; + } + } + } + + } + + return this; + } + + /** + * Read one object via the object class specific ID + * @param object Object refrenced by idString + * @return The Object if found or null + */ + public T doRead( IsEsObject object ) { + return mapper.getObjectFromJson( db.doReadJsonData( dataTypeName, object) ); + } + + /** + * Read all existing objects of a type + * @return the list of all objects + */ + public List doReadAll() { + + List res = new ArrayList<>(); + int idx = 0; //Idx for getAll + int iterateLength = 100; //Step width for iterate + + SearchHit hits[]; + + + do { + hits = db.doReadAllJsonData(idx, iterateLength, dataTypeName); + log.debug("Read: {} elements: {} Failures: {}",dataTypeName,hits.length, mapper.getMappingFailures()); + + T object; + idx += hits.length; + for (SearchHit hit : hits) { + + object = mapper.getObjectFromJson( hit.getSourceRef() ); + + log.debug("Mapp Object: {}\nSource: '{}'\nResult: '{}'\n Failures: {}", hit.getId(), hit.getSourceAsString(), object, mapper.getMappingFailures()); + if (object != null) { + object.setEsId( hit.getId() ); + res.add( object ); + } else { + log.warn("Mapp result null Object: {}\n Source: '{}'\n : '", hit.getId(), hit.getSourceAsString()); + } + } + } while (hits.length == iterateLength); //Do it until end indicated, because less hits than iterateLength allows. + + return res; + } + +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/database/HtDatabaseClientAbstract.java b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/database/HtDatabaseClientAbstract.java new file mode 100644 index 00000000..b1fde018 --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/database/HtDatabaseClientAbstract.java @@ -0,0 +1,698 @@ +/********************************************************************************* + * Copyright © 2016, highstreet technologies GmbH + * All rights reserved! + * + * http://www.highstreet-technologies.com/ + * + * The reproduction, transmission or use of this document or its contents is not + * permitted without express written authority. Offenders will be liable for + * damages. All rights, including rights created by patent grant or registration + * of a utility model or design, are reserved. Technical modifications possible. + * Technical specifications and features are binding only insofar as they are + * specifically and expressly agreed upon in a written contract. + * + * @author: Herbert Eiselt [herbert.eiselt@highstreet-technologies.com] + *********************************************************************************/ +package org.opendaylight.mwtn.base.database; + +import java.io.IOException; +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.List; +import java.util.Set; + +import javax.annotation.Nullable; + +import org.elasticsearch.ElasticsearchException; +import org.elasticsearch.action.admin.cluster.health.ClusterHealthResponse; +import org.elasticsearch.action.admin.cluster.node.info.NodesInfoResponse; +import org.elasticsearch.action.admin.indices.alias.IndicesAliasesResponse; +import org.elasticsearch.action.admin.indices.create.CreateIndexRequestBuilder; +import org.elasticsearch.action.admin.indices.create.CreateIndexResponse; +import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequestBuilder; +import org.elasticsearch.action.admin.indices.exists.indices.IndicesExistsResponse; +import org.elasticsearch.action.admin.indices.mapping.put.PutMappingResponse; +import org.elasticsearch.action.delete.DeleteResponse; +import org.elasticsearch.action.get.GetResponse; +import org.elasticsearch.action.index.IndexRequestBuilder; +import org.elasticsearch.action.index.IndexResponse; +import org.elasticsearch.action.search.SearchResponse; +import org.elasticsearch.client.Client; +import org.elasticsearch.client.transport.TransportClient; +import org.elasticsearch.cluster.node.DiscoveryNode; +import org.elasticsearch.common.bytes.BytesReference; +import org.elasticsearch.common.settings.Settings; +import org.elasticsearch.common.transport.InetSocketTransportAddress; +import org.elasticsearch.common.unit.TimeValue; +import org.elasticsearch.index.query.QueryBuilder; +import org.elasticsearch.index.query.QueryBuilders; +import org.elasticsearch.search.SearchHit; +import org.json.JSONObject; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * @author Herbert + * + */ +public class HtDatabaseClientAbstract implements HtDataBase, AutoCloseable { + + private final Logger log = LoggerFactory.getLogger(HtDatabaseClientAbstract.class); + + private static int DELAYSECONDS = 10; + private Client client; + private String esIndexAlias; + + /** + * Full database initialization. + * @param esIndex Database index + * @param esNodeserverName Servername or Server-IP that hosts the node. + * @param esClusterName Name of the cluster + * @param esNodeName Name of the node within the cluster to connect to. + * @throws UnknownHostException Servername not known. + */ + public HtDatabaseClientAbstract(String esIndex, String esNodeserverName, String esClusterName, String esNodeName) throws UnknownHostException { + + this.esIndexAlias = esIndex; + + Settings settings = Settings.settingsBuilder() + .put("cluster.name", esClusterName) + .put("node.name", esNodeName) + .build(); + this.client = getClient(esNodeserverName, settings); + + } + + /** + * Do not use the hostname for getting the client + * @param esIndex + * @param esClusterName + * @param esNodeName + * @throws UnknownHostException + */ + public HtDatabaseClientAbstract(String esIndex, String esClusterName, String esNodeName) throws UnknownHostException { + + this.esIndexAlias = esIndex; + Settings settings = Settings.settingsBuilder() + .put("cluster.name", esClusterName) + .put("node.name", esNodeName) + .build(); + this.client = getClient(null, settings); + } + + + /** + * Simple database initialization. Query all ES configuration information from cluster node. + * @param esIndex Database index + * @param esNodeserverHostName Servername or Server-IP that hosts the node. + * @throws UnknownHostException Servername not known. + */ + + public HtDatabaseClientAbstract(String esIndex, String esNodeserverHostName) throws UnknownHostException { + + this.esIndexAlias = esIndex; + + Settings settings = Settings.settingsBuilder() + .put("client.transport.ignore_cluster_name",true) + .put("client.transport.sniff", true) + .build(); + this.client = getClient(esNodeserverHostName, settings); + } + + /** + * Simple database initialization. Query all ES configuration information from cluster node. + * @param esIndex Database index + * @param database databse node descriptor + */ + public HtDatabaseClientAbstract(String esIndex, HtDatabaseNode database) { + + this.esIndexAlias = esIndex; + this.client = database.getClient(); + } + + + /*---------------------------------- + * some constructing functions, used by public constructors + */ + /** + * + * @param esNodeserverName + * @param settings + * @return + * @throws UnknownHostException + */ + private final TransportClient getClient(@Nullable String esNodeserverName, Settings settings) throws UnknownHostException { + + TransportClient newClient = TransportClient.builder().settings(settings).build(); + + if (esNodeserverName != null) { + InetAddress nodeIp = InetAddress.getByName(esNodeserverName); + newClient.addTransportAddress(new InetSocketTransportAddress(nodeIp, 9300)); + } + + setup(newClient); + return newClient; + } + + private void setup(TransportClient newClient) { + NodesInfoResponse nodeInfos = newClient.admin().cluster().prepareNodesInfo().get(); + String clusterName = nodeInfos.getClusterName().value(); + + // ------ Debug/ Info + StringBuffer logInfo = new StringBuffer(); + logInfo.append("Create ES Client an localhost for Cluster '"); + logInfo.append(clusterName); + logInfo.append("' for index '"); + logInfo.append(esIndexAlias); + logInfo.append("' Nodelist: "); + for (DiscoveryNode node : newClient.connectedNodes()) { + logInfo.append("("); + logInfo.append(node.toString()); + logInfo.append(") "); + } + log.info(logInfo.toString()); + // ------ Debug/ Info + + log.info("Starting Database service. Short wait."); + + ClusterHealthResponse nodeStatus = newClient.admin().cluster().prepareHealth() + .setWaitForGreenStatus() + //.setWaitForYellowStatus() + .setTimeout(TimeValue.timeValueSeconds(DELAYSECONDS)) + .get(); + log.debug("Elasticsearch client started with status {}",nodeStatus.toString()); + + + List nodeList = newClient.connectedNodes(); + + if (nodeList.isEmpty()) { + log.info("ES Client created for nodes: "); + } else { + int t=0; + for (DiscoveryNode dn : nodeList) { + log.info("ES Client created for node#{}: {}",t , dn.getName()); + } + } + + Runtime.getRuntime().addShutdownHook(new Thread(){ + @Override public void run(){ + log.info("Shutdown node "+HtDatabaseClientAbstract.class.getSimpleName()); + } + }); + + log.info("Database service started."); + + } + + + /*---------------------------------- + * Getter / Setter + */ + + @Override + public String getNetworkIndex() { + return esIndexAlias; + } + + @Override + public void setNetworkIndex(String es_index) { + this.esIndexAlias = es_index; + } + + @Override + public Client getClient() { + return client; + } + + /*---------------------------------- + * Functions + */ + + /** + * Close function + */ + public void close() { + client.close(); + } + + /** + * Create an ES index. Delete an existing index. + */ + public void doDeleteIndex() { + log.info("Remove index {}", esIndexAlias); + + if (esIndexAlias == null) { + throw new IllegalArgumentException("Missing Index"); + } + + try { + + // Delete index + IndicesExistsResponse res = client.admin().indices().prepareExists(esIndexAlias) + .execute() + .actionGet(); + + if (res.isExists()) { + log.info("Delete Index start: {}",esIndexAlias); + DeleteIndexRequestBuilder delIdx = client.admin().indices().prepareDelete(esIndexAlias); + delIdx.execute().actionGet(); + log.info("Delete Index done."); + } + + } catch (ElasticsearchException e) { + log.warn(e.getDetailedMessage()); + } + } + + /** + * Verify if index already created + * @return boolean accordingly + */ + public boolean isExistsIndex() { + + if (esIndexAlias == null) { + throw new IllegalArgumentException("Missing Index"); + } + + log.debug("Check status of ES index: {}", esIndexAlias); + + final IndicesExistsResponse indexStatus = client.admin() + .indices(). + prepareExists(esIndexAlias). + execute(). + actionGet(); + + return indexStatus.isExists(); + + } + + + /** + * Create and write the mapping and setting of the index + * @param jsonString with mapping and setting definition Object or null for no configuration + */ + public void doCreateIndexWithMapping(JSONObject jsonIndexMappingSetting) { + + if (esIndexAlias == null) { + throw new IllegalArgumentException("Missing Index"); + } + + try { + String esIndexName = esIndexAlias+"_v1"; + log.debug("Create not existing ES index: {} with alias:{}", esIndexName, esIndexAlias); + + //Create index with mapping + CreateIndexRequestBuilder createIndexRequestBuilder = client.admin().indices().prepareCreate(esIndexName); + + if(jsonIndexMappingSetting!=null) { + // Handle optional mappings if requested + JSONObject jsonMapping = jsonIndexMappingSetting.optJSONObject("mappings"); + if (jsonMapping != null) { + log.debug("Set mapping for index {} {}", esIndexAlias, jsonMapping); + Set keys = jsonMapping.keySet(); + log.debug("Found length:"+jsonMapping.length()+" keys:"+keys.size()); + for (Object key : keys) { + String docType = (String)key; + log.debug("Doctype:{} mapping:{}",docType,jsonMapping.getJSONObject(docType).toString()); + createIndexRequestBuilder.addMapping(docType, jsonMapping.getJSONObject(docType).toString()); + } + } else { + log.debug("No mapping requested for index {}", esIndexAlias); + } + // Handle optional settings if requested + JSONObject jsonSettings = jsonIndexMappingSetting.optJSONObject("settings"); + if (jsonSettings != null) { + log.debug("Set setting for index {} {}", esIndexAlias, jsonSettings); + createIndexRequestBuilder.setSettings(Settings.settingsBuilder().loadFromSource(jsonSettings.toString())); + } else { + log.debug("No settings requested for index {}", esIndexAlias); + } + } + + + CreateIndexResponse createResponse = createIndexRequestBuilder.execute().actionGet(); + log.debug("CreateIndex response {}",createResponse); + + { + //Set Alias + log.debug("Set alias {} to index {}",esIndexAlias, esIndexName); + IndicesAliasesResponse setAliasResponse = client.admin().indices().prepareAliases().addAlias(esIndexName,esIndexAlias) + .execute().actionGet(); + log.debug("CreateIndex response {}",setAliasResponse); + } + + } catch (ElasticsearchException e) { + log.warn("ElasticsearchException: {}",e.getDetailedMessage()); + } + } + + /** + * Create Index with alias according to definition, but no mapping + */ + public void doCreateIndex() { + doCreateIndexWithMapping(null); + } + + /** + * Write a JSON mapping definition for a document from a file to ES + * Hint: A change of the mapping is not possible. + * @param documentType Document type in focus + * @param jsonString String with mapping definition in JSON Format + */ + + public void doWriteMappingJson( String jsonString) throws IllegalArgumentException { + + if (esIndexAlias == null) { + throw new IllegalArgumentException("Missing Index"); + } + if (jsonString == null) { + String s = "Mapping string parameter is null"; + log.warn(s); + throw new IllegalArgumentException(s); + } + + try { + // MAPPING GOES HERE + log.debug("Check status of ES index: {}", esIndexAlias); + + final IndicesExistsResponse indexStatus = client.admin() + .indices(). + prepareExists(esIndexAlias). + execute(). + actionGet(); + + if (indexStatus.isExists()) { + log.debug("ES index exists: {}", esIndexAlias); + // TODO: CHANGE Mapping is not working. This here works only for new datatypes + + PutMappingResponse res= client.admin().indices() + .preparePutMapping(esIndexAlias) + .setSource(jsonString) + .execute() + .actionGet(); + log.debug("Result: {}", res.toString()); + + } else { + log.debug("Create not existing ES index: {}", esIndexAlias); + + CreateIndexRequestBuilder createIndexRequestBuilder = client.admin().indices().prepareCreate(esIndexAlias); + createIndexRequestBuilder + .addMapping(jsonString) + .execute() + .actionGet(); + } + + } catch (ElasticsearchException e) { + log.warn(e.getDetailedMessage()); + } + } + + /** + * Write a Json mapping definition for a document from a file to ES + * @param fileName Filename with json definition. + */ + public void doWriteMappingFromFile(String fileName) { + + + log.info("Write mapping from File: {}", fileName); + + if (esIndexAlias == null) { + throw new IllegalArgumentException("Missing Index"); + } + + if (fileName == null) { + log.warn("No mapping for {} specified in parameter file.", esIndexAlias); + return; + } + + String content = null; + + try { + content = new String(Files.readAllBytes(Paths.get(fileName)),"UTF-8"); + } catch (IOException e1) { + log.warn("Can not read file: {}",e1.getMessage()); + } + + doWriteMappingJson(content); + + } + + /** + * Write list with json objects from json files + * @param docTypeAndFileName List with 2 String Array. + * String[0] Contains the dataType name + * String[1] Contains the filename + */ + public void doWriteJsonFiles( List docTypeAndFileName ) { + + log.debug("Write JSONFiles: {}", docTypeAndFileName.size()); + if (docTypeAndFileName != null) { + int t = 1; + for (String[] s : docTypeAndFileName) { + if (s.length == 2) { + writeJsonObjectsFromFile( s[0], s[1]); + } else { + log.warn("Wrong parameters number. Entry: {}", t); + } + t++; + } + } + } + + /** + * Write one object into Database + * @param esId Database index + * @param dataTypeName Name of datatype + * @param json String in JSON format. + * @return esId of the object + */ + @Override + public String doWrite( String dataTypeName, IsEsObject esId, String json) { + return doWrite(dataTypeName, esId, json.getBytes()); + } + + /** + * Write one object into Database + * @param esId Database index + * @param dataTypeName Name of datatype + * @param json String in JSON format. + * @return esId of the object + */ + + @Override + public String doWrite( String dataTypeName, IsEsObject esId, byte[] json) { + return doWrite(dataTypeName, esId.getEsId(), json); + } + + /** + * Write one object into Database + * @param dataTypeName + * @param id id of the object or null + * @param json Object as json + * @return esId of the Object + */ + public String dowrite(String dataTypeName, String id, JSONObject json) { + return doWrite(dataTypeName, id, json.toString().getBytes()); + } + + /** + * Write one object into Database + * @param esId Database index or null + * @param dataTypeName Name of datatype + * @param json String in JSON format. + * @return esId of the object + */ + + public String doWrite( String dataTypeName, String esId, byte[] json) { + + if (esIndexAlias == null) { + throw new IllegalArgumentException("Missing Index"); + } + + IndexRequestBuilder request = esId == null || esId.isEmpty() ? + client.prepareIndex(esIndexAlias, dataTypeName) : + client.prepareIndex(esIndexAlias, dataTypeName, esId); + + IndexResponse response = null; + try { + response = request.setSource(json).execute().actionGet(); + } catch (ElasticsearchException e) { + log.warn("ES Exception {} Json: {}", e.getMessage(), new String(json)); + } + + if (response == null) { + log.warn("Response null during write: {} {}", esId, new String(json)); + return null; + } else { + return response.getId(); + } + } + + /** + * Write JSON Data. First level contains datatype, next level id + * Example + * "datatype" : { + * "id" : { + * } + * } + * + * @param da + */ + public void doWriteJSONObject(JSONObject json) { + + Set docTypes = json.keySet(); + log.debug("Found number of keys:"+json.length()+" keys:"+docTypes.size()); + for (Object docTypeKey : docTypes) { + String docType = (String)docTypeKey; + JSONObject objects = json.optJSONObject(docType); + if (objects == null) { + log.debug("Skip json {} with class {}",docType, json.get(docType).getClass()); + } else { + Set ids = objects.keySet(); + log.debug("write doctype {} with elements {}",docType,ids.size()); + for (Object idKey : ids) { + String id = (String)idKey; + + JSONObject jsonIdObject = objects.optJSONObject(id); + if (jsonIdObject == null) { + log.debug("Skip jsonsub {} with class {}",id, objects.get(id).getClass()); + } else { + if (log.isTraceEnabled()) { + log.trace("Jsonsub object of id {} '{}'", id, jsonIdObject); + } + this.doWrite(docType, id, jsonIdObject.toString().getBytes()); + } + } + } + } + } + + + /** + * Remove Object from database + */ + @Override + public boolean doRemove( String dataTypeName, IsEsObject esId ) { + + if (esIndexAlias == null) { + throw new IllegalArgumentException("Missing Index"); + } + + DeleteResponse response = client.prepareDelete(esIndexAlias, dataTypeName, esId.getEsId()) + .execute() + .actionGet(); + + return response.isFound(); + } + + /** + * Read Json Object from database + */ + @Override + public BytesReference doReadJsonData( String dataTypeName, IsEsObject esId ) { + + log.debug("NetworkIndex: {}",esIndexAlias); + if (esId.getEsId() == null) { + throw new IllegalArgumentException("Read access to object without database Id"); + } + + GetResponse response = client.prepareGet(esIndexAlias, dataTypeName, esId.getEsId()) + //.setOperationThreaded(false) + .execute() + .actionGet(); + + BytesReference json = response.getSourceAsBytesRef(); + return json; + } + + @Override + public SearchHit[] doReadByQueryJsonData( int start, int length, String dataTypeName, QueryBuilder qb ) { + + log.debug("NetworkIndex: {}",esIndexAlias); + + SearchResponse response1 = client.prepareSearch(esIndexAlias) + .setTypes(dataTypeName) + .setQuery( qb ) + .setFrom(start).setSize(length) + .execute().actionGet(); + + SearchHit hits[] = response1.getHits().hits(); + return hits; + } + + + @Override + public SearchHit[] doReadAllJsonData( int start, int length, String dataTypeName ) { + + log.debug("NetworkIndex: {}",esIndexAlias); + + //Use query + QueryBuilder qb = QueryBuilders.matchAllQuery(); + + SearchResponse response1 = client.prepareSearch(esIndexAlias) + .setTypes(dataTypeName) + .setQuery( qb ) + .setFrom(start).setSize(length) + .execute().actionGet(); + + SearchHit hits[] = response1.getHits().hits(); + return hits; + } + + + + /** + * Write Json datetype that is specified by file to ES + * @param dataType ES Datatype name + * @param fileName file name + */ + public void writeJsonObjectsFromFile( String dataType, String fileName ) { + + log.debug("Start: Index: '{}' ' datatype: '{}' File: '{}'", esIndexAlias, dataType, fileName); + + String content = null; + + try { + content = new String( Files.readAllBytes(Paths.get(fileName)), "UTF-8"); + } catch (IOException e1) { + log.warn("Can not read file: {}",e1.getMessage()); + } + + if (content != null && content.charAt(0) == 0xfeff) { + content = content.substring(1); + log.debug("Delete first char {} {}", dataType, fileName); + } + + if (content != null) { + IndexResponse response = null; + try { + response = client.prepareIndex(esIndexAlias, dataType) + .setSource(content) + .execute() + .actionGet(); + } catch (ElasticsearchException e) { + log.error("ElasticsearchException during write: for {} from {}", e.getMessage(), dataType, fileName); + } catch (Exception e) { + log.error("Exception during write: for {} from {}", e.getMessage(), dataType, fileName); + } + + if (response != null) { + if (! response.isCreated()) { + log.warn("Jackson Response not created: {} {} {}", response.toString(), dataType, fileName); + } else { + log.debug("Created: {}", response.getId()); + } + } else { + log.warn("Jackson Response null after write {} {}", dataType, fileName); + } + } + + } + + @Override + public void closeDb() { + } + +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/database/HtDatabaseNode.java b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/database/HtDatabaseNode.java new file mode 100644 index 00000000..1bffed36 --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/database/HtDatabaseNode.java @@ -0,0 +1,313 @@ +package org.opendaylight.mwtn.base.database; + +import static org.elasticsearch.node.NodeBuilder.nodeBuilder; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.net.DatagramSocket; +import java.net.ServerSocket; +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.List; +import java.util.zip.ZipEntry; +import java.util.zip.ZipInputStream; + +import org.elasticsearch.action.admin.cluster.health.ClusterHealthResponse; +import org.elasticsearch.client.Client; +import org.elasticsearch.common.settings.Settings; +import org.elasticsearch.common.unit.TimeValue; +import org.elasticsearch.node.Node; +import org.opendaylight.mwtn.base.internalTypes.Resources; +import org.opendaylight.mwtn.config.impl.AkkaConfig; +import org.opendaylight.mwtn.config.impl.AkkaConfig.ClusterNodeInfo; +import org.opendaylight.mwtn.config.impl.EsConfig; +import org.opendaylight.mwtn.config.impl.GeoConfig; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class HtDatabaseNode implements AutoCloseable { + + + + private static final Logger LOGGER = LoggerFactory.getLogger(HtDatabaseNode.class); + private static final String DBCONFIGFILENAME = "etc/elasticsearch.yml"; + private static int MIN_PORT_NUMBER = 1024; + private static int MAX_PORT_NUMBER = 65535; + private static int ES_PORT = 9200; + private static int DELAYSECONDS = 30; + + private static String pluginFolder="etc/elasticsearch-plugins"; + + private static HtDatabaseNode oneNode = null; + /** + * + */ + private static Integer initializedTarget = 0; + private static Integer initializedReached = 0; + + private final Node node; + + private HtDatabaseNode() { + LOGGER.debug("Start elasticsearch service"); + node = nodeBuilder().settings(Settings.builder().put("path.home", "etc").put("path.conf", "etc")).node(); + LOGGER.info("Starting Database service. Wait {} s", DELAYSECONDS); + // Wait for green status but only wait for 2 seconds + ClusterHealthResponse nodeStatus = node.client().admin().cluster().prepareHealth().setWaitForYellowStatus() + .setTimeout(TimeValue.timeValueSeconds(DELAYSECONDS)).get(); + + LOGGER.debug("Elasticsearch service started with status {}", nodeStatus.toString()); + } + + /** + * Close node + */ + @Override + public void close() { + node.close(); + oneNode = null; //Release the one instance that was started ! + } + + public Boolean getInitialized() { + synchronized (initializedReached) { + return initializedTarget != 0 && initializedReached == initializedTarget; + } + } + + public void setInitializedReached() { + synchronized (initializedReached) { + HtDatabaseNode.initializedReached++; + } + } + + public void setInitializedTarget() { + synchronized (initializedTarget) { + HtDatabaseNode.initializedTarget++; + } + } + + public Client getClient() { + return node.client(); + } + + + /* --------------------------------------- + * Static functions below + */ + + + private static void extractZip(String zipFile, String outputFolder) { + + byte[] buffer = new byte[1024]; + + try { + + // create output directory is not exists + File folder = new File(outputFolder); + if (!folder.exists()) { + folder.mkdir(); + } + + // get the zip file content + ZipInputStream zis = new ZipInputStream(new FileInputStream(zipFile)); + // get the zipped file list entry + ZipEntry ze = zis.getNextEntry(); + + while (ze != null) { + + String fileName = ze.getName(); + + File newFile = new File(outputFolder + File.separator + fileName); + System.out.println("file unzip : " + newFile.getAbsoluteFile()); + if(ze.isDirectory()) + { + newFile.mkdir(); + } + else + { + + // create all non exists folders + // else you will hit FileNotFoundException for compressed folder + new File(newFile.getParent()).mkdirs(); + + FileOutputStream fos = new FileOutputStream(newFile); + + int len; + while ((len = zis.read(buffer)) > 0) { + fos.write(buffer, 0, len); + } + + fos.close(); + } + ze = zis.getNextEntry(); + } + + zis.closeEntry(); + zis.close(); + } catch (IOException ex) { + LOGGER.warn("problem extracting " + zipFile + " to " + outputFolder); + } + } + + // Visibility package for test purpose + static void checkorcreateplugins(String pluginFolder) { + File f = new File(pluginFolder); + String tmpFilename = pluginFolder + "/tmp.zip"; + if (!f.exists()) + f.mkdir(); + + f = new File(pluginFolder + "/head"); + File tmpFile = new File(tmpFilename); + if (!f.exists()) { + LOGGER.debug("extracting head plugin"); + if (Resources.extractFileTo("/elasticsearch/plugins/head.zip", tmpFile)) { + extractZip(tmpFile.getAbsolutePath(), pluginFolder); + } else + LOGGER.debug("problem extracting plugin res"); + } + f = new File(pluginFolder + "/delete-by-query"); + if (!f.exists()) { + LOGGER.debug("extracting head delete-by-query plugin"); + if (Resources.extractFileTo("/elasticsearch/plugins/delete-by-query.zip", tmpFile)) { + extractZip(tmpFile.getAbsolutePath(), pluginFolder); + } else + LOGGER.debug("problem extracting plugin res"); + } + if(tmpFile.exists()) + tmpFile.delete(); + + } + + /** + * Checks to see if a specific port is available. + * + * @param port + * the port to check for availability + */ + private static boolean isPortAvailable(int port) { + if (port < MIN_PORT_NUMBER || port > MAX_PORT_NUMBER) { + throw new IllegalArgumentException("Invalid start port: " + port); + } + + ServerSocket ss = null; + DatagramSocket ds = null; + try { + ss = new ServerSocket(port); + ss.setReuseAddress(true); + ds = new DatagramSocket(port); + ds.setReuseAddress(true); + return true; + } catch (IOException e) { + } finally { + if (ds != null) { + ds.close(); + } + + if (ss != null) { + try { + ss.close(); + } catch (IOException e) { + /* should not be thrown */ + } + } + } + + return false; + } + + private static void checkorcreateConfigFile(EsConfig config, AkkaConfig akkaConfig,GeoConfig geoConfig) { + File f = new File(DBCONFIGFILENAME); + if (!f.exists()) { + LOGGER.debug("no " + DBCONFIGFILENAME + " found - extracting from resources"); + if (Resources.extractFileTo("/elasticsearch/elasticsearch.yml", f)) { + // replace template values + LOGGER.debug("replace template values with config:" + config); + Charset charset = StandardCharsets.UTF_8; + try { + Path p = f.toPath(); + String hostName = "0.0.0.0"; //Default as initialisation value + if(akkaConfig!=null && akkaConfig.isCluster()) + { + LOGGER.debug("cluster configuration found"); + hostName=akkaConfig.getClusterConfig().getHostName(hostName); + String clusterDBName=akkaConfig.getClusterConfig().getDBClusterName(null); + String nodeName=String.format("node%d.%s",akkaConfig.getClusterConfig().getRoleMemberIndex(),clusterDBName); + if(clusterDBName!=null) + { + config.setCluster(clusterDBName); + config.setNode(nodeName); + LOGGER.info("set db name to "+clusterDBName+" nodename="+nodeName ); + } + else + LOGGER.warn("unable to set correct db clustername"); + } + String content = new String(Files.readAllBytes(p), charset); + content = content.replaceAll("\\$clustername", config.getCluster()).replaceAll("\\$nodename", + config.getNode()).replaceAll("\\$hostname", hostName); + + //add cluster configuration + if(akkaConfig!=null && akkaConfig.isCluster()) + { + List seedNodes=akkaConfig.getClusterConfig().getSeedNodes(); + String nodesJSONString="[\""+seedNodes.get(0).getRemoteAddress()+"\""; + for(int i=1;i byfilenameComparator = new Comparator() { + + @Override + public int compare(ZipEntry o1, ZipEntry o2) { + return o1.getName().compareTo(o2.getName()); + } + }; + + public HtDatabaseUpdateFile(String filename) throws IOException { + super(filename); + } + + private static String readFile(final InputStream s) throws IOException { + // read file + BufferedReader in = new BufferedReader(new InputStreamReader(s)); + StringBuilder sb = new StringBuilder(); + String inputLine; + while ((inputLine = in.readLine()) != null) { + sb.append(inputLine); + } + in.close(); + s.close(); + return sb.toString(); + } + + public boolean readFiles(FileReadCallback cb) { + boolean r=true; + Enumeration entries = this.entries(); + ArrayList list = Collections.list(entries); + Collections.sort(list, byfilenameComparator); + for (ZipEntry entry : list) { + if (entry.isDirectory()) + continue; + try { + InputStream stream = this.getInputStream(entry); + Object data = new JSONTokener(readFile(stream)).nextValue(); + stream.close(); + if(data instanceof JSONArray) + { + JSONArray a=(JSONArray)data; + for(int i=0;i= 200 && responseCode < 300) + response = http.getInputStream(); + else + { + response = ((HttpURLConnection) http).getErrorStream(); + if(response==null) + http.getInputStream(); + } + String sresponse=""; + if(response!=null) + { + while (true) { + len = response.read(buffer, 0, BUFSIZE); + if (len <= 0) + break; + lensum+=len; + sresponse+=new String(buffer,0,len,CHARSET); + } + response.close(); + } + else + LOG.debug("response is null"); + LOG.debug("ResponseCode: " + responseCode); + LOG.trace("Response: " + sresponse); + + return sresponse; + } +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/database/HtMapper.java b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/database/HtMapper.java new file mode 100644 index 00000000..b46e833c --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/database/HtMapper.java @@ -0,0 +1,160 @@ +/********************************************************************************* + * Copyright © 2015, highstreet technologies GmbH + * All rights reserved! + * + * http://www.highstreet-technologies.com/ + * + * The reproduction, transmission or use of this document or its contents is not + * permitted without express written authority. Offenders will be liable for + * damages. All rights, including rights created by patent grant or registration + * of a utility model or design, are reserved. Technical modifications possible. + * Technical specifications and features are binding only insofar as they are + * specifically and expressly agreed upon in a written contract. + * + * @author: Martin Skorupski [martin@skorupski.de] + *********************************************************************************/ +package org.opendaylight.mwtn.base.database; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.List; + +import org.elasticsearch.common.bytes.BytesReference; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.databind.JsonMappingException; +import com.fasterxml.jackson.databind.JsonNode; + +/** + * @author Herbert + * + */ +public class HtMapper { + + private static final Logger log = LoggerFactory.getLogger(HtDatabaseClientAbstract.class); + + private final Class clazz; + + private final JsonMapperBase objectMapperRead; + private final JsonMapperBase objectMapperWrite; + + private int mappingFailures; + + + public HtMapper(Class clazz) { + + this.mappingFailures = 0; + this.clazz = clazz; + + this.objectMapperRead = new JsonMapperBase(); + this.objectMapperWrite = this.objectMapperRead; + } + + public Class getClazz() { + return clazz; + } + + public int getMappingFailures() { + return mappingFailures; + } + + public String objectToJson( T object ) { + return objectMapperWrite.objectToJson(object); + } + + public String objectListToJson( List objectList ) { + return objectMapperWrite.objectListToJson( objectList ); + } + + public T readValue( JsonNode node ) { + + try { + T object = objectMapperRead.readValue(node.traverse(), clazz); + return object; + } catch (JsonParseException e) { + mappingFailures++; + log.warn(e.toString()); + } catch (JsonMappingException e) { + mappingFailures++; + log.warn(e.toString()); + } catch (IOException e) { + mappingFailures++; + log.warn(e.toString()); + } catch (Exception e) { + mappingFailures++; + log.warn(e.toString()); + } + log.warn("Can not parse: {} {} ", clazz, node); + return null; + + } + + /** + * Do the mapping from Json to class + * Block further mapping if there is are to many failures + * @param json String with Objects JSON representation + * @return The Object + */ + public T getObjectFromJson(byte[] json) { + + if (json != null && mappingFailures < 10) { + try { + T object = objectMapperRead.readValue(json, clazz); + return object; + } catch (JsonParseException e) { + mappingFailures++; + log.warn(e.toString()); + } catch (JsonMappingException e) { + mappingFailures++; + log.warn(e.toString()); + } catch (IOException e) { + mappingFailures++; + log.warn(e.toString()); + } catch (Exception e) { + mappingFailures++; + log.warn(e.toString()); + } + } + log.warn("Problems parsing : {} {}", clazz, json); + return null; + } + + /** + * Do the mapping from Json to class + * Block further mapping if there is are to many failures + * @param json Byte array with JSON Object representation + * @return The Object + */ + public T getObjectFromJson(BytesReference json) { + + return getObjectFromJson(json.toBytes()); + + } + + /** + * Read json from File. + * @param fileName File with JSON text + * @return Object Object + */ + public T readJsonObjectFromFile( String fileName ) { + byte[] content = null; + log.debug("Filename readJsonObjectFromFile: {}",fileName); + + try { + content = Files.readAllBytes(Paths.get(fileName)); + } catch (IOException e1) { + log.warn("IO Problem: {}", e1.getMessage()); + } + + if (content != null) { + return getObjectFromJson(content); + } else { + return null; + } + } + + +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/database/IndexClientBuilder.java b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/database/IndexClientBuilder.java new file mode 100644 index 00000000..858b6f86 --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/database/IndexClientBuilder.java @@ -0,0 +1,150 @@ +package org.opendaylight.mwtn.base.database; + +import java.util.List; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; + +import org.json.JSONObject; +import org.opendaylight.mwtn.base.internalTypes.Resources; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Setup index in the database + * @author herbert + * + */ +public class IndexClientBuilder implements AutoCloseable { + + private static final Logger LOG = LoggerFactory.getLogger(IndexClientBuilder.class); + + /** Index name to be used */ + private final String index; + /** Location of mapping data **/ + private String mappingSettingFileName = null; + /** Location of configuration data **/ + private String modelDataDirectory = null; + + private final ScheduledExecutorService scheduler; + private HtDatabaseClientAbstract client; + private HtDatabaseNode database; + + + // --- Construct and initialize + + public IndexClientBuilder(String index) { + this.index = index; + this.database = null; + this.scheduler = Executors.newSingleThreadScheduledExecutor(); + } + + // Additional setter functions + + public IndexClientBuilder setMappingSettingJsonFileName(String jsonFileName) { + this.mappingSettingFileName = jsonFileName; + return(this); + } + + public IndexClientBuilder setModelDataDirectory(String jsonDirectory) { + this.modelDataDirectory = jsonDirectory; + return(this); + } + + /* + public IndexClientBuilder setDatabase(HtDatabaseNode database) { + this.database = database; + return(this); + } + */ + + public HtDatabaseClientAbstract create(String esNodeserverName, String esClusterName,String esNodeName) { + LOG.info("Create {} start with name parameters server/cluster/node {} {} {}", + this.getClass().getSimpleName(), esNodeserverName, esClusterName, esNodeName); + + client = null; + + try { + // Create control structure + client = new HtDatabaseClientAbstract(index, esNodeserverName, esClusterName, esNodeName); + setupIndex(); + } catch (Exception e) { + LOG.error("Can not start database client. Exception: {} {}", e.getMessage(), e.toString()); + } + + LOG.info("Create {} finished. DB Service {} started.", this.getClass().getSimpleName(), client != null ? "sucessfully" : "not" ); + return(client); + + } + + public HtDatabaseClientAbstract create(HtDatabaseNode database) { + LOG.info("Create {} start with node", this.getClass().getSimpleName() ); + this.database = database; + client = new HtDatabaseClientAbstract(index, database); + setupIndex(); + return client; + } + + + public void stop() { + this.scheduler.shutdown(); + } + + @Override + public void close() throws Exception { + stop(); + } + + private void setupIndex() { + if (! client.isExistsIndex()) { + LOG.info("Index not existing ... create index"); + + // Initialisation 1 + if (mappingSettingFileName != null) { + JSONObject indexconfigdata=Resources.getJSONFile(mappingSettingFileName); + client.doCreateIndexWithMapping(indexconfigdata); + } else + client.doCreateIndex(); + + // Initialisation 2 - start asynchron initialization and let it run + scheduler.schedule(fillDatabase, 0, TimeUnit.SECONDS); + } + } + + private final Runnable fillDatabase = new Runnable() { + @Override + public void run() { + if (database != null) { + database.setInitializedTarget(); + } + try { //Prevent ending task by exception + if (modelDataDirectory != null) { + LOG.info("... write initial data for index {}",index); + List dataList=Resources.getJSONFiles(modelDataDirectory, false); + LOG.debug("received number of objects: {} of index {}", dataList.size(), index); + for (JSONObject da: dataList) { + client.doWriteJSONObject(da); + } + LOG.debug("wrote all objects for index {}", index); + } else { + LOG.info("No initial data for index {}",index); + } + } catch (Exception e) { + LOG.warn("Problem during initialization of index "+index+" {}", e); + } + if (database != null) { + database.setInitializedReached(); + } + } + }; + + /*--------------------------------------------------------- + * static files + */ + + public static IndexClientBuilder getBuilder(String index) { + return new IndexClientBuilder(index); + } + + +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/database/IsEsObject.java b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/database/IsEsObject.java new file mode 100644 index 00000000..a7286d1f --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/database/IsEsObject.java @@ -0,0 +1,35 @@ +/********************************************************************************* + * Copyright © 2015, highstreet technologies GmbH + * All rights reserved! + * + * http://www.highstreet-technologies.com/ + * + * The reproduction, transmission or use of this document or its contents is not + * permitted without express written authority. Offenders will be liable for + * damages. All rights, including rights created by patent grant or registration + * of a utility model or design, are reserved. Technical modifications possible. + * Technical specifications and features are binding only insofar as they are + * specifically and expressly agreed upon in a written contract. + * + * @author: Martin Skorupski [martin@skorupski.de] + *********************************************************************************/ +package org.opendaylight.mwtn.base.database; + +/** + * Element is a document in the ES database. + */ +public interface IsEsObject { + + /** + * Set the ES Id + * @param id Set the ID, created by ES for this Object + */ + void setEsId( String id ); + + /** + * Get Id content as string that is used in ES + * @return Related ID, that was specified by set command. + */ + String getEsId(); + +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/database/JsonMapperBase.java b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/database/JsonMapperBase.java new file mode 100644 index 00000000..be114538 --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/database/JsonMapperBase.java @@ -0,0 +1,103 @@ +/********************************************************************************* + * Copyright © 2015, highstreet technologies GmbH + * All rights reserved! + * + * http://www.highstreet-technologies.com/ + * + * The reproduction, transmission or use of this document or its contents is not + * permitted without express written authority. Offenders will be liable for + * damages. All rights, including rights created by patent grant or registration + * of a utility model or design, are reserved. Technical modifications possible. + * Technical specifications and features are binding only insofar as they are + * specifically and expressly agreed upon in a written contract. + * + * @author: Martin Skorupski [martin@skorupski.de] + *********************************************************************************/ +package org.opendaylight.mwtn.base.database; + +import java.io.IOException; +import java.io.StringWriter; +import java.util.List; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility; +import com.fasterxml.jackson.annotation.PropertyAccessor; +import com.fasterxml.jackson.core.JsonGenerationException; +import com.fasterxml.jackson.core.JsonGenerator.Feature; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.JsonMappingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; + +/** + * This class is used to define default for JSON Serialization and Deserialization for the project at a single place + */ +public class JsonMapperBase extends ObjectMapper { + + private static final long serialVersionUID = 1L; + private static final Logger LOG = LoggerFactory.getLogger(JsonMapperBase.class); + + public JsonMapperBase() { + + setVisibility(PropertyAccessor.ALL, Visibility.NONE); + setVisibility(PropertyAccessor.FIELD, Visibility.ANY); + + // Deserialization + configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + configure(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_AS_NULL, true); + + // Serialization + configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false); + getFactory().configure(Feature.ESCAPE_NON_ASCII, true); + } + + + public String objectToJson( Object object ) { + String res = null; + + try { + + StringWriter stringEmp = new StringWriter(); + writeValue(stringEmp, object); + res = stringEmp.toString(); + stringEmp.close(); + + } catch (JsonGenerationException e) { + LOG.debug(e.toString()); + } catch (JsonMappingException e) { + LOG.debug(e.toString()); + } catch (IOException e) { + LOG.debug(e.toString()); + } catch (Exception e) { + LOG.debug(e.toString()); + } + + return res; + } + + public String objectListToJson( List objectList ) { + String res = null; + + try { + + StringWriter stringEmp = new StringWriter(); + writeValue(stringEmp, objectList); + res = stringEmp.toString(); + stringEmp.close(); + + } catch (JsonGenerationException e) { + LOG.debug(e.toString()); + } catch (JsonMappingException e) { + LOG.debug(e.toString()); + } catch (IOException e) { + LOG.debug(e.toString()); + } catch (Exception e) { + LOG.debug(e.toString()); + } + + return res; + } + +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/http/BaseHTTPClient.java b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/http/BaseHTTPClient.java new file mode 100644 index 00000000..bfd8095d --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/http/BaseHTTPClient.java @@ -0,0 +1,267 @@ +package org.opendaylight.mwtn.base.http; + +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.HttpURLConnection; +import java.net.URL; +import java.net.URLConnection; +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.security.KeyFactory; +import java.security.KeyManagementException; +import java.security.KeyStore; +import java.security.KeyStoreException; +import java.security.NoSuchAlgorithmException; +import java.security.UnrecoverableKeyException; +import java.security.cert.Certificate; +import java.security.cert.CertificateException; +import java.security.cert.CertificateFactory; +import java.security.cert.X509Certificate; +import java.security.interfaces.RSAPrivateKey; +import java.security.spec.InvalidKeySpecException; +import java.security.spec.PKCS8EncodedKeySpec; +import java.util.Base64; +import java.util.Map; + +import javax.net.ssl.HostnameVerifier; +import javax.net.ssl.HttpsURLConnection; +import javax.net.ssl.KeyManager; +import javax.net.ssl.KeyManagerFactory; +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLSession; +import javax.net.ssl.TrustManager; +import javax.xml.bind.DatatypeConverter; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class BaseHTTPClient { + + private static Logger LOG = LoggerFactory.getLogger(BaseHTTPClient.class); + public static int SSLCERT_NONE=-1; + public static int SSLCERT_PCKS=0; + public static int SSLCERT_PEM=1; + private SSLContext sc=null; + private static final int BUFSIZE = 1024; + private static final Charset CHARSET = StandardCharsets.UTF_8; + private static final String SSLCONTEXT = "TLSv1.2"; + private static final int DEFAULT_HTTP_TIMEOUT = 30000; //in ms + private boolean TRUSTALL; + private final String baseUrl; + private int timeout = DEFAULT_HTTP_TIMEOUT; + + public BaseHTTPClient(String base) { + this(base, false); + } + public BaseHTTPClient(String base, boolean trustAllCerts) + { + this(base,trustAllCerts,null,null,SSLCERT_NONE); + } + public BaseHTTPClient(String base, boolean trustAllCerts,String certFilename,String passphrase,int sslCertType) { + this.baseUrl = base; + this.TRUSTALL = trustAllCerts; + try { + sc = setupSsl(TRUSTALL,certFilename,passphrase,sslCertType); + } catch (KeyManagementException | NoSuchAlgorithmException | UnrecoverableKeyException | CertificateException | KeyStoreException | IOException | InvalidKeySpecException e) { + LOG.warn("problem ssl setup: " + e.getMessage()); + } + } + + protected BaseHTTPResponse sendRequest(String uri, String method, String body, Map headers) + throws IOException { + return this.sendRequest(uri, method, body != null ? body.getBytes(CHARSET) : null, headers); + } + + protected BaseHTTPResponse sendRequest(String uri, String method, byte[] body, Map headers) + throws IOException { + if(uri==null) + uri=""; + String surl = this.baseUrl; + if(!surl.endsWith("/") && uri.length()>0) + surl+="/"; + if(uri.startsWith("/")) + uri=uri.substring(1); + surl+=uri; + LOG.debug("try to send request with url=" + this.baseUrl + uri + " as method=" + method); + LOG.trace("body:" + (body==null?"null": new String(body, CHARSET))); + URL url = new URL(surl); + URLConnection http = url.openConnection(); + http.setConnectTimeout(this.timeout); + if (surl.toString().startsWith("https")) + { + if (sc != null) + { + ((HttpsURLConnection) http).setSSLSocketFactory(sc.getSocketFactory()); + if (TRUSTALL) { + LOG.debug("trusting all certs"); + HostnameVerifier allHostsValid = new HostnameVerifier() { + public boolean verify(String hostname, SSLSession session) { + return true; + } + }; + ((HttpsURLConnection) http).setHostnameVerifier(allHostsValid); + } + } else //Should never happen + { + LOG.warn("No SSL context available"); + return new BaseHTTPResponse(-1, ""); + } + } + ((HttpURLConnection) http).setRequestMethod(method); + http.setDoOutput(true); + if (headers != null && headers.size() > 0) { + for (String key : headers.keySet()) { + http.setRequestProperty(key, headers.get(key)); + LOG.trace("set http header "+ key+": "+headers.get(key)); + } + } + byte[] buffer = new byte[BUFSIZE]; + int len = 0, lensum = 0; + // send request + // Send the message to destination + if (!method.equals("GET") && body != null && body.length > 0) { + try (OutputStream output = http.getOutputStream()) { + output.write(body); + } + } + int responseCode = ((HttpURLConnection) http).getResponseCode(); + // Receive answer + InputStream response; + if (responseCode >= 200 && responseCode < 300) + response = http.getInputStream(); + else { + response = ((HttpURLConnection) http).getErrorStream(); + if (response == null) + response = http.getInputStream(); + } + String sresponse = ""; + if (response != null) { + while (true) { + len = response.read(buffer, 0, BUFSIZE); + if (len <= 0) + break; + lensum += len; + sresponse += new String(buffer, 0, len, CHARSET); + } + response.close(); + } else + LOG.debug("response is null"); + LOG.debug("ResponseCode: " + responseCode); + LOG.trace("Response (len:{}): {}",String.valueOf(lensum),sresponse); + + return new BaseHTTPResponse(responseCode, sresponse); + } + + public static SSLContext setupSsl(boolean trustall) + throws NoSuchAlgorithmException, KeyManagementException, CertificateException, FileNotFoundException, + IOException, UnrecoverableKeyException, KeyStoreException, InvalidKeySpecException { + + return setupSsl(trustall, null, null, SSLCERT_NONE); + } + + /** + * + * @param keyFilename + * @param certFilename + * @throws NoSuchAlgorithmException + * @throws KeyManagementException + * @throws IOException + * @throws FileNotFoundException + * @throws CertificateException + * @throws KeyStoreException + * @throws UnrecoverableKeyException + * @throws InvalidKeySpecException + */ + public static SSLContext setupSsl(boolean trustall, String certFilename, String passPhrase,int certType) throws NoSuchAlgorithmException, KeyManagementException, CertificateException, FileNotFoundException, IOException, UnrecoverableKeyException, KeyStoreException, InvalidKeySpecException { + + SSLContext sc = SSLContext.getInstance(SSLCONTEXT); + TrustManager[] trustCerts = null; + if (trustall) { + trustCerts = new TrustManager[] { new javax.net.ssl.X509TrustManager() { + public java.security.cert.X509Certificate[] getAcceptedIssuers() { + return null; + } + + public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType) { + } + + public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType) { + } + } }; + + } + KeyManager[] kms=null; + if(certFilename!=null && passPhrase!=null && !certFilename.isEmpty() && !passPhrase.isEmpty()) + { + if(certType==SSLCERT_PCKS) + { + LOG.debug("try to load pcks file "+certFilename+ " with passphrase="+passPhrase); + KeyStore keyStore = KeyStore.getInstance("PKCS12"); + keyStore.load(new FileInputStream(certFilename), passPhrase.toCharArray()); + KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); + kmf.init(keyStore, passPhrase.toCharArray()); + kms = kmf.getKeyManagers(); + LOG.debug("successful"); + + } + else if(certType==SSLCERT_PEM) + { + LOG.debug("try to load pem files cert="+certFilename+ " key="+passPhrase); + File fCert = new File(certFilename); + File fKey = new File(passPhrase); + KeyStore keyStore = KeyStore.getInstance("JKS"); + keyStore.load(null); + byte[] certBytes = parseDERFromPEM(Files.readAllBytes(fCert.toPath()), "-----BEGIN CERTIFICATE-----", + "-----END CERTIFICATE-----"); + byte[] keyBytes = parseDERFromPEM(Files.readAllBytes(fKey.toPath()), "-----BEGIN PRIVATE KEY-----", + "-----END PRIVATE KEY-----"); + + X509Certificate cert = generateCertificateFromDER(certBytes); + RSAPrivateKey key = generatePrivateKeyFromDER(keyBytes); + keyStore.setCertificateEntry("cert-alias", cert); + keyStore.setKeyEntry("key-alias", key, "changeit".toCharArray(), new Certificate[] {cert}); + + KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509"); + kmf.init(keyStore, "changeit".toCharArray()); + kms = kmf.getKeyManagers(); + LOG.debug("successful"); + } + } + // Init the SSLContext with a TrustManager[] and SecureRandom() + sc.init(kms, trustCerts, new java.security.SecureRandom()); + return sc; + } + protected static byte[] parseDERFromPEM(byte[] pem, String beginDelimiter, String endDelimiter) { + String data = new String(pem); + String[] tokens = data.split(beginDelimiter); + tokens = tokens[1].split(endDelimiter); + return DatatypeConverter.parseBase64Binary(tokens[0]); + } + + protected static RSAPrivateKey generatePrivateKeyFromDER(byte[] keyBytes) throws InvalidKeySpecException, NoSuchAlgorithmException { + PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(keyBytes); + + KeyFactory factory = KeyFactory.getInstance("RSA"); + + return (RSAPrivateKey)factory.generatePrivate(spec); + } + + protected static X509Certificate generateCertificateFromDER(byte[] certBytes) throws CertificateException { + CertificateFactory factory = CertificateFactory.getInstance("X.509"); + + return (X509Certificate)factory.generateCertificate(new ByteArrayInputStream(certBytes)); + } + public static String getAuthorizationHeaderValue(String username, String password) { + return "Basic " + new String(Base64.getEncoder().encode((username+":"+password).getBytes())); + } + public void setTimeout(int timeout) { + this.timeout =timeout; + } + +} \ No newline at end of file diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/http/BaseHTTPResponse.java b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/http/BaseHTTPResponse.java new file mode 100644 index 00000000..88dd73e1 --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/http/BaseHTTPResponse.java @@ -0,0 +1,21 @@ +package org.opendaylight.mwtn.base.http; + +public class BaseHTTPResponse { + + public static final int CODE404 = 404; + public static final int CODE200 = 200; + public static final BaseHTTPResponse UNKNOWN = new BaseHTTPResponse(-1, ""); + public final int code; + public final String body; + + public BaseHTTPResponse(int code,String body) + { + this.code=code; + this.body=body; + } + + @Override + public String toString() { + return "BaseHTTPResponse [code=" + code + ", body=" + body + "]"; + } +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/internalTypes/Environment.java b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/internalTypes/Environment.java new file mode 100644 index 00000000..7b54a5c5 --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/internalTypes/Environment.java @@ -0,0 +1,29 @@ +package org.opendaylight.mwtn.base.internalTypes; + +import java.net.Inet4Address; +import java.net.UnknownHostException; +import java.util.Map; + +public class Environment { + + public static String getVar(String v) + { + if(v.equals("$HOSTNAME")) + { + String s=null; + try { + s = Inet4Address.getLocalHost().getHostName(); + } catch (UnknownHostException e) { + + } + if(s!=null && s.length()>0) + return s; + } + Map env = System.getenv(); + for (String envName : env.keySet()) { + if(envName!=null && envName.equals(v)) + return env.get(envName); + } + return null; + } +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/internalTypes/FileWatchdog.java b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/internalTypes/FileWatchdog.java new file mode 100644 index 00000000..e3b0ef54 --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/internalTypes/FileWatchdog.java @@ -0,0 +1,121 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.opendaylight.mwtn.base.internalTypes; + +import java.io.File; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Check every now and then that a certain file has not changed. If it has, then + * call the {@link #doOnChange} method. + * + * @author JunHo Yoon + * @since 3.1.1 + */ +public abstract class FileWatchdog extends Thread { + private static final Logger LOGGER = LoggerFactory.getLogger(FileWatchdog.class); + /** + * The default delay between every file modification check, set to 60 + * seconds. + */ + public static final long DEFAULT_DELAY = 60000; + /** + * The name of the file to observe for changes. + */ + private String filename; + + /** + * The delay to observe between every check. By default set + * {@link #DEFAULT_DELAY}. + */ + private long delay = DEFAULT_DELAY; + + private File file; + private long lastModified = 0; + private boolean warnedAlready = false; + private boolean interrupted = false; + + protected FileWatchdog(String filename) { + this.filename = filename; + file = new File(filename); + setDaemon(true); + checkAndConfigure(); + } + + /** + * Set the delay to observe between each check of the file changes. + * + * @param delay + * the frequency of file watch. + */ + public void setDelay(long delay) { + this.delay = delay; + } + + /** + * abstract method to be run when the file is changed. + */ + protected abstract void doOnChange(); + + protected void checkAndConfigure() { + boolean fileExists; + try { + fileExists = file.exists(); + } catch (SecurityException e) { + LOGGER.warn("Was not allowed to read check file existence, file:[" + filename + "]."); + interrupted = true; // there is no point in continuing + return; + } + + if (fileExists) { + long l = file.lastModified(); // this can also throw a + if (lastModified ==0) { + lastModified = l; // is very unlikely. + } + if (l > lastModified) { // however, if we reached this point this + lastModified = l; // is very unlikely. + doOnChange(); + warnedAlready = false; + } + } else { + if (!warnedAlready) { + LOGGER.debug("[" + filename + "] does not exist."); + warnedAlready = true; + } + } + } + + /* + * (non-Javadoc) + * + * @see java.lang.Thread#run() + */ + @Override + public void run() { + while (!interrupted && !isInterrupted()) { + try { + Thread.sleep(delay); + } catch (InterruptedException e) { + + } + checkAndConfigure(); + } + } +} \ No newline at end of file diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/internalTypes/IniConfigurationFile.java b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/internalTypes/IniConfigurationFile.java new file mode 100644 index 00000000..95d6a137 --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/internalTypes/IniConfigurationFile.java @@ -0,0 +1,356 @@ +package org.opendaylight.mwtn.base.internalTypes; + +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map.Entry; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class IniConfigurationFile { + + private static final Logger LOG = LoggerFactory.getLogger(IniConfigurationFile.class); + + public static class ConfigurationException extends Exception { + /** + * + */ + private static final long serialVersionUID = 733061908616404383L; + + public ConfigurationException(String m) { + super(m); + } + } + + public static class ConversionException extends Exception { + /** + * + */ + private static final long serialVersionUID = 5179891576029923079L; + + public ConversionException(String m) { + super(m); + } + } + + public static final String SECTIONNAME_ROOT = ""; + public static final String DELIMITER = "="; + + private static class SectionValue { + public String Value; + public final List Comments; + public boolean IsUncommented; + + public SectionValue(String value) { + this(value, new ArrayList(), false); + } + + public SectionValue(String value, List commentsForValue, boolean isuncommented) { + this.Comments = commentsForValue; + this.Value = value; + this.IsUncommented = isuncommented; + } + } + + public static class Section { + public final String Name; + public final List rawLines; + public final LinkedHashMap values; + + public Section(String name) { + LOG.debug("new section created:" + name); + this.Name = name; + this.rawLines = new ArrayList(); + this.values = new LinkedHashMap(); + } + + public void addLine(String line) { + LOG.trace("adding raw line:" + line); + this.rawLines.add(line); + } + + public String getProperty(String key) { + return this.getProperty(key, null); + } + + public String getProperty(String key, String defValue) { + if (values.containsKey(key)) + return values.get(key).Value; + return defValue; + } + + public void setProperty(String key, String value) { + boolean isuncommented = this.isCommentLine(key); + if(isuncommented) + key=key.substring(1); + if (this.values.containsKey(key)) { + this.values.get(key).Value = value; + this.values.get(key).IsUncommented = isuncommented; + } else { + SectionValue sv = new SectionValue(value); + sv.IsUncommented = isuncommented; + this.values.put(key, sv); + } + } + + public void parseLines() { + this.values.clear(); + List commentsForValue = new ArrayList(); + boolean uncommented = false; + for (String line : rawLines) { + + if (this.isCommentLine(line)) { + if (!line.contains(DELIMITER)) { + commentsForValue.add(line); + continue; + } else { + uncommented = true; + line = line.substring(1); + } + } + if (!line.contains(DELIMITER)) + continue; + String hlp[] = line.split(DELIMITER); + if(hlp.length>1) + { + String key=hlp[0]; + String value=line.length()>(key+DELIMITER).length()?line.substring((key+DELIMITER).length()):""; + if (this.values.containsKey(key)) + this.values.get(key).Value = value; + else { + this.values.put(key, new SectionValue(value, commentsForValue, uncommented)); + commentsForValue = new ArrayList(); + } + } + else + { + LOG.warn("ignoring unknown formatted line:"+line); + } + uncommented = false; + } + } + + private boolean isCommentLine(String line) { + for (String c : commentChars) { + if (line.startsWith(c)) + return true; + } + return false; + } + + public String[] toLines() { + List lines = new ArrayList(); + if (!this.Name.isEmpty()) + lines.add("[" + this.Name + "]"); + for (Entry entry : this.values.entrySet()) { + if (entry.getValue().Comments.size() > 0) { + for (String comment : entry.getValue().Comments) + lines.add(comment); + } + lines.add((entry.getValue().IsUncommented ? commentChars[0] : "") + entry.getKey() + DELIMITER + + entry.getValue().Value); + } + String[] alines = new String[lines.size()]; + return lines.toArray(alines); + } + + public String getString(String key, String def) { + return this.getProperty(key, def); + } + + public boolean getBoolean(String key, boolean def) throws ConversionException { + String v = this.getProperty(key); + if (v == null || v.isEmpty()) + return def; + if (v.equals("true")) + return true; + if (v.equals("false")) + return false; + throw new ConversionException("invalid value for key " + key); + } + + public int getInt(String key, int def) throws ConversionException { + String v = this.getProperty(key); + if (v == null || v.isEmpty()) + return def; + try { + return Integer.parseInt(v); + } catch (NumberFormatException e) { + throw new ConversionException(e.getMessage()); + } + } + + public boolean hasValues() { + return this.values.size()>0; + } + + public boolean hasKey(String key) { + return this.values.containsKey(key); + } + + } + + private final File mFile; + private final List
sections; + private static final String commentChars[] = { "#", ";" }; + + public IniConfigurationFile(File f) { + this.mFile = f; + this.sections = new ArrayList
(); + this.sections.add(new Section(SECTIONNAME_ROOT)); + + } + + public void load() throws ConfigurationException { + String curSectionName = SECTIONNAME_ROOT; + LOG.debug("loading file"); + BufferedReader br = null; + try { + br = new BufferedReader(new FileReader(this.mFile)); + for (String line; (line = br.readLine()) != null;) { + line = line.trim(); + if (line.isEmpty()) + continue; + if (line.startsWith("[") && line.endsWith("]")) { + curSectionName = line.substring(1, line.length() - 1); + this.addSection(curSectionName); + } else + this.getSection(curSectionName).addLine(line); + } + + } catch (Exception e) { + throw new ConfigurationException(e.getMessage()); + } finally { + try { + if (br != null) + br.close(); + } catch (IOException e) { + } + } + LOG.debug("finished loading file"); + LOG.debug("start parsing sections"); + for (Section section : this.sections) + section.parseLines(); + LOG.debug("finished parsing " + this.sections.size() + " sections"); + } + + private Section getSection(String name) { + for (Section s : this.sections) { + if (s.Name.equals(name)) + return s; + } + return this.addSection(name); + + } + + private Section addSection(String name) { + + Section s = new Section(name); + this.sections.add(s); + return s; + } + + public void reLoad() throws ConfigurationException { + this.sections.clear(); + this.sections.add(new Section(SECTIONNAME_ROOT)); + this.load(); + } + + public String getProperty(String key, String defValue) { + Section s; + if (key.contains(".")) { + s = this.getSection(key.substring(0, key.indexOf("."))); + key = key.substring(key.indexOf(".") + 1); + } else + s = this.getSection(SECTIONNAME_ROOT); + + String v = s.getProperty(key); + if (v == null || v.isEmpty()) + return defValue; + return v; + } + + public void setProperty(String key, String value) { + Section s; + if (key.contains(".")) { + s = this.getSection(key.substring(0, key.indexOf("."))); + key = key.substring(key.indexOf(".") + 1); + } else + s = this.getSection(SECTIONNAME_ROOT); + s.setProperty(key, value); + } + + public int getProperty(String key, int defValue) throws ConversionException { + Section s; + if (key.contains(".")) { + s = this.getSection(key.substring(0, key.indexOf("."))); + key = key.substring(key.indexOf(".") + 1); + } else + s = this.getSection(SECTIONNAME_ROOT); + + return s.getInt(key, defValue); + } + + public void setProperty(String key, int value) { + Section s; + if (key.contains(".")) { + s = this.getSection(key.substring(0, key.indexOf("."))); + key = key.substring(key.indexOf(".") + 1); + } else + s = this.getSection(SECTIONNAME_ROOT); + s.setProperty(key, String.format("%d", value)); + } + + public boolean getProperty(String key, boolean defValue) throws ConversionException { + Section s; + if (key.contains(".")) { + s = this.getSection(key.substring(0, key.indexOf("."))); + key = key.substring(key.indexOf(".") + 1); + } else + s = this.getSection(SECTIONNAME_ROOT); + + return s.getBoolean(key, defValue); + } + + public void setProperty(String key, boolean value) { + Section s; + if (key.contains(".")) { + s = this.getSection(key.substring(0, key.indexOf("."))); + key = key.substring(key.indexOf(".") + 1); + } else + s = this.getSection(SECTIONNAME_ROOT); + s.setProperty(key, value ? "true" : "false"); + } + + public void setProperty(String key, Object value) { + this.setProperty(key, value==null?"null":value.toString()); + } + + public void save() { + final String LR = "\n"; + BufferedWriter bw; + try { + bw = new BufferedWriter(new FileWriter(this.mFile, false)); + for (Section section : this.sections) { + if(section.hasValues()) + bw.write(String.join(LR, section.toLines()) + LR + LR); + } + bw.close(); + } catch (Exception e) { + + } + + } + + public Section subset(String section) { + return this.getSection(section); + } + +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/internalTypes/InternalDateAndTime.java b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/internalTypes/InternalDateAndTime.java new file mode 100644 index 00000000..bba9a3a0 --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/internalTypes/InternalDateAndTime.java @@ -0,0 +1,76 @@ +/** + * + */ +package org.opendaylight.mwtn.base.internalTypes; + +import org.opendaylight.mwtn.base.netconf.NetconfTimeStamp; + +/** + * Converts time stamps into internal format according to ONF1.2 and ISO 8601. + * @author herbert + * + */ +public class InternalDateAndTime { + + public static InternalDateAndTime TESTPATTERN = new InternalDateAndTime("2017-01-01T00:00:00.0Z"); + + String internalDateAndTime; + + /** + * Static builder ONF1.2 + * @param time in ONF1.2 yang format + * @return InternalDateAndTime + */ + public static InternalDateAndTime valueOf(org.opendaylight.yang.gen.v1.uri.onf.coremodel.corefoundationmodule.typedefinitions.rev160701.DateAndTime time) { + return new InternalDateAndTime(time); + } + + /** + * Static builder ONF1.0 + * @param time in ONF1.0 yang format + * @return InternalDateAndTime + */ + + public static InternalDateAndTime valueOf(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.DateAndTime time) { + return new InternalDateAndTime(time); + } + + /** + * @return Getter with String representation + */ + public String getValue() { + return internalDateAndTime; + } + + /*---------------------------------------------------------------- + * Private constructors and functions + */ + + /** + * Convert ONF 1.0 DateAndTime to String + * @param time as input + */ + private InternalDateAndTime(org.opendaylight.yang.gen.v1.uri.onf.coremodel.corefoundationmodule.typedefinitions.rev160701.DateAndTime time) { + internalDateAndTime = NetconfTimeStamp.getTimeStampFromNetconf(time.getValue()); + } + + + /** + * Convert ONF 1.2 DateAndTime to String + * @param time as input + */ + private InternalDateAndTime(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.DateAndTime time) { + internalDateAndTime = NetconfTimeStamp.getTimeStampFromNetconf(time.getValue()); + } + + /** + * Setup static TEST + * @param internalDateAndTime + */ + private InternalDateAndTime(String internalDateAndTime) { + this.internalDateAndTime = internalDateAndTime; + } + + + +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/internalTypes/InternalSeverity.java b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/internalTypes/InternalSeverity.java new file mode 100644 index 00000000..2ca8149c --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/internalTypes/InternalSeverity.java @@ -0,0 +1,85 @@ +/** + * @author herbert + * + */ +package org.opendaylight.mwtn.base.internalTypes; + +public enum InternalSeverity { + + NonAlarmed, + Warning, + Minor, + Major, + Critical; + + public boolean isNoAlarmIndication() { + return this == NonAlarmed; + } + + public String getValueAsString() { + return this.name(); + } + + @Override + public String toString() { + return this.name(); + } + + public String toNetconfString() + { + switch(this) + { + case NonAlarmed: + return "non-alarmed"; + case Warning: + return "warning"; + case Minor: + return "minor"; + case Major: + return "major"; + case Critical: + return "critical"; + } + return "not-specified"; + } + + public static InternalSeverity valueOf(org.opendaylight.yang.gen.v1.uri.onf.microwavemodel.typedefinitions.rev160902.SeverityType severity) { + switch( severity ) { + case NonAlarmed: + return InternalSeverity.NonAlarmed; + case Warning: + return InternalSeverity.Warning; + case Minor: + return InternalSeverity.Minor; + case Major: + return InternalSeverity.Major; + case Critical: + return InternalSeverity.Critical; + } + return null; + } + + /** + * convert ONF 1.2 Severity + * @param severity as input + * @return String with related output + */ + public static InternalSeverity valueOf(org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev170324.SeverityType severity ) { + switch( severity ) { + case NonAlarmed: + return InternalSeverity.NonAlarmed; + case Warning: + return InternalSeverity.Warning; + case Minor: + return InternalSeverity.Minor; + case Major: + return InternalSeverity.Major; + case Critical: + return InternalSeverity.Critical; + } + return null; + } + + + +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/internalTypes/InventoryInformation.java b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/internalTypes/InventoryInformation.java new file mode 100644 index 00000000..b4f14543 --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/internalTypes/InventoryInformation.java @@ -0,0 +1,51 @@ +package org.opendaylight.mwtn.base.internalTypes; + +import java.util.ArrayList; +import java.util.List; + +import javax.annotation.Nonnull; + +public class InventoryInformation { + + public static final String UNKNOWN = "unknown"; + public static final InventoryInformation DEFAULT = new InventoryInformation(InventoryInformation.UNKNOWN, InventoryInformation.UNKNOWN, InventoryInformation.UNKNOWN, InventoryInformation.UNKNOWN, InventoryInformation.UNKNOWN, new ArrayList()); + private final String type; + private final String model; + private final String vendor; + private final String deviceIpv4; + private final String deviceIpv6; + private final List interfaceUuidList; + + + public String getType() {return this.type;} + public String getModel() {return this.model;} + public String getVendor() {return this.vendor;} + public String getDeviceIpv4() {return this.deviceIpv4;} + public String getDeviceIpv6() {return this.deviceIpv6;} + public List getInterfaceUuidList(){return this.interfaceUuidList;} + + public InventoryInformation(String type,String model,String vendor,String ipv4,String ipv6,List ifInfos ) + { + this.type=type; + this.model=model; + this.vendor=vendor; + this.deviceIpv4=ipv4; + this.deviceIpv6=ipv6; + this.interfaceUuidList=ifInfos; + + } + + public @Nonnull static InventoryInformation fromNeXML(String xmlRaw,String layerProtocolFilter) + { + List uuids = new ArrayList(); + String type=InventoryInformation.UNKNOWN; + String model=InventoryInformation.UNKNOWN; + String vendor=InventoryInformation.UNKNOWN; + String ipv4=InventoryInformation.UNKNOWN; + String ipv6=InventoryInformation.UNKNOWN; + + //TODO: parse xml document + + return new InventoryInformation(type, model, vendor, ipv4, ipv6, uuids); + } +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/internalTypes/Resources.java b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/internalTypes/Resources.java new file mode 100644 index 00000000..89cf29ba --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/internalTypes/Resources.java @@ -0,0 +1,300 @@ +package org.opendaylight.mwtn.base.internalTypes; + + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileFilter; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.net.MalformedURLException; +import java.net.URISyntaxException; +import java.net.URL; +import java.util.ArrayList; +import java.util.Enumeration; +import java.util.List; + +import org.json.JSONException; +import org.json.JSONObject; +import org.osgi.framework.Bundle; +import org.osgi.framework.FrameworkUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class Resources { + + private static final Logger LOG = LoggerFactory.getLogger(Resources.class); + + + private static URL getFileURL(String resFile) + { + Bundle b = FrameworkUtil.getBundle(Resources.class); + URL u=null; + if(b==null) + { + LOG.warn("cannot load bundle resources"); + try { + u=new File("src/main/resources"+resFile).toURI().toURL(); + } catch (MalformedURLException e) { + LOG.warn(e.getMessage()); + } + } + else + u= b.getEntry(resFile); + return u; + } + + private static File getFile(String resFile) + { + Bundle b = FrameworkUtil.getBundle(Resources.class); + File f=null; + if(b==null) + { + LOG.warn("cannot load bundle resources"); + f=new File("src/main/resources"+resFile); + } else + try { + f=new File(b.getEntry(resFile).toURI()); + } catch (URISyntaxException e) { + + } + return f; + } + + private static String readFile(final URL u) throws IOException + { + return readFile(u.openStream()); + } + private static String readFile(final File f) throws IOException + { + return readFile(new FileInputStream(f)); + } + private static String readFile(final InputStream s) throws IOException + { + //read file + BufferedReader in = new BufferedReader(new InputStreamReader(s)); + StringBuilder sb=new StringBuilder(); + String inputLine; + while ((inputLine = in.readLine()) != null) + { + sb.append(inputLine); + } + in.close(); + s.close(); + return sb.toString(); + } + + public static String getFileContent(String resFile) throws IOException + { + return readFile(getFileURL(resFile)); + } + public static List getFiles(String folder,final String filter,final boolean recursive) + { + List list=new ArrayList(); + FileFilter ff=new FileFilter() { + + @Override + public boolean accept(File pathname) { + if(pathname.isFile()) + return pathname.getName().contains(filter); + else + return true; + } + }; + File ffolder=getFile(folder); + if(ffolder!=null && ffolder.isDirectory()) + { + File[] files=ffolder.listFiles(ff); + if(files!=null && files.length>0) + { + for(File f:files) + { + if(f.isFile()) + list.add(f); + else if(f.isDirectory() && recursive) + { + getFilesRecursive(f,ff,list); + } + } + } + } + return list; + } + public static List getFileURLs(String folder,final String filter,final boolean recursive) throws IOException + { + Bundle b = FrameworkUtil.getBundle(Resources.class); + List list=new ArrayList(); + if(b==null) + { + FileFilter ff=new FileFilter() { + + @Override + public boolean accept(File pathname) { + if(pathname.isFile()) + return pathname.getName().contains(filter); + else + return true; + } + }; + File ffolder=getFile(folder); + if(ffolder!=null && ffolder.isDirectory()) + { + File[] files=ffolder.listFiles(ff); + if(files!=null && files.length>0) + { + for(File f:files) + { + if(f.isFile()) + list.add(f.toURI().toURL()); + else if(f.isDirectory() && recursive) + { + getFileURLsRecursive(f,ff,list); + } + } + } + } + } + else + { + getResourceURLsTreeRecurse(b,filter,b.getEntryPaths(folder),recursive,list); + } + return list; + } + private static void getFilesRecursive(File root, FileFilter ff, List list) { + if(root!=null && root.isDirectory()) + { + File[] files=root.listFiles(ff); + if(files!=null && files.length>0) + { + for(File f:files) + { + if(f.isFile()) + list.add(f); + else if(f.isDirectory()) + { + getFilesRecursive(f,ff,list); + } + } + } + } + + } + private static void getFileURLsRecursive(File root, FileFilter ff, List list) throws MalformedURLException { + if(root!=null && root.isDirectory()) + { + File[] files=root.listFiles(ff); + if(files!=null && files.length>0) + { + for(File f:files) + { + if(f.isFile()) + list.add(f.toURI().toURL()); + else if(f.isDirectory()) + { + getFileURLsRecursive(f,ff,list); + } + } + } + } + + } + private static void getResourceURLsTreeRecurse(Bundle b, String filter, Enumeration resource,boolean recursive,List outp) throws IOException { + while (resource.hasMoreElements()) { + String name = resource.nextElement(); + Enumeration list = b.getEntryPaths(name); + if (list != null) { + if(recursive) + getResourceURLsTreeRecurse(b, filter, list,recursive,outp); + } else { + //Read + if(name.contains(filter)) + { + LOG.debug("add "+name+ " to list"); + outp.add(b.getEntry(name)); + } + else + LOG.debug("filtered out "+name); + } + } + } + public static List getJSONFiles(String folder,boolean recursive) + { + List urls=null; + try { + urls = getFileURLs(folder,".json",recursive); + } catch (IOException e1) { + LOG.warn("failed to get urls from resfolder "+folder+" : "+e1.getMessage()); + } + LOG.debug("found "+urls==null?"no":urls.size()+" files"); + List list=new ArrayList(); + if(urls!=null) + { + for (URL u: urls) + { + LOG.debug("try to parse "+u.toString()); + try { + JSONObject o=new JSONObject(readFile(u)); + list.add(o); + } catch (JSONException | IOException e) { + LOG.warn("problem reading/parsing file "+u+" :"+e.getMessage()); + } + } + } + return list; + } + public static JSONObject getJSONFile(String resFile) { + LOG.debug("loading json file "+resFile+" from res"); + URL u=getFileURL(resFile); + if (u == null) + { + LOG.warn("cannot find resfile: "+resFile); + return null; + } + JSONObject o=null; + try + { + //parse to jsonobject + o=new JSONObject(readFile(u)); + } + catch(Exception e) + { + LOG.warn("problem reading/parsing file: "+e.getMessage()); + } + return o; + } + + public static boolean extractFileTo(String resFile, File oFile) { + if(oFile==null) + return false; + LOG.debug("try to copy "+resFile+" from res to "+oFile.getAbsolutePath()); + URL u=getFileURL(resFile); + if (u == null) + { + LOG.warn("cannot find resfile:"+resFile); + return false; + } + try { + InputStream in = u.openStream(); + oFile.getParentFile().mkdirs(); + OutputStream outStream; + outStream = new FileOutputStream(oFile); + int theInt; + while ((theInt = in.read()) >= 0) { + outStream.write(theInt); + } + in.close(); + outStream.flush(); + outStream.close(); + LOG.debug("file written successfully"); + } + catch (IOException e) { + LOG.error("problem writing file:"+e.getMessage()); + return false; + } + return true; + } + +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/internalTypes/TemplateFile.java b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/internalTypes/TemplateFile.java new file mode 100644 index 00000000..a699af03 --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/internalTypes/TemplateFile.java @@ -0,0 +1,61 @@ +package org.opendaylight.mwtn.base.internalTypes; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; + +public class TemplateFile { + + protected final HashMap mKeyValuePairs; + private final String mContent; + + public TemplateFile(String content) + { + this.mKeyValuePairs = new HashMap<>(); + this.mContent=content; + + } + public TemplateFile(File f) throws IOException { + this.mKeyValuePairs = new HashMap<>(); + BufferedReader br = new BufferedReader(new FileReader(f)); + StringBuilder sb = new StringBuilder(); + String line = br.readLine(); + + while (line != null) { + sb.append(line); + line = br.readLine(); + } + this.mContent = sb.toString(); + br.close(); + } + + public void addValue(String key, Object value) { + this.mKeyValuePairs.put(key, value); + } + + public void removeValue(String key) { + this.mKeyValuePairs.remove(key); + } + + private String replace() { + String s=this.mContent; + String key; + Object value; + for (Map.Entry entry : this.mKeyValuePairs.entrySet()) { + key = entry.getKey(); + value = entry.getValue(); + if(value!=null) + s=s.replace(key, value.toString()); + } + return s; + } + + @Override + public String toString() { + return this.replace(); + } + +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/netconf/AllPm.java b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/netconf/AllPm.java new file mode 100644 index 00000000..e6be0a40 --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/netconf/AllPm.java @@ -0,0 +1,44 @@ +/** + * + */ +package org.opendaylight.mwtn.base.netconf; + +import java.util.ArrayList; +import java.util.List; + +import org.opendaylight.mwtn.performancemanager.impl.database.types.EsHistoricalPerformance15Minutes; +import org.opendaylight.mwtn.performancemanager.impl.database.types.EsHistoricalPerformance24Hours; + +/** + * @author herbert + * + */ + +public class AllPm { + + static AllPm EMPTY = new AllPm(); + + private final List pm15 = new ArrayList<>(); + private final List pm24 = new ArrayList<>(); + + void add(EsHistoricalPerformance15Minutes pm) { + pm15.add(pm); + } + + void add(EsHistoricalPerformance24Hours pm) { + pm24.add(pm); + } + + public List getPm15() { + return pm15; + } + + public List getPm24() { + return pm24; + } + + public Object size() { + return pm15.size()+pm24.size(); + } + +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/netconf/Capabilities.java b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/netconf/Capabilities.java new file mode 100644 index 00000000..49c8e855 --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/netconf/Capabilities.java @@ -0,0 +1,103 @@ +/** + * Convert capabilities of netconfnode into internal format. + * Boron and Carbon are providing different versions + */ +package org.opendaylight.mwtn.base.netconf; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.lang.reflect.Proxy; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.NetconfNode; +import org.opendaylight.yangtools.yang.common.QName; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class Capabilities { + + private static final Logger LOG = LoggerFactory.getLogger(Capabilities.class); + private static final String INTERFACE_AVAILABLECAPABILITY = "org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.netconf.node.connection.status.available.capabilities.AvailableCapability"; + + private final List capabilities = new ArrayList(); + + public Capabilities(NetconfNode nnode) { + LOG.info("Create Capabilities constructor"); + + if (nnode != null) { + constructor( nnode.getAvailableCapabilities().getAvailableCapability() ); + } + } + + /** + * Does all construction steps + * @param pcapabilities with a list of capabilities.
+ * Type could be
+ * - Boron: List
+ * - Carbon: List + */ + private void constructor(List pcapabilities) { + for (Object capability : pcapabilities) { + if (LOG.isTraceEnabled()) { + LOG.trace("capability class: {} Interfaces: {}", capability.getClass().getName(), Arrays.toString(capability.getClass().getInterfaces())); + } + if (capability instanceof String) { //ODL Boron specific + this.capabilities.add((String)capability); + } else if (hasInterface(capability, INTERFACE_AVAILABLECAPABILITY)) { //Carbon specific part .. handled via generic + try { + Method method = capability.getClass().getDeclaredMethod("getCapability"); + this.capabilities.add(method.invoke(capability).toString()); + } catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { + LOG.warn("Unknown capability class leads to a problem", e); + } + } else { + LOG.warn("Unknown capability class: {}", capability.getClass(), Arrays.toString(capability.getClass().getInterfaces())); + } + } + } + + /** + * check if namespace is supported by given capabilites + * @param theCapability Capability to search + * @return true if available + */ + public boolean isSupportingNamespace(QName theCapability ) { + + String theNameSpace = theCapability.getNamespace().toString(); + + for (String capability : capabilities) { + LOG.trace("Check {} against {}", capability, theNameSpace); + if (capability.contains(theNameSpace)) { + return true; + } + } + return false; + } + + @Override + public String toString() { + return "Capabilities [capabilities=" + capabilities + "]"; + } + + + /** + * Check if object is proxy and has specific interface + * @param object Name of the object to verify + * @param interfaceName is the name of the interface + * @return boolean accordingly + */ + static boolean hasInterface(Object object, String interfaceName) { + if (object instanceof Proxy) { + Class[] interfaces = object.getClass().getInterfaces(); + for (Class i : interfaces) { + if (i.getName().equals(interfaceName)) { + return true; + } + } + } + return false; + } + +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/netconf/ExtendedAirInterfaceHistoricalPerformanceType.java b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/netconf/ExtendedAirInterfaceHistoricalPerformanceType.java new file mode 100644 index 00000000..c2560e81 --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/netconf/ExtendedAirInterfaceHistoricalPerformanceType.java @@ -0,0 +1,82 @@ +package org.opendaylight.mwtn.base.netconf; + +import org.opendaylight.yang.gen.v1.uri.onf.coremodel.corefoundationmodule.typedefinitions.rev160701.DateAndTime; +import org.opendaylight.yang.gen.v1.uri.onf.g_874_1_model.imported_data_types.rev160710.ObjectIdentifier; +import org.opendaylight.yang.gen.v1.uri.onf.g_874_1_model.object_classes.rev160710.OTNHistoryData; +import org.opendaylight.yang.gen.v1.uri.onf.g_874_1_model.type_definitions.rev160710.GranularityPeriodType; +import org.opendaylight.yang.gen.v1.uri.onf.microwavemodel.objectclasses.airinterface.rev160901.mw_airinterface_pac.AirInterfaceConfiguration; +import org.opendaylight.yang.gen.v1.uri.onf.microwavemodel.typedefinitions.rev160902.AirInterfaceHistoricalPerformanceType; +import org.opendaylight.yangtools.yang.binding.DataContainer; + +public class ExtendedAirInterfaceHistoricalPerformanceType implements OTNHistoryData, LinkIdentifyingObject { + + private final AirInterfaceHistoricalPerformanceType airInterfaceHistoricalPerformanceType; + private final AirInterfaceConfiguration airInterfaceConfiguration; + + public ExtendedAirInterfaceHistoricalPerformanceType(AirInterfaceHistoricalPerformanceType data, AirInterfaceConfiguration conf) { + this.airInterfaceHistoricalPerformanceType = data; + this.airInterfaceConfiguration = conf; + } + + + public AirInterfaceHistoricalPerformanceType getAirInterfaceHistoricalPerformanceType() { + return airInterfaceHistoricalPerformanceType; + } + + + public AirInterfaceConfiguration getAirInterfaceConfiguration() { + return airInterfaceConfiguration; + } + + + @Override + public Class getImplementedInterface() { + return airInterfaceHistoricalPerformanceType.getImplementedInterface(); + } + + @Override + public String getHistoryDataId() { + return airInterfaceHistoricalPerformanceType.getHistoryDataId(); + } + + @Override + public DateAndTime getPeriodEndTime() { + return airInterfaceHistoricalPerformanceType.getPeriodEndTime(); + } + + @Override + public GranularityPeriodType getGranularityPeriod() { + return airInterfaceHistoricalPerformanceType.getGranularityPeriod(); + } + + @Override + public ObjectIdentifier getObjectClass() { + return airInterfaceHistoricalPerformanceType.getObjectClass(); + } + + @Override + public ObjectIdentifier getNameBinding() { + return airInterfaceHistoricalPerformanceType.getNameBinding(); + } + + @Override + public Boolean isSuspectIntervalFlag() { + return airInterfaceHistoricalPerformanceType.isSuspectIntervalFlag(); + } + + @Override + public String getSignalId() { + return airInterfaceConfiguration.getRadioSignalID(); + } + + + @Override + public String toString() { + return "ExtendedAirInterfaceHistoricalPerformanceType [airInterfaceHistoricalPerformanceType=" + + airInterfaceHistoricalPerformanceType + ", airInterfaceConfiguration=" + airInterfaceConfiguration + + "]"; + } + + + +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/netconf/ExtendedAirInterfaceHistoricalPerformanceType12.java b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/netconf/ExtendedAirInterfaceHistoricalPerformanceType12.java new file mode 100644 index 00000000..aea77e5c --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/netconf/ExtendedAirInterfaceHistoricalPerformanceType12.java @@ -0,0 +1,87 @@ +package org.opendaylight.mwtn.base.netconf; + +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.DateAndTime; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.g._874._1.model.rev170320.GranularityPeriodType; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.g._874._1.model.rev170320.ObjectIdentifier; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.g._874._1.model.rev170320.OtnHistoryDataG; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev170324.AirInterfaceConfigurationG; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev170324.AirInterfaceHistoricalPerformanceTypeG; +import org.opendaylight.yangtools.yang.binding.DataContainer; + +public class ExtendedAirInterfaceHistoricalPerformanceType12 implements OtnHistoryDataG, LinkIdentifyingObject { + + private final AirInterfaceHistoricalPerformanceTypeG airInterfaceHistoricalPerformanceType; + private final AirInterfaceConfigurationG airInterfaceConfiguration; + + public ExtendedAirInterfaceHistoricalPerformanceType12(AirInterfaceHistoricalPerformanceTypeG data, AirInterfaceConfigurationG conf) { + this.airInterfaceHistoricalPerformanceType = data; + this.airInterfaceConfiguration = conf; + } + + + public AirInterfaceHistoricalPerformanceTypeG getAirInterfaceHistoricalPerformanceType() { + return airInterfaceHistoricalPerformanceType; + } + + + public AirInterfaceConfigurationG getAirInterfaceConfiguration() { + return airInterfaceConfiguration; + } + + + @Override + public Class getImplementedInterface() { + return airInterfaceHistoricalPerformanceType.getImplementedInterface(); + } + + @Override + public String getHistoryDataId() { + return airInterfaceHistoricalPerformanceType.getHistoryDataId(); + } + + @Override + public DateAndTime getPeriodEndTime() { + return airInterfaceHistoricalPerformanceType.getPeriodEndTime(); + } + + + @Override + public GranularityPeriodType getGranularityPeriod() { + return airInterfaceHistoricalPerformanceType.getGranularityPeriod(); + } + + + @Override + public ObjectIdentifier getObjectClass() { + return airInterfaceHistoricalPerformanceType.getObjectClass(); + } + + + @Override + public ObjectIdentifier getNameBinding() { + return airInterfaceHistoricalPerformanceType.getNameBinding(); + } + + @Override + public Boolean isSuspectIntervalFlag() { + return airInterfaceHistoricalPerformanceType.isSuspectIntervalFlag(); + } + + @Override + public String getSignalId() { + return airInterfaceConfiguration.getRadioSignalId(); + } + + + @Override + public String toString() { + return "ExtendedAirInterfaceHistoricalPerformanceType [airInterfaceHistoricalPerformanceType=" + + airInterfaceHistoricalPerformanceType + ", airInterfaceConfiguration=" + airInterfaceConfiguration + + "]"; + } + + + + + +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/netconf/GenericTransactionUtils.java b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/netconf/GenericTransactionUtils.java new file mode 100644 index 00000000..92b4748b --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/netconf/GenericTransactionUtils.java @@ -0,0 +1,144 @@ +package org.opendaylight.mwtn.base.netconf; + +import java.util.NoSuchElementException; +import java.util.concurrent.CancellationException; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicReference; + +import javax.annotation.Nullable; + +import org.opendaylight.controller.md.sal.binding.api.DataBroker; +import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction; +import org.opendaylight.controller.md.sal.binding.api.WriteTransaction; +import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; +import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException; +import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException; +import org.opendaylight.yangtools.yang.binding.DataObject; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.google.common.base.Optional; +import com.google.common.base.Preconditions; +import com.google.common.util.concurrent.CheckedFuture; + +public final class GenericTransactionUtils { + static final Logger logger = LoggerFactory.getLogger(GenericTransactionUtils.class); + + public static boolean writeData(DataBroker dataBroker, LogicalDatastoreType logicalDatastoreType, + InstanceIdentifier iid, T dataObject, boolean isAdd) { + Preconditions.checkNotNull(dataBroker); + WriteTransaction modification = dataBroker.newWriteOnlyTransaction(); + if (isAdd) { + if (dataObject == null) { + logger.warn("Invalid attempt to add a non-existent object to path {}", iid); + return false; + } + modification.merge(logicalDatastoreType, iid, dataObject, true /*createMissingParents*/); + } + else { + modification.delete(LogicalDatastoreType.CONFIGURATION, iid); + } + CheckedFuture commitFuture = modification.submit(); + try { + commitFuture.checkedGet(); + logger.debug("Transaction success for {} of object {}", isAdd ? "add" : "delete", dataObject); + return true; + } catch (Exception e) { + logger.warn("Transaction failed with error {} for {} of object {}", e.getMessage(), isAdd ? "add" : "delete", dataObject); + modification.cancel(); + return false; + } + } + + /* + /** + * Deliver the data back or null + * @param dataBroker for accessing data + * @param dataStoreType to address datastore + * @param iid id to access data + * @return Optional for the data + * / + private static Optional readDataOptional(DataBroker dataBroker, LogicalDatastoreType dataStoreType, InstanceIdentifier iid) { + + Preconditions.checkNotNull(dataBroker); + ReadOnlyTransaction readTransaction = dataBroker.newReadOnlyTransaction(); + try { + CheckedFuture, ReadFailedException> od = readTransaction.read(dataStoreType, iid); + Optional optionalData = od.get(); + readTransaction.close(); + return optionalData; + } catch (CancellationException | ExecutionException | InterruptedException | NoSuchElementException e) { + logger.warn("Read transaction for identifier "+iid+" failed with error "+e.getMessage()); + readTransaction.close(); + return Optional.fromNullable(null); + } + } /**/ + + /** + * Deliver the data back or null. Warning + * @param SubType of the DataObject to be handled + * @param dataBroker for accessing data + * @param dataStoreType to address datastore + * @param iid id to access data + * @return null or object + */ + @Nullable + public static T readData(DataBroker dataBroker, LogicalDatastoreType dataStoreType, InstanceIdentifier iid) { + //return readDataOptional(dataBroker, dataStoreType, iid).orNull(); + AtomicBoolean noErrorIndication = new AtomicBoolean(); + AtomicReference statusText = new AtomicReference<>(); + + T obj = readDataOptionalWithStatus(dataBroker, dataStoreType, iid, noErrorIndication, statusText); + + if (! noErrorIndication.get()) { + logger.warn("Read transaction for identifier "+iid+" failed with error "+statusText.get()); + } + + return obj; + } + + /** + * Deliver the data back or null + * @param SubType of the DataObject to be handled + * @param dataBroker for accessing data + * @param dataStoreType to address datastore + * @param iid id to access data + * @param noErrorIndication (Output) true if data could be read and are available and is not null + * @param statusIndicator (Output) String with status indications during the read. + * @return null or object + */ + @Nullable + public static T readDataOptionalWithStatus(DataBroker dataBroker, LogicalDatastoreType dataStoreType, InstanceIdentifier iid, AtomicBoolean noErrorIndication, AtomicReference statusIndicator) { + + T data = null; + noErrorIndication.set(false); + statusIndicator.set("Preconditions"); + Preconditions.checkNotNull(dataBroker); + statusIndicator.set("Create Read Transaction"); + ReadOnlyTransaction readTransaction = dataBroker.newReadOnlyTransaction(); + + try { + CheckedFuture, ReadFailedException> od = readTransaction.read(dataStoreType, iid); + statusIndicator.set("Read done"); + if (od != null) { + statusIndicator.set("Unwrap checkFuture done"); + Optional optionalData = od.get(); + if (optionalData != null) { + statusIndicator.set("Unwrap optional done"); + data = optionalData.orNull(); + statusIndicator.set("Read transaction done"); + noErrorIndication.set(true); + } + } + } catch (CancellationException | ExecutionException | InterruptedException | NoSuchElementException e) { + statusIndicator.set("Read transaction for identifier "+iid+" failed with error "+e.getMessage()); + } + + readTransaction.close(); + return data; + } + + +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/netconf/InternGenericCurrentProblemType.java b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/netconf/InternGenericCurrentProblemType.java new file mode 100644 index 00000000..c625d7a7 --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/netconf/InternGenericCurrentProblemType.java @@ -0,0 +1,12 @@ +/** + * + */ +package org.opendaylight.mwtn.base.netconf; + +/** + * @author herbert + * + */ +public class InternGenericCurrentProblemType { + +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/netconf/LinkIdentifyingObject.java b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/netconf/LinkIdentifyingObject.java new file mode 100644 index 00000000..db25936a --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/netconf/LinkIdentifyingObject.java @@ -0,0 +1,7 @@ +package org.opendaylight.mwtn.base.netconf; + +public interface LinkIdentifyingObject { + + public String getSignalId(); + +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/netconf/NetconfTimeStamp.java b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/netconf/NetconfTimeStamp.java new file mode 100644 index 00000000..e05cdde2 --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/netconf/NetconfTimeStamp.java @@ -0,0 +1,269 @@ +package org.opendaylight.mwtn.base.netconf; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.TimeZone; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.opendaylight.yang.gen.v1.uri.onf.coremodel.corefoundationmodule.typedefinitions.rev160701.DateAndTime; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class NetconfTimeStamp { + private static final Logger LOG = LoggerFactory.getLogger(NetconfTimeStamp.class); + + private static final TimeZone TIMEZONEUTC = TimeZone.getTimeZone("GMT"); + private static final SimpleDateFormat dateFormatResult = init("yyyy-MM-dd'T'HH:mm:ss.S'Z'",TIMEZONEUTC); + private static final SimpleDateFormat dateFormatConvert = init("yyyy-MM-dd HH:mm:ss.S", TIMEZONEUTC); + private static int MILLISECONDSDIGITS = 3; //Digits of milliseconds in dateFormatResult + private static String MILLISECONDZEROS = "000"; //String with zeros for milliseconds in dateFormatResult + /* + private static final Pattern dateNetconfPatter[] = { + // 10 Groups, 1-7,9+10, ISO8601 + Pattern.compile("(\\d{4})-(\\d{2})-(\\d{2})T(\\d{2}):(\\d{2}):(\\d{2})\\.(\\d+)?(Z|([+-]\\d{2}):(\\d{2}))"), + // 10 Groups, 1-7,9+10, Microwave ONF + Pattern.compile("(\\d{4})(\\d{2})(\\d{2})(\\d{2})(\\d{2})(\\d{2}).(\\d+)?(Z|([+-]\\d{2})(\\d{2}))"), + // 9 Groups, 1-6, 8+9Ericson. Example: 2017-01-23T13:32:38-05:00 + Pattern.compile("(\\d{4})-(\\d{2})-(\\d{2})T(\\d{2}):(\\d{2}):(\\d{2})?(Z|([+-]\\d{2}):(\\d{2}))") + }; + */ + private static final Pattern dateNetconfPatter = Pattern + // Formats: + // 1) ISO8601. Example 2017-01-18T11:44:49.482-05:00 + // 2) Microwave ONF. Examples 20170118114449.1Z, 20170118114449.1-0500 + // 3.1) Ericson. Example: 2017-01-23T13:32:38-05:00 + // 3.2) Ericson. Example: 2017-01-23T13:32-05:00 + // Always 10 Groups, + // 1:Year 2:Month 3:day 4:Hour 5:minute 6:optional sec 7:optional ms 8:optioal Z or 9:offset signedhour 10:min + .compile("(\\d{4})-?(\\d{2})-?(\\d{2})T?(\\d{2}):?(\\d{2})(?:(?::?)(\\d{2}))?(?:.(\\d+))?(?:(Z)|([+-]\\d{2}):?(\\d{2}))"); + + + /* ------------------------------------ + * Construct + */ + + /** + * Do not provide public constructor for this static module + */ + + private NetconfTimeStamp() { + } + + /** + * Static initialization + *//* + private static void doInit() { + LOG.debug("Init begin"); + //dateFormatResult =new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); + dateFormatResult =new SimpleDateFormat("yyyyMMddHHmmss.S'Z'"); //Netconf 1.0 format + dateFormatResult.setTimeZone(TIMEZONEUTC); + dateFormatConvert =new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S"); + dateFormatConvert.setTimeZone(TIMEZONEUTC); + LOG.debug("Init end"); + }*/ + + public static SimpleDateFormat init(String format, TimeZone zone ) { + SimpleDateFormat dateFormat; + dateFormat = new SimpleDateFormat(format); + dateFormat.setTimeZone(zone); + return dateFormat; + } + + /* ------------------------------------ + * Public function + */ + + /** + * Get actual timestamp as NETCONF specific type NETCONF/YANG 1.0 Format + * @return String with Date in NETCONF/YANG Format Version 1.0. + */ + public static String getTimeStampAsNetconfString() { + /*if (dateFormatResult == null) { + doInit(); + }*/ + return getRightFormattedDate(new Date().getTime()); + } + + /** + * Get actual timestamp as NETCONF specific type NETCONF/YANG 1.0 Format + * @return DateAndTime Type 1.0. Date in NETCONF/YANG Format Version 1.0. + */ + public static DateAndTime getTimeStamp() { + /*if (dateFormatResult == null) { + doInit(); + }*/ + //Time in GMT + return DateAndTime.getDefaultInstance(getTimeStampAsNetconfString()); + } + + /* + * Input ist in folgenden Formaten, die über Netconf empfangen wurden möglich: + * + * Format1 + * ISO 8601 + * 2017-01-18T11:44:49.482-05:00 + * + * Format2 Netconf + * Netconf - pattern aus ietf-yang-types "2013-07-15" + * Pattern: "\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d+)?(Z|[\+\-](\d{2}):(\d{2}))" + * + * Format3 Netconf + * (Netconf) DateAndTime CoreModel-CoreFoundationModule-TypeDefinitions vom 2016-07-01 + * Example1: 20170118114449.1Z + * Example2: 20170118114449.1-0500 + * Pattern: "\d{4}\d{2}\d{2}\d{2}\d{2}\d{2}.\d+?(Z|[\+\-](\d{2})(\d{2}))" + * typedef DateAndTime { + * description "This primitive type defines the date and time according to the following structure: + * 'yyyyMMddhhmmss.s[Z|{+|-}HHMm]' where: + * yyyy '0000'..'9999' year + * MM '01'..'12' month + * dd '01'..'31' day + * hh '00'..'23' hour + * mm '00'..'59' minute + * ss '00'..'59' second + * s '.0'..'.9' tenth of second (set to '.0' if EMS or NE cannot support this granularity) + * Z 'Z' indicates UTC (rather than local time) + * {+|-} '+' or '-' delta from UTC + * HH '00'..'23' time zone difference in hours + * Mm '00'..'59' time zone difference in minutes."; + * type string; + * } + * Format4 E/// specific + * Example1: 2017-01-23T13:32:38-05:00 + * Example2: 2017-01-23T13:32-05:00 + * + * @param netconfTime as String according the formats given above + * @return String in ISO8601 Format for database and presentation. + */ + + /** + * Return the String with a NETCONF time converted to long + * @param netconfTime as String according the formats given above + * @return Epoch milliseconds + * @throws IllegalArgumentException In case of no compliant time format definition for the string + * @throws ParseException Time parsing failed + */ + public static long getTimeStampFromNetconfAsMilliseconds( String netconfTime ) throws IllegalArgumentException, ParseException { + /*if (dateFormatResult == null) { + doInit(); + }*/ + Matcher m; + { + m = dateNetconfPatter.matcher(netconfTime); + //According to spezified matches there have to be 10 parameter + if (m.matches() && m.groupCount() == 10) { + //Convert now + long utcMillis = dateFormatConvert.parse(getTimeAsNormalizedString(m, m.group(6), m.group(7))).getTime() + - getTimezoneOffsetMilliseconds(m.group(9), m.group(10)); + return utcMillis; + } else { + throw new IllegalArgumentException("No pattern for NETCONF data string: "+netconfTime); + } + } + } + + /** + * Deliver String result. + * @param netconfTime as String according the formats given above + * @return If successful: String in ISO8601 Format for database and presentation. + * If "wrong formed input" the Input string with the prefix "Mailformed date" is delivered back. + */ + public static String getTimeStampFromNetconf( String netconfTime ) { + /*if (dateFormatResult == null) { + doInit(); + }*/ + Matcher m; + { + m = dateNetconfPatter.matcher(netconfTime); + //According to spezified matches there have to be 10 parameter + if (m.matches() && m.groupCount() == 10) { + //Convert now + try { + long utcMillis = dateFormatConvert.parse(getTimeAsNormalizedString(m, m.group(6), m.group(7))).getTime() + - getTimezoneOffsetMilliseconds(m.group(9), m.group(10)); + return getRightFormattedDate(utcMillis); + } catch (ParseException e) { + LOG.info(e.getMessage()); + } catch (IllegalArgumentException e) { + LOG.info(e.getMessage()); + } + } + } + LOG.debug("No pattern for NETCONF data string: {}",netconfTime); + return "Malformed date: "+netconfTime; //Error handling + } + /*------------------------------------------- + * Private and static functions + */ + /** + * Convert timeZone parameter in format [+-]/d/d:/d/d into milliseconds + * @param m Index 9 with "+/-" and hour string or null for UTZ, Index 10 with minutes + * @return long milliseconds of TimeZoneOffset + * @throws IllegalArgumentException If parameters are wrong + */ + private static long getTimezoneOffsetMilliseconds(String timeZoneHour, String timeZoneMinute) throws IllegalArgumentException { + //-- Calculate timezone specific offset + long timeZoneOffsetMilliseconds = 0; + if (timeZoneHour != null) { + //Time zone offset in hours and minutes + int tzHour = 0; + int tzMinutes = 0; + tzHour = Integer.valueOf(timeZoneHour); + if (timeZoneMinute != null) { + tzMinutes = Integer.valueOf(timeZoneMinute); + } else { + throw new IllegalArgumentException("Problem in Netconf Time format timeZone minutes parameter."); + } + timeZoneOffsetMilliseconds = (tzHour * 60 + (tzHour > 0 ? tzMinutes : -tzMinutes))*60000; + } + return timeZoneOffsetMilliseconds; + } + /** + * Convert parameters to String with year .. minutes and optional Seconds and .. milliseconds + * @param m Matcher with parsed date + * @param secString Seconds as String or null + * @param msString Milliseconds as String or null + * @return Normalized time string + */ + private static String getTimeAsNormalizedString(Matcher m, String secString, String msString) { + //-- Create time as normalized string + StringBuffer sb = new StringBuffer(); + sb.append(m.group(1)); //year + sb.append('-'); + sb.append(m.group(2)); //Month + sb.append('-'); + sb.append(m.group(3)); //Day + sb.append(' '); + sb.append(m.group(4)); //Hour 0-23 + sb.append(':'); + sb.append(m.group(5)); //Minute + sb.append(':'); + sb.append(secString != null ? secString : "00"); //Seconds (optional) + sb.append('.'); + if (msString == null) { //Milliseconds optional + sb.append(MILLISECONDZEROS); + } else if (msString.length() <= MILLISECONDSDIGITS) { + sb.append(msString); //Millisecond + sb.append(MILLISECONDZEROS.substring(0, MILLISECONDSDIGITS-msString.length())); + } else { + sb.append(msString.substring(0, MILLISECONDSDIGITS )); //Only first Three + } + return sb.toString(); + } + /** + * Deliver format in a way that milliseconds are correct. + * @param dateMillis Date as milliseconds in Java definition + * @return String + */ + private static String getRightFormattedDate( long dateMillis ) { + /*if (dateFormatResult == null) { + doInit(); + }*/ + long tenthOfSeconds = dateMillis % 1000/100L; //Extract 100 milliseconds + long base = dateMillis / 1000L * 1000L; //Cut milliseconds to 000 + Date newDate = new Date( base + tenthOfSeconds); + return dateFormatResult.format(newDate); + } +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/netconf/ONFCoreEmpty.java b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/netconf/ONFCoreEmpty.java new file mode 100644 index 00000000..d8bda8e8 --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/netconf/ONFCoreEmpty.java @@ -0,0 +1,93 @@ +/** + * + */ +package org.opendaylight.mwtn.base.netconf; + +import org.opendaylight.controller.md.sal.binding.api.MountPoint; +import org.opendaylight.mwtn.base.internalTypes.InventoryInformation; + +/** + * @author herbert + * + */ +public class ONFCoreEmpty implements ONFCoreNetworkElementRepresentation { + + private String mountPointNodeName = ""; + + + ONFCoreEmpty(String mountPointNodeName) { + this.mountPointNodeName = mountPointNodeName; + } + + @Override + public void initialReadFromNetworkElement() { + } + + @Override + public String getMountPointNodeName() { + return mountPointNodeName; + } + + @Override + public void resetPMIterator() { + } + + @Override + public boolean hasNext() { + return false; + } + + @Override + public void next() { + } + + @Override + public AllPm getHistoricalPM() { + return AllPm.EMPTY; + } + + @Override + public String pmStatusToString() { + return "ONFCoreEmpty"; + } + + @Override + public int removeAllCurrentProblemsOfNode() { + return 0; + } + + @Override + public void doRegisterMicrowaveEventListener(MountPoint mointPoint) { + //Do nothing + } + + @Override + public void prepareCheck() { + //Do nothing here + } + + @Override + public boolean checkAndConnectionToMediatorIsOk() { + return false; + } + + @Override + public boolean checkAndConnectionToNeIsOk() { + return false; + } + + @Override + public void initSynchronizationExtension() { + } + + @Override + public InventoryInformation getInventoryInformation() { + return InventoryInformation.DEFAULT; + } + + @Override + public InventoryInformation getInventoryInformation(String layerProtocolFilter) { + return InventoryInformation.DEFAULT; + } + +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/netconf/ONFCoreInterfacePac.java b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/netconf/ONFCoreInterfacePac.java new file mode 100644 index 00000000..b79b2ef6 --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/netconf/ONFCoreInterfacePac.java @@ -0,0 +1,20 @@ +/** + * + */ +package org.opendaylight.mwtn.base.netconf; + +/** + * @author herbert + * + */ +public class ONFCoreInterfacePac { + + + Class myClass; + + ONFCoreInterfacePac( Class myClass ) { + this.myClass = myClass; + } + + +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/netconf/ONFCoreNetworkElement10.java b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/netconf/ONFCoreNetworkElement10.java new file mode 100644 index 00000000..35f7dcb7 --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/netconf/ONFCoreNetworkElement10.java @@ -0,0 +1,770 @@ +/* +* Copyright (c) 2017 highstreet technologies GmbH 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.mwtn.base.netconf; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Iterator; +import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + +import org.opendaylight.controller.md.sal.binding.api.DataBroker; +import org.opendaylight.controller.md.sal.binding.api.MountPoint; +import org.opendaylight.controller.md.sal.binding.api.NotificationService; +import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; +import org.opendaylight.mwtn.base.internalTypes.InternalDateAndTime; +import org.opendaylight.mwtn.base.internalTypes.InternalSeverity; +import org.opendaylight.mwtn.base.internalTypes.InventoryInformation; +import org.opendaylight.mwtn.devicemanager.impl.ProviderClient; +import org.opendaylight.mwtn.devicemanager.impl.database.service.HtDatabaseEventsService; +import org.opendaylight.mwtn.devicemanager.impl.listener.MicrowaveEventListener; +import org.opendaylight.mwtn.devicemanager.impl.xml.ProblemNotificationXml; +import org.opendaylight.mwtn.devicemanager.impl.xml.WebSocketServiceClient; +import org.opendaylight.mwtn.performancemanager.impl.database.types.EsHistoricalPerformance15Minutes; +import org.opendaylight.mwtn.performancemanager.impl.database.types.EsHistoricalPerformance24Hours; +import org.opendaylight.yang.gen.v1.uri.onf.coremodel.corefoundationmodule.superclassesandcommonpackages.rev160710.UniversalId; +import org.opendaylight.yang.gen.v1.uri.onf.coremodel.corefoundationmodule.superclassesandcommonpackages.rev160710.extension.ExtensionList; +import org.opendaylight.yang.gen.v1.uri.onf.coremodel.corenetworkmodule.objectclasses.rev160811.NetworkElement; +import org.opendaylight.yang.gen.v1.uri.onf.coremodel.corenetworkmodule.objectclasses.rev160811.logicalterminationpoint.LpList; +import org.opendaylight.yang.gen.v1.uri.onf.coremodel.corenetworkmodule.objectclasses.rev160811.networkelement.LtpRefList; +import org.opendaylight.yang.gen.v1.uri.onf.g_874_1_model.object_classes.rev160710.OTNHistoryData; +import org.opendaylight.yang.gen.v1.uri.onf.microwavemodel.networkelement.currentproblemlist.rev161120.GenericCurrentProblemType; +import org.opendaylight.yang.gen.v1.uri.onf.microwavemodel.networkelement.currentproblemlist.rev161120.NetworkElementCurrentProblems; +import org.opendaylight.yang.gen.v1.uri.onf.microwavemodel.networkelement.currentproblemlist.rev161120.networkelementcurrentproblems.CurrentProblemList; +import org.opendaylight.yang.gen.v1.uri.onf.microwavemodel.objectclasses.airinterface.rev160901.MWAirInterfacePac; +import org.opendaylight.yang.gen.v1.uri.onf.microwavemodel.objectclasses.airinterface.rev160901.MWAirInterfacePacKey; +import org.opendaylight.yang.gen.v1.uri.onf.microwavemodel.objectclasses.airinterface.rev160901.mw_airinterface_pac.AirInterfaceConfiguration; +import org.opendaylight.yang.gen.v1.uri.onf.microwavemodel.objectclasses.airinterface.rev160901.mw_airinterface_pac.AirInterfaceCurrentProblems; +import org.opendaylight.yang.gen.v1.uri.onf.microwavemodel.objectclasses.airinterface.rev160901.mw_airinterface_pac.AirInterfaceHistoricalPerformances; +import org.opendaylight.yang.gen.v1.uri.onf.microwavemodel.objectclasses.ethernetcontainer.rev160902.MWEthernetContainerPac; +import org.opendaylight.yang.gen.v1.uri.onf.microwavemodel.objectclasses.ethernetcontainer.rev160902.MWEthernetContainerPacKey; +import org.opendaylight.yang.gen.v1.uri.onf.microwavemodel.objectclasses.ethernetcontainer.rev160902.mw_ethernetcontainer_pac.EthernetContainerCurrentProblems; +import org.opendaylight.yang.gen.v1.uri.onf.microwavemodel.objectclasses.ethernetcontainer.rev160902.mw_ethernetcontainer_pac.EthernetContainerHistoricalPerformances; +import org.opendaylight.yang.gen.v1.uri.onf.microwavemodel.typedefinitions.rev160902.AirInterfaceCurrentProblemType; +import org.opendaylight.yang.gen.v1.uri.onf.microwavemodel.typedefinitions.rev160902.ContainerCurrentProblemType; +import org.opendaylight.yang.gen.v1.uri.onf.microwavemodel.typedefinitions.rev160902.ContainerHistoricalPerformanceType; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.google.common.base.Optional; + +/** + * Get information over NETCONF device according to ONF Coremodel. Read networkelement and conditional packages. + * + * Get conditional packages from Networkelement + * Possible interfaces are: + * MWPS, LTP(MWPS-TTP), MWAirInterfacePac, MicrowaveModel-ObjectClasses-AirInterface + * ETH-CTP,LTP(Client), MW_EthernetContainer_Pac + * MWS, LTP(MWS-CTP-xD), MWAirInterfaceDiversityPac, MicrowaveModel-ObjectClasses-AirInterfaceDiversity + * MWS, LTP(MWS-TTP), ,MicrowaveModel-ObjectClasses-HybridMwStructure + * MWS, LTP(MWS-TTP), ,MicrowaveModel-ObjectClasses-PureEthernetStructure + * + * @author herbert + * + */ +public class ONFCoreNetworkElement10 extends ONFCoreNetworkElementBase { + + private static final Logger LOG = LoggerFactory.getLogger(ONFCoreNetworkElementRepresentation.class); + + private static final InstanceIdentifier NETWORKELEMENT_IID = InstanceIdentifier + .builder(NetworkElement.class) + .build(); + + /*----------------------------------------------------------------------------- + * Class members + */ + + // Non specific part. Used by all functions. + /** interfaceList is used by performance monitoring (pm) task and should be synchronized */ + private final @Nonnull List interfaceList = Collections.synchronizedList(new CopyOnWriteArrayList<>()); + private final @Nonnull MicrowaveEventListener microwaveEventListener; + private @Nullable NetworkElement optionalNe = null; + + // Performance monitoring specific part + /** Lock for the PM access specific elements that could be null */ + private final @Nonnull Object pmLock = new Object(); + private @Nullable Iterator interfaceListIterator = null; + /** Actual pmLp used during iteration over interfaces */ + private @Nullable LpList pmLp = null; + + // Device monitoring specific part + /** Lock for the DM access specific elements that could be null */ + private final @Nonnull Object dmLock = new Object(); + /** Interface used for device monitoring (dm). If not null it contains the interface that is used for monitoring calls */ + private @Nullable InstanceIdentifier dmAirIfCurrentProblemsIID = null; + + /*------------------------------------------------------------------------ + * Constructing + */ + + public ONFCoreNetworkElement10(String mountPointNodeName, Capabilities capabilities, + DataBroker netconfNodeDataBroker, WebSocketServiceClient webSocketService, + HtDatabaseEventsService databaseService, ProviderClient dcaeProvider ,@Nullable ProviderClient aotsmClient) { + + super(mountPointNodeName, netconfNodeDataBroker, capabilities ); + + //Create MicrowaveService here + this.microwaveEventListener = new MicrowaveEventListener(mountPointNodeName, webSocketService, databaseService, dcaeProvider,aotsmClient); + + LOG.info("Create NE instance {}", ONFCoreNetworkElement10.class.getSimpleName()); + } + + public static boolean checkType(Capabilities capabilities) { + return capabilities.isSupportingNamespace(NetworkElement.QNAME); + } + + public static ONFCoreNetworkElement10 build(String mountPointNodeName, Capabilities capabilities, + DataBroker netconfNodeDataBroker, WebSocketServiceClient webSocketService, + HtDatabaseEventsService databaseService, ProviderClient dcaeProvider ,@Nullable ProviderClient aotsmClient) { + + return checkType(capabilities) ? new ONFCoreNetworkElement10(mountPointNodeName, capabilities, netconfNodeDataBroker, webSocketService, databaseService, dcaeProvider ,aotsmClient) : null; + + } + + + /*------------------------------------------------------------------------ + * Functions + */ + + /** + * Have this as a separate function to avoid that representation is not created because of exceptions are thrown. + */ + @Override + public void initialReadFromNetworkElement() { + LOG.debug("Get info about {}", mountPointNodeName); + + int problems = microwaveEventListener.removeAllCurrentProblemsOfNode(); + LOG.debug("Removed all {} problems from database at registration",problems); + + + //Step 2.1: access data broker within this mount point + LOG.debug("DBRead start"); + //Step 2.2: read NEtworkElement from data store and initialize class variables + readNetworkElementAndInterfaces(); + + //Step 2.3: read the existing faults and add to DB + int problemsFound = readAllCurrentProblemsToDB(); + + LOG.info("Found info at {} for device {} number of problems: {}", mountPointNodeName, getUuId(), problemsFound); + + } + + /*------------------------------------------------------------ + * private function to access database + */ + + /** + * Read from NetworkElement and verify LTPs have changed. + * If the NE has changed, update to the new structure. + * From initial state it changes also. + */ + private synchronized boolean readNetworkElementAndInterfaces() { + + LOG.debug("Update mountpoint if changed {}", mountPointNodeName); + + //get NE data + synchronized (pmLock) { + boolean change = false; + + optionalNe = GenericTransactionUtils.readData(netconfNodeDataBroker, LogicalDatastoreType.OPERATIONAL, NETWORKELEMENT_IID); + if (optionalNe == null) { + LOG.debug("Unable to read NE data for mountpoint {}", mountPointNodeName); + if (! interfaceList.isEmpty()) { + interfaceList.clear(); + interfaceListIterator = null; + change = true; + } + } else { + LOG.debug("Mountpoint '{}' NE-Name '{}'", mountPointNodeName, optionalNe.getNameList().toString()); + List actualInterfaceList = getLtpList(optionalNe); + if (! interfaceList.equals(actualInterfaceList) ) { + LOG.debug("Mountpoint '{}' Update LTP List. Elements {}", mountPointNodeName, actualInterfaceList.size() ); + interfaceList.clear(); + interfaceList.addAll(actualInterfaceList); + interfaceListIterator = null; + change = true; + } + } + return change; + } + } + + /** + * Get UUID as string from networkelemen + * @return UUID or EMPTY + */ + private String getUuId() { + String uuid = EMPTY; + + try { + uuid = optionalNe != null ? optionalNe.getUuid() != null ? optionalNe.getUuid().getValue() : EMPTY : EMPTY; + } catch (NullPointerException e) { + //Unfortunately throws null pointer if not definied + } + return uuid; + } + + /** + * Read current problems of AirInterfaces and EthernetContainer + * according to NE status into DB + * @return Number of problems + */ + private int readAllCurrentProblemsToDB() { + + int problemsFound = 0; + + synchronized (pmLock) { + for (LpList lp : interfaceList) { + if (ONFLayerProtocolName.MWAirInterface.is(lp.getLayerProtocolName())) { + //if (ltp.getLayerProtocolName().getValue().contains("MWPS")) { + problemsFound += readTheFaultsOfMWAirInterfacePac(lp.getUuid()); + synchronized (dmLock) { + if (dmAirIfCurrentProblemsIID == null) { + dmAirIfCurrentProblemsIID = getMWAirInterfacePacIId(lp.getUuid()); + } + } + } + if (ONFLayerProtocolName.EthernetContainer10.is(lp.getLayerProtocolName())) { + //if (ltp.getLayerProtocolName().getValue().contains("ETH")) { + problemsFound += readTheFaultsOfMWEthernetContainerPac(lp.getUuid()); + } + } + } + + //Step 2.4: Read other problems from Mountpoint + if (isNetworkElementCurrentProblemsSupporting10) { + problemsFound += readNetworkElementCurrentProblems(); + } + + return problemsFound; + } + + /** + * Read currentProblems of network elemement + * @return number of listed problems
+ * + *
EXAMPLE from log:
+ * karaf.log:2016-12-05 16:36:15,764 | INFO | dispatcher-25390 | EventManagerImpl | 346 - org.opendaylight.mwtn.eventmanager-impl - 0.3.0.SNAPSHOT | DBRead + * Currentproblems: NetworkElementCurrentProblems{getCurrentProblemList=[ + * CurrentProblemList{ + * getProblemName=powerLoss, getProblemSeverity=Critical, getSequenceNumber=1, + * getTimeStamp=DateAndTime [_value=20160822133005.0Z], augmentations={}}, + * CurrentProblemList{ + * getProblemName=powerLoss, + * getProblemSeverity=Minor, + * getSequenceNumber=2, + * getTimeStamp=DateAndTime [_value=20160822143005.0Z], augmentations={}}], augmentations={}} + * + * cpl(2), + * powerLoss[CurrentProblemList{getProblemName=powerLoss, getProblemSeverity=Critical, getSequenceNumber=1, getTimeStamp=DateAndTime [_value=20160822133005.0Z], augmentations={}}], + * powerLoss[CurrentProblemList{getProblemName=powerLoss, getProblemSeverity=Minor, getSequenceNumber=2, getTimeStamp=DateAndTime [_value=20160822143005.0Z], augmentations={}}] + */ + + private int readNetworkElementCurrentProblems() { + + int problemsFound = 0; + LOG.info("DBRead Get {} NetworkElementCurrentProblems", mountPointNodeName); + + InstanceIdentifier networkElementCurrentProblemsIID = InstanceIdentifier + .builder(NetworkElementCurrentProblems.class) + .build(); + + //Step 2.3: read to the config data store + NetworkElementCurrentProblems problems; + try { + problems = GenericTransactionUtils.readData(netconfNodeDataBroker, LogicalDatastoreType.OPERATIONAL, networkElementCurrentProblemsIID); + if (problems == null) { + LOG.debug("DBRead NetworkElementCurrentProblems no CurrentProblemsList"); + } else { + List cpl = problems.getCurrentProblemList(); + LOG.debug("DBRead NetworkElementCurrentProblems input: {}", cpl); + + if (cpl != null) { + List resultList = new ArrayList<>(); + for(GenericCurrentProblemType problem : cpl) { + resultList.add(new ProblemNotificationXml(mountPointNodeName, problem.getObjectIdRef(), + problem.getProblemName(), InternalSeverity.valueOf(problem.getProblemSeverity()), + problem.getSequenceNumber().toString(), InternalDateAndTime.valueOf(problem.getTimeStamp()))); + + } + microwaveEventListener.initCurrentProblem(resultList); + LOG.debug("DBRead NetworkElementCurrentProblems result: {}",resultList); + problemsFound = resultList.size(); + } + } + } catch (Exception e) { + LOG.warn( "DBRead {} NetworkElementCurrentProblems not supported. Message '{}' ", mountPointNodeName, e.getMessage() ); + } + return problemsFound; + } + + + /* + /** + * Read the NetworkElement part from database. + * @return NetworkElement or null + * / + private NetworkElement readNetworkElement() { + //Step 2.2: construct data and the relative iid + // The schema path to identify an instance is + // CoreModel-CoreNetworkModule-ObjectClasses/NetworkElement + + //InstanceIdentifier networkElementIID = InstanceIdentifier + // .builder(NetworkElement.class) + // .build(); + + //Step 2.3: read to the config data store + return GenericTransactionUtils.readData(netconfNodeDataBroker, LogicalDatastoreType.OPERATIONAL, NETWORKELEMENT_IID); + } */ + + /** + * Prepare check by updating NE state and reading all interfaces. + * @see org.opendaylight.mwtn.deviceMonitor.impl.DeviceMonitorSupport#prepareCheck() + */ + @Override + public void prepareCheck() { + synchronized (dmLock) { + boolean change = readNetworkElementAndInterfaces(); + if (change) { + int problems = microwaveEventListener.removeAllCurrentProblemsOfNode(); + int problemsFound = readAllCurrentProblemsToDB(); + LOG.info("Resync mountpoint {} for device {}. Removed {}. Current problems: {}", mountPointNodeName, getUuId(), problems, problemsFound); + } + } + } + + /** + * New implementation + * @see org.opendaylight.mwtn.deviceMonitor.impl.DeviceMonitorSupport#checkAndConnectionToMediatorIsOk() + */ + @Override + public boolean checkAndConnectionToMediatorIsOk() { + synchronized (dmLock) { + return optionalNe != null; + } + } + + /** + * New implementation to interpret status with empty LTP List as notConnected => false + * @see org.opendaylight.mwtn.deviceMonitor.impl.DeviceMonitorSupport#checkAndConnectionToNeIsOk() + */ + @Override + public boolean checkAndConnectionToNeIsOk() { + synchronized (dmLock) { + return optionalNe != null && !interfaceList.isEmpty(); + } + + } + + /* OLD:public boolean checkAndConnectionToNeIsOk() { + synchronized (dmLock) { + if (dmAirIfCurrentProblemsIID != null) { + //Read to the config data store + AtomicBoolean noErrorIndicator = new AtomicBoolean(); + AtomicReference status = new AtomicReference<>(); + + GenericTransactionUtils.readDataOptionalWithStatus(netconfNodeDataBroker, LogicalDatastoreType.OPERATIONAL, dmAirIfCurrentProblemsIID, noErrorIndicator, status); + LOG.debug("Status noErrorIndicator: {} statusTxt:{}",noErrorIndicator.get(), status.get()); + return noErrorIndicator.get(); + } + } + + return true; + } + */ + + /** + * Get List of UUIDs for conditional packages from Networkelement
+ * Possible interfaces are:
+ * MWPS, LTP(MWPS-TTP), MWAirInterfacePac, MicrowaveModel-ObjectClasses-AirInterface
+ * ETH-CTP,LTP(Client), MW_EthernetContainer_Pac
+ * MWS, LTP(MWS-CTP-xD), MWAirInterfaceDiversityPac, MicrowaveModel-ObjectClasses-AirInterfaceDiversity
+ * MWS, LTP(MWS-TTP), ,MicrowaveModel-ObjectClasses-HybridMwStructure
+ * MWS, LTP(MWS-TTP), ,MicrowaveModel-ObjectClasses-PureEthernetStructure
+ * @param ne Networkelement + * @return Id List, never null. + */ + private static List getLtpList( @Nullable NetworkElement ne ) { + + List res = new ArrayList<>(); + + if (ne != null) { + List ltpRefList = ne.getLtpRefList(); + if (ltpRefList == null) { + LOG.debug("DBRead NE-Interfaces: null"); + } else { + for (LtpRefList ltRefListE : ltpRefList ) { + List lpList = ltRefListE.getLpList(); + if (lpList == null) { + LOG.debug("DBRead NE-Interfaces Reference List: null"); + } else { + for (LpList lp : lpList) { + ////LayerProtocolName layerProtocolName = lpListE.getLayerProtocolName(); + //UniversalId uuId = lpListE.getUuid(); + res.add(lp); + } + } + } + } + } else { + LOG.debug("DBRead NE: null"); + } + + //---- Debug + if (LOG.isDebugEnabled()) { + StringBuffer strBuf = new StringBuffer(); + for (LpList ltp : res) { + if (strBuf.length() > 0) { + strBuf.append(", "); + } + strBuf.append(ltp.getLayerProtocolName().getValue()); + strBuf.append(':'); + strBuf.append(ltp.getUuid().getValue()); + } + LOG.debug("DBRead NE-Interfaces: {}", strBuf.toString()); + } + //---- Debug end + + return res; + } + + private int readTheFaultsOfMWEthernetContainerPac(UniversalId interfacePacUuid) { + + int problemsFound = 0; + LOG.info("DBRead Get {} MWEthernetContainerPac: {}", mountPointNodeName, interfacePacUuid.getValue()); + + //Step 2.2: construct data and the relative iid + InstanceIdentifier mwEthInterfaceIID = InstanceIdentifier + .builder(MWEthernetContainerPac.class, new MWEthernetContainerPacKey(interfacePacUuid)) + .child(EthernetContainerCurrentProblems.class) + .build(); + + //Step 2.3: read to the config data store + EthernetContainerCurrentProblems ethProblems = GenericTransactionUtils.readData(netconfNodeDataBroker, LogicalDatastoreType.OPERATIONAL, mwEthInterfaceIID); + if (ethProblems == null) { + LOG.debug("DBRead EthProblems Id {} no EthernetContainerCurrentProblems", interfacePacUuid.getValue()); + } else if (ethProblems.getCurrentProblemList() == null) { + LOG.debug("DBRead Id {} empty CurrentProblemsList", interfacePacUuid.getValue()); + } else { + List resultList = new ArrayList<>(); + for ( ContainerCurrentProblemType problem : ethProblems.getCurrentProblemList()) { + resultList.add(new ProblemNotificationXml(mountPointNodeName, interfacePacUuid.getValue(), + problem.getProblemName(), InternalSeverity.valueOf(problem.getProblemSeverity()), + problem.getSequenceNumber().toString(), InternalDateAndTime.valueOf(problem.getTimeStamp()))); + + } + microwaveEventListener.initCurrentProblem(resultList); + LOG.debug("DBRead EthProblems result: {}",resultList); + problemsFound = resultList.size(); + } + return problemsFound; + } + + /** + * Deliver for specific AirInterfacePac with key the related IId + * @param interfacePacUuid as UniversalId + * @return related InstanceIdentifier + */ + private InstanceIdentifier getMWAirInterfacePacIId(UniversalId interfacePacUuid) { + InstanceIdentifier mwAirInterfaceIID = InstanceIdentifier + .builder(MWAirInterfacePac.class, new MWAirInterfacePacKey(interfacePacUuid)) + .child(AirInterfaceCurrentProblems.class) + .build(); + return mwAirInterfaceIID; + } + + private int readTheFaultsOfMWAirInterfacePac(UniversalId interfacePacUuid) { + + int problemsFound = 0; + LOG.info("DBRead Get {} MWAirInterfacePac: {}", mountPointNodeName, interfacePacUuid.getValue()); + //---- + //Step 2.2: construct data and the relative iid + + InstanceIdentifier mwAirInterfaceIID = getMWAirInterfacePacIId(interfacePacUuid); + + //Step 2.3: read to the config data store + AirInterfaceCurrentProblems airProblems = GenericTransactionUtils.readData(netconfNodeDataBroker, LogicalDatastoreType.OPERATIONAL, mwAirInterfaceIID); + + if (airProblems == null) { + LOG.debug("DBRead Id {} no AirInterfaceCurrentProblems", interfacePacUuid); + } else if (airProblems.getCurrentProblemList() == null) { + LOG.debug("DBRead Id {} no CurrentProblemList", interfacePacUuid); + } else { + List resultList = new ArrayList<>(); + for ( AirInterfaceCurrentProblemType problem : airProblems.getCurrentProblemList()) { + resultList.add(new ProblemNotificationXml(mountPointNodeName, interfacePacUuid.getValue(), + problem.getProblemName(), InternalSeverity.valueOf(problem.getProblemSeverity()), + problem.getSequenceNumber().toString(), InternalDateAndTime.valueOf(problem.getTimeStamp()))); + + } + microwaveEventListener.initCurrentProblem(resultList); + LOG.debug("DBRead AirProblems result: {}",resultList); + problemsFound = resultList.size(); + } + return problemsFound; + } + + public List readTheHistoricalPerformanceDataOfMWAirInterfacePac(LpList lp) { + + String uuId = lp.getUuid().getValue(); + + List resultList = new ArrayList<>(); + LOG.debug("DBRead Get {} MWAirInterfacePac: {}", mountPointNodeName, uuId); + //---- + UniversalId mwAirInterfacePacuuId = new UniversalId(uuId); + //Step 2.1: construct data and the relative iid + InstanceIdentifier mwAirInterfaceConfigurationIID = InstanceIdentifier + .builder(MWAirInterfacePac.class, new MWAirInterfacePacKey(mwAirInterfacePacuuId)) + .child(AirInterfaceConfiguration.class) + .build(); + AirInterfaceConfiguration airConfiguration = GenericTransactionUtils.readData(netconfNodeDataBroker, LogicalDatastoreType.OPERATIONAL, mwAirInterfaceConfigurationIID); + + if (airConfiguration == null) { + LOG.debug("DBRead MWAirInterfacePac Id {} no AirInterfaceConfiguration", mwAirInterfacePacuuId); + + } else { + + //Step 2.2: construct data and the relative iid + InstanceIdentifier mwAirInterfaceHistoricalPerformanceIID = InstanceIdentifier + .builder(MWAirInterfacePac.class, new MWAirInterfacePacKey(mwAirInterfacePacuuId)) + .child(AirInterfaceHistoricalPerformances.class) + .build(); + + //Step 2.3: read to the config data store + AirInterfaceHistoricalPerformances airHistoricalPerformanceData = GenericTransactionUtils.readData(netconfNodeDataBroker, LogicalDatastoreType.OPERATIONAL, mwAirInterfaceHistoricalPerformanceIID); + + if (airHistoricalPerformanceData == null) { + LOG.debug("DBRead MWAirInterfacePac Id {} no AirInterfaceHistoricalPerformances", mwAirInterfacePacuuId); + + } else { + List airHistPMList = airHistoricalPerformanceData.getHistoricalPerformanceDataList(); + LOG.debug("DBRead MWAirInterfacePac Id {} Records intermediate: {}",mwAirInterfacePacuuId, airHistPMList.size()); + if (airHistPMList != null) { + for ( org.opendaylight.yang.gen.v1.uri.onf.microwavemodel.typedefinitions.rev160902.AirInterfaceHistoricalPerformanceType pmRecord : airHistPMList) { + resultList.add(new ExtendedAirInterfaceHistoricalPerformanceType(pmRecord, airConfiguration)); + } + } + } + } + LOG.debug("DBRead MWAirInterfacePac Id {} Records result: {}",mwAirInterfacePacuuId, resultList.size()); + return resultList; + } + + public List readTheHistoricalPerformanceDataOfEthernetContainer(LpList lp) { + + final String myName = "MWEthernetContainerPac"; + String uuId = lp.getUuid().getValue(); + + List resultList = new ArrayList<>(); + LOG.debug("DBRead Get {} : {}", mountPointNodeName, myName,uuId); + //---- + UniversalId ethContainerPacuuId = new UniversalId(uuId); + //Step 2.2: construct data and the relative iid + InstanceIdentifier ethContainerIID = InstanceIdentifier + .builder(MWEthernetContainerPac.class, new MWEthernetContainerPacKey(ethContainerPacuuId)) + .child(EthernetContainerHistoricalPerformances.class) + .build(); + + //Step 2.3: read to the config data store + EthernetContainerHistoricalPerformances ethContainerHistoricalPerformanceData = GenericTransactionUtils.readData(netconfNodeDataBroker, LogicalDatastoreType.OPERATIONAL, ethContainerIID); + + if (ethContainerHistoricalPerformanceData == null) { + LOG.debug("DBRead {} Id {} no EthernetContainerHistoricalPerformances", myName, ethContainerPacuuId); + } else { + List airHistPMList = ethContainerHistoricalPerformanceData.getHistoricalPerformanceDataList(); + LOG.debug("DBRead {} Id {} Records intermediate: {}", myName, ethContainerPacuuId, airHistPMList.size()); + if (airHistPMList != null) { + for ( org.opendaylight.yang.gen.v1.uri.onf.microwavemodel.typedefinitions.rev160902.ContainerHistoricalPerformanceType pmRecord : airHistPMList) { + resultList.add(pmRecord); + } + } + } + LOG.debug("DBRead {} Id {} Records result: {}", myName, ethContainerPacuuId, resultList.size()); + return resultList; + } + + private List readTheHistoricalPerformanceData(LpList lp) { + ONFLayerProtocolName lpName = ONFLayerProtocolName.valueOf(lp.getLayerProtocolName()); + + switch( lpName ) { + case MWAirInterface: + return readTheHistoricalPerformanceDataOfMWAirInterfacePac(lp); + + case EthernetContainer10: + return readTheHistoricalPerformanceDataOfEthernetContainer(lp); + + case EthernetContainer12: + case EthernetPhysical: + case TDMContainer: + case Ethernet: + case Structure: + case Unknown: + LOG.debug("Do not read HistoricalPM data for", lpName); + break; + } + return new ArrayList<>(); + } + + @Override + public AllPm getHistoricalPM() { + synchronized ( pmLock ) { + if (pmLp != null) { + AllPm allPm = new AllPm(); + LpList lp = pmLp; + + List resultList = readTheHistoricalPerformanceData(lp); + + for (OTNHistoryData perf : resultList) { + + switch(perf.getGranularityPeriod()) { + case PERIOD15MIN: { + EsHistoricalPerformance15Minutes pm = new EsHistoricalPerformance15Minutes(mountPointNodeName, lp) + .setHistoricalRecord15Minutes(perf); + allPm.add(pm); + } + break; + + case PERIOD24HOURS: { + LOG.debug("Write 24h create"); + EsHistoricalPerformance24Hours pm = new EsHistoricalPerformance24Hours(mountPointNodeName, lp) + .setHistoricalRecord24Hours(perf); + LOG.debug("Write 24h write to DB"); + allPm.add(pm); + } + + break; + default: + LOG.warn("Unknown granularity {}",perf.getGranularityPeriod()); + break; + } + } + return allPm; + } else { + return AllPm.EMPTY; + } + } + + } + + @Override + public void resetPMIterator() { + synchronized ( pmLock ) { + interfaceListIterator = interfaceList.iterator(); + } + LOG.debug("PM reset iterator"); + } + + @Override + public boolean hasNext() { + boolean res; + synchronized ( pmLock ) { + res = interfaceListIterator != null ? interfaceListIterator.hasNext(): false; + } + LOG.debug("PM hasNext LTP {}", res); + return res; + } + + @Override + public void next() { + synchronized ( pmLock ) { + pmLp = interfaceListIterator != null ? interfaceListIterator.next() : null; + } + LOG.debug("PM next LTP {}", pmLp.getUuid().toString()); + } + + @Override + public String pmStatusToString() { + StringBuffer res = new StringBuffer(); + synchronized ( pmLock ) { + res.append(pmLp == null ? "no interface" : pmLp.getLayerProtocolName().getValue()); + for (LpList lp : interfaceList ) { + res.append("IF:"); + res.append(lp.getLayerProtocolName().getValue()); + res.append(" "); + } + } + return(res.toString()); + } + + @Override + public int removeAllCurrentProblemsOfNode() { + return microwaveEventListener.removeAllCurrentProblemsOfNode(); + } + + @Override + public void doRegisterMicrowaveEventListener(MountPoint mountPoint) { + final Optional optionalNotificationService = mountPoint.getService(NotificationService.class); + final NotificationService notificationService = optionalNotificationService.get(); + notificationService.registerNotificationListener(microwaveEventListener); + } + + @Override + public @Nonnull InventoryInformation getInventoryInformation() { + return this.getInventoryInformation(null); + } + + @Override + public @Nonnull InventoryInformation getInventoryInformation(String layerProtocolFilter) { + + String type=InventoryInformation.UNKNOWN; + String model=InventoryInformation.UNKNOWN; + String vendor=InventoryInformation.UNKNOWN; + String ipv4=InventoryInformation.UNKNOWN; + String ipv6=InventoryInformation.UNKNOWN; + List uuids = new ArrayList(); + LOG.debug("request inventory information. filter:"+layerProtocolFilter); + + if (optionalNe != null) { + + //uuids + for(LpList lp : this.interfaceList) + { + if(layerProtocolFilter==null || layerProtocolFilter.isEmpty()) + uuids.add(lp.getUuid().getValue()); + else if(lp.getLayerProtocolName()!=null && + lp.getLayerProtocolName().getValue()!=null && + lp.getLayerProtocolName().getValue().equals(layerProtocolFilter)) + uuids.add(lp.getUuid().getValue()); + } + //type + List extensions = optionalNe.getExtensionList(); + if(extensions!=null) + { + for(ExtensionList e: extensions) + { + if(e.getValueName()!=null) + { + if(e.getValueName().equals("neIpAddress")) + { + ipv4=e.getValue(); + LOG.debug("ip information found: "+ipv4); + } + } + } + if(ipv4==InventoryInformation.UNKNOWN) + { + LOG.debug("no ip information found"); + } + } + else + { + LOG.debug("extension list is null"); + } + } + + + return new InventoryInformation(type, model, vendor, ipv4, ipv6, uuids); + } + + +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/netconf/ONFCoreNetworkElement12.java b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/netconf/ONFCoreNetworkElement12.java new file mode 100644 index 00000000..37fd3356 --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/netconf/ONFCoreNetworkElement12.java @@ -0,0 +1,1435 @@ +/* +* Copyright (c) 2017 highstreet technologies GmbH 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.mwtn.base.netconf; + +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Iterator; +import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + +import org.opendaylight.controller.md.sal.binding.api.DataBroker; +import org.opendaylight.controller.md.sal.binding.api.MountPoint; +import org.opendaylight.controller.md.sal.binding.api.NotificationService; +import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; +import org.opendaylight.mwtn.base.internalTypes.InternalDateAndTime; +import org.opendaylight.mwtn.base.internalTypes.InternalSeverity; +import org.opendaylight.mwtn.base.internalTypes.InventoryInformation; +import org.opendaylight.mwtn.devicemanager.impl.ProviderClient; +import org.opendaylight.mwtn.devicemanager.impl.database.service.HtDatabaseEventsService; +import org.opendaylight.mwtn.devicemanager.impl.listener.MicrowaveEventListener12; +import org.opendaylight.mwtn.devicemanager.impl.xml.ProblemNotificationXml; +import org.opendaylight.mwtn.devicemanager.impl.xml.WebSocketServiceClient; +import org.opendaylight.mwtn.performancemanager.impl.database.types.EsHistoricalPerformance15Minutes; +import org.opendaylight.mwtn.performancemanager.impl.database.types.EsHistoricalPerformance24Hours; +//import org.opendaylight.yang.gen.v1.uri.onf.microwavemodel.networkelement.currentproblemlist.rev161120.GenericCurrentProblemType; +//import org.opendaylight.yang.gen.v1.uri.onf.microwavemodel.networkelement.currentproblemlist.rev161120.NetworkElementCurrentProblems; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ptp.dataset.rev170208.InstanceList; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ptp.dataset.rev170208.InstanceListKey; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ptp.dataset.rev170208.PortDsEntry; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ptp.dataset.rev170208.instance.list.PortDsList; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ptp.dataset.rev170208.port.ds.entry.PortIdentity; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.core.model.rev170320.Equipment; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.core.model.rev170320.EquipmentKey; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.core.model.rev170320.NetworkElement; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.core.model.rev170320.UniversalId; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.core.model.rev170320.extension.g.Extension; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.core.model.rev170320.logical.termination.point.g.Lp; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.core.model.rev170320.network.element.Ltp; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.g._874._1.model.rev170320.GranularityPeriodType; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.g._874._1.model.rev170320.OtnHistoryDataG; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev170324.AirInterfaceCurrentProblemTypeG; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev170324.AirInterfaceDiversityCurrentProblemTypeG; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev170324.AirInterfaceHistoricalPerformanceTypeG; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev170324.ContainerCurrentProblemTypeG; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev170324.ContainerHistoricalPerformanceTypeG; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev170324.MwAirInterfaceDiversityPac; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev170324.MwAirInterfaceDiversityPacKey; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev170324.MwAirInterfacePac; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev170324.MwAirInterfacePacKey; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev170324.MwEthernetContainerPac; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev170324.MwEthernetContainerPacKey; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev170324.MwHybridMwStructurePac; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev170324.MwHybridMwStructurePacKey; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev170324.MwPureEthernetStructurePac; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev170324.MwPureEthernetStructurePacKey; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev170324.MwTdmContainerPac; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev170324.MwTdmContainerPacKey; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev170324.StructureCurrentProblemTypeG; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev170324.mw.air._interface.diversity.pac.AirInterfaceDiversityCurrentProblems; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev170324.mw.air._interface.pac.AirInterfaceConfiguration; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev170324.mw.air._interface.pac.AirInterfaceCurrentProblems; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev170324.mw.air._interface.pac.AirInterfaceHistoricalPerformances; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev170324.mw.ethernet.container.pac.EthernetContainerCurrentProblems; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev170324.mw.ethernet.container.pac.EthernetContainerHistoricalPerformances; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev170324.mw.hybrid.mw.structure.pac.HybridMwStructureCurrentProblems; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev170324.mw.pure.ethernet.structure.pac.PureEthernetStructureCurrentProblems; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev170324.mw.tdm.container.pac.TdmContainerCurrentProblems; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.onf.core.model.conditional.packages.rev170402.NetworkElementPac; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.onf.core.model.conditional.packages.rev170402.network.element.pac.NetworkElementCurrentProblems; +//import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.onf.core.model.conditional.packages.rev170402.NetworkElementPac; +//import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.onf.core.model.conditional.packages.rev170402.network.element.pac.NetworkElementCurrentProblems; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.onf.ethernet.conditional.packages.rev170402.EthernetPac; +import org.opendaylight.yangtools.concepts.ListenerRegistration; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; +import org.opendaylight.yangtools.yang.common.QName; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.google.common.base.Optional; + +/** + * Get information over NETCONF device according to ONF Coremodel. Read + * networkelement and conditional packages. + * + * Get conditional packages from Networkelement Possible interfaces are: MWPS, + * LTP(MWPS-TTP), MWAirInterfacePac, MicrowaveModel-ObjectClasses-AirInterface + * ETH-CTP,LTP(Client), MW_EthernetContainer_Pac MWS, LTP(MWS-CTP-xD), + * MWAirInterfaceDiversityPac, + * MicrowaveModel-ObjectClasses-AirInterfaceDiversity MWS, LTP(MWS-TTP), + * ,MicrowaveModel-ObjectClasses-HybridMwStructure MWS, LTP(MWS-TTP), + * ,MicrowaveModel-ObjectClasses-PureEthernetStructure + * + * @author herbert + * + */ +public class ONFCoreNetworkElement12 extends ONFCoreNetworkElementBase { + + private static final Logger LOG = LoggerFactory.getLogger(ONFCoreNetworkElement12.class); + + private static final List EMPTYLTPEXTENSIONLIST = new ArrayList<>(); + // private static final List EMPTYLTPLIST = new ArrayList<>(); + + private static final InstanceIdentifier NETWORKELEMENT_IID = InstanceIdentifier + .builder(NetworkElement.class).build(); + + private static final InstanceIdentifier PTPINSTANCES_IID = InstanceIdentifier + .builder(InstanceList.class, new InstanceListKey(1)).build(); + + /*----------------------------------------------------------------------------- + * Class members + */ + + // Non specific part. Used by all functions. + /** interfaceList is used by PM task and should be synchonized */ + private final @Nonnull List interfaceList = Collections.synchronizedList(new CopyOnWriteArrayList<>()); + private final @Nonnull MicrowaveEventListener12 microwaveEventListener; + private @Nullable NetworkElement optionalNe = null; + + // Performance monitoring specific part + /** Lock for the PM access specific elements that could be null */ + private final @Nonnull Object pmLock = new Object(); + private @Nullable Iterator interfaceListIterator = null; + /** Actual pmLp used during iteration over interfaces */ + private @Nullable Lp pmLp = null; + + // Device monitoring specific part + /** Lock for the DM access specific elements that could be null */ + private final @Nonnull Object dmLock = new Object(); + /** + * Interface used for device monitoring (dm). If not null it contains the + * interface that is used for monitoring calls + */ + private @Nullable InstanceIdentifier dmAirIfCurrentProblemsIID = null; + private final boolean isNetworkElementCurrentProblemsSupporting12; + private ListenerRegistration listenerRegistrationresult; + + /*----------------------------------------------------------------------------- + * Construction + */ + + /** + * Constructor + * + * @param mountPointNodeName + * as String + * @param capabilities + * of the specific network element + * @param netconfNodeDataBroker + * for the network element specific data + * @param webSocketService + * to forward event notifications + * @param databaseService + * to access the database + * @param dcaeProvider + * to forward problem / change notifications + */ + private ONFCoreNetworkElement12(String mountPointNodeName, Capabilities capabilities, + DataBroker netconfNodeDataBroker, WebSocketServiceClient webSocketService, + HtDatabaseEventsService databaseService, ProviderClient dcaeProvider, + @Nullable ProviderClient aotsmClient) { + + super(mountPointNodeName, netconfNodeDataBroker, capabilities); + + // Create MicrowaveService here + this.microwaveEventListener = new MicrowaveEventListener12(mountPointNodeName, webSocketService, + databaseService, dcaeProvider, aotsmClient); + this.isNetworkElementCurrentProblemsSupporting12 = capabilities.isSupportingNamespace(NetworkElementPac.QNAME); + LOG.debug("support necurrent-problem-list=" + this.isNetworkElementCurrentProblemsSupporting12); + LOG.info("Create NE instance {}", InstanceList.QNAME.getLocalName()); + } + + /** + * Check capabilities are matching the this specific implementation and create + * network element representation if so. + * + * @param mountPointNodeName + * as String + * @param capabilities + * of the specific network element + * @param netconfNodeDataBroker + * for the network element specific data + * @param webSocketService + * to forward event notifications + * @param databaseService + * to access the database + * @param dcaeProvider + * to forward problem / change notifications + * @return created Object if conditions are OK or null if not. + */ + public static @Nullable ONFCoreNetworkElement12 build(String mountPointNodeName, Capabilities capabilities, + DataBroker netconfNodeDataBroker, WebSocketServiceClient webSocketService, + HtDatabaseEventsService databaseService, ProviderClient dcaeProvider, + @Nullable ProviderClient aotsmClient) { + return checkType(capabilities) + ? new ONFCoreNetworkElement12(mountPointNodeName, capabilities, netconfNodeDataBroker, webSocketService, + databaseService, dcaeProvider, aotsmClient) + : null; + } + + /*----------------------------------------------------------------------------- + * Functions + */ + + private static boolean checkType(Capabilities capabilities) { + return capabilities.isSupportingNamespace(NetworkElement.QNAME); + } + + /** + * Prepare check by updating NE state and reading all interfaces. + * + * @see org.opendaylight.mwtn.deviceMonitor.impl.DeviceMonitorSupport#prepareCheck() + */ + @Override + public void prepareCheck() { + synchronized (dmLock) { + boolean change = readNetworkElementAndInterfaces(); + if (change) { + int problems = microwaveEventListener.removeAllCurrentProblemsOfNode(); + List resultList = readAllCurrentProblemsToDB(); + microwaveEventListener.initCurrentProblem(resultList); + LOG.info("Resync mountpoint {} for device {}. Removed {}. Current problems: {}", mountPointNodeName, + getUuId(), problems, resultList.size()); + } + } + } + + /** + * New implementation + * + * @see org.opendaylight.mwtn.deviceMonitor.impl.DeviceMonitorSupport#checkAndConnectionToMediatorIsOk() + */ + @Override + public boolean checkAndConnectionToMediatorIsOk() { + synchronized (dmLock) { + return optionalNe != null; + } + } + + /** + * New implementation to interpret status with empty LTP List as notConnected => + * false + * + * @see org.opendaylight.mwtn.deviceMonitor.impl.DeviceMonitorSupport#checkAndConnectionToNeIsOk() + */ + @Override + public boolean checkAndConnectionToNeIsOk() { + synchronized (dmLock) { + return optionalNe != null && !interfaceList.isEmpty(); + } + + } + + /* + * /** Check connection by requesting NetworkElement object + * + * @see org.opendaylight.mwtn.base.netconf.ONFCoreNetworkElementRepresentation# + * checkAndConnectionToMediatorIsOk() / + * + * @Override public boolean checkAndConnectionToMediatorIsOk() { + * + * //Read to the config data store AtomicBoolean noErrorIndicator = new + * AtomicBoolean(); AtomicReference status = new AtomicReference<>(); + * + * GenericTransactionUtils.readDataOptionalWithStatus(netconfNodeDataBroker, + * LogicalDatastoreType.OPERATIONAL, NETWORKELEMENT_IID, noErrorIndicator, + * status); + * LOG.debug("Status noErrorIndicator: {} statusTxt:{}",noErrorIndicator.get(), + * status.get()); return noErrorIndicator.get(); } + */ + + /* + * /** Check connection only possible if AirInterface (MWTN) exists. Request + * + * @see org.opendaylight.mwtn.base.netconf.ONFCoreNetworkElementRepresentation# + * checkAndConnectionToNeIsOk() / + * + * @Override public boolean checkAndConnectionToNeIsOk() { synchronized (dmLock) + * { if (dmAirIfCurrentProblemsIID != null) { //Read to the config data store + * AtomicBoolean noErrorIndicator = new AtomicBoolean(); AtomicReference + * status = new AtomicReference<>(); + * + * GenericTransactionUtils.readDataOptionalWithStatus(netconfNodeDataBroker, + * LogicalDatastoreType.OPERATIONAL, dmAirIfCurrentProblemsIID, + * noErrorIndicator, status); + * LOG.debug("Status noErrorIndicator: {} statusTxt:{}",noErrorIndicator.get(), + * status.get()); return noErrorIndicator.get(); } } return true; } + */ + + /*----------------------------------------------------------------------------- + * Sychronization + */ + + /** + * Query synchronization information out of NE + */ + + @Override + public void initSynchronizationExtension() { + // ClockIdentityType vv; + try { + if (!capabilities.isSupportingNamespace(InstanceList.QNAME)) { + LOG.debug("Mountpoint {} does not support PTP", mountPointNodeName); + } else { + StringBuffer sb = new StringBuffer(); + sb.append("NE " + mountPointNodeName + " does support synchronisation.\n"); + InstanceList ptpInstance = readPTPClockInstances(); + if (ptpInstance != null) { + List dsList = ptpInstance.getPortDsList(); + if (dsList != null) { + int t = 0; + for (PortDsEntry portDs : ptpInstance.getPortDsList()) { + PortIdentity portId = portDs.getPortIdentity(); + if (portId != null) { + sb.append("Port["); + sb.append(portId.getPortNumber()); + sb.append("]{ ClockId: "); + sb.append(portId.getClockIdentity()); + sb.append(", Portstate: "); + sb.append(portDs.getPortState()); + sb.append("}, "); + } else { + sb.append("Incomplete port #" + t + ", "); + } + t++; + } + } else { + sb.append("dsList contains null"); + } + } else + sb.append("ptpInstance equals null"); + LOG.trace(sb.toString()); + } + } catch (Exception e) { + LOG.info("Inconsistent synchronisation structure: " + e.getMessage()); + } + + } + + @Nullable + private InstanceList readPTPClockInstances() { + return GenericTransactionUtils.readData(netconfNodeDataBroker, LogicalDatastoreType.OPERATIONAL, + PTPINSTANCES_IID); + } + + /*----------------------------------------------------------------------------- + * Problem/Fault related functions + */ + + /** + * Read during startup all relevant structure and status parameters from device + */ + @Override + public void initialReadFromNetworkElement() { + // optionalNe.getLtp().get(0).getLp(); + LOG.debug("Get info about {}", mountPointNodeName); + + int problems = microwaveEventListener.removeAllCurrentProblemsOfNode(); + LOG.debug("Removed all {} problems from database at registration", problems); + + // Step 2.1: access data broker within this mount point + LOG.debug("DBRead start"); + + // Step 2.2: read ne from data store + readNetworkElementAndInterfaces(); + + // Step 2.3: read the existing faults and add to DB + List resultList = readAllCurrentProblemsToDB(); + + microwaveEventListener.initCurrentProblem(resultList); + + LOG.info("Found info at {} for device {} number of problems: {}", mountPointNodeName, getUuId(), + resultList.size()); + } + @Override + public InventoryInformation getInventoryInformation() { + return this.getInventoryInformation(null); + } + @Override + public @Nonnull InventoryInformation getInventoryInformation(String layerProtocolFilter) { + + List uuids = new ArrayList(); + String type=InventoryInformation.UNKNOWN; + String model=InventoryInformation.UNKNOWN; + String vendor=InventoryInformation.UNKNOWN; + String ipv4=InventoryInformation.UNKNOWN; + String ipv6=InventoryInformation.UNKNOWN; + LOG.debug("request inventory information. filter:"+layerProtocolFilter); + if (optionalNe != null) { + + //uuids + for(Lp lp : this.interfaceList) + { + if(layerProtocolFilter==null || layerProtocolFilter.isEmpty()) + uuids.add(lp.getUuid().getValue()); + else if(lp.getLayerProtocolName()!=null && + lp.getLayerProtocolName().getValue()!=null && + lp.getLayerProtocolName().getValue().equals(layerProtocolFilter)) + uuids.add(lp.getUuid().getValue()); + } + LOG.debug("uuids found: {}",uuids); + //type + List extensions = optionalNe.getExtension(); + if(extensions!=null) + { + String topLevelEqUuid=null; + for(Extension e: extensions) + { + if(e.getValueName()!=null) + { + if(e.getValueName().equals("top-level-equipment") && e.getValue()!=null) + { + topLevelEqUuid=e.getValue(); + LOG.debug("top level equipment found: "+topLevelEqUuid); + } + else if(e.getValueName().equals("neIpAddress") && e.getValue()!=null) + { + ipv4=e.getValue(); + LOG.debug("ip information found: "+ipv4); + } + } + } + if(ipv4==InventoryInformation.UNKNOWN) + { + LOG.debug("no ip information found"); + } + if(topLevelEqUuid!=null) + { + Equipment e = this.readEquipmentPac(topLevelEqUuid); + if(e!=null) + { + if( e.getManufacturedThing()!=null && + e.getManufacturedThing().getEquipmentType()!=null && + e.getManufacturedThing().getEquipmentType().getTypeName()!=null) + { + type = e.getManufacturedThing().getEquipmentType().getTypeName(); + LOG.debug("equipment type found: "+type); + } + else + { + LOG.debug("no equipment type found"); + } + if( e.getManufacturedThing()!=null && + e.getManufacturedThing().getEquipmentType()!=null && + e.getManufacturedThing().getEquipmentType().getModelIdentifier()!=null) + { + model=e.getManufacturedThing().getEquipmentType().getModelIdentifier(); + LOG.debug("model identifier found:"+model); + } + else + { + LOG.debug("no model identifier found"); + } + if(e.getManufacturedThing()!=null && + e.getManufacturedThing().getManufacturerProperties()!=null && + e.getManufacturedThing().getManufacturerProperties().getManufacturerIdentifier()!=null) + { + vendor = e.getManufacturedThing().getManufacturerProperties().getManufacturerIdentifier(); + LOG.debug("manifacturer found: "+ vendor); + } + else + { + LOG.debug("no manifacturer found"); + } + } + } + else + { + LOG.debug("no top level equipment found"); + } + } + else + { + LOG.debug("extension list is null"); + } + } + + return new InventoryInformation(type, model, vendor, ipv4, ipv6, uuids); + + + } + + + /** + * LOG the newly added problems of the interface pac + * + * @param idxStart + * @param uuid + * @param resultList + */ + private void debugResultList(String uuid, List resultList, int idxStart) { + if (LOG.isDebugEnabled()) { + StringBuffer sb = new StringBuffer(); + int idx = 0; + for (int t = idxStart; t < resultList.size(); t++) { + sb.append(idx++); + sb.append(":{"); + sb.append(resultList.get(t)); + sb.append('}'); + } + LOG.debug("Found problems {} {}", uuid, sb.toString()); + } + } + + /** + * Read from NetworkElement and verify LTPs have changed. If the NE has changed, + * update to the new structure. From initial state it changes also. + */ + private synchronized boolean readNetworkElementAndInterfaces() { + + LOG.debug("Update mountpoint if changed {}", mountPointNodeName); + + optionalNe = GenericTransactionUtils.readData(netconfNodeDataBroker, LogicalDatastoreType.OPERATIONAL, + NETWORKELEMENT_IID); + ; + synchronized (pmLock) { + boolean change = false; + + if (optionalNe == null) { + LOG.debug("Unable to read NE data for mountpoint {}", mountPointNodeName); + if (!interfaceList.isEmpty()) { + interfaceList.clear(); + interfaceListIterator = null; + change = true; + } + + } else { + LOG.debug("Mountpoint '{}' NE-Name '{}'", mountPointNodeName, optionalNe.getName().toString()); + List actualInterfaceList = getLtpList(optionalNe); + if (!interfaceList.equals(actualInterfaceList)) { + LOG.debug("Mountpoint '{}' Update LTP List. Elements {}", mountPointNodeName, + actualInterfaceList.size()); + interfaceList.clear(); + interfaceList.addAll(actualInterfaceList); + interfaceListIterator = null; + change = true; + } + } + return change; + } + } + + /** + * Read current problems of AirInterfaces and EthernetContainer according to NE + * status into DB + * + * @return List with all problems + */ + private List readAllCurrentProblemsToDB() { + + // Step 2.3: read the existing faults and add to DB + List resultList = new ArrayList<>(); + int idxStart; // Start index for debug messages + UniversalId uuid; + + synchronized (pmLock) { + for (Lp ltp : interfaceList) { + + idxStart = resultList.size(); + uuid = ltp.getUuid(); + Class lpClass = getLpExtension(ltp); + + ONFLayerProtocolName lpName = ONFLayerProtocolName.valueOf(ltp.getLayerProtocolName()); + switch (lpName) { + case MWAirInterface: + readTheFaultsOfMwAirInterfacePac(uuid, resultList); + synchronized (dmLock) { + if (dmAirIfCurrentProblemsIID == null) { + dmAirIfCurrentProblemsIID = getMWAirInterfacePacIId(uuid); + } + } + break; + + case EthernetContainer12: + readTheFaultsOfMwEthernetContainerPac(uuid, resultList); + break; + + case TDMContainer: + readTheFaultsOfMwTdmContainerPac(uuid, resultList); + break; + + case Structure: + if (lpClass == MwHybridMwStructurePac.class) { + readTheFaultsOfMwHybridMwStructurePac(uuid, resultList); + + } else if (lpClass == MwAirInterfaceDiversityPac.class) { + readTheFaultsOfMwAirInterfaceDiversityPac(uuid, resultList); + + } else if (lpClass == MwPureEthernetStructurePac.class) { + readTheFaultsOfMwPureEthernetStructurePac(uuid, resultList); + + } else { + LOG.warn("Unassigned lp model {} class {}", lpName, lpClass); + } + break; + + case Ethernet: + // No alarms supported + break; + case EthernetContainer10: + default: + LOG.warn("Unassigned or not expected lp in model {}", lpName); + } + + debugResultList(uuid.getValue(), resultList, idxStart); + + } + } + + // Step 2.4: Read other problems from mountpoint + if (isNetworkElementCurrentProblemsSupporting10) { + idxStart = resultList.size(); + readNetworkElementCurrentProblems10(resultList); + debugResultList("CurrentProblems10", resultList, idxStart); + } + + // Step 2.5: Read other problems from mountpoint + if (isNetworkElementCurrentProblemsSupporting12) { + idxStart = resultList.size(); + readNetworkElementCurrentProblems12(resultList); + debugResultList("CurrentProblems12", resultList, idxStart); + } + + return resultList; + + } + + /** + * Get uuid of Optional NE. + * + * @return Uuid or EMPTY String if optionNE is not available + */ + private String getUuId() { + String uuid = EMPTY; + + try { + uuid = optionalNe != null ? optionalNe.getUuid() != null ? optionalNe.getUuid().getValue() : EMPTY : EMPTY; + } catch (NullPointerException e) { + // Unfortunately throws null pointer if not definied + } + return uuid; + } + + /** + * Read the NetworkElement part from database. + * + * @return Optional with NetworkElement or empty + */ + @Nullable + private NetworkElement readNetworkElement() { + // Step 2.2: construct data and the relative iid + // The schema path to identify an instance is + // CoreModel-CoreNetworkModule-ObjectClasses/NetworkElement + /* + * InstanceIdentifier networkElementIID = InstanceIdentifier + * .builder(NetworkElement.class) .build(); + */ + // Read to the config data store + return GenericTransactionUtils.readData(netconfNodeDataBroker, LogicalDatastoreType.OPERATIONAL, + NETWORKELEMENT_IID); + } + + /** + * Get from LayProtocolExtensions the related generated ONF Interface PAC class + * which represents it. + * + * @param ltp + * logical termination point + * @return Class of InterfacePac + */ + @Nullable + private static Class getLpExtension(@Nullable Lp ltp) { + + String capability = EMPTY; + String revision = EMPTY; + String conditionalPackage = EMPTY; + Class res = null; + + if (ltp != null) { + for (Extension e : getExtensionList(ltp)) { + if (e.getValueName().contentEquals("capability")) { + capability = e.getValue(); + int idx = capability.indexOf("?"); + if (idx != -1) { + capability = capability.substring(0, idx); + } + } + if (e.getValueName().contentEquals("revision")) { + revision = e.getValue(); + } + if (e.getValueName().contentEquals("conditional-package")) { + conditionalPackage = e.getValue(); + } + } + } + // QName qName = + // org.opendaylight.yangtools.yang.common.QName.create("urn:onf:params:xml:ns:yang:microwave-model", + // "2017-03-24", "mw-air-interface-pac").intern(); + LOG.info("LpExtension capability={} revision={} conditionalPackage={}", capability, revision, + conditionalPackage); + if (!capability.isEmpty() && !revision.isEmpty() && !conditionalPackage.isEmpty()) { + try { + QName qName = QName.create(capability, revision, conditionalPackage); + + if (qName.equals(MwAirInterfacePac.QNAME)) { + res = MwAirInterfacePac.class; + } else if (qName.equals(MwAirInterfaceDiversityPac.QNAME)) { + res = MwAirInterfaceDiversityPac.class; + } else if (qName.equals(MwPureEthernetStructurePac.QNAME)) { + res = MwPureEthernetStructurePac.class; + } else if (qName.equals(MwHybridMwStructurePac.QNAME)) { + res = MwHybridMwStructurePac.class; + } else if (qName.equals(MwEthernetContainerPac.QNAME)) { + res = MwEthernetContainerPac.class; + } else if (qName.equals(MwTdmContainerPac.QNAME)) { + res = MwTdmContainerPac.class; + } else if (qName.equals(EthernetPac.QNAME)) { + res = MwTdmContainerPac.class; + } + LOG.info("Found QName {} mapped to {}", String.valueOf(qName), String.valueOf(res)); + } catch (IllegalArgumentException e) { + LOG.debug("Can not create QName from ({}{{}{{}): {}", capability, revision, conditionalPackage, + e.getMessage()); + } + } + return res; + } + + /** + * Read element from class that could be not available + * + * @param ltp + * layer termination point + * @return List with extension parameters or empty list + */ + @Nonnull + private static List getExtensionList(@Nullable Lp ltp) { + if (ltp != null && ltp.getExtension() != null) { + return ltp.getExtension(); + } else { + return EMPTYLTPEXTENSIONLIST; + } + } + + /** + * Get List of UUIDs for conditional packages from Networkelement
+ * Possible interfaces are:
+ * MWPS, LTP(MWPS-TTP), MWAirInterfacePac, + * MicrowaveModel-ObjectClasses-AirInterface
+ * ETH-CTP,LTP(Client), MW_EthernetContainer_Pac
+ * MWS, LTP(MWS-CTP-xD), MWAirInterfaceDiversityPac, + * MicrowaveModel-ObjectClasses-AirInterfaceDiversity
+ * MWS, LTP(MWS-TTP), ,MicrowaveModel-ObjectClasses-HybridMwStructure
+ * MWS, LTP(MWS-TTP), ,MicrowaveModel-ObjectClasses-PureEthernetStructure
+ * + * @param ne + * Networkelement + * @return Id List, never null. + */ + private static List getLtpList(@Nullable NetworkElement ne) { + + List res = Collections.synchronizedList(new ArrayList()); + + if (ne != null) { + List ltpRefList = ne.getLtp(); + if (ltpRefList == null) { + LOG.debug("DBRead NE-Interfaces: null"); + } else { + for (Ltp ltRefListE : ltpRefList) { + List lpList = ltRefListE.getLp(); + if (lpList == null) { + LOG.debug("DBRead NE-Interfaces Reference List: null"); + } else { + for (Lp ltp : lpList) { + //// LayerProtocolName layerProtocolName = lpListE.getLayerProtocolName(); + // UniversalId uuId = lpListE.getUuid(); + res.add(ltp); + } + } + } + } + } else { + LOG.debug("DBRead NE: null"); + } + + // ---- Debug + if (LOG.isDebugEnabled()) { + StringBuffer strBuf = new StringBuffer(); + for (Lp ltp : res) { + if (strBuf.length() > 0) { + strBuf.append(", "); + } + strBuf.append(ltp.getLayerProtocolName().getValue()); + strBuf.append(':'); + strBuf.append(ltp.getUuid().getValue()); + } + LOG.debug("DBRead NE-Interfaces: {}", strBuf.toString()); + } + // ---- Debug end + + return res; + } + + /*----------------------------------------------------------------------------- + * Performance related data + */ + + /** + * PM MwAirInterfacePac + * + * @param lp + * @return + */ + private List readTheHistoricalPerformanceDataOfMwAirInterfacePac( + Lp lp) { + + String uuId = lp.getUuid().getValue(); + + List resultList = new ArrayList<>(); + LOG.debug("DBRead Get {} MWAirInterfacePac: {}", mountPointNodeName, uuId); + // ---- + UniversalId mwAirInterfacePacuuId = new UniversalId(uuId); + // Step 2.1: construct data and the relative iid + InstanceIdentifier mwAirInterfaceConfigurationIID = InstanceIdentifier + .builder(MwAirInterfacePac.class, new MwAirInterfacePacKey(mwAirInterfacePacuuId)) + .child(AirInterfaceConfiguration.class).build(); + AirInterfaceConfiguration airConfiguration = GenericTransactionUtils.readData(netconfNodeDataBroker, + LogicalDatastoreType.OPERATIONAL, mwAirInterfaceConfigurationIID); + + if (airConfiguration == null) { + LOG.debug("DBRead MWAirInterfacePac Id {} no AirInterfaceConfiguration", mwAirInterfacePacuuId); + + } else { + // Step 2.2: construct data and the relative iid + InstanceIdentifier mwAirInterfaceHistoricalPerformanceIID = InstanceIdentifier + .builder(MwAirInterfacePac.class, new MwAirInterfacePacKey(mwAirInterfacePacuuId)) + .child(AirInterfaceHistoricalPerformances.class).build(); + + // Step 2.3: read to the config data store + AirInterfaceHistoricalPerformances airHistoricalPerformanceData = GenericTransactionUtils.readData( + netconfNodeDataBroker, LogicalDatastoreType.OPERATIONAL, mwAirInterfaceHistoricalPerformanceIID); + + if (airHistoricalPerformanceData == null) { + LOG.debug("DBRead MWAirInterfacePac Id {} no AirInterfaceHistoricalPerformances", + mwAirInterfacePacuuId); + } else { + // org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev170320.air._interface.historical.performances.g.HistoricalPerformanceDataList + List airHistPMList = airHistoricalPerformanceData + .getHistoricalPerformanceDataList(); + LOG.debug("DBRead MWAirInterfacePac Id {} Records intermediate: {}", mwAirInterfacePacuuId, + airHistPMList.size()); + if (airHistPMList != null) { + for (AirInterfaceHistoricalPerformanceTypeG pmRecord : airHistoricalPerformanceData + .getHistoricalPerformanceDataList()) { + resultList.add(new ExtendedAirInterfaceHistoricalPerformanceType12(pmRecord, airConfiguration)); + } + } + } + } + LOG.debug("DBRead MWAirInterfacePac Id {} Records result: {}", mwAirInterfacePacuuId, resultList.size()); + return resultList; + } + + private List readTheHistoricalPerformanceDataOfEthernetContainer(Lp lp) { + + final String myName = "MWEthernetContainerPac"; + String uuId = lp.getUuid().getValue(); + + List resultList = new ArrayList<>(); + LOG.debug("DBRead Get {} : {}", mountPointNodeName, myName, uuId); + // ---- + UniversalId ethContainerPacuuId = new UniversalId(uuId); + // Step 2.2: construct data and the relative iid + InstanceIdentifier ethContainerIID = InstanceIdentifier + .builder(MwEthernetContainerPac.class, new MwEthernetContainerPacKey(ethContainerPacuuId)) + .child(EthernetContainerHistoricalPerformances.class).build(); + + // Step 2.3: read to the config data store + EthernetContainerHistoricalPerformances ethContainerHistoricalPerformanceData = GenericTransactionUtils + .readData(netconfNodeDataBroker, LogicalDatastoreType.OPERATIONAL, ethContainerIID); + + if (ethContainerHistoricalPerformanceData == null) { + LOG.debug("DBRead {} Id {} no HistoricalPerformances", myName, ethContainerPacuuId); + } else { + // import + // org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev170320.ethernet.container.historical.performances.g.HistoricalPerformanceDataList + List airHistPMList = ethContainerHistoricalPerformanceData + .getHistoricalPerformanceDataList(); + LOG.debug("DBRead {} Id {} Records intermediate: {}", myName, ethContainerPacuuId, airHistPMList.size()); + if (airHistPMList != null) { + for (ContainerHistoricalPerformanceTypeG pmRecord : airHistPMList) { + resultList.add(pmRecord); + } + } + } + LOG.debug("DBRead {} Id {} Records result: {}", myName, ethContainerPacuuId, resultList.size()); + return resultList; + } + + @Nonnull + private List readTheHistoricalPerformanceData(Lp lp) { + ONFLayerProtocolName lpName = ONFLayerProtocolName.valueOf(lp.getLayerProtocolName()); + + switch (lpName) { + case MWAirInterface: + return readTheHistoricalPerformanceDataOfMwAirInterfacePac(lp); + + case EthernetContainer12: + return readTheHistoricalPerformanceDataOfEthernetContainer(lp); + + case EthernetContainer10: + case EthernetPhysical: + case Ethernet: + case TDMContainer: + case Structure: + case Unknown: + LOG.debug("Do not read HistoricalPM data for {} {}", lpName, lp.getUuid().getValue()); + break; + } + return new ArrayList<>(); + } + + @Override + public AllPm getHistoricalPM() { + + synchronized (pmLock) { + if (pmLp != null) { + LOG.debug("Enter query PM"); + AllPm allPm = new AllPm(); + Lp lp = pmLp; + + List resultList = readTheHistoricalPerformanceData(lp); + LOG.debug("Got records: {}", resultList.size()); + // org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.g._874._1.model.rev170320.GranularityPeriodType + GranularityPeriodType granularityPeriod; + for (OtnHistoryDataG perf : resultList) { + + granularityPeriod = perf.getGranularityPeriod(); + if (granularityPeriod == null) { + granularityPeriod = GranularityPeriodType.Unknown; + } + + switch (granularityPeriod) { + case Period15Min: { + EsHistoricalPerformance15Minutes pm = new EsHistoricalPerformance15Minutes(mountPointNodeName, + lp).setHistoricalRecord15Minutes(perf); + allPm.add(pm); + } + break; + + case Period24Hours: { + EsHistoricalPerformance24Hours pm = new EsHistoricalPerformance24Hours(mountPointNodeName, lp) + .setHistoricalRecord24Hours(perf); + LOG.debug("Write 24h write to DB"); + allPm.add(pm); + } + break; + + default: + LOG.warn("Unknown granularity {}", perf.getGranularityPeriod()); + break; + + } + } + LOG.debug("Deliver normalized records: {}", allPm.size()); + return allPm; + } else { + LOG.debug("Deliver empty, no LTP"); + return AllPm.EMPTY; + } + } + } + + @Override + public void resetPMIterator() { + synchronized (pmLock) { + interfaceListIterator = interfaceList.iterator(); + } + LOG.debug("PM reset iterator"); + } + + @Override + public boolean hasNext() { + boolean res; + synchronized (pmLock) { + res = interfaceListIterator != null ? interfaceListIterator.hasNext() : false; + } + LOG.debug("PM hasNext LTP {}", res); + return res; + } + + @Override + public void next() { + synchronized (pmLock) { + pmLp = interfaceListIterator != null ? interfaceListIterator.next() : null; + } + LOG.debug("PM next LTP {}", pmLp.getLayerProtocolName().getValue()); + } + + @Override + public String pmStatusToString() { + StringBuffer res = new StringBuffer(); + synchronized (pmLock) { + res.append(pmLp == null ? "no interface" : pmLp.getLayerProtocolName().getValue()); + for (Lp lp : interfaceList) { + res.append("IF:"); + res.append(lp.getLayerProtocolName().getValue()); + res.append(" "); + } + } + return (res.toString()); + } + + /*------------------------------------------------------------ + * private function to access database + */ + + /*----------------------------------------------------------------------------- + * Reading problems for the networkElement V1.0 + */ + + private List readNetworkElementCurrentProblems10(List resultList) { + + LOG.info("DBRead Get {} NetworkElementCurrentProblems", mountPointNodeName); + + InstanceIdentifier networkElementCurrentProblemsIID = InstanceIdentifier + .builder( + org.opendaylight.yang.gen.v1.uri.onf.microwavemodel.networkelement.currentproblemlist.rev161120.NetworkElementCurrentProblems.class) + .build(); + + // Step 2.3: read to the config data store + org.opendaylight.yang.gen.v1.uri.onf.microwavemodel.networkelement.currentproblemlist.rev161120.NetworkElementCurrentProblems problems; + try { + problems = GenericTransactionUtils.readData(netconfNodeDataBroker, LogicalDatastoreType.OPERATIONAL, + networkElementCurrentProblemsIID); + if (problems == null) { + LOG.debug("DBRead no NetworkElementCurrentProblems"); + } else if (problems.getCurrentProblemList() == null) { + LOG.debug("DBRead empty CurrentProblemList"); + } else { + for (org.opendaylight.yang.gen.v1.uri.onf.microwavemodel.networkelement.currentproblemlist.rev161120.GenericCurrentProblemType problem : problems + .getCurrentProblemList()) { + resultList.add(new ProblemNotificationXml(mountPointNodeName, problem.getObjectIdRef(), + problem.getProblemName(), InternalSeverity.valueOf(problem.getProblemSeverity()), + problem.getSequenceNumber().toString(), + InternalDateAndTime.valueOf(problem.getTimeStamp()))); + } + } + } catch (Exception e) { + LOG.warn("DBRead {} NetworkElementCurrentProblems not supported. Message '{}' ", mountPointNodeName, + e.getMessage()); + } + return resultList; + } + + /*----------------------------------------------------------------------------- + * Reading problems for the networkElement V1.0 + */ + + private List readNetworkElementCurrentProblems12(List resultList) { + + LOG.info("DBRead Get {} NetworkElementCurrentProblems12", mountPointNodeName); + + InstanceIdentifier networkElementCurrentProblemsIID = InstanceIdentifier + .builder( + org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.onf.core.model.conditional.packages.rev170402.NetworkElementPac.class) + .build(); + + // Step 2.3: read to the config data store + NetworkElementPac problemPac; + NetworkElementCurrentProblems problems; + try { + problemPac = GenericTransactionUtils.readData(netconfNodeDataBroker, LogicalDatastoreType.OPERATIONAL, + networkElementCurrentProblemsIID); + problems = problemPac.getNetworkElementCurrentProblems(); + if (problems == null) { + LOG.debug("DBRead no NetworkElementCurrentProblems12"); + } else if (problems.getCurrentProblemList() == null) { + LOG.debug("DBRead empty CurrentProblemList12"); + } else { + for (org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.onf.core.model.conditional.packages.rev170402.network.element.current.problems.g.CurrentProblemList problem : problems + .getCurrentProblemList()) { + resultList.add(new ProblemNotificationXml(mountPointNodeName, problem.getObjectReference(), + problem.getProblemName(), InternalSeverity.valueOf(problem.getProblemSeverity()), + problem.getSequenceNumber().toString(), + InternalDateAndTime.valueOf(problem.getTimeStamp()))); + } + } + } catch (Exception e) { + LOG.warn("DBRead {} NetworkElementCurrentProblems12 not supported. Message '{}' ", mountPointNodeName, + e.getMessage()); + } + return resultList; + + } + + /*----------------------------------------------------------------------------- + * Reading problems for specific interface pacs + */ + + /** + * Generate ID + * + * @param interfacePacUuid + * for airinterface + * @return AirInterfaceCurrentProblemsIID + */ + private InstanceIdentifier getMWAirInterfacePacIId(UniversalId interfacePacUuid) { + InstanceIdentifier mwAirInterfaceIID = InstanceIdentifier + .builder(MwAirInterfacePac.class, new MwAirInterfacePacKey(interfacePacUuid)) + .child(AirInterfaceCurrentProblems.class).build(); + return mwAirInterfaceIID; + } + + /** + * Read problems of specific interfaces + * + * @param uuId + * Universal Id String of the interface + * @return number of alarms + */ + private List readTheFaultsOfMwAirInterfacePac(UniversalId interfacePacUuid, + List resultList) { + + final Class clazzPac = MwAirInterfacePac.class; + // final Class clazzPacKey = MwAirInterfacePacKey.class; + // final Class clazzProblems = + // AirInterfaceCurrentProblems.class; + // final Class clazzProblem = + // AirInterfaceCurrentProblemTypeG.class; + + LOG.info("DBRead Get problems for class {} from mountpoint {} for uuid {}", clazzPac.getSimpleName(), + mountPointNodeName, interfacePacUuid.getValue()); + + // Step 2.2: construct data and the relative iid + InstanceIdentifier mwAirInterfaceIID = InstanceIdentifier + .builder(MwAirInterfacePac.class, new MwAirInterfacePacKey(interfacePacUuid)) + .child(AirInterfaceCurrentProblems.class).build(); + + // Step 2.3: read to the config data store + AirInterfaceCurrentProblems problems = GenericTransactionUtils.readData(netconfNodeDataBroker, + LogicalDatastoreType.OPERATIONAL, mwAirInterfaceIID); + + if (problems == null) { + LOG.debug("DBRead Id {} no AirInterfaceCurrentProblems", interfacePacUuid); + } else if (problems.getCurrentProblemList() == null) { + LOG.debug("DBRead Id {} empty CurrentProblemList", interfacePacUuid); + } else { + for (AirInterfaceCurrentProblemTypeG problem : problems.getCurrentProblemList()) { + resultList.add(new ProblemNotificationXml(mountPointNodeName, interfacePacUuid.getValue(), + problem.getProblemName(), InternalSeverity.valueOf(problem.getProblemSeverity()), + problem.getSequenceNumber().toString(), InternalDateAndTime.valueOf(problem.getTimeStamp()))); + } + } + return resultList; + } + + /** + * Read problems of specific interfaces + * + * @param uuId + * Universal index of Interfacepac + * @return number of alarms + */ + private List readTheFaultsOfMwEthernetContainerPac(UniversalId interfacePacUuid, + List resultList) { + + final Class clazzPac = MwEthernetContainerPac.class; + // final Class clazzPacKey = + // MwEthernetContainerPacKey.class; + // final Class clazzProblems = + // EthernetContainerCurrentProblems.class; + // final Class clazzProblem = + // ContainerCurrentProblemTypeG.class; + + LOG.info("DBRead Get problems for class {} from mountpoint {} for uuid {}", clazzPac.getSimpleName(), + mountPointNodeName, interfacePacUuid.getValue()); + + InstanceIdentifier mwEthInterfaceIID = InstanceIdentifier + .builder(MwEthernetContainerPac.class, new MwEthernetContainerPacKey(interfacePacUuid)) + .child(EthernetContainerCurrentProblems.class).build(); + + EthernetContainerCurrentProblems problems = GenericTransactionUtils.readData(netconfNodeDataBroker, + LogicalDatastoreType.OPERATIONAL, mwEthInterfaceIID); + if (problems == null) { + LOG.debug("DBRead Id {} no EthernetContainerCurrentProblems", interfacePacUuid); + } else if (problems.getCurrentProblemList() == null) { + LOG.debug("DBRead Id {} empty CurrentProblemsList", interfacePacUuid); + } else { + for (ContainerCurrentProblemTypeG problem : problems.getCurrentProblemList()) { + resultList.add(new ProblemNotificationXml(mountPointNodeName, interfacePacUuid.getValue(), + problem.getProblemName(), InternalSeverity.valueOf(problem.getProblemSeverity()), + problem.getSequenceNumber().toString(), InternalDateAndTime.valueOf(problem.getTimeStamp()))); + } + } + return resultList; + } + + /** + * Read problems of specific interfaces + * + * @param uuId + * Universal index of Interfacepac + * @return number of alarms + */ + private List readTheFaultsOfMwAirInterfaceDiversityPac(UniversalId interfacePacUuid, + List resultList) { + + final Class clazzPac = MwAirInterfaceDiversityPac.class; + // final Class clazzPacKey = + // MwAirInterfaceDiversityPacKey.class; + final Class clazzProblems = AirInterfaceDiversityCurrentProblems.class; + // final Class clazzProblem = + // AirInterfaceDiversityCurrentProblemTypeG.class; + + LOG.info("DBRead Get problems for class {} from mountpoint {} for uuid {}", clazzPac.getSimpleName(), + mountPointNodeName, interfacePacUuid.getValue()); + + InstanceIdentifier mwEthInterfaceIID = InstanceIdentifier + .builder(clazzPac, new MwAirInterfaceDiversityPacKey(interfacePacUuid)).child(clazzProblems).build(); + + AirInterfaceDiversityCurrentProblems problems = GenericTransactionUtils.readData(netconfNodeDataBroker, + LogicalDatastoreType.OPERATIONAL, mwEthInterfaceIID); + if (problems == null) { + LOG.debug("DBRead Id {} no AirInterfaceDiversityCurrentProblems", interfacePacUuid); + } else if (problems.getCurrentProblemList() == null) { + LOG.debug("DBRead Id {} empty CurrentProblemList", interfacePacUuid); + } else { + for (AirInterfaceDiversityCurrentProblemTypeG problem : problems.getCurrentProblemList()) { + resultList.add(new ProblemNotificationXml(mountPointNodeName, interfacePacUuid.getValue(), + problem.getProblemName(), InternalSeverity.valueOf(problem.getProblemSeverity()), + problem.getSequenceNumber().toString(), InternalDateAndTime.valueOf(problem.getTimeStamp()))); + } + } + return resultList; + } + + /** + * Read problems of specific interfaces + * + * @param uuId + * Universal index of Interfacepac + * @return number of alarms + */ + private List readTheFaultsOfMwPureEthernetStructurePac(UniversalId interfacePacUuid, + List resultList) { + + final Class clazzPac = MwPureEthernetStructurePac.class; + // final Class clazzPacKey = + // MwPureEthernetStructurePacKey.class; + final Class clazzProblems = PureEthernetStructureCurrentProblems.class; + // final Class clazzProblem = + // StructureCurrentProblemTypeG.class; + + LOG.info("DBRead Get problems for class {} from mountpoint {} for uuid {}", clazzPac.getSimpleName(), + mountPointNodeName, interfacePacUuid.getValue()); + + InstanceIdentifier mwEthInterfaceIID = InstanceIdentifier + .builder(clazzPac, new MwPureEthernetStructurePacKey(interfacePacUuid)).child(clazzProblems).build(); + + PureEthernetStructureCurrentProblems problems = GenericTransactionUtils.readData(netconfNodeDataBroker, + LogicalDatastoreType.OPERATIONAL, mwEthInterfaceIID); + if (problems == null) { + LOG.debug("DBRead Id {} no PureEthernetStructureCurrentProblems", interfacePacUuid); + } else if (problems.getCurrentProblemList() == null) { + LOG.debug("DBRead Id {} empty CurrentProblemsList", interfacePacUuid); + } else { + for (StructureCurrentProblemTypeG problem : problems.getCurrentProblemList()) { + resultList.add(new ProblemNotificationXml(mountPointNodeName, interfacePacUuid.getValue(), + problem.getProblemName(), InternalSeverity.valueOf(problem.getProblemSeverity()), + problem.getSequenceNumber().toString(), InternalDateAndTime.valueOf(problem.getTimeStamp()))); + } + } + return resultList; + } + + /** + * Read problems of specific interfaces + * + * @param uuId + * Universal index of Interfacepac + * @return number of alarms + */ + private List readTheFaultsOfMwHybridMwStructurePac(UniversalId interfacePacUuid, + List resultList) { + + final Class clazzPac = MwHybridMwStructurePac.class; + // final Class clazzPacKey = + // MwHybridMwStructurePacKey.class; + final Class clazzProblems = HybridMwStructureCurrentProblems.class; + // final Class clazzProblem = + // HybridMwStructureCurrentProblemsG.class; + + LOG.info("DBRead Get problems for class {} from mountpoint {} for uuid {}", clazzPac.getSimpleName(), + mountPointNodeName, interfacePacUuid.getValue()); + + InstanceIdentifier mwEthInterfaceIID = InstanceIdentifier + .builder(clazzPac, new MwHybridMwStructurePacKey(interfacePacUuid)).child(clazzProblems).build(); + + HybridMwStructureCurrentProblems problems = GenericTransactionUtils.readData(netconfNodeDataBroker, + LogicalDatastoreType.OPERATIONAL, mwEthInterfaceIID); + if (problems == null) { + LOG.debug("DBRead Id {} no HybridMwStructureCurrentProblems", interfacePacUuid); + } else if (problems.getCurrentProblemList() == null) { + LOG.debug("DBRead Id {} empty CurrentProblemsList", interfacePacUuid); + } else { + for (StructureCurrentProblemTypeG problem : problems.getCurrentProblemList()) { + resultList.add(new ProblemNotificationXml(mountPointNodeName, interfacePacUuid.getValue(), + problem.getProblemName(), InternalSeverity.valueOf(problem.getProblemSeverity()), + problem.getSequenceNumber().toString(), InternalDateAndTime.valueOf(problem.getTimeStamp()))); + } + } + return resultList; + } + + /** + * Read problems of specific interfaces. TODO Goal for future implementation + * without usage of explicit new. Key is generated by newInstance() function + * here to verify this approach. + * + * @param uuId + * Universal index of Interfacepac + * @return number of alarms + * @throws SecurityException + * @throws NoSuchMethodException + * @throws InvocationTargetException + * @throws IllegalArgumentException + * @throws IllegalAccessException + * @throws InstantiationException + */ + private List readTheFaultsOfMwTdmContainerPac(UniversalId interfacePacUuid, + List resultList) { + + final Class clazzPac = MwTdmContainerPac.class; + final Class clazzPacKey = MwTdmContainerPacKey.class; + final Class clazzProblems = TdmContainerCurrentProblems.class; + // final Class clazzProblem = + // ContainerCurrentProblemTypeG.class; + + LOG.info("DBRead Get problems for class {} from mountpoint {} for uuid {}", clazzPac.getSimpleName(), + mountPointNodeName, interfacePacUuid.getValue()); + + try { + // -- Specific part 1 + Constructor cons = clazzPacKey.getConstructor(UniversalId.class); // Avoid new() + InstanceIdentifier mwEthInterfaceIID = InstanceIdentifier + .builder(clazzPac, cons.newInstance(interfacePacUuid)).child(clazzProblems).build(); + + // -- Specific part 2 + TdmContainerCurrentProblems problems = GenericTransactionUtils.readData(netconfNodeDataBroker, + LogicalDatastoreType.OPERATIONAL, mwEthInterfaceIID); + if (problems == null) { + LOG.debug("DBRead Id {} no TdmContainerCurrentProblems", interfacePacUuid); + } else if (problems.getCurrentProblemList() == null) { + LOG.debug("DBRead Id {} empty CurrentProblemsList", interfacePacUuid); + } else { + // -- Specific part 3 + for (ContainerCurrentProblemTypeG problem : problems.getCurrentProblemList()) { + resultList.add(new ProblemNotificationXml(mountPointNodeName, interfacePacUuid.getValue(), + problem.getProblemName(), InternalSeverity.valueOf(problem.getProblemSeverity()), + problem.getSequenceNumber().toString(), + InternalDateAndTime.valueOf(problem.getTimeStamp()))); + } + } + } catch (NoSuchMethodException | SecurityException | InstantiationException | IllegalAccessException + | IllegalArgumentException | InvocationTargetException e) { + LOG.warn("Could not reade instance of MwTdmContainerPacKey: ", e); + } + return resultList; + } + + private @Nullable Equipment readEquipmentPac(String interfacePacUuid) { + + return this.readEquipmentPac(new UniversalId(interfacePacUuid)); + } + + /** + * Read problems of specific interfaces + * + * @param interfacePacUuid + * Universal index of Equipmentpac + * @return Equipment or null + */ + private @Nullable Equipment readEquipmentPac(UniversalId interfacePacUuid) { + + final Class clazzPac = Equipment.class; + + LOG.info("DBRead Get problems for class {} from mountpoint {} for uuid {}", clazzPac.getSimpleName(), + mountPointNodeName, interfacePacUuid.getValue()); + + InstanceIdentifier equipmentIID = InstanceIdentifier + .builder(Equipment.class, new EquipmentKey(interfacePacUuid)).build(); + + Equipment res = GenericTransactionUtils.readData(netconfNodeDataBroker, LogicalDatastoreType.OPERATIONAL, + equipmentIID); + + return res; + } + + /** + * Remove all entries from list + */ + @Override + public int removeAllCurrentProblemsOfNode() { + return microwaveEventListener.removeAllCurrentProblemsOfNode(); + } + + /** + * Register the listener + */ + @Override + public void doRegisterMicrowaveEventListener(MountPoint mountPoint) { + LOG.info("End registration listener for Mountpoint {}", mountPoint.getIdentifier().toString()); + final Optional optionalNotificationService = mountPoint + .getService(NotificationService.class); + final NotificationService notificationService = optionalNotificationService.get(); + // notificationService.registerNotificationListener(microwaveEventListener); + listenerRegistrationresult = notificationService.registerNotificationListener(microwaveEventListener); + LOG.info("End registration listener for Mountpoint {} Listener: {} Result: {}", + mountPoint.getIdentifier().toString(), optionalNotificationService, listenerRegistrationresult); + } + + + +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/netconf/ONFCoreNetworkElementBase.java b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/netconf/ONFCoreNetworkElementBase.java new file mode 100644 index 00000000..b2d12d8b --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/netconf/ONFCoreNetworkElementBase.java @@ -0,0 +1,53 @@ +/** + * + */ +package org.opendaylight.mwtn.base.netconf; + +import org.opendaylight.controller.md.sal.binding.api.DataBroker; +import org.opendaylight.yang.gen.v1.uri.onf.microwavemodel.networkelement.currentproblemlist.rev161120.NetworkElementCurrentProblems; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * @author herbert + * + */ +public abstract class ONFCoreNetworkElementBase implements ONFCoreNetworkElementRepresentation { + + private static final Logger LOG = LoggerFactory.getLogger(ONFCoreNetworkElementBase.class); + + protected static final String EMPTY = ""; + + protected final String mountPointNodeName; + protected final DataBroker netconfNodeDataBroker; + protected final Capabilities capabilities; + protected final boolean isNetworkElementCurrentProblemsSupporting10; + + protected ONFCoreNetworkElementBase(String mountPointNodeName, + DataBroker netconfNodeDataBroker, + Capabilities capabilities ) { + LOG.info("Create ONFCoreNetworkElementBase"); + this.mountPointNodeName = mountPointNodeName; + this.netconfNodeDataBroker = netconfNodeDataBroker; + this.capabilities = capabilities; + + this.isNetworkElementCurrentProblemsSupporting10 = capabilities.isSupportingNamespace(NetworkElementCurrentProblems.QNAME); + + } + + @Override + public String getMountPointNodeName() { + return mountPointNodeName; + } + + /*----------------------------------------------------------------------------- + * Sychronization + */ + + @Override + public void initSynchronizationExtension() { + } + + + +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/netconf/ONFCoreNetworkElementFactory.java b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/netconf/ONFCoreNetworkElementFactory.java new file mode 100644 index 00000000..343f5a94 --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/netconf/ONFCoreNetworkElementFactory.java @@ -0,0 +1,68 @@ +package org.opendaylight.mwtn.base.netconf; + +import javax.annotation.Nullable; + +import org.opendaylight.controller.md.sal.binding.api.DataBroker; +import org.opendaylight.controller.md.sal.binding.api.ReadTransaction; +import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; +import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException; +import org.opendaylight.mwtn.devicemanager.impl.ProviderClient; +import org.opendaylight.mwtn.devicemanager.impl.database.service.HtDatabaseEventsService; +import org.opendaylight.mwtn.devicemanager.impl.xml.WebSocketServiceClient; +import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.NetconfNode; +import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.NetconfNodeConnectionStatus.ConnectionStatus; +import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.google.common.base.Optional; + +/** + * Create a Network Element representation according to the capability information. + * The capabilities are more than an ODL-QName. After the ? other terms than "revision" are provided. + * + */ +public class ONFCoreNetworkElementFactory { + + private static final Logger LOG = LoggerFactory.getLogger(ONFCoreNetworkElementFactory.class); + + public static ONFCoreNetworkElementRepresentation create( String mountPointNodeName, + DataBroker dataBroker, WebSocketServiceClient webSocketService, HtDatabaseEventsService databaseService, InstanceIdentifier instanceIdentifier, + DataBroker mountpointDataBroker, ProviderClient dcaeProvider, @Nullable ProviderClient aotsmClient ) { + + ReadTransaction tx=dataBroker.newReadOnlyTransaction(); + ONFCoreNetworkElementRepresentation res = null; + + try { + Optional nodeOption = tx.read(LogicalDatastoreType.OPERATIONAL,instanceIdentifier).checkedGet(); + if (nodeOption.isPresent()) { + Node node = nodeOption.get(); + NetconfNode nnode=node.getAugmentation(NetconfNode.class); + if (nnode != null) { + ConnectionStatus csts=nnode.getConnectionStatus(); + if (csts == ConnectionStatus.Connected) { + Capabilities capabilities = new Capabilities(nnode); + LOG.info("Mountpoint {} capabilities {}",mountPointNodeName, capabilities); + + res = ONFCoreNetworkElement10.build(mountPointNodeName, capabilities, mountpointDataBroker, webSocketService, databaseService, dcaeProvider,aotsmClient); + if (res == null) { + res = ONFCoreNetworkElement12.build(mountPointNodeName, capabilities, mountpointDataBroker, webSocketService, databaseService, dcaeProvider,aotsmClient); + } + } + } + } + } catch (ReadFailedException | IllegalArgumentException e) { + LOG.warn("Can not generate specific NE Version representation. ", e); + } + if (res == null) { + res = new ONFCoreEmpty(mountPointNodeName); + } + + LOG.info("Mointpoint {} started as {}", mountPointNodeName,res.getClass().getSimpleName() ); + + return res; + } + + +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/netconf/ONFCoreNetworkElementRepresentation.java b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/netconf/ONFCoreNetworkElementRepresentation.java new file mode 100644 index 00000000..b0c5590a --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/netconf/ONFCoreNetworkElementRepresentation.java @@ -0,0 +1,33 @@ +package org.opendaylight.mwtn.base.netconf; + +import org.opendaylight.controller.md.sal.binding.api.MountPoint; +import org.opendaylight.mwtn.base.internalTypes.InventoryInformation; +import org.opendaylight.mwtn.deviceMonitor.impl.DeviceMonitorSupport; + +public interface ONFCoreNetworkElementRepresentation extends DeviceMonitorSupport { + + public void initialReadFromNetworkElement(); + + public String getMountPointNodeName(); + + public void resetPMIterator(); + + public boolean hasNext(); + + public void next(); + + public AllPm getHistoricalPM(); + + public String pmStatusToString(); + + public int removeAllCurrentProblemsOfNode(); + + public void doRegisterMicrowaveEventListener(MountPoint mountPoint); + + public void initSynchronizationExtension(); + + public InventoryInformation getInventoryInformation(); + + public InventoryInformation getInventoryInformation(String layerProtocolFilter); + +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/netconf/ONFLayerProtocolName.java b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/netconf/ONFLayerProtocolName.java new file mode 100644 index 00000000..e04851fa --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/base/netconf/ONFLayerProtocolName.java @@ -0,0 +1,53 @@ +package org.opendaylight.mwtn.base.netconf; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public enum ONFLayerProtocolName { + + MWAirInterface("MWPS"), //V1.0 + V1.2 + EthernetContainer10("ETH-CTP"), //V1.0 + EthernetContainer12("ETC"), //V1.2 + EthernetPhysical("ETY"), //V1.2 + TDMContainer("TDM"), //V1.2 + Structure("MWS"), //V1.0 + V1.2 + Ethernet("ETH"), //V1.2 + Unknown(""); + + private static final Logger LOG = LoggerFactory.getLogger(ONFLayerProtocolName.class); + + private final String myLayerProtocolName; + + ONFLayerProtocolName( String myLayerProtocolName ) { + this.myLayerProtocolName = myLayerProtocolName; + } + + public boolean is( org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.core.model.rev170320.LayerProtocolName onfName ) { + return myLayerProtocolName.equals(onfName.getValue()); + } + + public boolean is( org.opendaylight.yang.gen.v1.uri.onf.coremodel.corenetworkmodule.typedefinitions.rev160710.LayerProtocolName onfName ) { + return myLayerProtocolName.equals(onfName.getValue()); + } + + public static ONFLayerProtocolName valueOf( org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.core.model.rev170320.LayerProtocolName onfName ) { + for (ONFLayerProtocolName protocol : ONFLayerProtocolName.values()) { + if (protocol.is(onfName)) { + return protocol; + } + } + LOG.info("Can not map {}. Use Unknown",onfName.getValue() ); + return Unknown; + } + + public static ONFLayerProtocolName valueOf( org.opendaylight.yang.gen.v1.uri.onf.coremodel.corenetworkmodule.typedefinitions.rev160710.LayerProtocolName onfName ) { + for (ONFLayerProtocolName protocol : ONFLayerProtocolName.values()) { + if (protocol.is(onfName)) { + return protocol; + } + } + LOG.info("Can not map {}. Use Unknown",onfName.getValue() ); + return Unknown; + } +} + diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/config/impl/AaiClientPropertiesFile.java b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/config/impl/AaiClientPropertiesFile.java new file mode 100644 index 00000000..46ffa635 --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/config/impl/AaiClientPropertiesFile.java @@ -0,0 +1,57 @@ +package org.opendaylight.mwtn.config.impl; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.Properties; + +public class AaiClientPropertiesFile{ + + private final File mFile; + private String mPCKS12CertFilename; + private String mPCKS12Passphrase; + private boolean mTrustInsecureSSL; + private String mApplicationIdentifier; + private String mRemoteUrl; + private int mConnectionTimeout; + private int mReadTimeout; + + public String getFilename() + { return this.mFile.getAbsolutePath(); } + public String getPCKS12CertFilename() + {return this.mPCKS12CertFilename;} + public String getPCKS12Passphrase() + {return this.mPCKS12Passphrase; } + public boolean trustInsecureSSL() + {return this.mTrustInsecureSSL;} + public String getApplicationIdentifier() + {return this.mApplicationIdentifier;} + public String getRemoteUrl() + {return this.mRemoteUrl;} + public int getConnectionTimeout() + {return this.mConnectionTimeout;} + public int getReadTimeout() + {return this.mReadTimeout;} + + public boolean exists() + {return this.mFile.exists();} + public AaiClientPropertiesFile(String filename) + { + this.mFile=new File(filename); + } + public void load() throws IOException,NumberFormatException + { + Properties defaultProps = new Properties(); + FileInputStream in = new FileInputStream(this.mFile); + defaultProps.load(in); + this.mPCKS12CertFilename=defaultProps.getProperty("org.onap.ccsdk.sli.adaptors.aai.ssl.key",null); + this.mPCKS12Passphrase=defaultProps.getProperty("org.onap.ccsdk.sli.adaptors.aai.ssl.key.psswd",null); + this.mTrustInsecureSSL=defaultProps.getProperty("org.onap.ccsdk.sli.adaptors.aai.host.certificate.ignore","false").equals("true"); + this.mApplicationIdentifier=defaultProps.getProperty("org.onap.ccsdk.sli.adaptors.aai.application",null); + this.mRemoteUrl=defaultProps.getProperty("org.onap.ccsdk.sli.adaptors.aai.uri",null); + this.mConnectionTimeout=Integer.parseInt(defaultProps.getProperty("connection.timeout","60000")); + this.mReadTimeout=Integer.parseInt(defaultProps.getProperty("read.timeout","60000")); + in.close(); + } + +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/config/impl/AaiConfig.java b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/config/impl/AaiConfig.java new file mode 100644 index 00000000..370860f7 --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/config/impl/AaiConfig.java @@ -0,0 +1,386 @@ +package org.opendaylight.mwtn.config.impl; + +import java.io.IOException; +import java.util.Base64; +import java.util.HashMap; +import java.util.Map; +import java.util.Map.Entry; + +import org.json.JSONArray; +import org.json.JSONException; +import org.opendaylight.mwtn.base.internalTypes.IniConfigurationFile; +import org.opendaylight.mwtn.base.internalTypes.IniConfigurationFile.ConfigurationException; +import org.opendaylight.mwtn.config.impl.HtDevicemanagerConfiguration.ISubConfigHandler; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class AaiConfig extends BaseSubConfig { + + private static final Logger LOG = LoggerFactory.getLogger(AaiConfig.class); + + private static final String SECTION_MARKER_AAI = "aai"; + + private static final String PROPERTY_KEY_AAIPROP_FILE ="aaiPropertiesFile"; + private static final String PROPERTY_KEY_BASEURL = "aaiUrl"; + private static final String PROPERTY_KEY_USERCREDENTIALS = "aaiUserCredentials"; + private static final String PROPERTY_KEY_HEADERS = "aaiHeaders"; + private static final String PROPERTY_KEY_DELETEONMOUNTPOINTREMOVED = "aaiDeleteOnMountpointRemove"; + private static final String PROPERTY_KEY_TRUSTALLCERTS = "aaiTrustAllCerts"; + private static final String PROPERTY_KEY_APIVERSION = "aaiApiVersion"; + private static final String PROPERTY_KEY_PCKS12CERTFILENAME = "aaiPcks12ClientCertFile"; + private static final String PROPERTY_KEY_PCKS12PASSPHRASE = "aaiPcks12ClientCertPassphrase"; + private static final String PROPERTY_KEY_CONNECTIONTIMEOUT = "aaiClientConnectionTimeout"; + private static final String PROPERTY_KEY_APPLICATIONID = "aaiApplicationId"; + + private static final String DEFAULT_VALUE_AAIPROP_FILE ="null"; + private static final String DEFAULT_VALUE_BASEURL = "off"; + private static final String DEFAULT_VALUE_APPLICATION = "SDNR"; + private static final String DEFAULT_VALUE_USERNAME = ""; + private static final String DEFAULT_VALUE_USERPASSWORD = ""; + private static final String DEFAULT_VALUE_USERCREDENTIALS = ""; + private static final String DEFAULT_VALUE_HEADERS = "[\"X-TransactionId: 9999\"]"; + private static final boolean DEFAULT_VALUE_DELETEONMOUNTPOINTREMOVED = false; + private static final boolean DEFAULT_VALUE_TRUSTALLCERTS = false; + private static final int DEFAULT_VALUE_CONNECTION_TIMEOUT = 30000; //in ms + private static final String DEFAULT_VALUE_APIVERSION = "aai/v13"; + private static final String DEFAULT_VALUE_PCKS12CERTFILENAME =""; + private static final String DEFAULT_VALUE_PCKS12PASSPHRASE = ""; + private static final String DEFAULT_VALUE_APPLICATIONID = "SDNR"; + + private static final String HEADER_KEY_APPLICATION = "X-FromAppId"; + + + private static AaiConfig aaiConfig; + + private String aaiPropFile; + private String baseUrl; + private String apiVersion; + private String applicationIdentifier; + private String username; + private String password; + private String pcks12CertificateFilename; + private String pcks12CertificatePassphrase; + private int connectionTimeout; + private boolean deleteOnMountPointRemoved; + private boolean trustAllCerts; + + public boolean doDeleteOnMountPointRemoved() { + return this.deleteOnMountPointRemoved; + } + + private Map headers; + + + private AaiConfig() { + super(); + this.aaiPropFile = DEFAULT_VALUE_AAIPROP_FILE; + this.apiVersion=DEFAULT_VALUE_APIVERSION; + this.applicationIdentifier = DEFAULT_VALUE_APPLICATION; + this.baseUrl = DEFAULT_VALUE_BASEURL; + this.username = DEFAULT_VALUE_USERNAME; + this.password = DEFAULT_VALUE_USERPASSWORD; + this.deleteOnMountPointRemoved = DEFAULT_VALUE_DELETEONMOUNTPOINTREMOVED; + this.trustAllCerts=DEFAULT_VALUE_TRUSTALLCERTS; + this.applicationIdentifier=DEFAULT_VALUE_APPLICATIONID; + } + + /* + * private void change(AaiConfig cfg) { this.baseUrl=cfg.baseUrl; + * this.username=cfg.username; this.password=cfg.password; + * this.deleteOnMountPointRemoved=cfg.deleteOnMountPointRemoved; } + */ + public AaiConfig(IniConfigurationFile config, ISubConfigHandler configHandler) throws ConfigurationException { + this(config, configHandler, true); + } + + public AaiConfig(IniConfigurationFile config, ISubConfigHandler configHandler, boolean save) + throws ConfigurationException { + super(config, configHandler, SECTION_MARKER_AAI); + // load + this.aaiPropFile=this.getString(PROPERTY_KEY_AAIPROP_FILE, ""); + AaiClientPropertiesFile aaiProperties = new AaiClientPropertiesFile(this.aaiPropFile); + String defBaseUrl=DEFAULT_VALUE_BASEURL; + String defPCKSCertFilename=DEFAULT_VALUE_PCKS12CERTFILENAME; + String defPCKSPassphrase=DEFAULT_VALUE_PCKS12PASSPHRASE; + String defApplicationId=DEFAULT_VALUE_APPLICATION; + int defconnectionTimeout=DEFAULT_VALUE_CONNECTION_TIMEOUT; + boolean loaded=false; + if(aaiProperties.exists()) + { + LOG.debug("found another aaiclient.properties file"); + try + { + aaiProperties.load(); + loaded=true; + LOG.debug("loaded successfully"); + } + catch(IOException|NumberFormatException e) + { + LOG.warn("problem loading external properties file "+aaiProperties.getFilename()+": "+e.getMessage()); + } + if(loaded) //preload new default values + { + String value; + value = aaiProperties.getRemoteUrl(); + if (value != null) + defBaseUrl = value; + value = aaiProperties.getPCKS12CertFilename(); + if (value != null) + defPCKSCertFilename = value; + value = aaiProperties.getPCKS12Passphrase(); + if (value != null) + defPCKSPassphrase = value; + value = aaiProperties.getApplicationIdentifier(); + if (value != null) + defApplicationId = value; + } + } + else + LOG.debug("no aaiclient.properties file found"); + + + this.baseUrl = this.getString(PROPERTY_KEY_BASEURL, defBaseUrl); + this.apiVersion=this.getString(PROPERTY_KEY_APIVERSION,DEFAULT_VALUE_APIVERSION); + String credentials = this.getString(PROPERTY_KEY_USERCREDENTIALS, DEFAULT_VALUE_USERCREDENTIALS); + if (credentials.contains(":")) { + try { + this.username = credentials.split(":")[0]; + this.password = credentials.split(":")[1]; + } catch (Exception e) { + this.username = DEFAULT_VALUE_USERNAME; + this.password = DEFAULT_VALUE_USERPASSWORD; + } + } else { + this.username = DEFAULT_VALUE_USERNAME; + this.password = DEFAULT_VALUE_USERPASSWORD; + } + this.headers = _parseHeadersMap(this.getString(PROPERTY_KEY_HEADERS, DEFAULT_VALUE_HEADERS)); + this.applicationIdentifier = this.getString(PROPERTY_KEY_APPLICATIONID, defApplicationId); + this.pcks12CertificateFilename=this.getString(PROPERTY_KEY_PCKS12CERTFILENAME, defPCKSCertFilename); + this.pcks12CertificatePassphrase=this.getString(PROPERTY_KEY_PCKS12PASSPHRASE, defPCKSPassphrase); + this.connectionTimeout = this.getInt(PROPERTY_KEY_CONNECTIONTIMEOUT, defconnectionTimeout); + this.deleteOnMountPointRemoved = this.getBoolean(PROPERTY_KEY_DELETEONMOUNTPOINTREMOVED, + DEFAULT_VALUE_DELETEONMOUNTPOINTREMOVED); + this.trustAllCerts = this.getBoolean(PROPERTY_KEY_TRUSTALLCERTS, DEFAULT_VALUE_TRUSTALLCERTS); + + boolean missing=(!this.hasKey(PROPERTY_KEY_APPLICATIONID))|| (!this.hasKey(PROPERTY_KEY_CONNECTIONTIMEOUT))|| + (!this.hasKey(PROPERTY_KEY_TRUSTALLCERTS)) || (!this.hasKey(PROPERTY_KEY_PCKS12CERTFILENAME)) || + (!this.hasKey(PROPERTY_KEY_PCKS12PASSPHRASE)); + if(missing) + LOG.debug("some params missing in config file"); + //re-save if external aaiproperties file changed to show that params are submitted internally + if(missing || (aaiConfig!=null && aaiConfig!=this && ( + !propertyEquals(aaiConfig.aaiPropFile, this.aaiPropFile) || + !propertyEquals(aaiConfig.pcks12CertificateFilename, this.pcks12CertificateFilename) || + !propertyEquals(aaiConfig.pcks12CertificatePassphrase, this.pcks12CertificatePassphrase) || + !propertyEquals(aaiConfig.connectionTimeout, this.connectionTimeout) + + ))) + { + LOG.debug("force saving because of reload changes from remote file"); + save=true; + } + if (save) { + config.setProperty(SECTION_MARKER_AAI + "." + PROPERTY_KEY_BASEURL, this.baseUrl); + config.setProperty(SECTION_MARKER_AAI + "." + PROPERTY_KEY_USERCREDENTIALS, + (nullorempty(this.username) && nullorempty(this.password))?"":(this.username + ":" + this.password)); + config.setProperty(SECTION_MARKER_AAI + "." + PROPERTY_KEY_HEADERS, _printHeadersMap(this.headers)); + config.setProperty(SECTION_MARKER_AAI + "." + PROPERTY_KEY_DELETEONMOUNTPOINTREMOVED, + this.deleteOnMountPointRemoved); + config.setProperty(SECTION_MARKER_AAI + "." + PROPERTY_KEY_TRUSTALLCERTS, this.trustAllCerts); + config.setProperty(SECTION_MARKER_AAI+"."+PROPERTY_KEY_AAIPROP_FILE, this.aaiPropFile); + config.setProperty(SECTION_MARKER_AAI+"."+PROPERTY_KEY_APIVERSION,this.apiVersion); + config.setProperty(SECTION_MARKER_AAI+"."+PROPERTY_KEY_APPLICATIONID, this.applicationIdentifier); + config.setProperty(SECTION_MARKER_AAI+"."+PROPERTY_KEY_CONNECTIONTIMEOUT, this.connectionTimeout); + /*if(this.pcks12CertificateFilename !=null && !this.pcks12CertificateFilename.isEmpty() && + this.pcks12CertificatePassphrase!=null && !this.pcks12CertificatePassphrase.isEmpty())*/ + { + LOG.debug("no client credentials to save"); + config.setProperty(SECTION_MARKER_AAI+"."+PROPERTY_KEY_PCKS12CERTFILENAME, this.pcks12CertificateFilename); + config.setProperty(SECTION_MARKER_AAI+"."+PROPERTY_KEY_PCKS12PASSPHRASE, this.pcks12CertificatePassphrase); + } + LOG.debug("save"); + this.save(); + } + } + + private boolean nullorempty(String s) { + return s==null || s.isEmpty(); + } + + public boolean isOff() { + return this.baseUrl == null || this.baseUrl.toLowerCase().equals("off"); + } + + private static boolean propertyEquals(final Object p1,final Object p2) + { + return (p1==null && (p2==null) || p1.equals(p2)); + } + private static boolean propertyEquals(final boolean p1,final boolean p2) + { + return p1==p2; + } + private static boolean propertyEquals(final int p1,final int p2) + { + return p1==p2; + } + @Override + public boolean equals(Object obj) { + if (obj instanceof AaiConfig) { + AaiConfig cobj = (AaiConfig) obj; + if(!AaiConfig.propertyEquals(cobj.baseUrl, this.baseUrl)) + return false; + if(!AaiConfig.propertyEquals(cobj.apiVersion, this.apiVersion)) + return false; + if(!AaiConfig.propertyEquals(cobj.username, this.username)) + return false; + if(!AaiConfig.propertyEquals(cobj.password, this.password)) + return false; + if(!AaiConfig.propertyEquals(cobj.deleteOnMountPointRemoved, this.deleteOnMountPointRemoved)) + return false; + if(!AaiConfig.propertyEquals(cobj.headers, this.headers)) + return false; + if(!AaiConfig.propertyEquals(cobj.trustAllCerts, this.trustAllCerts)) + return false; + if(!AaiConfig.propertyEquals(cobj.aaiPropFile, this.aaiPropFile)) + return false; + if(!AaiConfig.propertyEquals(cobj.connectionTimeout, this.connectionTimeout)) + return false; + if(!AaiConfig.propertyEquals(cobj.pcks12CertificateFilename, this.pcks12CertificateFilename)) + return false; + if(!AaiConfig.propertyEquals(cobj.pcks12CertificatePassphrase, this.pcks12CertificatePassphrase)) + return false; + if(!AaiConfig.propertyEquals(cobj.applicationIdentifier, this.applicationIdentifier)) + return false; + + /* + if (!((cobj.baseUrl == null && this.baseUrl == null) || cobj.baseUrl.equals(this.baseUrl))) + return false; + if (!((cobj.apiVersion == null && this.apiVersion == null) || cobj.apiVersion.equals(this.apiVersion))) + return false; + if (!((cobj.username == null && this.username == null) || cobj.username.equals(this.username))) + return false; + if (!((cobj.password == null && this.password == null) || cobj.password.equals(this.password))) + return false; + if (!(cobj.deleteOnMountPointRemoved != this.deleteOnMountPointRemoved)) + return false; + if (!((cobj.headers == null && this.headers == null) || cobj.headers.equals(this.headers))) + return false; + if (!(cobj.trustAllCerts != this.trustAllCerts)) + return false; +*/ + return true; + } + return super.equals(obj); + } + + public String getBaseUrl() { + String url=this.baseUrl; + if(!url.endsWith("/")) + url+="/"; + if(this.apiVersion.startsWith("/")) + this.apiVersion=this.apiVersion.substring(1); + return url+this.apiVersion; + } + + public Map getHeaders() { + if (this.headers == null) + this.headers = new HashMap(); + this.headers.put(HEADER_KEY_APPLICATION, this.applicationIdentifier); + String s = this.headers.getOrDefault("Authorization", null); + if (nullorempty(s) && !nullorempty(this.username) && !nullorempty(this.password)) { + this.headers.put("Authorization", "Basic " + + new String(Base64.getEncoder().encode((this.username + ":" + this.password).getBytes()))); + } + return this.headers; + } + + @Override + public String toString() { + return "AaiConfig [aaiPropFile=" + aaiPropFile + ", baseUrl=" + baseUrl + ", apiVersion=" + apiVersion + + ", applicationIdentifier=" + applicationIdentifier + ", username=" + username + ", password=" + + password + ", pcks12CertificateFilename=" + pcks12CertificateFilename + + ", pcks12CertificatePassphrase=" + pcks12CertificatePassphrase + ", connectionTimeout=" + + connectionTimeout + ", deleteOnMountPointRemoved=" + deleteOnMountPointRemoved + ", trustAllCerts=" + + trustAllCerts + ", headers=" + this.getHeaders() + "]"; + } + + private static String _printHeadersMap(Map headers) { + String r = "["; + if (headers != null) { + int i = 0; + for (Entry entry : headers.entrySet()) { + if (i > 0) + r += ","; + r += "\"" + entry.getKey() + ":" + entry.getValue() + "\""; + i++; + } + } + r += "]"; + return r; + } + + private static Map _parseHeadersMap(String s) throws JSONException { + Map r = new HashMap(); + JSONArray a = new JSONArray(s); + if (a != null && a.length() > 0) { + for (int i = 0; i < a.length(); i++) { + String item = a.getString(i); + String[] hlp = item.split(":"); + if (hlp.length > 1) { + r.put(hlp[0], hlp[1]); + } + } + } + return r; + } + + public static boolean isInstantiated() { + return aaiConfig != null; + } + + public static AaiConfig getDefaultConfiguration() { + return new AaiConfig(); + } + + public static AaiConfig getAai(IniConfigurationFile config, ISubConfigHandler configHandler) { + if (aaiConfig == null) + try { + aaiConfig = new AaiConfig(config, configHandler); + } catch (ConfigurationException e) { + aaiConfig = AaiConfig.getDefaultConfiguration(); + } + return aaiConfig; + } + + public static AaiConfig reload() { + if (aaiConfig == null) + return null; + AaiConfig tmpConfig; + try { + tmpConfig = new AaiConfig(aaiConfig.getConfig(), aaiConfig.getConfigHandler(), false); + } catch (ConfigurationException e) { + tmpConfig = AaiConfig.getDefaultConfiguration(); + LOG.warn("problem loading config: "+e.getMessage()); + } + aaiConfig = tmpConfig; + return aaiConfig; + } + + public boolean getTrustAll() { + return this.trustAllCerts; + } + + public String getPcks12CertificateFilename() { + return this.pcks12CertificateFilename; + } + + public String getPcks12CertificatePassphrase() { + return this.pcks12CertificatePassphrase; + } + + public int getConnectionTimeout() { + return this.connectionTimeout; + } + +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/config/impl/AkkaConfig.java b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/config/impl/AkkaConfig.java new file mode 100644 index 00000000..7f430a35 --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/config/impl/AkkaConfig.java @@ -0,0 +1,260 @@ +package org.opendaylight.mwtn.config.impl; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.typesafe.config.Config; +import com.typesafe.config.ConfigFactory; + +public class AkkaConfig { + + private static final Logger LOG = LoggerFactory.getLogger(AkkaConfig.class); + + public static class ClusterNodeInfo { + @Override + public String toString() { + return "ClusterNodeInfo [protocol=" + protocol + ", clusterName=" + clusterName + ", remoteAdr=" + remoteAdr + + ", port=" + port + "]"; + } + + private final String protocol; + private final String clusterName; + private final String remoteAdr; + private final int port; + + public String getRemoteAddress() { + return this.remoteAdr; + } + + public ClusterNodeInfo(String s) throws Exception { + final String regex = "([a-z.]*):\\/\\/([a-zA-Z0-9-]*)@([a-zA-Z0-9.-]*):([0-9]*)"; + final Pattern pattern = Pattern.compile(regex); + final Matcher matcher = pattern.matcher(s); + if (!matcher.find()) + throw new Exception("invalid seedNode format"); + this.protocol = matcher.group(1); + this.clusterName = matcher.group(2); + this.remoteAdr = matcher.group(3); + this.port = Integer.parseInt(matcher.group(4)); + } + + public ClusterNodeInfo(String protocol, String clustername, String remoteadr, int port) { + this.protocol=protocol; + this.clusterName=clustername; + this.remoteAdr=remoteadr; + this.port=port; + } + + public static ClusterNodeInfo defaultSingleNodeInfo() { + return new ClusterNodeInfo("akka.tcp","opendaylight-cluster-data","127.0.0.1",2550); + } + } + + public static class ClusterRoleInfo { + private final String Role; + private final int Index; + + public ClusterRoleInfo(String s) throws Exception { + final String regex = "([a-zA-Z]*)-([0-9]*)"; + final Pattern pattern = Pattern.compile(regex); + final Matcher matcher = pattern.matcher(s); + if (!matcher.find()) + throw new Exception("unexpected role format:"+s); + this.Role = matcher.group(1); + this.Index = Integer.parseInt(matcher.group(2)); + } + + private ClusterRoleInfo(String role, int idx) { + this.Role=role; + this.Index=idx; + } + + @Override + public boolean equals(Object obj) { + if(obj instanceof ClusterRoleInfo) + return ((ClusterRoleInfo)obj).Index== this.Index && ((ClusterRoleInfo)obj).Role.equals(this.Role); + return super.equals(obj); + } + public static ClusterRoleInfo defaultSingleNodeRole() { + return new ClusterRoleInfo("member",1); + } + @Override + public String toString() { + return "ClusterRoleInfo [Role=" + Role + ", Index=" + Index + "]"; + } + } + public static class ClusterRoleInfoCollection extends ArrayList + { + private static final long serialVersionUID = 1L; + public ClusterRoleInfo get(String role) + { + for(ClusterRoleInfo info:this) + { + if(info.Role.equals(role)) + return info; + } + return null; + } + public boolean contains(ClusterRoleInfo info) + { + if(info==null) + return false; + for(ClusterRoleInfo i:this) + { + if(i.equals(info)) + return true; + } + return false; + } + } + public static class ClusterConfig { + @Override + public String toString() { + return "ClusterConfig [seedNodes=" + seedNodes + ", roles=" + roles + "]"; + } + + private final List seedNodes; + private final ClusterRoleInfoCollection roles; + private ClusterNodeInfo ismeInfo; + + public static ClusterConfig defaultSingleNodeConfig() + { + ClusterConfig cfg=new ClusterConfig(); + cfg.ismeInfo=ClusterNodeInfo.defaultSingleNodeInfo(); + cfg.seedNodes.add(cfg.ismeInfo); + cfg.roles.add(ClusterRoleInfo.defaultSingleNodeRole()); + return cfg; + } + private ClusterConfig() + { + this.seedNodes = new ArrayList(); + this.roles = new ClusterRoleInfoCollection(); + + } + public ClusterConfig(Config o) throws Exception { + { + this.seedNodes = new ArrayList(); + this.roles = new ClusterRoleInfoCollection(); + List a = o.getStringList("seed-nodes"); + for (int i = 0; i < a.size(); i++) { + ClusterNodeInfo info = new ClusterNodeInfo(a.get(i)); + this.seedNodes.add(info); + } + a = o.getStringList("roles"); + for (int i = 0; i < a.size(); i++) { + ClusterRoleInfo s = new ClusterRoleInfo(a.get(i)); + this.roles.add(s); + } + int idx = this.roles.get(0).Index - 1; + if (idx >= 0 && idx < this.seedNodes.size()) + this.ismeInfo = this.seedNodes.get(idx); + else + this.ismeInfo = null; + } + + } + + public boolean isCluster() { + return this.seedNodes != null ? this.seedNodes.size() > 1 : false; + } + + public boolean isMe(ClusterNodeInfo i) { + return this.ismeInfo != null ? this.ismeInfo.equals(i) : false; + } + + public List getSeedNodes() { + return this.seedNodes; + } + + public String getHostName(String defaultValue) { + if (getRoleMemberIndex() > 0 && getRoleMemberIndex() <= seedNodes.size()) + return this.seedNodes.get(getRoleMemberIndex()-1).remoteAdr; + else { + LOG.warn("Seednode not available for roleMemberIndex {}. Using default {}",getRoleMember(), defaultValue); + return defaultValue; + } + } + + public String getDBClusterName(String defaultValue) { + String r = null; + if (this.seedNodes != null && this.seedNodes.size() > 0) { + r = String.format("cluster-%s.%d", this.seedNodes.get(0).remoteAdr, this.seedNodes.get(0).port); + } + if (r == null || r.isEmpty()) + r = defaultValue; + return r; + } + + public int getRoleMemberIndex() { + + ClusterRoleInfo role=this.roles.get("member"); + return role!=null?role.Index:0; + } + public ClusterRoleInfo getRoleMember() { + return this.roles.get("member"); + } + } + + private static final String DEFAULT_FILENAME = "configuration/initial/akka.conf"; + private final String filename; + private ClusterConfig cluserConfig; + + public ClusterConfig getClusterConfig() { + return this.cluserConfig; + } + + private AkkaConfig(String filename) { + this.filename = filename; + } + + public AkkaConfig() { + this(null); + } + + @Override + public String toString() { + return "AkkaConfig [filename=" + filename + ", cluserConfig=" + cluserConfig + "]"; + } + + private void loadFromFile() throws Exception { + Config cfg = ConfigFactory.parseFile(new File(this.filename)); + this.cluserConfig = new ClusterConfig(cfg.getConfig("odl-cluster-data").getConfig("akka").getConfig("cluster")); + } + + public boolean isCluster() { + return this.cluserConfig != null ? this.cluserConfig.isCluster() : false; + } + + public static AkkaConfig load() throws Exception { + return load(DEFAULT_FILENAME); + } + + public static AkkaConfig load(String filename) throws Exception { + AkkaConfig cfg = new AkkaConfig(filename); + cfg.loadFromFile(); + return cfg; + } + + public boolean isSingleNode() { + return !this.isCluster(); + } + public static AkkaConfig defaultSingleNodeConfig() + { + AkkaConfig cfg=new AkkaConfig(); + cfg.cluserConfig=new ClusterConfig(); + return cfg; + } + + public static AkkaConfig parse(String content) throws Exception { + Config cfg = ConfigFactory.parseString(content); + AkkaConfig c=new AkkaConfig(); + c.cluserConfig=new ClusterConfig(cfg.getConfig("odl-cluster-data").getConfig("akka").getConfig("cluster")); + return c; + } +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/config/impl/BaseSubConfig.java b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/config/impl/BaseSubConfig.java new file mode 100644 index 00000000..df6b72bf --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/config/impl/BaseSubConfig.java @@ -0,0 +1,91 @@ +package org.opendaylight.mwtn.config.impl; + +import org.opendaylight.mwtn.base.internalTypes.IniConfigurationFile; +import org.opendaylight.mwtn.base.internalTypes.IniConfigurationFile.ConversionException; +import org.opendaylight.mwtn.base.internalTypes.IniConfigurationFile.Section; +import org.opendaylight.mwtn.config.impl.HtDevicemanagerConfiguration.ISubConfigHandler; + +public class BaseSubConfig { + + + private final Section subconfig; + private final ISubConfigHandler configHandler; + private final IniConfigurationFile config; + protected Section getSubConfig() { + return this.subconfig; + } + protected ISubConfigHandler getConfigHandler() { + return this.configHandler; + } + protected IniConfigurationFile getConfig() { + return this.config; + } + public BaseSubConfig() + { + this.config=null; + this.subconfig=null; + this.configHandler=null; + } + public BaseSubConfig(IniConfigurationFile config, ISubConfigHandler configHandler,String section) { + this.config = config; + this.subconfig = config.subset(section); + this.configHandler = configHandler; + } + protected boolean hasKey(String key) + { + if(this.subconfig==null) + return false; + return this.subconfig.hasKey(key); + } + protected String getString(String key,String def) + { + if(this.subconfig==null) + return def; + String s; + //try + { + s=this.subconfig.getString(key, def); + if(s.isEmpty()) + s=def; + } + /*catch(ConversionException e) + { + s=def; + } + */ + return s; + } + protected boolean getBoolean(String key, boolean def) { + if(this.subconfig==null) + return def; + boolean s; + try { + s=this.subconfig.getBoolean(key, def); + } + catch(ConversionException e) + { + s=def; + } + return s; + } + protected int getInt(String key, int def) { + if(this.subconfig==null) + return def; + int s; + try { + s=this.subconfig.getInt(key, def); + } + catch(ConversionException e) + { + s=def; + } + return s; + } + protected void save() + { + if(this.configHandler!=null) + this.configHandler.save(); + } + + +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/config/impl/DcaeConfig.java b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/config/impl/DcaeConfig.java new file mode 100644 index 00000000..fa12ede9 --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/config/impl/DcaeConfig.java @@ -0,0 +1,146 @@ +package org.opendaylight.mwtn.config.impl; + +import org.opendaylight.mwtn.base.internalTypes.IniConfigurationFile; +import org.opendaylight.mwtn.base.internalTypes.IniConfigurationFile.ConfigurationException; +import org.opendaylight.mwtn.config.impl.HtDevicemanagerConfiguration.ISubConfigHandler; + +public class DcaeConfig extends BaseSubConfig { + private static final String SECTION_MARKER_DCAE = "dcae"; + + private static final String PROPERTY_KEY_EVENTRECEIVERURL = "dcaeUrl"; + //private static final String PROPERTY_KEY_TESTCOLLECTOR = "dcaeTestCollector"; + private static final String PROPERTY_KEY_USERCREDENTIALS = "dcaeUserCredentials"; + private static final String PROPERTY_KEY_TIMERPERIOD = "dcaeHeartbeatPeriodSeconds"; + + private static final String DEFAULT_VALUE_EVENTRECEIVERURL = "off"; + private static final String DEFAULT_VALUE_TESTCOLLECTOR = "no"; + private static final String DEFAULT_VALUE_USERCREDENTIALS = "admin:admin"; + private static final int DEFAULT_VALUE_TIMERPERIOD = 120; + + private static DcaeConfig dcaeConfig = null; // Singleton of configuration data + + private String eventReceiverUrl; + private String userCredentials; + private Integer timerPeriodSeconds; + + private DcaeConfig() { + super(); + this.eventReceiverUrl = DEFAULT_VALUE_EVENTRECEIVERURL; + this.userCredentials = DEFAULT_VALUE_USERCREDENTIALS; + this.timerPeriodSeconds = DEFAULT_VALUE_TIMERPERIOD; + } + + private DcaeConfig(IniConfigurationFile config, ISubConfigHandler configHandler) throws ConfigurationException { + this(config, configHandler, true); + } + + private DcaeConfig(IniConfigurationFile config, ISubConfigHandler configHandler, boolean save) + throws ConfigurationException { + + super(config, configHandler, SECTION_MARKER_DCAE); + + this.eventReceiverUrl = this.getString(PROPERTY_KEY_EVENTRECEIVERURL, DEFAULT_VALUE_EVENTRECEIVERURL); + this.userCredentials = this.getString(PROPERTY_KEY_USERCREDENTIALS, DEFAULT_VALUE_USERCREDENTIALS); + this.timerPeriodSeconds = this.getInt(PROPERTY_KEY_TIMERPERIOD, DEFAULT_VALUE_TIMERPERIOD); + if (save) { + config.setProperty(SECTION_MARKER_DCAE + "." + PROPERTY_KEY_EVENTRECEIVERURL, this.eventReceiverUrl); + config.setProperty(SECTION_MARKER_DCAE + "." + PROPERTY_KEY_USERCREDENTIALS, this.userCredentials); + config.setProperty(SECTION_MARKER_DCAE + "." + PROPERTY_KEY_TIMERPERIOD, this.timerPeriodSeconds); + + this.save(); + } + } + + /* + * Setter + */ + + public void setEventReceiverUrl(String eventReveicerUrl) { + this.eventReceiverUrl = eventReveicerUrl; + } + + public void setUserCredentials(String userCredentials) { + this.userCredentials = userCredentials; + } + + + + public void setTimerPeriodSeconds(Integer timerPeriodSeconds) { + this.timerPeriodSeconds = timerPeriodSeconds; + } + + /* + * Getter + */ + + public String getEventReveicerUrl() { + return eventReceiverUrl; + } + + public String getUserCredentials() { + return userCredentials; + } + + + public Integer getTimerPeriodSeconds() { + return timerPeriodSeconds; + } + + @Override + public String toString() { + return "DcaeConfig [eventReceiverUrl=" + eventReceiverUrl + ", userCredentials=" + userCredentials + + ", timerPeriodSeconds=" + timerPeriodSeconds + "]"; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof DcaeConfig) { + DcaeConfig cobj = (DcaeConfig) obj; + if (!((cobj.eventReceiverUrl == null && this.eventReceiverUrl == null) + || cobj.eventReceiverUrl.equals(this.eventReceiverUrl))) + return false; + if (!((cobj.userCredentials == null && this.userCredentials == null) + || cobj.userCredentials.equals(this.userCredentials))) + return false; + if (cobj.timerPeriodSeconds != this.timerPeriodSeconds) + return false; + return true; + } + return super.equals(obj); + } + + /*------------------------------------- + * static Functions + */ + + public static DcaeConfig getDefaultConfiguration() { + return (new DcaeConfig()); + } + + public static DcaeConfig getDcae(IniConfigurationFile config, ISubConfigHandler configHandler) { + if (dcaeConfig == null) + try { + dcaeConfig = new DcaeConfig(config, configHandler); + } catch (ConfigurationException e) { + dcaeConfig = DcaeConfig.getDefaultConfiguration(); + } + return dcaeConfig; + } + + public static boolean isInstantiated() { + return dcaeConfig != null; + } + + public static DcaeConfig reload() { + if (dcaeConfig == null) + return null; + DcaeConfig tmpConfig; + try { + tmpConfig = new DcaeConfig(dcaeConfig.getConfig(), dcaeConfig.getConfigHandler(), false); + } catch (ConfigurationException e) { + tmpConfig = DcaeConfig.getDefaultConfiguration(); + } + dcaeConfig = tmpConfig; + return dcaeConfig; + } +} \ No newline at end of file diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/config/impl/EsConfig.java b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/config/impl/EsConfig.java new file mode 100644 index 00000000..0965c3dd --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/config/impl/EsConfig.java @@ -0,0 +1,156 @@ +package org.opendaylight.mwtn.config.impl; + +import org.opendaylight.mwtn.base.internalTypes.Environment; +import org.opendaylight.mwtn.base.internalTypes.IniConfigurationFile; +import org.opendaylight.mwtn.base.internalTypes.IniConfigurationFile.ConfigurationException; +import org.opendaylight.mwtn.config.impl.HtDevicemanagerConfiguration.ISubConfigHandler; + +public class EsConfig extends BaseSubConfig { + + public static final String SECTION_MARKER_ES = "es"; + + public static final String ESDATATYPENAME = "database"; + + private static final String EMPTY = "empty"; + + private static final String PROPERTY_KEY_CLUSTER = "esCluster"; + + private static final String DEFAULT_VALUE_CLUSTER = ""; + + private static EsConfig esConfig; + + private String cluster; + private String host; + private String node; + private String index; + + public static String getESDATATYPENAME() { + return ESDATATYPENAME; + } + + public String getCluster() { + return cluster; + } + + public void setCluster(String cluster) { + this.cluster = cluster; + } + + public String getHost() { + return host; + } + + public void setHost(String host) { + this.host = host; + } + + public String getNode() { + return node; + } + + public void setNode(String node) { + this.node = node; + } + + public String getIndex() { + return index; + } + + public void setIndex(String index) { + this.index = index; + } + + @Override + public String toString() { + return "EsConfig [cluster=" + cluster + ", host=" + host + ", node=" + node + ", index=" + index + "]"; + } + + public EsConfig(IniConfigurationFile config, ISubConfigHandler configHandler) throws ConfigurationException { + this(config, configHandler, true); + } + + public EsConfig(IniConfigurationFile config, ISubConfigHandler configHandler, boolean save) + throws ConfigurationException { + + super(config, configHandler, SECTION_MARKER_ES); + String clustername = Environment.getVar("$HOSTNAME"); + + String c = this.getString(PROPERTY_KEY_CLUSTER, clustername); + if (c != null && c.startsWith("$")) + c = Environment.getVar(c); + this.cluster = c; + this.node = String.format("%s%s", this.cluster, "n1"); + this.host = "localhost"; + + if (save) { + config.setProperty(SECTION_MARKER_ES + "." + PROPERTY_KEY_CLUSTER, this.cluster); + this.save(); + } + } + + private EsConfig() { + super(); + this.host = EMPTY; + this.node = EMPTY; + this.index = EMPTY; + this.cluster = DEFAULT_VALUE_CLUSTER; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof EsConfig) { + EsConfig cobj = (EsConfig) obj; + if (!((cobj.cluster == null && this.cluster == null) || cobj.cluster.equals(this.cluster))) + return false; + if (!((cobj.host == null && this.host == null) || cobj.host.equals(this.host))) + return false; + if (!((cobj.node == null && this.node == null) || cobj.node.equals(this.node))) + return false; + if (!((cobj.index == null && this.index == null) || cobj.index.equals(this.index))) + return false; + return true; + } + return super.equals(obj); + } + + public EsConfig cloneWithIndex(String index) { + EsConfig c = new EsConfig(); + c.index = index; + c.host = this.host; + c.node = this.node; + c.cluster = this.cluster; + return c; + } + + public static boolean isInstantiated() { + return esConfig != null; + } + + public static EsConfig getDefaultConfiguration() { + return new EsConfig(); + } + + public static EsConfig getEs(IniConfigurationFile config, ISubConfigHandler configHandler) { + if (esConfig == null) + try { + esConfig = new EsConfig(config, configHandler); + } catch (ConfigurationException e) { + esConfig = EsConfig.getDefaultConfiguration(); + } + return esConfig; + } + + public static EsConfig reload() { + if (esConfig == null) + return null; + EsConfig tmpConfig; + try { + tmpConfig = new EsConfig(esConfig.getConfig(), esConfig.getConfigHandler(), false); + } catch (ConfigurationException e) { + tmpConfig = EsConfig.getDefaultConfiguration(); + } + esConfig = tmpConfig; + return esConfig; + } + +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/config/impl/GeoConfig.java b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/config/impl/GeoConfig.java new file mode 100644 index 00000000..5397440e --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/config/impl/GeoConfig.java @@ -0,0 +1,141 @@ +package org.opendaylight.mwtn.config.impl; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; + +import org.opendaylight.mwtn.config.impl.AkkaConfig.ClusterRoleInfo; + +import com.typesafe.config.Config; +import com.typesafe.config.ConfigFactory; + +public class GeoConfig { + + + public static class RolesTableEntry + { + @Override + public String toString() { + return "RolesTableEntry [role=" + role + ", ip=" + ip + "]"; + } + private final AkkaConfig.ClusterRoleInfo role; + private final String ip; + public RolesTableEntry(Config c) throws Exception { + this.role = new ClusterRoleInfo(c.getString("role")); + this.ip=c.getString("ip"); + } + } + public static class RolesTable extends ArrayList + { + /** + * + */ + private static final long serialVersionUID = -9146218864237487506L; + + public RolesTable(List configList) throws Exception { + for(Config c : configList) + { + this.add(new RolesTableEntry(c)); + } + } + + } + + private static final String DEFAULT_FILENAME = "configuration/initial/geo.conf"; + private static final String LUMINA_ROOTNODENAME = "lumina-geo-cluster"; + private final String filename; + private final String rootNodename; + private AkkaConfig.ClusterRoleInfoCollection primaryRoles; + private AkkaConfig.ClusterRoleInfoCollection secondayRoles; + private RolesTable rolesTable; + private GeoConfig() + { + this(null); + } + @Override + public String toString() { + return "GeoConfig [filename=" + filename + ", rootNodename=" + rootNodename + ", primaryRoles=" + primaryRoles + + ", secondayRoles=" + secondayRoles + ", rolesTable=" + rolesTable + "]"; + } + private GeoConfig(String filename) + { + this(filename,LUMINA_ROOTNODENAME); + } + private GeoConfig(String filename,String rootNodeName) + { + this.filename=filename; + this.rootNodename=rootNodeName; + } + public static boolean fileExists() + { + File f=new File(DEFAULT_FILENAME); + return f.exists(); + } + public static GeoConfig load() throws Exception + { + return load(DEFAULT_FILENAME); + } + public static GeoConfig load(String filename) throws Exception + { + GeoConfig cfg=new GeoConfig(filename); + cfg._load(); + return cfg; + } + private void _load() throws Exception + { + this._load(ConfigFactory.parseFile(new File(this.filename))); + } + private void _load(Config cfg) throws Exception { + this.primaryRoles=new AkkaConfig.ClusterRoleInfoCollection(); + List a=cfg.getConfig(this.rootNodename).getStringList("primary_roles"); + + for (int i = 0; i < a.size(); i++) { + ClusterRoleInfo s = new ClusterRoleInfo(a.get(i)); + this.primaryRoles.add(s); + } + this.secondayRoles=new AkkaConfig.ClusterRoleInfoCollection(); + a=cfg.getConfig(this.rootNodename).getStringList("secondary_roles"); + for (int i = 0; i < a.size(); i++) { + ClusterRoleInfo s = new ClusterRoleInfo(a.get(i)); + this.secondayRoles.add(s); + } + this.checkDuplicateRoleEntries(); + this.rolesTable = new RolesTable(cfg.getConfig(this.rootNodename).getConfigList("ip_roles_table")); + } + private void checkDuplicateRoleEntries() throws Exception { + AkkaConfig.ClusterRoleInfoCollection duplicateEntries=new AkkaConfig.ClusterRoleInfoCollection(); + for(ClusterRoleInfo primaryRole: this.primaryRoles) + { + if(this.secondayRoles.contains(primaryRole)) + duplicateEntries.add(primaryRole); + } + if(duplicateEntries.size()>0) + throw new Exception("duplicate entries found: "+duplicateEntries.toString()); + + } + public static GeoConfig parse(String content) throws Exception { + GeoConfig cfg=new GeoConfig(); + cfg._load(ConfigFactory.parseString(content)); + return cfg; + } + public AkkaConfig.ClusterRoleInfoCollection getPrimaryRoles() { + return this.primaryRoles; + } + public AkkaConfig.ClusterRoleInfoCollection getSecondaryRoles() { + return this.secondayRoles; + } + public boolean isPrimary(ClusterRoleInfo roleMember) { + return !this.isSecondary(roleMember); + } + private boolean isSecondary(ClusterRoleInfo roleMember) { + if(roleMember==null) + return false; + for(ClusterRoleInfo info:this.secondayRoles) + { + if(info.equals(roleMember)) + return true; + } + return false; + } + +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/config/impl/HtDevicemanagerConfiguration.java b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/config/impl/HtDevicemanagerConfiguration.java new file mode 100644 index 00000000..480430ec --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/config/impl/HtDevicemanagerConfiguration.java @@ -0,0 +1,163 @@ +package org.opendaylight.mwtn.config.impl; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import org.opendaylight.mwtn.base.internalTypes.FileWatchdog; +import org.opendaylight.mwtn.base.internalTypes.IniConfigurationFile; +import org.opendaylight.mwtn.base.internalTypes.IniConfigurationFile.ConfigurationException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class HtDevicemanagerConfiguration { + + private static final long FILE_POLL_INTERVAL_MS = 1000; + + public interface IConfigChangedListener { + void onConfigChanged(); + } + public static class ConfigFileObserver extends FileWatchdog + { + private final List mConfigChangedHandlers = new ArrayList(); + protected ConfigFileObserver(String filename) { + super(filename); + this.setDelay(FILE_POLL_INTERVAL_MS); + } + + @Override + protected void doOnChange() { + + boolean succeeded=true; + LOG.debug("property file has changed"); + try { + mConfig.reLoad(); + + } catch (ConfigurationException e) { + LOG.warn("error reloading config: "+e.getMessage()); + succeeded = false; + + } + if(!succeeded) + return; + if(this.mConfigChangedHandlers==null) + { + LOG.debug("handler list is null");//should never happen + return; + } + //push event to all listeners + for (IConfigChangedListener listener : this.mConfigChangedHandlers) { + if (listener != null) + listener.onConfigChanged(); + } + } + + public void registerConfigChangedListener(IConfigChangedListener l) { + if (!this.mConfigChangedHandlers.contains(l)) + this.mConfigChangedHandlers.add(l); + } + + public void unregisterConfigChangedListener(IConfigChangedListener l) { + this.mConfigChangedHandlers.remove(l); + } + + + } + public interface ISubConfigHandler { + void save(); + } + + private static final Logger LOG = LoggerFactory.getLogger(HtDevicemanagerConfiguration.class); + + private static final String CONFIGURATIONFILE = "etc/devicemanager.properties"; + private static final String CONFIGURATIONTESTFILE = "test.properties"; // for + // testing + + private static HtDevicemanagerConfiguration mObj; + private static HtDevicemanagerConfiguration mObjTest; + + public static HtDevicemanagerConfiguration getConfiguration() { + if (mObj == null) + mObj = new HtDevicemanagerConfiguration(CONFIGURATIONFILE); + return mObj; + } + public static HtDevicemanagerConfiguration getTestConfiguration() { + if (mObjTest == null) + mObjTest = new HtDevicemanagerConfiguration(CONFIGURATIONTESTFILE); + return mObjTest; + } + private static IniConfigurationFile mConfig; + private File mFile; + + public IniConfigurationFile getMConfig() { + return mConfig; + } + + private final ConfigFileObserver fileObserver; + public void registerConfigChangedListener(IConfigChangedListener l) { + this.fileObserver.registerConfigChangedListener(l); + } + + public void unregisterConfigChangedListener(IConfigChangedListener l) { + this.fileObserver.unregisterConfigChangedListener(l); + } + + private HtDevicemanagerConfiguration(String filename) { + + try { + this.mFile = new File(filename); + if (!this.mFile.exists()) + this.mFile.createNewFile(); + if(mConfig==null) + mConfig = new IniConfigurationFile(this.mFile); + mConfig.load(); + + } catch (ConfigurationException e) { + LOG.error("error loading config values:" + e.getMessage()); + + } catch (IOException e) { + LOG.error("error loading config file " + filename + ": " + e.getMessage()); + } + + this.fileObserver=new ConfigFileObserver(filename); + this.fileObserver.start(); + } + + @Override + protected void finalize() throws Throwable { + if(this.fileObserver!=null) + this.fileObserver.interrupt(); + super.finalize(); + } + public DcaeConfig getDcae() { + return DcaeConfig.getDcae(mConfig, this.subconfigHandler); + } + + public AaiConfig getAai() { + return AaiConfig.getAai(mConfig, this.subconfigHandler); + } + + public EsConfig getEs() { + return EsConfig.getEs(mConfig, this.subconfigHandler); + } + + public PmConfig getPm() { + return PmConfig.getPm(mConfig, this.subconfigHandler); + } + + private final ISubConfigHandler subconfigHandler = new ISubConfigHandler() { + + @Override + public void save() { + mConfig.save(); + } + }; + + public ISubConfigHandler getSubconfigHandler() { + return subconfigHandler; + } + + + +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/config/impl/HtLogger.java b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/config/impl/HtLogger.java new file mode 100644 index 00000000..258989c6 --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/config/impl/HtLogger.java @@ -0,0 +1,43 @@ +package org.opendaylight.mwtn.config.impl; + +import java.util.HashMap; + +import org.apache.log4j.BasicConfigurator; +import org.apache.log4j.ConsoleAppender; +import org.apache.log4j.Level; +import org.apache.log4j.PatternLayout; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + +public class HtLogger { + + private static final HashMap mLogs=new HashMap<>(); + + public static void initConsole(Level lvl) + { + BasicConfigurator.configure(); + org.apache.log4j.Logger.getRootLogger().getLoggerRepository().resetConfiguration(); + ConsoleAppender console = new ConsoleAppender(); // create appender + // configure the appender + // String PATTERN = "%d [%p|%c|%C{1}] %m%n"; + String PATTERN = "%d [%p|%C{1}] %m%n"; + console.setLayout(new PatternLayout(PATTERN)); + console.setThreshold(lvl); + console.activateOptions(); + // add appender to any Logger (here is root) + org.apache.log4j.Logger.getRootLogger().addAppender(console); + } + public static Logger GetInstance(Object cls) + { + String key=cls.getClass().getName(); + if(mLogs.containsKey(key)) + return mLogs.get(key); + Logger l=LoggerFactory.getLogger(cls.getClass()); + mLogs.put(key, l); + return l; + } + + + +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/config/impl/PmConfig.java b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/config/impl/PmConfig.java new file mode 100644 index 00000000..71c29d95 --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/config/impl/PmConfig.java @@ -0,0 +1,147 @@ +package org.opendaylight.mwtn.config.impl; + +import org.opendaylight.mwtn.base.internalTypes.Environment; +import org.opendaylight.mwtn.base.internalTypes.IniConfigurationFile; +import org.opendaylight.mwtn.base.internalTypes.IniConfigurationFile.ConfigurationException; +import org.opendaylight.mwtn.config.impl.HtDevicemanagerConfiguration.ISubConfigHandler; + +public class PmConfig extends BaseSubConfig { + + private static final String SECTION_MARKER_PM = "pm"; + private static final String PROPERTY_KEY_ENABLED = "pmEnabled"; + private static final String PROPERTY_KEY_CLUSTER = "pmCluster"; + + private static final boolean DEFAULT_VALUE_ENABLED = true; + private static final String DEFAULT_VALUE_CLUSTER = ""; + private static PmConfig pmConfig; + + private boolean enabled; + + public static final String ESDATATYPENAME = "database"; + + private static final String EMPTY = "empty"; + + private String cluster; + private String host; + private String node; + + public static String getESDATATYPENAME() { + return ESDATATYPENAME; + } + + public String getCluster() { + return cluster; + } + + public void setCluster(String cluster) { + this.cluster = cluster; + } + + public String getHost() { + return host; + } + + public void setHost(String host) { + this.host = host; + } + + public String getNode() { + return node; + } + + public void setNode(String node) { + this.node = node; + } + + public boolean isPerformanceManagerEnabled() { + return this.enabled; + } + + public PmConfig(IniConfigurationFile config, ISubConfigHandler configHandler) throws ConfigurationException { + this(config, configHandler, true); + } + + public PmConfig(IniConfigurationFile config, ISubConfigHandler configHandler, boolean save) + throws ConfigurationException { + + super(config, configHandler, SECTION_MARKER_PM); + String clustername = Environment.getVar("$HOSTNAME"); + + this.enabled = this.getBoolean(PROPERTY_KEY_ENABLED, DEFAULT_VALUE_ENABLED); + String c = this.getString(PROPERTY_KEY_CLUSTER, clustername); + if (c != null && c.startsWith("$")) + c = Environment.getVar(c); + this.cluster = c; + this.node = String.format("%s%s", this.cluster, "n1"); + this.host = "localhost"; + + if (save) { + config.setProperty(SECTION_MARKER_PM + "." + PROPERTY_KEY_ENABLED, this.enabled); + config.setProperty(SECTION_MARKER_PM + "." + PROPERTY_KEY_CLUSTER, this.cluster); + + this.save(); + } + } + + private PmConfig() { + super(); + this.cluster = EMPTY; + this.host = EMPTY; + this.node = EMPTY; + this.enabled = DEFAULT_VALUE_ENABLED; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof PmConfig) { + PmConfig cobj = (PmConfig) obj; + if (!((cobj.cluster == null && this.cluster == null) || cobj.cluster.equals(this.cluster))) + return false; + if (!((cobj.host == null && this.host == null) || cobj.host.equals(this.host))) + return false; + if (!((cobj.node == null && this.node == null) || cobj.node.equals(this.node))) + return false; + return true; + } + return super.equals(obj); + } + + public static PmConfig getDefaultConfiguration() { + PmConfig c = new PmConfig(); + c.enabled = DEFAULT_VALUE_ENABLED; + c.cluster = DEFAULT_VALUE_CLUSTER; + return c; + } + + @Override + public String toString() { + return "PmConfig [enabled=" + enabled + ", cluster=" + cluster + ", host=" + host + ", node=" + node + "]"; + } + + public static boolean isInstantiated() { + return pmConfig != null; + } + + public static PmConfig getPm(IniConfigurationFile config, ISubConfigHandler configHandler) { + if (pmConfig == null) + try { + pmConfig = new PmConfig(config, configHandler); + } catch (ConfigurationException e) { + pmConfig = PmConfig.getDefaultConfiguration(); + } + return pmConfig; + } + + public static PmConfig reload() { + if (pmConfig == null) + return null; + PmConfig tmpConfig; + try { + tmpConfig = new PmConfig(pmConfig.getConfig(), pmConfig.getConfigHandler(), false); + } catch (ConfigurationException e) { + tmpConfig = PmConfig.getDefaultConfiguration(); + } + pmConfig = tmpConfig; + return pmConfig; + } +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/dcaeConnector/impl/DcaeMessages.java b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/dcaeConnector/impl/DcaeMessages.java new file mode 100644 index 00000000..fc98d45f --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/dcaeConnector/impl/DcaeMessages.java @@ -0,0 +1,329 @@ +/** + ecompProvider.sendProblemNotification(ownKeyName, notificationXml); + * ECOMP Messages are generated an send to destination + * + * @author herbert + */ +package org.opendaylight.mwtn.dcaeConnector.impl; + +import java.io.IOException; +import java.net.HttpURLConnection; +import java.net.MalformedURLException; +import java.net.URL; +import java.net.URLConnection; +import java.text.ParseException; + +import javax.annotation.Nullable; +import javax.net.ssl.HostnameVerifier; +import javax.net.ssl.HttpsURLConnection; +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLSession; + +import org.opendaylight.mwtn.base.internalTypes.InternalSeverity; +import org.opendaylight.mwtn.base.internalTypes.InventoryInformation; +import org.opendaylight.mwtn.base.netconf.NetconfTimeStamp; +import org.opendaylight.mwtn.base.netconf.ONFCoreNetworkElementRepresentation; +import org.opendaylight.mwtn.devicemanager.impl.DeviceManagerImpl; +import org.opendaylight.mwtn.devicemanager.impl.xml.ProblemNotificationXml; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class DcaeMessages { + + private static final Logger LOG = LoggerFactory.getLogger(DcaeSenderImpl.class); + + private static final String DCAE_NORMAL = "NORMAL"; + private static final String DCAE_MINOR = "MINOR"; + private static final String DCAE_WARNING = "WARNING"; + private static final String DCAE_CRITICAL = "CRITICAL"; + private static final String DCAE_MAJOR = "MAJOR"; + + private static final String eventNamePrefix = "fault_Microwave_Radio_Alarms"; + private static final String eventType = "Microwave_Radio_Alarms"; + private static final String eventSourceType = "Microwave_Radio"; + + private static final String charset = "UTF-8"; + + private static final HostnameVerifier allHostsValid = new HostnameVerifier() { + public boolean verify(String hostname, SSLSession session) { + return true; + } + }; + + //Configurable parameters + private final DcaeSender dcaeSender; + private final int heartbeatIntervallSeconds; + private final String entityName; + private final DeviceManagerImpl deviceManager; + + //Variables + private int heartbeatsequence = 0; + + public DcaeMessages(DcaeSender ecompSender, String entityName, Integer heartbeatIntervallSeconds, DeviceManagerImpl deviceManager) { + this.dcaeSender = ecompSender; + this.entityName = entityName; + this.deviceManager = deviceManager; + this.heartbeatIntervallSeconds = heartbeatIntervallSeconds; + } + + /** + * Create a heartbeat message. + * @return Result string with answer from server + */ + public String postHeartBeat() { + String epochTimeMicrosecondsString = getEpochTimeMicroseconds(); + String body = assembleHeartbeatFromTemplate(null, + epochTimeMicrosecondsString, + heartbeatsequence++, + NetconfTimeStamp.getTimeStampAsNetconfString()).toString(); + return dcaeSender.sendDcaePost( body); + } + + /** + * ONF 1.2 Problem Notification + * @param mountPointName self-explaining + * @param notification Notification input + * @return String with answer + */ + + public String postNotification(String mountPointName, ProblemNotificationXml notification) { + + String problemName = notification.getProblem(); + String sequence = notification.getCounter(); + String objId = notification.getObjectId(); + String severity = convert( notification.getSeverity()); + String timeStamp = convert( notification.getTimeStamp() ); + + String body = assembleEventNotificationFromTemplate(null, + timeStamp, sequence, + mountPointName, objId, problemName, severity, notification.getTimeStamp() ).toString(); + + return dcaeSender.sendDcaePost( body); + } + + /** + * Setup a connection to URL with authorisation header + * @param url e.g. "https://plan.fritz.box:9092/ux/#" or " + * @param basicAuth authorisation header like "Basic SGVyYmVydDpIZXJiZXJ0" + * @param insertContentHeader + * @return Null in case of error or the URLConnection + * @throws IOException + * @throws MalformedURLException + */ + static @Nullable HttpURLConnection openConnection( URL url, String basicAuth, boolean insertContentHeader, @Nullable SSLContext sc) throws MalformedURLException, IOException { + + //Prepare the connection + HttpURLConnection newHttpConnection = null; + { + URLConnection newConnection = url.openConnection(); + if (newConnection instanceof HttpURLConnection) { + LOG.debug("Setup connection to {} ", url.toString()); + + newHttpConnection = (HttpURLConnection)newConnection; + + newHttpConnection.setDoOutput(true); // Triggers POST. + newHttpConnection.setRequestProperty("Accept-Charset", charset); + if (basicAuth != null) { + newHttpConnection.setRequestProperty("Authorization", basicAuth); + } + if (insertContentHeader) { + newHttpConnection.setRequestProperty("Content-Type", "application/json;charset=" + charset); + } + + if (newHttpConnection instanceof HttpsURLConnection) { + LOG.debug("SSL connection setup with trust all."); + HttpsURLConnection newHttpsConnection = (HttpsURLConnection)newHttpConnection; + if (sc != null) { + newHttpsConnection.setSSLSocketFactory(sc.getSocketFactory()); + } else { + LOG.warn("No SSL Contect available"); + } + newHttpsConnection.setHostnameVerifier(allHostsValid); + } + } else { + LOG.warn("URL not a HTTP protocol: {}", url); + } + } + return newHttpConnection; + } + + /* ----------------- + * Private function for message creation and with templates + */ + + /** + * Get actual microseconds + * @return String + */ + private String getEpochTimeMicroseconds() { + long microseconds = System.nanoTime() / 1000; + return String.valueOf(microseconds); + } + + /** + * Assemble heartbeat message + * @param sb StringBuffer to be used or null to allocate + * @param epochTimeMicrosecondsString Text with time stamp + * @param sequence integer sequence number + * @param eventTimeValueNetconfFormatString like this: 2018-05-14T05:32:17.292Z + * @return StringBuffer with result + */ + private StringBuffer assembleHeartbeatFromTemplate( + StringBuffer sb, + String epochTimeMicrosecondsString, + int sequence, + String eventTimeValueNetconfFormatString) { + + if (sb == null) { + sb = new StringBuffer(); + } + sb.append("{\n" + + " \"event\": {\n" + + " \"commonEventHeader\": {\n" + + " \"domain\": \"heartbeat\",\n" + + " \"eventId\": \"testpattern-ab305d54-85b4-a31b-7db2-fb6b9e546015\",\n" + + " \"eventName\": \"heartbeat_Controller\",\n" + + " \"eventType\": \"Controller\",\n" + + " \"priority\": \"Low\",\n" + + " \"reportingEntityId\": \"\",\n" + + " \"reportingEntityName\": \""+entityName+"\",\n" + + " \"sequence\": "+String.valueOf(sequence)+",\n" + + " \"sourceId\": \"\",\n" + + " \"sourceName\": \""+entityName+"\",\n" + + " \"startEpochMicrosec\": "+epochTimeMicrosecondsString+",\n" + + " \"lastEpochMicrosec\": "+epochTimeMicrosecondsString+",\n" + + " \"version\": 3.0\n" + + " },\n" + + " \"heartbeatFields\": {\n" + + " \"additionalFields\": [\n" + + " {\n" + + " \"name\": \"eventTime\",\n" + + " \"value\": \""+eventTimeValueNetconfFormatString+"\"\n" + + " }\n" + + " ],\n" + + " \"heartbeatFieldsVersion\": 1.0,\n" + + " \"heartbeatInterval\": "+heartbeatIntervallSeconds+"\n" + + " }\n" + + " }\n" + + "}\n" + ); + + return sb; + } + + /** + * Assemble notification message + * @param sb StringBuffer to be used or null to allocate + * @param epochTimeMicrosecondsString Text with time stamp + * @param sequence integer sequence number + * @param mountpointName + * @param objId + * @param problemName + * @param severity + * @return StringBuffer with result + */ + + private StringBuffer assembleEventNotificationFromTemplate(StringBuffer sb, + String epochTimeMicrosecondsString, String sequence, + String mountpointName, String objId, String problemName, String severity, String eventTimeValueNetconfFormatString + ) { + + if (sb == null) { + sb = new StringBuffer(); + } + + ONFCoreNetworkElementRepresentation optionalNe = deviceManager != null ? deviceManager.getNeByMountpoint(mountpointName) : null; + InventoryInformation neInventory = optionalNe != null ? optionalNe.getInventoryInformation() : InventoryInformation.DEFAULT; + + sb.append("{\n" + + " \"event\": {\n" + + " \"commonEventHeader\": {\n" + + " \"domain\": \"fault\",\n" + + " \"eventId\": \""+mountpointName+"_"+objId+"_"+problemName+"\",\n" + + " \"eventName\": \""+eventNamePrefix+"_"+problemName+"\",\n" + + " \"eventType\": \""+eventType+"\",\n" + + " \"sequence\": "+sequence+",\n" + + " \"priority\": \"High\",\n" + + " \"reportingEntityId\": \"\",\n" + + " \"reportingEntityName\": \""+entityName+"\",\n" + + " \"sourceId\": \"\",\n" + + " \"sourceName\": \""+mountpointName+"\",\n" + + " \"startEpochMicrosec\": "+epochTimeMicrosecondsString+",\n" + + " \"lastEpochMicrosec\": "+epochTimeMicrosecondsString+",\n" + + " \"version\": 3.0\n" + + " },\n" + + " \"faultFields\": {\n" + + " \"alarmAdditionalInformation\": [\n" + + " {\n" + + " \"name\": \"eventTime\",\n" + + " \"value\": \""+eventTimeValueNetconfFormatString+"\"\n" + + " },\n" + + " {\n" + + " \"name\": \"equipType\",\n" + + " \"value\": \""+neInventory.getType()+"\"\n" + + " },\n" + + " {\n" + + " \"name\": \"vendor\",\n" + + " \"value\": \""+neInventory.getVendor()+"\"\n" + + " },\n" + + " {\n" + + " \"name\": \"model\",\n" + + " \"value\": \""+neInventory.getModel()+"\"\n" + + " }\n" + + " ],\n" + + " \"faultFieldsVersion\":2.0,\n" + + " \"eventSourceType\": \""+eventSourceType+"\",\n" + + " \"alarmCondition\": \""+problemName+"\",\n" + + " \"alarmInterfaceA\": \""+objId+"\",\n" + + " \"specificProblem\": \""+problemName+"\",\n" + + " \"eventSeverity\": \""+severity+"\",\n" + + " \"vfStatus\": \"Active\"\n" + + " }\n" + + " }\n" + + "}\n" + ); + + return sb; + } + + /* ----------------- + * Convert internal type formats into the Ecomp format + */ + + private String convert(InternalSeverity severity ) { + switch( severity ) { + case NonAlarmed: + break; + case Warning: + return DCAE_WARNING; + case Minor: + return DCAE_MINOR; + case Major: + return DCAE_MAJOR; + case Critical: + return DCAE_CRITICAL; + } + return DCAE_NORMAL; + } + + + /** + * Time has to be converted into milliseconds + * @param timeAsString time as string + * @return + */ + private String convert(String timeAsString) { + + long microseconds = -1; + try { + microseconds = NetconfTimeStamp.getTimeStampFromNetconfAsMilliseconds(timeAsString) * 1000; + } catch (IllegalArgumentException e) { + e.printStackTrace(); + } catch (ParseException e) { + e.printStackTrace(); + } + return String.valueOf(microseconds); + } + + +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/dcaeConnector/impl/DcaeProviderClient.java b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/dcaeConnector/impl/DcaeProviderClient.java new file mode 100644 index 00000000..c933da4d --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/dcaeConnector/impl/DcaeProviderClient.java @@ -0,0 +1,125 @@ +package org.opendaylight.mwtn.dcaeConnector.impl; + +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; + +import org.opendaylight.mwtn.config.impl.DcaeConfig; +import org.opendaylight.mwtn.config.impl.HtDevicemanagerConfiguration; +import org.opendaylight.mwtn.config.impl.HtDevicemanagerConfiguration.IConfigChangedListener; +import org.opendaylight.mwtn.devicemanager.impl.DeviceManagerImpl; +import org.opendaylight.mwtn.devicemanager.impl.ProviderClient; +import org.opendaylight.mwtn.devicemanager.impl.xml.ProblemNotificationXml; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + +public class DcaeProviderClient implements AutoCloseable, ProviderClient { + + private static final Logger LOG = LoggerFactory.getLogger(DcaeProviderClient.class); + + private static final int MIN_HEARTBEAT_TIME_SECONDS = 30; + + private final HtDevicemanagerConfiguration htConfig; + private final String entityName; + private final DeviceManagerImpl deviceManager; + + private DcaeProviderWorker worker; + + public DcaeProviderClient(HtDevicemanagerConfiguration cfg, String entityName, DeviceManagerImpl deviceManager) { + + this.entityName = entityName; + this.deviceManager = deviceManager; + this.htConfig=cfg; + this.htConfig.registerConfigChangedListener(configChangedListener ); + + worker = new DcaeProviderWorker(this.htConfig.getDcae(), entityName, deviceManager); + } + + @Override + public void sendProblemNotification(String mountPointName, ProblemNotificationXml notification) { + synchronized(worker) { + worker.sendProblemNotification(mountPointName, notification); + } + } + + @Override + public void sendProblemNotification(String mountPointName, ProblemNotificationXml notification, boolean neDeviceAlarm) { + sendProblemNotification(mountPointName, notification); + } + + @Override + public void close() { + this.htConfig.unregisterConfigChangedListener(configChangedListener); + synchronized(worker) { + worker.close(); + } + } + + /* --------------------------------------------------------- + * Private + */ + + + private IConfigChangedListener configChangedListener = new IConfigChangedListener() { + + @Override + public void onConfigChanged() { + synchronized(worker) { + worker.close(); + worker = new DcaeProviderWorker(DcaeConfig.reload(), entityName, deviceManager); + } + } + }; + + private static class DcaeProviderWorker implements AutoCloseable { + + + private final ScheduledExecutorService scheduler; + private final DcaeSenderImpl dcaepClient; + private final DcaeMessages dcaeMessages; + + public DcaeProviderWorker(DcaeConfig configuration, String entityName, DeviceManagerImpl deviceManager) { + + + //Start services + LOG.info("Configuration: "+configuration); + int heartbeatSeconds = configuration.getTimerPeriodSeconds(); + if ( heartbeatSeconds < MIN_HEARTBEAT_TIME_SECONDS ) { + heartbeatSeconds = MIN_HEARTBEAT_TIME_SECONDS; + LOG.info("Adjust heartbeat intervall to minimum of { } seconds.",heartbeatSeconds); + } + + dcaepClient = new DcaeSenderImpl(configuration.getEventReveicerUrl(), configuration.getUserCredentials()); + dcaeMessages = new DcaeMessages(dcaepClient, entityName, heartbeatSeconds, deviceManager); + + //Activate task + LOG.info("Create Fault manager client Task"); + this.scheduler = Executors.newSingleThreadScheduledExecutor(); + Runnable task = new DcaeProviderTask(dcaeMessages); + + LOG.info("Fault task created with "+heartbeatSeconds+" Seconds"); + + this.scheduler.scheduleAtFixedRate(task, 0, heartbeatSeconds, TimeUnit.SECONDS); + LOG.info("Fault task scheduled"); + } + + public void sendProblemNotification(String mountPointName, ProblemNotificationXml notification) { + LOG.debug("Notification answer: {}", dcaeMessages.postNotification(mountPointName, notification)); + } + + @Override + public void close() { + try { + this.scheduler.awaitTermination(5, TimeUnit.SECONDS); + } catch (InterruptedException e) { + } + } + + + } + +} + + + diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/dcaeConnector/impl/DcaeProviderTask.java b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/dcaeConnector/impl/DcaeProviderTask.java new file mode 100644 index 00000000..5f695cd0 --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/dcaeConnector/impl/DcaeProviderTask.java @@ -0,0 +1,33 @@ +/** + * Event provider to ECOMP for heartbeat message + * + * @author herbert + * + */ +package org.opendaylight.mwtn.dcaeConnector.impl; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +class DcaeProviderTask implements Runnable { + + private static final Logger LOG = LoggerFactory.getLogger(DcaeProviderTask.class); + + private int t = 0; + private final DcaeMessages dcaeMessages; + + DcaeProviderTask(DcaeMessages dcaeMessages) { + LOG.info("Create eventprovider task"); + this.dcaeMessages = dcaeMessages; + } + + private void sendHeartbeat() { + dcaeMessages.postHeartBeat(); + } + + @Override + public void run() { + LOG.debug("DCAE provider heartbeat tick start {}", t++); + sendHeartbeat(); + } +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/dcaeConnector/impl/DcaeSender.java b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/dcaeConnector/impl/DcaeSender.java new file mode 100644 index 00000000..89992f6f --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/dcaeConnector/impl/DcaeSender.java @@ -0,0 +1,14 @@ +/** + * + */ +package org.opendaylight.mwtn.dcaeConnector.impl; + +/** + * @author herbert + * + */ +public interface DcaeSender { + + public String sendDcaePost(String body); + +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/dcaeConnector/impl/DcaeSenderImpl.java b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/dcaeConnector/impl/DcaeSenderImpl.java new file mode 100644 index 00000000..ede51506 --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/dcaeConnector/impl/DcaeSenderImpl.java @@ -0,0 +1,211 @@ +/** + * Client for ECOMP notification server + * + * Reference: @link http://stackoverflow.com/questions/13022717/java-and-https-url-connection-without-downloading-certificate + * + * @author herbert + */ +package org.opendaylight.mwtn.dcaeConnector.impl; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.io.Reader; +import java.net.HttpURLConnection; +import java.net.URL; +import java.net.URLConnection; +import java.security.KeyManagementException; +import java.security.KeyStoreException; +import java.security.NoSuchAlgorithmException; +import java.security.UnrecoverableKeyException; +import java.security.cert.CertificateException; +import java.security.spec.InvalidKeySpecException; +import java.util.Base64; + +import javax.net.ssl.SSLContext; + +import org.opendaylight.mwtn.base.http.BaseHTTPClient; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class DcaeSenderImpl implements DcaeSender { + + private static final Logger LOG = LoggerFactory.getLogger(DcaeSenderImpl.class); + private static String EMPTY = ""; + private static final String charset = "UTF-8"; + + private final String urlString; + private final String basicAuth; + + private SSLContext sc = null; + private URL url = null; + private HttpURLConnection connection = null; + + public DcaeSenderImpl( String url, String userCredentials) { + + LOG.info("DcaeSenderImpl setup start with {} {}", url, userCredentials); + + this.urlString = url; + this.basicAuth = "Basic " + new String(Base64.getEncoder().encode(userCredentials.getBytes())); + + if (urlString != null && !urlString.equals("off")) { + try { + this.url = new URL(url); + sc = BaseHTTPClient.setupSsl(true); + } catch (KeyManagementException | NoSuchAlgorithmException | UnrecoverableKeyException | CertificateException | KeyStoreException | InvalidKeySpecException | IOException e) { + LOG.warn("SSL setup failed: {}", e.getMessage()); + } + } + LOG.info("DcaeSenderImpl setup ends"); + } + + /** + * Send message to ECOMP Server + * @param body for POST message + */ + @Override + public String sendDcaePost(String body) { + + if (url != null) { + try { + connection = DcaeMessages.openConnection(url, basicAuth, true, sc); + if (connection != null) { + return processPost(connection, body); + } else { + LOG.warn("No SSL context available"); + } + } catch (IOException e) { + LOG.warn("Dcae post failed {}", e.getMessage()); + } + } + return EMPTY; + } + + /** + * Connect to Server and expect answer. + * @return with answer body + */ + public String testConnectServer() { + + if (url != null) { + try { + connection = DcaeMessages.openConnection(url, null, false, sc); + if (connection != null) { + return receiveInitialAnswer(connection); + } + } catch (IOException e) { + LOG.warn("Dcae post failed {}", e.getMessage()); + } + } + return EMPTY; + } + + /** + * Show status in readable form for testing + * @return String with result + */ + public String getStatusAsString() { + StringBuffer sb = new StringBuffer(); + + sb.append("URL: "+ url.getPath() +" "+ url.getPort() + " Host: "+ url.getHost()); + sb.append("\n"); + if (connection != null) { + sb.append("Connection setup: "); + sb.append(connection.getClass().getName()); + sb.append(" "); + } else { + sb.append("Connection setup: No connection (server problem or switched off)"); + } + return sb.toString(); + + } + + + /*------------------------------------------------------------------------------ + * Private functions + */ + + + /** + * Send Post and wait for answer + * @param connection + * @param body + * @return + * @throws IOException + */ + private static String processPost( HttpURLConnection connection, String body ) throws IOException { + + LOG.debug("Post message: {}", connection.getURL().toString()); + if (LOG.isTraceEnabled()) { + LOG.trace("Body: {} ", body); + } + + //Send the message to destination + try (OutputStream output = connection.getOutputStream()) { + output.write(body.getBytes(charset)); + } + + //Receive answer + try { + int responseCode = connection.getResponseCode(); + LOG.debug("Response code: {}", String.valueOf(responseCode)); + + InputStream response= null; + if (responseCode >= 200 && responseCode < 300) + response = connection.getInputStream(); + else { + response = connection.getErrorStream(); + if (response == null) + response = connection.getInputStream(); + } + + if (response != null) { + BufferedReader rd = new BufferedReader(new InputStreamReader(response)); + String line; + StringBuilder result = new StringBuilder(); + while ((line = rd.readLine()) != null) { + result.append(line); + } + rd.close(); + if (LOG.isTraceEnabled()) { + LOG.trace("Result: {} ", result.toString()); + } + return result.toString(); + } + } catch (IOException e) { + LOG.debug("No response received: {}", e.getMessage()); + } + return EMPTY; + } + + + + + /** + * Read initial answer from Server after connect + * @param connection that was opened + * @return String with answer message + * @throws IOException + */ + private static String receiveInitialAnswer(URLConnection iConnection) throws IOException { + + + final StringBuffer response = new StringBuffer(); + + if (iConnection != null) { + + final Reader reader = new InputStreamReader(iConnection.getInputStream()); + final BufferedReader br = new BufferedReader(reader); + String line = ""; + while ((line = br.readLine()) != null) { + response.append(line); + response.append("\n"); + } + br.close(); + } + + return response.toString(); + } +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/dcaeConnector/test/DcaePrivateTester.java b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/dcaeConnector/test/DcaePrivateTester.java new file mode 100644 index 00000000..0e16d270 --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/dcaeConnector/test/DcaePrivateTester.java @@ -0,0 +1,98 @@ +/** + * + */ +package org.opendaylight.mwtn.dcaeConnector.test; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.io.Reader; +import java.net.URL; +import java.net.URLConnection; +import java.security.cert.X509Certificate; + +import javax.net.ssl.HostnameVerifier; +import javax.net.ssl.HttpsURLConnection; +import javax.net.ssl.SSLContext; +import javax.net.ssl.TrustManager; +import javax.net.ssl.X509TrustManager; + +/** + * @author herbert + * + */ +public class DcaePrivateTester { + + + public static void test(URL url, boolean readFromServer) throws Exception { + // Create a trust manager that does not validate certificate chains + TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() { + @Override + public java.security.cert.X509Certificate[] getAcceptedIssuers() { + return null; + } + @Override + public void checkClientTrusted(X509Certificate[] certs, String authType) { + } + @Override + public void checkServerTrusted(X509Certificate[] certs, String authType) { + } + } }; + // Install the all-trusting trust manager + final SSLContext sc = SSLContext.getInstance("TLS"); + sc.init(null, trustAllCerts, new java.security.SecureRandom()); + HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); + // Create all-trusting host name verifier + HostnameVerifier allHostsValid = (hostname, session) -> true; + + // Install the all-trusting host verifier + HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid); + + //URL url = new URL("https://www.google.com"); + URLConnection con = url.openConnection(); + System.out.println("Connection background: "+con.getClass().getName()+" "+url.getHost()); + + if (readFromServer) { + final Reader reader = new InputStreamReader(con.getInputStream()); + final BufferedReader br = new BufferedReader(reader); + String line = ""; + while ((line = br.readLine()) != null) { + System.out.println(line); + } + br.close(); + } /**/ + } // End of main + + + +// httpTestUrl=https://plan.fritz.box:9092/ux/# +// keyStore=etc/clientkeystore +// keyStorePassword=daylight2016 + public static void main(String[] args) { + + String urlString = "https://www.google.de"; + //String urlString = "https://plan.fritz.box:9092/ux/#"; + //String urlString = "http://plan.fritz.box:9091/ux/#"; + //String urlString = "http://127.0.0.1:30000/eventListener/v3"; + + try { + test(new URL(urlString), true); + } catch (Exception e) { + System.out.println("(..something..) failed"); + e.printStackTrace(); + } + /* + System.out.println("Test HTTPS"); + + final HttpsClient httpTestClient; + httpTestClient = new HttpsClient(); + + httpTestClient.testIt( + //"https://plan.fritz.box:9092/ux/#", + "https://www.google.de", + "/home/herbert/odl/distribution-karaf-0.5.1-Boron-SR1/etc/clientkeystore", + "daylight2016" + );/**/ + + } + +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/dcaeConnector/test/DcaeTestClient.java b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/dcaeConnector/test/DcaeTestClient.java new file mode 100644 index 00000000..5e00bd87 --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/dcaeConnector/test/DcaeTestClient.java @@ -0,0 +1,56 @@ +/** + * + * @author herbert + * + */ +package org.opendaylight.mwtn.dcaeConnector.test; + +import org.opendaylight.mwtn.config.impl.DcaeConfig; +import org.opendaylight.mwtn.dcaeConnector.impl.DcaeMessages; +import org.opendaylight.mwtn.dcaeConnector.impl.DcaeSenderImpl; + +public class DcaeTestClient { + + private static final boolean TESTCOLLECTOR_YES = true; + + public static void main(String[] args) { + + System.out.println("Test program to verify DCAE https connectivity"); + + //Get configuration + DcaeConfig configuration = DcaeConfig.getDefaultConfiguration(); + + if (configuration != null) { + + //Start services + System.out.println("Configuration: "+configuration); + + DcaeSenderImpl dcaeClient = new DcaeSenderImpl(configuration.getEventReveicerUrl(), configuration.getUserCredentials()); + + if (TESTCOLLECTOR_YES) { + System.out.println("Connect to testclient and send notifications"); + + DcaeMessages dcaeMessages = new DcaeMessages(dcaeClient, "ControllerName", 31, null); + + for (int t=0; t < 2; t++) { + try { + Thread.sleep(1000); //1000 milliseconds is one second. + } catch(InterruptedException ex) { + Thread.currentThread().interrupt(); + } + System.out.println(t+". Send notification and receive answer message"); + System.out.println("Heartbeat message: "+dcaeMessages.postHeartBeat()); + System.out.println("Status of ECOMP Client: "+dcaeClient.getStatusAsString()); + } + + } else { + + System.out.println("Connect to server and receive initial answer."); + System.out.println("Message: "+dcaeClient.testConnectServer()); + + } + + } + } + +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/dcaeConnector/test/HttpsClient.java b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/dcaeConnector/test/HttpsClient.java new file mode 100644 index 00000000..7b96b4f0 --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/dcaeConnector/test/HttpsClient.java @@ -0,0 +1,293 @@ +/** + * + */ +package org.opendaylight.mwtn.dcaeConnector.test; + +import java.io.BufferedReader; +import java.io.File; +import java.io.IOException; +import java.io.InputStreamReader; +import java.net.MalformedURLException; +import java.net.URL; +import java.security.KeyManagementException; +import java.security.NoSuchAlgorithmException; +import java.security.SecureRandom; +import java.security.cert.Certificate; +import java.security.cert.X509Certificate; + +import javax.net.ssl.HttpsURLConnection; +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLPeerUnverifiedException; +import javax.net.ssl.SSLSocketFactory; +import javax.net.ssl.TrustManager; +import javax.net.ssl.X509TrustManager; + +import org.opendaylight.mwtn.dcaeConnector.impl.DcaeProviderClient; + +/** + * @author herbert + * + */ +public class HttpsClient{ + + private static final MyLogger LOG = MyLogger.getLogger(DcaeProviderClient.class); + + void test() { + + TrustManager tm = new X509TrustManager() { + + @Override + public void checkClientTrusted(X509Certificate[] chain, String authType) + throws java.security.cert.CertificateException { + //do nothing, you're the client + } + + @Override + public void checkServerTrusted(X509Certificate[] chain, String authType) + throws java.security.cert.CertificateException { + /* chain[chain.length -1] is the candidate for the + * root certificate. + * Look it up to see whether it's in your list. + * If not, ask the user for permission to add it. + * If not granted, reject. + * Validate the chain using CertPathValidator and + * your list of trusted roots. + */ + } + + @Override + public X509Certificate[] getAcceptedIssuers() { + //also only relevant for servers + return null; + } + }; + + TrustManager tml[] = new TrustManager[1]; + tml[0] = tm; + + + try { + SSLContext ctx = SSLContext.getInstance("TLS"); + ctx.init(null, tml, null); + @SuppressWarnings("unused") + SSLSocketFactory sslF = ctx.getSocketFactory(); + + } catch (NoSuchAlgorithmException | KeyManagementException e) { + e.printStackTrace(); + } + + + }; + + void setupAllTrustingManager() { + // Create a trust manager that does not validate certificate chains + TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager(){ + @Override + public X509Certificate[] getAcceptedIssuers(){return null;} + @Override + public void checkClientTrusted(X509Certificate[] certs, String authType){} + @Override + public void checkServerTrusted(X509Certificate[] certs, String authType){} + }}; + + // Install the all-trusting trust manager + try { + SSLContext sc = SSLContext.getInstance("TLS"); + sc.init(null, trustAllCerts, new SecureRandom()); + HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); + } catch (Exception e) { + ; + } + } + + void testIt(String https_url, String keyStoreName, String keyStorePassword){ + + LOG.info("Message to: {} begin.", https_url); + + if (https_url.equals("off")) { + LOG.info("Function switched off"); + return; + } + + /* + KeyManagerFactory keyManagerFactory = null; + + try { + KeyStore ks = KeyStore.getInstance("JKS"); + FileInputStream in = new FileInputStream(keyStoreName); + ks.load(in, keyStorePassword.toCharArray()); + + CertificateFactory certFactory = CertificateFactory.getInstance("X.509"); + FileInputStream in2 = new FileInputStream("etc/eventprovider.cert"); + X509Certificate cert = (X509Certificate)certFactory.generateCertificate(in2); + + KeyStore.Entry newEntry = new KeyStore.TrustedCertificateEntry(cert); + ks.setEntry("someAlias", newEntry, null); + + keyManagerFactory = KeyManagerFactory.getInstance("X509"); + keyManagerFactory.init(ks, "yourKeyStorePassword".toCharArray()); + + } catch (KeyStoreException e1) { + LOG.info("Exception: {}", e1.getMessage()); + } catch (FileNotFoundException e1) { + LOG.info("Exception: {}", e1.getMessage()); + } catch (NoSuchAlgorithmException e1) { + LOG.info("Exception: {}", e1.getMessage()); + } catch (CertificateException e1) { + LOG.info("Exception: {}", e1.getMessage()); + } catch (IOException e1) { + LOG.info("Exception: {}", e1.getMessage()); + } catch (UnrecoverableKeyException e1) { + LOG.info("Exception: {}", e1.getMessage()); + } + + // Create a trust manager that does not validate certificate chains + TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager(){ + @Override + public X509Certificate[] getAcceptedIssuers(){return null;} + @Override + public void checkClientTrusted(X509Certificate[] certs, String authType){} + @Override + public void checkServerTrusted(X509Certificate[] certs, String authType){} + }}; + */ + File file = new File(keyStoreName); + LOG.info("Setup keystore begin "+keyStoreName+" "+keyStorePassword+" Exists: "+file.exists()); + + System.setProperty("javax.net.debug","ssl"); + System.setProperty("javax.net.ssl.keyStoreType", "jks"); + System.setProperty("javax.net.ssl.keyStore", keyStoreName); + System.setProperty("javax.net.ssl.keyStorePassword", keyStorePassword); + + LOG.info("Setup keystore complete"); + + javax.net.ssl.HttpsURLConnection.setDefaultHostnameVerifier( + (hostname, sslSession) -> { + LOG.info("Hostname check {}", hostname); + return true; + }); + LOG.info("Setup name verifier."); + + try { + /* + SSLContext sslContext = SSLContext.getInstance("TLS"); + sslContext.init(keyManagerFactory.getKeyManagers(), trustAllCerts, null); + SSLContext.setDefault(sslContext); + */ + + URL url = new URL(https_url); + LOG.info("Url object created"); + + HttpsURLConnection con = (HttpsURLConnection)url.openConnection(); + + LOG.info("openConnection"); + + //dumpl all cert info + print_https_cert(con); + + //dump all the content + print_content(con); + + } catch (MalformedURLException e) { + LOG.info("Exception: {}", e.getMessage()); + } catch (IOException e) { + LOG.info("Exception: {}", e.getMessage()); + } + + LOG.info("Message to: {} end.", https_url); + + } + + private void print_https_cert(HttpsURLConnection con){ + + StringBuffer logMsg = new StringBuffer(); + + if(con!=null){ + + try { + logMsg.append("Response Code : " + con.getResponseCode()); + logMsg.append("Cipher Suite : " + con.getCipherSuite()); + logMsg.append("\n"); + + Certificate[] certs = con.getServerCertificates(); + for(Certificate cert : certs){ + logMsg.append("Cert Type : " + cert.getType()); + logMsg.append("Cert Hash Code : " + cert.hashCode()); + logMsg.append("Cert Public Key Algorithm : " + cert.getPublicKey().getAlgorithm()); + logMsg.append("Cert Public Key Format : " + cert.getPublicKey().getFormat()); + logMsg.append("\n"); + } + + + } catch (SSLPeerUnverifiedException e) { + logMsg.append(e.getMessage()); + } catch (IOException e){ + logMsg.append(e.getMessage()); + } + } else { + logMsg.append("No connection"); + } + + LOG.info(logMsg.toString()); + } + + private void print_content(HttpsURLConnection con){ + + StringBuffer logMsg = new StringBuffer(); + if(con!=null){ + + try { + + + logMsg.append("****** Content of the URL ********"); + BufferedReader br = + new BufferedReader( + new InputStreamReader(con.getInputStream())); + + String input; + + while ((input = br.readLine()) != null){ + logMsg.append(input); + } + br.close(); + + + } catch (IOException e) { + logMsg.append(e.getMessage()); + } + + } else { + logMsg.append("No connection"); + } + + LOG.info(logMsg.toString()); + + } + + private static class MyLogger { + + private void out( String s, Object...oList) { + StringBuffer sb = new StringBuffer(); + sb.append("-------> "); + sb.append(s); + sb.append(" P: "); + int t = 0; + for (Object o: oList) { + sb.append("["); + sb.append(t++); + sb.append("]("); + sb.append(o.toString()); + sb.append(")"); + } + System.out.println(sb.toString()); + } + + void info( String s, Object...o) { + out(s,o); + } + + static MyLogger getLogger(Class c) { + return new MyLogger(); + } + } +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/deviceMonitor/impl/Checker.java b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/deviceMonitor/impl/Checker.java new file mode 100644 index 00000000..d368dc45 --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/deviceMonitor/impl/Checker.java @@ -0,0 +1,31 @@ +/** + * (c) highstreet technologies GmbH + */ +package org.opendaylight.mwtn.deviceMonitor.impl; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Steps to Monitor the connection to a network element during state connected + */ +abstract class Checker { + + @SuppressWarnings("unused") + private static final Logger LOG = LoggerFactory.getLogger(Checker.class); + + /** + * Check action. + * @return true if reachable, false if not + */ + abstract boolean isReachableOnce(); + + /** + * Procedure to check the connection of one mountpoint + * @return true if reachable, false if not + */ + boolean isConnected() { + return isReachableOnce(); + } +} + diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/deviceMonitor/impl/DeviceMonitor.java b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/deviceMonitor/impl/DeviceMonitor.java new file mode 100644 index 00000000..a9c0abec --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/deviceMonitor/impl/DeviceMonitor.java @@ -0,0 +1,46 @@ +/** + * + */ +package org.opendaylight.mwtn.deviceMonitor.impl; + +import org.opendaylight.mwtn.base.netconf.ONFCoreNetworkElementRepresentation; + +/** + * @author herbert + * + */ +public interface DeviceMonitor { + + + /** + * Stop the complete service and terminates all actions + */ + public void close(); + + /** + * createMountpoint registers a new mountpoint monitoring service + * @param mountPointNodeName name of mountpoint + */ + public void createMountpointIndication(String mountPointNodeName); + + /** + * removeMountpoint deregisters a mountpoint for registration services + * @param mountPointNodeName to deregister + */ + public void removeMountpointIndication(String mountPointNodeName); + + /** + * Notify of device state changes to "connected" + * @param mountPointNodeName name of mountpoint + * @param ne to monitor + */ + public void deviceConnectIndication(String mountPointNodeName, ONFCoreNetworkElementRepresentation ne); + + /** + * Notify of device state change to "disconnected" + * @param mountPointNodeName to deregister + */ + public void deviceDisconnectIndication(String mountPointNodeName); + + +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/deviceMonitor/impl/DeviceMonitorImpl.java b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/deviceMonitor/impl/DeviceMonitorImpl.java new file mode 100644 index 00000000..6ba0b077 --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/deviceMonitor/impl/DeviceMonitorImpl.java @@ -0,0 +1,151 @@ +/** + * (c) 2017 highstreet technologies GmbH + */ + +package org.opendaylight.mwtn.deviceMonitor.impl; + +import java.util.Enumeration; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; + +import org.opendaylight.mwtn.base.netconf.ONFCoreNetworkElementRepresentation; +import org.opendaylight.mwtn.devicemanager.impl.listener.ODLEventListener; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Implementation of concept "Active monitoring" of a device.
+ *
+ * For each existing mountpoint a task runs with 120s cycle time. Every 120 seconds the check actions are performed. + * The request is handled by the NETCONF layer with a (default)configured time-out of 60 seconds.
+ * Generated alarms, by the object/node "SDN-Controller" are (enum DeviceMonitorProblems):
+ * - notConnected(InternalSeverity.Warning)
+ * - noConnectionMediator(InternalSeverity.Minor)
+ * - noConnectionNe(InternalSeverity.Critical)
+ *
+ * 1. Mountpoint does not exist
+ * If the mountpoint does not exists there are no related current alarms in the database.
+ *
+ * 2. Created mountpoint with state "Connecting" or "UnableToConnect"
+ * If the Mountpoint is created and connection status is "Connecting" or "UnableToConnect".
+ * - After about 2..4 Minutes ... raise alarm "notConnected" with severity warning
+ *
+ * 3. Created mountpoint with state "Connection"
+ * There are two monitor activities.
+ * 3a. Check of Mediator connection by requesting (typical) cached data.
+ * - After about 60 seconds raise alarm: connection-loss-mediator with severity minor
+ * - Request from Mediator: network-element
+ *
+ * 3b. Check connection to NEby requesting (typical) non-cached data.
+ * - Only if AirInterface available. The first one is used.
+ * - Requested are the currentAlarms
+ * - After about 60 seconds raise alarm: connection-loss-network-element with severity critical
+ *
+ * @author herbert + */ + +public class DeviceMonitorImpl implements DeviceMonitor, AutoCloseable { + + private static final Logger LOG = LoggerFactory.getLogger(DeviceMonitorImpl.class); + + private final ConcurrentHashMap queue; + private final ScheduledExecutorService scheduler; + private final ODLEventListener odlEventListener; + + /*------------------------------------------------------------- + * Construction/ destruction of service + */ + + /** + * Basic implementation of devicemonitoring + * @param odlEventListener as destination for problems + */ + public DeviceMonitorImpl(ODLEventListener odlEventListener) { + LOG.info("Construct {}", this.getClass().getSimpleName()); + + this.odlEventListener = odlEventListener; + this.queue = new ConcurrentHashMap<>(); + this.scheduler = Executors.newScheduledThreadPool(1); + } + + /** + * Stop the service. Stop all running monitoring tasks. + */ + @Override + synchronized public void close() { + LOG.info("Close {}", this.getClass().getSimpleName()); + + Enumeration e = queue.keys(); + while (e.hasMoreElements()) { + deviceDisconnectIndication(e.nextElement()); + } + + scheduler.shutdown(); + } + + /*------------------------------------------------------------- + * Register/ Deregister Mountpoint + */ + + @Override + synchronized public void createMountpointIndication(String mountPointNodeName) { + + LOG.debug("Register for monitoring {} {}",mountPointNodeName, mountPointNodeName.hashCode()); + + LOG.info("Do start of DeviceMonitor task"); + //Runnable task = new PerformanceManagerTask(queue, databaseService); + DeviceMonitorTask task = new DeviceMonitorTask(mountPointNodeName, this.odlEventListener); + queue.put(mountPointNodeName, task); + task.start(scheduler); + } + + @Override + synchronized public void removeMountpointIndication(String mountPointNodeName) { + + if (queue.containsKey(mountPointNodeName)) { + DeviceMonitorTask task = queue.get(mountPointNodeName); + //Remove from here + queue.remove(mountPointNodeName); + + //Clear all problems + task.removeMountpointIndication(); + LOG.debug("Task stopped: {}", mountPointNodeName); + } else { + LOG.warn("Task not in queue anymore: {}", mountPointNodeName); + } + } + + /*------------------------------------------------------------- + * Register/ Deregister device + */ + + @Override + synchronized public void deviceConnectIndication(String mountPointNodeName, ONFCoreNetworkElementRepresentation ne) { + + LOG.debug("ne changes to connected state {}",mountPointNodeName); + if (queue.containsKey(mountPointNodeName)) { + DeviceMonitorTask task = queue.get(mountPointNodeName); + task.deviceConnectIndication(ne); + } else { + LOG.warn("Monitoring task not in queue anymore: {} {} {}", mountPointNodeName, mountPointNodeName.hashCode(), queue.size()); + } + } + + @Override + synchronized public void deviceDisconnectIndication(String mountPointNodeName) { + + LOG.debug("ne changes to disconnected state {}",mountPointNodeName); + if (queue.containsKey(mountPointNodeName)) { + DeviceMonitorTask task = queue.get(mountPointNodeName); + task.deviceDisconnectIndication(); + } else { + LOG.warn("Monitoring task not in queue anymore: {} {} {}", mountPointNodeName, mountPointNodeName.hashCode(), queue.size()); + } + } + + /*------------------------------------------------------------- + * Private functions + */ + +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/deviceMonitor/impl/DeviceMonitorProblems.java b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/deviceMonitor/impl/DeviceMonitorProblems.java new file mode 100644 index 00000000..81000606 --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/deviceMonitor/impl/DeviceMonitorProblems.java @@ -0,0 +1,40 @@ +/** + * Problems generated by DeviceMonitor + * + * @author herbert + * + */ +package org.opendaylight.mwtn.deviceMonitor.impl; + +import org.opendaylight.mwtn.base.internalTypes.InternalSeverity; + +public enum DeviceMonitorProblems { + + /** + * Mountpoint is not connected via NETCONF with NE/Mediator = ssh connection + */ + connectionLossOAM(InternalSeverity.Major), + + /** + * Mountpoint is connected via Netconf to Mediator, but mediator is not responding. + * Connection state to NE is unknown. + */ + connectionLossMediator(InternalSeverity.Major), + + /** Mountpoint is connected via Netconf to Mediator. + * This connection is OK, but mediator <-> NE Connection is not OK + */ + connectionLossNeOAM(InternalSeverity.Major); + + InternalSeverity severity; + + DeviceMonitorProblems(InternalSeverity severity) { + this.severity = severity; + } + + InternalSeverity getSeverity() { + return severity; + } + +} + diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/deviceMonitor/impl/DeviceMonitorSupport.java b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/deviceMonitor/impl/DeviceMonitorSupport.java new file mode 100644 index 00000000..8179f8f4 --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/deviceMonitor/impl/DeviceMonitorSupport.java @@ -0,0 +1,30 @@ +/** + * + */ +package org.opendaylight.mwtn.deviceMonitor.impl; + +/** + * @author herbert + * + */ +public interface DeviceMonitorSupport { + + /** + * Prepare subsequent check calls + */ + public void prepareCheck(); + + /** + * Test connection to mediator, by getting data that have to be called from NE + * @return true if connection working, false if not + */ + public boolean checkAndConnectionToMediatorIsOk(); + + /** + * Test connection to NE via mediator, by getting data that have to be called from NE + * @return true if connection working, false if not + */ + public boolean checkAndConnectionToNeIsOk(); + + +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/deviceMonitor/impl/DeviceMonitorTask.java b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/deviceMonitor/impl/DeviceMonitorTask.java new file mode 100644 index 00000000..308df019 --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/deviceMonitor/impl/DeviceMonitorTask.java @@ -0,0 +1,263 @@ +/** + * @author herbert + * + */ +package org.opendaylight.mwtn.deviceMonitor.impl; + +import java.util.Collections; +import java.util.EnumSet; +import java.util.Set; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.TimeUnit; + +import javax.annotation.Nullable; + +import org.opendaylight.mwtn.base.internalTypes.InternalSeverity; +import org.opendaylight.mwtn.base.netconf.ONFCoreNetworkElementRepresentation; +import org.opendaylight.mwtn.devicemanager.impl.listener.ODLEventListener; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class DeviceMonitorTask implements Runnable { + + private static final Logger LOG = LoggerFactory.getLogger(DeviceMonitorTask.class); + private static final String LOGMARKER = "DMTick"; + + private final String mountPointName; + private final ODLEventListener odlEventListener; + private final Checker checkConnectionToMediator; + private final Checker checkConnectionToNe; + + private int tickCounter; //Added for each tick. Not relevant for internal status + + private ScheduledFuture taskHandle; + private final Object lockNe = new Object(); //USe top lock access to member ne + private @Nullable ONFCoreNetworkElementRepresentation ne; //Indication if in status connect or disconnect + private Integer disconnectSupervisionTickout; //Tickcounter of task ticks for "not connected indication" + private Set currentProblems; //List with actual problems. Synchronized by itself + + + + /*------------------------------------------------------------ + * Construction + */ + + /** + * Setup monitoring task + * @param mountPointName to monitor + * @param odlEventListener to forward problems to + */ + public DeviceMonitorTask(String mountPointName, ODLEventListener odlEventListener) { + LOG.debug("Init task {}", DeviceMonitorTask.class.getSimpleName()); + + //Setup finals + this.mountPointName = mountPointName; + this.odlEventListener = odlEventListener; + this.checkConnectionToMediator = new Checker() { + @Override + boolean isReachableOnce() { + synchronized(lockNe) { + //If ne is not connected anymore clear alarms + return ne == null ? true : ne.checkAndConnectionToMediatorIsOk(); + } + } + }; + this.checkConnectionToNe = new Checker() { + @Override + boolean isReachableOnce() { + synchronized(lockNe) { + //If ne is not connected anymore clear alarms + return ne == null ? true : ne.checkAndConnectionToNeIsOk(); + } + } + }; + + //Setup parameters + this.taskHandle = null; + this.tickCounter = 0; + this.ne = null; + this.currentProblems = Collections.synchronizedSet(EnumSet.noneOf(DeviceMonitorProblems.class)); + this.disconnectSupervisionTickout = 0; + + int removed = odlEventListener.removeAllCurrentProblemsOfNode(mountPointName); + LOG.debug("{} Init task removed fault entries {}", LOGMARKER, removed); + + } + + /** + * Start for each object an own instance of the thread. + * @param scheduler for all the threads. + */ + public void start(ScheduledExecutorService scheduler) { + LOG.info("{} {} DeviceMonitor task to create", LOGMARKER, tickCounter); + if (taskHandle == null) { + startDisconnectSupervision(); + taskHandle = scheduler.scheduleAtFixedRate(this, 0, 120, TimeUnit.SECONDS); + LOG.info("DeviceMonitor task scheduled"); + } else { + LOG.error("{} {} Task already running.", LOGMARKER, tickCounter); + } + } + + /** + * Call after NE change state to connected + * @param neParam that connected + */ + + public void deviceConnectIndication(ONFCoreNetworkElementRepresentation neParam) { + LOG.info("{} {} Connect {} and stop.", LOGMARKER, tickCounter, mountPointName); + clear(DeviceMonitorProblems.connectionLossOAM); + synchronized(lockNe) { + this.ne = neParam; + } + stopDisconnectSupervision(); + } + + /** + * If ne is disconnected do the related actions. + */ + + public void deviceDisconnectIndication() { + LOG.info("{} {} Disconnect {} and start.", LOGMARKER, tickCounter, mountPointName); + clear(DeviceMonitorProblems.connectionLossOAM); + synchronized(lockNe) { + this.ne = null; + } + startDisconnectSupervision(); + } + + /** + * Do all actions to clean up the log if mountpoint has been deleted. + * Prepare cancellation of the task and cancel task + */ + + public void removeMountpointIndication() { + for (DeviceMonitorProblems problem : DeviceMonitorProblems.values()) { + clear(problem); + } + //Cancel the task + if (this.taskHandle != null) { + this.taskHandle.cancel(false); + LOG.info("{} {} DeviceMonitor task canceled for {}", LOGMARKER, tickCounter, mountPointName); + } else { + LOG.error("{} {} Task already stopped", LOGMARKER, tickCounter); + } + } + + /*------------------------------------------------------------ + * Functions + */ + + /** + * Raise a problem, but only once + * @param problem + */ + private void raise(DeviceMonitorProblems problem) { + LOG.debug("{} Raise problem {} Raised-status {}",LOGMARKER, problem.name(), currentProblems.contains(problem)); + synchronized(currentProblems) { + if (! currentProblems.contains(problem)) { + currentProblems.add(problem); + odlEventListener.onProblemNotification(mountPointName, problem.name(), problem.getSeverity()); + } + } + + } + + /** + * Raise a problem, but only once + * @param problem + */ + private void clear(DeviceMonitorProblems problem) { + LOG.debug("{} Clear problem {} Raised-status {}",LOGMARKER, problem.name(), currentProblems.contains(problem)); + synchronized(currentProblems) { + if (currentProblems.contains(problem)) { + currentProblems.remove(problem); + odlEventListener.onProblemNotification(mountPointName, problem.name(), InternalSeverity.NonAlarmed); + } + } + } + + /** + * Process problem notification cascade + * @param isReachable + * @param problem + */ + private void clearRaiseIfConnected(Checker checker, DeviceMonitorProblems problem) { + LOG.debug("{} check start {} problem {} Raised-status {}",LOGMARKER, tickCounter, problem.name(), currentProblems.contains(problem)); + if (checker.isConnected()) { + clear(problem); + } else { + raise(problem); + } + LOG.debug("{} check end {} problem {} Raised-status {}",LOGMARKER, tickCounter, problem.name(), currentProblems.contains(problem)); + } + + + private void startDisconnectSupervision() { + synchronized(disconnectSupervisionTickout) { + this.disconnectSupervisionTickout = 2; + } + } + + private void stopDisconnectSupervision() { + synchronized(disconnectSupervisionTickout) { + this.disconnectSupervisionTickout = 0; + } + } + + private boolean processDisconnectSupervisionAndCheckExceeded() { + synchronized(disconnectSupervisionTickout) { + if (disconnectSupervisionTickout == 0) { + return true; + } else if (disconnectSupervisionTickout > 0) { + disconnectSupervisionTickout--; + } + return false; + } + } + + /*------------------------------------------------------------ + * TASK + */ + + /** + * Task to monitor connectivity to Network Elements. + * Connectivity problems lead to alarm indication. + */ + @Override + public void run() { + + try { + boolean neNullIndicator; + synchronized (lockNe) { + neNullIndicator = ne == null; + } + LOG.debug("{} START mountpoint {} tick {} ne==null {} tickout {}",LOGMARKER, mountPointName, tickCounter, neNullIndicator, disconnectSupervisionTickout); + if (neNullIndicator) { //NE not connected + LOG.debug("{} {} NE disconnected check {}", LOGMARKER, tickCounter, disconnectSupervisionTickout); + if (processDisconnectSupervisionAndCheckExceeded()) { + raise(DeviceMonitorProblems.connectionLossOAM); + } + } else { + clear(DeviceMonitorProblems.connectionLossOAM); //Always cleared never raised + LOG.debug("{} {} Prepare check", LOGMARKER, tickCounter); + ne.prepareCheck(); // Prepare ne check + // Mediator check + LOG.debug("{} {} Mediator check", LOGMARKER, tickCounter); + clearRaiseIfConnected(checkConnectionToMediator, DeviceMonitorProblems.connectionLossMediator); + + // NE check + LOG.debug("{} {} Ne check", LOGMARKER, tickCounter); + clearRaiseIfConnected(checkConnectionToNe, DeviceMonitorProblems.connectionLossNeOAM); + } + } catch (Exception e) { + //Prevent stopping the task + LOG.warn("{} {} (..something..) failed",LOGMARKER, tickCounter, e); + } + LOG.debug("{} {} END", LOGMARKER, tickCounter++); + + } + + +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/devicemanager/impl/DeviceManagerImpl.java b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/devicemanager/impl/DeviceManagerImpl.java new file mode 100644 index 00000000..fde6a155 --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/devicemanager/impl/DeviceManagerImpl.java @@ -0,0 +1,402 @@ +/** + * Copyright (c) 2017 highstreet technologies GmbH + * + * 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.mwtn.devicemanager.impl; + +import java.util.concurrent.ConcurrentHashMap; + +import javax.annotation.Nullable; + +import org.opendaylight.controller.md.sal.binding.api.DataBroker; +import org.opendaylight.controller.md.sal.binding.api.MountPoint; +import org.opendaylight.controller.md.sal.binding.api.MountPointService; +import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ProviderContext; +import org.opendaylight.controller.sal.binding.api.BindingAwareProvider; +import org.opendaylight.controller.sal.binding.api.RpcConsumerRegistry; +import org.opendaylight.mwtn.aaiConnector.impl.AaiProviderClient; +import org.opendaylight.mwtn.base.database.HtDatabaseNode; +import org.opendaylight.mwtn.base.netconf.ONFCoreNetworkElementFactory; +import org.opendaylight.mwtn.base.netconf.ONFCoreNetworkElementRepresentation; +import org.opendaylight.mwtn.config.impl.AkkaConfig; +import org.opendaylight.mwtn.config.impl.EsConfig; +import org.opendaylight.mwtn.config.impl.GeoConfig; +import org.opendaylight.mwtn.config.impl.HtDevicemanagerConfiguration; +import org.opendaylight.mwtn.config.impl.PmConfig; +import org.opendaylight.mwtn.dcaeConnector.impl.DcaeProviderClient; +import org.opendaylight.mwtn.deviceMonitor.impl.DeviceMonitorImpl; +import org.opendaylight.mwtn.devicemanager.api.DeviceManagerService; +import org.opendaylight.mwtn.devicemanager.impl.database.service.HtDatabaseEventsService; +import org.opendaylight.mwtn.devicemanager.impl.listener.NetconfChangeListener; +import org.opendaylight.mwtn.devicemanager.impl.listener.ODLEventListener; +import org.opendaylight.mwtn.devicemanager.impl.xml.WebSocketServiceClient; +import org.opendaylight.mwtn.devicemanager.impl.xml.XmlMapper; +import org.opendaylight.mwtn.index.impl.IndexConfigService; +import org.opendaylight.mwtn.index.impl.IndexMwtnService; +import org.opendaylight.mwtn.index.impl.IndexUpdateService; +import org.opendaylight.mwtn.performancemanager.impl.PerformanceManagerImpl; +import org.opendaylight.mwtn.performancemanager.impl.database.service.MicrowaveHistoricalPerformanceWriterService; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.notification._1._0.rev080714.CreateSubscriptionInput; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.notification._1._0.rev080714.CreateSubscriptionInputBuilder; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.notification._1._0.rev080714.NotificationsService; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.notification._1._0.rev080714.StreamNameType; +import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.NetconfNode; +import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.network.topology.topology.topology.types.TopologyNetconf; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.websocketmanager.rev150105.WebsocketmanagerService; +import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology; +import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId; +import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TopologyId; +import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology; +import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyKey; +import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node; +import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeKey; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.google.common.base.Optional; + +public class DeviceManagerImpl implements DeviceManagerService, BindingAwareProvider, AutoCloseable { + + private static final Logger LOG = LoggerFactory.getLogger(DeviceManagerImpl.class); + private static final String MYDBKEYNAME = "SDN-Controller"; + + // http://sendateodl:8181/restconf/operational/network-topology:network-topology/topology/topology-netconf + private static final InstanceIdentifier NETCONF_TOPO_IID = InstanceIdentifier + .create(NetworkTopology.class) + .child(Topology.class, new TopologyKey(new TopologyId(TopologyNetconf.QNAME.getLocalName()))); + + private ProviderContext session; + private DataBroker dataBroker; + + private WebSocketServiceClient webSocketService; + private HtDatabaseEventsService databaseClientEvents; + private ODLEventListener odlEventListener; + private NetconfChangeListener netconfChangeListener; + + private final ConcurrentHashMap networkElementRepresentations = new ConcurrentHashMap<>(); + private @Nullable PerformanceManagerImpl performanceManager = null; + private ProviderClient dcaeProviderClient; + private @Nullable AaiProviderClient aaiProviderClient; + private DeviceMonitorImpl deviceMonitor; + private IndexUpdateService updateService; + private IndexConfigService configService; + private IndexMwtnService mwtnService; + private HtDatabaseNode htDatabase; + private Boolean initialized = false; + + @Override + public void onSessionInitiated(ProviderContext pSession) { + LOG.info("Session Initiated start"); + + this.session = pSession; + this.dataBroker = pSession.getSALService(DataBroker.class); + + // Get configuration + HtDevicemanagerConfiguration config = HtDevicemanagerConfiguration.getConfiguration(); + AkkaConfig akkaConfig = null; + try { + akkaConfig = AkkaConfig.load(); + } catch (Exception e1) { + LOG.warn("error loading akka.conf: " + e1.getMessage()); + } + GeoConfig geoConfig = null; + if (akkaConfig != null && akkaConfig.isCluster()) { + if (GeoConfig.fileExists()) { + try { + LOG.debug("try to load geoconfig"); + geoConfig = GeoConfig.load(); + } catch (Exception err) { + LOG.warn("error loading geoconfig: " + err.getMessage()); + } + } else + LOG.debug("no geoconfig file found"); + } + EsConfig dbConfig = config.getEs(); + LOG.debug("esConfig=" + dbConfig.toString()); + // Start database + htDatabase = HtDatabaseNode.start(dbConfig, akkaConfig,geoConfig); + + // init Database Values only if singleNode or clusterMember=1 + if (akkaConfig == null || akkaConfig.isSingleNode() || (akkaConfig != null && akkaConfig.isCluster() + && akkaConfig.getClusterConfig().getRoleMemberIndex() == 1)) { + // Create DB index if not existing and if database is running + this.configService = new IndexConfigService(htDatabase); + this.mwtnService = new IndexMwtnService(htDatabase); + } + // Websockets + this.webSocketService = new WebSocketServiceClient(pSession.getRpcService(WebsocketmanagerService.class), + new XmlMapper()); + + // DCAE + this.dcaeProviderClient = new DcaeProviderClient(config, dbConfig.getCluster(), this); + + this.aaiProviderClient = new AaiProviderClient(config,this); + // EM + EsConfig emConfig = dbConfig.cloneWithIndex("sdnevents"); + + if (emConfig == null) { + LOG.warn("No {} configuration available. Don't start event manager"); + } else { + this.databaseClientEvents = new HtDatabaseEventsService(htDatabase); + + String myDbKeyNameExtended=MYDBKEYNAME+"-"+dbConfig.getCluster(); + + + this.odlEventListener = new ODLEventListener(myDbKeyNameExtended, webSocketService, databaseClientEvents, + dcaeProviderClient, null); + } + + // PM + PmConfig configurationPM = config.getPm(); + LOG.info("Performance manager configuration: {}", configurationPM); + if (!configurationPM.isPerformanceManagerEnabled()) { + + LOG.info("No configuration available. Don't start performance manager"); + } else { + @Nullable MicrowaveHistoricalPerformanceWriterService databaseClientHistoricalPerformance; + databaseClientHistoricalPerformance = new MicrowaveHistoricalPerformanceWriterService(htDatabase); + this.performanceManager = new PerformanceManagerImpl(60, databaseClientHistoricalPerformance); + } + + // DUS (Database update service) + LOG.debug("start db update service"); + this.updateService = new IndexUpdateService(htDatabase, dbConfig.getHost(), dbConfig.getCluster(), + dbConfig.getNode()); + this.updateService.start(); + + // DM + // DeviceMonitor has to be available before netconfSubscriptionManager is + // configured + LOG.debug("start DeviceMonitor Service"); + this.deviceMonitor = new DeviceMonitorImpl(odlEventListener); + + // netconfSubscriptionManager should be the last one because this is a callback + // service + LOG.debug("start NetconfSubscriptionManager Service"); + // this.netconfSubscriptionManager = new + // NetconfSubscriptionManagerOfDeviceManager(this, dataBroker); + // this.netconfSubscriptionManager.register(); + this.netconfChangeListener = new NetconfChangeListener(this, dataBroker); + this.netconfChangeListener.register(); + + synchronized (initialized) { + initialized = true; + } + + LOG.info("Session Initiated end"); + } + + @Override + public void close() throws Exception { + LOG.info("DeviceManagerImpl closing ..."); + + close(performanceManager); + close(dcaeProviderClient); + close(aaiProviderClient); + close(deviceMonitor); + close(updateService, configService, mwtnService); + close(htDatabase); + close(netconfChangeListener); + + LOG.info("DeviceManagerImpl closing done"); + } + + /** + * Used to close all Services, that should support AutoCloseable Pattern + * + * @param toClose + * @throws Exception + */ + private void close(AutoCloseable... toCloseList) throws Exception { + for (int t = 0; t < toCloseList.length; t++) { + if (toCloseList[t] != null) + toCloseList[t].close(); + } + } + + /** + * For each mounted device a mountpoint is created and this listener is called. + */ + @Override + public void startListenerOnNode(NodeId nNodeId, NetconfNode nNode) { + synchronized (networkElementRepresentations) { + + String mountPointNodeName = nNodeId.getValue(); + LOG.info("Starting Event listener on Netconf device :: Name : {}", mountPointNodeName); + + if (networkElementRepresentations.containsKey(mountPointNodeName)) { + LOG.warn("Mountpoint {} already registered. Leave startup procedure.", mountPointNodeName); + return; + } + if (!initialized) { + LOG.warn("Devicemanager initialization still pending. Leave startup procedure. Mountpoint {}", mountPointNodeName); + return; + } + + MountPointService mountService = session.getSALService(MountPointService.class); + + InstanceIdentifier instanceIdentifier = NETCONF_TOPO_IID.child(Node.class, + new NodeKey(new NodeId(mountPointNodeName))); + + Optional optionalMountPoint = null; + int timeout = 10000; + while (!(optionalMountPoint = mountService.getMountPoint(instanceIdentifier)).isPresent() && timeout > 0) { + + LOG.info("Event listener waiting for mount point for Netconf device :: Name : {}", mountPointNodeName); + try { + Thread.sleep(1000); + timeout -= 1000; + } catch (InterruptedException e) { + LOG.info("Event listener waiting for mount point for Netconf device :: Name : {} Time: {}", + mountPointNodeName, timeout); + } + } + + if (!optionalMountPoint.isPresent()) { + LOG.warn("Event listener timeout while waiting for mount point for Netconf device :: Name : {} ", + mountPointNodeName); + return; + } + + // Mountpoint is present for sure + MountPoint mountPoint = optionalMountPoint.get(); + + DataBroker netconfNodeDataBroker = mountPoint.getService(DataBroker.class).orNull(); + if (netconfNodeDataBroker == null) { + LOG.info("Mountpoint is slave mountpoint {}", mountPointNodeName); + return; + } + + LOG.info("Databroker service 1:{} 2:{}", dataBroker.hashCode(), netconfNodeDataBroker.hashCode()); + // getNodeInfoTest(dataBroker); + + + // Setup microwaveEventListener for Notificationservice + + // MicrowaveEventListener microwaveEventListener = new + // MicrowaveEventListener(mountPointNodeName, websocketmanagerService, + // xmlMapper, databaseClientEvents); + ONFCoreNetworkElementRepresentation ne = ONFCoreNetworkElementFactory.create(mountPointNodeName, dataBroker, + webSocketService, databaseClientEvents, instanceIdentifier, netconfNodeDataBroker, dcaeProviderClient, + null); + networkElementRepresentations.put(mountPointNodeName, ne); + ne.doRegisterMicrowaveEventListener(mountPoint); + + // Register netconf stream + registerNotificationStream(mountPointNodeName, mountPoint, "NETCONF"); + + // -- Read data from NE + ne.initialReadFromNetworkElement(); + ne.initSynchronizationExtension(); + + // Setup Service that monitors registration/ deregistration of session + odlEventListener.registration(mountPointNodeName); + + if (aaiProviderClient != null) { + aaiProviderClient.onDeviceRegistered(mountPointNodeName); + } + // -- Register NE to performance manager + if (performanceManager != null) { + performanceManager.registration(mountPointNodeName, ne); + } + + deviceMonitor.deviceConnectIndication(mountPointNodeName, ne); + + LOG.info("Starting Event listener on Netconf device :: Name : {} finished", mountPointNodeName); + + } + + } + + @Override + public void removeListenerOnNode(NodeId nNodeId, NetconfNode nNode) { + String mountPointNodeName = nNodeId.getValue(); + LOG.info("Removing NetworkElementRepresetations for device :: Name : {}", mountPointNodeName); + + ONFCoreNetworkElementRepresentation ne = networkElementRepresentations.remove(mountPointNodeName); + if (ne != null) { + int problems = ne.removeAllCurrentProblemsOfNode(); + LOG.debug("Removed all {} problems from database at deregistration for {}", problems, mountPointNodeName); + if (odlEventListener != null) + odlEventListener.deRegistration(mountPointNodeName); + if (performanceManager != null) { + performanceManager.deRegistration(mountPointNodeName); + } + if (aaiProviderClient != null) { + aaiProviderClient.onDeviceUnregistered(mountPointNodeName); + } + } else { + LOG.info("No related ne object for mountpoint {} to deregister .", mountPointNodeName); + } + if (deviceMonitor != null) + deviceMonitor.deviceDisconnectIndication(mountPointNodeName); + + } + + @Override + public void mountpointNodeCreation(NodeId nNodeId, NetconfNode nNode) { + String mountPointNodeName = nNodeId.getValue(); + LOG.info("mountpointNodeCreation {} {}", nNodeId.getValue(), nNode.getConnectionStatus()); + deviceMonitor.createMountpointIndication(mountPointNodeName); + } + + @Override + public void mountpointNodeRemoved(NodeId nNodeId) { + String mountPointNodeName = nNodeId.getValue(); + LOG.info("mountpointNodeRemoved {}", nNodeId.getValue()); + deviceMonitor.removeMountpointIndication(mountPointNodeName); + } + + /** + * Do the stream creation for the device. + * + * @param mountPointNodeName + * @param mountPoint + */ + private void registerNotificationStream(String mountPointNodeName, MountPoint mountPoint, String streamName) { + + final Optional optionalRpcConsumerService = mountPoint + .getService(RpcConsumerRegistry.class); + if (optionalRpcConsumerService.isPresent()) { + final RpcConsumerRegistry rpcConsumerRegitry = optionalRpcConsumerService.get(); + final NotificationsService rpcService = rpcConsumerRegitry.getRpcService(NotificationsService.class); + if (rpcService == null) { + LOG.warn("rpcService is null for mountpoint {}", mountPointNodeName); + } else { + final CreateSubscriptionInputBuilder createSubscriptionInputBuilder = new CreateSubscriptionInputBuilder(); + createSubscriptionInputBuilder.setStream(new StreamNameType(streamName)); + LOG.info("Event listener triggering notification stream {} for node {}", streamName, mountPointNodeName); + try { + CreateSubscriptionInput createSubscriptionInput = createSubscriptionInputBuilder.build(); + if (createSubscriptionInput == null) { + LOG.warn("createSubscriptionInput is null for mountpoint {}", mountPointNodeName); + } else { + rpcService.createSubscription(createSubscriptionInput); + } + } catch (NullPointerException e) { + LOG.warn("createSubscription failed"); + } + } + } else { + LOG.warn("No RpcConsumerRegistry avaialble."); + } + + } + + /** + * Get NE object + * @param mountpoint + * @return null or ne specific data + */ + public @Nullable ONFCoreNetworkElementRepresentation getNeByMountpoint( String mountpoint ) { + + return networkElementRepresentations.get(mountpoint); + + } + +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/devicemanager/impl/ProviderClient.java b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/devicemanager/impl/ProviderClient.java new file mode 100644 index 00000000..918f78ec --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/devicemanager/impl/ProviderClient.java @@ -0,0 +1,22 @@ +package org.opendaylight.mwtn.devicemanager.impl; + +import org.opendaylight.mwtn.devicemanager.impl.xml.ProblemNotificationXml; + +public interface ProviderClient extends AutoCloseable { + + /** + * Send out problem notification, that was created by a device/ or NE + * @param mountPointName related + * @param notification xml description + */ + public void sendProblemNotification(String mountPointName, ProblemNotificationXml notification); + + /** + * Send out problem notification + * @param mountPointName related + * @param notification xml description + * @param neDeviceAlarm true indicates an NE originated alarm, false an sdncontroller generated alarm + */ + public void sendProblemNotification(String mountPointName, ProblemNotificationXml notification, boolean neDeviceAlarm); + +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/devicemanager/impl/database/service/HtDatabaseEventsService.java b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/devicemanager/impl/database/service/HtDatabaseEventsService.java new file mode 100644 index 00000000..e3afea7a --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/devicemanager/impl/database/service/HtDatabaseEventsService.java @@ -0,0 +1,204 @@ +/********************************************************************************* + * Copyright © 2016, highstreet technologies GmbH + * All rights reserved! + * + * http://www.highstreet-technologies.com/ + * + * The reproduction, transmission or use of this document or its contents is not + * permitted without express written authority. Offenders will be liable for + * damages. All rights, including rights created by patent grant or registration + * of a utility model or design, are reserved. Technical modifications possible. + * Technical specifications and features are binding only insofar as they are + * specifically and expressly agreed upon in a written contract. + * + * @author: Herbert Eiselt [herbert.eiselt@highstreet-technologies.com] + *********************************************************************************/ + +package org.opendaylight.mwtn.devicemanager.impl.database.service; + +import org.opendaylight.mwtn.base.database.HtDataBaseReaderAndWriter; +import org.opendaylight.mwtn.base.database.HtDatabaseClientAbstract; +import org.opendaylight.mwtn.base.database.HtDatabaseNode; +import org.opendaylight.mwtn.base.database.IndexClientBuilder; +import org.opendaylight.mwtn.devicemanager.impl.database.types.EsEventBase; +import org.opendaylight.mwtn.devicemanager.impl.database.types.EsFaultCurrent; +import org.opendaylight.mwtn.devicemanager.impl.database.types.EsFaultLog; +import org.opendaylight.mwtn.devicemanager.impl.xml.AttributeValueChangedNotificationXml; +import org.opendaylight.mwtn.devicemanager.impl.xml.MwtNotificationBase; +import org.opendaylight.mwtn.devicemanager.impl.xml.ObjectCreationNotificationXml; +import org.opendaylight.mwtn.devicemanager.impl.xml.ObjectDeletionNotificationXml; +import org.opendaylight.mwtn.devicemanager.impl.xml.ProblemNotificationXml; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Event service, writing all events into the database into the appropriate index. + * + * @author herbert + */ +public class HtDatabaseEventsService { + private static final Logger LOG = LoggerFactory.getLogger(HtDatabaseEventsService.class); + + ///** Filename in the resources with maven initialized version information */ + //private static final String RESOURCENAME = "version.properties"; // could also be a constant + ///** Index name to be used */ + private static final String INDEX = "sdnevents"; + private static final String MAPPING = "/elasticsearch/index/sdnevents/sdneventsMapping.json"; + + private HtDatabaseClientAbstract client; + private HtDataBaseReaderAndWriter eventRWEventLog; + private HtDataBaseReaderAndWriter eventRWFaultCurrent; + private HtDataBaseReaderAndWriter eventRWFaultLog; + + + // --- Construct and initialize + + public HtDatabaseEventsService(HtDatabaseNode database) { + + LOG.info("Create {} start", HtDatabaseEventsService.class); + + try { + // Create control structure + IndexClientBuilder clientBuilder = IndexClientBuilder.getBuilder(INDEX).setMappingSettingJsonFileName(MAPPING); + client = clientBuilder.create(database); + + eventRWEventLog = new HtDataBaseReaderAndWriter<>(client, EsEventBase.ESDATATYPENAME, EsEventBase.class); + eventRWFaultLog = new HtDataBaseReaderAndWriter<>(client, EsFaultLog.ESDATATYPENAME, EsFaultLog.class); + eventRWFaultCurrent = new HtDataBaseReaderAndWriter<>(client, EsFaultCurrent.ESDATATYPENAME, EsFaultCurrent.class); + + + } catch (Exception e) { + LOG.error("Can not start database client. Exception: {}", e.getMessage()); + } + LOG.info("Create {} finished. DB Service {} started.", HtDatabaseEventsService.class, client != null ? "sucessfully" : "not" ); + } + + // --- Function + + public void writeEventLog(ObjectCreationNotificationXml event) { + writeEventGeneric(event); + } + + public void writeEventLog(ObjectDeletionNotificationXml event) { + writeEventGeneric(event); + } + + public void writeEventLog(AttributeValueChangedNotificationXml event) { + writeEventGeneric(event); + } + + private void writeEventGeneric(MwtNotificationBase event) { + if (client == null) { + LOG.debug("No DB, can not write: {}",event.toString()); + return; + } + + LOG.debug("Write event: {}",event.toString()); + EsEventBase eventBase = new EsEventBase(); + eventBase.setProblem(event); + eventRWEventLog.doWrite(eventBase); + } + + public void writeFaultLog(ProblemNotificationXml fault) { + if (client == null) { + LOG.debug("No DB, can not write: {}",fault.toString()); + return; + } + + LOG.debug("Write fault to faultlog: {}",fault.toString()); + EsFaultLog eventProblem = new EsFaultLog(); + eventProblem.setProblem(fault); + eventRWFaultLog.doWrite(eventProblem); + } + + public void updateFaultCurrent(ProblemNotificationXml fault) { + if (client == null) { + LOG.debug("No DB, can not write: {}",fault.toString()); + return; + } + + EsFaultCurrent eventProblem = new EsFaultCurrent(); + eventProblem.setProblem(fault); + + if (eventProblem.isNoAlarmIndication()) { + LOG.debug("Remove fault from currentlog: {}",fault.toString()); + eventRWFaultCurrent.doRemove(eventProblem); + } else { + LOG.debug("Write fault to currentlog: {}",fault.toString()); + eventRWFaultCurrent.doWrite(eventProblem); + } + } + + /** + * Remove all entries for one node + * @param nodeName contains the mountpointname + * @return number of deleted entries + */ + public int clearFaultsCurrentOfNode(String nodeName) { + if (client == null) { + LOG.debug("No DB, can not delete for node: {}", nodeName); + return -1; + } + LOG.debug("Remove from currentlog all faults for node: {}", nodeName); + return eventRWFaultCurrent.doRemoveByQuery(EsFaultCurrent.getQueryForOneNode(nodeName)); + /* + List faults = eventRWFaultCurrent.doReadAll(); + for (EsFaultCurrent fault : faults) { + if (fault.getProblem().getNodeName().equals(nodeName)) { + eventRWFaultCurrent.doRemove(fault); + } + } + return faults.size(); + */ + } + + /** + * Remove all entries for one node + * @param nodeName contains the mountpointname + * @param objectId of element to be deleted + * @return number of deleted entries + */ + public int clearFaultsCurrentOfNodeWithObjectId(String nodeName, String objectId) { + if (client == null) { + LOG.debug("No DB, can not delete for node: {}", nodeName); + return -1; + } + LOG.debug("Remove from currentlog all faults for node/objectId: {}/{}", nodeName, objectId); + return eventRWFaultCurrent.doRemoveByQuery(EsFaultCurrent.getQueryForOneNodeAndObjectId(nodeName, objectId)); + + } + + + /*private void writeVersionInfo(HtDataBaseReaderAndWriter pEventRWVersionInfo, + String configurationId) { + + ClassLoader loader = Thread.currentThread().getContextClassLoader(); + Properties props = new Properties(); + + InputStream resourceStream = loader.getResourceAsStream(RESOURCENAME); + try { + props.load(resourceStream); + + } catch (IOException e1) { + } + finally { + try { + if(resourceStream!=null) + resourceStream.close(); + } catch (IOException e) { + LOG.debug("failed to close stream"); + } + } + + EsVersionInfo version = new EsVersionInfo(); + version.setEsId(configurationId); + version.setBundleVersion(FrameworkUtil.getBundle(getClass()).getVersion()); + version.setVersion(props.getProperty("version", "unknown")); + version.setBuild(props.getProperty("build", "unknown")); + + LOG.info("Versioninfo: {}",version ); + + pEventRWVersionInfo.doWrite(version); + }*/ + +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/devicemanager/impl/database/types/EsEventBase.java b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/devicemanager/impl/database/types/EsEventBase.java new file mode 100644 index 00000000..0b8b7d5e --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/devicemanager/impl/database/types/EsEventBase.java @@ -0,0 +1,30 @@ +package org.opendaylight.mwtn.devicemanager.impl.database.types; + +import org.opendaylight.mwtn.base.database.EsObject; +import org.opendaylight.mwtn.devicemanager.impl.xml.MwtNotificationBase; + +/** + * + * Event from Network to be recorded in the database + * + */ + +public class EsEventBase extends EsObject { + + public static final String ESDATATYPENAME = "eventlog"; + + private MwtNotificationBase event; + + public MwtNotificationBase getProblem() { + return event; + } + + public void setProblem(MwtNotificationBase event) { + this.event = event; + } + + public static String getEsdatatypename() { + return ESDATATYPENAME; + } + + } diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/devicemanager/impl/database/types/EsFaultCurrent.java b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/devicemanager/impl/database/types/EsFaultCurrent.java new file mode 100644 index 00000000..625da7ba --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/devicemanager/impl/database/types/EsFaultCurrent.java @@ -0,0 +1,51 @@ +package org.opendaylight.mwtn.devicemanager.impl.database.types; + +import org.elasticsearch.index.query.BoolQueryBuilder; +import org.elasticsearch.index.query.QueryBuilder; +import org.elasticsearch.index.query.QueryBuilders; +import org.opendaylight.mwtn.base.database.EsObject; +import org.opendaylight.mwtn.devicemanager.impl.xml.ProblemNotificationXml; + +/** + * Event from Network to be recorded in the database + * + */ + +public class EsFaultCurrent extends EsObject { + + public static final String ESDATATYPENAME = "faultcurrent"; + //private static final String NOALARM = "NonAlarmed"; + + private ProblemNotificationXml faultCurrent; + + public ProblemNotificationXml getProblem() { + return faultCurrent; + } + + public void setProblem(ProblemNotificationXml fault) { + this.faultCurrent = fault; + setEsId(fault.genSpecificEsId()); + } + + public boolean isNoAlarmIndication() { + return faultCurrent.getSeverity().isNoAlarmIndication(); + } + + public static QueryBuilder getQueryForOneNode( String nodeName) { + return QueryBuilders.termQuery("faultCurrent.nodeName", nodeName); + } + + public static QueryBuilder getQueryForOneNodeAndObjectId( String nodeName, String objectId) { + BoolQueryBuilder bq = QueryBuilders.boolQuery(); + bq.must(QueryBuilders.termQuery("faultCurrent.nodeName", nodeName)); + bq.must(QueryBuilders.termQuery("faultCurrent.objectId", objectId)); + return bq; + //return QueryBuilders.termQuery("faultCurrent.objectId", objectId); + + } + + public static String getEsdatatypename() { + return ESDATATYPENAME; + } + + } diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/devicemanager/impl/database/types/EsFaultLog.java b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/devicemanager/impl/database/types/EsFaultLog.java new file mode 100644 index 00000000..4b7b2215 --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/devicemanager/impl/database/types/EsFaultLog.java @@ -0,0 +1,30 @@ +package org.opendaylight.mwtn.devicemanager.impl.database.types; + +import org.opendaylight.mwtn.base.database.EsObject; +import org.opendaylight.mwtn.devicemanager.impl.xml.ProblemNotificationXml; + +/** + * + * Event from Network to be recorded in the database + * + */ + +public class EsFaultLog extends EsObject { + + public static final String ESDATATYPENAME = "faultlog"; + + private ProblemNotificationXml fault; + + public ProblemNotificationXml getProblem() { + return fault; + } + + public void setProblem(ProblemNotificationXml fault) { + this.fault = fault; + } + + public static String getEsdatatypename() { + return ESDATATYPENAME; + } + + } diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/devicemanager/impl/database/types/EsVersionInfo.java b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/devicemanager/impl/database/types/EsVersionInfo.java new file mode 100644 index 00000000..c670e212 --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/devicemanager/impl/database/types/EsVersionInfo.java @@ -0,0 +1,58 @@ +package org.opendaylight.mwtn.devicemanager.impl.database.types; + +import org.opendaylight.mwtn.base.database.EsObject; +import org.osgi.framework.Version; + +/** + * + * Create a VersionInfo Object Network to be recorded in the database + * + */ + +public class EsVersionInfo extends EsObject { + + public static final String ESDATATYPENAME = "versioninfo"; + private static final String EMPTY = ""; + + private Version bundleVersion; + private String build = EMPTY; + private String version = EMPTY; + + public EsVersionInfo() { + } + + public Version getBundleVersion() { + return bundleVersion; + } + + public void setBundleVersion(Version bundleVersion) { + this.bundleVersion = bundleVersion; + } + + public String getBuild() { + return build; + } + + public void setBuild(String build) { + this.build = build; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + + public static String getEsdatatypename() { + return ESDATATYPENAME; + } + + @Override + public String toString() { + return "EsVersionInfo [bundleVersion=" + bundleVersion + ", build=" + build + ", version=" + version + "]"; + } + + + } diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/devicemanager/impl/listener/MicrowaveEventListener.java b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/devicemanager/impl/listener/MicrowaveEventListener.java new file mode 100644 index 00000000..e1c2e605 --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/devicemanager/impl/listener/MicrowaveEventListener.java @@ -0,0 +1,183 @@ +/* +* Copyright (c) 2016 Wipro Ltd. 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.mwtn.devicemanager.impl.listener; + +import java.util.List; + +import javax.annotation.Nullable; + +import org.opendaylight.mwtn.base.internalTypes.InternalDateAndTime; +import org.opendaylight.mwtn.base.internalTypes.InternalSeverity; +import org.opendaylight.mwtn.devicemanager.impl.ProviderClient; +import org.opendaylight.mwtn.devicemanager.impl.database.service.HtDatabaseEventsService; +import org.opendaylight.mwtn.devicemanager.impl.xml.AttributeValueChangedNotificationXml; +import org.opendaylight.mwtn.devicemanager.impl.xml.ObjectCreationNotificationXml; +import org.opendaylight.mwtn.devicemanager.impl.xml.ObjectDeletionNotificationXml; +import org.opendaylight.mwtn.devicemanager.impl.xml.ProblemNotificationXml; +import org.opendaylight.mwtn.devicemanager.impl.xml.WebSocketServiceClient; +import org.opendaylight.yang.gen.v1.uri.onf.microwavemodel.notifications.rev160809.AttributeValueChangedNotification; +import org.opendaylight.yang.gen.v1.uri.onf.microwavemodel.notifications.rev160809.MicrowaveModelNotificationsListener; +import org.opendaylight.yang.gen.v1.uri.onf.microwavemodel.notifications.rev160809.ObjectCreationNotification; +import org.opendaylight.yang.gen.v1.uri.onf.microwavemodel.notifications.rev160809.ObjectDeletionNotification; +import org.opendaylight.yang.gen.v1.uri.onf.microwavemodel.notifications.rev160809.ProblemNotification; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +/** + * Important: Websocket notificatin must be the last action. + * @author herbert + * + */ +public class MicrowaveEventListener implements MicrowaveModelNotificationsListener { + + private static final Logger LOG = LoggerFactory.getLogger(MicrowaveEventListener.class); + + private final String nodeName; + private final WebSocketServiceClient webSocketService; + private final HtDatabaseEventsService databaseService; + private final ProviderClient dcaeProvider; + private final @Nullable ProviderClient aotsmClient; + + public MicrowaveEventListener(String nodeName, WebSocketServiceClient webSocketService, + HtDatabaseEventsService databaseService, ProviderClient dcaeProvider,@Nullable ProviderClient aotsmClient) { + super(); + this.nodeName = nodeName; + this.webSocketService = webSocketService; + this.databaseService = databaseService; + this.dcaeProvider = dcaeProvider; + this.aotsmClient = aotsmClient; + + } + + @Override + public void onAttributeValueChangedNotification(AttributeValueChangedNotification notification) { + LOG.debug("Got event of type :: {}", AttributeValueChangedNotification.class.getSimpleName()); + + AttributeValueChangedNotificationXml notificationXml = new AttributeValueChangedNotificationXml(nodeName, + String.valueOf(notification.getCounter()), InternalDateAndTime.valueOf(notification.getTimeStamp()), + notification.getObjectIdRef().getValue(), notification.getAttributeName(), notification.getNewValue()); + + /* + WebsocketEventInputBuilder builder = new WebsocketEventInputBuilder(); + builder.setNodeName(nodeName); + builder.setEventType(AttributeValueChangedNotification.class.getSimpleName()); + builder.setXmlEvent(xmlMapper.getXmlString(notificationXml)); + WebsocketEventInput event= builder.build(); + websocketmanagerService.websocketEvent(event); + */ + databaseService.writeEventLog(notificationXml); + // Last notification to client to make shure that database already changed + webSocketService.sendViaWebsockets(nodeName, notificationXml); + } + + @Override + public void onObjectCreationNotification(ObjectCreationNotification notification) { + LOG.debug("Got event of type :: {}", ObjectCreationNotification.class.getSimpleName()); + + //ObjectCreationNotificationXml notificationXml = new ObjectCreationNotificationXml(nodeName, notification); + ObjectCreationNotificationXml notificationXml = new ObjectCreationNotificationXml( nodeName, + notification.getCounter().toString(), + InternalDateAndTime.valueOf(notification.getTimeStamp()), + notification.getObjectIdRef().getValue()); + /*public ObjectCreationNotificationXml(String nodeName, org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev170324.ObjectCreationNotification notification) { + super(nodeName, notification.getCounter().toString(), InternalDateAndTime.valueOf(notification.getTimeStamp()), + notification.getObjectIdRef().getValue()); + }*/ + /* + WebsocketEventInputBuilder builder = new WebsocketEventInputBuilder(); + builder.setNodeName(nodeName); + builder.setEventType(ObjectCreationNotification.class.getSimpleName()); + builder.setXmlEvent(xmlMapper.getXmlString(notificationXml)); + websocketmanagerService.websocketEvent(builder.build()); + */ + databaseService.writeEventLog(notificationXml); + + webSocketService.sendViaWebsockets(nodeName, notificationXml); + + } + + @Override + public void onObjectDeletionNotification(ObjectDeletionNotification notification) { + LOG.debug("Got event of type :: {}", ObjectDeletionNotification.class.getSimpleName()); + + //ObjectDeletionNotificationXml notificationXml = new ObjectDeletionNotificationXml(nodeName, notification); + ObjectDeletionNotificationXml notificationXml = new ObjectDeletionNotificationXml(nodeName, + notification.getCounter().toString(), + InternalDateAndTime.valueOf(notification.getTimeStamp()), + notification.getObjectIdRef().getValue() + ); + /* + WebsocketEventInputBuilder builder = new WebsocketEventInputBuilder(); + builder.setNodeName(nodeName); + builder.setEventType(ObjectDeletionNotification.class.getSimpleName()); + builder.setXmlEvent(xmlMapper.getXmlString(notificationXml)); + websocketmanagerService.websocketEvent(builder.build()); + */ + databaseService.writeEventLog(notificationXml); + + webSocketService.sendViaWebsockets(nodeName, notificationXml); + } + + @Override + public void onProblemNotification(ProblemNotification notification) { + LOG.debug("Got event of type :: {}", ProblemNotification.class.getSimpleName()); + + ProblemNotificationXml notificationXml = new ProblemNotificationXml(nodeName, notification.getObjectIdRef().getValue(), + notification.getProblem(), InternalSeverity.valueOf(notification.getSeverity()), + notification.getCounter().toString(), InternalDateAndTime.valueOf(notification.getTimeStamp())); + /* + WebsocketEventInputBuilder wsBuilder = new WebsocketEventInputBuilder(); + wsBuilder.setNodeName(nodeName); + wsBuilder.setEventType(ProblemNotification.class.getSimpleName()); + wsBuilder.setXmlEvent(xmlMapper.getXmlString(notificationXml)); + websocketmanagerService.websocketEvent(wsBuilder.build()); + */ + + databaseService.writeFaultLog(notificationXml); + databaseService.updateFaultCurrent(notificationXml); + + if (dcaeProvider != null) { + dcaeProvider.sendProblemNotification(nodeName, notificationXml); + } + if (aotsmClient != null) { + aotsmClient.sendProblemNotification(nodeName, notificationXml); + } + + webSocketService.sendViaWebsockets(nodeName, notificationXml); + + } + + private void initCurrentProblem(ProblemNotificationXml notificationXml) { + databaseService.updateFaultCurrent(notificationXml); + if (aotsmClient != null) { + aotsmClient.sendProblemNotification(this.nodeName, notificationXml); + } + } + + /** + * Called to initialize with the current status and notify the clients + * @param notificationXmlList List with problems + */ + public void initCurrentProblem(List notificationXmlList) { + + for (ProblemNotificationXml notificationXml : notificationXmlList) { + initCurrentProblem(notificationXml); + } + + } + + /** + * Called on exit to remove everything from the current list. + * @return Number of deleted objects + */ + public int removeAllCurrentProblemsOfNode() { + int deleted = databaseService.clearFaultsCurrentOfNode(nodeName); + return deleted; + } + +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/devicemanager/impl/listener/MicrowaveEventListener12.java b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/devicemanager/impl/listener/MicrowaveEventListener12.java new file mode 100644 index 00000000..dd313591 --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/devicemanager/impl/listener/MicrowaveEventListener12.java @@ -0,0 +1,178 @@ +/* +* Copyright (c) 2016 Wipro Ltd. 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.mwtn.devicemanager.impl.listener; + +import java.util.List; + +import javax.annotation.Nullable; + +import org.opendaylight.mwtn.base.internalTypes.InternalDateAndTime; +import org.opendaylight.mwtn.base.internalTypes.InternalSeverity; +import org.opendaylight.mwtn.devicemanager.impl.ProviderClient; +import org.opendaylight.mwtn.devicemanager.impl.database.service.HtDatabaseEventsService; +import org.opendaylight.mwtn.devicemanager.impl.xml.AttributeValueChangedNotificationXml; +import org.opendaylight.mwtn.devicemanager.impl.xml.ObjectCreationNotificationXml; +import org.opendaylight.mwtn.devicemanager.impl.xml.ObjectDeletionNotificationXml; +import org.opendaylight.mwtn.devicemanager.impl.xml.ProblemNotificationXml; +import org.opendaylight.mwtn.devicemanager.impl.xml.WebSocketServiceClient; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev170324.AttributeValueChangedNotification; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev170324.MicrowaveModelListener; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev170324.ObjectCreationNotification; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev170324.ObjectDeletionNotification; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev170324.ProblemNotification; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Important: Websocket notification must be the last action. + * @author herbert + * + */ +public class MicrowaveEventListener12 implements MicrowaveModelListener { + + private static final Logger LOG = LoggerFactory.getLogger(MicrowaveEventListener12.class); + + private final String nodeName; + private final WebSocketServiceClient webSocketService; + //private final WebsocketmanagerService websocketmanagerService; + //private final XmlMapper xmlMapper; + private final HtDatabaseEventsService databaseService; + private final ProviderClient dcaeProvider; + private final @Nullable ProviderClient aotsmClient; + + public MicrowaveEventListener12(String nodeName, WebSocketServiceClient webSocketService, + HtDatabaseEventsService databaseService, ProviderClient dcaeProvider,@Nullable ProviderClient aotsmClient) { + super(); + this.nodeName = nodeName; + //this.websocketmanagerService = websocketmanagerService; + //this.xmlMapper = xmlMapper; + this.webSocketService = webSocketService; + this.databaseService = databaseService; + this.dcaeProvider = dcaeProvider; + this.aotsmClient = aotsmClient; + } + + @Override + public void onAttributeValueChangedNotification(AttributeValueChangedNotification notification) { + LOG.debug("Got event of type :: {}", AttributeValueChangedNotification.class.getSimpleName()); + + AttributeValueChangedNotificationXml notificationXml = new AttributeValueChangedNotificationXml(nodeName, + String.valueOf(notification.getCounter()), InternalDateAndTime.valueOf(notification.getTimeStamp()), + notification.getObjectIdRef().getValue(), notification.getAttributeName(), notification.getNewValue()); + /* + WebsocketEventInputBuilder builder = new WebsocketEventInputBuilder(); + builder.setNodeName(nodeName); + builder.setEventType(AttributeValueChangedNotification.class.getSimpleName()); + builder.setXmlEvent(xmlMapper.getXmlString(notificationXml)); + WebsocketEventInput event= builder.build(); + websocketmanagerService.websocketEvent(event); + */ + databaseService.writeEventLog(notificationXml); + + webSocketService.sendViaWebsockets(nodeName, notificationXml); + } + + @Override + public void onObjectCreationNotification(ObjectCreationNotification notification) { + LOG.debug("Got event of type :: {}", ObjectCreationNotification.class.getSimpleName()); + + //ObjectCreationNotificationXml notificationXml = new ObjectCreationNotificationXml(nodeName, notification); + ObjectCreationNotificationXml notificationXml = new ObjectCreationNotificationXml( nodeName, + notification.getCounter().toString(), + InternalDateAndTime.valueOf(notification.getTimeStamp()), + notification.getObjectIdRef().getValue()); + /* + WebsocketEventInputBuilder builder = new WebsocketEventInputBuilder(); + builder.setNodeName(nodeName); + builder.setEventType(notificationXml.getEventType()); + builder.setXmlEvent(xmlMapper.getXmlString(notificationXml)); + websocketmanagerService.websocketEvent(builder.build()); + */ + databaseService.writeEventLog(notificationXml); + + webSocketService.sendViaWebsockets(nodeName, notificationXml); + + } + + @Override + public void onObjectDeletionNotification(ObjectDeletionNotification notification) { + LOG.debug("Got event of type :: {}", ObjectDeletionNotification.class.getSimpleName()); + + //ObjectDeletionNotificationXml notificationXml = new ObjectDeletionNotificationXml(nodeName, notification); + ObjectDeletionNotificationXml notificationXml = new ObjectDeletionNotificationXml(nodeName, + notification.getCounter().toString(), + InternalDateAndTime.valueOf(notification.getTimeStamp()), + notification.getObjectIdRef().getValue() + ); + /* + WebsocketEventInputBuilder builder = new WebsocketEventInputBuilder(); + builder.setNodeName(nodeName); + builder.setEventType(ObjectDeletionNotification.class.getSimpleName()); + builder.setXmlEvent(xmlMapper.getXmlString(notificationXml)); + websocketmanagerService.websocketEvent(builder.build()); + */ + databaseService.writeEventLog(notificationXml); + + webSocketService.sendViaWebsockets(nodeName, notificationXml); + } + + @Override + public void onProblemNotification(ProblemNotification notification) { + LOG.debug("Got event of type :: {}", ProblemNotification.class.getSimpleName()); + + ProblemNotificationXml notificationXml = new ProblemNotificationXml(nodeName, notification.getObjectIdRef().getValue(), + notification.getProblem(), InternalSeverity.valueOf(notification.getSeverity()), + notification.getCounter().toString(), InternalDateAndTime.valueOf(notification.getTimeStamp())); + /* + WebsocketEventInputBuilder wsBuilder = new WebsocketEventInputBuilder(); + wsBuilder.setNodeName(nodeName); + wsBuilder.setEventType(ProblemNotification.class.getSimpleName()); + wsBuilder.setXmlEvent(xmlMapper.getXmlString(notificationXml)); + websocketmanagerService.websocketEvent(wsBuilder.build()); + */ + + databaseService.writeFaultLog(notificationXml); + databaseService.updateFaultCurrent(notificationXml); + + dcaeProvider.sendProblemNotification(nodeName, notificationXml); + if(aotsmClient!=null) + aotsmClient.sendProblemNotification(nodeName, notificationXml); + + webSocketService.sendViaWebsockets(nodeName, notificationXml); + + } + + private void initCurrentProblem(ProblemNotificationXml notificationXml) { + databaseService.updateFaultCurrent(notificationXml); + if(aotsmClient!=null) + aotsmClient.sendProblemNotification(this.nodeName, notificationXml); + } + + /** + * Called to initialize with the current status and notify the clients + * @param notificationXmlList List with problems + */ + public void initCurrentProblem(List notificationXmlList) { + + for (ProblemNotificationXml notificationXml : notificationXmlList) { + initCurrentProblem(notificationXml); + } + + } + + /** + * Called on exit to remove everything from the current list. + * @return Number of deleted objects + */ + public int removeAllCurrentProblemsOfNode() { + int deleted = databaseService.clearFaultsCurrentOfNode(nodeName); + return deleted; + } + +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/devicemanager/impl/listener/NetconfChangeListener.java b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/devicemanager/impl/listener/NetconfChangeListener.java new file mode 100644 index 00000000..8b579977 --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/devicemanager/impl/listener/NetconfChangeListener.java @@ -0,0 +1,202 @@ +/** + * Copyright (c) 2017 highstreet technologies GmbH + * + * 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.mwtn.devicemanager.impl.listener; + +import java.util.Collection; + +import org.opendaylight.controller.md.sal.binding.api.ClusteredDataTreeChangeListener; +import org.opendaylight.controller.md.sal.binding.api.DataBroker; +import org.opendaylight.controller.md.sal.binding.api.DataObjectModification; +import org.opendaylight.controller.md.sal.binding.api.DataTreeIdentifier; +import org.opendaylight.controller.md.sal.binding.api.DataTreeModification; +import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; +import org.opendaylight.mwtn.devicemanager.api.DeviceManagerService; +import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.NetconfNode; +import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.NetconfNodeConnectionStatus.ConnectionStatus; +import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.network.topology.topology.topology.types.TopologyNetconf; +import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology; +import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId; +import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TopologyId; +import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology; +import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyKey; +import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node; +import org.opendaylight.yangtools.concepts.ListenerRegistration; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class NetconfChangeListener implements ClusteredDataTreeChangeListener, AutoCloseable { + + private static final Logger LOG = LoggerFactory.getLogger(NetconfChangeListener.class); + + private static final InstanceIdentifier NETCONF_NODE_TOPO_IID = InstanceIdentifier + .create(NetworkTopology.class) + .child(Topology.class, new TopologyKey(new TopologyId(TopologyNetconf.QNAME.getLocalName()))) + .child(Node.class); + + // Name of ODL controller NETCONF instance + private static final String CONTROLLER = "controller-config"; + + private final DeviceManagerService deviceManagerService; + private final DataBroker dataBroker; + private ListenerRegistration dlcReg; + + public NetconfChangeListener(DeviceManagerService deviceManagerService, DataBroker dataBroker) { + this.deviceManagerService = deviceManagerService; + this.dataBroker = dataBroker; + } + + public void register() { + DataTreeIdentifier treeId = new DataTreeIdentifier(LogicalDatastoreType.OPERATIONAL, + NETCONF_NODE_TOPO_IID); + dlcReg = dataBroker.registerDataTreeChangeListener(treeId, this); + } + + public void close() { + if (dlcReg != null) { + dlcReg.close(); + } + } + + /*--------------------------------------------------------------------------- + * Listener + */ + + @Override + public void onDataTreeChanged(Collection> changes) { + if (LOG.isDebugEnabled()) { + LOG.debug("OnDataChange, TreeChange"); + } else if (LOG.isTraceEnabled()) { + LOG.trace("OnDataChange, TreeChange {}", changes); + } + for (final DataTreeModification change : changes) { + final DataObjectModification root = change.getRootNode(); + switch (root.getModificationType()) { + case SUBTREE_MODIFIED: + // Change of subtree information + update(change); + break; + case WRITE: + // Create or modify top level node + // Treat an overwrite as an update + boolean update = change.getRootNode().getDataBefore() != null; + if (update) { + update(change); + } else { + add(change); + } + break; + case DELETE: + // Node removed + remove(change); + break; + default: + break; + } + } + } + + public void add(DataTreeModification newDataObject) { + Node node = newDataObject.getRootNode().getDataAfter(); + NodeId nodeId = node.getKey().getNodeId(); + LOG.info("Node {} added to topology-netconf", nodeId.getValue()); + NetconfNode netconfAugment = node.getAugmentation(NetconfNode.class); + if (nodeId != null) { + if (!nodeId.getValue().equals(CONTROLLER)) { + deviceManagerService.mountpointNodeCreation(nodeId, netconfAugment); + } + } + doProcessing(nodeId, netconfAugment); + } + + public void remove(DataTreeModification removedDataObject) { + Node node = removedDataObject.getRootNode().getDataBefore(); + NodeId nodeId = node.getKey().getNodeId(); + LOG.info("Node {} removed from topology-netconf", nodeId.getValue()); + NetconfNode netconfAugment = node.getAugmentation(NetconfNode.class); + if (nodeId != null) { + if (!nodeId.getValue().equals(CONTROLLER)) { + deviceManagerService.mountpointNodeRemoved(nodeId); + } + } + doProcessingRemove(nodeId, netconfAugment); + } + + public void update(DataTreeModification modifiedDataObject) { + // Node node = modifiedDataObject.getRootNode().getDataBefore(); + Node node = modifiedDataObject.getRootNode().getDataAfter(); + NodeId nodeId = node.getKey().getNodeId(); + LOG.info("Node {} modified in topology-netconf", nodeId.getValue()); + NetconfNode netconfAugment = node.getAugmentation(NetconfNode.class); + doProcessing(nodeId, netconfAugment); + } + + /** + * Process event and forward to clients + * + * @param nodeId + * Id of node + * @param nnode + * Netconf node + */ + private void doProcessing(NodeId nodeId, NetconfNode nnode) { + + if (nodeId == null || nnode == null) { + LOG.warn("Empty node .. stop processing"); + } + + String nodeIdString = nodeId.getValue(); + + if (nodeIdString.equals(CONTROLLER)) { + LOG.debug("Stop processing for [{}]", CONTROLLER); + return; + } + + ConnectionStatus csts = nnode.getConnectionStatus(); + LOG.debug("NETCONF Node handled with status: {}", csts.toString()); + switch (csts) { + case Connected: { + deviceManagerService.startListenerOnNode(nodeId, nnode); + break; + } + case Connecting: { + deviceManagerService.removeListenerOnNode(nodeId, nnode); + break; + } + case UnableToConnect: { + deviceManagerService.removeListenerOnNode(nodeId, nnode); + break; + } + } + } + + /** + * Remove node + * + * @param nodeId + * @param nnode + */ + private void doProcessingRemove(NodeId nodeId, NetconfNode nnode) { + + if (nodeId == null || nnode == null) { + LOG.warn("Empty node .. stop processing"); + } + + String nodeIdString = nodeId.getValue(); + + if (nodeIdString.equals(CONTROLLER)) { + LOG.debug("Stop processing for [{}]", CONTROLLER); + return; + } + + deviceManagerService.removeListenerOnNode(nodeId, nnode); + + } + +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/devicemanager/impl/listener/ODLEventListener.java b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/devicemanager/impl/listener/ODLEventListener.java new file mode 100644 index 00000000..c17e8615 --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/devicemanager/impl/listener/ODLEventListener.java @@ -0,0 +1,180 @@ +/* +* Copyright (c) 2017 highstreet technologies GmbH 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.mwtn.devicemanager.impl.listener; + +import javax.annotation.Nullable; + +import org.opendaylight.mwtn.base.internalTypes.InternalDateAndTime; +import org.opendaylight.mwtn.base.internalTypes.InternalSeverity; +import org.opendaylight.mwtn.base.netconf.NetconfTimeStamp; +import org.opendaylight.mwtn.devicemanager.impl.ProviderClient; +import org.opendaylight.mwtn.devicemanager.impl.database.service.HtDatabaseEventsService; +import org.opendaylight.mwtn.devicemanager.impl.xml.ObjectCreationNotificationXml; +import org.opendaylight.mwtn.devicemanager.impl.xml.ObjectDeletionNotificationXml; +import org.opendaylight.mwtn.devicemanager.impl.xml.ProblemNotificationXml; +import org.opendaylight.mwtn.devicemanager.impl.xml.WebSocketServiceClient; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev170324.ProblemNotification; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Responsible class for documenting changes in the ODL itself. The occurence of + * such an event is documented in the database and to clients. Specific example + * here is the registration or deregistration of a netconf device. This service + * has an own eventcounter to apply to the ONF Coremodel netconf behaviour. + * + * Important: Websocket notification must be the last action. + * + * @author herbert + */ + +public class ODLEventListener { + + private static final Logger LOG = LoggerFactory.getLogger(ODLEventListener.class); + + private final String ownKeyName; + + private final WebSocketServiceClient webSocketService; + private final HtDatabaseEventsService databaseService; + private final ProviderClient dcaeProvider; + private final ProviderClient aotsMProvider; + private int eventNumber; + + /*--------------------------------------------------------------- + * Construct + */ + + /** + * Create a Service to document events to clients and within a database + * + * @param ownKeyName + * The name of this service, that is used in the database as + * identification key. + * @param webSocketService + * service to direct messages to clients + * @param databaseService + * service to write to the database + * @param dcaeProvider + * to deliver problems to + */ + public ODLEventListener(String ownKeyName, WebSocketServiceClient webSocketService, + HtDatabaseEventsService databaseService, ProviderClient dcaeProvider, + @Nullable ProviderClient aotsMProvider) { + super(); + + this.ownKeyName = ownKeyName; + this.webSocketService = webSocketService; + + this.databaseService = databaseService; + this.dcaeProvider = dcaeProvider; + this.aotsMProvider = aotsMProvider; + + this.eventNumber = 0; + + } + + /*--------------------------------------------------------------- + * Functions + */ + + /** + * A registration of a mountpoint occured. + * + * @param registrationName + * Name of the event that is used as key in the database. + */ + + public void registration(String registrationName) { + + ObjectCreationNotificationXml cNotificationXml = new ObjectCreationNotificationXml(ownKeyName, + popEvntNumberAsString(), InternalDateAndTime.valueOf(NetconfTimeStamp.getTimeStamp()), + registrationName); + + // Write first to prevent missing entries + databaseService.writeEventLog(cNotificationXml); + + webSocketService.sendViaWebsockets(registrationName, cNotificationXml); + + } + + /** + * A deregistration of a mountpoint occured. + * + * @param registrationName + * Name of the event that is used as key in the database. + */ + + public void deRegistration(String registrationName) { + + ObjectDeletionNotificationXml dNotificationXml = new ObjectDeletionNotificationXml(ownKeyName, + popEvntNumberAsString(), InternalDateAndTime.valueOf(NetconfTimeStamp.getTimeStamp()), + registrationName); + + // Write first to prevent missing entries + databaseService.writeEventLog(dNotificationXml); + + webSocketService.sendViaWebsockets(registrationName, dNotificationXml); + + } + + /** + * At a mountpoint a problem situation is indicated + * + * @param registrationName + * indicating object within SDN controller, normally the + * mountpointName + * @param problemName + * that changed + * @param problemSeverity + * of the problem according to NETCONF/YANG + */ + + public void onProblemNotification(String registrationName, String problemName, InternalSeverity problemSeverity) { + LOG.debug("Got event of type :: {}", ProblemNotification.class.getSimpleName()); + // notification + + ProblemNotificationXml notificationXml = new ProblemNotificationXml(ownKeyName, registrationName, problemName, + problemSeverity, + // popEvntNumberAsString(), InternalDateAndTime.TESTPATTERN ); + popEvntNumberAsString(), InternalDateAndTime.valueOf(NetconfTimeStamp.getTimeStamp())); + + databaseService.writeFaultLog(notificationXml); + databaseService.updateFaultCurrent(notificationXml); + + dcaeProvider.sendProblemNotification(ownKeyName, notificationXml); + if (aotsMProvider != null) + aotsMProvider.sendProblemNotification(ownKeyName, notificationXml, false);// not a nealarm, its a + // sdncontroller alarm + + webSocketService.sendViaWebsockets(registrationName, notificationXml); + } + + /** + * Called on exit to remove everything for a node from the current list. + * + * @param nodeName + * to remove all problems for + * @return Number of deleted objects + */ + public int removeAllCurrentProblemsOfNode(String nodeName) { + return databaseService.clearFaultsCurrentOfNodeWithObjectId(ownKeyName, nodeName); + } + + /*--------------------------------------------------------------- + * Private + */ + + private String popEvntNumberAsString() { + return String.valueOf(popEvntNumber()); + } + + private int popEvntNumber() { + return eventNumber++; + } +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/devicemanager/impl/xml/AttributeValueChangedNotificationXml.java b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/devicemanager/impl/xml/AttributeValueChangedNotificationXml.java new file mode 100644 index 00000000..fe3b33c1 --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/devicemanager/impl/xml/AttributeValueChangedNotificationXml.java @@ -0,0 +1,60 @@ +/* +* Copyright (c) 2016 Wipro Ltd. 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.mwtn.devicemanager.impl.xml; + +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; + +import org.opendaylight.mwtn.base.internalTypes.InternalDateAndTime; + +@XmlRootElement(name = "AttributeValueChangedNotification") +public class AttributeValueChangedNotificationXml extends MwtNotificationBase implements GetEventType { + + private static String EVENTTYPE = "AttributeValueChangedNotification"; + + @XmlElement(name = "attributeName") + private String attributeName; + + @XmlElement(name = "newValue") + private String newValue; + + public AttributeValueChangedNotificationXml() { + + } + + /** + * Normalized notification + * @param nodeName name of mountpoint + * @param counter of notification + * @param timeStamp from ne + * @param objectIdRef from ne + * @param attributeName from ne + * @param newValue from ne + */ + public AttributeValueChangedNotificationXml(String nodeName, String counter, InternalDateAndTime timeStamp, String objectIdRef, + String attributeName, String newValue) { + super(nodeName, counter, timeStamp, objectIdRef); + this.attributeName = attributeName; + this.newValue = newValue; + } + + public String getAttributeName() { + return attributeName; + } + + public String getNewValue() { + return newValue; + } + + @Override + public String getEventType() { + return EVENTTYPE; + } + +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/devicemanager/impl/xml/GetEventType.java b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/devicemanager/impl/xml/GetEventType.java new file mode 100644 index 00000000..93b4b2f2 --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/devicemanager/impl/xml/GetEventType.java @@ -0,0 +1,12 @@ +/** + * + */ +package org.opendaylight.mwtn.devicemanager.impl.xml; + +/** + * @author herbert + * + */ +public interface GetEventType { + public String getEventType(); +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/devicemanager/impl/xml/MwtNotificationBase.java b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/devicemanager/impl/xml/MwtNotificationBase.java new file mode 100644 index 00000000..c5a16a28 --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/devicemanager/impl/xml/MwtNotificationBase.java @@ -0,0 +1,76 @@ +/* +* Copyright (c) 2016 Wipro Ltd. 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.mwtn.devicemanager.impl.xml; + +import javax.xml.bind.annotation.XmlElement; + +import org.opendaylight.mwtn.base.internalTypes.InternalDateAndTime; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public class MwtNotificationBase { + + private static String EMPTY = "empty"; + + private String nodeName; + private String counter; + private String timeStamp; + private String objectId; + + public MwtNotificationBase() { + // For Jaxb + } + + public MwtNotificationBase(String nodeName, String counter, InternalDateAndTime timeStamp, String objectId) { + this.nodeName = nodeName; + this.counter = counter; + this.timeStamp = timeStamp.getValue(); + this.objectId = objectId; + if (this.objectId == null) { + this.objectId = EMPTY; + } + } + + @XmlElement(name = "nodeName") + public String getNodeName() { + return nodeName; + } + + @XmlElement(name = "counter") + public String getCounter() { + return counter; + } + + @XmlElement(name = "timeStamp") + public String getTimeStamp() { + return timeStamp; + } + + @XmlElement(name = "objectId") + public String getObjectId() { + return objectId; + } + + /** + * Type for the Database to document the the same name that is used in the websockets. + * @return String with type name of child class + */ + @JsonProperty("type") + public String getType() { + return this.getClass().getSimpleName(); + } + + @Override + public String toString() { + return "MwtNotificationBase [getType()="+ getType() + ", nodeName=" + nodeName + ", counter=" + counter + ", timeStamp=" + timeStamp + + ", objectId=" + objectId + "]"; + } + + +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/devicemanager/impl/xml/ObjectCreationNotificationXml.java b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/devicemanager/impl/xml/ObjectCreationNotificationXml.java new file mode 100644 index 00000000..7bee673f --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/devicemanager/impl/xml/ObjectCreationNotificationXml.java @@ -0,0 +1,50 @@ +/* +* Copyright (c) 2016 Wipro Ltd. 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.mwtn.devicemanager.impl.xml; + +import javax.xml.bind.annotation.XmlRootElement; + +import org.opendaylight.mwtn.base.internalTypes.InternalDateAndTime; + +@XmlRootElement(name = "ObjectCreationNotification") +public class ObjectCreationNotificationXml extends MwtNotificationBase implements GetEventType { + + private static String EVENTTYPE = "ObjectCreationNotification"; + + public ObjectCreationNotificationXml() { + + } + + /** + * Normalized notification + * @param nodeName name of mountpoint or instance that owns the problem + * @param counter of notification + * @param timeStamp from ne + * @param objectIdRef from ne + */ + public ObjectCreationNotificationXml(String nodeName, String counter, InternalDateAndTime timeStamp, String objectIdRef) { + super(nodeName, counter, timeStamp, objectIdRef); + } + + /*public ObjectCreationNotificationXml(String nodeName, org.opendaylight.yang.gen.v1.uri.onf.microwavemodel.notifications.rev160809.ObjectCreationNotification notification) { + super(nodeName, notification.getCounter().toString(), InternalDateAndTime.valueOf(notification.getTimeStamp()), + notification.getObjectIdRef().getValue()); + } + + public ObjectCreationNotificationXml(String nodeName, org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev170324.ObjectCreationNotification notification) { + super(nodeName, notification.getCounter().toString(), InternalDateAndTime.valueOf(notification.getTimeStamp()), + notification.getObjectIdRef().getValue()); + }*/ + + @Override + public String getEventType() { + return EVENTTYPE; + } + +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/devicemanager/impl/xml/ObjectDeletionNotificationXml.java b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/devicemanager/impl/xml/ObjectDeletionNotificationXml.java new file mode 100644 index 00000000..7b6082c2 --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/devicemanager/impl/xml/ObjectDeletionNotificationXml.java @@ -0,0 +1,53 @@ +/* +* Copyright (c) 2016 Wipro Ltd. 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.mwtn.devicemanager.impl.xml; + +import javax.xml.bind.annotation.XmlRootElement; + +import org.opendaylight.mwtn.base.internalTypes.InternalDateAndTime; + +@XmlRootElement(name = "ObjectDeletionNotification") +public class ObjectDeletionNotificationXml extends MwtNotificationBase implements GetEventType { + + private static String EVENTTYPE = "ObjectDeletionNotification"; + + public ObjectDeletionNotificationXml() { + + } + + /** + * Normalized notification + * @param nodeName name of mountpoint or instance that owns the problem + * @param counter of notification + * @param timeStamp from ne + * @param objectIdRef from ne + */ + public ObjectDeletionNotificationXml(String nodeName, String counter, InternalDateAndTime timeStamp, String objectIdRef) { + super(nodeName, counter, timeStamp, objectIdRef); + } + + /* + public ObjectDeletionNotificationXml(String nodeName, ObjectDeletionNotification notification) { + super(nodeName, notification.getCounter().toString(), InternalDateAndTime.valueOf(notification.getTimeStamp()), +// notification.getObjectId().getValue()); + notification.getObjectIdRef().getValue()); + }*/ +/* + public ObjectDeletionNotificationXml(String nodeName, org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev170324.ObjectDeletionNotification notification) { + super(nodeName, notification.getCounter().toString(), InternalDateAndTime.valueOf(notification.getTimeStamp()), +// notification.getObjectId().getValue()); + notification.getObjectIdRef().getValue()); + } +*/ + @Override + public String getEventType() { + return EVENTTYPE; + } + +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/devicemanager/impl/xml/ProblemNotificationXml.java b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/devicemanager/impl/xml/ProblemNotificationXml.java new file mode 100644 index 00000000..15d8bbff --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/devicemanager/impl/xml/ProblemNotificationXml.java @@ -0,0 +1,109 @@ +/* +* Copyright (c) 2016 Wipro Ltd. 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.mwtn.devicemanager.impl.xml; + +import java.time.Instant; +import java.time.temporal.ChronoUnit; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; + +import org.opendaylight.mwtn.base.internalTypes.InternalDateAndTime; +import org.opendaylight.mwtn.base.internalTypes.InternalSeverity; + +import com.fasterxml.jackson.annotation.JsonIgnore; + +@XmlRootElement(name = "ProblemNotification") +public class ProblemNotificationXml extends MwtNotificationBase implements GetEventType { + + private static String EVENTTYPE = "ProblemNotification"; + private static final Pattern pattern = Pattern.compile(".*\\[layerProtocol=(.*)\\]"); + + @XmlElement(name = "problem") + private String problem; + + @XmlElement(name = "severity") + private InternalSeverity severity; + + public ProblemNotificationXml() { + + } + + /** + * Generic Problem. + * All the parameters are of type Strings according to YANG specification. + * @param nodeName Name of mountpoint + * @param uuId Name of Interface Pac + * @param problemNameString Name of the problem + * @param problemSeverityString Severitycode of the problem + * @param counterString Counter from device + * @param internaltimeStampString Timestamp according to internal format. + */ + public ProblemNotificationXml(String nodeName, String uuId, String problemNameString, InternalSeverity problemSeverityString, + String counterString, InternalDateAndTime internaltimeStampString) { + super(nodeName, counterString, internaltimeStampString, uuId); + this.problem = problemNameString; + this.severity = problemSeverityString; + } + + public String getProblem() { + return problem; + } + + public InternalSeverity getSeverity() { + return severity; + } + + /** + * Create a specific ES id for the current log. + * @param fault is the input. + * @return a string with the generated ES Id + */ + @JsonIgnore + public String genSpecificEsId() { + + String uuId; + + Matcher matcher = pattern.matcher(getObjectId()); + if (matcher.matches() && matcher.groupCount() == 1) { + uuId = matcher.group(1); + } else { + uuId = getObjectId(); + } + + StringBuffer strBuf = new StringBuffer(); + strBuf.append(getNodeName()); + strBuf.append("/"); + strBuf.append(uuId); + strBuf.append("/"); + strBuf.append(getProblem()); + return strBuf.toString(); + } + + + @Override + public String toString() { + return "ProblemNotificationXml [problem=" + problem + ", severity=" + severity + ", toString()=" + + super.toString() + "]"; + } + + @Override + public String getEventType() { + return EVENTTYPE; + } + + @JsonIgnore + public String getTimeStampOffset(int off) { + Instant instant=Instant.parse(this.getTimeStamp()); + return instant.truncatedTo(ChronoUnit.SECONDS).plusSeconds(off*60).toString(); +} + +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/devicemanager/impl/xml/WebSocketServiceClient.java b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/devicemanager/impl/xml/WebSocketServiceClient.java new file mode 100644 index 00000000..b972bdc4 --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/devicemanager/impl/xml/WebSocketServiceClient.java @@ -0,0 +1,53 @@ +/** + * + */ +package org.opendaylight.mwtn.devicemanager.impl.xml; + +import java.util.concurrent.Future; + +import org.opendaylight.mwtn.devicemanager.impl.listener.ODLEventListener; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.websocketmanager.rev150105.WebsocketEventInputBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.websocketmanager.rev150105.WebsocketEventOutput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.websocketmanager.rev150105.WebsocketmanagerService; +import org.opendaylight.yangtools.yang.common.RpcResult; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Wrapper for forwarding websocket notifications to the websocket service, that is running as container. + * @author herbert + */ +public class WebSocketServiceClient { + + private static final Logger LOG = LoggerFactory.getLogger(ODLEventListener.class); + + private final WebsocketmanagerService websocketmanagerService; + private final XmlMapper xmlMapper; + + /** + * @param websocketmanagerService object + * @param xmlMapper object + */ + public WebSocketServiceClient(WebsocketmanagerService websocketmanagerService, + XmlMapper xmlMapper) { + super(); + this.websocketmanagerService = websocketmanagerService; + this.xmlMapper = xmlMapper; + } + + public void sendViaWebsockets(String nodeName, T notificationXml) { + LOG.info("Send websocket event {} for mountpoint {}", notificationXml.getClass().getSimpleName(), nodeName); + + try { + WebsocketEventInputBuilder wsBuilder = new WebsocketEventInputBuilder(); + wsBuilder.setNodeName(nodeName); + wsBuilder.setEventType(notificationXml.getEventType()); + wsBuilder.setXmlEvent(xmlMapper.getXmlString(notificationXml)); + Future> result = websocketmanagerService.websocketEvent(wsBuilder.build()); + LOG.info("Send websocket result: {}", result.get().getResult().getResponse()); + } catch (Exception e) { + LOG.warn("Can not send websocket event {} for mountpoint {} {}", + notificationXml.getClass().getSimpleName(), nodeName, e.toString()); + } + } +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/devicemanager/impl/xml/XmlMapper.java b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/devicemanager/impl/xml/XmlMapper.java new file mode 100644 index 00000000..3684eb54 --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/devicemanager/impl/xml/XmlMapper.java @@ -0,0 +1,42 @@ +/* +* Copyright (c) 2016 Wipro Ltd. 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.mwtn.devicemanager.impl.xml; + +import java.io.StringWriter; + +import javax.xml.bind.JAXBContext; +import javax.xml.bind.JAXBException; +import javax.xml.bind.Marshaller; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class XmlMapper { + private static final Logger LOG = LoggerFactory.getLogger(XmlMapper.class); + + public String getXmlString(MwtNotificationBase base) { + String xml; + JAXBContext jaxbContext; + try { + jaxbContext = JAXBContext.newInstance(AttributeValueChangedNotificationXml.class, + ObjectCreationNotificationXml.class, ObjectDeletionNotificationXml.class, + ProblemNotificationXml.class); + Marshaller jaxbMarshaller = jaxbContext.createMarshaller(); + jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); + + StringWriter stringWriter = new StringWriter(); + jaxbMarshaller.marshal(base, stringWriter); + xml = stringWriter.toString(); + } catch (JAXBException e) { + LOG.warn("Problem in marshalling xml file {}", e); + xml = null; + } + return xml; + } +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/index/impl/IndexConfigService.java b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/index/impl/IndexConfigService.java new file mode 100644 index 00000000..4c3f2156 --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/index/impl/IndexConfigService.java @@ -0,0 +1,40 @@ +package org.opendaylight.mwtn.index.impl; + +import org.opendaylight.mwtn.base.database.HtDatabaseClientAbstract; +import org.opendaylight.mwtn.base.database.HtDatabaseNode; +import org.opendaylight.mwtn.base.database.IndexClientBuilder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Setup index mwtn in the database + * @author herbert + * + */ +public class IndexConfigService implements AutoCloseable { + + private static final Logger LOG = LoggerFactory.getLogger(IndexConfigService.class); + + /** Index name to be used */ + private static final String INDEX = "config"; + /** Location of configuration data **/ + private static final String MODELDATA = "/elasticsearch/index/config"; + + private HtDatabaseClientAbstract client; + + // --- Construct and initialize + + public IndexConfigService(HtDatabaseNode database) { + LOG.info("Create {} start", this.getClass().getSimpleName()); + + IndexClientBuilder clientBuilder = IndexClientBuilder.getBuilder(INDEX).setModelDataDirectory(MODELDATA); + client = clientBuilder.create(database); + LOG.info("Create {} finished. DB Service {} started.", this.getClass().getSimpleName(), client != null ? "sucessfully" : "not" ); + } + + @Override + public void close() throws Exception { + client.close(); + } + +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/index/impl/IndexMwtnService.java b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/index/impl/IndexMwtnService.java new file mode 100644 index 00000000..8900fec4 --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/index/impl/IndexMwtnService.java @@ -0,0 +1,43 @@ +package org.opendaylight.mwtn.index.impl; + +import org.opendaylight.mwtn.base.database.HtDatabaseClientAbstract; +import org.opendaylight.mwtn.base.database.HtDatabaseNode; +import org.opendaylight.mwtn.base.database.IndexClientBuilder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Setup index mwtn in the database + * @author herbert + * + */ +public class IndexMwtnService implements AutoCloseable { + + private static final Logger LOG = LoggerFactory.getLogger(IndexMwtnService.class); + + /** Index name to be used */ + private static final String INDEX = "mwtn"; + /** Location of mapping data **/ + private static final String MAPPING = "/elasticsearch/index/mwtn/mwtnMapping.json"; + /** Location of configuration data **/ + private static final String MODELDATA = "/elasticsearch/index/mwtn/modelDescription"; + + private HtDatabaseClientAbstract client; + + // --- Construct and initialize + + public IndexMwtnService(HtDatabaseNode database) { + LOG.info("Create {} start", this.getClass().getSimpleName()); + + IndexClientBuilder clientBuilder = IndexClientBuilder.getBuilder(INDEX) + .setMappingSettingJsonFileName(MAPPING) + .setModelDataDirectory(MODELDATA); + client = clientBuilder.create(database); + LOG.info("Create {} finished. DB Service {} started.", this.getClass().getSimpleName(), client != null ? "sucessfully" : "not" ); + } + + @Override + public void close() throws Exception { + client.close(); + } +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/index/impl/IndexUpdateService.java b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/index/impl/IndexUpdateService.java new file mode 100644 index 00000000..dd8c75e5 --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/index/impl/IndexUpdateService.java @@ -0,0 +1,99 @@ +package org.opendaylight.mwtn.index.impl; + +import java.io.File; +import java.io.IOException; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.TimeUnit; + +import org.opendaylight.mwtn.base.database.HtDatabaseNode; +import org.opendaylight.mwtn.base.database.HtDatabaseUpdateFile; +import org.opendaylight.mwtn.base.database.HtDatabaseUpdateFile.EsUpdateObject; +import org.opendaylight.mwtn.base.database.HtDatabaseUpdateFile.FileReadCallback; +import org.opendaylight.mwtn.base.database.HtDatabaseWebAPIClient; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class IndexUpdateService implements AutoCloseable { + + private static final Logger LOG = LoggerFactory.getLogger(IndexUpdateService.class); + + protected static final String FILENAME = "etc/elasticsearch_update.zip"; + + private final HtDatabaseWebAPIClient webClient; + + private final boolean autoremove=true; + + @SuppressWarnings("unused") + private ScheduledFuture taskHandle; + private final ScheduledExecutorService scheduler; + private final HtDatabaseNode database; + + private final FileReadCallback onReadUpdateFile = new FileReadCallback() + { + @Override + public void read(EsUpdateObject obj,String filename) { + try { + IndexUpdateService.this.webClient.sendRequest(obj.Uri, obj.Method, obj.Body); + LOG.info("run database update file "+filename); + } catch (IOException e) { + LOG.warn("problem for request "+obj.Uri); + } + } + + @Override + public void onerror(String filename,IOException e) { + LOG.warn("problem reading content file "+filename+ " :"+e.getMessage()); + } + + }; + private final Runnable checkForUpdateTask = new Runnable() { + + @Override + public void run() { + File f=new File(FILENAME); + if(f.exists()) + { + LOG.debug("found update file "+f.getAbsolutePath()); + try { + HtDatabaseUpdateFile updateFile=new HtDatabaseUpdateFile(FILENAME); + if(updateFile.readFiles(onReadUpdateFile)) + { + LOG.info("update successful"); + } + updateFile.close(); + if(IndexUpdateService.this.autoremove) + { + LOG.debug("autodelete updatefile"); + f.delete(); + } + + } catch (IOException e) { + LOG.warn("problem with update file:"+e.getMessage()); + } + } + } + + }; + + + + public IndexUpdateService(HtDatabaseNode database, String esNodeserverName, String esClusterName, String esNodeName) { + this.database = database; + this.webClient = new HtDatabaseWebAPIClient(); + this.scheduler = Executors.newSingleThreadScheduledExecutor(); + } + public void start() + { + this.taskHandle = this.scheduler.scheduleAtFixedRate(checkForUpdateTask, 0, 120, TimeUnit.SECONDS); + } + public void stop() + { + this.scheduler.shutdown(); + } + @Override + public void close() throws Exception { + stop(); + } +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/performancemanager/impl/PerformanceManagerImpl.java b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/performancemanager/impl/PerformanceManagerImpl.java new file mode 100644 index 00000000..ec20b5a4 --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/performancemanager/impl/PerformanceManagerImpl.java @@ -0,0 +1,53 @@ +package org.opendaylight.mwtn.performancemanager.impl; + +import javax.annotation.Nullable; + +import org.opendaylight.mwtn.base.netconf.ONFCoreNetworkElementRepresentation; +import org.opendaylight.mwtn.performancemanager.impl.database.service.MicrowaveHistoricalPerformanceWriterService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class PerformanceManagerImpl implements AutoCloseable { + + private static final Logger LOG = LoggerFactory.getLogger(PerformanceManagerImpl.class); + + private @Nullable PerformanceManagerTask task; + + public PerformanceManagerImpl(long seconds, MicrowaveHistoricalPerformanceWriterService databaseService) { + + LOG.info("Construct begin {} with {} Seconds",PerformanceManagerImpl.class.getSimpleName(), seconds); + + if (MicrowaveHistoricalPerformanceWriterService.isAvailable(databaseService)) { + + LOG.info("Do start of PM task"); + task = new PerformanceManagerTask(seconds, databaseService); + task.start(); + LOG.info("PM task scheduled"); + + } else { + LOG.info("Database not available. Do not start PM task"); + } + + LOG.info("Construct end {}",PerformanceManagerImpl.class.getSimpleName()); + } + + public void close() { + LOG.info("Close {}", PerformanceManagerImpl.class.getSimpleName()); + if (task != null) { + task.stop(); + } + } + + public void registration(String mountPointNodeName, ONFCoreNetworkElementRepresentation ne) { + LOG.debug("Register {}",mountPointNodeName); + if (task != null) + task.registration(mountPointNodeName, ne); + } + + public void deRegistration(String mountPointNodeName) { + LOG.debug("Deregister {}",mountPointNodeName); + if (task != null) + task.deRegistration(mountPointNodeName); + } + +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/performancemanager/impl/PerformanceManagerTask.java b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/performancemanager/impl/PerformanceManagerTask.java new file mode 100644 index 00000000..380bbe5c --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/performancemanager/impl/PerformanceManagerTask.java @@ -0,0 +1,220 @@ +package org.opendaylight.mwtn.performancemanager.impl; + +import java.util.Iterator; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.TimeUnit; + +import org.opendaylight.mwtn.base.netconf.AllPm; +import org.opendaylight.mwtn.base.netconf.ONFCoreNetworkElementRepresentation; +import org.opendaylight.mwtn.performancemanager.impl.database.service.MicrowaveHistoricalPerformanceWriterService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class PerformanceManagerTask implements Runnable { + + private static final Logger LOG = LoggerFactory.getLogger(PerformanceManagerTask.class); + private static final String LOGMARKER = "PMTick"; + + private int tickCounter = 0; + + private final ConcurrentHashMap queue = new ConcurrentHashMap<>(); + private final MicrowaveHistoricalPerformanceWriterService databaseService; + private final ScheduledExecutorService scheduler; + private long seconds; + + private ScheduledFuture taskHandle = null; + private Iterator neIterator = null; + private ONFCoreNetworkElementRepresentation actualNE = null; + + /** + * Constructor of PM Task + * @param seconds seconds to call PM Task + * @param databaseService DB Service to load PM data to + */ + + public PerformanceManagerTask(long seconds, MicrowaveHistoricalPerformanceWriterService databaseService) { + + LOG.debug("Init task {}", PerformanceManagerTask.class.getSimpleName()); + this.seconds = seconds; + this.databaseService = databaseService; + this.scheduler = Executors.newSingleThreadScheduledExecutor(); + + } + + /** + * Start PM Task + */ + public void start() { + LOG.info("PM task created"); + taskHandle = this.scheduler.scheduleAtFixedRate(this, 0, seconds, TimeUnit.SECONDS); + LOG.info("PM task scheduled"); + } + + /** + * Stop everything + */ + public void stop() { + LOG.info("Stop {}", PerformanceManagerImpl.class.getSimpleName()); + if (taskHandle != null) { + taskHandle.cancel(true); + try { + scheduler.awaitTermination(10, TimeUnit.SECONDS); + } catch (InterruptedException e) { + LOG.warn(e.toString()); + } + } + } + + /** + * Add NE/Mountpoint to PM Processig + * @param mountPointNodeName to be added + * @param ne that is connected to the mountpoint + */ + public void registration(String mountPointNodeName, ONFCoreNetworkElementRepresentation ne) { + queue.put(mountPointNodeName, ne); + } + + /** + * Remove mountpoint/NE from PM process + * @param mountPointNodeName that has to be removed + */ + public void deRegistration(String mountPointNodeName) { + LOG.debug("Deregister {}",mountPointNodeName); + ONFCoreNetworkElementRepresentation removedNE = queue.remove(mountPointNodeName); + + if ( removedNE == null) { + LOG.warn("Couldn't delete {}",mountPointNodeName); + } + } + + + /*-------------------------------------------------------------- + * Task to read PM data from NE + */ + + /** + * Task runner to read all performance data from Network Elements. + * Catch exceptions to make sure, that the Task is not stopped. + */ + @Override + public void run() { + + LOG.debug("{} start {} Start with mountpoint {}",LOGMARKER, tickCounter, actualNE == null ? "No NE" : actualNE.getMountPointNodeName()); + + //Proceed to next NE/Interface + getNextInterface(); + + LOG.debug("{} {} Next interface to handle {}", LOGMARKER, tickCounter, + actualNE == null ? "No NE/IF" : actualNE.getMountPointNodeName() + " " + actualNE.pmStatusToString()); + + if (actualNE != null) { + try { + LOG.debug("{} Start to read PM from NE ({})", LOGMARKER, tickCounter); + AllPm allPm = actualNE.getHistoricalPM(); + LOG.debug("{} {} Got PM list. Start write to DB", LOGMARKER, tickCounter); + databaseService.writePM(allPm); + LOG.debug("{} {} PM List end.", LOGMARKER, tickCounter); + } catch (Exception e) { + LOG.warn("{} {} PM read/write failed. Write log entry {}", LOGMARKER, tickCounter, e); + String msg = e.getMessage(); + if (msg == null || msg.isEmpty()) { + if (e.getCause() != null) { + msg = e.getCause().toString(); + } + if (msg == null || msg.isEmpty()){ + msg = "No message or cause"; + } + } + databaseService.writePMLog(actualNE.getMountPointNodeName(), actualNE.pmStatusToString(), msg); + } + } + + LOG.debug("{} end {}",LOGMARKER, tickCounter); + tickCounter++; + } + + /** + * Reset queue to start from beginning + */ + private void resetQueue() { + actualNE = null; + neIterator = null; + } + + /** + * Get then next interface in the list. + * First try to find a next on the actual NE. + * If not available search next interface at a NE + * Special Situations to handle: Empty queue, NEs, but no interfaces + */ + private void getNextInterface() { + boolean started = false; + int loopCounter = 0; + + LOG.debug("{} {} getNextInterface enter. Queue size {} ", LOGMARKER, tickCounter, queue.size()); + + if ((actualNE != null) && !queue.containsValue(actualNE)) { + LOG.debug("{} {} NE Removed duringprocessing A",LOGMARKER, tickCounter); + resetQueue(); + } + + while (true) { + + if (loopCounter++ >= 1000) { + LOG.error("{} {} Problem in PM iteration. endless condition reached", LOGMARKER, tickCounter); + resetQueue(); + break; + } + + LOG.debug("{} {} Loop ne {}:neiterator {}:Interfaceiterator:{} Loop:{}", + LOGMARKER, + tickCounter, + actualNE == null? "null" : actualNE.getMountPointNodeName(), + neIterator == null ? "null" : neIterator.hasNext(), + actualNE == null ? "null" : actualNE.hasNext(), + loopCounter); + + if (actualNE != null && actualNE.hasNext()) { + // Yes, there is an interface, deliver back + LOG.debug("{} {} getNextInterface yes A",LOGMARKER, tickCounter); + actualNE.next(); + break; + + } else { + // No element in neInterfaceInterator .. get next NE and try + if (neIterator != null && neIterator.hasNext()) { + // Set a new NE + LOG.debug("{} {} Next NE A",LOGMARKER, tickCounter); + actualNE = neIterator.next(); + actualNE.resetPMIterator(); + + } else { + // Goto start condition 1) first entry 2) end of queue reached + LOG.debug("{} {} Reset",LOGMARKER, tickCounter); + resetQueue(); + + if (queue.isEmpty()) { + LOG.debug("{} {} no nextInterfac. queue empty",LOGMARKER, tickCounter); + break; + } else if (!started){ + LOG.debug("{} {} getNextInterface start condition. Get interator.",LOGMARKER, tickCounter); + neIterator = queue.values().iterator(); + started = true; + } else { + LOG.debug("{} {} no nextInterface",LOGMARKER, tickCounter); + break; + } + } + } + } //while + + if ((actualNE != null) && !queue.containsValue(actualNE)) { + LOG.debug("{} {} NE Removed duringprocessing B",LOGMARKER, tickCounter); + resetQueue(); + } + + } +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/performancemanager/impl/database/service/MicrowaveHistoricalPerformanceWriterService.java b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/performancemanager/impl/database/service/MicrowaveHistoricalPerformanceWriterService.java new file mode 100644 index 00000000..daef26da --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/performancemanager/impl/database/service/MicrowaveHistoricalPerformanceWriterService.java @@ -0,0 +1,79 @@ +package org.opendaylight.mwtn.performancemanager.impl.database.service; + +import org.opendaylight.mwtn.base.database.HtDataBaseReaderAndWriter; +import org.opendaylight.mwtn.base.database.HtDatabaseClientAbstract; +import org.opendaylight.mwtn.base.database.HtDatabaseNode; +import org.opendaylight.mwtn.base.database.IndexClientBuilder; +import org.opendaylight.mwtn.base.netconf.AllPm; +import org.opendaylight.mwtn.base.netconf.NetconfTimeStamp; +import org.opendaylight.mwtn.performancemanager.impl.database.types.EsHistoricalPerformance15Minutes; +import org.opendaylight.mwtn.performancemanager.impl.database.types.EsHistoricalPerformance24Hours; +import org.opendaylight.mwtn.performancemanager.impl.database.types.EsHistoricalPerformanceLogEntry; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class MicrowaveHistoricalPerformanceWriterService { + + private static final Logger LOG = LoggerFactory.getLogger(MicrowaveHistoricalPerformanceWriterService.class); + private static final String INDEX = "sdnperformance"; + private static final String MAPPING = "/elasticsearch/index/sdnperformance/sdnperformanceMapping.json"; + + + private HtDatabaseClientAbstract client; + private HtDataBaseReaderAndWriter historicalPerformance15mRW; + private HtDataBaseReaderAndWriter historicalPerformance24hRW; + private HtDataBaseReaderAndWriter historicalPerformanceLogRW; + + public MicrowaveHistoricalPerformanceWriterService(HtDatabaseNode database) { + + LOG.info("Create {} start", MicrowaveHistoricalPerformanceWriterService.class); + + try { + + IndexClientBuilder clientBuilder = IndexClientBuilder.getBuilder(INDEX).setMappingSettingJsonFileName(MAPPING); + client = clientBuilder.create(database); + + historicalPerformance15mRW = new HtDataBaseReaderAndWriter<>(client, EsHistoricalPerformance15Minutes.ESDATATYPENAME, EsHistoricalPerformance15Minutes.class); + historicalPerformance24hRW = new HtDataBaseReaderAndWriter<>(client, EsHistoricalPerformance24Hours.ESDATATYPENAME, EsHistoricalPerformance24Hours.class); + historicalPerformanceLogRW = new HtDataBaseReaderAndWriter<>(client, EsHistoricalPerformanceLogEntry.ESDATATYPENAME, EsHistoricalPerformanceLogEntry.class); + + } catch (Exception e) { + client = null; + LOG.error("Can not start database client. Exception: {}", e.getMessage()); + } + + LOG.info("Create {} finished. DB Service {} started.", MicrowaveHistoricalPerformanceWriterService.class, client != null ? "sucessfully" : "not" ); + } + + + public void writePM(AllPm pm) { + + LOG.debug("Write {} pm records", pm.size()); + + LOG.debug("Write 15m write to DB"); + historicalPerformance15mRW.doWrite(pm.getPm15()); + LOG.debug("Write 15m done, Write 24h write to DB"); + historicalPerformance24hRW.doWrite(pm.getPm24()); + LOG.debug("Write 24h done"); + + } + + public void writePMLog(String mountpointName, String layerProtocolName, String msg) { + + LOG.debug("Write PM Log: {}", msg); + EsHistoricalPerformanceLogEntry logEntry = new EsHistoricalPerformanceLogEntry(mountpointName,layerProtocolName,NetconfTimeStamp.getTimeStamp().getValue() , msg ); + historicalPerformanceLogRW.doWrite(logEntry); + LOG.debug("Write PM Log done"); + + } + + + static public boolean isAvailable(MicrowaveHistoricalPerformanceWriterService s) { + + if (s == null || s.client == null) { + return false; + } + return true; + } + +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/performancemanager/impl/database/types/EsHistoricalPerformance15Minutes.java b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/performancemanager/impl/database/types/EsHistoricalPerformance15Minutes.java new file mode 100644 index 00000000..0046a97c --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/performancemanager/impl/database/types/EsHistoricalPerformance15Minutes.java @@ -0,0 +1,40 @@ +package org.opendaylight.mwtn.performancemanager.impl.database.types; + +import org.opendaylight.yang.gen.v1.uri.onf.coremodel.corenetworkmodule.objectclasses.rev160811.logicalterminationpoint.LpList; +import org.opendaylight.yang.gen.v1.uri.onf.g_874_1_model.object_classes.rev160710.OTNHistoryData; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.core.model.rev170320.logical.termination.point.g.Lp; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.g._874._1.model.rev170320.OtnHistoryDataG; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class EsHistoricalPerformance15Minutes extends EsHistoricalPerformanceBase { + + public static final String ESDATATYPENAME = "historicalperformance15min"; + + private static final Logger LOG = LoggerFactory.getLogger(EsHistoricalPerformance15Minutes.class); + + public EsHistoricalPerformance15Minutes(String nodeName, LpList lp) { + super(nodeName, lp); + } + + public EsHistoricalPerformance15Minutes(String nodeName, Lp lp) { + super(nodeName, lp); + } + + public EsHistoricalPerformance15Minutes setHistoricalRecord15Minutes(T record) { + if (record.getGranularityPeriod() != org.opendaylight.yang.gen.v1.uri.onf.g_874_1_model.type_definitions.rev160710.GranularityPeriodType.PERIOD15MIN) { + LOG.warn("Granularity mismatch for {} expected {} found {}", getNodeName(),getUuidInterface(), org.opendaylight.yang.gen.v1.uri.onf.g_874_1_model.type_definitions.rev160710.GranularityPeriodType.PERIOD15MIN, record.getGranularityPeriod()); + } + set(record); + return this; + } + + public EsHistoricalPerformance15Minutes setHistoricalRecord15Minutes(OtnHistoryDataG record) { + if (record.getGranularityPeriod() != org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.g._874._1.model.rev170320.GranularityPeriodType.Period15Min) { + LOG.warn("Granularity mismatch for {} expected {} found {}", getNodeName(),getUuidInterface(), org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.g._874._1.model.rev170320.GranularityPeriodType.Period15Min, record.getGranularityPeriod()); + } + set(record); + return this; + } + +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/performancemanager/impl/database/types/EsHistoricalPerformance24Hours.java b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/performancemanager/impl/database/types/EsHistoricalPerformance24Hours.java new file mode 100644 index 00000000..cf160639 --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/performancemanager/impl/database/types/EsHistoricalPerformance24Hours.java @@ -0,0 +1,30 @@ +package org.opendaylight.mwtn.performancemanager.impl.database.types; + +import org.opendaylight.yang.gen.v1.uri.onf.coremodel.corenetworkmodule.objectclasses.rev160811.logicalterminationpoint.LpList; +import org.opendaylight.yang.gen.v1.uri.onf.g_874_1_model.object_classes.rev160710.OTNHistoryData; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.core.model.rev170320.logical.termination.point.g.Lp; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.g._874._1.model.rev170320.OtnHistoryDataG; + +public class EsHistoricalPerformance24Hours extends EsHistoricalPerformanceBase { + + public static final String ESDATATYPENAME = "historicalperformance24h"; + + public EsHistoricalPerformance24Hours(String nodeName, LpList lp) { + super(nodeName, lp); + } + + public EsHistoricalPerformance24Hours(String nodeName, Lp lp) { + super(nodeName, lp); + } + + public EsHistoricalPerformance24Hours setHistoricalRecord24Hours(T record) { + set(record); + return this; + } + + public EsHistoricalPerformance24Hours setHistoricalRecord24Hours(T record) { + set(record); + return this; + } + +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/performancemanager/impl/database/types/EsHistoricalPerformanceBase.java b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/performancemanager/impl/database/types/EsHistoricalPerformanceBase.java new file mode 100644 index 00000000..ea4472e8 --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/performancemanager/impl/database/types/EsHistoricalPerformanceBase.java @@ -0,0 +1,191 @@ +package org.opendaylight.mwtn.performancemanager.impl.database.types; + +import org.opendaylight.mwtn.base.database.EsObject; +import org.opendaylight.mwtn.base.netconf.LinkIdentifyingObject; +import org.opendaylight.mwtn.base.netconf.NetconfTimeStamp; +import org.opendaylight.yang.gen.v1.uri.onf.coremodel.corenetworkmodule.objectclasses.rev160811.logicalterminationpoint.LpList; +import org.opendaylight.yang.gen.v1.uri.onf.g_874_1_model.object_classes.rev160710.OTNHistoryData; +import org.opendaylight.yang.gen.v1.uri.onf.g_874_1_model.type_definitions.rev160710.GranularityPeriodType; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.core.model.rev170320.logical.termination.point.g.Lp; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.g._874._1.model.rev170320.OtnHistoryDataG; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.fasterxml.jackson.annotation.JsonGetter; +import com.fasterxml.jackson.annotation.JsonIgnore; + +public class EsHistoricalPerformanceBase extends EsObject { + + private static final Logger LOG = LoggerFactory.getLogger(EsHistoricalPerformanceBase.class); + + @JsonIgnore private final String nodeName; + @JsonIgnore private final String uuidInterface; + @JsonIgnore private final String layerProtocolName; + + @JsonIgnore private String radioSignalId = null; //Meaning of connection Id + @JsonIgnore private String timeStamp = null; + @JsonIgnore private Boolean suspectIntervalFlag = null; + @JsonIgnore private String granularityPeriod = null; //Representation of GranularityPeriodType + @JsonIgnore private String scannerId = null; + @JsonIgnore private Object performanceData = null; + + + public EsHistoricalPerformanceBase(String nodeName, LpList actualInterface) { + this.nodeName = nodeName; + this.uuidInterface = actualInterface.getUuid().getValue(); + this.layerProtocolName = actualInterface.getLayerProtocolName().getValue(); + + } + + public EsHistoricalPerformanceBase(String nodeName, Lp actualInterface) { + this.nodeName = nodeName; + this.uuidInterface = actualInterface.getUuid().getValue(); + this.layerProtocolName = actualInterface.getLayerProtocolName().getValue(); + + } + + + protected void set(T record) { + if (record == null) { + LOG.warn("PM Record: null record. Can not handle"); + return; + } + + if (LOG.isTraceEnabled()) { + LOG.trace("PM Record: class {} '{}' ", record.getClass().getSimpleName(), record); + } + + timeStamp = NetconfTimeStamp.getTimeStampFromNetconf(record.getPeriodEndTime().getValue()); + suspectIntervalFlag = record.isSuspectIntervalFlag(); + granularityPeriod = getYangGranularityPeriodString( record.getGranularityPeriod() ); + scannerId = record.getHistoryDataId(); + + if (record instanceof LinkIdentifyingObject) { + radioSignalId = ((LinkIdentifyingObject) record).getSignalId(); + } + + performanceData = new EsPerformanceData10( record ); + setEsId(genSpecificEsId(record.getPeriodEndTime().getValue())); + } + + protected void set(T record) { + if (record == null) { + LOG.warn("PM Record: null record. Can not handle"); + return; + } + + if (LOG.isTraceEnabled()) { + LOG.trace("PM Record: class {} '{}' ", record.getClass().getSimpleName(), record); + } + + timeStamp = NetconfTimeStamp.getTimeStampFromNetconf(record.getPeriodEndTime().getValue()); + suspectIntervalFlag = record.isSuspectIntervalFlag(); + granularityPeriod = getYangGranularityPeriodString( record.getGranularityPeriod() ); + scannerId = record.getHistoryDataId(); + + if (record instanceof LinkIdentifyingObject) { + radioSignalId = ((LinkIdentifyingObject) record).getSignalId(); + } + + performanceData = new EsPerformanceData12( record ); + setEsId(genSpecificEsId(record.getPeriodEndTime().getValue())); + } + + + @JsonGetter("node-name") + public String getNodeName() { + return nodeName; + } + + @JsonGetter("uuid-interface") + public String getUuidInterface() { + return uuidInterface; + } + + @JsonGetter("layer-protocol-name") + public String getLayerProtocolName() { + return layerProtocolName; + } + + @JsonGetter("radio-signal-id") + public String getRadioSignalId() { + return radioSignalId; + } + + @JsonGetter("time-stamp") + public String getTimeStamp() { + return timeStamp; + } + + @JsonGetter("suspect-interval-flag") + public Boolean getSuspect() { + return suspectIntervalFlag; + } + + @JsonGetter("granularity-period") + public String getGranularityPeriod() { + return granularityPeriod; + } + + @JsonGetter("scanner-id") + public String getScannerId() { + return scannerId; + } + + @JsonGetter("performance-data") + public Object getData() { + return performanceData; + } + + + + //Adapt JSON Text + //@JsonGetter("granularityPeriod") + private static String getYangGranularityPeriodString(GranularityPeriodType yangGanularityPeriod) { + switch(yangGanularityPeriod == null ? GranularityPeriodType.UNKNOWN : yangGanularityPeriod) { + case PERIOD15MIN: + return "PERIOD_15MIN"; + case PERIOD24HOURS: + return "PERIOD_24HOURS"; + default: + return "PERIOD_UNKOWN"; + } + } + + private static String getYangGranularityPeriodString(org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.g._874._1.model.rev170320.GranularityPeriodType yangGanularityPeriod) { + switch(yangGanularityPeriod == null ? org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.g._874._1.model.rev170320.GranularityPeriodType.Unknown : yangGanularityPeriod) { + case Period15Min: + return "PERIOD_15MIN"; + case Period24Hours: + return "PERIOD_24HOURS"; + default: + return "PERIOD_UNKOWN"; + } + } + + /** + * Create a specific ES id for the current log. + * @param time is the input. + * @return a string with the generated ES Id + */ + protected String genSpecificEsId(String time) { + + StringBuffer strBuf = new StringBuffer(); + strBuf.append(nodeName); + strBuf.append("/"); + strBuf.append(uuidInterface); + strBuf.append("/"); + strBuf.append(time == null || time.isEmpty() ? "Empty" : time); + + return strBuf.toString(); + } + + @Override + public String toString() { + return "EsHistoricalPerformanceBase [nodeName=" + nodeName + ", uuidInterface=" + uuidInterface + + ", layerProtocolName=" + layerProtocolName + ", radioSignalId=" + radioSignalId + ", timeStamp=" + + timeStamp + ", suspectIntervalFlag=" + suspectIntervalFlag + ", granularityPeriod=" + + granularityPeriod + ", scannerId=" + scannerId + ", performanceData=" + performanceData + "]"; + } + +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/performancemanager/impl/database/types/EsHistoricalPerformanceLogEntry.java b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/performancemanager/impl/database/types/EsHistoricalPerformanceLogEntry.java new file mode 100644 index 00000000..50e83a20 --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/performancemanager/impl/database/types/EsHistoricalPerformanceLogEntry.java @@ -0,0 +1,75 @@ +package org.opendaylight.mwtn.performancemanager.impl.database.types; + +import org.opendaylight.mwtn.base.database.EsObject; + +/** + * + * Event from Network to be recorded in the database + * + */ + +public class EsHistoricalPerformanceLogEntry extends EsObject { + + public static final String ESDATATYPENAME = "performancelog"; + + private String mountpoint; + private String interfaceIdx; + private String timeStamp; + private String logText; + + /** + * Create Log entry for NE/Interfaceproblems during PM execution + * @param mountpoint Name of + * @param interfaceIdx Name of + * @param timeStamp Time and date of occurence + * @param logText to write + */ + public EsHistoricalPerformanceLogEntry(String mountpoint, String interfaceIdx, String timeStamp, String logText) { + super(); + this.mountpoint = mountpoint; + this.interfaceIdx = interfaceIdx; + this.timeStamp = timeStamp; + this.logText = logText; + } + + /** + * For jackson purpose + */ + EsHistoricalPerformanceLogEntry() { + } + + /** + * @return the mountpoint + */ + public String getMountpoint() { + return mountpoint; + } + + /** + * @return the interfaceIdx + */ + public String getInterfaceIdx() { + return interfaceIdx; + } + + /** + * @return the timeStamp + */ + public String getTimeStamp() { + return timeStamp; + } + + /** + * @return the logText + */ + public String getLogText() { + return logText; + } + + + + public static String getEsdatatypename() { + return ESDATATYPENAME; + } + + } diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/performancemanager/impl/database/types/EsPerformanceData10.java b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/performancemanager/impl/database/types/EsPerformanceData10.java new file mode 100644 index 00000000..bd4e3bf5 --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/performancemanager/impl/database/types/EsPerformanceData10.java @@ -0,0 +1,219 @@ +package org.opendaylight.mwtn.performancemanager.impl.database.types; + +import org.opendaylight.mwtn.base.netconf.ExtendedAirInterfaceHistoricalPerformanceType; +import org.opendaylight.yang.gen.v1.uri.onf.g_874_1_model.object_classes.rev160710.OTNHistoryData; +import org.opendaylight.yang.gen.v1.uri.onf.microwavemodel.typedefinitions.rev160902.AirInterfaceHistoricalPerformanceType; +import org.opendaylight.yang.gen.v1.uri.onf.microwavemodel.typedefinitions.rev160902.AirInterfacePerformanceType; +import org.opendaylight.yang.gen.v1.uri.onf.microwavemodel.typedefinitions.rev160902.ContainerHistoricalPerformanceType; +import org.opendaylight.yang.gen.v1.uri.onf.microwavemodel.typedefinitions.rev160902.ContainerPerformanceType; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.fasterxml.jackson.annotation.JsonGetter; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; + +@JsonInclude(JsonInclude.Include.NON_NULL) +public class EsPerformanceData10 { + + @JsonIgnore + private static final Logger LOG = LoggerFactory.getLogger(EsPerformanceData10.class); + + //@JsonIgnore + //private final org.opendaylight.yang.gen.v1.uri.onf.microwavemodel.typedefinitions.rev160902.airinterfacehistoricalperformancetype.PerformanceData dataAirInterface; + //@JsonIgnore + //private final org.opendaylight.yang.gen.v1.uri.onf.microwavemodel.typedefinitions.rev160902.containerhistoricalperformancetype.PerformanceData dataEthContainer; + @JsonIgnore + private AirInterfacePerformanceType dataAirInterface; + @JsonIgnore + private ContainerPerformanceType dataEthContainer; + @JsonIgnore + + + public EsPerformanceData10(T ff) { + + if (ff instanceof AirInterfaceHistoricalPerformanceType ) { + this.dataAirInterface = ((AirInterfaceHistoricalPerformanceType)ff).getPerformanceData(); + this.dataEthContainer = null; + //org.opendaylight.yang.gen.v1.uri.onf.microwavemodel.typedefinitions.rev160902.ContainerHistoricalPerformanceType + } else if (ff instanceof ContainerHistoricalPerformanceType) { + this.dataAirInterface = null; + this.dataEthContainer = ((ContainerHistoricalPerformanceType)ff).getPerformanceData(); + } else if (ff instanceof ExtendedAirInterfaceHistoricalPerformanceType) { + this.dataAirInterface = ((ExtendedAirInterfaceHistoricalPerformanceType)ff).getAirInterfaceHistoricalPerformanceType().getPerformanceData(); + this.dataEthContainer = null; + } else { + LOG.warn("Can not assign historical performance type {}", ff.getClass().getName()); + this.dataAirInterface = null; + this.dataEthContainer = null; + } + } + + @JsonGetter("es") + public java.lang.Integer getEs() { + return dataAirInterface != null ? dataAirInterface.getEs() : null; + } + + @JsonGetter("ses") + java.lang.Integer getSes() { + return dataAirInterface != null ? dataAirInterface.getSes() : null; + } + + @JsonGetter("cses") + java.lang.Integer getCses() { return dataAirInterface != null ? dataAirInterface.getCses() : null; } + + @JsonGetter("unavailability") + java.lang.Integer getUnavailability(){ return dataAirInterface != null ? dataAirInterface.getUnavailability() : null; } + + @JsonGetter("tx-level-min") + java.lang.Byte getTxLevelMin(){ return dataAirInterface != null ? dataAirInterface.getTxLevelMin() : null; } + + @JsonGetter("tx-level-max") + java.lang.Byte getTxLevelMax(){ return dataAirInterface != null ? dataAirInterface.getTxLevelMax() : null; } + + @JsonGetter("tx-level-avg") + java.lang.Byte getTxLevelAvg(){ return dataAirInterface != null ? dataAirInterface.getTxLevelAvg() : null; } + + @JsonGetter("rx-level-min") + java.lang.Byte getRxLevelMin(){ return dataAirInterface != null ? dataAirInterface.getRxLevelMin() : null; } + + @JsonGetter("rx-level-max") + java.lang.Byte getRxLevelMax(){ return dataAirInterface != null ? dataAirInterface.getRxLevelMax() : null; } + + @JsonGetter("rx-level-avg") + java.lang.Byte getRxLevelAvg(){ return dataAirInterface != null ? dataAirInterface.getRxLevelAvg() : null; } + + @JsonGetter("time2-states") + java.lang.Integer getTime2Symbols(){ return dataAirInterface != null ? dataAirInterface.getTime2Symbols() : null; } + + @JsonGetter("time4-states-s") + java.lang.Integer getTime4SymbolsS(){ return dataAirInterface != null ? dataAirInterface.getTime4SymbolsS() : null; } + + @JsonGetter("time4-states") + java.lang.Integer getTime4Symbols(){ return dataAirInterface != null ? dataAirInterface.getTime4Symbols() : null; } + + @JsonGetter("time8-states") + java.lang.Integer getTime8Symbols(){ return dataAirInterface != null ? dataAirInterface.getTime8Symbols() : null; } + + @JsonGetter("time16-states-s") + java.lang.Integer getTime16SymbolsS(){ return dataAirInterface != null ? dataAirInterface.getTime16SymbolsS() : null; } + + @JsonGetter("time16-states") + java.lang.Integer getTime16Symbols(){ return dataAirInterface != null ? dataAirInterface.getTime16Symbols() : null; } + + @JsonGetter("time32-states") + java.lang.Integer getTime32Symbols(){ return dataAirInterface != null ? dataAirInterface.getTime32Symbols() : null; } + + @JsonGetter("time64-states") + java.lang.Integer getTime64Symbols(){ return dataAirInterface != null ? dataAirInterface.getTime64Symbols() : null; } + + @JsonGetter("time128-states") + java.lang.Integer getTime128Symbols(){ return dataAirInterface != null ? dataAirInterface.getTime128Symbols() : null; } + + @JsonGetter("time256-states") + java.lang.Integer getTime256Symbols(){ return dataAirInterface != null ? dataAirInterface.getTime256Symbols() : null; } + + @JsonGetter("time512-states") + java.lang.Integer getTime512Symbols(){ return dataAirInterface != null ? dataAirInterface.getTime512Symbols() : null; } + + @JsonGetter("time512-states-l") + java.lang.Integer getTime512SymbolsL(){ return dataAirInterface != null ? dataAirInterface.getTime512SymbolsL() : null; } + + @JsonGetter("time1024-states") + java.lang.Integer getTime1024Symbols(){ return dataAirInterface != null ? dataAirInterface.getTime1024Symbols() : null; } + + @JsonGetter("time1024-states-l") + java.lang.Integer getTime1024SymbolsL(){ return dataAirInterface != null ? dataAirInterface.getTime1024SymbolsL() : null; } + + @JsonGetter("time2048-states") + java.lang.Integer getTime2048Symbols(){ return dataAirInterface != null ? dataAirInterface.getTime2048Symbols() : null; } + + @JsonGetter("time2048-states-l") + java.lang.Integer getTime2048SymbolsL(){ return dataAirInterface != null ? dataAirInterface.getTime2048SymbolsL() : null; } + + @JsonGetter("time4096-states") + java.lang.Integer getTime4096Symbols(){ return dataAirInterface != null ? dataAirInterface.getTime4096Symbols() : null; } + + @JsonGetter("time4096-states-l") + java.lang.Integer getTime4096SymbolsL(){ return dataAirInterface != null ? dataAirInterface.getTime4096SymbolsL() : null; } + + @JsonGetter("time8192-states") + java.lang.Integer getTime8192Symbols(){ return dataAirInterface != null ? dataAirInterface.getTime8192Symbols() : null; } + + @JsonGetter("time8192-states-l") + java.lang.Integer getTime8192SymbolsL(){ return dataAirInterface != null ? dataAirInterface.getTime8192SymbolsL() : null; } + + @JsonGetter("snir-min") + java.lang.Byte getSnirMin(){ return dataAirInterface != null ? dataAirInterface.getSnirMin() : null; } + + @JsonGetter("snir-max") + java.lang.Byte getSnirMax(){ return dataAirInterface != null ? dataAirInterface.getSnirMax() : null; } + + @JsonGetter("snir-avg") + java.lang.Byte getSnirAvg(){ return dataAirInterface != null ? dataAirInterface.getSnirAvg() : null; } + + @JsonGetter("xpd-min") + java.lang.Byte getXpdMin(){ return dataAirInterface != null ? dataAirInterface.getXpdMin() : null; } + + @JsonGetter("xpd-max") + java.lang.Byte getXpdMax(){ return dataAirInterface != null ? dataAirInterface.getXpdMax() : null; } + + @JsonGetter("xpd-avg") + java.lang.Byte getXpdAvg(){ return dataAirInterface != null ? dataAirInterface.getXpdAvg() : null; } + + @JsonGetter("rf-temp-min") + java.lang.Byte getRfTempMin(){ return dataAirInterface != null ? dataAirInterface.getRfTempMin() : null; } + + @JsonGetter("rf-temp-max") + java.lang.Byte getRfTempMax(){ return dataAirInterface != null ? dataAirInterface.getRfTempMax() : null; } + + @JsonGetter("rf-temp-avg") + java.lang.Byte getRfTempAvg(){ return dataAirInterface != null ? dataAirInterface.getRfTempAvg() : null; } + + @JsonGetter("defect-blocks-sum") + java.lang.Short getDefectBlocksSum(){ return dataAirInterface != null ? dataAirInterface.getDefectBlocksSum() : null; } + + @JsonGetter("time-period") + java.lang.Integer getTimePeriod(){ return dataAirInterface != null ? dataAirInterface.getTimePeriod() : dataEthContainer != null ? dataEthContainer.getTimePeriod() : null ; } + + @JsonGetter("tx-ethernet-bytes-max-s") + java.lang.Integer getTxEthernetBytesMaxS() { + return dataEthContainer != null ? dataEthContainer.getTxEthernetBytesMaxS() : null; + } + + @JsonGetter("tx-ethernet-bytes-max-m") + java.lang.Long getTxEthernetBytesMaxM() { + return dataEthContainer != null ? dataEthContainer.getTxEthernetBytesMaxM() : null; + } + + @JsonGetter("tx-ethernet-bytes-sum") + java.lang.Long getTxEthernetBytesSum() { + return dataEthContainer != null ? dataEthContainer.getTxEthernetBytesSum() : null; + } + + @Override + public String toString() { + return "EsPerformanceData [getEs()=" + getEs() + ", getSes()=" + getSes() + ", getCses()=" + getCses() + + ", getUnavailability()=" + getUnavailability() + ", getTxLevelMin()=" + getTxLevelMin() + + ", getTxLevelMax()=" + getTxLevelMax() + ", getTxLevelAvg()=" + getTxLevelAvg() + ", getRxLevelMin()=" + + getRxLevelMin() + ", getRxLevelMax()=" + getRxLevelMax() + ", getRxLevelAvg()=" + getRxLevelAvg() + + ", getTime2Symbols()=" + getTime2Symbols() + ", getTime4SymbolsS()=" + getTime4SymbolsS() + + ", getTime4Symbols()=" + getTime4Symbols() + ", getTime8Symbols()=" + getTime8Symbols() + + ", getTime16SymbolsS()=" + getTime16SymbolsS() + ", getTime16Symbols()=" + getTime16Symbols() + + ", getTime32Symbols()=" + getTime32Symbols() + ", getTime64Symbols()=" + getTime64Symbols() + + ", getTime128Symbols()=" + getTime128Symbols() + ", getTime256Symbols()=" + getTime256Symbols() + + ", getTime512Symbols()=" + getTime512Symbols() + ", getTime512SymbolsL()=" + getTime512SymbolsL() + + ", getTime1024Symbols()=" + getTime1024Symbols() + ", getTime1024SymbolsL()=" + getTime1024SymbolsL() + + ", getTime2048Symbols()=" + getTime2048Symbols() + ", getTime2048SymbolsL()=" + getTime2048SymbolsL() + + ", getTime4096Symbols()=" + getTime4096Symbols() + ", getTime4096SymbolsL()=" + getTime4096SymbolsL() + + ", getTime8192Symbols()=" + getTime8192Symbols() + ", getTime8192SymbolsL()=" + getTime8192SymbolsL() + + ", getSnirMin()=" + getSnirMin() + ", getSnirMax()=" + getSnirMax() + ", getSnirAvg()=" + getSnirAvg() + + ", getXpdMin()=" + getXpdMin() + ", getXpdMax()=" + getXpdMax() + ", getXpdAvg()=" + getXpdAvg() + + ", getRfTempMin()=" + getRfTempMin() + ", getRfTempMax()=" + getRfTempMax() + ", getRfTempAvg()=" + + getRfTempAvg() + ", getDefectBlocksSum()=" + getDefectBlocksSum() + ", getTimePeriod()=" + + getTimePeriod() + ", getTxEthernetBytesMaxS()=" + getTxEthernetBytesMaxS() + + ", getTxEthernetBytesMaxM()=" + getTxEthernetBytesMaxM() + ", getTxEthernetBytesSum()=" + + getTxEthernetBytesSum() + "]"; + } + +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/performancemanager/impl/database/types/EsPerformanceData12.java b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/performancemanager/impl/database/types/EsPerformanceData12.java new file mode 100644 index 00000000..1411c024 --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/performancemanager/impl/database/types/EsPerformanceData12.java @@ -0,0 +1,210 @@ +package org.opendaylight.mwtn.performancemanager.impl.database.types; + +import org.opendaylight.mwtn.base.netconf.ExtendedAirInterfaceHistoricalPerformanceType12; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.g._874._1.model.rev170320.OtnHistoryDataG; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev170324.AirInterfaceHistoricalPerformanceTypeG; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev170324.AirInterfacePerformanceTypeG; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev170324.ContainerHistoricalPerformanceTypeG; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev170324.ContainerPerformanceTypeG; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.fasterxml.jackson.annotation.JsonGetter; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; + +@JsonInclude(JsonInclude.Include.NON_NULL) +public class EsPerformanceData12 { + + @JsonIgnore + private static final Logger LOG = LoggerFactory.getLogger(EsPerformanceData12.class); + + @JsonIgnore + private AirInterfacePerformanceTypeG dataAirInterface; + @JsonIgnore + private ContainerPerformanceTypeG dataEthContainer; + + public EsPerformanceData12(T ff) { + + dataAirInterface = null; + dataEthContainer = null; + + if (ff instanceof AirInterfaceHistoricalPerformanceTypeG ) { + this.dataAirInterface = ((AirInterfaceHistoricalPerformanceTypeG)ff).getPerformanceData(); + } else if (ff instanceof ContainerHistoricalPerformanceTypeG) { + this.dataEthContainer = ((ContainerHistoricalPerformanceTypeG)ff).getPerformanceData(); + } else if (ff instanceof ExtendedAirInterfaceHistoricalPerformanceType12) { + this.dataAirInterface = ((ExtendedAirInterfaceHistoricalPerformanceType12)ff).getAirInterfaceHistoricalPerformanceType().getPerformanceData(); + } else { + LOG.warn("Can not assign historical performance type {}", ff.getClass().getName()); + } + } + + @JsonGetter("es") + public java.lang.Integer getEs() { + return dataAirInterface != null ? dataAirInterface.getEs() : null; + } + + @JsonGetter("ses") + java.lang.Integer getSes() { + return dataAirInterface != null ? dataAirInterface.getSes() : null; + } + + @JsonGetter("cses") + java.lang.Integer getCses() { return dataAirInterface != null ? dataAirInterface.getCses() : null; } + + @JsonGetter("unavailability") + java.lang.Integer getUnavailability(){ return dataAirInterface != null ? dataAirInterface.getUnavailability() : null; } + + @JsonGetter("tx-level-min") + java.lang.Byte getTxLevelMin(){ return dataAirInterface != null ? dataAirInterface.getTxLevelMin() : null; } + + @JsonGetter("tx-level-max") + java.lang.Byte getTxLevelMax(){ return dataAirInterface != null ? dataAirInterface.getTxLevelMax() : null; } + + @JsonGetter("tx-level-avg") + java.lang.Byte getTxLevelAvg(){ return dataAirInterface != null ? dataAirInterface.getTxLevelAvg() : null; } + + @JsonGetter("rx-level-min") + java.lang.Byte getRxLevelMin(){ return dataAirInterface != null ? dataAirInterface.getRxLevelMin() : null; } + + @JsonGetter("rx-level-max") + java.lang.Byte getRxLevelMax(){ return dataAirInterface != null ? dataAirInterface.getRxLevelMax() : null; } + + @JsonGetter("rx-level-avg") + java.lang.Byte getRxLevelAvg(){ return dataAirInterface != null ? dataAirInterface.getRxLevelAvg() : null; } + + @JsonGetter("time2-states") + java.lang.Integer getTime2States(){ return dataAirInterface != null ? dataAirInterface.getTime2States() : null; } + + @JsonGetter("time4-states-s") + java.lang.Integer getTime4StatesS(){ return dataAirInterface != null ? dataAirInterface.getTime4StatesS() : null; } + + @JsonGetter("time4-states") + java.lang.Integer getTime4States(){ return dataAirInterface != null ? dataAirInterface.getTime4States() : null; } + + @JsonGetter("time8-states") + java.lang.Integer getTime8States(){ return dataAirInterface != null ? dataAirInterface.getTime8States() : null; } + + @JsonGetter("time16-states-s") + java.lang.Integer getTime16StatesS(){ return dataAirInterface != null ? dataAirInterface.getTime16StatesS() : null; } + + @JsonGetter("time16-states") + java.lang.Integer getTime16States(){ return dataAirInterface != null ? dataAirInterface.getTime16States() : null; } + + @JsonGetter("time32-states") + java.lang.Integer getTime32States(){ return dataAirInterface != null ? dataAirInterface.getTime32States() : null; } + + @JsonGetter("time64-states") + java.lang.Integer getTime64States(){ return dataAirInterface != null ? dataAirInterface.getTime64States() : null; } + + @JsonGetter("time128-states") + java.lang.Integer getTime128States(){ return dataAirInterface != null ? dataAirInterface.getTime128States() : null; } + + @JsonGetter("time256-states") + java.lang.Integer getTime256States(){ return dataAirInterface != null ? dataAirInterface.getTime256States() : null; } + + @JsonGetter("time512-states") + java.lang.Integer getTime512States(){ return dataAirInterface != null ? dataAirInterface.getTime512States() : null; } + + @JsonGetter("time512-states-l") + java.lang.Integer getTime512StatesL(){ return dataAirInterface != null ? dataAirInterface.getTime512StatesL() : null; } + + @JsonGetter("time1024-states") + java.lang.Integer getTime1024States(){ return dataAirInterface != null ? dataAirInterface.getTime1024States() : null; } + + @JsonGetter("time1024-states-l") + java.lang.Integer getTime1024StatesL(){ return dataAirInterface != null ? dataAirInterface.getTime1024StatesL() : null; } + + @JsonGetter("time2048-states") + java.lang.Integer getTime2048States(){ return dataAirInterface != null ? dataAirInterface.getTime2048States() : null; } + + @JsonGetter("time2048-states-l") + java.lang.Integer getTime2048StatesL(){ return dataAirInterface != null ? dataAirInterface.getTime2048StatesL() : null; } + + @JsonGetter("time4096-states") + java.lang.Integer getTime4096States(){ return dataAirInterface != null ? dataAirInterface.getTime4096States() : null; } + + @JsonGetter("time4096-states-l") + java.lang.Integer getTime4096StatesL(){ return dataAirInterface != null ? dataAirInterface.getTime4096StatesL() : null; } + + @JsonGetter("time8192-states") + java.lang.Integer getTime8192States(){ return dataAirInterface != null ? dataAirInterface.getTime8192States() : null; } + + @JsonGetter("time8192-states-l") + java.lang.Integer getTime8192StatesL(){ return dataAirInterface != null ? dataAirInterface.getTime8192StatesL() : null; } + + @JsonGetter("snir-min") + java.lang.Byte getSnirMin(){ return dataAirInterface != null ? dataAirInterface.getSnirMin() : null; } + + @JsonGetter("snir-max") + java.lang.Byte getSnirMax(){ return dataAirInterface != null ? dataAirInterface.getSnirMax() : null; } + + @JsonGetter("snir-avg") + java.lang.Byte getSnirAvg(){ return dataAirInterface != null ? dataAirInterface.getSnirAvg() : null; } + + @JsonGetter("xpd-min") + java.lang.Byte getXpdMin(){ return dataAirInterface != null ? dataAirInterface.getXpdMin() : null; } + + @JsonGetter("xpd-max") + java.lang.Byte getXpdMax(){ return dataAirInterface != null ? dataAirInterface.getXpdMax() : null; } + + @JsonGetter("xpd-avg") + java.lang.Byte getXpdAvg(){ return dataAirInterface != null ? dataAirInterface.getXpdAvg() : null; } + + @JsonGetter("rf-temp-min") + java.lang.Byte getRfTempMin(){ return dataAirInterface != null ? dataAirInterface.getRfTempMin() : null; } + + @JsonGetter("rf-temp-max") + java.lang.Byte getRfTempMax(){ return dataAirInterface != null ? dataAirInterface.getRfTempMax() : null; } + + @JsonGetter("rf-temp-avg") + java.lang.Byte getRfTempAvg(){ return dataAirInterface != null ? dataAirInterface.getRfTempAvg() : null; } + + @JsonGetter("defect-blocks-sum") + java.lang.Short getDefectBlocksSum(){ return dataAirInterface != null ? dataAirInterface.getDefectBlocksSum() : null; } + + @JsonGetter("time-period") + java.lang.Integer getTimePeriod(){ return dataAirInterface != null ? dataAirInterface.getTimePeriod() : dataEthContainer != null ? dataEthContainer.getTimePeriod() : null ; } + + @JsonGetter("tx-ethernet-bytes-max-s") + java.lang.Integer getTxEthernetBytesMaxS() { + return dataEthContainer != null ? dataEthContainer.getTxEthernetBytesMaxS() : null; + } + + @JsonGetter("tx-ethernet-bytes-max-m") + java.lang.Long getTxEthernetBytesMaxM() { + return dataEthContainer != null ? dataEthContainer.getTxEthernetBytesMaxM() : null; + } + + @JsonGetter("tx-ethernet-bytes-sum") + java.lang.Long getTxEthernetBytesSum() { + return dataEthContainer != null ? dataEthContainer.getTxEthernetBytesSum() : null; + } + + @Override + public String toString() { + return "EsPerformanceData [getEs()=" + getEs() + ", getSes()=" + getSes() + ", getCses()=" + getCses() + + ", getUnavailability()=" + getUnavailability() + ", getTxLevelMin()=" + getTxLevelMin() + + ", getTxLevelMax()=" + getTxLevelMax() + ", getTxLevelAvg()=" + getTxLevelAvg() + ", getRxLevelMin()=" + + getRxLevelMin() + ", getRxLevelMax()=" + getRxLevelMax() + ", getRxLevelAvg()=" + getRxLevelAvg() + + ", getTime2States()=" + getTime2States() + ", getTime4StatesS()=" + getTime4StatesS() + + ", getTime4States()=" + getTime4States() + ", getTime8States()=" + getTime8States() + + ", getTime16StatesS()=" + getTime16StatesS() + ", getTime16States()=" + getTime16States() + + ", getTime32States()=" + getTime32States() + ", getTime64States()=" + getTime64States() + + ", getTime128States()=" + getTime128States() + ", getTime256States()=" + getTime256States() + + ", getTime512States()=" + getTime512States() + ", getTime512StatesL()=" + getTime512StatesL() + + ", getTime1024States()=" + getTime1024States() + ", getTime1024StatesL()=" + getTime1024StatesL() + + ", getTime2048States()=" + getTime2048States() + ", getTime2048StatesL()=" + getTime2048StatesL() + + ", getTime4096States()=" + getTime4096States() + ", getTime4096StatesL()=" + getTime4096StatesL() + + ", getTime8192States()=" + getTime8192States() + ", getTime8192StatesL()=" + getTime8192StatesL() + + ", getSnirMin()=" + getSnirMin() + ", getSnirMax()=" + getSnirMax() + ", getSnirAvg()=" + getSnirAvg() + + ", getXpdMin()=" + getXpdMin() + ", getXpdMax()=" + getXpdMax() + ", getXpdAvg()=" + getXpdAvg() + + ", getRfTempMin()=" + getRfTempMin() + ", getRfTempMax()=" + getRfTempMax() + ", getRfTempAvg()=" + + getRfTempAvg() + ", getDefectBlocksSum()=" + getDefectBlocksSum() + ", getTimePeriod()=" + + getTimePeriod() + ", getTxEthernetBytesMaxS()=" + getTxEthernetBytesMaxS() + + ", getTxEthernetBytesMaxM()=" + getTxEthernetBytesMaxM() + ", getTxEthernetBytesSum()=" + + getTxEthernetBytesSum() + "]"; + } + +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/ptp/impl/GeoLocation.java b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/ptp/impl/GeoLocation.java new file mode 100644 index 00000000..aac3f58c --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/ptp/impl/GeoLocation.java @@ -0,0 +1,31 @@ +/** + * + */ +package org.opendaylight.mwtn.ptp.impl; + +/** + * Path list with logical-termination-point list + "path" : [{ + "path-id": "4d778388-41c8-11e7-a919-92ebcb67fe33", + "path-name": "NE-10-ClockIdentity", + "layer-protocol-name": "PTP", + "directionality": "unidirectional", + "logical-termination-point": [{ + "ltp-reference":"yep", + "physical-port-reference": "shelf:1-slot:1-Card-port:5", + "node-reference":"NE-10", + "site-reference": "site-a", + "site-name": "GUI-Label", + "geo-location": { + "longitude": "54.123456", + "latitude": "13.123456" + }] + }] + + * @author herbert + */ + +public class GeoLocation { + String longitude; + String latitude; +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/ptp/impl/LogicalTerminationPoint.java b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/ptp/impl/LogicalTerminationPoint.java new file mode 100644 index 00000000..0af0869c --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/ptp/impl/LogicalTerminationPoint.java @@ -0,0 +1,38 @@ +/** + * + */ +package org.opendaylight.mwtn.ptp.impl; + +/** + * Path list with logical-termination-point list + "path" : [{ + "path-id": "4d778388-41c8-11e7-a919-92ebcb67fe33", + "path-name": "NE-10-ClockIdentity", + "layer-protocol-name": "PTP", + "directionality": "unidirectional", + "logical-termination-point": [{ + "ltp-reference":"yep", + "physical-port-reference": "shelf:1-slot:1-Card-port:5", + "node-reference":"NE-10", + "site-reference": "site-a", + "site-name": "GUI-Label", + "geo-location": { + "longitude": "54.123456", + "latitude": "13.123456" + }] + }] + + + * @author herbert + * + */ +public class LogicalTerminationPoint { + + String ltpReference; + String physicalPortReference; + String nodeReference; + String siteReference; + String siteName; + GeoLocation geoLocation; + +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/ptp/impl/Path.java b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/ptp/impl/Path.java new file mode 100644 index 00000000..22c5053f --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/ptp/impl/Path.java @@ -0,0 +1,37 @@ +/** + * + */ +package org.opendaylight.mwtn.ptp.impl; + +import java.util.List; + +/** + * Path list with logical-termination-point list + "path" : [{ + "path-id": "4d778388-41c8-11e7-a919-92ebcb67fe33", + "path-name": "NE-10-ClockIdentity", + "layer-protocol-name": "PTP", + "directionality": "unidirectional", + "logical-termination-point": [{ + "ltp-reference":"yep", + "physical-port-reference": "shelf:1-slot:1-Card-port:5", + "node-reference":"NE-10", + "site-reference": "site-a", + "site-name": "GUI-Label", + "geo-location": { + "longitude": "54.123456", + "latitude": "13.123456" + }] + }] + * @author herbert + * + */ +public class Path { + + String pathId; + String pathName; + String layperProtocolName; + String directionality; + List logicalTerminationPoints; + +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/ptp/impl/PtpManagerImpl.java b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/ptp/impl/PtpManagerImpl.java new file mode 100644 index 00000000..4bb3bb63 --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/mwtn/ptp/impl/PtpManagerImpl.java @@ -0,0 +1,12 @@ +/** + * + */ +package org.opendaylight.mwtn.ptp.impl; + +/** + * @author herbert + * + */ +public class PtpManagerImpl { + +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/devicemanager/impl/rev170317/DeviceManagerImplModule.java b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/devicemanager/impl/rev170317/DeviceManagerImplModule.java new file mode 100644 index 00000000..e84072d1 --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/devicemanager/impl/rev170317/DeviceManagerImplModule.java @@ -0,0 +1,26 @@ +package org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.devicemanager.impl.rev170317; + +import org.opendaylight.mwtn.devicemanager.impl.DeviceManagerImpl; + +public class DeviceManagerImplModule extends org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.devicemanager.impl.rev170317.AbstractDeviceManagerImplModule { + public DeviceManagerImplModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) { + super(identifier, dependencyResolver); + } + + public DeviceManagerImplModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver, org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.devicemanager.impl.rev170317.DeviceManagerImplModule oldModule, java.lang.AutoCloseable oldInstance) { + super(identifier, dependencyResolver, oldModule, oldInstance); + } + + @Override + public void customValidation() { + // add custom validation form module attributes here. + } + + @Override + public java.lang.AutoCloseable createInstance() { + DeviceManagerImpl deviceManagerImpl = new DeviceManagerImpl(); + getBrokerDependency().registerProvider(deviceManagerImpl); + return deviceManagerImpl; + } + +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/devicemanager/impl/rev170317/DeviceManagerImplModuleFactory.java b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/devicemanager/impl/rev170317/DeviceManagerImplModuleFactory.java new file mode 100644 index 00000000..2bb91c67 --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/devicemanager/impl/rev170317/DeviceManagerImplModuleFactory.java @@ -0,0 +1,13 @@ +/* +* Generated file +* +* Generated from: yang module name: devicemanager-impl yang module local name: devicemanager-impl +* Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator +* Generated at: Fri Mar 17 09:38:37 CET 2017 +* +* Do not modify this file unless it is present under src/main directory +*/ +package org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.devicemanager.impl.rev170317; +public class DeviceManagerImplModuleFactory extends org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.devicemanager.impl.rev170317.AbstractDeviceManagerImplModuleFactory { + +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/aots/addreq.tmpl.xml b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/aots/addreq.tmpl.xml new file mode 100644 index 00000000..11addd91 --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/aots/addreq.tmpl.xml @@ -0,0 +1,53 @@ + + + + + 86 + sdnr + 209 + sdnr:37-1508173894848 + 30000 + {notificationTimestamp} + + + {aotsUsername} + {aotsUserpassword} + + + 1 + 1 + + + + + + + 2 + {aotsSeverity} + {notficationAlarm} + {aotsCustomerImpact} + + + Fault Management + SDN-R + {notficationAlarm}({notificationComponent})@{notificationNodename} + + + {notificationEqId} + + {aotsAssignedTo} + {aotsSystemUser} + done + TECH OPS + {aotsExternalTicketNumber} + {aotsPRT} + 5 + + + diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/aots/inqreq.tmpl.xml b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/aots/inqreq.tmpl.xml new file mode 100644 index 00000000..a753c68c --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/aots/inqreq.tmpl.xml @@ -0,0 +1,36 @@ + + + + + 209 + sdnr:36-1504101836417 + 30000 + {systemTimestamp} + + + {aotsUsername} + {aotsUserpassword} + + + 1 + 1 + + + + + + + {aotsSeverity} + {aotsSystemUser} + + {aotsExternalTicketNumber} + + + + diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/elasticsearch/elasticsearch.yml b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/elasticsearch/elasticsearch.yml new file mode 100644 index 00000000..896d5161 --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/elasticsearch/elasticsearch.yml @@ -0,0 +1,103 @@ +# ======================== Elasticsearch Configuration ========================= +# +# NOTE: Elasticsearch comes with reasonable defaults for most settings. +# Before you set out to tweak and tune the configuration, make sure you +# understand what are you trying to accomplish and the consequences. +# +# The primary way of configuring a node is via this file. This template lists +# the most important settings you may want to configure for a production cluster. +# +# Please see the documentation for further information on configuration options: +# +# +# ---------------------------------- Cluster ----------------------------------- +# +# Use a descriptive name for your cluster: +# +cluster.name: $clustername +# +# ------------------------------------ Node ------------------------------------ +# +# Use a descriptive name for the node: +# +node.name: $nodename +# +# Add custom attributes to the node: +# +# node.rack: r1 +# +# ----------------------------------- Paths ------------------------------------ +# +# Path to directory where to store the data (separate multiple locations by comma): +# +# path.data: /path/to/data +path.data: etc +path.home: data +path.plugins: etc/elasticsearch-plugins +# +# Path to log files: +# +# path.logs: /path/to/logs +# +# ----------------------------------- Memory ----------------------------------- +# +# Lock the memory on startup: +# +# bootstrap.mlockall: true +# +# Make sure that the `ES_HEAP_SIZE` environment variable is set to about half the memory +# available on the system and that the owner of the process is allowed to use this limit. +# +# Elasticsearch performs poorly when the system is swapping the memory. +# +# ---------------------------------- Network ----------------------------------- +# +# Set the bind address to a specific IP (IPv4 or IPv6): +# +# network.host: 192.168.0.1 +network.bind_host: 0.0.0.0 +network.publish_host: $hostname +# +# Set a custom port for HTTP: +# +# http.port: 9200 +# +# For more information, see the documentation at: +# +# +# --------------------------------- Discovery ---------------------------------- +# +# Pass an initial list of hosts to perform discovery when new node is started: +# The default list of hosts is ["127.0.0.1", "[::1]"] +# +# discovery.zen.ping.unicast.hosts: ["host1", "host2"] +# +# Prevent the "split brain" by configuring the majority of nodes (total number of nodes / 2 + 1): +# +# discovery.zen.minimum_master_nodes: 3 +# +# For more information, see the documentation at: +# +# +# ---------------------------------- Gateway ----------------------------------- +# +# Block initial recovery after a full cluster restart until N nodes are started: +# +# gateway.recover_after_nodes: 3 +# +# For more information, see the documentation at: +# +# +# ---------------------------------- Various ----------------------------------- +# +# Disable starting multiple nodes on a single system: +# +# node.max_local_storage_nodes: 1 +# +# Require explicit names when deleting indices: +# +# action.destructive_requires_name: true + +# Required for Kibana 4.x support +index.max_result_window: 2147483647 +#transport.tcp.port: 9301 diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/elasticsearch/index/config/opendaylight.json b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/elasticsearch/index/config/opendaylight.json new file mode 100644 index 00000000..2c93d866 --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/elasticsearch/index/config/opendaylight.json @@ -0,0 +1,21 @@ +{ + "sdn-controller" : { + "dlux" : { + "ip-version" : "ipv4", + "host" : "localhost", + "port" : 8181, + "transport-protocol" : "http", + "username" : "admin", + "password" : "admin" + }, + "main" : { + "ip-version" : "ipv4", + "host" : "localhost", + "port" : 8181, + "transport-protocol" : "http", + "username" : "admin", + "password" : "admin" + } + } +} + diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/elasticsearch/index/mwtn/modelDescription/CoreModel-ForMicrowave.json b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/elasticsearch/index/mwtn/modelDescription/CoreModel-ForMicrowave.json new file mode 100644 index 00000000..596584ef --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/elasticsearch/index/mwtn/modelDescription/CoreModel-ForMicrowave.json @@ -0,0 +1,751 @@ +{ + "schema-information": { + "ForwardingDomain": { + "id": "ForwardingDomain", + "uml-id": "_oGql-FLNEeO75dO39GbF8Q", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "The ForwardingDomain (FD) object class models the topological component which represents the opportunity to enable forwarding (of specific transport characteristic information at one or more protocol layers) between points represented by the LTP in the model. The FD object provides the context for instructing the formation, adjustment and removal of FCs and hence offers the potential to enable forwarding. The LTPs available are those defined at the boundary of the FD. At a lowere level of recursion, an FD (within a network element (NE)) represents a switch matrix (i.e., a fabric). Note that an NE can encompass multiple switch matrices (FDs) and the FD representing the switch matrix can be further partitioned." + ] + }, + "layerProtocolNameList": { + "id": "layerProtocolNameList", + "uml-id": "_oGqmAlLNEeO75dO39GbF8Q", + "uml-type": "ownedAttribute", + "type": "_P-Hp8MD4EeSoNOrYOfaryg", + "order-number": 1, + "is-read-only": false, + "description": [ + "One or more protocol layers at which the FD represents the opportunity to enable forwarding between LTP that bound it." + ] + }, + "_lowerLevelFdRefList": { + "id": "_lowerLevelFdRefList", + "uml-id": "_oGqmBVLNEeO75dO39GbF8Q", + "uml-type": "ownedAttribute", + "type": "_oGql-FLNEeO75dO39GbF8Q", + "order-number": 2, + "is-read-only": false, + "description": [ + "The FD object class supports a recursive aggregation relationship (HigherLevelFdEncompassesLowerLevelFds) such that the internal construction of an FD can be exposed as multiple lower level FDs and associated Links (partitioning). The aggregated FDs and Links form an interconnected topology that provides and describes the capability of the aggregating FD. Note that the model actually represents aggregation of lower level FDs into higher level FDs as views rather than FD partition, and supports multiple views. Aggregation allow reallocation of capacity from lower level FDs to different higher level FDs as if the network is reorganized (as the association is aggregation not composition)." + ] + }, + "_fcRefList": { + "id": "_fcRefList", + "uml-id": "_oGql_1LNEeO75dO39GbF8Q", + "uml-type": "ownedAttribute", + "type": "_oGqmC1LNEeO75dO39GbF8Q", + "order-number": 3, + "is-read-only": false, + "description": [ + "An FD contains one or more FCs. A contained FC connects LTPs that bound the FD." + ] + }, + "ForwardingConstruct": { + "id": "ForwardingConstruct", + "uml-id": "_oGqmC1LNEeO75dO39GbF8Q", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "The ForwardingConstruct (FC) object class models enabled potential for forwarding between two or more LTPs at a particular specific layerProtocol. Like the LTP the FC supports any transport protocol including all circuit and packet forms. It is used to effect forwarding of transport characteristic (layer protocol) information. An FC can be in only one FD. The ForwardingConstruct is a Forwarding entity. At a low level of the recursion, a FC represents a cross-connection within an NE. It may also represent a fragment of a cross-connection under certain circumstances. The FC object can be used to represent many different structures including point-to-point (P2P), point-to-multipoint (P2MP), rooted-multipoint (RMP) and multipoint-to-multipoint (MP2MP) bridge and selector structure for linear, ring or mesh protection schemes." + ] + }, + "_lowerLevelFcRefList": { + "id": "_lowerLevelFcRefList", + "uml-id": "_i7UzkFYfEeOVGaP4lO41SQ", + "uml-type": "ownedAttribute", + "type": "_oGqmC1LNEeO75dO39GbF8Q", + "order-number": 2, + "is-read-only": false, + "description": [ + "An FC object supports a recursive aggregation relationship such that the internal construction of an FC can be exposed as multiple lower level FC objects (partitioning). Aggregation is used as for the FD to allow changes in hierarchy." + ] + }, + "_fcPortList": { + "id": "_fcPortList", + "uml-id": "_gqUk0FYgEeOVGaP4lO41SQ", + "uml-type": "ownedAttribute", + "type": "_b_lUAFYgEeOVGaP4lO41SQ", + "order-number": 3, + "is-read-only": false, + "description": [ + "The association of the FC to LTPs is made via FcPorts (essentially the ports of the FC)." + ] + }, + "_fcSwitchList": { + "id": "_fcSwitchList", + "uml-id": "_d_droFYhEeOVGaP4lO41SQ", + "uml-type": "ownedAttribute", + "type": "_a97NQFYhEeOVGaP4lO41SQ", + "order-number": 4, + "is-read-only": false, + "description": [ + "If an FC exposes protection (having two FcPorts that provide alternative identical inputs/outputs), the FC will have one or more associated FcSwitch objects. The arrangement of switches for a particular instance is described by a referenced FcSpec" + ] + }, + "forwardingDirection": { + "id": "forwardingDirection", + "uml-id": "_9_yMUEDAEeWQeOKbNUpP9A", + "uml-type": "ownedAttribute", + "type": "_dV67AEC8EeWxhL2B6Peg6A", + "order-number": 5, + "is-read-only": false, + "description": [ + "The directionality of the ForwardingConstruct. Is applicable to simple ForwardingConstructs where all FcPorts are BIDIRECTIONAL (the ForwardingConstruct will be BIDIRECTIONAL) or UNIDIRECTIONAL (the ForwardingConstruct will be UNIDIRECTIONAL). Is not present in more complex cases." + ] + }, + "NetworkElement": { + "id": "NetworkElement", + "uml-id": "_oGqnr1LNEeO75dO39GbF8Q", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "The Network Element (NE) object class represents a network element (traditional NE) in the data plane. A data plane network element is essentially a consolidation of capabilities that can be viewed and controlled through a single management-control port. In the direct interface from an SDN controller to a network element in the data plane, the NetworkElement object defines the scope of control for the resources within the network element For example internal transfer of user information between the external terminations (ports of the NE), encapsulation, multiplexing/demultiplexing, and OAM functions, etc. The NetworkElement provides the scope of the naming space for identifying objects representing the resources within the data plane network element. NE is really a product bundling or some view of management scope, management access, session. The NE is not directly part of topology but brings meaning to the FD context and the LTP context (and hence the links)." + ] + }, + "_fdRefList": { + "id": "_fdRefList", + "uml-id": "_oGqnslLNEeO75dO39GbF8Q", + "uml-type": "ownedAttribute", + "type": "_oGql-FLNEeO75dO39GbF8Q", + "order-number": 1, + "is-read-only": false, + "description": [ + "Represents the FD that is completely within the boundary of the NE. At a low level of recursion, an FD (within a network element (NE)) represents a switch matrix (i.e., a fabric). Note that an NE can encompass multiple switch matrices (FDs) and the FD representing the switch matrix can be further partitioned. Where an FD is referenced by the NeEncompassesFd association, any FDs that it encompasses (i.e., that are associated with it by HigherLevelFdEncompassesLowerLevelFds), must also be encompassed by the NE and hence must have the NeEncompassesFd association." + ] + }, + "FcPort": { + "id": "FcPort", + "uml-id": "_b_lUAFYgEeOVGaP4lO41SQ", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "The association of the FC to LTPs is made via FcPorts. The FcPort object class models the access to the FC function. The traffic forwarding between the associated FcPorts of the FC depends upon the type of FC and may be associated with FcSwitch object instances. In cases where there is resilience the FcPort may convey the resilience role of the access to the FC. It can represent a protected (resilient/reliable) point or a protecting (unreliable working or protection) point. The FcPort replaces the Protection Unit of a traditional protection model. The ForwadingConstruct can be considered as a component and the FcPort as a Port on that component" + ] + }, + "role": { + "id": "role", + "uml-id": "_Ykm6QFeGEeOVGaP4lO41SQ", + "uml-type": "ownedAttribute", + "type": "_DUU_sGZ_EeWrX_JIGzXlSg", + "order-number": 2, + "is-read-only": false, + "description": [ + "Each FcPort of the FC has a role (e.g., working, protection, protected, symmetric, hub, spoke, leaf, root) in the context of the FC with respect to the FC function." + ] + }, + "fcPortDirection": { + "id": "fcPortDirection", + "uml-id": "_1HbEgEDAEeWQeOKbNUpP9A", + "uml-type": "ownedAttribute", + "type": "_2WpC8EC7EeWxhL2B6Peg6A", + "order-number": 3, + "is-read-only": false, + "description": [ + "The orientation of defined flow at the FcPort." + ] + }, + "LayerProtocol": { + "id": "LayerProtocol", + "uml-id": "_gROecFYXEeOVGaP4lO41SQ", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Each transport layer is represented by a LayerProtocol (LP) instance. The LayerProtocol instances it can be used for controlling termination and monitoring functionality. It can also be used for controlling the adaptation (i.e. encapsulation and/or multiplexing of client signal), tandem connection monitoring, traffic conditioning and/or shaping functionality at an intermediate point along a connection. Where the client - server relationship is fixed 1:1 and immutable, the layers can be encapsulated in a single LTP instance. Where the is a n:1 relationship between client and server, the layers must be split over two separate instances of LTP." + ] + }, + "configuredClientCapacity": { + "id": "configuredClientCapacity", + "uml-id": "_CUJD4BicEeSh8KVgZCMyDw", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 2, + "is-read-only": false, + "description": [ + "Provides a summarized view of the client capacity that is configurable for use. Note the cleint LTP association should provide all necessary detail hence this attribute is questionable." + ] + }, + "lpDirection": { + "id": "lpDirection", + "uml-id": "_GuuSYEDBEeWQeOKbNUpP9A", + "uml-type": "ownedAttribute", + "type": "_RWILYEDAEeWQeOKbNUpP9A", + "order-number": 3, + "is-read-only": false, + "description": [ + "The overall directionality of the LP. - A BIDIRECTIONAL LP will have some SINK and/or SOURCE flowss. - A SINK LP can only contain elements with SINK flows or CONTRA_DIRECTION_SOURCE flows - A SOURCE LP can only contain SOURCE flows or CONTRA_DIRECTION_SINK flows" + ] + }, + "terminationState": { + "id": "terminationState", + "uml-id": "_p2YfoGeEEeWmgIwAIZlYKQ", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 4, + "is-read-only": false, + "description": [ + "Indicates whether the layer is terminated and if so how." + ] + }, + "LogicalTerminationPoint": { + "id": "LogicalTerminationPoint", + "uml-id": "_eEpDMFX4EeOVGaP4lO41SQ", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "The LogicalTerminationPoint (LTP) object class encapsulates the termination and adaptation functions of one or more transport layers. The structure of LTP supports all transport protocols including circuit and packet forms." + ] + }, + "_serverLtpRefList": { + "id": "_serverLtpRefList", + "uml-id": "_D4N9IFX5EeOVGaP4lO41SQ", + "uml-type": "ownedAttribute", + "type": "_eEpDMFX4EeOVGaP4lO41SQ", + "order-number": 1, + "is-read-only": false, + "description": [ + "References contained LTPs representing servers of this LTP in an inverse multiplexing configuration (e.g. VCAT)." + ] + }, + "_clientLtpRefList": { + "id": "_clientLtpRefList", + "uml-id": "_3Y4zAFYWEeOVGaP4lO41SQ", + "uml-type": "ownedAttribute", + "type": "_eEpDMFX4EeOVGaP4lO41SQ", + "order-number": 2, + "is-read-only": false, + "description": [ + "References contained LTPs representing client traffic of this LTP for normal cases of multiplexing." + ] + }, + "_lpList": { + "id": "_lpList", + "uml-id": "_lvFOQFYXEeOVGaP4lO41SQ", + "uml-type": "ownedAttribute", + "type": "_gROecFYXEeOVGaP4lO41SQ", + "order-number": 3, + "is-read-only": false, + "description": [ + "Ordered list of LayerProtocols that this LTP is comprised of where the first entry in the list is the lowest server layer (e.g. physical)" + ] + }, + "_connectedLtpRef": { + "id": "_connectedLtpRef", + "uml-id": "_CHM6YFYYEeOVGaP4lO41SQ", + "uml-type": "ownedAttribute", + "type": "_eEpDMFX4EeOVGaP4lO41SQ", + "order-number": 4, + "is-read-only": false, + "description": [ + "Applicable in a simple context where two LTPs are associated via a non-adjustable enabled forwarding. Reduces clutter removing the need for two additional LTPs and an FC with a pair of FcPorts." + ] + }, + "_peerLtpRef": { + "id": "_peerLtpRef", + "uml-id": "_TkuhMFYYEeOVGaP4lO41SQ", + "uml-type": "ownedAttribute", + "type": "_eEpDMFX4EeOVGaP4lO41SQ", + "order-number": 5, + "is-read-only": false, + "description": [ + "References contained LTPs representing the reversal of orientation of flow where two LTPs are associated via a non-adjustable enabled forwarding and where the referenced LTP is fully dependent on the this LTP." + ] + }, + "physicalPortReference": { + "id": "physicalPortReference", + "uml-id": "_RLDi4BieEeSh8KVgZCMyDw", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 6, + "is-read-only": false, + "description": [ + "One or more text labels for the unmodelled physical port associated with the LTP. In many cases there is no associated physical port" + ] + }, + "_ltpRefList": { + "id": "_ltpRefList", + "uml-id": "_vq1NIBigEeSh8KVgZCMyDw", + "uml-type": "ownedAttribute", + "type": "_eEpDMFX4EeOVGaP4lO41SQ", + "order-number": 7, + "is-read-only": false, + "description": [ + "References one or more LTPs in other views that represent this LTP. The referencing LTP is the rovider of capability." + ] + }, + "ltpDirection": { + "id": "ltpDirection", + "uml-id": "_S811EEDBEeWQeOKbNUpP9A", + "uml-type": "ownedAttribute", + "type": "_RWILYEDAEeWQeOKbNUpP9A", + "order-number": 8, + "is-read-only": false, + "description": [ + "The overall directionality of the LTP. - A BIDIRECTIONAL LTP must have at least some LPs that are BIDIRECTIONAL but may also have some SINK and/or SOURCE LPs. - A SINK LTP can only contain SINK LPs - A SOURCE LTP can only contain SOURCE LPs" + ] + }, + "FcSwitch": { + "id": "FcSwitch", + "uml-id": "_a97NQFYhEeOVGaP4lO41SQ", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "The FcSwitch object class models the switched forwarding of traffic (traffic flow) between FcPorts and is present where there is protection functionality in the FC. If an FC exposes protection (having two FcPorts that provide alternative identical inputs/outputs), the FC will have one or more associated FcSwitch objects to represent the alternative flow choices visible at the edge of the FC. The FC switch represents and defines a protection switch structure encapsulated in the FC. Essentially performs the functoion of the Protection Group in a traditional model. Associates to 2 or more FcPorts each playing the role of a Protection Unit. One or more protection FcPorts (standby/backup) provide protection for one or more working (i.e. regular/main/preferred) FcPorts where eith protection or working can feed one or more protected FcPort. May be used in revertive or non-revertive (symmetric) mode. When in revertive mode may define waitToRestore time. May be used in one of several modes including source switch, destination switched, source and destination switched etc (covering cases such as 1+1 ane 1:1).. May be lockout (prevented from switching), force switched or manual switched. Will indicate switch state and change of state." + ] + }, + "holdOffTime": { + "id": "holdOffTime", + "uml-id": "_oGqn6FLNEeO75dO39GbF8Q", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 1, + "is-read-only": false, + "description": [ + "This attribute indicates the time, in seconds, between declaration of unacceptable quality of signal on the currently selected FcPort, and the initialization of the protection switching algorithm." + ] + }, + "waitToRestoreTime": { + "id": "waitToRestoreTime", + "uml-id": "_oGqn5lLNEeO75dO39GbF8Q", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 2, + "is-read-only": false, + "description": [ + "If the protection system is revertive, this attribute specifies the amount of time, in seconds, to wait after the preferred FcPort returns to an acceptable state of operaion (e.g a fault has cleared) before restoring traffic to that preferred FcPort." + ] + }, + "protType": { + "id": "protType", + "uml-id": "_oGqn6lLNEeO75dO39GbF8Q", + "uml-type": "ownedAttribute", + "type": "_c3Hu8Gb3EeWrX_JIGzXlSg", + "order-number": 3, + "is-read-only": false, + "description": [ + "Indicates the protection scheme that is used for the ProtectionGroup." + ] + }, + "operType": { + "id": "operType", + "uml-id": "_oGqn41LNEeO75dO39GbF8Q", + "uml-type": "ownedAttribute", + "type": "_oGqjf1LNEeO75dO39GbF8Q", + "order-number": 4, + "is-read-only": false, + "description": [ + "This attribute whether or not the protection scheme is revertive or non-revertive." + ] + }, + "_selectedFcPortRefList": { + "id": "_selectedFcPortRefList", + "uml-id": "_2PdiYI8lEeOw_ste-s6RrA", + "uml-type": "ownedAttribute", + "type": "_b_lUAFYgEeOVGaP4lO41SQ", + "order-number": 5, + "is-read-only": false, + "description": [ + "Indicates which points are selected by the switch." + ] + }, + "Name": { + "id": "Name", + "uml-id": "_BUcVEI2tEeO38ZmbECnvbg", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Name: A property of an entity with a value that is unique in some namespace but may change during the life of the entity. A name carries no semantics with respect to the purpose of the entity." + ] + }, + "nameList": { + "id": "nameList", + "uml-id": "_ajjMYI2uEeO38ZmbECnvbg", + "uml-type": "ownedAttribute", + "type": "_y7oy8I3tEeO38ZmbECnvbg", + "order-number": 1, + "is-read-only": false, + "is-key": 1, + "description": [ + "List of names." + ] + }, + "GlobalClass": { + "id": "GlobalClass", + "uml-id": "_iVJ1kI2wEeO38ZmbECnvbg", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Represents a type of thing (an Entity) that has instances which can exist in their own right (independently of any others). Entity: Has identity, defined boundary, properties, functionality and lifecycle in a global context. (consider in the context of an Object Class: (usage) The representation of a thing that may be an entity or an inseparable Entity Feature)" + ] + }, + "LocalClass": { + "id": "LocalClass", + "uml-id": "_k5nWYI2wEeO38ZmbECnvbg", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "A LocalClass represents a Feature of an Entity. It is inseparable from a GlobalClass but is a distinct feature of that GlobalClass such that the instances of LocalClass are able to have associations to other instances.. Feature of an Entity: An inseparable, externally distinguishable part of an entity. The mandatory LocalId of the LocalClass instance is unique in the context of the GlobalClass from which it is inseparable. (consider in the context of an Object Class: (usage) The representation of a thing that may be an entity or an inseparable feature of an entity)" + ] + }, + "localIdList": { + "id": "localIdList", + "uml-id": "_RMJegI22EeO38ZmbECnvbg", + "uml-type": "ownedAttribute", + "type": "_y7oy8I3tEeO38ZmbECnvbg", + "order-number": 1, + "is-read-only": false, + "description": [ + "An identifier that is unique in the context of some scope that is less than the global scope. (consider in the context of Identifier: A property of an entity/role with a value that is unique within an identifier space, where the identifier space is itself unique, and immutable. The identifier therefore represents the identity of the entity/role. An identifier carries no semantics with respect to the purpose of the entity.)" + ] + }, + "Label": { + "id": "Label", + "uml-id": "_u0HQoI2wEeO38ZmbECnvbg", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "A property of an entity with a value that is not expected to be unique and is allowed to change. A label carries no semantics with respect to the purpose of the entity and has no effect on the entity behavior or state." + ] + }, + "labelList": { + "id": "labelList", + "uml-id": "_olrqYI2uEeO38ZmbECnvbg", + "uml-type": "ownedAttribute", + "type": "_y7oy8I3tEeO38ZmbECnvbg", + "order-number": 1, + "is-read-only": false, + "description": [ + "List of labels." + ] + }, + "Extension": { + "id": "Extension", + "uml-id": "_bCi74I22EeO38ZmbECnvbg", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Extension provides an opportunity to define properties not declared in the class that extend the class enabling a realization with simple ad-hoc extension of standard classes to be conformant." + ] + }, + "extensionList": { + "id": "extensionList", + "uml-id": "_uQqu4I28EeO38ZmbECnvbg", + "uml-type": "ownedAttribute", + "type": "_y7oy8I3tEeO38ZmbECnvbg", + "order-number": 1, + "is-read-only": false, + "description": [ + "List of simple name-value extentions" + ] + }, + "UniversalIdAuthority": { + "id": "UniversalIdAuthority", + "uml-id": "_StA-4I23EeO38ZmbECnvbg", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Represents the authority that controls the allocation of UUIDs." + ] + }, + "NameAndValueAuthority": { + "id": "NameAndValueAuthority", + "uml-id": "_ulDtsI3AEeO38ZmbECnvbg", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Represents the authority that controls the legal valuse for the names and values of a name/value attribute." + ] + }, + "uuid": { + "id": "uuid", + "uml-id": "_U1tnkI31EeO38ZmbECnvbg", + "uml-type": "ownedAttribute", + "type": "_SU3Q4I30EeO38ZmbECnvbg", + "order-number": 0, + "is-read-only": false, + "description": [ + "The UUID for the NameValueAuthority." + ] + }, + "ConditionalPackage": { + "id": "ConditionalPackage", + "uml-id": "_-ZWVQJP0EeOqfpp-ZJSmaA", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "The base class for conditional packages." + ] + }, + "State_Pac": { + "id": "State_Pac", + "uml-id": "_RG6VILEtEeSZUdYfPSdgew", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Provides general state attributes." + ] + }, + "operationalState": { + "id": "operationalState", + "uml-id": "_dO6owLEtEeSZUdYfPSdgew", + "uml-type": "ownedAttribute", + "type": "_lNclkLEtEeSZUdYfPSdgew", + "order-number": 1, + "is-read-only": true, + "description": [ + "The operational state is used to indicate whether or not the resource is installed and working" + ] + }, + "administrativeControl": { + "id": "administrativeControl", + "uml-id": "_7gqwALEtEeSZUdYfPSdgew", + "uml-type": "ownedAttribute", + "type": "_-xPeALEvEeSZUdYfPSdgew", + "order-number": 2, + "is-read-only": false, + "description": [ + "The administrativeControl state provides control of the availability of specific resources without modification to the provisioning of those resources. The value is the current control target. The actual administrativeState may or may not be at target." + ] + }, + "administrativeState": { + "id": "administrativeState", + "uml-id": "_AjGvILEuEeSZUdYfPSdgew", + "uml-type": "ownedAttribute", + "type": "_KSKOYLEuEeSZUdYfPSdgew", + "order-number": 3, + "is-read-only": true, + "description": [ + "Shows whether or not the client has permission to use or has a prohibition against using the resource. The administrative state expresses usage permissions for specific resources without modification to the provisioning of those resources." + ] + }, + "lifecycleState": { + "id": "lifecycleState", + "uml-id": "_PzqZ0GgiEeWmgIwAIZlYKQ", + "uml-type": "ownedAttribute", + "type": "_YSsboGgiEeWmgIwAIZlYKQ", + "order-number": 4, + "is-read-only": false, + "description": [ + "Used to track the planned deployment, allocation to clients and withdrawal of resources." + ] + }, + "LayerProtocolName": { + "id": "LayerProtocolName", + "uml-id": "_P-Hp8MD4EeSoNOrYOfaryg", + "uml-type": "uml:DataType", + "description": [ + "Provides a controlled list of layer protocol names and indicates the naming authority. Note that it is expected that attributes will be added to this structure to convey the naming authority name, the name of the layer protocol using a human readable string and any particular standard reference. Layer protocol names include: - Layer 1 (L1): OTU, ODU - Layer 2 (L2): Carrier Grade Ethernet (ETY, ETH), MPLS-TP (MT)" + ] + }, + "PortRole": { + "id": "PortRole", + "uml-id": "_DUU_sGZ_EeWrX_JIGzXlSg", + "uml-type": "uml:DataType", + "description": [ + "The role of a port in the context of the function of the forwarding entity that it bounds" + ] + }, + "ProtectionType": { + "id": "ProtectionType", + "uml-id": "_c3Hu8Gb3EeWrX_JIGzXlSg", + "uml-type": "uml:DataType", + "description": [ + "Identifies the type of rotection of an FcSwitch." + ] + }, + "DateAndTime": { + "id": "DateAndTime", + "uml-id": "_oGqi1lLNEeO75dO39GbF8Q", + "uml-type": "uml:DataType", + "description": [ + "This primitive type defines the date and time according to the following structure: yyyyMMddhhmmss.s[Z|{+|-}HHMm] where: yyyy 0000 .. 9999 year MM 01 .. 12 month dd 01 .. 31 day hh 00 .. 23 hour mm 00 .. 59 minute ss 00 .. 59 second s .0 .. .9 tenth of second (set to .0 if EMS or NE cannot support this granularity) Z Z indicates UTC (rather than local time) {+|-} + or - delta from UTC HH 00 .. 23 time zone difference in hours Mm 00 .. 59 time zone difference in minutes." + ] + }, + "NameAndValue": { + "id": "NameAndValue", + "uml-id": "_y7oy8I3tEeO38ZmbECnvbg", + "uml-type": "uml:DataType", + "description": [ + "A scoped name-value pair" + ] + }, + "valueName": { + "id": "valueName", + "uml-id": "_77PyQI3tEeO38ZmbECnvbg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 1, + "is-read-only": false, + "is-key": 1, + "description": [ + "The name of the value. The value need not have a name." + ] + }, + "UniversalId": { + "id": "UniversalId", + "uml-id": "_SU3Q4I30EeO38ZmbECnvbg", + "uml-type": "uml:DataType", + "description": [ + "The univeral ID value where the mechanism for generation is defned by some authority not directly referenced in the structure." + ] + }, + "value": { + "id": "value", + "uml-id": "_cbx2gI30EeO38ZmbECnvbg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 1, + "is-read-only": false, + "description": [ + "The specific value of the universal id" + ] + }, + "_oGqjf1LNEeO75dO39GbF8Q": { + "id": "OperType", + "uml-id": "_oGqjf1LNEeO75dO39GbF8Q", + "enum": [ + "REVERTIVE", + "NON-REVERTIVE" + ], + "is-read-only": false, + "description": [ + "The operation type associated with the protection mechanism (either non-revertive or revertive)." + ] + }, + "_2WpC8EC7EeWxhL2B6Peg6A": { + "id": "PortDirection", + "uml-id": "_2WpC8EC7EeWxhL2B6Peg6A", + "enum": [ + "BIDIRECTIONAL", + "INPUT", + "OUTPUT", + "UNIDENTIFIED_OR_UNKNOWN" + ], + "is-read-only": false, + "description": [ + "The orientation of flow at the Port of a Forwarding entity" + ] + }, + "_dV67AEC8EeWxhL2B6Peg6A": { + "id": "ForwardingDirection", + "uml-id": "_dV67AEC8EeWxhL2B6Peg6A", + "enum": [ + "BIDIRECTIONAL", + "UNIDIRECTIONAL", + "UNDEFINED_OR_UNKNOWN" + ], + "is-read-only": false, + "description": [ + "The directionality of a Forwarding entity." + ] + }, + "_RWILYEDAEeWQeOKbNUpP9A": { + "id": "TerminationDirection", + "uml-id": "_RWILYEDAEeWQeOKbNUpP9A", + "enum": [ + "BIDIRECTIONAL", + "SINK", + "SOURCE", + "UNDEFINED_OR_UNKNOWN" + ], + "is-read-only": false, + "description": [ + "The directionality of a termination entity" + ] + }, + "_T5GykEDNEeWQeOKbNUpP9A": { + "id": "ExtendedTerminationDirection", + "uml-id": "_T5GykEDNEeWQeOKbNUpP9A", + "enum": [ + "CONTRA_DIRECTION_SINK", + "CONTRA_DIRECTION_SOURCE" + ], + "is-read-only": false, + "description": [ + "Extended to include contra-direction considerations. Only applies to LP and elements of LP not to LTP??" + ] + }, + "_6anG8GeEEeWmgIwAIZlYKQ": { + "id": "TerminationState", + "uml-id": "_6anG8GeEEeWmgIwAIZlYKQ", + "enum": [ + "LP_CAN_NEVER_TERMINATE", + "LT_NOT_TERMINATED", + "TERMINATED_SERVER_TO_CLIENT_FLOW", + "TERMINATED_CLIENT_TO_SERVER_FLOW", + "TERMINATED_BIDIRECTIONAL", + "LT_PERMENANTLY_TERMINATED", + "TERMINATION_STATE_UNKNOWN" + ], + "is-read-only": false, + "description": [ + "Provides support for the range of behaviours and specific states that an LP can take with respect to termination of the signal. Indicates to what degree the LayerTermination is terminated." + ] + }, + "_lNclkLEtEeSZUdYfPSdgew": { + "id": "OperationalState", + "uml-id": "_lNclkLEtEeSZUdYfPSdgew", + "enum": [ + "DISABLED", + "ENABLED" + ], + "is-read-only": false, + "description": [ + "The possible values of the operationalState." + ] + }, + "_KSKOYLEuEeSZUdYfPSdgew": { + "id": "AdministrativeState", + "uml-id": "_KSKOYLEuEeSZUdYfPSdgew", + "enum": [ + "LOCKED", + "UNLOCKED" + ], + "is-read-only": false, + "description": [ + "The possible values of the administrativeState." + ] + }, + "_-xPeALEvEeSZUdYfPSdgew": { + "id": "AdministrativeControl", + "uml-id": "_-xPeALEvEeSZUdYfPSdgew", + "enum": [ + "UNLOCK", + "LOCK_PASSIVE", + "LOCK_ACTIVE", + "LOCK_IMMEDIATE" + ], + "is-read-only": false, + "description": [ + "The possible values of the current target administrative state." + ] + }, + "_McyhcGgeEeWmgIwAIZlYKQ": { + "id": "ExtendedAdminState", + "uml-id": "_McyhcGgeEeWmgIwAIZlYKQ", + "enum": [ + "SHUTTING_DOWN_ACTIVE", + "SHUTTING_DOWN_PASSIVE" + ], + "is-read-only": false, + "description": [ + "Possible extentions to AdministrativeState" + ] + }, + "_YSsboGgiEeWmgIwAIZlYKQ": { + "id": "LifecycleState", + "uml-id": "_YSsboGgiEeWmgIwAIZlYKQ", + "enum": [ + "PLANNED", + "POTENTIAL", + "INSTALLED", + "PENDING_REMOVAL" + ], + "is-read-only": false, + "description": [ + "The possible values of the lifecycleState." + ] + } + } +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/elasticsearch/index/mwtn/modelDescription/G.874.1-ForMicrowave.json b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/elasticsearch/index/mwtn/modelDescription/G.874.1-ForMicrowave.json new file mode 100644 index 00000000..5c5daa75 --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/elasticsearch/index/mwtn/modelDescription/G.874.1-ForMicrowave.json @@ -0,0 +1,546 @@ +{ + "schema-information": { + "OTN_CurrentData": { + "id": "OTN_CurrentData", + "uml-id": "_OxyHAOGJEeGhaeLtr7IxXg", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "This object class is an abstract class from which the OTN layer-specific CurrentData object classes are inherited. This object class is a subclass of the Q.822 CurrentData object class, which in turn is a subclass of X.739 Scanner object class. It inherits the following attributes: scannerId, operationalState, granularityPeriod, administrativeState, suspectIntervalFlag, elapsedTime, observedObjectClass, and observedObjectInstance." + ] + }, + "timestamp": { + "id": "timestamp", + "uml-id": "_bGwfoOGJEeGhaeLtr7IxXg", + "uml-type": "ownedAttribute", + "type": "_X-HZUNwbEeGoneTbGt8X0A", + "order-number": 1, + "is-read-only": false, + "description": [ + "The timestamp associated with when the current data was collected." + ] + }, + "OTN_HistoryData": { + "id": "OTN_HistoryData", + "uml-id": "_dQ2mYOGOEeGhaeLtr7IxXg", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "This object class is an abstract class from which the OTN layer-specific HistoryData object classes are inherited." + ] + }, + "«Q.822»-CurrentData": { + "id": "«Q.822»-CurrentData", + "uml-id": "_M8IDMceIEeSfd5vyUJsimg", + "uml-type": "uml:Class", + "is-read-only": false + }, + "suspectIntervalFlag": { + "id": "suspectIntervalFlag", + "uml-id": "_M8IDNceIEeSfd5vyUJsimg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 1, + "is-read-only": false, + "description": [ + "This attribute is used to indicate that the performance data for the current period may not be reliable. Some reasons for this to occur are:- Suspect data were detected by the actual resource doing data collection.- Transition of the administrativeState attribute to/from the 'lock' state.- Transition of the operationalState to/from the 'disabled' state.- Scheduler setting that inhibits the collection function.- The performance counters were reset during the interval.- The currentData (or subclass) object instance was created during the monitoring period." + ] + }, + "elapsedTime": { + "id": "elapsedTime", + "uml-id": "_M8IDOMeIEeSfd5vyUJsimg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 2, + "is-read-only": false + }, + "«Q.822»-HistoryData": { + "id": "«Q.822»-HistoryData", + "uml-id": "_M8IDVMeIEeSfd5vyUJsimg", + "uml-type": "uml:Class", + "is-read-only": false + }, + "historyDataId": { + "id": "historyDataId", + "uml-id": "_M8IDWMeIEeSfd5vyUJsimg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 1, + "is-read-only": false, + "is-key": 1 + }, + "periodEndTime": { + "id": "periodEndTime", + "uml-id": "_M8IDWceIEeSfd5vyUJsimg", + "uml-type": "ownedAttribute", + "type": "../OnfModel-CoreModel/CoreModel.uml#_oGqi1lLNEeO75dO39GbF8Q", + "order-number": 2, + "is-read-only": false + }, + "«X.739»-Scanner": { + "id": "«X.739»-Scanner", + "uml-id": "_7wb90ceIEeSfd5vyUJsimg", + "uml-type": "uml:Class", + "is-read-only": false + }, + "scannerId": { + "id": "scannerId", + "uml-id": "_7wb91ceIEeSfd5vyUJsimg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 1, + "is-read-only": false, + "is-key": 1 + }, + "granularityPeriod": { + "id": "granularityPeriod", + "uml-id": "_M8IDWseIEeSfd5vyUJsimg", + "uml-type": "ownedAttribute", + "type": "_Y6WUEEamEeabNPX3o7rjtw", + "order-number": 2, + "is-read-only": false + }, + "administrativeState": { + "id": "administrativeState", + "uml-id": "_7wb92seIEeSfd5vyUJsimg", + "uml-type": "ownedAttribute", + "type": "../OnfModel-CoreModel/CoreModel.uml#_KSKOYLEuEeSZUdYfPSdgew", + "order-number": 3, + "is-read-only": false + }, + "«X.721»-Top": { + "id": "«X.721»-Top", + "uml-id": "_BMJ0EceTEeS6-cawxfHpnA", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "This is the top level of managed object class hierarchy and every other managed object class is a specialization of either this generic class (top) or a specialization of subclass of top. The parameter miscellaneousError is to be used when a processing failure has occurred and the error condition encountered does not match any of object's defined specific error types." + ] + }, + "objectClass": { + "id": "objectClass", + "uml-id": "_BMJ0FceTEeS6-cawxfHpnA", + "uml-type": "ownedAttribute", + "type": "_ltGzFMeUEeS6-cawxfHpnA", + "order-number": 1, + "is-read-only": false, + "description": [ + "ObjectClass ::= CHOICE{ globalForm [0] OBJECT IDENTIFIER, localForm [1] INTEGER}" + ] + }, + "nameBinding": { + "id": "nameBinding", + "uml-id": "_BMJ0F8eTEeS6-cawxfHpnA", + "uml-type": "ownedAttribute", + "type": "_ltGzFMeUEeS6-cawxfHpnA", + "order-number": 2, + "is-read-only": false + }, + "DateAndTime": { + "id": "DateAndTime", + "uml-id": "_X-HZUNwbEeGoneTbGt8X0A", + "uml-type": "uml:DataType", + "description": [ + "This primitive type defines the date and time according to the following structure: yyyyMMddhhmmss.s[Z|{+|-}HHMm] where: yyyy 0000 .. 9999 year MM 01 .. 12 month dd 01 .. 31 day hh 00 .. 23 hour mm 00 .. 59 minute ss 00 .. 59 second s .0 .. .9 tenth of second (set to .0 if EMS or NE cannot support this granularity) Z Z indicates UTC (rather than local time) {+|-} + or - delta from UTC HH 00 .. 23 time zone difference in hours Mm 00 .. 59 time zone difference in minutes." + ] + }, + "_5G6YQOo-EeCjNNLZCc6mew": { + "id": "Directionality", + "uml-id": "_5G6YQOo-EeCjNNLZCc6mew", + "enum": [ + "SINK", + "SOURCE", + "BIDIRECTIONAL" + ], + "is-read-only": false, + "description": [ + "The enumeration with the options for directionality of the termination point." + ] + }, + "_rU8aMOpfEeCjNNLZCc6mew": { + "id": "GccAccess", + "uml-id": "_rU8aMOpfEeCjNNLZCc6mew", + "enum": [ + "GCC1", + "GCC2", + "GCC1_AND_GCC2" + ], + "is-read-only": false, + "description": [ + "This enumeration indicates the GCC access represented by the entity." + ] + }, + "_W7-1oOpiEeCjNNLZCc6mew": { + "id": "OperationalState", + "uml-id": "_W7-1oOpiEeCjNNLZCc6mew", + "enum": [ + "ENABLED", + "DISABLED" + ], + "is-read-only": false, + "description": [ + "The list of valid operational states for the connection." + ] + }, + "_g0zCsOsDEeCjNNLZCc6mew": { + "id": "OperType", + "uml-id": "_g0zCsOsDEeCjNNLZCc6mew", + "enum": [ + "REVERTIVE", + "NON-REVERTIVE" + ], + "is-read-only": [ + "The operation type associated with the protection mechanism (either non-revertive or revertive)." + ] + }, + "_Jl09gOsKEeCjNNLZCc6mew": { + "id": "ExtCmdOperation", + "uml-id": "_Jl09gOsKEeCjNNLZCc6mew", + "enum": [ + "EXERCISE", + "MANUAL_SWITCH", + "FORCED_SWITCH", + "LOCKOUT", + "RELEASE_OF_MANUAL_SWITCH", + "RELEASE_OF_FORCED_SWITCH", + "RELEASE_OF_LOCKOUT" + ], + "is-read-only": false, + "description": [ + "This enumeration contains the options for the actions that instruct the protection system for performing specific protection switching operations." + ] + }, + "_bwxBQOw5EeCjNNLZCc6mew": { + "id": "AdministrativeState", + "uml-id": "_bwxBQOw5EeCjNNLZCc6mew", + "enum": [ + "UNLOCKED", + "LOCKED", + "SHUTTING_DOWN" + ], + "is-read-only": false, + "description": [ + "For more information on Administrative State, See ITU-T Recs. X.731 and M.3100." + ] + }, + "_ChQ5oOw-EeCjNNLZCc6mew": { + "id": "OCTk_NimKBitRate", + "uml-id": "_ChQ5oOw-EeCjNNLZCc6mew", + "enum": [ + "2.5_G", + "10_G", + "40_G", + "100_G" + ], + "is-read-only": false, + "description": [ + "Provides an enumeration with the meaning of each k value." + ] + }, + "_ZBtyUOw_EeCjNNLZCc6mew": { + "id": "TimDetMo", + "uml-id": "_ZBtyUOw_EeCjNNLZCc6mew", + "enum": [ + "DAPI", + "SAPI", + "BOTH" + ], + "is-read-only": false, + "description": [ + "List of modes for trace identifier mismatch detection." + ] + }, + "_HF864OxAEeCjNNLZCc6mew": { + "id": "OCTk_NimProblemList", + "uml-id": "_HF864OxAEeCjNNLZCc6mew", + "enum": [ + "LOS_P", + "OCI", + "SSF_P", + "SSF_O", + "SSF", + "TIM", + "DEG", + "BDI" + ], + "is-read-only": false, + "description": [ + "The valid list of problems for the entity." + ] + }, + "_WPoNoO3eEeCjNNLZCc6mew": { + "id": "TcmMonitoring", + "uml-id": "_WPoNoO3eEeCjNNLZCc6mew", + "enum": [ + "INTRUSIVE", + "NON-INTRUSIVE" + ], + "is-read-only": false, + "description": [ + "Monitoring types for the tandem connection monitoring function." + ] + }, + "_OI-7wO6QEeCjNNLZCc6mew": { + "id": "TcmMode", + "uml-id": "_OI-7wO6QEeCjNNLZCc6mew", + "enum": [ + "OPERATIONAL", + "TRANSPARENT", + "MONITOR" + ], + "is-read-only": false, + "description": [ + "List of value modes for the sink side of the tandem connection monitoring function." + ] + }, + "_ZnM8cO6ZEeCjNNLZCc6mew": { + "id": "OPSMnk_TtpKBitRate", + "uml-id": "_ZnM8cO6ZEeCjNNLZCc6mew", + "enum": [ + "40_G", + "100_G" + ], + "is-read-only": false, + "description": [ + "Provides an enumeration with the meaning of each k value." + ] + }, + "_pV-F8O6aEeCjNNLZCc6mew": { + "id": "OPSMnk_TtpProblemList", + "uml-id": "_pV-F8O6aEeCjNNLZCc6mew", + "enum": [ + "LOS", + "LOL" + ], + "is-read-only": false, + "description": [ + "The valid list of problems for the entity." + ] + }, + "_QW1SYO6bEeCjNNLZCc6mew": { + "id": "OPSn_TtpProblemList", + "uml-id": "_QW1SYO6bEeCjNNLZCc6mew", + "enum": [ + "LOS" + ], + "is-read-only": false, + "description": [ + "The valid list of problems for the entity." + ] + }, + "_o-oukO6bEeCjNNLZCc6mew": { + "id": "OTM-n_KBitRates", + "uml-id": "_o-oukO6bEeCjNNLZCc6mew", + "enum": [ + "2.5_G", + "10_G", + "40_G", + "2.5_10_G", + "10_40_G", + "2.5_10_40_G" + ], + "is-read-only": false, + "description": [ + "Provides an enumeration with the meaning of each k value." + ] + }, + "_KRCG4O6dEeCjNNLZCc6mew": { + "id": "DomainInterface", + "uml-id": "_KRCG4O6dEeCjNNLZCc6mew", + "enum": [ + "INTRA_DOMAIN", + "INTER_DOMAIN" + ], + "is-read-only": false, + "description": [ + "This enumeration provides the options for the interface associated with OTMn." + ] + }, + "_EOPyIO6qEeCjNNLZCc6mew": { + "id": "OTM-n_OpticalReach", + "uml-id": "_EOPyIO6qEeCjNNLZCc6mew", + "enum": [ + "INTRA_OFFICE", + "SHORTHAUL", + "LONGHAUL" + ], + "is-read-only": false, + "description": [ + "The valid options for reach of the optical cable." + ] + }, + "_6Bt3QO6qEeCjNNLZCc6mew": { + "id": "AprStatus", + "uml-id": "_6Bt3QO6qEeCjNNLZCc6mew", + "enum": [ + "ON", + "OFF" + ], + "is-read-only": false, + "description": [ + "The enumeration of the options for the Automatic Power Reduction Status." + ] + }, + "_FLzNQO6vEeCjNNLZCc6mew": { + "id": "OTSn_TtpProblemList", + "uml-id": "_FLzNQO6vEeCjNNLZCc6mew", + "enum": [ + "BDI_P", + "BDI_O", + "BDI", + "TIM", + "LOS_P", + "LOS_O", + "LOS" + ], + "is-read-only": false, + "description": [ + "The valid list of problems for the entity." + ] + }, + "_NAElYO6wEeCjNNLZCc6mew": { + "id": "OTUk_CtpAdaptation", + "uml-id": "_NAElYO6wEeCjNNLZCc6mew", + "enum": [ + "REGULAR", + "NONE", + "VENDOR_SPECIFIC", + "FUNCTIONALLY_STANDARDIZED" + ], + "is-read-only": false, + "description": [ + "The adaptation options for OTUk_ConnectionTermationPoints." + ] + }, + "_wgRHcO6wEeCjNNLZCc6mew": { + "id": "OTUk_CtpKBitRate", + "uml-id": "_wgRHcO6wEeCjNNLZCc6mew", + "enum": [ + "2.5_G", + "10_G", + "40_G", + "100_G" + ], + "is-read-only": false, + "description": [ + "Provides an enumeration with the meaning of each k value." + ] + }, + "_6Y_gEO6wEeCjNNLZCc6mew": { + "id": "OTUk_CtpProblemList", + "uml-id": "_6Y_gEO6wEeCjNNLZCc6mew", + "enum": [ + "LOF", + "AIS", + "LOM" + ], + "is-read-only": false, + "description": [ + "The valid list of problems for the entity." + ] + }, + "_xHNWMO6xEeCjNNLZCc6mew": { + "id": "OTUk_TtpProblemList", + "uml-id": "_xHNWMO6xEeCjNNLZCc6mew", + "enum": [ + "TIM", + "DEG", + "BDI", + "SSF" + ], + "is-read-only": false, + "description": [ + "The valid list of problems for the entity." + ] + }, + "_KRQ3MK8KEeG_zYhfU3oMYg": { + "id": "MonitoredDirection", + "uml-id": "_KRQ3MK8KEeG_zYhfU3oMYg", + "enum": [ + "SINK", + "SOURCE" + ], + "is-read-only": false, + "description": [ + "The enumeration with the options for directionality for nonintrusive monitoring." + ] + }, + "_qBme4LuYEeGeqZLpdvU3BA": { + "id": "DegThrType", + "uml-id": "_qBme4LuYEeGeqZLpdvU3BA", + "enum": [ + "PERCENTAGE", + "NUMBER_ERRORED_BLOCKS" + ], + "is-read-only": false, + "description": [ + "

The value of the threshold can be provisioned in terms of number of errored blocks or in terms of percentage of errored blocks. For percentage-based specification, in order to support provision of less than 1%, the specification consists of two fields. The first field indicates the granularity of percentage. For examples, in 1%, in 0.1%, or in 0.01%, etc. The second field indicates the multiple of the granularity. For number of errored block based, the value is a positive integer.

" + ] + }, + "_Parz8NwAEeGoneTbGt8X0A": { + "id": "LinkType", + "uml-id": "_Parz8NwAEeGoneTbGt8X0A", + "enum": [ + "DWDM", + "CWDM", + "NO_WDM" + ], + "is-read-only": false + }, + "_V1TuANwAEeGoneTbGt8X0A": { + "id": "ApplicationIdentifierType", + "uml-id": "_V1TuANwAEeGoneTbGt8X0A", + "enum": [ + "STANDARD", + "PROPRIETARY" + ], + "is-read-only": false + }, + "_yt7S4PzgEeG3u-aQKIiCtg": { + "id": "ApsChannel", + "uml-id": "_yt7S4PzgEeG3u-aQKIiCtg", + "enum": [ + "PATH", + "TCM1", + "TCM2", + "TCM3", + "TCM4", + "TCM5", + "TCM6", + "SECTION" + ], + "is-read-only": false + }, + "_LG3yQOVVEeKyU85eduW_rA": { + "id": "DelayMeasurementRole", + "uml-id": "_LG3yQOVVEeKyU85eduW_rA", + "enum": [ + "CONTROLLER", + "RESPONDER" + ], + "is-read-only": false + }, + "_7fy9sJSCEeOLxKCUIYtzCg": { + "id": "ResizeOperationType", + "uml-id": "_7fy9sJSCEeOLxKCUIYtzCg", + "enum": [ + "INCREASE_BW", + "DECREASE_BW" + ], + "is-read-only": false + }, + "_Y6WUEEamEeabNPX3o7rjtw": { + "id": "GranularityPeriodType", + "uml-id": "_Y6WUEEamEeabNPX3o7rjtw", + "enum": [ + "UNKNOWN", + "PERIOD_15MIN", + "PERIOD_24HOURS" + ], + "is-read-only": false, + "description": [ + "The enumeration with the options for granularity period of the performance data." + ] + } + } +} \ No newline at end of file diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/elasticsearch/index/mwtn/modelDescription/MicrowaveModel-ObjectClasses-AirInterface.yin.json b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/elasticsearch/index/mwtn/modelDescription/MicrowaveModel-ObjectClasses-AirInterface.yin.json new file mode 100755 index 00000000..2aeb80f9 --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/elasticsearch/index/mwtn/modelDescription/MicrowaveModel-ObjectClasses-AirInterface.yin.json @@ -0,0 +1,45 @@ +{ + "module": { + "name": "MicrowaveModel-ObjectClasses-AirInterface", + "MicrowaveModel-ObjectClasses-AirInterface": { + "MW_AirInterface_Pac": { + "type": "list", + "key": "layerProtocol", + "airInterfaceCapability": { + "name": "airInterfaceCapability", + "local-name": "capability", + "type": "container" + }, + "airInterfaceConfiguration": { + "name": "airInterfaceConfiguration", + "local-name": "configuration", + "type": "container" + }, + "airInterfaceStatus": { + "name": "airInterfaceStatus", + "local-name": "status", + "type": "container" + }, + "airInterfaceCurrentProblems": { + "name": "airInterfaceCurrentProblems", + "local-name": "current-problems", + "type": "container" + }, + "airInterfaceCurrentPerformance": { + "name": "airInterfaceCurrentPerformance", + "local-name": "current-performance", + "type": "container" + }, + "airInterfaceHistoricalPerformances": { + "name": "airInterfaceHistoricalPerformances", + "local-name": "historical-performances", + "type": "container" + } + }, + "CoChannelGroup": { + "type": "list", + "key": "coChannelGroupId" + } + } + } +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/elasticsearch/index/mwtn/modelDescription/MicrowaveModel-ObjectClasses-EthernetContainer.yin.json b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/elasticsearch/index/mwtn/modelDescription/MicrowaveModel-ObjectClasses-EthernetContainer.yin.json new file mode 100755 index 00000000..2af4d50d --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/elasticsearch/index/mwtn/modelDescription/MicrowaveModel-ObjectClasses-EthernetContainer.yin.json @@ -0,0 +1,41 @@ +{ + "module": { + "name": "MicrowaveModel-ObjectClasses-EthernetContainer", + "MicrowaveModel-ObjectClasses-EthernetContainer": { + "MW_EthernetContainer_Pac": { + "type": "list", + "key": "layerProtocol", + "ethernetContainerCapability": { + "name": "ethernetContainerCapability", + "local-name": "capability", + "type": "container" + }, + "ethernetContainerConfiguration": { + "name": "ethernetContainerConfiguration", + "local-name": "configuration", + "type": "container" + }, + "ethernetContainerStatus": { + "name": "ethernetContainerStatus", + "local-name": "status", + "type": "container" + }, + "ethernetContainerCurrentProblems": { + "name": "ethernetContainerCurrentProblems", + "local-name": "current-problems", + "type": "container" + }, + "ethernetContainerCurrentPerformance": { + "name": "ethernetContainerCurrentPerformance", + "local-name": "current-performance", + "type": "container" + }, + "ethernetContainerHistoricalPerformances": { + "name": "ethernetContainerHistoricalPerformances", + "local-name": "historical-performances", + "type": "container" + } + } + } + } +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/elasticsearch/index/mwtn/modelDescription/MicrowaveModel-ObjectClasses-PureEthernetStructure.yin.json b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/elasticsearch/index/mwtn/modelDescription/MicrowaveModel-ObjectClasses-PureEthernetStructure.yin.json new file mode 100755 index 00000000..20726f87 --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/elasticsearch/index/mwtn/modelDescription/MicrowaveModel-ObjectClasses-PureEthernetStructure.yin.json @@ -0,0 +1,41 @@ +{ + "module": { + "name": "MicrowaveModel-ObjectClasses-PureEthernetStructure", + "MicrowaveModel-ObjectClasses-PureEthernetStructure": { + "MW_PureEthernetStructure_Pac": { + "type": "list", + "key": "layerProtocol", + "pureEthernetStructureCapability": { + "name": "pureEthernetStructureCapability", + "local-name": "capability", + "type": "container" + }, + "pureEthernetStructureConfiguration": { + "name": "pureEthernetStructureConfiguration", + "local-name": "configuration", + "type": "container" + }, + "pureEthernetStructureStatus": { + "name": "pureEthernetStructureStatus", + "local-name": "status", + "type": "container" + }, + "pureEthernetStructureCurrentProblems": { + "name": "pureEthernetStructureCurrentProblems", + "local-name": "current-problems", + "type": "container" + }, + "pureEthernetStructureCurrentPerformance": { + "name": "pureEthernetStructureCurrentPerformance", + "local-name": "current-performance", + "type": "container" + }, + "pureEthernetStructureHistoricalPerformances": { + "name": "pureEthernetStructureHistoricalPerformances", + "local-name": "historical-performances", + "type": "container" + } + } + } + } +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/elasticsearch/index/mwtn/modelDescription/MicrowaveModel.json b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/elasticsearch/index/mwtn/modelDescription/MicrowaveModel.json new file mode 100644 index 00000000..34d0503a --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/elasticsearch/index/mwtn/modelDescription/MicrowaveModel.json @@ -0,0 +1,2940 @@ +{ + "schema-information": { + "MW_AirInterface_Pac": { + "id": "MW_AirInterface_Pac", + "uml-id": "__1kQ0Hf4EeW-M8kopGJqEA", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "LTP(MWPS-TTP)" + ] + }, + "airInterfaceCapability": { + "id": "airInterfaceCapability", + "uml-id": "_Dr1uMIekEeWaZYk7gpuOtw", + "uml-type": "ownedAttribute", + "type": "_-LlKoIejEeWaZYk7gpuOtw", + "order-number": 2, + "is-read-only": true + }, + "airInterfaceConfiguration": { + "id": "airInterfaceConfiguration", + "uml-id": "_AEmSAIe1EeWnUdmvl3PBkw", + "uml-type": "ownedAttribute", + "type": "_KOcsUIe0EeWnUdmvl3PBkw", + "order-number": 3, + "is-read-only": false + }, + "airInterfaceStatus": { + "id": "airInterfaceStatus", + "uml-id": "_Vp35cnmgEeWsUsDOj_Trdg", + "uml-type": "ownedAttribute", + "type": "_iCTioHmIEeWRAfnL3fvovg", + "order-number": 4, + "is-read-only": true + }, + "airInterfaceCurrentProblems": { + "id": "airInterfaceCurrentProblems", + "uml-id": "_ZeRYInmgEeWsUsDOj_Trdg", + "uml-type": "ownedAttribute", + "type": "_UF8VcHmIEeWRAfnL3fvovg", + "order-number": 5, + "is-read-only": true + }, + "airInterfaceCurrentPerformance": { + "id": "airInterfaceCurrentPerformance", + "uml-id": "_65_4M6S6EeWyu_jasKgNwA", + "uml-type": "ownedAttribute", + "type": "_CX-iIKS6EeWyu_jasKgNwA", + "order-number": 6, + "is-read-only": true + }, + "airInterfaceHistoricalPerformances": { + "id": "airInterfaceHistoricalPerformances", + "uml-id": "__8icYJHfEeWKxoYCXp1XkQ", + "uml-type": "ownedAttribute", + "type": "_fChNMHmHEeWRAfnL3fvovg", + "order-number": 7, + "is-read-only": true + }, + "AirInterfaceCapability": { + "id": "AirInterfaceCapability", + "uml-id": "_-LlKoIejEeWaZYk7gpuOtw", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Describes the 'analog' capabilities of modem and transmitter of the microwave device. Value ranges of attributes are not independently (e.g. min. and max. transmit power depends on modulation). Legal combinations of values are expressed in transmissionModeTypes." + ] + }, + "typeOfEquipment": { + "id": "typeOfEquipment", + "uml-id": "_gK4jMJUBEeWIaZzoaYJ6_A", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 1, + "is-read-only": true, + "description": [ + "This parameter indicates the equipment type. Instead of uploading the complete set of capabilities, capabilities of the same equipment type could be reused. Should be unique for a combination of modem, radio and their respective firmware." + ] + }, + "txFrequencyMin": { + "id": "txFrequencyMin", + "uml-id": "_90Xe0HfcEeW-h9gN8LYm4Q", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 2, + "is-read-only": true, + "unit": "kHz", + "description": [ + "Value of the minimum transmit frequency tunable at the air interface." + ] + }, + "txFrequencyMax": { + "id": "txFrequencyMax", + "uml-id": "_-1ztsHfcEeW-h9gN8LYm4Q", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 3, + "is-read-only": true, + "unit": "kHz", + "description": [ + "Value of the maximum transmit frequency tunable at the air interface." + ] + }, + "rxFrequencyMin": { + "id": "rxFrequencyMin", + "uml-id": "_BLqx0HfdEeW-h9gN8LYm4Q", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 4, + "is-read-only": true, + "unit": "kHz", + "description": [ + "Value of the minimum receive frequency tunable at the air interface." + ] + }, + "rxFrequencyMax": { + "id": "rxFrequencyMax", + "uml-id": "_CSBV4HfdEeW-h9gN8LYm4Q", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 5, + "is-read-only": true, + "unit": "kHz", + "description": [ + "Value of the maximum receive frequency tunable at the air interface." + ] + }, + "adaptiveModulationIsAvail": { + "id": "adaptiveModulationIsAvail", + "uml-id": "_ClmuUHffEeW-h9gN8LYm4Q", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 6, + "is-read-only": true, + "description": [ + "In case the device is capable of adaptive modulation, this field shall contain a 'true'." + ] + }, + "mimoIsAvail": { + "id": "mimoIsAvail", + "uml-id": "_qXBrkH2eEeWaPP5xsIT8pQ", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 7, + "is-read-only": true, + "description": [ + "In case the device is capable of MIMO, this field shall contain a 'true'." + ] + }, + "mimoChannels": { + "id": "mimoChannels", + "uml-id": "_qysT4H2eEeWaPP5xsIT8pQ", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EByte", + "order-number": 8, + "is-read-only": true, + "unit": "channels", + "description": [ + "Maximum number (n) of spatial multiplexing streams that can be conveyed by an n x n MIMO configuration." + ] + }, + "alicIsAvail": { + "id": "alicIsAvail", + "uml-id": "_a3HgMIL9EeWMcJAvkeTn2w", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 9, + "is-read-only": true, + "description": [ + "In case the microwave radio is capable of Adjacent Link Interference Cancelation (canceling of interference cause by transmitters located at the same site), this field shall contain a 'true'." + ] + }, + "atpcIsAvail": { + "id": "atpcIsAvail", + "uml-id": "_iRRtgHftEeW-h9gN8LYm4Q", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 10, + "is-read-only": true, + "description": [ + "In case the microwave radio is capable of ATPC, this field shall contain a 'true'." + ] + }, + "atpcRange": { + "id": "atpcRange", + "uml-id": "_ErwNYHfdEeW-h9gN8LYm4Q", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EByte", + "order-number": 11, + "is-read-only": true, + "unit": "dB", + "description": [ + "Extent of the ATPC range." + ] + }, + "loopBackIsAvail": { + "id": "loopBackIsAvail", + "uml-id": "_UxjEkIMHEeWMcJAvkeTn2w", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 13, + "is-read-only": true, + "description": [ + "In case the radio is capable of looping back header information of the air interface, this field shall contain a 'true'." + ] + }, + "maintenanceTimerRange": { + "id": "maintenanceTimerRange", + "uml-id": "_I1FYsMWZEeW3xsRKtpCLuA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 14, + "is-read-only": true, + "unit": "s", + "description": [ + "Available time periods for maintenance configurations (e.g. the loop back of microwave header information) to be described. Concrete values shall be separated by commas (e.g. '10, 60, 360'). Ranges shall be expressed as two values separated by a minus (e.g. '10-360')." + ] + }, + "supportedChannelPlanList": { + "id": "supportedChannelPlanList", + "uml-id": "_zUKUgPXVEeW9zIqh2WHHww", + "uml-type": "ownedAttribute", + "type": "_oQf6IPXSEeW9zIqh2WHHww", + "order-number": 16, + "is-read-only": true, + "description": [ + "List of channel spacing that are supported by the device." + ] + }, + "AirInterfaceConfiguration": { + "id": "AirInterfaceConfiguration", + "uml-id": "_KOcsUIe0EeWnUdmvl3PBkw", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Configuration of the radio link." + ] + }, + "airInterfaceName": { + "id": "airInterfaceName", + "uml-id": "_XMDggIL5EeWMcJAvkeTn2w", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 1, + "is-read-only": false, + "description": [ + "Operator specific microwave link ID (often used for coding area, type of element and sequential number)." + ] + }, + "radioSignalID": { + "id": "radioSignalID", + "uml-id": "_QY9KoHf5EeW-M8kopGJqEA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 2, + "is-read-only": false, + "description": [ + "The value zero might be used to make the microwave to disable the link ID check." + ] + }, + "txFrequency": { + "id": "txFrequency", + "uml-id": "_UNE8gHf5EeW-M8kopGJqEA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 3, + "is-read-only": false, + "unit": "kHz", + "description": [ + "Center frequency of the transmit channel. The values to be configured have to exactly match the values listed in the international agreement referenced in channelPlanID. In case of automated selection of the transmit frequency this field shall describe the lowest center frequency selectable." + ] + }, + "rxFrequency": { + "id": "rxFrequency", + "uml-id": "_W7ayEHf5EeW-M8kopGJqEA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 4, + "is-read-only": false, + "unit": "kHz", + "description": [ + "Center frequency of the receive channel." + ] + }, + "txChannelBandwidth": { + "id": "txChannelBandwidth", + "uml-id": "_bhAdIHf5EeW-M8kopGJqEA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 5, + "is-read-only": false, + "unit": "kHz", + "description": [ + "Bandwidth of the transmit channel. The value shall be expressed explicitly (means in kHz) not as a reference to an international agreement. The values shall be chosen from the following _list: 3.500, 7.000, 14.000, 27.500, 28.000, 29.000, 29.650, 30.000, 40.000, 50.000, 55.000, 56.000, 59.300, 60.000, 80.000, 100.000, 112.000, 120.000, 150.000, 200.000, 250.000, 500.000, 750.000, 1.000.000, 1.250.000, 1.500.000, 1.750.000, 2.000.000;" + ] + }, + "rxChannelBandwidth": { + "id": "rxChannelBandwidth", + "uml-id": "_eKIbgHf5EeW-M8kopGJqEA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 6, + "is-read-only": false, + "unit": "kHz", + "description": [ + "Bandwidth of the receive channel. The value shall be expressed explicitly (means in kHz) not as a reference to an international agreement. The values shall be chosen from the following _list: 3.500, 7.000, 14.000, 27.500, 28.000, 29.000, 29.650, 30.000, 40.000, 50.000, 55.000, 56.000, 59.300, 60.000, 80.000, 100.000, 112.000, 120.000, 150.000, 200.000, 250.000, 500.000, 750.000, 1.000.000, 1.250.000, 1.500.000, 1.750.000, 2.000.000;" + ] + }, + "polarization": { + "id": "polarization", + "uml-id": "_bVebEI99EeWFluv9KLLl5A", + "uml-type": "ownedAttribute", + "type": "_e85NsI99EeWFluv9KLLl5A", + "order-number": 7, + "is-read-only": false, + "description": [ + "Allows documenting the polarization of the air interface." + ] + }, + "powerIsOn": { + "id": "powerIsOn", + "uml-id": "_p4eR8Hf5EeW-M8kopGJqEA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 8, + "is-read-only": false, + "description": [ + "Power ON. Activation of the entire radio in a split mount configuration shall be expressed as a 'true'." + ] + }, + "transmitterIsOn": { + "id": "transmitterIsOn", + "uml-id": "_uYVvgHf5EeW-M8kopGJqEA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 9, + "is-read-only": false, + "description": [ + "Activation of the transmitter inside the radio shall be expressed as a 'true'." + ] + }, + "receiverIsOn": { + "id": "receiverIsOn", + "uml-id": "_q_XcwEgnEeathrAE0htMiA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 10, + "is-read-only": false, + "description": [ + "Maintenance Feature" + ] + }, + "txPower": { + "id": "txPower", + "uml-id": "_ZEXmIHf6EeW-M8kopGJqEA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EByte", + "order-number": 11, + "is-read-only": false, + "unit": "dBm", + "description": [ + "Transmit power to be configured on the microwave link. Signed Byte is required. The actually operated transmit power might be lower depending on adaptive modulation and ATPC." + ] + }, + "adaptiveModulationIsOn": { + "id": "adaptiveModulationIsOn", + "uml-id": "_0jhfYHf5EeW-M8kopGJqEA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 12, + "is-read-only": false, + "description": [ + "Adaptive Modulation. Activation of adaptive modulation shall be expressed as a 'true'." + ] + }, + "modulationMin": { + "id": "modulationMin", + "uml-id": "_dM_BUHf6EeW-M8kopGJqEA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EShort", + "order-number": 13, + "is-read-only": false, + "unit": "symbols", + "description": [ + "Minimum modulation to be configured (in case adaptive modulation is not used, this value represents also the fixed modulation). The modulation scheme shall be described by the number of symbols (e.g. BPSK->'2' or 256QAM->'256'). Allowed values are defined in TypeDefinitions::transmissionModeType::modulationScheme." + ] + }, + "modulationMax": { + "id": "modulationMax", + "uml-id": "_gAHQQHf6EeW-M8kopGJqEA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EShort", + "order-number": 14, + "is-read-only": false, + "unit": "symbols", + "description": [ + "Maximum modulation to be configured. The value of this field is only relevant, if Adaptive Modulation has been activated. The modulation scheme shall be described by the number of symbols (e.g. BPSK->'2' or 256QAM->'256'). Allowed values are defined in TypeDefinitions::transmissionModeType::modulationScheme." + ] + }, + "xpicIsOn": { + "id": "xpicIsOn", + "uml-id": "_4hi0IHf5EeW-M8kopGJqEA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 15, + "is-read-only": false, + "description": [ + "Activation of Cross Polarization Interference Cancelation shall be expressed as a 'true'. In case XPIC is not available for the current combination of channel bandwidth and modulation or the hardware in general, this parameter shall always be set to 'false'." + ] + }, + "mimoIsOn": { + "id": "mimoIsOn", + "uml-id": "_7t4fIH2dEeWaPP5xsIT8pQ", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 16, + "is-read-only": false, + "description": [ + "Activation of Multiple Input Multiple Output (MIMO) shall be expressed as a 'true'." + ] + }, + "alicIsOn": { + "id": "alicIsOn", + "uml-id": "_FmWHMHf6EeW-M8kopGJqEA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 17, + "is-read-only": false, + "description": [ + "Activation of Adjacent Link Interference Cancelation (ALIC) shall be expressed as a 'true'." + ] + }, + "atpcIsOn": { + "id": "atpcIsOn", + "uml-id": "_9Hz0oHf5EeW-M8kopGJqEA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 18, + "is-read-only": false, + "description": [ + "ATPC. Activation of Automated Transmit Power Control shall be expressed as a 'true'." + ] + }, + "atpcThreshUpper": { + "id": "atpcThreshUpper", + "uml-id": "_pR7yMHgAEeW-M8kopGJqEA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EShort", + "order-number": 19, + "is-read-only": false, + "unit": "dBm", + "description": [ + "If the receive level is higher than the upper threshold value, the transmitter is notified to decrease transmit power." + ] + }, + "atpcThreshLower": { + "id": "atpcThreshLower", + "uml-id": "_sIlPMHgAEeW-M8kopGJqEA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EShort", + "order-number": 20, + "is-read-only": false, + "unit": "dBm", + "description": [ + "If the receive level is lower than the lower threshold value, the transmitter is notified to increase transmit power." + ] + }, + "autoFreqSelectIsOn": { + "id": "autoFreqSelectIsOn", + "uml-id": "_dG5VAIL-EeWMcJAvkeTn2w", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 21, + "is-read-only": false, + "description": [ + "Activation of automatically selecting the transmit frequency in unlicensed bands shall be expressed as a 'true'." + ] + }, + "autoFreqSelectRange": { + "id": "autoFreqSelectRange", + "uml-id": "_yH9XMIMCEeWMcJAvkeTn2w", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EByte", + "order-number": 22, + "is-read-only": false, + "unit": "channels", + "description": [ + "Number of transmit channels (starting at the center frequency defined in txFrequency and with channel bandwidth according to txChannelBandwidth) that define the range within the transmit frequency can automatically been chosen." + ] + }, + "modulationIsOn": { + "id": "modulationIsOn", + "uml-id": "_kxXzwIMGEeWMcJAvkeTn2w", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 23, + "is-read-only": false, + "description": [ + "Maintenance Feature" + ] + }, + "loopBackIsOn": { + "id": "loopBackIsOn", + "uml-id": "_PyRvsHf6EeW-M8kopGJqEA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 26, + "is-read-only": false, + "description": [ + "Maintenance Feature" + ] + }, + "maintenanceTimer": { + "id": "maintenanceTimer", + "uml-id": "_7-oTwCd5EeaJA6AVLNrv_w", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 27, + "is-read-only": false, + "unit": "s", + "description": [ + "Time of existence of any maintenance configuration (e.g. the loop back of microwave header information). Valid values are defined in AirInterface::AirInterfaceCapability::maintenanceTimerRange." + ] + }, + "AirInterfaceStatus": { + "id": "AirInterfaceStatus", + "uml-id": "_iCTioHmIEeWRAfnL3fvovg", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Measurements of current values on the air interface and operational status of the device." + ] + }, + "txFrequencyCur": { + "id": "txFrequencyCur", + "uml-id": "_YZq7gK4tEeWXs6m-9H3KvA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 1, + "is-read-only": true, + "unit": "kHz", + "description": [ + "Center frequency of the currently operated transmit channel." + ] + }, + "rxFrequencyCur": { + "id": "rxFrequencyCur", + "uml-id": "_33IdUIL-EeWMcJAvkeTn2w", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 2, + "is-read-only": true, + "unit": "kHz", + "description": [ + "Center frequency of the currently operated receive channel." + ] + }, + "txLevelCur": { + "id": "txLevelCur", + "uml-id": "_L3B5wHgIEeWfutScSwFT9A", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EByte", + "order-number": 3, + "is-read-only": true, + "unit": "dBm", + "description": [ + "Current transmit level." + ] + }, + "rxLevelCur": { + "id": "rxLevelCur", + "uml-id": "_OHN9AHizEeWfutScSwFT9A", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EByte", + "order-number": 4, + "is-read-only": true, + "unit": "dBm", + "description": [ + "Current receive level." + ] + }, + "modulationCur": { + "id": "modulationCur", + "uml-id": "_RBMa0HizEeWfutScSwFT9A", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EShort", + "order-number": 5, + "is-read-only": true, + "unit": "symbols", + "description": [ + "Currently operated modulation on transmit path. The modulation scheme shall be described by the number of symbols (e.g. BPSK->'2' or 256QAM->'256'). Allowed values are defined in TypeDefinitions::transmissionModeType::modulationScheme." + ] + }, + "informationRateCur": { + "id": "informationRateCur", + "uml-id": "_UYyBsHizEeWfutScSwFT9A", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EByte", + "order-number": 6, + "is-read-only": true, + "unit": "%", + "description": [ + "Information rate of the currently operated coding scheme." + ] + }, + "xpdCur": { + "id": "xpdCur", + "uml-id": "_Z7NvgHizEeWfutScSwFT9A", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EByte", + "order-number": 8, + "is-read-only": true, + "unit": "dB", + "description": [ + "Currently measured cross polarization discrimination." + ] + }, + "rfTempCur": { + "id": "rfTempCur", + "uml-id": "_d6wuQHizEeWfutScSwFT9A", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EByte", + "order-number": 9, + "is-read-only": true, + "unit": "Celsius", + "description": [ + "Current temperature (in degree Celsius) of the radio module inside the outdoor unit." + ] + }, + "radioPowerIsUp": { + "id": "radioPowerIsUp", + "uml-id": "_sFKXcHizEeWfutScSwFT9A", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 11, + "is-read-only": true, + "description": [ + "If the radio unit has power and is switched on, this shall be expressed as a 'true'." + ] + }, + "linkIsUp": { + "id": "linkIsUp", + "uml-id": "_5JBPUHizEeWfutScSwFT9A", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 12, + "is-read-only": true, + "description": [ + "If connection is established to the remote site with the same linkID, this shall be expressed as a 'true'." + ] + }, + "xpicIsUp": { + "id": "xpicIsUp", + "uml-id": "_ESRbsHi0EeWfutScSwFT9A", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 13, + "is-read-only": true, + "description": [ + "If XPIC is currently actually working (not just configured), this shall be expressed as a 'true'." + ] + }, + "mimoIsUp": { + "id": "mimoIsUp", + "uml-id": "_DVaQwIL6EeWMcJAvkeTn2w", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 14, + "is-read-only": true, + "description": [ + "If MIMO is currently actually working (not just configured), this shall be expressed as a 'true'." + ] + }, + "alicIsUp": { + "id": "alicIsUp", + "uml-id": "_Hte-UHi0EeWfutScSwFT9A", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 15, + "is-read-only": true, + "description": [ + "If Adjacent Link Interference Cancelation (ALIC) is currently actually working (not just configured), this shall be expressed as a 'true'." + ] + }, + "atpcIsUp": { + "id": "atpcIsUp", + "uml-id": "_VimCgMjNEeWYRsWW_rqpgw", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 16, + "is-read-only": true, + "description": [ + "If ATPC is currently actually working (not just configured), this shall be expressed as a 'true'." + ] + }, + "autoFreqSelectIsUp": { + "id": "autoFreqSelectIsUp", + "uml-id": "_-PXKsIL-EeWMcJAvkeTn2w", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 17, + "is-read-only": true, + "description": [ + "If automated frequency selection is currently actually working (not just configured), this shall be expressed as a 'true'." + ] + }, + "loopBackIsUp": { + "id": "loopBackIsUp", + "uml-id": "_S9prAHi0EeWfutScSwFT9A", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 18, + "is-read-only": true, + "description": [ + "If loop back of the air interface header is currently active (not just configured), this shall be expressed as a 'true'." + ] + }, + "localEndPointId": { + "id": "localEndPointId", + "uml-id": "_pEsgcFQHEeaCXY7nSBqs6w", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 19, + "is-read-only": true, + "description": [ + "The value of the localEndPointId is a vendor specific identifier of the air interface, used by the node to discover a microwave radio link." + ] + }, + "remoteEndPointId": { + "id": "remoteEndPointId", + "uml-id": "_r3cU4FQHEeaCXY7nSBqs6w", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 20, + "is-read-only": true, + "description": [ + "The value of the remoteEndPointId is a vendor specific identifier or the airinterface at the remote side, used to by the node to discover a microwave radio link." + ] + }, + "AirInterfaceCurrentProblems": { + "id": "AirInterfaceCurrentProblems", + "uml-id": "_UF8VcHmIEeWRAfnL3fvovg", + "uml-type": "uml:Class", + "is-read-only": false + }, + "AirInterfaceCurrentPerformance": { + "id": "AirInterfaceCurrentPerformance", + "uml-id": "_CX-iIKS6EeWyu_jasKgNwA", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Aggregated performance information of the air interface at a particular moment." + ] + }, + "AirInterfaceHistoricalPerformances": { + "id": "AirInterfaceHistoricalPerformances", + "uml-id": "_fChNMHmHEeWRAfnL3fvovg", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Aggregated performance information of the air interface for a pre-defined measurement interval." + ] + }, + "CoChannelGroup": { + "id": "CoChannelGroup", + "uml-id": "_XBs2YJQrEeWOu_cDl8dd7w", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Required for configuring XPIC, MIMO and ALIC." + ] + }, + "coChannelGroupId": { + "id": "coChannelGroupId", + "uml-id": "_pIjBgEy7EeaRytIQfQ43Wg", + "uml-type": "ownedAttribute", + "type": "../OnfModel-CoreModel/CoreModel.uml#_SU3Q4I30EeO38ZmbECnvbg", + "order-number": 1, + "is-read-only": false, + "is-key": 1 + }, + "airInterfaceList": { + "id": "airInterfaceList", + "uml-id": "_tIadUCJeEeaCUo1MUtSuEg", + "uml-type": "ownedAttribute", + "type": "../OnfModel-CoreModel/CoreModel.uml#_eEpDMFX4EeOVGaP4lO41SQ", + "order-number": 2, + "is-read-only": false, + "description": [ + "List of air interfaces, which are part of the co-channel (XPIC, MIMO, ALIC) group." + ] + }, + "sortOfCoChannelGroup": { + "id": "sortOfCoChannelGroup", + "uml-id": "_ZrjZcJRrEeWIaZzoaYJ6_A", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 3, + "is-read-only": false, + "description": [ + "Type of group of air interfaces with the same transmit and receive frequency. The values shall be chosen from the following _list:'XPIC', 'MIMO', 'ALIC';" + ] + }, + "MW_AirInterfaceHsbEndPoint_Pac": { + "id": "MW_AirInterfaceHsbEndPoint_Pac", + "uml-id": "_CXKgMJRbEeWMYJZn43K_Aw", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "The EndPoint (EP) object class models the access to the FC function. Each EndPoint instance has a role (e.g., working, protection, protected, hub, spoke, leaf, root, etc.) with respect to the FC function. The association of the FC to LTPs is made via EndPoints (essentially the ports of the FC) where each EndPoint (EP) of the FC has a role in the context of the FC. The traffic forwarding between the associated End PointsEPs of the FC depends upon the type of FC and may be associated with FCSwitch object instances. In cases where there is protection conveys the protecting role of the access to the FC. The EP replaces the Protection Unit of a traditional protection model. It represents a protected (resilient/reliable) point or a protecting (unreliable working or protection) point." + ] + }, + "role": { + "id": "role", + "uml-id": "_CXKgNpRbEeWMYJZn43K_Aw", + "uml-type": "ownedAttribute", + "type": "_01_dYJReEeWxIPEwZQ_gmw", + "order-number": 1, + "is-read-only": false + }, + "endpoint": { + "id": "endpoint", + "uml-id": "_dglVQLYgEeWOio-Gg6Q2sw", + "uml-type": "ownedAttribute", + "type": "../OnfModel-CoreModel/CoreModel.uml#_b_lUAFYgEeOVGaP4lO41SQ", + "order-number": 2, + "is-read-only": false, + "is-key": 1 + }, + "MW_AirInterfaceHsbFcSwitch_Pac": { + "id": "MW_AirInterfaceHsbFcSwitch_Pac", + "uml-id": "_CXNjgJRbEeWMYJZn43K_Aw", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Represents and defines a protection switch structure encapsulated in the forwarding construct. Essentially performs the function of Protection Group. Associates to 2 or more Endpoints each playing the role of a Protection Unit. One or more protection EndPoints (standby/backup) provide protection for one or more working (i.e. regular/main/preferred) Endpoints where either protection or working can feed one or more protected Endpoint. May be used in revertive or non-revertive (symmetric) mode. When in revertive mode may define waitToRestore time. May be used in one of several modes including source switch, destination switched, source and destination switched etc (covering cases such as 1+1 ane 1:1). May be lockout (prevented from switching), force switched or manual switched. Will indicate switch state and change of state." + ] + }, + "protType": { + "id": "protType", + "uml-id": "_CXNjiJRbEeWMYJZn43K_Aw", + "uml-type": "ownedAttribute", + "type": "_DaB5IJRgEeWxIPEwZQ_gmw", + "order-number": 1, + "is-read-only": false, + "description": [ + "Indicates the protection scheme that is used for the ProtectionGroup." + ] + }, + "airInterfaceHsbConfigurationIsFaultySeverity": { + "id": "airInterfaceHsbConfigurationIsFaultySeverity", + "uml-id": "_80BlAJ2gEeWSuvrh9KcclQ", + "uml-type": "ownedAttribute", + "type": "_eIml0JH1EeWUdbnmmNiTAA", + "order-number": 2, + "is-read-only": false, + "description": [ + "The level of severity of an airInterfaceHsbConfigurationIsFaulty alarm shall be chosen from an enumeration." + ] + }, + "airInterfaceHsbIsPartlyDownSeverity": { + "id": "airInterfaceHsbIsPartlyDownSeverity", + "uml-id": "_r382sJ2mEeWSuvrh9KcclQ", + "uml-type": "ownedAttribute", + "type": "_eIml0JH1EeWUdbnmmNiTAA", + "order-number": 3, + "is-read-only": false, + "description": [ + "The level of severity for one link out of the HSB configuration being down shall be chosen from an enumeration." + ] + }, + "airInterfaceHsbIsDownSeverity": { + "id": "airInterfaceHsbIsDownSeverity", + "uml-id": "_sRGWgJ2mEeWSuvrh9KcclQ", + "uml-type": "ownedAttribute", + "type": "_eIml0JH1EeWUdbnmmNiTAA", + "order-number": 4, + "is-read-only": false, + "description": [ + "The level of severity of the total HSB configuration being down shall be chosen from an enumeration." + ] + }, + "fcswitch": { + "id": "fcswitch", + "uml-id": "_FS83ILYhEeWOio-Gg6Q2sw", + "uml-type": "ownedAttribute", + "type": "../OnfModel-CoreModel/CoreModel.uml#_a97NQFYhEeOVGaP4lO41SQ", + "order-number": 5, + "is-read-only": false, + "is-key": 1 + }, + "MW_AirInterfaceDiversity_Pac": { + "id": "MW_AirInterfaceDiversity_Pac", + "uml-id": "_WbgFcHgFEeWfutScSwFT9A", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "LTP(MWS-CTP-xD)" + ] + }, + "airInterfaceDiversityCapability": { + "id": "airInterfaceDiversityCapability", + "uml-id": "_mQ_9YJICEeWUdbnmmNiTAA", + "uml-type": "ownedAttribute", + "type": "_vxH2wIekEeWaZYk7gpuOtw", + "order-number": 2, + "is-read-only": true + }, + "airInterfaceDiversityConfiguration": { + "id": "airInterfaceDiversityConfiguration", + "uml-id": "_wXazw5ICEeWUdbnmmNiTAA", + "uml-type": "ownedAttribute", + "type": "_43RTMIe1EeWnUdmvl3PBkw", + "order-number": 3, + "is-read-only": false + }, + "airInterfaceDiversityCurrentProblems": { + "id": "airInterfaceDiversityCurrentProblems", + "uml-id": "_zA4JU5ICEeWUdbnmmNiTAA", + "uml-type": "ownedAttribute", + "type": "_CAvhEHvtEeWzooKF5kx0aw", + "order-number": 5, + "is-read-only": true + }, + "airInterfaceDiversityCurrentPerformance": { + "id": "airInterfaceDiversityCurrentPerformance", + "uml-id": "_XpGjA6jDEeWlgMiFXLmCIQ", + "uml-type": "ownedAttribute", + "type": "_GIsAQKjDEeWlgMiFXLmCIQ", + "order-number": 6, + "is-read-only": true + }, + "airInterfaceDiversityHistoricalPerformances": { + "id": "airInterfaceDiversityHistoricalPerformances", + "uml-id": "_z8F0Y5ICEeWUdbnmmNiTAA", + "uml-type": "ownedAttribute", + "type": "_8IIu8HvsEeWzooKF5kx0aw", + "order-number": 7, + "is-read-only": true + }, + "AirInterfaceDiversityCapability": { + "id": "AirInterfaceDiversityCapability", + "uml-id": "_vxH2wIekEeWaZYk7gpuOtw", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Describes the capabilities in implementing different types of air interface diversity." + ] + }, + "availableKindsOfDiversity": { + "id": "availableKindsOfDiversity", + "uml-id": "_luAGENyVEeW-SfXlFFFI0Q", + "uml-type": "ownedAttribute", + "type": "_pTliINyUEeW-SfXlFFFI0Q", + "order-number": 1, + "is-read-only": true, + "description": [ + "Available types of diversity to be listed." + ] + }, + "AirInterfaceDiversityConfiguration": { + "id": "AirInterfaceDiversityConfiguration", + "uml-id": "_43RTMIe1EeWnUdmvl3PBkw", + "uml-type": "uml:Class", + "is-read-only": false + }, + "airInterfaceDiversity": { + "id": "airInterfaceDiversity", + "uml-id": "_hynTIHi_EeWfutScSwFT9A", + "uml-type": "ownedAttribute", + "type": "_pTliINyUEeW-SfXlFFFI0Q", + "order-number": 1, + "is-read-only": false, + "description": [ + "Type of air interface diversity configured at the link." + ] + }, + "airInterfaceLtpList": { + "id": "airInterfaceLtpList", + "uml-id": "_xRMKgNyXEeW-SfXlFFFI0Q", + "uml-type": "ownedAttribute", + "type": "../OnfModel-CoreModel/CoreModel.uml#_eEpDMFX4EeOVGaP4lO41SQ", + "order-number": 2, + "is-read-only": false, + "description": [ + "_multiplicity:2-ThisAirInterfaceDiversity::AirInterfaceDiversityConfiguration::airInterfaceDiversity::diversityType::numberOfAirInterfacesMax" + ] + }, + "AirInterfaceDiversityStatus": { + "id": "AirInterfaceDiversityStatus", + "uml-id": "_-O9RgHvsEeWzooKF5kx0aw", + "uml-type": "uml:Class", + "is-read-only": false + }, + "snirCur": { + "id": "snirCur", + "uml-id": "_B7G0AEzvEeaRytIQfQ43Wg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EByte", + "order-number": 1, + "is-read-only": true, + "unit": "dB", + "description": [ + "Currently measured signal to (noise+interference) ratio of the combined signals." + ] + }, + "airInterfaceDiversityStatus": { + "id": "airInterfaceDiversityStatus", + "uml-id": "_EKZYcJOXEeWz-6sqLzUedw", + "uml-type": "ownedAttribute", + "type": "_DUJs8JOXEeWz-6sqLzUedw", + "order-number": 2, + "is-read-only": true, + "description": [ + "Status of the air interface bundle." + ] + }, + "AirInterfaceDiversityCurrentProblems": { + "id": "AirInterfaceDiversityCurrentProblems", + "uml-id": "_CAvhEHvtEeWzooKF5kx0aw", + "uml-type": "uml:Class", + "is-read-only": false + }, + "AirInterfaceDiversityCurrentPerformance": { + "id": "AirInterfaceDiversityCurrentPerformance", + "uml-id": "_GIsAQKjDEeWlgMiFXLmCIQ", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Aggregated performance information of the air interface diversity configuration at a particular moment." + ] + }, + "AirInterfaceDiversityHistoricalPerformances": { + "id": "AirInterfaceDiversityHistoricalPerformances", + "uml-id": "_8IIu8HvsEeWzooKF5kx0aw", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Aggregated performance information of the air interface diversity configuration for a pre-defined measurement interval." + ] + }, + "MW_PureEthernetStructure_Pac": { + "id": "MW_PureEthernetStructure_Pac", + "uml-id": "__OTQ0UaeEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "The pureEthernetStructure_Pac and its attached classes MUST be provided on management interfaces of microwave devices, which are transporting Ethernet traffic only." + ] + }, + "pureEthernetStructureCapability": { + "id": "pureEthernetStructureCapability", + "uml-id": "_dJcm0VAfEea9Wek8ROfqag", + "uml-type": "ownedAttribute", + "type": "__OTQ4EaeEeas2eqI3oKNtg", + "order-number": 2, + "is-read-only": true + }, + "pureEthernetStructureConfiguration": { + "id": "pureEthernetStructureConfiguration", + "uml-id": "_kHaeglAfEea9Wek8ROfqag", + "uml-type": "ownedAttribute", + "type": "__OTQ8UaeEeas2eqI3oKNtg", + "order-number": 3, + "is-read-only": false + }, + "pureEthernetStructureStatus": { + "id": "pureEthernetStructureStatus", + "uml-id": "_lsNSEFAfEea9Wek8ROfqag", + "uml-type": "ownedAttribute", + "type": "__OTQ_UaeEeas2eqI3oKNtg", + "order-number": 4, + "is-read-only": true + }, + "pureEthernetStructureCurrentProblems": { + "id": "pureEthernetStructureCurrentProblems", + "uml-id": "_nCtK8lAfEea9Wek8ROfqag", + "uml-type": "ownedAttribute", + "type": "__OTRCUaeEeas2eqI3oKNtg", + "order-number": 5, + "is-read-only": true + }, + "pureEthernetStructureCurrentPerformance": { + "id": "pureEthernetStructureCurrentPerformance", + "uml-id": "_ocuR4VAfEea9Wek8ROfqag", + "uml-type": "ownedAttribute", + "type": "__OTRD0aeEeas2eqI3oKNtg", + "order-number": 6, + "is-read-only": true + }, + "pureEthernetStructureHistoricalPerformances": { + "id": "pureEthernetStructureHistoricalPerformances", + "uml-id": "_Xb6U4FAiEea9Wek8ROfqag", + "uml-type": "ownedAttribute", + "type": "__OTRE0aeEeas2eqI3oKNtg", + "order-number": 7, + "is-read-only": true + }, + "PureEthernetStructureCapability": { + "id": "PureEthernetStructureCapability", + "uml-id": "__OTQ4EaeEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "No TDM transport." + ] + }, + "PureEthernetStructureConfiguration": { + "id": "PureEthernetStructureConfiguration", + "uml-id": "__OTQ8UaeEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false + }, + "PureEthernetStructureStatus": { + "id": "PureEthernetStructureStatus", + "uml-id": "__OTQ_UaeEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false + }, + "PureEthernetStructureCurrentProblems": { + "id": "PureEthernetStructureCurrentProblems", + "uml-id": "__OTRCUaeEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false + }, + "PureEthernetStructureCurrentPerformance": { + "id": "PureEthernetStructureCurrentPerformance", + "uml-id": "__OTRD0aeEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Aggregated performance information of the structure of an pure Ethernet microwave at a particular moment." + ] + }, + "PureEthernetStructureHistoricalPerformances": { + "id": "PureEthernetStructureHistoricalPerformances", + "uml-id": "__OTRE0aeEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Aggregated performance information of the structure of an pure Ethernet microwave for a pre-defined measurement interval." + ] + }, + "MW_HybridMwStructure_Pac": { + "id": "MW_HybridMwStructure_Pac", + "uml-id": "_Bzxo0UagEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "The HybridMwStructure_Pac and its attached classes MUST be provided on management interfaces of microwave devices, which are transporting TDM and Ethernet traffic." + ] + }, + "hybridMwStructureCapability": { + "id": "hybridMwStructureCapability", + "uml-id": "_2nQhIFAjEea9Wek8ROfqag", + "uml-type": "ownedAttribute", + "type": "_Bzxo4EagEeas2eqI3oKNtg", + "order-number": 2, + "is-read-only": true + }, + "hybridMwStructureConfiguration": { + "id": "hybridMwStructureConfiguration", + "uml-id": "_3-63oVAjEea9Wek8ROfqag", + "uml-type": "ownedAttribute", + "type": "_Bzxo8UagEeas2eqI3oKNtg", + "order-number": 3, + "is-read-only": false + }, + "hybridMwStructureStatus": { + "id": "hybridMwStructureStatus", + "uml-id": "_5fWvolAjEea9Wek8ROfqag", + "uml-type": "ownedAttribute", + "type": "_Bzxo_UagEeas2eqI3oKNtg", + "order-number": 4, + "is-read-only": true + }, + "hybridMwStructureCurrentProblems": { + "id": "hybridMwStructureCurrentProblems", + "uml-id": "_6ZbLMlAjEea9Wek8ROfqag", + "uml-type": "ownedAttribute", + "type": "_BzxpCUagEeas2eqI3oKNtg", + "order-number": 5, + "is-read-only": true + }, + "hybridMwStructureCurrentPerformance": { + "id": "hybridMwStructureCurrentPerformance", + "uml-id": "_7FMFAFAjEea9Wek8ROfqag", + "uml-type": "ownedAttribute", + "type": "_BzxpD0agEeas2eqI3oKNtg", + "order-number": 6, + "is-read-only": true + }, + "hybridMwStructureHistoricalPerformances": { + "id": "hybridMwStructureHistoricalPerformances", + "uml-id": "_8CWQ0VAjEea9Wek8ROfqag", + "uml-type": "ownedAttribute", + "type": "_BzxpE0agEeas2eqI3oKNtg", + "order-number": 7, + "is-read-only": true + }, + "HybridMwStructureCapability": { + "id": "HybridMwStructureCapability", + "uml-id": "_Bzxo4EagEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "TDM transport is available." + ] + }, + "structureId": { + "id": "structureId", + "uml-id": "_Bzxo5EagEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "../OnfModel-CoreModel/CoreModel.uml#_SU3Q4I30EeO38ZmbECnvbg", + "order-number": 1, + "is-read-only": true, + "is-key": 1, + "description": [ + "Identifies the Structure for bundling and container." + ] + }, + "supportedTdmStructureTypesList": { + "id": "supportedTdmStructureTypesList", + "uml-id": "_tA-uQEduEeax2rWez10Siw", + "uml-type": "ownedAttribute", + "type": "_jRAQsEdoEeax2rWez10Siw", + "order-number": 2, + "is-read-only": true, + "description": [ + "Lists the TDM frame types that are supported." + ] + }, + "HybridMwStructureConfiguration": { + "id": "HybridMwStructureConfiguration", + "uml-id": "_Bzxo8UagEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false + }, + "structureType": { + "id": "structureType", + "uml-id": "_cduh4EdvEeax2rWez10Siw", + "uml-type": "ownedAttribute", + "type": "_jRAQsEdoEeax2rWez10Siw", + "order-number": 1, + "is-read-only": false, + "description": [ + "TDM frame to be applied." + ] + }, + "numberOfTdmSegmentsToBeReserved": { + "id": "numberOfTdmSegmentsToBeReserved", + "uml-id": "_Bzxo9EagEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EShort", + "order-number": 2, + "is-read-only": false, + "description": [ + "Allows to configure the number of segments reserved for TDM frames of the type specified in HybridMwStructure::HybridMwStructureConfiguration::structureType" + ] + }, + "HybridMwStructureStatus": { + "id": "HybridMwStructureStatus", + "uml-id": "_Bzxo_UagEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false + }, + "segmentStatusList": { + "id": "segmentStatusList", + "uml-id": "_BzxpAEagEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "_KwZVcMUCEeW3xsRKtpCLuA", + "order-number": 1, + "is-read-only": true, + "description": [ + "Multiplicity = HybridMwStructure::StructureConfiguration::tdmReservedNumberOfSegments + 1" + ] + }, + "HybridMwStructureCurrentProblems": { + "id": "HybridMwStructureCurrentProblems", + "uml-id": "_BzxpCUagEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false + }, + "HybridMwStructureCurrentPerformance": { + "id": "HybridMwStructureCurrentPerformance", + "uml-id": "_BzxpD0agEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Aggregated performance information of the structure of a hybrid microwave at a particular moment." + ] + }, + "HybridMwStructureHistoricalPerformances": { + "id": "HybridMwStructureHistoricalPerformances", + "uml-id": "_BzxpE0agEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Aggregated performance information of the structure of a hybrid microwave for a pre-defined measurement interval." + ] + }, + "MW_EthernetContainer_Pac": { + "id": "MW_EthernetContainer_Pac", + "uml-id": "_4uEBgUafEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "LTP(Client)" + ] + }, + "ethernetContainerCapability": { + "id": "ethernetContainerCapability", + "uml-id": "_vWwdEVAlEea9Wek8ROfqag", + "uml-type": "ownedAttribute", + "type": "_4uEBmEafEeas2eqI3oKNtg", + "order-number": 2, + "is-read-only": true + }, + "ethernetContainerConfiguration": { + "id": "ethernetContainerConfiguration", + "uml-id": "_v8JCEFAlEea9Wek8ROfqag", + "uml-type": "ownedAttribute", + "type": "_4uEBwUafEeas2eqI3oKNtg", + "order-number": 3, + "is-read-only": false + }, + "ethernetContainerStatus": { + "id": "ethernetContainerStatus", + "uml-id": "_wvtNAVAlEea9Wek8ROfqag", + "uml-type": "ownedAttribute", + "type": "_4uECAUafEeas2eqI3oKNtg", + "order-number": 4, + "is-read-only": true + }, + "ethernetContainerCurrentProblems": { + "id": "ethernetContainerCurrentProblems", + "uml-id": "_xUWyMlAlEea9Wek8ROfqag", + "uml-type": "ownedAttribute", + "type": "_4uECDUafEeas2eqI3oKNtg", + "order-number": 5, + "is-read-only": true + }, + "ethernetContainerCurrentPerformance": { + "id": "ethernetContainerCurrentPerformance", + "uml-id": "_x7K6kFAlEea9Wek8ROfqag", + "uml-type": "ownedAttribute", + "type": "_4uECE0afEeas2eqI3oKNtg", + "order-number": 6, + "is-read-only": true + }, + "ethernetContainerHistoricalPerformances": { + "id": "ethernetContainerHistoricalPerformances", + "uml-id": "_ynDJIFAlEea9Wek8ROfqag", + "uml-type": "ownedAttribute", + "type": "_4uECF0afEeas2eqI3oKNtg", + "order-number": 7, + "is-read-only": true + }, + "EthernetContainerCapability": { + "id": "EthernetContainerCapability", + "uml-id": "_4uEBmEafEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false + }, + "bundlingIsAvail": { + "id": "bundlingIsAvail", + "uml-id": "_96g-oEanEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 1, + "is-read-only": true, + "description": [ + "This attribute has to be set on 'true', if the device allows combining resources from several air interfaces for transporting this Ethernet container." + ] + }, + "packetCompressionIsAvail": { + "id": "packetCompressionIsAvail", + "uml-id": "_4uEBp0afEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 2, + "is-read-only": true, + "description": [ + "In case packet compression can be activated, but not configured to a certain type, packetCompressionAvail shall be set on 'true', but none of the compression level specific booleans." + ] + }, + "layer2CompressionIsAvail": { + "id": "layer2CompressionIsAvail", + "uml-id": "_4uEBqkafEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 3, + "is-read-only": true, + "description": [ + "Packet compression on layer 2 available at the device." + ] + }, + "vlanCompressionIsAvail": { + "id": "vlanCompressionIsAvail", + "uml-id": "_4uEBrUafEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 4, + "is-read-only": true, + "description": [ + "Packet compression on VLAN layer available at the device." + ] + }, + "qInQCompressionIsAvail": { + "id": "qInQCompressionIsAvail", + "uml-id": "_4uEBsEafEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 5, + "is-read-only": true, + "description": [ + "Packet compression on layer of a second VLAN available at the device." + ] + }, + "mplsCompressionIsAvail": { + "id": "mplsCompressionIsAvail", + "uml-id": "_4uEBs0afEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 6, + "is-read-only": true, + "description": [ + "Packet compression on mpls layer available at the device." + ] + }, + "ipv4CompressionIsAvail": { + "id": "ipv4CompressionIsAvail", + "uml-id": "_4uEBtkafEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 7, + "is-read-only": true, + "description": [ + "Packet compression on layer 3 for IPv4 available at the device." + ] + }, + "ipv6CompressionIsAvail": { + "id": "ipv6CompressionIsAvail", + "uml-id": "_4uEBuUafEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 8, + "is-read-only": true, + "description": [ + "Packet compression on layer 3 for IPv6 available at the device." + ] + }, + "layer4CompressionIsAvail": { + "id": "layer4CompressionIsAvail", + "uml-id": "_4uEBvEafEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 9, + "is-read-only": true, + "description": [ + "Packet compression on layer 4 (TCP and UDP header) available at the device." + ] + }, + "encryptionIsAvail": { + "id": "encryptionIsAvail", + "uml-id": "_4uPM8E58EeaCk6G-lyG1OQ", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 10, + "is-read-only": true, + "description": [ + "Shall be marked 'true', if Ethernet payload encryption is available." + ] + }, + "EthernetContainerConfiguration": { + "id": "EthernetContainerConfiguration", + "uml-id": "_4uEBwUafEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false + }, + "segmentsIDList": { + "id": "segmentsIDList", + "uml-id": "_4uEBy0afEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "_Nd1F4MKuEeWwLJhHQlOGSQ", + "order-number": 2, + "is-read-only": false, + "description": [ + "Lists the segments used for transporting this Ethernet container. In case EthernetContainer::ContainerCapability::bundlingIsAvail==0, all TypeDefinitions::segmentIdType::structureId must be identical in the list." + ] + }, + "packetCompressionIsOn": { + "id": "packetCompressionIsOn", + "uml-id": "_4uEB1UafEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 3, + "is-read-only": false, + "description": [ + "In case packet compression is activated, but no type is activated, it is assumed that the device chooses the optimum." + ] + }, + "layer2CompressionIsOn": { + "id": "layer2CompressionIsOn", + "uml-id": "_4uEB2kafEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 4, + "is-read-only": false, + "description": [ + "Packet compression on layer 2 configured at the device." + ] + }, + "vlanCompressionIsOn": { + "id": "vlanCompressionIsOn", + "uml-id": "_4uEB30afEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 5, + "is-read-only": false, + "description": [ + "Packet compression on VLAN layer configured at the device." + ] + }, + "qInQCompressionIsOn": { + "id": "qInQCompressionIsOn", + "uml-id": "_4uEB5EafEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 6, + "is-read-only": false, + "description": [ + "Packet compression on layer of a second VLAN configured at the device." + ] + }, + "mplsCompressionIsOn": { + "id": "mplsCompressionIsOn", + "uml-id": "_4uEB6UafEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 7, + "is-read-only": false, + "description": [ + "Packet compression on MPLS layer configured at the device." + ] + }, + "ipv4CompressionIsOn": { + "id": "ipv4CompressionIsOn", + "uml-id": "_4uEB7kafEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 8, + "is-read-only": false, + "description": [ + "Packet compression on layer 3 for IPv4 configured at the device." + ] + }, + "ipv6CompressionIsOn": { + "id": "ipv6CompressionIsOn", + "uml-id": "_4uEB80afEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 9, + "is-read-only": false, + "description": [ + "Packet compression on layer 3 for IPv6 configured at the device." + ] + }, + "layer4CompressionIsOn": { + "id": "layer4CompressionIsOn", + "uml-id": "_4uEB-EafEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 10, + "is-read-only": false, + "description": [ + "Packet compression on layer 4 (TCP and UDP header) configured at the device." + ] + }, + "encryptionIsOn": { + "id": "encryptionIsOn", + "uml-id": "_uI7bIE58EeaCk6G-lyG1OQ", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 11, + "is-read-only": false, + "description": [ + "Activates encryption of the Ethernet payload." + ] + }, + "cryptographicKey": { + "id": "cryptographicKey", + "uml-id": "_psRpoE58EeaCk6G-lyG1OQ", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 12, + "is-read-only": false, + "description": [ + "Key for transforming plaintext into cipher text data." + ] + }, + "EthernetContainerStatus": { + "id": "EthernetContainerStatus", + "uml-id": "_4uECAUafEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false + }, + "EthernetContainerCurrentProblems": { + "id": "EthernetContainerCurrentProblems", + "uml-id": "_4uECDUafEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false + }, + "EthernetContainerCurrentPerformance": { + "id": "EthernetContainerCurrentPerformance", + "uml-id": "_4uECE0afEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Aggregated performance information of the Ethernet container at a particular moment." + ] + }, + "EthernetContainerHistoricalPerformances": { + "id": "EthernetContainerHistoricalPerformances", + "uml-id": "_4uECF0afEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Aggregated performance information of the Ethernet container for a pre-defined measurement interval." + ] + }, + "MW_TdmContainer_Pac": { + "id": "MW_TdmContainer_Pac", + "uml-id": "_ecCeMUaqEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "LTP(Client)" + ] + }, + "layerProtocol": { + "id": "layerProtocol", + "uml-id": "_m_QIglpKEeax66gMnmfzpQ", + "uml-type": "ownedAttribute", + "type": "../OnfModel-CoreModel/CoreModel.uml#_gROecFYXEeOVGaP4lO41SQ", + "order-number": 1, + "is-read-only": false, + "is-key": 1, + "description": [ + "CoreModel-CoreNetworkModule-ObjectClasses:NetworkElement/_ltpRefList/_lpList/uuid" + ] + }, + "tdmContainerCapability": { + "id": "tdmContainerCapability", + "uml-id": "_-bytElAmEea9Wek8ROfqag", + "uml-type": "ownedAttribute", + "type": "_ecCeSEaqEeas2eqI3oKNtg", + "order-number": 2, + "is-read-only": true + }, + "tdmContainerConfiguration": { + "id": "tdmContainerConfiguration", + "uml-id": "__LKUglAmEea9Wek8ROfqag", + "uml-type": "ownedAttribute", + "type": "_ecCecUaqEeas2eqI3oKNtg", + "order-number": 3, + "is-read-only": false + }, + "tdmContainerStatus": { + "id": "tdmContainerStatus", + "uml-id": "__vOq4lAmEea9Wek8ROfqag", + "uml-type": "ownedAttribute", + "type": "_ecCesUaqEeas2eqI3oKNtg", + "order-number": 4, + "is-read-only": true + }, + "tdmContainerCurrentProblems": { + "id": "tdmContainerCurrentProblems", + "uml-id": "_AWdqAlAnEea9Wek8ROfqag", + "uml-type": "ownedAttribute", + "type": "_ecCevUaqEeas2eqI3oKNtg", + "order-number": 5, + "is-read-only": true + }, + "tdmContainerCurrentPerformance": { + "id": "tdmContainerCurrentPerformance", + "uml-id": "_AzXoclAnEea9Wek8ROfqag", + "uml-type": "ownedAttribute", + "type": "_ecCew0aqEeas2eqI3oKNtg", + "order-number": 6, + "is-read-only": true + }, + "tdmContainerHistoricalPerformances": { + "id": "tdmContainerHistoricalPerformances", + "uml-id": "_BXIc0lAnEea9Wek8ROfqag", + "uml-type": "ownedAttribute", + "type": "_ecCex0aqEeas2eqI3oKNtg", + "order-number": 7, + "is-read-only": true + }, + "TdmContainerCapability": { + "id": "TdmContainerCapability", + "uml-id": "_ecCeSEaqEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Bundling is not available." + ] + }, + "supportedTdmContainerTypesList": { + "id": "supportedTdmContainerTypesList", + "uml-id": "_R5hG0EdwEeax2rWez10Siw", + "uml-type": "ownedAttribute", + "type": "_rgbigEdjEeax2rWez10Siw", + "order-number": 1, + "is-read-only": true, + "description": [ + "Lists the TDM containers that are supported." + ] + }, + "supportedAlarms": { + "id": "supportedAlarms", + "uml-id": "_ecCeb0aqEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 92, + "is-read-only": true, + "description": [ + "Available alarms to be listed. Mandatory:'framingIsFaulty' and 'containerIsDown'. Further alarms might be added by the device." + ] + }, + "TdmContainerConfiguration": { + "id": "TdmContainerConfiguration", + "uml-id": "_ecCecUaqEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false + }, + "containerID": { + "id": "containerID", + "uml-id": "_ecCeS0aqEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 1, + "is-read-only": false, + "description": [ + "ContainterID in Netconf must be the same as EthernetPortID in OpenFlow so a connection can be made between the two items, which separately exist in the controller." + ] + }, + "containerType": { + "id": "containerType", + "uml-id": "_o_-2oEdxEeax2rWez10Siw", + "uml-type": "ownedAttribute", + "type": "_rgbigEdjEeax2rWez10Siw", + "order-number": 2, + "is-read-only": false, + "description": [ + "Type of TDM container." + ] + }, + "segmentID": { + "id": "segmentID", + "uml-id": "_ecCee0aqEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "_Nd1F4MKuEeWwLJhHQlOGSQ", + "order-number": 3, + "is-read-only": false, + "description": [ + "Multiplicity = 1; One segment per TDM container; Type of segment must match type of container;" + ] + }, + "problemKindSeverityList": { + "id": "problemKindSeverityList", + "uml-id": "_ecCerUaqEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "_OMPgwGz0Eeaf-__BRLM84g", + "order-number": 94, + "is-read-only": false, + "description": [ + "Severity of the problem to be configured." + ] + }, + "TdmContainerStatus": { + "id": "TdmContainerStatus", + "uml-id": "_ecCesUaqEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false + }, + "lastStatusChange": { + "id": "lastStatusChange", + "uml-id": "_ecCetEaqEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "../OnfModel-CoreModel/CoreModel.uml#_oGqi1lLNEeO75dO39GbF8Q", + "order-number": 1, + "is-read-only": true, + "description": [ + "_format:yyyyMMddhhmmss.s[Z|{+|-}HHMm]; yyyy='0000'..'9999' year; MM='01'..'12' month; dd='01'..'31' day; hh='00'..'23' hour; mm='00'..'59' minute; ss='00'..'59' second; s='.0'..'.9'tenth of second (set to '.0' if EMS or NE cannot support this granularity); Z='Z' indicates UTC (rather than local time); {+|-}='+' or '-' delta from UTC; HH='00'..'23' time zone difference in hours; Mm='00'..'59' time zone difference in minutes." + ] + }, + "TdmContainerCurrentProblems": { + "id": "TdmContainerCurrentProblems", + "uml-id": "_ecCevUaqEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false + }, + "currentProblemList": { + "id": "currentProblemList", + "uml-id": "_ecCewEaqEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "__h1n4MXpEeWJ6KZuc0h_vw", + "order-number": 1, + "is-read-only": true + }, + "TdmContainerCurrentPerformance": { + "id": "TdmContainerCurrentPerformance", + "uml-id": "_ecCew0aqEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Aggregated performance information of the TDM container at a particular moment." + ] + }, + "currentPerformanceDataList": { + "id": "currentPerformanceDataList", + "uml-id": "_ecCexkaqEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "_pA5AQGz6Eeaf-__BRLM84g", + "order-number": 1, + "is-read-only": true, + "description": [ + "At least values of the counters, which are reset every 15 minutes, are to be provided. If available, the current values of the counters, which are reset every 24 hour, can be provided, too." + ] + }, + "TdmContainerHistoricalPerformances": { + "id": "TdmContainerHistoricalPerformances", + "uml-id": "_ecCex0aqEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Aggregated performance information of the TDM container for a pre-defined measurement interval." + ] + }, + "historicalPerformanceDataList": { + "id": "historicalPerformanceDataList", + "uml-id": "_ecCeykaqEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "_pTaToGz6Eeaf-__BRLM84g", + "order-number": 1, + "is-read-only": true + }, + "MwCurrentProblem": { + "id": "MwCurrentProblem", + "uml-id": "_LKRM4JNQEeWuAeXkr703BA", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "According to ITU-T G.874.1?" + ] + }, + "sequenceNumber": { + "id": "sequenceNumber", + "uml-id": "_YadH4CJbEeaHpPYk5sscIg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 1, + "is-read-only": true, + "is-key": 1, + "description": [ + "Unique sequence number of the current problem object." + ] + }, + "timeStamp": { + "id": "timeStamp", + "uml-id": "_lB4EQJN1EeWuAeXkr703BA", + "uml-type": "ownedAttribute", + "type": "../OnfModel-CoreModel/CoreModel.uml#_oGqi1lLNEeO75dO39GbF8Q", + "order-number": 2, + "is-read-only": true, + "description": [ + "_format:yyyyMMddhhmmss.s[Z|{+|-}HHMm]; yyyy='0000'..'9999' year; MM='01'..'12' month; dd='01'..'31' day; hh='00'..'23' hour; mm='00'..'59' minute; ss='00'..'59' second; s='.0'..'.9'tenth of second (set to '.0' if EMS or NE cannot support this granularity); Z='Z' indicates UTC (rather than local time); {+|-}='+' or '-' delta from UTC; HH='00'..'23' time zone difference in hours; Mm='00'..'59' time zone difference in minutes." + ] + }, + "channelPlanType": { + "id": "channelPlanType", + "uml-id": "_oQf6IPXSEeW9zIqh2WHHww", + "uml-type": "uml:DataType" + }, + "supportedChannelPlan": { + "id": "supportedChannelPlan", + "uml-id": "_8gpNIHfcEeW-h9gN8LYm4Q", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 1, + "is-read-only": true, + "is-key": 1, + "description": [ + "Unique name (e.g. CEPT/ERC/REC (01) 04 Annex 5) of an international agreement that describe allocations of frequency channels, to which this air interface complies. Corresponding channel plans to be delivered by the hardware vendor and to be stored by the operator in the controller/application attached database." + ] + }, + "duplexDistanceIsVariable": { + "id": "duplexDistanceIsVariable", + "uml-id": "_OPxkQK42EeWxIavXll_b0A", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 2, + "is-read-only": true, + "description": [ + "To be set on 'true', if the distance between transmitted and received frequency is variable." + ] + }, + "duplexDistance": { + "id": "duplexDistance", + "uml-id": "_BEr_wIMEEeWMcJAvkeTn2w", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 3, + "is-read-only": true, + "unit": "kHz", + "description": [ + "Distance between transmitted and received frequency." + ] + }, + "autoFreqSelectIsAvail": { + "id": "autoFreqSelectIsAvail", + "uml-id": "_te6XMIL8EeWMcJAvkeTn2w", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 4, + "is-read-only": true, + "description": [ + "In case the microwave radio is capable of automatically selecting the transmit frequency in unlicensed bands, this field shall contain a 'true'." + ] + }, + "transmissionModeList": { + "id": "transmissionModeList", + "uml-id": "_nwbvcPXREeW9zIqh2WHHww", + "uml-type": "ownedAttribute", + "type": "_zG34sPXQEeW9zIqh2WHHww", + "order-number": 5, + "is-read-only": true + }, + "transmissionModeType": { + "id": "transmissionModeType", + "uml-id": "_zG34sPXQEeW9zIqh2WHHww", + "uml-type": "uml:DataType" + }, + "transmissionModeId": { + "id": "transmissionModeId", + "uml-id": "_afdYoNumEeWHIeLurhMv0A", + "uml-type": "ownedAttribute", + "type": "../OnfModel-CoreModel/CoreModel.uml#_SU3Q4I30EeO38ZmbECnvbg", + "order-number": 1, + "is-read-only": true, + "is-key": 1, + "description": [ + "Indentifies the transmissionMode for internal reference." + ] + }, + "channelBandwidth": { + "id": "channelBandwidth", + "uml-id": "_FteJEHfdEeW-h9gN8LYm4Q", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 2, + "is-read-only": true, + "unit": "kHz", + "description": [ + "Bandwidth of the transmit channel. The value shall be expressed explicitly (means in kHz) not as a reference to an international agreement. The values shall be chosen from the following _list: 3.500, 7.000, 14.000, 27.500, 28.000, 29.000, 29.650, 30.000, 40.000, 50.000, 55.000, 56.000, 59.300, 60.000, 80.000, 100.000, 112.000, 120.000, 150.000, 200.000, 250.000, 500.000, 750.000, 1.000.000, 1.250.000, 1.500.000, 1.750.000, 2.000.000;" + ] + }, + "modulationScheme": { + "id": "modulationScheme", + "uml-id": "_G4H-UHfdEeW-h9gN8LYm4Q", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EShort", + "order-number": 3, + "is-read-only": true, + "unit": "symbols", + "description": [ + "Modulation scheme, which is base to the other characteristics described in the same transmissionModeType data type. The modulation scheme shall be described by the number of symbols (e.g. BPSK->'2' or 256QAM->'256')." + ] + }, + "informationRate": { + "id": "informationRate", + "uml-id": "_jE7-EHf4EeW-h9gN8LYm4Q", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EByte", + "order-number": 4, + "is-read-only": true, + "unit": "%", + "description": [ + "Information rate of the coding scheme in %." + ] + }, + "txPowerMin": { + "id": "txPowerMin", + "uml-id": "_I3nJ0HfdEeW-h9gN8LYm4Q", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EByte", + "order-number": 5, + "is-read-only": true, + "unit": "dBm", + "description": [ + "Value of the minimum transmit power the modem can operate in dBm." + ] + }, + "txPowerMax": { + "id": "txPowerMax", + "uml-id": "_KB7A0HfdEeW-h9gN8LYm4Q", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EByte", + "order-number": 6, + "is-read-only": true, + "unit": "dBm", + "description": [ + "Value of the maximum transmit power the modem can operate in dBm." + ] + }, + "rxThreshold": { + "id": "rxThreshold", + "uml-id": "_LCr6QHfdEeW-h9gN8LYm4Q", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EShort", + "order-number": 7, + "is-read-only": true, + "unit": "dBm", + "description": [ + "Value of the receive level required to decode the received signal with a Bit Error Rate of 1e-6 or less." + ] + }, + "amUpshiftLevel": { + "id": "amUpshiftLevel", + "uml-id": "_MGguwHfdEeW-h9gN8LYm4Q", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EByte", + "order-number": 8, + "is-read-only": true, + "unit": "dBm", + "description": [ + "Value of the receive level that has to be exceeded to shift into a higher modulation scheme." + ] + }, + "amDownshiftLevel": { + "id": "amDownshiftLevel", + "uml-id": "_NIvAwHfdEeW-h9gN8LYm4Q", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EByte", + "order-number": 9, + "is-read-only": true, + "unit": "dBm", + "description": [ + "Value of the receive level that has to be exceeded for not shifting into a lower modulation scheme." + ] + }, + "xpicIsAvail": { + "id": "xpicIsAvail", + "uml-id": "_QHd9kHfvEeW-h9gN8LYm4Q", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 10, + "is-read-only": true, + "description": [ + "In case the Air Interface Port is capable of XPIC, this field shall contain a 'true'." + ] + }, + "airInterfaceProblemSeverityType": { + "id": "airInterfaceProblemSeverityType", + "uml-id": "_ZKdWgGnuEeaZwMagYjVCHQ", + "uml-type": "uml:DataType" + }, + "airInterfaceCurrentProblemType": { + "id": "airInterfaceCurrentProblemType", + "uml-id": "_umuZUMXjEeW3xsRKtpCLuA", + "uml-type": "uml:DataType" + }, + "airInterfacePerformanceType": { + "id": "airInterfacePerformanceType", + "uml-id": "_OvFYwEQbEea3g-FxAUaYRg", + "uml-type": "uml:DataType", + "description": [ + "Consolidated performance information of the air interface." + ] + }, + "es": { + "id": "es", + "uml-id": "_DbVzpUQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 1, + "is-read-only": true, + "unit": "s", + "description": [ + "Number of errored seconds." + ] + }, + "ses": { + "id": "ses", + "uml-id": "_DbVzqUQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 2, + "is-read-only": true, + "unit": "s", + "description": [ + "Number of severely errored seconds." + ] + }, + "cses": { + "id": "cses", + "uml-id": "_DbVzrUQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 3, + "is-read-only": true, + "unit": "s", + "description": [ + "Number of consecutive severely errored seconds." + ] + }, + "unavailability": { + "id": "unavailability", + "uml-id": "_DbVzsUQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 4, + "is-read-only": true, + "unit": "s", + "description": [ + "Total time of unavailability in seconds." + ] + }, + "txLevelMin": { + "id": "txLevelMin", + "uml-id": "_DbVztUQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EByte", + "order-number": 5, + "is-read-only": true, + "unit": "dBm", + "description": [ + "Minimum transmit power. Signed integers are required." + ] + }, + "txLevelMax": { + "id": "txLevelMax", + "uml-id": "_DbVzuUQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EByte", + "order-number": 6, + "is-read-only": true, + "unit": "dBm", + "description": [ + "Maximum transmit power. Signed integers are required." + ] + }, + "txLevelAvg": { + "id": "txLevelAvg", + "uml-id": "_DbVzvUQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EByte", + "order-number": 7, + "is-read-only": true, + "unit": "dBm", + "description": [ + "Averaged transmit power. Signed integers are required." + ] + }, + "rxLevelMin": { + "id": "rxLevelMin", + "uml-id": "_DbVzwUQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EByte", + "order-number": 8, + "is-read-only": true, + "unit": "dBm", + "description": [ + "Minimum receive level. Signed integers are required." + ] + }, + "rxLevelMax": { + "id": "rxLevelMax", + "uml-id": "_DbVzxUQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EByte", + "order-number": 9, + "is-read-only": true, + "unit": "dBm", + "description": [ + "Maximum receive level. Signed integers are required." + ] + }, + "rxLevelAvg": { + "id": "rxLevelAvg", + "uml-id": "_DbVzyUQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EByte", + "order-number": 10, + "is-read-only": true, + "unit": "dBm", + "description": [ + "Averaged receive level. Signed integers are required." + ] + }, + "time2Symbols": { + "id": "time2Symbols", + "uml-id": "_DbVzzUQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 11, + "is-read-only": true, + "unit": "s" + }, + "time4SymbolsS": { + "id": "time4SymbolsS", + "uml-id": "_DbVz0kQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 12, + "is-read-only": true, + "unit": "s", + "description": [ + "Sum of all seconds the transmitter operated in e.g. 4QAM strong." + ] + }, + "time4Symbols": { + "id": "time4Symbols", + "uml-id": "_DbVz2EQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 13, + "is-read-only": true, + "unit": "s" + }, + "time8Symbols": { + "id": "time8Symbols", + "uml-id": "_DbVz3UQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 14, + "is-read-only": true, + "unit": "s" + }, + "time16SymbolsS": { + "id": "time16SymbolsS", + "uml-id": "_DbVz4kQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 15, + "is-read-only": true, + "unit": "s" + }, + "time16Symbols": { + "id": "time16Symbols", + "uml-id": "_DbVz50QbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 16, + "is-read-only": true, + "unit": "s" + }, + "time32Symbols": { + "id": "time32Symbols", + "uml-id": "_DbVz7EQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 17, + "is-read-only": true, + "unit": "s" + }, + "time64Symbols": { + "id": "time64Symbols", + "uml-id": "_DbVz8UQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 18, + "is-read-only": true, + "unit": "s" + }, + "time128Symbols": { + "id": "time128Symbols", + "uml-id": "_DbVz9kQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 19, + "is-read-only": true, + "unit": "s" + }, + "time256Symbols": { + "id": "time256Symbols", + "uml-id": "_DbVz-0QbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 20, + "is-read-only": true, + "unit": "s" + }, + "time512Symbols": { + "id": "time512Symbols", + "uml-id": "_DbV0AEQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 21, + "is-read-only": true, + "unit": "s" + }, + "time512SymbolsL": { + "id": "time512SymbolsL", + "uml-id": "_DbV0BUQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 22, + "is-read-only": true, + "unit": "s" + }, + "time1024Symbols": { + "id": "time1024Symbols", + "uml-id": "_DbV0CkQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 23, + "is-read-only": true, + "unit": "s" + }, + "time1024SymbolsL": { + "id": "time1024SymbolsL", + "uml-id": "_DbV0D0QbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 24, + "is-read-only": true, + "unit": "s" + }, + "time2048Symbols": { + "id": "time2048Symbols", + "uml-id": "_DbV0FEQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 25, + "is-read-only": true, + "unit": "s" + }, + "time2048SymbolsL": { + "id": "time2048SymbolsL", + "uml-id": "_DbV0GUQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 26, + "is-read-only": true, + "unit": "s" + }, + "time4096Symbols": { + "id": "time4096Symbols", + "uml-id": "_DbV0HkQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 27, + "is-read-only": true, + "unit": "s" + }, + "time4096SymbolsL": { + "id": "time4096SymbolsL", + "uml-id": "_DbV0I0QbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 28, + "is-read-only": true, + "unit": "s" + }, + "time8192Symbols": { + "id": "time8192Symbols", + "uml-id": "_DbV0KEQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 29, + "is-read-only": true, + "unit": "s" + }, + "time8192SymbolsL": { + "id": "time8192SymbolsL", + "uml-id": "_DbV0LUQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 30, + "is-read-only": true, + "unit": "s" + }, + "xpdMin": { + "id": "xpdMin", + "uml-id": "_DbV0PkQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EByte", + "order-number": 34, + "is-read-only": true, + "unit": "dB", + "description": [ + "Minimum cross polarization discrimination." + ] + }, + "xpdMax": { + "id": "xpdMax", + "uml-id": "_DbV0QkQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EByte", + "order-number": 35, + "is-read-only": true, + "unit": "dB", + "description": [ + "Maximum cross polarization discrimination." + ] + }, + "xpdAvg": { + "id": "xpdAvg", + "uml-id": "_DbV0RkQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EByte", + "order-number": 36, + "is-read-only": true, + "unit": "dB", + "description": [ + "Averaged cross polarization discrimination." + ] + }, + "rfTempMin": { + "id": "rfTempMin", + "uml-id": "_DbV0SkQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EByte", + "order-number": 37, + "is-read-only": true, + "unit": "C", + "description": [ + "Lowest temperature (in degree Celsius) of the radio module inside the outdoor unit." + ] + }, + "rfTempMax": { + "id": "rfTempMax", + "uml-id": "_DbV0TkQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EByte", + "order-number": 38, + "is-read-only": true, + "unit": "C", + "description": [ + "Highest temperature (in degree Celsius) of the radio module inside the outdoor unit." + ] + }, + "rfTempAvg": { + "id": "rfTempAvg", + "uml-id": "_DbV0UkQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EByte", + "order-number": 39, + "is-read-only": true, + "unit": "C", + "description": [ + "Averaged temperature (in degree Celsius) of the radio module inside the outdoor unit." + ] + }, + "defectBlocksSum": { + "id": "defectBlocksSum", + "uml-id": "_DbV0VkQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EShort", + "order-number": 40, + "is-read-only": true, + "unit": "blocks", + "description": [ + "Total number of blocks that were defect after receiving and could not be corrected by the FEC." + ] + }, + "airInterfaceCurrentPerformanceType": { + "id": "airInterfaceCurrentPerformanceType", + "uml-id": "_pQ_y4GoHEeaZwMagYjVCHQ", + "uml-type": "uml:DataType", + "description": [ + "Turns performance information into current performance information by inheriting from OTN_CurrentData." + ] + }, + "airInterfaceHistoricalPerformanceType": { + "id": "airInterfaceHistoricalPerformanceType", + "uml-id": "_t18kwGoHEeaZwMagYjVCHQ", + "uml-type": "uml:DataType", + "description": [ + "Turns performance information into historical performance information by inheriting from OTN_HistoryData." + ] + }, + "diversityType": { + "id": "diversityType", + "uml-id": "_pTliINyUEeW-SfXlFFFI0Q", + "uml-type": "uml:DataType" + }, + "diversityName": { + "id": "diversityName", + "uml-id": "_uYhboNyUEeW-SfXlFFFI0Q", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 1, + "is-read-only": true, + "is-key": 1, + "description": [ + "Names to be chosen from the following list: 'spaceDiversity', 'frequencyDiversity'" + ] + }, + "numberOfAirInterfacesMax": { + "id": "numberOfAirInterfacesMax", + "uml-id": "_wKDDoNyUEeW-SfXlFFFI0Q", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EByte", + "order-number": 2, + "is-read-only": true, + "unit": "air interfaces", + "description": [ + "Maximum number of air interfaces that could be part of this kind of diversity." + ] + }, + "airInterfaceDiversityProblemSeverityType": { + "id": "airInterfaceDiversityProblemSeverityType", + "uml-id": "_2kMRYGzzEeaf-__BRLM84g", + "uml-type": "uml:DataType" + }, + "airInterfaceDiversityCurrentProblemType": { + "id": "airInterfaceDiversityCurrentProblemType", + "uml-id": "_z1XWgMXlEeWJ6KZuc0h_vw", + "uml-type": "uml:DataType" + }, + "airInterfaceDiversityPerformanceType": { + "id": "airInterfaceDiversityPerformanceType", + "uml-id": "_EH3QgEQdEea3g-FxAUaYRg", + "uml-type": "uml:DataType", + "description": [ + "Consolidated performance information of the air interface diversity group." + ] + }, + "snirMin": { + "id": "snirMin", + "uml-id": "_nG-NsEzvEeaRytIQfQ43Wg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EByte", + "order-number": 1, + "is-read-only": true, + "unit": "dB", + "description": [ + "Minimum signal to (noise+interference) ratio of the combined signals." + ] + }, + "snirMax": { + "id": "snirMax", + "uml-id": "_n_OEUEzvEeaRytIQfQ43Wg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EByte", + "order-number": 2, + "is-read-only": true, + "unit": "dB", + "description": [ + "Maximum signal to (noise+interference) ratio of the combined signals." + ] + }, + "snirAvg": { + "id": "snirAvg", + "uml-id": "_oU3kMEzvEeaRytIQfQ43Wg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EByte", + "order-number": 3, + "is-read-only": true, + "unit": "dB", + "description": [ + "Average signal to (noise+interference) ratio of the combined signals." + ] + }, + "airInterfaceDiversityCurrentPerformanceType": { + "id": "airInterfaceDiversityCurrentPerformanceType", + "uml-id": "_n4wTgGz6Eeaf-__BRLM84g", + "uml-type": "uml:DataType", + "description": [ + "Turns performance information into current performance information by inheriting from OTN_CurrentData." + ] + }, + "airInterfaceDiversityHistoricalPerformanceType": { + "id": "airInterfaceDiversityHistoricalPerformanceType", + "uml-id": "_pG0pIGz6Eeaf-__BRLM84g", + "uml-type": "uml:DataType", + "description": [ + "Turns performance information into historical performance information by inheriting from OTN_HistoryData." + ] + }, + "tdmStructureType": { + "id": "tdmStructureType", + "uml-id": "_jRAQsEdoEeax2rWez10Siw", + "uml-type": "uml:DataType" + }, + "tdmStructureName": { + "id": "tdmStructureName", + "uml-id": "_1bJF4EdoEeax2rWez10Siw", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 1, + "is-read-only": true, + "is-key": 1, + "description": [ + "Names to be chosen from the following list: 'e1','t1','j1','e3','ds3','stm1','cpri1','cpri2','cpri3','cpri4','cpri5','cpri6' or 'cpri7'" + ] + }, + "tdmSegmentSize": { + "id": "tdmSegmentSize", + "uml-id": "_hPq1oEdpEeax2rWez10Siw", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 2, + "is-read-only": true, + "unit": "kbit/s", + "description": [ + "Size of the TDM segment in kbit/s. Values to be chosen from the following list: '2048','1544','34000','44736 ','155520','614400','1228800','2457600','3072000','4915200','6144000' or '9830400;" + ] + }, + "maxNumberOfSegmentsReservable": { + "id": "maxNumberOfSegmentsReservable", + "uml-id": "_EJnsgEdpEeax2rWez10Siw", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EByte", + "order-number": 3, + "is-read-only": true, + "unit": "segments", + "description": [ + "Device specific maximum number of segments (not depending on current air interface configuration) that can be reserved for this type of segment on a single air interface." + ] + }, + "structureProblemSeverityType": { + "id": "structureProblemSeverityType", + "uml-id": "_LPgp4Gz0Eeaf-__BRLM84g", + "uml-type": "uml:DataType" + }, + "structureCurrentProblemType": { + "id": "structureCurrentProblemType", + "uml-id": "_UC0gAMXnEeWJ6KZuc0h_vw", + "uml-type": "uml:DataType" + }, + "structurePerformanceType": { + "id": "structurePerformanceType", + "uml-id": "_kzEicEQdEea3g-FxAUaYRg", + "uml-type": "uml:DataType", + "description": [ + "Consolidated performance information of the Structure." + ] + }, + "structureCurrentPerformanceType": { + "id": "structureCurrentPerformanceType", + "uml-id": "_o7jNQGz6Eeaf-__BRLM84g", + "uml-type": "uml:DataType", + "description": [ + "Turns performance information into current performance information by inheriting from OTN_CurrentData." + ] + }, + "structureHistoricalPerformanceType": { + "id": "structureHistoricalPerformanceType", + "uml-id": "_pNAJoGz6Eeaf-__BRLM84g", + "uml-type": "uml:DataType", + "description": [ + "Turns performance information into historical performance information by inheriting from OTN_HistoryData." + ] + }, + "tdmContainerType": { + "id": "tdmContainerType", + "uml-id": "_rgbigEdjEeax2rWez10Siw", + "uml-type": "uml:DataType" + }, + "tdmContainerName": { + "id": "tdmContainerName", + "uml-id": "_rgbigkdjEeax2rWez10Siw", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 1, + "is-read-only": true, + "is-key": 1, + "description": [ + "Names to be chosen from the following list: 'e1','t1','j1','e3','t3','stm1','cpri1','cpri2','cpri3','cpri4','cpri5','cpri6' or 'cpri7'" + ] + }, + "tdmContainerSize": { + "id": "tdmContainerSize", + "uml-id": "_rgbihEdjEeax2rWez10Siw", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 2, + "is-read-only": true, + "unit": "kbit/s", + "description": [ + "Capacity required for transporting this type of container (in kbit/s). Values to be chosen from the following list: '2048','1544','34000','44736 ','155520','614400','1228800','2457600','3072000','4915200','6144000' or '9830400;" + ] + }, + "segmentIDType": { + "id": "segmentIDType", + "uml-id": "_Nd1F4MKuEeWwLJhHQlOGSQ", + "uml-type": "uml:DataType", + "description": [ + "Combinations of structureId and segmentId must be unique inside the device to assure that every resource is used just once." + ] + }, + "structureIdRef": { + "id": "structureIdRef", + "uml-id": "_N4GKkMKvEeWwLJhHQlOGSQ", + "uml-type": "ownedAttribute", + "type": "../OnfModel-CoreModel/CoreModel.uml#_SU3Q4I30EeO38ZmbECnvbg", + "order-number": 1, + "is-read-only": false, + "is-key": 1 + }, + "segmentIdRef": { + "id": "segmentIdRef", + "uml-id": "_nVubgMKvEeWwLJhHQlOGSQ", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EShort", + "order-number": 2, + "is-read-only": false, + "is-key": 2 + }, + "segmentStatusType": { + "id": "segmentStatusType", + "uml-id": "_KwZVcMUCEeW3xsRKtpCLuA", + "uml-type": "uml:DataType" + }, + "segmentStatusTypeId": { + "id": "segmentStatusTypeId", + "uml-id": "_7JBAYOLbEeWM2vUDE3Xqhw", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EShort", + "order-number": 1, + "is-read-only": true, + "is-key": 1 + }, + "segmentIsReservedForTdm": { + "id": "segmentIsReservedForTdm", + "uml-id": "__1DMwMUCEeW3xsRKtpCLuA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 2, + "is-read-only": true, + "description": [ + "The number of segments, which is configured by Structure::StructureConfiguration::tdmReservedNumberOfSegements, has to be reserved for TDM. Starting from the lowest index value, these segments have to be marked with a 'true' in segmentIsReservedForTdm." + ] + }, + "operationalStatus": { + "id": "operationalStatus", + "uml-id": "_ZA94EMUCEeW3xsRKtpCLuA", + "uml-type": "ownedAttribute", + "type": "../OnfModel-CoreModel/CoreModel.uml#_lNclkLEtEeSZUdYfPSdgew", + "order-number": 3, + "is-read-only": true, + "description": [ + "Current operational status of each segment." + ] + }, + "containerProblemSeverityType": { + "id": "containerProblemSeverityType", + "uml-id": "_OMPgwGz0Eeaf-__BRLM84g", + "uml-type": "uml:DataType" + }, + "problemKindName": { + "id": "problemKindName", + "uml-id": "_OMQH0Gz0Eeaf-__BRLM84g", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 1, + "is-read-only": false, + "is-key": 1, + "description": [ + "Name of the alarm according to Container::ContainerCapability::supportedAlarms" + ] + }, + "problemKindSeverity": { + "id": "problemKindSeverity", + "uml-id": "_OMQH02z0Eeaf-__BRLM84g", + "uml-type": "ownedAttribute", + "type": "_eIml0JH1EeWUdbnmmNiTAA", + "order-number": 2, + "is-read-only": false, + "description": [ + "Severity of this type of alarm." + ] + }, + "containerCurrentProblemType": { + "id": "containerCurrentProblemType", + "uml-id": "__h1n4MXpEeWJ6KZuc0h_vw", + "uml-type": "uml:DataType" + }, + "problemName": { + "id": "problemName", + "uml-id": "__h1n4cXpEeWJ6KZuc0h_vw", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 1, + "is-read-only": true, + "description": [ + "Name of the alarm according to Container::ContainerCapability::supportedAlarms" + ] + }, + "problemSeverity": { + "id": "problemSeverity", + "uml-id": "__h1n48XpEeWJ6KZuc0h_vw", + "uml-type": "ownedAttribute", + "type": "_eIml0JH1EeWUdbnmmNiTAA", + "order-number": 2, + "is-read-only": false, + "description": [ + "Severity of the alarm." + ] + }, + "containerPerformanceType": { + "id": "containerPerformanceType", + "uml-id": "_U9tW0EQeEea3g-FxAUaYRg", + "uml-type": "uml:DataType", + "description": [ + "Consolidated performance information of the Container." + ] + }, + "txEthernetBytesMaxS": { + "id": "txEthernetBytesMaxS", + "uml-id": "_MaHB8H1IEeWHjMaYlqnBcw", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 1, + "is-read-only": true, + "unit": "Bytes/s", + "description": [ + "Required data volume = 31bit" + ] + }, + "txEthernetBytesMaxM": { + "id": "txEthernetBytesMaxM", + "uml-id": "_M3NNoH1IEeWHjMaYlqnBcw", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#ELong", + "order-number": 2, + "is-read-only": true, + "unit": "Bytes/min", + "description": [ + "Required data volume = 37bit" + ] + }, + "txEthernetBytesSum": { + "id": "txEthernetBytesSum", + "uml-id": "_NWtNEH1IEeWHjMaYlqnBcw", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#ELong", + "order-number": 3, + "is-read-only": true, + "unit": "Bytes", + "description": [ + "Required data volume = 47bit" + ] + }, + "timePeriod": { + "id": "timePeriod", + "uml-id": "_Nyme4H1IEeWHjMaYlqnBcw", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 4, + "is-read-only": true, + "unit": "s", + "description": [ + "Required data volume = 17bit" + ] + }, + "containerCurrentPerformanceType": { + "id": "containerCurrentPerformanceType", + "uml-id": "_pA5AQGz6Eeaf-__BRLM84g", + "uml-type": "uml:DataType", + "description": [ + "Turns performance information into current performance information by inheriting from OTN_CurrentData." + ] + }, + "containerHistoricalPerformanceType": { + "id": "containerHistoricalPerformanceType", + "uml-id": "_pTaToGz6Eeaf-__BRLM84g", + "uml-type": "uml:DataType", + "description": [ + "Turns performance information into historical performance information by inheriting from OTN_HistoryData." + ] + }, + "performanceData": { + "id": "performanceData", + "uml-id": "_i5STYGz7Eeaf-__BRLM84g", + "uml-type": "ownedAttribute", + "type": "_U9tW0EQeEea3g-FxAUaYRg", + "order-number": 1, + "is-read-only": true + }, + "_eIml0JH1EeWUdbnmmNiTAA": { + "id": "severityType", + "uml-id": "_eIml0JH1EeWUdbnmmNiTAA", + "enum": [ + "non-alarmed", + "warning", + "minor", + "major", + "critical" + ], + "is-read-only": false, + "description": [ + "According to ITU-T M.3160" + ] + }, + "_e85NsI99EeWFluv9KLLl5A": { + "id": "polarizationType", + "uml-id": "_e85NsI99EeWFluv9KLLl5A", + "enum": [ + "not-specified", + "horizontal", + "vertical" + ], + "is-read-only": false + }, + "_DaB5IJRgEeWxIPEwZQ_gmw": { + "id": "protectionType", + "uml-id": "_DaB5IJRgEeWxIPEwZQ_gmw", + "enum": [ + "hsb" + ], + "is-read-only": false + }, + "_01_dYJReEeWxIPEwZQ_gmw": { + "id": "roleType", + "uml-id": "_01_dYJReEeWxIPEwZQ_gmw", + "enum": [ + "working", + "protection", + "protected" + ], + "is-read-only": false + }, + "_DUJs8JOXEeWz-6sqLzUedw": { + "id": "airInterfaceDiversityStatusType", + "uml-id": "_DUJs8JOXEeWz-6sqLzUedw", + "enum": [ + "groupDown", + "notAllAiActive", + "allAiActive" + ], + "is-read-only": false + } + } +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/elasticsearch/index/mwtn/modelDescription/core-model.schema-information.json b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/elasticsearch/index/mwtn/modelDescription/core-model.schema-information.json new file mode 100644 index 00000000..fd957f31 --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/elasticsearch/index/mwtn/modelDescription/core-model.schema-information.json @@ -0,0 +1,2296 @@ +{ + "schema-information": { + "forwarding-domain": { + "id": "forwarding-domain", + "uml-id": "_oGql-FLNEeO75dO39GbF8Q", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "The ForwardingDomain (FD) class models the topological component that represents the opportunity to enable forwarding (of specific transport characteristic information at one or more protocol layers) between points represented by the LTP in the model. The FD object provides the context for and constrains the formation, adjustment and removal of FCs and hence offers the potential to enable forwarding. The LTPs available are those defined at the boundary of the FD. At a lower level of recursion an FD could represent a fabric (switch matrix) in a Network Element (NE). An NE can encompass more than one switch matrix and hence more than one FD. The FD representing a switch matrix can be further partitioned. The FD corresponds to a subnetwork [ITU-T G.800], FlowDomain [TMF 612] and a MultiLayerSubNetwork (MLSN) [TMF 612]. As in the TMF concept of MLSN and unlike the ITU-T concet of subnetwork model the FD can support more than one layer-protocol." + ], + "uml-name": "ForwardingDomain" + }, + "layer-protocol-name": { + "id": "layer-protocol-name", + "uml-id": "_P-Hp8MD4EeSoNOrYOfaryg", + "uml-type": "uml:DataType", + "description": [ + "Provides a controlled list of layer protocol names and indicates the naming authority. Note that it is expected that attributes will be added to this structure to convey the naming authority name, the name of the layer protocol using a human readable string and any particular standard reference. Layer protocol names include: - Layer 1 (L1): OTU, ODU - Layer 2 (L2): Carrier Grade Ethernet (ETY, ETH), MPLS-TP (MT)" + ], + "uml-name": "LayerProtocolName" + }, + "lower-level-fd": { + "id": "lower-level-fd", + "uml-id": "_oGqmBVLNEeO75dO39GbF8Q", + "uml-type": "ownedAttribute", + "type": "_oGql-FLNEeO75dO39GbF8Q", + "order-number": 2, + "is-read-only": false, + "description": [ + "The FD class supports a recursive aggregation relationship (HigherLevelFdEncompassesLowerLevelFds) such that the internal construction of an FD can be exposed as multiple lower level FDs and associated Links (partitioning). The aggregated FDs and Links form an interconnected topology that provides and describes the capability of the aggregating FD. Note that the model actually represents aggregation of lower level FDs into higher level FDs as views rather than FD partition, and supports multiple views. Aggregation allow reallocation of capacity from lower level FDs to different higher level FDs as if the network is reorganized (as the association is aggregation not composition)." + ], + "uml-name": "_lowerLevelFd" + }, + "fc": { + "id": "fc", + "uml-id": "_oGql_1LNEeO75dO39GbF8Q", + "uml-type": "ownedAttribute", + "type": "_oGqmC1LNEeO75dO39GbF8Q", + "order-number": 3, + "is-read-only": false, + "description": [ + "An FD aggregares one or more FCs. A aggregated FC connects LTPs that bound the FD." + ], + "uml-name": "_fc" + }, + "ltp": { + "id": "ltp", + "uml-id": "_8SXNrD-HEeaRI-H69PghuA", + "uml-type": "ownedAttribute", + "type": "_eEpDMFX4EeOVGaP4lO41SQ", + "order-number": 1, + "is-read-only": false, + "uml-name": "_ltp" + }, + "lower-level-link": { + "id": "lower-level-link", + "uml-id": "_dm_ngBiQEeSh8KVgZCMyDw", + "uml-type": "ownedAttribute", + "type": "_oGqnjVLNEeO75dO39GbF8Q", + "order-number": 5, + "is-read-only": false, + "description": [ + "The FD encompasses Links that interconnect lower level FDs and collect links that are wholly within the bounds of the FD. See also _lowerLevelFd." + ], + "uml-name": "_lowerLevelLink" + }, + "forwarding-construct": { + "id": "forwarding-construct", + "uml-id": "_oGqmC1LNEeO75dO39GbF8Q", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "The ForwardingConstruct (FC) class models enabled constrained potential for forwarding between two or more LTPs at a particular specific layerProtocol. Like the LTP, the FC supports any transport protocol including all circuit and packet forms. It is used to effect forwarding of transport characteristic (layer protocol) information. An FC can be in only one FD. The ForwardingConstruct is a Forwarding entity. At a low level of the recursion, a FC represents a cross-connection within an NE. It may also represent a fragment of a cross-connection under certain circumstances. The FC object can be used to represent many different structures including point-to-point (P2P), point-to-multipoint (P2MP), rooted-multipoint (RMP) and multipoint-to-multipoint (MP2MP) bridge and selector structures for linear, ring or mesh protection schemes." + ], + "uml-name": "ForwardingConstruct" + }, + "lower-level-fc": { + "id": "lower-level-fc", + "uml-id": "_i7UzkFYfEeOVGaP4lO41SQ", + "uml-type": "ownedAttribute", + "type": "_oGqmC1LNEeO75dO39GbF8Q", + "order-number": 2, + "is-read-only": false, + "description": [ + "An FC object supports a recursive aggregation relationship such that the internal construction of an FC can be exposed as multiple lower level FC objects (partitioning). Aggregation is used as for the FD to allow changes in hierarchy. FC aggregation reflects FD aggregation. The FC represents a Cross-Connection in an NE. The Cross-Connection in an NE is not necessarily the lowest level of FC partitioning." + ], + "uml-name": "_lowerLevelFc" + }, + "fc-route": { + "id": "fc-route", + "uml-id": "_A8SFwFYgEeOVGaP4lO41SQ", + "uml-type": "ownedAttribute", + "type": "_9UVusFYfEeOVGaP4lO41SQ", + "order-number": 3, + "is-read-only": false, + "description": [ + "An FC object can have zero or more routes, each of which is defined as a list of lower level FC objects describing the flow across the network." + ], + "uml-name": "_fcRoute" + }, + "fc-port": { + "id": "fc-port", + "uml-id": "_b_lUAFYgEeOVGaP4lO41SQ", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "The association of the FC to LTPs is made via FcPorts. The FcPort class models the access to the FC function. The traffic forwarding between the associated FcPorts of the FC depends upon the type of FC and may be associated with FcSwitch object instances. In cases where there is resilience, the FcPort may convey the resilience role of the access to the FC. It can represent a protected (resilient/reliable) point or a protecting (unreliable working or protection) point. The FcPort replaces the Protection Unit of a traditional protection model. The ForwardingConstruct can be considered as a component and the FcPort as a Port on that component." + ], + "uml-name": "FcPort" + }, + "fc-switch": { + "id": "fc-switch", + "uml-id": "_a97NQFYhEeOVGaP4lO41SQ", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "The FcSwitch class models the switched forwarding of traffic (traffic flow) between FcPorts and is present where there is protection functionality in the FC. If an FC exposes protection (having two or more FcPorts that provide alternative identical inputs/outputs), the FC will have one or more associated FcSwitch objects to represent the alternative flow choices visible at the edge of the FC. The FC switch represents and defines a protection switch structure encapsulated in the FC. Essentially performs one of the functions of the Protection Group in a traditional model. It associates to 2 or more FcPorts each playing the role of a Protection Unit. One or more protection, i.e. standby/backup, FcPorts provide protection for one or more working (i.e. regular/main/preferred) FcPorts where either protection or working can feed one or more protected FcPort. The switch may be used in revertive or non-revertive (symmetric) mode. When in revertive mode it may define a waitToRestore time. It may be used in one of several modes including source switch, destination switched, source and destination switched etc (covering cases such as 1+1 and 1:1). It may be locked out (prevented from switching), force switched or manual switched. It will indicate switch state and change of state. The switch can be switched away from all sources such that it becomes open and hence two coordinated switches can both feed the same LTP so long as at least one of the two is switched away from all sources (is open ). The ability for a Switch to be high impedance allows bidirectional ForwardingConstructs to be overlaid on the same bidirectional LTP where the appropriate control is enabled to prevent signal conflict. This ability allows multiple alternate routes to be present that otherwise would be in conflict." + ], + "uml-name": "FcSwitch" + }, + "forwarding-direction": { + "id": "forwarding-direction", + "uml-id": "_9_yMUEDAEeWQeOKbNUpP9A", + "uml-type": "ownedAttribute", + "type": "_dV67AEC8EeWxhL2B6Peg6A", + "order-number": 6, + "is-read-only": false, + "description": [ + "The directionality of the ForwardingConstruct. Is applicable to simple ForwardingConstructs where all FcPorts are BIDIRECTIONAL (the ForwardingConstruct will be BIDIRECTIONAL) or UNIDIRECTIONAL (the ForwardingConstruct will be UNIDIRECTIONAL). Is not present in more complex cases." + ], + "uml-name": "forwardingDirection", + "controlType": [ + "bidirectional", + "unidirectional", + "undefined-or-unknown" + ] + }, + "is-protection-lock-out": { + "id": "is-protection-lock-out", + "uml-id": "_ls-wcMN9EeWwZ527PhfFSA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 6, + "is-read-only": false, + "description": [ + "The resource is configured to temporarily not be available for use in the protection scheme(s) it is part of. This overrides all other protection control states including forced. If the item is locked out then it cannot be used under any circumstances. Note: Only relevant when part of a protection scheme." + ], + "uml-name": "isProtectionLockOut", + "controlType": "checkbox" + }, + "service-priority": { + "id": "service-priority", + "uml-id": "_3co20MOCEeWwZ527PhfFSA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 8, + "is-read-only": false, + "description": [ + "Relevant where service FCs are competing for server resources. Used to determine which signal FC is allocated resource. The priority of the service with respect to other services . Lower numeric value means higher priority. Covers cases such as preemptable." + ], + "uml-name": "servicePriority", + "controlType": "number" + }, + "supported-link": { + "id": "supported-link", + "uml-id": "_0172EFHnEeaDuo8VlVeg_g", + "uml-type": "ownedAttribute", + "type": "_oGqnjVLNEeO75dO39GbF8Q", + "order-number": 9, + "is-read-only": false, + "description": [ + "An FC that spans between LTPs that terminate the LayerProtocol usually supports one or more links in the client layer." + ], + "uml-name": "_supportedLink" + }, + "network-element": { + "id": "network-element", + "uml-id": "_oGqnr1LNEeO75dO39GbF8Q", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "The Network Element (NE) class represents a network element (traditional NE) in the data plane. A data plane network element is essentially a consolidation of capabilities that can be viewed and controlled through a single management-control port. In the direct interface from an SDN controller to a network element in the data plane, the NetworkElement object defines the scope of control for the resources within the network element For example internal transfer of user information between the external terminations (ports of the NE), encapsulation, multiplexing/demultiplexing, and OAM functions, etc. The NetworkElement provides the scope of the naming space for identifying objects representing the resources within the data plane network element. NE is really a product bundling or some view of management scope, management access, session. The NE is not directly part of topology but brings meaning to the FD context and the LTP context (and hence the links)." + ], + "uml-name": "NetworkElement" + }, + "fd": { + "id": "fd", + "uml-id": "_oGqnslLNEeO75dO39GbF8Q", + "uml-type": "ownedAttribute", + "type": "_oGql-FLNEeO75dO39GbF8Q", + "order-number": 1, + "is-read-only": false, + "description": [ + "Represents the FD that is completely within the boundary of the NE. At a low level of recursion, an FD (within a network element (NE)) represents a switch matrix (i.e., a fabric). Note that an NE can encompass multiple switch matrices (FDs) and the FD representing the switch matrix can be further partitioned. Where an FD is referenced by the NeEncompassesFd association, any FDs that it encompasses (i.e., that are associated with it by HigherLevelFdEncompassesLowerLevelFds), must also be encompassed by the NE and hence must have the NeEncompassesFd association." + ], + "uml-name": "_fd" + }, + "role": { + "id": "role", + "uml-id": "_Ykm6QFeGEeOVGaP4lO41SQ", + "uml-type": "ownedAttribute", + "type": "_DUU_sGZ_EeWrX_JIGzXlSg", + "order-number": 2, + "is-read-only": false, + "description": [ + "Each FcPort of the FC has a role (e.g., working, protection, protected, symmetric, hub, spoke, leaf, root) in the context of the FC with respect to the FC function." + ], + "uml-name": "role" + }, + "fc-port-direction": { + "id": "fc-port-direction", + "uml-id": "_1HbEgEDAEeWQeOKbNUpP9A", + "uml-type": "ownedAttribute", + "type": "_2WpC8EC7EeWxhL2B6Peg6A", + "order-number": 3, + "is-read-only": false, + "description": [ + "The orientation of defined flow at the FcPort." + ], + "uml-name": "fcPortDirection", + "controlType": [ + "bidirectional", + "input", + "output", + "unidentified-or-unknown" + ] + }, + "selection-priority": { + "id": "selection-priority", + "uml-id": "_02awkMOEEeWwZ527PhfFSA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 5, + "is-read-only": false, + "description": [ + "The preference priority of the resource in the protection scheme for a particular FC. The lower the value the higher the priority. A lower value of selection priority is preferred If two resources have the same value they are of equal priory. There is no preference between equal priorities. If a resource with the lowest value selection priority fails then the next lowest value available (may be the same value) is picked. Hence on failure of the current resource the next best available will be selected. If there are several equal values the choice is essentially arbitrary). If the scheme is revertive then when a resource of higher priority than the currently selected resource recovers it will be selected. This is equivalent to working/protection but allows for all static scheme types with n:m capability. In simple schemes 0 = working and 1 = protecting." + ], + "uml-name": "selectionPriority", + "controlType": "number" + }, + "is-internal-port": { + "id": "is-internal-port", + "uml-id": "_CSlIwNViEeWhfIeymCGl5Q", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 6, + "is-read-only": true, + "description": [ + "The FcPort is not exposed and cannot have associated LTPs. This form of FcPort is used to enable chaining of FcSwitches or FcRoutes in complex network protection scenarios." + ], + "uml-name": "isInternalPort", + "controlType": "checkbox" + }, + "fc-route-feeds-fc-port-egress": { + "id": "fc-route-feeds-fc-port-egress", + "uml-id": "_xbsp8TLREea40e5DA9KE3w", + "uml-type": "ownedAttribute", + "type": "_9UVusFYfEeOVGaP4lO41SQ", + "order-number": 7, + "is-read-only": false, + "description": [ + "Identifies which route(s) currently actively forward to the FcPort to exit the FC to an LTP (or for an internal FcPort to propagate to the next internal switch/route)." + ], + "uml-name": "_fcRouteFeedsFcPortEgress" + }, + "layer-protocol": { + "id": "layer-protocol", + "uml-id": "_gROecFYXEeOVGaP4lO41SQ", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "The projection of an LTP into each transport layer is represented by a LayerProtocol (LP) instance. A LayerProtocol instances can be used for controlling termination and monitoring functionality. It can also be used for controlling the adaptation (i.e. encapsulation and/or multiplexing of client signal), tandem connection monitoring, traffic conditioning and/or shaping functionality at an intermediate point along a connection. Where the client - server relationship is fixed 1:1 and immutable, the layers can be encapsulated in a single LTP instance. Where there is a n:1 relationship between client and server, the layers must be split over two separate instances of LTP." + ], + "uml-name": "LayerProtocol" + }, + "configured-client-capacity": { + "id": "configured-client-capacity", + "uml-id": "_CUJD4BicEeSh8KVgZCMyDw", + "uml-type": "ownedAttribute", + "type": "_aL8EoGnNEeaBUOurxzA2swpathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 2, + "is-read-only": false, + "visible": false, + "description": [ + "Provides a summarized view of the client capacity that is configurable for use. Note the client LTP association should provide all necessary detail hence this attribute is questionable." + ], + "uml-name": "configuredClientCapacity" + }, + "lp-direction": { + "id": "lp-direction", + "uml-id": "_GuuSYEDBEeWQeOKbNUpP9A", + "uml-type": "ownedAttribute", + "type": "_RWILYEDAEeWQeOKbNUpP9A", + "order-number": 3, + "is-read-only": false, + "description": [ + "The overall directionality of the LP. - A BIDIRECTIONAL LP will have some SINK and/or SOURCE flows. - A SINK LP can only contain elements with SINK flows or CONTRA_DIRECTION_SOURCE flows - A SOURCE LP can only contain SOURCE flows or CONTRA_DIRECTION_SINK flows" + ], + "uml-name": "lpDirection", + "controlType": [ + "bidirectional", + "sink", + "source", + "undefined-or-unknown" + ] + }, + "termination-state": { + "id": "termination-state", + "uml-id": "_p2YfoGeEEeWmgIwAIZlYKQ", + "uml-type": "ownedAttribute", + "type": "_6anG8GeEEeWmgIwAIZlYKQpathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 4, + "is-read-only": false, + "description": [ + "Indicates whether the layer is terminated and if so how." + ], + "uml-name": "terminationState" + }, + "config-and-switch-controller": { + "id": "config-and-switch-controller", + "uml-id": "_d6vwsMQhEeWlWIVxswb46A", + "uml-type": "ownedAttribute", + "type": "_k1gHQJo5EeOyHKqw-cQ_eg", + "order-number": 5, + "is-read-only": false, + "description": [ + "A switch controller external to the LayerProtocol. The controller will coordinate one or more switches in one or more FCs related to the LayerProtocol" + ], + "uml-name": "_configAndSwitchController" + }, + "fc-blocks-signal-to-lp": { + "id": "fc-blocks-signal-to-lp", + "uml-id": "_OW-PsMjVEeWSlYzRfsq8lQ", + "uml-type": "ownedAttribute", + "type": "_zMwrsMjVEeWSlYzRfsq8lQ", + "order-number": 7, + "is-read-only": false, + "visible":false, + "uml-name": "fcBlocksSignalToLp" + }, + "logical-termination-point": { + "id": "logical-termination-point", + "uml-id": "_eEpDMFX4EeOVGaP4lO41SQ", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "The LogicalTerminationPoint (LTP) class encapsulates the termination and adaptation functions of one or more transport layers represented by instances of LayerProtocol. The encapsulated transport layers have a simple fixed 1:1 client-server relationship defined by association end ordering. The structure of LTP supports all transport protocols including circuit and packet forms." + ], + "uml-name": "LogicalTerminationPoint" + }, + "server-ltp": { + "id": "server-ltp", + "uml-id": "_D4N9IFX5EeOVGaP4lO41SQ", + "uml-type": "ownedAttribute", + "type": "_eEpDMFX4EeOVGaP4lO41SQ", + "order-number": 1, + "is-read-only": false, + "description": [ + "References contained LTPs representing servers of this LTP in an inverse multiplexing configuration (e.g. VCAT)." + ], + "uml-name": "_serverLtp" + }, + "client-ltp": { + "id": "client-ltp", + "uml-id": "_3Y4zAFYWEeOVGaP4lO41SQ", + "uml-type": "ownedAttribute", + "type": "_eEpDMFX4EeOVGaP4lO41SQ", + "order-number": 2, + "is-read-only": false, + "description": [ + "References contained LTPs representing client traffic of this LTP for normal cases of multiplexing." + ], + "uml-name": "_clientLtp" + }, + "lp": { + "id": "lp", + "uml-id": "_lvFOQFYXEeOVGaP4lO41SQ", + "uml-type": "ownedAttribute", + "type": "_gROecFYXEeOVGaP4lO41SQ", + "order-number": 3, + "is-read-only": false, + "description": [ + "Ordered list of LayerProtocols that this LTP is comprised of where the first entry in the list is the lowest server layer (e.g. physical)." + ], + "uml-name": "_lp" + }, + "connected-ltp": { + "id": "connected-ltp", + "uml-id": "_CHM6YFYYEeOVGaP4lO41SQ", + "uml-type": "ownedAttribute", + "type": "_eEpDMFX4EeOVGaP4lO41SQ", + "order-number": 4, + "is-read-only": false, + "description": [ + "Applicable in a simple context where two LTPs are associated via a non-adjustable enabled forwarding. Reduces clutter removing the need for two additional LTPs and an FC with a pair of FcPorts." + ], + "uml-name": "_connectedLtp" + }, + "peer-ltp": { + "id": "peer-ltp", + "uml-id": "_TkuhMFYYEeOVGaP4lO41SQ", + "uml-type": "ownedAttribute", + "type": "_eEpDMFX4EeOVGaP4lO41SQ", + "order-number": 5, + "is-read-only": false, + "description": [ + "References contained LTPs representing the reversal of orientation of flow where two LTPs are associated via a non-adjustable enabled forwarding and where the referenced LTP is fully dependent on the this LTP." + ], + "uml-name": "_peerLtp" + }, + "physical-port-reference": { + "id": "physical-port-reference", + "uml-id": "_RLDi4BieEeSh8KVgZCMyDw", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 6, + "is-read-only": false, + "description": [ + "One or more text labels for the unmodelled physical port associated with the LTP. In many cases there is no associated physical port." + ], + "uml-name": "physicalPortReference", + "controlType": "text" + }, + "ltp-in-other-view": { + "id": "ltp-in-other-view", + "uml-id": "_vq1NIBigEeSh8KVgZCMyDw", + "uml-type": "ownedAttribute", + "type": "_eEpDMFX4EeOVGaP4lO41SQ", + "order-number": 7, + "is-read-only": false, + "description": [ + "References one or more LTPs in other views that represent this LTP. The referencing LTP is the provider of capability." + ], + "uml-name": "_ltpInOtherView" + }, + "ltp-direction": { + "id": "ltp-direction", + "uml-id": "_S811EEDBEeWQeOKbNUpP9A", + "uml-type": "ownedAttribute", + "type": "_RWILYEDAEeWQeOKbNUpP9A", + "order-number": 8, + "is-read-only": false, + "description": [ + "The overall directionality of the LTP. - A BIDIRECTIONAL LTP must have at least some LPs that are BIDIRECTIONAL but may also have some SINK and/or SOURCE LPs. - A SINK LTP can only contain SINK LPs - A SOURCE LTP can only contain SOURCE LPs" + ], + "uml-name": "ltpDirection", + "controlType": [ + "bidirectional", + "sink", + "source", + "undefined-or-unknown" + ] + }, + "configuration-and-switch-controller": { + "id": "configuration-and-switch-controller", + "uml-id": "_k1gHQJo5EeOyHKqw-cQ_eg", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Represents the capability to control and coordinate switches, to add/delete/modify FCs and to add/delete/modify LTPs/LPs so as to realize a protection scheme." + ], + "uml-name": "ConfigurationAndSwitchController" + }, + "switch-rule": { + "id": "switch-rule", + "uml-id": "_oxb_EJo-EeOyHKqw-cQ_eg", + "uml-type": "ownedAttribute", + "type": "_aL8EoGnNEeaBUOurxzA2sw", + "order-number": 1, + "is-read-only": false, + "description": [ + "A sketch of the presence of complex rules governing the switch behavior." + ], + "uml-name": "switchRule" + }, + "control-parameters": { + "id": "control-parameters", + "uml-id": "_k40wIVJKEeaDuo8VlVeg_g", + "uml-type": "ownedAttribute", + "type": "_T5-osJ4HEeOO3om500DFKg", + "order-number": 10, + "is-read-only": false, + "uml-name": "_controlParameters" + }, + "profile-proxy": { + "id": "profile-proxy", + "uml-id": "_DEWvsJozEeOyHKqw-cQ_eg", + "uml-type": "ownedAttribute", + "type": "_rgdnkJoyEeOyHKqw-cQ_eg", + "order-number": 5, + "is-read-only": false, + "description": [ + "Provides a set of predefined values for switch control in place of the direct values available via the FcSwitch or via _configurationAndSwitchControl." + ], + "uml-name": "_profileProxy" + }, + "local-pac": { + "id": "local-pac", + "uml-id": "_JOA30MOxEeWwZ527PhfFSA", + "uml-type": "uml:DataType", + "description": [ + "Provides the properties of a LocalClass via composition." + ], + "uml-name": "Local_Pac" + }, + "global-pac": { + "id": "global-pac", + "uml-id": "_iBsM0MOxEeWwZ527PhfFSA", + "uml-type": "uml:DataType", + "description": [ + "Provides the properties of a GlobalClass via composition." + ], + "uml-name": "Global_Pac" + }, + "is-frozen": { + "id": "is-frozen", + "uml-id": "_Xt2wEMOyEeWwZ527PhfFSA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 7, + "is-read-only": false, + "description": [ + "Temporarily prevents any switch action to be taken and, as such, freezes the current state. Until the freeze is cleared, additional near-end external commands are rejected and fault condition changes and received APS messages are ignored. All administrative controls of any aspect of protection are rejected." + ], + "uml-name": "isFrozen", + "controlType": "checkbox" + }, + "is-coordinated-switching-both-ends": { + "id": "is-coordinated-switching-both-ends", + "uml-id": "_QuZt0MO2EeWwZ527PhfFSA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 8, + "is-read-only": false, + "description": [ + "The C&SC is operating such that switching at both ends of each flow acorss the FC is coordinated at both ingress and egress ends." + ], + "uml-name": "isCoordinatedSwitchingBothEnds", + "controlType": "checkbox" + }, + "subordinate-controller": { + "id": "subordinate-controller", + "uml-id": "_OjA04MQlEeWlWIVxswb46A", + "uml-type": "ownedAttribute", + "type": "_k1gHQJo5EeOyHKqw-cQ_eg", + "order-number": 9, + "is-read-only": false, + "description": [ + "A C&SC that is fully or partially subordinate this C&SC. A peer is considered as partially subordinate in that the peer will respond to requests for action from this C&SC but will also make requests for action to be carried out by this C&SC. Where there is a peer relationship each controller in the peering will see the other controller as subordinate." + ], + "uml-name": "_subordinateController" + }, + "control-parameters-pac": { + "id": "control-parameters-pac", + "uml-id": "_T5-osJ4HEeOO3om500DFKg", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "A list of control parameters to apply to a switch." + ], + "uml-name": "ControlParameters_Pac" + }, + "reversion-mode": { + "id": "reversion-mode", + "uml-id": "_oGqn41LNEeO75dO39GbF8Q", + "uml-type": "ownedAttribute", + "type": "_oGqjf1LNEeO75dO39GbF8Q", + "order-number": 3, + "is-read-only": false, + "description": [ + "Moved to ControlParameter_Pac... This attribute whether or not the protection scheme is revertive or non-revertive." + ], + "uml-name": "reversionMode", + "controlType": [ + "revertive", + "non-revertive" + ] + }, + "wait-to-revert-time": { + "id": "wait-to-revert-time", + "uml-id": "_eSxzEJ4IEeOO3om500DFKg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 2, + "is-read-only": false, + "description": [ + "If the protection system is revertive, this attribute specifies the time, in minutes, to wait after a fault clears on a higher priority (preferred) resource before reverting to the preferred resource." + ], + "uml-name": "waitToRevertTime", + "controlType": "number" + }, + "prot-type": { + "id": "prot-type", + "uml-id": "_oGqn6lLNEeO75dO39GbF8Q", + "uml-type": "ownedAttribute", + "type": "_c3Hu8Gb3EeWrX_JIGzXlSg", + "order-number": 2, + "is-read-only": false, + "description": [ + "Indicates the protection scheme that is used for the ProtectionGroup." + ], + "uml-name": "protType" + }, + "hold-off-time": { + "id": "hold-off-time", + "uml-id": "_oGqn6FLNEeO75dO39GbF8Q", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 1, + "is-read-only": false, + "description": [ + "Moved to ControlParameter_Pac... This attribute indicates the time, in seconds, between declaration of unacceptable quality of signal on the currently selected FcPort, and the initialization of the protection switching algorithm." + ], + "uml-name": "holdOffTime", + "controlType": "number" + }, + "network-scheme-specification": { + "id": "network-scheme-specification", + "uml-id": "_doxoIDLIEea40e5DA9KE3w", + "uml-type": "ownedAttribute", + "type": "_w-HB8DLEEea40e5DA9KE3w", + "order-number": 5, + "is-read-only": false, + "uml-name": "_networkSchemeSpecification" + }, + "selected-fc-port": { + "id": "selected-fc-port", + "uml-id": "_2PdiYI8lEeOw_ste-s6RrA", + "uml-type": "ownedAttribute", + "type": "_b_lUAFYgEeOVGaP4lO41SQ", + "order-number": 4, + "is-read-only": false, + "description": [ + "Indicates which points are selected by the switch. Depending on the switch spec (via Fcspec) - more than one FcPort can be selected at any one time (e.g. egress switch, ingress packet switch) - zero FcPorts can be selected. For an ingress switch this indicates that the switch common (egress) is high impedance ." + ], + "uml-name": "_selectedFcPort" + }, + "internal-configuration-and-switch-control": { + "id": "internal-configuration-and-switch-control", + "uml-id": "_tbetAJ4HEeOO3om500DFKg", + "uml-type": "ownedAttribute", + "type": "_k1gHQJo5EeOyHKqw-cQ_eg", + "order-number": 6, + "is-read-only": false, + "description": [ + "A switch controller encapsulated in the FcSwitch." + ], + "uml-name": "_internalConfigurationAndSwitchControl" + }, + "switch-control": { + "id": "switch-control", + "uml-id": "_LSnbYMOGEeWwZ527PhfFSA", + "uml-type": "ownedAttribute", + "type": "_e-7DYMOFEeWwZ527PhfFSA", + "order-number": 7, + "is-read-only": false, + "description": [ + "Degree of administrative control applied to the switch selection." + ], + "uml-name": "switchControl", + "controlType": [ + "normal", + "manual", + "forced" + ] + }, + "switch-selects-ports": { + "id": "switch-selects-ports", + "uml-id": "_FBaoAMQTEeWlWIVxswb46A", + "uml-type": "ownedAttribute", + "type": "_2WpC8EC7EeWxhL2B6Peg6A", + "order-number": 8, + "is-read-only": false, + "description": [ + "Indicates whether the switch selects from ingress to the FC or to egress of the FC, or both." + ], + "uml-name": "switchSelectsPorts", + "controlType": [ + "bidirectional", + "input", + "output", + "unidentified-or-unknown" + ] + }, + "switch-selection-reason": { + "id": "switch-selection-reason", + "uml-id": "_XjsGkCi_EeaGGvAxxSe1uA", + "uml-type": "ownedAttribute", + "type": "_zRKlICi9EeaGGvAxxSe1uA", + "order-number": 9, + "is-read-only": true, + "description": [ + "The reason for the current switch selection." + ], + "uml-name": "switchSelectionReason", + "controlType": [] + }, + "wait-to-restore-time": { + "id": "wait-to-restore-time", + "uml-id": "_oGqn5lLNEeO75dO39GbF8Q", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 11, + "is-read-only": false, + "description": [ + "Moved to ControlParameter_Pac and changed to waitToRevert... If the protection system is revertive, this attribute specifies the amount of time, in seconds, to wait after the preferred FcPort returns to an acceptable state of operation (e.g. a fault has cleared) before restoring traffic to that preferred FcPort." + ], + "uml-name": "waitToRestoreTime", + "controlType": "number" + }, + "name": { + "id": "name", + "uml-id": "_YCL8kMDZEeWbqPZwR-Ot6A", + "uml-type": "ownedAttribute", + "type": "_XUarEMDuEeWbqPZwR-Ot6A", + "order-number": 4, + "is-read-only": false, + "description": [ + "If the element is a name." + ], + "uml-name": "name" + }, + "global-class": { + "id": "global-class", + "uml-id": "_iVJ1kI2wEeO38ZmbECnvbg", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Represents a type of thing (an Entity) that has instances which can exist in their own right (independently of any others). Entity: Has identity, defined boundary, properties, functionality and lifecycle in a global context. (consider in the context of a Class: (usage) The representation of a thing that may be an entity or an inseparable Entity Feature)." + ], + "uml-name": "GlobalClass" + }, + "local-id": { + "id": "local-id", + "uml-id": "_cq2mQMDYEeWbqPZwR-Ot6A", + "uml-type": "ownedAttribute", + "type": "_dCdzAMDuEeWbqPZwR-Ot6A", + "order-number": 2, + "is-read-only": false, + "description": [ + "If the element is a localId (where the element above in the hierarchy must be the context in which the specific localId is relevant)." + ], + "uml-name": "localId" + }, + "uuid": { + "id": "uuid", + "uml-id": "_KeLlAMDZEeWbqPZwR-Ot6A", + "uml-type": "ownedAttribute", + "type": "_SU3Q4I30EeO38ZmbECnvbg", + "order-number": 3, + "is-read-only": false, + "description": [ + "If the element is a uuid (where this element could be the top of a hierarchy but may also be at some level in the hierarchy where address navigation is considered necessary to assist in location of the UUID)." + ], + "uml-name": "uuid" + }, + "local-class": { + "id": "local-class", + "uml-id": "_k5nWYI2wEeO38ZmbECnvbg", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "A LocalClass represents a Feature of an Entity. It is inseparable from a GlobalClass but is a distinct feature of that GlobalClass such that the instances of LocalClass are able to have associations to other instances.. Feature of an Entity: An inseparable, externally distinguishable part of an entity. The mandatory LocalId of the LocalClass instance is unique in the context of the GlobalClass from which it is inseparable. (consider in the context of a Class: (usage) The representation of a thing that may be an entity or an inseparable feature of an entity)" + ], + "uml-name": "LocalClass" + }, + "label": { + "id": "label", + "uml-id": "_olrqYI2uEeO38ZmbECnvbg", + "uml-type": "ownedAttribute", + "type": "_y7oy8I3tEeO38ZmbECnvbg", + "order-number": 1, + "is-read-only": false, + "description": [ + "List of labels." + ], + "uml-name": "label" + }, + "extension": { + "id": "extension", + "uml-id": "_uQqu4I28EeO38ZmbECnvbg", + "uml-type": "ownedAttribute", + "type": "_y7oy8I3tEeO38ZmbECnvbg", + "order-number": 1, + "is-read-only": false, + "description": [ + "List of simple name-value extensions." + ], + "uml-name": "extension" + }, + "universal-id-authority": { + "id": "universal-id-authority", + "uml-id": "_StA-4I23EeO38ZmbECnvbg", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Represents the authority that controls the allocation of UUIDs." + ], + "uml-name": "UniversalIdAuthority" + }, + "name-and-value-authority": { + "id": "name-and-value-authority", + "uml-id": "_ulDtsI3AEeO38ZmbECnvbg", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Represents the authority that controls the legal values for the names and values of a name/value attribute." + ], + "uml-name": "NameAndValueAuthority" + }, + "conditional-package": { + "id": "conditional-package", + "uml-id": "_-ZWVQJP0EeOqfpp-ZJSmaA", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "The base class for conditional packages." + ], + "uml-name": "ConditionalPackage" + }, + "state-pac": { + "id": "state-pac", + "uml-id": "_RG6VILEtEeSZUdYfPSdgew", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Provides general state attributes." + ], + "uml-name": "State_Pac" + }, + "operational-state": { + "id": "operational-state", + "uml-id": "_dO6owLEtEeSZUdYfPSdgew", + "uml-type": "ownedAttribute", + "type": "_lNclkLEtEeSZUdYfPSdgew", + "order-number": 1, + "is-read-only": true, + "description": [ + "The operational state is used to indicate whether or not the resource is installed and working." + ], + "uml-name": "operationalState", + "controlType": [ + "disabled", + "enabled" + ] + }, + "administrative-control": { + "id": "administrative-control", + "uml-id": "_7gqwALEtEeSZUdYfPSdgew", + "uml-type": "ownedAttribute", + "type": "_-xPeALEvEeSZUdYfPSdgew", + "order-number": 2, + "is-read-only": false, + "description": [ + "The administrativeControl state provides control of the availability of specific resources without modification to the provisioning of those resources. The value is the current control target. The actual administrativeState may or may not be at target." + ], + "uml-name": "administrativeControl", + "controlType": [ + "unlock", + "lock-passive", + "lock-active", + "lock-immediate" + ] + }, + "adminisatratve-state": { + "id": "adminisatratve-state", + "uml-id": "_AjGvILEuEeSZUdYfPSdgew", + "uml-type": "ownedAttribute", + "type": "_KSKOYLEuEeSZUdYfPSdgew", + "order-number": 3, + "is-read-only": true, + "description": [ + "Shows whether or not the client has permission to use or has a prohibition against using the resource. The administrative state expresses usage permissions for specific resources without modification to the provisioning of those resources." + ], + "uml-name": "adminisatratveState", + "controlType": [ + "locked", + "unlocked" + ] + }, + "lifecycle-state": { + "id": "lifecycle-state", + "uml-id": "_PzqZ0GgiEeWmgIwAIZlYKQ", + "uml-type": "ownedAttribute", + "type": "_YSsboGgiEeWmgIwAIZlYKQ", + "order-number": 4, + "is-read-only": false, + "description": [ + "Used to track the planned deployment, allocation to clients and withdrawal of resources." + ], + "uml-name": "lifecycleState", + "controlType": [ + "planned", + "potential", + "installed", + "pending-removal" + ] + }, + "general-directives": { + "id": "general-directives", + "uml-id": "_9hyUwD0TEeaRI-H69PghuA", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "GeneralDirectives" + }, + "necessary-initial-condition-constraints": { + "id": "necessary-initial-condition-constraints", + "uml-id": "_J_v_YD0WEeaRI-H69PghuA", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "NecessaryInitialConditionConstraints" + }, + "is-not": { + "id": "is-not", + "uml-id": "_pzNRQD3XEeaRI-H69PghuA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 1, + "is-read-only": false, + "uml-name": "IsNot", + "controlType": "checkbox" + }, + "operation-details": { + "id": "operation-details", + "uml-id": "_J5Hc0T0fEeaRI-H69PghuA", + "uml-type": "ownedAttribute", + "type": "_g1SeoD0UEeaRI-H69PghuA", + "order-number": 7, + "is-read-only": false, + "uml-name": "_operationDetails" + }, + "action-verb": { + "id": "action-verb", + "uml-id": "_93jegD0VEeaRI-H69PghuA", + "uml-type": "ownedAttribute", + "type": "_ljUl4D3WEeaRI-H69PghuA", + "order-number": 1, + "is-read-only": false, + "uml-name": "actionVerb", + "controlType": [ + "create-post-add", + "set-update-put-modify-write-add", + "get-read", + "delete-remove" + ] + }, + "necessary-initialcondition-constraints": { + "id": "necessary-initialcondition-constraints", + "uml-id": "_Kc7UgD0fEeaRI-H69PghuA", + "uml-type": "ownedAttribute", + "type": "_J_v_YD0WEeaRI-H69PghuA", + "order-number": 2, + "is-read-only": false, + "uml-name": "_necessaryInitialconditionConstraints" + }, + "operation-envelope": { + "id": "operation-envelope", + "uml-id": "_52IiYD0TEeaRI-H69PghuA", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "OperationEnvelope" + }, + "operation-set": { + "id": "operation-set", + "uml-id": "_c9yBkD0UEeaRI-H69PghuA", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "OperationSet" + }, + "generaldirectives": { + "id": "generaldirectives", + "uml-id": "_Ios90j0fEeaRI-H69PghuA", + "uml-type": "ownedAttribute", + "type": "_9hyUwD0TEeaRI-H69PghuA", + "order-number": 2, + "is-read-only": false, + "uml-name": "generaldirectives" + }, + "operationidentifiers": { + "id": "operationidentifiers", + "uml-id": "_JQNpwT0fEeaRI-H69PghuA", + "uml-type": "ownedAttribute", + "type": "_AZx1kD0UEeaRI-H69PghuA", + "order-number": 3, + "is-read-only": false, + "uml-name": "operationidentifiers" + }, + "operation-identifiers": { + "id": "operation-identifiers", + "uml-id": "_AZx1kD0UEeaRI-H69PghuA", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "OperationIdentifiers" + }, + "after-operation-set": { + "id": "after-operation-set", + "uml-id": "_olu8ID0UEeaRI-H69PghuA", + "uml-type": "ownedAttribute", + "type": "_c9yBkD0UEeaRI-H69PghuA", + "order-number": 1, + "is-read-only": false, + "uml-name": "_afterOperationSet" + }, + "before-operation-set": { + "id": "before-operation-set", + "uml-id": "_xIFXsj0UEeaRI-H69PghuA", + "uml-type": "ownedAttribute", + "type": "_c9yBkD0UEeaRI-H69PghuA", + "order-number": 2, + "is-read-only": false, + "uml-name": "_beforeOperationSet" + }, + "effort-and-action": { + "id": "effort-and-action", + "uml-id": "_GWLtID0VEeaRI-H69PghuA", + "uml-type": "ownedAttribute", + "type": "_L4Y9QE2DEeaGxdXEiNf4tA", + "order-number": 3, + "is-read-only": false, + "uml-name": "effortAndAction", + "controlType": [ + "best-effort", + "exact-match" + ] + }, + "pause-resume-rule": { + "id": "pause-resume-rule", + "uml-id": "_ObfAUD0VEeaRI-H69PghuA", + "uml-type": "ownedAttribute", + "type": "_ndXVME2DEeaGxdXEiNf4tA", + "order-number": 4, + "is-read-only": false, + "uml-name": "pauseResumeRule", + "controlType": [ + "no-pause-possible" + ] + }, + "operationset": { + "id": "operationset", + "uml-id": "_hsSioj0VEeaRI-H69PghuA", + "uml-type": "ownedAttribute", + "type": "_c9yBkD0UEeaRI-H69PghuA", + "order-number": 5, + "is-read-only": false, + "uml-name": "operationset" + }, + "is-short-lived": { + "id": "is-short-lived", + "uml-id": "_mdwtkD0VEeaRI-H69PghuA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 6, + "is-read-only": false, + "uml-name": "isShortLived", + "controlType": "checkbox" + }, + "conector-in-holder": { + "id": "conector-in-holder", + "uml-id": "_-zMBkkO-EeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "_o366YEONEeasL6dcjI1vEA", + "order-number": 1, + "is-read-only": false, + "uml-name": "conectorInHolder" + }, + "connector-on-equipment-for-holder": { + "id": "connector-on-equipment-for-holder", + "uml-id": "_s5FpwEONEeasL6dcjI1vEA", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "A rule class (an abstract specialization of Connector) that represents a connector on an equipment that is intended to mate with a connector in a holder." + ], + "uml-name": "ConnectorOnEquipmentForHolder" + }, + "connector-cable-end": { + "id": "connector-cable-end", + "uml-id": "_KCS_IkOPEeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "_6hyUEEONEeasL6dcjI1vEA", + "order-number": 1, + "is-read-only": false, + "uml-name": "connectorCableEnd" + }, + "connector-on-equipment-for-cable": { + "id": "connector-on-equipment-for-cable", + "uml-id": "_1OKeUEONEeasL6dcjI1vEA", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "A rule class (an abstract specialization of Connector) that represents a connector exposed on an equipment such that a cable may be plugged in." + ], + "uml-name": "ConnectorOnEquipmentForCable" + }, + "function-enablers": { + "id": "function-enablers", + "uml-id": "_1vzsYERJEeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "_N-qJ8EQyEeasL6dcjI1vEA", + "order-number": 8, + "is-read-only": false, + "uml-name": "_functionEnablers" + }, + "power-state": { + "id": "power-state", + "uml-id": "_Q9fSkEQyEeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "_aL8EoGnNEeaBUOurxzA2sw", + "order-number": 1, + "is-read-only": false, + "uml-name": "powerState" + }, + "mechanical-functions": { + "id": "mechanical-functions", + "uml-id": "_KxkFYEQ-EeasL6dcjI1vEA", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Represents the dynamic aspects of the mechanical functions of the equipment." + ], + "uml-name": "MechanicalFunctions" + }, + "rotation-speed": { + "id": "rotation-speed", + "uml-id": "_M1XJIEQ-EeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "_aL8EoGnNEeaBUOurxzA2sw", + "order-number": 1, + "is-read-only": false, + "uml-name": "rotationSpeed" + }, + "physical-properties": { + "id": "physical-properties", + "uml-id": "_t0pzs0RJEeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "_QloVwEQ-EeasL6dcjI1vEA", + "order-number": 7, + "is-read-only": false, + "uml-name": "_physicalProperties" + }, + "temperature": { + "id": "temperature", + "uml-id": "_Vlnd0EQ-EeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "_aL8EoGnNEeaBUOurxzA2sw", + "order-number": 1, + "is-read-only": false, + "uml-name": "temperature" + }, + "holder-monitors": { + "id": "holder-monitors", + "uml-id": "_6K62skRSEeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "_5vdx8EQfEeasL6dcjI1vEA", + "order-number": 4, + "is-read-only": false, + "uml-name": "_holderMonitors" + }, + "is-active": { + "id": "is-active", + "uml-id": "_KFzmEERTEeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 1, + "is-read-only": false, + "uml-name": "isActive", + "controlType": "checkbox" + }, + "is-actual-mismatch-with-expected": { + "id": "is-actual-mismatch-with-expected", + "uml-id": "_XRKNEERTEeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 2, + "is-read-only": false, + "uml-name": "isActualMismatchWithExpected", + "controlType": "checkbox" + }, + "aggregate-function": { + "id": "aggregate-function", + "uml-id": "_VHOWskglEeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "_8SXNZT-HEeaRI-H69PghuA", + "order-number": 3, + "is-read-only": false, + "uml-name": "_aggregateFunction" + }, + "location": { + "id": "location", + "uml-id": "_lNf7kHpKEeaVjtpstJMDXA", + "uml-type": "ownedAttribute", + "type": "_bh_VAHpJEeaVjtpstJMDXA", + "order-number": 18, + "is-read-only": false, + "uml-name": "_location" + }, + "equipment-location": { + "id": "equipment-location", + "uml-id": "_RUXMYEQwEeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "_A15msMDaEeWbqPZwR-Ot6A", + "order-number": 1, + "is-read-only": false, + "uml-name": "equipmentLocation" + }, + "geographical-location": { + "id": "geographical-location", + "uml-id": "_XOQ_AEQwEeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "_A15msMDaEeWbqPZwR-Ot6A", + "order-number": 2, + "is-read-only": false, + "uml-name": "geographicalLocation" + }, + "category": { + "id": "category", + "uml-id": "_jbGZ8Ec-EeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "_WCZv8Ec9EeasL6dcjI1vEA", + "order-number": 12, + "is-read-only": false, + "uml-name": "_category" + }, + "equipment-instance": { + "id": "equipment-instance", + "uml-id": "_CE4sUkRCEeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "_UB7QwEQuEeasL6dcjI1vEA", + "order-number": 3, + "is-read-only": false, + "uml-name": "_equipmentInstance" + }, + "manufacture-date": { + "id": "manufacture-date", + "uml-id": "_YrPlQEQuEeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "_G1gboD4AEeaRI-H69PghuA", + "order-number": 1, + "is-read-only": false, + "uml-name": "manufactureDate" + }, + "serial-number": { + "id": "serial-number", + "uml-id": "_cpqioEQuEeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "_G1gboD4AEeaRI-H69PghuA", + "order-number": 2, + "is-read-only": false, + "uml-name": "serialNumber" + }, + "asset-instance-identifier": { + "id": "asset-instance-identifier", + "uml-id": "_yWCIcEQuEeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "_G1gboD4AEeaRI-H69PghuA", + "order-number": 3, + "is-read-only": false, + "uml-name": "assetInstanceIdentifier" + }, + "equipment-type": { + "id": "equipment-type", + "uml-id": "_1KggkERBEeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "_BP8YcEQuEeasL6dcjI1vEA", + "order-number": 2, + "is-read-only": false, + "uml-name": "_equipmentType" + }, + "description": { + "id": "description", + "uml-id": "_-5svQEQsEeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "_G1gboD4AEeaRI-H69PghuA", + "order-number": 1, + "is-read-only": false, + "uml-name": "description" + }, + "model-identifier": { + "id": "model-identifier", + "uml-id": "_oUmxsEQsEeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "_G1gboD4AEeaRI-H69PghuA", + "order-number": 2, + "is-read-only": false, + "uml-name": "modelIdentifier" + }, + "part-type-identifier": { + "id": "part-type-identifier", + "uml-id": "_3ypNAEQsEeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "_G1gboD4AEeaRI-H69PghuA", + "order-number": 3, + "is-read-only": false, + "uml-name": "partTypeIdentifier" + }, + "type-name": { + "id": "type-name", + "uml-id": "_j105QEQsEeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "_G1gboD4AEeaRI-H69PghuA", + "order-number": 4, + "is-read-only": false, + "uml-name": "typeName" + }, + "version": { + "id": "version", + "uml-id": "_mig3EEQuEeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "_G1gboD4AEeaRI-H69PghuA", + "order-number": 5, + "is-read-only": false, + "uml-name": "version" + }, + "holder-structure": { + "id": "holder-structure", + "uml-id": "_U93mQEc8EeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "_0U3TwEc7EeasL6dcjI1vEA", + "order-number": 7, + "is-read-only": false, + "uml-name": "_holderStructure" + }, + "holder-category": { + "id": "holder-category", + "uml-id": "_r240kERLEeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "_0K-KoERLEeasL6dcjI1vEA", + "order-number": 1, + "is-read-only": false, + "uml-name": "holderCategory", + "controlType": [ + "slot" + ] + }, + "is-captive": { + "id": "is-captive", + "uml-id": "_4XbukERMEeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 2, + "is-read-only": false, + "uml-name": "isCaptive", + "controlType": "checkbox" + }, + "is-guided": { + "id": "is-guided", + "uml-id": "_-1CEIERMEeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 3, + "is-read-only": false, + "uml-name": "isGuided", + "controlType": "checkbox" + }, + "is-quantised-space": { + "id": "is-quantised-space", + "uml-id": "_Lj7_sERNEeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 4, + "is-read-only": false, + "uml-name": "isQuantisedSpace", + "controlType": "checkbox" + }, + "manufactured-thing": { + "id": "manufactured-thing", + "uml-id": "_XtDuokRCEeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "_GgBQUERBEeasL6dcjI1vEA", + "order-number": 4, + "is-read-only": false, + "uml-name": "_manufacturedThing" + }, + "manufacturer-properties": { + "id": "manufacturer-properties", + "uml-id": "_gdoY8EQtEeasL6dcjI1vEA", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Represents the properties of the manufacturer." + ], + "uml-name": "ManufacturerProperties" + }, + "operator-augmented-equipment-type": { + "id": "operator-augmented-equipment-type", + "uml-id": "_Yw99EEc_EeasL6dcjI1vEA", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Represents the invariant properties of the equipment asset allocated by the operator that define and characterise the type." + ], + "uml-name": "OperatorAugmentedEquipmentType" + }, + "manufacturer-identifier": { + "id": "manufacturer-identifier", + "uml-id": "_VTQLMEQtEeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "_G1gboD4AEeaRI-H69PghuA", + "order-number": 1, + "is-read-only": false, + "uml-name": "manufacturerIdentifier" + }, + "manufacturer-name": { + "id": "manufacturer-name", + "uml-id": "_cC-A8EQsEeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "_G1gboD4AEeaRI-H69PghuA", + "order-number": 2, + "is-read-only": false, + "uml-name": "manufacturerName" + }, + "mechanical-features": { + "id": "mechanical-features", + "uml-id": "_X1TkUkRFEeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "_qZGr8EQfEeasL6dcjI1vEA", + "order-number": 6, + "is-read-only": false, + "uml-name": "_mechanicalFeatures" + }, + "asset-type-identifier": { + "id": "asset-type-identifier", + "uml-id": "_uHNXkEQuEeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "_G1gboD4AEeaRI-H69PghuA", + "order-number": 1, + "is-read-only": false, + "uml-name": "assetTypeIdentifier" + }, + "physical-characteristics": { + "id": "physical-characteristics", + "uml-id": "_Kiw98URKEeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "_TsDsQEQfEeasL6dcjI1vEA", + "order-number": 10, + "is-read-only": false, + "uml-name": "_physicalCharacteristics" + }, + "weight-characeristics": { + "id": "weight-characeristics", + "uml-id": "_87dRMEQ9EeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "_aL8EoGnNEeaBUOurxzA2sw", + "order-number": 1, + "is-read-only": false, + "uml-name": "weightCharaceristics" + }, + "fire-characteristics": { + "id": "fire-characteristics", + "uml-id": "__oPnkEQ9EeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "_aL8EoGnNEeaBUOurxzA2sw", + "order-number": 2, + "is-read-only": false, + "uml-name": "fireCharacteristics" + }, + "materials": { + "id": "materials", + "uml-id": "_BoTa0EQ-EeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "_aL8EoGnNEeaBUOurxzA2sw", + "order-number": 3, + "is-read-only": false, + "uml-name": "materials" + }, + "physical-rating": { + "id": "physical-rating", + "uml-id": "_EjPzoUdMEeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "_SRtkMEdLEeasL6dcjI1vEA", + "order-number": 8, + "is-read-only": false, + "uml-name": "_physicalRating" + }, + "thermal-rating": { + "id": "thermal-rating", + "uml-id": "_fDkGEEdLEeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "_aL8EoGnNEeaBUOurxzA2sw", + "order-number": 1, + "is-read-only": false, + "uml-name": "thermalRating" + }, + "power-rating": { + "id": "power-rating", + "uml-id": "_i-N9wEdLEeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "_aL8EoGnNEeaBUOurxzA2sw", + "order-number": 2, + "is-read-only": false, + "uml-name": "powerRating" + }, + "position": { + "id": "position", + "uml-id": "_4DkhskddEeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "_FWDLAERWEeasL6dcjI1vEA", + "order-number": 1, + "is-read-only": false, + "uml-name": "_position" + }, + "relative-position": { + "id": "relative-position", + "uml-id": "_U_6mYERXEeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "_aL8EoGnNEeaBUOurxzA2sw", + "order-number": 1, + "is-read-only": false, + "uml-name": "relativePosition" + }, + "spatial-properties-of-type": { + "id": "spatial-properties-of-type", + "uml-id": "_bAAS0kRSEeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "_LAvh8EQfEeasL6dcjI1vEA", + "order-number": 3, + "is-read-only": false, + "uml-name": "_spatialPropertiesOfType" + }, + "height": { + "id": "height", + "uml-id": "_k_CVUEQyEeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "_aL8EoGnNEeaBUOurxzA2sw", + "order-number": 1, + "is-read-only": false, + "uml-name": "height" + }, + "width": { + "id": "width", + "uml-id": "_n6nVoEQyEeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "_aL8EoGnNEeaBUOurxzA2sw", + "order-number": 2, + "is-read-only": false, + "uml-name": "width" + }, + "length": { + "id": "length", + "uml-id": "_uIPVgEQyEeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "_aL8EoGnNEeaBUOurxzA2sw", + "order-number": 3, + "is-read-only": false, + "uml-name": "length" + }, + "swapability": { + "id": "swapability", + "uml-id": "_wwGXEUc8EeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "_kr_E8Ec8EeasL6dcjI1vEA", + "order-number": 11, + "is-read-only": false, + "uml-name": "_swapability" + }, + "is-hot-swappable": { + "id": "is-hot-swappable", + "uml-id": "_yb3zEEQgEeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 1, + "is-read-only": false, + "uml-name": "isHotSwappable", + "controlType": "checkbox" + }, + "cable": { + "id": "cable", + "uml-id": "_8SXNbD-HEeaRI-H69PghuA", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Basic model representing a cable with connectors fitted where the cable is short (e.g. patch cord, in-station cabling). This is intentionally a very basic representation of a cable. In a more sophisticated representation cable ends might be represented that then associate to the attached connector. At this point it is assumed that the basic model is sufficient." + ], + "uml-name": "Cable" + }, + "connector": { + "id": "connector", + "uml-id": "_8SXNcD-HEeaRI-H69PghuA", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Represents a connector that may be fully exposed (e.g. to plug in a cable or on the end of a cable) or partially exposed (e.g. backplane to plug in another piece of equipment such as a module)." + ], + "uml-name": "Connector" + }, + "pin": { + "id": "pin", + "uml-id": "_8SXNnT-HEeaRI-H69PghuA", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "An individual physical connection point (male or female). May be capable of carrying electrical or optical signals. A pin may have more than one wire/fiber attached but is such that all attached things get exactly the same signal set." + ], + "uml-name": "Pin" + }, + "orientation": { + "id": "orientation", + "uml-id": "_DKSfwGpCEeaBUOurxzA2sw", + "uml-type": "ownedAttribute", + "type": "_y2WM8EQ-EeasL6dcjI1vEA", + "order-number": 2, + "is-read-only": false, + "uml-name": "orientation", + "controlType": [ + "male", + "female", + "symmetric-neutral" + ] + }, + "pin-layout": { + "id": "pin-layout", + "uml-id": "_Fzd-QEQ_EeasL6dcjI1vEA", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "The structuring of pins in a connector." + ], + "uml-name": "PinLayout" + }, + "connector-type": { + "id": "connector-type", + "uml-id": "_NBXLMEgXEeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "_aL8EoGnNEeaBUOurxzA2sw", + "order-number": 8, + "is-read-only": false, + "uml-name": "connectorType" + }, + "equipment": { + "id": "equipment", + "uml-id": "_8SXNej-HEeaRI-H69PghuA", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Represents any relevant physical thing. Can be either field replaceable or not field replaceable. Note: The model is currently constrained to inside plant." + ], + "uml-name": "Equipment" + }, + "contained-holder": { + "id": "contained-holder", + "uml-id": "_ayDQMj-NEeaRI-H69PghuA", + "uml-type": "ownedAttribute", + "type": "_8SXNjj-HEeaRI-H69PghuA", + "order-number": 2, + "is-read-only": false, + "uml-name": "_containedHolder" + }, + "exposed-cable": { + "id": "exposed-cable", + "uml-id": "_Fy4CYj-fEeaRI-H69PghuA", + "uml-type": "ownedAttribute", + "type": "_8SXNbD-HEeaRI-H69PghuA", + "order-number": 3, + "is-read-only": false, + "uml-name": "_exposedCable" + }, + "mechanicall-functions": { + "id": "mechanicall-functions", + "uml-id": "_-Ci-o0RJEeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "_KxkFYEQ-EeasL6dcjI1vEA", + "order-number": 9, + "is-read-only": false, + "uml-name": "_mechanicallFunctions" + }, + "is-field-replaceable": { + "id": "is-field-replaceable", + "uml-id": "_f1p94D-WEeaRI-H69PghuA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 14, + "is-read-only": true, + "description": [ + "Indicates whether or not the equipment can be removed and replaced in the field (i.e. in a deployment) by normal operations personnel." + ], + "uml-name": "isFieldReplaceable", + "controlType": "checkbox" + }, + "function-block": { + "id": "function-block", + "uml-id": "_8SXNfj-HEeaRI-H69PghuA", + "uml-type": "ownedAttribute", + "type": "_8SXNiz-HEeaRI-H69PghuA", + "order-number": 15, + "is-read-only": false, + "uml-name": "_functionBlock" + }, + "expected-equipment": { + "id": "expected-equipment", + "uml-id": "_8SXNfz-HEeaRI-H69PghuA", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "A definition of the restrictions on the equipment that is expected to be present in the physical network at a particular place . The expected equipment will state the type and may constrain any other invariant properties. It may also provide desired ranges for dynami properties." + ], + "uml-name": "ExpectedEquipment" + }, + "actual-equipment": { + "id": "actual-equipment", + "uml-id": "_8SXNZD-HEeaRI-H69PghuA", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "The equipment that is actually present in the physical network. It will expose all dynamic properties and some critical static properties." + ], + "uml-name": "ActualEquipment" + }, + "holder": { + "id": "holder", + "uml-id": "_8SXNjj-HEeaRI-H69PghuA", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Represents a space in an equipment in which another equipment can be fitted in the field." + ], + "uml-name": "Holder" + }, + "occupying-fru": { + "id": "occupying-fru", + "uml-id": "_X1q3Qj-QEeaRI-H69PghuA", + "uml-type": "ownedAttribute", + "type": "_8SXNej-HEeaRI-H69PghuA", + "order-number": 2, + "is-read-only": false, + "description": [ + "The FRU that is occupying the holder. A holder may be unoccupied. An FRU may occupy more hat one holder (using or blocking are intentionally not distinguished here)." + ], + "uml-name": "_occupyingFru" + }, + "holder-location": { + "id": "holder-location", + "uml-id": "_l6LE4ERTEeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "_A15msMDaEeWbqPZwR-Ot6A", + "order-number": 5, + "is-read-only": false, + "uml-name": "holderLocation" + }, + "supported-equipment": { + "id": "supported-equipment", + "uml-id": "_RKzmokg0EeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "_Ghvk8EguEeasL6dcjI1vEA", + "order-number": 9, + "is-read-only": false, + "uml-name": "_supportedEquipment" + }, + "expected-holder": { + "id": "expected-holder", + "uml-id": "_MEUpIEmhEeaDccCv6BIgdg", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "A definition of a holder expected in the ActualEquipment (i.e. an ActualHolder) as part of the constraints provided by the ExpectedEquipment." + ], + "uml-name": "ExpectedHolder" + }, + "actual-holder": { + "id": "actual-holder", + "uml-id": "_NwJ40EmhEeaDccCv6BIgdg", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "A holder in the ActualEquipment." + ], + "uml-name": "ActualHolder" + }, + "pin-group": { + "id": "pin-group", + "uml-id": "_8SXNrj-HEeaRI-H69PghuA", + "uml-type": "ownedAttribute", + "type": "_8SXNnj-HEeaRI-H69PghuA", + "order-number": 1, + "is-read-only": false, + "uml-name": "_pinGroup" + }, + "port": { + "id": "port", + "uml-id": "_8SXNpD-HEeaRI-H69PghuA", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "A conceptual access point for a group of signals (where that group of signals cannot be separated)." + ], + "uml-name": "Port" + }, + "signal-ref-pt": { + "id": "signal-ref-pt", + "uml-id": "_8SXNrz-HEeaRI-H69PghuA", + "uml-type": "ownedAttribute", + "type": "_8SXNqz-HEeaRI-H69PghuA", + "order-number": 2, + "is-read-only": false, + "uml-name": "_signalRefPt" + }, + "elemental-signals": { + "id": "elemental-signals", + "uml-id": "_B4oXwEddEeasL6dcjI1vEA", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "The elemental (sub-atomic) parts of an indivisible signal where processing in the LTP is required to extract the elemental signals." + ], + "uml-name": "ElementalSignals" + }, + "signal-ref-pt-group": { + "id": "signal-ref-pt-group", + "uml-id": "_8SXNrT-HEeaRI-H69PghuA", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "A physical indivisible group of signals." + ], + "uml-name": "SignalRefPtGroup" + }, + "group-of-pins": { + "id": "group-of-pins", + "uml-id": "_uMSwAEdcEeasL6dcjI1vEA", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "A group of pins from one or more connectors relevant for some purpose." + ], + "uml-name": "GroupOfPins" + }, + "port-role": { + "id": "port-role", + "uml-id": "_DUU_sGZ_EeWrX_JIGzXlSg", + "uml-type": "uml:DataType", + "description": [ + "The role of a port in the context of the function of the forwarding entity that it bounds." + ], + "uml-name": "PortRole" + }, + "protection-type": { + "id": "protection-type", + "uml-id": "_c3Hu8Gb3EeWrX_JIGzXlSg", + "uml-type": "uml:DataType", + "description": [ + "Identifies the type of protection of an FcSwitch." + ], + "uml-name": "ProtectionType" + }, + "date-and-time": { + "id": "date-and-time", + "uml-id": "_oGqi1lLNEeO75dO39GbF8Q", + "uml-type": "uml:DataType", + "description": [ + "This primitive type defines the date and time according to the following structure: yyyyMMddhhmmss.s[Z|{+|-}HHMm] where: yyyy 0000 .. 9999 year MM 01 .. 12 month dd 01 .. 31 day hh 00 .. 23 hour mm 00 .. 59 minute ss 00 .. 59 second s .0 .. .9 tenth of second (set to .0 if EMS or NE cannot support this granularity) Z Z indicates UTC (rather than local time) {+|-} + or - delta from UTC HH 00 .. 23 time zone difference in hours Mm 00 .. 59 time zone difference in minutes." + ], + "uml-name": "DateAndTime" + }, + "to-be-defined": { + "id": "to-be-defined", + "uml-id": "_aL8EoGnNEeaBUOurxzA2sw", + "uml-type": "uml:DataType", + "description": [ + "This type is used when the actual type of the attrbute is expected to be complex but where the type has not yet been developed. This type should only be used for attributes that are experimental." + ], + "uml-name": "ToBeDefined" + }, + "name-and-value": { + "id": "name-and-value", + "uml-id": "_y7oy8I3tEeO38ZmbECnvbg", + "uml-type": "uml:DataType", + "description": [ + "A scoped name-value pair." + ], + "uml-name": "NameAndValue" + }, + "value-name": { + "id": "value-name", + "uml-id": "_77PyQI3tEeO38ZmbECnvbg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 1, + "is-read-only": false, + "description": [ + "The name of the value. The value need not have a name." + ], + "uml-name": "valueName", + "controlType": "text" + }, + "value": { + "id": "value", + "uml-id": "_cbx2gI30EeO38ZmbECnvbg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 1, + "is-read-only": false, + "description": [ + "The specific value of the universal id." + ], + "uml-name": "value", + "controlType": "text" + }, + "universal-id": { + "id": "universal-id", + "uml-id": "_SU3Q4I30EeO38ZmbECnvbg", + "uml-type": "uml:DataType", + "description": [ + "The universal ID value where the mechanism for generation is defined by some authority not directly referenced in the structure. A example structure is [IETF RFC4122]." + ], + "uml-name": "UniversalId" + }, + "address": { + "id": "address", + "uml-id": "_A15msMDaEeWbqPZwR-Ot6A", + "uml-type": "uml:DataType", + "description": [ + "A description of location via a hierarchy of narrowing contexts." + ], + "uml-name": "Address" + }, + "address-name": { + "id": "address-name", + "uml-id": "_W76bkMDaEeWbqPZwR-Ot6A", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 1, + "is-read-only": false, + "description": [ + "The name of the address (to allow the specific hierarchy to be distinguished from others for the same entity)." + ], + "uml-name": "addressName", + "controlType": "text" + }, + "address-element": { + "id": "address-element", + "uml-id": "_M_WWsMDYEeWbqPZwR-Ot6A", + "uml-type": "uml:DataType", + "description": [ + "One element of a hierarchy of elements. Note that the element must have one and only one value chosen from a list of potential value types." + ], + "uml-name": "AddressElement" + }, + "local-id-and-class": { + "id": "local-id-and-class", + "uml-id": "_dCdzAMDuEeWbqPZwR-Ot6A", + "uml-type": "uml:DataType", + "description": [ + "The localId and the class of entity that it identifies." + ], + "uml-name": "LocalIdAndClass" + }, + "class-of-instance": { + "id": "class-of-instance", + "uml-id": "_NBaUwMDvEeWbqPZwR-Ot6A", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 1, + "is-read-only": false, + "description": [ + "The class to which the name refers." + ], + "uml-name": "classOfInstance", + "controlType": "text" + }, + "name-and-class": { + "id": "name-and-class", + "uml-id": "_XUarEMDuEeWbqPZwR-Ot6A", + "uml-type": "uml:DataType", + "description": [ + "The name and the class of entity that it names." + ], + "uml-name": "NameAndClass" + }, + "address-element-name": { + "id": "address-element-name", + "uml-id": "_3mdl0MpUEeWSlYzRfsq8lQ", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 1, + "is-read-only": false, + "description": [ + "The name of the address element (e.g. shelf as an element of a shelf/slot/port addressing scheme). The remainder of the structure has the reference for the shelf." + ], + "uml-name": "addressElementName", + "controlType": "text" + }, + "arbitrary-element": { + "id": "arbitrary-element", + "uml-id": "_nPsCsMDzEeWbqPZwR-Ot6A", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 5, + "is-read-only": false, + "description": [ + "Where the element is from some external model that is not formally represented in this model." + ], + "uml-name": "arbitraryElement", + "controlType": "text" + }, + "2-wp-c8-ec7-ee-wxh-l2-b6-peg6-a": { + "id": "2-wp-c8-ec7-ee-wxh-l2-b6-peg6-a", + "uml-id": "_2WpC8EC7EeWxhL2B6Peg6A", + "enum": [ + "BIDIRECTIONAL", + "INPUT", + "OUTPUT", + "UNIDENTIFIED_OR_UNKNOWN" + ], + "is-read-only": false, + "description": [ + "The orientation of flow at the Port of a Forwarding entity" + ], + "uml-name": "_2WpC8EC7EeWxhL2B6Peg6A" + }, + "d-v67-aec8-ee-wxh-l2-b6-peg6-a": { + "id": "d-v67-aec8-ee-wxh-l2-b6-peg6-a", + "uml-id": "_dV67AEC8EeWxhL2B6Peg6A", + "enum": [ + "BIDIRECTIONAL", + "UNIDIRECTIONAL", + "UNDEFINED_OR_UNKNOWN" + ], + "is-read-only": false, + "description": [ + "The directionality of a Forwarding entity." + ], + "uml-name": "_dV67AEC8EeWxhL2B6Peg6A" + }, + "rwilyeda-ee-w-qe-o-kb-n-up-p9-a": { + "id": "rwilyeda-ee-w-qe-o-kb-n-up-p9-a", + "uml-id": "_RWILYEDAEeWQeOKbNUpP9A", + "enum": [ + "BIDIRECTIONAL", + "SINK", + "SOURCE", + "UNDEFINED_OR_UNKNOWN" + ], + "is-read-only": false, + "description": [ + "The directionality of a termination entity." + ], + "uml-name": "_RWILYEDAEeWQeOKbNUpP9A" + }, + "t5-gyk-edn-ee-w-qe-o-kb-n-up-p9-a": { + "id": "t5-gyk-edn-ee-w-qe-o-kb-n-up-p9-a", + "uml-id": "_T5GykEDNEeWQeOKbNUpP9A", + "enum": [ + "CONTRA_DIRECTION_SINK", + "CONTRA_DIRECTION_SOURCE" + ], + "is-read-only": false, + "description": [ + "Extended to include contra-direction considerations. Only applies to LP and elements of LP not to LTP." + ], + "uml-name": "_T5GykEDNEeWQeOKbNUpP9A" + }, + "6-an-g8-ge-e-ee-wmg-iw-ai-zl-ykq": { + "id": "6-an-g8-ge-e-ee-wmg-iw-ai-zl-ykq", + "uml-id": "_6anG8GeEEeWmgIwAIZlYKQ", + "enum": [ + "LP_CAN_NEVER_TERMINATE", + "LT_NOT_TERMINATED", + "TERMINATED_SERVER_TO_CLIENT_FLOW", + "TERMINATED_CLIENT_TO_SERVER_FLOW", + "TERMINATED_BIDIRECTIONAL", + "LT_PERMENANTLY_TERMINATED", + "TERMINATION_STATE_UNKNOWN" + ], + "is-read-only": false, + "description": [ + "Provides support for the range of behaviours and specific states that an LP can take with respect to termination of the signal. Indicates to what degree the LayerTermination is terminated." + ], + "uml-name": "_6anG8GeEEeWmgIwAIZlYKQ" + }, + "sthcg-ci-eea-g-gv-axx-se1-u-a": { + "id": "sthcg-ci-eea-g-gv-axx-se1-u-a", + "uml-id": "_sthcgCi-EeaGGvAxxSe1uA", + "enum": [ + "WAIT_TO_REVERT", + "SIGNAL_DEGRADE", + "SIGNAL_FAIL" + ], + "is-read-only": false, + "description": [ + "The cause of the current protection state." + ], + "uml-name": "_sthcgCi-EeaGGvAxxSe1uA" + }, + "y-i-kvs-mog-ee-ww-z527-phf-fsa": { + "id": "y-i-kvs-mog-ee-ww-z527-phf-fsa", + "uml-id": "_yIKvsMOGEeWwZ527PhfFSA", + "enum": [ + "LOCK_OUT" + ], + "is-read-only": false, + "description": [ + "Possible degrees of administrative control applied to the Route selection." + ], + "uml-name": "_yIKvsMOGEeWwZ527PhfFSA" + }, + "csw-hk-ci-eea-g-gv-axx-se1-u-a": { + "id": "csw-hk-ci-eea-g-gv-axx-se1-u-a", + "uml-id": "_cswHkCi-EeaGGvAxxSe1uA", + "enum": [], + "is-read-only": false, + "description": [ + "The cause of the current route selection." + ], + "uml-name": "_cswHkCi-EeaGGvAxxSe1uA" + }, + "e-7-dymof-ee-ww-z527-phf-fsa": { + "id": "e-7-dymof-ee-ww-z527-phf-fsa", + "uml-id": "_e-7DYMOFEeWwZ527PhfFSA", + "enum": [ + "NORMAL", + "MANUAL", + "FORCED" + ], + "is-read-only": false, + "uml-name": "_e-7DYMOFEeWwZ527PhfFSA" + }, + "z-r-kl-i-ci9-eea-g-gv-axx-se1-u-a": { + "id": "z-r-kl-i-ci9-eea-g-gv-axx-se1-u-a", + "uml-id": "_zRKlICi9EeaGGvAxxSe1uA", + "enum": [], + "is-read-only": false, + "description": [ + "Explains the reason for the current switch state." + ], + "uml-name": "_zRKlICi9EeaGGvAxxSe1uA" + }, + "o-gqjf1-ln-ee-o75-d-o39-gb-f8-q": { + "id": "o-gqjf1-ln-ee-o75-d-o39-gb-f8-q", + "uml-id": "_oGqjf1LNEeO75dO39GbF8Q", + "enum": [ + "REVERTIVE", + "NON-REVERTIVE" + ], + "is-read-only": false, + "description": [ + "The reversion mode associated with protection." + ], + "uml-name": "_oGqjf1LNEeO75dO39GbF8Q" + }, + "l-nclk-l-et-ee-sz-ud-yf-p-sdgew": { + "id": "l-nclk-l-et-ee-sz-ud-yf-p-sdgew", + "uml-id": "_lNclkLEtEeSZUdYfPSdgew", + "enum": [ + "DISABLED", + "ENABLED" + ], + "is-read-only": false, + "description": [ + "The possible values of the operationalState." + ], + "uml-name": "_lNclkLEtEeSZUdYfPSdgew" + }, + "kskoyl-eu-ee-sz-ud-yf-p-sdgew": { + "id": "kskoyl-eu-ee-sz-ud-yf-p-sdgew", + "uml-id": "_KSKOYLEuEeSZUdYfPSdgew", + "enum": [ + "LOCKED", + "UNLOCKED" + ], + "is-read-only": false, + "description": [ + "The possible values of the administrativeState." + ], + "uml-name": "_KSKOYLEuEeSZUdYfPSdgew" + }, + "-x-pe-al-ev-ee-sz-ud-yf-p-sdgew": { + "id": "-x-pe-al-ev-ee-sz-ud-yf-p-sdgew", + "uml-id": "_-xPeALEvEeSZUdYfPSdgew", + "enum": [ + "UNLOCK", + "LOCK_PASSIVE", + "LOCK_ACTIVE", + "LOCK_IMMEDIATE" + ], + "is-read-only": false, + "description": [ + "The possible values of the current target administrative state.", + "Reflects the current control action when the entity is not in the desired state." + ], + "uml-name": "_-xPeALEvEeSZUdYfPSdgew" + }, + "mcyhc-gge-ee-wmg-iw-ai-zl-ykq": { + "id": "mcyhc-gge-ee-wmg-iw-ai-zl-ykq", + "uml-id": "_McyhcGgeEeWmgIwAIZlYKQ", + "enum": [ + "SHUTTING_DOWN_ACTIVE", + "SHUTTING_DOWN_PASSIVE" + ], + "is-read-only": false, + "description": [ + "Possible extensions to AdministrativeState." + ], + "uml-name": "_McyhcGgeEeWmgIwAIZlYKQ" + }, + "y-ssbo-ggi-ee-wmg-iw-ai-zl-ykq": { + "id": "y-ssbo-ggi-ee-wmg-iw-ai-zl-ykq", + "uml-id": "_YSsboGgiEeWmgIwAIZlYKQ", + "enum": [ + "PLANNED", + "POTENTIAL", + "INSTALLED", + "PENDING_REMOVAL" + ], + "is-read-only": false, + "description": [ + "The possible values of the lifecycleState." + ], + "uml-name": "_YSsboGgiEeWmgIwAIZlYKQ" + }, + "lj-ul4-d3-w-eea-ri-h69-pghu-a": { + "id": "lj-ul4-d3-w-eea-ri-h69-pghu-a", + "uml-id": "_ljUl4D3WEeaRI-H69PghuA", + "enum": [ + "CREATE_POST_ADD", + "SET_UPDATE_PUT_MODIFY_WRITE_ADD", + "GET_READ", + "DELETE_REMOVE" + ], + "is-read-only": false, + "uml-name": "_ljUl4D3WEeaRI-H69PghuA" + }, + "iyt74-d3-k-eea-ri-h69-pghu-a": { + "id": "iyt74-d3-k-eea-ri-h69-pghu-a", + "uml-id": "_IYT74D3kEeaRI-H69PghuA", + "enum": [ + "STRUCTURE_IS_NOT", + "NEW_STRUCTURE_AND_VALUES", + "INCREMENTAL_STRUCTURE_AND_VALUES", + "ONLY_VALUES_IN_EXISTING_STRUCTURE", + "DEFINED_BY_VERB" + ], + "is-read-only": false, + "uml-name": "_IYT74D3kEeaRI-H69PghuA" + }, + "l4-y9-qe2-d-eea-gxd-x-ei-nf4-t-a": { + "id": "l4-y9-qe2-d-eea-gxd-x-ei-nf4-t-a", + "uml-id": "_L4Y9QE2DEeaGxdXEiNf4tA", + "enum": [ + "BEST_EFFORT", + "EXACT_MATCH" + ], + "is-read-only": false, + "uml-name": "_L4Y9QE2DEeaGxdXEiNf4tA" + }, + "nd-xvme2-d-eea-gxd-x-ei-nf4-t-a": { + "id": "nd-xvme2-d-eea-gxd-x-ei-nf4-t-a", + "uml-id": "_ndXVME2DEeaGxdXEiNf4tA", + "enum": [ + "NO_PAUSE_POSSIBLE" + ], + "is-read-only": false, + "uml-name": "_ndXVME2DEeaGxdXEiNf4tA" + }, + "y2-wm8-eq-eeas-l6-dcj-i1-v-ea": { + "id": "y2-wm8-eq-eeas-l6-dcj-i1-v-ea", + "uml-id": "_y2WM8EQ-EeasL6dcjI1vEA", + "enum": [ + "MALE", + "FEMALE", + "SYMMETRIC_NEUTRAL" + ], + "is-read-only": false, + "description": [ + "Most connector schems are asymmetric such that there are two orientations of the connector where a mating is only possible between two connectors of different orientations. A multi-pin connector may have a mix of pin orientations. In this case it is expected that the dominant orientation of pin is chosen for the connector orientation." + ], + "uml-name": "_y2WM8EQ-EeasL6dcjI1vEA" + }, + "m-mo-bg-e-qv-eeas-l6-dcj-i1-v-ea": { + "id": "m-mo-bg-e-qv-eeas-l6-dcj-i1-v-ea", + "uml-id": "_mMOBgEQvEeasL6dcjI1vEA", + "enum": [ + "SUBRACK", + "CIRCUIT_PACK", + "SMALL_FORMFACTOR_PLUGGABLE", + "STAND_ALONE_UNIT", + "RACK" + ], + "is-read-only": false, + "description": [ + "The form of equipment." + ], + "uml-name": "_mMOBgEQvEeasL6dcjI1vEA" + }, + "0-k-ko-erl-eeas-l6-dcj-i1-v-ea": { + "id": "0-k-ko-erl-eeas-l6-dcj-i1-v-ea", + "uml-id": "_0K-KoERLEeasL6dcjI1vEA", + "enum": [ + "SLOT" + ], + "is-read-only": false, + "description": [ + "The form of holder." + ], + "uml-name": "_0K-KoERLEeasL6dcjI1vEA" + } + } +} \ No newline at end of file diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/elasticsearch/index/mwtn/modelDescription/g.874.1-model.schema-information.json b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/elasticsearch/index/mwtn/modelDescription/g.874.1-model.schema-information.json new file mode 100644 index 00000000..b8e4d4ab --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/elasticsearch/index/mwtn/modelDescription/g.874.1-model.schema-information.json @@ -0,0 +1,602 @@ +{ + "schema-information": { + "otn-current-data": { + "id": "otn-current-data", + "uml-id": "_OxyHAOGJEeGhaeLtr7IxXg", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "This object class is an abstract class from which the OTN layer-specific CurrentData object classes are inherited. This object class is a subclass of the Q.822 CurrentData object class, which in turn is a subclass of X.739 Scanner object class. It inherits the following attributes: scannerId, operationalState, granularityPeriod, administrativeState, suspectIntervalFlag, elapsedTime, observedObjectClass, and observedObjectInstance." + ], + "uml-name": "OTN_CurrentData" + }, + "timestamp": { + "id": "timestamp", + "uml-id": "_bGwfoOGJEeGhaeLtr7IxXg", + "uml-type": "ownedAttribute", + "type": "_X-HZUNwbEeGoneTbGt8X0A", + "order-number": 1, + "is-read-only": false, + "description": [ + "The timestamp associated with when the current data was collected." + ], + "uml-name": "timestamp" + }, + "otn-history-data": { + "id": "otn-history-data", + "uml-id": "_dQ2mYOGOEeGhaeLtr7IxXg", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "This object class is an abstract class from which the OTN layer-specific HistoryData object classes are inherited." + ], + "uml-name": "OTN_HistoryData" + }, + "suspect-interval-flag": { + "id": "suspect-interval-flag", + "uml-id": "_M8IDNceIEeSfd5vyUJsimg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 1, + "is-read-only": false, + "description": [ + "This attribute is used to indicate that the performance data for the current period may not be reliable. Some reasons for this to occur are:- Suspect data were detected by the actual resource doing data collection.- Transition of the administrativeState attribute to/from the 'lock' state.- Transition of the operationalState to/from the 'disabled' state.- Scheduler setting that inhibits the collection function.- The performance counters were reset during the interval.- The currentData (or subclass) object instance was created during the monitoring period." + ], + "uml-name": "suspectIntervalFlag", + "controlType": "checkbox" + }, + "«q.822»-current-data": { + "id": "«q.822»-current-data", + "uml-id": "_M8IDMceIEeSfd5vyUJsimg", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "«Q.822»-CurrentData" + }, + "elapsed-time": { + "id": "elapsed-time", + "uml-id": "_M8IDOMeIEeSfd5vyUJsimg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 2, + "is-read-only": false, + "uml-name": "elapsedTime", + "controlType": "number" + }, + "«q.822»-history-data": { + "id": "«q.822»-history-data", + "uml-id": "_M8IDVMeIEeSfd5vyUJsimg", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "«Q.822»-HistoryData" + }, + "history-data-id": { + "id": "history-data-id", + "uml-id": "_M8IDWMeIEeSfd5vyUJsimg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 1, + "is-read-only": false, + "uml-name": "historyDataId", + "controlType": "text" + }, + "period-end-time": { + "id": "period-end-time", + "uml-id": "_M8IDWceIEeSfd5vyUJsimg", + "uml-type": "ownedAttribute", + "type": "../OnfModel-CoreModel/CoreModel.uml#_oGqi1lLNEeO75dO39GbF8Q", + "order-number": 2, + "is-read-only": false, + "uml-name": "periodEndTime" + }, + "granularity-period": { + "id": "granularity-period", + "uml-id": "_M8IDWseIEeSfd5vyUJsimg", + "uml-type": "ownedAttribute", + "type": "_Y6WUEEamEeabNPX3o7rjtw", + "order-number": 2, + "is-read-only": false, + "uml-name": "granularityPeriod", + "controlType": [ + "unknown", + "period-15-min", + "period-24-hours" + ] + }, + "«x.739»-scanner": { + "id": "«x.739»-scanner", + "uml-id": "_7wb90ceIEeSfd5vyUJsimg", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "«X.739»-Scanner" + }, + "scanner-id": { + "id": "scanner-id", + "uml-id": "_7wb91ceIEeSfd5vyUJsimg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 1, + "is-read-only": false, + "uml-name": "scannerId", + "controlType": "text" + }, + "administrative-state": { + "id": "administrative-state", + "uml-id": "_7wb92seIEeSfd5vyUJsimg", + "uml-type": "ownedAttribute", + "type": "../OnfModel-CoreModel/CoreModel.uml#_KSKOYLEuEeSZUdYfPSdgew", + "order-number": 3, + "is-read-only": false, + "uml-name": "administrativeState" + }, + "«x.721»-top": { + "id": "«x.721»-top", + "uml-id": "_BMJ0EceTEeS6-cawxfHpnA", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "This is the top level of managed object class hierarchy and every other managed object class is a specialization of either this generic class (top) or a specialization of subclass of top. The parameter miscellaneousError is to be used when a processing failure has occurred and the error condition encountered does not match any of object's defined specific error types." + ], + "uml-name": "«X.721»-Top" + }, + "object-class": { + "id": "object-class", + "uml-id": "_BMJ0FceTEeS6-cawxfHpnA", + "uml-type": "ownedAttribute", + "type": "_ltGzFMeUEeS6-cawxfHpnA", + "order-number": 1, + "is-read-only": false, + "description": [ + "ObjectClass ::= CHOICE{ globalForm [0] OBJECT IDENTIFIER, localForm [1] INTEGER}" + ], + "uml-name": "objectClass" + }, + "name-binding": { + "id": "name-binding", + "uml-id": "_BMJ0F8eTEeS6-cawxfHpnA", + "uml-type": "ownedAttribute", + "type": "_ltGzFMeUEeS6-cawxfHpnA", + "order-number": 2, + "is-read-only": false, + "uml-name": "nameBinding" + }, + "date-and-time": { + "id": "date-and-time", + "uml-id": "_X-HZUNwbEeGoneTbGt8X0A", + "uml-type": "uml:DataType", + "description": [ + "This primitive type defines the date and time according to the following structure: yyyyMMddhhmmss.s[Z|{+|-}HHMm] where: yyyy 0000 .. 9999 year MM 01 .. 12 month dd 01 .. 31 day hh 00 .. 23 hour mm 00 .. 59 minute ss 00 .. 59 second s .0 .. .9 tenth of second (set to .0 if EMS or NE cannot support this granularity) Z Z indicates UTC (rather than local time) {+|-} + or - delta from UTC HH 00 .. 23 time zone difference in hours Mm 00 .. 59 time zone difference in minutes." + ], + "uml-name": "DateAndTime" + }, + "5-g6-yq-oo-ee-cj-nnlz-cc6-mew": { + "id": "5-g6-yq-oo-ee-cj-nnlz-cc6-mew", + "uml-id": "_5G6YQOo-EeCjNNLZCc6mew", + "enum": [ + "SINK", + "SOURCE", + "BIDIRECTIONAL" + ], + "is-read-only": false, + "description": [ + "The enumeration with the options for directionality of the termination point." + ], + "uml-name": "_5G6YQOo-EeCjNNLZCc6mew" + }, + "r-u8-a-m-opf-ee-cj-nnlz-cc6-mew": { + "id": "r-u8-a-m-opf-ee-cj-nnlz-cc6-mew", + "uml-id": "_rU8aMOpfEeCjNNLZCc6mew", + "enum": [ + "GCC1", + "GCC2", + "GCC1_AND_GCC2" + ], + "is-read-only": false, + "description": [ + "This enumeration indicates the GCC access represented by the entity." + ], + "uml-name": "_rU8aMOpfEeCjNNLZCc6mew" + }, + "w7-1-o-opi-ee-cj-nnlz-cc6-mew": { + "id": "w7-1-o-opi-ee-cj-nnlz-cc6-mew", + "uml-id": "_W7-1oOpiEeCjNNLZCc6mew", + "enum": [ + "ENABLED", + "DISABLED" + ], + "is-read-only": false, + "description": [ + "The list of valid operational states for the connection." + ], + "uml-name": "_W7-1oOpiEeCjNNLZCc6mew" + }, + "g0-z-cs-os-d-ee-cj-nnlz-cc6-mew": { + "id": "g0-z-cs-os-d-ee-cj-nnlz-cc6-mew", + "uml-id": "_g0zCsOsDEeCjNNLZCc6mew", + "enum": [ + "REVERTIVE", + "NON-REVERTIVE" + ], + "is-read-only": false, + "description": [ + "The operation type associated with the protection mechanism (either non-revertive or revertive)." + ], + "uml-name": "_g0zCsOsDEeCjNNLZCc6mew" + }, + "jl09-g-os-k-ee-cj-nnlz-cc6-mew": { + "id": "jl09-g-os-k-ee-cj-nnlz-cc6-mew", + "uml-id": "_Jl09gOsKEeCjNNLZCc6mew", + "enum": [ + "EXERCISE", + "MANUAL_SWITCH", + "FORCED_SWITCH", + "LOCKOUT", + "RELEASE_OF_MANUAL_SWITCH", + "RELEASE_OF_FORCED_SWITCH", + "RELEASE_OF_LOCKOUT" + ], + "is-read-only": false, + "description": [ + "This enumeration contains the options for the actions that instruct the protection system for performing specific protection switching operations." + ], + "uml-name": "_Jl09gOsKEeCjNNLZCc6mew" + }, + "bwx-bq-ow5-ee-cj-nnlz-cc6-mew": { + "id": "bwx-bq-ow5-ee-cj-nnlz-cc6-mew", + "uml-id": "_bwxBQOw5EeCjNNLZCc6mew", + "enum": [ + "UNLOCKED", + "LOCKED", + "SHUTTING_DOWN" + ], + "is-read-only": false, + "description": [ + "For more information on Administrative State, See ITU-T Recs. X.731 and M.3100." + ], + "uml-name": "_bwxBQOw5EeCjNNLZCc6mew" + }, + "ch-q5-o-ow-ee-cj-nnlz-cc6-mew": { + "id": "ch-q5-o-ow-ee-cj-nnlz-cc6-mew", + "uml-id": "_ChQ5oOw-EeCjNNLZCc6mew", + "enum": [ + "2.5_G", + "10_G", + "40_G", + "100_G" + ], + "is-read-only": false, + "description": [ + "Provides an enumeration with the meaning of each k value." + ], + "uml-name": "_ChQ5oOw-EeCjNNLZCc6mew" + }, + "z-bty-u-ow-ee-cj-nnlz-cc6-mew": { + "id": "z-bty-u-ow-ee-cj-nnlz-cc6-mew", + "uml-id": "_ZBtyUOw_EeCjNNLZCc6mew", + "enum": [ + "DAPI", + "SAPI", + "BOTH" + ], + "is-read-only": false, + "description": [ + "List of modes for trace identifier mismatch detection." + ], + "uml-name": "_ZBtyUOw_EeCjNNLZCc6mew" + }, + "hf864-ox-a-ee-cj-nnlz-cc6-mew": { + "id": "hf864-ox-a-ee-cj-nnlz-cc6-mew", + "uml-id": "_HF864OxAEeCjNNLZCc6mew", + "enum": [ + "LOS_P", + "OCI", + "SSF_P", + "SSF_O", + "SSF", + "TIM", + "DEG", + "BDI" + ], + "is-read-only": false, + "description": [ + "The valid list of problems for the entity." + ], + "uml-name": "_HF864OxAEeCjNNLZCc6mew" + }, + "w-po-no-o3-e-ee-cj-nnlz-cc6-mew": { + "id": "w-po-no-o3-e-ee-cj-nnlz-cc6-mew", + "uml-id": "_WPoNoO3eEeCjNNLZCc6mew", + "enum": [ + "INTRUSIVE", + "NON-INTRUSIVE" + ], + "is-read-only": false, + "description": [ + "Monitoring types for the tandem connection monitoring function." + ], + "uml-name": "_WPoNoO3eEeCjNNLZCc6mew" + }, + "oi-7-w-o6-q-ee-cj-nnlz-cc6-mew": { + "id": "oi-7-w-o6-q-ee-cj-nnlz-cc6-mew", + "uml-id": "_OI-7wO6QEeCjNNLZCc6mew", + "enum": [ + "OPERATIONAL", + "TRANSPARENT", + "MONITOR" + ], + "is-read-only": false, + "description": [ + "List of value modes for the sink side of the tandem connection monitoring function." + ], + "uml-name": "_OI-7wO6QEeCjNNLZCc6mew" + }, + "zn-m8-c-o6-z-ee-cj-nnlz-cc6-mew": { + "id": "zn-m8-c-o6-z-ee-cj-nnlz-cc6-mew", + "uml-id": "_ZnM8cO6ZEeCjNNLZCc6mew", + "enum": [ + "40_G", + "100_G" + ], + "is-read-only": false, + "description": [ + "Provides an enumeration with the meaning of each k value." + ], + "uml-name": "_ZnM8cO6ZEeCjNNLZCc6mew" + }, + "p-v-f8-o6-a-ee-cj-nnlz-cc6-mew": { + "id": "p-v-f8-o6-a-ee-cj-nnlz-cc6-mew", + "uml-id": "_pV-F8O6aEeCjNNLZCc6mew", + "enum": [ + "LOS", + "LOL" + ], + "is-read-only": false, + "description": [ + "The valid list of problems for the entity." + ], + "uml-name": "_pV-F8O6aEeCjNNLZCc6mew" + }, + "qw1-syo6-b-ee-cj-nnlz-cc6-mew": { + "id": "qw1-syo6-b-ee-cj-nnlz-cc6-mew", + "uml-id": "_QW1SYO6bEeCjNNLZCc6mew", + "enum": [ + "LOS" + ], + "is-read-only": false, + "description": [ + "The valid list of problems for the entity." + ], + "uml-name": "_QW1SYO6bEeCjNNLZCc6mew" + }, + "o-ouk-o6-b-ee-cj-nnlz-cc6-mew": { + "id": "o-ouk-o6-b-ee-cj-nnlz-cc6-mew", + "uml-id": "_o-oukO6bEeCjNNLZCc6mew", + "enum": [ + "2.5_G", + "10_G", + "40_G", + "2.5_10_G", + "10_40_G", + "2.5_10_40_G" + ], + "is-read-only": false, + "description": [ + "Provides an enumeration with the meaning of each k value." + ], + "uml-name": "_o-oukO6bEeCjNNLZCc6mew" + }, + "krcg4-o6-d-ee-cj-nnlz-cc6-mew": { + "id": "krcg4-o6-d-ee-cj-nnlz-cc6-mew", + "uml-id": "_KRCG4O6dEeCjNNLZCc6mew", + "enum": [ + "INTRA_DOMAIN", + "INTER_DOMAIN" + ], + "is-read-only": false, + "description": [ + "This enumeration provides the options for the interface associated with OTMn." + ], + "uml-name": "_KRCG4O6dEeCjNNLZCc6mew" + }, + "eo-py-io6-q-ee-cj-nnlz-cc6-mew": { + "id": "eo-py-io6-q-ee-cj-nnlz-cc6-mew", + "uml-id": "_EOPyIO6qEeCjNNLZCc6mew", + "enum": [ + "INTRA_OFFICE", + "SHORTHAUL", + "LONGHAUL" + ], + "is-read-only": false, + "description": [ + "The valid options for reach of the optical cable." + ], + "uml-name": "_EOPyIO6qEeCjNNLZCc6mew" + }, + "6-bt3-qo6-q-ee-cj-nnlz-cc6-mew": { + "id": "6-bt3-qo6-q-ee-cj-nnlz-cc6-mew", + "uml-id": "_6Bt3QO6qEeCjNNLZCc6mew", + "enum": [ + "ON", + "OFF" + ], + "is-read-only": false, + "description": [ + "The enumeration of the options for the Automatic Power Reduction Status." + ], + "uml-name": "_6Bt3QO6qEeCjNNLZCc6mew" + }, + "f-lz-nqo6-v-ee-cj-nnlz-cc6-mew": { + "id": "f-lz-nqo6-v-ee-cj-nnlz-cc6-mew", + "uml-id": "_FLzNQO6vEeCjNNLZCc6mew", + "enum": [ + "BDI_P", + "BDI_O", + "BDI", + "TIM", + "LOS_P", + "LOS_O", + "LOS" + ], + "is-read-only": false, + "description": [ + "The valid list of problems for the entity." + ], + "uml-name": "_FLzNQO6vEeCjNNLZCc6mew" + }, + "na-el-yo6-w-ee-cj-nnlz-cc6-mew": { + "id": "na-el-yo6-w-ee-cj-nnlz-cc6-mew", + "uml-id": "_NAElYO6wEeCjNNLZCc6mew", + "enum": [ + "REGULAR", + "NONE", + "VENDOR_SPECIFIC", + "FUNCTIONALLY_STANDARDIZED" + ], + "is-read-only": false, + "description": [ + "The adaptation options for OTUk_ConnectionTermationPoints." + ], + "uml-name": "_NAElYO6wEeCjNNLZCc6mew" + }, + "wg-r-hc-o6-w-ee-cj-nnlz-cc6-mew": { + "id": "wg-r-hc-o6-w-ee-cj-nnlz-cc6-mew", + "uml-id": "_wgRHcO6wEeCjNNLZCc6mew", + "enum": [ + "2.5_G", + "10_G", + "40_G", + "100_G" + ], + "is-read-only": false, + "description": [ + "Provides an enumeration with the meaning of each k value." + ], + "uml-name": "_wgRHcO6wEeCjNNLZCc6mew" + }, + "6-y-g-eo6-w-ee-cj-nnlz-cc6-mew": { + "id": "6-y-g-eo6-w-ee-cj-nnlz-cc6-mew", + "uml-id": "_6Y_gEO6wEeCjNNLZCc6mew", + "enum": [ + "LOF", + "AIS", + "LOM" + ], + "is-read-only": false, + "description": [ + "The valid list of problems for the entity." + ], + "uml-name": "_6Y_gEO6wEeCjNNLZCc6mew" + }, + "x-hnwmo6-x-ee-cj-nnlz-cc6-mew": { + "id": "x-hnwmo6-x-ee-cj-nnlz-cc6-mew", + "uml-id": "_xHNWMO6xEeCjNNLZCc6mew", + "enum": [ + "TIM", + "DEG", + "BDI", + "SSF" + ], + "is-read-only": false, + "description": [ + "The valid list of problems for the entity." + ], + "uml-name": "_xHNWMO6xEeCjNNLZCc6mew" + }, + "krq3-mk8-k-ee-g-z-yhf-u3-o-m-yg": { + "id": "krq3-mk8-k-ee-g-z-yhf-u3-o-m-yg", + "uml-id": "_KRQ3MK8KEeG_zYhfU3oMYg", + "enum": [ + "SINK", + "SOURCE" + ], + "is-read-only": false, + "description": [ + "The enumeration with the options for directionality for nonintrusive monitoring." + ], + "uml-name": "_KRQ3MK8KEeG_zYhfU3oMYg" + }, + "q-bme4-lu-y-ee-geq-z-lpdv-u3-ba": { + "id": "q-bme4-lu-y-ee-geq-z-lpdv-u3-ba", + "uml-id": "_qBme4LuYEeGeqZLpdvU3BA", + "enum": [ + "PERCENTAGE", + "NUMBER_ERRORED_BLOCKS" + ], + "is-read-only": false, + "description": [ + "

The value of the threshold can be provisioned in terms of number of errored blocks or in terms of percentage of errored blocks. For percentage-based specification, in order to support provision of less than 1%, the specification consists of two fields. The first field indicates the granularity of percentage. For examples, in 1%, in 0.1%, or in 0.01%, etc. The second field indicates the multiple of the granularity. For number of errored block based, the value is a positive integer.

" + ], + "uml-name": "_qBme4LuYEeGeqZLpdvU3BA" + }, + "parz8-nw-a-ee-gone-tb-gt8-x0-a": { + "id": "parz8-nw-a-ee-gone-tb-gt8-x0-a", + "uml-id": "_Parz8NwAEeGoneTbGt8X0A", + "enum": [ + "DWDM", + "CWDM", + "NO_WDM" + ], + "is-read-only": false, + "uml-name": "_Parz8NwAEeGoneTbGt8X0A" + }, + "v1-tu-a-nw-a-ee-gone-tb-gt8-x0-a": { + "id": "v1-tu-a-nw-a-ee-gone-tb-gt8-x0-a", + "uml-id": "_V1TuANwAEeGoneTbGt8X0A", + "enum": [ + "STANDARD", + "PROPRIETARY" + ], + "is-read-only": false, + "uml-name": "_V1TuANwAEeGoneTbGt8X0A" + }, + "yt7-s4-pzg-ee-g3-u-a-qk-ii-ctg": { + "id": "yt7-s4-pzg-ee-g3-u-a-qk-ii-ctg", + "uml-id": "_yt7S4PzgEeG3u-aQKIiCtg", + "enum": [ + "PATH", + "TCM1", + "TCM2", + "TCM3", + "TCM4", + "TCM5", + "TCM6", + "SECTION" + ], + "is-read-only": false, + "uml-name": "_yt7S4PzgEeG3u-aQKIiCtg" + }, + "lg3-y-qovv-ee-ky-u85-edu-w-r-a": { + "id": "lg3-y-qovv-ee-ky-u85-edu-w-r-a", + "uml-id": "_LG3yQOVVEeKyU85eduW_rA", + "enum": [ + "CONTROLLER", + "RESPONDER" + ], + "is-read-only": false, + "uml-name": "_LG3yQOVVEeKyU85eduW_rA" + }, + "7-fy9-s-jsc-ee-o-lx-kcui-ytz-cg": { + "id": "7-fy9-s-jsc-ee-o-lx-kcui-ytz-cg", + "uml-id": "_7fy9sJSCEeOLxKCUIYtzCg", + "enum": [ + "INCREASE_BW", + "DECREASE_BW" + ], + "is-read-only": false, + "uml-name": "_7fy9sJSCEeOLxKCUIYtzCg" + }, + "y6-wue-eam-eeab-npx3-o7-rjtw": { + "id": "y6-wue-eam-eeab-npx3-o7-rjtw", + "uml-id": "_Y6WUEEamEeabNPX3o7rjtw", + "enum": [ + "UNKNOWN", + "PERIOD_15MIN", + "PERIOD_24HOURS" + ], + "is-read-only": false, + "description": [ + "The enumeration with the options for granularity period of the performance data." + ], + "uml-name": "_Y6WUEEamEeabNPX3o7rjtw" + } + } +} \ No newline at end of file diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/elasticsearch/index/mwtn/modelDescription/microwave-model.schema-information.json b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/elasticsearch/index/mwtn/modelDescription/microwave-model.schema-information.json new file mode 100644 index 00000000..65686348 --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/elasticsearch/index/mwtn/modelDescription/microwave-model.schema-information.json @@ -0,0 +1,3161 @@ +{ + "schema-information": { + "mw-air-interface-pac": { + "id": "mw-air-interface-pac", + "uml-id": "__1kQ0Hf4EeW-M8kopGJqEA", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "MW_AirInterface_Pac" + }, + "layer-protocol": { + "id": "layer-protocol", + "uml-id": "_m_QIglpKEeax66gMnmfzpQ", + "uml-type": "ownedAttribute", + "type": "../OnfModel-CoreModel/CoreModel.uml#_gROecFYXEeOVGaP4lO41SQ", + "order-number": 1, + "is-read-only": false, + "is-key": 1, + "description": [ + "CoreModel-CoreNetworkModule-ObjectClasses:NetworkElement/_ltpRefList/_lpList/uuid" + ], + "uml-name": "_layerProtocol" + }, + "air-interface-capability-list": { + "id": "air-interface-capability-list", + "uml-id": "_-LlKoIejEeWaZYk7gpuOtw", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Describes the 'analog' capabilities of modem and transmitter of the microwave device. Value ranges of attributes are not independently (e.g. min. and max. transmit power depends on modulation). Legal combinations of values are expressed in transmissionModeTypes." + ], + "uml-name": "AirInterfaceCapability" + }, + "air-interface-configuration": { + "id": "air-interface-configuration", + "uml-id": "_KOcsUIe0EeWnUdmvl3PBkw", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Configuration of the radio link." + ], + "uml-name": "AirInterfaceConfiguration" + }, + "air-interface-status": { + "id": "air-interface-status", + "uml-id": "_iCTioHmIEeWRAfnL3fvovg", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Measurements of current values on the air interface and operational status of the device." + ], + "uml-name": "AirInterfaceStatus" + }, + "air-interface-current-problems": { + "id": "air-interface-current-problems", + "uml-id": "_UF8VcHmIEeWRAfnL3fvovg", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "AirInterfaceCurrentProblems" + }, + "air-interface-current-performance": { + "id": "air-interface-current-performance", + "uml-id": "_CX-iIKS6EeWyu_jasKgNwA", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Aggregated performance information of the air interface at a particular moment." + ], + "uml-name": "AirInterfaceCurrentPerformance" + }, + "air-interface-historical-performances": { + "id": "air-interface-historical-performances", + "uml-id": "_fChNMHmHEeWRAfnL3fvovg", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Aggregated performance information of the air interface for a pre-defined measurement interval." + ], + "uml-name": "AirInterfaceHistoricalPerformances" + }, + "type-of-equipment": { + "id": "type-of-equipment", + "uml-id": "_gK4jMJUBEeWIaZzoaYJ6_A", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 1, + "is-read-only": true, + "description": [ + "This parameter indicates the equipment type. Instead of uploading the complete set of capabilities, capabilities of the same equipment type could be reused. Should be unique for a combination of modem, radio and their respective firmware." + ], + "uml-name": "typeOfEquipment", + "controlType": "text" + }, + "tx-frequency-min": { + "id": "tx-frequency-min", + "uml-id": "_90Xe0HfcEeW-h9gN8LYm4Q", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 2, + "is-read-only": true, + "unit": "kHz", + "description": [ + "Value of the minimum transmit frequency tunable at the air interface." + ], + "uml-name": "txFrequencyMin", + "controlType": "number" + }, + "tx-frequency-max": { + "id": "tx-frequency-max", + "uml-id": "_-1ztsHfcEeW-h9gN8LYm4Q", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 3, + "is-read-only": true, + "unit": "kHz", + "description": [ + "Value of the maximum transmit frequency tunable at the air interface." + ], + "uml-name": "txFrequencyMax", + "controlType": "number" + }, + "rx-frequency-min": { + "id": "rx-frequency-min", + "uml-id": "_BLqx0HfdEeW-h9gN8LYm4Q", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 4, + "is-read-only": true, + "unit": "kHz", + "description": [ + "Value of the minimum receive frequency tunable at the air interface." + ], + "uml-name": "rxFrequencyMin", + "controlType": "number" + }, + "rx-frequency-max": { + "id": "rx-frequency-max", + "uml-id": "_CSBV4HfdEeW-h9gN8LYm4Q", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 5, + "is-read-only": true, + "unit": "kHz", + "description": [ + "Value of the maximum receive frequency tunable at the air interface." + ], + "uml-name": "rxFrequencyMax", + "controlType": "number" + }, + "adaptive-modulation-is-avail": { + "id": "adaptive-modulation-is-avail", + "uml-id": "_ClmuUHffEeW-h9gN8LYm4Q", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 6, + "is-read-only": true, + "description": [ + "In case the device is capable of adaptive modulation, this field shall contain a 'true'." + ], + "uml-name": "adaptiveModulationIsAvail", + "controlType": "checkbox" + }, + "mimo-is-avail": { + "id": "mimo-is-avail", + "uml-id": "_qXBrkH2eEeWaPP5xsIT8pQ", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 7, + "is-read-only": true, + "description": [ + "In case the device is capable of MIMO, this field shall contain a 'true'." + ], + "uml-name": "mimoIsAvail", + "controlType": "checkbox" + }, + "mimo-channels": { + "id": "mimo-channels", + "uml-id": "_qysT4H2eEeWaPP5xsIT8pQ", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 8, + "is-read-only": true, + "unit": "channels", + "description": [ + "Maximum number (n) of spatial multiplexing streams that can be conveyed by an n x n MIMO configuration." + ], + "uml-name": "mimoChannels", + "controlType": "number" + }, + "alic-is-avail": { + "id": "alic-is-avail", + "uml-id": "_a3HgMIL9EeWMcJAvkeTn2w", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 9, + "is-read-only": true, + "description": [ + "In case the microwave radio is capable of Adjacent Link Interference Cancelation (canceling of interference cause by transmitters located at the same site), this field shall contain a 'true'." + ], + "uml-name": "alicIsAvail", + "controlType": "checkbox" + }, + "atpc-is-avail": { + "id": "atpc-is-avail", + "uml-id": "_iRRtgHftEeW-h9gN8LYm4Q", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 10, + "is-read-only": true, + "description": [ + "In case the microwave radio is capable of ATPC, this field shall contain a 'true'." + ], + "uml-name": "atpcIsAvail", + "controlType": "checkbox" + }, + "atpc-range": { + "id": "atpc-range", + "uml-id": "_ErwNYHfdEeW-h9gN8LYm4Q", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 11, + "is-read-only": true, + "unit": "dB", + "description": [ + "Extent of the ATPC range." + ], + "uml-name": "atpcRange", + "controlType": "number" + }, + "encryption-is-avail": { + "id": "encryption-is-avail", + "uml-id": "_4uPM8E58EeaCk6G-lyG1OQ", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 10, + "is-read-only": true, + "description": [ + "Shall be marked 'true', if Ethernet payload encryption is available." + ], + "uml-name": "encryptionIsAvail", + "controlType": "checkbox" + }, + "transmission-mode-list": { + "id": "transmission-mode-list", + "uml-id": "_nwbvcPXREeW9zIqh2WHHww", + "uml-type": "ownedAttribute", + "type": "_zG34sPXQEeW9zIqh2WHHww", + "order-number": 5, + "is-read-only": true, + "uml-name": "transmissionModeList" + }, + "maintenance-timer-range": { + "id": "maintenance-timer-range", + "uml-id": "_I1FYsMWZEeW3xsRKtpCLuA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 14, + "is-read-only": true, + "unit": "s", + "description": [ + "Available time periods for maintenance configurations (e.g. the loop back of microwave header information) to be described. Concrete values shall be separated by commas (e.g. '10, 60, 360'). Ranges shall be expressed as two values separated by a minus (e.g. '10-360')." + ], + "uml-name": "maintenanceTimerRange", + "controlType": "text" + }, + "supported-alarms": { + "id": "supported-alarms", + "uml-id": "_ecCeb0aqEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 2, + "is-read-only": true, + "description": [ + "Available alarms to be listed. Mandatory:'framingIsFaulty' and 'containerIsDown'. Further alarms might be added by the device." + ], + "uml-name": "supportedAlarms", + "controlType": "text" + }, + "supported-channel-plan-list": { + "id": "supported-channel-plan-list", + "uml-id": "_8gpNIHfcEeW-h9gN8LYm4Q", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 1, + "is-read-only": true, + "is-key": 1, + "description": [ + "Unique name (e.g. ECC/REC/(01)04_Annex 5) of a document, which describes a frequency grid that can be adjusted at the air interface. Corresponding channel plans to be delivered by the hardware vendor and to be stored by the operator in an controller/application attached database." + ], + "uml-name": "supportedChannelPlan", + "controlType": "text" + }, + "air-interface-name": { + "id": "air-interface-name", + "uml-id": "_XMDggIL5EeWMcJAvkeTn2w", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 1, + "is-read-only": false, + "description": [ + "Operator specific microwave link ID (often used for coding area, type of element and sequential number)." + ], + "uml-name": "airInterfaceName", + "controlType": "text" + }, + "radio-signal-id": { + "id": "radio-signal-id", + "uml-id": "_QY9KoHf5EeW-M8kopGJqEA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 2, + "is-read-only": false, + "description": [ + "The radioSignalId is transmitted on the air interface so the remote site of the link synchronizes on the correct transmitter. The local radio MUST NOT synchronize on a radio signal with a different radioSignalId. The link ID is neither an ID necessary to span the model nor an ID referencing external data. It is just some sort of name of the link transmitted so the correct remote site can be identified in an interference situation. The value zero might be used to make the microwave to disable the link ID check." + ], + "uml-name": "radioSignalID", + "controlType": "text" + }, + "tx-frequency": { + "id": "tx-frequency", + "uml-id": "_UNE8gHf5EeW-M8kopGJqEA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 3, + "is-read-only": false, + "unit": "kHz", + "description": [ + "Center frequency of the transmit channel. The values to be configured have to exactly match the values listed in the international agreement referenced in channelPlanID. In case of automated selection of the transmit frequency this field shall describe the lowest center frequency selectable." + ], + "uml-name": "txFrequency", + "controlType": "number" + }, + "rx-frequency": { + "id": "rx-frequency", + "uml-id": "_W7ayEHf5EeW-M8kopGJqEA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 4, + "is-read-only": false, + "unit": "kHz", + "description": [ + "Center frequency of the receive channel." + ], + "uml-name": "rxFrequency", + "controlType": "number" + }, + "tx-channel-bandwidth": { + "id": "tx-channel-bandwidth", + "uml-id": "_bhAdIHf5EeW-M8kopGJqEA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 5, + "is-read-only": false, + "unit": "kHz", + "description": [ + "Bandwidth of the transmit channel. The value shall be expressed explicitly (means in kHz) not as a reference to an international agreement. The values shall be chosen from the following _list: 3.500, 7.000, 14.000, 27.500, 28.000, 29.000, 29.650, 30.000, 40.000, 50.000, 55.000, 56.000, 59.300, 60.000, 80.000, 100.000, 112.000, 120.000, 150.000, 200.000, 250.000, 500.000, 750.000, 1.000.000, 1.250.000, 1.500.000, 1.750.000, 2.000.000;" + ], + "uml-name": "txChannelBandwidth", + "controlType": "number" + }, + "rx-channel-bandwidth": { + "id": "rx-channel-bandwidth", + "uml-id": "_eKIbgHf5EeW-M8kopGJqEA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 6, + "is-read-only": false, + "unit": "kHz", + "description": [ + "Bandwidth of the receive channel. The value shall be expressed explicitly (means in kHz) not as a reference to an international agreement. The values shall be chosen from the following _list: 3.500, 7.000, 14.000, 27.500, 28.000, 29.000, 29.650, 30.000, 40.000, 50.000, 55.000, 56.000, 59.300, 60.000, 80.000, 100.000, 112.000, 120.000, 150.000, 200.000, 250.000, 500.000, 750.000, 1.000.000, 1.250.000, 1.500.000, 1.750.000, 2.000.000;" + ], + "uml-name": "rxChannelBandwidth", + "controlType": "number" + }, + "polarization": { + "id": "polarization", + "uml-id": "_bVebEI99EeWFluv9KLLl5A", + "uml-type": "ownedAttribute", + "type": "_e85NsI99EeWFluv9KLLl5A", + "order-number": 7, + "is-read-only": false, + "description": [ + "Allows documenting the polarization of the air interface." + ], + "uml-name": "polarization", + "controlType": [ + "not-specified", + "horizontal", + "vertical" + ] + }, + "power-is-on": { + "id": "power-is-on", + "uml-id": "_p4eR8Hf5EeW-M8kopGJqEA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 8, + "is-read-only": false, + "description": [ + "Power ON. Activation of the entire radio in a split mount configuration shall be expressed as a 'true'." + ], + "uml-name": "powerIsOn", + "controlType": "checkbox" + }, + "transmitter-is-on": { + "id": "transmitter-is-on", + "uml-id": "_uYVvgHf5EeW-M8kopGJqEA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 9, + "is-read-only": false, + "description": [ + "Activation of the transmitter inside the radio shall be expressed as a 'true'." + ], + "uml-name": "transmitterIsOn", + "controlType": "checkbox" + }, + "receiver-is-on": { + "id": "receiver-is-on", + "uml-id": "_q_XcwEgnEeathrAE0htMiA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 10, + "is-read-only": false, + "description": [ + "Maintenance Feature. Activation of the receiver inside the radio shall be expressed as a 'true'. Attribute shall also be used for RX main and RX diversity squelches in case of diversity configurations." + ], + "uml-name": "receiverIsOn", + "controlType": "checkbox" + }, + "tx-power": { + "id": "tx-power", + "uml-id": "_ZEXmIHf6EeW-M8kopGJqEA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 11, + "is-read-only": false, + "unit": "dBm", + "description": [ + "Transmit power to be configured on the microwave link. Signed Byte is required. The actually operated transmit power might be lower depending on adaptive modulation and ATPC." + ], + "uml-name": "txPower", + "controlType": "number" + }, + "adaptive-modulation-is-on": { + "id": "adaptive-modulation-is-on", + "uml-id": "_0jhfYHf5EeW-M8kopGJqEA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 12, + "is-read-only": false, + "description": [ + "Adaptive Modulation. Activation of adaptive modulation shall be expressed as a 'true'." + ], + "uml-name": "adaptiveModulationIsOn", + "controlType": "checkbox" + }, + "modulation-min": { + "id": "modulation-min", + "uml-id": "_dM_BUHf6EeW-M8kopGJqEA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 13, + "is-read-only": false, + "unit": "symbols", + "description": [ + "Minimum modulation to be configured (in case adaptive modulation is not used, this value represents also the fixed modulation). The modulation scheme shall be described by the number of states in the phase diagram (e.g. BPSK->'2' or 256QAM->'256'). Allowed values are defined in TypeDefinitions::transmissionModeType::modulationScheme." + ], + "uml-name": "modulationMin", + "controlType": "number" + }, + "modulation-max": { + "id": "modulation-max", + "uml-id": "_gAHQQHf6EeW-M8kopGJqEA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 14, + "is-read-only": false, + "unit": "symbols", + "description": [ + "Maximum modulation to be configured. The value of this field is only relevant, if Adaptive Modulation has been activated. The modulation scheme shall be described by the number of states in the phase diagram (e.g. BPSK->'2' or 256QAM->'256'). Allowed values are defined in TypeDefinitions::transmissionModeType::modulationScheme." + ], + "uml-name": "modulationMax", + "controlType": "number" + }, + "xpic-is-on": { + "id": "xpic-is-on", + "uml-id": "_4hi0IHf5EeW-M8kopGJqEA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 15, + "is-read-only": false, + "description": [ + "Activation of Cross Polarization Interference Cancelation shall be expressed as a 'true'. In case XPIC is not available for the current combination of channel bandwidth and modulation or the hardware in general, this parameter shall always be set to 'false'." + ], + "uml-name": "xpicIsOn", + "controlType": "checkbox" + }, + "mimo-is-on": { + "id": "mimo-is-on", + "uml-id": "_7t4fIH2dEeWaPP5xsIT8pQ", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 16, + "is-read-only": false, + "description": [ + "Activation of Multiple Input Multiple Output (MIMO) shall be expressed as a 'true'." + ], + "uml-name": "mimoIsOn", + "controlType": "checkbox" + }, + "alic-is-on": { + "id": "alic-is-on", + "uml-id": "_FmWHMHf6EeW-M8kopGJqEA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 17, + "is-read-only": false, + "description": [ + "Activation of Adjacent Link Interference Cancelation (ALIC) shall be expressed as a 'true'." + ], + "uml-name": "alicIsOn", + "controlType": "checkbox" + }, + "atpc-is-on": { + "id": "atpc-is-on", + "uml-id": "_9Hz0oHf5EeW-M8kopGJqEA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 18, + "is-read-only": false, + "description": [ + "ATPC. Activation of Automated Transmit Power Control shall be expressed as a 'true'." + ], + "uml-name": "atpcIsOn", + "controlType": "checkbox" + }, + "atpc-thresh-upper": { + "id": "atpc-thresh-upper", + "uml-id": "_pR7yMHgAEeW-M8kopGJqEA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 19, + "is-read-only": false, + "unit": "dBm", + "description": [ + "If the receive level is higher than the upper threshold value, the transmitter is notified to decrease transmit power." + ], + "uml-name": "atpcThreshUpper", + "controlType": "number" + }, + "atpc-thresh-lower": { + "id": "atpc-thresh-lower", + "uml-id": "_sIlPMHgAEeW-M8kopGJqEA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 20, + "is-read-only": false, + "unit": "dBm", + "description": [ + "If the receive level is lower than the lower threshold value, the transmitter is notified to increase transmit power." + ], + "uml-name": "atpcThreshLower", + "controlType": "number" + }, + "auto-freq-select-is-on": { + "id": "auto-freq-select-is-on", + "uml-id": "_dG5VAIL-EeWMcJAvkeTn2w", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 21, + "is-read-only": false, + "description": [ + "Activation of automatically selecting the transmit frequency in unlicensed bands shall be expressed as a 'true'." + ], + "uml-name": "autoFreqSelectIsOn", + "controlType": "checkbox" + }, + "auto-freq-select-range": { + "id": "auto-freq-select-range", + "uml-id": "_yH9XMIMCEeWMcJAvkeTn2w", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 22, + "is-read-only": false, + "unit": "channels", + "description": [ + "Number of transmit channels (starting at the center frequency defined in txFrequency and with channel bandwidth according to txChannelBandwidth) that define the range within the transmit frequency can automatically been chosen." + ], + "uml-name": "autoFreqSelectRange", + "controlType": "number" + }, + "modulation-is-on": { + "id": "modulation-is-on", + "uml-id": "_kxXzwIMGEeWMcJAvkeTn2w", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 23, + "is-read-only": false, + "description": [ + "Maintenance Feature. De-activation of the modulation of the carrier signal for fault management shall be expressed as a 'false'." + ], + "uml-name": "modulationIsOn", + "controlType": "checkbox" + }, + "encryption-is-on": { + "id": "encryption-is-on", + "uml-id": "_uI7bIE58EeaCk6G-lyG1OQ", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 11, + "is-read-only": false, + "description": [ + "Activates encryption of the Ethernet payload." + ], + "uml-name": "encryptionIsOn", + "controlType": "checkbox" + }, + "cryptographic-key": { + "id": "cryptographic-key", + "uml-id": "_psRpoE58EeaCk6G-lyG1OQ", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 12, + "is-read-only": false, + "description": [ + "Key for transforming plaintext into cipher text data." + ], + "uml-name": "cryptographicKey", + "controlType": "text" + }, + "loop-back-kind-on": { + "id": "loop-back-kind-on", + "uml-id": "_PyRvsHf6EeW-M8kopGJqEA", + "uml-type": "ownedAttribute", + "type": "_3CZ3UIsDEead4ersMrOjBQ", + "order-number": 26, + "is-read-only": false, + "description": [ + "Maintenance Feature. The currently configured type of looping back of the air interface header shall be expressed here. The received header is returned to the remote site." + ], + "uml-name": "loopBackKindOn", + "controlType": [ + "none", + "if", + "rf" + ] + }, + "maintenance-timer": { + "id": "maintenance-timer", + "uml-id": "_7-oTwCd5EeaJA6AVLNrv_w", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 27, + "is-read-only": false, + "unit": "s", + "description": [ + "Time of existence of any maintenance configuration (e.g. the loop back of microwave header information). Valid values are defined in AirInterface::AirInterfaceCapability::maintenanceTimerRange." + ], + "uml-name": "maintenanceTimer", + "controlType": "number" + }, + "problem-kind-severity-list": { + "id": "problem-kind-severity-list", + "uml-id": "_OMQH02z0Eeaf-__BRLM84g", + "uml-type": "ownedAttribute", + "type": "_eIml0JH1EeWUdbnmmNiTAA", + "order-number": 2, + "is-read-only": false, + "description": [ + "Severity of this type of alarm." + ], + "uml-name": "problemKindSeverity", + "controlType": [ + "non-alarmed", + "warning", + "minor", + "major", + "critical" + ] + }, + "tx-frequency-cur": { + "id": "tx-frequency-cur", + "uml-id": "_YZq7gK4tEeWXs6m-9H3KvA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 1, + "is-read-only": true, + "unit": "kHz", + "description": [ + "Center frequency of the currently operated transmit channel." + ], + "uml-name": "txFrequencyCur", + "controlType": "number" + }, + "rx-frequency-cur": { + "id": "rx-frequency-cur", + "uml-id": "_33IdUIL-EeWMcJAvkeTn2w", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 2, + "is-read-only": true, + "unit": "kHz", + "description": [ + "Center frequency of the currently operated receive channel." + ], + "uml-name": "rxFrequencyCur", + "controlType": "number" + }, + "tx-level-cur": { + "id": "tx-level-cur", + "uml-id": "_L3B5wHgIEeWfutScSwFT9A", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 3, + "is-read-only": true, + "unit": "dBm", + "description": [ + "Current transmit level." + ], + "uml-name": "txLevelCur", + "controlType": "number" + }, + "rx-level-cur": { + "id": "rx-level-cur", + "uml-id": "_OHN9AHizEeWfutScSwFT9A", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 4, + "is-read-only": true, + "unit": "dBm", + "description": [ + "Current receive level." + ], + "uml-name": "rxLevelCur", + "controlType": "number" + }, + "modulation-cur": { + "id": "modulation-cur", + "uml-id": "_RBMa0HizEeWfutScSwFT9A", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 5, + "is-read-only": true, + "unit": "symbols", + "description": [ + "Currently operated modulation on transmit path. The modulation scheme shall be described by the number of states in the phase diagram (e.g. BPSK->'2' or 256QAM->'256'). Allowed values are defined in TypeDefinitions::transmissionModeType::modulationScheme." + ], + "uml-name": "modulationCur", + "controlType": "number" + }, + "code-rate-cur": { + "id": "code-rate-cur", + "uml-id": "_UYyBsHizEeWfutScSwFT9A", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 6, + "is-read-only": true, + "unit": "%", + "description": [ + "Code rate of the currently operated coding scheme (Net bit rate ≤ Gross bit rate · code rate)." + ], + "uml-name": "codeRateCur", + "controlType": "number" + }, + "snir-cur": { + "id": "snir-cur", + "uml-id": "_B7G0AEzvEeaRytIQfQ43Wg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 1, + "is-read-only": true, + "unit": "dB", + "description": [ + "Currently measured signal to (noise+interference) ratio of the combined signals." + ], + "uml-name": "snirCur", + "controlType": "number" + }, + "xpd-cur": { + "id": "xpd-cur", + "uml-id": "_Z7NvgHizEeWfutScSwFT9A", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 8, + "is-read-only": true, + "unit": "dB", + "description": [ + "Currently measured cross polarization discrimination." + ], + "uml-name": "xpdCur", + "controlType": "number" + }, + "rf-temp-cur": { + "id": "rf-temp-cur", + "uml-id": "_d6wuQHizEeWfutScSwFT9A", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 9, + "is-read-only": true, + "unit": "Celsius", + "description": [ + "Current temperature (in degree Celsius) of the radio module inside the outdoor unit." + ], + "uml-name": "rfTempCur", + "controlType": "number" + }, + "last-status-change": { + "id": "last-status-change", + "uml-id": "_ecCetEaqEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "../OnfModel-CoreModel/CoreModel.uml#_oGqi1lLNEeO75dO39GbF8Q", + "order-number": 1, + "is-read-only": true, + "description": [ + "Time the Container entered its current operational status. _format:yyyyMMddhhmmss.s[Z|{+|-}HHMm]; yyyy='0000'..'9999' year; MM='01'..'12' month; dd='01'..'31' day; hh='00'..'23' hour; mm='00'..'59' minute; ss='00'..'59' second; s='.0'..'.9'tenth of second (set to '.0' if EMS or NE cannot support this granularity); Z='Z' indicates UTC (rather than local time); {+|-}='+' or '-' delta from UTC; HH='00'..'23' time zone difference in hours; Mm='00'..'59' time zone difference in minutes." + ], + "uml-name": "lastStatusChange" + }, + "radio-power-is-up": { + "id": "radio-power-is-up", + "uml-id": "_sFKXcHizEeWfutScSwFT9A", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 11, + "is-read-only": true, + "description": [ + "If the radio unit has power and is switched on, this shall be expressed as a 'true'." + ], + "uml-name": "radioPowerIsUp", + "controlType": "checkbox" + }, + "link-is-up": { + "id": "link-is-up", + "uml-id": "_5JBPUHizEeWfutScSwFT9A", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 12, + "is-read-only": true, + "description": [ + "If connection is established to the remote site with the same linkID, this shall be expressed as a 'true'." + ], + "uml-name": "linkIsUp", + "controlType": "checkbox" + }, + "xpic-is-up": { + "id": "xpic-is-up", + "uml-id": "_ESRbsHi0EeWfutScSwFT9A", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 13, + "is-read-only": true, + "description": [ + "If XPIC is currently actually working (not just configured), this shall be expressed as a 'true'." + ], + "uml-name": "xpicIsUp", + "controlType": "checkbox" + }, + "mimo-is-up": { + "id": "mimo-is-up", + "uml-id": "_DVaQwIL6EeWMcJAvkeTn2w", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 14, + "is-read-only": true, + "description": [ + "If MIMO is currently actually working (not just configured), this shall be expressed as a 'true'." + ], + "uml-name": "mimoIsUp", + "controlType": "checkbox" + }, + "alic-is-up": { + "id": "alic-is-up", + "uml-id": "_Hte-UHi0EeWfutScSwFT9A", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 15, + "is-read-only": true, + "description": [ + "If Adjacent Link Interference Cancelation (ALIC) is currently actually working (not just configured), this shall be expressed as a 'true'." + ], + "uml-name": "alicIsUp", + "controlType": "checkbox" + }, + "atpc-is-up": { + "id": "atpc-is-up", + "uml-id": "_VimCgMjNEeWYRsWW_rqpgw", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 16, + "is-read-only": true, + "description": [ + "If ATPC is currently actually working (not just configured), this shall be expressed as a 'true'." + ], + "uml-name": "atpcIsUp", + "controlType": "checkbox" + }, + "auto-freq-select-is-up": { + "id": "auto-freq-select-is-up", + "uml-id": "_-PXKsIL-EeWMcJAvkeTn2w", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 17, + "is-read-only": true, + "description": [ + "If automated frequency selection is currently actually working (not just configured), this shall be expressed as a 'true'." + ], + "uml-name": "autoFreqSelectIsUp", + "controlType": "checkbox" + }, + "loop-back-kind-up": { + "id": "loop-back-kind-up", + "uml-id": "_S9prAHi0EeWfutScSwFT9A", + "uml-type": "ownedAttribute", + "type": "_3CZ3UIsDEead4ersMrOjBQ", + "order-number": 18, + "is-read-only": true, + "description": [ + "The currently active (not just configured) type of looping back of the air interface header shall be expressed here. The received header is returned to the remote site." + ], + "uml-name": "loopBackKindUp", + "controlType": [ + "none", + "if", + "rf" + ] + }, + "local-end-point-id": { + "id": "local-end-point-id", + "uml-id": "_pEsgcFQHEeaCXY7nSBqs6w", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 19, + "is-read-only": true, + "description": [ + "The value of the localEndPointId is a vendor specific identifier of the air interface, used by the node to discover a microwave radio link." + ], + "uml-name": "localEndPointId", + "controlType": "text" + }, + "remote-end-point-id": { + "id": "remote-end-point-id", + "uml-id": "_r3cU4FQHEeaCXY7nSBqs6w", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 20, + "is-read-only": true, + "description": [ + "The value of the remoteEndPointId is a vendor specific identifier or the airinterface at the remote side, used to by the node to discover a microwave radio link." + ], + "uml-name": "remoteEndPointId", + "controlType": "text" + }, + "current-problem-list": { + "id": "current-problem-list", + "uml-id": "_ecCewEaqEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "__h1n4MXpEeWJ6KZuc0h_vw", + "order-number": 1, + "is-read-only": true, + "uml-name": "currentProblemList" + }, + "current-performance-data-list": { + "id": "current-performance-data-list", + "uml-id": "_ecCexkaqEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "_pA5AQGz6Eeaf-__BRLM84g", + "order-number": 1, + "is-read-only": true, + "description": [ + "At least values of the counters, which are reset every 15 minutes, are to be provided. If available, the current values of the counters, which are reset every 24 hour, can be provided, too." + ], + "uml-name": "currentPerformanceDataList" + }, + "historical-performance-data-list": { + "id": "historical-performance-data-list", + "uml-id": "_ecCeykaqEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "_pTaToGz6Eeaf-__BRLM84g", + "order-number": 1, + "is-read-only": true, + "uml-name": "historicalPerformanceDataList" + }, + "co-channel-group": { + "id": "co-channel-group", + "uml-id": "_XBs2YJQrEeWOu_cDl8dd7w", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Required for configuring XPIC, MIMO and ALIC." + ], + "uml-name": "CoChannelGroup" + }, + "co-channel-group-id": { + "id": "co-channel-group-id", + "uml-id": "_pIjBgEy7EeaRytIQfQ43Wg", + "uml-type": "ownedAttribute", + "type": "../OnfModel-CoreModel/CoreModel.uml#_SU3Q4I30EeO38ZmbECnvbg", + "order-number": 1, + "is-read-only": false, + "is-key": 1, + "uml-name": "coChannelGroupId" + }, + "air-interface-list": { + "id": "air-interface-list", + "uml-id": "_tIadUCJeEeaCUo1MUtSuEg", + "uml-type": "ownedAttribute", + "type": "../OnfModel-CoreModel/CoreModel.uml#_eEpDMFX4EeOVGaP4lO41SQ", + "order-number": 2, + "is-read-only": false, + "description": [ + "List of air interfaces, which are part of the co-channel (XPIC, MIMO, ALIC) group." + ], + "uml-name": "_airInterfaceList" + }, + "sort-of-co-channel-group": { + "id": "sort-of-co-channel-group", + "uml-id": "_ZrjZcJRrEeWIaZzoaYJ6_A", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 3, + "is-read-only": false, + "description": [ + "Type of group of air interfaces with the same transmit and receive frequency. The values shall be chosen from the following _list:'XPIC', 'MIMO', 'ALIC';" + ], + "uml-name": "sortOfCoChannelGroup", + "controlType": "text" + }, + "logical-termination-point": { + "id": "logical-termination-point", + "uml-id": "_8QgfIKwZEeaK38AermeaCw", + "uml-type": "ownedAttribute", + "type": "../OnfModel-CoreModel/CoreModel.uml#_eEpDMFX4EeOVGaP4lO41SQ", + "order-number": 4, + "is-read-only": false, + "uml-name": "_logicalTerminationPoint" + }, + "mw-air-interface-hsb-end-point-pac": { + "id": "mw-air-interface-hsb-end-point-pac", + "uml-id": "_CXKgMJRbEeWMYJZn43K_Aw", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "The EndPoint (EP) object class models the access to the FC function. Each EndPoint instance has a role (e.g., working, protection, protected, hub, spoke, leaf, root, etc.) with respect to the FC function. The association of the FC to LTPs is made via EndPoints (essentially the ports of the FC) where each EndPoint (EP) of the FC has a role in the context of the FC. The traffic forwarding between the associated End PointsEPs of the FC depends upon the type of FC and may be associated with FCSwitch object instances. In cases where there is protection conveys the protecting role of the access to the FC. The EP replaces the Protection Unit of a traditional protection model. It represents a protected (resilient/reliable) point or a protecting (unreliable working or protection) point." + ], + "uml-name": "MW_AirInterfaceHsbEndPoint_Pac" + }, + "role": { + "id": "role", + "uml-id": "_CXKgNpRbEeWMYJZn43K_Aw", + "uml-type": "ownedAttribute", + "type": "_01_dYJReEeWxIPEwZQ_gmw", + "order-number": 1, + "is-read-only": false, + "uml-name": "role", + "controlType": [ + "working", + "protection", + "protected" + ] + }, + "endpoint": { + "id": "endpoint", + "uml-id": "_dglVQLYgEeWOio-Gg6Q2sw", + "uml-type": "ownedAttribute", + "type": "../OnfModel-CoreModel/CoreModel.uml#_b_lUAFYgEeOVGaP4lO41SQ", + "order-number": 2, + "is-read-only": false, + "is-key": 1, + "uml-name": "_endpoint" + }, + "mw-air-interface-hsb-fc-switch-pac": { + "id": "mw-air-interface-hsb-fc-switch-pac", + "uml-id": "_CXNjgJRbEeWMYJZn43K_Aw", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Represents and defines a protection switch structure encapsulated in the forwarding construct. Essentially performs the function of Protection Group. Associates to 2 or more Endpoints each playing the role of a Protection Unit. One or more protection EndPoints (standby/backup) provide protection for one or more working (i.e. regular/main/preferred) Endpoints where either protection or working can feed one or more protected Endpoint. May be used in revertive or non-revertive (symmetric) mode. When in revertive mode may define waitToRestore time. May be used in one of several modes including source switch, destination switched, source and destination switched etc (covering cases such as 1+1 ane 1:1). May be lockout (prevented from switching), force switched or manual switched. Will indicate switch state and change of state." + ], + "uml-name": "MW_AirInterfaceHsbFcSwitch_Pac" + }, + "prot-type": { + "id": "prot-type", + "uml-id": "_CXNjiJRbEeWMYJZn43K_Aw", + "uml-type": "ownedAttribute", + "type": "_DaB5IJRgEeWxIPEwZQ_gmw", + "order-number": 1, + "is-read-only": false, + "description": [ + "Indicates the protection scheme that is used for the ProtectionGroup." + ], + "uml-name": "protType", + "controlType": [ + "hsb" + ] + }, + "air-interface-hsb-configuration-is-faulty-severity": { + "id": "air-interface-hsb-configuration-is-faulty-severity", + "uml-id": "_80BlAJ2gEeWSuvrh9KcclQ", + "uml-type": "ownedAttribute", + "type": "_eIml0JH1EeWUdbnmmNiTAA", + "order-number": 2, + "is-read-only": false, + "description": [ + "The level of severity of an airInterfaceHsbConfigurationIsFaulty alarm shall be chosen from an enumeration." + ], + "uml-name": "airInterfaceHsbConfigurationIsFaultySeverity", + "controlType": [ + "non-alarmed", + "warning", + "minor", + "major", + "critical" + ] + }, + "air-interface-hsb-is-partly-down-severity": { + "id": "air-interface-hsb-is-partly-down-severity", + "uml-id": "_r382sJ2mEeWSuvrh9KcclQ", + "uml-type": "ownedAttribute", + "type": "_eIml0JH1EeWUdbnmmNiTAA", + "order-number": 3, + "is-read-only": false, + "description": [ + "The level of severity for one link out of the HSB configuration being down shall be chosen from an enumeration." + ], + "uml-name": "airInterfaceHsbIsPartlyDownSeverity", + "controlType": [ + "non-alarmed", + "warning", + "minor", + "major", + "critical" + ] + }, + "air-interface-hsb-is-down-severity": { + "id": "air-interface-hsb-is-down-severity", + "uml-id": "_sRGWgJ2mEeWSuvrh9KcclQ", + "uml-type": "ownedAttribute", + "type": "_eIml0JH1EeWUdbnmmNiTAA", + "order-number": 4, + "is-read-only": false, + "description": [ + "The level of severity of the total HSB configuration being down shall be chosen from an enumeration." + ], + "uml-name": "airInterfaceHsbIsDownSeverity", + "controlType": [ + "non-alarmed", + "warning", + "minor", + "major", + "critical" + ] + }, + "fcswitch": { + "id": "fcswitch", + "uml-id": "_FS83ILYhEeWOio-Gg6Q2sw", + "uml-type": "ownedAttribute", + "type": "../OnfModel-CoreModel/CoreModel.uml#_a97NQFYhEeOVGaP4lO41SQ", + "order-number": 5, + "is-read-only": false, + "is-key": 1, + "uml-name": "_fcswitch" + }, + "mw-air-interface-diversity-pac": { + "id": "mw-air-interface-diversity-pac", + "uml-id": "_WbgFcHgFEeWfutScSwFT9A", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "MW_AirInterfaceDiversity_Pac" + }, + "air-interface-diversity-capability": { + "id": "air-interface-diversity-capability", + "uml-id": "_vxH2wIekEeWaZYk7gpuOtw", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Describes the capabilities in implementing different types of air interface diversity." + ], + "uml-name": "AirInterfaceDiversityCapability" + }, + "air-interface-diversity-configuration": { + "id": "air-interface-diversity-configuration", + "uml-id": "_43RTMIe1EeWnUdmvl3PBkw", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "AirInterfaceDiversityConfiguration" + }, + "air-interface-diversity-status": { + "id": "air-interface-diversity-status", + "uml-id": "_EKZYcJOXEeWz-6sqLzUedw", + "uml-type": "ownedAttribute", + "type": "_DUJs8JOXEeWz-6sqLzUedw", + "order-number": 2, + "is-read-only": true, + "description": [ + "Status of the air interface bundle." + ], + "uml-name": "airInterfaceDiversityStatus", + "controlType": [ + "group-down", + "not-all-ai-active", + "all-ai-active" + ] + }, + "air-interface-diversity-current-problems": { + "id": "air-interface-diversity-current-problems", + "uml-id": "_CAvhEHvtEeWzooKF5kx0aw", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "AirInterfaceDiversityCurrentProblems" + }, + "air-interface-diversity-current-performance": { + "id": "air-interface-diversity-current-performance", + "uml-id": "_GIsAQKjDEeWlgMiFXLmCIQ", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Aggregated performance information of the air interface diversity configuration at a particular moment." + ], + "uml-name": "AirInterfaceDiversityCurrentPerformance" + }, + "air-interface-diversity-historical-performances": { + "id": "air-interface-diversity-historical-performances", + "uml-id": "_8IIu8HvsEeWzooKF5kx0aw", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Aggregated performance information of the air interface diversity configuration for a pre-defined measurement interval." + ], + "uml-name": "AirInterfaceDiversityHistoricalPerformances" + }, + "available-kinds-of-diversity": { + "id": "available-kinds-of-diversity", + "uml-id": "_luAGENyVEeW-SfXlFFFI0Q", + "uml-type": "ownedAttribute", + "type": "_pTliINyUEeW-SfXlFFFI0Q", + "order-number": 1, + "is-read-only": true, + "description": [ + "Available types of diversity to be listed." + ], + "uml-name": "availableKindsOfDiversity" + }, + "air-interface-diversity": { + "id": "air-interface-diversity", + "uml-id": "_hynTIHi_EeWfutScSwFT9A", + "uml-type": "ownedAttribute", + "type": "_pTliINyUEeW-SfXlFFFI0Q", + "order-number": 1, + "is-read-only": false, + "description": [ + "Type of air interface diversity configured at the link." + ], + "uml-name": "airInterfaceDiversity" + }, + "air-interface-ltp-list": { + "id": "air-interface-ltp-list", + "uml-id": "_xRMKgNyXEeW-SfXlFFFI0Q", + "uml-type": "ownedAttribute", + "type": "../OnfModel-CoreModel/CoreModel.uml#_eEpDMFX4EeOVGaP4lO41SQ", + "order-number": 2, + "is-read-only": false, + "description": [ + "_multiplicity:2-ThisAirInterfaceDiversity::AirInterfaceDiversityConfiguration::airInterfaceDiversity::diversityType::numberOfAirInterfacesMax" + ], + "uml-name": "_airInterfaceLtpList" + }, + "mw-pure-ethernet-structure-pac": { + "id": "mw-pure-ethernet-structure-pac", + "uml-id": "__OTQ0UaeEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "The pureEthernetStructure_Pac and its attached classes MUST be provided on management interfaces of microwave devices, which are transporting Ethernet traffic only." + ], + "uml-name": "MW_PureEthernetStructure_Pac" + }, + "pure-ethernet-structure-capability-list": { + "id": "pure-ethernet-structure-capability-list", + "uml-id": "__OTQ4EaeEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Describes the logical structuring of the physical capacity provided by a pure Ethernet microwave device. Segmentation is not available. No fixed segment size. No TDM transport." + ], + "uml-name": "PureEthernetStructureCapability" + }, + "pure-ethernet-structure-configuration": { + "id": "pure-ethernet-structure-configuration", + "uml-id": "__OTQ8UaeEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "PureEthernetStructureConfiguration" + }, + "pure-ethernet-structure-status": { + "id": "pure-ethernet-structure-status", + "uml-id": "__OTQ_UaeEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "PureEthernetStructureStatus" + }, + "pure-ethernet-structure-current-problems": { + "id": "pure-ethernet-structure-current-problems", + "uml-id": "__OTRCUaeEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "PureEthernetStructureCurrentProblems" + }, + "pure-ethernet-structure-current-performance": { + "id": "pure-ethernet-structure-current-performance", + "uml-id": "__OTRD0aeEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Aggregated performance information of the structure of an pure Ethernet microwave at a particular moment." + ], + "uml-name": "PureEthernetStructureCurrentPerformance" + }, + "pure-ethernet-structure-historical-performances": { + "id": "pure-ethernet-structure-historical-performances", + "uml-id": "__OTRE0aeEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Aggregated performance information of the structure of an pure Ethernet microwave for a pre-defined measurement interval." + ], + "uml-name": "PureEthernetStructureHistoricalPerformances" + }, + "structure-id": { + "id": "structure-id", + "uml-id": "_Bzxo5EagEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "../OnfModel-CoreModel/CoreModel.uml#_SU3Q4I30EeO38ZmbECnvbg", + "order-number": 1, + "is-read-only": true, + "is-key": 1, + "description": [ + "Identifies the Structure for bundling and container." + ], + "uml-name": "structureId" + }, + "segment-status-list": { + "id": "segment-status-list", + "uml-id": "_BzxpAEagEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "_KwZVcMUCEeW3xsRKtpCLuA", + "order-number": 1, + "is-read-only": true, + "description": [ + "Status of each segment (all TDM and one Ethernet). Multiplicity = HybridMwStructure::StructureConfiguration::tdmReservedNumberOfSegments + 1" + ], + "uml-name": "segmentStatusList" + }, + "mw-hybrid-mw-structure-pac": { + "id": "mw-hybrid-mw-structure-pac", + "uml-id": "_Bzxo0UagEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "The HybridMwStructure_Pac and its attached classes MUST be provided on management interfaces of microwave devices, which are transporting TDM and Ethernet traffic." + ], + "uml-name": "MW_HybridMwStructure_Pac" + }, + "hybrid-mw-structure-capability": { + "id": "hybrid-mw-structure-capability", + "uml-id": "_Bzxo4EagEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Describes the logical structuring of the physical capacity provided by a hybrid microwave device (TDM + Ethernet). Segmentation is available. TDM transport is available." + ], + "uml-name": "HybridMwStructureCapability" + }, + "hybrid-mw-structure-configuration": { + "id": "hybrid-mw-structure-configuration", + "uml-id": "_Bzxo8UagEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "HybridMwStructureConfiguration" + }, + "hybrid-mw-structure-status": { + "id": "hybrid-mw-structure-status", + "uml-id": "_Bzxo_UagEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "HybridMwStructureStatus" + }, + "hybrid-mw-structure-current-problems": { + "id": "hybrid-mw-structure-current-problems", + "uml-id": "_BzxpCUagEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "HybridMwStructureCurrentProblems" + }, + "hybrid-mw-structure-current-performance": { + "id": "hybrid-mw-structure-current-performance", + "uml-id": "_BzxpD0agEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Aggregated performance information of the structure of a hybrid microwave at a particular moment." + ], + "uml-name": "HybridMwStructureCurrentPerformance" + }, + "hybrid-mw-structure-historical-performances": { + "id": "hybrid-mw-structure-historical-performances", + "uml-id": "_BzxpE0agEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Aggregated performance information of the structure of a hybrid microwave for a pre-defined measurement interval." + ], + "uml-name": "HybridMwStructureHistoricalPerformances" + }, + "supported-tdm-structure-types-list": { + "id": "supported-tdm-structure-types-list", + "uml-id": "_tA-uQEduEeax2rWez10Siw", + "uml-type": "ownedAttribute", + "type": "_jRAQsEdoEeax2rWez10Siw", + "order-number": 2, + "is-read-only": true, + "description": [ + "Lists the TDM frame types that are supported." + ], + "uml-name": "supportedTdmStructureTypesList" + }, + "structure-type": { + "id": "structure-type", + "uml-id": "_cduh4EdvEeax2rWez10Siw", + "uml-type": "ownedAttribute", + "type": "_jRAQsEdoEeax2rWez10Siw", + "order-number": 1, + "is-read-only": false, + "description": [ + "TDM frame to be applied." + ], + "uml-name": "structureType" + }, + "number-of-tdm-segments-to-be-reserved": { + "id": "number-of-tdm-segments-to-be-reserved", + "uml-id": "_Bzxo9EagEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 2, + "is-read-only": false, + "description": [ + "Allows to configure the number of segments reserved for TDM frames of the type specified in HybridMwStructure::HybridMwStructureConfiguration::structureType" + ], + "uml-name": "numberOfTdmSegmentsToBeReserved", + "controlType": "number" + }, + "mw-ethernet-container-pac": { + "id": "mw-ethernet-container-pac", + "uml-id": "_4uEBgUafEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "MW_EthernetContainer_Pac" + }, + "ethernet-container-capability": { + "id": "ethernet-container-capability", + "uml-id": "_4uEBmEafEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "EthernetContainerCapability" + }, + "ethernet-container-configuration": { + "id": "ethernet-container-configuration", + "uml-id": "_4uEBwUafEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "EthernetContainerConfiguration" + }, + "ethernet-container-status": { + "id": "ethernet-container-status", + "uml-id": "_4uECAUafEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "EthernetContainerStatus" + }, + "ethernet-container-current-problems": { + "id": "ethernet-container-current-problems", + "uml-id": "_4uECDUafEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "EthernetContainerCurrentProblems" + }, + "ethernet-container-current-performance": { + "id": "ethernet-container-current-performance", + "uml-id": "_4uECE0afEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Aggregated performance information of the Ethernet container at a particular moment." + ], + "uml-name": "EthernetContainerCurrentPerformance" + }, + "ethernet-container-historical-performances": { + "id": "ethernet-container-historical-performances", + "uml-id": "_4uECF0afEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Aggregated performance information of the Ethernet container for a pre-defined measurement interval." + ], + "uml-name": "EthernetContainerHistoricalPerformances" + }, + "bundling-is-avail": { + "id": "bundling-is-avail", + "uml-id": "_IzCGMNyCEeW-SfXlFFFI0Q", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 4, + "is-read-only": true, + "description": [ + "If it is possible to combine transport resources of several radio links to transport this container type, this attribute shall be set to '1'." + ], + "uml-name": "bundlingIsAvail", + "controlType": "checkbox" + }, + "packet-compression-is-avail": { + "id": "packet-compression-is-avail", + "uml-id": "_4uEBp0afEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 2, + "is-read-only": true, + "description": [ + "In case packet compression can be activated, but not configured to a certain type, packetCompressionAvail shall be set on 'true', but none of the compression level specific booleans." + ], + "uml-name": "packetCompressionIsAvail", + "controlType": "checkbox" + }, + "layer2-compression-is-avail": { + "id": "layer2-compression-is-avail", + "uml-id": "_4uEBqkafEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 3, + "is-read-only": true, + "description": [ + "Packet compression on layer 2 available at the device." + ], + "uml-name": "layer2CompressionIsAvail", + "controlType": "checkbox" + }, + "vlan-compression-is-avail": { + "id": "vlan-compression-is-avail", + "uml-id": "_4uEBrUafEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 4, + "is-read-only": true, + "description": [ + "Packet compression on VLAN layer available at the device." + ], + "uml-name": "vlanCompressionIsAvail", + "controlType": "checkbox" + }, + "q-in-q-compression-is-avail": { + "id": "q-in-q-compression-is-avail", + "uml-id": "_4uEBsEafEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 5, + "is-read-only": true, + "description": [ + "Packet compression on layer of a second VLAN available at the device." + ], + "uml-name": "qInQCompressionIsAvail", + "controlType": "checkbox" + }, + "mpls-compression-is-avail": { + "id": "mpls-compression-is-avail", + "uml-id": "_4uEBs0afEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 6, + "is-read-only": true, + "description": [ + "Packet compression on mpls layer available at the device." + ], + "uml-name": "mplsCompressionIsAvail", + "controlType": "checkbox" + }, + "ipv4-compression-is-avail": { + "id": "ipv4-compression-is-avail", + "uml-id": "_4uEBtkafEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 7, + "is-read-only": true, + "description": [ + "Packet compression on layer 3 for IPv4 available at the device." + ], + "uml-name": "ipv4CompressionIsAvail", + "controlType": "checkbox" + }, + "ipv6-compression-is-avail": { + "id": "ipv6-compression-is-avail", + "uml-id": "_4uEBuUafEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 8, + "is-read-only": true, + "description": [ + "Packet compression on layer 3 for IPv6 available at the device." + ], + "uml-name": "ipv6CompressionIsAvail", + "controlType": "checkbox" + }, + "layer4-compression-is-avail": { + "id": "layer4-compression-is-avail", + "uml-id": "_4uEBvEafEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 9, + "is-read-only": true, + "description": [ + "Packet compression on layer 4 (TCP and UDP header) available at the device." + ], + "uml-name": "layer4CompressionIsAvail", + "controlType": "checkbox" + }, + "container-id": { + "id": "container-id", + "uml-id": "_ecCeS0aqEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 1, + "is-read-only": false, + "description": [ + "ContainterID in Netconf must be the same as TDM Flow ID so a connection can be made between the two items, which separately exist in the controller." + ], + "uml-name": "containerID", + "controlType": "text" + }, + "segments-id-list": { + "id": "segments-id-list", + "uml-id": "_4uEBy0afEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "_Nd1F4MKuEeWwLJhHQlOGSQ", + "order-number": 2, + "is-read-only": false, + "description": [ + "Lists the segments used for transporting this Ethernet container. In case EthernetContainer::ContainerCapability::bundlingIsAvail==0, all TypeDefinitions::segmentIdType::structureId must be identical in the list." + ], + "uml-name": "segmentsIdList" + }, + "packet-compression-is-on": { + "id": "packet-compression-is-on", + "uml-id": "_4uEB1UafEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 3, + "is-read-only": false, + "description": [ + "In case packet compression is activated, but no type is activated, it is assumed that the device chooses the optimum." + ], + "uml-name": "packetCompressionIsOn", + "controlType": "checkbox" + }, + "layer2-compression-is-on": { + "id": "layer2-compression-is-on", + "uml-id": "_4uEB2kafEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 4, + "is-read-only": false, + "description": [ + "Packet compression on layer 2 configured at the device." + ], + "uml-name": "layer2CompressionIsOn", + "controlType": "checkbox" + }, + "vlan-compression-is-on": { + "id": "vlan-compression-is-on", + "uml-id": "_4uEB30afEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 5, + "is-read-only": false, + "description": [ + "Packet compression on VLAN layer configured at the device." + ], + "uml-name": "vlanCompressionIsOn", + "controlType": "checkbox" + }, + "q-in-q-compression-is-on": { + "id": "q-in-q-compression-is-on", + "uml-id": "_4uEB5EafEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 6, + "is-read-only": false, + "description": [ + "Packet compression on layer of a second VLAN configured at the device." + ], + "uml-name": "qInQCompressionIsOn", + "controlType": "checkbox" + }, + "mpls-compression-is-on": { + "id": "mpls-compression-is-on", + "uml-id": "_4uEB6UafEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 7, + "is-read-only": false, + "description": [ + "Packet compression on MPLS layer configured at the device." + ], + "uml-name": "mplsCompressionIsOn", + "controlType": "checkbox" + }, + "ipv4-compression-is-on": { + "id": "ipv4-compression-is-on", + "uml-id": "_4uEB7kafEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 8, + "is-read-only": false, + "description": [ + "Packet compression on layer 3 for IPv4 configured at the device." + ], + "uml-name": "ipv4CompressionIsOn", + "controlType": "checkbox" + }, + "ipv6-compression-is-on": { + "id": "ipv6-compression-is-on", + "uml-id": "_4uEB80afEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 9, + "is-read-only": false, + "description": [ + "Packet compression on layer 3 for IPv6 configured at the device." + ], + "uml-name": "ipv6CompressionIsOn", + "controlType": "checkbox" + }, + "layer4-compression-is-on": { + "id": "layer4-compression-is-on", + "uml-id": "_4uEB-EafEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 10, + "is-read-only": false, + "description": [ + "Packet compression on layer 4 (TCP and UDP header) configured at the device." + ], + "uml-name": "layer4CompressionIsOn", + "controlType": "checkbox" + }, + "mw-tdm-container-pac": { + "id": "mw-tdm-container-pac", + "uml-id": "_ecCeMUaqEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "MW_TdmContainer_Pac" + }, + "tdm-container-capability": { + "id": "tdm-container-capability", + "uml-id": "_ecCeSEaqEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Bundling is not available." + ], + "uml-name": "TdmContainerCapability" + }, + "tdm-container-configuration": { + "id": "tdm-container-configuration", + "uml-id": "_ecCecUaqEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "TdmContainerConfiguration" + }, + "tdm-container-status": { + "id": "tdm-container-status", + "uml-id": "_ecCesUaqEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "TdmContainerStatus" + }, + "tdm-container-current-problems": { + "id": "tdm-container-current-problems", + "uml-id": "_ecCevUaqEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "TdmContainerCurrentProblems" + }, + "tdm-container-current-performance": { + "id": "tdm-container-current-performance", + "uml-id": "_ecCew0aqEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Aggregated performance information of the TDM container at a particular moment." + ], + "uml-name": "TdmContainerCurrentPerformance" + }, + "tdm-container-historical-performances": { + "id": "tdm-container-historical-performances", + "uml-id": "_ecCex0aqEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Aggregated performance information of the TDM container for a pre-defined measurement interval." + ], + "uml-name": "TdmContainerHistoricalPerformances" + }, + "supported-tdm-container-types-list": { + "id": "supported-tdm-container-types-list", + "uml-id": "_R5hG0EdwEeax2rWez10Siw", + "uml-type": "ownedAttribute", + "type": "_rgbigEdjEeax2rWez10Siw", + "order-number": 1, + "is-read-only": true, + "description": [ + "Lists the TDM containers that are supported." + ], + "uml-name": "supportedTdmContainerTypesList" + }, + "container-type": { + "id": "container-type", + "uml-id": "_be7AoMWkEeW3xsRKtpCLuA", + "uml-type": "uml:DataType", + "uml-name": "ContainerType" + }, + "segment-id": { + "id": "segment-id", + "uml-id": "_ecCee0aqEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "_Nd1F4MKuEeWwLJhHQlOGSQ", + "order-number": 3, + "is-read-only": false, + "description": [ + "Multiplicity = 1; One segment per TDM container; Type of segment must match type of container;" + ], + "uml-name": "segmentID" + }, + "mw-current-problem": { + "id": "mw-current-problem", + "uml-id": "_LKRM4JNQEeWuAeXkr703BA", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "MwCurrentProblem" + }, + "sequence-number": { + "id": "sequence-number", + "uml-id": "_YadH4CJbEeaHpPYk5sscIg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 1, + "is-read-only": true, + "is-key": 1, + "description": [ + "Unique sequence number of the current problem object." + ], + "uml-name": "sequenceNumber", + "controlType": "number" + }, + "time-stamp": { + "id": "time-stamp", + "uml-id": "_lB4EQJN1EeWuAeXkr703BA", + "uml-type": "ownedAttribute", + "type": "../OnfModel-CoreModel/CoreModel.uml#_oGqi1lLNEeO75dO39GbF8Q", + "order-number": 2, + "is-read-only": true, + "description": [ + "Time and date of the problem. _format:yyyyMMddhhmmss.s[Z|{+|-}HHMm]; yyyy='0000'..'9999' year; MM='01'..'12' month; dd='01'..'31' day; hh='00'..'23' hour; mm='00'..'59' minute; ss='00'..'59' second; s='.0'..'.9'tenth of second (set to '.0' if EMS or NE cannot support this granularity); Z='Z' indicates UTC (rather than local time); {+|-}='+' or '-' delta from UTC; HH='00'..'23' time zone difference in hours; Mm='00'..'59' time zone difference in minutes." + ], + "uml-name": "timeStamp" + }, + "problem-severity": { + "id": "problem-severity", + "uml-id": "_qInZ8KT4EeapooeghKN-dA", + "uml-type": "ownedAttribute", + "type": "_eIml0JH1EeWUdbnmmNiTAA", + "order-number": 3, + "is-read-only": true, + "description": [ + "Severity of the alarm." + ], + "uml-name": "problemSeverity", + "controlType": [ + "non-alarmed", + "warning", + "minor", + "major", + "critical" + ] + }, + "channel-plan-type": { + "id": "channel-plan-type", + "uml-id": "_oQf6IPXSEeW9zIqh2WHHww", + "uml-type": "uml:DataType", + "uml-name": "ChannelPlanType" + }, + "duplex-distance-is-variable": { + "id": "duplex-distance-is-variable", + "uml-id": "_OPxkQK42EeWxIavXll_b0A", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 2, + "is-read-only": true, + "description": [ + "To be set on 'true', if the distance between transmitted and received frequency is variable." + ], + "uml-name": "duplexDistanceIsVariable", + "controlType": "checkbox" + }, + "duplex-distance": { + "id": "duplex-distance", + "uml-id": "_BEr_wIMEEeWMcJAvkeTn2w", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 3, + "is-read-only": true, + "unit": "kHz", + "description": [ + "Distance between transmitted and received frequency." + ], + "uml-name": "duplexDistance", + "controlType": "number" + }, + "auto-freq-select-is-avail": { + "id": "auto-freq-select-is-avail", + "uml-id": "_te6XMIL8EeWMcJAvkeTn2w", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 4, + "is-read-only": true, + "description": [ + "In case the microwave radio is capable of automatically selecting the transmit frequency in unlicensed bands, this field shall contain a 'true'." + ], + "uml-name": "autoFreqSelectIsAvail", + "controlType": "checkbox" + }, + "transmission-mode-type": { + "id": "transmission-mode-type", + "uml-id": "_zG34sPXQEeW9zIqh2WHHww", + "uml-type": "uml:DataType", + "uml-name": "TransmissionModeType" + }, + "transmission-mode-id": { + "id": "transmission-mode-id", + "uml-id": "_afdYoNumEeWHIeLurhMv0A", + "uml-type": "ownedAttribute", + "type": "../OnfModel-CoreModel/CoreModel.uml#_SU3Q4I30EeO38ZmbECnvbg", + "order-number": 1, + "is-read-only": true, + "is-key": 1, + "description": [ + "Indentifies the transmissionMode for internal reference." + ], + "uml-name": "transmissionModeId" + }, + "channel-bandwidth": { + "id": "channel-bandwidth", + "uml-id": "_FteJEHfdEeW-h9gN8LYm4Q", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 2, + "is-read-only": true, + "unit": "kHz", + "description": [ + "Bandwidth of the transmit channel. The value shall be expressed explicitly (means in kHz) not as a reference to an international agreement. The values shall be chosen from the following _list: 3.500, 7.000, 14.000, 27.500, 28.000, 29.000, 29.650, 30.000, 40.000, 50.000, 55.000, 56.000, 59.300, 60.000, 80.000, 100.000, 112.000, 120.000, 150.000, 200.000, 250.000, 500.000, 750.000, 1.000.000, 1.250.000, 1.500.000, 1.750.000, 2.000.000;" + ], + "uml-name": "channelBandwidth", + "controlType": "number" + }, + "modulation-scheme": { + "id": "modulation-scheme", + "uml-id": "_G4H-UHfdEeW-h9gN8LYm4Q", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 3, + "is-read-only": true, + "unit": "symbols", + "description": [ + "Modulation scheme, which is base to the other characteristics described in the same transmissionModeType data type. The modulation scheme shall be described by the number of states in the phase diagram (e.g. BPSK->'2' or 256QAM->'256')." + ], + "uml-name": "modulationScheme", + "controlType": "number" + }, + "code-rate": { + "id": "code-rate", + "uml-id": "_jE7-EHf4EeW-h9gN8LYm4Q", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 4, + "is-read-only": true, + "unit": "%", + "description": [ + "Code rate of the coding scheme in % (Net bit rate ≤ Gross bit rate · code rate)." + ], + "uml-name": "codeRate", + "controlType": "number" + }, + "tx-power-min": { + "id": "tx-power-min", + "uml-id": "_I3nJ0HfdEeW-h9gN8LYm4Q", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 5, + "is-read-only": true, + "unit": "dBm", + "description": [ + "Value of the minimum transmit power the modem can operate in dBm." + ], + "uml-name": "txPowerMin", + "controlType": "number" + }, + "tx-power-max": { + "id": "tx-power-max", + "uml-id": "_KB7A0HfdEeW-h9gN8LYm4Q", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 6, + "is-read-only": true, + "unit": "dBm", + "description": [ + "Value of the maximum transmit power the modem can operate in dBm." + ], + "uml-name": "txPowerMax", + "controlType": "number" + }, + "rx-threshold": { + "id": "rx-threshold", + "uml-id": "_LCr6QHfdEeW-h9gN8LYm4Q", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 7, + "is-read-only": true, + "unit": "dBm", + "description": [ + "Value of the receive level required to decode the received signal with a Bit Error Rate of 1e-6 or less." + ], + "uml-name": "rxThreshold", + "controlType": "number" + }, + "am-upshift-level": { + "id": "am-upshift-level", + "uml-id": "_MGguwHfdEeW-h9gN8LYm4Q", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 8, + "is-read-only": true, + "unit": "dBm", + "description": [ + "Value of the receive level that has to be exceeded to shift into a higher modulation scheme." + ], + "uml-name": "amUpshiftLevel", + "controlType": "number" + }, + "am-downshift-level": { + "id": "am-downshift-level", + "uml-id": "_NIvAwHfdEeW-h9gN8LYm4Q", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 9, + "is-read-only": true, + "unit": "dBm", + "description": [ + "Value of the receive level that has to be exceeded for not shifting into a lower modulation scheme." + ], + "uml-name": "amDownshiftLevel", + "controlType": "number" + }, + "xpic-is-avail": { + "id": "xpic-is-avail", + "uml-id": "_QHd9kHfvEeW-h9gN8LYm4Q", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 10, + "is-read-only": true, + "description": [ + "In case this air interface type is capable of XPIC, this field shall contain a 'true'. This information shall purely relate to capabilities of the equipment type, but not to the operational capability of a specific hardware composition on site. Means for example that this attribute might contain a 'true' statement, even if an additional cable would have been required to actually operate XPIC in a specific case." + ], + "uml-name": "xpicIsAvail", + "controlType": "checkbox" + }, + "air-interface-problem-severity-type": { + "id": "air-interface-problem-severity-type", + "uml-id": "_ZKdWgGnuEeaZwMagYjVCHQ", + "uml-type": "uml:DataType", + "uml-name": "AirInterfaceProblemSeverityType" + }, + "problem-kind-name": { + "id": "problem-kind-name", + "uml-id": "_OMQH0Gz0Eeaf-__BRLM84g", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 1, + "is-read-only": false, + "is-key": 1, + "description": [ + "Name of the alarm according to Container::ContainerCapability::supportedAlarms" + ], + "uml-name": "problemKindName", + "controlType": "text" + }, + "air-interface-current-problem-type": { + "id": "air-interface-current-problem-type", + "uml-id": "_umuZUMXjEeW3xsRKtpCLuA", + "uml-type": "uml:DataType", + "uml-name": "AirInterfaceCurrentProblemType" + }, + "problem-name": { + "id": "problem-name", + "uml-id": "__h1n4cXpEeWJ6KZuc0h_vw", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 1, + "is-read-only": true, + "description": [ + "Name of the alarm according to Container::ContainerCapability::supportedAlarms" + ], + "uml-name": "problemName", + "controlType": "text" + }, + "air-interface-performance-type": { + "id": "air-interface-performance-type", + "uml-id": "_OvFYwEQbEea3g-FxAUaYRg", + "uml-type": "uml:DataType", + "description": [ + "Consolidated performance information of the air interface." + ], + "uml-name": "AirInterfacePerformanceType" + }, + "es": { + "id": "es", + "uml-id": "_DbVzpUQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 1, + "is-read-only": true, + "unit": "s", + "description": [ + "Number of errored seconds." + ], + "uml-name": "es", + "controlType": "number" + }, + "ses": { + "id": "ses", + "uml-id": "_DbVzqUQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 2, + "is-read-only": true, + "unit": "s", + "description": [ + "Number of severely errored seconds." + ], + "uml-name": "ses", + "controlType": "number" + }, + "cses": { + "id": "cses", + "uml-id": "_DbVzrUQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 3, + "is-read-only": true, + "unit": "s", + "description": [ + "Number of consecutive severely errored seconds." + ], + "uml-name": "cses", + "controlType": "number" + }, + "unavailability": { + "id": "unavailability", + "uml-id": "_DbVzsUQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 4, + "is-read-only": true, + "unit": "s", + "description": [ + "Total time of unavailability in seconds." + ], + "uml-name": "unavailability", + "controlType": "number" + }, + "tx-level-min": { + "id": "tx-level-min", + "uml-id": "_DbVztUQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 5, + "is-read-only": true, + "unit": "dBm", + "description": [ + "Minimum transmit power. Signed integers are required." + ], + "uml-name": "txLevelMin", + "controlType": "number" + }, + "tx-level-max": { + "id": "tx-level-max", + "uml-id": "_DbVzuUQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 6, + "is-read-only": true, + "unit": "dBm", + "description": [ + "Maximum transmit power. Signed integers are required." + ], + "uml-name": "txLevelMax", + "controlType": "number" + }, + "tx-level-avg": { + "id": "tx-level-avg", + "uml-id": "_DbVzvUQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 7, + "is-read-only": true, + "unit": "dBm", + "description": [ + "Averaged transmit power. Signed integers are required." + ], + "uml-name": "txLevelAvg", + "controlType": "number" + }, + "rx-level-min": { + "id": "rx-level-min", + "uml-id": "_DbVzwUQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 8, + "is-read-only": true, + "unit": "dBm", + "description": [ + "Minimum receive level. Signed integers are required." + ], + "uml-name": "rxLevelMin", + "controlType": "number" + }, + "rx-level-max": { + "id": "rx-level-max", + "uml-id": "_DbVzxUQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 9, + "is-read-only": true, + "unit": "dBm", + "description": [ + "Maximum receive level. Signed integers are required." + ], + "uml-name": "rxLevelMax", + "controlType": "number" + }, + "rx-level-avg": { + "id": "rx-level-avg", + "uml-id": "_DbVzyUQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 10, + "is-read-only": true, + "unit": "dBm", + "description": [ + "Averaged receive level. Signed integers are required." + ], + "uml-name": "rxLevelAvg", + "controlType": "number" + }, + "time2-states": { + "id": "time2-states", + "uml-id": "_DbVzzUQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 11, + "is-read-only": true, + "unit": "s", + "description": [ + "Sum of all seconds the transmitter operated in e.g. BPSK." + ], + "uml-name": "time2States", + "controlType": "number" + }, + "time4-states-s": { + "id": "time4-states-s", + "uml-id": "_DbVz0kQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 12, + "is-read-only": true, + "unit": "s", + "uml-name": "time4StatesS", + "controlType": "number" + }, + "time4-states": { + "id": "time4-states", + "uml-id": "_DbVz2EQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 13, + "is-read-only": true, + "unit": "s", + "uml-name": "time4States", + "controlType": "number" + }, + "time8-states": { + "id": "time8-states", + "uml-id": "_DbVz3UQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 14, + "is-read-only": true, + "unit": "s", + "uml-name": "time8States", + "controlType": "number" + }, + "time16-states-s": { + "id": "time16-states-s", + "uml-id": "_DbVz4kQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 15, + "is-read-only": true, + "unit": "s", + "uml-name": "time16StatesS", + "controlType": "number" + }, + "time16-states": { + "id": "time16-states", + "uml-id": "_DbVz50QbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 16, + "is-read-only": true, + "unit": "s", + "uml-name": "time16States", + "controlType": "number" + }, + "time32-states": { + "id": "time32-states", + "uml-id": "_DbVz7EQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 17, + "is-read-only": true, + "unit": "s", + "uml-name": "time32States", + "controlType": "number" + }, + "time64-states": { + "id": "time64-states", + "uml-id": "_DbVz8UQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 18, + "is-read-only": true, + "unit": "s", + "uml-name": "time64States", + "controlType": "number" + }, + "time128-states": { + "id": "time128-states", + "uml-id": "_DbVz9kQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 19, + "is-read-only": true, + "unit": "s", + "uml-name": "time128States", + "controlType": "number" + }, + "time256-states": { + "id": "time256-states", + "uml-id": "_DbVz-0QbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 20, + "is-read-only": true, + "unit": "s", + "uml-name": "time256States", + "controlType": "number" + }, + "time512-states": { + "id": "time512-states", + "uml-id": "_DbV0AEQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 21, + "is-read-only": true, + "unit": "s", + "uml-name": "time512States", + "controlType": "number" + }, + "time512-states-l": { + "id": "time512-states-l", + "uml-id": "_DbV0BUQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 22, + "is-read-only": true, + "unit": "s", + "uml-name": "time512StatesL", + "controlType": "number" + }, + "time1024-states": { + "id": "time1024-states", + "uml-id": "_DbV0CkQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 23, + "is-read-only": true, + "unit": "s", + "uml-name": "time1024States", + "controlType": "number" + }, + "time1024-states-l": { + "id": "time1024-states-l", + "uml-id": "_DbV0D0QbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 24, + "is-read-only": true, + "unit": "s", + "uml-name": "time1024StatesL", + "controlType": "number" + }, + "time2048-states": { + "id": "time2048-states", + "uml-id": "_DbV0FEQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 25, + "is-read-only": true, + "unit": "s", + "uml-name": "time2048States", + "controlType": "number" + }, + "time2048-states-l": { + "id": "time2048-states-l", + "uml-id": "_DbV0GUQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 26, + "is-read-only": true, + "unit": "s", + "uml-name": "time2048StatesL", + "controlType": "number" + }, + "time4096-states": { + "id": "time4096-states", + "uml-id": "_DbV0HkQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 27, + "is-read-only": true, + "unit": "s", + "uml-name": "time4096States", + "controlType": "number" + }, + "time4096-states-l": { + "id": "time4096-states-l", + "uml-id": "_DbV0I0QbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 28, + "is-read-only": true, + "unit": "s", + "uml-name": "time4096StatesL", + "controlType": "number" + }, + "time8192-states": { + "id": "time8192-states", + "uml-id": "_DbV0KEQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 29, + "is-read-only": true, + "unit": "s", + "uml-name": "time8192States", + "controlType": "number" + }, + "time8192-states-l": { + "id": "time8192-states-l", + "uml-id": "_DbV0LUQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 30, + "is-read-only": true, + "unit": "s", + "uml-name": "time8192StatesL", + "controlType": "number" + }, + "snir-min": { + "id": "snir-min", + "uml-id": "_nG-NsEzvEeaRytIQfQ43Wg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 1, + "is-read-only": true, + "unit": "dB", + "description": [ + "Minimum signal to (noise+interference) ratio of the combined signals." + ], + "uml-name": "snirMin", + "controlType": "number" + }, + "snir-max": { + "id": "snir-max", + "uml-id": "_n_OEUEzvEeaRytIQfQ43Wg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 2, + "is-read-only": true, + "unit": "dB", + "description": [ + "Maximum signal to (noise+interference) ratio of the combined signals." + ], + "uml-name": "snirMax", + "controlType": "number" + }, + "snir-avg": { + "id": "snir-avg", + "uml-id": "_oU3kMEzvEeaRytIQfQ43Wg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 3, + "is-read-only": true, + "unit": "dB", + "description": [ + "Average signal to (noise+interference) ratio of the combined signals." + ], + "uml-name": "snirAvg", + "controlType": "number" + }, + "xpd-min": { + "id": "xpd-min", + "uml-id": "_DbV0PkQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 34, + "is-read-only": true, + "unit": "dB", + "description": [ + "Minimum cross polarization discrimination." + ], + "uml-name": "xpdMin", + "controlType": "number" + }, + "xpd-max": { + "id": "xpd-max", + "uml-id": "_DbV0QkQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 35, + "is-read-only": true, + "unit": "dB", + "description": [ + "Maximum cross polarization discrimination." + ], + "uml-name": "xpdMax", + "controlType": "number" + }, + "xpd-avg": { + "id": "xpd-avg", + "uml-id": "_DbV0RkQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 36, + "is-read-only": true, + "unit": "dB", + "description": [ + "Averaged cross polarization discrimination." + ], + "uml-name": "xpdAvg", + "controlType": "number" + }, + "rf-temp-min": { + "id": "rf-temp-min", + "uml-id": "_DbV0SkQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 37, + "is-read-only": true, + "unit": "C", + "description": [ + "Lowest temperature (in degree Celsius) of the radio module inside the outdoor unit." + ], + "uml-name": "rfTempMin", + "controlType": "number" + }, + "rf-temp-max": { + "id": "rf-temp-max", + "uml-id": "_DbV0TkQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 38, + "is-read-only": true, + "unit": "C", + "description": [ + "Highest temperature (in degree Celsius) of the radio module inside the outdoor unit." + ], + "uml-name": "rfTempMax", + "controlType": "number" + }, + "rf-temp-avg": { + "id": "rf-temp-avg", + "uml-id": "_DbV0UkQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 39, + "is-read-only": true, + "unit": "C", + "description": [ + "Averaged temperature (in degree Celsius) of the radio module inside the outdoor unit." + ], + "uml-name": "rfTempAvg", + "controlType": "number" + }, + "defect-blocks-sum": { + "id": "defect-blocks-sum", + "uml-id": "_DbV0VkQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 40, + "is-read-only": true, + "unit": "blocks", + "description": [ + "Total number of blocks that were defect after receiving and could not be corrected by the FEC." + ], + "uml-name": "defectBlocksSum", + "controlType": "number" + }, + "time-period": { + "id": "time-period", + "uml-id": "_Nyme4H1IEeWHjMaYlqnBcw", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 4, + "is-read-only": true, + "unit": "s", + "description": [ + "Total length of the measurement period in seconds." + ], + "uml-name": "timePeriod", + "controlType": "number" + }, + "air-interface-current-performance-type": { + "id": "air-interface-current-performance-type", + "uml-id": "_pQ_y4GoHEeaZwMagYjVCHQ", + "uml-type": "uml:DataType", + "description": [ + "Turns performance information into current performance information by inheriting from OTN_CurrentData." + ], + "uml-name": "AirInterfaceCurrentPerformanceType" + }, + "performance-data": { + "id": "performance-data", + "uml-id": "_i5STYGz7Eeaf-__BRLM84g", + "uml-type": "ownedAttribute", + "type": "_U9tW0EQeEea3g-FxAUaYRg", + "order-number": 1, + "is-read-only": true, + "uml-name": "performanceData" + }, + "air-interface-historical-performance-type": { + "id": "air-interface-historical-performance-type", + "uml-id": "_t18kwGoHEeaZwMagYjVCHQ", + "uml-type": "uml:DataType", + "description": [ + "Turns performance information into historical performance information by inheriting from OTN_HistoryData." + ], + "uml-name": "AirInterfaceHistoricalPerformanceType" + }, + "diversity-type": { + "id": "diversity-type", + "uml-id": "_pTliINyUEeW-SfXlFFFI0Q", + "uml-type": "uml:DataType", + "uml-name": "DiversityType" + }, + "diversity-name": { + "id": "diversity-name", + "uml-id": "_uYhboNyUEeW-SfXlFFFI0Q", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 1, + "is-read-only": true, + "is-key": 1, + "description": [ + "Names to be chosen from the following list: 'spaceDiversity', 'frequencyDiversity'" + ], + "uml-name": "diversityName", + "controlType": "text" + }, + "number-of-air-interfaces-max": { + "id": "number-of-air-interfaces-max", + "uml-id": "_wKDDoNyUEeW-SfXlFFFI0Q", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 2, + "is-read-only": true, + "unit": "air interfaces", + "description": [ + "Maximum number of air interfaces that could be part of this kind of diversity." + ], + "uml-name": "numberOfAirInterfacesMax", + "controlType": "number" + }, + "air-interface-diversity-problem-severity-type": { + "id": "air-interface-diversity-problem-severity-type", + "uml-id": "_2kMRYGzzEeaf-__BRLM84g", + "uml-type": "uml:DataType", + "uml-name": "AirInterfaceDiversityProblemSeverityType" + }, + "air-interface-diversity-current-problem-type": { + "id": "air-interface-diversity-current-problem-type", + "uml-id": "_z1XWgMXlEeWJ6KZuc0h_vw", + "uml-type": "uml:DataType", + "uml-name": "AirInterfaceDiversityCurrentProblemType" + }, + "air-interface-diversity-performance-type": { + "id": "air-interface-diversity-performance-type", + "uml-id": "_EH3QgEQdEea3g-FxAUaYRg", + "uml-type": "uml:DataType", + "description": [ + "Consolidated performance information of the air interface diversity group." + ], + "uml-name": "AirInterfaceDiversityPerformanceType" + }, + "air-interface-diversity-current-performance-type": { + "id": "air-interface-diversity-current-performance-type", + "uml-id": "_n4wTgGz6Eeaf-__BRLM84g", + "uml-type": "uml:DataType", + "description": [ + "Turns performance information into current performance information by inheriting from OTN_CurrentData." + ], + "uml-name": "AirInterfaceDiversityCurrentPerformanceType" + }, + "air-interface-diversity-historical-performance-type": { + "id": "air-interface-diversity-historical-performance-type", + "uml-id": "_pG0pIGz6Eeaf-__BRLM84g", + "uml-type": "uml:DataType", + "description": [ + "Turns performance information into historical performance information by inheriting from OTN_HistoryData." + ], + "uml-name": "AirInterfaceDiversityHistoricalPerformanceType" + }, + "tdm-structure-type": { + "id": "tdm-structure-type", + "uml-id": "_jRAQsEdoEeax2rWez10Siw", + "uml-type": "uml:DataType", + "uml-name": "TdmStructureType" + }, + "tdm-structure-name": { + "id": "tdm-structure-name", + "uml-id": "_1bJF4EdoEeax2rWez10Siw", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 1, + "is-read-only": true, + "is-key": 1, + "description": [ + "Names to be chosen from the following list: 'e1','t1','j1','e3','ds3','stm1','cpri1','cpri2','cpri3','cpri4','cpri5','cpri6' or 'cpri7'" + ], + "uml-name": "tdmStructureName", + "controlType": "text" + }, + "tdm-segment-size": { + "id": "tdm-segment-size", + "uml-id": "_hPq1oEdpEeax2rWez10Siw", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 2, + "is-read-only": true, + "unit": "kbit/s", + "description": [ + "Size of the TDM segment in kbit/s. Values to be chosen from the following list: '2048','1544','34000','44736 ','155520','614400','1228800','2457600','3072000','4915200','6144000' or '9830400;" + ], + "uml-name": "tdmSegmentSize", + "controlType": "number" + }, + "max-number-of-segments-reservable": { + "id": "max-number-of-segments-reservable", + "uml-id": "_EJnsgEdpEeax2rWez10Siw", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 3, + "is-read-only": true, + "unit": "segments", + "description": [ + "Device specific maximum number of segments (not depending on current air interface configuration) that can be reserved for this type of segment on a single air interface." + ], + "uml-name": "maxNumberOfSegmentsReservable", + "controlType": "number" + }, + "structure-problem-severity-type": { + "id": "structure-problem-severity-type", + "uml-id": "_LPgp4Gz0Eeaf-__BRLM84g", + "uml-type": "uml:DataType", + "uml-name": "StructureProblemSeverityType" + }, + "structure-current-problem-type": { + "id": "structure-current-problem-type", + "uml-id": "_UC0gAMXnEeWJ6KZuc0h_vw", + "uml-type": "uml:DataType", + "uml-name": "StructureCurrentProblemType" + }, + "structure-performance-type": { + "id": "structure-performance-type", + "uml-id": "_kzEicEQdEea3g-FxAUaYRg", + "uml-type": "uml:DataType", + "description": [ + "Consolidated performance information of the Structure." + ], + "uml-name": "StructurePerformanceType" + }, + "structure-current-performance-type": { + "id": "structure-current-performance-type", + "uml-id": "_o7jNQGz6Eeaf-__BRLM84g", + "uml-type": "uml:DataType", + "description": [ + "Turns performance information into current performance information by inheriting from OTN_CurrentData." + ], + "uml-name": "StructureCurrentPerformanceType" + }, + "structure-historical-performance-type": { + "id": "structure-historical-performance-type", + "uml-id": "_pNAJoGz6Eeaf-__BRLM84g", + "uml-type": "uml:DataType", + "description": [ + "Turns performance information into historical performance information by inheriting from OTN_HistoryData." + ], + "uml-name": "StructureHistoricalPerformanceType" + }, + "container-name": { + "id": "container-name", + "uml-id": "_o0IuQMWkEeW3xsRKtpCLuA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 1, + "is-read-only": true, + "is-key": 1, + "description": [ + "Names to be chosen from the following list: 'ethernet','e1','t1','j1','e3','ds3','stm1','cpri1','cpri2','cpri3','cpri4','cpri5','cpri6' or 'cpri7'" + ], + "uml-name": "containerName", + "controlType": "text" + }, + "number-of-time-slots-required": { + "id": "number-of-time-slots-required", + "uml-id": "_sZ82MMXXEeW3xsRKtpCLuA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 2, + "is-read-only": true, + "unit": "timeslots", + "description": [ + "Number of time slots required for transporting this type of container. Value must be calculated by the vendor after defining the timeSlotCapacity. For containers of fixed size: numberOfTimeSlotsRequired = required bandwidth of the container divided by timeSlotCapacity. For containers of variable size the minimum (most probably 1) is to be stated." + ], + "uml-name": "numberOfTimeSlotsRequired", + "controlType": "number" + }, + "tdm-time-slots-is-required": { + "id": "tdm-time-slots-is-required", + "uml-id": "_hIagINrWEeWcA7plcJPZ7A", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 3, + "is-read-only": true, + "description": [ + "Shall be set to '1', if this container type requires bandwidth (times slots) reserved for TDM transport." + ], + "uml-name": "tdmTimeSlotsIsRequired", + "controlType": "checkbox" + }, + "tdm-container-type": { + "id": "tdm-container-type", + "uml-id": "_rgbigEdjEeax2rWez10Siw", + "uml-type": "uml:DataType", + "uml-name": "TdmContainerType" + }, + "tdm-container-name": { + "id": "tdm-container-name", + "uml-id": "_rgbigkdjEeax2rWez10Siw", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 1, + "is-read-only": true, + "is-key": 1, + "description": [ + "Names to be chosen from the following list: 'e1','t1','j1','e3','t3','stm1','cpri1','cpri2','cpri3','cpri4','cpri5','cpri6' or 'cpri7'" + ], + "uml-name": "tdmContainerName", + "controlType": "text" + }, + "tdm-container-size": { + "id": "tdm-container-size", + "uml-id": "_rgbihEdjEeax2rWez10Siw", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 2, + "is-read-only": true, + "unit": "kbit/s", + "description": [ + "Capacity required for transporting this type of container (in kbit/s). Values to be chosen from the following list: '2048','1544','34000','44736 ','155520','614400','1228800','2457600','3072000','4915200','6144000' or '9830400;" + ], + "uml-name": "tdmContainerSize", + "controlType": "number" + }, + "segment-id-type": { + "id": "segment-id-type", + "uml-id": "_Nd1F4MKuEeWwLJhHQlOGSQ", + "uml-type": "uml:DataType", + "description": [ + "Identifies the segments, which are used to transport the container." + ], + "uml-name": "SegmentIDType" + }, + "structure-id-ref": { + "id": "structure-id-ref", + "uml-id": "_N4GKkMKvEeWwLJhHQlOGSQ", + "uml-type": "ownedAttribute", + "type": "../OnfModel-CoreModel/CoreModel.uml#_SU3Q4I30EeO38ZmbECnvbg", + "order-number": 1, + "is-read-only": false, + "is-key": 1, + "uml-name": "structureIdRef" + }, + "segment-id-ref": { + "id": "segment-id-ref", + "uml-id": "_nVubgMKvEeWwLJhHQlOGSQ", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 2, + "is-read-only": false, + "is-key": 2, + "description": [ + "Combinations of structureId and segmentId must be unique inside the device to assure that every resource is used just once." + ], + "uml-name": "segmentIdRef", + "controlType": "number" + }, + "segment-status-type": { + "id": "segment-status-type", + "uml-id": "_KwZVcMUCEeW3xsRKtpCLuA", + "uml-type": "uml:DataType", + "uml-name": "SegmentStatusType" + }, + "segment-status-type-id": { + "id": "segment-status-type-id", + "uml-id": "_7JBAYOLbEeWM2vUDE3Xqhw", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 1, + "is-read-only": true, + "is-key": 1, + "uml-name": "segmentStatusTypeId", + "controlType": "number" + }, + "segment-is-reserved-for-tdm": { + "id": "segment-is-reserved-for-tdm", + "uml-id": "__1DMwMUCEeW3xsRKtpCLuA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 2, + "is-read-only": true, + "description": [ + "The number of segments, which is configured by Structure::StructureConfiguration::tdmReservedNumberOfSegements, has to be reserved for TDM. Starting from the lowest index value, these segments have to be marked with a 'true' in segmentIsReservedForTdm." + ], + "uml-name": "segmentIsReservedForTdm", + "controlType": "checkbox" + }, + "operational-status": { + "id": "operational-status", + "uml-id": "_ZA94EMUCEeW3xsRKtpCLuA", + "uml-type": "ownedAttribute", + "type": "../OnfModel-CoreModel/CoreModel.uml#_lNclkLEtEeSZUdYfPSdgew", + "order-number": 3, + "is-read-only": true, + "description": [ + "Current operational status of each segment." + ], + "uml-name": "operationalStatus" + }, + "obsolete-priority-class": { + "id": "obsolete-priority-class", + "uml-id": "_ebslwMnAEeWYRsWW_rqpgw", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 4, + "is-read-only": true, + "description": [ + "PriorityClass as inherited from the associated Container::ContainerConfiguration::priorityClass. In case the device is capable of adapting the sequence, in which segments are being dropped in case of decreasing capacity of the air interface, priorityClass shall be considered, while calculating the dropOrderRank." + ], + "uml-name": "obsoletePriorityClass", + "controlType": "number" + }, + "obsolete-drop-order-rank": { + "id": "obsolete-drop-order-rank", + "uml-id": "_DbJpMMnDEeWYRsWW_rqpgw", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 5, + "is-read-only": true, + "description": [ + "In case the device is NOT capable of adapting the sequence, in which segments are being dropped in case of decreasing capacity of the air interface, dropOrderRank is number of segments minus sequence number of the segment. In case the device is capable of adapting the sequence, dropOrderRank has to be calculated by the device in dependency to the assigned priorityClass. _unique: within Structure::StructureStatus::segmentStatusList" + ], + "uml-name": "obsoleteDropOrderRank", + "controlType": "number" + }, + "container-problem-severity-type": { + "id": "container-problem-severity-type", + "uml-id": "_OMPgwGz0Eeaf-__BRLM84g", + "uml-type": "uml:DataType", + "uml-name": "ContainerProblemSeverityType" + }, + "container-current-problem-type": { + "id": "container-current-problem-type", + "uml-id": "__h1n4MXpEeWJ6KZuc0h_vw", + "uml-type": "uml:DataType", + "uml-name": "ContainerCurrentProblemType" + }, + "container-performance-type": { + "id": "container-performance-type", + "uml-id": "_U9tW0EQeEea3g-FxAUaYRg", + "uml-type": "uml:DataType", + "description": [ + "Consolidated performance information of the Container." + ], + "uml-name": "ContainerPerformanceType" + }, + "tx-ethernet-bytes-max-s": { + "id": "tx-ethernet-bytes-max-s", + "uml-id": "_MaHB8H1IEeWHjMaYlqnBcw", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 1, + "is-read-only": true, + "unit": "Bytes/s", + "description": [ + "Counts the number of Bytes of Ethernet traffic (before header compression) transmitted within a second and keeps the highest value within the measurement period. Field to be left blank for all types of TDM containers." + ], + "uml-name": "txEthernetBytesMaxS", + "controlType": "number" + }, + "tx-ethernet-bytes-max-m": { + "id": "tx-ethernet-bytes-max-m", + "uml-id": "_M3NNoH1IEeWHjMaYlqnBcw", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 2, + "is-read-only": true, + "unit": "Bytes/min", + "description": [ + "Counts the number of Bytes of Ethernet traffic (before header compression) transmitted within a minute and keeps the highest value with in the measurement period. Field to be left blank for all types of TDM containers." + ], + "uml-name": "txEthernetBytesMaxM", + "controlType": "number" + }, + "tx-ethernet-bytes-sum": { + "id": "tx-ethernet-bytes-sum", + "uml-id": "_NWtNEH1IEeWHjMaYlqnBcw", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 3, + "is-read-only": true, + "unit": "Bytes", + "description": [ + "Total number of Bytes of Ethernet traffic (before header compression) transmitted (in direction out of the device) during the measurement period. Field to be left blank for all types of TDM containers." + ], + "uml-name": "txEthernetBytesSum", + "controlType": "number" + }, + "container-current-performance-type": { + "id": "container-current-performance-type", + "uml-id": "_pA5AQGz6Eeaf-__BRLM84g", + "uml-type": "uml:DataType", + "description": [ + "Turns performance information into current performance information by inheriting from OTN_CurrentData." + ], + "uml-name": "ContainerCurrentPerformanceType" + }, + "container-historical-performance-type": { + "id": "container-historical-performance-type", + "uml-id": "_pTaToGz6Eeaf-__BRLM84g", + "uml-type": "uml:DataType", + "description": [ + "Turns performance information into historical performance information by inheriting from OTN_HistoryData." + ], + "uml-name": "ContainerHistoricalPerformanceType" + }, + "3-cz3-u-is-d-eead4-ers-mr-oj-bq": { + "id": "3-cz3-u-is-d-eead4-ers-mr-oj-bq", + "uml-id": "_3CZ3UIsDEead4ersMrOjBQ", + "enum": [ + "NON", + "IF", + "RF" + ], + "is-read-only": false, + "uml-name": "_3CZ3UIsDEead4ersMrOjBQ" + }, + "e-iml0-jh1-ee-w-udbnmm-ni-taa": { + "id": "e-iml0-jh1-ee-w-udbnmm-ni-taa", + "uml-id": "_eIml0JH1EeWUdbnmmNiTAA", + "enum": [ + "NON_ALARMED", + "WARNING", + "MINOR", + "MAJOR", + "CRITICAL" + ], + "is-read-only": false, + "description": [ + "According to ITU-T M.3160" + ], + "uml-name": "_eIml0JH1EeWUdbnmmNiTAA" + }, + "e85-ns-i99-ee-w-fluv9-kl-ll5-a": { + "id": "e85-ns-i99-ee-w-fluv9-kl-ll5-a", + "uml-id": "_e85NsI99EeWFluv9KLLl5A", + "enum": [ + "NOT_SPECIFIED", + "HORIZONTAL", + "VERTICAL" + ], + "is-read-only": false, + "uml-name": "_e85NsI99EeWFluv9KLLl5A" + }, + "da-b5-ij-rg-ee-wx-ip-ew-zq-gmw": { + "id": "da-b5-ij-rg-ee-wx-ip-ew-zq-gmw", + "uml-id": "_DaB5IJRgEeWxIPEwZQ_gmw", + "enum": [ + "HSB" + ], + "is-read-only": false, + "uml-name": "_DaB5IJRgEeWxIPEwZQ_gmw" + }, + "01-d-yj-re-ee-wx-ip-ew-zq-gmw": { + "id": "01-d-yj-re-ee-wx-ip-ew-zq-gmw", + "uml-id": "_01_dYJReEeWxIPEwZQ_gmw", + "enum": [ + "WORKING", + "PROTECTION", + "PROTECTED" + ], + "is-read-only": false, + "uml-name": "_01_dYJReEeWxIPEwZQ_gmw" + }, + "du-js8-jox-ee-wz-6-sq-lz-uedw": { + "id": "du-js8-jox-ee-wz-6-sq-lz-uedw", + "uml-id": "_DUJs8JOXEeWz-6sqLzUedw", + "enum": [ + "GROUP_DOWN", + "NOT_ALL_AI_ACTIVE", + "ALL_AI_ACTIVE" + ], + "is-read-only": false, + "uml-name": "_DUJs8JOXEeWz-6sqLzUedw" + } + } +} \ No newline at end of file diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/elasticsearch/index/mwtn/modelDescription/microwave-model.yin.json b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/elasticsearch/index/mwtn/modelDescription/microwave-model.yin.json new file mode 100755 index 00000000..00b1ed60 --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/elasticsearch/index/mwtn/modelDescription/microwave-model.yin.json @@ -0,0 +1,223 @@ +{ + "module": { + "name": "microwave-model", + "microwave-model": { + "mw-air-interface-pac": { + "type": "list", + "key": "layer-protocol", + "air-interface-capability": { + "name": "air-interface-capability", + "local-name": "capability", + "type": "container" + }, + "air-interface-configuration": { + "name": "air-interface-configuration", + "local-name": "configuration", + "type": "container" + }, + "air-interface-status": { + "name": "air-interface-status", + "local-name": "status", + "type": "container" + }, + "air-interface-current-problems": { + "name": "air-interface-current-problems", + "local-name": "current-problems", + "type": "container" + }, + "air-interface-current-performance": { + "name": "air-interface-current-performance", + "local-name": "current-performance", + "type": "container" + }, + "air-interface-historical-performances": { + "name": "air-interface-historical-performances", + "local-name": "historical-performances", + "type": "container" + } + }, + "co-channel-group": { + "type": "list", + "key": "co-channel-group-id" + }, + "mw-air-interface-hsb-end-point-pac": { + "type": "list", + "key": "endpoint" + }, + "mw-air-interface-hsb-fc-switch-pac": { + "type": "list", + "key": "fcswitch" + }, + "mw-air-interface-diversity-pac": { + "type": "list", + "key": "layer-protocol", + "air-interface-diversity-capability": { + "name": "air-interface-diversity-capability", + "local-name": "capability", + "type": "container" + }, + "air-interface-diversity-configuration": { + "name": "air-interface-diversity-configuration", + "local-name": "configuration", + "type": "container" + }, + "air-interface-diversity-status": { + "name": "air-interface-diversity-status", + "local-name": "status", + "type": "container" + }, + "air-interface-diversity-current-problems": { + "name": "air-interface-diversity-current-problems", + "local-name": "current-problems", + "type": "container" + }, + "air-interface-diversity-current-performance": { + "name": "air-interface-diversity-current-performance", + "local-name": "current-performance", + "type": "container" + }, + "air-interface-diversity-historical-performances": { + "name": "air-interface-diversity-historical-performances", + "local-name": "historical-performances", + "type": "container" + } + }, + "mw-pure-ethernet-structure-pac": { + "type": "list", + "key": "layer-protocol", + "pure-ethernet-structure-capability": { + "name": "pure-ethernet-structure-capability", + "local-name": "capability", + "type": "container" + }, + "pure-ethernet-structure-configuration": { + "name": "pure-ethernet-structure-configuration", + "local-name": "configuration", + "type": "container" + }, + "pure-ethernet-structure-status": { + "name": "pure-ethernet-structure-status", + "local-name": "status", + "type": "container" + }, + "pure-ethernet-structure-current-problems": { + "name": "pure-ethernet-structure-current-problems", + "local-name": "current-problems", + "type": "container" + }, + "pure-ethernet-structure-current-performance": { + "name": "pure-ethernet-structure-current-performance", + "local-name": "current-performance", + "type": "container" + }, + "pure-ethernet-structure-historical-performances": { + "name": "pure-ethernet-structure-historical-performances", + "local-name": "historical-performances", + "type": "container" + } + }, + "mw-hybrid-mw-structure-pac": { + "type": "list", + "key": "layer-protocol", + "hybrid-mw-structure-capability": { + "name": "hybrid-mw-structure-capability", + "local-name": "capability", + "type": "container" + }, + "hybrid-mw-structure-configuration": { + "name": "hybrid-mw-structure-configuration", + "local-name": "configuration", + "type": "container" + }, + "hybrid-mw-structure-status": { + "name": "hybrid-mw-structure-status", + "local-name": "status", + "type": "container" + }, + "hybrid-mw-structure-current-problems": { + "name": "hybrid-mw-structure-current-problems", + "local-name": "current-problems", + "type": "container" + }, + "hybrid-mw-structure-current-performance": { + "name": "hybrid-mw-structure-current-performance", + "local-name": "current-performance", + "type": "container" + }, + "hybrid-mw-structure-historical-performances": { + "name": "hybrid-mw-structure-historical-performances", + "local-name": "historical-performances", + "type": "container" + } + }, + "mw-ethernet-container-pac": { + "type": "list", + "key": "layer-protocol", + "ethernet-container-capability": { + "name": "ethernet-container-capability", + "local-name": "capability", + "type": "container" + }, + "ethernet-container-configuration": { + "name": "ethernet-container-configuration", + "local-name": "configuration", + "type": "container" + }, + "ethernet-container-status": { + "name": "ethernet-container-status", + "local-name": "status", + "type": "container" + }, + "ethernet-container-current-problems": { + "name": "ethernet-container-current-problems", + "local-name": "current-problems", + "type": "container" + }, + "ethernet-container-current-performance": { + "name": "ethernet-container-current-performance", + "local-name": "current-performance", + "type": "container" + }, + "ethernet-container-historical-performances": { + "name": "ethernet-container-historical-performances", + "local-name": "historical-performances", + "type": "container" + } + }, + "mw-tdm-container-pac": { + "type": "list", + "key": "layer-protocol", + "tdm-container-capability": { + "name": "tdm-container-capability", + "local-name": "capability", + "type": "container" + }, + "tdm-container-configuration": { + "name": "tdm-container-configuration", + "local-name": "configuration", + "type": "container" + }, + "tdm-container-status": { + "name": "tdm-container-status", + "local-name": "status", + "type": "container" + }, + "tdm-container-current-problems": { + "name": "tdm-container-current-problems", + "local-name": "current-problems", + "type": "container" + }, + "tdm-container-current-performance": { + "name": "tdm-container-current-performance", + "local-name": "current-performance", + "type": "container" + }, + "tdm-container-historical-performances": { + "name": "tdm-container-historical-performances", + "local-name": "historical-performances", + "type": "container" + } + } + } + } +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/elasticsearch/index/mwtn/modelDescription/onf-core-model-conditional-packages.schema-information.json b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/elasticsearch/index/mwtn/modelDescription/onf-core-model-conditional-packages.schema-information.json new file mode 100644 index 00000000..5d3014f9 --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/elasticsearch/index/mwtn/modelDescription/onf-core-model-conditional-packages.schema-information.json @@ -0,0 +1,337 @@ +{ + "schema-information": { + "network-element-pac": { + "id": "network-element-pac", + "uml-id": "_RamCUPaMEeaW9u5N6usiTA", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "NetworkElement_Pac" + }, + "network-element": { + "id": "network-element", + "uml-id": "_5z06cPaNEeaW9u5N6usiTA", + "uml-type": "ownedAttribute", + "type": "../OnfModel/CoreModel.uml#_oGqnr1LNEeO75dO39GbF8Q", + "order-number": 1, + "is-read-only": false, + "uml-name": "_networkElement" + }, + "network-element-capability": { + "id": "network-element-capability", + "uml-id": "_1_TVYPaMEeaW9u5N6usiTA", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "NetworkElementCapability" + }, + "network-element-configuration": { + "id": "network-element-configuration", + "uml-id": "_Pu6HIPaNEeaW9u5N6usiTA", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "NetworkElementConfiguration" + }, + "network-element-status": { + "id": "network-element-status", + "uml-id": "_g5u0YPaNEeaW9u5N6usiTA", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "NetworkElementStatus" + }, + "network-element-current-problems": { + "id": "network-element-current-problems", + "uml-id": "_Pu6HIfaNEeaW9u5N6usiTA", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "NetworkElementCurrentProblems" + }, + "supported-alarms": { + "id": "supported-alarms", + "uml-id": "_444DuBd_EeegALpYen9G6g", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 1, + "is-read-only": true, + "description": [ + "Available alarms to be listed. Names are to be separated by commas." + ], + "uml-name": "supportedAlarms", + "controlType": "text" + }, + "problem-type-severity": { + "id": "problem-type-severity", + "uml-id": "_rvDABPasEeaW9u5N6usiTA", + "uml-type": "ownedAttribute", + "type": "../OnfModel-MicrowaveTransportNetwork/MicrowaveModel.uml#_eIml0JH1EeWUdbnmmNiTAA", + "order-number": 2, + "is-read-only": false, + "description": [ + "Severity of this type of alarm." + ], + "uml-name": "problemTypeSeverity" + }, + "trigger-refresh": { + "id": "trigger-refresh", + "uml-id": "_F6C-8Pm7EeaOH6heSczBpQ", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 2, + "is-read-only": false, + "description": [ + "A trigger to instuct the netconf server to refresh its internal database/cache. It is primary used for alarms status, but could used for anything else too. It is assumed that the refresh mechanismn takes somes time. In order to indictate the process to the controller a refreshStatus attribute is used." + ], + "uml-name": "triggerRefresh", + "controlType": "checkbox" + }, + "refresh-status": { + "id": "refresh-status", + "uml-id": "_w0x8wPm3EeaOH6heSczBpQ", + "uml-type": "ownedAttribute", + "type": "_7HZcEPm3EeaOH6heSczBpQ", + "order-number": 1, + "is-read-only": true, + "uml-name": "refreshStatus", + "controlType": [ + "done", + "processing" + ] + }, + "current-problem-list": { + "id": "current-problem-list", + "uml-id": "_444DwRd_EeegALpYen9G6g", + "uml-type": "ownedAttribute", + "type": "_TBaooPasEeaW9u5N6usiTA", + "order-number": 1, + "is-read-only": true, + "uml-name": "currentProblemList" + }, + "equipment-pac": { + "id": "equipment-pac", + "uml-id": "_VtO8MPaMEeaW9u5N6usiTA", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "Equipment_Pac" + }, + "equipment": { + "id": "equipment", + "uml-id": "_92PqMfaREeaW9u5N6usiTA", + "uml-type": "ownedAttribute", + "type": "../OnfModel/CoreModel.uml#_8SXNej-HEeaRI-H69PghuA", + "order-number": 1, + "is-read-only": false, + "is-key": 1, + "uml-name": "_equipment" + }, + "equipment-capability": { + "id": "equipment-capability", + "uml-id": "_g5u0YfaNEeaW9u5N6usiTA", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "EquipmentCapability" + }, + "equipment-configuration": { + "id": "equipment-configuration", + "uml-id": "_OGWN4PaNEeaW9u5N6usiTA", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "EquipmentConfiguration" + }, + "equipment-status": { + "id": "equipment-status", + "uml-id": "_gJH6APaREeaW9u5N6usiTA", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "EquipmentStatus" + }, + "equipment-current-problems": { + "id": "equipment-current-problems", + "uml-id": "_kRHqIPaREeaW9u5N6usiTA", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "EquipmentCurrentProblems" + }, + "holder-pac": { + "id": "holder-pac", + "uml-id": "_dECKoPaMEeaW9u5N6usiTA", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "Holder_Pac" + }, + "holder": { + "id": "holder", + "uml-id": "_TNk0IfaSEeaW9u5N6usiTA", + "uml-type": "ownedAttribute", + "type": "../OnfModel/CoreModel.uml#_8SXNjj-HEeaRI-H69PghuA", + "order-number": 1, + "is-read-only": false, + "is-key": 1, + "uml-name": "_holder" + }, + "holder-capability": { + "id": "holder-capability", + "uml-id": "_gtTvsPaSEeaW9u5N6usiTA", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "HolderCapability" + }, + "holder-configuration": { + "id": "holder-configuration", + "uml-id": "_g8TN8PaSEeaW9u5N6usiTA", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "HolderConfiguration" + }, + "holder-status": { + "id": "holder-status", + "uml-id": "_hDSmwPaSEeaW9u5N6usiTA", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "HolderStatus" + }, + "holder-current-problems": { + "id": "holder-current-problems", + "uml-id": "_hJQE0PaSEeaW9u5N6usiTA", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "HolderCurrentProblems" + }, + "connector-pac": { + "id": "connector-pac", + "uml-id": "_444DsRd_EeegALpYen9G6g", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "Connector_Pac" + }, + "connector": { + "id": "connector", + "uml-id": "_eDZ5QBeDEeegALpYen9G6g", + "uml-type": "ownedAttribute", + "type": "../OnfModel/CoreModel.uml#_8SXNcD-HEeaRI-H69PghuA", + "order-number": 1, + "is-read-only": false, + "is-key": 1, + "uml-name": "_connector" + }, + "connector-capability": { + "id": "connector-capability", + "uml-id": "_444Dtxd_EeegALpYen9G6g", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "ConnectorCapability" + }, + "connector-configuration": { + "id": "connector-configuration", + "uml-id": "_444Duhd_EeegALpYen9G6g", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "ConnectorConfiguration" + }, + "connector-status": { + "id": "connector-status", + "uml-id": "_444Dvxd_EeegALpYen9G6g", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "ConnectorStatus" + }, + "connector-current-problems": { + "id": "connector-current-problems", + "uml-id": "_444DwBd_EeegALpYen9G6g", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "ConnectorCurrentProblems" + }, + "remote-end-point": { + "id": "remote-end-point", + "uml-id": "_RDCPsBeCEeegALpYen9G6g", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 2, + "is-read-only": false, + "description": [ + "A network wide identifier of the remote connector. The value is used for topology discovery. Please see also ConnectorStatus::localEndPoint." + ], + "uml-name": "remoteEndPoint", + "controlType": "text" + }, + "local-end-point": { + "id": "local-end-point", + "uml-id": "_NZGKABeBEeegALpYen9G6g", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 1, + "is-read-only": false, + "description": [ + "A network wide global identifier of the this connector, which can be used to discover the physical connectivitiy. The value should contain the network element name, because the network element software can assume that the network element name is unique in the network. The value should be formated: @ Please see also ConnectorConfiguration::remoteEndPoint" + ], + "uml-name": "localEndPoint", + "controlType": "text" + }, + "current-problem-type": { + "id": "current-problem-type", + "uml-id": "_TBaooPasEeaW9u5N6usiTA", + "uml-type": "uml:DataType", + "uml-name": "CurrentProblemType" + }, + "problem-name": { + "id": "problem-name", + "uml-id": "_0XQ-UvmyEeaOH6heSczBpQ", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 1, + "is-read-only": true, + "description": [ + "Name of the alarm according capability::supportedAlarms." + ], + "uml-name": "problemName", + "controlType": "text" + }, + "network-element-current-problem-type": { + "id": "network-element-current-problem-type", + "uml-id": "_0XQ-UPmyEeaOH6heSczBpQ", + "uml-type": "uml:DataType", + "uml-name": "NetworkElementCurrentProblemType" + }, + "object-reference": { + "id": "object-reference", + "uml-id": "_BW8g0PmzEeaOH6heSczBpQ", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 2, + "is-read-only": true, + "description": [ + "An explaining string of the related object class. This is necesseary, because the current problem list of the NetworkElement object class acts as a container for all alarms, where its object classes are not modeled." + ], + "uml-name": "objectReference", + "controlType": "text" + }, + "problem-severity-type": { + "id": "problem-severity-type", + "uml-id": "_rvDAAPasEeaW9u5N6usiTA", + "uml-type": "uml:DataType", + "uml-name": "ProblemSeverityType" + }, + "problem-type-name": { + "id": "problem-type-name", + "uml-id": "_rvDAAfasEeaW9u5N6usiTA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 1, + "is-read-only": false, + "is-key": 1, + "description": [ + "Name of the alarm according to Capability::supportedAlarms" + ], + "uml-name": "problemTypeName", + "controlType": "text" + }, + "7-h-zc-e-pm3-eea-oh6-he-scz-bp-q": { + "id": "7-h-zc-e-pm3-eea-oh6-he-scz-bp-q", + "uml-id": "_7HZcEPm3EeaOH6heSczBpQ", + "enum": [ + "DONE", + "PROCESSING" + ], + "is-read-only": false, + "uml-name": "_7HZcEPm3EeaOH6heSczBpQ" + } + } +} \ No newline at end of file diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/elasticsearch/index/mwtn/modelDescription/onf-core-model-conditional-packages.yin.json b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/elasticsearch/index/mwtn/modelDescription/onf-core-model-conditional-packages.yin.json new file mode 100755 index 00000000..ae603d51 --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/elasticsearch/index/mwtn/modelDescription/onf-core-model-conditional-packages.yin.json @@ -0,0 +1,79 @@ +{ + "module": { + "name": "onf-core-model-conditional-packages", + "onf-core-model-conditional-packages": { + "equipment-pac": { + "type": "list", + "key": "equipment", + "equipment-capability": { + "name": "equipment-capability", + "local-name": "capability", + "type": "container" + }, + "equipment-configuration": { + "name": "equipment-configuration", + "local-name": "configuration", + "type": "container" + }, + "equipment-status": { + "name": "equipment-status", + "local-name": "status", + "type": "container" + }, + "equipment-current-problems": { + "name": "equipment-current-problems", + "local-name": "current-problems", + "type": "container" + } + }, + "holder-pac": { + "type": "list", + "key": "holder", + "holder-capability": { + "name": "holder-capability", + "local-name": "capability", + "type": "container" + }, + "holder-configuration": { + "name": "holder-configuration", + "local-name": "configuration", + "type": "container" + }, + "holder-status": { + "name": "holder-status", + "local-name": "status", + "type": "container" + }, + "holder-current-problems": { + "name": "holder-current-problems", + "local-name": "current-problems", + "type": "container" + } + }, + "connector-pac": { + "type": "list", + "key": "connector", + "connector-capability": { + "name": "connector-capability", + "local-name": "capability", + "type": "container" + }, + "connector-configuration": { + "name": "connector-configuration", + "local-name": "configuration", + "type": "container" + }, + "connector-status": { + "name": "connector-status", + "local-name": "status", + "type": "container" + }, + "connector-current-problems": { + "name": "connector-current-problems", + "local-name": "current-problems", + "type": "container" + } + } + } + } +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/elasticsearch/index/mwtn/modelDescription/onf-ethernet-conditional-packages.schema-information.json b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/elasticsearch/index/mwtn/modelDescription/onf-ethernet-conditional-packages.schema-information.json new file mode 100644 index 00000000..50a8d3ba --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/elasticsearch/index/mwtn/modelDescription/onf-ethernet-conditional-packages.schema-information.json @@ -0,0 +1,76 @@ +{ + "schema-information": { + "ethernet-pac": { + "id": "ethernet-pac", + "uml-id": "_fytUABOvEeeV4YL-goyoXw", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "Ethernet_Pac" + }, + "layer-protocol": { + "id": "layer-protocol", + "uml-id": "_D0ijgBOwEeeV4YL-goyoXw", + "uml-type": "ownedAttribute", + "type": "../OnfModel/CoreModel.uml#_gROecFYXEeOVGaP4lO41SQ", + "order-number": 1, + "is-read-only": false, + "is-key": 1, + "uml-name": "_layerProtocol" + }, + "ethernet-capability": { + "id": "ethernet-capability", + "uml-id": "_1ukHUBOvEeeV4YL-goyoXw", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "EthernetCapability" + }, + "ethernet-configuration": { + "id": "ethernet-configuration", + "uml-id": "_mZ64kBOvEeeV4YL-goyoXw", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "EthernetConfiguration" + }, + "ethernet-status": { + "id": "ethernet-status", + "uml-id": "_3WQd4BOvEeeV4YL-goyoXw", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "EthernetStatus" + }, + "ethernet-current-problems": { + "id": "ethernet-current-problems", + "uml-id": "_-VkZYBOvEeeV4YL-goyoXw", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "EthernetCurrentProblems" + }, + "ethernet-current-performance": { + "id": "ethernet-current-performance", + "uml-id": "_4nyXMBOvEeeV4YL-goyoXw", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "EthernetCurrentPerformance" + }, + "ethernet-historical-performances": { + "id": "ethernet-historical-performances", + "uml-id": "_A2670BOwEeeV4YL-goyoXw", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "EthernetHistoricalPerformances" + }, + "vlan-id": { + "id": "vlan-id", + "uml-id": "_14axcBOwEeeV4YL-goyoXw", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 1, + "is-read-only": false, + "description": [ + "value = 0: frames on ingress must be untagged, frames on egress get untagged; value = any other positive integer < 4096: frames on ingress must be tagged with this VLAN ID, frames on egress either already have or get this VLAN ID attached;" + ], + "uml-name": "vlanId", + "controlType": "number" + } + } +} \ No newline at end of file diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/elasticsearch/index/mwtn/modelDescription/onf-ethernet-conditional-packages.yin.json b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/elasticsearch/index/mwtn/modelDescription/onf-ethernet-conditional-packages.yin.json new file mode 100755 index 00000000..67cedf4d --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/elasticsearch/index/mwtn/modelDescription/onf-ethernet-conditional-packages.yin.json @@ -0,0 +1,41 @@ +{ + "module": { + "name": "onf-ethernet-conditional-packages", + "onf-ethernet-conditional-packages": { + "ethernet-pac": { + "type": "list", + "key": "layer-protocol", + "ethernet-capability": { + "name": "ethernet-capability", + "local-name": "capability", + "type": "container" + }, + "ethernet-configuration": { + "name": "ethernet-configuration", + "local-name": "configuration", + "type": "container" + }, + "ethernet-status": { + "name": "ethernet-status", + "local-name": "status", + "type": "container" + }, + "ethernet-current-problems": { + "name": "ethernet-current-problems", + "local-name": "current-problems", + "type": "container" + }, + "ethernet-current-performance": { + "name": "ethernet-current-performance", + "local-name": "current-performance", + "type": "container" + }, + "ethernet-historical-performances": { + "name": "ethernet-historical-performances", + "local-name": "historical-performances", + "type": "container" + } + } + } + } +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/elasticsearch/index/mwtn/modelDescription/onf-ptp-dataset.schema-information.json b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/elasticsearch/index/mwtn/modelDescription/onf-ptp-dataset.schema-information.json new file mode 100644 index 00000000..5c6e41a9 --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/elasticsearch/index/mwtn/modelDescription/onf-ptp-dataset.schema-information.json @@ -0,0 +1,435 @@ +{ + "schema-information": { + "instance-number": { + "id": "instance-number", + "type": "uint16", + "order-number": 1, + "is-read-only": true, + "description": ["There is only one clock per device in the 4th PoC - value 1 should be used as instance-number."] + }, + "two-step-flag": { + "id": "two-step-flag", + "type": "boolean", + "order-number": 80, + "is-read-only": true, + "description": ["Indicates whether PTP clock is a two-step clock"] + }, + "clock-quality": { + "id": "clock-quality", + "type": "", + "order-number": 6, + "is-read-only": true, + "description": [""] + }, + "clock-class": { + "id": "clock-class", + "type": "", + "order-number": 7, + "is-read-only": true, + "description": ["Clock Class acc. to IEEE 1588-2008, 7.6.2.4 and ITU-T G.8275.1, 6.4"] + }, + "clock-accuracy": { + "id": "clock-accuracy", + "type": "", + "order-number": 8, + "is-read-only": true, + "description": ["Clock accuracy acc. to IEEE 1588-2008, 7.6.2.5 and ITU-T G.8275.1, 6.3.5"] + }, + "offset-scaled-log-variance": { + "id": "offset-scaled-log-variance", + "type": "", + "order-number": 9, + "is-read-only": true, + "description": ["Offset of scaled log variance acc. to IEEE 1588-2008, 7.6.3.5 and ITU-T G.8275.1, 6.3.5"] + }, + "priority1": { + "id": "priority1", + "type": "number", + "min": 0, + "max": 255, + "order-number": 10, + "is-read-only": true, + "description": ["Priority 1 acc. to IEEE 1588-2008, 7.6.2.2"] + }, + "priority2": { + "id": "priority2", + "type": "number", + "min": 0, + "max": 255, + "order-number": 11, + "is-read-only": false, + "description": ["Priority 2 acc. to IEEE 1588-2008, 7.6.2.3"] + }, + "domain-number": { + "id": "domain-number", + "type": "number", + "min": 24, + "max": 43, + "order-number": 12, + "is-read-only": false, + "description": ["PTP domain number acc. to IEEE 1588-2008, 7.1. See ptpDS.domainNumber."] + }, + "slave-only": { + "id": "slave-only", + "type": "boolean", + "order-number": 81, + "is-read-only": false, + "description": ["Indicates whether PTP clock may only operate as SC. See IEEE 1588-2008, 9.2."] + }, + "current-ds": { + "id": "current-ds", + "type": "", + "order-number": 14, + "is-read-only": true, + "description": [""] + }, + "steps-removed": { + "id": "steps-removed", + "type": "", + "order-number": 15, + "is-read-only": true, + "description": ["Number of communication paths traversed between local clock and GM"] + }, + "offset-from-master": { + "id": "offset-from-master", + "type": "", + "order-number": 16, + "is-read-only": true, + "unit": "ns*2^16", + "description": ["Time off-set from master"] + }, + "mean-path-delay": { + "id": "mean-path-delay", + "type": "", + "order-number": 17, + "is-read-only": true, + "unit": "ns*2^16", + "description": ["Mean propagation time between master and slave"] + }, + "parrent-ds": { + "id": "parrent-ds", + "type": "", + "order-number": 18, + "is-read-only": true, + "description": [""] + }, + "parent-port-identity": { + "id": "parent-port-identity", + "type": "", + "order-number": 19, + "is-read-only": true, + "description": [""] + }, + "parent-stats": { + "id": "parent-stats", + "type": "", + "order-number": 22, + "is-read-only": true, + "description": ["Indicates whether there are valid parent stats."] + }, + "observed-parent-offset-scaled-log-variance": { + "id": "observed-parent-offset-scaled-log-variance", + "type": "", + "order-number": 23, + "is-read-only": true, + "description": ["Estimate of parent's clock PTP variance as observed by slave clock acc. to IEEE 1588-2008, 7.6.4.4."] + }, + "observed-parent-clock-phase-change-rate": { + "id": "observed-parent-clock-phase-change-rate", + "type": "", + "order-number": 24, + "is-read-only": true, + "description": ["Estimate of parent's clock PTP phase change rate as observed by slave clock acc. to IEEE 1588-2008, 7.6.4.4."] + }, + "grandmaster-identity": { + "id": "grandmaster-identity", + "type": "", + "order-number": 25, + "is-read-only": true, + "description": ["Grandmaster clock ID acc. to IEEE 1588-2008, 7.6.2.1"] + }, + "grandmaster-clock-quality": { + "id": "grandmaster-clock-quality", + "type": "", + "order-number": 26, + "is-read-only": true, + "description": [""] + }, + "grandmaster-priority1": { + "id": "grandmaster-priority1", + "type": "", + "order-number": 30, + "is-read-only": true, + "description": ["Grandmaster's priority 1 acc. to IEEE 1588-2008, 7.6.2.2"] + }, + "grandmaster-priority2": { + "id": "grandmaster-priority2", + "type": "", + "order-number": 31, + "is-read-only": true, + "description": ["Grandmaster's priority 2 acc. to IEEE 1588-2008, 7.6.2.3"] + }, + "time-properties-ds": { + "id": "time-properties-ds", + "type": "", + "order-number": 32, + "is-read-only": true, + "description": [""] + }, + "current-utc-offset-valid": { + "id": "current-utc-offset-valid", + "type": "", + "order-number": 33, + "is-read-only": true, + "description": ["Indicates wheterh current UTC offset is correct."] + }, + "current-utc-offset": { + "id": "current-utc-offset", + "type": "", + "order-number": 34, + "is-read-only": true, + "description": ["Offset between TAI and UTC acc. to IEEE 1588-2008, 7.2.3"] + }, + "leap59": { + "id": "leap59", + "type": "", + "order-number": 35, + "is-read-only": true, + "description": ["Inidcates that last minute of current UTC day has 59 seconds."] + }, + "leap61": { + "id": "leap61", + "type": "", + "order-number": 36, + "is-read-only": true, + "description": ["Inidcates that last minute of current UTC day has 61 seconds."] + }, + "time-tracable": { + "id": "time-tracable", + "type": "", + "order-number": 37, + "is-read-only": true, + "description": ["Indicates that current UTC offset and timescale are traceable to a PRC"] + }, + "frequency-tracable": { + "id": "frequency-tracable", + "type": "", + "order-number": 38, + "is-read-only": true, + "description": ["Indicates that frequency determining timescale is traceable to a PRC"] + }, + "ptp-timescale": { + "id": "ptp-timescale", + "type": "", + "order-number": 39, + "is-read-only": true, + "description": ["Indicates thet timescale of grandmaster clock is PTP."] + }, + "time-source": { + "id": "time-source", + "type": "", + "order-number": 40, + "is-read-only": true, + "description": ["Time source used by grandmaster. See IEEE 1588-2008, 7.6.2.6."] + }, + "port-state": { + "id": "port-state", + "type": "", + "order-number": 45, + "is-read-only": true, + "description": ["State of this local port"] + }, + "log-min-delay-req-interval": { + "id": "log-min-delay-req-interval", + "type": "", + "order-number": 46, + "is-read-only": true, + "description": ["Minimum permitted mean time interval between successive Delay_Req messages"] + }, + "peer-mean-path-delay": { + "id": "peer-mean-path-delay", + "type": "", + "order-number": 47, + "is-read-only": true, + "unit": "ns*2^16", + "description": ["Not applicable with this profile"] + }, + "log-announce-interval": { + "id": "log-announce-interval", + "type": "", + "order-number": 48, + "is-read-only": true, + "description": ["Mean time interval between successive Announce messages"] + }, + "announce-receipt-timeout": { + "id": "announce-receipt-timeout", + "type": "", + "order-number": 49, + "is-read-only": true, + "description": ["Number of announce intervals w/o announce message before timeout acc. to IEEE 1588-2008, 7.7.3.1."] + }, + "log-sync-interval": { + "id": "log-sync-interval", + "type": "", + "order-number": 50, + "is-read-only": true, + "description": ["Mean SyncInterval for multicast messages"] + }, + "delay-mechanism": { + "id": "delay-mechanism", + "type": "string", + "controlType": "text", + "order-number": 51, + "is-read-only": true, + "description": ["Delay mechanism acc. to IEEE 1588-2008, 8.2.5.4.4."] + }, + "version-number": { + "id": "version-number", + "type": "", + "order-number": 53, + "is-read-only": true, + "description": ["PTP version used on this port"] + }, + "transparent-clock-default-ds": { + "id": "transparent-clock-default-ds", + "type": "", + "order-number": 54, + "is-read-only": true, + "description": [""] + }, + "number-ports": { + "id": "number-ports", + "type": "", + "order-number": -6, + "is-read-only": true, + "description": ["Number of ports of the device"] + }, + "primary-domain": { + "id": "primary-domain", + "type": "", + "order-number": 58, + "is-read-only": true, + "description": ["Domain number of primary syntonization domain acc. to IEEE 1588-2008, 10.1"] + }, + "transparent-clock-port-ds-list": { + "id": "transparent-clock-port-ds-list", + "type": "", + "order-number": 59, + "is-read-only": true, + "description": [""] + }, + "log-min-pdelay-req-interval": { + "id": "log-min-pdelay-req-interval", + "type": "", + "order-number": 63, + "is-read-only": true, + "description": ["Not applicable with this profile"] + }, + "faulty-flag": { + "id": "faulty-flag", + "type": "", + "order-number": 64, + "is-read-only": true, + "description": ["Indicates whether port is faulty."] + }, + "default-ds": { + "id": "default-ds", + "type": "", + "order-number": 68, + "is-read-only": true, + "description": [""] + }, + "local-priority": { + "id": "local-priority", + "type": "number", + "min": 1, + "max": 255, + "order-number": 69, + "is-read-only": true, + "description": ["See ITU-T G.8275.1, 6.3.2."] + }, + "max-steps-removed": { + "id": "max-steps-removed", + "type": "number", + "min": 1, + "max": 255, + "order-number": 70, + "is-read-only": true, + "description": ["See ITU-T G.8275.1, 6.3."] + }, + "port-ds-list": { + "id": "port-ds-list", + "type": "", + "order-number": 73, + "is-read-only": true, + "description": [""] + }, + "clock-identity": { + "id": "clock-identity", + "type": "", + "order-number": -10, + "is-read-only": true, + "description": ["ID of the local clock"] + }, + "port-number": { + "id": "port-number", + "type": "", + "order-number": 76, + "is-read-only": true, + "description": ["Port number of this port on the local clock"] + }, + "onf-ptp-dataset:master-only": { + "id": "onf-ptp-dataset:master-only", + "type": "boolean", + "order-number": 83, + "is-read-only": false, + "description": ["Indicates that port can only be a master."] + }, + "onf-ptp-dataset:local-priority": { + "id": "onf-ptp-dataset:local-priority", + "type": "number", + "min":1, + "max":255, + "order-number": -2, + "is-read-only": false, + "description": ["Local priority as used for Alternate BMCA. See ITU-T G.8275.1, 6.3.2."] + }, + "onf-ptp-dataset:designated-enabled": { + "id": "onf-ptp-dataset:designated-enabled", + "type": "boolean", + "order-number": 82, + "is-read-only": false, + "description": ["A PTP Port needs to be enabled by management acc. to IEEE 1588-2008, 9.2."] + }, + "onf-ptp-dataset:delay-asymmetry": { + "id": "onf-ptp-dataset:delay-asymmetry", + "type": "number", + "order-number": 80, + "is-read-only": true, + "description": ["Known path asymmetry in ns acc. to IEEE 1588-2008, 7.4.2."] + }, + "onf-ptp-dataset:logical-termination-point": { + "id": "onf-ptp-dataset:logical-termination-point ", + "type": "string", + "order-number": 81, + "is-read-only": true, + "description": [""] + }, + "onf-ptp-dataset:multicast-mac-address": { + "id": "onf-ptp-dataset:multicast-mac-address", + "type": "", + "order-number": -5, + "is-read-only": true, + "description": ["In 4th PoC the value is fixed."] + }, + "onf-ptp-dataset:max-steps-removed": { + "id": "onf-ptp-dataset:max-steps-removed", + "type": "number", + "min":1, + "max":255, + "order-number": 70, + "is-read-only": false, + "description": ["See ITU-T G.8275.1, 6.3."] + } + } +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/elasticsearch/index/mwtn/modelDescription/otn-odu-conditional-packages.yin.json b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/elasticsearch/index/mwtn/modelDescription/otn-odu-conditional-packages.yin.json new file mode 100644 index 00000000..3091cc0d --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/elasticsearch/index/mwtn/modelDescription/otn-odu-conditional-packages.yin.json @@ -0,0 +1,75 @@ +{ + "module": { + "name": "otn-odu-conditional-packages", + "otn-odu-conditional-packages": { + "otn-odu-connection-pac": { + "type": "list", + "key": "layer-protocol", + "otn-odu-connection-capability": { + "name": "otn-odu-connection-capability", + "local-name": "capability", + "type": "container" + }, + "otn-odu-connection-configuration": { + "name": "otn-odu-connection-configuration", + "local-name": "configuration", + "type": "container" + }, + "otn-odu-connection-status": { + "name": "otn-odu-connection-status", + "local-name": "status", + "type": "container" + }, + "otn-odu-connection-current-problems": { + "name": "otn-odu-connection-current-problems", + "local-name": "current-problems", + "type": "container" + }, + "otn-odu-connection-current-performance": { + "name": "otn-odu-connection-current-performance", + "local-name": "current-performance", + "type": "container" + }, + "otn-odu-connection-historical-performances": { + "name": "otn-odu-connection-historical-performances", + "local-name": "historical-performances", + "type": "container" + } + }, + "otn-odu-termination-pac": { + "type": "list", + "key": "layer-protocol", + "otn-odu-termination-capability": { + "name": "otn-odu-termination-capability", + "local-name": "capability", + "type": "container" + }, + "otn-odu-termination-configuration": { + "name": "otn-odu-termination-configuration", + "local-name": "configuration", + "type": "container" + }, + "otn-odu-termination-status": { + "name": "otn-odu-termination-status", + "local-name": "status", + "type": "container" + }, + "otn-odu-termination-current-problems": { + "name": "otn-odu-termination-current-problems", + "local-name": "current-problems", + "type": "container" + }, + "otn-odu-termination-current-performance": { + "name": "otn-odu-termination-current-performance", + "local-name": "current-performance", + "type": "container" + }, + "otn-odu-termination-historical-performances": { + "name": "otn-odu-termination-historical-performances", + "local-name": "historical-performances", + "type": "container" + } + } + } + } +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/elasticsearch/index/mwtn/mwtnMapping.json b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/elasticsearch/index/mwtn/mwtnMapping.json new file mode 100644 index 00000000..7783b09a --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/elasticsearch/index/mwtn/mwtnMapping.json @@ -0,0 +1,51 @@ +{ + "settings": { + "analysis": { + "analyzer": { + "standard": { + "type": "whitespace" + } + } + } + }, + "mappings": { + "required-networkelement": { + "date_detection": false + }, + "site": { + "properties": { + "id": { + "index": "not_analyzed", + "type": "string" + }, + "name": { + "index": "not_analyzed", + "type": "string" + }, + "location": { + "geohash": true, + "geohash_precision": 10, + "type": "geo_point", + "lat_lon": true, + "geohash_prefix": true + } + } + }, + "site-link": { + "properties": { + "id": { + "index": "not_analyzed", + "type": "string" + }, + "siteZ": { + "index": "not_analyzed", + "type": "string" + }, + "siteA": { + "index": "not_analyzed", + "type": "string" + } + } + } + } +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/elasticsearch/index/mwtn/mwtnV1Alias.json b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/elasticsearch/index/mwtn/mwtnV1Alias.json new file mode 100644 index 00000000..e4aa7458 --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/elasticsearch/index/mwtn/mwtnV1Alias.json @@ -0,0 +1,8 @@ +{ + "actions":[ + { "add": { + "alias": "mwtn", + "index": "mwtn_v1" + }} + ] +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/elasticsearch/index/sdnevents/sdneventsMapping.json b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/elasticsearch/index/sdnevents/sdneventsMapping.json new file mode 100644 index 00000000..0e3fb778 --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/elasticsearch/index/sdnevents/sdneventsMapping.json @@ -0,0 +1,100 @@ +{ + "mappings": { + "faultlog": { + "properties": { + "fault": { + "properties": { + "nodeName": { + "index": "not_analyzed", + "type": "string" + }, + "severity": { + "index": "not_analyzed", + "type": "string" + }, + "timeStamp": { + "index": "not_analyzed", + "type": "string" + }, + "problem": { + "index": "not_analyzed", + "type": "string" + }, + "counter": { + "index": "not_analyzed", + "type": "string" + }, + "objectId": { + "index": "not_analyzed", + "type": "string" + } + } + } + } + }, + "faultcurrent": { + "properties": { + "faultCurrent": { + "properties": { + "nodeName": { + "index": "not_analyzed", + "type": "string" + }, + "severity": { + "index": "not_analyzed", + "type": "string" + }, + "timeStamp": { + "index": "not_analyzed", + "type": "string" + }, + "problem": { + "index": "not_analyzed", + "type": "string" + }, + "counter": { + "index": "not_analyzed", + "type": "string" + }, + "objectId": { + "index": "not_analyzed", + "type": "string" + } + } + } + } + }, + "eventlog": { + "properties": { + "event": { + "properties": { + "nodeName": { + "index": "not_analyzed", + "type": "string" + }, + "timeStamp": { + "index": "not_analyzed", + "type": "string" + }, + "newValue": { + "index": "not_analyzed", + "type": "string" + }, + "attributeName": { + "index": "not_analyzed", + "type": "string" + }, + "counter": { + "index": "not_analyzed", + "type": "string" + }, + "objectId": { + "index": "not_analyzed", + "type": "string" + } + } + } + } + } + } +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/elasticsearch/index/sdnperformance/sdnperformanceMapping.json b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/elasticsearch/index/sdnperformance/sdnperformanceMapping.json new file mode 100644 index 00000000..92d5ad2f --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/elasticsearch/index/sdnperformance/sdnperformanceMapping.json @@ -0,0 +1,92 @@ +{ + "mappings": + { + "historicalperformance24h": + { + "properties": + { + "node-name": + { + "index": "not_analyzed", + "type": "string" + }, + "time-stamp": + { + "index": "not_analyzed", + "type": "string" + }, + "suspect-interval-flag": + { + "type": "boolean" + }, + "scanner-id": + { + "index": "not_analyzed", + "type": "string" + }, + "uuid-interface": + { + "index": "not_analyzed", + "type": "string" + }, + "layer-protocol-name": { + "index": "not_analyzed", + "type": "string" + }, + "granularity-period": + { + "index": "not_analyzed", + "type": "string" + }, + "radio-signal-id": { + "index": "not_analyzed", + "type": "string" + } + } + }, + + "historicalperformance15min": + { + "properties": + { + "node-name": + { + "index": "not_analyzed", + "type": "string" + }, + "time-stamp": + { + "index": "not_analyzed", + "type": "string" + }, + "suspect-interval-flag": + { + "type": "boolean" + }, + "scanner-id": + { + "index": "not_analyzed", + "type": "string" + }, + "uuid-interface": + { + "index": "not_analyzed", + "type": "string" + }, + "layer-protocol-name": { + "index": "not_analyzed", + "type": "string" + }, + "granularity-period": + { + "index": "not_analyzed", + "type": "string" + }, + "radio-signal-id": { + "index": "not_analyzed", + "type": "string" + } + } + } + } +} diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/elasticsearch/plugins/delete-by-query.zip b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/elasticsearch/plugins/delete-by-query.zip new file mode 100644 index 0000000000000000000000000000000000000000..12518c0ea652e0ab1ea1c1d8959e8713152807c0 GIT binary patch literal 27945 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

bN;@6u~ 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 literal 0 HcmV?d00001 diff --git a/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/elasticsearch/plugins/head.zip b/sdnr/wireless-transport/code-Carbon-SR1/apps/devicemanager/impl/src/main/resources/elasticsearch/plugins/head.zip new file mode 100644 index 0000000000000000000000000000000000000000..bf495f1bef499c6b37c06e51e616e498ce141a93 GIT binary patch literal 6203012 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