VES Heartbeat and Software Management Feature 34/4334/1
authorcschowdam <chandrasekhar.chowdam@commscope.com>
Tue, 7 Jul 2020 13:43:16 +0000 (13:43 +0000)
committercschowdam <chandrasekhar.chowdam@commscope.com>
Tue, 7 Jul 2020 14:14:40 +0000 (14:14 +0000)
Code changes to support VES Heartbeat and Software Management Feature in tr069 adapter.
docker tag change to latest

Issue-Id: OAM-127
Change-Id: Ib8aeba0e73f13d73064e7c0dca0274a26007f1a7
Signed-off-by: cschowdam <chandrasekhar.chowdam@commscope.com>
136 files changed:
acs/application-booter/pom.xml
acs/application-booter/src/main/java/org/commscope/tr069adapter/acs/booter/ACSServiceBooter.java
acs/application-booter/src/main/resources/log4j2.xml
acs/application-booter/src/main/resources/schema-mariadb.sql
acs/application-booter/src/test/resources/log4j2.xml [new file with mode: 0644]
acs/common/pom.xml
acs/common/src/main/java/org/commscope/tr069adapter/acs/common/DeviceDetails.java
acs/common/src/main/java/org/commscope/tr069adapter/acs/common/DeviceRPCRequest.java
acs/common/src/main/java/org/commscope/tr069adapter/acs/common/dto/TR069DeviceDetails.java
acs/common/src/main/resources/config/ErrorMessages_tr069.properties
acs/cpe/pom.xml
acs/nbi/pom.xml
acs/pom.xml
acs/requestprocessor/pom.xml
acs/requestprocessor/src/main/java/org/commscope/tr069adapter/acs/requestprocessor/custom/ConfigureMultipleObject.java
acs/requestprocessor/src/main/java/org/commscope/tr069adapter/acs/requestprocessor/handler/DeviceRPCRequestHandler.java
acs/requestprocessor/src/main/java/org/commscope/tr069adapter/acs/requestprocessor/helper/TR069RequestProcessEngineHelper.java
acs/requestprocessor/src/main/java/org/commscope/tr069adapter/acs/requestprocessor/impl/TR069EventNotificationService.java
acs/requestprocessor/src/main/java/org/commscope/tr069adapter/acs/requestprocessor/impl/TR069RequestProcessEngine.java
acs/requestprocessor/src/main/java/org/commscope/tr069adapter/acs/requestprocessor/util/TR069RequestProcessorUtility.java
common/src/main/java/org/commscope/tr069adapter/common/scheduler/ExecutionContext.java
config-data/pom.xml
config-data/src/main/java/org/commscope/tr069adapter/config/controllers/ConfugurationDataController.java
config-data/src/main/java/org/commscope/tr069adapter/config/parser/ConfigurationXMLDataParser.java
config-data/src/main/java/org/commscope/tr069adapter/config/service/ConfigurationDataService.java
config-data/src/main/resources/log4j2.xml
config-data/src/main/resources/schema-mariadb.sql
config-data/src/main/resources/xsd/ConfigurationData.xsd
config-data/src/test/java/com/commscope/tr069adapter/config/ConfigDataApplicationTests.java
config-data/src/test/resources/log4j2.xml [new file with mode: 0644]
db/pom.xml
factory/pom.xml
factory/src/main/resources/log4j2.xml
factory/src/test/resources/application.properties [new file with mode: 0644]
factory/src/test/resources/log4j2.xml [new file with mode: 0644]
mapper/Dockerfile
mapper/mapper-schema/CustomYangModelMOmapping.txt [new file with mode: 0644]
mapper/pom.xml
mapper/rpc_set_input.xml [new file with mode: 0644]
mapper/src/main/java/org/commscope/tr069adapter/mapper/MapperConfigProperties.java
mapper/src/main/java/org/commscope/tr069adapter/mapper/Test.java [new file with mode: 0644]
mapper/src/main/java/org/commscope/tr069adapter/mapper/acs/impl/ACSNotificationHandlerImpl.java
mapper/src/main/java/org/commscope/tr069adapter/mapper/acs/impl/PnPPreProvisioningHandler.java
mapper/src/main/java/org/commscope/tr069adapter/mapper/boot/MapperServiceBooter.java
mapper/src/main/java/org/commscope/tr069adapter/mapper/dao/DeviceOperationsDAO.java [new file with mode: 0644]
mapper/src/main/java/org/commscope/tr069adapter/mapper/entity/DeviceOperationDetails.java [new file with mode: 0644]
mapper/src/main/java/org/commscope/tr069adapter/mapper/model/NetConfNotificationDTO.java [new file with mode: 0644]
mapper/src/main/java/org/commscope/tr069adapter/mapper/model/VESNotification.java
mapper/src/main/java/org/commscope/tr069adapter/mapper/netconf/NetConfNotificationSender.java
mapper/src/main/java/org/commscope/tr069adapter/mapper/netconf/NetConfRequestHandler.java
mapper/src/main/java/org/commscope/tr069adapter/mapper/netconf/controller/NetConfRequestReceiver.java
mapper/src/main/java/org/commscope/tr069adapter/mapper/netconf/impl/NetConfRequestHandlerImpl.java
mapper/src/main/java/org/commscope/tr069adapter/mapper/util/ErrorCodeUtil.java
mapper/src/main/java/org/commscope/tr069adapter/mapper/util/FirwareUpgradeErrorCode.java [new file with mode: 0644]
mapper/src/main/java/org/commscope/tr069adapter/mapper/util/FirwareUpgradeStatus.java [new file with mode: 0644]
mapper/src/main/java/org/commscope/tr069adapter/mapper/util/MOMetaDataUtil.java
mapper/src/main/java/org/commscope/tr069adapter/mapper/util/MapperConstants.java [new file with mode: 0644]
mapper/src/main/java/org/commscope/tr069adapter/mapper/util/MapperValidator.java [new file with mode: 0644]
mapper/src/main/java/org/commscope/tr069adapter/mapper/util/NetconfToTr069MapperUtil.java
mapper/src/main/java/org/commscope/tr069adapter/mapper/ves/VESNotificationSender.java
mapper/src/main/java/org/commscope/tr069adapter/mapper/ves/VesRequestHandler.java [new file with mode: 0644]
mapper/src/main/java/org/commscope/tr069adapter/mapper/ves/VesRequestReceiver.java [new file with mode: 0644]
mapper/src/main/java/org/commscope/tr069adapter/mapper/ves/impl/VesRequestHandlerImpl.java [new file with mode: 0644]
mapper/src/main/resources/application.properties
mapper/src/main/resources/log4j2.xml
mapper/src/main/resources/schema-mariadb.sql [new file with mode: 0644]
mapper/src/test/java/org/commscope/tr069adapter/mapper/NetconfToTr069MapperUtilTest.java
mapper/src/test/resources/application.properties
mapper/src/test/resources/log4j2.xml [new file with mode: 0644]
netconf-server/Dockerfile
netconf-server/pom.xml
netconf-server/schemas/bbf-tr-196-2-0-3-full.yang
netconf-server/schemas/iana-hardware.yang [new file with mode: 0644]
netconf-server/schemas/ietf-crypto-types.yang [new file with mode: 0644]
netconf-server/schemas/ietf-hardware.yang [new file with mode: 0644]
netconf-server/schemas/ietf-inet-types.yang [new file with mode: 0644]
netconf-server/schemas/ietf-netconf-acm.yang [new file with mode: 0644]
netconf-server/schemas/ietf-netconf-monitoring-extension.yang [new file with mode: 0644]
netconf-server/schemas/ietf-netconf-monitoring.yang [new file with mode: 0644]
netconf-server/schemas/ietf-yang-types.yang [new file with mode: 0644]
netconf-server/schemas/o-ran-file-management.yang [new file with mode: 0644]
netconf-server/schemas/o-ran-hardware.yang [new file with mode: 0644]
netconf-server/schemas/o-ran-heartbeat-management.yang [new file with mode: 0644]
netconf-server/schemas/o-ran-software-management.yang [new file with mode: 0644]
netconf-server/schemas/tr-181-2-12-0-cwmp-full.yang
netconf-server/src/main/java/org/commscope/tr069adapter/netconf/config/NetConfServerProperties.java
netconf-server/src/main/java/org/commscope/tr069adapter/netconf/notification/NetConfSessionUtil.java
netconf-server/src/main/java/org/commscope/tr069adapter/netconf/notification/NotificationHandler.java
netconf-server/src/main/java/org/commscope/tr069adapter/netconf/restapi/NetConfServerManagerRestApi.java
netconf-server/src/main/java/org/commscope/tr069adapter/netconf/restapi/NotificationReceiverService.java
netconf-server/src/main/java/org/commscope/tr069adapter/netconf/rpc/SoftwareDownloadOperation.java
netconf-server/src/main/java/org/commscope/tr069adapter/netconf/rpc/XmlUtility.java
netconf-server/src/main/java/org/commscope/tr069adapter/netconf/server/NetConfServerManagerImpl.java
netconf-server/src/main/java/org/commscope/tr069adapter/netconf/server/NetconfServerStarter.java
netconf-server/src/main/java/org/commscope/tr069adapter/netconf/server/RestartNetconfServerHandler.java
netconf-server/src/main/java/org/commscope/tr069adapter/netconf/server/helper/ServerPortAllocationHelper.java
netconf-server/src/main/java/org/commscope/tr069adapter/netconf/server/utils/NetConfServerConstants.java [new file with mode: 0644]
netconf-server/src/main/java/org/commscope/tr069adapter/netconf/server/ves/VESNotificationSender.java [new file with mode: 0644]
netconf-server/src/main/resources/application.properties
netconf-server/src/main/resources/log4j2.xml
netconf-server/src/test/java/org/commscope/tr069adapter/netconf/restapi/NotificationServerRestApiTest.java
netconf-server/src/test/java/org/commscope/tr069adapter/netconf/server/RestartNetconfServerHandlerTest.java
netconf-server/src/test/resources/log4j2.xml [new file with mode: 0644]
pom.xml
ves-agent/Dockerfile
ves-agent/pom.xml
ves-agent/src/main/java/org/commscope/tr069adapter/vesagent/VesConfiguration.java
ves-agent/src/main/java/org/commscope/tr069adapter/vesagent/async/AsyncRequestHandler.java [new file with mode: 0644]
ves-agent/src/main/java/org/commscope/tr069adapter/vesagent/async/AsyncThreadPoolConfig.java [new file with mode: 0644]
ves-agent/src/main/java/org/commscope/tr069adapter/vesagent/async/WaitForNotifications.java [new file with mode: 0644]
ves-agent/src/main/java/org/commscope/tr069adapter/vesagent/boot/VESAgentServiceBooter.java
ves-agent/src/main/java/org/commscope/tr069adapter/vesagent/controller/AlarmMappingHandler.java
ves-agent/src/main/java/org/commscope/tr069adapter/vesagent/controller/HeartBeatMessageHandler.java
ves-agent/src/main/java/org/commscope/tr069adapter/vesagent/controller/PnfRegMappingHandler.java
ves-agent/src/main/java/org/commscope/tr069adapter/vesagent/controller/VESAgentService.java
ves-agent/src/main/java/org/commscope/tr069adapter/vesagent/entity/DeviceDataEntity.java [new file with mode: 0644]
ves-agent/src/main/java/org/commscope/tr069adapter/vesagent/exception/VesAgentException.java [new file with mode: 0644]
ves-agent/src/main/java/org/commscope/tr069adapter/vesagent/mapper/MapperRequestSender.java [new file with mode: 0644]
ves-agent/src/main/java/org/commscope/tr069adapter/vesagent/model/HeartbeatFields.java
ves-agent/src/main/java/org/commscope/tr069adapter/vesagent/repository/VesDataRepository.java [new file with mode: 0644]
ves-agent/src/main/java/org/commscope/tr069adapter/vesagent/service/VesAgentServiceHelper.java [new file with mode: 0644]
ves-agent/src/main/java/org/commscope/tr069adapter/vesagent/timer/HeartBeatTimeoutTask.java [new file with mode: 0644]
ves-agent/src/main/java/org/commscope/tr069adapter/vesagent/timer/ScheduleConfig.java [new file with mode: 0644]
ves-agent/src/main/java/org/commscope/tr069adapter/vesagent/timer/ScheduleInfo.java [new file with mode: 0644]
ves-agent/src/main/java/org/commscope/tr069adapter/vesagent/timer/ScheduleTaskService.java [new file with mode: 0644]
ves-agent/src/main/java/org/commscope/tr069adapter/vesagent/timer/ServiceConfig.java [new file with mode: 0644]
ves-agent/src/main/java/org/commscope/tr069adapter/vesagent/timer/StartupTimerService.java [new file with mode: 0644]
ves-agent/src/main/java/org/commscope/tr069adapter/vesagent/util/EventUtil.java [new file with mode: 0644]
ves-agent/src/main/java/org/commscope/tr069adapter/vesagent/util/VesAgentConstants.java [new file with mode: 0644]
ves-agent/src/main/java/org/commscope/tr069adapter/vesagent/util/VesAgentUtils.java [new file with mode: 0644]
ves-agent/src/main/resources/application.properties
ves-agent/src/main/resources/log4j2.xml
ves-agent/src/main/resources/schema-mariadb.sql [new file with mode: 0644]
ves-agent/src/test/java/org/commscope/tr069adapter/vesagent/test/VESAgentServiceRestTest.java
ves-agent/src/test/resources/application.properties
ves-agent/src/test/resources/log4j2.xml [new file with mode: 0644]

index 3accec2..291d6e4 100644 (file)
@@ -87,7 +87,7 @@
          <groupId>com.fasterxml.jackson.core</groupId>\r
          <artifactId>jackson-databind</artifactId>\r
       </dependency>\r
-      <dependency>\r
+         <dependency>\r
          <groupId>org.commscope.tr069adapter.acs.common</groupId>\r
          <artifactId>acs-common</artifactId>\r
          <version>1.0.0</version>\r
                      <pullRegistry>${env.CONTAINER_PULL_REGISTRY}</pullRegistry>\r
                      <images>\r
                         <image>\r
-                           <name>${docker.image.name}</name>\r
+                           <name>${docker.image.name}:${build.version}</name>\r
                            <build>\r
                               <cleanup>try</cleanup>\r
                               <contextDir>${basedir}</contextDir>\r
index 37dc186..ee7c1f8 100644 (file)
@@ -48,6 +48,7 @@ import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
 import org.springframework.jms.annotation.EnableJms;\r
 import org.springframework.jms.config.DefaultJmsListenerContainerFactory;\r
 import org.springframework.jms.config.JmsListenerContainerFactory;\r
+import org.springframework.jms.listener.MessageListenerContainer;\r
 import org.springframework.jms.support.converter.MappingJackson2MessageConverter;\r
 import org.springframework.jms.support.converter.MessageConverter;\r
 import org.springframework.jms.support.converter.MessageType;\r
@@ -137,33 +138,36 @@ public class ACSServiceBooter {
   }\r
   // End\r
 \r
-\r
   @Bean\r
-  public JmsListenerContainerFactory<?> tr069NBIRequestCF(ConnectionFactory connectionFactory,\r
+  public JmsListenerContainerFactory<MessageListenerContainer> tr069NBIRequestCF(\r
+      ConnectionFactory connectionFactory,\r
       DefaultJmsListenerContainerFactoryConfigurer configurer) {\r
-    DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();\r
-    configurer.configure(factory, connectionFactory);\r
-    return factory;\r
+    return handleJMSCommonConfiguration(connectionFactory, configurer);\r
   }\r
 \r
   @Bean\r
-  public JmsListenerContainerFactory<?> tr069DeviceResponseCF(ConnectionFactory connectionFactory,\r
+  public JmsListenerContainerFactory<MessageListenerContainer> tr069DeviceResponseCF(\r
+      ConnectionFactory connectionFactory,\r
       DefaultJmsListenerContainerFactoryConfigurer configurer) {\r
-    DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();\r
-    configurer.configure(factory, connectionFactory);\r
-    return factory;\r
+    return handleJMSCommonConfiguration(connectionFactory, configurer);\r
   }\r
 \r
   @Bean\r
-  public JmsListenerContainerFactory<?> nbiNotificationCF(ConnectionFactory connectionFactory,\r
+  public JmsListenerContainerFactory<MessageListenerContainer> nbiNotificationCF(\r
+      ConnectionFactory connectionFactory,\r
       DefaultJmsListenerContainerFactoryConfigurer configurer) {\r
-    DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();\r
-    configurer.configure(factory, connectionFactory);\r
-    return factory;\r
+    return handleJMSCommonConfiguration(connectionFactory, configurer);\r
   }\r
 \r
   @Bean\r
-  public JmsListenerContainerFactory<?> nbiOpResultCF(ConnectionFactory connectionFactory,\r
+  public JmsListenerContainerFactory<MessageListenerContainer> nbiOpResultCF(\r
+      ConnectionFactory connectionFactory,\r
+      DefaultJmsListenerContainerFactoryConfigurer configurer) {\r
+    return handleJMSCommonConfiguration(connectionFactory, configurer);\r
+  }\r
+\r
+  public JmsListenerContainerFactory handleJMSCommonConfiguration(\r
+      ConnectionFactory connectionFactory,\r
       DefaultJmsListenerContainerFactoryConfigurer configurer) {\r
     DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();\r
     configurer.configure(factory, connectionFactory);\r
index c23beac..eb0336c 100644 (file)
@@ -1,25 +1,25 @@
-<?xml version="1.0" encoding="UTF-8"?>\r
-<!--\r
-/*\r
- * ============LICENSE_START========================================================================\r
- * ONAP : tr-069-adapter\r
- * =================================================================================================\r
- * Copyright (C) 2020 CommScope Inc Intellectual Property.\r
- * =================================================================================================\r
- * This tr-069-adapter software file is distributed by CommScope Inc\r
- * under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- * http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * This file is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- * ===============LICENSE_END=======================================================================\r
-*/\r
--->\r
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+ * ============LICENSE_START========================================================================
+ * ONAP : tr-069-adapter
+ * =================================================================================================
+ * Copyright (C) 2020 CommScope Inc Intellectual Property.
+ * =================================================================================================
+ * This tr-069-adapter software file is distributed by CommScope Inc
+ * 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
+ *
+ * This file 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.
+ * ===============LICENSE_END=======================================================================
+*/
+-->
 <Configuration status="DEBUG" monitorInterval="30">\r
     <Properties>\r
         <Property name="LOG_PATTERN">%d{yyyy-MM-dd HH:mm:ss} %m%n</Property>\r
     <Loggers>\r
        <Logger name="org.commscope.tr069adapter" level="debug" additivity="false">\r
                <appender-ref ref="console"/>\r
-               <appender-ref ref="applicationLog"/>\r
-       </Logger>\r
-       \r
-       <Logger name="org.springframework" level="error" additivity="false">\r
-               <appender-ref ref="console"/>\r
+                       <appender-ref ref="applicationLog"/>\r
+               </Logger>\r
+               \r
+               <Logger name="org.springframework" level="error" additivity="false">\r
+                       <appender-ref ref="console"/>\r
             <AppenderRef ref="springLog" />\r
         </Logger>\r
         \r
         \r
         <Root level="DEBUG" additivity="false"/>\r
     </Loggers>\r
-</Configuration>\r
+</Configuration>
index 664cb66..f39500d 100644 (file)
@@ -1,40 +1,40 @@
 -- ACS Module related tables - START\r
 \r
 CREATE TABLE IF NOT EXISTS tr069_device \r
-  (\r
-  ID int null,\r
-  DEVICE_ID varchar(30) not null,\r
-  USER_NAME varchar(256),\r
-  PASSWORD varchar(256),\r
-  SW_VERSION varchar(20),\r
-  HW_VERSION varchar(20),\r
-  CONNECTION_REQUEST_URL varchar(1024),\r
-  LAST_UPDATED_TIME Timestamp\r
+       (\r
+       ID int null,\r
+       DEVICE_ID varchar(30) not null,\r
+       USER_NAME varchar(256),\r
+       PASSWORD varchar(256),\r
+       SW_VERSION varchar(20),\r
+       HW_VERSION varchar(20),\r
+       CONNECTION_REQUEST_URL varchar(1024),\r
+       LAST_UPDATED_TIME Timestamp\r
 );\r
 \r
 \r
 CREATE TABLE IF NOT EXISTS tr069_nbi_request \r
-  (\r
-  ID int null, \r
-  DEVICE_ID varchar(30) not null, \r
-  OPERATION_ID bigint unsigned not null,\r
-  OPERATION_CODE int null,\r
-  ATTRIBUTE_JSON1 varchar(4000),\r
-  ATTRIBUTE_JSON2 varchar(4000),\r
-  ATTRIBUTE_JSON3 varchar(4000),\r
-  REQUEST_TIME_OUT int,\r
-  CREATE_TIME DATETIME(6),\r
-  IS_PROCESSED int DEFAULT 0\r
+       (\r
+       ID int null, \r
+       DEVICE_ID varchar(30) not null, \r
+       OPERATION_ID bigint unsigned not null,\r
+       OPERATION_CODE int null,\r
+       ATTRIBUTE_JSON1 varchar(4000),\r
+       ATTRIBUTE_JSON2 varchar(4000),\r
+       ATTRIBUTE_JSON3 varchar(4000),\r
+       REQUEST_TIME_OUT int,\r
+       CREATE_TIME DATETIME(6),\r
+       IS_PROCESSED int DEFAULT 0\r
 );\r
 \r
-\r
+       \r
 CREATE TABLE IF NOT EXISTS tr069_session \r
-  (\r
-  DEVICE_ID varchar(30) not null,\r
-  SESSION_ID varchar(64) not null,\r
-  STATE int,\r
-  CURRENT_OPERATION_ID bigint unsigned,\r
-  SESSION_START_TIME TIMESTAMP\r
+       (\r
+       DEVICE_ID varchar(30) not null,\r
+       SESSION_ID varchar(64) not null,\r
+       STATE int,\r
+       CURRENT_OPERATION_ID bigint unsigned,\r
+       SESSION_START_TIME TIMESTAMP\r
 );\r
 \r
 CREATE SEQUENCE IF NOT EXISTS hibernate_sequence MINVALUE 1 MAXVALUE 4611686018427387903 CYCLE CACHE 10;\r
diff --git a/acs/application-booter/src/test/resources/log4j2.xml b/acs/application-booter/src/test/resources/log4j2.xml
new file mode 100644 (file)
index 0000000..446cf15
--- /dev/null
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+ * ============LICENSE_START========================================================================
+ * ONAP : tr-069-adapter
+ * =================================================================================================
+ * Copyright (C) 2020 CommScope Inc Intellectual Property.
+ * =================================================================================================
+ * This tr-069-adapter software file is distributed by CommScope Inc
+ * 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
+ *
+ * This file 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.
+ * ===============LICENSE_END=======================================================================
+*/
+-->
+<Configuration status="DEBUG" monitorInterval="30">\r
+    <Properties>\r
+        <Property name="LOG_PATTERN">%d{yyyy-MM-dd HH:mm:ss} %m%n</Property>\r
+        <Property name="APP_LOG_ROOT">./target/test-logs</Property>\r
+    </Properties>\r
+    <Appenders>\r
+       <Console name="console" target="SYSTEM_OUT" follow="true">\r
+            <PatternLayout pattern="${LOG_PATTERN}"/>\r
+        </Console>\r
+        \r
+        <RollingFile name="applicationLog"\r
+            fileName="${APP_LOG_ROOT}/debug/application-debug.log"\r
+            filePattern="${APP_LOG_ROOT}/debug/application-debug-%d{yyyy-MM-dd}-%i.log">\r
+            <PatternLayout>\r
+               <pattern>[%d{yyyy-MM-dd HH:mm:ss:SSS}] [%X{client}] [%.-40t] %-25.45c{1} %-5p: %m%n</pattern>\r
+               <header>Debug Log started at: $${date:yyyy-MM-dd HH:mm:ss}</header>\r
+            </PatternLayout>\r
+            <Policies>\r
+                <SizeBasedTriggeringPolicy size="4MB" />\r
+                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>\r
+            </Policies>\r
+            <DefaultRolloverStrategy>\r
+                <Delete basePath="${APP_LOG_ROOT}/debug/" maxDepth="1">\r
+                    <IfFileName glob="application-debug-*.log" />\r
+                    <IfAccumulatedFileCount exceeds="10" />\r
+                </Delete>\r
+            </DefaultRolloverStrategy>\r
+        </RollingFile>\r
+  \r
+               <RollingFile name="springLog" \r
+                       fileName="${APP_LOG_ROOT}/spring/spring.log"\r
+            filePattern="${APP_LOG_ROOT}/spring/spring-%d{yyyy-MM-dd}-%i.log">\r
+            <PatternLayout pattern="${LOG_PATTERN}"/>\r
+            <Policies>\r
+                <SizeBasedTriggeringPolicy size="4MB" />\r
+                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>\r
+            </Policies>\r
+            <DefaultRolloverStrategy>\r
+                <Delete basePath="${APP_LOG_ROOT}/spring/" maxDepth="1">\r
+                    <IfFileName glob="spring-*.log" />\r
+                    <IfAccumulatedFileCount exceeds="10" />\r
+                </Delete>\r
+            </DefaultRolloverStrategy>\r
+        </RollingFile>\r
+        \r
+        <RollingFile name="hibernateLog" \r
+                       fileName="${APP_LOG_ROOT}/hibernate/database.log"\r
+            filePattern="${APP_LOG_ROOT}/hibernate/database-%d{yyyy-MM-dd}-%i.log">\r
+            <PatternLayout pattern="${LOG_PATTERN}"/>\r
+            <Policies>\r
+                <SizeBasedTriggeringPolicy size="4MB" />\r
+                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>\r
+            </Policies>\r
+            <DefaultRolloverStrategy>\r
+                <Delete basePath="${APP_LOG_ROOT}/hibernate/" maxDepth="1">\r
+                    <IfFileName glob="database-*.log" />\r
+                    <IfAccumulatedFileCount exceeds="10" />\r
+                </Delete>\r
+            </DefaultRolloverStrategy>\r
+        </RollingFile>\r
+        \r
+    </Appenders>\r
+    \r
+    <Loggers>\r
+       <Logger name="org.commscope.tr069adapter" level="debug" additivity="false">\r
+               <appender-ref ref="console"/>\r
+                       <appender-ref ref="applicationLog"/>\r
+               </Logger>\r
+               \r
+               <Logger name="org.springframework" level="error" additivity="false">\r
+                       <appender-ref ref="console"/>\r
+            <AppenderRef ref="springLog" />\r
+        </Logger>\r
+        \r
+        <Logger name="org.hibernate" level="error" additivity="false">\r
+               <appender-ref ref="console"/>\r
+            <AppenderRef ref="hibernateLog" />\r
+        </Logger>\r
+        \r
+        <Root level="DEBUG" additivity="false"/>\r
+    </Loggers>\r
+</Configuration>
index 6e4af40..c8a9b01 100644 (file)
    <groupId>org.commscope.tr069adapter.acs.common</groupId>\r
    <artifactId>acs-common</artifactId>\r
    <name>ACS common utility</name>\r
-    <parent>\r
-       <groupId>org.commscope.tr069adapter.acs</groupId>\r
-       <artifactId>acs</artifactId>\r
-       <version>1.0.0</version>\r
-    </parent>\r
+       <parent>\r
+               <groupId>org.commscope.tr069adapter.acs</groupId>\r
+               <artifactId>acs</artifactId>\r
+               <version>1.0.0</version>\r
+       </parent>\r
    <dependencies>\r
       <dependency>\r
          <groupId>org.springframework.boot</groupId>\r
index 7db39fd..8063f13 100644 (file)
@@ -35,6 +35,10 @@ public class DeviceDetails implements Serializable {
 \r
   protected String productClass;\r
 \r
+  // Device version details\r
+  protected String softwareVersion;\r
+  protected String hardwareVersion;\r
+\r
   public String getDeviceId() {\r
     return deviceId;\r
   }\r
@@ -67,4 +71,20 @@ public class DeviceDetails implements Serializable {
     this.productClass = productClass;\r
   }\r
 \r
+  public String getSoftwareVersion() {\r
+    return softwareVersion;\r
+  }\r
+\r
+  public void setSoftwareVersion(String softwareVersion) {\r
+    this.softwareVersion = softwareVersion;\r
+  }\r
+\r
+  public String getHardwareVersion() {\r
+    return hardwareVersion;\r
+  }\r
+\r
+  public void setHardwareVersion(String hardwareVersion) {\r
+    this.hardwareVersion = hardwareVersion;\r
+  }\r
+\r
 }\r
index 1657744..1a1ad5d 100644 (file)
@@ -22,7 +22,7 @@ import java.io.Serializable;
 import java.util.HashMap;\r
 import java.util.Map;\r
 \r
-public class DeviceRPCRequest implements Serializable, Cloneable {\r
+public class DeviceRPCRequest implements Serializable {\r
 \r
   private static final long serialVersionUID = -7300390764969298783L;\r
 \r
@@ -33,7 +33,25 @@ public class DeviceRPCRequest implements Serializable, Cloneable {
   private OperationDetails opDetails;\r
 \r
   private OperationOptions options;\r
-  private Map<String, Object> context = new HashMap<>();\r
+  private transient Map<String, Object> context = new HashMap<>();\r
+\r
+  public DeviceRPCRequest(DeviceDetails deviceDetails, Long operationId, OperationDetails opDetails,\r
+      OperationOptions options, Map<String, Object> context) {\r
+    super();\r
+    this.deviceDetails = deviceDetails;\r
+    this.operationId = operationId;\r
+    this.opDetails = opDetails;\r
+    this.options = options;\r
+    this.context = context;\r
+  }\r
+\r
+  public DeviceRPCRequest(DeviceRPCRequest deviceRPCRequest) {\r
+    deviceDetails = deviceRPCRequest.deviceDetails;\r
+    operationId = deviceRPCRequest.operationId;\r
+    opDetails = deviceRPCRequest.opDetails;\r
+    options = deviceRPCRequest.options;\r
+    context = deviceRPCRequest.context;\r
+  }\r
 \r
   public DeviceRPCRequest() {\r
 \r
@@ -84,11 +102,6 @@ public class DeviceRPCRequest implements Serializable, Cloneable {
     this.context.put(name, value);\r
   }\r
 \r
-  @Override\r
-  public Object clone() throws CloneNotSupportedException {\r
-    return super.clone();\r
-  }\r
-\r
   @Override\r
   public String toString() {\r
     return "NBIDeviceOperationRequest [deviceId=" + deviceDetails.getDeviceId() + ", deviceType="\r
index b53338a..4d4ef7e 100644 (file)
@@ -28,10 +28,6 @@ public class TR069DeviceDetails extends DeviceDetails {
   private String username;\r
   private String password;\r
 \r
-  // Device version details\r
-  private String softwareVersion;\r
-  private String hardwareVersion;\r
-\r
   // Device connection request URL\r
   private String connectionRequestURL;\r
 \r
@@ -51,22 +47,6 @@ public class TR069DeviceDetails extends DeviceDetails {
     this.password = password;\r
   }\r
 \r
-  public String getSoftwareVersion() {\r
-    return softwareVersion;\r
-  }\r
-\r
-  public void setSoftwareVersion(String softwareVersion) {\r
-    this.softwareVersion = softwareVersion;\r
-  }\r
-\r
-  public String getHardwareVersion() {\r
-    return hardwareVersion;\r
-  }\r
-\r
-  public void setHardwareVersion(String hardwareVersion) {\r
-    this.hardwareVersion = hardwareVersion;\r
-  }\r
-\r
   public String getConnectionRequestURL() {\r
     return connectionRequestURL;\r
   }\r
index 12b34c2..2a5ed3f 100644 (file)
@@ -29,10 +29,10 @@ TR069.EMPTY_REQUEST_PROCESSING_ERROR=Failed processing the empty request from de
 \r
 TR069.DEVICE_NOT_ACTIVATED=Device is not activated. Device should contact ACS via BOOTSTRAP Inform to be activated\r
 TR069.DEVICE_NOT_EXISTS=Device {0} does not exist. Device must be factory imported before contacting ACS.\r
-\r
+       \r
 TR069.INVALID_NBI_REQUEST=An Empty/NULL device RPC request received from mapper.\r
 TR069.MISSING_OPERATION_DETAILS=Device RPC request does not contain valid operation details like operation code.\r
-\r
+       \r
 TR069.SESSION_CREATION_ERROR=An error occurred during session creation, Reason: {0}\r
 TR069.SESSION_ALREADY_LOCKED=Session lock could not be acquired, Session is already busy honoring another request. Lock acquire failure reason: {0}\r
 TR069.SESSION_EXPIRED=Session with ID {0}, for the device is expired.\r
index 198023e..4c1a000 100644 (file)
 -->\r
 \r
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"\r
-    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">\r
-    <modelVersion>4.0.0</modelVersion>\r
-    <groupId>org.commscope.tr069adapter.acs.cpe</groupId>\r
-    <artifactId>cpe</artifactId>\r
-    <name>CPE Management</name>\r
+       xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">\r
+       <modelVersion>4.0.0</modelVersion>\r
+       <groupId>org.commscope.tr069adapter.acs.cpe</groupId>\r
+       <artifactId>cpe</artifactId>\r
+       <name>CPE Management</name>\r
 \r
-    <parent>\r
-       <groupId>org.commscope.tr069adapter.acs</groupId>\r
-       <artifactId>acs</artifactId>\r
-       <version>1.0.0</version>\r
-    </parent>\r
+       <parent>\r
+               <groupId>org.commscope.tr069adapter.acs</groupId>\r
+               <artifactId>acs</artifactId>\r
+               <version>1.0.0</version>\r
+       </parent>\r
 \r
-    <dependencies>\r
-       <dependency>\r
-               <groupId>org.springframework</groupId>\r
-               <artifactId>spring-jms</artifactId>\r
-       </dependency>\r
-       <dependency>\r
-               <groupId>org.springframework.boot</groupId>\r
-               <artifactId>spring-boot-starter-web</artifactId>\r
-               <exclusions>\r
+       <dependencies>\r
+               <dependency>\r
+                       <groupId>org.springframework</groupId>\r
+                       <artifactId>spring-jms</artifactId>\r
+               </dependency>\r
+               <dependency>\r
+                       <groupId>org.springframework.boot</groupId>\r
+                       <artifactId>spring-boot-starter-web</artifactId>\r
+                       <exclusions>\r
                 <exclusion>\r
                     <groupId>org.springframework.boot</groupId>\r
                     <artifactId>spring-boot-starter-logging</artifactId>\r
                 </exclusion>\r
             </exclusions>\r
-       </dependency>\r
-       <dependency>\r
+               </dependency>\r
+               <dependency>\r
                <groupId>org.springframework.boot</groupId>\r
                <artifactId>spring-boot-starter-log4j2</artifactId>\r
-       </dependency>\r
-       <dependency>\r
+               </dependency>\r
+               <dependency>\r
             <groupId>com.lmax</groupId>\r
             <artifactId>disruptor</artifactId>\r
             <version>3.4.2</version>\r
         </dependency>\r
-       <dependency>\r
+               <dependency>\r
             <groupId>org.springframework.boot</groupId>\r
             <artifactId>spring-boot-starter-activemq</artifactId>\r
         </dependency>\r
-       <dependency>\r
-               <groupId>org.apache.activemq</groupId>\r
-               <artifactId>activemq-broker</artifactId>\r
-       </dependency>\r
-       <dependency>\r
-               <groupId>com.fasterxml.jackson.core</groupId>\r
-               <artifactId>jackson-databind</artifactId>\r
-       </dependency>\r
-       <dependency>\r
-               <groupId>javax.ws.rs</groupId>\r
-               <artifactId>javax.ws.rs-api</artifactId>\r
-               <version>2.0</version>\r
-       </dependency>\r
-       <dependency>\r
-               <groupId>com.sun.xml.messaging.saaj</groupId>\r
-               <artifactId>saaj-impl</artifactId>\r
-       </dependency>\r
-       <dependency>\r
-               <groupId>javax.xml.bind</groupId>\r
-               <artifactId>jaxb-api</artifactId>\r
-       </dependency>\r
-       <dependency>\r
-               <groupId>commons-httpclient</groupId>\r
-               <artifactId>commons-httpclient</artifactId>\r
-               <version>3.1</version>\r
-       </dependency>\r
-       <dependency>\r
-               <groupId>org.commscope.tr069adapter.common</groupId>\r
-               <artifactId>common</artifactId>\r
-               <version>1.0.0</version>\r
-       </dependency>\r
-       <dependency>\r
+               <dependency>\r
+                       <groupId>org.apache.activemq</groupId>\r
+                       <artifactId>activemq-broker</artifactId>\r
+               </dependency>\r
+               <dependency>\r
+                       <groupId>com.fasterxml.jackson.core</groupId>\r
+                       <artifactId>jackson-databind</artifactId>\r
+               </dependency>\r
+               <dependency>\r
+                       <groupId>javax.ws.rs</groupId>\r
+                       <artifactId>javax.ws.rs-api</artifactId>\r
+                       <version>2.0</version>\r
+               </dependency>\r
+               <dependency>\r
+                       <groupId>com.sun.xml.messaging.saaj</groupId>\r
+                       <artifactId>saaj-impl</artifactId>\r
+               </dependency>\r
+               <dependency>\r
+                       <groupId>javax.xml.bind</groupId>\r
+                       <artifactId>jaxb-api</artifactId>\r
+               </dependency>\r
+               <dependency>\r
+                       <groupId>commons-httpclient</groupId>\r
+                       <artifactId>commons-httpclient</artifactId>\r
+                       <version>3.1</version>\r
+               </dependency>\r
+               <dependency>\r
+                       <groupId>org.commscope.tr069adapter.common</groupId>\r
+                       <artifactId>common</artifactId>\r
+                       <version>1.0.0</version>\r
+               </dependency>\r
+               <dependency>\r
          <groupId>org.commscope.tr069adapter.acs.common</groupId>\r
          <artifactId>acs-common</artifactId>\r
          <version>1.0.0</version>\r
       </dependency>\r
-    </dependencies>\r
+       </dependencies>\r
    <build>\r
       <plugins>\r
          <plugin>\r
index d7db474..9decb41 100644 (file)
 -->\r
 \r
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"\r
-    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">\r
-    \r
-    <modelVersion>4.0.0</modelVersion>\r
-    <groupId>org.commscope.tr069adapter.acs.nbi</groupId>\r
-    <artifactId>acsnbi</artifactId>\r
-    <name>acs nbi service</name>\r
-    \r
-    <parent>\r
-       <groupId>org.commscope.tr069adapter.acs</groupId>\r
-       <artifactId>acs</artifactId>\r
-       <version>1.0.0</version>\r
-    </parent>\r
-    \r
-    <dependencies>\r
-       <dependency>\r
-               <groupId>org.springframework</groupId>\r
-               <artifactId>spring-jms</artifactId>\r
-       </dependency>\r
-       <dependency>\r
-               <groupId>org.springframework.boot</groupId>\r
-               <artifactId>spring-boot-starter-web</artifactId>\r
-               <exclusions>\r
+       xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">\r
+       \r
+       <modelVersion>4.0.0</modelVersion>\r
+       <groupId>org.commscope.tr069adapter.acs.nbi</groupId>\r
+       <artifactId>acsnbi</artifactId>\r
+       <name>acs nbi service</name>\r
+       \r
+       <parent>\r
+               <groupId>org.commscope.tr069adapter.acs</groupId>\r
+               <artifactId>acs</artifactId>\r
+               <version>1.0.0</version>\r
+       </parent>\r
+       \r
+       <dependencies>\r
+               <dependency>\r
+                       <groupId>org.springframework</groupId>\r
+                       <artifactId>spring-jms</artifactId>\r
+               </dependency>\r
+               <dependency>\r
+                       <groupId>org.springframework.boot</groupId>\r
+                       <artifactId>spring-boot-starter-web</artifactId>\r
+                       <exclusions>\r
                 <exclusion>\r
                     <groupId>org.springframework.boot</groupId>\r
                     <artifactId>spring-boot-starter-logging</artifactId>\r
                 </exclusion>\r
             </exclusions>\r
-       </dependency>\r
-       <dependency>\r
+               </dependency>\r
+               <dependency>\r
                <groupId>org.springframework.boot</groupId>\r
                <artifactId>spring-boot-starter-log4j2</artifactId>\r
-       </dependency>\r
-       <dependency>\r
+               </dependency>\r
+               <dependency>\r
             <groupId>com.lmax</groupId>\r
             <artifactId>disruptor</artifactId>\r
             <version>3.4.2</version>\r
         </dependency>\r
-       <dependency>\r
-               <groupId>org.apache.activemq</groupId>\r
-               <artifactId>activemq-broker</artifactId>\r
-       </dependency>\r
-       <dependency>\r
-               <groupId>com.fasterxml.jackson.core</groupId>\r
-               <artifactId>jackson-databind</artifactId>\r
-       </dependency>\r
-       <dependency>\r
-               <groupId>javax.ws.rs</groupId>\r
-               <artifactId>javax.ws.rs-api</artifactId>\r
-               <version>2.0</version>\r
-       </dependency>\r
-       <dependency>\r
-               <groupId>org.commscope.tr069adapter.common</groupId>\r
-               <artifactId>common</artifactId>\r
-               <version>1.0.0</version>\r
-       </dependency>\r
-       <dependency>\r
+               <dependency>\r
+                       <groupId>org.apache.activemq</groupId>\r
+                       <artifactId>activemq-broker</artifactId>\r
+               </dependency>\r
+               <dependency>\r
+                       <groupId>com.fasterxml.jackson.core</groupId>\r
+                       <artifactId>jackson-databind</artifactId>\r
+               </dependency>\r
+               <dependency>\r
+                       <groupId>javax.ws.rs</groupId>\r
+                       <artifactId>javax.ws.rs-api</artifactId>\r
+                       <version>2.0</version>\r
+               </dependency>\r
+               <dependency>\r
+                       <groupId>org.commscope.tr069adapter.common</groupId>\r
+                       <artifactId>common</artifactId>\r
+                       <version>1.0.0</version>\r
+               </dependency>\r
+               <dependency>\r
          <groupId>org.commscope.tr069adapter.acs.common</groupId>\r
          <artifactId>acs-common</artifactId>\r
          <version>1.0.0</version>\r
       </dependency>\r
-       <dependency>\r
-               <groupId>org.commscope.tr069adapter.acs.requestprocessor</groupId>\r
-               <artifactId>requestprocessor</artifactId>\r
-               <version>1.0.0</version>\r
-       </dependency>\r
-    </dependencies>\r
+               <dependency>\r
+                       <groupId>org.commscope.tr069adapter.acs.requestprocessor</groupId>\r
+                       <artifactId>requestprocessor</artifactId>\r
+                       <version>1.0.0</version>\r
+               </dependency>\r
+       </dependencies>\r
    <build>\r
       <plugins>\r
          <plugin>\r
index e954135..2cc9281 100644 (file)
 -->\r
 \r
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">\r
-    \r
-    <parent>\r
-       <groupId>org.commscope.tr069adapter</groupId>\r
-       <artifactId>tr069adapter</artifactId>\r
-       <version>1.0.0</version>\r
-    </parent>\r
-    \r
-    <modelVersion>4.0.0</modelVersion>\r
-    <groupId>org.commscope.tr069adapter.acs</groupId>\r
-    <artifactId>acs</artifactId>\r
-    <packaging>pom</packaging>\r
+       \r
+       <parent>\r
+               <groupId>org.commscope.tr069adapter</groupId>\r
+               <artifactId>tr069adapter</artifactId>\r
+               <version>1.0.0</version>\r
+       </parent>\r
+       \r
+       <modelVersion>4.0.0</modelVersion>\r
+       <groupId>org.commscope.tr069adapter.acs</groupId>\r
+       <artifactId>acs</artifactId>\r
+       <packaging>pom</packaging>\r
 \r
-    <name>acs</name>\r
-    <modules>\r
-       <module>common</module>\r
-       <module>application-booter</module>\r
-       <module>cpe</module>\r
-       <module>requestprocessor</module>\r
-       <module>nbi</module>\r
-    </modules>\r
+       <name>acs</name>\r
+       <modules>\r
+               <module>common</module>\r
+               <module>application-booter</module>\r
+               <module>cpe</module>\r
+               <module>requestprocessor</module>\r
+               <module>nbi</module>\r
+       </modules>\r
 </project>\r
index 0c69d81..70e6312 100644 (file)
 -->\r
 \r
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"\r
-    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">\r
-    <modelVersion>4.0.0</modelVersion>\r
-    <groupId>org.commscope.tr069adapter.acs.requestprocessor</groupId>\r
-    <artifactId>requestprocessor</artifactId>\r
-    <name>TR069 Request Processor</name>\r
+       xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">\r
+       <modelVersion>4.0.0</modelVersion>\r
+       <groupId>org.commscope.tr069adapter.acs.requestprocessor</groupId>\r
+       <artifactId>requestprocessor</artifactId>\r
+       <name>TR069 Request Processor</name>\r
 \r
-    <parent>\r
-       <groupId>org.commscope.tr069adapter.acs</groupId>\r
-       <artifactId>acs</artifactId>\r
-       <version>1.0.0</version>\r
-    </parent>\r
-    \r
-    <dependencies>\r
-       <dependency>\r
-               <groupId>org.springframework</groupId>\r
-               <artifactId>spring-jms</artifactId>\r
-       </dependency>\r
-       <dependency>\r
-               <groupId>org.springframework.boot</groupId>\r
-               <artifactId>spring-boot-starter-web</artifactId>\r
-               <exclusions>\r
+       <parent>\r
+               <groupId>org.commscope.tr069adapter.acs</groupId>\r
+               <artifactId>acs</artifactId>\r
+               <version>1.0.0</version>\r
+       </parent>\r
+       \r
+       <dependencies>\r
+               <dependency>\r
+                       <groupId>org.springframework</groupId>\r
+                       <artifactId>spring-jms</artifactId>\r
+               </dependency>\r
+               <dependency>\r
+                       <groupId>org.springframework.boot</groupId>\r
+                       <artifactId>spring-boot-starter-web</artifactId>\r
+                       <exclusions>\r
                 <exclusion>\r
                     <groupId>org.springframework.boot</groupId>\r
                     <artifactId>spring-boot-starter-logging</artifactId>\r
                 </exclusion>\r
             </exclusions>\r
-       </dependency>\r
-       <dependency>\r
+               </dependency>\r
+               <dependency>\r
                <groupId>org.springframework.boot</groupId>\r
                <artifactId>spring-boot-starter-log4j2</artifactId>\r
-       </dependency>\r
-       <dependency>\r
+               </dependency>\r
+               <dependency>\r
             <groupId>com.lmax</groupId>\r
             <artifactId>disruptor</artifactId>\r
             <version>3.4.2</version>\r
         </dependency>\r
-       <dependency>\r
+               <dependency>\r
             <groupId>org.springframework.boot</groupId>\r
             <artifactId>spring-boot-starter-activemq</artifactId>\r
         </dependency>\r
-       <dependency>\r
-               <groupId>org.apache.activemq</groupId>\r
-               <artifactId>activemq-broker</artifactId>\r
-       </dependency>\r
-       <dependency>\r
-               <groupId>com.fasterxml.jackson.core</groupId>\r
-               <artifactId>jackson-databind</artifactId>\r
+               <dependency>\r
+                       <groupId>org.apache.activemq</groupId>\r
+                       <artifactId>activemq-broker</artifactId>\r
+               </dependency>\r
+               <dependency>\r
+                       <groupId>com.fasterxml.jackson.core</groupId>\r
+                       <artifactId>jackson-databind</artifactId>\r
+               </dependency>\r
+               <dependency>\r
+                       <groupId>javax.ws.rs</groupId>\r
+                       <artifactId>javax.ws.rs-api</artifactId>\r
+                       <version>2.0</version>\r
+               </dependency>\r
+               <dependency>\r
+                     <groupId>org.mariadb.jdbc</groupId>\r
+                     <artifactId>mariadb-java-client</artifactId>\r
        </dependency>\r
        <dependency>\r
-               <groupId>javax.ws.rs</groupId>\r
-               <artifactId>javax.ws.rs-api</artifactId>\r
-               <version>2.0</version>\r
-       </dependency>\r
-       <dependency>\r
-             <groupId>org.mariadb.jdbc</groupId>\r
-             <artifactId>mariadb-java-client</artifactId>\r
-       </dependency>\r
-       <dependency>\r
-               <groupId>com.fasterxml.uuid</groupId>\r
-               <artifactId>java-uuid-generator</artifactId>\r
-               <version>3.1.3</version>\r
-       </dependency>\r
-       <dependency>\r
-               <groupId>org.springframework.boot</groupId>\r
-               <artifactId>spring-boot-starter-data-jpa</artifactId>\r
-       </dependency>\r
-       <dependency>\r
-               <groupId>com.google.code.gson</groupId>\r
-               <artifactId>gson</artifactId>\r
-       </dependency>\r
-       <dependency>\r
-               <groupId>org.commscope.tr069adapter.common</groupId>\r
-               <artifactId>common</artifactId>\r
-               <version>1.0.0</version>\r
-       </dependency>\r
+                       <groupId>com.fasterxml.uuid</groupId>\r
+                       <artifactId>java-uuid-generator</artifactId>\r
+                       <version>3.1.3</version>\r
+               </dependency>\r
        <dependency>\r
+                       <groupId>org.springframework.boot</groupId>\r
+                       <artifactId>spring-boot-starter-data-jpa</artifactId>\r
+               </dependency>\r
+               <dependency>\r
+                       <groupId>com.google.code.gson</groupId>\r
+                       <artifactId>gson</artifactId>\r
+               </dependency>\r
+               <dependency>\r
+                       <groupId>org.commscope.tr069adapter.common</groupId>\r
+                       <artifactId>common</artifactId>\r
+                       <version>1.0.0</version>\r
+               </dependency>\r
+               <dependency>\r
          <groupId>org.commscope.tr069adapter.acs.common</groupId>\r
          <artifactId>acs-common</artifactId>\r
          <version>1.0.0</version>\r
       </dependency>\r
-    </dependencies>\r
+       </dependencies>\r
    <build>\r
       <plugins>\r
          <plugin>\r
index 5a125ce..768edf3 100644 (file)
@@ -39,7 +39,6 @@ import org.commscope.tr069adapter.acs.common.response.AddObjectResponse;
 import org.commscope.tr069adapter.acs.common.response.DeleteObjectResponse;\r
 import org.commscope.tr069adapter.acs.common.response.GetParameterValueResponse;\r
 import org.commscope.tr069adapter.acs.common.response.SetParameterValueResponse;\r
-import org.commscope.tr069adapter.acs.common.utils.ErrorCode;\r
 import org.commscope.tr069adapter.acs.requestprocessor.dao.DeviceRPCRequestRepositoryHelper;\r
 import org.commscope.tr069adapter.acs.requestprocessor.dto.CustomOperationData;\r
 import org.commscope.tr069adapter.acs.requestprocessor.entity.TR069DeviceRPCRequestEntity;\r
@@ -400,16 +399,8 @@ public class ConfigureMultipleObject implements CustomOperation {
 \r
   }\r
 \r
-  private DeviceRPCRequest cloneNBIRequest(DeviceRPCRequest nbiDeviceOperationRequest)\r
-      throws TR069EventProcessingException {\r
-    DeviceRPCRequest clonedOpRequest = null;\r
-    try {\r
-      clonedOpRequest = (DeviceRPCRequest) nbiDeviceOperationRequest.clone();\r
-    } catch (CloneNotSupportedException e) {\r
-      throw new TR069EventProcessingException(ErrorCode.UNKNOWN_ERROR, e.getMessage());\r
-    }\r
-\r
-    return clonedOpRequest;\r
+  private DeviceRPCRequest cloneNBIRequest(DeviceRPCRequest nbiDeviceOperationRequest) {\r
+    return new DeviceRPCRequest(nbiDeviceOperationRequest);\r
   }\r
 \r
   private ParameterDTO prepareParamDTO(String name, String value, ParameterDTO paramDTO) {\r
index e42ec6f..49ec0a7 100644 (file)
@@ -55,12 +55,17 @@ public class DeviceRPCRequestHandler {
         logger.debug("Received a TR069 operation request from Mapper with operation ID: {} ",\r
             mapperDeviceOperationRequest.getOperationId());\r
         tr069RequestProcessEngine.processDeviceRPCRequest(mapperDeviceOperationRequest);\r
+        logger.debug("Processed a TR069 operation request from Mapper with operation ID: {} ",\r
+            mapperDeviceOperationRequest.getOperationId());\r
+\r
       }\r
     } catch (TR069EventProcessingException ex) {\r
       logger.error(ex.getMessage());\r
     } finally {\r
       MDC.remove(CLIENT_STR);\r
     }\r
+    logger.debug("Processed JMS message from Mapper for TR069 Device RPC operation");\r
+\r
   }\r
 \r
 }\r
index b6025f0..634f9df 100644 (file)
@@ -23,6 +23,7 @@ import static org.commscope.tr069adapter.acs.common.utils.AcsConstants.NBI_OP_RE
 \r
 import org.commscope.tr069adapter.acs.common.DeviceInform;\r
 import org.commscope.tr069adapter.acs.common.DeviceRPCResponse;\r
+import org.commscope.tr069adapter.acs.common.dto.CustomOperationCode;\r
 import org.commscope.tr069adapter.acs.common.dto.TR069InformType;\r
 import org.commscope.tr069adapter.acs.common.dto.TR069OperationCode;\r
 import org.slf4j.Logger;\r
@@ -68,11 +69,19 @@ public class TR069EventNotificationService {
     String deviceId = deviceRPCResponse.getDeviceDetails().getDeviceId();\r
     try {\r
       MDC.put(CLIENT_STR, deviceId);\r
-      TR069OperationCode operCode =\r
-          (TR069OperationCode) deviceRPCResponse.getOperationResponse().getOperationCode();\r
-      String opCodeName = operCode.name();\r
-      logger.debug("Device RPC Response received for operation: '{}' with operation ID: {}",\r
-          opCodeName, deviceRPCResponse.getOperationId());\r
+      if (deviceRPCResponse.getOperationResponse()\r
+          .getOperationCode() instanceof TR069OperationCode) {\r
+        TR069OperationCode operCode =\r
+            (TR069OperationCode) deviceRPCResponse.getOperationResponse().getOperationCode();\r
+        logger.debug("Device RPC Response received for operation: '" + operCode.name()\r
+            + "' with operation ID:" + deviceRPCResponse.getOperationId());\r
+      } else if (deviceRPCResponse.getOperationResponse()\r
+          .getOperationCode() instanceof CustomOperationCode) {\r
+        CustomOperationCode operCode =\r
+            (CustomOperationCode) deviceRPCResponse.getOperationResponse().getOperationCode();\r
+        logger.debug("Device RPC Response received for operation: '" + operCode.getJndiName()\r
+            + "' with operation ID:" + deviceRPCResponse.getOperationId());\r
+      }\r
       jmsTemplate.convertAndSend(NBI_OP_RESULT_Q, deviceRPCResponse);\r
       logger.debug("Successfully posted the operation result event to DM to forward to NBI");\r
     } catch (Exception e) {\r
index 8ad7f2b..91dacb3 100644 (file)
@@ -28,6 +28,7 @@ import org.commscope.tr069adapter.acs.common.DeviceRPCRequest;
 import org.commscope.tr069adapter.acs.common.DeviceRPCResponse;\r
 import org.commscope.tr069adapter.acs.common.OperationCode;\r
 import org.commscope.tr069adapter.acs.common.OperationDetails;\r
+import org.commscope.tr069adapter.acs.common.OperationResponse;\r
 import org.commscope.tr069adapter.acs.common.dto.CustomOperationCode;\r
 import org.commscope.tr069adapter.acs.common.dto.DeviceOperationRequestDetails;\r
 import org.commscope.tr069adapter.acs.common.dto.TR069DeviceDetails;\r
@@ -99,7 +100,11 @@ public class TR069RequestProcessEngine extends TR069RequestProcessEngineHelper {
       deviceId = deviceRPCRequest.getDeviceDetails().getDeviceId();\r
       try {\r
         tr069DeviceDetails = deviceOperationInterface.getDeviceDetails(deviceId);\r
-      } catch (DeviceOperationException deo) {\r
+        deviceRPCResponse = checkForDeviceAvailabilityRequest(deviceRPCRequest, tr069DeviceDetails);\r
+        if (null != deviceRPCResponse) {\r
+          return;\r
+        }\r
+      } catch (DeviceOperationException | SessionManagerException deo) {\r
         logger.error(deo.getMessage());\r
         deviceRPCResponse = tr069RequestProcessEngineUtility.buildAbortedOperationresult(\r
             tr069DeviceDetails, deviceRPCRequest, AcsFaultCode.FAULT_CODE_8000);\r
@@ -152,6 +157,35 @@ public class TR069RequestProcessEngine extends TR069RequestProcessEngineHelper {
     }\r
   }\r
 \r
+  private DeviceRPCResponse checkForDeviceAvailabilityRequest(DeviceRPCRequest deviceRPCRequest,\r
+      TR069DeviceDetails tr069DeviceDetails) throws SessionManagerException {\r
+    DeviceRPCResponse deviceRPCResponse = null;\r
+\r
+    if (!deviceRPCRequest.getOpDetails().getOpCode().equals(CustomOperationCode.CONNECT)) {\r
+      return deviceRPCResponse;\r
+    }\r
+\r
+    SessionDTO sessionDTO = getSession(tr069DeviceDetails.getDeviceId());\r
+\r
+    if (null != sessionDTO && !SessionState.TERMINATED.equals(sessionDTO.getSessionState())) {\r
+      logger.debug("Device is reachable as device tr069 session is in {} state.",\r
+          sessionDTO.getSessionState());\r
+\r
+      deviceRPCResponse = new DeviceRPCResponse();\r
+      deviceRPCResponse.setDeviceDetails(tr069DeviceDetails);\r
+      deviceRPCResponse.setOperationId(deviceRPCRequest.getOperationId());\r
+\r
+      OperationResponse operationResponse = new OperationResponse();\r
+      // device reachable...change value 1 to some constant or enum\r
+      operationResponse.setStatus(TR069RequestProcessorUtility.DEVICE_REACHABLE_STATUS_CODE);\r
+      operationResponse.setOperationCode(deviceRPCRequest.getOpDetails().getOpCode());\r
+\r
+      deviceRPCResponse.setOperationResponse(operationResponse);\r
+    }\r
+\r
+    return deviceRPCResponse;\r
+  }\r
+\r
   /**\r
    * Common Step 1. Since there can exist only one Inform from any device, which will be the\r
    * initiator of the session, following steps to be followed a. Stop the session timer for this\r
@@ -312,19 +346,8 @@ public class TR069RequestProcessEngine extends TR069RequestProcessEngineHelper {
             DeviceRPCRequest operationRequest = customOperationData.getDeviceRPCRequest();\r
             deviceRPCResponse = customOperationData.getDeviceRPCResponse();\r
             if (operationRequest != null) {\r
-              operationRequest.addContextParam(SESSION_ID, newSessionId);\r
-              updateSessionCurOpId(tr069RequestProcessorData, deviceRPCRequest.getOperationId());\r
-              changeSessionState(tr069RequestProcessorData, SessionState.LOCKED);\r
-              updateSession(session);\r
-              if (deviceRPCResponse != null && operationRequest.getOperationId() != null\r
-                  && !operationRequest.getOperationId()\r
-                      .equals(deviceRPCResponse.getOperationId())) {\r
-                logger.debug(\r
-                    "Sending the Device RPC response for a configure Multiple object prior operation");\r
-                // Sending the operation response to NBI\r
-                tr069EventNotificationService.sendOperationResultToNBI(deviceRPCResponse);\r
-              }\r
-              return operationRequest;\r
+              return handleOperationRequest(deviceRPCResponse, session, deviceRPCRequest,\r
+                  newSessionId, tr069RequestProcessorData, operationRequest);\r
             } else {\r
               logger.debug(PENDING_RPC_CHECK);\r
               deviceRPCRequest =\r
@@ -368,6 +391,23 @@ public class TR069RequestProcessEngine extends TR069RequestProcessEngineHelper {
     return deviceRPCRequest;\r
   }\r
 \r
+  private DeviceRPCRequest handleOperationRequest(DeviceRPCResponse deviceRPCResponse,\r
+      SessionDTO session, DeviceRPCRequest deviceRPCRequest, String newSessionId,\r
+      TR069RequestProcessorData tr069RequestProcessorData, DeviceRPCRequest operationRequest) {\r
+    operationRequest.addContextParam(SESSION_ID, newSessionId);\r
+    updateSessionCurOpId(tr069RequestProcessorData, deviceRPCRequest.getOperationId());\r
+    changeSessionState(tr069RequestProcessorData, SessionState.LOCKED);\r
+    updateSession(session);\r
+    if (deviceRPCResponse != null && operationRequest.getOperationId() != null\r
+        && !operationRequest.getOperationId().equals(deviceRPCResponse.getOperationId())) {\r
+      logger\r
+          .debug("Sending the Device RPC response for a configure Multiple object prior operation");\r
+      // Sending the operation response to NBI\r
+      tr069EventNotificationService.sendOperationResultToNBI(deviceRPCResponse);\r
+    }\r
+    return operationRequest;\r
+  }\r
+\r
   /**\r
    * \r
    * 1. Stop the request timer for this device using the session ID received in the cookie of the\r
index 3c80090..9386a07 100644 (file)
@@ -47,6 +47,8 @@ public class TR069RequestProcessorUtility {
 \r
   protected static final int BLOCK_SIZE = 3999;\r
   protected static final int MAX_SIZE = 11998;\r
+  public static final int DEVICE_REACHABLE_STATUS_CODE = 100;\r
+\r
 \r
   private TR069RequestProcessorUtility() {\r
     super();\r
index f3305d2..37a6ab6 100644 (file)
@@ -83,7 +83,7 @@ public class ExecutionContext implements Serializable {
     return subSystemName;\r
   }\r
 \r
-  private Map<String, Object> context = new HashMap<>();\r
+  private transient Map<String, Object> context = new HashMap<>();\r
 \r
   /**\r
    * Can be used to get some job related data, at the time of job execution.\r
index 18bbd49..6c70210 100644 (file)
          <artifactId>spring-boot-starter-test</artifactId>\r
          <scope>test</scope>\r
       </dependency>\r
+      <dependency>\r
+         <groupId>org.commscope.tr069adapter.acs.common</groupId>\r
+         <artifactId>acs-common</artifactId>\r
+         <version>1.0.0</version>\r
+      </dependency>\r
    </dependencies>\r
    <build>\r
       <plugins>\r
                      <pullRegistry>${env.CONTAINER_PULL_REGISTRY}</pullRegistry>\r
                      <images>\r
                         <image>\r
-                           <name>${docker.image.name}</name>\r
+                           <name>${docker.image.name}:${build.version}</name>\r
                            <build>\r
                               <cleanup>try</cleanup>\r
                               <contextDir>${basedir}</contextDir>\r
index 84bab64..e6262e5 100644 (file)
@@ -23,8 +23,8 @@ import java.util.Arrays;
 import java.util.List;\r
 import java.util.Optional;\r
 \r
+import org.commscope.tr069adapter.acs.common.dto.ConfigurationData;\r
 import org.commscope.tr069adapter.config.constants.ConfigurationServiceConstant;\r
-import org.commscope.tr069adapter.config.dto.ConfigurationData;\r
 import org.commscope.tr069adapter.config.exceptions.InvalidConfigurationServiceException;\r
 import org.commscope.tr069adapter.config.model.ConfigFileContent;\r
 import org.commscope.tr069adapter.config.service.ConfigurationDataService;\r
index 4be0ccf..35c689d 100644 (file)
@@ -36,16 +36,14 @@ import javax.xml.validation.Validator;
 \r
 import org.apache.commons.logging.Log;\r
 import org.apache.commons.logging.LogFactory;\r
+import org.commscope.tr069adapter.acs.common.dto.ConfigurationData;\r
 import org.commscope.tr069adapter.config.constants.ConfigurationServiceConstant;\r
-import org.commscope.tr069adapter.config.dto.ConfigurationData;\r
 import org.commscope.tr069adapter.config.exceptions.InvalidConfigurationServiceException;\r
 import org.commscope.tr069adapter.config.model.ConfigFileContent;\r
 import org.springframework.stereotype.Component;\r
 import org.xml.sax.Attributes;\r
 import org.xml.sax.ErrorHandler;\r
 import org.xml.sax.SAXException;\r
-import org.xml.sax.SAXNotRecognizedException;\r
-import org.xml.sax.SAXNotSupportedException;\r
 import org.xml.sax.SAXParseException;\r
 import org.xml.sax.helpers.DefaultHandler;\r
 \r
@@ -113,7 +111,7 @@ public class ConfigurationXMLDataParser extends DefaultHandler {
       parser = factory.newSAXParser();\r
       parser.setProperty(XMLConstants.ACCESS_EXTERNAL_DTD, "");\r
       parser.setProperty(XMLConstants.ACCESS_EXTERNAL_SCHEMA, "");\r
-      setProperty(parser);\r
+      setProperty();\r
 \r
       parser.parse(xmlFileContentInputStream, this);\r
 \r
@@ -269,9 +267,8 @@ public class ConfigurationXMLDataParser extends DefaultHandler {
     logger.debug("File is valid.");\r
   }\r
 \r
-  protected void setProperty(SAXParser parser)\r
-      throws SAXNotRecognizedException, SAXNotSupportedException {\r
-      logger.debug("property added.");\r
+  protected void setProperty() {\r
+    logger.debug("property added.");\r
   }\r
 \r
 }\r
index 9717bf2..0987cde 100644 (file)
@@ -21,8 +21,8 @@ package org.commscope.tr069adapter.config.service;
 import java.nio.charset.StandardCharsets;\r
 import java.util.Optional;\r
 \r
+import org.commscope.tr069adapter.acs.common.dto.ConfigurationData;\r
 import org.commscope.tr069adapter.config.constants.Utility;\r
-import org.commscope.tr069adapter.config.dto.ConfigurationData;\r
 import org.commscope.tr069adapter.config.exceptions.InvalidConfigurationServiceException;\r
 import org.commscope.tr069adapter.config.model.ConfigFileContent;\r
 import org.commscope.tr069adapter.config.parser.ConfigurationXMLDataParser;\r
index 2d73ef5..a247797 100644 (file)
-<?xml version="1.0" encoding="UTF-8"?>\r
-<!--\r
-/*\r
- * ============LICENSE_START========================================================================\r
- * ONAP : tr-069-adapter\r
- * =================================================================================================\r
- * Copyright (C) 2020 CommScope Inc Intellectual Property.\r
- * =================================================================================================\r
- * This tr-069-adapter software file is distributed by CommScope Inc\r
- * under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- * http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * This file is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- * ===============LICENSE_END=======================================================================\r
-*/\r
--->\r
-\r
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+ * ============LICENSE_START========================================================================
+ * ONAP : tr-069-adapter
+ * =================================================================================================
+ * Copyright (C) 2020 CommScope Inc Intellectual Property.
+ * =================================================================================================
+ * This tr-069-adapter software file is distributed by CommScope Inc
+ * 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
+ *
+ * This file 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.
+ * ===============LICENSE_END=======================================================================
+*/
+-->
+
 <Configuration status="DEBUG" monitorInterval="30">\r
-    <Properties>\r
-       <Property name="LOG_PATTERN">%d{yyyy-MM-dd HH:mm:ss} %m%n</Property>\r
-       <Property name="APP_LOG_ROOT">/logs</Property>\r
-       <Property name="LOG_FILE_NAME">configurationServiceLogs</Property>\r
-    </Properties>\r
-    <Appenders>\r
-       <Console name="console" target="SYSTEM_OUT" follow="true">\r
-               <PatternLayout pattern="${LOG_PATTERN}" />\r
-       </Console>\r
+       <Properties>\r
+               <Property name="LOG_PATTERN">%d{yyyy-MM-dd HH:mm:ss} %m%n</Property>\r
+               <Property name="APP_LOG_ROOT">/logs</Property>\r
+               <Property name="LOG_FILE_NAME">configurationServiceLogs</Property>\r
+       </Properties>\r
+       <Appenders>\r
+               <Console name="console" target="SYSTEM_OUT" follow="true">\r
+                       <PatternLayout pattern="${LOG_PATTERN}" />\r
+               </Console>\r
 \r
-       <RollingFile name="applicationLog"\r
-               fileName="${APP_LOG_ROOT}/debug/${LOG_FILE_NAME}-debug.log"\r
-               filePattern="${APP_LOG_ROOT}/debug/${LOG_FILE_NAME}-debug-%d{yyyy-MM-dd}-%i.log">\r
-               <PatternLayout>\r
-                       <pattern>[%d{yyyy-MM-dd HH:mm:ss:SSS}] [%X{client}] [%.-40t]\r
-                               %-25.45c{1} %-5p: %m%n</pattern>\r
-                       <header>Debug Log started at: $${date:yyyy-MM-dd HH:mm:ss}</header>\r
-               </PatternLayout>\r
-               <Policies>\r
-                       <SizeBasedTriggeringPolicy size="4MB" />\r
-                       <TimeBasedTriggeringPolicy interval="1"\r
-                               modulate="true" />\r
-               </Policies>\r
-               <DefaultRolloverStrategy>\r
-                       <Delete basePath="${APP_LOG_ROOT}/debug/" maxDepth="1">\r
-                               <IfFileName glob="application-debug*.log" />\r
-                               <IfAccumulatedFileCount exceeds="10" />\r
-                       </Delete>\r
-               </DefaultRolloverStrategy>\r
-       </RollingFile>\r
+               <RollingFile name="applicationLog"\r
+                       fileName="${APP_LOG_ROOT}/debug/${LOG_FILE_NAME}-debug.log"\r
+                       filePattern="${APP_LOG_ROOT}/debug/${LOG_FILE_NAME}-debug-%d{yyyy-MM-dd}-%i.log">\r
+                       <PatternLayout>\r
+                               <pattern>[%d{yyyy-MM-dd HH:mm:ss:SSS}] [%X{client}] [%.-40t]\r
+                                       %-25.45c{1} %-5p: %m%n</pattern>\r
+                               <header>Debug Log started at: $${date:yyyy-MM-dd HH:mm:ss}</header>\r
+                       </PatternLayout>\r
+                       <Policies>\r
+                               <SizeBasedTriggeringPolicy size="4MB" />\r
+                               <TimeBasedTriggeringPolicy interval="1"\r
+                                       modulate="true" />\r
+                       </Policies>\r
+                       <DefaultRolloverStrategy>\r
+                               <Delete basePath="${APP_LOG_ROOT}/debug/" maxDepth="1">\r
+                                       <IfFileName glob="application-debug*.log" />\r
+                                       <IfAccumulatedFileCount exceeds="10" />\r
+                               </Delete>\r
+                       </DefaultRolloverStrategy>\r
+               </RollingFile>\r
 \r
-       <RollingFile name="springLog"\r
-               fileName="${APP_LOG_ROOT}/debug/spring-framework.log" filePattern="${APP_LOG_ROOT}/debug/spring-%d{yyyy-MM-dd}-%i.log">\r
-               <PatternLayout pattern="${LOG_PATTERN}" />\r
-               <Policies>\r
-                       <SizeBasedTriggeringPolicy size="4MB" />\r
-                       <TimeBasedTriggeringPolicy interval="1"\r
-                               modulate="true" />\r
-               </Policies>\r
-               <DefaultRolloverStrategy>\r
-                       <Delete basePath="${APP_LOG_ROOT}/debug/" maxDepth="1">\r
-                               <IfFileName glob="spring*.log" />\r
-                               <IfAccumulatedFileCount exceeds="10" />\r
-                       </Delete>\r
-               </DefaultRolloverStrategy>\r
-       </RollingFile>\r
+               <RollingFile name="springLog"\r
+                       fileName="${APP_LOG_ROOT}/debug/spring-framework.log" filePattern="${APP_LOG_ROOT}/debug/spring-%d{yyyy-MM-dd}-%i.log">\r
+                       <PatternLayout pattern="${LOG_PATTERN}" />\r
+                       <Policies>\r
+                               <SizeBasedTriggeringPolicy size="4MB" />\r
+                               <TimeBasedTriggeringPolicy interval="1"\r
+                                       modulate="true" />\r
+                       </Policies>\r
+                       <DefaultRolloverStrategy>\r
+                               <Delete basePath="${APP_LOG_ROOT}/debug/" maxDepth="1">\r
+                                       <IfFileName glob="spring*.log" />\r
+                                       <IfAccumulatedFileCount exceeds="10" />\r
+                               </Delete>\r
+                       </DefaultRolloverStrategy>\r
+               </RollingFile>\r
 \r
-       <RollingFile name="hibernateLog" fileName="${APP_LOG_ROOT}/debug/database.log"\r
-               filePattern="${APP_LOG_ROOT}/debug/database-%d{yyyy-MM-dd}-%i.log">\r
-               <PatternLayout pattern="${LOG_PATTERN}" />\r
-               <Policies>\r
-                       <SizeBasedTriggeringPolicy size="4MB" />\r
-                       <TimeBasedTriggeringPolicy interval="1"\r
-                               modulate="true" />\r
-               </Policies>\r
-               <DefaultRolloverStrategy>\r
-                       <Delete basePath="${APP_LOG_ROOT}/debug/" maxDepth="1">\r
-                               <IfFileName glob="application-debug*.log" />\r
-                               <IfAccumulatedFileCount exceeds="10" />\r
-                       </Delete>\r
-               </DefaultRolloverStrategy>\r
-       </RollingFile>\r
+               <RollingFile name="hibernateLog" fileName="${APP_LOG_ROOT}/debug/database.log"\r
+                       filePattern="${APP_LOG_ROOT}/debug/database-%d{yyyy-MM-dd}-%i.log">\r
+                       <PatternLayout pattern="${LOG_PATTERN}" />\r
+                       <Policies>\r
+                               <SizeBasedTriggeringPolicy size="4MB" />\r
+                               <TimeBasedTriggeringPolicy interval="1"\r
+                                       modulate="true" />\r
+                       </Policies>\r
+                       <DefaultRolloverStrategy>\r
+                               <Delete basePath="${APP_LOG_ROOT}/debug/" maxDepth="1">\r
+                                       <IfFileName glob="application-debug*.log" />\r
+                                       <IfAccumulatedFileCount exceeds="10" />\r
+                               </Delete>\r
+                       </DefaultRolloverStrategy>\r
+               </RollingFile>\r
 \r
-    </Appenders>\r
+       </Appenders>\r
 \r
-    <Loggers>\r
-       <Logger name="org.commscope.tr069adapter.config" level="debug"\r
-               additivity="false">\r
-               <appender-ref ref="console" />\r
-               <appender-ref ref="applicationLog" />\r
-       </Logger>\r
+       <Loggers>\r
+               <Logger name="org.commscope.tr069adapter.config" level="debug"\r
+                       additivity="false">\r
+                       <appender-ref ref="console" />\r
+                       <appender-ref ref="applicationLog" />\r
+               </Logger>\r
 \r
-       <Logger name="org.springframework" level="error" additivity="false">\r
-               <appender-ref ref="console" />\r
-               <AppenderRef ref="springLog" />\r
-       </Logger>\r
+               <Logger name="org.springframework" level="error" additivity="false">\r
+                       <appender-ref ref="console" />\r
+                       <AppenderRef ref="springLog" />\r
+               </Logger>\r
 \r
-       <Logger name="org.hibernate" level="error" additivity="false">\r
-               <appender-ref ref="console" />\r
-               <AppenderRef ref="hibernateLog" />\r
-       </Logger>\r
+               <Logger name="org.hibernate" level="error" additivity="false">\r
+                       <appender-ref ref="console" />\r
+                       <AppenderRef ref="hibernateLog" />\r
+               </Logger>\r
 \r
-       <Root level="DEBUG" additivity="false" />\r
-    </Loggers>\r
-</Configuration>\r
+               <Root level="DEBUG" additivity="false" />\r
+       </Loggers>\r
+</Configuration>
index 5f36066..9634210 100644 (file)
@@ -1,6 +1,6 @@
 CREATE TABLE IF NOT EXISTS config_file_content \r
-  (\r
-  macid varchar(255) not null,\r
-  file_content mediumtext not null,\r
-  primary key(macid)\r
+       (\r
+       macid varchar(255) not null,\r
+       file_content mediumtext not null,\r
+       primary key(macid)\r
 );
\ No newline at end of file
index 5f1673c..a4495a7 100644 (file)
 <?xml version="1.0" encoding="UTF-8"?>
 <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
-    <xs:element name="configDataFile">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="fileHeader">
-                               <xs:complexType>
-                                       <xs:attribute name="fileFormatVersion" type="xs:string" use="required"/>
-                                       <xs:attribute name="senderName" type="xs:string" use="optional"/>
-                                       <xs:attribute name="vendorName" type="xs:string" use="optional"/>
-                               </xs:complexType>
-                       </xs:element>
-                       <xs:element ref="configData" minOccurs="1" maxOccurs="1"/>
-                       <xs:element name="fileFooter">
-                               <xs:complexType>
-                                       <xs:attribute name="dateTime" type="xs:dateTime" use="required"/>
-                               </xs:complexType>
-                       </xs:element>
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>              
-
-    <xs:element name="configData">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element ref="managedElement" minOccurs="1" maxOccurs="1"/>
-                       <xs:element ref="Device" minOccurs="1" maxOccurs="1" />
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="managedElement">
-       <xs:complexType>
-               <xs:attribute name="OUI" type="xs:string" use="required"/>
-               <xs:attribute name="localDn" type="xs:string" use="required"/>
-               <xs:attribute name="ProductClass" type="xs:string" use="required"/>
-               <xs:attribute name="swVersion" type="xs:string" use="required"/>
-               <xs:attribute name="hwVersion" type="xs:string" use="optional"/>
-       </xs:complexType>
-
-    </xs:element>
-    <xs:element name="Device">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element ref="DeviceInfo" minOccurs="0"/>
-                       <xs:element ref="Ethernet" minOccurs="0"/>
-                       <xs:element ref="FAP" minOccurs="0"/>
-                       <xs:element ref="FaultMgmt" minOccurs="0"/>
-                       <xs:element ref="IP" minOccurs="0"/>
-                       <xs:element ref="IPsec" minOccurs="0"/>
-                       <xs:element ref="ManagementServer" minOccurs="0"/>
-                       <xs:element ref="NeighborDiscovery" minOccurs="0"/>
-                       <xs:element ref="PeriodicStatistics" minOccurs="0"/>
-                       <xs:element ref="QoS" minOccurs="0"/>
-                       <xs:element ref="Security" minOccurs="0"/>
-                       <xs:element ref="Services" minOccurs="0"/>
-                       <xs:element ref="Time" minOccurs="0"/>
-                       <xs:element ref="UserInterface" minOccurs="0"/>
-                       <xs:element ref="X_0005B9_FHMgmt" minOccurs="0"/>
-                       <xs:element ref="X_0005B9_IPsec2" minOccurs="0"/>
-                       <xs:element ref="X_0005B9_IPsecCA" minOccurs="0"/>
-                       <xs:element ref="X_0005B9_License" minOccurs="0"/>
-                       <xs:element ref="X_0005B9_MIGRATION" minOccurs="0"/>
-                       <xs:element ref="X_0005B9_SoftwareManagement" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="DeviceInfo">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="X_0005B9_OperatorName" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="Ethernet">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element ref="Interface" minOccurs="0" maxOccurs="unbounded"/>
-                       <xs:element ref="Link" minOccurs="0" maxOccurs="unbounded"/>
-                       <xs:element ref="VLANTermination" minOccurs="0" maxOccurs="unbounded"/>
-
-               </xs:sequence>
-       </xs:complexType>
-
-       <xs:unique name="uniqueId-Interface">
-               <xs:selector xpath="Interface" />
-               <xs:field xpath="@index" />
-       </xs:unique>
-       <xs:unique name="uniqueId-Link">
-               <xs:selector xpath="Link" />
-               <xs:field xpath="@index" />
-       </xs:unique>
-       <xs:unique name="uniqueId-VLANTermination">
-               <xs:selector xpath="VLANTermination" />
-               <xs:field xpath="@index" />
-       </xs:unique>
-    </xs:element>
-    <xs:element name="Interface">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="Alias" type="xs:string" minOccurs="0"/>
-                       <xs:element name="DuplexMode" type="xs:string" minOccurs="0"/>
-                       <xs:element name="Enable" type="xs:string" minOccurs="0"/>
-                       <xs:element name="LowerLayers" type="xs:string" minOccurs="0"/>
-                       <xs:element name="MaxBitRate" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-               <xs:attribute name="index" type="dmsIndex" use="required"/>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="Link">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="Alias" type="xs:string" minOccurs="0"/>
-                       <xs:element name="Enable" type="xs:string" minOccurs="0"/>
-                       <xs:element name="LowerLayers" type="xs:string" minOccurs="0"/>
-                       <xs:element name="PriorityTagging" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-               <xs:attribute name="index" type="dmsIndex" use="required"/>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="VLANTermination">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="Alias" type="xs:string" minOccurs="0"/>
-                       <xs:element name="Enable" type="xs:string" minOccurs="0"/>
-                       <xs:element name="LowerLayers" type="xs:string" minOccurs="0"/>
-                       <xs:element name="VLANID" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-               <xs:attribute name="index" type="dmsIndex" use="required"/>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="FAP">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element ref="GPS" minOccurs="0"/>
-                       <xs:element ref="PerfMgmt" minOccurs="0"/>
-                       <xs:element name="X_0005B9_DasRttDelay" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_EnableDasMode" type="xs:string" minOccurs="0"/>
-                       <xs:element ref="X_0005B9_FileTransfer" minOccurs="0"/>
-                       <xs:element ref="X_0005B9_FileTransfersEnh" minOccurs="0" maxOccurs="unbounded"/>
-                       <xs:element ref="X_0005B9_LogLevelConfiguration" minOccurs="0"/>
-                       <xs:element ref="X_0005B9_Logging" minOccurs="0"/>
-                       <xs:element name="X_0005B9_PlatformManagementEnable" type="xs:string" minOccurs="0"/>
-                       <xs:element ref="X_0005B9_RPLogManagement" minOccurs="0"/>
-                       <xs:element ref="X_0005B9_RU" minOccurs="0" maxOccurs="unbounded"/>
-                       <xs:element name="X_0005B9_RUBlacklisted" type="xs:string" minOccurs="0"/>
-                       <xs:element ref="X_0005B9_RUSoftwareManagement" minOccurs="0"/>
-                       <xs:element name="X_0005B9_RUWhiteList" type="xs:string" minOccurs="0"/>
-                       <xs:element ref="X_0005B9_SlotReservation" minOccurs="0" maxOccurs="unbounded"/>
-                       <xs:element ref="X_0005B9_Trace" minOccurs="0" maxOccurs="unbounded"/>
-                       <xs:element ref="X_0005B9_TraceFileTransfer" minOccurs="0"/>
-                       <xs:element ref="X_0005B9_UserManagement" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-
-       <xs:unique name="uniqueId-X_0005B9_FileTransfersEnh">
-               <xs:selector xpath="X_0005B9_FileTransfersEnh" />
-               <xs:field xpath="@index" />
-       </xs:unique>
-       <xs:unique name="uniqueId-X_0005B9_RU">
-               <xs:selector xpath="X_0005B9_RU" />
-               <xs:field xpath="@index" />
-       </xs:unique>
-       <xs:unique name="uniqueId-X_0005B9_SlotReservation">
-               <xs:selector xpath="X_0005B9_SlotReservation" />
-               <xs:field xpath="@index" />
-       </xs:unique>
-       <xs:unique name="uniqueId-X_0005B9_Trace">
-               <xs:selector xpath="X_0005B9_Trace" />
-               <xs:field xpath="@index" />
-       </xs:unique>
-    </xs:element>
-    <xs:element name="GPS">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element ref="AGPSServerConfig" minOccurs="0"/>
-                       <xs:element name="ContinuousGPS" type="xs:string" minOccurs="0"/>
-                       <xs:element ref="ContinuousGPSStatus" minOccurs="0"/>
-                       <xs:element name="GPSReset" type="xs:string" minOccurs="0"/>
-                       <xs:element name="PeriodicInterval" type="xs:string" minOccurs="0"/>
-                       <xs:element name="PeriodicTime" type="xs:string" minOccurs="0"/>
-                       <xs:element name="ScanOnBoot" type="xs:string" minOccurs="0"/>
-                       <xs:element name="ScanPeriodically" type="xs:string" minOccurs="0"/>
-                       <xs:element name="ScanTimeout" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_HoldoverTimeOutDuration" type="xs:string" minOccurs="0"/>
-                       <xs:element ref="X_0005B9_NominalGPS" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="AGPSServerConfig">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="Enable" type="xs:string" minOccurs="0"/>
-                       <xs:element name="Password" type="xs:string" minOccurs="0"/>
-                       <xs:element name="ReferenceLatitude" type="xs:string" minOccurs="0"/>
-                       <xs:element name="ReferenceLongitude" type="xs:string" minOccurs="0"/>
-                       <xs:element name="ServerPort" type="xs:string" minOccurs="0"/>
-                       <xs:element name="ServerURL" type="xs:string" minOccurs="0"/>
-                       <xs:element name="Username" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_aGPSRetryPeriodMax" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="ContinuousGPSStatus">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="FirstFixTimeout" type="xs:string" minOccurs="0"/>
-                       <xs:element name="LockTimeOutDuration" type="xs:string" minOccurs="0"/>
-                       <xs:element name="SatelliteTrackingInterval" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="X_0005B9_NominalGPS">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="Altitude" type="xs:string" minOccurs="0"/>
-                       <xs:element name="Confidence" type="xs:string" minOccurs="0"/>
-                       <xs:element name="DegreesOfLatitude" type="xs:string" minOccurs="0"/>
-                       <xs:element name="DegreesOfLongitude" type="xs:string" minOccurs="0"/>
-                       <xs:element name="DirectionOfAltitude" type="xs:string" minOccurs="0"/>
-                       <xs:element name="LatitudeSign" type="xs:string" minOccurs="0"/>
-                       <xs:element name="OrientationOfMajorAxis" type="xs:string" minOccurs="0"/>
-                       <xs:element name="UncertaintyAltitude" type="xs:string" minOccurs="0"/>
-                       <xs:element name="UncertaintySemiMajor" type="xs:string" minOccurs="0"/>
-                       <xs:element name="UncertaintySemiMinor" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="PerfMgmt">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element ref="Config" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="Config">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="X_0005B9_FileType" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_XMLFormat" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="X_0005B9_FileTransfer">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element ref="FileDetails" minOccurs="0" maxOccurs="unbounded"/>
-                       <xs:element name="HistOMFileWithDebugLog" type="xs:string" minOccurs="0"/>
-                       <xs:element name="Password" type="xs:string" minOccurs="0"/>
-                       <xs:element name="RPOMFileWithDebugLog" type="xs:string" minOccurs="0"/>
-                       <xs:element name="ServerURL" type="xs:string" minOccurs="0"/>
-                       <xs:element name="Username" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-
-       <xs:unique name="uniqueId-FileDetails">
-               <xs:selector xpath="FileDetails" />
-               <xs:field xpath="@index" />
-       </xs:unique>
-    </xs:element>
-    <xs:element name="FileDetails">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="Alias" type="xs:string" minOccurs="0"/>
-                       <xs:element name="Enable" type="xs:string" minOccurs="0"/>
-                       <xs:element name="FileName" type="xs:string" minOccurs="0"/>
-                       <xs:element name="IncludeRadioPointLog" type="xs:string" minOccurs="0"/>
-                       <xs:element name="LocationOnServer" type="xs:string" minOccurs="0"/>
-                       <xs:element name="TransferNow" type="xs:string" minOccurs="0"/>
-                       <xs:element name="TransferType" type="xs:string" minOccurs="0"/>
-                       <xs:element name="TransferWindowDuration" type="xs:string" minOccurs="0"/>
-                       <xs:element name="TransferWindowInterval" type="xs:string" minOccurs="0"/>
-                       <xs:element name="TransferWindowStartTime" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-               <xs:attribute name="index" type="dmsIndex" use="required"/>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="X_0005B9_FileTransfersEnh">
-       <xs:complexType>
-               <xs:sequence>
-    <xs:element name="FileDetails" minOccurs="0" maxOccurs="unbounded">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="Alias" type="xs:string" minOccurs="0"/>
-                       <xs:element name="Enable" type="xs:string" minOccurs="0"/>
-                       <xs:element name="FileCompressionEnable" type="xs:string" minOccurs="0"/>
-                       <xs:element name="FileCompressionType" type="xs:string" minOccurs="0"/>
-                       <xs:element name="FileName" type="xs:string" minOccurs="0"/>
-                       <xs:element name="IncludeRadioPointLog" type="xs:string" minOccurs="0"/>
-                       <xs:element name="LocationOnServer" type="xs:string" minOccurs="0"/>
-                       <xs:element name="TransferNow" type="xs:string" minOccurs="0"/>
-                       <xs:element name="TransferType" type="xs:string" minOccurs="0"/>
-                       <xs:element name="TransferWindowDuration" type="xs:string" minOccurs="0"/>
-                       <xs:element name="TransferWindowInterval" type="xs:string" minOccurs="0"/>
-                       <xs:element name="TransferWindowStartTime" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-               <xs:attribute name="index" type="dmsIndex" use="required"/>
-               </xs:complexType>
-    </xs:element>
-                       <xs:element name="Password" type="xs:string" minOccurs="0"/>
-                       <xs:element name="ServerURL" type="xs:string" minOccurs="0"/>
-                       <xs:element name="Username" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-               <xs:attribute name="index" type="dmsIndex" use="required"/>
-       </xs:complexType>
-       <xs:unique name="uniqueId-FileDetails1">
-               <xs:selector xpath="FileDetails" />
-               <xs:field xpath="@index" />
-       </xs:unique>
-    </xs:element>
-    <xs:element name="X_0005B9_LogLevelConfiguration">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="CUAPP_CURURecvSendT" type="xs:string" minOccurs="0"/>
-                       <xs:element name="DIMClient" type="xs:string" minOccurs="0"/>
-                       <xs:element name="LTEAPP_FAPController" type="xs:string" minOccurs="0"/>
-                       <xs:element name="LTEAPP_FAPManagement" type="xs:string" minOccurs="0"/>
-                       <xs:element name="LTEAPP_L2L3MessagingInterface" type="xs:string" minOccurs="0"/>
-                       <xs:element name="LTEAPP_RRM" type="xs:string" minOccurs="0"/>
-                       <xs:element name="LTEAPP_RRMUEMGR" type="xs:string" minOccurs="0"/>
-                       <xs:element name="LTEAPP_RuMgr" type="xs:string" minOccurs="0"/>
-                       <xs:element name="LTEAPP_SON" type="xs:string" minOccurs="0"/>
-                       <xs:element name="LTEAPP_STACKController" type="xs:string" minOccurs="0"/>
-                       <xs:element name="RRC" type="xs:string" minOccurs="0"/>
-                       <xs:element name="RUAPP_RUDiscoveryConfigClient" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="X_0005B9_Logging">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element ref="SyslogNg" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="SyslogNg">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="EventTypes" type="xs:string" minOccurs="0"/>
-                       <xs:element name="MonitoredInterface" type="xs:string" minOccurs="0"/>
-                       <xs:element name="Port" type="xs:string" minOccurs="0"/>
-                       <xs:element name="Server" type="xs:string" minOccurs="0"/>
-                       <xs:element name="UseIPSecTunnel" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="X_0005B9_RPLogManagement">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="IncludePlatformLog" type="xs:string" minOccurs="0"/>
-                       <xs:element name="TransferLogsToController" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="X_0005B9_RU">
-       <xs:complexType>
-               <xs:sequence>
-    <xs:element name="Device" minOccurs="0">
-       <xs:complexType>
-               <xs:sequence>
-    <xs:element name="DeviceInfo" minOccurs="0">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="Alias" type="xs:string" minOccurs="0"/>
-                       <xs:element name="DeviceType" type="xs:string" minOccurs="0"/>
-                       <xs:element name="InstallationType" type="xs:string" minOccurs="0"/>
-                       <xs:element ref="Location" minOccurs="0"/>
-                       <xs:element ref="NGRP" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-                       <xs:element ref="PHY" minOccurs="0"/>
-                       <xs:element ref="RAN" minOccurs="0"/>
-                       <xs:element ref="SlotReservation" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-                       <xs:element name="RUIndex" type="xs:string" minOccurs="0"/>
-                       <xs:element name="Reboot" type="xs:string" minOccurs="0"/>
-                       <xs:element name="Reset" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-               <xs:attribute name="index" type="dmsIndex" use="required"/>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="Location">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="Altitude" type="xs:string" minOccurs="0"/>
-                       <xs:element name="Confidence" type="xs:string" minOccurs="0"/>
-                       <xs:element name="DataObject" type="xs:string" minOccurs="0"/>
-                       <xs:element name="DegreesOfLatitude" type="xs:string" minOccurs="0"/>
-                       <xs:element name="DegreesOfLongitude" type="xs:string" minOccurs="0"/>
-                       <xs:element name="DirectionOfAltitude" type="xs:string" minOccurs="0"/>
-                       <xs:element name="LatitudeSign" type="xs:string" minOccurs="0"/>
-                       <xs:element name="OrientationOfMajorAxis" type="xs:string" minOccurs="0"/>
-                       <xs:element name="UncertaintyAltitude" type="xs:string" minOccurs="0"/>
-                       <xs:element name="UncertaintySemiMajor" type="xs:string" minOccurs="0"/>
-                       <xs:element name="UncertaintySemiMinor" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="NGRP">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="REBOOT" type="xs:string" minOccurs="0"/>
-                       <xs:element name="RESET" type="xs:string" minOccurs="0"/>
-                       <xs:element name="TimingSource" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="PHY">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element ref="AntennaInfo" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="AntennaInfo">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="AntennaType" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="RAN">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element ref="RF" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="RF">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="RfTxPower" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="SlotReservation">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="AntennaPortNumber" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="X_0005B9_RUSoftwareManagement">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="ApplyImage" type="xs:string" minOccurs="0"/>
-                       <xs:element name="EnableNGRPUpgrade" type="xs:string" minOccurs="0"/>
-                       <xs:element name="FileTransferProtocol" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="X_0005B9_SlotReservation">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="AntennaPortNumber" type="xs:string" minOccurs="0"/>
-                       <xs:element name="PARTNUMBER" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-               <xs:attribute name="index" type="dmsIndex" use="required"/>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="X_0005B9_Trace">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="UeSpecificTraceEnable" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-               <xs:attribute name="index" type="dmsIndex" use="required"/>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="X_0005B9_TraceFileTransfer">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="FileUploadPeriodicity" type="xs:string" minOccurs="0"/>
-                       <xs:element name="LocationOnServer" type="xs:string" minOccurs="0"/>
-                       <xs:element name="Password" type="xs:string" minOccurs="0"/>
-                       <xs:element name="ServerPort" type="xs:string" minOccurs="0"/>
-                       <xs:element name="Username" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="X_0005B9_UserManagement">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="ExternalAuthAccess" type="xs:string" minOccurs="0"/>
-                       <xs:element ref="LDAP" minOccurs="0"/>
-                       <xs:element ref="RADIUS" minOccurs="0"/>
-                       <xs:element ref="UserAccount" minOccurs="0" maxOccurs="unbounded"/>
-
-               </xs:sequence>
-       </xs:complexType>
-
-       <xs:unique name="uniqueId-UserAccount">
-               <xs:selector xpath="UserAccount" />
-               <xs:field xpath="@index" />
-       </xs:unique>
-    </xs:element>
-    <xs:element name="LDAP">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="AdminDN" type="xs:string" minOccurs="0"/>
-                       <xs:element name="AdminPassword" type="xs:string" minOccurs="0"/>
-                       <xs:element name="BaseDN" type="xs:string" minOccurs="0"/>
-                       <xs:element name="ConnectionTimeout" type="xs:string" minOccurs="0"/>
-                       <xs:element name="Filter" type="xs:string" minOccurs="0"/>
-                       <xs:element name="Port" type="xs:string" minOccurs="0"/>
-                       <xs:element name="RetryCount" type="xs:string" minOccurs="0"/>
-                       <xs:element name="SASL" type="xs:string" minOccurs="0"/>
-                       <xs:element name="ServerIPAddress" type="xs:string" minOccurs="0"/>
-                       <xs:element name="ServerName" type="xs:string" minOccurs="0"/>
-                       <xs:element name="TLSCertificate" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="RADIUS">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="ConnectionTimeout" type="xs:string" minOccurs="0"/>
-                       <xs:element name="NASIPAddress" type="xs:string" minOccurs="0"/>
-                       <xs:element name="NASIdentifier" type="xs:string" minOccurs="0"/>
-                       <xs:element name="Port" type="xs:string" minOccurs="0"/>
-                       <xs:element name="RetryCount" type="xs:string" minOccurs="0"/>
-                       <xs:element name="ServerIPAddress" type="xs:string" minOccurs="0"/>
-                       <xs:element name="SharedSecretKey" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="UserAccount">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="Alias" type="xs:string" minOccurs="0"/>
-                       <xs:element name="Password" type="xs:string" minOccurs="0"/>
-                       <xs:element name="Privileges" type="xs:string" minOccurs="0"/>
-                       <xs:element name="ResetPassword" type="xs:string" minOccurs="0"/>
-                       <xs:element name="Status" type="xs:string" minOccurs="0"/>
-                       <xs:element name="UserName" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-               <xs:attribute name="index" type="dmsIndex" use="required"/>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="FaultMgmt">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element ref="CurrentAlarm" minOccurs="0" maxOccurs="unbounded"/>
-                       <xs:element ref="ExpeditedEvent" minOccurs="0" maxOccurs="unbounded"/>
-                       <xs:element ref="HistoryEvent" minOccurs="0" maxOccurs="unbounded"/>
-                       <xs:element ref="SupportedAlarm" minOccurs="0" maxOccurs="unbounded"/>
-                       <xs:element name="X_0005B9_SendTestAlarm" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-
-       <xs:unique name="uniqueId-CurrentAlarm">
-               <xs:selector xpath="CurrentAlarm" />
-               <xs:field xpath="@index" />
-       </xs:unique>
-       <xs:unique name="uniqueId-ExpeditedEvent">
-               <xs:selector xpath="ExpeditedEvent" />
-               <xs:field xpath="@index" />
-       </xs:unique>
-       <xs:unique name="uniqueId-HistoryEvent">
-               <xs:selector xpath="HistoryEvent" />
-               <xs:field xpath="@index" />
-       </xs:unique>
-       <xs:unique name="uniqueId-SupportedAlarm">
-               <xs:selector xpath="SupportedAlarm" />
-               <xs:field xpath="@index" />
-       </xs:unique>
-    </xs:element>
-    <xs:element name="CurrentAlarm">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="CurrentAlarmIndex" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-               <xs:attribute name="index" type="dmsIndex" use="required"/>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="ExpeditedEvent">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="ExpediteAlarmIndex" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-               <xs:attribute name="index" type="dmsIndex" use="required"/>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="HistoryEvent">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="HistoryAlarmIndex" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-               <xs:attribute name="index" type="dmsIndex" use="required"/>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="SupportedAlarm">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="ReportingMechanism" type="xs:string" minOccurs="0"/>
-                       <xs:element name="SupportedAlarmIndex" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-               <xs:attribute name="index" type="dmsIndex" use="required"/>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="IP">
-       <xs:complexType>
-               <xs:sequence>
-    <xs:element name="Interface" minOccurs="0" maxOccurs="unbounded">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="Alias" type="xs:string" minOccurs="0"/>
-                       <xs:element name="AutoIPEnable" type="xs:string" minOccurs="0"/>
-                       <xs:element name="Enable" type="xs:string" minOccurs="0"/>
-                       <xs:element ref="IPv4Address" minOccurs="0" maxOccurs="unbounded"/>
-                       <xs:element name="IPv4Enable" type="xs:string" minOccurs="0"/>
-                       <xs:element ref="IPv6Address" minOccurs="0" maxOccurs="unbounded"/>
-                       <xs:element name="IPv6Enable" type="xs:string" minOccurs="0"/>
-                       <xs:element ref="IPv6Prefix" minOccurs="0" maxOccurs="unbounded"/>
-                       <xs:element name="Loopback" type="xs:string" minOccurs="0"/>
-                       <xs:element name="MaxMTUSize" type="xs:string" minOccurs="0"/>
-                       <xs:element name="Reset" type="xs:string" minOccurs="0"/>
-                       <xs:element name="Router" type="xs:string" minOccurs="0"/>
-                       <xs:element name="ULAEnable" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-               <xs:attribute name="index" type="dmsIndex" use="required"/>
-               </xs:complexType>
-    </xs:element>
-
-               </xs:sequence>
-       </xs:complexType>
-
-       <xs:unique name="uniqueId-Interface1">
-               <xs:selector xpath="Interface" />
-               <xs:field xpath="@index" />
-       </xs:unique>
-       <xs:unique name="uniqueId-IPv4Address">
-               <xs:selector xpath="IPv4Address" />
-               <xs:field xpath="@index" />
-       </xs:unique>
-       <xs:unique name="uniqueId-IPv6Address">
-               <xs:selector xpath="IPv6Address" />
-               <xs:field xpath="@index" />
-       </xs:unique>
-       <xs:unique name="uniqueId-IPv6Prefix">
-               <xs:selector xpath="IPv6Prefix" />
-               <xs:field xpath="@index" />
-       </xs:unique>
-    </xs:element>
-    <xs:element name="IPv4Address">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="AddressingType" type="xs:string" minOccurs="0"/>
-                       <xs:element name="Alias" type="xs:string" minOccurs="0"/>
-                       <xs:element name="Enable" type="xs:string" minOccurs="0"/>
-                       <xs:element name="IPAddress" type="xs:string" minOccurs="0"/>
-                       <xs:element name="SubnetMask" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_DNS" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-               <xs:attribute name="index" type="dmsIndex" use="required"/>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="IPv6Address">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="Alias" type="xs:string" minOccurs="0"/>
-                       <xs:element name="Anycast" type="xs:string" minOccurs="0"/>
-                       <xs:element name="Enable" type="xs:string" minOccurs="0"/>
-                       <xs:element name="IPAddress" type="xs:string" minOccurs="0"/>
-                       <xs:element name="Origin" type="xs:string" minOccurs="0"/>
-                       <xs:element name="PreferredLifetime" type="xs:string" minOccurs="0"/>
-                       <xs:element name="Prefix" type="xs:string" minOccurs="0"/>
-                       <xs:element name="ValidLifetime" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_DNS" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_Prefix" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-               <xs:attribute name="index" type="dmsIndex" use="required"/>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="IPv6Prefix">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="Alias" type="xs:string" minOccurs="0"/>
-                       <xs:element name="ChildPrefixBits" type="xs:string" minOccurs="0"/>
-                       <xs:element name="Origin" type="xs:string" minOccurs="0"/>
-                       <xs:element name="ParentPrefix" type="xs:string" minOccurs="0"/>
-                       <xs:element name="PreferredLifetime" type="xs:string" minOccurs="0"/>
-                       <xs:element name="Prefix" type="xs:string" minOccurs="0"/>
-                       <xs:element name="StaticType" type="xs:string" minOccurs="0"/>
-                       <xs:element name="ValidLifetime" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-               <xs:attribute name="index" type="dmsIndex" use="required"/>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="IPsec">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="Enable" type="xs:string" minOccurs="0"/>
-                       <xs:element ref="Filter" minOccurs="0" maxOccurs="unbounded"/>
-                       <xs:element ref="IKEv2SA" minOccurs="0" maxOccurs="unbounded"/>
-                       <xs:element ref="LogLevel" minOccurs="0"/>
-                       <xs:element ref="Profile" minOccurs="0" maxOccurs="unbounded"/>
-                       <xs:element ref="Tunnel" minOccurs="0" maxOccurs="unbounded"/>
-                       <xs:element name="X_0005B9_ExcludeCP" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_IgnoreBasicConstraint" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-
-       <xs:unique name="uniqueId-Filter">
-               <xs:selector xpath="Filter" />
-               <xs:field xpath="@index" />
-       </xs:unique>
-       <xs:unique name="uniqueId-IKEv2SA">
-               <xs:selector xpath="IKEv2SA" />
-               <xs:field xpath="@index" />
-       </xs:unique>
-       <xs:unique name="uniqueId-Profile">
-               <xs:selector xpath="Profile" />
-               <xs:field xpath="@index" />
-       </xs:unique>
-       <xs:unique name="uniqueId-Tunnel">
-               <xs:selector xpath="Tunnel" />
-               <xs:field xpath="@index" />
-       </xs:unique>
-    </xs:element>
-    <xs:element name="Filter">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="Alias" type="xs:string" minOccurs="0"/>
-                       <xs:element name="AllInterfaces" type="xs:string" minOccurs="0"/>
-                       <xs:element name="Interface" type="xs:string" minOccurs="0"/>
-                       <xs:element name="Order" type="xs:string" minOccurs="0"/>
-                       <xs:element name="Profile" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-               <xs:attribute name="index" type="dmsIndex" use="required"/>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="IKEv2SA">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="Alias" type="xs:string" minOccurs="0"/>
-                       <xs:element ref="ChildSA" minOccurs="0" maxOccurs="unbounded"/>
-
-               </xs:sequence>
-               <xs:attribute name="index" type="dmsIndex" use="required"/>
-       </xs:complexType>
-       <xs:unique name="uniqueId-ChildSA">
-               <xs:selector xpath="ChildSA" />
-               <xs:field xpath="@index" />
-       </xs:unique>
-    </xs:element>
-    <xs:element name="ChildSA">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="Alias" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-               <xs:attribute name="index" type="dmsIndex" use="required"/>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="LogLevel">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="X_0005B9_cfg" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_chd" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_dmn" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_enc" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_ike" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_knl" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_lib" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_mgr" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_net" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="Profile">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="AHAllowedIntegrityAlgorithms" type="xs:string" minOccurs="0"/>
-                       <xs:element name="Alias" type="xs:string" minOccurs="0"/>
-                       <xs:element name="AntiReplayWindowSize" type="xs:string" minOccurs="0"/>
-                       <xs:element name="ChildSATimeLimit" type="xs:string" minOccurs="0"/>
-                       <xs:element name="ChildSATrafficLimit" type="xs:string" minOccurs="0"/>
-                       <xs:element name="DSCPMarkPolicy" type="xs:string" minOccurs="0"/>
-                       <xs:element name="DoNotFragment" type="xs:string" minOccurs="0"/>
-                       <xs:element name="ESPAllowedEncryptionAlgorithms" type="xs:string" minOccurs="0"/>
-                       <xs:element name="ESPAllowedIntegrityAlgorithms" type="xs:string" minOccurs="0"/>
-                       <xs:element name="IKEv2AllowedDiffieHellmanGroupTransforms" type="xs:string" minOccurs="0"/>
-                       <xs:element name="IKEv2AllowedEncryptionAlgorithms" type="xs:string" minOccurs="0"/>
-                       <xs:element name="IKEv2AllowedIntegrityAlgorithms" type="xs:string" minOccurs="0"/>
-                       <xs:element name="IKEv2AllowedPseudoRandomFunctions" type="xs:string" minOccurs="0"/>
-                       <xs:element name="IKEv2AuthenticationMethod" type="xs:string" minOccurs="0"/>
-                       <xs:element name="IKEv2DeadPeerDetectionTimeout" type="xs:string" minOccurs="0"/>
-                       <xs:element name="IKEv2NATTKeepaliveTimeout" type="xs:string" minOccurs="0"/>
-                       <xs:element name="IKEv2SATimeLimit" type="xs:string" minOccurs="0"/>
-                       <xs:element name="MaxChildSAs" type="xs:string" minOccurs="0"/>
-                       <xs:element name="Protocol" type="xs:string" minOccurs="0"/>
-                       <xs:element name="RemoteEndpoints" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_IKEv2RekeyMargin" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_IPsec_IKERetryCount" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_IPsec_IKERetryTimeOut" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_IPsec_IKETunnelBounce" type="xs:string" minOccurs="0"/>
-                       <xs:element name="gtpFragmentation" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-               <xs:attribute name="index" type="dmsIndex" use="required"/>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="Tunnel">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="Alias" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-               <xs:attribute name="index" type="dmsIndex" use="required"/>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="ManagementServer">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="ConnectionRequestPassword" type="xs:string" minOccurs="0"/>
-                       <xs:element name="ConnectionRequestUsername" type="xs:string" minOccurs="0"/>
-                       <xs:element name="Password" type="xs:string" minOccurs="0"/>
-                       <xs:element name="PeriodicInformEnable" type="xs:string" minOccurs="0"/>
-                       <xs:element name="PeriodicInformInterval" type="xs:string" minOccurs="0"/>
-                       <xs:element name="PeriodicInformTime" type="xs:string" minOccurs="0"/>
-                       <xs:element name="URL" type="xs:string" minOccurs="0"/>
-                       <xs:element name="UpgradesManaged" type="xs:string" minOccurs="0"/>
-                       <xs:element name="Username" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="NeighborDiscovery">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="Enable" type="xs:string" minOccurs="0"/>
-                       <xs:element ref="InterfaceSetting" minOccurs="0" maxOccurs="unbounded"/>
-
-               </xs:sequence>
-       </xs:complexType>
-
-       <xs:unique name="uniqueId-InterfaceSetting">
-               <xs:selector xpath="InterfaceSetting" />
-               <xs:field xpath="@index" />
-       </xs:unique>
-    </xs:element>
-    <xs:element name="InterfaceSetting">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="Alias" type="xs:string" minOccurs="0"/>
-                       <xs:element name="Enable" type="xs:string" minOccurs="0"/>
-                       <xs:element name="Interface" type="xs:string" minOccurs="0"/>
-                       <xs:element name="MaxRtrSolicitations" type="xs:string" minOccurs="0"/>
-                       <xs:element name="NUDEnable" type="xs:string" minOccurs="0"/>
-                       <xs:element name="RSEnable" type="xs:string" minOccurs="0"/>
-                       <xs:element name="RetransTimer" type="xs:string" minOccurs="0"/>
-                       <xs:element name="RtrSolicitationInterval" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-               <xs:attribute name="index" type="dmsIndex" use="required"/>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="PeriodicStatistics">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element ref="SampleSet" minOccurs="0" maxOccurs="unbounded"/>
-
-               </xs:sequence>
-       </xs:complexType>
-
-       <xs:unique name="uniqueId-SampleSet">
-               <xs:selector xpath="SampleSet" />
-               <xs:field xpath="@index" />
-       </xs:unique>
-    </xs:element>
-    <xs:element name="SampleSet">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="SampleInterval" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-               <xs:attribute name="index" type="dmsIndex" use="required"/>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="QoS">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element ref="Classification" minOccurs="0" maxOccurs="unbounded"/>
-
-               </xs:sequence>
-       </xs:complexType>
-
-       <xs:unique name="uniqueId-Classification">
-               <xs:selector xpath="Classification" />
-               <xs:field xpath="@index" />
-       </xs:unique>
-    </xs:element>
-    <xs:element name="Classification">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="DSCPMark" type="xs:string" minOccurs="0"/>
-                       <xs:element name="Protocol" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-               <xs:attribute name="index" type="dmsIndex" use="required"/>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="Security">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element ref="Certificate" minOccurs="0" maxOccurs="unbounded"/>
-                       <xs:element ref="X_0005B9_CMPv2" minOccurs="0"/>
-                       <xs:element ref="X_0005B9_WebGUI" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-
-       <xs:unique name="uniqueId-Certificate">
-               <xs:selector xpath="Certificate" />
-               <xs:field xpath="@index" />
-       </xs:unique>
-    </xs:element>
-    <xs:element name="Certificate">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="CertIndex" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-               <xs:attribute name="index" type="dmsIndex" use="required"/>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="X_0005B9_CMPv2">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="CAServer" type="xs:string" minOccurs="0"/>
-                       <xs:element name="Port" type="xs:string" minOccurs="0"/>
-                       <xs:element name="RenewBefore" type="xs:string" minOccurs="0"/>
-                       <xs:element name="SecGWServer" type="xs:string" minOccurs="0"/>
-                       <xs:element name="URI" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="X_0005B9_WebGUI">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="ResetAdminUserPassword" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="Services">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element ref="FAPService" minOccurs="0" maxOccurs="2"/>
-                       <xs:element ref="VoiceService" minOccurs="0" maxOccurs="2"/>
-                       <xs:element name="X_0005B9_FNEnable" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_MOCNEnable" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_nRrc4CatM1" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_numSectorsPerBC" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="FAPService">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element ref="AccessMgmt" minOccurs="0"/>
-                       <xs:element ref="Capabilities" minOccurs="0"/>
-                       <xs:element ref="CellConfig" minOccurs="0"/>
-                       <xs:element ref="FAPControl" minOccurs="0"/>
-                       <xs:element ref="REM" minOccurs="0"/>
-                       <xs:element ref="Transport" minOccurs="0"/>
-                       <xs:element ref="X_0005B9_AutoConfig" minOccurs="0"/>
-                       <xs:element ref="X_0005B9_AutoTxPower" minOccurs="0"/>
-                       <xs:element ref="X_0005B9_ExpressREM" minOccurs="0"/>
-                       <xs:element ref="X_0005B9_LTE" minOccurs="0"/>
-
-               </xs:sequence>
-               <xs:attribute name="index" type="dmsIndex" use="required"/>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="AccessMgmt">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element ref="LTE" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="LTE">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="AccessMode" type="xs:string" minOccurs="0"/>
-                       <xs:element name="CSGID" type="xs:string" minOccurs="0"/>
-                       <xs:element name="HNBName" type="xs:string" minOccurs="0"/>
-                       <xs:element name="MaxCSGMembers" type="xs:string" minOccurs="0"/>
-                       <xs:element name="MaxNonCSGMembers" type="xs:string" minOccurs="0"/>
-                       <xs:element name="MaxResourceNonCSGMembers" type="xs:string" minOccurs="0"/>
-                       <xs:element name="MaxUEsServed" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="Capabilities">
-       <xs:complexType>
-               <xs:sequence>
-    <xs:element name="LTE" minOccurs="0">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="X_0005B9_MaxNumX2" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="CellConfig">
-       <xs:complexType>
-               <xs:sequence>
-    <xs:element name="LTE" minOccurs="0">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element ref="EPC" minOccurs="0"/>
-    <xs:element name="RAN" minOccurs="0">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element ref="CellRestriction" minOccurs="0"/>
-                       <xs:element ref="Common" minOccurs="0"/>
-                       <xs:element ref="MAC" minOccurs="0"/>
-                       <xs:element ref="Mobility" minOccurs="0"/>
-                       <xs:element ref="NeighborList" minOccurs="0"/>
-                       <xs:element ref="NeighborListInUse" minOccurs="0"/>
-    <xs:element name="PHY" minOccurs="0">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element ref="PDSCH" minOccurs="0"/>
-                       <xs:element ref="PRACH" minOccurs="0"/>
-                       <xs:element ref="PUCCH" minOccurs="0"/>
-                       <xs:element ref="PUSCH" minOccurs="0"/>
-                       <xs:element ref="SRS" minOccurs="0"/>
-                       <xs:element ref="ULPowerControl" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="RF" minOccurs="0">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="DLBandwidth" type="xs:string" minOccurs="0"/>
-                       <xs:element name="EARFCNDL" type="xs:string" minOccurs="0"/>
-                       <xs:element name="EARFCNUL" type="xs:string" minOccurs="0"/>
-                       <xs:element name="FreqBandIndicator" type="xs:string" minOccurs="0"/>
-                       <xs:element name="PBCHPowerOffset" type="xs:string" minOccurs="0"/>
-                       <xs:element name="PSCHPowerOffset" type="xs:string" minOccurs="0"/>
-                       <xs:element name="PhyCellID" type="xs:string" minOccurs="0"/>
-                       <xs:element name="ReferenceSignalPower" type="xs:string" minOccurs="0"/>
-                       <xs:element name="SSCHPowerOffset" type="xs:string" minOccurs="0"/>
-                       <xs:element name="ULBandwidth" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_Imargin" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_Imax" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_MaxTxPower" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-                       <xs:element ref="RLC" minOccurs="0"/>
-                       <xs:element ref="RRCTimers" minOccurs="0"/>
-                       <xs:element ref="S1AP" minOccurs="0"/>
-                       <xs:element ref="S1U" minOccurs="0"/>
-                       <xs:element ref="X_0005B9_X2AP_CE" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-                       <xs:element ref="X_0005B9_CE" minOccurs="0"/>
-                       <xs:element ref="X_0005B9_CarrierAggregation" minOccurs="0"/>
-                       <xs:element ref="X_0005B9_RrcConnection" minOccurs="0"/>
-                       <xs:element ref="X_0005B9_RrcConnectionRejection" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="EPC">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="AllowedCipheringAlgorithmList" type="xs:string" minOccurs="0"/>
-                       <xs:element name="AllowedIntegrityProtectionAlgorithmList" type="xs:string" minOccurs="0"/>
-                       <xs:element name="EAID" type="xs:string" minOccurs="0"/>
-                       <xs:element ref="PLMNList" minOccurs="0" maxOccurs="unbounded"/>
-    <xs:element name="QoS" minOccurs="0" maxOccurs="unbounded">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="Enable" type="xs:string" minOccurs="0"/>
-                       <xs:element name="PacketelayBudget" type="xs:string" minOccurs="0"/>
-                       <xs:element name="Priority" type="xs:string" minOccurs="0"/>
-                       <xs:element name="QCI" type="xs:string" minOccurs="0"/>
-                       <xs:element name="Type" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_DSCP" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_DeltaBundle" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_PacketLossRate" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_RLCMode" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_RTPBundle" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_SPSPeriodDL" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_SPSPeriodUL" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-               <xs:attribute name="index" type="dmsIndex" use="required"/>
-               </xs:complexType>
-    </xs:element>
-                       <xs:element name="TAC" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_MaxConcurrentCMASBroadcasts" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_PWSMode" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-
-       <xs:unique name="uniqueId-PLMNList">
-               <xs:selector xpath="PLMNList" />
-               <xs:field xpath="@index" />
-       </xs:unique>
-       <xs:unique name="uniqueId-QoS">
-               <xs:selector xpath="QoS" />
-               <xs:field xpath="@index" />
-       </xs:unique>
-    </xs:element>
-    <xs:element name="PLMNList">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="Alias" type="xs:string" minOccurs="0"/>
-                       <xs:element name="CellReservedForOperatorUse" type="xs:string" minOccurs="0"/>
-                       <xs:element name="Enable" type="xs:string" minOccurs="0"/>
-                       <xs:element name="IsPrimary" type="xs:string" minOccurs="0"/>
-                       <xs:element name="PLMNID" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_BarringForEmergency" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_BarringSkipForMMTELVideo" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_BarringSkipForMMTELVoice" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_BarringSkipForSMS" type="xs:string" minOccurs="0"/>
-                       <xs:element ref="X_0005B9_ImpendingOverload" minOccurs="0"/>
-                       <xs:element name="X_0005B9_MODataBarringFactor" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_MODataBarringForSpecialAC" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_MODataBarringTime" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_MOSigBarringFactor" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_MOSigBarringForSpecialAC" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_MOSigBarringTime" type="xs:string" minOccurs="0"/>
-                       <xs:element ref="X_0005B9_NormalLoad" minOccurs="0"/>
-                       <xs:element ref="X_0005B9_Overload" minOccurs="0"/>
-                       <xs:element name="X_0005B9_PLMNListIndex" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_Type" type="xs:string" minOccurs="0"/>
-                       <xs:element ref="X_0005B9_WarningLoadLvl" minOccurs="0"/>
-
-               </xs:sequence>
-               <xs:attribute name="index" type="dmsIndex" use="required"/>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="X_0005B9_ImpendingOverload">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="acBarringFactor" type="xs:string" minOccurs="0"/>
-                       <xs:element name="acBarringForSpecialAC" type="xs:string" minOccurs="0"/>
-                       <xs:element name="acBarringTime" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="X_0005B9_NormalLoad">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="acBarringFactor" type="xs:string" minOccurs="0"/>
-                       <xs:element name="acBarringForSpecialAC" type="xs:string" minOccurs="0"/>
-                       <xs:element name="acBarringTime" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="X_0005B9_Overload">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="acBarringFactor" type="xs:string" minOccurs="0"/>
-                       <xs:element name="acBarringForSpecialAC" type="xs:string" minOccurs="0"/>
-                       <xs:element name="acBarringTime" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="X_0005B9_WarningLoadLvl">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="acBarringFactor" type="xs:string" minOccurs="0"/>
-                       <xs:element name="acBarringForSpecialAC" type="xs:string" minOccurs="0"/>
-                       <xs:element name="acBarringTime" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="CellRestriction">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="BarringForEmergency" type="xs:string" minOccurs="0"/>
-                       <xs:element name="CellBarred" type="xs:string" minOccurs="0"/>
-                       <xs:element name="CellReservedForOperatorUse" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_AccBarStaticEnable" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_AutoACBEnable" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_BarringSkipForMMTELVideo" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_BarringSkipForMMTELVoice" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_BarringSkipForSMS" type="xs:string" minOccurs="0"/>
-    <xs:element name="X_0005B9_ImpendingOverload" minOccurs="0">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="ACBarringFactor" type="xs:string" minOccurs="0"/>
-                       <xs:element name="ACBarringForSpecialAC" type="xs:string" minOccurs="0"/>
-                       <xs:element name="ACBarringTime" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-                       <xs:element ref="X_0005B9_L3_ImpendingOverload" minOccurs="0"/>
-                       <xs:element ref="X_0005B9_L3_OK" minOccurs="0"/>
-                       <xs:element ref="X_0005B9_L3_Overload" minOccurs="0"/>
-                       <xs:element ref="X_0005B9_L3_Warning" minOccurs="0"/>
-                       <xs:element name="X_0005B9_MODataBarringFactor" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_MODataBarringForSpecialAC" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_MODataBarringTime" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_MOSigBarringFactor" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_MOSigBarringForSpecialAC" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_MOSigBarringTime" type="xs:string" minOccurs="0"/>
-    <xs:element name="X_0005B9_NormalLoad" minOccurs="0">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="ACBarringFactor" type="xs:string" minOccurs="0"/>
-                       <xs:element name="ACBarringForSpecialAC" type="xs:string" minOccurs="0"/>
-                       <xs:element name="ACBarringTime" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="X_0005B9_Overload" minOccurs="0">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="ACBarringFactor" type="xs:string" minOccurs="0"/>
-                       <xs:element name="ACBarringForSpecialAC" type="xs:string" minOccurs="0"/>
-                       <xs:element name="ACBarringTime" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="X_0005B9_WarningLoadLvl" minOccurs="0">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="ACBarringFactor" type="xs:string" minOccurs="0"/>
-                       <xs:element name="ACBarringForSpecialAC" type="xs:string" minOccurs="0"/>
-                       <xs:element name="ACBarringTime" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-                       <xs:element name="X_0005B9_cellLock" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_guardTimer" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="X_0005B9_L3_ImpendingOverload">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="MaxS1PagesPerRRCPage" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="X_0005B9_L3_OK">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="MaxS1PagesPerRRCPage" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="X_0005B9_L3_Overload">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="MaxS1PagesPerRRCPage" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="X_0005B9_L3_Warning">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="MaxS1PagesPerRRCPage" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="Common">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="CellIdentity" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_CellMode" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_CellName" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="MAC">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element ref="DRX" minOccurs="0"/>
-                       <xs:element ref="RACH" minOccurs="0"/>
-                       <xs:element ref="ULSCH" minOccurs="0"/>
-                       <xs:element name="X_0005B9_DlMssClampVal" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_DynDciCQIThreshDl" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_DynDciCQIThreshUl" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_GratUlDciTimer" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_GtpMtu" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_HighCQIAggLevelDl" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_HighCQIAggLevelUl" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_LowCQIAggLevelDl" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_LowCQIAggLevelUl" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_MacSuspendEnbRlfEnabled" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_MaxCcchMsgRetx" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_MaxDLUePerTTI" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_MaxGbrBearers" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_MaxGbrDLUePerTTI" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_MaxGbrDlBitsPerSec" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_MaxGbrULUePerTTI" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_MaxGbrUlBitsPerSec" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_MaxHarqReTxDl" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_MaxNumCzvRp" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_MaxULUePerTTI" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_MinCzvThreshold" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_MssClampEnabled" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_PriorityMetricMethod" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_PucchPrbReserved" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_QCI6MinDlBitsPerSec" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_QCI6MinUlBitsPerSec" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_ReuseInterferenceThreshold" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_SingleLayerCLSMEnabled" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_UlMssClampVal" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="DRX">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="DRXEnabled" type="xs:string" minOccurs="0"/>
-                       <xs:element name="DRXInactivityTimer" type="xs:string" minOccurs="0"/>
-                       <xs:element name="DRXRetransmissionTimer" type="xs:string" minOccurs="0"/>
-                       <xs:element name="DRXShortCycleTimer" type="xs:string" minOccurs="0"/>
-                       <xs:element name="DRXStartOffset" type="xs:string" minOccurs="0"/>
-                       <xs:element name="LongDRXCycle" type="xs:string" minOccurs="0"/>
-                       <xs:element name="OnDurationTimer" type="xs:string" minOccurs="0"/>
-                       <xs:element name="ShortDRXCycle" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_maxDrxUe" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="RACH">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="ContentionResolutionTimer" type="xs:string" minOccurs="0"/>
-                       <xs:element name="MaxHARQMsg3Tx" type="xs:string" minOccurs="0"/>
-                       <xs:element name="MessagePowerOffsetGroupB" type="xs:string" minOccurs="0"/>
-                       <xs:element name="MessageSizeGroupA" type="xs:string" minOccurs="0"/>
-                       <xs:element name="NumberOfRaPreambles" type="xs:string" minOccurs="0"/>
-                       <xs:element name="PowerRampingStep" type="xs:string" minOccurs="0"/>
-                       <xs:element name="PreambleInitialReceivedTargetPower" type="xs:string" minOccurs="0"/>
-                       <xs:element name="PreambleTransMax" type="xs:string" minOccurs="0"/>
-                       <xs:element name="ResponseWindowSize" type="xs:string" minOccurs="0"/>
-                       <xs:element name="SizeOfRaGroupA" type="xs:string" minOccurs="0"/>
-    <xs:element name="X_0005B9_CE" minOccurs="0">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="PreambleTransMax" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-                       <xs:element ref="X_0005B9_CE0" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="X_0005B9_CE0">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="ContentionResolutionTimer" type="xs:string" minOccurs="0"/>
-                       <xs:element name="ResponseWindowSize" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="ULSCH">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="X_0005B9_qci1MaxHARQ-Tx" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="Mobility">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element ref="ConnMode" minOccurs="0"/>
-                       <xs:element ref="IdleMode" minOccurs="0"/>
-                       <xs:element name="X_0005B9_csfbMeasWaitTime" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_csfbPrefRat" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_iRatPsRedirection" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="ConnMode">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element ref="EUTRA" minOccurs="0"/>
-                       <xs:element ref="IRAT" minOccurs="0"/>
-                       <xs:element name="X_0005B9_HOBlackListEnabled" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_InterFreqHandOffEnable" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_IntraFreqHandOffEnable" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_RSRPThreshold" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_RSRQThreshold" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="EUTRA">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="A1ThresholdRSRP" type="xs:string" minOccurs="0"/>
-                       <xs:element name="A1ThresholdRSRQ" type="xs:string" minOccurs="0"/>
-                       <xs:element name="A2ThresholdRSRP" type="xs:string" minOccurs="0"/>
-                       <xs:element name="A2ThresholdRSRQ" type="xs:string" minOccurs="0"/>
-                       <xs:element name="A3Offset" type="xs:string" minOccurs="0"/>
-                       <xs:element name="A5Threshold1RSRP" type="xs:string" minOccurs="0"/>
-                       <xs:element name="A5Threshold1RSRQ" type="xs:string" minOccurs="0"/>
-                       <xs:element name="A5Threshold2RSRP" type="xs:string" minOccurs="0"/>
-                       <xs:element name="A5Threshold2RSRQ" type="xs:string" minOccurs="0"/>
-                       <xs:element name="FilterCoefficientRSRP" type="xs:string" minOccurs="0"/>
-                       <xs:element name="FilterCoefficientRSRQ" type="xs:string" minOccurs="0"/>
-                       <xs:element name="Hysteresis" type="xs:string" minOccurs="0"/>
-                       <xs:element name="ReportAmount" type="xs:string" minOccurs="0"/>
-                       <xs:element name="ReportInterval" type="xs:string" minOccurs="0"/>
-                       <xs:element name="ReportOnLeave" type="xs:string" minOccurs="0"/>
-                       <xs:element name="ReportQuantity" type="xs:string" minOccurs="0"/>
-                       <xs:element name="TimeToTrigger" type="xs:string" minOccurs="0"/>
-                       <xs:element name="TriggerQuantity" type="xs:string" minOccurs="0"/>
-    <xs:element name="X_0005B9_CE" minOccurs="0">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="A3Offset" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="IRAT">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="B1ThresholdUTRAEcN0" type="xs:string" minOccurs="0"/>
-                       <xs:element name="B1ThresholdUTRARSCP" type="xs:string" minOccurs="0"/>
-                       <xs:element name="B2Threshold1RSRP" type="xs:string" minOccurs="0"/>
-                       <xs:element name="B2Threshold1RSRQ" type="xs:string" minOccurs="0"/>
-                       <xs:element name="B2Threshold2UTRAEcN0" type="xs:string" minOccurs="0"/>
-                       <xs:element name="B2Threshold2UTRARSCP" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="IdleMode">
-       <xs:complexType>
-               <xs:sequence>
-    <xs:element name="Common" minOccurs="0">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="NCellChangeHigh" type="xs:string" minOccurs="0"/>
-                       <xs:element name="NCellChangeMedium" type="xs:string" minOccurs="0"/>
-                       <xs:element name="QHystSFHigh" type="xs:string" minOccurs="0"/>
-                       <xs:element name="QHystSFMedium" type="xs:string" minOccurs="0"/>
-                       <xs:element name="Qhyst" type="xs:string" minOccurs="0"/>
-                       <xs:element name="THystNormal" type="xs:string" minOccurs="0"/>
-                       <xs:element name="Tevaluation" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="IRAT" minOccurs="0">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element ref="CDMA2000" minOccurs="0"/>
-                       <xs:element ref="GERAN" minOccurs="0"/>
-                       <xs:element ref="UTRA" minOccurs="0"/>
-                       <xs:element name="X_0005B9_CSFBMODE" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_CSFBRATTYPE" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_EmergencyExcessFactor" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_cSFBDUALReceiveENABLE" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-                       <xs:element ref="InterFreq" minOccurs="0"/>
-                       <xs:element ref="IntraFreq" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="CDMA2000">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element ref="CDMA2000Band" minOccurs="0" maxOccurs="unbounded"/>
-                       <xs:element name="SearchWindowSize" type="xs:string" minOccurs="0"/>
-                       <xs:element name="TReselectionCDMA2000" type="xs:string" minOccurs="0"/>
-                       <xs:element name="TReselectionCDMA2000SFHigh" type="xs:string" minOccurs="0"/>
-                       <xs:element name="TReselectionCDMA2000SFMedium" type="xs:string" minOccurs="0"/>
-                       <xs:element ref="X_0005B9_CellParam" minOccurs="0"/>
-                       <xs:element ref="X_0005B9_Mobility_SIB8_Parameters" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-
-       <xs:unique name="uniqueId-CDMA2000Band">
-               <xs:selector xpath="CDMA2000Band" />
-               <xs:field xpath="@index" />
-       </xs:unique>
-    </xs:element>
-    <xs:element name="CDMA2000Band">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="Alias" type="xs:string" minOccurs="0"/>
-                       <xs:element name="BandClass" type="xs:string" minOccurs="0"/>
-                       <xs:element name="CellReselectionPriority" type="xs:string" minOccurs="0"/>
-                       <xs:element name="Enable" type="xs:string" minOccurs="0"/>
-                       <xs:element name="ThreshXHigh" type="xs:string" minOccurs="0"/>
-                       <xs:element name="ThreshXLow" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_Index" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-               <xs:attribute name="index" type="dmsIndex" use="required"/>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="X_0005B9_CellParam">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="ReferenceCellID" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="X_0005B9_Mobility_SIB8_Parameters">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="Auth" type="xs:string" minOccurs="0"/>
-                       <xs:element name="ForeignNidReg" type="xs:string" minOccurs="0"/>
-                       <xs:element name="ForeignSidReg" type="xs:string" minOccurs="0"/>
-                       <xs:element name="HomeReg" type="xs:string" minOccurs="0"/>
-                       <xs:element name="IMSI1112" type="xs:string" minOccurs="0"/>
-                       <xs:element name="ImsiTSupported" type="xs:string" minOccurs="0"/>
-                       <xs:element name="MCC" type="xs:string" minOccurs="0"/>
-                       <xs:element name="MaxNumAltSO" type="xs:string" minOccurs="0"/>
-                       <xs:element name="MultipleNid" type="xs:string" minOccurs="0"/>
-                       <xs:element name="MultipleSid" type="xs:string" minOccurs="0"/>
-                       <xs:element name="Nid" type="xs:string" minOccurs="0"/>
-                       <xs:element name="PacketZoneId" type="xs:string" minOccurs="0"/>
-                       <xs:element name="ParameReg" type="xs:string" minOccurs="0"/>
-                       <xs:element name="PowerDownReg" type="xs:string" minOccurs="0"/>
-                       <xs:element name="PowerUpReg" type="xs:string" minOccurs="0"/>
-                       <xs:element name="PrefMSIDType" type="xs:string" minOccurs="0"/>
-                       <xs:element name="RegPrd" type="xs:string" minOccurs="0"/>
-                       <xs:element name="RegZone" type="xs:string" minOccurs="0"/>
-                       <xs:element name="Sid" type="xs:string" minOccurs="0"/>
-                       <xs:element name="TotalZone" type="xs:string" minOccurs="0"/>
-                       <xs:element name="ZoneTimer" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="GERAN">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element ref="GERANFreqGroup" minOccurs="0" maxOccurs="unbounded"/>
-                       <xs:element name="t-ReselectionGERAN" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-
-       <xs:unique name="uniqueId-GERANFreqGroup">
-               <xs:selector xpath="GERANFreqGroup" />
-               <xs:field xpath="@index" />
-       </xs:unique>
-    </xs:element>
-    <xs:element name="GERANFreqGroup">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="Alias" type="xs:string" minOccurs="0"/>
-                       <xs:element name="BCCHARFCN" type="xs:string" minOccurs="0"/>
-                       <xs:element name="BandIndicator" type="xs:string" minOccurs="0"/>
-                       <xs:element name="CellReselectionPriority" type="xs:string" minOccurs="0"/>
-                       <xs:element name="Enable" type="xs:string" minOccurs="0"/>
-                       <xs:element name="QRxLevMin" type="xs:string" minOccurs="0"/>
-                       <xs:element name="ThreshXHigh" type="xs:string" minOccurs="0"/>
-                       <xs:element name="ThreshXLow" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_Index" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-               <xs:attribute name="index" type="dmsIndex" use="required"/>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="UTRA">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="TReselectionUTRA" type="xs:string" minOccurs="0"/>
-                       <xs:element ref="UTRANFDDFreq" minOccurs="0" maxOccurs="unbounded"/>
-                       <xs:element name="X_0005B9_threshXHighQr9SIB6" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_threshXLowQr9SIB6" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-
-       <xs:unique name="uniqueId-UTRANFDDFreq">
-               <xs:selector xpath="UTRANFDDFreq" />
-               <xs:field xpath="@index" />
-       </xs:unique>
-    </xs:element>
-    <xs:element name="UTRANFDDFreq">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="Alias" type="xs:string" minOccurs="0"/>
-                       <xs:element name="CellReselectionPriority" type="xs:string" minOccurs="0"/>
-                       <xs:element name="Enable" type="xs:string" minOccurs="0"/>
-                       <xs:element name="PMaxUTRA" type="xs:string" minOccurs="0"/>
-                       <xs:element name="QQualMin" type="xs:string" minOccurs="0"/>
-                       <xs:element name="QRxLevMin" type="xs:string" minOccurs="0"/>
-                       <xs:element name="ThreshXHigh" type="xs:string" minOccurs="0"/>
-                       <xs:element name="ThreshXLow" type="xs:string" minOccurs="0"/>
-                       <xs:element name="UTRACarrierARFCN" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_Index" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-               <xs:attribute name="index" type="dmsIndex" use="required"/>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="InterFreq">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element ref="Carrier" minOccurs="0" maxOccurs="unbounded"/>
-
-               </xs:sequence>
-       </xs:complexType>
-
-       <xs:unique name="uniqueId-Carrier">
-               <xs:selector xpath="Carrier" />
-               <xs:field xpath="@index" />
-       </xs:unique>
-    </xs:element>
-    <xs:element name="Carrier">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="Alias" type="xs:string" minOccurs="0"/>
-                       <xs:element name="CellReselectionPriority" type="xs:string" minOccurs="0"/>
-                       <xs:element name="EUTRACarrierARFCN" type="xs:string" minOccurs="0"/>
-                       <xs:element name="Enable" type="xs:string" minOccurs="0"/>
-                       <xs:element name="Pmax" type="xs:string" minOccurs="0"/>
-                       <xs:element name="QOffsetFreq" type="xs:string" minOccurs="0"/>
-                       <xs:element name="QRxLevMinSIB5" type="xs:string" minOccurs="0"/>
-                       <xs:element name="TReselectionEUTRA" type="xs:string" minOccurs="0"/>
-                       <xs:element name="TReselectionEUTRASFHigh" type="xs:string" minOccurs="0"/>
-                       <xs:element name="TReselectionEUTRASFMedium" type="xs:string" minOccurs="0"/>
-                       <xs:element name="ThreshXHigh" type="xs:string" minOccurs="0"/>
-                       <xs:element name="ThreshXLow" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_MultiBandInfoList" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_ThreshXHighQr9SIB5" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_ThreshXLowQr9SIB5" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_qQualMinSIB5" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-               <xs:attribute name="index" type="dmsIndex" use="required"/>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="IntraFreq">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="CellReselectionPriority" type="xs:string" minOccurs="0"/>
-                       <xs:element name="Pmax" type="xs:string" minOccurs="0"/>
-                       <xs:element name="QRxLevMinOffset" type="xs:string" minOccurs="0"/>
-                       <xs:element name="QRxLevMinSIB1" type="xs:string" minOccurs="0"/>
-                       <xs:element name="QRxLevMinSIB3" type="xs:string" minOccurs="0"/>
-                       <xs:element name="SIntraSearch" type="xs:string" minOccurs="0"/>
-                       <xs:element name="SNonIntraSearch" type="xs:string" minOccurs="0"/>
-                       <xs:element name="TReselectionEUTRA" type="xs:string" minOccurs="0"/>
-                       <xs:element name="TReselectionEUTRASFHigh" type="xs:string" minOccurs="0"/>
-                       <xs:element name="TReselectionEUTRASFMedium" type="xs:string" minOccurs="0"/>
-                       <xs:element name="ThreshServingLow" type="xs:string" minOccurs="0"/>
-    <xs:element name="X_0005B9_CE" minOccurs="0">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="QRxLevMinSIB1" type="xs:string" minOccurs="0"/>
-                       <xs:element name="QRxLevMinSIB3" type="xs:string" minOccurs="0"/>
-                       <xs:element name="qQualMinRSRQSIB1" type="xs:string" minOccurs="0"/>
-                       <xs:element name="qQualMinRSRQSIB3" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-                       <xs:element name="X_0005B9_IntraFreqReselectionSIB1" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_allowedMeasurementBandwidthSIB3" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_neighCellConfigSIB3" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_pMaxSIB3" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_presenceAntennaPort1SIB3" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_qQualMinOffsetr9SIB1" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_qQualMinSIB3" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_qQualMinr9SIB1" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_sIntraSearch_Pr9SIB3" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_sIntraSearch_Qr9SIB3" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_snonIntraSearch_Pr9SIB3" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_snonIntraSearch_Qr9SIB3" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_thresholdServingLowQSIB3" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="NeighborList">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element ref="InterRATCell" minOccurs="0"/>
-                       <xs:element ref="LTECell" minOccurs="0" maxOccurs="unbounded"/>
-
-               </xs:sequence>
-       </xs:complexType>
-
-       <xs:unique name="uniqueId-LTECell">
-               <xs:selector xpath="LTECell" />
-               <xs:field xpath="@index" />
-       </xs:unique>
-    </xs:element>
-    <xs:element name="InterRATCell">
-       <xs:complexType>
-               <xs:sequence>
-    <xs:element name="CDMA2000" minOccurs="0" maxOccurs="unbounded">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="ARFCN" type="xs:string" minOccurs="0"/>
-                       <xs:element name="Alias" type="xs:string" minOccurs="0"/>
-                       <xs:element name="BandClass" type="xs:string" minOccurs="0"/>
-                       <xs:element name="CID" type="xs:string" minOccurs="0"/>
-                       <xs:element name="Enable" type="xs:string" minOccurs="0"/>
-                       <xs:element name="MustInclude" type="xs:string" minOccurs="0"/>
-                       <xs:element name="PNOffset" type="xs:string" minOccurs="0"/>
-                       <xs:element name="Type" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_FpcFchInitSetptRc3" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_Index" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_MinProtocolRevLevel" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_PilotInc" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_ProtocolRevLevel" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-               <xs:attribute name="index" type="dmsIndex" use="required"/>
-               </xs:complexType>
-    </xs:element>
-
-               </xs:sequence>
-       </xs:complexType>
-
-       <xs:unique name="uniqueId-CDMA2000">
-               <xs:selector xpath="CDMA2000" />
-               <xs:field xpath="@index" />
-       </xs:unique>
-    </xs:element>
-    <xs:element name="LTECell">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="Alias" type="xs:string" minOccurs="0"/>
-                       <xs:element name="Blacklisted" type="xs:string" minOccurs="0"/>
-                       <xs:element name="CID" type="xs:string" minOccurs="0"/>
-                       <xs:element name="CIO" type="xs:string" minOccurs="0"/>
-                       <xs:element name="EUTRACarrierARFCN" type="xs:string" minOccurs="0"/>
-                       <xs:element name="Enable" type="xs:string" minOccurs="0"/>
-                       <xs:element name="MustInclude" type="xs:string" minOccurs="0"/>
-                       <xs:element name="PLMNID" type="xs:string" minOccurs="0"/>
-                       <xs:element name="PhyCellID" type="xs:string" minOccurs="0"/>
-                       <xs:element name="Qoffset" type="xs:string" minOccurs="0"/>
-                       <xs:element name="RSTxPower" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_CSGIdentity" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_CSGIndication" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_FreqBandIndicatorPriority" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_LBPartner" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_LTECellNeighborListIndex" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_MFBICapable" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_MultiBandInfoList" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_TAC" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_X2LinkEnable" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-               <xs:attribute name="index" type="dmsIndex" use="required"/>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="NeighborListInUse">
-       <xs:complexType>
-               <xs:sequence>
-    <xs:element name="InterRATCell" minOccurs="0">
-       <xs:complexType>
-               <xs:sequence>
-    <xs:element name="CDMA2000" minOccurs="0" maxOccurs="unbounded">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="NLInUseCDMA2000Index" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-               <xs:attribute name="index" type="dmsIndex" use="required"/>
-               </xs:complexType>
-    </xs:element>
-                       <xs:element ref="GSM" minOccurs="0" maxOccurs="unbounded"/>
-                       <xs:element ref="UMTS" minOccurs="0" maxOccurs="unbounded"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="LTECell" minOccurs="0" maxOccurs="unbounded">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="NeighborListInUseCellIndex" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-               <xs:attribute name="index" type="dmsIndex" use="required"/>
-               </xs:complexType>
-    </xs:element>
-
-               </xs:sequence>
-       </xs:complexType>
-
-       <xs:unique name="uniqueId-CDMA20001">
-               <xs:selector xpath="CDMA2000" />
-               <xs:field xpath="@index" />
-       </xs:unique>
-       <xs:unique name="uniqueId-GSM">
-               <xs:selector xpath="GSM" />
-               <xs:field xpath="@index" />
-       </xs:unique>
-       <xs:unique name="uniqueId-UMTS">
-               <xs:selector xpath="UMTS" />
-               <xs:field xpath="@index" />
-       </xs:unique>
-       <xs:unique name="uniqueId-LTECell1">
-               <xs:selector xpath="LTECell" />
-               <xs:field xpath="@index" />
-       </xs:unique>
-    </xs:element>
-    <xs:element name="GSM">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="NLInUseGSMIndex" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-               <xs:attribute name="index" type="dmsIndex" use="required"/>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="UMTS">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="NLInUseUMTSIndex" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-               <xs:attribute name="index" type="dmsIndex" use="required"/>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="PDSCH">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="Pa" type="xs:string" minOccurs="0"/>
-                       <xs:element name="Pb" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="PRACH">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="ConfigurationIndex" type="xs:string" minOccurs="0"/>
-                       <xs:element name="FreqOffset" type="xs:string" minOccurs="0"/>
-                       <xs:element name="RootSequenceIndex" type="xs:string" minOccurs="0"/>
-    <xs:element name="X_0005B9_CE" minOccurs="0">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="ConfigIndex" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-                       <xs:element name="ZeroCorrelationZoneConfig" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="PUCCH">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="CQIPUCCHResourceIndex" type="xs:string" minOccurs="0"/>
-                       <xs:element name="DeltaPUCCHShift" type="xs:string" minOccurs="0"/>
-                       <xs:element name="DynamicSRsupport" type="xs:string" minOccurs="0"/>
-                       <xs:element name="N1PUCCHAN" type="xs:string" minOccurs="0"/>
-                       <xs:element name="NRBCQI" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_DummyDci0Allocation" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_DummyDci0Thr" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="PUSCH">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element ref="ULRS" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="ULRS">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="SequenceHoppingEnabled" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="SRS">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="AckNackSRSSimultaneousTransmission" type="xs:string" minOccurs="0"/>
-                       <xs:element name="SRSBandwidthConfig" type="xs:string" minOccurs="0"/>
-                       <xs:element name="SRSEnabled" type="xs:string" minOccurs="0"/>
-                       <xs:element name="SRSMaxUpPTS" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="ULPowerControl">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="Alpha" type="xs:string" minOccurs="0"/>
-                       <xs:element name="P0NominalPUCCH" type="xs:string" minOccurs="0"/>
-                       <xs:element name="P0NominalPUSCH" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="RLC">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element ref="DRB" minOccurs="0"/>
-                       <xs:element ref="SRB1" minOccurs="0"/>
-                       <xs:element ref="SRB2" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="DRB">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="MaxRetxThreshold" type="xs:string" minOccurs="0"/>
-                       <xs:element name="TPollRetransmit" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="SRB1">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="DefaultConfiguration" type="xs:string" minOccurs="0"/>
-                       <xs:element name="MaxRetxThreshold" type="xs:string" minOccurs="0"/>
-                       <xs:element name="PollByte" type="xs:string" minOccurs="0"/>
-                       <xs:element name="PollPDU" type="xs:string" minOccurs="0"/>
-                       <xs:element name="TPollRetransmit" type="xs:string" minOccurs="0"/>
-                       <xs:element name="TReordering" type="xs:string" minOccurs="0"/>
-                       <xs:element name="TStatusProhibit" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="SRB2">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="DefaultConfiguration" type="xs:string" minOccurs="0"/>
-                       <xs:element name="MaxRetxThreshold" type="xs:string" minOccurs="0"/>
-                       <xs:element name="PollByte" type="xs:string" minOccurs="0"/>
-                       <xs:element name="PollPDU" type="xs:string" minOccurs="0"/>
-                       <xs:element name="TPollRetransmit" type="xs:string" minOccurs="0"/>
-                       <xs:element name="TReordering" type="xs:string" minOccurs="0"/>
-                       <xs:element name="TStatusProhibit" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="RRCTimers">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="N310" type="xs:string" minOccurs="0"/>
-                       <xs:element name="N311" type="xs:string" minOccurs="0"/>
-                       <xs:element name="T300" type="xs:string" minOccurs="0"/>
-                       <xs:element name="T301" type="xs:string" minOccurs="0"/>
-                       <xs:element name="T302" type="xs:string" minOccurs="0"/>
-                       <xs:element name="T304EUTRA" type="xs:string" minOccurs="0"/>
-                       <xs:element name="T304IRAT" type="xs:string" minOccurs="0"/>
-                       <xs:element name="T310" type="xs:string" minOccurs="0"/>
-                       <xs:element name="T311" type="xs:string" minOccurs="0"/>
-                       <xs:element name="T320" type="xs:string" minOccurs="0"/>
-    <xs:element name="X_0005B9_CE" minOccurs="0">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="T300" type="xs:string" minOccurs="0"/>
-                       <xs:element name="T301" type="xs:string" minOccurs="0"/>
-                       <xs:element name="T304EUTRA" type="xs:string" minOccurs="0"/>
-                       <xs:element name="T310" type="xs:string" minOccurs="0"/>
-                       <xs:element name="T311" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-                       <xs:element name="X_0005B9_RLFWaitForReestTimer" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="S1AP">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="TRelocOverall" type="xs:string" minOccurs="0"/>
-                       <xs:element name="TRelocPrep" type="xs:string" minOccurs="0"/>
-    <xs:element name="X_0005B9_CE" minOccurs="0">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="TRelocOverall" type="xs:string" minOccurs="0"/>
-                       <xs:element name="TRelocPrep" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-                       <xs:element name="X_0005B9_eNBName" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="S1U">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="GTPUEchoInterval" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="X_0005B9_X2AP_CE">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="TRelocOverall" type="xs:string" minOccurs="0"/>
-                       <xs:element name="TRelocPrep" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="X_0005B9_CE">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="eDRXAllowed" type="xs:string" minOccurs="0"/>
-                       <xs:element name="numSib1BrRep" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="X_0005B9_CarrierAggregation">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="CaLoadBalance" type="xs:string" minOccurs="0"/>
-                       <xs:element name="CaUeThr" type="xs:string" minOccurs="0"/>
-                       <xs:element name="DlQloadLowCount" type="xs:string" minOccurs="0"/>
-                       <xs:element name="DlQloadLowThreshold" type="xs:string" minOccurs="0"/>
-                       <xs:element name="McsScc" type="xs:string" minOccurs="0"/>
-                       <xs:element name="PccCaThr" type="xs:string" minOccurs="0"/>
-                       <xs:element name="QloadCaLimitInstances" type="xs:string" minOccurs="0"/>
-                       <xs:element name="SccA2ThreshRSRP" type="xs:string" minOccurs="0"/>
-                       <xs:element name="SccA2ThreshRSRQ" type="xs:string" minOccurs="0"/>
-                       <xs:element name="SccA4ThreshRSRP" type="xs:string" minOccurs="0"/>
-                       <xs:element name="SccA4ThreshRSRQ" type="xs:string" minOccurs="0"/>
-                       <xs:element name="SccColocatedPairTime" type="xs:string" minOccurs="0"/>
-                       <xs:element name="SccCqiLowCount" type="xs:string" minOccurs="0"/>
-                       <xs:element name="SccCqiLowThesh" type="xs:string" minOccurs="0"/>
-                       <xs:element name="SccCqiStaleTime" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="X_0005B9_RrcConnection">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="NRrcCC" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="X_0005B9_RrcConnectionRejection">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="deprioritisationTime" type="xs:string" minOccurs="0"/>
-                       <xs:element name="deprioritisationType" type="xs:string" minOccurs="0"/>
-                       <xs:element name="waitTime" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="FAPControl">
-       <xs:complexType>
-               <xs:sequence>
-    <xs:element name="LTE" minOccurs="0">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="AdminState" type="xs:string" minOccurs="0"/>
-                       <xs:element ref="Gateway" minOccurs="0"/>
-                       <xs:element name="PMConfig" type="xs:string" minOccurs="0"/>
-    <xs:element name="X_0005B9_CE" minOccurs="0">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="DefaultPagingCycle" type="xs:string" minOccurs="0"/>
-                       <xs:element name="siRepetitionPattern" type="xs:string" minOccurs="0"/>
-                       <xs:element name="siValidityTime" type="xs:string" minOccurs="0"/>
-                       <xs:element name="siWindowLength" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-                       <xs:element name="X_0005B9_CatM1Enable" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_DefaultPagingCycle" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_EmergencyErabARP" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_Enable4X4MIMO" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_EnableDL256QAM" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_EnableDlReuse" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_EnableUL64QAM" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_EnableUlReuse" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_IdleLoadBalance" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_InactivityTimer" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_MCPTTEnable" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_MFBISupport" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_MultiBandInfoList" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_ReuseFactorDl" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_ReuseFactorUl" type="xs:string" minOccurs="0"/>
-                       <xs:element ref="X_0005B9_SelfConfig" minOccurs="0"/>
-                       <xs:element name="X_0005B9_UnequalTxPower" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_X2Enable" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_downlinkCaEnable" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_explicitlyReleaseAfter" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_maxSPSDL" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_maxSPSUL" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_maxSirThr" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_minSirThr" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_numConfiguredSPSProcess" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_numRpInMaxQsv" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_spsMcsOverride" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-                       <xs:element name="SelfConfigEvents" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="Gateway">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="S1ConnectionMode" type="xs:string" minOccurs="0"/>
-                       <xs:element name="S1SigLinkPort" type="xs:string" minOccurs="0"/>
-                       <xs:element name="S1SigLinkServerList" type="xs:string" minOccurs="0"/>
-                       <xs:element name="SecGWServer1" type="xs:string" minOccurs="0"/>
-                       <xs:element name="SecGWServer2" type="xs:string" minOccurs="0"/>
-                       <xs:element name="SecGWServer3" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_EnableDUALTunnel" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_S1apGaurdPeriod" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_SecGW2Server1" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_SecGW2Server2" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_SecGW2Server3" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="X_0005B9_SelfConfig">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="ANRSelfConfigEnable" type="xs:string" minOccurs="0"/>
-                       <xs:element name="AssignSameTAC" type="xs:string" minOccurs="0"/>
-                       <xs:element name="AutoTxPowerEnable" type="xs:string" minOccurs="0"/>
-                       <xs:element name="CellReselectionSelfConfigEnable" type="xs:string" minOccurs="0"/>
-                       <xs:element name="ClearDiscoveredNeighbors" type="xs:string" minOccurs="0"/>
-                       <xs:element name="CrntiHist" type="xs:string" minOccurs="0"/>
-                       <xs:element name="EARFCNDLSelfConfigEnable" type="xs:string" minOccurs="0"/>
-                       <xs:element name="InterFreqMeasSelfConfigEnable" type="xs:string" minOccurs="0"/>
-                       <xs:element name="InterRATMeasSelfConfigEnable" type="xs:string" minOccurs="0"/>
-                       <xs:element name="IntraFreqMeasSelfConfigEnable" type="xs:string" minOccurs="0"/>
-                       <xs:element name="NeighborListSelfConfigEnable" type="xs:string" minOccurs="0"/>
-                       <xs:element name="PciColDetectThr" type="xs:string" minOccurs="0"/>
-                       <xs:element name="PciCollisionDetectFlag" type="xs:string" minOccurs="0"/>
-                       <xs:element name="PhyCellIDSelfConfigEnable" type="xs:string" minOccurs="0"/>
-                       <xs:element name="PmaxSelfConfigEnable" type="xs:string" minOccurs="0"/>
-                       <xs:element name="PreambleRACHTxPwrSelfConfigEnable" type="xs:string" minOccurs="0"/>
-                       <xs:element name="PropotionalRrcSplit" type="xs:string" minOccurs="0"/>
-                       <xs:element name="RSTxPowerSelfConfigEnable" type="xs:string" minOccurs="0"/>
-                       <xs:element name="RootSequenceIndexSelfConfigEnable" type="xs:string" minOccurs="0"/>
-                       <xs:element name="RsiCollisionDetectFlag" type="xs:string" minOccurs="0"/>
-                       <xs:element name="TACPolicy" type="xs:string" minOccurs="0"/>
-                       <xs:element name="TACSelfConfigEnable" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X2TriggeredPciReconfigAllowed" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="REM">
-       <xs:complexType>
-               <xs:sequence>
-    <xs:element name="LTE" minOccurs="0">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element ref="Cell" minOccurs="0" maxOccurs="unbounded"/>
-                       <xs:element name="EUTRACarrierARFCNDLList" type="xs:string" minOccurs="0"/>
-                       <xs:element name="InServiceHandling" type="xs:string" minOccurs="0"/>
-                       <xs:element name="PeriodicInterval" type="xs:string" minOccurs="0"/>
-                       <xs:element name="PeriodicTime" type="xs:string" minOccurs="0"/>
-                       <xs:element name="REMBandList" type="xs:string" minOccurs="0"/>
-                       <xs:element name="REMPLMNList" type="xs:string" minOccurs="0"/>
-                       <xs:element name="ScanOnBoot" type="xs:string" minOccurs="0"/>
-                       <xs:element name="ScanPeriodically" type="xs:string" minOccurs="0"/>
-                       <xs:element name="ScanTimeout" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="UMTS" minOccurs="0">
-       <xs:complexType>
-               <xs:sequence>
-    <xs:element name="GSM" minOccurs="0">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="ARFCNList" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-                       <xs:element ref="WCDMA" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="Cell">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="RemLteCellIndex" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-               <xs:attribute name="index" type="dmsIndex" use="required"/>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="WCDMA">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="UARFCNDLList" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="Transport">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element ref="SCTP" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="SCTP">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="Enable" type="xs:string" minOccurs="0"/>
-                       <xs:element name="HBInterval" type="xs:string" minOccurs="0"/>
-                       <xs:element name="MaxAssociationRetransmits" type="xs:string" minOccurs="0"/>
-                       <xs:element name="MaxInitRetransmits" type="xs:string" minOccurs="0"/>
-                       <xs:element name="MaxPathRetransmits" type="xs:string" minOccurs="0"/>
-                       <xs:element name="RTOInitial" type="xs:string" minOccurs="0"/>
-                       <xs:element name="RTOMax" type="xs:string" minOccurs="0"/>
-                       <xs:element name="RTOMin" type="xs:string" minOccurs="0"/>
-                       <xs:element name="SCTPMTUSize" type="xs:string" minOccurs="0"/>
-                       <xs:element name="SackFrequency" type="xs:string" minOccurs="0"/>
-                       <xs:element name="ValCookieLife" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="X_0005B9_AutoConfig">
-       <xs:complexType>
-               <xs:sequence>
-    <xs:element name="LTE" minOccurs="0">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="AvgMcsOnDlThresh" type="xs:string" minOccurs="0"/>
-                       <xs:element name="AvgMcsOnUlThresh" type="xs:string" minOccurs="0"/>
-                       <xs:element name="ConnectionDropRateThresh" type="xs:string" minOccurs="0"/>
-                       <xs:element name="EarfcnProgressiveEnable" type="xs:string" minOccurs="0"/>
-                       <xs:element name="EpochCountThresh" type="xs:string" minOccurs="0"/>
-                       <xs:element name="ErabEstablishmentFailureThresh" type="xs:string" minOccurs="0"/>
-                       <xs:element name="FiftyThPercentileMcsDlThresh" type="xs:string" minOccurs="0"/>
-                       <xs:element name="FiftyThPercentileMcsUlThresh" type="xs:string" minOccurs="0"/>
-                       <xs:element name="HoSuccessThresh" type="xs:string" minOccurs="0"/>
-                       <xs:element name="PciProgressiveEnable" type="xs:string" minOccurs="0"/>
-                       <xs:element name="PeriodicInterval" type="xs:string" minOccurs="0"/>
-                       <xs:element name="PeriodicTime" type="xs:string" minOccurs="0"/>
-                       <xs:element name="RachToConnectionThresh" type="xs:string" minOccurs="0"/>
-                       <xs:element name="RsiProgressiveEnable" type="xs:string" minOccurs="0"/>
-                       <xs:element name="RsrpPciThresh" type="xs:string" minOccurs="0"/>
-                       <xs:element name="RssiThresh" type="xs:string" minOccurs="0"/>
-                       <xs:element name="TenThPercentileMcsDlThresh" type="xs:string" minOccurs="0"/>
-                       <xs:element name="TenThPercentileMcsUlThresh" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="X_0005B9_AutoTxPower">
-       <xs:complexType>
-               <xs:sequence>
-    <xs:element name="LTE" minOccurs="0">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="AutoPowerConfigTimer" type="xs:string" minOccurs="0"/>
-                       <xs:element name="DisablePowerDuration" type="xs:string" minOccurs="0"/>
-                       <xs:element name="HOCountThreshold" type="xs:string" minOccurs="0"/>
-                       <xs:element name="LeakageRateThreshold" type="xs:string" minOccurs="0"/>
-                       <xs:element name="ProcessRLFonRrcConnEst" type="xs:string" minOccurs="0"/>
-                       <xs:element name="RLFRateThreshold" type="xs:string" minOccurs="0"/>
-                       <xs:element name="RRCConnectionThreshold" type="xs:string" minOccurs="0"/>
-                       <xs:element name="RSRPThreshold" type="xs:string" minOccurs="0"/>
-                       <xs:element name="STmsiAge" type="xs:string" minOccurs="0"/>
-                       <xs:element name="Tcritical" type="xs:string" minOccurs="0"/>
-                       <xs:element name="ToggleCountThreshold" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="X_0005B9_ExpressREM">
-       <xs:complexType>
-               <xs:sequence>
-    <xs:element name="LTE" minOccurs="0">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="Enabled" type="xs:string" minOccurs="0"/>
-                       <xs:element name="NumCarriers" type="xs:string" minOccurs="0"/>
-                       <xs:element name="PCIListLength" type="xs:string" minOccurs="0"/>
-                       <xs:element name="Periodicity" type="xs:string" minOccurs="0"/>
-                       <xs:element name="TimeOut" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="X_0005B9_LTE">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="ANREpochPeriod" type="xs:string" minOccurs="0"/>
-                       <xs:element name="CrntiStartRange" type="xs:string" minOccurs="0"/>
-                       <xs:element name="EARFCNDLInUse" type="xs:string" minOccurs="0"/>
-                       <xs:element name="EARFCNULInUse" type="xs:string" minOccurs="0"/>
-                       <xs:element name="PMReportFormat" type="xs:string" minOccurs="0"/>
-                       <xs:element name="PMaxInUse" type="xs:string" minOccurs="0"/>
-                       <xs:element name="PhyCellIDInUse" type="xs:string" minOccurs="0"/>
-                       <xs:element name="PreambleRACHTxPwrInUse" type="xs:string" minOccurs="0"/>
-                       <xs:element name="RSTxPowerInUse" type="xs:string" minOccurs="0"/>
-                       <xs:element name="RootSequenceIndexInUse" type="xs:string" minOccurs="0"/>
-                       <xs:element name="TACInUse" type="xs:string" minOccurs="0"/>
-                       <xs:element name="TACList" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="VoiceService">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element ref="X_0005B9_VoIP" minOccurs="0"/>
-
-               </xs:sequence>
-               <xs:attribute name="index" type="dmsIndex" use="required"/>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="X_0005B9_VoIP">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="EmergencyPolicy" type="xs:string" minOccurs="0"/>
-                       <xs:element name="Enable" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="Time">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="LocalTimeZone" type="xs:string" minOccurs="0"/>
-                       <xs:element name="NTPServer1" type="xs:string" minOccurs="0"/>
-                       <xs:element name="NTPServer2" type="xs:string" minOccurs="0"/>
-                       <xs:element name="NTPServer3" type="xs:string" minOccurs="0"/>
-                       <xs:element name="NTPServer4" type="xs:string" minOccurs="0"/>
-                       <xs:element name="NTPServer5" type="xs:string" minOccurs="0"/>
-                       <xs:element ref="X_0005B9_PTP" minOccurs="0"/>
-                       <xs:element name="X_0005B9_TimeSource" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="X_0005B9_PTP">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="AssymetricDelay" type="xs:string" minOccurs="0"/>
-                       <xs:element name="DomainNumber" type="xs:string" minOccurs="0"/>
-                       <xs:element name="MultiCastIPAddress" type="xs:string" minOccurs="0"/>
-                       <xs:element name="Server" type="xs:string" minOccurs="0"/>
-                       <xs:element name="ServerInUse" type="xs:string" minOccurs="0"/>
-                       <xs:element name="TCID" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="UserInterface">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="X_0005B9_Enable" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="X_0005B9_FHMgmt">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element ref="TrapReceiver" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="TrapReceiver">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="AuthKey" type="xs:string" minOccurs="0"/>
-                       <xs:element name="AuthProtocol" type="xs:string" minOccurs="0"/>
-                       <xs:element name="DMSIPAddressPort" type="xs:string" minOccurs="0"/>
-                       <xs:element name="Enable" type="xs:string" minOccurs="0"/>
-                       <xs:element name="IPAddress" type="xs:string" minOccurs="0"/>
-                       <xs:element name="PrivacyKey" type="xs:string" minOccurs="0"/>
-                       <xs:element name="PrivacyProtocol" type="xs:string" minOccurs="0"/>
-                       <xs:element name="ProcessingRate" type="xs:string" minOccurs="0"/>
-                       <xs:element name="SwitchEngineID" type="xs:string" minOccurs="0"/>
-                       <xs:element name="UserName" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="X_0005B9_IPsec2">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="ExcludeCP" type="xs:string" minOccurs="0"/>
-    <xs:element name="Filter" minOccurs="0" maxOccurs="unbounded">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="Alias" type="xs:string" minOccurs="0"/>
-                       <xs:element name="AllInterfaces" type="xs:string" minOccurs="0"/>
-                       <xs:element name="Interface" type="xs:string" minOccurs="0"/>
-                       <xs:element name="Order" type="xs:string" minOccurs="0"/>
-                       <xs:element name="Profile" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-               <xs:attribute name="index" type="dmsIndex" use="required"/>
-               </xs:complexType>
-    </xs:element>
-    <xs:element name="IKEv2SA" minOccurs="0" maxOccurs="unbounded">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="Alias" type="xs:string" minOccurs="0"/>
-    <xs:element name="ChildSA" minOccurs="0" maxOccurs="unbounded">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="Alias" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-               <xs:attribute name="index" type="dmsIndex" use="required"/>
-               </xs:complexType>
-    </xs:element>
-
-               </xs:sequence>
-               <xs:attribute name="index" type="dmsIndex" use="required"/>
-               </xs:complexType>
-    </xs:element>
-    <xs:element name="Profile" minOccurs="0" maxOccurs="unbounded">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="AHAllowedIntegrityAlgorithms" type="xs:string" minOccurs="0"/>
-                       <xs:element name="Alias" type="xs:string" minOccurs="0"/>
-                       <xs:element name="AntiReplayWindowSize" type="xs:string" minOccurs="0"/>
-                       <xs:element name="ChildSATimeLimit" type="xs:string" minOccurs="0"/>
-                       <xs:element name="ChildSATrafficLimit" type="xs:string" minOccurs="0"/>
-                       <xs:element name="DSCPMarkPolicy" type="xs:string" minOccurs="0"/>
-                       <xs:element name="DoNotFragment" type="xs:string" minOccurs="0"/>
-                       <xs:element name="ESPAllowedEncryptionAlgorithms" type="xs:string" minOccurs="0"/>
-                       <xs:element name="ESPAllowedIntegrityAlgorithms" type="xs:string" minOccurs="0"/>
-                       <xs:element name="IKEv2AllowedDiffieHellmanGroupTransforms" type="xs:string" minOccurs="0"/>
-                       <xs:element name="IKEv2AllowedEncryptionAlgorithms" type="xs:string" minOccurs="0"/>
-                       <xs:element name="IKEv2AllowedIntegrityAlgorithms" type="xs:string" minOccurs="0"/>
-                       <xs:element name="IKEv2AllowedPseudoRandomFunctions" type="xs:string" minOccurs="0"/>
-                       <xs:element name="IKEv2AuthenticationMethod" type="xs:string" minOccurs="0"/>
-                       <xs:element name="IKEv2DeadPeerDetectionTimeout" type="xs:string" minOccurs="0"/>
-                       <xs:element name="IKEv2NATTKeepaliveTimeout" type="xs:string" minOccurs="0"/>
-                       <xs:element name="IKEv2SATimeLimit" type="xs:string" minOccurs="0"/>
-                       <xs:element name="MaxChildSAs" type="xs:string" minOccurs="0"/>
-                       <xs:element name="Protocol" type="xs:string" minOccurs="0"/>
-                       <xs:element name="RemoteEndpoints" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_IKEv2RekeyMargin" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-               <xs:attribute name="index" type="dmsIndex" use="required"/>
-               </xs:complexType>
-    </xs:element>
-
-               </xs:sequence>
-       </xs:complexType>
-
-       <xs:unique name="uniqueId-Filter1">
-               <xs:selector xpath="Filter" />
-               <xs:field xpath="@index" />
-       </xs:unique>
-       <xs:unique name="uniqueId-IKEv2SA1">
-               <xs:selector xpath="IKEv2SA" />
-               <xs:field xpath="@index" />
-       </xs:unique>
-       <xs:unique name="uniqueId-ChildSA1">
-               <xs:selector xpath="ChildSA" />
-               <xs:field xpath="@index" />
-       </xs:unique>
-       <xs:unique name="uniqueId-Profile1">
-               <xs:selector xpath="Profile" />
-               <xs:field xpath="@index" />
-       </xs:unique>
-    </xs:element>
-    <xs:element name="X_0005B9_IPsecCA">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="Enable" type="xs:string" minOccurs="0"/>
-                       <xs:element name="ExcludeCP" type="xs:string" minOccurs="0"/>
-    <xs:element name="Filter" minOccurs="0" maxOccurs="unbounded">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="Alias" type="xs:string" minOccurs="0"/>
-                       <xs:element name="AllInterfaces" type="xs:string" minOccurs="0"/>
-                       <xs:element name="Interface" type="xs:string" minOccurs="0"/>
-                       <xs:element name="Order" type="xs:string" minOccurs="0"/>
-                       <xs:element name="Profile" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-               <xs:attribute name="index" type="dmsIndex" use="required"/>
-               </xs:complexType>
-    </xs:element>
-    <xs:element name="IKEv2SA" minOccurs="0" maxOccurs="unbounded">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="Alias" type="xs:string" minOccurs="0"/>
-    <xs:element name="ChildSA" minOccurs="0" maxOccurs="unbounded">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="Alias" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-               <xs:attribute name="index" type="dmsIndex" use="required"/>
-               </xs:complexType>
-    </xs:element>
-
-               </xs:sequence>
-               <xs:attribute name="index" type="dmsIndex" use="required"/>
-               </xs:complexType>
-    </xs:element>
-    <xs:element name="Profile" minOccurs="0" maxOccurs="unbounded">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="AHAllowedIntegrityAlgorithms" type="xs:string" minOccurs="0"/>
-                       <xs:element name="Alias" type="xs:string" minOccurs="0"/>
-                       <xs:element name="AntiReplayWindowSize" type="xs:string" minOccurs="0"/>
-                       <xs:element name="ChildSATimeLimit" type="xs:string" minOccurs="0"/>
-                       <xs:element name="ChildSATrafficLimit" type="xs:string" minOccurs="0"/>
-                       <xs:element name="DSCPMarkPolicy" type="xs:string" minOccurs="0"/>
-                       <xs:element name="DoNotFragment" type="xs:string" minOccurs="0"/>
-                       <xs:element name="ESPAllowedEncryptionAlgorithms" type="xs:string" minOccurs="0"/>
-                       <xs:element name="ESPAllowedIntegrityAlgorithms" type="xs:string" minOccurs="0"/>
-                       <xs:element name="IKEv2AllowedDiffieHellmanGroupTransforms" type="xs:string" minOccurs="0"/>
-                       <xs:element name="IKEv2AllowedEncryptionAlgorithms" type="xs:string" minOccurs="0"/>
-                       <xs:element name="IKEv2AllowedIntegrityAlgorithms" type="xs:string" minOccurs="0"/>
-                       <xs:element name="IKEv2AllowedPseudoRandomFunctions" type="xs:string" minOccurs="0"/>
-                       <xs:element name="IKEv2AuthenticationMethod" type="xs:string" minOccurs="0"/>
-                       <xs:element name="IKEv2DeadPeerDetectionTimeout" type="xs:string" minOccurs="0"/>
-                       <xs:element name="IKEv2NATTKeepaliveTimeout" type="xs:string" minOccurs="0"/>
-                       <xs:element name="IKEv2SATimeLimit" type="xs:string" minOccurs="0"/>
-                       <xs:element name="MaxChildSAs" type="xs:string" minOccurs="0"/>
-                       <xs:element name="Protocol" type="xs:string" minOccurs="0"/>
-                       <xs:element name="RemoteEndpoints" type="xs:string" minOccurs="0"/>
-                       <xs:element name="X_0005B9_IKEv2RekeyMargin" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-               <xs:attribute name="index" type="dmsIndex" use="required"/>
-               </xs:complexType>
-    </xs:element>
-
-               </xs:sequence>
-       </xs:complexType>
-
-       <xs:unique name="uniqueId-Filter12">
-               <xs:selector xpath="Filter" />
-               <xs:field xpath="@index" />
-       </xs:unique>
-       <xs:unique name="uniqueId-IKEv2SA12">
-               <xs:selector xpath="IKEv2SA" />
-               <xs:field xpath="@index" />
-       </xs:unique>
-       <xs:unique name="uniqueId-ChildSA12">
-               <xs:selector xpath="ChildSA" />
-               <xs:field xpath="@index" />
-       </xs:unique>
-       <xs:unique name="uniqueId-Profile12">
-               <xs:selector xpath="Profile" />
-               <xs:field xpath="@index" />
-       </xs:unique>
-    </xs:element>
-    <xs:element name="X_0005B9_License">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element ref="Licenses" minOccurs="0" maxOccurs="unbounded"/>
-
-               </xs:sequence>
-       </xs:complexType>
-
-       <xs:unique name="uniqueId-Licenses">
-               <xs:selector xpath="Licenses" />
-               <xs:field xpath="@index" />
-       </xs:unique>
-    </xs:element>
-    <xs:element name="Licenses">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="LicenseKeyIndex" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-               <xs:attribute name="index" type="dmsIndex" use="required"/>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="X_0005B9_MIGRATION">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="Migrate" type="xs:string" minOccurs="0"/>
-                       <xs:element name="Rollback" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-    <xs:element name="X_0005B9_SoftwareManagement">
-       <xs:complexType>
-               <xs:sequence>
-                       <xs:element name="ApplyWindowDuration" type="xs:string" minOccurs="0"/>
-                       <xs:element name="ApplyWindowInterval" type="xs:string" minOccurs="0"/>
-                       <xs:element name="ApplyWindowStart" type="xs:string" minOccurs="0"/>
-                       <xs:element name="UpgradeState" type="xs:string" minOccurs="0"/>
-
-               </xs:sequence>
-       </xs:complexType>
-    </xs:element>
-
-    <xs:simpleType name="dmsIndex">
-       <xs:restriction base="xs:integer">
-               <xs:minInclusive value="1"/>
-               <xs:pattern value="\d+"/>
-       </xs:restriction>
-    </xs:simpleType>
+       <xs:element name="configDataFile">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="fileHeader">
+                                       <xs:complexType>
+                                               <xs:attribute name="fileFormatVersion" type="xs:string" use="required"/>
+                                               <xs:attribute name="senderName" type="xs:string" use="optional"/>
+                                               <xs:attribute name="vendorName" type="xs:string" use="optional"/>
+                                       </xs:complexType>
+                               </xs:element>
+                               <xs:element ref="configData" minOccurs="1" maxOccurs="1"/>
+                               <xs:element name="fileFooter">
+                                       <xs:complexType>
+                                               <xs:attribute name="dateTime" type="xs:dateTime" use="required"/>
+                                       </xs:complexType>
+                               </xs:element>
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>           
+
+       <xs:element name="configData">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element ref="managedElement" minOccurs="1" maxOccurs="1"/>
+                               <xs:element ref="Device" minOccurs="1" maxOccurs="1" />
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="managedElement">
+               <xs:complexType>
+                       <xs:attribute name="OUI" type="xs:string" use="required"/>
+                       <xs:attribute name="localDn" type="xs:string" use="required"/>
+                       <xs:attribute name="ProductClass" type="xs:string" use="required"/>
+                       <xs:attribute name="swVersion" type="xs:string" use="required"/>
+                       <xs:attribute name="hwVersion" type="xs:string" use="optional"/>
+               </xs:complexType>
+
+       </xs:element>
+       <xs:element name="Device">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element ref="DeviceInfo" minOccurs="0"/>
+                               <xs:element ref="Ethernet" minOccurs="0"/>
+                               <xs:element ref="FAP" minOccurs="0"/>
+                               <xs:element ref="FaultMgmt" minOccurs="0"/>
+                               <xs:element ref="IP" minOccurs="0"/>
+                               <xs:element ref="IPsec" minOccurs="0"/>
+                               <xs:element ref="ManagementServer" minOccurs="0"/>
+                               <xs:element ref="NeighborDiscovery" minOccurs="0"/>
+                               <xs:element ref="PeriodicStatistics" minOccurs="0"/>
+                               <xs:element ref="QoS" minOccurs="0"/>
+                               <xs:element ref="Security" minOccurs="0"/>
+                               <xs:element ref="Services" minOccurs="0"/>
+                               <xs:element ref="Time" minOccurs="0"/>
+                               <xs:element ref="UserInterface" minOccurs="0"/>
+                               <xs:element ref="X_0005B9_FHMgmt" minOccurs="0"/>
+                               <xs:element ref="X_0005B9_IPsec2" minOccurs="0"/>
+                               <xs:element ref="X_0005B9_IPsecCA" minOccurs="0"/>
+                               <xs:element ref="X_0005B9_License" minOccurs="0"/>
+                               <xs:element ref="X_0005B9_MIGRATION" minOccurs="0"/>
+                               <xs:element ref="X_0005B9_SoftwareManagement" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="DeviceInfo">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="X_0005B9_OperatorName" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="Ethernet">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element ref="Interface" minOccurs="0" maxOccurs="unbounded"/>
+                               <xs:element ref="Link" minOccurs="0" maxOccurs="unbounded"/>
+                               <xs:element ref="VLANTermination" minOccurs="0" maxOccurs="unbounded"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+
+               <xs:unique name="uniqueId-Interface">
+                       <xs:selector xpath="Interface" />
+                       <xs:field xpath="@index" />
+               </xs:unique>
+               <xs:unique name="uniqueId-Link">
+                       <xs:selector xpath="Link" />
+                       <xs:field xpath="@index" />
+               </xs:unique>
+               <xs:unique name="uniqueId-VLANTermination">
+                       <xs:selector xpath="VLANTermination" />
+                       <xs:field xpath="@index" />
+               </xs:unique>
+       </xs:element>
+       <xs:element name="Interface">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="Alias" type="xs:string" minOccurs="0"/>
+                               <xs:element name="DuplexMode" type="xs:string" minOccurs="0"/>
+                               <xs:element name="Enable" type="xs:string" minOccurs="0"/>
+                               <xs:element name="LowerLayers" type="xs:string" minOccurs="0"/>
+                               <xs:element name="MaxBitRate" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+                       <xs:attribute name="index" type="dmsIndex" use="required"/>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="Link">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="Alias" type="xs:string" minOccurs="0"/>
+                               <xs:element name="Enable" type="xs:string" minOccurs="0"/>
+                               <xs:element name="LowerLayers" type="xs:string" minOccurs="0"/>
+                               <xs:element name="PriorityTagging" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+                       <xs:attribute name="index" type="dmsIndex" use="required"/>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="VLANTermination">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="Alias" type="xs:string" minOccurs="0"/>
+                               <xs:element name="Enable" type="xs:string" minOccurs="0"/>
+                               <xs:element name="LowerLayers" type="xs:string" minOccurs="0"/>
+                               <xs:element name="VLANID" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+                       <xs:attribute name="index" type="dmsIndex" use="required"/>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="FAP">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element ref="GPS" minOccurs="0"/>
+                               <xs:element ref="PerfMgmt" minOccurs="0"/>
+                               <xs:element name="X_0005B9_DasRttDelay" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_EnableDasMode" type="xs:string" minOccurs="0"/>
+                               <xs:element ref="X_0005B9_FileTransfer" minOccurs="0"/>
+                               <xs:element ref="X_0005B9_FileTransfersEnh" minOccurs="0" maxOccurs="unbounded"/>
+                               <xs:element ref="X_0005B9_LogLevelConfiguration" minOccurs="0"/>
+                               <xs:element ref="X_0005B9_Logging" minOccurs="0"/>
+                               <xs:element name="X_0005B9_PlatformManagementEnable" type="xs:string" minOccurs="0"/>
+                               <xs:element ref="X_0005B9_RPLogManagement" minOccurs="0"/>
+                               <xs:element ref="X_0005B9_RU" minOccurs="0" maxOccurs="unbounded"/>
+                               <xs:element name="X_0005B9_RUBlacklisted" type="xs:string" minOccurs="0"/>
+                               <xs:element ref="X_0005B9_RUSoftwareManagement" minOccurs="0"/>
+                               <xs:element name="X_0005B9_RUWhiteList" type="xs:string" minOccurs="0"/>
+                               <xs:element ref="X_0005B9_SlotReservation" minOccurs="0" maxOccurs="unbounded"/>
+                               <xs:element ref="X_0005B9_Trace" minOccurs="0" maxOccurs="unbounded"/>
+                               <xs:element ref="X_0005B9_TraceFileTransfer" minOccurs="0"/>
+                               <xs:element ref="X_0005B9_UserManagement" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+
+               <xs:unique name="uniqueId-X_0005B9_FileTransfersEnh">
+                       <xs:selector xpath="X_0005B9_FileTransfersEnh" />
+                       <xs:field xpath="@index" />
+               </xs:unique>
+               <xs:unique name="uniqueId-X_0005B9_RU">
+                       <xs:selector xpath="X_0005B9_RU" />
+                       <xs:field xpath="@index" />
+               </xs:unique>
+               <xs:unique name="uniqueId-X_0005B9_SlotReservation">
+                       <xs:selector xpath="X_0005B9_SlotReservation" />
+                       <xs:field xpath="@index" />
+               </xs:unique>
+               <xs:unique name="uniqueId-X_0005B9_Trace">
+                       <xs:selector xpath="X_0005B9_Trace" />
+                       <xs:field xpath="@index" />
+               </xs:unique>
+       </xs:element>
+       <xs:element name="GPS">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element ref="AGPSServerConfig" minOccurs="0"/>
+                               <xs:element name="ContinuousGPS" type="xs:string" minOccurs="0"/>
+                               <xs:element ref="ContinuousGPSStatus" minOccurs="0"/>
+                               <xs:element name="GPSReset" type="xs:string" minOccurs="0"/>
+                               <xs:element name="PeriodicInterval" type="xs:string" minOccurs="0"/>
+                               <xs:element name="PeriodicTime" type="xs:string" minOccurs="0"/>
+                               <xs:element name="ScanOnBoot" type="xs:string" minOccurs="0"/>
+                               <xs:element name="ScanPeriodically" type="xs:string" minOccurs="0"/>
+                               <xs:element name="ScanTimeout" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_HoldoverTimeOutDuration" type="xs:string" minOccurs="0"/>
+                               <xs:element ref="X_0005B9_NominalGPS" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="AGPSServerConfig">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="Enable" type="xs:string" minOccurs="0"/>
+                               <xs:element name="Password" type="xs:string" minOccurs="0"/>
+                               <xs:element name="ReferenceLatitude" type="xs:string" minOccurs="0"/>
+                               <xs:element name="ReferenceLongitude" type="xs:string" minOccurs="0"/>
+                               <xs:element name="ServerPort" type="xs:string" minOccurs="0"/>
+                               <xs:element name="ServerURL" type="xs:string" minOccurs="0"/>
+                               <xs:element name="Username" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_aGPSRetryPeriodMax" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="ContinuousGPSStatus">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="FirstFixTimeout" type="xs:string" minOccurs="0"/>
+                               <xs:element name="LockTimeOutDuration" type="xs:string" minOccurs="0"/>
+                               <xs:element name="SatelliteTrackingInterval" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="X_0005B9_NominalGPS">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="Altitude" type="xs:string" minOccurs="0"/>
+                               <xs:element name="Confidence" type="xs:string" minOccurs="0"/>
+                               <xs:element name="DegreesOfLatitude" type="xs:string" minOccurs="0"/>
+                               <xs:element name="DegreesOfLongitude" type="xs:string" minOccurs="0"/>
+                               <xs:element name="DirectionOfAltitude" type="xs:string" minOccurs="0"/>
+                               <xs:element name="LatitudeSign" type="xs:string" minOccurs="0"/>
+                               <xs:element name="OrientationOfMajorAxis" type="xs:string" minOccurs="0"/>
+                               <xs:element name="UncertaintyAltitude" type="xs:string" minOccurs="0"/>
+                               <xs:element name="UncertaintySemiMajor" type="xs:string" minOccurs="0"/>
+                               <xs:element name="UncertaintySemiMinor" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="PerfMgmt">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element ref="Config" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="Config">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="X_0005B9_FileType" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_XMLFormat" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="X_0005B9_FileTransfer">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element ref="FileDetails" minOccurs="0" maxOccurs="unbounded"/>
+                               <xs:element name="HistOMFileWithDebugLog" type="xs:string" minOccurs="0"/>
+                               <xs:element name="Password" type="xs:string" minOccurs="0"/>
+                               <xs:element name="RPOMFileWithDebugLog" type="xs:string" minOccurs="0"/>
+                               <xs:element name="ServerURL" type="xs:string" minOccurs="0"/>
+                               <xs:element name="Username" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+
+               <xs:unique name="uniqueId-FileDetails">
+                       <xs:selector xpath="FileDetails" />
+                       <xs:field xpath="@index" />
+               </xs:unique>
+       </xs:element>
+       <xs:element name="FileDetails">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="Alias" type="xs:string" minOccurs="0"/>
+                               <xs:element name="Enable" type="xs:string" minOccurs="0"/>
+                               <xs:element name="FileName" type="xs:string" minOccurs="0"/>
+                               <xs:element name="IncludeRadioPointLog" type="xs:string" minOccurs="0"/>
+                               <xs:element name="LocationOnServer" type="xs:string" minOccurs="0"/>
+                               <xs:element name="TransferNow" type="xs:string" minOccurs="0"/>
+                               <xs:element name="TransferType" type="xs:string" minOccurs="0"/>
+                               <xs:element name="TransferWindowDuration" type="xs:string" minOccurs="0"/>
+                               <xs:element name="TransferWindowInterval" type="xs:string" minOccurs="0"/>
+                               <xs:element name="TransferWindowStartTime" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+                       <xs:attribute name="index" type="dmsIndex" use="required"/>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="X_0005B9_FileTransfersEnh">
+               <xs:complexType>
+                       <xs:sequence>
+       <xs:element name="FileDetails" minOccurs="0" maxOccurs="unbounded">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="Alias" type="xs:string" minOccurs="0"/>
+                               <xs:element name="Enable" type="xs:string" minOccurs="0"/>
+                               <xs:element name="FileCompressionEnable" type="xs:string" minOccurs="0"/>
+                               <xs:element name="FileCompressionType" type="xs:string" minOccurs="0"/>
+                               <xs:element name="FileName" type="xs:string" minOccurs="0"/>
+                               <xs:element name="IncludeRadioPointLog" type="xs:string" minOccurs="0"/>
+                               <xs:element name="LocationOnServer" type="xs:string" minOccurs="0"/>
+                               <xs:element name="TransferNow" type="xs:string" minOccurs="0"/>
+                               <xs:element name="TransferType" type="xs:string" minOccurs="0"/>
+                               <xs:element name="TransferWindowDuration" type="xs:string" minOccurs="0"/>
+                               <xs:element name="TransferWindowInterval" type="xs:string" minOccurs="0"/>
+                               <xs:element name="TransferWindowStartTime" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+                       <xs:attribute name="index" type="dmsIndex" use="required"/>
+                       </xs:complexType>
+       </xs:element>
+                               <xs:element name="Password" type="xs:string" minOccurs="0"/>
+                               <xs:element name="ServerURL" type="xs:string" minOccurs="0"/>
+                               <xs:element name="Username" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+                       <xs:attribute name="index" type="dmsIndex" use="required"/>
+               </xs:complexType>
+               <xs:unique name="uniqueId-FileDetails1">
+                       <xs:selector xpath="FileDetails" />
+                       <xs:field xpath="@index" />
+               </xs:unique>
+       </xs:element>
+       <xs:element name="X_0005B9_LogLevelConfiguration">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="CUAPP_CURURecvSendT" type="xs:string" minOccurs="0"/>
+                               <xs:element name="DIMClient" type="xs:string" minOccurs="0"/>
+                               <xs:element name="LTEAPP_FAPController" type="xs:string" minOccurs="0"/>
+                               <xs:element name="LTEAPP_FAPManagement" type="xs:string" minOccurs="0"/>
+                               <xs:element name="LTEAPP_L2L3MessagingInterface" type="xs:string" minOccurs="0"/>
+                               <xs:element name="LTEAPP_RRM" type="xs:string" minOccurs="0"/>
+                               <xs:element name="LTEAPP_RRMUEMGR" type="xs:string" minOccurs="0"/>
+                               <xs:element name="LTEAPP_RuMgr" type="xs:string" minOccurs="0"/>
+                               <xs:element name="LTEAPP_SON" type="xs:string" minOccurs="0"/>
+                               <xs:element name="LTEAPP_STACKController" type="xs:string" minOccurs="0"/>
+                               <xs:element name="RRC" type="xs:string" minOccurs="0"/>
+                               <xs:element name="RUAPP_RUDiscoveryConfigClient" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="X_0005B9_Logging">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element ref="SyslogNg" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="SyslogNg">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="EventTypes" type="xs:string" minOccurs="0"/>
+                               <xs:element name="MonitoredInterface" type="xs:string" minOccurs="0"/>
+                               <xs:element name="Port" type="xs:string" minOccurs="0"/>
+                               <xs:element name="Server" type="xs:string" minOccurs="0"/>
+                               <xs:element name="UseIPSecTunnel" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="X_0005B9_RPLogManagement">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="IncludePlatformLog" type="xs:string" minOccurs="0"/>
+                               <xs:element name="TransferLogsToController" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="X_0005B9_RU">
+               <xs:complexType>
+                       <xs:sequence>
+       <xs:element name="Device" minOccurs="0">
+               <xs:complexType>
+                       <xs:sequence>
+       <xs:element name="DeviceInfo" minOccurs="0">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="Alias" type="xs:string" minOccurs="0"/>
+                               <xs:element name="DeviceType" type="xs:string" minOccurs="0"/>
+                               <xs:element name="InstallationType" type="xs:string" minOccurs="0"/>
+                               <xs:element ref="Location" minOccurs="0"/>
+                               <xs:element ref="NGRP" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+                               <xs:element ref="PHY" minOccurs="0"/>
+                               <xs:element ref="RAN" minOccurs="0"/>
+                               <xs:element ref="SlotReservation" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+                               <xs:element name="RUIndex" type="xs:string" minOccurs="0"/>
+                               <xs:element name="Reboot" type="xs:string" minOccurs="0"/>
+                               <xs:element name="Reset" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+                       <xs:attribute name="index" type="dmsIndex" use="required"/>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="Location">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="Altitude" type="xs:string" minOccurs="0"/>
+                               <xs:element name="Confidence" type="xs:string" minOccurs="0"/>
+                               <xs:element name="DataObject" type="xs:string" minOccurs="0"/>
+                               <xs:element name="DegreesOfLatitude" type="xs:string" minOccurs="0"/>
+                               <xs:element name="DegreesOfLongitude" type="xs:string" minOccurs="0"/>
+                               <xs:element name="DirectionOfAltitude" type="xs:string" minOccurs="0"/>
+                               <xs:element name="LatitudeSign" type="xs:string" minOccurs="0"/>
+                               <xs:element name="OrientationOfMajorAxis" type="xs:string" minOccurs="0"/>
+                               <xs:element name="UncertaintyAltitude" type="xs:string" minOccurs="0"/>
+                               <xs:element name="UncertaintySemiMajor" type="xs:string" minOccurs="0"/>
+                               <xs:element name="UncertaintySemiMinor" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="NGRP">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="REBOOT" type="xs:string" minOccurs="0"/>
+                               <xs:element name="RESET" type="xs:string" minOccurs="0"/>
+                               <xs:element name="TimingSource" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="PHY">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element ref="AntennaInfo" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="AntennaInfo">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="AntennaType" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="RAN">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element ref="RF" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="RF">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="RfTxPower" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="SlotReservation">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="AntennaPortNumber" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="X_0005B9_RUSoftwareManagement">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="ApplyImage" type="xs:string" minOccurs="0"/>
+                               <xs:element name="EnableNGRPUpgrade" type="xs:string" minOccurs="0"/>
+                               <xs:element name="FileTransferProtocol" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="X_0005B9_SlotReservation">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="AntennaPortNumber" type="xs:string" minOccurs="0"/>
+                               <xs:element name="PARTNUMBER" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+                       <xs:attribute name="index" type="dmsIndex" use="required"/>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="X_0005B9_Trace">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="UeSpecificTraceEnable" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+                       <xs:attribute name="index" type="dmsIndex" use="required"/>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="X_0005B9_TraceFileTransfer">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="FileUploadPeriodicity" type="xs:string" minOccurs="0"/>
+                               <xs:element name="LocationOnServer" type="xs:string" minOccurs="0"/>
+                               <xs:element name="Password" type="xs:string" minOccurs="0"/>
+                               <xs:element name="ServerPort" type="xs:string" minOccurs="0"/>
+                               <xs:element name="Username" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="X_0005B9_UserManagement">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="ExternalAuthAccess" type="xs:string" minOccurs="0"/>
+                               <xs:element ref="LDAP" minOccurs="0"/>
+                               <xs:element ref="RADIUS" minOccurs="0"/>
+                               <xs:element ref="UserAccount" minOccurs="0" maxOccurs="unbounded"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+
+               <xs:unique name="uniqueId-UserAccount">
+                       <xs:selector xpath="UserAccount" />
+                       <xs:field xpath="@index" />
+               </xs:unique>
+       </xs:element>
+       <xs:element name="LDAP">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="AdminDN" type="xs:string" minOccurs="0"/>
+                               <xs:element name="AdminPassword" type="xs:string" minOccurs="0"/>
+                               <xs:element name="BaseDN" type="xs:string" minOccurs="0"/>
+                               <xs:element name="ConnectionTimeout" type="xs:string" minOccurs="0"/>
+                               <xs:element name="Filter" type="xs:string" minOccurs="0"/>
+                               <xs:element name="Port" type="xs:string" minOccurs="0"/>
+                               <xs:element name="RetryCount" type="xs:string" minOccurs="0"/>
+                               <xs:element name="SASL" type="xs:string" minOccurs="0"/>
+                               <xs:element name="ServerIPAddress" type="xs:string" minOccurs="0"/>
+                               <xs:element name="ServerName" type="xs:string" minOccurs="0"/>
+                               <xs:element name="TLSCertificate" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="RADIUS">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="ConnectionTimeout" type="xs:string" minOccurs="0"/>
+                               <xs:element name="NASIPAddress" type="xs:string" minOccurs="0"/>
+                               <xs:element name="NASIdentifier" type="xs:string" minOccurs="0"/>
+                               <xs:element name="Port" type="xs:string" minOccurs="0"/>
+                               <xs:element name="RetryCount" type="xs:string" minOccurs="0"/>
+                               <xs:element name="ServerIPAddress" type="xs:string" minOccurs="0"/>
+                               <xs:element name="SharedSecretKey" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="UserAccount">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="Alias" type="xs:string" minOccurs="0"/>
+                               <xs:element name="Password" type="xs:string" minOccurs="0"/>
+                               <xs:element name="Privileges" type="xs:string" minOccurs="0"/>
+                               <xs:element name="ResetPassword" type="xs:string" minOccurs="0"/>
+                               <xs:element name="Status" type="xs:string" minOccurs="0"/>
+                               <xs:element name="UserName" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+                       <xs:attribute name="index" type="dmsIndex" use="required"/>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="FaultMgmt">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element ref="CurrentAlarm" minOccurs="0" maxOccurs="unbounded"/>
+                               <xs:element ref="ExpeditedEvent" minOccurs="0" maxOccurs="unbounded"/>
+                               <xs:element ref="HistoryEvent" minOccurs="0" maxOccurs="unbounded"/>
+                               <xs:element ref="SupportedAlarm" minOccurs="0" maxOccurs="unbounded"/>
+                               <xs:element name="X_0005B9_SendTestAlarm" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+
+               <xs:unique name="uniqueId-CurrentAlarm">
+                       <xs:selector xpath="CurrentAlarm" />
+                       <xs:field xpath="@index" />
+               </xs:unique>
+               <xs:unique name="uniqueId-ExpeditedEvent">
+                       <xs:selector xpath="ExpeditedEvent" />
+                       <xs:field xpath="@index" />
+               </xs:unique>
+               <xs:unique name="uniqueId-HistoryEvent">
+                       <xs:selector xpath="HistoryEvent" />
+                       <xs:field xpath="@index" />
+               </xs:unique>
+               <xs:unique name="uniqueId-SupportedAlarm">
+                       <xs:selector xpath="SupportedAlarm" />
+                       <xs:field xpath="@index" />
+               </xs:unique>
+       </xs:element>
+       <xs:element name="CurrentAlarm">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="CurrentAlarmIndex" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+                       <xs:attribute name="index" type="dmsIndex" use="required"/>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="ExpeditedEvent">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="ExpediteAlarmIndex" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+                       <xs:attribute name="index" type="dmsIndex" use="required"/>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="HistoryEvent">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="HistoryAlarmIndex" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+                       <xs:attribute name="index" type="dmsIndex" use="required"/>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="SupportedAlarm">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="ReportingMechanism" type="xs:string" minOccurs="0"/>
+                               <xs:element name="SupportedAlarmIndex" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+                       <xs:attribute name="index" type="dmsIndex" use="required"/>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="IP">
+               <xs:complexType>
+                       <xs:sequence>
+       <xs:element name="Interface" minOccurs="0" maxOccurs="unbounded">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="Alias" type="xs:string" minOccurs="0"/>
+                               <xs:element name="AutoIPEnable" type="xs:string" minOccurs="0"/>
+                               <xs:element name="Enable" type="xs:string" minOccurs="0"/>
+                               <xs:element ref="IPv4Address" minOccurs="0" maxOccurs="unbounded"/>
+                               <xs:element name="IPv4Enable" type="xs:string" minOccurs="0"/>
+                               <xs:element ref="IPv6Address" minOccurs="0" maxOccurs="unbounded"/>
+                               <xs:element name="IPv6Enable" type="xs:string" minOccurs="0"/>
+                               <xs:element ref="IPv6Prefix" minOccurs="0" maxOccurs="unbounded"/>
+                               <xs:element name="Loopback" type="xs:string" minOccurs="0"/>
+                               <xs:element name="MaxMTUSize" type="xs:string" minOccurs="0"/>
+                               <xs:element name="Reset" type="xs:string" minOccurs="0"/>
+                               <xs:element name="Router" type="xs:string" minOccurs="0"/>
+                               <xs:element name="ULAEnable" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+                       <xs:attribute name="index" type="dmsIndex" use="required"/>
+                       </xs:complexType>
+       </xs:element>
+
+                       </xs:sequence>
+               </xs:complexType>
+
+               <xs:unique name="uniqueId-Interface1">
+                       <xs:selector xpath="Interface" />
+                       <xs:field xpath="@index" />
+               </xs:unique>
+               <xs:unique name="uniqueId-IPv4Address">
+                       <xs:selector xpath="IPv4Address" />
+                       <xs:field xpath="@index" />
+               </xs:unique>
+               <xs:unique name="uniqueId-IPv6Address">
+                       <xs:selector xpath="IPv6Address" />
+                       <xs:field xpath="@index" />
+               </xs:unique>
+               <xs:unique name="uniqueId-IPv6Prefix">
+                       <xs:selector xpath="IPv6Prefix" />
+                       <xs:field xpath="@index" />
+               </xs:unique>
+       </xs:element>
+       <xs:element name="IPv4Address">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="AddressingType" type="xs:string" minOccurs="0"/>
+                               <xs:element name="Alias" type="xs:string" minOccurs="0"/>
+                               <xs:element name="Enable" type="xs:string" minOccurs="0"/>
+                               <xs:element name="IPAddress" type="xs:string" minOccurs="0"/>
+                               <xs:element name="SubnetMask" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_DNS" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+                       <xs:attribute name="index" type="dmsIndex" use="required"/>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="IPv6Address">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="Alias" type="xs:string" minOccurs="0"/>
+                               <xs:element name="Anycast" type="xs:string" minOccurs="0"/>
+                               <xs:element name="Enable" type="xs:string" minOccurs="0"/>
+                               <xs:element name="IPAddress" type="xs:string" minOccurs="0"/>
+                               <xs:element name="Origin" type="xs:string" minOccurs="0"/>
+                               <xs:element name="PreferredLifetime" type="xs:string" minOccurs="0"/>
+                               <xs:element name="Prefix" type="xs:string" minOccurs="0"/>
+                               <xs:element name="ValidLifetime" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_DNS" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_Prefix" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+                       <xs:attribute name="index" type="dmsIndex" use="required"/>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="IPv6Prefix">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="Alias" type="xs:string" minOccurs="0"/>
+                               <xs:element name="ChildPrefixBits" type="xs:string" minOccurs="0"/>
+                               <xs:element name="Origin" type="xs:string" minOccurs="0"/>
+                               <xs:element name="ParentPrefix" type="xs:string" minOccurs="0"/>
+                               <xs:element name="PreferredLifetime" type="xs:string" minOccurs="0"/>
+                               <xs:element name="Prefix" type="xs:string" minOccurs="0"/>
+                               <xs:element name="StaticType" type="xs:string" minOccurs="0"/>
+                               <xs:element name="ValidLifetime" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+                       <xs:attribute name="index" type="dmsIndex" use="required"/>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="IPsec">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="Enable" type="xs:string" minOccurs="0"/>
+                               <xs:element ref="Filter" minOccurs="0" maxOccurs="unbounded"/>
+                               <xs:element ref="IKEv2SA" minOccurs="0" maxOccurs="unbounded"/>
+                               <xs:element ref="LogLevel" minOccurs="0"/>
+                               <xs:element ref="Profile" minOccurs="0" maxOccurs="unbounded"/>
+                               <xs:element ref="Tunnel" minOccurs="0" maxOccurs="unbounded"/>
+                               <xs:element name="X_0005B9_ExcludeCP" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_IgnoreBasicConstraint" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+
+               <xs:unique name="uniqueId-Filter">
+                       <xs:selector xpath="Filter" />
+                       <xs:field xpath="@index" />
+               </xs:unique>
+               <xs:unique name="uniqueId-IKEv2SA">
+                       <xs:selector xpath="IKEv2SA" />
+                       <xs:field xpath="@index" />
+               </xs:unique>
+               <xs:unique name="uniqueId-Profile">
+                       <xs:selector xpath="Profile" />
+                       <xs:field xpath="@index" />
+               </xs:unique>
+               <xs:unique name="uniqueId-Tunnel">
+                       <xs:selector xpath="Tunnel" />
+                       <xs:field xpath="@index" />
+               </xs:unique>
+       </xs:element>
+       <xs:element name="Filter">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="Alias" type="xs:string" minOccurs="0"/>
+                               <xs:element name="AllInterfaces" type="xs:string" minOccurs="0"/>
+                               <xs:element name="Interface" type="xs:string" minOccurs="0"/>
+                               <xs:element name="Order" type="xs:string" minOccurs="0"/>
+                               <xs:element name="Profile" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+                       <xs:attribute name="index" type="dmsIndex" use="required"/>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="IKEv2SA">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="Alias" type="xs:string" minOccurs="0"/>
+                               <xs:element ref="ChildSA" minOccurs="0" maxOccurs="unbounded"/>
+
+                       </xs:sequence>
+                       <xs:attribute name="index" type="dmsIndex" use="required"/>
+               </xs:complexType>
+               <xs:unique name="uniqueId-ChildSA">
+                       <xs:selector xpath="ChildSA" />
+                       <xs:field xpath="@index" />
+               </xs:unique>
+       </xs:element>
+       <xs:element name="ChildSA">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="Alias" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+                       <xs:attribute name="index" type="dmsIndex" use="required"/>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="LogLevel">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="X_0005B9_cfg" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_chd" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_dmn" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_enc" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_ike" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_knl" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_lib" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_mgr" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_net" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="Profile">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="AHAllowedIntegrityAlgorithms" type="xs:string" minOccurs="0"/>
+                               <xs:element name="Alias" type="xs:string" minOccurs="0"/>
+                               <xs:element name="AntiReplayWindowSize" type="xs:string" minOccurs="0"/>
+                               <xs:element name="ChildSATimeLimit" type="xs:string" minOccurs="0"/>
+                               <xs:element name="ChildSATrafficLimit" type="xs:string" minOccurs="0"/>
+                               <xs:element name="DSCPMarkPolicy" type="xs:string" minOccurs="0"/>
+                               <xs:element name="DoNotFragment" type="xs:string" minOccurs="0"/>
+                               <xs:element name="ESPAllowedEncryptionAlgorithms" type="xs:string" minOccurs="0"/>
+                               <xs:element name="ESPAllowedIntegrityAlgorithms" type="xs:string" minOccurs="0"/>
+                               <xs:element name="IKEv2AllowedDiffieHellmanGroupTransforms" type="xs:string" minOccurs="0"/>
+                               <xs:element name="IKEv2AllowedEncryptionAlgorithms" type="xs:string" minOccurs="0"/>
+                               <xs:element name="IKEv2AllowedIntegrityAlgorithms" type="xs:string" minOccurs="0"/>
+                               <xs:element name="IKEv2AllowedPseudoRandomFunctions" type="xs:string" minOccurs="0"/>
+                               <xs:element name="IKEv2AuthenticationMethod" type="xs:string" minOccurs="0"/>
+                               <xs:element name="IKEv2DeadPeerDetectionTimeout" type="xs:string" minOccurs="0"/>
+                               <xs:element name="IKEv2NATTKeepaliveTimeout" type="xs:string" minOccurs="0"/>
+                               <xs:element name="IKEv2SATimeLimit" type="xs:string" minOccurs="0"/>
+                               <xs:element name="MaxChildSAs" type="xs:string" minOccurs="0"/>
+                               <xs:element name="Protocol" type="xs:string" minOccurs="0"/>
+                               <xs:element name="RemoteEndpoints" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_IKEv2RekeyMargin" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_IPsec_IKERetryCount" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_IPsec_IKERetryTimeOut" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_IPsec_IKETunnelBounce" type="xs:string" minOccurs="0"/>
+                               <xs:element name="gtpFragmentation" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+                       <xs:attribute name="index" type="dmsIndex" use="required"/>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="Tunnel">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="Alias" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+                       <xs:attribute name="index" type="dmsIndex" use="required"/>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="ManagementServer">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="ConnectionRequestPassword" type="xs:string" minOccurs="0"/>
+                               <xs:element name="ConnectionRequestUsername" type="xs:string" minOccurs="0"/>
+                               <xs:element name="Password" type="xs:string" minOccurs="0"/>
+                               <xs:element name="PeriodicInformEnable" type="xs:string" minOccurs="0"/>
+                               <xs:element name="PeriodicInformInterval" type="xs:string" minOccurs="0"/>
+                               <xs:element name="PeriodicInformTime" type="xs:string" minOccurs="0"/>
+                               <xs:element name="URL" type="xs:string" minOccurs="0"/>
+                               <xs:element name="UpgradesManaged" type="xs:string" minOccurs="0"/>
+                               <xs:element name="Username" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="NeighborDiscovery">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="Enable" type="xs:string" minOccurs="0"/>
+                               <xs:element ref="InterfaceSetting" minOccurs="0" maxOccurs="unbounded"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+
+               <xs:unique name="uniqueId-InterfaceSetting">
+                       <xs:selector xpath="InterfaceSetting" />
+                       <xs:field xpath="@index" />
+               </xs:unique>
+       </xs:element>
+       <xs:element name="InterfaceSetting">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="Alias" type="xs:string" minOccurs="0"/>
+                               <xs:element name="Enable" type="xs:string" minOccurs="0"/>
+                               <xs:element name="Interface" type="xs:string" minOccurs="0"/>
+                               <xs:element name="MaxRtrSolicitations" type="xs:string" minOccurs="0"/>
+                               <xs:element name="NUDEnable" type="xs:string" minOccurs="0"/>
+                               <xs:element name="RSEnable" type="xs:string" minOccurs="0"/>
+                               <xs:element name="RetransTimer" type="xs:string" minOccurs="0"/>
+                               <xs:element name="RtrSolicitationInterval" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+                       <xs:attribute name="index" type="dmsIndex" use="required"/>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="PeriodicStatistics">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element ref="SampleSet" minOccurs="0" maxOccurs="unbounded"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+
+               <xs:unique name="uniqueId-SampleSet">
+                       <xs:selector xpath="SampleSet" />
+                       <xs:field xpath="@index" />
+               </xs:unique>
+       </xs:element>
+       <xs:element name="SampleSet">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="SampleInterval" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+                       <xs:attribute name="index" type="dmsIndex" use="required"/>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="QoS">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element ref="Classification" minOccurs="0" maxOccurs="unbounded"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+
+               <xs:unique name="uniqueId-Classification">
+                       <xs:selector xpath="Classification" />
+                       <xs:field xpath="@index" />
+               </xs:unique>
+       </xs:element>
+       <xs:element name="Classification">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="DSCPMark" type="xs:string" minOccurs="0"/>
+                               <xs:element name="Protocol" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+                       <xs:attribute name="index" type="dmsIndex" use="required"/>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="Security">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element ref="Certificate" minOccurs="0" maxOccurs="unbounded"/>
+                               <xs:element ref="X_0005B9_CMPv2" minOccurs="0"/>
+                               <xs:element ref="X_0005B9_WebGUI" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+
+               <xs:unique name="uniqueId-Certificate">
+                       <xs:selector xpath="Certificate" />
+                       <xs:field xpath="@index" />
+               </xs:unique>
+       </xs:element>
+       <xs:element name="Certificate">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="CertIndex" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+                       <xs:attribute name="index" type="dmsIndex" use="required"/>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="X_0005B9_CMPv2">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="CAServer" type="xs:string" minOccurs="0"/>
+                               <xs:element name="Port" type="xs:string" minOccurs="0"/>
+                               <xs:element name="RenewBefore" type="xs:string" minOccurs="0"/>
+                               <xs:element name="SecGWServer" type="xs:string" minOccurs="0"/>
+                               <xs:element name="URI" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="X_0005B9_WebGUI">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="ResetAdminUserPassword" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="Services">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element ref="FAPService" minOccurs="0" maxOccurs="2"/>
+                               <xs:element ref="VoiceService" minOccurs="0" maxOccurs="2"/>
+                               <xs:element name="X_0005B9_FNEnable" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_MOCNEnable" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_nRrc4CatM1" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_numSectorsPerBC" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="FAPService">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element ref="AccessMgmt" minOccurs="0"/>
+                               <xs:element ref="Capabilities" minOccurs="0"/>
+                               <xs:element ref="CellConfig" minOccurs="0"/>
+                               <xs:element ref="FAPControl" minOccurs="0"/>
+                               <xs:element ref="REM" minOccurs="0"/>
+                               <xs:element ref="Transport" minOccurs="0"/>
+                               <xs:element ref="X_0005B9_AutoConfig" minOccurs="0"/>
+                               <xs:element ref="X_0005B9_AutoTxPower" minOccurs="0"/>
+                               <xs:element ref="X_0005B9_ExpressREM" minOccurs="0"/>
+                               <xs:element ref="X_0005B9_LTE" minOccurs="0"/>
+
+                       </xs:sequence>
+                       <xs:attribute name="index" type="dmsIndex" use="required"/>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="AccessMgmt">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element ref="LTE" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="LTE">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="AccessMode" type="xs:string" minOccurs="0"/>
+                               <xs:element name="CSGID" type="xs:string" minOccurs="0"/>
+                               <xs:element name="HNBName" type="xs:string" minOccurs="0"/>
+                               <xs:element name="MaxCSGMembers" type="xs:string" minOccurs="0"/>
+                               <xs:element name="MaxNonCSGMembers" type="xs:string" minOccurs="0"/>
+                               <xs:element name="MaxResourceNonCSGMembers" type="xs:string" minOccurs="0"/>
+                               <xs:element name="MaxUEsServed" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="Capabilities">
+               <xs:complexType>
+                       <xs:sequence>
+       <xs:element name="LTE" minOccurs="0">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="X_0005B9_MaxNumX2" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="CellConfig">
+               <xs:complexType>
+                       <xs:sequence>
+       <xs:element name="LTE" minOccurs="0">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element ref="EPC" minOccurs="0"/>
+       <xs:element name="RAN" minOccurs="0">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element ref="CellRestriction" minOccurs="0"/>
+                               <xs:element ref="Common" minOccurs="0"/>
+                               <xs:element ref="MAC" minOccurs="0"/>
+                               <xs:element ref="Mobility" minOccurs="0"/>
+                               <xs:element ref="NeighborList" minOccurs="0"/>
+                               <xs:element ref="NeighborListInUse" minOccurs="0"/>
+       <xs:element name="PHY" minOccurs="0">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element ref="PDSCH" minOccurs="0"/>
+                               <xs:element ref="PRACH" minOccurs="0"/>
+                               <xs:element ref="PUCCH" minOccurs="0"/>
+                               <xs:element ref="PUSCH" minOccurs="0"/>
+                               <xs:element ref="SRS" minOccurs="0"/>
+                               <xs:element ref="ULPowerControl" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="RF" minOccurs="0">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="DLBandwidth" type="xs:string" minOccurs="0"/>
+                               <xs:element name="EARFCNDL" type="xs:string" minOccurs="0"/>
+                               <xs:element name="EARFCNUL" type="xs:string" minOccurs="0"/>
+                               <xs:element name="FreqBandIndicator" type="xs:string" minOccurs="0"/>
+                               <xs:element name="PBCHPowerOffset" type="xs:string" minOccurs="0"/>
+                               <xs:element name="PSCHPowerOffset" type="xs:string" minOccurs="0"/>
+                               <xs:element name="PhyCellID" type="xs:string" minOccurs="0"/>
+                               <xs:element name="ReferenceSignalPower" type="xs:string" minOccurs="0"/>
+                               <xs:element name="SSCHPowerOffset" type="xs:string" minOccurs="0"/>
+                               <xs:element name="ULBandwidth" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_Imargin" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_Imax" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_MaxTxPower" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+                               <xs:element ref="RLC" minOccurs="0"/>
+                               <xs:element ref="RRCTimers" minOccurs="0"/>
+                               <xs:element ref="S1AP" minOccurs="0"/>
+                               <xs:element ref="S1U" minOccurs="0"/>
+                               <xs:element ref="X_0005B9_X2AP_CE" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+                               <xs:element ref="X_0005B9_CE" minOccurs="0"/>
+                               <xs:element ref="X_0005B9_CarrierAggregation" minOccurs="0"/>
+                               <xs:element ref="X_0005B9_RrcConnection" minOccurs="0"/>
+                               <xs:element ref="X_0005B9_RrcConnectionRejection" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="EPC">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="AllowedCipheringAlgorithmList" type="xs:string" minOccurs="0"/>
+                               <xs:element name="AllowedIntegrityProtectionAlgorithmList" type="xs:string" minOccurs="0"/>
+                               <xs:element name="EAID" type="xs:string" minOccurs="0"/>
+                               <xs:element ref="PLMNList" minOccurs="0" maxOccurs="unbounded"/>
+       <xs:element name="QoS" minOccurs="0" maxOccurs="unbounded">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="Enable" type="xs:string" minOccurs="0"/>
+                               <xs:element name="PacketelayBudget" type="xs:string" minOccurs="0"/>
+                               <xs:element name="Priority" type="xs:string" minOccurs="0"/>
+                               <xs:element name="QCI" type="xs:string" minOccurs="0"/>
+                               <xs:element name="Type" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_DSCP" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_DeltaBundle" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_PacketLossRate" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_RLCMode" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_RTPBundle" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_SPSPeriodDL" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_SPSPeriodUL" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+                       <xs:attribute name="index" type="dmsIndex" use="required"/>
+                       </xs:complexType>
+       </xs:element>
+                               <xs:element name="TAC" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_MaxConcurrentCMASBroadcasts" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_PWSMode" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+
+               <xs:unique name="uniqueId-PLMNList">
+                       <xs:selector xpath="PLMNList" />
+                       <xs:field xpath="@index" />
+               </xs:unique>
+               <xs:unique name="uniqueId-QoS">
+                       <xs:selector xpath="QoS" />
+                       <xs:field xpath="@index" />
+               </xs:unique>
+       </xs:element>
+       <xs:element name="PLMNList">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="Alias" type="xs:string" minOccurs="0"/>
+                               <xs:element name="CellReservedForOperatorUse" type="xs:string" minOccurs="0"/>
+                               <xs:element name="Enable" type="xs:string" minOccurs="0"/>
+                               <xs:element name="IsPrimary" type="xs:string" minOccurs="0"/>
+                               <xs:element name="PLMNID" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_BarringForEmergency" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_BarringSkipForMMTELVideo" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_BarringSkipForMMTELVoice" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_BarringSkipForSMS" type="xs:string" minOccurs="0"/>
+                               <xs:element ref="X_0005B9_ImpendingOverload" minOccurs="0"/>
+                               <xs:element name="X_0005B9_MODataBarringFactor" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_MODataBarringForSpecialAC" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_MODataBarringTime" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_MOSigBarringFactor" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_MOSigBarringForSpecialAC" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_MOSigBarringTime" type="xs:string" minOccurs="0"/>
+                               <xs:element ref="X_0005B9_NormalLoad" minOccurs="0"/>
+                               <xs:element ref="X_0005B9_Overload" minOccurs="0"/>
+                               <xs:element name="X_0005B9_PLMNListIndex" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_Type" type="xs:string" minOccurs="0"/>
+                               <xs:element ref="X_0005B9_WarningLoadLvl" minOccurs="0"/>
+
+                       </xs:sequence>
+                       <xs:attribute name="index" type="dmsIndex" use="required"/>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="X_0005B9_ImpendingOverload">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="acBarringFactor" type="xs:string" minOccurs="0"/>
+                               <xs:element name="acBarringForSpecialAC" type="xs:string" minOccurs="0"/>
+                               <xs:element name="acBarringTime" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="X_0005B9_NormalLoad">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="acBarringFactor" type="xs:string" minOccurs="0"/>
+                               <xs:element name="acBarringForSpecialAC" type="xs:string" minOccurs="0"/>
+                               <xs:element name="acBarringTime" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="X_0005B9_Overload">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="acBarringFactor" type="xs:string" minOccurs="0"/>
+                               <xs:element name="acBarringForSpecialAC" type="xs:string" minOccurs="0"/>
+                               <xs:element name="acBarringTime" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="X_0005B9_WarningLoadLvl">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="acBarringFactor" type="xs:string" minOccurs="0"/>
+                               <xs:element name="acBarringForSpecialAC" type="xs:string" minOccurs="0"/>
+                               <xs:element name="acBarringTime" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="CellRestriction">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="BarringForEmergency" type="xs:string" minOccurs="0"/>
+                               <xs:element name="CellBarred" type="xs:string" minOccurs="0"/>
+                               <xs:element name="CellReservedForOperatorUse" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_AccBarStaticEnable" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_AutoACBEnable" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_BarringSkipForMMTELVideo" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_BarringSkipForMMTELVoice" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_BarringSkipForSMS" type="xs:string" minOccurs="0"/>
+       <xs:element name="X_0005B9_ImpendingOverload" minOccurs="0">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="ACBarringFactor" type="xs:string" minOccurs="0"/>
+                               <xs:element name="ACBarringForSpecialAC" type="xs:string" minOccurs="0"/>
+                               <xs:element name="ACBarringTime" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+                               <xs:element ref="X_0005B9_L3_ImpendingOverload" minOccurs="0"/>
+                               <xs:element ref="X_0005B9_L3_OK" minOccurs="0"/>
+                               <xs:element ref="X_0005B9_L3_Overload" minOccurs="0"/>
+                               <xs:element ref="X_0005B9_L3_Warning" minOccurs="0"/>
+                               <xs:element name="X_0005B9_MODataBarringFactor" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_MODataBarringForSpecialAC" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_MODataBarringTime" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_MOSigBarringFactor" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_MOSigBarringForSpecialAC" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_MOSigBarringTime" type="xs:string" minOccurs="0"/>
+       <xs:element name="X_0005B9_NormalLoad" minOccurs="0">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="ACBarringFactor" type="xs:string" minOccurs="0"/>
+                               <xs:element name="ACBarringForSpecialAC" type="xs:string" minOccurs="0"/>
+                               <xs:element name="ACBarringTime" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="X_0005B9_Overload" minOccurs="0">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="ACBarringFactor" type="xs:string" minOccurs="0"/>
+                               <xs:element name="ACBarringForSpecialAC" type="xs:string" minOccurs="0"/>
+                               <xs:element name="ACBarringTime" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="X_0005B9_WarningLoadLvl" minOccurs="0">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="ACBarringFactor" type="xs:string" minOccurs="0"/>
+                               <xs:element name="ACBarringForSpecialAC" type="xs:string" minOccurs="0"/>
+                               <xs:element name="ACBarringTime" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+                               <xs:element name="X_0005B9_cellLock" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_guardTimer" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="X_0005B9_L3_ImpendingOverload">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="MaxS1PagesPerRRCPage" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="X_0005B9_L3_OK">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="MaxS1PagesPerRRCPage" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="X_0005B9_L3_Overload">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="MaxS1PagesPerRRCPage" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="X_0005B9_L3_Warning">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="MaxS1PagesPerRRCPage" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="Common">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="CellIdentity" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_CellMode" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_CellName" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="MAC">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element ref="DRX" minOccurs="0"/>
+                               <xs:element ref="RACH" minOccurs="0"/>
+                               <xs:element ref="ULSCH" minOccurs="0"/>
+                               <xs:element name="X_0005B9_DlMssClampVal" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_DynDciCQIThreshDl" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_DynDciCQIThreshUl" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_GratUlDciTimer" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_GtpMtu" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_HighCQIAggLevelDl" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_HighCQIAggLevelUl" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_LowCQIAggLevelDl" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_LowCQIAggLevelUl" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_MacSuspendEnbRlfEnabled" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_MaxCcchMsgRetx" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_MaxDLUePerTTI" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_MaxGbrBearers" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_MaxGbrDLUePerTTI" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_MaxGbrDlBitsPerSec" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_MaxGbrULUePerTTI" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_MaxGbrUlBitsPerSec" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_MaxHarqReTxDl" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_MaxNumCzvRp" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_MaxULUePerTTI" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_MinCzvThreshold" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_MssClampEnabled" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_PriorityMetricMethod" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_PucchPrbReserved" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_QCI6MinDlBitsPerSec" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_QCI6MinUlBitsPerSec" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_ReuseInterferenceThreshold" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_SingleLayerCLSMEnabled" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_UlMssClampVal" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="DRX">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="DRXEnabled" type="xs:string" minOccurs="0"/>
+                               <xs:element name="DRXInactivityTimer" type="xs:string" minOccurs="0"/>
+                               <xs:element name="DRXRetransmissionTimer" type="xs:string" minOccurs="0"/>
+                               <xs:element name="DRXShortCycleTimer" type="xs:string" minOccurs="0"/>
+                               <xs:element name="DRXStartOffset" type="xs:string" minOccurs="0"/>
+                               <xs:element name="LongDRXCycle" type="xs:string" minOccurs="0"/>
+                               <xs:element name="OnDurationTimer" type="xs:string" minOccurs="0"/>
+                               <xs:element name="ShortDRXCycle" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_maxDrxUe" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="RACH">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="ContentionResolutionTimer" type="xs:string" minOccurs="0"/>
+                               <xs:element name="MaxHARQMsg3Tx" type="xs:string" minOccurs="0"/>
+                               <xs:element name="MessagePowerOffsetGroupB" type="xs:string" minOccurs="0"/>
+                               <xs:element name="MessageSizeGroupA" type="xs:string" minOccurs="0"/>
+                               <xs:element name="NumberOfRaPreambles" type="xs:string" minOccurs="0"/>
+                               <xs:element name="PowerRampingStep" type="xs:string" minOccurs="0"/>
+                               <xs:element name="PreambleInitialReceivedTargetPower" type="xs:string" minOccurs="0"/>
+                               <xs:element name="PreambleTransMax" type="xs:string" minOccurs="0"/>
+                               <xs:element name="ResponseWindowSize" type="xs:string" minOccurs="0"/>
+                               <xs:element name="SizeOfRaGroupA" type="xs:string" minOccurs="0"/>
+       <xs:element name="X_0005B9_CE" minOccurs="0">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="PreambleTransMax" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+                               <xs:element ref="X_0005B9_CE0" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="X_0005B9_CE0">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="ContentionResolutionTimer" type="xs:string" minOccurs="0"/>
+                               <xs:element name="ResponseWindowSize" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="ULSCH">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="X_0005B9_qci1MaxHARQ-Tx" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="Mobility">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element ref="ConnMode" minOccurs="0"/>
+                               <xs:element ref="IdleMode" minOccurs="0"/>
+                               <xs:element name="X_0005B9_csfbMeasWaitTime" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_csfbPrefRat" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_iRatPsRedirection" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="ConnMode">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element ref="EUTRA" minOccurs="0"/>
+                               <xs:element ref="IRAT" minOccurs="0"/>
+                               <xs:element name="X_0005B9_HOBlackListEnabled" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_InterFreqHandOffEnable" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_IntraFreqHandOffEnable" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_RSRPThreshold" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_RSRQThreshold" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="EUTRA">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="A1ThresholdRSRP" type="xs:string" minOccurs="0"/>
+                               <xs:element name="A1ThresholdRSRQ" type="xs:string" minOccurs="0"/>
+                               <xs:element name="A2ThresholdRSRP" type="xs:string" minOccurs="0"/>
+                               <xs:element name="A2ThresholdRSRQ" type="xs:string" minOccurs="0"/>
+                               <xs:element name="A3Offset" type="xs:string" minOccurs="0"/>
+                               <xs:element name="A5Threshold1RSRP" type="xs:string" minOccurs="0"/>
+                               <xs:element name="A5Threshold1RSRQ" type="xs:string" minOccurs="0"/>
+                               <xs:element name="A5Threshold2RSRP" type="xs:string" minOccurs="0"/>
+                               <xs:element name="A5Threshold2RSRQ" type="xs:string" minOccurs="0"/>
+                               <xs:element name="FilterCoefficientRSRP" type="xs:string" minOccurs="0"/>
+                               <xs:element name="FilterCoefficientRSRQ" type="xs:string" minOccurs="0"/>
+                               <xs:element name="Hysteresis" type="xs:string" minOccurs="0"/>
+                               <xs:element name="ReportAmount" type="xs:string" minOccurs="0"/>
+                               <xs:element name="ReportInterval" type="xs:string" minOccurs="0"/>
+                               <xs:element name="ReportOnLeave" type="xs:string" minOccurs="0"/>
+                               <xs:element name="ReportQuantity" type="xs:string" minOccurs="0"/>
+                               <xs:element name="TimeToTrigger" type="xs:string" minOccurs="0"/>
+                               <xs:element name="TriggerQuantity" type="xs:string" minOccurs="0"/>
+       <xs:element name="X_0005B9_CE" minOccurs="0">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="A3Offset" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="IRAT">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="B1ThresholdUTRAEcN0" type="xs:string" minOccurs="0"/>
+                               <xs:element name="B1ThresholdUTRARSCP" type="xs:string" minOccurs="0"/>
+                               <xs:element name="B2Threshold1RSRP" type="xs:string" minOccurs="0"/>
+                               <xs:element name="B2Threshold1RSRQ" type="xs:string" minOccurs="0"/>
+                               <xs:element name="B2Threshold2UTRAEcN0" type="xs:string" minOccurs="0"/>
+                               <xs:element name="B2Threshold2UTRARSCP" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="IdleMode">
+               <xs:complexType>
+                       <xs:sequence>
+       <xs:element name="Common" minOccurs="0">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="NCellChangeHigh" type="xs:string" minOccurs="0"/>
+                               <xs:element name="NCellChangeMedium" type="xs:string" minOccurs="0"/>
+                               <xs:element name="QHystSFHigh" type="xs:string" minOccurs="0"/>
+                               <xs:element name="QHystSFMedium" type="xs:string" minOccurs="0"/>
+                               <xs:element name="Qhyst" type="xs:string" minOccurs="0"/>
+                               <xs:element name="THystNormal" type="xs:string" minOccurs="0"/>
+                               <xs:element name="Tevaluation" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="IRAT" minOccurs="0">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element ref="CDMA2000" minOccurs="0"/>
+                               <xs:element ref="GERAN" minOccurs="0"/>
+                               <xs:element ref="UTRA" minOccurs="0"/>
+                               <xs:element name="X_0005B9_CSFBMODE" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_CSFBRATTYPE" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_EmergencyExcessFactor" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_cSFBDUALReceiveENABLE" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+                               <xs:element ref="InterFreq" minOccurs="0"/>
+                               <xs:element ref="IntraFreq" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="CDMA2000">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element ref="CDMA2000Band" minOccurs="0" maxOccurs="unbounded"/>
+                               <xs:element name="SearchWindowSize" type="xs:string" minOccurs="0"/>
+                               <xs:element name="TReselectionCDMA2000" type="xs:string" minOccurs="0"/>
+                               <xs:element name="TReselectionCDMA2000SFHigh" type="xs:string" minOccurs="0"/>
+                               <xs:element name="TReselectionCDMA2000SFMedium" type="xs:string" minOccurs="0"/>
+                               <xs:element ref="X_0005B9_CellParam" minOccurs="0"/>
+                               <xs:element ref="X_0005B9_Mobility_SIB8_Parameters" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+
+               <xs:unique name="uniqueId-CDMA2000Band">
+                       <xs:selector xpath="CDMA2000Band" />
+                       <xs:field xpath="@index" />
+               </xs:unique>
+       </xs:element>
+       <xs:element name="CDMA2000Band">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="Alias" type="xs:string" minOccurs="0"/>
+                               <xs:element name="BandClass" type="xs:string" minOccurs="0"/>
+                               <xs:element name="CellReselectionPriority" type="xs:string" minOccurs="0"/>
+                               <xs:element name="Enable" type="xs:string" minOccurs="0"/>
+                               <xs:element name="ThreshXHigh" type="xs:string" minOccurs="0"/>
+                               <xs:element name="ThreshXLow" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_Index" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+                       <xs:attribute name="index" type="dmsIndex" use="required"/>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="X_0005B9_CellParam">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="ReferenceCellID" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="X_0005B9_Mobility_SIB8_Parameters">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="Auth" type="xs:string" minOccurs="0"/>
+                               <xs:element name="ForeignNidReg" type="xs:string" minOccurs="0"/>
+                               <xs:element name="ForeignSidReg" type="xs:string" minOccurs="0"/>
+                               <xs:element name="HomeReg" type="xs:string" minOccurs="0"/>
+                               <xs:element name="IMSI1112" type="xs:string" minOccurs="0"/>
+                               <xs:element name="ImsiTSupported" type="xs:string" minOccurs="0"/>
+                               <xs:element name="MCC" type="xs:string" minOccurs="0"/>
+                               <xs:element name="MaxNumAltSO" type="xs:string" minOccurs="0"/>
+                               <xs:element name="MultipleNid" type="xs:string" minOccurs="0"/>
+                               <xs:element name="MultipleSid" type="xs:string" minOccurs="0"/>
+                               <xs:element name="Nid" type="xs:string" minOccurs="0"/>
+                               <xs:element name="PacketZoneId" type="xs:string" minOccurs="0"/>
+                               <xs:element name="ParameReg" type="xs:string" minOccurs="0"/>
+                               <xs:element name="PowerDownReg" type="xs:string" minOccurs="0"/>
+                               <xs:element name="PowerUpReg" type="xs:string" minOccurs="0"/>
+                               <xs:element name="PrefMSIDType" type="xs:string" minOccurs="0"/>
+                               <xs:element name="RegPrd" type="xs:string" minOccurs="0"/>
+                               <xs:element name="RegZone" type="xs:string" minOccurs="0"/>
+                               <xs:element name="Sid" type="xs:string" minOccurs="0"/>
+                               <xs:element name="TotalZone" type="xs:string" minOccurs="0"/>
+                               <xs:element name="ZoneTimer" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="GERAN">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element ref="GERANFreqGroup" minOccurs="0" maxOccurs="unbounded"/>
+                               <xs:element name="t-ReselectionGERAN" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+
+               <xs:unique name="uniqueId-GERANFreqGroup">
+                       <xs:selector xpath="GERANFreqGroup" />
+                       <xs:field xpath="@index" />
+               </xs:unique>
+       </xs:element>
+       <xs:element name="GERANFreqGroup">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="Alias" type="xs:string" minOccurs="0"/>
+                               <xs:element name="BCCHARFCN" type="xs:string" minOccurs="0"/>
+                               <xs:element name="BandIndicator" type="xs:string" minOccurs="0"/>
+                               <xs:element name="CellReselectionPriority" type="xs:string" minOccurs="0"/>
+                               <xs:element name="Enable" type="xs:string" minOccurs="0"/>
+                               <xs:element name="QRxLevMin" type="xs:string" minOccurs="0"/>
+                               <xs:element name="ThreshXHigh" type="xs:string" minOccurs="0"/>
+                               <xs:element name="ThreshXLow" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_Index" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+                       <xs:attribute name="index" type="dmsIndex" use="required"/>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="UTRA">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="TReselectionUTRA" type="xs:string" minOccurs="0"/>
+                               <xs:element ref="UTRANFDDFreq" minOccurs="0" maxOccurs="unbounded"/>
+                               <xs:element name="X_0005B9_threshXHighQr9SIB6" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_threshXLowQr9SIB6" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+
+               <xs:unique name="uniqueId-UTRANFDDFreq">
+                       <xs:selector xpath="UTRANFDDFreq" />
+                       <xs:field xpath="@index" />
+               </xs:unique>
+       </xs:element>
+       <xs:element name="UTRANFDDFreq">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="Alias" type="xs:string" minOccurs="0"/>
+                               <xs:element name="CellReselectionPriority" type="xs:string" minOccurs="0"/>
+                               <xs:element name="Enable" type="xs:string" minOccurs="0"/>
+                               <xs:element name="PMaxUTRA" type="xs:string" minOccurs="0"/>
+                               <xs:element name="QQualMin" type="xs:string" minOccurs="0"/>
+                               <xs:element name="QRxLevMin" type="xs:string" minOccurs="0"/>
+                               <xs:element name="ThreshXHigh" type="xs:string" minOccurs="0"/>
+                               <xs:element name="ThreshXLow" type="xs:string" minOccurs="0"/>
+                               <xs:element name="UTRACarrierARFCN" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_Index" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+                       <xs:attribute name="index" type="dmsIndex" use="required"/>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="InterFreq">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element ref="Carrier" minOccurs="0" maxOccurs="unbounded"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+
+               <xs:unique name="uniqueId-Carrier">
+                       <xs:selector xpath="Carrier" />
+                       <xs:field xpath="@index" />
+               </xs:unique>
+       </xs:element>
+       <xs:element name="Carrier">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="Alias" type="xs:string" minOccurs="0"/>
+                               <xs:element name="CellReselectionPriority" type="xs:string" minOccurs="0"/>
+                               <xs:element name="EUTRACarrierARFCN" type="xs:string" minOccurs="0"/>
+                               <xs:element name="Enable" type="xs:string" minOccurs="0"/>
+                               <xs:element name="Pmax" type="xs:string" minOccurs="0"/>
+                               <xs:element name="QOffsetFreq" type="xs:string" minOccurs="0"/>
+                               <xs:element name="QRxLevMinSIB5" type="xs:string" minOccurs="0"/>
+                               <xs:element name="TReselectionEUTRA" type="xs:string" minOccurs="0"/>
+                               <xs:element name="TReselectionEUTRASFHigh" type="xs:string" minOccurs="0"/>
+                               <xs:element name="TReselectionEUTRASFMedium" type="xs:string" minOccurs="0"/>
+                               <xs:element name="ThreshXHigh" type="xs:string" minOccurs="0"/>
+                               <xs:element name="ThreshXLow" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_MultiBandInfoList" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_ThreshXHighQr9SIB5" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_ThreshXLowQr9SIB5" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_qQualMinSIB5" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+                       <xs:attribute name="index" type="dmsIndex" use="required"/>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="IntraFreq">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="CellReselectionPriority" type="xs:string" minOccurs="0"/>
+                               <xs:element name="Pmax" type="xs:string" minOccurs="0"/>
+                               <xs:element name="QRxLevMinOffset" type="xs:string" minOccurs="0"/>
+                               <xs:element name="QRxLevMinSIB1" type="xs:string" minOccurs="0"/>
+                               <xs:element name="QRxLevMinSIB3" type="xs:string" minOccurs="0"/>
+                               <xs:element name="SIntraSearch" type="xs:string" minOccurs="0"/>
+                               <xs:element name="SNonIntraSearch" type="xs:string" minOccurs="0"/>
+                               <xs:element name="TReselectionEUTRA" type="xs:string" minOccurs="0"/>
+                               <xs:element name="TReselectionEUTRASFHigh" type="xs:string" minOccurs="0"/>
+                               <xs:element name="TReselectionEUTRASFMedium" type="xs:string" minOccurs="0"/>
+                               <xs:element name="ThreshServingLow" type="xs:string" minOccurs="0"/>
+       <xs:element name="X_0005B9_CE" minOccurs="0">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="QRxLevMinSIB1" type="xs:string" minOccurs="0"/>
+                               <xs:element name="QRxLevMinSIB3" type="xs:string" minOccurs="0"/>
+                               <xs:element name="qQualMinRSRQSIB1" type="xs:string" minOccurs="0"/>
+                               <xs:element name="qQualMinRSRQSIB3" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+                               <xs:element name="X_0005B9_IntraFreqReselectionSIB1" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_allowedMeasurementBandwidthSIB3" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_neighCellConfigSIB3" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_pMaxSIB3" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_presenceAntennaPort1SIB3" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_qQualMinOffsetr9SIB1" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_qQualMinSIB3" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_qQualMinr9SIB1" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_sIntraSearch_Pr9SIB3" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_sIntraSearch_Qr9SIB3" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_snonIntraSearch_Pr9SIB3" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_snonIntraSearch_Qr9SIB3" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_thresholdServingLowQSIB3" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="NeighborList">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element ref="InterRATCell" minOccurs="0"/>
+                               <xs:element ref="LTECell" minOccurs="0" maxOccurs="unbounded"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+
+               <xs:unique name="uniqueId-LTECell">
+                       <xs:selector xpath="LTECell" />
+                       <xs:field xpath="@index" />
+               </xs:unique>
+       </xs:element>
+       <xs:element name="InterRATCell">
+               <xs:complexType>
+                       <xs:sequence>
+       <xs:element name="CDMA2000" minOccurs="0" maxOccurs="unbounded">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="ARFCN" type="xs:string" minOccurs="0"/>
+                               <xs:element name="Alias" type="xs:string" minOccurs="0"/>
+                               <xs:element name="BandClass" type="xs:string" minOccurs="0"/>
+                               <xs:element name="CID" type="xs:string" minOccurs="0"/>
+                               <xs:element name="Enable" type="xs:string" minOccurs="0"/>
+                               <xs:element name="MustInclude" type="xs:string" minOccurs="0"/>
+                               <xs:element name="PNOffset" type="xs:string" minOccurs="0"/>
+                               <xs:element name="Type" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_FpcFchInitSetptRc3" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_Index" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_MinProtocolRevLevel" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_PilotInc" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_ProtocolRevLevel" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+                       <xs:attribute name="index" type="dmsIndex" use="required"/>
+                       </xs:complexType>
+       </xs:element>
+
+                       </xs:sequence>
+               </xs:complexType>
+
+               <xs:unique name="uniqueId-CDMA2000">
+                       <xs:selector xpath="CDMA2000" />
+                       <xs:field xpath="@index" />
+               </xs:unique>
+       </xs:element>
+       <xs:element name="LTECell">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="Alias" type="xs:string" minOccurs="0"/>
+                               <xs:element name="Blacklisted" type="xs:string" minOccurs="0"/>
+                               <xs:element name="CID" type="xs:string" minOccurs="0"/>
+                               <xs:element name="CIO" type="xs:string" minOccurs="0"/>
+                               <xs:element name="EUTRACarrierARFCN" type="xs:string" minOccurs="0"/>
+                               <xs:element name="Enable" type="xs:string" minOccurs="0"/>
+                               <xs:element name="MustInclude" type="xs:string" minOccurs="0"/>
+                               <xs:element name="PLMNID" type="xs:string" minOccurs="0"/>
+                               <xs:element name="PhyCellID" type="xs:string" minOccurs="0"/>
+                               <xs:element name="Qoffset" type="xs:string" minOccurs="0"/>
+                               <xs:element name="RSTxPower" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_CSGIdentity" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_CSGIndication" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_FreqBandIndicatorPriority" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_LBPartner" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_LTECellNeighborListIndex" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_MFBICapable" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_MultiBandInfoList" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_TAC" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_X2LinkEnable" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+                       <xs:attribute name="index" type="dmsIndex" use="required"/>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="NeighborListInUse">
+               <xs:complexType>
+                       <xs:sequence>
+       <xs:element name="InterRATCell" minOccurs="0">
+               <xs:complexType>
+                       <xs:sequence>
+       <xs:element name="CDMA2000" minOccurs="0" maxOccurs="unbounded">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="NLInUseCDMA2000Index" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+                       <xs:attribute name="index" type="dmsIndex" use="required"/>
+                       </xs:complexType>
+       </xs:element>
+                               <xs:element ref="GSM" minOccurs="0" maxOccurs="unbounded"/>
+                               <xs:element ref="UMTS" minOccurs="0" maxOccurs="unbounded"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="LTECell" minOccurs="0" maxOccurs="unbounded">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="NeighborListInUseCellIndex" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+                       <xs:attribute name="index" type="dmsIndex" use="required"/>
+                       </xs:complexType>
+       </xs:element>
+
+                       </xs:sequence>
+               </xs:complexType>
+
+               <xs:unique name="uniqueId-CDMA20001">
+                       <xs:selector xpath="CDMA2000" />
+                       <xs:field xpath="@index" />
+               </xs:unique>
+               <xs:unique name="uniqueId-GSM">
+                       <xs:selector xpath="GSM" />
+                       <xs:field xpath="@index" />
+               </xs:unique>
+               <xs:unique name="uniqueId-UMTS">
+                       <xs:selector xpath="UMTS" />
+                       <xs:field xpath="@index" />
+               </xs:unique>
+               <xs:unique name="uniqueId-LTECell1">
+                       <xs:selector xpath="LTECell" />
+                       <xs:field xpath="@index" />
+               </xs:unique>
+       </xs:element>
+       <xs:element name="GSM">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="NLInUseGSMIndex" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+                       <xs:attribute name="index" type="dmsIndex" use="required"/>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="UMTS">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="NLInUseUMTSIndex" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+                       <xs:attribute name="index" type="dmsIndex" use="required"/>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="PDSCH">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="Pa" type="xs:string" minOccurs="0"/>
+                               <xs:element name="Pb" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="PRACH">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="ConfigurationIndex" type="xs:string" minOccurs="0"/>
+                               <xs:element name="FreqOffset" type="xs:string" minOccurs="0"/>
+                               <xs:element name="RootSequenceIndex" type="xs:string" minOccurs="0"/>
+       <xs:element name="X_0005B9_CE" minOccurs="0">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="ConfigIndex" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+                               <xs:element name="ZeroCorrelationZoneConfig" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="PUCCH">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="CQIPUCCHResourceIndex" type="xs:string" minOccurs="0"/>
+                               <xs:element name="DeltaPUCCHShift" type="xs:string" minOccurs="0"/>
+                               <xs:element name="DynamicSRsupport" type="xs:string" minOccurs="0"/>
+                               <xs:element name="N1PUCCHAN" type="xs:string" minOccurs="0"/>
+                               <xs:element name="NRBCQI" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_DummyDci0Allocation" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_DummyDci0Thr" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="PUSCH">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element ref="ULRS" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="ULRS">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="SequenceHoppingEnabled" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="SRS">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="AckNackSRSSimultaneousTransmission" type="xs:string" minOccurs="0"/>
+                               <xs:element name="SRSBandwidthConfig" type="xs:string" minOccurs="0"/>
+                               <xs:element name="SRSEnabled" type="xs:string" minOccurs="0"/>
+                               <xs:element name="SRSMaxUpPTS" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="ULPowerControl">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="Alpha" type="xs:string" minOccurs="0"/>
+                               <xs:element name="P0NominalPUCCH" type="xs:string" minOccurs="0"/>
+                               <xs:element name="P0NominalPUSCH" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="RLC">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element ref="DRB" minOccurs="0"/>
+                               <xs:element ref="SRB1" minOccurs="0"/>
+                               <xs:element ref="SRB2" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="DRB">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="MaxRetxThreshold" type="xs:string" minOccurs="0"/>
+                               <xs:element name="TPollRetransmit" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="SRB1">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="DefaultConfiguration" type="xs:string" minOccurs="0"/>
+                               <xs:element name="MaxRetxThreshold" type="xs:string" minOccurs="0"/>
+                               <xs:element name="PollByte" type="xs:string" minOccurs="0"/>
+                               <xs:element name="PollPDU" type="xs:string" minOccurs="0"/>
+                               <xs:element name="TPollRetransmit" type="xs:string" minOccurs="0"/>
+                               <xs:element name="TReordering" type="xs:string" minOccurs="0"/>
+                               <xs:element name="TStatusProhibit" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="SRB2">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="DefaultConfiguration" type="xs:string" minOccurs="0"/>
+                               <xs:element name="MaxRetxThreshold" type="xs:string" minOccurs="0"/>
+                               <xs:element name="PollByte" type="xs:string" minOccurs="0"/>
+                               <xs:element name="PollPDU" type="xs:string" minOccurs="0"/>
+                               <xs:element name="TPollRetransmit" type="xs:string" minOccurs="0"/>
+                               <xs:element name="TReordering" type="xs:string" minOccurs="0"/>
+                               <xs:element name="TStatusProhibit" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="RRCTimers">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="N310" type="xs:string" minOccurs="0"/>
+                               <xs:element name="N311" type="xs:string" minOccurs="0"/>
+                               <xs:element name="T300" type="xs:string" minOccurs="0"/>
+                               <xs:element name="T301" type="xs:string" minOccurs="0"/>
+                               <xs:element name="T302" type="xs:string" minOccurs="0"/>
+                               <xs:element name="T304EUTRA" type="xs:string" minOccurs="0"/>
+                               <xs:element name="T304IRAT" type="xs:string" minOccurs="0"/>
+                               <xs:element name="T310" type="xs:string" minOccurs="0"/>
+                               <xs:element name="T311" type="xs:string" minOccurs="0"/>
+                               <xs:element name="T320" type="xs:string" minOccurs="0"/>
+       <xs:element name="X_0005B9_CE" minOccurs="0">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="T300" type="xs:string" minOccurs="0"/>
+                               <xs:element name="T301" type="xs:string" minOccurs="0"/>
+                               <xs:element name="T304EUTRA" type="xs:string" minOccurs="0"/>
+                               <xs:element name="T310" type="xs:string" minOccurs="0"/>
+                               <xs:element name="T311" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+                               <xs:element name="X_0005B9_RLFWaitForReestTimer" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="S1AP">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="TRelocOverall" type="xs:string" minOccurs="0"/>
+                               <xs:element name="TRelocPrep" type="xs:string" minOccurs="0"/>
+       <xs:element name="X_0005B9_CE" minOccurs="0">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="TRelocOverall" type="xs:string" minOccurs="0"/>
+                               <xs:element name="TRelocPrep" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+                               <xs:element name="X_0005B9_eNBName" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="S1U">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="GTPUEchoInterval" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="X_0005B9_X2AP_CE">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="TRelocOverall" type="xs:string" minOccurs="0"/>
+                               <xs:element name="TRelocPrep" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="X_0005B9_CE">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="eDRXAllowed" type="xs:string" minOccurs="0"/>
+                               <xs:element name="numSib1BrRep" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="X_0005B9_CarrierAggregation">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="CaLoadBalance" type="xs:string" minOccurs="0"/>
+                               <xs:element name="CaUeThr" type="xs:string" minOccurs="0"/>
+                               <xs:element name="DlQloadLowCount" type="xs:string" minOccurs="0"/>
+                               <xs:element name="DlQloadLowThreshold" type="xs:string" minOccurs="0"/>
+                               <xs:element name="McsScc" type="xs:string" minOccurs="0"/>
+                               <xs:element name="PccCaThr" type="xs:string" minOccurs="0"/>
+                               <xs:element name="QloadCaLimitInstances" type="xs:string" minOccurs="0"/>
+                               <xs:element name="SccA2ThreshRSRP" type="xs:string" minOccurs="0"/>
+                               <xs:element name="SccA2ThreshRSRQ" type="xs:string" minOccurs="0"/>
+                               <xs:element name="SccA4ThreshRSRP" type="xs:string" minOccurs="0"/>
+                               <xs:element name="SccA4ThreshRSRQ" type="xs:string" minOccurs="0"/>
+                               <xs:element name="SccColocatedPairTime" type="xs:string" minOccurs="0"/>
+                               <xs:element name="SccCqiLowCount" type="xs:string" minOccurs="0"/>
+                               <xs:element name="SccCqiLowThesh" type="xs:string" minOccurs="0"/>
+                               <xs:element name="SccCqiStaleTime" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="X_0005B9_RrcConnection">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="NRrcCC" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="X_0005B9_RrcConnectionRejection">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="deprioritisationTime" type="xs:string" minOccurs="0"/>
+                               <xs:element name="deprioritisationType" type="xs:string" minOccurs="0"/>
+                               <xs:element name="waitTime" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="FAPControl">
+               <xs:complexType>
+                       <xs:sequence>
+       <xs:element name="LTE" minOccurs="0">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="AdminState" type="xs:string" minOccurs="0"/>
+                               <xs:element ref="Gateway" minOccurs="0"/>
+                               <xs:element name="PMConfig" type="xs:string" minOccurs="0"/>
+       <xs:element name="X_0005B9_CE" minOccurs="0">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="DefaultPagingCycle" type="xs:string" minOccurs="0"/>
+                               <xs:element name="siRepetitionPattern" type="xs:string" minOccurs="0"/>
+                               <xs:element name="siValidityTime" type="xs:string" minOccurs="0"/>
+                               <xs:element name="siWindowLength" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+                               <xs:element name="X_0005B9_CatM1Enable" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_DefaultPagingCycle" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_EmergencyErabARP" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_Enable4X4MIMO" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_EnableDL256QAM" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_EnableDlReuse" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_EnableUL64QAM" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_EnableUlReuse" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_IdleLoadBalance" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_InactivityTimer" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_MCPTTEnable" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_MFBISupport" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_MultiBandInfoList" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_ReuseFactorDl" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_ReuseFactorUl" type="xs:string" minOccurs="0"/>
+                               <xs:element ref="X_0005B9_SelfConfig" minOccurs="0"/>
+                               <xs:element name="X_0005B9_UnequalTxPower" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_X2Enable" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_downlinkCaEnable" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_explicitlyReleaseAfter" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_maxSPSDL" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_maxSPSUL" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_maxSirThr" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_minSirThr" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_numConfiguredSPSProcess" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_numRpInMaxQsv" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_spsMcsOverride" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+                               <xs:element name="SelfConfigEvents" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="Gateway">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="S1ConnectionMode" type="xs:string" minOccurs="0"/>
+                               <xs:element name="S1SigLinkPort" type="xs:string" minOccurs="0"/>
+                               <xs:element name="S1SigLinkServerList" type="xs:string" minOccurs="0"/>
+                               <xs:element name="SecGWServer1" type="xs:string" minOccurs="0"/>
+                               <xs:element name="SecGWServer2" type="xs:string" minOccurs="0"/>
+                               <xs:element name="SecGWServer3" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_EnableDUALTunnel" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_S1apGaurdPeriod" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_SecGW2Server1" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_SecGW2Server2" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_SecGW2Server3" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="X_0005B9_SelfConfig">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="ANRSelfConfigEnable" type="xs:string" minOccurs="0"/>
+                               <xs:element name="AssignSameTAC" type="xs:string" minOccurs="0"/>
+                               <xs:element name="AutoTxPowerEnable" type="xs:string" minOccurs="0"/>
+                               <xs:element name="CellReselectionSelfConfigEnable" type="xs:string" minOccurs="0"/>
+                               <xs:element name="ClearDiscoveredNeighbors" type="xs:string" minOccurs="0"/>
+                               <xs:element name="CrntiHist" type="xs:string" minOccurs="0"/>
+                               <xs:element name="EARFCNDLSelfConfigEnable" type="xs:string" minOccurs="0"/>
+                               <xs:element name="InterFreqMeasSelfConfigEnable" type="xs:string" minOccurs="0"/>
+                               <xs:element name="InterRATMeasSelfConfigEnable" type="xs:string" minOccurs="0"/>
+                               <xs:element name="IntraFreqMeasSelfConfigEnable" type="xs:string" minOccurs="0"/>
+                               <xs:element name="NeighborListSelfConfigEnable" type="xs:string" minOccurs="0"/>
+                               <xs:element name="PciColDetectThr" type="xs:string" minOccurs="0"/>
+                               <xs:element name="PciCollisionDetectFlag" type="xs:string" minOccurs="0"/>
+                               <xs:element name="PhyCellIDSelfConfigEnable" type="xs:string" minOccurs="0"/>
+                               <xs:element name="PmaxSelfConfigEnable" type="xs:string" minOccurs="0"/>
+                               <xs:element name="PreambleRACHTxPwrSelfConfigEnable" type="xs:string" minOccurs="0"/>
+                               <xs:element name="PropotionalRrcSplit" type="xs:string" minOccurs="0"/>
+                               <xs:element name="RSTxPowerSelfConfigEnable" type="xs:string" minOccurs="0"/>
+                               <xs:element name="RootSequenceIndexSelfConfigEnable" type="xs:string" minOccurs="0"/>
+                               <xs:element name="RsiCollisionDetectFlag" type="xs:string" minOccurs="0"/>
+                               <xs:element name="TACPolicy" type="xs:string" minOccurs="0"/>
+                               <xs:element name="TACSelfConfigEnable" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X2TriggeredPciReconfigAllowed" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="REM">
+               <xs:complexType>
+                       <xs:sequence>
+       <xs:element name="LTE" minOccurs="0">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element ref="Cell" minOccurs="0" maxOccurs="unbounded"/>
+                               <xs:element name="EUTRACarrierARFCNDLList" type="xs:string" minOccurs="0"/>
+                               <xs:element name="InServiceHandling" type="xs:string" minOccurs="0"/>
+                               <xs:element name="PeriodicInterval" type="xs:string" minOccurs="0"/>
+                               <xs:element name="PeriodicTime" type="xs:string" minOccurs="0"/>
+                               <xs:element name="REMBandList" type="xs:string" minOccurs="0"/>
+                               <xs:element name="REMPLMNList" type="xs:string" minOccurs="0"/>
+                               <xs:element name="ScanOnBoot" type="xs:string" minOccurs="0"/>
+                               <xs:element name="ScanPeriodically" type="xs:string" minOccurs="0"/>
+                               <xs:element name="ScanTimeout" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="UMTS" minOccurs="0">
+               <xs:complexType>
+                       <xs:sequence>
+       <xs:element name="GSM" minOccurs="0">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="ARFCNList" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+                               <xs:element ref="WCDMA" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="Cell">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="RemLteCellIndex" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+                       <xs:attribute name="index" type="dmsIndex" use="required"/>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="WCDMA">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="UARFCNDLList" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="Transport">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element ref="SCTP" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="SCTP">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="Enable" type="xs:string" minOccurs="0"/>
+                               <xs:element name="HBInterval" type="xs:string" minOccurs="0"/>
+                               <xs:element name="MaxAssociationRetransmits" type="xs:string" minOccurs="0"/>
+                               <xs:element name="MaxInitRetransmits" type="xs:string" minOccurs="0"/>
+                               <xs:element name="MaxPathRetransmits" type="xs:string" minOccurs="0"/>
+                               <xs:element name="RTOInitial" type="xs:string" minOccurs="0"/>
+                               <xs:element name="RTOMax" type="xs:string" minOccurs="0"/>
+                               <xs:element name="RTOMin" type="xs:string" minOccurs="0"/>
+                               <xs:element name="SCTPMTUSize" type="xs:string" minOccurs="0"/>
+                               <xs:element name="SackFrequency" type="xs:string" minOccurs="0"/>
+                               <xs:element name="ValCookieLife" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="X_0005B9_AutoConfig">
+               <xs:complexType>
+                       <xs:sequence>
+       <xs:element name="LTE" minOccurs="0">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="AvgMcsOnDlThresh" type="xs:string" minOccurs="0"/>
+                               <xs:element name="AvgMcsOnUlThresh" type="xs:string" minOccurs="0"/>
+                               <xs:element name="ConnectionDropRateThresh" type="xs:string" minOccurs="0"/>
+                               <xs:element name="EarfcnProgressiveEnable" type="xs:string" minOccurs="0"/>
+                               <xs:element name="EpochCountThresh" type="xs:string" minOccurs="0"/>
+                               <xs:element name="ErabEstablishmentFailureThresh" type="xs:string" minOccurs="0"/>
+                               <xs:element name="FiftyThPercentileMcsDlThresh" type="xs:string" minOccurs="0"/>
+                               <xs:element name="FiftyThPercentileMcsUlThresh" type="xs:string" minOccurs="0"/>
+                               <xs:element name="HoSuccessThresh" type="xs:string" minOccurs="0"/>
+                               <xs:element name="PciProgressiveEnable" type="xs:string" minOccurs="0"/>
+                               <xs:element name="PeriodicInterval" type="xs:string" minOccurs="0"/>
+                               <xs:element name="PeriodicTime" type="xs:string" minOccurs="0"/>
+                               <xs:element name="RachToConnectionThresh" type="xs:string" minOccurs="0"/>
+                               <xs:element name="RsiProgressiveEnable" type="xs:string" minOccurs="0"/>
+                               <xs:element name="RsrpPciThresh" type="xs:string" minOccurs="0"/>
+                               <xs:element name="RssiThresh" type="xs:string" minOccurs="0"/>
+                               <xs:element name="TenThPercentileMcsDlThresh" type="xs:string" minOccurs="0"/>
+                               <xs:element name="TenThPercentileMcsUlThresh" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="X_0005B9_AutoTxPower">
+               <xs:complexType>
+                       <xs:sequence>
+       <xs:element name="LTE" minOccurs="0">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="AutoPowerConfigTimer" type="xs:string" minOccurs="0"/>
+                               <xs:element name="DisablePowerDuration" type="xs:string" minOccurs="0"/>
+                               <xs:element name="HOCountThreshold" type="xs:string" minOccurs="0"/>
+                               <xs:element name="LeakageRateThreshold" type="xs:string" minOccurs="0"/>
+                               <xs:element name="ProcessRLFonRrcConnEst" type="xs:string" minOccurs="0"/>
+                               <xs:element name="RLFRateThreshold" type="xs:string" minOccurs="0"/>
+                               <xs:element name="RRCConnectionThreshold" type="xs:string" minOccurs="0"/>
+                               <xs:element name="RSRPThreshold" type="xs:string" minOccurs="0"/>
+                               <xs:element name="STmsiAge" type="xs:string" minOccurs="0"/>
+                               <xs:element name="Tcritical" type="xs:string" minOccurs="0"/>
+                               <xs:element name="ToggleCountThreshold" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="X_0005B9_ExpressREM">
+               <xs:complexType>
+                       <xs:sequence>
+       <xs:element name="LTE" minOccurs="0">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="Enabled" type="xs:string" minOccurs="0"/>
+                               <xs:element name="NumCarriers" type="xs:string" minOccurs="0"/>
+                               <xs:element name="PCIListLength" type="xs:string" minOccurs="0"/>
+                               <xs:element name="Periodicity" type="xs:string" minOccurs="0"/>
+                               <xs:element name="TimeOut" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="X_0005B9_LTE">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="ANREpochPeriod" type="xs:string" minOccurs="0"/>
+                               <xs:element name="CrntiStartRange" type="xs:string" minOccurs="0"/>
+                               <xs:element name="EARFCNDLInUse" type="xs:string" minOccurs="0"/>
+                               <xs:element name="EARFCNULInUse" type="xs:string" minOccurs="0"/>
+                               <xs:element name="PMReportFormat" type="xs:string" minOccurs="0"/>
+                               <xs:element name="PMaxInUse" type="xs:string" minOccurs="0"/>
+                               <xs:element name="PhyCellIDInUse" type="xs:string" minOccurs="0"/>
+                               <xs:element name="PreambleRACHTxPwrInUse" type="xs:string" minOccurs="0"/>
+                               <xs:element name="RSTxPowerInUse" type="xs:string" minOccurs="0"/>
+                               <xs:element name="RootSequenceIndexInUse" type="xs:string" minOccurs="0"/>
+                               <xs:element name="TACInUse" type="xs:string" minOccurs="0"/>
+                               <xs:element name="TACList" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="VoiceService">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element ref="X_0005B9_VoIP" minOccurs="0"/>
+
+                       </xs:sequence>
+                       <xs:attribute name="index" type="dmsIndex" use="required"/>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="X_0005B9_VoIP">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="EmergencyPolicy" type="xs:string" minOccurs="0"/>
+                               <xs:element name="Enable" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="Time">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="LocalTimeZone" type="xs:string" minOccurs="0"/>
+                               <xs:element name="NTPServer1" type="xs:string" minOccurs="0"/>
+                               <xs:element name="NTPServer2" type="xs:string" minOccurs="0"/>
+                               <xs:element name="NTPServer3" type="xs:string" minOccurs="0"/>
+                               <xs:element name="NTPServer4" type="xs:string" minOccurs="0"/>
+                               <xs:element name="NTPServer5" type="xs:string" minOccurs="0"/>
+                               <xs:element ref="X_0005B9_PTP" minOccurs="0"/>
+                               <xs:element name="X_0005B9_TimeSource" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="X_0005B9_PTP">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="AssymetricDelay" type="xs:string" minOccurs="0"/>
+                               <xs:element name="DomainNumber" type="xs:string" minOccurs="0"/>
+                               <xs:element name="MultiCastIPAddress" type="xs:string" minOccurs="0"/>
+                               <xs:element name="Server" type="xs:string" minOccurs="0"/>
+                               <xs:element name="ServerInUse" type="xs:string" minOccurs="0"/>
+                               <xs:element name="TCID" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="UserInterface">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="X_0005B9_Enable" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="X_0005B9_FHMgmt">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element ref="TrapReceiver" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="TrapReceiver">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="AuthKey" type="xs:string" minOccurs="0"/>
+                               <xs:element name="AuthProtocol" type="xs:string" minOccurs="0"/>
+                               <xs:element name="DMSIPAddressPort" type="xs:string" minOccurs="0"/>
+                               <xs:element name="Enable" type="xs:string" minOccurs="0"/>
+                               <xs:element name="IPAddress" type="xs:string" minOccurs="0"/>
+                               <xs:element name="PrivacyKey" type="xs:string" minOccurs="0"/>
+                               <xs:element name="PrivacyProtocol" type="xs:string" minOccurs="0"/>
+                               <xs:element name="ProcessingRate" type="xs:string" minOccurs="0"/>
+                               <xs:element name="SwitchEngineID" type="xs:string" minOccurs="0"/>
+                               <xs:element name="UserName" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="X_0005B9_IPsec2">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="ExcludeCP" type="xs:string" minOccurs="0"/>
+       <xs:element name="Filter" minOccurs="0" maxOccurs="unbounded">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="Alias" type="xs:string" minOccurs="0"/>
+                               <xs:element name="AllInterfaces" type="xs:string" minOccurs="0"/>
+                               <xs:element name="Interface" type="xs:string" minOccurs="0"/>
+                               <xs:element name="Order" type="xs:string" minOccurs="0"/>
+                               <xs:element name="Profile" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+                       <xs:attribute name="index" type="dmsIndex" use="required"/>
+                       </xs:complexType>
+       </xs:element>
+       <xs:element name="IKEv2SA" minOccurs="0" maxOccurs="unbounded">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="Alias" type="xs:string" minOccurs="0"/>
+       <xs:element name="ChildSA" minOccurs="0" maxOccurs="unbounded">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="Alias" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+                       <xs:attribute name="index" type="dmsIndex" use="required"/>
+                       </xs:complexType>
+       </xs:element>
+
+                       </xs:sequence>
+                       <xs:attribute name="index" type="dmsIndex" use="required"/>
+                       </xs:complexType>
+       </xs:element>
+       <xs:element name="Profile" minOccurs="0" maxOccurs="unbounded">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="AHAllowedIntegrityAlgorithms" type="xs:string" minOccurs="0"/>
+                               <xs:element name="Alias" type="xs:string" minOccurs="0"/>
+                               <xs:element name="AntiReplayWindowSize" type="xs:string" minOccurs="0"/>
+                               <xs:element name="ChildSATimeLimit" type="xs:string" minOccurs="0"/>
+                               <xs:element name="ChildSATrafficLimit" type="xs:string" minOccurs="0"/>
+                               <xs:element name="DSCPMarkPolicy" type="xs:string" minOccurs="0"/>
+                               <xs:element name="DoNotFragment" type="xs:string" minOccurs="0"/>
+                               <xs:element name="ESPAllowedEncryptionAlgorithms" type="xs:string" minOccurs="0"/>
+                               <xs:element name="ESPAllowedIntegrityAlgorithms" type="xs:string" minOccurs="0"/>
+                               <xs:element name="IKEv2AllowedDiffieHellmanGroupTransforms" type="xs:string" minOccurs="0"/>
+                               <xs:element name="IKEv2AllowedEncryptionAlgorithms" type="xs:string" minOccurs="0"/>
+                               <xs:element name="IKEv2AllowedIntegrityAlgorithms" type="xs:string" minOccurs="0"/>
+                               <xs:element name="IKEv2AllowedPseudoRandomFunctions" type="xs:string" minOccurs="0"/>
+                               <xs:element name="IKEv2AuthenticationMethod" type="xs:string" minOccurs="0"/>
+                               <xs:element name="IKEv2DeadPeerDetectionTimeout" type="xs:string" minOccurs="0"/>
+                               <xs:element name="IKEv2NATTKeepaliveTimeout" type="xs:string" minOccurs="0"/>
+                               <xs:element name="IKEv2SATimeLimit" type="xs:string" minOccurs="0"/>
+                               <xs:element name="MaxChildSAs" type="xs:string" minOccurs="0"/>
+                               <xs:element name="Protocol" type="xs:string" minOccurs="0"/>
+                               <xs:element name="RemoteEndpoints" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_IKEv2RekeyMargin" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+                       <xs:attribute name="index" type="dmsIndex" use="required"/>
+                       </xs:complexType>
+       </xs:element>
+
+                       </xs:sequence>
+               </xs:complexType>
+
+               <xs:unique name="uniqueId-Filter1">
+                       <xs:selector xpath="Filter" />
+                       <xs:field xpath="@index" />
+               </xs:unique>
+               <xs:unique name="uniqueId-IKEv2SA1">
+                       <xs:selector xpath="IKEv2SA" />
+                       <xs:field xpath="@index" />
+               </xs:unique>
+               <xs:unique name="uniqueId-ChildSA1">
+                       <xs:selector xpath="ChildSA" />
+                       <xs:field xpath="@index" />
+               </xs:unique>
+               <xs:unique name="uniqueId-Profile1">
+                       <xs:selector xpath="Profile" />
+                       <xs:field xpath="@index" />
+               </xs:unique>
+       </xs:element>
+       <xs:element name="X_0005B9_IPsecCA">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="Enable" type="xs:string" minOccurs="0"/>
+                               <xs:element name="ExcludeCP" type="xs:string" minOccurs="0"/>
+       <xs:element name="Filter" minOccurs="0" maxOccurs="unbounded">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="Alias" type="xs:string" minOccurs="0"/>
+                               <xs:element name="AllInterfaces" type="xs:string" minOccurs="0"/>
+                               <xs:element name="Interface" type="xs:string" minOccurs="0"/>
+                               <xs:element name="Order" type="xs:string" minOccurs="0"/>
+                               <xs:element name="Profile" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+                       <xs:attribute name="index" type="dmsIndex" use="required"/>
+                       </xs:complexType>
+       </xs:element>
+       <xs:element name="IKEv2SA" minOccurs="0" maxOccurs="unbounded">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="Alias" type="xs:string" minOccurs="0"/>
+       <xs:element name="ChildSA" minOccurs="0" maxOccurs="unbounded">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="Alias" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+                       <xs:attribute name="index" type="dmsIndex" use="required"/>
+                       </xs:complexType>
+       </xs:element>
+
+                       </xs:sequence>
+                       <xs:attribute name="index" type="dmsIndex" use="required"/>
+                       </xs:complexType>
+       </xs:element>
+       <xs:element name="Profile" minOccurs="0" maxOccurs="unbounded">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="AHAllowedIntegrityAlgorithms" type="xs:string" minOccurs="0"/>
+                               <xs:element name="Alias" type="xs:string" minOccurs="0"/>
+                               <xs:element name="AntiReplayWindowSize" type="xs:string" minOccurs="0"/>
+                               <xs:element name="ChildSATimeLimit" type="xs:string" minOccurs="0"/>
+                               <xs:element name="ChildSATrafficLimit" type="xs:string" minOccurs="0"/>
+                               <xs:element name="DSCPMarkPolicy" type="xs:string" minOccurs="0"/>
+                               <xs:element name="DoNotFragment" type="xs:string" minOccurs="0"/>
+                               <xs:element name="ESPAllowedEncryptionAlgorithms" type="xs:string" minOccurs="0"/>
+                               <xs:element name="ESPAllowedIntegrityAlgorithms" type="xs:string" minOccurs="0"/>
+                               <xs:element name="IKEv2AllowedDiffieHellmanGroupTransforms" type="xs:string" minOccurs="0"/>
+                               <xs:element name="IKEv2AllowedEncryptionAlgorithms" type="xs:string" minOccurs="0"/>
+                               <xs:element name="IKEv2AllowedIntegrityAlgorithms" type="xs:string" minOccurs="0"/>
+                               <xs:element name="IKEv2AllowedPseudoRandomFunctions" type="xs:string" minOccurs="0"/>
+                               <xs:element name="IKEv2AuthenticationMethod" type="xs:string" minOccurs="0"/>
+                               <xs:element name="IKEv2DeadPeerDetectionTimeout" type="xs:string" minOccurs="0"/>
+                               <xs:element name="IKEv2NATTKeepaliveTimeout" type="xs:string" minOccurs="0"/>
+                               <xs:element name="IKEv2SATimeLimit" type="xs:string" minOccurs="0"/>
+                               <xs:element name="MaxChildSAs" type="xs:string" minOccurs="0"/>
+                               <xs:element name="Protocol" type="xs:string" minOccurs="0"/>
+                               <xs:element name="RemoteEndpoints" type="xs:string" minOccurs="0"/>
+                               <xs:element name="X_0005B9_IKEv2RekeyMargin" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+                       <xs:attribute name="index" type="dmsIndex" use="required"/>
+                       </xs:complexType>
+       </xs:element>
+
+                       </xs:sequence>
+               </xs:complexType>
+
+               <xs:unique name="uniqueId-Filter12">
+                       <xs:selector xpath="Filter" />
+                       <xs:field xpath="@index" />
+               </xs:unique>
+               <xs:unique name="uniqueId-IKEv2SA12">
+                       <xs:selector xpath="IKEv2SA" />
+                       <xs:field xpath="@index" />
+               </xs:unique>
+               <xs:unique name="uniqueId-ChildSA12">
+                       <xs:selector xpath="ChildSA" />
+                       <xs:field xpath="@index" />
+               </xs:unique>
+               <xs:unique name="uniqueId-Profile12">
+                       <xs:selector xpath="Profile" />
+                       <xs:field xpath="@index" />
+               </xs:unique>
+       </xs:element>
+       <xs:element name="X_0005B9_License">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element ref="Licenses" minOccurs="0" maxOccurs="unbounded"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+
+               <xs:unique name="uniqueId-Licenses">
+                       <xs:selector xpath="Licenses" />
+                       <xs:field xpath="@index" />
+               </xs:unique>
+       </xs:element>
+       <xs:element name="Licenses">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="LicenseKeyIndex" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+                       <xs:attribute name="index" type="dmsIndex" use="required"/>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="X_0005B9_MIGRATION">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="Migrate" type="xs:string" minOccurs="0"/>
+                               <xs:element name="Rollback" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+       <xs:element name="X_0005B9_SoftwareManagement">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="ApplyWindowDuration" type="xs:string" minOccurs="0"/>
+                               <xs:element name="ApplyWindowInterval" type="xs:string" minOccurs="0"/>
+                               <xs:element name="ApplyWindowStart" type="xs:string" minOccurs="0"/>
+                               <xs:element name="UpgradeState" type="xs:string" minOccurs="0"/>
+
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+
+       <xs:simpleType name="dmsIndex">
+               <xs:restriction base="xs:integer">
+                       <xs:minInclusive value="1"/>
+                       <xs:pattern value="\d+"/>
+               </xs:restriction>
+       </xs:simpleType>
 </xs:schema>
index 89b8ab9..8b2fe27 100644 (file)
@@ -22,7 +22,7 @@ import java.io.BufferedReader;
 import java.io.FileReader;\r
 import java.io.IOException;\r
 \r
-import org.commscope.tr069adapter.config.dto.ConfigurationData;\r
+import org.commscope.tr069adapter.acs.common.dto.ConfigurationData;\r
 import org.commscope.tr069adapter.config.model.ConfigFileContent;\r
 import org.springframework.web.client.RestTemplate;\r
 \r
diff --git a/config-data/src/test/resources/log4j2.xml b/config-data/src/test/resources/log4j2.xml
new file mode 100644 (file)
index 0000000..bf8803e
--- /dev/null
@@ -0,0 +1,109 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+ * ============LICENSE_START========================================================================
+ * ONAP : tr-069-adapter
+ * =================================================================================================
+ * Copyright (C) 2020 CommScope Inc Intellectual Property.
+ * =================================================================================================
+ * This tr-069-adapter software file is distributed by CommScope Inc
+ * 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
+ *
+ * This file 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.
+ * ===============LICENSE_END=======================================================================
+*/
+-->
+
+<Configuration status="DEBUG" monitorInterval="30">\r
+       <Properties>\r
+               <Property name="LOG_PATTERN">%d{yyyy-MM-dd HH:mm:ss} %m%n</Property>\r
+               <Property name="APP_LOG_ROOT">./target/test-logs</Property>\r
+               <Property name="LOG_FILE_NAME">configurationServiceLogs</Property>\r
+       </Properties>\r
+       <Appenders>\r
+               <Console name="console" target="SYSTEM_OUT" follow="true">\r
+                       <PatternLayout pattern="${LOG_PATTERN}" />\r
+               </Console>\r
+\r
+               <RollingFile name="applicationLog"\r
+                       fileName="${APP_LOG_ROOT}/debug/${LOG_FILE_NAME}-debug.log"\r
+                       filePattern="${APP_LOG_ROOT}/debug/${LOG_FILE_NAME}-debug-%d{yyyy-MM-dd}-%i.log">\r
+                       <PatternLayout>\r
+                               <pattern>[%d{yyyy-MM-dd HH:mm:ss:SSS}] [%X{client}] [%.-40t]\r
+                                       %-25.45c{1} %-5p: %m%n</pattern>\r
+                               <header>Debug Log started at: $${date:yyyy-MM-dd HH:mm:ss}</header>\r
+                       </PatternLayout>\r
+                       <Policies>\r
+                               <SizeBasedTriggeringPolicy size="4MB" />\r
+                               <TimeBasedTriggeringPolicy interval="1"\r
+                                       modulate="true" />\r
+                       </Policies>\r
+                       <DefaultRolloverStrategy>\r
+                               <Delete basePath="${APP_LOG_ROOT}/debug/" maxDepth="1">\r
+                                       <IfFileName glob="application-debug*.log" />\r
+                                       <IfAccumulatedFileCount exceeds="10" />\r
+                               </Delete>\r
+                       </DefaultRolloverStrategy>\r
+               </RollingFile>\r
+\r
+               <RollingFile name="springLog"\r
+                       fileName="${APP_LOG_ROOT}/debug/spring-framework.log" filePattern="${APP_LOG_ROOT}/debug/spring-%d{yyyy-MM-dd}-%i.log">\r
+                       <PatternLayout pattern="${LOG_PATTERN}" />\r
+                       <Policies>\r
+                               <SizeBasedTriggeringPolicy size="4MB" />\r
+                               <TimeBasedTriggeringPolicy interval="1"\r
+                                       modulate="true" />\r
+                       </Policies>\r
+                       <DefaultRolloverStrategy>\r
+                               <Delete basePath="${APP_LOG_ROOT}/debug/" maxDepth="1">\r
+                                       <IfFileName glob="spring*.log" />\r
+                                       <IfAccumulatedFileCount exceeds="10" />\r
+                               </Delete>\r
+                       </DefaultRolloverStrategy>\r
+               </RollingFile>\r
+\r
+               <RollingFile name="hibernateLog" fileName="${APP_LOG_ROOT}/debug/database.log"\r
+                       filePattern="${APP_LOG_ROOT}/debug/database-%d{yyyy-MM-dd}-%i.log">\r
+                       <PatternLayout pattern="${LOG_PATTERN}" />\r
+                       <Policies>\r
+                               <SizeBasedTriggeringPolicy size="4MB" />\r
+                               <TimeBasedTriggeringPolicy interval="1"\r
+                                       modulate="true" />\r
+                       </Policies>\r
+                       <DefaultRolloverStrategy>\r
+                               <Delete basePath="${APP_LOG_ROOT}/debug/" maxDepth="1">\r
+                                       <IfFileName glob="application-debug*.log" />\r
+                                       <IfAccumulatedFileCount exceeds="10" />\r
+                               </Delete>\r
+                       </DefaultRolloverStrategy>\r
+               </RollingFile>\r
+\r
+       </Appenders>\r
+\r
+       <Loggers>\r
+               <Logger name="org.commscope.tr069adapter.config" level="debug"\r
+                       additivity="false">\r
+                       <appender-ref ref="console" />\r
+                       <appender-ref ref="applicationLog" />\r
+               </Logger>\r
+\r
+               <Logger name="org.springframework" level="error" additivity="false">\r
+                       <appender-ref ref="console" />\r
+                       <AppenderRef ref="springLog" />\r
+               </Logger>\r
+\r
+               <Logger name="org.hibernate" level="error" additivity="false">\r
+                       <appender-ref ref="console" />\r
+                       <AppenderRef ref="hibernateLog" />\r
+               </Logger>\r
+\r
+               <Root level="DEBUG" additivity="false" />\r
+       </Loggers>\r
+</Configuration>
index af0d638..a093570 100644 (file)
                   <phase>package</phase>\r
                   <goals>\r
                      <goal>build</goal>\r
-                                <goal>save</goal>\r
+                                        <goal>save</goal>\r
                   </goals>\r
                   <configuration>\r
                      <pullRegistry>${env.CONTAINER_PULL_REGISTRY}</pullRegistry>\r
                      <images>\r
                         <image>\r
-                           <name>${docker.image.name}</name>\r
+                           <name>${docker.image.name}:${build.version}</name>\r
                            <build>\r
                               <cleanup>try</cleanup>\r
                               <contextDir>${basedir}</contextDir>\r
index 424adb3..592c946 100644 (file)
                   <phase>package</phase>\r
                   <goals>\r
                      <goal>build</goal>\r
-                                <goal>save</goal>\r
+                                        <goal>save</goal>\r
                   </goals>\r
                   <configuration>\r
                      <pullRegistry>${env.CONTAINER_PULL_REGISTRY}</pullRegistry>\r
                      <images>\r
                         <image>\r
-                           <name>${docker.image.name}</name>\r
+                           <name>${docker.image.name}:${build.version}</name>\r
                            <build>\r
                               <cleanup>try</cleanup>\r
                               <contextDir>${basedir}</contextDir>\r
index 8865221..e32737d 100644 (file)
 -->\r
 \r
 <Configuration status="DEBUG" monitorInterval="30">\r
-    <Properties>\r
-       <Property name="LOG_PATTERN">%d{yyyy-MM-dd HH:mm:ss} %m%n</Property>\r
-       <Property name="APP_LOG_ROOT">/logs</Property>\r
-       <Property name="LOG_FILE_NAME">factoryDataImportLogs</Property>\r
-    </Properties>\r
-    <Appenders>\r
-       <Console name="console" target="SYSTEM_OUT" follow="true">\r
-               <PatternLayout pattern="${LOG_PATTERN}" />\r
-       </Console>\r
+       <Properties>\r
+               <Property name="LOG_PATTERN">%d{yyyy-MM-dd HH:mm:ss} %m%n</Property>\r
+               <Property name="APP_LOG_ROOT">/logs</Property>\r
+               <Property name="LOG_FILE_NAME">factoryDataImportLogs</Property>\r
+       </Properties>\r
+       <Appenders>\r
+               <Console name="console" target="SYSTEM_OUT" follow="true">\r
+                       <PatternLayout pattern="${LOG_PATTERN}" />\r
+               </Console>\r
 \r
-       <RollingFile name="applicationLog"\r
-               fileName="${APP_LOG_ROOT}/debug/${LOG_FILE_NAME}-debug.log"\r
-               filePattern="${APP_LOG_ROOT}/debug/${LOG_FILE_NAME}-debug-%d{yyyy-MM-dd}-%i.log">\r
-               <PatternLayout>\r
-                       <pattern>[%d{yyyy-MM-dd HH:mm:ss:SSS}] [%X{client}] [%.-40t]\r
-                               %-25.45c{1} %-5p: %m%n</pattern>\r
-                       <header>Debug Log started at: $${date:yyyy-MM-dd HH:mm:ss}</header>\r
-               </PatternLayout>\r
-               <Policies>\r
-                       <SizeBasedTriggeringPolicy size="4MB" />\r
-                       <TimeBasedTriggeringPolicy interval="1"\r
-                               modulate="true" />\r
-               </Policies>\r
-               <DefaultRolloverStrategy max="100" />\r
-       </RollingFile>\r
+               <RollingFile name="applicationLog"\r
+                       fileName="${APP_LOG_ROOT}/debug/${LOG_FILE_NAME}-debug.log"\r
+                       filePattern="${APP_LOG_ROOT}/debug/${LOG_FILE_NAME}-debug-%d{yyyy-MM-dd}-%i.log">\r
+                       <PatternLayout>\r
+                               <pattern>[%d{yyyy-MM-dd HH:mm:ss:SSS}] [%X{client}] [%.-40t]\r
+                                       %-25.45c{1} %-5p: %m%n</pattern>\r
+                               <header>Debug Log started at: $${date:yyyy-MM-dd HH:mm:ss}</header>\r
+                       </PatternLayout>\r
+                       <Policies>\r
+                               <SizeBasedTriggeringPolicy size="4MB" />\r
+                               <TimeBasedTriggeringPolicy interval="1"\r
+                                       modulate="true" />\r
+                       </Policies>\r
+                       <DefaultRolloverStrategy max="100" />\r
+               </RollingFile>\r
 \r
-       <RollingFile name="springLog"\r
-               fileName="${APP_LOG_ROOT}/debug/spring-framework.log" filePattern="${APP_LOG_ROOT}/debug/spring-%d{yyyy-MM-dd}-%i.log">\r
-               <PatternLayout pattern="${LOG_PATTERN}" />\r
-               <Policies>\r
-                       <SizeBasedTriggeringPolicy size="2MB" />\r
-               </Policies>\r
-               <DefaultRolloverStrategy max="100" />\r
-       </RollingFile>\r
+               <RollingFile name="springLog"\r
+                       fileName="${APP_LOG_ROOT}/debug/spring-framework.log" filePattern="${APP_LOG_ROOT}/debug/spring-%d{yyyy-MM-dd}-%i.log">\r
+                       <PatternLayout pattern="${LOG_PATTERN}" />\r
+                       <Policies>\r
+                               <SizeBasedTriggeringPolicy size="2MB" />\r
+                       </Policies>\r
+                       <DefaultRolloverStrategy max="100" />\r
+               </RollingFile>\r
 \r
-    </Appenders>\r
+       </Appenders>\r
 \r
-    <Loggers>\r
-       <Logger name="org.commscope.tr069adapter.factory" level="debug"\r
-               additivity="false">\r
-               <appender-ref ref="console" />\r
-               <appender-ref ref="applicationLog" />\r
-       </Logger>\r
+       <Loggers>\r
+               <Logger name="org.commscope.tr069adapter.factory" level="debug"\r
+                       additivity="false">\r
+                       <appender-ref ref="console" />\r
+                       <appender-ref ref="applicationLog" />\r
+               </Logger>\r
 \r
-       <Logger name="org.springframework" level="error" additivity="false">\r
-               <appender-ref ref="console" />\r
-               <AppenderRef ref="springLog" />\r
-       </Logger>\r
+               <Logger name="org.springframework" level="error" additivity="false">\r
+                       <appender-ref ref="console" />\r
+                       <AppenderRef ref="springLog" />\r
+               </Logger>\r
 \r
-       <Root level="DEBUG" additivity="false" />\r
-    </Loggers>\r
+               <Root level="DEBUG" additivity="false" />\r
+       </Loggers>\r
 </Configuration>\r
diff --git a/factory/src/test/resources/application.properties b/factory/src/test/resources/application.properties
new file mode 100644 (file)
index 0000000..3e7f4ec
--- /dev/null
@@ -0,0 +1,19 @@
+# ============LICENSE_START========================================================================\r
+# ONAP : tr-069-adapter\r
+# =================================================================================================\r
+# Copyright (C) 2020 CommScope Inc Intellectual Property.\r
+# =================================================================================================\r
+# This tr-069-adapter software file is distributed by CommScope Inc\r
+# under the Apache License, Version 2.0 (the "License");\r
+# you may not use this file except in compliance with the License.\r
+# You may obtain a copy of the License at\r
+#\r
+# http://www.apache.org/licenses/LICENSE-2.0\r
+#\r
+# This file is distributed on an "AS IS" BASIS,\r
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+# See the License for the specific language governing permissions and\r
+# limitations under the License.\r
+# ===============LICENSE_END=======================================================================\r
+\r
+server.port=8089\r
diff --git a/factory/src/test/resources/log4j2.xml b/factory/src/test/resources/log4j2.xml
new file mode 100644 (file)
index 0000000..2f6fb35
--- /dev/null
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<!--\r
+/*\r
+ * ============LICENSE_START========================================================================\r
+ * ONAP : tr-069-adapter\r
+ * =================================================================================================\r
+ * Copyright (C) 2020 CommScope Inc Intellectual Property.\r
+ * =================================================================================================\r
+ * This tr-069-adapter software file is distributed by CommScope Inc\r
+ * under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ * http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * This file is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ * ===============LICENSE_END=======================================================================\r
+*/\r
+-->\r
+\r
+<Configuration status="DEBUG" monitorInterval="30">\r
+       <Properties>\r
+               <Property name="LOG_PATTERN">%d{yyyy-MM-dd HH:mm:ss} %m%n</Property>\r
+               <Property name="APP_LOG_ROOT">./target/test-logs</Property>\r
+               <Property name="LOG_FILE_NAME">factoryDataImportLogs</Property>\r
+       </Properties>\r
+       <Appenders>\r
+               <Console name="console" target="SYSTEM_OUT" follow="true">\r
+                       <PatternLayout pattern="${LOG_PATTERN}" />\r
+               </Console>\r
+\r
+               <RollingFile name="applicationLog"\r
+                       fileName="${APP_LOG_ROOT}/debug/${LOG_FILE_NAME}-debug.log"\r
+                       filePattern="${APP_LOG_ROOT}/debug/${LOG_FILE_NAME}-debug-%d{yyyy-MM-dd}-%i.log">\r
+                       <PatternLayout>\r
+                               <pattern>[%d{yyyy-MM-dd HH:mm:ss:SSS}] [%X{client}] [%.-40t]\r
+                                       %-25.45c{1} %-5p: %m%n</pattern>\r
+                               <header>Debug Log started at: $${date:yyyy-MM-dd HH:mm:ss}</header>\r
+                       </PatternLayout>\r
+                       <Policies>\r
+                               <SizeBasedTriggeringPolicy size="4MB" />\r
+                               <TimeBasedTriggeringPolicy interval="1"\r
+                                       modulate="true" />\r
+                       </Policies>\r
+                       <DefaultRolloverStrategy max="100" />\r
+               </RollingFile>\r
+\r
+               <RollingFile name="springLog"\r
+                       fileName="${APP_LOG_ROOT}/debug/spring-framework.log" filePattern="${APP_LOG_ROOT}/debug/spring-%d{yyyy-MM-dd}-%i.log">\r
+                       <PatternLayout pattern="${LOG_PATTERN}" />\r
+                       <Policies>\r
+                               <SizeBasedTriggeringPolicy size="2MB" />\r
+                       </Policies>\r
+                       <DefaultRolloverStrategy max="100" />\r
+               </RollingFile>\r
+\r
+       </Appenders>\r
+\r
+       <Loggers>\r
+               <Logger name="org.commscope.tr069adapter.factory" level="debug"\r
+                       additivity="false">\r
+                       <appender-ref ref="console" />\r
+                       <appender-ref ref="applicationLog" />\r
+               </Logger>\r
+\r
+               <Logger name="org.springframework" level="error" additivity="false">\r
+                       <appender-ref ref="console" />\r
+                       <AppenderRef ref="springLog" />\r
+               </Logger>\r
+\r
+               <Root level="DEBUG" additivity="false" />\r
+       </Loggers>\r
+</Configuration>\r
index 117d847..513522f 100644 (file)
@@ -34,6 +34,10 @@ ENV VES_REST_HOST=tr069adapter-ves-notifier
 ENV VES_REST_PORT=8383\r
 ENV netConfServerPort=17830\r
 ENV netConfServerIP=localhost\r
+ENV DB_SERVICE=tr069adapter-mariadb\r
+ENV DB_NAME=dmsdb\r
+ENV DB_USERNAME=root\r
+ENV DB_PASSWORD=root\r
 \r
 WORKDIR /opt/CSAdapter/\r
 \r
diff --git a/mapper/mapper-schema/CustomYangModelMOmapping.txt b/mapper/mapper-schema/CustomYangModelMOmapping.txt
new file mode 100644 (file)
index 0000000..376585f
--- /dev/null
@@ -0,0 +1,4 @@
+TRMONAME,YANGMONAME,MOTYPE,TRDATATYPE,YANGNAMESPACE\r
+heartbeat.,heartbeat,ScalarObject,object,urn:o-ran:heartbeat-management:1.0\r
+heartbeat.heartbeatPeriod,heartbeat.heartbeatPeriod,Scalar-ReadWrite,unsignedInt\r
+heartbeat.countDownTimer,heartbeat.countDownTimer,Scalar-ReadWrite,unsignedInt
\ No newline at end of file
index e0fad64..cfce5a3 100644 (file)
          <artifactId>acs-common</artifactId>\r
          <version>1.0.0</version>\r
       </dependency>\r
+      <dependency>\r
+               <groupId>org.mariadb.jdbc</groupId>\r
+               <artifactId>mariadb-java-client</artifactId>\r
+       </dependency>\r
+       <dependency>\r
+                       <groupId>org.springframework.boot</groupId>\r
+                       <artifactId>spring-boot-starter-data-jpa</artifactId>\r
+               </dependency>\r
       <dependency>\r
          <groupId>commons-io</groupId>\r
          <artifactId>commons-io</artifactId>\r
          <artifactId>spring-boot-starter-test</artifactId>\r
          <scope>test</scope>\r
       </dependency>\r
+      <dependency>\r
+         <groupId>com.h2database</groupId>\r
+         <artifactId>h2</artifactId>\r
+         <scope>test</scope>\r
+      </dependency>\r
    </dependencies>\r
    <build>\r
       <plugins>\r
                <configFile>${project.parent.basedir}/eclipse-formatter.xml</configFile>\r
             </configuration>\r
             <!-- https://code.revelc.net/formatter-maven-plugin/ use mvn formatter:format \r
-                               spotless:apply process-sources -->\r
+                                       spotless:apply process-sources -->\r
          </plugin>\r
          <plugin>\r
             <groupId>com.diffplug.spotless</groupId>\r
                </java>\r
             </configuration>\r
             <!-- https://github.com/diffplug/spotless/tree/master/plugin-maven use \r
-                               mvn spotless:apply to rewrite source files use mvn spotless:check to validate \r
-                               source files -->\r
+                                       mvn spotless:apply to rewrite source files use mvn spotless:check to validate \r
+                                       source files -->\r
          </plugin>\r
          <plugin>\r
             <groupId>org.apache.maven.plugins</groupId>\r
                      <pullRegistry>${env.CONTAINER_PULL_REGISTRY}</pullRegistry>\r
                      <images>\r
                         <image>\r
-                           <name>${docker.image.name}</name>\r
+                           <name>${docker.image.name}:${build.version}</name>\r
                            <build>\r
                               <cleanup>try</cleanup>\r
                               <contextDir>${basedir}</contextDir>\r
diff --git a/mapper/rpc_set_input.xml b/mapper/rpc_set_input.xml
new file mode 100644 (file)
index 0000000..ddbe4cf
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="m-101">\r
+       <software-download xmlns="urn:o-ran:software-management:1.0">\r
+               <remote-file-path>sftp://root@10.208.224.201/root/vishal/BCRP_OneImage_4.3.00.158.signed.bin</remote-file-path>\r
+               <password>\r
+                       <password>airvana123</password>\r
+               </password>\r
+       </software-download>\r
+</rpc>
\ No newline at end of file
index c3f3a0a..023617a 100644 (file)
@@ -42,6 +42,8 @@ public class MapperConfigProperties {
 \r
   private String alarmMORegex;\r
 \r
+  private String verConfigUri;\r
+\r
   public String getRequesTimeout() {\r
     return requesTimeout;\r
   }\r
@@ -121,4 +123,13 @@ public class MapperConfigProperties {
   public void setAlarmMORegex(String alarmMORegex) {\r
     this.alarmMORegex = alarmMORegex;\r
   }\r
+\r
+  public String getVerConfigUri() {\r
+    return verConfigUri;\r
+  }\r
+\r
+  public void setVerConfigUri(String verConfigUri) {\r
+    this.verConfigUri = verConfigUri;\r
+  }\r
+\r
 }\r
diff --git a/mapper/src/main/java/org/commscope/tr069adapter/mapper/Test.java b/mapper/src/main/java/org/commscope/tr069adapter/mapper/Test.java
new file mode 100644 (file)
index 0000000..65aa033
--- /dev/null
@@ -0,0 +1,42 @@
+package org.commscope.tr069adapter.mapper;\r
+\r
+import java.io.File;\r
+import java.io.IOException;\r
+\r
+import org.apache.commons.io.FileUtils;\r
+import org.commscope.tr069adapter.acs.common.DeviceRPCRequest;\r
+import org.commscope.tr069adapter.acs.common.dto.TR069OperationCode;\r
+import org.commscope.tr069adapter.mapper.util.MOMetaDataUtil;\r
+import org.commscope.tr069adapter.mapper.util.NetconfToTr069MapperUtil;\r
+import org.w3c.dom.Element;\r
+\r
+public class Test {\r
+\r
+  public static final String INDEX_STR = "index";\r
+  public static final String INDEX_REGEX = "[0-9]{1,}";\r
+\r
+  public static void main(String[] args) throws IOException {\r
+    File file = new File("rpc_set_input.xml");\r
+    String requestXML = FileUtils.readFileToString(file, "UTF-8");\r
+\r
+\r
+    StringBuilder buff = new StringBuilder();\r
+    for (int i = 6400; i <= 9600; i++) {\r
+      buff.append(i).append(",");\r
+    }\r
+    System.out.println(buff.toString());\r
+\r
+    MOMetaDataUtil util = new MOMetaDataUtil();\r
+    util.loadMetaData();\r
+    Element el = NetconfToTr069MapperUtil.convertStringToDocument(requestXML);\r
+\r
+    DeviceRPCRequest req = NetconfToTr069MapperUtil.prepareTR069Request("0005B9AAAAA3", el, "rpc",\r
+        TR069OperationCode.GET_PARAMETER_VALUES);\r
+    req.getOpDetails()\r
+        .setParmeters(util.getSupportedChildParameters(req.getOpDetails().getParmeters()));\r
+\r
+    System.out.println(req);\r
+\r
+  }\r
+\r
+}\r
index 693f788..12e2761 100644 (file)
@@ -28,16 +28,23 @@ import org.commscope.tr069adapter.acs.common.ParameterDTO;
 import org.commscope.tr069adapter.acs.common.dto.TR069InformType;\r
 import org.commscope.tr069adapter.acs.common.inform.BootInform;\r
 import org.commscope.tr069adapter.acs.common.inform.BootstrapInform;\r
+import org.commscope.tr069adapter.acs.common.inform.ConnectionRequestInform;\r
 import org.commscope.tr069adapter.acs.common.inform.PeriodicInform;\r
+import org.commscope.tr069adapter.acs.common.inform.TransferCompleteInform;\r
 import org.commscope.tr069adapter.acs.common.inform.ValueChangeInform;\r
 import org.commscope.tr069adapter.mapper.MOMetaData;\r
 import org.commscope.tr069adapter.mapper.MapperConfigProperties;\r
 import org.commscope.tr069adapter.mapper.acs.ACSNotificationHandler;\r
+import org.commscope.tr069adapter.mapper.dao.DeviceOperationsDAO;\r
+import org.commscope.tr069adapter.mapper.entity.DeviceOperationDetails;\r
+import org.commscope.tr069adapter.mapper.model.NetConfNotificationDTO;\r
 import org.commscope.tr069adapter.mapper.model.NetConfServerDetails;\r
 import org.commscope.tr069adapter.mapper.model.NetconfServerManagementError;\r
 import org.commscope.tr069adapter.mapper.netconf.NetConfNotificationSender;\r
 import org.commscope.tr069adapter.mapper.netconf.NetConfServerManager;\r
 import org.commscope.tr069adapter.mapper.sync.SynchronizedRequestHandler;\r
+import org.commscope.tr069adapter.mapper.util.FirwareUpgradeErrorCode;\r
+import org.commscope.tr069adapter.mapper.util.FirwareUpgradeStatus;\r
 import org.commscope.tr069adapter.mapper.util.MOMetaDataUtil;\r
 import org.commscope.tr069adapter.mapper.ves.VESNotificationSender;\r
 import org.slf4j.Logger;\r
@@ -49,6 +56,7 @@ import org.springframework.stereotype.Component;
 public class ACSNotificationHandlerImpl implements ACSNotificationHandler {\r
 \r
   private static final Logger logger = LoggerFactory.getLogger(ACSNotificationHandlerImpl.class);\r
+  private static final String SOFT_MGMT_NS_URI = "urn:o-ran:software-management:1.0";\r
 \r
   @Autowired\r
   SynchronizedRequestHandler syncHandler;\r
@@ -71,6 +79,9 @@ public class ACSNotificationHandlerImpl implements ACSNotificationHandler {
   @Autowired\r
   NetConfServerManager netconfManager;\r
 \r
+  @Autowired\r
+  DeviceOperationsDAO deviceOperDAO;\r
+\r
   @Override\r
   public void handleOperationResponse(DeviceRPCResponse opResult) {\r
     opResult.getOperationResponse().setParameterDTOs(\r
@@ -85,6 +96,18 @@ public class ACSNotificationHandlerImpl implements ACSNotificationHandler {
     if (notification instanceof BootstrapInform) {\r
       logger.info("BootStrap notification received");\r
       BootstrapInform bootstrapNotification = (BootstrapInform) notification;\r
+\r
+      DeviceOperationDetails deviceDetails =\r
+          deviceOperDAO.findByDeviceId(notification.getDeviceDetails().getDeviceId());\r
+      if (deviceDetails == null) {\r
+        deviceDetails = new DeviceOperationDetails();\r
+        deviceDetails.setDeviceId(notification.getDeviceDetails().getDeviceId());\r
+        deviceDetails.setSwVersion(notification.getDeviceDetails().getSoftwareVersion());\r
+        deviceOperDAO.save(deviceDetails);\r
+      }\r
+\r
+      checkForActivateNotification(notification);\r
+\r
       // send request to create the netconf server instance for the bootstrap device\r
       // id\r
       NetConfServerDetails serverInfo = createNtConfServer(bootstrapNotification);\r
@@ -103,6 +126,7 @@ public class ACSNotificationHandlerImpl implements ACSNotificationHandler {
       notiSender.sendNotification(bsInform);\r
     } else if (notification instanceof BootInform) {\r
       logger.info("Boot notification received");\r
+      checkForActivateNotification(notification);\r
       BootInform bootNotification = (BootInform) notification;\r
       BootInform bInform = getDeviceBootNotification(bootNotification, TR069InformType.BOOT);\r
       if (bootNotification.getValueChangeNotification() != null) {\r
@@ -117,9 +141,21 @@ public class ACSNotificationHandlerImpl implements ACSNotificationHandler {
       vesnotiSender.sendNotification(pINotificaiton, null);\r
       notiSender.sendNotification(pINotificaiton);\r
       logger.info("VC notification received");\r
+    } else if (notification instanceof ConnectionRequestInform) {\r
+      ConnectionRequestInform crNotificaiton = (ConnectionRequestInform) notification;\r
+      vesnotiSender.sendNotification(crNotificaiton, null);\r
+      logger.info("ConnectionRequestInform notification received");\r
     } else if (notification instanceof ValueChangeInform) {\r
       ValueChangeInform valueChgNotificaiton = (ValueChangeInform) notification;\r
       processVCNotification(valueChgNotificaiton, isAlarmVC);\r
+    } else if (notification instanceof TransferCompleteInform) {\r
+      TransferCompleteInform tfNotificaiton = (TransferCompleteInform) notification;\r
+      if (tfNotificaiton.getCommandKey() != null && tfNotificaiton.getCommandKey()\r
+          .equalsIgnoreCase(tfNotificaiton.getDeviceDetails().getDeviceId())) {\r
+        logger.debug("TransferCompleteInform is recevied at mapper");\r
+        processTransferCompleteInform(tfNotificaiton);\r
+        logger.debug("TransferCompleteInform processing completed at mapper");\r
+      }\r
     }\r
 \r
     pnpPreProvisioningHandler.onDeviceNotification(notification);\r
@@ -263,4 +299,106 @@ public class ACSNotificationHandlerImpl implements ACSNotificationHandler {
     }\r
     return isIPv6;\r
   }\r
+\r
+  private void processTransferCompleteInform(TransferCompleteInform notification) {\r
+\r
+    try {\r
+      ArrayList<ParameterDTO> paramList = new ArrayList<ParameterDTO>();\r
+      DeviceOperationDetails fwDetails =\r
+          deviceOperDAO.findByDeviceId(notification.getDeviceDetails().getDeviceId());\r
+      if (fwDetails == null || fwDetails.getFileName() == null) {\r
+        logger.debug(\r
+            "TransferCompleteInform recevied for invaild device, there is no entry exist in the database");\r
+        return;\r
+      }\r
+      if (fwDetails.getDownLoadStatus() == FirwareUpgradeStatus.DOWNLOAD_INTIATED.getStatus()) {\r
+        paramList.add(new ParameterDTO("download-event.file-name", fwDetails.getFileName()));\r
+\r
+        String status = FirwareUpgradeErrorCode.getErrorCodeMapping(notification.getFaultCode());\r
+        paramList.add(new ParameterDTO("download-event.status", status));\r
+        if (notification.getFaultCode() != 0) {\r
+          fwDetails.setDownLoadStatus(FirwareUpgradeStatus.DOWNLOAD_FAILED.getStatus());\r
+          paramList\r
+              .add(new ParameterDTO("download-event.error-message", notification.getFaultString()));\r
+        } else {\r
+          fwDetails.setDownLoadStatus(FirwareUpgradeStatus.DOWNLOAD_COMPLETED.getStatus());\r
+          logger.debug("downloading file completed on the device successfully.");\r
+        }\r
+        deviceOperDAO.save(fwDetails);\r
+\r
+        logger.debug("sending download-event notification to netconfserver");\r
+        NetConfNotificationDTO netConfNotifDTO =\r
+            new NetConfNotificationDTO(notification.getDeviceDetails().getDeviceId(), null, true);\r
+        netConfNotifDTO.setParameters(paramList);\r
+        netConfNotifDTO.setUri(SOFT_MGMT_NS_URI);\r
+\r
+        if (notiSender.sendCustomNotification(netConfNotifDTO).getStatusCode().is2xxSuccessful()) {\r
+          logger.debug("sending download-event notification to netconfserver sucess");\r
+        } else {\r
+          logger.error("sending download-event notification to netconfserver failed");\r
+        }\r
+      } else {\r
+        logger.debug(\r
+            "TransferCompleteInform recevied after boot is received; already software is activated");\r
+      }\r
+    } catch (Exception e) {\r
+      logger.debug("Exception occured while processing TransferCompleteInform " + e.toString());\r
+    }\r
+  }\r
+\r
+  private void checkForActivateNotification(DeviceInform notification) {\r
+\r
+    try {\r
+      ArrayList<ParameterDTO> paramList = new ArrayList<ParameterDTO>();\r
+      DeviceOperationDetails devDetails =\r
+          deviceOperDAO.findByDeviceId(notification.getDeviceDetails().getDeviceId());\r
+\r
+      if (devDetails == null\r
+          || devDetails.getDownLoadStatus() == FirwareUpgradeStatus.NOT_STARTED.getStatus()) {\r
+        logger.debug("firmware upgrade is not in progress");\r
+        return;\r
+      }\r
+\r
+      if (!notification.getDeviceDetails().getSoftwareVersion()\r
+          .equalsIgnoreCase(devDetails.getSwVersion())\r
+          && devDetails.getDownLoadStatus() == FirwareUpgradeStatus.DOWNLOAD_INTIATED.getStatus()) {\r
+        logger.debug("received the boot/bootstrap before the transfer complete recevied");\r
+        TransferCompleteInform inform = new TransferCompleteInform();\r
+        inform.setDeviceDetails(notification.getDeviceDetails());\r
+        inform.setFaultCode(0);\r
+        processTransferCompleteInform(inform);\r
+      }\r
+\r
+      devDetails = deviceOperDAO.findByDeviceId(notification.getDeviceDetails().getDeviceId());\r
+      if (devDetails.getDownLoadStatus() == FirwareUpgradeStatus.DOWNLOAD_COMPLETED.getStatus()) {\r
+        paramList.add(new ParameterDTO("activation-event.slot-name", "Active-Partion"));\r
+        // check for software change\r
+        if (notification.getDeviceDetails().getSoftwareVersion()\r
+            .equalsIgnoreCase(devDetails.getSwVersion())) {\r
+          paramList.add(new ParameterDTO("activation-event.status", "APPLICATION_ERROR"));\r
+          devDetails.setDownLoadStatus(FirwareUpgradeStatus.ACTIVATION_ERROR.getStatus());\r
+        } else {\r
+          devDetails.setSwVersion(notification.getDeviceDetails().getSoftwareVersion());\r
+          devDetails.setDownLoadStatus(FirwareUpgradeStatus.ACTIVATION_COMPLETED.getStatus());\r
+          paramList.add(new ParameterDTO("activation-event.status", "COMPLETED"));\r
+        }\r
+        deviceOperDAO.save(devDetails);\r
+\r
+        logger.debug("sending activation-event notification to netconfserver");\r
+        NetConfNotificationDTO netConfNotifDTO =\r
+            new NetConfNotificationDTO(notification.getDeviceDetails().getDeviceId(), null, true);\r
+        netConfNotifDTO.setParameters(paramList);\r
+        netConfNotifDTO.setUri(SOFT_MGMT_NS_URI);\r
+\r
+        if (notiSender.sendCustomNotification(netConfNotifDTO).getStatusCode().is2xxSuccessful()) {\r
+          logger.debug("sending activation-event notification to netconfserver sucess");\r
+        } else {\r
+          logger.error("sending activation-event notification to netconfserver failed");\r
+        }\r
+      }\r
+    } catch (Exception e) {\r
+      logger.debug(\r
+          "Exception occured while processing ProcessFirmWareActivateNotification " + e.toString());\r
+    }\r
+  }\r
 }\r
index b6327ec..b7fee2d 100644 (file)
@@ -26,10 +26,8 @@ import java.util.Map;
 import org.commscope.tr069adapter.acs.common.DeviceInform;\r
 import org.commscope.tr069adapter.acs.common.DeviceRPCRequest;\r
 import org.commscope.tr069adapter.acs.common.DeviceRPCResponse;\r
-import org.commscope.tr069adapter.acs.common.OperationOptions;\r
 import org.commscope.tr069adapter.acs.common.ParameterDTO;\r
 import org.commscope.tr069adapter.acs.common.dto.ConfigurationData;\r
-import org.commscope.tr069adapter.acs.common.dto.TR069DeviceDetails;\r
 import org.commscope.tr069adapter.acs.common.dto.TR069OperationCode;\r
 import org.commscope.tr069adapter.acs.common.dto.TR069OperationDetails;\r
 import org.commscope.tr069adapter.acs.common.inform.BootInform;\r
@@ -38,6 +36,7 @@ import org.commscope.tr069adapter.mapper.MOMetaData;
 import org.commscope.tr069adapter.mapper.MapperConfigProperties;\r
 import org.commscope.tr069adapter.mapper.sync.SynchronizedRequestHandler;\r
 import org.commscope.tr069adapter.mapper.util.MOMetaDataUtil;\r
+import org.commscope.tr069adapter.mapper.util.NetconfToTr069MapperUtil;\r
 import org.slf4j.Logger;\r
 import org.slf4j.LoggerFactory;\r
 import org.slf4j.MDC;\r
@@ -238,18 +237,9 @@ public class PnPPreProvisioningHandler {
   private DeviceRPCRequest createNBIOperationRequest(String deviceId, List<ParameterDTO> params) {\r
     TR069OperationDetails opDetails = new TR069OperationDetails();\r
     opDetails.setOpCode(TR069OperationCode.SET_PARAMETER_VALUES);\r
-    opDetails.setParmeters(params);\r
-\r
-    DeviceRPCRequest deviceRPCRequest = new DeviceRPCRequest();\r
-    TR069DeviceDetails tr069DeviceDetails = new TR069DeviceDetails();\r
-    tr069DeviceDetails.setDeviceId(deviceId);\r
-    deviceRPCRequest.setOpDetails(opDetails);\r
-    deviceRPCRequest.setDeviceDetails(tr069DeviceDetails);\r
-    OperationOptions options = new OperationOptions();\r
-    options.setExecutionTimeout(300l);\r
-    deviceRPCRequest.setOptions(options);\r
-\r
-    return deviceRPCRequest;\r
+\r
+    return NetconfToTr069MapperUtil.handleParamsOperation(params, opDetails, deviceId);\r
+\r
   }\r
 \r
   /**\r
index e5f0452..c189162 100644 (file)
@@ -20,14 +20,18 @@ package org.commscope.tr069adapter.mapper.boot;
 \r
 import org.springframework.boot.SpringApplication;\r
 import org.springframework.boot.autoconfigure.SpringBootApplication;\r
+import org.springframework.boot.autoconfigure.domain.EntityScan;\r
 import org.springframework.boot.web.client.RestTemplateBuilder;\r
 import org.springframework.context.annotation.Bean;\r
 import org.springframework.context.annotation.ComponentScan;\r
+import org.springframework.data.jpa.repository.config.EnableJpaRepositories;\r
 import org.springframework.web.client.RestTemplate;\r
 \r
 @SpringBootApplication\r
 @ComponentScan({"org.commscope.tr069adapter.mapper", "org.commscope.tr069adapter.mapper.acs",\r
     "org.commscope.tr069adapter.mapper.ves"})\r
+@EnableJpaRepositories("org.commscope.tr069adapter.mapper.dao")\r
+@EntityScan("org.commscope.tr069adapter.mapper.entity")\r
 public class MapperServiceBooter {\r
 \r
   public static void main(String[] args) {\r
diff --git a/mapper/src/main/java/org/commscope/tr069adapter/mapper/dao/DeviceOperationsDAO.java b/mapper/src/main/java/org/commscope/tr069adapter/mapper/dao/DeviceOperationsDAO.java
new file mode 100644 (file)
index 0000000..fad7956
--- /dev/null
@@ -0,0 +1,11 @@
+package org.commscope.tr069adapter.mapper.dao;\r
+\r
+import org.commscope.tr069adapter.mapper.entity.DeviceOperationDetails;\r
+import org.springframework.data.repository.CrudRepository;\r
+import org.springframework.stereotype.Repository;\r
+\r
+@Repository\r
+public interface DeviceOperationsDAO extends CrudRepository<DeviceOperationDetails, Long> {\r
+\r
+  public DeviceOperationDetails findByDeviceId(String deviceId);\r
+}\r
diff --git a/mapper/src/main/java/org/commscope/tr069adapter/mapper/entity/DeviceOperationDetails.java b/mapper/src/main/java/org/commscope/tr069adapter/mapper/entity/DeviceOperationDetails.java
new file mode 100644 (file)
index 0000000..0c5a190
--- /dev/null
@@ -0,0 +1,72 @@
+package org.commscope.tr069adapter.mapper.entity;\r
+\r
+import java.io.Serializable;\r
+\r
+import javax.persistence.Column;\r
+import javax.persistence.Entity;\r
+import javax.persistence.GeneratedValue;\r
+import javax.persistence.GenerationType;\r
+import javax.persistence.Id;\r
+import javax.persistence.Table;\r
+import javax.persistence.UniqueConstraint;\r
+\r
+@Entity\r
+@Table(name = "device_operation_details",\r
+    uniqueConstraints = @UniqueConstraint(columnNames = {"DEVICE_ID"}))\r
+public class DeviceOperationDetails implements Serializable {\r
+  @Id\r
+  @GeneratedValue(strategy = GenerationType.AUTO)\r
+  private Long id;\r
+\r
+  @Column(name = "DEVICE_ID", length = 30)\r
+  private String deviceId;\r
+\r
+  @Column(name = "SW_VERSION", length = 30)\r
+  private String swVersion;\r
+\r
+  @Column(name = "DOWN_LOAD_STATUS")\r
+  private int downLoadStatus;\r
+\r
+  @Column(name = "FIRMWARE_FILE", length = 1024)\r
+  private String fileName;\r
+\r
+  public Long getId() {\r
+    return id;\r
+  }\r
+\r
+  public void setId(Long id) {\r
+    this.id = id;\r
+  }\r
+\r
+  public String getDeviceId() {\r
+    return deviceId;\r
+  }\r
+\r
+  public void setDeviceId(String deviceId) {\r
+    this.deviceId = deviceId;\r
+  }\r
+\r
+  public String getSwVersion() {\r
+    return swVersion;\r
+  }\r
+\r
+  public void setSwVersion(String swVersion) {\r
+    this.swVersion = swVersion;\r
+  }\r
+\r
+  public int getDownLoadStatus() {\r
+    return downLoadStatus;\r
+  }\r
+\r
+  public void setDownLoadStatus(int downLoadStatus) {\r
+    this.downLoadStatus = downLoadStatus;\r
+  }\r
+\r
+  public String getFileName() {\r
+    return fileName;\r
+  }\r
+\r
+  public void setFileName(String fileName) {\r
+    this.fileName = fileName;\r
+  }\r
+}\r
diff --git a/mapper/src/main/java/org/commscope/tr069adapter/mapper/model/NetConfNotificationDTO.java b/mapper/src/main/java/org/commscope/tr069adapter/mapper/model/NetConfNotificationDTO.java
new file mode 100644 (file)
index 0000000..792ada1
--- /dev/null
@@ -0,0 +1,72 @@
+package org.commscope.tr069adapter.mapper.model;\r
+\r
+import com.fasterxml.jackson.annotation.JsonTypeInfo;\r
+\r
+import java.io.Serializable;\r
+import java.util.List;\r
+\r
+import org.commscope.tr069adapter.acs.common.ParameterDTO;\r
+\r
+@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property = "@class")\r
+public class NetConfNotificationDTO implements Serializable {\r
+\r
+  private static final long serialVersionUID = 4928942484595767042L;\r
+  private boolean isCustomNotification;\r
+  private String notificationType;\r
+  private List<ParameterDTO> parameters;\r
+  private String uri;\r
+  private String deviceID;\r
+\r
+  public NetConfNotificationDTO() {\r
+    super();\r
+  }\r
+\r
+  public NetConfNotificationDTO(String deviceID, String notificationType,\r
+      boolean isCustomNotification) {\r
+    super();\r
+    this.isCustomNotification = isCustomNotification;\r
+    this.notificationType = notificationType;\r
+    this.deviceID = deviceID;\r
+  }\r
+\r
+  public String getDeviceID() {\r
+    return deviceID;\r
+  }\r
+\r
+  public void setDeviceID(String deviceID) {\r
+    this.deviceID = deviceID;\r
+  }\r
+\r
+  public String getNotificationType() {\r
+    return notificationType;\r
+  }\r
+\r
+  public void setNotificationType(String notificationType) {\r
+    this.notificationType = notificationType;\r
+  }\r
+\r
+  public List<ParameterDTO> getParameters() {\r
+    return parameters;\r
+  }\r
+\r
+  public void setParameters(List<ParameterDTO> parameters) {\r
+    this.parameters = parameters;\r
+  }\r
+\r
+  public String getUri() {\r
+    return uri;\r
+  }\r
+\r
+  public void setUri(String uri) {\r
+    this.uri = uri;\r
+  }\r
+\r
+  public boolean isCustomNotification() {\r
+    return isCustomNotification;\r
+  }\r
+\r
+  public void setCustomNotification(boolean isCustomNotification) {\r
+    this.isCustomNotification = isCustomNotification;\r
+  }\r
+\r
+}\r
index 61a465d..4c0f388 100644 (file)
@@ -23,10 +23,12 @@ import com.fasterxml.jackson.annotation.JsonTypeInfo;
 import java.io.Serializable;\r
 \r
 import org.commscope.tr069adapter.acs.common.DeviceInform;\r
+import org.commscope.tr069adapter.acs.common.OperationDetails;\r
 \r
 @JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property = "@class")\r
 public class VESNotification implements Serializable {\r
   private DeviceInform devnotification;\r
+  private OperationDetails operationDetails;\r
   private NetConfServerDetails netconfDetails;\r
   private String eNodeBName;\r
 \r
@@ -38,6 +40,14 @@ public class VESNotification implements Serializable {
     this.devnotification = devnotification;\r
   }\r
 \r
+  public OperationDetails getOperationDetails() {\r
+    return operationDetails;\r
+  }\r
+\r
+  public void setOperationDetails(OperationDetails operationDetails) {\r
+    this.operationDetails = operationDetails;\r
+  }\r
+\r
   public NetConfServerDetails getNetconfDetails() {\r
     return netconfDetails;\r
   }\r
index adb3267..5ec31e7 100644 (file)
@@ -25,6 +25,7 @@ import org.commscope.tr069adapter.acs.common.DeviceInform;
 import org.commscope.tr069adapter.acs.common.ParameterDTO;\r
 import org.commscope.tr069adapter.mapper.MOMetaData;\r
 import org.commscope.tr069adapter.mapper.MapperConfigProperties;\r
+import org.commscope.tr069adapter.mapper.model.NetConfNotificationDTO;\r
 import org.commscope.tr069adapter.mapper.util.MOMetaDataUtil;\r
 import org.slf4j.Logger;\r
 import org.slf4j.LoggerFactory;\r
@@ -58,9 +59,13 @@ public class NetConfNotificationSender {
     try {\r
       LOG.debug("deviceInform : {} {}", deviceInform.getInformTypeList(),\r
           deviceInform.getParameters());\r
-      convertTR069ToNetConfParams(deviceInform);\r
+      NetConfNotificationDTO netConfDTO =\r
+          new NetConfNotificationDTO(deviceInform.getDeviceDetails().getDeviceId(),\r
+              deviceInform.getInformType().toString(), false);\r
+      netConfDTO.setParameters(deviceInform.getParameters());\r
+      convertTR069ToNetConfParams(netConfDTO);\r
       LOG.debug("Posting notification to netconf server");\r
-      response = restTemplate.postForObject(uri, deviceInform, ResponseEntity.class);\r
+      response = restTemplate.postForObject(uri, netConfDTO, ResponseEntity.class);\r
       LOG.debug("Posting notification to netconf server completed ");\r
     } catch (Exception e) {\r
       LOG.error("Exception while sending the notification.", e);\r
@@ -68,10 +73,23 @@ public class NetConfNotificationSender {
     return response;\r
   }\r
 \r
-  private void convertTR069ToNetConfParams(DeviceInform deviceInform) {\r
+  public ResponseEntity sendCustomNotification(NetConfNotificationDTO netConfDTO) {\r
+    ResponseEntity response = null;\r
+    final String uri = getUri();\r
+    LOG.debug("Posting custom notification to netconf server " + uri);\r
+    try {\r
+      response = restTemplate.postForObject(uri, netConfDTO, ResponseEntity.class);\r
+      LOG.debug("Posting custom notification to netconf server sucessfull");\r
+    } catch (Exception e) {\r
+      LOG.error("Exception while sending the custom notification.", e.toString());\r
+    }\r
+    return response;\r
+  }\r
+\r
+  private void convertTR069ToNetConfParams(NetConfNotificationDTO netConfDTO) {\r
     List<ParameterDTO> removeList = new ArrayList<>();\r
-    if (null != deviceInform) {\r
-      for (ParameterDTO param : deviceInform.getParameters()) {\r
+    if (null != netConfDTO) {\r
+      for (ParameterDTO param : netConfDTO.getParameters()) {\r
         if (param.getParamValue() == null || param.getParamValue().trim().length() <= 0) {\r
           continue;\r
         }\r
@@ -85,8 +103,7 @@ public class NetConfNotificationSender {
             removeList.add(param); // unknown parameter found.\r
         }\r
       }\r
-      deviceInform.getParameters().removeAll(removeList); // remove unknown\r
-      // parameters\r
+      netConfDTO.getParameters().removeAll(removeList);\r
     }\r
   }\r
 \r
index 7dbb5b0..575d24e 100644 (file)
@@ -33,4 +33,7 @@ public interface NetConfRequestHandler {
   public NetConfResponse handleDelConfigRequest(NetConfRequest request);\r
 \r
   public boolean handelRegisterEvent(NetConfServerDetails request);\r
+\r
+  public NetConfResponse handleSWDownloadRequest(NetConfRequest request);\r
+\r
 }\r
index ada3692..ca5f15a 100644 (file)
@@ -74,8 +74,9 @@ public class NetConfRequestReceiver {
   @PostMapping("/softwareDowload")\r
   public NetConfResponse swDownloadRequest(@RequestBody NetConfRequest request) {\r
     LOG.info("Received request for SW-DOWNLOAD. Request : {}", request);\r
+    NetConfResponse response = handler.handleSWDownloadRequest(request);\r
     LOG.info("Processed SW-DOWNLOAD request. Response : ");\r
-    return null;\r
+    return response;\r
   }\r
 \r
   @PostMapping("/softwareActivate")\r
index 834102e..4c06bf2 100644 (file)
@@ -20,13 +20,18 @@ package org.commscope.tr069adapter.mapper.netconf.impl;
 \r
 import java.util.ArrayList;\r
 import java.util.List;\r
+import java.util.Map;\r
 \r
 import org.commscope.tr069adapter.acs.common.DeviceRPCRequest;\r
 import org.commscope.tr069adapter.acs.common.DeviceRPCResponse;\r
+import org.commscope.tr069adapter.acs.common.OperationOptions;\r
 import org.commscope.tr069adapter.acs.common.ParameterDTO;\r
+import org.commscope.tr069adapter.acs.common.dto.TR069DeviceDetails;\r
 import org.commscope.tr069adapter.acs.common.dto.TR069OperationCode;\r
-import org.commscope.tr069adapter.mapper.ErrorCodeMetaData;\r
+import org.commscope.tr069adapter.acs.common.dto.TR069OperationDetails;\r
 import org.commscope.tr069adapter.mapper.MOMetaData;\r
+import org.commscope.tr069adapter.mapper.dao.DeviceOperationsDAO;\r
+import org.commscope.tr069adapter.mapper.entity.DeviceOperationDetails;\r
 import org.commscope.tr069adapter.mapper.model.ErrorCodeDetails;\r
 import org.commscope.tr069adapter.mapper.model.NetConfRequest;\r
 import org.commscope.tr069adapter.mapper.model.NetConfResponse;\r
@@ -34,7 +39,10 @@ import org.commscope.tr069adapter.mapper.model.NetConfServerDetails;
 import org.commscope.tr069adapter.mapper.netconf.NetConfRequestHandler;\r
 import org.commscope.tr069adapter.mapper.sync.SynchronizedRequestHandler;\r
 import org.commscope.tr069adapter.mapper.util.ErrorCodeUtil;\r
+import org.commscope.tr069adapter.mapper.util.FirwareUpgradeStatus;\r
 import org.commscope.tr069adapter.mapper.util.MOMetaDataUtil;\r
+import org.commscope.tr069adapter.mapper.util.MapperConstants;\r
+import org.commscope.tr069adapter.mapper.util.MapperValidator;\r
 import org.commscope.tr069adapter.mapper.util.NetconfToTr069MapperUtil;\r
 import org.commscope.tr069adapter.mapper.ves.VESNotificationSender;\r
 import org.slf4j.Logger;\r
@@ -42,6 +50,7 @@ import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;\r
 import org.springframework.stereotype.Component;\r
 import org.springframework.util.StringUtils;\r
+import org.w3c.dom.Document;\r
 import org.w3c.dom.Element;\r
 \r
 @Component\r
@@ -67,6 +76,9 @@ public class NetConfRequestHandlerImpl implements NetConfRequestHandler {
   @Autowired\r
   VESNotificationSender vesnotiSender;\r
 \r
+  @Autowired\r
+  DeviceOperationsDAO deviceOperDAO;\r
+\r
   @Override\r
   public NetConfResponse handleSetConfigRequest(NetConfRequest netConfRequest) {\r
     Element el = NetconfToTr069MapperUtil.convertStringToDocument(netConfRequest.getRequestXml());\r
@@ -80,11 +92,16 @@ public class NetConfRequestHandlerImpl implements NetConfRequestHandler {
     }\r
     List<ParameterDTO> requestParams = deviceRPCRequest.getOpDetails().getParmeters();\r
     List<ParameterDTO> filteredParams = new ArrayList<>();\r
+    List<ParameterDTO> vesRequestParams = new ArrayList<>();\r
+\r
     if (null != requestParams) {\r
       for (ParameterDTO param : requestParams) {\r
         if (null == param.getParamValue() || StringUtils.isEmpty(param.getParamValue())) {\r
           continue;\r
         }\r
+        if (isVesNotificationRequest(param)) {\r
+          vesRequestParams.add(param);\r
+        }\r
         filteredParams.add(param);\r
       }\r
       deviceRPCRequest.getOpDetails().setParmeters(filteredParams);\r
@@ -106,12 +123,41 @@ public class NetConfRequestHandlerImpl implements NetConfRequestHandler {
     handleBooleanParametersReverse(deviceRPCRequest.getOpDetails().getParmeters());\r
     LOG.debug("Prepared NBI request for edit-config {}", deviceRPCRequest);\r
 \r
-    DeviceRPCResponse deviceRPCResponse;\r
-    deviceRPCResponse = syncHandler.performDeviceOperation(deviceRPCRequest);\r
+    DeviceRPCResponse deviceRPCResponseVes = null;\r
+    List<ParameterDTO> allParamList = deviceRPCRequest.getOpDetails().getParmeters();\r
+\r
+    if (!vesRequestParams.isEmpty()) {\r
+      if (!MapperValidator.isCountDownTimerValid(vesRequestParams)) {\r
+        return getErrorResponse(MapperConstants.INVALID_PARAM_VAL_ERROR_CODE,\r
+            MapperConstants.INVALID_COUNT_DOWN_TIMER_MSG);\r
+      }\r
+\r
+      deviceRPCRequest.getOpDetails().setParmeters(vesRequestParams);\r
+      deviceRPCResponseVes = vesnotiSender.sendEditConfigNotification(deviceRPCRequest);\r
+\r
+      if (null == deviceRPCResponseVes) {\r
+        return getTimeOutResponse();\r
+      }\r
+    }\r
+\r
+    allParamList.removeAll(vesRequestParams);\r
+\r
+    DeviceRPCResponse deviceRPCResponseDevice = null;\r
+    if (null != allParamList && !allParamList.isEmpty()) {\r
+      deviceRPCRequest.getOpDetails().setParmeters(allParamList);\r
+      deviceRPCResponseDevice = syncHandler.performDeviceOperation(deviceRPCRequest);\r
+\r
+      if (null == deviceRPCResponseDevice) {\r
+        return getTimeOutResponse();\r
+      }\r
+    }\r
+\r
+    DeviceRPCResponse deviceRPCResponse =\r
+        mergeSetConfigDeviceRPCResponse(deviceRPCResponseVes, deviceRPCResponseDevice);\r
     if (null == deviceRPCResponse) {\r
       return getTimeOutResponse();\r
     }\r
-    response = mapperUtil.getNetconfResponse(deviceRPCResponse);\r
+    response = mapperUtil.getNetconfResponse(deviceRPCResponse, false);\r
     return response;\r
   }\r
 \r
@@ -154,7 +200,7 @@ public class NetConfRequestHandlerImpl implements NetConfRequestHandler {
     if (null == opResult) {\r
       return getTimeOutResponse();\r
     }\r
-    response = mapperUtil.getNetconfResponse(opResult);\r
+    response = mapperUtil.getNetconfResponse(opResult, false);\r
     return response;\r
   }\r
 \r
@@ -186,7 +232,7 @@ public class NetConfRequestHandlerImpl implements NetConfRequestHandler {
     if (null == opResult) {\r
       return getTimeOutResponse();\r
     }\r
-    response = mapperUtil.getNetconfResponse(opResult);\r
+    response = mapperUtil.getNetconfResponse(opResult, false);\r
     return response;\r
   }\r
 \r
@@ -194,6 +240,14 @@ public class NetConfRequestHandlerImpl implements NetConfRequestHandler {
   public NetConfResponse handleGetConfigRequest(NetConfRequest netConfRequest) {\r
     Element el = NetconfToTr069MapperUtil.convertStringToDocument(netConfRequest.getRequestXml());\r
     NetConfResponse response = null;\r
+    List<ParameterDTO> vesRequestParams = new ArrayList<>();\r
+\r
+    boolean isSoftwareInventory = false;\r
+    if (netConfRequest.getRequestXml().contains("software-inventory")) {\r
+      LOG.info("XML Contains software-inventory");\r
+      isSoftwareInventory = true;\r
+    }\r
+\r
     DeviceRPCRequest request = NetconfToTr069MapperUtil.prepareTR069Request(\r
         netConfRequest.getDeviceId(), el, "filter", TR069OperationCode.GET_PARAMETER_VALUES);\r
 \r
@@ -209,24 +263,59 @@ public class NetConfRequestHandlerImpl implements NetConfRequestHandler {
         LOG.debug("There are no supported device parameters found for get-config.");\r
         return getEmptyResponse();\r
       }\r
+      for (ParameterDTO param : request.getOpDetails().getParmeters()) {\r
+        if (isVesNotificationRequest(param)) {\r
+          vesRequestParams.add(param);\r
+        }\r
+      }\r
     }\r
     LOG.debug("Prepared NBI request for get-config {}", request);\r
 \r
-    DeviceRPCResponse opResult;\r
-    opResult = syncHandler.performDeviceOperation(request);\r
+    DeviceRPCResponse opResultVes = null;\r
+    List<ParameterDTO> allParamList = request.getOpDetails().getParmeters();\r
+\r
+    if (!vesRequestParams.isEmpty()) {\r
+      request.getOpDetails().setParmeters(vesRequestParams);\r
+      opResultVes = vesnotiSender.sendGetConfigNotification(request);\r
+\r
+      if (null == opResultVes) {\r
+        return getTimeOutResponse();\r
+      }\r
+    }\r
+\r
+\r
+    allParamList.removeAll(vesRequestParams);\r
+\r
+    DeviceRPCResponse opResultDevice = null;\r
+    if (!allParamList.isEmpty()) {\r
+      request.getOpDetails().setParmeters(allParamList);\r
+      opResultDevice = syncHandler.performDeviceOperation(request);\r
+\r
+      if (null == opResultDevice) {\r
+        return getTimeOutResponse();\r
+      }\r
+    }\r
+\r
+    DeviceRPCResponse opResult = mergeGetConfigDeviceRPCResponse(opResultVes, opResultDevice);\r
+\r
     if (null == opResult) {\r
       return getTimeOutResponse();\r
     }\r
-    LOG.debug("Received GPV response : FaultKey = {} FaultString = {} Parameters : {}",\r
-        opResult.getFaultKey(), opResult.getFaultString(),\r
-        opResult.getOperationResponse().getParameterDTOs());\r
+    LOG.debug("Received GPV response : FaultKey = " + opResult.getFaultKey() + ", FaultString = "\r
+        + opResult.getFaultString() + ", Parameters :"\r
+        opResult.getOperationResponse().getParameterDTOs());\r
     if (null != opResult.getOperationResponse().getParameterDTOs())\r
       handleBooleanParameters(opResult.getOperationResponse().getParameterDTOs());\r
-    response = mapperUtil.getNetconfResponse(opResult);\r
+\r
+    if (isSoftwareInventory) {\r
+      response = mapperUtil.getNetconfResponseForSoftwareInventory(opResult);\r
+    } else {\r
+      response = mapperUtil.getNetconfResponse(opResult, false);\r
+    }\r
 \r
     if (opResult.getFaultKey() != null && opResult.getFaultKey().equalsIgnoreCase("9005")) {\r
       // check for tabular\r
-      LOG.debug("Tabular Entry not exist in the device; we need to add it now");\r
+      LOG.debug("Tabualr Entry not exist in the device; we need to add it now");\r
       MOMetaData data = metaDataUtil\r
           .getMetaDataByTR69Name(request.getOpDetails().getParmeters().get(0).getParamName());\r
       if (data.isTabluarObj()) {\r
@@ -237,6 +326,148 @@ public class NetConfRequestHandlerImpl implements NetConfRequestHandler {
     return response;\r
   }\r
 \r
+  @Override\r
+  public NetConfResponse handleSWDownloadRequest(NetConfRequest request) {\r
+    LOG.debug("request received fro sw-download");\r
+    Document d1 = NetconfToTr069MapperUtil.convertStringToDocumentXml(request.getRequestXml());\r
+    NetConfResponse response = null;\r
+    Map<String, String> map =\r
+        NetconfToTr069MapperUtil.extractRequestParamters(d1, "rpc", "software-download");\r
+    if (map == null || map.size() <= 0) {\r
+      LOG.debug("There are no device parameters found for get.");\r
+      return getEmptyResponse();\r
+    }\r
+\r
+    TR069OperationDetails opDetails = new TR069OperationDetails();\r
+    DeviceRPCRequest deviceRPCRequest = new DeviceRPCRequest();\r
+    TR069DeviceDetails tr069DeviceDetails = new TR069DeviceDetails();\r
+    tr069DeviceDetails.setDeviceId(request.getDeviceId());\r
+    deviceRPCRequest.setOpDetails(opDetails);\r
+    deviceRPCRequest.setDeviceDetails(tr069DeviceDetails);\r
+    OperationOptions options = new OperationOptions();\r
+    options.setExecutionTimeout(60l);\r
+    deviceRPCRequest.setOptions(options);\r
+    String fileName = map.get("rpc.software-download.remote-file-path");\r
+    String password = map.get("rpc.software-download.password.password");\r
+\r
+    if (fileName == null || password == null || getDownloadFileURI(fileName) == null\r
+        || getDownloadUserName(fileName) == null) {\r
+      LOG.error(\r
+          "remote-file-path value is not as per yang model reference. Allowed pattern sftp://<username>@<host>[:<port>]/path");\r
+      return getOperationAbortedResponse(\r
+          "remote-file-path value is not as per yang model reference. Allowed pattern sftp://<username>@<host>[:<port>]/path");\r
+    }\r
+\r
+    List<ParameterDTO> paramDTOList = new ArrayList<>();\r
+    paramDTOList.add(new ParameterDTO("FileType", "1 Firmware Upgrade Image"));\r
+    paramDTOList.add(new ParameterDTO("URL", getDownloadFileURI(fileName)));\r
+    paramDTOList.add(new ParameterDTO("Username", getDownloadUserName(fileName)));\r
+    paramDTOList.add(new ParameterDTO("Password", password));\r
+    paramDTOList.add(new ParameterDTO("FileSize", "0"));\r
+    paramDTOList.add(new ParameterDTO("TargetFileName", ""));\r
+    paramDTOList.add(new ParameterDTO("DelaySeconds", "1"));\r
+    paramDTOList.add(new ParameterDTO("SuccessURL", ""));\r
+    paramDTOList.add(new ParameterDTO("FailureURL", ""));\r
+\r
+    deviceRPCRequest.getOpDetails().setParmeters(paramDTOList);\r
+    deviceRPCRequest.getOpDetails().setOpCode(TR069OperationCode.DOWNLOAD);\r
+\r
+    LOG.debug("Prepared NBI request for download " + deviceRPCRequest);\r
+\r
+    DeviceOperationDetails fwDetails = deviceOperDAO.findByDeviceId(request.getDeviceId());\r
+    if (fwDetails == null) {\r
+      String errorMsg = "TR069 device request has been aborted,due to device not identified";\r
+      return getOperationAbortedResponse(errorMsg);\r
+    }\r
+\r
+    if (fwDetails.getDownLoadStatus() != FirwareUpgradeStatus.DOWNLOAD_INTIATED.getStatus()\r
+        && fwDetails.getDownLoadStatus() != FirwareUpgradeStatus.DOWNLOAD_COMPLETED.getStatus()) {\r
+\r
+      LOG.debug("persisting the fw details " + fwDetails.toString());\r
+\r
+      DeviceRPCResponse opResult;\r
+      opResult = syncHandler.performDeviceOperation(deviceRPCRequest);\r
+      if (null == opResult) {\r
+        return getTimeOutResponse();\r
+      }\r
+      fwDetails.setFileName(fileName);\r
+      fwDetails.setDownLoadStatus(FirwareUpgradeStatus.DOWNLOAD_INTIATED.getStatus());\r
+      deviceOperDAO.save(fwDetails);\r
+      ArrayList<ParameterDTO> responseParamDTOList = new ArrayList<>();\r
+\r
+      if (opResult.getOperationResponse().getStatus() == 1) {\r
+        responseParamDTOList.add(new ParameterDTO("rpc-reply.ns1:status", "STARTED"));\r
+      } else {\r
+        responseParamDTOList.add(new ParameterDTO("rpc-reply.ns1:status", "FAILED"));\r
+        responseParamDTOList\r
+            .add(new ParameterDTO("rpc-reply.ns1:error-message", opResult.getFaultString()));\r
+      }\r
+      responseParamDTOList.add(new ParameterDTO("rpc-reply.ns1:notification-timeout", "1200"));\r
+\r
+      opResult.getOperationResponse().setParameterDTOs(responseParamDTOList);\r
+      response = mapperUtil.getNetconfResponse(opResult, true);\r
+\r
+      LOG.debug("update the status for fw details " + fwDetails.toString());\r
+    } else {\r
+      LOG.debug("FirmWare Upgrade is in progress");\r
+      String errorMsg = "TR069 device request has been aborted as Firmware Upgrade is inProgress";\r
+      return getOperationAbortedResponse(errorMsg);\r
+    }\r
+\r
+    return response;\r
+  }\r
+\r
+  private DeviceRPCResponse mergeGetConfigDeviceRPCResponse(DeviceRPCResponse opResultVes,\r
+      DeviceRPCResponse opResultDevice) {\r
+    if (null == opResultVes) {\r
+      return opResultDevice;\r
+    }\r
+\r
+    if (null == opResultDevice) {\r
+      return opResultVes;\r
+    }\r
+\r
+    if (null != opResultVes.getFaultKey()\r
+        && !opResultVes.getFaultKey().equals(MapperConstants.RPC_SUCCESS)) {\r
+      return opResultVes;\r
+    } else if (null != opResultDevice.getFaultKey()\r
+        && !opResultDevice.getFaultKey().equals(MapperConstants.RPC_SUCCESS)) {\r
+      return opResultDevice;\r
+    }\r
+\r
+    opResultDevice.getOperationResponse().getParameterDTOs()\r
+        .addAll(opResultVes.getOperationResponse().getParameterDTOs());\r
+    return opResultDevice;\r
+  }\r
+\r
+  private DeviceRPCResponse mergeSetConfigDeviceRPCResponse(DeviceRPCResponse opResultVes,\r
+      DeviceRPCResponse opResultDevice) {\r
+    if (null == opResultVes) {\r
+      return opResultDevice;\r
+    }\r
+\r
+    if (null == opResultDevice) {\r
+      return opResultVes;\r
+    }\r
+\r
+    return opResultDevice;\r
+  }\r
+\r
+  private boolean isVesNotificationRequest(ParameterDTO param) {\r
+    if (null == param.getParamName() || param.getParamName().isEmpty()) {\r
+      return false;\r
+    }\r
+\r
+    if (param.getParamName().toLowerCase().contains(MapperConstants.HEART_BEAT_PERIOD.toLowerCase())\r
+        || param.getParamName().toLowerCase()\r
+            .contains(MapperConstants.COUNT_DOWN_TIMER.toLowerCase())\r
+        || param.getParamName().toLowerCase().contains(MapperConstants.HEART_BEAT.toLowerCase())) {\r
+      return true;\r
+    }\r
+\r
+    return false;\r
+  }\r
+\r
   private void handleBooleanParameters(List<ParameterDTO> parameterDTOs) {\r
 \r
     for (ParameterDTO param : parameterDTOs) {\r
@@ -267,7 +498,7 @@ public class NetConfRequestHandlerImpl implements NetConfRequestHandler {
 \r
   private NetConfResponse getEmptyResponse() {\r
     NetConfResponse response = new NetConfResponse();\r
-    ErrorCodeMetaData errorCodeMetaData = errorCodeUtil.getErrorCodeMetaData("0");\r
+    ErrorCodeDetails errorCodeMetaData = errorCodeUtil.getErrorCodeMetaData("0");\r
     ErrorCodeDetails errorCode = new ErrorCodeDetails();\r
     errorCode.setFaultCode("0");\r
     errorCode.setErrorMessage(errorCodeMetaData.getErrorMessage());\r
@@ -282,7 +513,7 @@ public class NetConfRequestHandlerImpl implements NetConfRequestHandler {
     // prepare timeout error response\r
     NetConfResponse timeOutErrorResponse = new NetConfResponse();\r
     ErrorCodeDetails errorCode = new ErrorCodeDetails();\r
-    ErrorCodeMetaData errorCodeMetaData = errorCodeUtil.getErrorCodeMetaData("8006");\r
+    ErrorCodeDetails errorCodeMetaData = errorCodeUtil.getErrorCodeMetaData("8006");\r
 \r
     errorCode.setFaultCode("8006");\r
     errorCode.setErrorMessage(errorCodeMetaData.getErrorMessage());\r
@@ -294,6 +525,39 @@ public class NetConfRequestHandlerImpl implements NetConfRequestHandler {
     return timeOutErrorResponse;\r
   }\r
 \r
+  private NetConfResponse getErrorResponse(String errCode, String errorMsg) {\r
+    NetConfResponse errorResponse = new NetConfResponse();\r
+    ErrorCodeDetails errorCode = new ErrorCodeDetails();\r
+    ErrorCodeDetails errorCodeMetaData = errorCodeUtil.getErrorCodeMetaData("8006");\r
+    if (errorCodeMetaData != null) {\r
+      errorCode.setFaultCode(errCode);\r
+      errorCode.setErrorMessage(errorCodeMetaData.getErrorMessage());\r
+      errorCode.setErrorType(errorCodeMetaData.getErrorType());\r
+      errorCode.setErrorTag(errorCodeMetaData.getErrorTag());\r
+      errorCode.setErrorSeverity(errorCodeMetaData.getErrorSeverity());\r
+    }\r
+    errorResponse.setErrorCode(errorCode);\r
+    errorResponse.setErrorMessage(errorMsg);\r
+    return errorResponse;\r
+  }\r
+\r
+  private NetConfResponse getOperationAbortedResponse(String errorMessage) {\r
+    // prepare timeout error response\r
+    NetConfResponse timeOutErrorResponse = new NetConfResponse();\r
+    ErrorCodeDetails errorCode = new ErrorCodeDetails();\r
+    ErrorCodeDetails errorCodeMetaData = errorCodeUtil.getErrorCodeMetaData("8006");\r
+    if (errorCode != null) {\r
+      errorCode.setFaultCode("8002");\r
+      errorCode.setErrorMessage(errorCodeMetaData.getErrorMessage());\r
+      errorCode.setErrorType(errorCodeMetaData.getErrorType());\r
+      errorCode.setErrorTag(errorCodeMetaData.getErrorTag());\r
+      errorCode.setErrorSeverity(errorCodeMetaData.getErrorSeverity());\r
+    }\r
+    timeOutErrorResponse.setErrorCode(errorCode);\r
+    timeOutErrorResponse.setErrorMessage(errorMessage);\r
+    return timeOutErrorResponse;\r
+  }\r
+\r
   public List<ParameterDTO> filteredSetParameters(List<ParameterDTO> parameters) {\r
     List<ParameterDTO> result = new ArrayList<>();\r
     for (ParameterDTO param : parameters) {\r
@@ -327,4 +591,28 @@ public class NetConfRequestHandlerImpl implements NetConfRequestHandler {
     LOG.debug("processing the handelRegisterEvent completed");\r
     return result;\r
   }\r
+\r
+  private static String getDownloadFileURI(String filepath) {\r
+\r
+    if (filepath.contains("@") && filepath.contains("//")) {\r
+      String[] str = filepath.split("@");\r
+      String[] strForUserName = str[0].split("//");\r
+      if (str.length > 1) {\r
+        String Url = strForUserName[0] + "//" + str[1];\r
+        return Url;\r
+      }\r
+    }\r
+    return null;\r
+  }\r
+\r
+  private static String getDownloadUserName(String filepath) {\r
+\r
+    if (filepath.contains("@") && filepath.contains("//")) {\r
+      String[] str = filepath.split("@");\r
+      String[] strForUserName = str[0].split("//");\r
+      if (strForUserName.length > 1)\r
+        return strForUserName[1];\r
+    }\r
+    return null;\r
+  }\r
 }\r
index 13f9a6a..9537f9b 100644 (file)
@@ -30,7 +30,7 @@ import java.util.Map.Entry;
 import javax.annotation.PostConstruct;\r
 \r
 import org.apache.commons.io.FileUtils;\r
-import org.commscope.tr069adapter.mapper.ErrorCodeMetaData;\r
+import org.commscope.tr069adapter.mapper.model.ErrorCodeDetails;\r
 import org.slf4j.Logger;\r
 import org.slf4j.LoggerFactory;\r
 import org.springframework.stereotype.Component;\r
@@ -38,11 +38,10 @@ import org.springframework.stereotype.Component;
 @Component\r
 public class ErrorCodeUtil {\r
 \r
-\r
   private static final Logger LOG = LoggerFactory.getLogger(ErrorCodeUtil.class);\r
 \r
   private static final String ERROR_CODE_FILE = "error-code-mapping.json";\r
-  private static Map<String, ErrorCodeMetaData> errorCodeMap;\r
+  private static Map<String, ErrorCodeDetails> errorCodeMap;\r
 \r
   @PostConstruct\r
   public static void loadErrorCodeData() {\r
@@ -55,20 +54,20 @@ public class ErrorCodeUtil {
   }\r
 \r
   public void printErrorCodeMap() {\r
-    for (Entry<String, ErrorCodeMetaData> entry : errorCodeMap.entrySet()) {\r
+    for (Entry<String, ErrorCodeDetails> entry : errorCodeMap.entrySet()) {\r
       LOG.debug("KEY= {}", entry.getKey());\r
       LOG.debug("VALUE= {}", entry.getValue());\r
     }\r
   }\r
 \r
-  private static Map<String, ErrorCodeMetaData> getMetaDataAsMap(File file) throws IOException {\r
+  private static Map<String, ErrorCodeDetails> getMetaDataAsMap(File file) throws IOException {\r
 \r
     String json = FileUtils.readFileToString(file, StandardCharsets.UTF_8);\r
 \r
-    Map<String, ErrorCodeMetaData> result = null;\r
+    Map<String, ErrorCodeDetails> result = null;\r
     ObjectMapper mapper = new ObjectMapper();\r
     try {\r
-      result = mapper.readValue(json, new TypeReference<Map<String, ErrorCodeMetaData>>() {});\r
+      result = mapper.readValue(json, new TypeReference<Map<String, ErrorCodeDetails>>() {});\r
     } catch (IOException e) {\r
       LOG.error("IOException while loading device model meta data {}", e.toString());\r
       LOG.error("Exception : {}", e.getMessage());\r
@@ -76,7 +75,7 @@ public class ErrorCodeUtil {
     return result;\r
   }\r
 \r
-  public ErrorCodeMetaData getErrorCodeMetaData(String errorCode) {\r
+  public ErrorCodeDetails getErrorCodeMetaData(String errorCode) {\r
     return errorCodeMap.get(errorCode);\r
   }\r
 \r
diff --git a/mapper/src/main/java/org/commscope/tr069adapter/mapper/util/FirwareUpgradeErrorCode.java b/mapper/src/main/java/org/commscope/tr069adapter/mapper/util/FirwareUpgradeErrorCode.java
new file mode 100644 (file)
index 0000000..823aa7e
--- /dev/null
@@ -0,0 +1,25 @@
+package org.commscope.tr069adapter.mapper.util;\r
+\r
+import java.util.HashMap;\r
+import java.util.Map;\r
+\r
+public class FirwareUpgradeErrorCode {\r
+  private static Map<Integer, String> ErrorCodes = new HashMap<Integer, String>();;\r
+\r
+  static {\r
+    ErrorCodes.put(9019, "AUTHENTICATION_ERROR");\r
+    ErrorCodes.put(9001, "AUTHENTICATION_ERROR");\r
+    ErrorCodes.put(9016, "AUTHENTICATION_ERROR");\r
+    ErrorCodes.put(9012, "AUTHENTICATION_ERROR");\r
+    ErrorCodes.put(9015, "PROTOCOL_ERROR");\r
+    ErrorCodes.put(9002, "APPLICATION_ERROR");\r
+    ErrorCodes.put(9003, "APPLICATION_ERROR");\r
+    ErrorCodes.put(9020, "TIMEOUT");\r
+    ErrorCodes.put(0, "COMPLETED");\r
+  }\r
+\r
+  public static String getErrorCodeMapping(int errorCode) {\r
+    return ErrorCodes.get(errorCode) != null ? ErrorCodes.get(errorCode) : "APPLICATION_ERROR";\r
+  }\r
+\r
+}\r
diff --git a/mapper/src/main/java/org/commscope/tr069adapter/mapper/util/FirwareUpgradeStatus.java b/mapper/src/main/java/org/commscope/tr069adapter/mapper/util/FirwareUpgradeStatus.java
new file mode 100644 (file)
index 0000000..918a413
--- /dev/null
@@ -0,0 +1,16 @@
+package org.commscope.tr069adapter.mapper.util;\r
+\r
+public enum FirwareUpgradeStatus {\r
+  NOT_STARTED(0), DOWNLOAD_INTIATED(1), DOWNLOAD_FAILED(2), DOWNLOAD_COMPLETED(3), ACTIVATION_ERROR(\r
+      4), ACTIVATION_COMPLETED(5);\r
+\r
+  private int status;\r
+\r
+  private FirwareUpgradeStatus(int status) {\r
+    this.status = status;\r
+  }\r
+\r
+  public int getStatus() {\r
+    return status;\r
+  }\r
+}\r
index e2711c7..a038468 100644 (file)
@@ -49,7 +49,6 @@ public class MOMetaDataUtil {
   private Map<String, MOMetaData> metaDataMap;\r
   private Map<String, String> metaDataReverseMap;\r
   public static final String ORAN_SW_MGMT_URI = "urn:o-ran:software-management:1.0";\r
-  private static HashMap<String, String> nameSpaces = new HashMap<>();\r
 \r
   @PostConstruct\r
   public void loadMetaData() {\r
@@ -79,47 +78,58 @@ public class MOMetaDataUtil {
           continue;\r
         }\r
         if (line != null && line.split(",").length >= 3) {\r
-          String[] split = line.split(",");\r
-          boolean isReadOnly = false;\r
-          boolean isTabluar = false;\r
-          boolean isTabObject = false;\r
-          String dataType = "";\r
-\r
-          if (split[2].contains("-")) {\r
-            String[] dataAttr = split[2].split("-");\r
-            if ("Tabular".equalsIgnoreCase(dataAttr[0]))\r
-              isTabluar = true;\r
-            if ("ReadOnly".equalsIgnoreCase(dataAttr[1]))\r
-              isReadOnly = true;\r
-          } else if ("TabularObject".equalsIgnoreCase(split[2])) {\r
-            isTabObject = true;\r
-          }\r
-          if (split.length > 3) {\r
-            dataType = split[3];\r
-          }\r
-          if (isTabObject) {\r
-            String logMessage = split[1].substring(0, split[1].length() - 5);\r
-            LOG.info("Adding Parent Objects {}", logMessage);\r
-            String substring = split[0].substring(0, split[0].length() - 4);\r
-            MOMetaData metaTabData =\r
-                new MOMetaData(substring, dataType, isReadOnly, isTabluar, isTabObject);\r
-            if ((split.length > 4 && split[4] != null) && split[4].trim().length() > 0) {\r
-              metaTabData.setURI(split[4]);\r
-            }\r
-            metaDataMap.put(logMessage, metaTabData);\r
-          }\r
-          MOMetaData metaData =\r
-              new MOMetaData(split[0], dataType, isReadOnly, isTabluar, isTabObject);\r
-          if ((split.length > 4 && split[4] != null) && split[4].trim().length() > 0) {\r
-            metaData.setURI(split[4]);\r
-          }\r
-          metaDataMap.put(split[1], metaData);\r
-          metaDataReverseMap.put(split[0], split[1]);\r
+\r
+          parseMetaDataLine(line, metaDataMap, metaDataReverseMap);\r
+\r
         }\r
       }\r
     }\r
   }\r
 \r
+  private static void parseMetaDataLine(String line, Map<String, MOMetaData> metaDataMap,\r
+      Map<String, String> metaDataReverseMap) {\r
+    String[] split = line.split(",");\r
+    boolean isReadOnly = false;\r
+    boolean isTabluar = false;\r
+    boolean isTabObject = false;\r
+    if (split[2].contains("-")) {\r
+      String[] dataAttr = split[2].split("-");\r
+      if ("Tabular".equalsIgnoreCase(dataAttr[0]))\r
+        isTabluar = true;\r
+      if ("ReadOnly".equalsIgnoreCase(dataAttr[1]))\r
+        isReadOnly = true;\r
+    } else if ("TabularObject".equalsIgnoreCase(split[2])) {\r
+      isTabObject = true;\r
+    }\r
+    prepareMOMetaData(isReadOnly, isTabluar, split, isTabObject, metaDataMap, metaDataReverseMap);\r
+  }\r
+\r
+  private static void prepareMOMetaData(boolean isReadOnly, boolean isTabluar, String[] split,\r
+      boolean isTabObject, Map<String, MOMetaData> metaDataMap,\r
+      Map<String, String> metaDataReverseMap) {\r
+    String dataType = "";\r
+    if (split.length > 3) {\r
+      dataType = split[3];\r
+    }\r
+    if (isTabObject) {\r
+      String logMessage = split[1].substring(0, split[1].length() - 5);\r
+      LOG.info("Adding Parent Objects {}", logMessage);\r
+      String substring = split[0].substring(0, split[0].length() - 4);\r
+      MOMetaData metaTabData =\r
+          new MOMetaData(substring, dataType, isReadOnly, isTabluar, isTabObject);\r
+      if ((split.length > 4 && split[4] != null) && split[4].trim().length() > 0) {\r
+        metaTabData.setURI(split[4]);\r
+      }\r
+      metaDataMap.put(logMessage, metaTabData);\r
+    }\r
+    MOMetaData metaData = new MOMetaData(split[0], dataType, isReadOnly, isTabluar, isTabObject);\r
+    if ((split.length > 4 && split[4] != null) && split[4].trim().length() > 0) {\r
+      metaData.setURI(split[4]);\r
+    }\r
+    metaDataMap.put(split[1], metaData);\r
+    metaDataReverseMap.put(split[0], split[1]);\r
+  }\r
+\r
   public MOMetaData getMetaDataByNetConfName(String moName) {\r
     String moNameInGnrForm = moName.replaceAll(INDEX_REGEX, STRING_I);\r
     return metaDataMap.get(moNameInGnrForm);\r
@@ -147,10 +157,6 @@ public class MOMetaDataUtil {
     return metaDataMap.keySet();\r
   }\r
 \r
-  public String getNameSpace(String nodeName) {\r
-    return nameSpaces.get(nodeName);\r
-  }\r
-\r
   public List<ParameterDTO> getSupportedChildParameters(List<ParameterDTO> parameters) {\r
     List<ParameterDTO> result = new ArrayList<>();\r
     Set<MOMetaData> allMatchedChilds = new HashSet<>();\r
diff --git a/mapper/src/main/java/org/commscope/tr069adapter/mapper/util/MapperConstants.java b/mapper/src/main/java/org/commscope/tr069adapter/mapper/util/MapperConstants.java
new file mode 100644 (file)
index 0000000..5d358eb
--- /dev/null
@@ -0,0 +1,18 @@
+package org.commscope.tr069adapter.mapper.util;\r
+\r
+public class MapperConstants {\r
+  public static final String HEART_BEAT_PERIOD = "heartbeatPeriod";\r
+  public static final String HEART_BEAT = "heartbeat";\r
+  public static final String COUNT_DOWN_TIMER = "countDownTimer";\r
+  public static final String COUNT_DOWN_TIMER_SET_VAL = "0";\r
+  public static final String INVALID_COUNT_DOWN_TIMER_MSG =\r
+      "Only 0 is allowed for countDownTimer value during set operation";\r
+  public static final String INVALID_PARAM_VAL_ERROR_CODE = "9007";\r
+\r
+  public static final int DEVICE_REACHABLE_STATUS_CODE = 100;\r
+  public static final int DEVICE_REACHABILITY_OP_FAILURE_CODE = 101;\r
+  public static final String DEVICE_TIMEOUT_STATUS_CODE = "8006";\r
+  public static final String DEVICE_REACHABLE_MSG = "Device is reachable";\r
+  public static final String DEFAULT_OP_TIMEOUT_MSG = "Operation Timed out";\r
+  public static final String RPC_SUCCESS = "0";\r
+}\r
diff --git a/mapper/src/main/java/org/commscope/tr069adapter/mapper/util/MapperValidator.java b/mapper/src/main/java/org/commscope/tr069adapter/mapper/util/MapperValidator.java
new file mode 100644 (file)
index 0000000..632b0e0
--- /dev/null
@@ -0,0 +1,34 @@
+package org.commscope.tr069adapter.mapper.util;\r
+\r
+import java.util.List;\r
+\r
+import org.commscope.tr069adapter.acs.common.ParameterDTO;\r
+\r
+public class MapperValidator {\r
+  private MapperValidator() {\r
+    throw new IllegalStateException("Can't be instantiated as MapperValidator is utility class");\r
+  }\r
+\r
+\r
+  public static boolean isCountDownTimerValid(List<ParameterDTO> paramList) {\r
+    for (ParameterDTO param : paramList) {\r
+      if (Boolean.FALSE.equals(isNullOrEmpty(param.getParamName())) && param.getParamName()\r
+          .toLowerCase().contains(MapperConstants.COUNT_DOWN_TIMER.toLowerCase())) {\r
+\r
+        return !isNullOrEmpty(param.getParamValue())\r
+            && param.getParamValue().equalsIgnoreCase(MapperConstants.COUNT_DOWN_TIMER_SET_VAL);\r
+      }\r
+    }\r
+    return true;\r
+  }\r
+\r
+\r
+\r
+  public static boolean isNullOrEmpty(String object) {\r
+    return (null == object || object.isEmpty());\r
+  }\r
+\r
+  public static Boolean isNullOrEmpty(List list) {\r
+    return (null == list || list.isEmpty());\r
+  }\r
+}\r
index 680495e..02a87c1 100644 (file)
@@ -45,7 +45,6 @@ import org.commscope.tr069adapter.acs.common.ParameterDTO;
 import org.commscope.tr069adapter.acs.common.dto.TR069DeviceDetails;\r
 import org.commscope.tr069adapter.acs.common.dto.TR069OperationCode;\r
 import org.commscope.tr069adapter.acs.common.dto.TR069OperationDetails;\r
-import org.commscope.tr069adapter.mapper.ErrorCodeMetaData;\r
 import org.commscope.tr069adapter.mapper.model.ErrorCodeDetails;\r
 import org.commscope.tr069adapter.mapper.model.NetConfResponse;\r
 import org.slf4j.Logger;\r
@@ -96,6 +95,13 @@ public class NetconfToTr069MapperUtil {
     return null;\r
   }\r
 \r
+  public static Map<String, String> extractRequestParamters(Document operationElement,\r
+      String netconfTag, String filterElement) {\r
+    Node requestDataNode = getParameterDataNode(operationElement, netconfTag, filterElement);\r
+    Map<String, String> map = getParameterMapForNode(requestDataNode, -1);\r
+    return map;\r
+  }\r
+\r
   public static DeviceRPCRequest prepareTR069Request(String deviceId, Element operationElement,\r
       String netconfTag, TR069OperationCode opCode) {\r
     Node requestDataNode = getDeviceDataNode(operationElement, netconfTag);\r
@@ -126,6 +132,11 @@ public class NetconfToTr069MapperUtil {
 \r
     TR069OperationDetails opDetails = new TR069OperationDetails();\r
     opDetails.setOpCode(opCode);\r
+    return handleParamsOperation(params, opDetails, deviceId);\r
+  }\r
+\r
+  public static DeviceRPCRequest handleParamsOperation(List<ParameterDTO> params,\r
+      TR069OperationDetails opDetails, String deviceId) {\r
     opDetails.setParmeters(params);\r
 \r
     DeviceRPCRequest deviceRPCRequest = new DeviceRPCRequest();\r
@@ -139,17 +150,16 @@ public class NetconfToTr069MapperUtil {
     return deviceRPCRequest;\r
   }\r
 \r
-  public NetConfResponse getNetconfResponse(DeviceRPCResponse opResult) {\r
+  public NetConfResponse getNetconfResponse(DeviceRPCResponse opResult, boolean isCustomparameter) {\r
     NetConfResponse netConfResponse = new NetConfResponse();\r
-    ErrorCodeMetaData errorCodeMetaData =\r
-        errorCodeUtil.getErrorCodeMetaData(opResult.getFaultKey());\r
+    ErrorCodeDetails errorCodeDetails = errorCodeUtil.getErrorCodeMetaData(opResult.getFaultKey());\r
     ErrorCodeDetails errorCode = new ErrorCodeDetails();\r
-    if (errorCodeMetaData != null) {\r
+    if (errorCodeDetails != null) {\r
       errorCode.setFaultCode(opResult.getFaultKey());\r
-      errorCode.setErrorMessage(errorCodeMetaData.getErrorMessage());\r
-      errorCode.setErrorType(errorCodeMetaData.getErrorType());\r
-      errorCode.setErrorTag(errorCodeMetaData.getErrorTag());\r
-      errorCode.setErrorSeverity(errorCodeMetaData.getErrorSeverity());\r
+      errorCode.setErrorMessage(errorCodeDetails.getErrorMessage());\r
+      errorCode.setErrorType(errorCodeDetails.getErrorType());\r
+      errorCode.setErrorTag(errorCodeDetails.getErrorTag());\r
+      errorCode.setErrorSeverity(errorCodeDetails.getErrorSeverity());\r
       netConfResponse.setErrorCode(errorCode);\r
       netConfResponse.setErrorMessage(opResult.getFaultString());\r
     } else if (opResult.getFaultKey() != null && opResult.getFaultString() != null) {\r
@@ -161,12 +171,128 @@ public class NetconfToTr069MapperUtil {
       netConfResponse.setErrorCode(errorCode);\r
       netConfResponse.setErrorMessage(opResult.getFaultString());\r
     }\r
-    netConfResponse.setNetconfResponseXml(\r
-        getNetconfResponseXML(opResult.getOperationResponse().getParameterDTOs()));\r
+    netConfResponse.setNetconfResponseXml(getNetconfResponseXML(\r
+        opResult.getOperationResponse().getParameterDTOs(), isCustomparameter));\r
+    return netConfResponse;\r
+  }\r
+\r
+  public NetConfResponse getNetconfResponseForSoftwareInventory(DeviceRPCResponse opResult) {\r
+\r
+    NetConfResponse netConfResponse = new NetConfResponse();\r
+    ErrorCodeDetails errorCodeDetails = errorCodeUtil.getErrorCodeMetaData(opResult.getFaultKey());\r
+    ErrorCodeDetails errorCode = new ErrorCodeDetails();\r
+    if (errorCodeDetails != null) {\r
+      errorCode.setFaultCode(opResult.getFaultKey());\r
+      errorCode.setErrorMessage(errorCodeDetails.getErrorMessage());\r
+      errorCode.setErrorType(errorCodeDetails.getErrorType());\r
+      errorCode.setErrorTag(errorCodeDetails.getErrorTag());\r
+      errorCode.setErrorSeverity(errorCodeDetails.getErrorSeverity());\r
+      netConfResponse.setErrorCode(errorCode);\r
+      netConfResponse.setErrorMessage(opResult.getFaultString());\r
+      return netConfResponse;\r
+    } else if (opResult.getFaultKey() != null && opResult.getFaultString() != null) {\r
+      errorCode.setFaultCode(opResult.getFaultKey());\r
+      errorCode.setErrorMessage(opResult.getFaultString());\r
+      errorCode.setErrorType("application");\r
+      errorCode.setErrorTag("operation-failed");\r
+      errorCode.setErrorSeverity("ERROR");\r
+      netConfResponse.setErrorCode(errorCode);\r
+      netConfResponse.setErrorMessage(opResult.getFaultString());\r
+      return netConfResponse;\r
+    }\r
+    List<ParameterDTO> paramDTOList = new ArrayList<>();\r
+\r
+    String build = null;\r
+    String productClass = null;\r
+    for (ParameterDTO paramDto : opResult.getOperationResponse().getParameterDTOs()) {\r
+      if (paramDto.getParamName().equals("Device.DeviceInfo.SoftwareVersion"))\r
+        build = paramDto.getParamValue();\r
+      else if (paramDto.getParamName().equals("Device.DeviceInfo.ProductClass"))\r
+        productClass = paramDto.getParamValue();\r
+    }\r
+\r
+    String[] arrOfBuild = build.split("\\.");\r
+    String buildId = arrOfBuild[arrOfBuild.length - 1];\r
+    StringBuilder buildVersion = new StringBuilder();\r
+    for (int i = 0; i < arrOfBuild.length - 1; i++) {\r
+      if (i == arrOfBuild.length - 2) {\r
+        buildVersion.append(arrOfBuild[i]);\r
+      } else {\r
+        buildVersion.append(arrOfBuild[i]);\r
+        buildVersion.append(".");\r
+      }\r
+    }\r
+\r
+    paramDTOList.add(new ParameterDTO("software-inventory.software-slot.name", "Active Partition"));\r
+    paramDTOList.add(new ParameterDTO("software-inventory.software-slot.status", "VALID"));\r
+    paramDTOList.add(new ParameterDTO("software-inventory.software-slot.active", "true"));\r
+    paramDTOList.add(new ParameterDTO("software-inventory.software-slot.running", "true"));\r
+    paramDTOList.add(new ParameterDTO("software-inventory.software-slot.access", "READ_ONLY"));\r
+    paramDTOList\r
+        .add(new ParameterDTO("software-inventory.software-slot.product-code", productClass));\r
+    paramDTOList.add(new ParameterDTO("software-inventory.software-slot.vendor-code", "CS"));\r
+    paramDTOList.add(new ParameterDTO("software-inventory.software-slot.build-id", buildId));\r
+    paramDTOList.add(new ParameterDTO("software-inventory.software-slot.build-version",\r
+        buildVersion.toString()));\r
+    paramDTOList.add(new ParameterDTO("software-inventory.software-slot.files.name", "BC_ONE"));\r
+    paramDTOList.add(new ParameterDTO("software-inventory.software-slot.files.integrity", "OK"));\r
+\r
+    String XmlStr = getNetconfResponseXML(paramDTOList, true);\r
+\r
+    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();\r
+    DocumentBuilder builder;\r
+    Document doc = null;\r
+    try {\r
+      builder = factory.newDocumentBuilder();\r
+      doc = builder.parse(new InputSource(new StringReader(XmlStr)));\r
+    } catch (Exception e) {\r
+      logger.error("Error while converting String to element" + e);\r
+      errorCode.setFaultCode("8002");\r
+      errorCode.setErrorMessage("Operation Aborted");\r
+      errorCode.setErrorType("application");\r
+      errorCode.setErrorTag("operation-failed");\r
+      errorCode.setErrorSeverity("ERROR");\r
+      netConfResponse.setErrorCode(errorCode);\r
+      netConfResponse.setErrorMessage("Operation Aborted");\r
+      return netConfResponse;\r
+    }\r
+\r
+    Element originalDocumentElement = doc.getDocumentElement();\r
+    Element newDocumentElement = doc.createElementNS("urn:o-ran:software-management:1.0",\r
+        originalDocumentElement.getNodeName());\r
+    NodeList list = originalDocumentElement.getChildNodes();\r
+    while (list.getLength() != 0) {\r
+      newDocumentElement.appendChild(list.item(0));\r
+    }\r
+    // Replace the original element\r
+    doc.replaceChild(newDocumentElement, originalDocumentElement);\r
+\r
+    String strxml = null;\r
+    try {\r
+      TransformerFactory transformerFactory = TransformerFactory.newInstance();\r
+      Transformer transformer = transformerFactory.newTransformer();\r
+      DOMSource source = new DOMSource(doc);\r
+      StreamResult result = new StreamResult(new StringWriter());\r
+      transformer.transform(source, result);\r
+      strxml = result.getWriter().toString();\r
+    } catch (Exception e) {\r
+      logger.error("Error while converting Element to String" + e);\r
+      errorCode.setFaultCode("8002");\r
+      errorCode.setErrorMessage("Operation Aborted");\r
+      errorCode.setErrorType("application");\r
+      errorCode.setErrorTag("operation-failed");\r
+      errorCode.setErrorSeverity("ERROR");\r
+      netConfResponse.setErrorCode(errorCode);\r
+      netConfResponse.setErrorMessage("Operation Aborted");\r
+      return netConfResponse;\r
+    }\r
+\r
+    netConfResponse.setNetconfResponseXml(strxml);\r
+    logger.debug("NetConf Response XML String for software inventory: " + strxml);\r
     return netConfResponse;\r
   }\r
 \r
-  private String getNetconfResponseXML(List<ParameterDTO> parameters) {\r
+  private String getNetconfResponseXML(List<ParameterDTO> parameters, boolean isCustomparameter) {\r
     if (null == parameters || parameters.isEmpty()) {\r
 \r
       return null;\r
@@ -187,6 +313,9 @@ public class NetconfToTr069MapperUtil {
       for (ParameterDTO paramDto : parameters) {\r
         String paramName =\r
             metaDataUtil.getNetconfNameByTR69NameWithIndexes(paramDto.getParamName());\r
+        if (paramName == null && isCustomparameter) {\r
+          paramName = paramDto.getParamName();\r
+        }\r
         String paramValue = paramDto.getParamValue();\r
         if (paramValue == null || paramValue.trim().isEmpty()) {\r
           logger.debug("Values is empty so skipping this parameter.");\r
@@ -217,7 +346,7 @@ public class NetconfToTr069MapperUtil {
             bld.append(".");\r
             bld.append(nodeName);\r
             parentNodeKey = bld.toString();\r
-            Element node = parentNodeMap.get(parentNodeKey);\r
+            Element node = parentNodeMap.computeIfPresent(parentNodeKey, (k, v) -> v);\r
 \r
             // create a tabular parent node if doesn't exit in MAP\r
             if (null == node) {\r
@@ -322,28 +451,15 @@ public class NetconfToTr069MapperUtil {
     if (moRNode.getNodeType() == Node.ELEMENT_NODE) {\r
       NodeList childs = moRNode.getChildNodes();\r
       boolean hasChildElements = false;\r
-      if (childs.getLength() > 0) {\r
-        int counter = 0;\r
-        for (int i = 0; i < childs.getLength(); i++) {\r
-          Node cNode = childs.item(i);\r
-          if (cNode != null && cNode.getNodeType() == Node.ELEMENT_NODE) {\r
-            counter++;\r
-          }\r
-        }\r
-\r
-        for (int i = 0; i < childs.getLength(); i++) {\r
-          Node cNode = childs.item(i);\r
-          if (cNode != null && cNode.getNodeType() == Node.ELEMENT_NODE) {\r
-            hasChildElements = true;\r
-            Map<String, String> subResult = getParameterMapForNode(cNode, counter);\r
-            result.putAll(subResult);\r
-          }\r
-        }\r
-      }\r
+      hasChildElements = checkMoreElements(result, childs, hasChildElements);\r
       if (!hasChildElements) {\r
         String moName = getMOName(moRNode);\r
-        if ((null != moName && !moName.endsWith("." + INDEX_STR))\r
-            || (null != moName && numberOfChilds == 1)) {\r
+        if (moName.equals("software-inventory")) {\r
+          result.put("device.device-info.software-version", moRNode.getTextContent());\r
+          result.put("device.device-info.product-class", moRNode.getTextContent());\r
+        } else if (!moName.endsWith("." + INDEX_STR)) {\r
+          result.put(moName, moRNode.getTextContent());\r
+        } else if (numberOfChilds == 1) {\r
           result.put(moName, moRNode.getTextContent());\r
         }\r
       }\r
@@ -352,6 +468,29 @@ public class NetconfToTr069MapperUtil {
     return result;\r
   }\r
 \r
+  private static boolean checkMoreElements(Map<String, String> result, NodeList childs,\r
+      boolean hasChildElements) {\r
+    if (childs.getLength() > 0) {\r
+      int counter = 0;\r
+      for (int i = 0; i < childs.getLength(); i++) {\r
+        Node cNode = childs.item(i);\r
+        if (cNode != null && cNode.getNodeType() == Node.ELEMENT_NODE) {\r
+          counter++;\r
+        }\r
+      }\r
+\r
+      for (int i = 0; i < childs.getLength(); i++) {\r
+        Node cNode = childs.item(i);\r
+        if (cNode != null && cNode.getNodeType() == Node.ELEMENT_NODE) {\r
+          hasChildElements = true;\r
+          Map<String, String> subResult = getParameterMapForNode(cNode, counter);\r
+          result.putAll(subResult);\r
+        }\r
+      }\r
+    }\r
+    return hasChildElements;\r
+  }\r
+\r
   private static String getMOName(Node moRNode) {\r
     String result = removeNS(moRNode.getNodeName());\r
     Node pNode = moRNode;\r
@@ -379,6 +518,21 @@ public class NetconfToTr069MapperUtil {
     }\r
   }\r
 \r
+  private static Node getParameterDataNode(Document el, String docStart, String filterElement) {\r
+    NodeList nodeList = el.getElementsByTagName(docStart);\r
+    if (nodeList.getLength() > 0) {\r
+      nodeList = nodeList.item(0).getChildNodes();\r
+      for (int i = 0; i < nodeList.getLength(); i++) {\r
+        Node node = nodeList.item(i);\r
+        String nodeName = removeNS(node.getNodeName());\r
+        if (nodeName.equals(filterElement)) {\r
+          return node;\r
+        }\r
+      }\r
+    }\r
+    return null;\r
+  }\r
+\r
   private static Node getDeviceDataNode(Element el, String filter) {\r
     try {\r
       NodeList nodeList = el.getElementsByTagName(filter);\r
index 6ced95d..044d304 100644 (file)
@@ -19,6 +19,8 @@
 package org.commscope.tr069adapter.mapper.ves;\r
 \r
 import org.commscope.tr069adapter.acs.common.DeviceInform;\r
+import org.commscope.tr069adapter.acs.common.DeviceRPCRequest;\r
+import org.commscope.tr069adapter.acs.common.DeviceRPCResponse;\r
 import org.commscope.tr069adapter.mapper.MapperConfigProperties;\r
 import org.commscope.tr069adapter.mapper.acs.impl.PnPPreProvisioningHandler;\r
 import org.commscope.tr069adapter.mapper.model.NetConfServerDetails;\r
@@ -65,6 +67,19 @@ public class VESNotificationSender {
     return restTemplate.postForObject(uri, vesNotifi, VESNotificationResponse.class);\r
   }\r
 \r
+  public DeviceRPCResponse sendEditConfigNotification(DeviceRPCRequest deviceRPCRequest) {\r
+    final String uri = config.getVerConfigUri() + "/editConfig";\r
+    LOG.debug("Posting edit config request to ves agent {}", uri);\r
+    return restTemplate.postForObject(uri, deviceRPCRequest, DeviceRPCResponse.class);\r
+  }\r
+\r
+  public DeviceRPCResponse sendGetConfigNotification(DeviceRPCRequest deviceRPCRequest) {\r
+    final String uri = config.getVerConfigUri() + "/getConfig";\r
+    LOG.debug("Posting get config request to ves agent {}", uri);\r
+    return restTemplate.postForObject(uri, deviceRPCRequest, DeviceRPCResponse.class);\r
+  }\r
+\r
+\r
   private String getUri() {\r
     return config.getVesUri();\r
   }\r
diff --git a/mapper/src/main/java/org/commscope/tr069adapter/mapper/ves/VesRequestHandler.java b/mapper/src/main/java/org/commscope/tr069adapter/mapper/ves/VesRequestHandler.java
new file mode 100644 (file)
index 0000000..c610338
--- /dev/null
@@ -0,0 +1,9 @@
+package org.commscope.tr069adapter.mapper.ves;\r
+\r
+import org.commscope.tr069adapter.acs.common.DeviceRPCRequest;\r
+import org.commscope.tr069adapter.acs.common.DeviceRPCResponse;\r
+\r
+public interface VesRequestHandler {\r
+\r
+  public DeviceRPCResponse handleDeviceConnectivityRequest(DeviceRPCRequest deviceRPCRequest);\r
+}\r
diff --git a/mapper/src/main/java/org/commscope/tr069adapter/mapper/ves/VesRequestReceiver.java b/mapper/src/main/java/org/commscope/tr069adapter/mapper/ves/VesRequestReceiver.java
new file mode 100644 (file)
index 0000000..d417e5c
--- /dev/null
@@ -0,0 +1,29 @@
+package org.commscope.tr069adapter.mapper.ves;\r
+\r
+import org.commscope.tr069adapter.acs.common.DeviceRPCRequest;\r
+import org.commscope.tr069adapter.acs.common.DeviceRPCResponse;\r
+import org.slf4j.Logger;\r
+import org.slf4j.LoggerFactory;\r
+import org.springframework.beans.factory.annotation.Autowired;\r
+import org.springframework.web.bind.annotation.PostMapping;\r
+import org.springframework.web.bind.annotation.RequestBody;\r
+import org.springframework.web.bind.annotation.RequestMapping;\r
+import org.springframework.web.bind.annotation.RestController;\r
+\r
+@RestController\r
+@RequestMapping("/tr069MapperVesNBI")\r
+public class VesRequestReceiver {\r
+\r
+  private static final Logger LOG = LoggerFactory.getLogger(VesRequestReceiver.class);\r
+\r
+  @Autowired\r
+  VesRequestHandler handler;\r
+\r
+  @PostMapping("/checkDeviceConnectivity")\r
+  public DeviceRPCResponse deviceConnectivityCheckRequest(@RequestBody DeviceRPCRequest request) {\r
+    LOG.info("Received request for Device Reachability check. Request : {}", request);\r
+    DeviceRPCResponse response = handler.handleDeviceConnectivityRequest(request);\r
+    LOG.info("Received request for Device Reachability check. Response : {}", response);\r
+    return response;\r
+  }\r
+}\r
diff --git a/mapper/src/main/java/org/commscope/tr069adapter/mapper/ves/impl/VesRequestHandlerImpl.java b/mapper/src/main/java/org/commscope/tr069adapter/mapper/ves/impl/VesRequestHandlerImpl.java
new file mode 100644 (file)
index 0000000..4d84243
--- /dev/null
@@ -0,0 +1,67 @@
+package org.commscope.tr069adapter.mapper.ves.impl;\r
+\r
+import org.commscope.tr069adapter.acs.common.DeviceRPCRequest;\r
+import org.commscope.tr069adapter.acs.common.DeviceRPCResponse;\r
+import org.commscope.tr069adapter.acs.common.OperationResponse;\r
+import org.commscope.tr069adapter.mapper.MapperConfigProperties;\r
+import org.commscope.tr069adapter.mapper.model.ErrorCodeDetails;\r
+import org.commscope.tr069adapter.mapper.sync.SynchronizedRequestHandler;\r
+import org.commscope.tr069adapter.mapper.util.ErrorCodeUtil;\r
+import org.commscope.tr069adapter.mapper.util.MapperConstants;\r
+import org.commscope.tr069adapter.mapper.ves.VesRequestHandler;\r
+import org.slf4j.Logger;\r
+import org.slf4j.LoggerFactory;\r
+import org.springframework.beans.factory.annotation.Autowired;\r
+import org.springframework.stereotype.Component;\r
+\r
+@Component\r
+public class VesRequestHandlerImpl implements VesRequestHandler {\r
+\r
+  private static final Logger LOG = LoggerFactory.getLogger(VesRequestHandlerImpl.class);\r
+\r
+  @Autowired\r
+  SynchronizedRequestHandler syncHandler;\r
+\r
+  @Autowired\r
+  MapperConfigProperties config;\r
+\r
+  @Autowired\r
+  private ErrorCodeUtil errorCodeUtil;\r
+\r
+\r
+  @Override\r
+  public DeviceRPCResponse handleDeviceConnectivityRequest(DeviceRPCRequest deviceRPCRequest) {\r
+    DeviceRPCResponse deviceRPCResponse = syncHandler.performDeviceOperation(deviceRPCRequest);\r
+    if (null == deviceRPCResponse) {\r
+      return getTimeOutResponse(deviceRPCRequest);\r
+    }\r
+\r
+    return deviceRPCResponse;\r
+  }\r
+\r
+  private DeviceRPCResponse getTimeOutResponse(DeviceRPCRequest deviceRPCRequest) {\r
+    DeviceRPCResponse timeOutErrorResponse = new DeviceRPCResponse();\r
+\r
+    timeOutErrorResponse.setDeviceDetails(deviceRPCRequest.getDeviceDetails());\r
+\r
+    OperationResponse operationResponse = new OperationResponse();\r
+    operationResponse.setStatus(MapperConstants.DEVICE_REACHABILITY_OP_FAILURE_CODE);// device\r
+                                                                                     // reachable...change\r
+                                                                                     // value 1 to\r
+                                                                                     // some\r
+                                                                                     // constant or\r
+                                                                                     // enum\r
+    operationResponse.setOperationCode(deviceRPCRequest.getOpDetails().getOpCode());\r
+\r
+    timeOutErrorResponse.setOperationResponse(operationResponse);\r
+    timeOutErrorResponse.setFaultKey(MapperConstants.DEVICE_TIMEOUT_STATUS_CODE);\r
+    ErrorCodeDetails errorCodeDetails =\r
+        errorCodeUtil.getErrorCodeMetaData(MapperConstants.DEVICE_TIMEOUT_STATUS_CODE);\r
+    if (null != errorCodeDetails) {\r
+      timeOutErrorResponse.setFaultString(errorCodeDetails.getErrorMessage());\r
+    } else {\r
+      timeOutErrorResponse.setFaultString(MapperConstants.DEFAULT_OP_TIMEOUT_MSG);\r
+    }\r
+    return timeOutErrorResponse;\r
+  }\r
+}\r
index 0a5657e..c5c974f 100644 (file)
@@ -27,5 +27,16 @@ config.configDBUri=http://${CONFIG_DB_REST_HOST}:${CONFIG_DB_REST_PORT}/getConfi
 config.nbiNotificationUri=http://${NBI_REST_HOST}:${NBI_REST_PORT}/netConfNotificationService/notification\r
 config.nbiServerManagerUri=http://${NBI_REST_HOST}:${NBI_REST_PORT}/netConfServerManagerService\r
 config.vesUri=http://${VES_REST_HOST}:${VES_REST_PORT}/vesagent/deviceEvent\r
+config.verConfigUri=http://${VES_REST_HOST}:${VES_REST_PORT}/vesagent\r
 config.netConfServerIP=${netConfServerIP};\r
 config.netConfServerPort=${netConfServerPort};\r
+\r
+## Datasource properties\r
+spring.datasource.platform=mariadb\r
+spring.datasource.initialization-mode=always\r
+spring.jpa.hibernate.ddl-auto=none\r
+spring.datasource.username=${DB_USERNAME}\r
+spring.datasource.password=${DB_PASSWORD}\r
+spring.datasource.url=jdbc:mariadb://${DB_SERVICE}:3306/${DB_NAME}\r
+spring.datasource.driver-class-name=org.mariadb.jdbc.Driver\r
+spring.jpa.show-sql=true\r
index b12df3b..7869f22 100644 (file)
@@ -1,25 +1,25 @@
-<?xml version="1.0" encoding="UTF-8"?>\r
-<!--\r
-/*\r
- * ============LICENSE_START========================================================================\r
- * ONAP : tr-069-adapter\r
- * =================================================================================================\r
- * Copyright (C) 2020 CommScope Inc Intellectual Property.\r
- * =================================================================================================\r
- * This tr-069-adapter software file is distributed by CommScope Inc\r
- * under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- * http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * This file is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- * ===============LICENSE_END=======================================================================\r
-*/\r
--->\r
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+ * ============LICENSE_START========================================================================
+ * ONAP : tr-069-adapter
+ * =================================================================================================
+ * Copyright (C) 2020 CommScope Inc Intellectual Property.
+ * =================================================================================================
+ * This tr-069-adapter software file is distributed by CommScope Inc
+ * 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
+ *
+ * This file 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.
+ * ===============LICENSE_END=======================================================================
+*/
+-->
 <Configuration status="DEBUG" monitorInterval="30">\r
     <Properties>\r
         <Property name="LOG_PATTERN">%d{yyyy-MM-dd HH:mm:ss} %m%n</Property>\r
     <Loggers>\r
        <Logger name="org.commscope.tr069adapter" level="debug" additivity="false">\r
                <appender-ref ref="console"/>\r
-               <appender-ref ref="applicationLog"/>\r
-       </Logger>\r
+                       <appender-ref ref="applicationLog"/>\r
+               </Logger>\r
 \r
-       <Logger name="org" level="debug" additivity="false">\r
-               <appender-ref ref="console"/>\r
+               <Logger name="org" level="debug" additivity="false">\r
+                       <appender-ref ref="console"/>\r
             <AppenderRef ref="thirdPartyLog" />\r
         </Logger>\r
-       \r
-       <Logger name="org.springframework" level="debug" additivity="false">\r
-               <appender-ref ref="console"/>\r
+               \r
+               <Logger name="org.springframework" level="debug" additivity="false">\r
+                       <appender-ref ref="console"/>\r
             <AppenderRef ref="springLog" />\r
         </Logger>\r
         \r
         <Root level="DEBUG" additivity="false"/>\r
     </Loggers>\r
-</Configuration>\r
+</Configuration>
diff --git a/mapper/src/main/resources/schema-mariadb.sql b/mapper/src/main/resources/schema-mariadb.sql
new file mode 100644 (file)
index 0000000..b680a21
--- /dev/null
@@ -0,0 +1 @@
+CREATE TABLE IF NOT EXISTS device_operation_details (ID int null,DEVICE_ID varchar(30) not null, SW_VERSION varchar(30) not null, DOWN_LOAD_STATUS int default 0, FIRMWARE_FILE varchar(1024) );
\ No newline at end of file
index 5dbc344..2d1fbb7 100644 (file)
@@ -49,7 +49,7 @@ public class NetconfToTr069MapperUtilTest {
     OperationResponse opr = new OperationResponse();\r
     opr.setParameterDTOs(getGeneralParams());\r
     opResult.setOperationResponse(opr);\r
-    NetConfResponse netConfRes = mapUtil.getNetconfResponse(opResult);\r
+    NetConfResponse netConfRes = mapUtil.getNetconfResponse(opResult, false);\r
     Assert.assertNotNull(netConfRes);\r
     Assert.assertEquals("0", netConfRes.getErrorCode().getFaultCode());\r
     Assert.assertEquals("Success", netConfRes.getErrorCode().getErrorMessage());\r
@@ -64,7 +64,7 @@ public class NetconfToTr069MapperUtilTest {
     OperationResponse opr = new OperationResponse();\r
     opr.setParameterDTOs(getGeneralParams());\r
     opResult.setOperationResponse(opr);\r
-    NetConfResponse netConfRes = mapUtil.getNetconfResponse(opResult);\r
+    NetConfResponse netConfRes = mapUtil.getNetconfResponse(opResult, false);\r
     Assert.assertNotNull(netConfRes);\r
     Assert.assertEquals("9001", netConfRes.getErrorCode().getFaultCode());\r
     Assert.assertEquals("Request denied", netConfRes.getErrorCode().getErrorMessage());\r
@@ -77,7 +77,7 @@ public class NetconfToTr069MapperUtilTest {
     opResult.setDeviceDetails(new DeviceDetails());\r
     OperationResponse opr = new OperationResponse();\r
     opResult.setOperationResponse(opr);\r
-    NetConfResponse netConfRes = mapUtil.getNetconfResponse(opResult);\r
+    NetConfResponse netConfRes = mapUtil.getNetconfResponse(opResult, false);\r
     Assert.assertNotNull(netConfRes);\r
     Assert.assertEquals("0", netConfRes.getErrorCode().getFaultCode());\r
     Assert.assertEquals("Success", netConfRes.getErrorCode().getErrorMessage());\r
index aaa7217..9223bf1 100644 (file)
@@ -27,5 +27,14 @@ config.configDBUri=http://tr069adapter-acs-initialpnpdb:9000/getConfig/
 config.nbiNotificationUri=http://tr069adapter-netconf-server:8181/netConfNotificationService/notification\r
 config.nbiServerManagerUri=http://tr069adapter-netconf-server:8181/netConfServerManagerService\r
 config.vesUri=http://tr069adapter-ves-notifier:9191/vesagent/deviceEvent\r
+config.verConfigUri=http://tr069adapter-ves-notifier:9191/vesagent\r
 config.netConfServerIP=10.211.5.55\r
 config.netConfServerPort=17830\r
+\r
+## Datasource properties\r
+spring.datasource.driver-class-name=org.h2.Driver\r
+spring.datasource.url=jdbc:h2:mem:db;DB_CLOSE_DELAY=-1\r
+spring.datasource.username=sa\r
+spring.datasource.password=sa\r
+spring.jpa.show-sql=true\r
+spring.jpa.hibernate.ddl-auto=create\r
diff --git a/mapper/src/test/resources/log4j2.xml b/mapper/src/test/resources/log4j2.xml
new file mode 100644 (file)
index 0000000..9e13a60
--- /dev/null
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+ * ============LICENSE_START========================================================================
+ * ONAP : tr-069-adapter
+ * =================================================================================================
+ * Copyright (C) 2020 CommScope Inc Intellectual Property.
+ * =================================================================================================
+ * This tr-069-adapter software file is distributed by CommScope Inc
+ * 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
+ *
+ * This file 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.
+ * ===============LICENSE_END=======================================================================
+*/
+-->
+<Configuration status="DEBUG" monitorInterval="30">\r
+    <Properties>\r
+        <Property name="LOG_PATTERN">%d{yyyy-MM-dd HH:mm:ss} %m%n</Property>\r
+        <Property name="APP_LOG_ROOT">./target/test-logs</Property>\r
+    </Properties>\r
+    <Appenders>\r
+       <Console name="console" target="SYSTEM_OUT" follow="true">\r
+            <PatternLayout pattern="${LOG_PATTERN}"/>\r
+        </Console>\r
+        \r
+        <RollingFile name="applicationLog"\r
+            fileName="${APP_LOG_ROOT}/debug/application-debug.log"\r
+            filePattern="${APP_LOG_ROOT}/debug/application-debug-%d{yyyy-MM-dd}-%i.log">\r
+            <PatternLayout>\r
+               <pattern>[%d{yyyy-MM-dd HH:mm:ss:SSS}] [%X{client}] [%.-40t] %-25.45c{1} %-5p: %m%n</pattern>\r
+               <header>Debug Log started at: $${date:yyyy-MM-dd HH:mm:ss}</header>\r
+            </PatternLayout>\r
+            <Policies>\r
+                <SizeBasedTriggeringPolicy size="4MB" />\r
+                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>\r
+            </Policies>\r
+            <DefaultRolloverStrategy>\r
+                <Delete basePath="${APP_LOG_ROOT}/debug/" maxDepth="1">\r
+                    <IfFileName glob="application-debug-*.log" />\r
+                    <IfAccumulatedFileCount exceeds="10" />\r
+                </Delete>\r
+            </DefaultRolloverStrategy>\r
+        </RollingFile>\r
+  \r
+               <RollingFile name="springLog" \r
+                       fileName="${APP_LOG_ROOT}/thirdparty/spring-framework.log"\r
+            filePattern="${APP_LOG_ROOT}/thirdparty/spring-%d{yyyy-MM-dd}-%i.log">\r
+            <PatternLayout pattern="${LOG_PATTERN}"/>\r
+            <Policies>\r
+                <SizeBasedTriggeringPolicy size="4MB" />\r
+                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>\r
+            </Policies>\r
+            <DefaultRolloverStrategy>\r
+                <Delete basePath="${APP_LOG_ROOT}/thirdparty/" maxDepth="1">\r
+                    <IfFileName glob="spring-*.log" />\r
+                    <IfAccumulatedFileCount exceeds="10" />\r
+                </Delete>\r
+            </DefaultRolloverStrategy>\r
+        </RollingFile>\r
+   \r
+       <RollingFile name="thirdPartyLog" \r
+                       fileName="${APP_LOG_ROOT}/thirdparty/third-party-framework.log"\r
+            filePattern="${APP_LOG_ROOT}/thirdparty/third-party-framework-%d{yyyy-MM-dd}-%i.log">\r
+            <PatternLayout pattern="${LOG_PATTERN}"/>\r
+            <Policies>\r
+                <SizeBasedTriggeringPolicy size="4MB" />\r
+                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>\r
+            </Policies>\r
+            <DefaultRolloverStrategy>\r
+                <Delete basePath="${APP_LOG_ROOT}/thirdparty/" maxDepth="1">\r
+                    <IfFileName glob="third-party-framework*.log" />\r
+                    <IfAccumulatedFileCount exceeds="10" />\r
+                </Delete>\r
+            </DefaultRolloverStrategy>\r
+        </RollingFile>\r
+             \r
+    </Appenders>\r
+    \r
+    <Loggers>\r
+       <Logger name="org.commscope.tr069adapter" level="debug" additivity="false">\r
+               <appender-ref ref="console"/>\r
+                       <appender-ref ref="applicationLog"/>\r
+               </Logger>\r
+\r
+               <Logger name="org" level="debug" additivity="false">\r
+                       <appender-ref ref="console"/>\r
+            <AppenderRef ref="thirdPartyLog" />\r
+        </Logger>\r
+               \r
+               <Logger name="org.springframework" level="debug" additivity="false">\r
+                       <appender-ref ref="console"/>\r
+            <AppenderRef ref="springLog" />\r
+        </Logger>\r
+        \r
+        <Root level="DEBUG" additivity="false"/>\r
+    </Loggers>\r
+</Configuration>
index 471ac19..81c170d 100644 (file)
@@ -23,7 +23,6 @@ ARG JAR
 ENV NETCONF_REST_PORT=8181\r
 ENV MAPPER_REST_PORT=9999\r
 ENV NETCONFSRVS_START_PORT=17830\r
-ENV NETCONFSRVS_END_PORT=18030\r
 ENV NUM_SERVERS=200\r
 ENV MAPPER_REST_HOST=tr069adapter-netconfig-mapper\r
 ENV DB_SERVICE=tr069adapter-mariadb\r
@@ -31,6 +30,8 @@ ENV DB_NAME=dmsdb
 ENV DB_USERNAME=root\r
 ENV DB_PASSWORD=root\r
 ENV netConfServerIP=localhost\r
+ENV VES_REST_HOST=tr069adapter-ves-notifier\r
+ENV VES_REST_PORT=8383\r
 \r
 WORKDIR /opt/CSAdapter/\r
 \r
index f355a95..3b09997 100644 (file)
                      <pullRegistry>${env.CONTAINER_PULL_REGISTRY}</pullRegistry>\r
                      <images>\r
                         <image>\r
-                           <name>${docker.image.name}</name>\r
+                           <name>${docker.image.name}:${build.version}</name>\r
                            <build>\r
                               <cleanup>try</cleanup>\r
                               <contextDir>${basedir}</contextDir>\r
index d9ba1d6..1785178 100644 (file)
@@ -17,7 +17,7 @@ module bbf-tr-196-2-0-3-full {
   description
     "This module contains a collection of YANG definitions for managing radio access network (RAN) devices.";
 
-  revision 2020-06-23 {
+  revision 2020-06-24 {
     description
       "Initial version, used only for ONAP PoC 2018-06-25
           
diff --git a/netconf-server/schemas/iana-hardware.yang b/netconf-server/schemas/iana-hardware.yang
new file mode 100644 (file)
index 0000000..9a16ac6
--- /dev/null
@@ -0,0 +1,180 @@
+module iana-hardware {\r
+yang-version 1.1;\r
+namespace "urn:ietf:params:xml:ns:yang:iana-hardware";\r
+prefix ianahw;\r
+\r
+organization "IANA";\r
+contact\r
+  "        Internet Assigned Numbers Authority\r
+   Postal: ICANN\r
+           12025 Waterfront Drive, Suite 300\r
+           Los Angeles, CA  90094-2536\r
+           United States of America\r
+   Tel:    +1 310 301 5800\r
+   E-Mail: iana@iana.org>";\r
+\r
+description\r
+  "IANA-defined identities for hardware class.\r
+   The latest revision of this YANG module can be obtained from\r
+   the IANA website.\r
+   Requests for new values should be made to IANA via\r
+   email (iana@iana.org).\r
+   Copyright (c) 2018 IETF Trust and the persons identified as\r
+   authors of the code.  All rights reserved.\r
+   Redistribution and use in source and binary forms, with or\r
+   without modification, is permitted pursuant to, and subject\r
+   to the license terms contained in, the Simplified BSD License\r
+   set forth in Section 4.c of the IETF Trust's Legal Provisions\r
+   Relating to IETF Documents\r
+   (https://trustee.ietf.org/license-info).\r
+   The initial version of this YANG module is part of RFC 8348;\r
+   see the RFC itself for full legal notices.";\r
+reference\r
+  "https://www.iana.org/assignments/yang-parameters";\r
+\r
+revision 2018-03-13 {\r
+  description\r
+    "Initial revision.";\r
+  reference\r
+    "RFC 8348: A YANG Data Model for Hardware Management";\r
+}\r
+\r
+/*\r
+ * Identities\r
+ */\r
+\r
+identity hardware-class {\r
+  description\r
+    "This identity is the base for all hardware class\r
+     identifiers.";\r
+}\r
+\r
+identity unknown {\r
+  base ianahw:hardware-class;\r
+  description\r
+    "This identity is applicable if the hardware class is unknown\r
+     to the server.";\r
+}\r
+\r
+identity chassis {\r
+  base ianahw:hardware-class;\r
+  description\r
+    "This identity is applicable if the hardware class is an\r
+     overall container for networking equipment.  Any class of\r
+     physical component, except a stack, may be contained within a\r
+     chassis; a chassis may only be contained within a stack.";\r
+}\r
+\r
+identity backplane {\r
+  base ianahw:hardware-class;\r
+  description\r
+    "This identity is applicable if the hardware class is some sort\r
+     of device for aggregating and forwarding networking traffic,\r
+     such as a shared backplane in a modular ethernet switch.  Note\r
+     that an implementation may model a backplane as a single\r
+     physical component, which is actually implemented as multiple\r
+     discrete physical components (within a chassis or stack).";\r
+}\r
+\r
+identity container {\r
+  base ianahw:hardware-class;\r
+  description\r
+    "This identity is applicable if the hardware class is capable\r
+     of containing one or more removable physical entities,\r
+     possibly of different types.  For example, each (empty or\r
+     full) slot in a chassis will be modeled as a container.  Note\r
+     that all removable physical components should be modeled\r
+     within a container component, such as field-replaceable\r
+     modules, fans, or power supplies.  Note that all known\r
+     containers should be modeled by the agent, including empty\r
+     containers.";\r
+}\r
+\r
+identity power-supply {\r
+  base ianahw:hardware-class;\r
+  description\r
+    "This identity is applicable if the hardware class is a\r
+     power-supplying component.";\r
+}\r
+\r
+identity fan {\r
+  base ianahw:hardware-class;\r
+  description\r
+    "This identity is applicable if the hardware class is a fan or\r
+     other heat-reduction component.";\r
+}\r
+\r
+identity sensor {\r
+  base ianahw:hardware-class;\r
+  description\r
+    "This identity is applicable if the hardware class is some sort\r
+     of sensor, such as a temperature sensor within a router\r
+     chassis.";\r
+}\r
+\r
+identity module {\r
+  base ianahw:hardware-class;\r
+  description\r
+    "This identity is applicable if the hardware class is some sort\r
+     of self-contained sub-system.  If a module component is\r
+     removable, then it should be modeled within a container\r
+     component; otherwise, it should be modeled directly within\r
+     another physical component (e.g., a chassis or another\r
+     module).";\r
+}\r
+\r
+identity port {\r
+  base ianahw:hardware-class;\r
+  description\r
+    "This identity is applicable if the hardware class is some sort\r
+     of networking port capable of receiving and/or transmitting\r
+     networking traffic.";\r
+}\r
+\r
+identity stack {\r
+  base ianahw:hardware-class;\r
+  description\r
+    "This identity is applicable if the hardware class is some sort\r
+     of super-container (possibly virtual) intended to group\r
+     together multiple chassis entities.  A stack may be realized\r
+     by a virtual cable, a real interconnect cable attached to\r
+     multiple chassis, or multiple interconnect cables.  A stack\r
+     should not be modeled within any other physical components,\r
+     but a stack may be contained within another stack.  Only\r
+     chassis components should be contained within a stack.";\r
+}\r
+\r
+identity cpu {\r
+  base ianahw:hardware-class;\r
+  description\r
+    "This identity is applicable if the hardware class is some sort\r
+     of central processing unit.";\r
+}\r
+\r
+identity energy-object {\r
+  base ianahw:hardware-class;\r
+  description\r
+    "This identity is applicable if the hardware class is some sort\r
+     of energy object, i.e., it is a piece of equipment that is\r
+     part of or attached to a communications network that is\r
+     monitored, it is controlled, or it aids in the management of\r
+     another device for Energy Management.";\r
+}\r
+\r
+identity battery {\r
+  base ianahw:hardware-class;\r
+  description\r
+    "This identity is applicable if the hardware class is some sort\r
+     of battery.";\r
+}\r
+\r
+identity storage-drive {\r
+  base ianahw:hardware-class;\r
+  description\r
+    "This identity is applicable if the hardware class is some sort\r
+     of component with data storage capability as its main\r
+     functionality, e.g., hard disk drive (HDD), solid-state device\r
+     (SSD), solid-state hybrid drive (SSHD), object storage device\r
+     (OSD), or other.";\r
+}\r
+}\r
diff --git a/netconf-server/schemas/ietf-crypto-types.yang b/netconf-server/schemas/ietf-crypto-types.yang
new file mode 100644 (file)
index 0000000..836321e
--- /dev/null
@@ -0,0 +1,1783 @@
+module ietf-crypto-types {\r
+  yang-version 1.1;\r
+  namespace "urn:ietf:params:xml:ns:yang:ietf-crypto-types";\r
+  prefix ct;\r
+\r
+  import ietf-yang-types {\r
+    prefix yang;\r
+    reference\r
+      "RFC 6991: Common YANG Data Types";\r
+  }\r
+\r
+  import ietf-netconf-acm {\r
+    prefix nacm;\r
+    reference\r
+      "RFC 8341: Network Configuration Access Control Model";\r
+  }\r
+\r
+  organization\r
+    "IETF NETCONF (Network Configuration) Working Group";\r
+\r
+  contact\r
+    "WG Web:   <http://datatracker.ietf.org/wg/netconf/>\r
+     WG List:  <mailto:netconf@ietf.org>\r
+     Author:   Kent Watsen <mailto:kent+ietf@watsen.net>\r
+     Author:   Wang Haiguang <wang.haiguang.shieldlab@huawei.com>";\r
+\r
+  description\r
+    "This module defines common YANG types for cryptographic\r
+     applications.\r
+\r
+     Copyright (c) 2019 IETF Trust and the persons identified\r
+     as authors of the code. All rights reserved.\r
+\r
+     Redistribution and use in source and binary forms, with\r
+     or without modification, is permitted pursuant to, and\r
+     subject to the license terms contained in, the Simplified\r
+     BSD License set forth in Section 4.c of the IETF Trust's\r
+     Legal Provisions Relating to IETF Documents\r
+     (https://trustee.ietf.org/license-info).\r
+\r
+     This version of this YANG module is part of RFC XXXX\r
+     (https://www.rfc-editor.org/info/rfcXXXX); see the RFC\r
+     itself for full legal notices.;\r
+\r
+     The key words 'MUST', 'MUST NOT', 'REQUIRED', 'SHALL',\r
+     'SHALL NOT', 'SHOULD', 'SHOULD NOT', 'RECOMMENDED',\r
+     'NOT RECOMMENDED', 'MAY', and 'OPTIONAL' in this document\r
+     are to be interpreted as described in BCP 14 (RFC 2119)\r
+     (RFC 8174) when, and only when, they appear in all\r
+     capitals, as shown here.";\r
+\r
+  revision 2019-04-29 {\r
+    description\r
+      "Initial version";\r
+    reference\r
+      "RFC XXXX: Common YANG Data Types for Cryptography";\r
+  }\r
+\r
+  /**************************************/\r
+  /*   Identities for Hash Algorithms   */\r
+  /**************************************/\r
+\r
+  identity hash-algorithm {\r
+    description\r
+      "A base identity for hash algorithm verification.";\r
+  }\r
+\r
+  identity sha-224 {\r
+    base hash-algorithm;\r
+    description\r
+      "The SHA-224 algorithm.";\r
+    reference\r
+      "RFC 6234: US Secure Hash Algorithms.";\r
+  }\r
+  identity sha-256 {\r
+    base hash-algorithm;\r
+    description\r
+      "The SHA-256 algorithm.";\r
+    reference\r
+      "RFC 6234: US Secure Hash Algorithms.";\r
+  }\r
+\r
+  identity sha-384 {\r
+    base hash-algorithm;\r
+    description\r
+      "The SHA-384 algorithm.";\r
+    reference\r
+      "RFC 6234: US Secure Hash Algorithms.";\r
+  }\r
+\r
+  identity sha-512 {\r
+    base hash-algorithm;\r
+    description\r
+      "The SHA-512 algorithm.";\r
+    reference\r
+      "RFC 6234: US Secure Hash Algorithms.";\r
+  }\r
+\r
+  /***********************************************/\r
+  /*  Identities for Asymmetric Key Algorithms   */\r
+  /***********************************************/\r
+\r
+  identity asymmetric-key-algorithm {\r
+    description\r
+      "Base identity from which all asymmetric key\r
+       encryption Algorithm.";\r
+  }\r
+\r
+  identity rsa1024 {\r
+    base asymmetric-key-algorithm;\r
+    description\r
+      "The RSA algorithm using a 1024-bit key.";\r
+    reference\r
+      "RFC 8017:\r
+         PKCS #1: RSA Cryptography Specifications Version 2.2.";\r
+  }\r
+\r
+  identity rsa2048 {\r
+    base asymmetric-key-algorithm;\r
+    description\r
+      "The RSA algorithm using a 2048-bit key.";\r
+    reference\r
+      "RFC 8017:\r
+         PKCS #1: RSA Cryptography Specifications Version 2.2.";\r
+  }\r
+\r
+  identity rsa3072 {\r
+    base asymmetric-key-algorithm;\r
+    description\r
+      "The RSA algorithm using a 3072-bit key.";\r
+    reference\r
+      "RFC 8017:\r
+         PKCS #1: RSA Cryptography Specifications Version 2.2.";\r
+  }\r
+\r
+  identity rsa4096 {\r
+    base asymmetric-key-algorithm;\r
+    description\r
+      "The RSA algorithm using a 4096-bit key.";\r
+    reference\r
+      "RFC 8017:\r
+         PKCS #1: RSA Cryptography Specifications Version 2.2.";\r
+  }\r
+\r
+  identity rsa7680 {\r
+    base asymmetric-key-algorithm;\r
+    description\r
+      "The RSA algorithm using a 7680-bit key.";\r
+    reference\r
+      "RFC 8017:\r
+         PKCS #1: RSA Cryptography Specifications Version 2.2.";\r
+  }\r
+\r
+  identity rsa15360 {\r
+    base asymmetric-key-algorithm;\r
+    description\r
+      "The RSA algorithm using a 15360-bit key.";\r
+    reference\r
+      "RFC 8017:\r
+         PKCS #1: RSA Cryptography Specifications Version 2.2.";\r
+  }\r
+\r
+  identity secp192r1 {\r
+    base asymmetric-key-algorithm;\r
+    description\r
+      "The ECDSA algorithm using a NIST P256 Curve.";\r
+    reference\r
+      "RFC 6090:\r
+         Fundamental Elliptic Curve Cryptography Algorithms.";\r
+  }\r
+  identity secp224r1 {\r
+    base asymmetric-key-algorithm;\r
+    description\r
+      "The ECDSA algorithm using a NIST P256 Curve.";\r
+    reference\r
+      "RFC 6090:\r
+         Fundamental Elliptic Curve Cryptography Algorithms.";\r
+  }\r
+\r
+  identity secp256r1 {\r
+    base asymmetric-key-algorithm;\r
+    description\r
+      "The ECDSA algorithm using a NIST P256 Curve.";\r
+    reference\r
+      "RFC 6090:\r
+         Fundamental Elliptic Curve Cryptography Algorithms.";\r
+  }\r
+\r
+  identity secp384r1 {\r
+    base asymmetric-key-algorithm;\r
+    description\r
+      "The ECDSA algorithm using a NIST P256 Curve.";\r
+    reference\r
+      "RFC 6090:\r
+         Fundamental Elliptic Curve Cryptography Algorithms.";\r
+  }\r
+\r
+  identity secp521r1 {\r
+    base asymmetric-key-algorithm;\r
+    description\r
+      "The ECDSA algorithm using a NIST P256 Curve.";\r
+    reference\r
+      "RFC 6090:\r
+         Fundamental Elliptic Curve Cryptography Algorithms.";\r
+  }\r
+\r
+  /*************************************/\r
+  /*   Identities for MAC Algorithms   */\r
+  /*************************************/\r
+\r
+  identity mac-algorithm {\r
+    description\r
+      "A base identity for mac generation.";\r
+  }\r
+\r
+  identity hmac-sha1 {\r
+    base mac-algorithm;\r
+    description\r
+      "Generating MAC using SHA1 hash function";\r
+    reference\r
+      "RFC 3174: US Secure Hash Algorithm 1 (SHA1)";\r
+  }\r
+\r
+  identity hmac-sha1-96 {\r
+    base mac-algorithm;\r
+    description\r
+      "Generating MAC using SHA1 hash function";\r
+    reference\r
+      "RFC 2404: The Use of HMAC-SHA-1-96 within ESP and AH";\r
+  }\r
+\r
+  identity hmac-sha2-224 {\r
+    base mac-algorithm;\r
+    description\r
+      "Generating MAC using SHA2 hash function";\r
+    reference\r
+      "RFC 6234:\r
+         US Secure Hash Algorithms (SHA and SHA-based HMAC and\r
+         HKDF)";\r
+  }\r
+\r
+  identity hmac-sha2-256 {\r
+    base mac-algorithm;\r
+    description\r
+      "Generating MAC using SHA2 hash function";\r
+    reference\r
+      "RFC 6234:\r
+         US Secure Hash Algorithms (SHA and SHA-based HMAC and\r
+         HKDF)";\r
+  }\r
+\r
+  identity hmac-sha2-256-128 {\r
+    base mac-algorithm;\r
+    description\r
+      "Generating a 256 bits MAC using SHA2 hash function and\r
+       truncate it to 128 bits";\r
+    reference\r
+      "RFC 4868:\r
+         Using HMAC-SHA-256, HMAC-SHA-384, and HMAC-SHA-512\r
+         with IPsec";\r
+  }\r
+\r
+  identity hmac-sha2-384 {\r
+    base mac-algorithm;\r
+    description\r
+      "Generating MAC using SHA2 hash function";\r
+    reference\r
+      "RFC 6234:\r
+         US Secure Hash Algorithms (SHA and SHA-based HMAC and\r
+         HKDF)";\r
+  }\r
+\r
+  identity hmac-sha2-384-192 {\r
+    base mac-algorithm;\r
+    description\r
+      "Generating a 384 bits MAC using SHA2 hash function and\r
+       truncate it to 192 bits";\r
+    reference\r
+      "RFC 4868:\r
+         Using HMAC-SHA-256, HMAC-SHA-384, and HMAC-SHA-512 with\r
+         IPsec";\r
+  }\r
+\r
+  identity hmac-sha2-512 {\r
+    base mac-algorithm;\r
+    description\r
+      "Generating MAC using SHA2 hash function";\r
+    reference\r
+      "RFC 6234:\r
+         US Secure Hash Algorithms (SHA and SHA-based HMAC and\r
+         HKDF)";\r
+  }\r
+\r
+  identity hmac-sha2-512-256 {\r
+    base mac-algorithm;\r
+    description\r
+      "Generating a 512 bits MAC using SHA2 hash function and\r
+       truncating it to 256 bits";\r
+    reference\r
+      "RFC 4868:\r
+         Using HMAC-SHA-256, HMAC-SHA-384, and HMAC-SHA-512 with\r
+         IPsec";\r
+  }\r
+\r
+  identity aes-128-gmac {\r
+    base mac-algorithm;\r
+    description\r
+      "Generating MAC using the Advanced Encryption Standard (AES)\r
+       Galois Message Authentication Code (GMAC) as a mechanism to\r
+       provide data origin authentication";\r
+    reference\r
+      "RFC 4543:\r
+         The Use of Galois Message Authentication Code (GMAC) in\r
+         IPsec ESP and AH";\r
+  }\r
+\r
+  identity aes-192-gmac {\r
+    base mac-algorithm;\r
+    description\r
+      "Generating MAC using the Advanced Encryption Standard (AES)\r
+       Galois Message Authentication Code (GMAC) as a mechanism to\r
+       provide data origin authentication";\r
+    reference\r
+      "RFC 4543:\r
+         The Use of Galois Message Authentication Code (GMAC) in\r
+         IPsec ESP and AH";\r
+  }\r
+\r
+  identity aes-256-gmac {\r
+    base mac-algorithm;\r
+    description\r
+      "Generating MAC using the Advanced Encryption Standard (AES)\r
+       Galois Message Authentication Code (GMAC) as a mechanism to\r
+       provide data origin authentication";\r
+    reference\r
+      "RFC 4543:\r
+         The Use of Galois Message Authentication Code (GMAC) in\r
+         IPsec ESP and AH";\r
+  }\r
+\r
+  identity aes-cmac-96 {\r
+    base mac-algorithm;\r
+    description\r
+      "Generating MAC using Advanced Encryption Standard (AES)\r
+       Cipher-based Message Authentication Code (CMAC)";\r
+    reference\r
+      "RFC 4494: The AES-CMAC-96 Algorithm and its Use with IPsec";\r
+  }\r
+\r
+  identity aes-cmac-128 {\r
+    base mac-algorithm;\r
+    description\r
+      "Generating MAC using Advanced Encryption Standard (AES)\r
+       Cipher-based Message Authentication Code (CMAC)";\r
+    reference\r
+      "RFC 4493: The AES-CMAC Algorithm";\r
+  }\r
+\r
+  /********************************************/\r
+  /*   Identities for Encryption Algorithms   */\r
+  /********************************************/\r
+\r
+  identity encryption-algorithm {\r
+    description\r
+      "A base identity for encryption algorithm.";\r
+  }\r
+\r
+  identity aes-128-cbc {\r
+    base encryption-algorithm;\r
+    description\r
+      "Encrypt message with AES algorithm in CBC mode with a key\r
+       length of 128 bits";\r
+    reference\r
+      "RFC 3565:\r
+         Use of the Advanced Encryption Standard (AES) Encryption\r
+         Algorithm in Cryptographic Message Syntax (CMS)";\r
+  }\r
+\r
+  identity aes-192-cbc {\r
+    base encryption-algorithm;\r
+    description\r
+      "Encrypt message with AES algorithm in CBC mode with a key\r
+       length of 192 bits";\r
+    reference\r
+      "RFC 3565:\r
+         Use of the Advanced Encryption Standard (AES) Encryption\r
+         Algorithm in Cryptographic Message Syntax (CMS)";\r
+  }\r
+\r
+  identity aes-256-cbc {\r
+    base encryption-algorithm;\r
+    description\r
+      "Encrypt message with AES algorithm in CBC mode with a key\r
+       length of 256 bits";\r
+    reference\r
+      "RFC 3565:\r
+         Use of the Advanced Encryption Standard (AES) Encryption\r
+         Algorithm in Cryptographic Message Syntax (CMS)";\r
+  }\r
+\r
+  identity aes-128-ctr {\r
+    base encryption-algorithm;\r
+    description\r
+      "Encrypt message with AES algorithm in CTR mode with a key\r
+       length of 128 bits";\r
+    reference\r
+      "RFC 3686:\r
+         Using Advanced Encryption Standard (AES) Counter Mode with\r
+         IPsec Encapsulating Security Payload (ESP)";\r
+  }\r
+  identity aes-192-ctr {\r
+    base encryption-algorithm;\r
+    description\r
+      "Encrypt message with AES algorithm in CTR mode with a key\r
+       length of 192 bits";\r
+    reference\r
+      "RFC 3686:\r
+         Using Advanced Encryption Standard (AES) Counter Mode with\r
+         IPsec Encapsulating Security Payload (ESP)";\r
+  }\r
+\r
+  identity aes-256-ctr {\r
+    base encryption-algorithm;\r
+    description\r
+      "Encrypt message with AES algorithm in CTR mode with a key\r
+       length of 256 bits";\r
+    reference\r
+      "RFC 3686:\r
+         Using Advanced Encryption Standard (AES) Counter Mode with\r
+         IPsec Encapsulating Security Payload (ESP)";\r
+  }\r
+\r
+  /****************************************************/\r
+  /*   Identities for Encryption and MAC Algorithms   */\r
+  /****************************************************/\r
+\r
+  identity encryption-and-mac-algorithm {\r
+    description\r
+      "A base identity for encryption and MAC algorithm.";\r
+  }\r
+\r
+  identity aes-128-ccm {\r
+    base encryption-and-mac-algorithm;\r
+    description\r
+      "Encrypt message with AES algorithm in CCM mode with a key\r
+       length of 128 bits; it can also be used for generating MAC";\r
+    reference\r
+      "RFC 4309:\r
+         Using Advanced Encryption Standard (AES) CCM Mode with\r
+         IPsec Encapsulating Security Payload (ESP)";\r
+  }\r
+\r
+  identity aes-192-ccm {\r
+    base encryption-and-mac-algorithm;\r
+    description\r
+      "Encrypt message with AES algorithm in CCM mode with a key\r
+       length of 192 bits; it can also be used for generating MAC";\r
+    reference\r
+      "RFC 4309:\r
+         Using Advanced Encryption Standard (AES) CCM Mode with\r
+         IPsec Encapsulating Security Payload (ESP)";\r
+  }\r
+\r
+  identity aes-256-ccm {\r
+    base encryption-and-mac-algorithm;\r
+    description\r
+      "Encrypt message with AES algorithm in CCM mode with a key\r
+       length of 256 bits; it can also be used for generating MAC";\r
+    reference\r
+      "RFC 4309:\r
+         Using Advanced Encryption Standard (AES) CCM Mode with\r
+         IPsec Encapsulating Security Payload (ESP)";\r
+  }\r
+\r
+  identity aes-128-gcm {\r
+    base encryption-and-mac-algorithm;\r
+    description\r
+      "Encrypt message with AES algorithm in GCM mode with a key\r
+       length of 128 bits; it can also be used for generating MAC";\r
+    reference\r
+      "RFC 4106:\r
+         The Use of Galois/Counter Mode (GCM) in IPsec Encapsulating\r
+         Security Payload (ESP)";\r
+  }\r
+\r
+  identity aes-192-gcm {\r
+    base encryption-and-mac-algorithm;\r
+    description\r
+      "Encrypt message with AES algorithm in GCM mode with a key\r
+       length of 192 bits; it can also be used for generating MAC";\r
+    reference\r
+      "RFC 4106:\r
+         The Use of Galois/Counter Mode (GCM) in IPsec Encapsulating\r
+         Security Payload (ESP)";\r
+  }\r
+\r
+  identity mac-aes-256-gcm {\r
+    base encryption-and-mac-algorithm;\r
+    description\r
+      "Encrypt message with AES algorithm in GCM mode with a key\r
+       length of 128 bits; it can also be used for generating MAC";\r
+    reference\r
+      "RFC 4106:\r
+         The Use of Galois/Counter Mode (GCM) in IPsec Encapsulating\r
+         Security Payload (ESP)";\r
+  }\r
+  identity chacha20-poly1305 {\r
+    base encryption-and-mac-algorithm;\r
+    description\r
+      "Encrypt message with chacha20 algorithm and generate MAC with\r
+       POLY1305; it can also be used for generating MAC";\r
+    reference\r
+      "RFC 8439: ChaCha20 and Poly1305 for IETF Protocols";\r
+  }\r
+\r
+  /******************************************/\r
+  /*   Identities for signature algorithm   */\r
+  /******************************************/\r
+\r
+  identity signature-algorithm {\r
+    description\r
+      "A base identity for asymmetric key encryption algorithm.";\r
+  }\r
+\r
+  identity dsa-sha1 {\r
+    base signature-algorithm;\r
+    description\r
+      "The signature algorithm using DSA algorithm with SHA1 hash\r
+       algorithm";\r
+    reference\r
+      "RFC 4253: The Secure Shell (SSH) Transport Layer Protocol";\r
+  }\r
+\r
+  identity rsassa-pkcs1-sha1 {\r
+    base signature-algorithm;\r
+    description\r
+      "The signature algorithm using RSASSA-PKCS1-v1_5 with the SHA1\r
+       hash algorithm.";\r
+    reference\r
+      "RFC 4253: The Secure Shell (SSH) Transport Layer Protocol";\r
+  }\r
+\r
+  identity rsassa-pkcs1-sha256 {\r
+    base signature-algorithm;\r
+    description\r
+      "The signature algorithm using RSASSA-PKCS1-v1_5 with the\r
+       SHA256 hash algorithm.";\r
+    reference\r
+      "RFC 8332:\r
+         Use of RSA Keys with SHA-256 and SHA-512 in the Secure Shell\r
+         (SSH) Protocol\r
+       RFC 8446:\r
+         The Transport Layer Security (TLS) Protocol Version 1.3";\r
+  }\r
+  identity rsassa-pkcs1-sha384 {\r
+    base signature-algorithm;\r
+    description\r
+      "The signature algorithm using RSASSA-PKCS1-v1_5 with the\r
+       SHA384 hash algorithm.";\r
+    reference\r
+      "RFC 8446:\r
+         The Transport Layer Security (TLS) Protocol Version 1.3";\r
+  }\r
+\r
+  identity rsassa-pkcs1-sha512 {\r
+    base signature-algorithm;\r
+    description\r
+      "The signature algorithm using RSASSA-PKCS1-v1_5 with the\r
+       SHA512 hash algorithm.";\r
+    reference\r
+      "RFC 8332:\r
+         Use of RSA Keys with SHA-256 and SHA-512 in the Secure Shell\r
+         (SSH) Protocol\r
+       RFC 8446:\r
+         The Transport Layer Security (TLS) Protocol Version 1.3";\r
+  }\r
+\r
+  identity rsassa-pss-rsae-sha256 {\r
+    base signature-algorithm;\r
+    description\r
+      "The signature algorithm using RSASSA-PSS with mask generation\r
+       function 1 and SHA256 hash algorithm. If the public key is\r
+       carried in an X.509 certificate, it MUST use the rsaEncryption\r
+       OID";\r
+    reference\r
+      "RFC 8446:\r
+         The Transport Layer Security (TLS) Protocol Version 1.3";\r
+  }\r
+\r
+  identity rsassa-pss-rsae-sha384 {\r
+    base signature-algorithm;\r
+    description\r
+      "The signature algorithm using RSASSA-PSS with mask generation\r
+       function 1 and SHA384 hash algorithm. If the public key is\r
+       carried in an X.509 certificate, it MUST use the rsaEncryption\r
+       OID";\r
+    reference\r
+      "RFC 8446:\r
+         The Transport Layer Security (TLS) Protocol Version 1.3";\r
+  }\r
+\r
+  identity rsassa-pss-rsae-sha512 {\r
+    base signature-algorithm;\r
+    description\r
+      "The signature algorithm using RSASSA-PSS with mask generation\r
+       function 1 and SHA512 hash algorithm. If the public key is\r
+       carried in an X.509 certificate, it MUST use the rsaEncryption\r
+       OID";\r
+    reference\r
+      "RFC 8446:\r
+         The Transport Layer Security (TLS) Protocol Version 1.3";\r
+  }\r
+\r
+  identity rsassa-pss-pss-sha256 {\r
+    base signature-algorithm;\r
+    description\r
+      "The signature algorithm using RSASSA-PSS with mask generation\r
+       function 1 and SHA256 hash algorithm. If the public key is\r
+       carried in an X.509 certificate, it MUST use the RSASSA-PSS\r
+       OID";\r
+    reference\r
+      "RFC 8446:\r
+         The Transport Layer Security (TLS) Protocol Version 1.3";\r
+  }\r
+\r
+  identity rsassa-pss-pss-sha384 {\r
+    base signature-algorithm;\r
+    description\r
+      "The signature algorithm using RSASSA-PSS with mask generation\r
+       function 1 and SHA256 hash algorithm. If the public key is\r
+       carried in an X.509 certificate, it MUST use the RSASSA-PSS\r
+       OID";\r
+    reference\r
+      "RFC 8446:\r
+         The Transport Layer Security (TLS) Protocol Version 1.3";\r
+  }\r
+\r
+  identity rsassa-pss-pss-sha512 {\r
+    base signature-algorithm;\r
+    description\r
+      "The signature algorithm using RSASSA-PSS with mask generation\r
+       function 1 and SHA256 hash algorithm. If the public key is\r
+       carried in an X.509 certificate, it MUST use the RSASSA-PSS\r
+       OID";\r
+    reference\r
+      "RFC 8446:\r
+         The Transport Layer Security (TLS) Protocol Version 1.3";\r
+  }\r
+\r
+  identity ecdsa-secp256r1-sha256 {\r
+    base signature-algorithm;\r
+    description\r
+      "The signature algorithm using ECDSA with curve name secp256r1\r
+       and SHA256 hash algorithm.";\r
+    reference\r
+      "RFC 5656: Elliptic Curve Algorithm Integration in the\r
+         Secure Shell Transport Layer\r
+       RFC 8446:\r
+         The Transport Layer Security (TLS) Protocol Version 1.3";\r
+  }\r
+\r
+  identity ecdsa-secp384r1-sha384 {\r
+    base signature-algorithm;\r
+    description\r
+      "The signature algorithm using ECDSA with curve name secp384r1\r
+       and SHA384 hash algorithm.";\r
+    reference\r
+      "RFC 5656: Elliptic Curve Algorithm Integration in the\r
+         Secure Shell Transport Layer\r
+       RFC 8446:\r
+         The Transport Layer Security (TLS) Protocol Version 1.3";\r
+  }\r
+\r
+  identity ecdsa-secp521r1-sha512 {\r
+    base signature-algorithm;\r
+    description\r
+      "The signature algorithm using ECDSA with curve name secp521r1\r
+       and SHA512 hash algorithm.";\r
+    reference\r
+      "RFC 5656: Elliptic Curve Algorithm Integration in the\r
+         Secure Shell Transport Layer\r
+       RFC 8446:\r
+         The Transport Layer Security (TLS) Protocol Version 1.3";\r
+  }\r
+\r
+  identity ed25519 {\r
+    base signature-algorithm;\r
+    description\r
+      "The signature algorithm using EdDSA as defined in RFC 8032 or\r
+       its successors.";\r
+    reference\r
+      "RFC 8032: Edwards-Curve Digital Signature Algorithm (EdDSA)";\r
+  }\r
+\r
+  identity ed448 {\r
+    base signature-algorithm;\r
+    description\r
+      "The signature algorithm using EdDSA as defined in RFC 8032 or\r
+       its successors.";\r
+    reference\r
+      "RFC 8032: Edwards-Curve Digital Signature Algorithm (EdDSA)";\r
+  }\r
+\r
+  identity eccsi {\r
+    base signature-algorithm;\r
+    description\r
+      "The signature algorithm using ECCSI signature as defined in\r
+       RFC 6507.";\r
+    reference\r
+      "RFC 6507:\r
+         Elliptic Curve-Based Certificateless Signatures for\r
+         Identity-based Encryption (ECCSI)";\r
+  }\r
+\r
+  /**********************************************/\r
+  /*   Identities for key exchange algorithms   */\r
+  /**********************************************/\r
+\r
+  identity key-exchange-algorithm {\r
+    description\r
+      "A base identity for Diffie-Hellman based key exchange\r
+       algorithm.";\r
+  }\r
+\r
+  identity psk-only {\r
+    base key-exchange-algorithm;\r
+    description\r
+      "Using Pre-shared key for authentication and key exchange";\r
+    reference\r
+      "RFC 4279:\r
+         Pre-Shared Key cipher suites for Transport Layer Security\r
+        (TLS)";\r
+  }\r
+\r
+  identity dhe-ffdhe2048 {\r
+    base key-exchange-algorithm;\r
+    description\r
+      "Ephemeral Diffie Hellman key exchange with 2048 bit\r
+       finite field";\r
+    reference\r
+      "RFC 7919:\r
+         Negotiated Finite Field Diffie-Hellman Ephemeral Parameters\r
+         for Transport Layer Security (TLS)";\r
+  }\r
+\r
+  identity dhe-ffdhe3072 {\r
+    base key-exchange-algorithm;\r
+    description\r
+      "Ephemeral Diffie Hellman key exchange with 3072 bit finite\r
+       field";\r
+    reference\r
+      "RFC 7919:\r
+         Negotiated Finite Field Diffie-Hellman Ephemeral Parameters\r
+         for Transport Layer Security (TLS)";\r
+  }\r
+\r
+  identity dhe-ffdhe4096 {\r
+    base key-exchange-algorithm;\r
+    description\r
+      "Ephemeral Diffie Hellman key exchange with 4096 bit\r
+       finite field";\r
+    reference\r
+      "RFC 7919:\r
+         Negotiated Finite Field Diffie-Hellman Ephemeral Parameters\r
+         for Transport Layer Security (TLS)";\r
+  }\r
+\r
+  identity dhe-ffdhe6144 {\r
+    base key-exchange-algorithm;\r
+    description\r
+      "Ephemeral Diffie Hellman key exchange with 6144 bit\r
+       finite field";\r
+    reference\r
+      "RFC 7919:\r
+         Negotiated Finite Field Diffie-Hellman Ephemeral Parameters\r
+         for Transport Layer Security (TLS)";\r
+  }\r
+\r
+  identity dhe-ffdhe8192 {\r
+    base key-exchange-algorithm;\r
+    description\r
+      "Ephemeral Diffie Hellman key exchange with 8192 bit\r
+       finite field";\r
+    reference\r
+      "RFC 7919:\r
+         Negotiated Finite Field Diffie-Hellman Ephemeral Parameters\r
+         for Transport Layer Security (TLS)";\r
+  }\r
+\r
+  identity psk-dhe-ffdhe2048 {\r
+    base key-exchange-algorithm;\r
+    description\r
+      "Key exchange using pre-shared key with Diffie-Hellman key\r
+       generation mechanism, where the DH group is FFDHE2048";\r
+    reference\r
+      "RFC 8446:\r
+         The Transport Layer Security (TLS) Protocol Version 1.3";\r
+  }\r
+\r
+  identity psk-dhe-ffdhe3072 {\r
+    base key-exchange-algorithm;\r
+    description\r
+      "Key exchange using pre-shared key with Diffie-Hellman key\r
+       generation mechanism, where the DH group is FFDHE3072";\r
+    reference\r
+      "RFC 8446:\r
+         The Transport Layer Security (TLS) Protocol Version 1.3";\r
+  }\r
+\r
+  identity psk-dhe-ffdhe4096 {\r
+    base key-exchange-algorithm;\r
+    description\r
+      "Key exchange using pre-shared key with Diffie-Hellman key\r
+       generation mechanism, where the DH group is FFDHE4096";\r
+    reference\r
+      "RFC 8446:\r
+         The Transport Layer Security (TLS) Protocol Version 1.3";\r
+  }\r
+\r
+  identity psk-dhe-ffdhe6144 {\r
+    base key-exchange-algorithm;\r
+    description\r
+      "Key exchange using pre-shared key with Diffie-Hellman key\r
+       generation mechanism, where the DH group is FFDHE6144";\r
+    reference\r
+      "RFC 8446:\r
+         The Transport Layer Security (TLS) Protocol Version 1.3";\r
+  }\r
+\r
+  identity psk-dhe-ffdhe8192 {\r
+    base key-exchange-algorithm;\r
+    description\r
+      "Key exchange using pre-shared key with Diffie-Hellman key\r
+       generation mechanism, where the DH group is FFDHE8192";\r
+    reference\r
+      "RFC 8446:\r
+         The Transport Layer Security (TLS) Protocol Version 1.3";\r
+  }\r
+\r
+  identity ecdhe-secp256r1 {\r
+    base key-exchange-algorithm;\r
+    description\r
+      "Ephemeral Diffie Hellman key exchange with elliptic group\r
+       over curve secp256r1";\r
+    reference\r
+      "RFC 8422:\r
+         Elliptic Curve Cryptography (ECC) Cipher Suites for\r
+         Transport Layer Security (TLS) Versions 1.2 and Earlier";\r
+  }\r
+\r
+  identity ecdhe-secp384r1 {\r
+    base key-exchange-algorithm;\r
+    description\r
+      "Ephemeral Diffie Hellman key exchange with elliptic group\r
+       over curve secp384r1";\r
+    reference\r
+      "RFC 8422:\r
+         Elliptic Curve Cryptography (ECC) Cipher Suites for\r
+         Transport Layer Security (TLS) Versions 1.2 and Earlier";\r
+  }\r
+\r
+  identity ecdhe-secp521r1 {\r
+    base key-exchange-algorithm;\r
+    description\r
+      "Ephemeral Diffie Hellman key exchange with elliptic group\r
+       over curve secp521r1";\r
+    reference\r
+      "RFC 8422:\r
+         Elliptic Curve Cryptography (ECC) Cipher Suites for\r
+         Transport Layer Security (TLS) Versions 1.2 and Earlier";\r
+  }\r
+\r
+  identity ecdhe-x25519 {\r
+    base key-exchange-algorithm;\r
+    description\r
+      "Ephemeral Diffie Hellman key exchange with elliptic group\r
+       over curve x25519";\r
+    reference\r
+      "RFC 8422:\r
+         Elliptic Curve Cryptography (ECC) Cipher Suites for\r
+         Transport Layer Security (TLS) Versions 1.2 and Earlier";\r
+  }\r
+\r
+  identity ecdhe-x448 {\r
+    base key-exchange-algorithm;\r
+    description\r
+      "Ephemeral Diffie Hellman key exchange with elliptic group\r
+       over curve x448";\r
+    reference\r
+      "RFC 8422:\r
+         Elliptic Curve Cryptography (ECC) Cipher Suites for\r
+         Transport Layer Security (TLS) Versions 1.2 and Earlier";\r
+  }\r
+\r
+  identity psk-ecdhe-secp256r1 {\r
+    base key-exchange-algorithm;\r
+    description\r
+      "Key exchange using pre-shared key with elliptic group-based\r
+       Ephemeral Diffie Hellman key exchange over curve secp256r1";\r
+    reference\r
+      "RFC 8446:\r
+         The Transport Layer Security (TLS) Protocol Version 1.3";\r
+  }\r
+\r
+  identity psk-ecdhe-secp384r1 {\r
+    base key-exchange-algorithm;\r
+    description\r
+      "Key exchange using pre-shared key with elliptic group-based\r
+       Ephemeral Diffie Hellman key exchange over curve secp384r1";\r
+    reference\r
+      "RFC 8446:\r
+         The Transport Layer Security (TLS) Protocol Version 1.3";\r
+  }\r
+\r
+  identity psk-ecdhe-secp521r1 {\r
+    base key-exchange-algorithm;\r
+    description\r
+      "Key exchange using pre-shared key with elliptic group-based\r
+       Ephemeral Diffie Hellman key exchange over curve secp521r1";\r
+    reference\r
+      "RFC 8446:\r
+         The Transport Layer Security (TLS) Protocol Version 1.3";\r
+  }\r
+\r
+  identity psk-ecdhe-x25519 {\r
+    base key-exchange-algorithm;\r
+    description\r
+      "Key exchange using pre-shared key with elliptic group-based\r
+       Ephemeral Diffie Hellman key exchange over curve x25519";\r
+    reference\r
+      "RFC 8446:\r
+         The Transport Layer Security (TLS) Protocol Version 1.3";\r
+  }\r
+\r
+  identity psk-ecdhe-x448 {\r
+    base key-exchange-algorithm;\r
+    description\r
+      "Key exchange using pre-shared key with elliptic group-based\r
+       Ephemeral Diffie Hellman key exchange over curve x448";\r
+    reference\r
+      "RFC 8446:\r
+         The Transport Layer Security (TLS) Protocol Version 1.3";\r
+  }\r
+\r
+  identity diffie-hellman-group14-sha1 {\r
+    base key-exchange-algorithm;\r
+    description\r
+      "Using DH group14 and SHA1 for key exchange";\r
+    reference\r
+      "RFC 4253: The Secure Shell (SSH) Transport Layer Protocol";\r
+  }\r
+\r
+  identity diffie-hellman-group14-sha256 {\r
+    base key-exchange-algorithm;\r
+    description\r
+      "Using DH group14 and SHA256 for key exchange";\r
+    reference\r
+      "RFC 8268:\r
+         More Modular Exponentiation (MODP) Diffie-Hellman (DH)\r
+         Key Exchange (KEX) Groups for Secure Shell (SSH)";\r
+  }\r
+\r
+  identity diffie-hellman-group15-sha512 {\r
+    base key-exchange-algorithm;\r
+    description\r
+      "Using DH group15 and SHA512 for key exchange";\r
+    reference\r
+      "RFC 8268:\r
+         More Modular Exponentiation (MODP) Diffie-Hellman (DH)\r
+         Key Exchange (KEX) Groups for Secure Shell (SSH)";\r
+  }\r
+\r
+  identity diffie-hellman-group16-sha512 {\r
+    base key-exchange-algorithm;\r
+    description\r
+      "Using DH group16 and SHA512 for key exchange";\r
+    reference\r
+      "RFC 8268:\r
+         More Modular Exponentiation (MODP) Diffie-Hellman (DH)\r
+         Key Exchange (KEX) Groups for Secure Shell (SSH)";\r
+  }\r
+\r
+  identity diffie-hellman-group17-sha512 {\r
+    base key-exchange-algorithm;\r
+    description\r
+      "Using DH group17 and SHA512 for key exchange";\r
+\r
+    reference\r
+      "RFC 8268:\r
+         More Modular Exponentiation (MODP) Diffie-Hellman (DH)\r
+         Key Exchange (KEX) Groups for Secure Shell (SSH)";\r
+  }\r
+\r
+  identity diffie-hellman-group18-sha512 {\r
+    base key-exchange-algorithm;\r
+    description\r
+      "Using DH group18 and SHA512 for key exchange";\r
+    reference\r
+      "RFC 8268:\r
+         More Modular Exponentiation (MODP) Diffie-Hellman (DH)\r
+         Key Exchange (KEX) Groups for Secure Shell (SSH)";\r
+  }\r
+\r
+  identity ecdh-sha2-secp256r1 {\r
+    base key-exchange-algorithm;\r
+    description\r
+      "Elliptic curve-based Diffie Hellman key exchange over curve\r
+       secp256r1 and using SHA2 for MAC generation";\r
+    reference\r
+      "RFC 6239: Suite B Cryptographic Suites for Secure Shell\r
+       (SSH)";\r
+  }\r
+\r
+  identity ecdh-sha2-secp384r1 {\r
+    base key-exchange-algorithm;\r
+    description\r
+      "Elliptic curve-based Diffie Hellman key exchange over curve\r
+       secp384r1 and using SHA2 for MAC generation";\r
+    reference\r
+      "RFC 6239: Suite B Cryptographic Suites for Secure Shell\r
+       (SSH)";\r
+  }\r
+\r
+  identity rsaes-oaep {\r
+    base key-exchange-algorithm;\r
+    description\r
+      "RSAES-OAEP combines the RSAEP and RSADP primitives with the\r
+       EME-OAEP encoding method";\r
+    reference\r
+      "RFC 8017:\r
+         PKCS #1: RSA Cryptography Specifications Version 2.2.";\r
+  }\r
+\r
+  identity rsaes-pkcs1-v1_5 {\r
+    base key-exchange-algorithm;\r
+    description\r
+      " RSAES-PKCS1-v1_5 combines the RSAEP and RSADP primitives\r
+        with the EME-PKCS1-v1_5 encoding method";\r
+    reference\r
+      "RFC 8017:\r
+         PKCS #1: RSA Cryptography Specifications Version 2.2.";\r
+  }\r
+\r
+  /**********************************************************/\r
+  /*   Typedefs for identityrefs to above base identities   */\r
+  /**********************************************************/\r
+\r
+  typedef hash-algorithm-ref {\r
+    type identityref {\r
+      base hash-algorithm;\r
+    }\r
+    description\r
+      "This typedef enables importing modules to easily define an\r
+       identityref to the 'hash-algorithm' base identity.";\r
+  }\r
+\r
+  typedef signature-algorithm-ref {\r
+    type identityref {\r
+      base signature-algorithm;\r
+    }\r
+    description\r
+      "This typedef enables importing modules to easily define an\r
+       identityref to the 'signature-algorithm' base identity.";\r
+  }\r
+\r
+  typedef mac-algorithm-ref {\r
+    type identityref {\r
+      base mac-algorithm;\r
+    }\r
+    description\r
+      "This typedef enables importing modules to easily define an\r
+       identityref to the 'mac-algorithm' base identity.";\r
+  }\r
+\r
+  typedef encryption-algorithm-ref {\r
+    type identityref {\r
+      base encryption-algorithm;\r
+    }\r
+    description\r
+      "This typedef enables importing modules to easily define an\r
+       identityref to the 'encryption-algorithm'\r
+       base identity.";\r
+  }\r
+\r
+  typedef encryption-and-mac-algorithm-ref {\r
+    type identityref {\r
+      base encryption-and-mac-algorithm;\r
+    }\r
+    description\r
+      "This typedef enables importing modules to easily define an\r
+       identityref to the 'encryption-and-mac-algorithm'\r
+       base identity.";\r
+  }\r
+\r
+  typedef asymmetric-key-algorithm-ref {\r
+    type identityref {\r
+      base asymmetric-key-algorithm;\r
+    }\r
+    description\r
+      "This typedef enables importing modules to easily define an\r
+       identityref to the 'asymmetric-key-algorithm'\r
+       base identity.";\r
+  }\r
+\r
+  typedef key-exchange-algorithm-ref {\r
+    type identityref {\r
+      base key-exchange-algorithm;\r
+    }\r
+    description\r
+      "This typedef enables importing modules to easily define an\r
+       identityref to the 'key-exchange-algorithm' base identity.";\r
+  }\r
+\r
+  /***************************************************/\r
+  /*   Typedefs for ASN.1 structures from RFC 5280   */\r
+  /***************************************************/\r
+\r
+  typedef x509 {\r
+    type binary;\r
+    description\r
+      "A Certificate structure, as specified in RFC 5280,\r
+       encoded using ASN.1 distinguished encoding rules (DER),\r
+       as specified in ITU-T X.690.";\r
+    reference\r
+      "RFC 5280:\r
+         Internet X.509 Public Key Infrastructure Certificate\r
+         and Certificate Revocation List (CRL) Profile\r
+       ITU-T X.690:\r
+         Information technology - ASN.1 encoding rules:\r
+         Specification of Basic Encoding Rules (BER),\r
+         Canonical Encoding Rules (CER) and Distinguished\r
+         Encoding Rules (DER).";\r
+  }\r
+\r
+  typedef crl {\r
+    type binary;\r
+    description\r
+      "A CertificateList structure, as specified in RFC 5280,\r
+       encoded using ASN.1 distinguished encoding rules (DER),\r
+       as specified in ITU-T X.690.";\r
+    reference\r
+      "RFC 5280:\r
+         Internet X.509 Public Key Infrastructure Certificate\r
+         and Certificate Revocation List (CRL) Profile\r
+       ITU-T X.690:\r
+         Information technology - ASN.1 encoding rules:\r
+         Specification of Basic Encoding Rules (BER),\r
+         Canonical Encoding Rules (CER) and Distinguished\r
+         Encoding Rules (DER).";\r
+  }\r
+\r
+  /***********************************************/\r
+  /*   Typedefs for ASN.1 structures from 5652   */\r
+  /***********************************************/\r
+\r
+  typedef cms {\r
+    type binary;\r
+    description\r
+      "A ContentInfo structure, as specified in RFC 5652,\r
+       encoded using ASN.1 distinguished encoding rules (DER),\r
+       as specified in ITU-T X.690.";\r
+    reference\r
+      "RFC 5652:\r
+         Cryptographic Message Syntax (CMS)\r
+       ITU-T X.690:\r
+         Information technology - ASN.1 encoding rules:\r
+         Specification of Basic Encoding Rules (BER),\r
+         Canonical Encoding Rules (CER) and Distinguished\r
+         Encoding Rules (DER).";\r
+  }\r
+\r
+  typedef data-content-cms {\r
+    type cms;\r
+    description\r
+      "A CMS structure whose top-most content type MUST be the\r
+       data content type, as described by Section 4 in RFC 5652.";\r
+    reference\r
+      "RFC 5652: Cryptographic Message Syntax (CMS)";\r
+  }\r
+\r
+  typedef signed-data-cms {\r
+    type cms;\r
+    description\r
+      "A CMS structure whose top-most content type MUST be the\r
+       signed-data content type, as described by Section 5 in\r
+       RFC 5652.";\r
+    reference\r
+      "RFC 5652: Cryptographic Message Syntax (CMS)";\r
+  }\r
+\r
+  typedef enveloped-data-cms {\r
+    type cms;\r
+    description\r
+      "A CMS structure whose top-most content type MUST be the\r
+       enveloped-data content type, as described by Section 6\r
+       in RFC 5652.";\r
+    reference\r
+      "RFC 5652: Cryptographic Message Syntax (CMS)";\r
+  }\r
+\r
+  typedef digested-data-cms {\r
+    type cms;\r
+    description\r
+      "A CMS structure whose top-most content type MUST be the\r
+       digested-data content type, as described by Section 7\r
+       in RFC 5652.";\r
+    reference\r
+      "RFC 5652: Cryptographic Message Syntax (CMS)";\r
+  }\r
+\r
+  typedef encrypted-data-cms {\r
+    type cms;\r
+    description\r
+      "A CMS structure whose top-most content type MUST be the\r
+       encrypted-data content type, as described by Section 8\r
+       in RFC 5652.";\r
+    reference\r
+      "RFC 5652: Cryptographic Message Syntax (CMS)";\r
+  }\r
+\r
+  typedef authenticated-data-cms {\r
+    type cms;\r
+    description\r
+      "A CMS structure whose top-most content type MUST be the\r
+       authenticated-data content type, as described by Section 9\r
+       in RFC 5652.";\r
+    reference\r
+      "RFC 5652: Cryptographic Message Syntax (CMS)";\r
+  }\r
+\r
+  /***************************************************/\r
+  /*   Typedefs for structures related to RFC 4253   */\r
+  /***************************************************/\r
+\r
+  typedef ssh-host-key {\r
+    type binary;\r
+    description\r
+      "The binary public key data for this SSH key, as\r
+       specified by RFC 4253, Section 6.6, i.e.:\r
+\r
+         string    certificate or public key format\r
+                   identifier\r
+         byte[n]   key/certificate data.";\r
+    reference\r
+      "RFC 4253: The Secure Shell (SSH) Transport Layer\r
+                 Protocol";\r
+  }\r
+\r
+  /*********************************************************/\r
+  /*   Typedefs for ASN.1 structures related to RFC 5280   */\r
+  /*********************************************************/\r
+\r
+  typedef trust-anchor-cert-x509 {\r
+    type x509;\r
+    description\r
+      "A Certificate structure that MUST encode a self-signed\r
+       root certificate.";\r
+  }\r
+\r
+  typedef end-entity-cert-x509 {\r
+    type x509;\r
+    description\r
+      "A Certificate structure that MUST encode a certificate\r
+       that is neither self-signed nor having Basic constraint\r
+       CA true.";\r
+  }\r
+\r
+  /*********************************************************/\r
+  /*   Typedefs for ASN.1 structures related to RFC 5652   */\r
+  /*********************************************************/\r
+\r
+  typedef trust-anchor-cert-cms {\r
+    type signed-data-cms;\r
+    description\r
+      "A CMS SignedData structure that MUST contain the chain of\r
+       X.509 certificates needed to authenticate the certificate\r
+       presented by a client or end-entity.\r
+\r
+       The CMS MUST contain only a single chain of certificates.\r
+       The client or end-entity certificate MUST only authenticate\r
+       to last intermediate CA certificate listed in the chain.\r
+\r
+       In all cases, the chain MUST include a self-signed root\r
+       certificate.  In the case where the root certificate is\r
+       itself the issuer of the client or end-entity certificate,\r
+       only one certificate is present.\r
+\r
+       This CMS structure MAY (as applicable where this type is\r
+       used) also contain suitably fresh (as defined by local\r
+       policy) revocation objects with which the device can\r
+       verify the revocation status of the certificates.\r
+\r
+       This CMS encodes the degenerate form of the SignedData\r
+       structure that is commonly used to disseminate X.509\r
+       certificates and revocation objects (RFC 5280).";\r
+    reference\r
+      "RFC 5280:\r
+         Internet X.509 Public Key Infrastructure Certificate\r
+         and Certificate Revocation List (CRL) Profile.";\r
+  }\r
+\r
+  typedef end-entity-cert-cms {\r
+    type signed-data-cms;\r
+    description\r
+      "A CMS SignedData structure that MUST contain the end\r
+       entity certificate itself, and MAY contain any number\r
+       of intermediate certificates leading up to a trust\r
+       anchor certificate.  The trust anchor certificate\r
+       MAY be included as well.\r
+\r
+       The CMS MUST contain a single end entity certificate.\r
+       The CMS MUST NOT contain any spurious certificates.\r
+\r
+       This CMS structure MAY (as applicable where this type is\r
+       used) also contain suitably fresh (as defined by local\r
+       policy) revocation objects with which the device can\r
+       verify the revocation status of the certificates.\r
+\r
+       This CMS encodes the degenerate form of the SignedData\r
+       structure that is commonly used to disseminate X.509\r
+       certificates and revocation objects (RFC 5280).";\r
+    reference\r
+      "RFC 5280:\r
+         Internet X.509 Public Key Infrastructure Certificate\r
+         and Certificate Revocation List (CRL) Profile.";\r
+  }\r
+\r
+  /**********************************************/\r
+  /*   Groupings for keys and/or certificates   */\r
+  /**********************************************/\r
+\r
+  grouping public-key-grouping {\r
+    description\r
+      "A public key.\r
+\r
+       The 'algorithm' and 'public-key' nodes are not\r
+       mandatory because they MAY be defined in <operational>.\r
+       Implementations SHOULD assert that these values are\r
+       either configured or that they exist in <operational>.";\r
+    leaf algorithm {\r
+      nacm:default-deny-write;\r
+      type asymmetric-key-algorithm-ref;\r
+      must '../public-key';\r
+      description\r
+        "Identifies the key's algorithm.  More specifically,\r
+         this leaf specifies how the 'public-key' binary leaf\r
+         is encoded.";\r
+      reference\r
+        "RFC CCCC: Common YANG Data Types for Cryptography";\r
+    }\r
+    leaf public-key {\r
+      nacm:default-deny-write;\r
+      type binary;\r
+      must '../algorithm';\r
+      description\r
+        "A binary that contains the value of the public key.  The\r
+         interpretation of the content is defined by the key\r
+         algorithm.  For example, a DSA key is an integer, an RSA\r
+         key is represented as RSAPublicKey as defined in\r
+         RFC 8017, and an Elliptic Curve Cryptography (ECC) key\r
+         is represented using the 'publicKey' described in\r
+         RFC 5915.";\r
+      reference\r
+        "RFC 8017: Public-Key Cryptography Standards (PKCS) #1:\r
+                   RSA Cryptography Specifications Version 2.2.\r
+         RFC 5915: Elliptic Curve Private Key Structure.";\r
+    }\r
+  }\r
+\r
+  grouping asymmetric-key-pair-grouping {\r
+    description\r
+      "A private/public key pair.\r
+       The 'algorithm', 'public-key', and 'private-key'  nodes are\r
+       not mandatory because they MAY be defined in <operational>.\r
+       Implementations SHOULD assert that these values are either\r
+       configured or that they exist in <operational>.";\r
+    uses public-key-grouping;\r
+    leaf private-key {\r
+      nacm:default-deny-all;\r
+      type union {\r
+        type binary;\r
+        type enumeration {\r
+          enum permanently-hidden {\r
+            description\r
+              "The private key is inaccessible due to being\r
+               protected by the system (e.g., a cryptographic\r
+               hardware module).\r
+\r
+               How such keys are backed-up and restored, if\r
+               at all, is implementation specific.\r
+\r
+               Servers MUST fail any attempt by a client to\r
+               configure this value directly.  This value is\r
+               not set by clients, but rather is set by the\r
+               'generate-hidden-key' and 'install-hidden-key'\r
+               actions.";\r
+          }\r
+        }\r
+      }\r
+      must '../public-key';\r
+      description\r
+        "A binary that contains the value of the private key.  The\r
+         interpretation of the content is defined by the key\r
+         algorithm.  For example, a DSA key is an integer, an RSA\r
+         key is represented as RSAPrivateKey as defined in\r
+         RFC 8017, and an Elliptic Curve Cryptography (ECC) key\r
+         is represented as ECPrivateKey as defined in RFC 5915.";\r
+      reference\r
+        "RFC 8017: Public-Key Cryptography Standards (PKCS) #1:\r
+                   RSA Cryptography Specifications Version 2.2.\r
+         RFC 5915: Elliptic Curve Private Key Structure.";\r
+    } // private-key\r
+\r
+    action generate-hidden-key {\r
+      nacm:default-deny-all;\r
+      description\r
+        "Requests the device to generate a hidden key using the\r
+         specified asymmetric key algorithm.  This action is\r
+         used to request the system to generate a key that is\r
+         'permanently-hidden', perhaps protected by a cryptographic\r
+         hardware module.  The resulting asymmetric key values are\r
+         considered operational state and hence present only in\r
+         <operational> and bound to the lifetime of the parent\r
+         'config true' node.  Subsequent invocations of this or\r
+         the 'install-hidden-key' action are denied with error-tag\r
+         'data-exists'.";\r
+      input {\r
+        leaf algorithm {\r
+          type asymmetric-key-algorithm-ref;\r
+          mandatory true;\r
+          description\r
+            "The algorithm to be used when generating the\r
+             asymmetric key.";\r
+          reference\r
+            "RFC CCCC: Common YANG Data Types for Cryptography";\r
+        }\r
+      }\r
+    } // generate-hidden-key\r
+\r
+    action install-hidden-key {\r
+      nacm:default-deny-all;\r
+      description\r
+        "Requests the device to load the specified values into\r
+         a hidden key.  The resulting asymmetric key values are\r
+         considered operational state and hence present only in\r
+         <operational> and bound to the lifetime of the parent\r
+         'config true' node.  Subsequent invocations of this\r
+         or the 'generate-hidden-key' action are denied with\r
+         error-tag 'data-exists'.";\r
+      input {\r
+        leaf algorithm {\r
+          type asymmetric-key-algorithm-ref;\r
+          mandatory true;\r
+          description\r
+            "The algorithm to be used when generating the\r
+             asymmetric key.";\r
+          reference\r
+            "RFC CCCC: Common YANG Data Types for Cryptography";\r
+        }\r
+        leaf public-key {\r
+          type binary;\r
+          description\r
+            "A binary that contains the value of the public key.\r
+             The interpretation of the content is defined by the key\r
+             algorithm.  For example, a DSA key is an integer, an\r
+             RSA key is represented as RSAPublicKey as defined in\r
+             RFC 8017, and an Elliptic Curve Cryptography (ECC) key\r
+             is represented using the 'publicKey' described in\r
+             RFC 5915.";\r
+          reference\r
+            "RFC 8017: Public-Key Cryptography Standards (PKCS) #1:\r
+                       RSA Cryptography Specifications Version 2.2.\r
+             RFC 5915: Elliptic Curve Private Key Structure.";\r
+        }\r
+        leaf private-key {\r
+          type binary;\r
+          description\r
+            "A binary that contains the value of the private key.\r
+             The interpretation of the content is defined by the key\r
+             algorithm.  For example, a DSA key is an integer, an RSA\r
+             key is represented as RSAPrivateKey as defined in\r
+             RFC 8017, and an Elliptic Curve Cryptography (ECC) key\r
+             is represented as ECPrivateKey as defined in RFC 5915.";\r
+          reference\r
+            "RFC 8017: Public-Key Cryptography Standards (PKCS) #1:\r
+                       RSA Cryptography Specifications Version 2.2.\r
+             RFC 5915: Elliptic Curve Private Key Structure.";\r
+        }\r
+      }\r
+    } // install-hidden-key\r
+  } // asymmetric-key-pair-grouping\r
+\r
+\r
+  grouping trust-anchor-cert-grouping {\r
+    description\r
+      "A trust anchor certificate, and a notification for when\r
+       it is about to (or already has) expire.";\r
+    leaf cert {\r
+      nacm:default-deny-write;\r
+      type trust-anchor-cert-cms;\r
+      description\r
+        "The binary certificate data for this certificate.";\r
+      reference\r
+        "RFC YYYY: Common YANG Data Types for Cryptography";\r
+    }\r
+    notification certificate-expiration {\r
+      description\r
+        "A notification indicating that the configured certificate\r
+         is either about to expire or has already expired.  When to\r
+         send notifications is an implementation specific decision,\r
+         but it is RECOMMENDED that a notification be sent once a\r
+         month for 3 months, then once a week for four weeks, and\r
+         then once a day thereafter until the issue is resolved.";\r
+      leaf expiration-date {\r
+        type yang:date-and-time;\r
+        mandatory true;\r
+        description\r
+          "Identifies the expiration date on the certificate.";\r
+      }\r
+    }\r
+  }\r
+\r
+  grouping trust-anchor-certs-grouping {\r
+    description\r
+      "A list of trust anchor certificates, and a notification\r
+       for when one is about to (or already has) expire.";\r
+    leaf-list cert {\r
+      nacm:default-deny-write;\r
+      type trust-anchor-cert-cms;\r
+      description\r
+        "The binary certificate data for this certificate.";\r
+      reference\r
+        "RFC YYYY: Common YANG Data Types for Cryptography";\r
+    }\r
+    notification certificate-expiration {\r
+      description\r
+        "A notification indicating that the configured certificate\r
+         is either about to expire or has already expired.  When to\r
+         send notifications is an implementation specific decision,\r
+         but it is RECOMMENDED that a notification be sent once a\r
+         month for 3 months, then once a week for four weeks, and\r
+         then once a day thereafter until the issue is resolved.";\r
+      leaf expiration-date {\r
+        type yang:date-and-time;\r
+        mandatory true;\r
+        description\r
+          "Identifies the expiration date on the certificate.";\r
+      }\r
+    }\r
+  }\r
+\r
+  grouping end-entity-cert-grouping {\r
+    description\r
+      "An end entity certificate, and a notification for when\r
+       it is about to (or already has) expire.";\r
+    leaf cert {\r
+      nacm:default-deny-write;\r
+      type end-entity-cert-cms;\r
+      description\r
+        "The binary certificate data for this certificate.";\r
+      reference\r
+        "RFC YYYY: Common YANG Data Types for Cryptography";\r
+    }\r
+    notification certificate-expiration {\r
+      description\r
+        "A notification indicating that the configured certificate\r
+         is either about to expire or has already expired.  When to\r
+         send notifications is an implementation specific decision,\r
+         but it is RECOMMENDED that a notification be sent once a\r
+         month for 3 months, then once a week for four weeks, and\r
+         then once a day thereafter until the issue is resolved.";\r
+      leaf expiration-date {\r
+        type yang:date-and-time;\r
+        mandatory true;\r
+        description\r
+          "Identifies the expiration date on the certificate.";\r
+      }\r
+    }\r
+  }\r
+\r
+  grouping end-entity-certs-grouping {\r
+    description\r
+      "A list of end entity certificates, and a notification for\r
+       when one is about to (or already has) expire.";\r
+    leaf-list cert {\r
+      nacm:default-deny-write;\r
+      type end-entity-cert-cms;\r
+      description\r
+        "The binary certificate data for this certificate.";\r
+      reference\r
+        "RFC YYYY: Common YANG Data Types for Cryptography";\r
+    }\r
+    notification certificate-expiration {\r
+      description\r
+        "A notification indicating that the configured certificate\r
+         is either about to expire or has already expired.  When to\r
+         send notifications is an implementation specific decision,\r
+         but it is RECOMMENDED that a notification be sent once a\r
+         month for 3 months, then once a week for four weeks, and\r
+         then once a day thereafter until the issue is resolved.";\r
+      leaf expiration-date {\r
+        type yang:date-and-time;\r
+        mandatory true;\r
+        description\r
+          "Identifies the expiration date on the certificate.";\r
+      }\r
+    }\r
+  }\r
+\r
+  grouping asymmetric-key-pair-with-cert-grouping {\r
+    description\r
+      "A private/public key pair and an associated certificate.";\r
+    uses asymmetric-key-pair-grouping;\r
+    uses end-entity-cert-grouping;\r
+\r
+    action generate-certificate-signing-request {\r
+      nacm:default-deny-all;\r
+      description\r
+        "Generates a certificate signing request structure for\r
+         the associated asymmetric key using the passed subject\r
+         and attribute values.  The specified assertions need\r
+         to be appropriate for the certificate's use.  For\r
+         example, an entity certificate for a TLS server\r
+         SHOULD have values that enable clients to satisfy\r
+         RFC 6125 processing.";\r
+      input {\r
+        leaf subject {\r
+          type binary;\r
+          mandatory true;\r
+          description\r
+            "The 'subject' field per the CertificationRequestInfo\r
+              structure as specified by RFC 2986, Section 4.1\r
+              encoded using the ASN.1 distinguished encoding\r
+              rules (DER), as specified in ITU-T X.690.";\r
+          reference\r
+            "RFC 2986:\r
+               PKCS #10: Certification Request Syntax\r
+                         Specification Version 1.7.\r
+             ITU-T X.690:\r
+               Information technology - ASN.1 encoding rules:\r
+               Specification of Basic Encoding Rules (BER),\r
+               Canonical Encoding Rules (CER) and Distinguished\r
+               Encoding Rules (DER).";\r
+        }\r
+        leaf attributes {\r
+          type binary;\r
+          description\r
+            "The 'attributes' field from the structure\r
+             CertificationRequestInfo as specified by RFC 2986,\r
+             Section 4.1 encoded using the ASN.1 distinguished\r
+             encoding rules (DER), as specified in ITU-T X.690.";\r
+          reference\r
+            "RFC 2986:\r
+               PKCS #10: Certification Request Syntax\r
+                         Specification Version 1.7.\r
+             ITU-T X.690:\r
+               Information technology - ASN.1 encoding rules:\r
+               Specification of Basic Encoding Rules (BER),\r
+               Canonical Encoding Rules (CER) and Distinguished\r
+               Encoding Rules (DER).";\r
+        }\r
+      }\r
+      output {\r
+        leaf certificate-signing-request {\r
+          type binary;\r
+          mandatory true;\r
+          description\r
+            "A CertificationRequest structure as specified by\r
+             RFC 2986, Section 4.2 encoded using the ASN.1\r
+             distinguished encoding rules (DER), as specified\r
+             in ITU-T X.690.";\r
+          reference\r
+            "RFC 2986:\r
+               PKCS #10: Certification Request Syntax\r
+                         Specification Version 1.7.\r
+             ITU-T X.690:\r
+               Information technology - ASN.1 encoding rules:\r
+               Specification of Basic Encoding Rules (BER),\r
+               Canonical Encoding Rules (CER) and Distinguished\r
+               Encoding Rules (DER).";\r
+        }\r
+      }\r
+    } // generate-certificate-signing-request\r
+  } // asymmetric-key-pair-with-cert-grouping\r
+\r
+\r
+  grouping asymmetric-key-pair-with-certs-grouping {\r
+    description\r
+      "A private/public key pair and associated certificates.";\r
+    uses asymmetric-key-pair-grouping;\r
+    container certificates {\r
+      nacm:default-deny-write;\r
+      description\r
+        "Certificates associated with this asymmetric key.\r
+         More than one certificate supports, for instance,\r
+         a TPM-protected asymmetric key that has both IDevID\r
+         and LDevID certificates associated.";\r
+      list certificate {\r
+        key "name";\r
+        description\r
+          "A certificate for this asymmetric key.";\r
+        leaf name {\r
+          type string;\r
+          description\r
+            "An arbitrary name for the certificate.  If the name\r
+             matches the name of a certificate that exists\r
+             independently in <operational> (i.e., an IDevID),\r
+             then the 'cert' node MUST NOT be configured.";\r
+        }\r
+        uses end-entity-cert-grouping;\r
+      }\r
+    } // certificates\r
+\r
+    action generate-certificate-signing-request {\r
+      nacm:default-deny-all;\r
+      description\r
+        "Generates a certificate signing request structure for\r
+         the associated asymmetric key using the passed subject\r
+         and attribute values.  The specified assertions need\r
+         to be appropriate for the certificate's use.  For\r
+         example, an entity certificate for a TLS server\r
+         SHOULD have values that enable clients to satisfy\r
+         RFC 6125 processing.";\r
+      input {\r
+        leaf subject {\r
+          type binary;\r
+          mandatory true;\r
+          description\r
+            "The 'subject' field per the CertificationRequestInfo\r
+              structure as specified by RFC 2986, Section 4.1\r
+              encoded using the ASN.1 distinguished encoding\r
+              rules (DER), as specified in ITU-T X.690.";\r
+          reference\r
+            "RFC 2986:\r
+               PKCS #10: Certification Request Syntax\r
+                         Specification Version 1.7.\r
+             ITU-T X.690:\r
+               Information technology - ASN.1 encoding rules:\r
+               Specification of Basic Encoding Rules (BER),\r
+               Canonical Encoding Rules (CER) and Distinguished\r
+               Encoding Rules (DER).";\r
+        }\r
+        leaf attributes {\r
+          type binary;\r
+          description\r
+            "The 'attributes' field from the structure\r
+             CertificationRequestInfo as specified by RFC 2986,\r
+             Section 4.1 encoded using the ASN.1 distinguished\r
+             encoding rules (DER), as specified in ITU-T X.690.";\r
+          reference\r
+            "RFC 2986:\r
+               PKCS #10: Certification Request Syntax\r
+                         Specification Version 1.7.\r
+             ITU-T X.690:\r
+               Information technology - ASN.1 encoding rules:\r
+               Specification of Basic Encoding Rules (BER),\r
+               Canonical Encoding Rules (CER) and Distinguished\r
+               Encoding Rules (DER).";\r
+        }\r
+      }\r
+      output {\r
+        leaf certificate-signing-request {\r
+          type binary;\r
+          mandatory true;\r
+          description\r
+            "A CertificationRequest structure as specified by\r
+             RFC 2986, Section 4.2 encoded using the ASN.1\r
+             distinguished encoding rules (DER), as specified\r
+             in ITU-T X.690.";\r
+          reference\r
+            "RFC 2986:\r
+               PKCS #10: Certification Request Syntax\r
+                         Specification Version 1.7.\r
+             ITU-T X.690:\r
+               Information technology - ASN.1 encoding rules:\r
+               Specification of Basic Encoding Rules (BER),\r
+               Canonical Encoding Rules (CER) and Distinguished\r
+               Encoding Rules (DER).";\r
+        }\r
+      }\r
+    } // generate-certificate-signing-request\r
+  } // asymmetric-key-pair-with-certs-grouping\r
+}\r
diff --git a/netconf-server/schemas/ietf-hardware.yang b/netconf-server/schemas/ietf-hardware.yang
new file mode 100644 (file)
index 0000000..d909018
--- /dev/null
@@ -0,0 +1,1141 @@
+module ietf-hardware {\r
+yang-version 1.1;\r
+namespace "urn:ietf:params:xml:ns:yang:ietf-hardware";\r
+prefix hw;\r
+\r
+import ietf-inet-types {\r
+  prefix inet;\r
+}\r
+import ietf-yang-types {\r
+  prefix yang;\r
+}\r
+import iana-hardware {\r
+  prefix ianahw;\r
+}\r
+\r
+organization\r
+  "IETF NETMOD (Network Modeling) Working Group";\r
+\r
+contact\r
+  "WG Web:   <https://datatracker.ietf.org/wg/netmod/>\r
+   WG List:  <mailto:netmod@ietf.org>\r
+   Editor:   Andy Bierman\r
+             <mailto:andy@yumaworks.com>\r
+   Editor:   Martin Bjorklund\r
+             <mailto:mbj@tail-f.com>\r
+   Editor:   Jie Dong\r
+             <mailto:jie.dong@huawei.com>\r
+   Editor:   Dan Romascanu\r
+             <mailto:dromasca@gmail.com>";\r
+\r
+description\r
+  "This module contains a collection of YANG definitions for\r
+   managing hardware.\r
+   This data model is designed for the Network Management Datastore\r
+   Architecture (NMDA) defined in RFC 8342.\r
+   Copyright (c) 2018 IETF Trust and the persons identified as\r
+   authors of the code.  All rights reserved.\r
+   Redistribution and use in source and binary forms, with or\r
+   without modification, is permitted pursuant to, and subject\r
+   to the license terms contained in, the Simplified BSD License\r
+   set forth in Section 4.c of the IETF Trust's Legal Provisions\r
+   Relating to IETF Documents\r
+   (https://trustee.ietf.org/license-info).\r
+   This version of this YANG module is part of RFC 8348; see\r
+   the RFC itself for full legal notices.";\r
+\r
+revision 2018-03-13 {\r
+  description\r
+    "Initial revision.";\r
+  reference\r
+    "RFC 8348: A YANG Data Model for Hardware Management";\r
+}\r
+\r
+/*\r
+ * Features\r
+ */\r
+\r
+feature entity-mib {\r
+  description\r
+    "This feature indicates that the device implements\r
+     the ENTITY-MIB.";\r
+  reference\r
+    "RFC 6933: Entity MIB (Version 4)";\r
+}\r
+\r
+feature hardware-state {\r
+  description\r
+    "Indicates that ENTITY-STATE-MIB objects are supported";\r
+  reference\r
+    "RFC 4268: Entity State MIB";\r
+}\r
+\r
+feature hardware-sensor {\r
+  description\r
+    "Indicates that ENTITY-SENSOR-MIB objects are supported";\r
+  reference\r
+    "RFC 3433: Entity Sensor Management Information Base";\r
+}\r
+\r
+/*\r
+ * Typedefs\r
+ */\r
+\r
+typedef admin-state {\r
+  type enumeration {\r
+    enum unknown {\r
+      value 1;\r
+      description\r
+        "The resource is unable to report administrative state.";\r
+    }\r
+    enum locked {\r
+      value 2;\r
+      description\r
+        "The resource is administratively prohibited from use.";\r
+    }\r
+    enum shutting-down {\r
+      value 3;\r
+      description\r
+        "The resource usage is administratively limited to current\r
+         instances of use.";\r
+    }\r
+    enum unlocked {\r
+      value 4;\r
+      description\r
+        "The resource is not administratively prohibited from\r
+         use.";\r
+    }\r
+  }\r
+  description\r
+    "Represents the various possible administrative states.";\r
+  reference\r
+    "RFC 4268: Entity State MIB - EntityAdminState";\r
+}\r
+\r
+typedef oper-state {\r
+  type enumeration {\r
+    enum unknown {\r
+      value 1;\r
+      description\r
+        "The resource is unable to report its operational state.";\r
+    }\r
+    enum disabled {\r
+      value 2;\r
+      description\r
+        "The resource is totally inoperable.";\r
+    }\r
+    enum enabled {\r
+      value 3;\r
+\r
+      description\r
+        "The resource is partially or fully operable.";\r
+    }\r
+    enum testing {\r
+      value 4;\r
+      description\r
+        "The resource is currently being tested and cannot\r
+         therefore report whether or not it is operational.";\r
+    }\r
+  }\r
+  description\r
+    "Represents the possible values of operational states.";\r
+  reference\r
+    "RFC 4268: Entity State MIB - EntityOperState";\r
+}\r
+\r
+typedef usage-state {\r
+  type enumeration {\r
+    enum unknown {\r
+      value 1;\r
+      description\r
+        "The resource is unable to report usage state.";\r
+    }\r
+    enum idle {\r
+      value 2;\r
+      description\r
+        "The resource is servicing no users.";\r
+    }\r
+    enum active {\r
+      value 3;\r
+      description\r
+        "The resource is currently in use, and it has sufficient\r
+         spare capacity to provide for additional users.";\r
+    }\r
+    enum busy {\r
+      value 4;\r
+      description\r
+        "The resource is currently in use, but it currently has no\r
+         spare capacity to provide for additional users.";\r
+    }\r
+  }\r
+  description\r
+    "Represents the possible values of usage states.";\r
+  reference\r
+    "RFC 4268: Entity State MIB -  EntityUsageState";\r
+}\r
+\r
+typedef alarm-state {\r
+  type bits {\r
+    bit unknown {\r
+      position 0;\r
+      description\r
+        "The resource is unable to report alarm state.";\r
+    }\r
+    bit under-repair {\r
+      position 1;\r
+      description\r
+        "The resource is currently being repaired, which, depending\r
+         on the implementation, may make the other values in this\r
+         bit string not meaningful.";\r
+    }\r
+    bit critical {\r
+      position 2;\r
+      description\r
+        "One or more critical alarms are active against the\r
+         resource.";\r
+    }\r
+    bit major {\r
+      position 3;\r
+      description\r
+        "One or more major alarms are active against the\r
+         resource.";\r
+    }\r
+    bit minor {\r
+      position 4;\r
+      description\r
+        "One or more minor alarms are active against the\r
+         resource.";\r
+    }\r
+    bit warning {\r
+      position 5;\r
+      description\r
+        "One or more warning alarms are active against the\r
+         resource.";\r
+    }\r
+    bit indeterminate {\r
+      position 6;\r
+      description\r
+        "One or more alarms of whose perceived severity cannot be\r
+         determined are active against this resource.";\r
+    }\r
+  }\r
+  description\r
+    "Represents the possible values of alarm states.  An alarm is a\r
+     persistent indication of an error or warning condition.\r
+     When no bits of this attribute are set, then no active alarms\r
+     are known against this component and it is not under repair.";\r
+  reference\r
+    "RFC 4268: Entity State MIB - EntityAlarmStatus";\r
+}\r
+\r
+typedef standby-state {\r
+  type enumeration {\r
+    enum unknown {\r
+      value 1;\r
+      description\r
+        "The resource is unable to report standby state.";\r
+    }\r
+    enum hot-standby {\r
+      value 2;\r
+      description\r
+        "The resource is not providing service, but it will be\r
+         immediately able to take over the role of the resource to\r
+         be backed up, without the need for initialization\r
+         activity, and will contain the same information as the\r
+         resource to be backed up.";\r
+    }\r
+    enum cold-standby {\r
+      value 3;\r
+      description\r
+        "The resource is to back up another resource, but it will\r
+         not be immediately able to take over the role of a\r
+         resource to be backed up and will require some\r
+         initialization activity.";\r
+    }\r
+    enum providing-service {\r
+      value 4;\r
+      description\r
+        "The resource is providing service.";\r
+    }\r
+  }\r
+  description\r
+    "Represents the possible values of standby states.";\r
+  reference\r
+    "RFC 4268: Entity State MIB - EntityStandbyStatus";\r
+}\r
+\r
+typedef sensor-value-type {\r
+  type enumeration {\r
+    enum other {\r
+      value 1;\r
+      description\r
+        "A measure other than those listed below.";\r
+    }\r
+    enum unknown {\r
+      value 2;\r
+      description\r
+        "An unknown measurement or arbitrary, relative numbers";\r
+    }\r
+    enum volts-AC {\r
+      value 3;\r
+      description\r
+        "A measure of electric potential (alternating current).";\r
+    }\r
+    enum volts-DC {\r
+      value 4;\r
+      description\r
+        "A measure of electric potential (direct current).";\r
+    }\r
+    enum amperes {\r
+      value 5;\r
+      description\r
+        "A measure of electric current.";\r
+    }\r
+    enum watts {\r
+      value 6;\r
+      description\r
+        "A measure of power.";\r
+    }\r
+    enum hertz {\r
+      value 7;\r
+      description\r
+        "A measure of frequency.";\r
+    }\r
+    enum celsius {\r
+      value 8;\r
+      description\r
+        "A measure of temperature.";\r
+    }\r
+    enum percent-RH {\r
+      value 9;\r
+      description\r
+        "A measure of percent relative humidity.";\r
+    }\r
+    enum rpm {\r
+      value 10;\r
+      description\r
+        "A measure of shaft revolutions per minute.";\r
+    }\r
+    enum cmm {\r
+      value 11;\r
+      description\r
+        "A measure of cubic meters per minute (airflow).";\r
+    }\r
+    enum truth-value {\r
+      value 12;\r
+      description\r
+        "Value is one of 1 (true) or 2 (false)";\r
+    }\r
+  }\r
+  description\r
+    "A node using this data type represents the sensor measurement\r
+     data type associated with a physical sensor value.  The actual\r
+     data units are determined by examining a node of this type\r
+     together with the associated sensor-value-scale node.\r
+     A node of this type SHOULD be defined together with nodes of\r
+     type sensor-value-scale and type sensor-value-precision.\r
+     These three types are used to identify the semantics of a node\r
+     of type sensor-value.";\r
+  reference\r
+    "RFC 3433: Entity Sensor Management Information Base -\r
+               EntitySensorDataType";\r
+}\r
+\r
+typedef sensor-value-scale {\r
+  type enumeration {\r
+    enum yocto {\r
+      value 1;\r
+      description\r
+        "Data scaling factor of 10^-24.";\r
+    }\r
+    enum zepto {\r
+      value 2;\r
+      description\r
+        "Data scaling factor of 10^-21.";\r
+    }\r
+    enum atto {\r
+      value 3;\r
+      description\r
+        "Data scaling factor of 10^-18.";\r
+    }\r
+    enum femto {\r
+      value 4;\r
+      description\r
+        "Data scaling factor of 10^-15.";\r
+    }\r
+    enum pico {\r
+      value 5;\r
+      description\r
+        "Data scaling factor of 10^-12.";\r
+    }\r
+    enum nano {\r
+      value 6;\r
+      description\r
+        "Data scaling factor of 10^-9.";\r
+    }\r
+    enum micro {\r
+      value 7;\r
+      description\r
+        "Data scaling factor of 10^-6.";\r
+    }\r
+    enum milli {\r
+      value 8;\r
+      description\r
+        "Data scaling factor of 10^-3.";\r
+    }\r
+    enum units {\r
+      value 9;\r
+      description\r
+        "Data scaling factor of 10^0.";\r
+    }\r
+    enum kilo {\r
+      value 10;\r
+      description\r
+        "Data scaling factor of 10^3.";\r
+    }\r
+    enum mega {\r
+      value 11;\r
+      description\r
+        "Data scaling factor of 10^6.";\r
+    }\r
+    enum giga {\r
+      value 12;\r
+      description\r
+        "Data scaling factor of 10^9.";\r
+    }\r
+    enum tera {\r
+      value 13;\r
+      description\r
+        "Data scaling factor of 10^12.";\r
+    }\r
+    enum peta {\r
+      value 14;\r
+      description\r
+        "Data scaling factor of 10^15.";\r
+    }\r
+    enum exa {\r
+      value 15;\r
+      description\r
+        "Data scaling factor of 10^18.";\r
+    }\r
+    enum zetta {\r
+      value 16;\r
+      description\r
+        "Data scaling factor of 10^21.";\r
+    }\r
+    enum yotta {\r
+      value 17;\r
+      description\r
+        "Data scaling factor of 10^24.";\r
+    }\r
+  }\r
+  description\r
+    "A node using this data type represents a data scaling factor,\r
+     represented with an International System of Units (SI) prefix.\r
+     The actual data units are determined by examining a node of\r
+     this type together with the associated sensor-value-type.\r
+     A node of this type SHOULD be defined together with nodes of\r
+     type sensor-value-type and type sensor-value-precision.\r
+     Together, associated nodes of these three types are used to\r
+     identify the semantics of a node of type sensor-value.";\r
+  reference\r
+    "RFC 3433: Entity Sensor Management Information Base -\r
+               EntitySensorDataScale";\r
+}\r
+\r
+typedef sensor-value-precision {\r
+  type int8 {\r
+    range "-8 .. 9";\r
+  }\r
+  description\r
+    "A node using this data type represents a sensor value\r
+     precision range.\r
+     A node of this type SHOULD be defined together with nodes of\r
+     type sensor-value-type and type sensor-value-scale.  Together,\r
+     associated nodes of these three types are used to identify the\r
+     semantics of a node of type sensor-value.\r
+     If a node of this type contains a value in the range 1 to 9,\r
+     it represents the number of decimal places in the fractional\r
+     part of an associated sensor-value fixed-point number.\r
+     If a node of this type contains a value in the range -8 to -1,\r
+     it represents the number of accurate digits in the associated\r
+     sensor-value fixed-point number.\r
+     The value zero indicates the associated sensor-value node is\r
+     not a fixed-point number.\r
+     Server implementers must choose a value for the associated\r
+     sensor-value-precision node so that the precision and accuracy\r
+     of the associated sensor-value node is correctly indicated.\r
+     For example, a component representing a temperature sensor\r
+     that can measure 0 to 100 degrees C in 0.1 degree\r
+     increments, +/- 0.05 degrees, would have a\r
+     sensor-value-precision value of '1', a sensor-value-scale\r
+     value of 'units', and a sensor-value ranging from '0' to\r
+     '1000'.  The sensor-value would be interpreted as\r
+     'degrees C * 10'.";\r
+  reference\r
+    "RFC 3433: Entity Sensor Management Information Base -\r
+               EntitySensorPrecision";\r
+}\r
+\r
+typedef sensor-value {\r
+  type int32 {\r
+    range "-1000000000 .. 1000000000";\r
+  }\r
+  description\r
+   "A node using this data type represents a sensor value.\r
+    A node of this type SHOULD be defined together with nodes of\r
+    type sensor-value-type, type sensor-value-scale, and\r
+    type sensor-value-precision.  Together, associated nodes of\r
+    those three types are used to identify the semantics of a node\r
+    of this data type.\r
+    The semantics of a node using this data type are determined by\r
+    the value of the associated sensor-value-type node.\r
+    If the associated sensor-value-type node is equal to 'voltsAC',\r
+    'voltsDC', 'amperes', 'watts', 'hertz', 'celsius', or 'cmm',\r
+    then a node of this type MUST contain a fixed-point number\r
+    ranging from -999,999,999 to +999,999,999.  The value\r
+    -1000000000 indicates an underflow error.  The value\r
+    +1000000000 indicates an overflow error.  The\r
+    sensor-value-precision indicates how many fractional digits\r
+    are represented in the associated sensor-value node.\r
+    If the associated sensor-value-type node is equal to\r
+    'percentRH', then a node of this type MUST contain a number\r
+    ranging from 0 to 100.\r
+    If the associated sensor-value-type node is equal to 'rpm',\r
+    then a node of this type MUST contain a number ranging from\r
+    -999,999,999 to +999,999,999.\r
+    If the associated sensor-value-type node is equal to\r
+    'truth-value', then a node of this type MUST contain either the\r
+    value 1 (true) or the value 2 (false).\r
+    If the associated sensor-value-type node is equal to 'other' or\r
+    'unknown', then a node of this type MUST contain a number\r
+    ranging from -1000000000 to 1000000000.";\r
+  reference\r
+    "RFC 3433: Entity Sensor Management Information Base -\r
+               EntitySensorValue";\r
+}\r
+\r
+typedef sensor-status {\r
+  type enumeration {\r
+    enum ok {\r
+      value 1;\r
+      description\r
+        "Indicates that the server can obtain the sensor value.";\r
+    }\r
+    enum unavailable {\r
+      value 2;\r
+      description\r
+        "Indicates that the server presently cannot obtain the\r
+         sensor value.";\r
+    }\r
+    enum nonoperational {\r
+      value 3;\r
+      description\r
+        "Indicates that the server believes the sensor is broken.\r
+         The sensor could have a hard failure (disconnected wire)\r
+         or a soft failure such as out-of-range, jittery, or wildly\r
+         fluctuating readings.";\r
+    }\r
+  }\r
+  description\r
+    "A node using this data type represents the operational status\r
+     of a physical sensor.";\r
+  reference\r
+    "RFC 3433: Entity Sensor Management Information Base -\r
+               EntitySensorStatus";\r
+}\r
+\r
+/*\r
+ * Data nodes\r
+ */\r
+\r
+container hardware {\r
+  description\r
+    "Data nodes representing components.\r
+     If the server supports configuration of hardware components,\r
+     then this data model is instantiated in the configuration\r
+     datastores supported by the server.  The leaf-list 'datastore'\r
+     for the module 'ietf-hardware' in the YANG library provides\r
+     this information.";\r
+\r
+  leaf last-change {\r
+    type yang:date-and-time;\r
+    config false;\r
+    description\r
+      "The time the '/hardware/component' list changed in the\r
+       operational state.";\r
+  }\r
+\r
+  list component {\r
+    key name;\r
+    description\r
+      "List of components.\r
+       When the server detects a new hardware component, it\r
+       initializes a list entry in the operational state.\r
+       If the server does not support configuration of hardware\r
+       components, list entries in the operational state are\r
+       initialized with values for all nodes as detected by the\r
+       implementation.\r
+       Otherwise, this procedure is followed:\r
+         1. If there is an entry in the '/hardware/component' list\r
+            in the intended configuration with values for the nodes\r
+            'class', 'parent', and 'parent-rel-pos' that are equal\r
+            to the detected values, then the list entry in the\r
+            operational state is initialized with the configured\r
+            values, including the 'name'.\r
+         2. Otherwise (i.e., there is no matching configuration\r
+            entry), the list entry in the operational state is\r
+            initialized with values for all nodes as detected by\r
+            the implementation.\r
+       If the '/hardware/component' list in the intended\r
+       configuration is modified, then the system MUST behave as if\r
+       it re-initializes itself and follow the procedure in (1).";\r
+    reference\r
+      "RFC 6933: Entity MIB (Version 4) - entPhysicalEntry";\r
+\r
+    leaf name {\r
+      type string;\r
+      description\r
+        "The name assigned to this component.\r
+         This name is not required to be the same as\r
+         entPhysicalName.";\r
+    }\r
+\r
+    leaf class {\r
+      type identityref {\r
+        base ianahw:hardware-class;\r
+      }\r
+      mandatory true;\r
+      description\r
+        "An indication of the general hardware type of the\r
+         component.";\r
+      reference\r
+        "RFC 6933: Entity MIB (Version 4) - entPhysicalClass";\r
+    }\r
+\r
+    leaf physical-index {\r
+      if-feature entity-mib;\r
+      type int32 {\r
+        range "1..2147483647";\r
+      }\r
+      config false;\r
+      description\r
+        "The entPhysicalIndex for the entPhysicalEntry represented\r
+         by this list entry.";\r
+      reference\r
+        "RFC 6933: Entity MIB (Version 4) - entPhysicalIndex";\r
+    }\r
+\r
+    leaf description {\r
+      type string;\r
+      config false;\r
+      description\r
+        "A textual description of the component.  This node should\r
+         contain a string that identifies the manufacturer's name\r
+         for the component and should be set to a distinct value\r
+         for each version or model of the component.";\r
+      reference\r
+        "RFC 6933: Entity MIB (Version 4) - entPhysicalDescr";\r
+    }\r
+\r
+    leaf parent {\r
+      type leafref {\r
+        path "../../component/name";\r
+        require-instance false;\r
+      }\r
+      description\r
+        "The name of the component that physically contains this\r
+         component.\r
+         If this leaf is not instantiated, it indicates that this\r
+         component is not contained in any other component.\r
+         In the event that a physical component is contained by\r
+         more than one physical component (e.g., double-wide\r
+         modules), this node contains the name of one of these\r
+         components.  An implementation MUST use the same name\r
+         every time this node is instantiated.";\r
+      reference\r
+        "RFC 6933: Entity MIB (Version 4) - entPhysicalContainedIn";\r
+    }\r
+\r
+    leaf parent-rel-pos {\r
+      type int32 {\r
+        range "0 .. 2147483647";\r
+      }\r
+      description\r
+        "An indication of the relative position of this child\r
+         component among all its sibling components.  Sibling\r
+         components are defined as components that:\r
+           o share the same value of the 'parent' node and\r
+           o share a common base identity for the 'class' node.\r
+         Note that the last rule gives implementations flexibility\r
+         in how components are numbered.  For example, some\r
+         implementations might have a single number series for all\r
+         components derived from 'ianahw:port', while some others\r
+         might have different number series for different\r
+         components with identities derived from 'ianahw:port' (for\r
+         example, one for registered jack 45 (RJ45) and one for\r
+         small form-factor pluggable (SFP)).";\r
+\r
+      reference\r
+        "RFC 6933: Entity MIB (Version 4) -\r
+                   entPhysicalParentRelPos";\r
+    }\r
+\r
+    leaf-list contains-child {\r
+      type leafref {\r
+        path "../../component/name";\r
+      }\r
+      config false;\r
+      description\r
+        "The name of the contained component.";\r
+      reference\r
+        "RFC 6933: Entity MIB (Version 4) - entPhysicalChildIndex";\r
+    }\r
+\r
+    leaf hardware-rev {\r
+      type string;\r
+      config false;\r
+      description\r
+        "The vendor-specific hardware revision string for the\r
+         component.  The preferred value is the hardware revision\r
+         identifier actually printed on the component itself (if\r
+         present).";\r
+      reference\r
+        "RFC 6933: Entity MIB (Version 4) -\r
+                   entPhysicalHardwareRev";\r
+    }\r
+\r
+    leaf firmware-rev {\r
+      type string;\r
+      config false;\r
+      description\r
+        "The vendor-specific firmware revision string for the\r
+         component.";\r
+      reference\r
+        "RFC 6933: Entity MIB (Version 4) -\r
+                   entPhysicalFirmwareRev";\r
+    }\r
+\r
+    leaf software-rev {\r
+      type string;\r
+      config false;\r
+\r
+      description\r
+        "The vendor-specific software revision string for the\r
+         component.";\r
+      reference\r
+        "RFC 6933: Entity MIB (Version 4) -\r
+                   entPhysicalSoftwareRev";\r
+    }\r
+\r
+    leaf serial-num {\r
+      type string;\r
+      config false;\r
+      description\r
+        "The vendor-specific serial number string for the\r
+         component.  The preferred value is the serial number\r
+         string actually printed on the component itself (if\r
+         present).";\r
+      reference\r
+        "RFC 6933: Entity MIB (Version 4) - entPhysicalSerialNum";\r
+    }\r
+\r
+    leaf mfg-name {\r
+      type string;\r
+      config false;\r
+      description\r
+        "The name of the manufacturer of this physical component.\r
+         The preferred value is the manufacturer name string\r
+         actually printed on the component itself (if present).\r
+         Note that comparisons between instances of the\r
+         'model-name', 'firmware-rev', 'software-rev', and\r
+         'serial-num' nodes are only meaningful amongst components\r
+         with the same value of 'mfg-name'.\r
+         If the manufacturer name string associated with the\r
+         physical component is unknown to the server, then this\r
+         node is not instantiated.";\r
+      reference\r
+        "RFC 6933: Entity MIB (Version 4) - entPhysicalMfgName";\r
+    }\r
+\r
+    leaf model-name {\r
+      type string;\r
+      config false;\r
+      description\r
+        "The vendor-specific model name identifier string\r
+         associated with this physical component.  The preferred\r
+         value is the customer-visible part number, which may be\r
+         printed on the component itself.\r
+         If the model name string associated with the physical\r
+         component is unknown to the server, then this node is not\r
+         instantiated.";\r
+      reference\r
+        "RFC 6933: Entity MIB (Version 4) - entPhysicalModelName";\r
+    }\r
+\r
+    leaf alias {\r
+      type string;\r
+      description\r
+        "An 'alias' name for the component, as specified by a\r
+         network manager, that provides a non-volatile 'handle' for\r
+         the component.\r
+         If no configured value exists, the server MAY set the\r
+         value of this node to a locally unique value in the\r
+         operational state.\r
+         A server implementation MAY map this leaf to the\r
+         entPhysicalAlias MIB object.  Such an implementation needs\r
+         to use some mechanism to handle the differences in size\r
+         and characters allowed between this leaf and\r
+         entPhysicalAlias.  The definition of such a mechanism is\r
+         outside the scope of this document.";\r
+      reference\r
+        "RFC 6933: Entity MIB (Version 4) - entPhysicalAlias";\r
+    }\r
+\r
+    leaf asset-id {\r
+      type string;\r
+      description\r
+        "This node is a user-assigned asset tracking identifier for\r
+         the component.\r
+         A server implementation MAY map this leaf to the\r
+         entPhysicalAssetID MIB object.  Such an implementation\r
+         needs to use some mechanism to handle the differences in\r
+         size and characters allowed between this leaf and\r
+         entPhysicalAssetID.  The definition of such a mechanism is\r
+         outside the scope of this document.";\r
+      reference\r
+        "RFC 6933: Entity MIB (Version 4) - entPhysicalAssetID";\r
+    }\r
+\r
+    leaf is-fru {\r
+      type boolean;\r
+      config false;\r
+\r
+      description\r
+        "This node indicates whether or not this component is\r
+         considered a 'field-replaceable unit' by the vendor.  If\r
+         this node contains the value 'true', then this component\r
+         identifies a field-replaceable unit.  For all components\r
+         that are permanently contained within a field-replaceable\r
+         unit, the value 'false' should be returned for this\r
+         node.";\r
+      reference\r
+        "RFC 6933: Entity MIB (Version 4) - entPhysicalIsFRU";\r
+    }\r
+\r
+    leaf mfg-date {\r
+      type yang:date-and-time;\r
+      config false;\r
+      description\r
+        "The date of manufacturing of the managed component.";\r
+      reference\r
+        "RFC 6933: Entity MIB (Version 4) - entPhysicalMfgDate";\r
+    }\r
+\r
+    leaf-list uri {\r
+      type inet:uri;\r
+      description\r
+        "This node contains identification information about the\r
+         component.";\r
+      reference\r
+        "RFC 6933: Entity MIB (Version 4) - entPhysicalUris";\r
+    }\r
+\r
+    leaf uuid {\r
+      type yang:uuid;\r
+      config false;\r
+      description\r
+        "A Universally Unique Identifier of the component.";\r
+      reference\r
+        "RFC 6933: Entity MIB (Version 4) - entPhysicalUUID";\r
+    }\r
+\r
+    container state {\r
+      if-feature hardware-state;\r
+      description\r
+        "State-related nodes";\r
+      reference\r
+        "RFC 4268: Entity State MIB";\r
+\r
+      leaf state-last-changed {\r
+        type yang:date-and-time;\r
+        config false;\r
+        description\r
+          "The date and time when the value of any of the\r
+           admin-state, oper-state, usage-state, alarm-state, or\r
+           standby-state changed for this component.\r
+           If there has been no change since the last\r
+           re-initialization of the local system, this node\r
+           contains the date and time of local system\r
+           initialization.  If there has been no change since the\r
+           component was added to the local system, this node\r
+           contains the date and time of the insertion.";\r
+        reference\r
+          "RFC 4268: Entity State MIB - entStateLastChanged";\r
+      }\r
+\r
+      leaf admin-state {\r
+        type admin-state;\r
+        description\r
+          "The administrative state for this component.\r
+           This node refers to a component's administrative\r
+           permission to service both other components within its\r
+           containment hierarchy as well other users of its\r
+           services defined by means outside the scope of this\r
+           module.\r
+           Some components exhibit only a subset of the remaining\r
+           administrative state values.  Some components cannot be\r
+           locked; hence, this node exhibits only the 'unlocked'\r
+           state.  Other components cannot be shut down gracefully;\r
+           hence, this node does not exhibit the 'shutting-down'\r
+           state.";\r
+        reference\r
+          "RFC 4268: Entity State MIB - entStateAdmin";\r
+      }\r
+\r
+      leaf oper-state {\r
+        type oper-state;\r
+        config false;\r
+        description\r
+          "The operational state for this component.\r
+           Note that this node does not follow the administrative\r
+           state.  An administrative state of 'down' does not\r
+           predict an operational state of 'disabled'.\r
+           Note that some implementations may not be able to\r
+           accurately report oper-state while the admin-state node\r
+           has a value other than 'unlocked'.  In these cases, this\r
+           node MUST have a value of 'unknown'.";\r
+        reference\r
+          "RFC 4268: Entity State MIB - entStateOper";\r
+      }\r
+\r
+      leaf usage-state {\r
+        type usage-state;\r
+        config false;\r
+        description\r
+          "The usage state for this component.\r
+           This node refers to a component's ability to service\r
+           more components in a containment hierarchy.\r
+           Some components will exhibit only a subset of the usage\r
+           state values.  Components that are unable to ever\r
+           service any components within a containment hierarchy\r
+           will always have a usage state of 'busy'.  In some\r
+           cases, a component will be able to support only one\r
+           other component within its containment hierarchy and\r
+           will therefore only exhibit values of 'idle' and\r
+           'busy'.";\r
+        reference\r
+          "RFC 4268: Entity State MIB - entStateUsage";\r
+      }\r
+\r
+      leaf alarm-state {\r
+        type alarm-state;\r
+        config false;\r
+        description\r
+          "The alarm state for this component.  It does not\r
+           include the alarms raised on child components within its\r
+           containment hierarchy.";\r
+        reference\r
+          "RFC 4268: Entity State MIB - entStateAlarm";\r
+      }\r
+\r
+      leaf standby-state {\r
+        type standby-state;\r
+        config false;\r
+        description\r
+          "The standby state for this component.\r
+           Some components will exhibit only a subset of the\r
+           remaining standby state values.  If this component\r
+           cannot operate in a standby role, the value of this node\r
+           will always be 'providing-service'.";\r
+        reference\r
+          "RFC 4268: Entity State MIB - entStateStandby";\r
+      }\r
+    }\r
+\r
+    container sensor-data {\r
+      when 'derived-from-or-self(../class,\r
+                                 "ianahw:sensor")' {\r
+        description\r
+          "Sensor data nodes present for any component of type\r
+           'sensor'";\r
+      }\r
+      if-feature hardware-sensor;\r
+      config false;\r
+\r
+      description\r
+        "Sensor-related nodes.";\r
+      reference\r
+        "RFC 3433: Entity Sensor Management Information Base";\r
+\r
+      leaf value {\r
+        type sensor-value;\r
+        description\r
+          "The most recent measurement obtained by the server\r
+           for this sensor.\r
+           A client that periodically fetches this node should also\r
+           fetch the nodes 'value-type', 'value-scale', and\r
+           'value-precision', since they may change when the value\r
+           is changed.";\r
+        reference\r
+          "RFC 3433: Entity Sensor Management Information Base -\r
+                     entPhySensorValue";\r
+      }\r
+\r
+      leaf value-type {\r
+        type sensor-value-type;\r
+        description\r
+          "The type of data units associated with the\r
+           sensor value";\r
+        reference\r
+          "RFC 3433: Entity Sensor Management Information Base -\r
+                     entPhySensorType";\r
+      }\r
+      leaf value-scale {\r
+        type sensor-value-scale;\r
+        description\r
+          "The (power of 10) scaling factor associated\r
+           with the sensor value";\r
+        reference\r
+          "RFC 3433: Entity Sensor Management Information Base -\r
+                     entPhySensorScale";\r
+      }\r
+\r
+      leaf value-precision {\r
+        type sensor-value-precision;\r
+        description\r
+          "The number of decimal places of precision\r
+           associated with the sensor value";\r
+        reference\r
+          "RFC 3433: Entity Sensor Management Information Base -\r
+                     entPhySensorPrecision";\r
+      }\r
+\r
+      leaf oper-status {\r
+        type sensor-status;\r
+        description\r
+          "The operational status of the sensor.";\r
+        reference\r
+          "RFC 3433: Entity Sensor Management Information Base -\r
+                     entPhySensorOperStatus";\r
+      }\r
+\r
+      leaf units-display {\r
+        type string;\r
+        description\r
+          "A textual description of the data units that should be\r
+           used in the display of the sensor value.";\r
+        reference\r
+          "RFC 3433: Entity Sensor Management Information Base -\r
+                     entPhySensorUnitsDisplay";\r
+      }\r
+\r
+      leaf value-timestamp {\r
+        type yang:date-and-time;\r
+        description\r
+          "The time the status and/or value of this sensor was last\r
+           obtained by the server.";\r
+        reference\r
+          "RFC 3433: Entity Sensor Management Information Base -\r
+                     entPhySensorValueTimeStamp";\r
+      }\r
+      leaf value-update-rate {\r
+        type uint32;\r
+        units "milliseconds";\r
+        description\r
+          "An indication of the frequency that the server updates\r
+           the associated 'value' node, represented in\r
+           milliseconds.  The value zero indicates:\r
+            - the sensor value is updated on demand (e.g.,\r
+              when polled by the server for a get-request),\r
+            - the sensor value is updated when the sensor\r
+              value changes (event-driven), or\r
+            - the server does not know the update rate.";\r
+        reference\r
+          "RFC 3433: Entity Sensor Management Information Base -\r
+                     entPhySensorValueUpdateRate";\r
+      }\r
+    }\r
+  }\r
+}\r
+\r
+/*\r
+ * Notifications\r
+ */\r
+\r
+notification hardware-state-change {\r
+  description\r
+    "A hardware-state-change notification is generated when the\r
+     value of /hardware/last-change changes in the operational\r
+     state.";\r
+  reference\r
+    "RFC 6933: Entity MIB (Version 4) - entConfigChange";\r
+}\r
+\r
+notification hardware-state-oper-enabled {\r
+  if-feature hardware-state;\r
+  description\r
+    "A hardware-state-oper-enabled notification signifies that a\r
+     component has transitioned into the 'enabled' state.";\r
+\r
+  leaf name {\r
+    type leafref {\r
+      path "/hardware/component/name";\r
+    }\r
+\r
+    description\r
+      "The name of the component that has transitioned into the\r
+       'enabled' state.";\r
+  }\r
+  leaf admin-state {\r
+    type leafref {\r
+      path "/hardware/component/state/admin-state";\r
+    }\r
+    description\r
+      "The administrative state for the component.";\r
+  }\r
+  leaf alarm-state {\r
+    type leafref {\r
+      path "/hardware/component/state/alarm-state";\r
+    }\r
+    description\r
+      "The alarm state for the component.";\r
+  }\r
+  reference\r
+    "RFC 4268: Entity State MIB - entStateOperEnabled";\r
+}\r
+\r
+notification hardware-state-oper-disabled {\r
+  if-feature hardware-state;\r
+  description\r
+    "A hardware-state-oper-disabled notification signifies that a\r
+     component has transitioned into the 'disabled' state.";\r
+\r
+  leaf name {\r
+    type leafref {\r
+      path "/hardware/component/name";\r
+    }\r
+    description\r
+      "The name of the component that has transitioned into the\r
+       'disabled' state.";\r
+  }\r
+  leaf admin-state {\r
+    type leafref {\r
+      path "/hardware/component/state/admin-state";\r
+    }\r
+    description\r
+      "The administrative state for the component.";\r
+  }\r
+  leaf alarm-state {\r
+    type leafref {\r
+      path "/hardware/component/state/alarm-state";\r
+    }\r
+\r
+    description\r
+      "The alarm state for the component.";\r
+  }\r
+  reference\r
+    "RFC 4268: Entity State MIB - entStateOperDisabled";\r
+}\r
+\r
+}\r
diff --git a/netconf-server/schemas/ietf-inet-types.yang b/netconf-server/schemas/ietf-inet-types.yang
new file mode 100644 (file)
index 0000000..b8e45c8
--- /dev/null
@@ -0,0 +1,429 @@
+module ietf-inet-types {\r
+\r
+namespace "urn:ietf:params:xml:ns:yang:ietf-inet-types";\r
+prefix "inet";\r
+\r
+organization\r
+ "IETF NETMOD (NETCONF Data Modeling Language) Working Group";\r
+\r
+contact\r
+ "WG Web:   <http://tools.ietf.org/wg/netmod/>\r
+  WG List:  <mailto:netmod@ietf.org>\r
+  WG Chair: David Kessens\r
+            <mailto:david.kessens@nsn.com>\r
+  WG Chair: Juergen Schoenwaelder\r
+            <mailto:j.schoenwaelder@jacobs-university.de>\r
+  Editor:   Juergen Schoenwaelder\r
+            <mailto:j.schoenwaelder@jacobs-university.de>";\r
+\r
+description\r
+ "This module contains a collection of generally useful derived\r
+  YANG data types for Internet addresses and related things.\r
+  Copyright (c) 2013 IETF Trust and the persons identified as\r
+  authors of the code.  All rights reserved.\r
+  Redistribution and use in source and binary forms, with or\r
+  without modification, is permitted pursuant to, and subject\r
+  to the license terms contained in, the Simplified BSD License\r
+  set forth in Section 4.c of the IETF Trust's Legal Provisions\r
+  Relating to IETF Documents\r
+  (http://trustee.ietf.org/license-info).\r
+  This version of this YANG module is part of RFC 6991; see\r
+  the RFC itself for full legal notices.";\r
+\r
+revision 2013-07-15 {\r
+  description\r
+   "This revision adds the following new data types:\r
+    - ip-address-no-zone\r
+    - ipv4-address-no-zone\r
+    - ipv6-address-no-zone";\r
+  reference\r
+   "RFC 6991: Common YANG Data Types";\r
+}\r
+\r
+revision 2010-09-24 {\r
+  description\r
+   "Initial revision.";\r
+  reference\r
+   "RFC 6021: Common YANG Data Types";\r
+}\r
+\r
+/*** collection of types related to protocol fields ***/\r
+\r
+typedef ip-version {\r
+  type enumeration {\r
+    enum unknown {\r
+      value "0";\r
+      description\r
+       "An unknown or unspecified version of the Internet\r
+        protocol.";\r
+    }\r
+    enum ipv4 {\r
+      value "1";\r
+      description\r
+       "The IPv4 protocol as defined in RFC 791.";\r
+    }\r
+    enum ipv6 {\r
+      value "2";\r
+      description\r
+       "The IPv6 protocol as defined in RFC 2460.";\r
+    }\r
+  }\r
+  description\r
+   "This value represents the version of the IP protocol.\r
+    In the value set and its semantics, this type is equivalent\r
+    to the InetVersion textual convention of the SMIv2.";\r
+  reference\r
+   "RFC  791: Internet Protocol\r
+    RFC 2460: Internet Protocol, Version 6 (IPv6) Specification\r
+    RFC 4001: Textual Conventions for Internet Network Addresses";\r
+}\r
+\r
+typedef dscp {\r
+  type uint8 {\r
+    range "0..63";\r
+  }\r
+  description\r
+   "The dscp type represents a Differentiated Services Code Point\r
+    that may be used for marking packets in a traffic stream.\r
+    In the value set and its semantics, this type is equivalent\r
+    to the Dscp textual convention of the SMIv2.";\r
+  reference\r
+   "RFC 3289: Management Information Base for the Differentiated\r
+              Services Architecture\r
+    RFC 2474: Definition of the Differentiated Services Field\r
+              (DS Field) in the IPv4 and IPv6 Headers\r
+    RFC 2780: IANA Allocation Guidelines For Values In\r
+              the Internet Protocol and Related Headers";\r
+}\r
+\r
+typedef ipv6-flow-label {\r
+  type uint32 {\r
+    range "0..1048575";\r
+  }\r
+  description\r
+   "The ipv6-flow-label type represents the flow identifier or Flow\r
+    Label in an IPv6 packet header that may be used to\r
+    discriminate traffic flows.\r
+    In the value set and its semantics, this type is equivalent\r
+    to the IPv6FlowLabel textual convention of the SMIv2.";\r
+  reference\r
+   "RFC 3595: Textual Conventions for IPv6 Flow Label\r
+    RFC 2460: Internet Protocol, Version 6 (IPv6) Specification";\r
+}\r
+\r
+typedef port-number {\r
+  type uint16 {\r
+    range "0..65535";\r
+  }\r
+  description\r
+   "The port-number type represents a 16-bit port number of an\r
+    Internet transport-layer protocol such as UDP, TCP, DCCP, or\r
+    SCTP.  Port numbers are assigned by IANA.  A current list of\r
+    all assignments is available from <http://www.iana.org/>.\r
+    Note that the port number value zero is reserved by IANA.  In\r
+    situations where the value zero does not make sense, it can\r
+    be excluded by subtyping the port-number type.\r
+    In the value set and its semantics, this type is equivalent\r
+    to the InetPortNumber textual convention of the SMIv2.";\r
+  reference\r
+   "RFC  768: User Datagram Protocol\r
+    RFC  793: Transmission Control Protocol\r
+    RFC 4960: Stream Control Transmission Protocol\r
+    RFC 4340: Datagram Congestion Control Protocol (DCCP)\r
+    RFC 4001: Textual Conventions for Internet Network Addresses";\r
+}\r
+\r
+/*** collection of types related to autonomous systems ***/\r
+\r
+typedef as-number {\r
+  type uint32;\r
+  description\r
+   "The as-number type represents autonomous system numbers\r
+    which identify an Autonomous System (AS).  An AS is a set\r
+    of routers under a single technical administration, using\r
+    an interior gateway protocol and common metrics to route\r
+    packets within the AS, and using an exterior gateway\r
+    protocol to route packets to other ASes.  IANA maintains\r
+    the AS number space and has delegated large parts to the\r
+    regional registries.\r
+    Autonomous system numbers were originally limited to 16\r
+    bits.  BGP extensions have enlarged the autonomous system\r
+    number space to 32 bits.  This type therefore uses an uint32\r
+    base type without a range restriction in order to support\r
+    a larger autonomous system number space.\r
+    In the value set and its semantics, this type is equivalent\r
+    to the InetAutonomousSystemNumber textual convention of\r
+    the SMIv2.";\r
+  reference\r
+   "RFC 1930: Guidelines for creation, selection, and registration\r
+              of an Autonomous System (AS)\r
+    RFC 4271: A Border Gateway Protocol 4 (BGP-4)\r
+    RFC 4001: Textual Conventions for Internet Network Addresses\r
+    RFC 6793: BGP Support for Four-Octet Autonomous System (AS)\r
+              Number Space";\r
+}\r
+\r
+/*** collection of types related to IP addresses and hostnames ***/\r
+\r
+typedef ip-address {\r
+  type union {\r
+    type inet:ipv4-address;\r
+    type inet:ipv6-address;\r
+  }\r
+  description\r
+   "The ip-address type represents an IP address and is IP\r
+    version neutral.  The format of the textual representation\r
+    implies the IP version.  This type supports scoped addresses\r
+    by allowing zone identifiers in the address format.";\r
+  reference\r
+   "RFC 4007: IPv6 Scoped Address Architecture";\r
+}\r
+\r
+typedef ipv4-address {\r
+  type string {\r
+    pattern\r
+      '(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}'\r
+    +  '([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])'\r
+    + '(%[\p{N}\p{L}]+)?';\r
+  }\r
+  description\r
+    "The ipv4-address type represents an IPv4 address in\r
+     dotted-quad notation.  The IPv4 address may include a zone\r
+     index, separated by a % sign.\r
+     The zone index is used to disambiguate identical address\r
+     values.  For link-local addresses, the zone index will\r
+     typically be the interface index number or the name of an\r
+     interface.  If the zone index is not present, the default\r
+     zone of the device will be used.\r
+     The canonical format for the zone index is the numerical\r
+     format";\r
+}\r
+\r
+typedef ipv6-address {\r
+  type string {\r
+    pattern '((:|[0-9a-fA-F]{0,4}):)([0-9a-fA-F]{0,4}:){0,5}'\r
+          + '((([0-9a-fA-F]{0,4}:)?(:|[0-9a-fA-F]{0,4}))|'\r
+          + '(((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\.){3}'\r
+          + '(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])))'\r
+          + '(%[\p{N}\p{L}]+)?';\r
+    pattern '(([^:]+:){6}(([^:]+:[^:]+)|(.*\..*)))|'\r
+          + '((([^:]+:)*[^:]+)?::(([^:]+:)*[^:]+)?)'\r
+          + '(%.+)?';\r
+  }\r
+  description\r
+   "The ipv6-address type represents an IPv6 address in full,\r
+    mixed, shortened, and shortened-mixed notation.  The IPv6\r
+    address may include a zone index, separated by a % sign.\r
+    The zone index is used to disambiguate identical address\r
+    values.  For link-local addresses, the zone index will\r
+    typically be the interface index number or the name of an\r
+    interface.  If the zone index is not present, the default\r
+    zone of the device will be used.\r
+    The canonical format of IPv6 addresses uses the textual\r
+    representation defined in Section 4 of RFC 5952.  The\r
+    canonical format for the zone index is the numerical\r
+    format as described in Section 11.2 of RFC 4007.";\r
+  reference\r
+   "RFC 4291: IP Version 6 Addressing Architecture\r
+    RFC 4007: IPv6 Scoped Address Architecture\r
+    RFC 5952: A Recommendation for IPv6 Address Text\r
+              Representation";\r
+}\r
+\r
+typedef ip-address-no-zone {\r
+  type union {\r
+    type inet:ipv4-address-no-zone;\r
+    type inet:ipv6-address-no-zone;\r
+  }\r
+  description\r
+   "The ip-address-no-zone type represents an IP address and is\r
+    IP version neutral.  The format of the textual representation\r
+    implies the IP version.  This type does not support scoped\r
+    addresses since it does not allow zone identifiers in the\r
+    address format.";\r
+  reference\r
+   "RFC 4007: IPv6 Scoped Address Architecture";\r
+}\r
+\r
+typedef ipv4-address-no-zone {\r
+  type inet:ipv4-address {\r
+    pattern '[0-9\.]*';\r
+  }\r
+  description\r
+    "An IPv4 address without a zone index.  This type, derived from\r
+     ipv4-address, may be used in situations where the zone is\r
+     known from the context and hence no zone index is needed.";\r
+}\r
+\r
+typedef ipv6-address-no-zone {\r
+  type inet:ipv6-address {\r
+    pattern '[0-9a-fA-F:\.]*';\r
+  }\r
+  description\r
+    "An IPv6 address without a zone index.  This type, derived from\r
+     ipv6-address, may be used in situations where the zone is\r
+     known from the context and hence no zone index is needed.";\r
+  reference\r
+   "RFC 4291: IP Version 6 Addressing Architecture\r
+    RFC 4007: IPv6 Scoped Address Architecture\r
+    RFC 5952: A Recommendation for IPv6 Address Text\r
+              Representation";\r
+}\r
+\r
+typedef ip-prefix {\r
+  type union {\r
+    type inet:ipv4-prefix;\r
+    type inet:ipv6-prefix;\r
+  }\r
+  description\r
+   "The ip-prefix type represents an IP prefix and is IP\r
+    version neutral.  The format of the textual representations\r
+    implies the IP version.";\r
+}\r
+\r
+typedef ipv4-prefix {\r
+  type string {\r
+    pattern\r
+       '(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}'\r
+     +  '([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])'\r
+     + '/(([0-9])|([1-2][0-9])|(3[0-2]))';\r
+  }\r
+  description\r
+   "The ipv4-prefix type represents an IPv4 address prefix.\r
+    The prefix length is given by the number following the\r
+    slash character and must be less than or equal to 32.\r
+    A prefix length value of n corresponds to an IP address\r
+    mask that has n contiguous 1-bits from the most\r
+    significant bit (MSB) and all other bits set to 0.\r
+    The canonical format of an IPv4 prefix has all bits of\r
+    the IPv4 address set to zero that are not part of the\r
+    IPv4 prefix.";\r
+}\r
+\r
+typedef ipv6-prefix {\r
+  type string {\r
+    pattern '((:|[0-9a-fA-F]{0,4}):)([0-9a-fA-F]{0,4}:){0,5}'\r
+          + '((([0-9a-fA-F]{0,4}:)?(:|[0-9a-fA-F]{0,4}))|'\r
+          + '(((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\.){3}'\r
+          + '(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])))'\r
+          + '(/(([0-9])|([0-9]{2})|(1[0-1][0-9])|(12[0-8])))';\r
+    pattern '(([^:]+:){6}(([^:]+:[^:]+)|(.*\..*)))|'\r
+          + '((([^:]+:)*[^:]+)?::(([^:]+:)*[^:]+)?)'\r
+          + '(/.+)';\r
+  }\r
+\r
+  description\r
+   "The ipv6-prefix type represents an IPv6 address prefix.\r
+    The prefix length is given by the number following the\r
+    slash character and must be less than or equal to 128.\r
+    A prefix length value of n corresponds to an IP address\r
+    mask that has n contiguous 1-bits from the most\r
+    significant bit (MSB) and all other bits set to 0.\r
+    The IPv6 address should have all bits that do not belong\r
+    to the prefix set to zero.\r
+    The canonical format of an IPv6 prefix has all bits of\r
+    the IPv6 address set to zero that are not part of the\r
+    IPv6 prefix.  Furthermore, the IPv6 address is represented\r
+    as defined in Section 4 of RFC 5952.";\r
+  reference\r
+   "RFC 5952: A Recommendation for IPv6 Address Text\r
+              Representation";\r
+}\r
+\r
+/*** collection of domain name and URI types ***/\r
+\r
+typedef domain-name {\r
+  type string {\r
+    pattern\r
+      '((([a-zA-Z0-9_]([a-zA-Z0-9\-_]){0,61})?[a-zA-Z0-9]\.)*'\r
+    + '([a-zA-Z0-9_]([a-zA-Z0-9\-_]){0,61})?[a-zA-Z0-9]\.?)'\r
+    + '|\.';\r
+    length "1..253";\r
+  }\r
+  description\r
+   "The domain-name type represents a DNS domain name.  The\r
+    name SHOULD be fully qualified whenever possible.\r
+    Internet domain names are only loosely specified.  Section\r
+    3.5 of RFC 1034 recommends a syntax (modified in Section\r
+    2.1 of RFC 1123).  The pattern above is intended to allow\r
+    for current practice in domain name use, and some possible\r
+    future expansion.  It is designed to hold various types of\r
+    domain names, including names used for A or AAAA records\r
+    (host names) and other records, such as SRV records.  Note\r
+    that Internet host names have a stricter syntax (described\r
+    in RFC 952) than the DNS recommendations in RFCs 1034 and\r
+    1123, and that systems that want to store host names in\r
+    schema nodes using the domain-name type are recommended to\r
+    adhere to this stricter standard to ensure interoperability.\r
+    The encoding of DNS names in the DNS protocol is limited\r
+    to 255 characters.  Since the encoding consists of labels\r
+    prefixed by a length bytes and there is a trailing NULL\r
+    byte, only 253 characters can appear in the textual dotted\r
+    notation.\r
+    The description clause of schema nodes using the domain-name\r
+    type MUST describe when and how these names are resolved to\r
+    IP addresses.  Note that the resolution of a domain-name value\r
+    may require to query multiple DNS records (e.g., A for IPv4\r
+    and AAAA for IPv6).  The order of the resolution process and\r
+    which DNS record takes precedence can either be defined\r
+    explicitly or may depend on the configuration of the\r
+    resolver.\r
+    Domain-name values use the US-ASCII encoding.  Their canonical\r
+    format uses lowercase US-ASCII characters.  Internationalized\r
+    domain names MUST be A-labels as per RFC 5890.";\r
+  reference\r
+   "RFC  952: DoD Internet Host Table Specification\r
+    RFC 1034: Domain Names - Concepts and Facilities\r
+    RFC 1123: Requirements for Internet Hosts -- Application\r
+              and Support\r
+    RFC 2782: A DNS RR for specifying the location of services\r
+              (DNS SRV)\r
+    RFC 5890: Internationalized Domain Names in Applications\r
+              (IDNA): Definitions and Document Framework";\r
+}\r
+\r
+typedef host {\r
+  type union {\r
+    type inet:ip-address;\r
+    type inet:domain-name;\r
+  }\r
+  description\r
+   "The host type represents either an IP address or a DNS\r
+    domain name.";\r
+}\r
+\r
+typedef uri {\r
+  type string;\r
+  description\r
+   "The uri type represents a Uniform Resource Identifier\r
+    (URI) as defined by STD 66.\r
+    Objects using the uri type MUST be in US-ASCII encoding,\r
+    and MUST be normalized as described by RFC 3986 Sections\r
+    6.2.1, 6.2.2.1, and 6.2.2.2.  All unnecessary\r
+    percent-encoding is removed, and all case-insensitive\r
+    characters are set to lowercase except for hexadecimal\r
+    digits, which are normalized to uppercase as described in\r
+    Section 6.2.2.1.\r
+    The purpose of this normalization is to help provide\r
+    unique URIs.  Note that this normalization is not\r
+    sufficient to provide uniqueness.  Two URIs that are\r
+    textually distinct after this normalization may still be\r
+    equivalent.\r
+    Objects using the uri type may restrict the schemes that\r
+    they permit.  For example, 'data:' and 'urn:' schemes\r
+    might not be appropriate.\r
+    A zero-length URI is not a valid URI.  This can be used to\r
+    express 'URI absent' where required.\r
+    In the value set and its semantics, this type is equivalent\r
+    to the Uri SMIv2 textual convention defined in RFC 5017.";\r
+  reference\r
+   "RFC 3986: Uniform Resource Identifier (URI): Generic Syntax\r
+    RFC 3305: Report from the Joint W3C/IETF URI Planning Interest\r
+              Group: Uniform Resource Identifiers (URIs), URLs,\r
+              and Uniform Resource Names (URNs): Clarifications\r
+              and Recommendations\r
+    RFC 5017: MIB Textual Conventions for Uniform Resource\r
+              Identifiers (URIs)";\r
+}\r
+\r
+}\r
diff --git a/netconf-server/schemas/ietf-netconf-acm.yang b/netconf-server/schemas/ietf-netconf-acm.yang
new file mode 100644 (file)
index 0000000..46e5c48
--- /dev/null
@@ -0,0 +1,440 @@
+module ietf-netconf-acm {\r
+\r
+  namespace "urn:ietf:params:xml:ns:yang:ietf-netconf-acm";\r
+\r
+  prefix nacm;\r
+\r
+  import ietf-yang-types {\r
+    prefix yang;\r
+  }\r
+\r
+  organization\r
+    "IETF NETCONF (Network Configuration) Working Group";\r
+\r
+  contact\r
+    "WG Web:   <https://datatracker.ietf.org/wg/netconf/>\r
+     WG List:  <mailto:netconf@ietf.org>\r
+     Author:   Andy Bierman\r
+               <mailto:andy@yumaworks.com>\r
+     Author:   Martin Bjorklund\r
+               <mailto:mbj@tail-f.com>";\r
+\r
+  description\r
+    "Network Configuration Access Control Model.\r
+     Copyright (c) 2012 - 2018 IETF Trust and the persons\r
+     identified as authors of the code.  All rights reserved.\r
+     Redistribution and use in source and binary forms, with or\r
+     without modification, is permitted pursuant to, and subject\r
+     to the license terms contained in, the Simplified BSD\r
+     License set forth in Section 4.c of the IETF Trust's\r
+     Legal Provisions Relating to IETF Documents\r
+     (https://trustee.ietf.org/license-info).\r
+     This version of this YANG module is part of RFC 8341; see\r
+     the RFC itself for full legal notices.";\r
+\r
+  revision "2018-02-14" {\r
+    description\r
+      "Added support for YANG 1.1 actions and notifications tied to\r
+       data nodes.  Clarified how NACM extensions can be used by\r
+       other data models.";\r
+    reference\r
+      "RFC 8341: Network Configuration Access Control Model";\r
+  }\r
+\r
+  revision "2012-02-22" {\r
+    description\r
+      "Initial version.";\r
+    reference\r
+      "RFC 6536: Network Configuration Protocol (NETCONF)\r
+                 Access Control Model";\r
+  }\r
+\r
+  /*\r
+   * Extension statements\r
+   */\r
+\r
+  extension default-deny-write {\r
+    description\r
+      "Used to indicate that the data model node\r
+       represents a sensitive security system parameter.\r
+       If present, the NETCONF server will only allow the designated\r
+       'recovery session' to have write access to the node.  An\r
+       explicit access control rule is required for all other users.\r
+       If the NACM module is used, then it must be enabled (i.e.,\r
+       /nacm/enable-nacm object equals 'true'), or this extension\r
+       is ignored.\r
+       The 'default-deny-write' extension MAY appear within a data\r
+       definition statement.  It is ignored otherwise.";\r
+  }\r
+\r
+  extension default-deny-all {\r
+    description\r
+      "Used to indicate that the data model node\r
+       controls a very sensitive security system parameter.\r
+       If present, the NETCONF server will only allow the designated\r
+       'recovery session' to have read, write, or execute access to\r
+       the node.  An explicit access control rule is required for all\r
+       other users.\r
+       If the NACM module is used, then it must be enabled (i.e.,\r
+       /nacm/enable-nacm object equals 'true'), or this extension\r
+       is ignored.\r
+       The 'default-deny-all' extension MAY appear within a data\r
+       definition statement, 'rpc' statement, or 'notification'\r
+       statement.  It is ignored otherwise.";\r
+  }\r
+\r
+  /*\r
+   * Derived types\r
+   */\r
+\r
+  typedef user-name-type {\r
+    type string {\r
+      length "1..max";\r
+    }\r
+    description\r
+      "General-purpose username string.";\r
+  }\r
+\r
+  typedef matchall-string-type {\r
+    type string {\r
+      pattern '\*';\r
+    }\r
+    description\r
+      "The string containing a single asterisk '*' is used\r
+       to conceptually represent all possible values\r
+       for the particular leaf using this data type.";\r
+  }\r
+\r
+  typedef access-operations-type {\r
+    type bits {\r
+      bit create {\r
+        description\r
+          "Any protocol operation that creates a\r
+           new data node.";\r
+      }\r
+      bit read {\r
+        description\r
+          "Any protocol operation or notification that\r
+           returns the value of a data node.";\r
+      }\r
+      bit update {\r
+        description\r
+          "Any protocol operation that alters an existing\r
+           data node.";\r
+      }\r
+      bit delete {\r
+        description\r
+          "Any protocol operation that removes a data node.";\r
+      }\r
+      bit exec {\r
+        description\r
+          "Execution access to the specified protocol operation.";\r
+      }\r
+    }\r
+    description\r
+      "Access operation.";\r
+  }\r
+\r
+  typedef group-name-type {\r
+    type string {\r
+      length "1..max";\r
+      pattern '[^\*].*';\r
+    }\r
+    description\r
+      "Name of administrative group to which\r
+       users can be assigned.";\r
+  }\r
+\r
+  typedef action-type {\r
+    type enumeration {\r
+      enum permit {\r
+        description\r
+          "Requested action is permitted.";\r
+      }\r
+      enum deny {\r
+        description\r
+          "Requested action is denied.";\r
+      }\r
+    }\r
+    description\r
+      "Action taken by the server when a particular\r
+       rule matches.";\r
+  }\r
+\r
+  typedef node-instance-identifier {\r
+    type yang:xpath1.0;\r
+    description\r
+      "Path expression used to represent a special\r
+       data node, action, or notification instance-identifier\r
+       string.\r
+       A node-instance-identifier value is an\r
+       unrestricted YANG instance-identifier expression.\r
+       All the same rules as an instance-identifier apply,\r
+       except that predicates for keys are optional.  If a key\r
+       predicate is missing, then the node-instance-identifier\r
+       represents all possible server instances for that key.\r
+       This XML Path Language (XPath) expression is evaluated in the\r
+       following context:\r
+          o  The set of namespace declarations are those in scope on\r
+             the leaf element where this type is used.\r
+          o  The set of variable bindings contains one variable,\r
+             'USER', which contains the name of the user of the\r
+             current session.\r
+          o  The function library is the core function library, but\r
+             note that due to the syntax restrictions of an\r
+             instance-identifier, no functions are allowed.\r
+          o  The context node is the root node in the data tree.\r
+       The accessible tree includes actions and notifications tied\r
+       to data nodes.";\r
+  }\r
+\r
+  /*\r
+   * Data definition statements\r
+   */\r
+\r
+  container nacm {\r
+    nacm:default-deny-all;\r
+\r
+    description\r
+      "Parameters for NETCONF access control model.";\r
+\r
+    leaf enable-nacm {\r
+      type boolean;\r
+      default "true";\r
+      description\r
+        "Enables or disables all NETCONF access control\r
+         enforcement.  If 'true', then enforcement\r
+         is enabled.  If 'false', then enforcement\r
+         is disabled.";\r
+    }\r
+\r
+    leaf read-default {\r
+      type action-type;\r
+      default "permit";\r
+      description\r
+        "Controls whether read access is granted if\r
+         no appropriate rule is found for a\r
+         particular read request.";\r
+    }\r
+\r
+    leaf write-default {\r
+      type action-type;\r
+      default "deny";\r
+      description\r
+        "Controls whether create, update, or delete access\r
+         is granted if no appropriate rule is found for a\r
+         particular write request.";\r
+    }\r
+\r
+    leaf exec-default {\r
+      type action-type;\r
+      default "permit";\r
+      description\r
+        "Controls whether exec access is granted if no appropriate\r
+         rule is found for a particular protocol operation request.";\r
+    }\r
+\r
+    leaf enable-external-groups {\r
+      type boolean;\r
+      default "true";\r
+      description\r
+        "Controls whether the server uses the groups reported by the\r
+         NETCONF transport layer when it assigns the user to a set of\r
+         NACM groups.  If this leaf has the value 'false', any group\r
+         names reported by the transport layer are ignored by the\r
+         server.";\r
+    }\r
+\r
+    leaf denied-operations {\r
+      type yang:zero-based-counter32;\r
+      config false;\r
+      mandatory true;\r
+      description\r
+        "Number of times since the server last restarted that a\r
+         protocol operation request was denied.";\r
+    }\r
+\r
+    leaf denied-data-writes {\r
+      type yang:zero-based-counter32;\r
+      config false;\r
+      mandatory true;\r
+      description\r
+        "Number of times since the server last restarted that a\r
+         protocol operation request to alter\r
+         a configuration datastore was denied.";\r
+    }\r
+\r
+    leaf denied-notifications {\r
+      type yang:zero-based-counter32;\r
+      config false;\r
+      mandatory true;\r
+      description\r
+        "Number of times since the server last restarted that\r
+         a notification was dropped for a subscription because\r
+         access to the event type was denied.";\r
+    }\r
+\r
+    container groups {\r
+      description\r
+        "NETCONF access control groups.";\r
+\r
+      list group {\r
+        key name;\r
+\r
+        description\r
+          "One NACM group entry.  This list will only contain\r
+           configured entries, not any entries learned from\r
+           any transport protocols.";\r
+\r
+        leaf name {\r
+          type group-name-type;\r
+          description\r
+            "Group name associated with this entry.";\r
+        }\r
+\r
+        leaf-list user-name {\r
+          type user-name-type;\r
+          description\r
+            "Each entry identifies the username of\r
+             a member of the group associated with\r
+             this entry.";\r
+        }\r
+      }\r
+    }\r
+\r
+    list rule-list {\r
+      key name;\r
+      ordered-by user;\r
+      description\r
+        "An ordered collection of access control rules.";\r
+\r
+      leaf name {\r
+        type string {\r
+          length "1..max";\r
+        }\r
+        description\r
+          "Arbitrary name assigned to the rule-list.";\r
+      }\r
+      leaf-list group {\r
+        type union {\r
+          type matchall-string-type;\r
+          type group-name-type;\r
+        }\r
+        description\r
+          "List of administrative groups that will be\r
+           assigned the associated access rights\r
+           defined by the 'rule' list.\r
+           The string '*' indicates that all groups apply to the\r
+           entry.";\r
+      }\r
+\r
+      list rule {\r
+        key name;\r
+        ordered-by user;\r
+        description\r
+          "One access control rule.\r
+           Rules are processed in user-defined order until a match is\r
+           found.  A rule matches if 'module-name', 'rule-type', and\r
+           'access-operations' match the request.  If a rule\r
+           matches, the 'action' leaf determines whether or not\r
+           access is granted.";\r
+\r
+        leaf name {\r
+          type string {\r
+            length "1..max";\r
+          }\r
+          description\r
+            "Arbitrary name assigned to the rule.";\r
+        }\r
+\r
+        leaf module-name {\r
+          type union {\r
+            type matchall-string-type;\r
+            type string;\r
+          }\r
+          default "*";\r
+          description\r
+            "Name of the module associated with this rule.\r
+             This leaf matches if it has the value '*' or if the\r
+             object being accessed is defined in the module with the\r
+             specified module name.";\r
+        }\r
+        choice rule-type {\r
+          description\r
+            "This choice matches if all leafs present in the rule\r
+             match the request.  If no leafs are present, the\r
+             choice matches all requests.";\r
+          case protocol-operation {\r
+            leaf rpc-name {\r
+              type union {\r
+                type matchall-string-type;\r
+                type string;\r
+              }\r
+              description\r
+                "This leaf matches if it has the value '*' or if\r
+                 its value equals the requested protocol operation\r
+                 name.";\r
+            }\r
+          }\r
+          case notification {\r
+            leaf notification-name {\r
+              type union {\r
+                type matchall-string-type;\r
+                type string;\r
+              }\r
+              description\r
+                "This leaf matches if it has the value '*' or if its\r
+                 value equals the requested notification name.";\r
+            }\r
+          }\r
+\r
+          case data-node {\r
+            leaf path {\r
+              type node-instance-identifier;\r
+              mandatory true;\r
+              description\r
+                "Data node instance-identifier associated with the\r
+                 data node, action, or notification controlled by\r
+                 this rule.\r
+                 Configuration data or state data\r
+                 instance-identifiers start with a top-level\r
+                 data node.  A complete instance-identifier is\r
+                 required for this type of path value.\r
+                 The special value '/' refers to all possible\r
+                 datastore contents.";\r
+            }\r
+          }\r
+        }\r
+\r
+        leaf access-operations {\r
+          type union {\r
+            type matchall-string-type;\r
+            type access-operations-type;\r
+          }\r
+          default "*";\r
+          description\r
+            "Access operations associated with this rule.\r
+             This leaf matches if it has the value '*' or if the\r
+             bit corresponding to the requested operation is set.";\r
+        }\r
+\r
+        leaf action {\r
+          type action-type;\r
+          mandatory true;\r
+          description\r
+            "The access control action associated with the\r
+             rule.  If a rule has been determined to match a\r
+             particular request, then this object is used\r
+             to determine whether to permit or deny the\r
+             request.";\r
+        }\r
+\r
+        leaf comment {\r
+          type string;\r
+          description\r
+            "A textual description of the access rule.";\r
+        }\r
+      }\r
+    }\r
+  }\r
+}\r
diff --git a/netconf-server/schemas/ietf-netconf-monitoring-extension.yang b/netconf-server/schemas/ietf-netconf-monitoring-extension.yang
new file mode 100644 (file)
index 0000000..91dc773
--- /dev/null
@@ -0,0 +1,31 @@
+module ietf-netconf-monitoring-extension {\r
+\r
+    yang-version 1;\r
+\r
+    namespace\r
+      "urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring-extension";\r
+\r
+    prefix ncme;\r
+\r
+    import ietf-netconf-monitoring {\r
+      prefix ncm;\r
+    }\r
+\r
+    revision "2013-12-10" {\r
+      description "Initial revision.";\r
+\r
+    }\r
+\r
+    identity netconf-tcp {\r
+      base ncm:transport;\r
+      description\r
+        "NETCONF over TCP.";\r
+    }\r
+\r
+    augment "/ncm:netconf-state/ncm:sessions/ncm:session" {\r
+      leaf session-identifier {\r
+        type string;\r
+      }\r
+    }\r
+\r
+}
\ No newline at end of file
diff --git a/netconf-server/schemas/ietf-netconf-monitoring.yang b/netconf-server/schemas/ietf-netconf-monitoring.yang
new file mode 100644 (file)
index 0000000..8d167b8
--- /dev/null
@@ -0,0 +1,596 @@
+module ietf-netconf-monitoring {\r
+\r
+    yang-version 1;\r
+\r
+    namespace\r
+      "urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring";\r
+\r
+    prefix ncm;\r
+\r
+    import ietf-yang-types {\r
+      prefix yang;\r
+      revision-date "2013-07-15";\r
+    }\r
+\r
+    import ietf-inet-types {\r
+      prefix inet;\r
+      revision-date "2013-07-15";\r
+    }\r
+\r
+    organization\r
+      "IETF NETCONF (Network Configuration) Working Group";\r
+\r
+    contact\r
+      "WG Web:   <http://tools.ietf.org/wg/netconf/>\r
+     WG List:  <mailto:netconf@ietf.org>\r
+\r
+     WG Chair: Mehmet Ersue\r
+               <mailto:mehmet.ersue@nsn.com>\r
+\r
+     WG Chair: Bert Wijnen\r
+               <mailto:bertietf@bwijnen.net>\r
+\r
+     Editor:   Mark Scott\r
+               <mailto:mark.scott@ericsson.com>\r
+\r
+     Editor:   Martin Bjorklund\r
+               <mailto:mbj@tail-f.com>";\r
+\r
+    description\r
+      "NETCONF Monitoring Module.\r
+     All elements in this module are read-only.\r
+\r
+     Copyright (c) 2010 IETF Trust and the persons identified as\r
+     authors of the code. All rights reserved.\r
+\r
+     Redistribution and use in source and binary forms, with or\r
+     without modification, is permitted pursuant to, and subject\r
+     to the license terms contained in, the Simplified BSD\r
+     License set forth in Section 4.c of the IETF Trust's\r
+     Legal Provisions Relating to IETF Documents\r
+     (http://trustee.ietf.org/license-info).\r
+\r
+     This version of this YANG module is part of RFC 6022; see\r
+     the RFC itself for full legal notices.";\r
+\r
+    revision "2010-10-04" {\r
+      description "Initial revision.";\r
+      reference\r
+        "RFC 6022: YANG Module for NETCONF Monitoring";\r
+\r
+    }\r
+\r
+\r
+    typedef netconf-datastore-type {\r
+      type enumeration {\r
+        enum "running" {\r
+          value 0;\r
+        }\r
+        enum "candidate" {\r
+          value 1;\r
+        }\r
+        enum "startup" {\r
+          value 2;\r
+        }\r
+      }\r
+      description\r
+        "Enumeration of possible NETCONF datastore types.";\r
+      reference\r
+        "RFC 4741: NETCONF Configuration Protocol";\r
+\r
+    }\r
+\r
+    identity transport {\r
+      description\r
+        "Base identity for NETCONF transport types.";\r
+    }\r
+\r
+    identity netconf-ssh {\r
+      base transport;\r
+      description\r
+        "NETCONF over Secure Shell (SSH).";\r
+      reference\r
+        "RFC 4742: Using the NETCONF Configuration Protocol\r
+              over Secure SHell (SSH)";\r
+\r
+    }\r
+\r
+    identity netconf-soap-over-beep {\r
+      base transport;\r
+      description\r
+        "NETCONF over Simple Object Access Protocol (SOAP) over\r
+       Blocks Extensible Exchange Protocol (BEEP).";\r
+      reference\r
+        "RFC 4743: Using NETCONF over the Simple Object\r
+              Access Protocol (SOAP)";\r
+\r
+    }\r
+\r
+    identity netconf-soap-over-https {\r
+      base transport;\r
+      description\r
+        "NETCONF over Simple Object Access Protocol (SOAP)\r
+      over Hypertext Transfer Protocol Secure (HTTPS).";\r
+      reference\r
+        "RFC 4743: Using NETCONF over the Simple Object\r
+              Access Protocol (SOAP)";\r
+\r
+    }\r
+\r
+    identity netconf-beep {\r
+      base transport;\r
+      description\r
+        "NETCONF over Blocks Extensible Exchange Protocol (BEEP).";\r
+      reference\r
+        "RFC 4744: Using the NETCONF Protocol over the\r
+              Blocks Extensible Exchange Protocol (BEEP)";\r
+\r
+    }\r
+\r
+    identity netconf-tls {\r
+      base transport;\r
+      description\r
+        "NETCONF over Transport Layer Security (TLS).";\r
+      reference\r
+        "RFC 5539: NETCONF over Transport Layer Security (TLS)";\r
+\r
+    }\r
+\r
+    identity schema-format {\r
+      description\r
+        "Base identity for data model schema languages.";\r
+    }\r
+\r
+    identity xsd {\r
+      base schema-format;\r
+      description\r
+        "W3C XML Schema Definition.";\r
+      reference\r
+        "W3C REC REC-xmlschema-1-20041028:\r
+          XML Schema Part 1: Structures";\r
+\r
+    }\r
+\r
+    identity yang {\r
+      base schema-format;\r
+      description\r
+        "The YANG data modeling language for NETCONF.";\r
+      reference\r
+        "RFC 6020:  YANG - A Data Modeling Language for the\r
+               Network Configuration Protocol (NETCONF)";\r
+\r
+    }\r
+\r
+    identity yin {\r
+      base schema-format;\r
+      description "The YIN syntax for YANG.";\r
+      reference\r
+        "RFC 6020:  YANG - A Data Modeling Language for the\r
+               Network Configuration Protocol (NETCONF)";\r
+\r
+    }\r
+\r
+    identity rng {\r
+      base schema-format;\r
+      description\r
+        "Regular Language for XML Next Generation (RELAX NG).";\r
+      reference\r
+        "ISO/IEC 19757-2:2008: RELAX NG";\r
+\r
+    }\r
+\r
+    identity rnc {\r
+      base schema-format;\r
+      description "Relax NG Compact Syntax";\r
+      reference\r
+        "ISO/IEC 19757-2:2008: RELAX NG";\r
+\r
+    }\r
+\r
+    grouping common-counters {\r
+      description\r
+        "Counters that exist both per session, and also globally,\r
+       accumulated from all sessions.";\r
+      leaf in-rpcs {\r
+        type yang:zero-based-counter32;\r
+        description\r
+          "Number of correct <rpc> messages received.";\r
+      }\r
+\r
+      leaf in-bad-rpcs {\r
+        type yang:zero-based-counter32;\r
+        description\r
+          "Number of messages received when an <rpc> message was expected,\r
+         that were not correct <rpc> messages.  This includes XML parse\r
+         errors and errors on the rpc layer.";\r
+      }\r
+\r
+      leaf out-rpc-errors {\r
+        type yang:zero-based-counter32;\r
+        description\r
+          "Number of <rpc-reply> messages sent that contained an\r
+         <rpc-error> element.";\r
+      }\r
+\r
+      leaf out-notifications {\r
+        type yang:zero-based-counter32;\r
+        description\r
+          "Number of <notification> messages sent.";\r
+      }\r
+    }  // grouping common-counters\r
+\r
+    container netconf-state {\r
+      config false;\r
+      description\r
+        "The netconf-state container is the root of the monitoring\r
+       data model.";\r
+      container capabilities {\r
+        description\r
+          "Contains the list of NETCONF capabilities supported by the\r
+         server.";\r
+        leaf-list capability {\r
+          type inet:uri;\r
+          description\r
+            "List of NETCONF capabilities supported by the server.";\r
+        }\r
+      }  // container capabilities\r
+\r
+      container datastores {\r
+        description\r
+          "Contains the list of NETCONF configuration datastores.";\r
+        list datastore {\r
+          key "name";\r
+          description\r
+            "List of NETCONF configuration datastores supported by\r
+           the NETCONF server and related information.";\r
+          leaf name {\r
+            type netconf-datastore-type;\r
+            description\r
+              "Name of the datastore associated with this list entry.";\r
+          }\r
+\r
+          container locks {\r
+            presence\r
+              "This container is present only if the datastore\r
+             is locked.";\r
+            description\r
+              "The NETCONF <lock> and <partial-lock> operations allow\r
+             a client to lock specific resources in a datastore.  The\r
+             NETCONF server will prevent changes to the locked\r
+             resources by all sessions except the one that acquired\r
+             the lock(s).\r
+\r
+             Monitoring information is provided for each datastore\r
+             entry including details such as the session that acquired\r
+             the lock, the type of lock (global or partial) and the\r
+             list of locked resources.  Multiple locks per datastore\r
+             are supported.";\r
+            grouping lock-info {\r
+              description\r
+                "Lock related parameters, common to both global and\r
+               partial locks.";\r
+              leaf locked-by-session {\r
+                type uint32;\r
+                mandatory true;\r
+                description\r
+                  "The session ID of the session that has locked\r
+                 this resource.  Both a global lock and a partial\r
+                 lock MUST contain the NETCONF session-id.\r
+\r
+                 If the lock is held by a session that is not managed\r
+                 by the NETCONF server (e.g., a CLI session), a session\r
+                 id of 0 (zero) is reported.";\r
+                reference\r
+                  "RFC 4741: NETCONF Configuration Protocol";\r
+\r
+              }\r
+\r
+              leaf locked-time {\r
+                type yang:date-and-time;\r
+                mandatory true;\r
+                description\r
+                  "The date and time of when the resource was\r
+                 locked.";\r
+              }\r
+            }  // grouping lock-info\r
+            choice lock-type {\r
+              description\r
+                "Indicates if a global lock or a set of partial locks\r
+               are set.";\r
+              container global-lock {\r
+                description\r
+                  "Present if the global lock is set.";\r
+                uses lock-info;\r
+              }  // container global-lock\r
+              list partial-lock {\r
+                key "lock-id";\r
+                description\r
+                  "List of partial locks.";\r
+                reference\r
+                  "RFC 5717: Partial Lock Remote Procedure Call (RPC) for\r
+                      NETCONF";\r
+\r
+                leaf lock-id {\r
+                  type uint32;\r
+                  description\r
+                    "This is the lock id returned in the <partial-lock>\r
+                   response.";\r
+                }\r
+\r
+                uses lock-info;\r
+\r
+                leaf-list select {\r
+                  type yang:xpath1.0;\r
+                  min-elements 1;\r
+                  description\r
+                    "The xpath expression that was used to request\r
+                   the lock.  The select expression indicates the\r
+                   original intended scope of the lock.";\r
+                }\r
+\r
+                leaf-list locked-node {\r
+                  type instance-identifier;\r
+                  description\r
+                    "The list of instance-identifiers (i.e., the\r
+                   locked nodes).\r
+\r
+                   The scope of the partial lock is defined by the list\r
+                   of locked nodes.";\r
+                }\r
+              }  // list partial-lock\r
+            }  // choice lock-type\r
+          }  // container locks\r
+        }  // list datastore\r
+      }  // container datastores\r
+\r
+      container schemas {\r
+        description\r
+          "Contains the list of data model schemas supported by the\r
+         server.";\r
+        list schema {\r
+          key "identifier version format";\r
+          description\r
+            "List of data model schemas supported by the server.";\r
+          leaf identifier {\r
+            type string;\r
+            description\r
+              "Identifier to uniquely reference the schema.  The\r
+             identifier is used in the <get-schema> operation and may\r
+             be used for other purposes such as file retrieval.\r
+\r
+             For modeling languages that support or require a data\r
+             model name (e.g., YANG module name) the identifier MUST\r
+             match that name.  For YANG data models, the identifier is\r
+             the name of the module or submodule.  In other cases, an\r
+             identifier such as a filename MAY be used instead.";\r
+          }\r
+\r
+          leaf version {\r
+            type string;\r
+            description\r
+              "Version of the schema supported.  Multiple versions MAY be\r
+             supported simultaneously by a NETCONF server.  Each\r
+             version MUST be reported individually in the schema list,\r
+             i.e., with same identifier, possibly different location,\r
+             but different version.\r
+\r
+             For YANG data models, version is the value of the most\r
+             recent YANG 'revision' statement in the module or\r
+             submodule, or the empty string if no 'revision' statement\r
+             is present.";\r
+          }\r
+\r
+          leaf format {\r
+            type identityref {\r
+              base schema-format;\r
+            }\r
+            description\r
+              "The data modeling language the schema is written\r
+             in (currently xsd, yang, yin, rng, or rnc).\r
+             For YANG data models, 'yang' format MUST be supported and\r
+             'yin' format MAY also be provided.";\r
+          }\r
+\r
+          leaf namespace {\r
+            type inet:uri;\r
+            mandatory true;\r
+            description\r
+              "The XML namespace defined by the data model.\r
+\r
+             For YANG data models, this is the module's namespace.\r
+             If the list entry describes a submodule, this field\r
+             contains the namespace of the module to which the\r
+             submodule belongs.";\r
+          }\r
+\r
+          leaf-list location {\r
+            type union {\r
+              type enumeration {\r
+                enum "NETCONF" {\r
+                  value 0;\r
+                }\r
+              }\r
+              type inet:uri;\r
+            }\r
+            description\r
+              "One or more locations from which the schema can be\r
+             retrieved.  This list SHOULD contain at least one\r
+             entry per schema.\r
+\r
+             A schema entry may be located on a remote file system\r
+             (e.g., reference to file system for ftp retrieval) or\r
+             retrieved directly from a server supporting the\r
+             <get-schema> operation (denoted by the value 'NETCONF').";\r
+          }\r
+        }  // list schema\r
+      }  // container schemas\r
+\r
+      container sessions {\r
+        description\r
+          "The sessions container includes session-specific data for\r
+         NETCONF management sessions.  The session list MUST include\r
+         all currently active NETCONF sessions.";\r
+        list session {\r
+          key "session-id";\r
+          description\r
+            "All NETCONF sessions managed by the NETCONF server\r
+           MUST be reported in this list.";\r
+          leaf session-id {\r
+            type uint32 {\r
+              range "1..max";\r
+            }\r
+            description\r
+              "Unique identifier for the session.  This value is the\r
+             NETCONF session identifier, as defined in RFC 4741.";\r
+            reference\r
+              "RFC 4741: NETCONF Configuration Protocol";\r
+\r
+          }\r
+\r
+          leaf transport {\r
+            type identityref {\r
+              base transport;\r
+            }\r
+            mandatory true;\r
+            description\r
+              "Identifies the transport for each session, e.g.,\r
+            'netconf-ssh', 'netconf-soap', etc.";\r
+          }\r
+\r
+          leaf username {\r
+            type string;\r
+            mandatory true;\r
+            description\r
+              "The username is the client identity that was authenticated\r
+            by the NETCONF transport protocol.  The algorithm used to\r
+            derive the username is NETCONF transport protocol specific\r
+            and in addition specific to the authentication mechanism\r
+            used by the NETCONF transport protocol.";\r
+          }\r
+\r
+          leaf source-host {\r
+            type inet:host;\r
+            description\r
+              "Host identifier of the NETCONF client.  The value\r
+             returned is implementation specific (e.g., hostname,\r
+             IPv4 address, IPv6 address)";\r
+          }\r
+\r
+          leaf login-time {\r
+            type yang:date-and-time;\r
+            mandatory true;\r
+            description\r
+              "Time at the server at which the session was established.";\r
+          }\r
+\r
+          uses common-counters {\r
+            description\r
+              "Per-session counters.  Zero based with following reset\r
+             behaviour:\r
+               - at start of a session\r
+               - when max value is reached";\r
+          }\r
+        }  // list session\r
+      }  // container sessions\r
+\r
+      container statistics {\r
+        description\r
+          "Statistical data pertaining to the NETCONF server.";\r
+        leaf netconf-start-time {\r
+          type yang:date-and-time;\r
+          description\r
+            "Date and time at which the management subsystem was\r
+           started.";\r
+        }\r
+\r
+        leaf in-bad-hellos {\r
+          type yang:zero-based-counter32;\r
+          description\r
+            "Number of sessions silently dropped because an\r
+          invalid <hello> message was received.  This includes <hello>\r
+          messages with a 'session-id' attribute, bad namespace, and\r
+          bad capability declarations.";\r
+        }\r
+\r
+        leaf in-sessions {\r
+          type yang:zero-based-counter32;\r
+          description\r
+            "Number of sessions started.  This counter is incremented\r
+           when a <hello> message with a <session-id> is sent.\r
+\r
+          'in-sessions' - 'in-bad-hellos' =\r
+              'number of correctly started netconf sessions'";\r
+        }\r
+\r
+        leaf dropped-sessions {\r
+          type yang:zero-based-counter32;\r
+          description\r
+            "Number of sessions that were abnormally terminated, e.g.,\r
+           due to idle timeout or transport close.  This counter is not\r
+           incremented when a session is properly closed by a\r
+           <close-session> operation, or killed by a <kill-session>\r
+           operation.";\r
+        }\r
+\r
+        uses common-counters {\r
+          description\r
+            "Global counters, accumulated from all sessions.\r
+           Zero based with following reset behaviour:\r
+             - re-initialization of NETCONF server\r
+             - when max value is reached";\r
+        }\r
+      }  // container statistics\r
+    }  // container netconf-state\r
+\r
+    rpc get-schema {\r
+      description\r
+        "This operation is used to retrieve a schema from the\r
+       NETCONF server.\r
+\r
+       Positive Response:\r
+         The NETCONF server returns the requested schema.\r
+\r
+       Negative Response:\r
+         If requested schema does not exist, the <error-tag> is\r
+         'invalid-value'.\r
+\r
+         If more than one schema matches the requested parameters, the\r
+         <error-tag> is 'operation-failed', and <error-app-tag> is\r
+         'data-not-unique'.";\r
+      input {\r
+        leaf identifier {\r
+          type string;\r
+          mandatory true;\r
+          description\r
+            "Identifier for the schema list entry.";\r
+        }\r
+\r
+        leaf version {\r
+          type string;\r
+          description\r
+            "Version of the schema requested.  If this parameter is not\r
+           present, and more than one version of the schema exists on\r
+           the server, a 'data-not-unique' error is returned, as\r
+           described above.";\r
+        }\r
+\r
+        leaf format {\r
+          type identityref {\r
+            base schema-format;\r
+          }\r
+          description\r
+            "The data modeling language of the schema.  If this\r
+            parameter is not present, and more than one formats of\r
+            the schema exists on the server, a 'data-not-unique' error\r
+            is returned, as described above.";\r
+        }\r
+      }\r
+\r
+      output {\r
+        anyxml data {\r
+          description\r
+            "Contains the schema content.";\r
+        }\r
+      }\r
+    }  // rpc get-schema\r
+} // module\r
diff --git a/netconf-server/schemas/ietf-yang-types.yang b/netconf-server/schemas/ietf-yang-types.yang
new file mode 100644 (file)
index 0000000..b35286e
--- /dev/null
@@ -0,0 +1,435 @@
+module ietf-yang-types {\r
+\r
+namespace "urn:ietf:params:xml:ns:yang:ietf-yang-types";\r
+prefix "yang";\r
+\r
+organization\r
+ "IETF NETMOD (NETCONF Data Modeling Language) Working Group";\r
+\r
+contact\r
+ "WG Web:   <http://tools.ietf.org/wg/netmod/>\r
+  WG List:  <mailto:netmod@ietf.org>\r
+  WG Chair: David Kessens\r
+            <mailto:david.kessens@nsn.com>\r
+  WG Chair: Juergen Schoenwaelder\r
+            <mailto:j.schoenwaelder@jacobs-university.de>\r
+  Editor:   Juergen Schoenwaelder\r
+            <mailto:j.schoenwaelder@jacobs-university.de>";\r
+\r
+description\r
+ "This module contains a collection of generally useful derived\r
+  YANG data types.\r
+  Copyright (c) 2013 IETF Trust and the persons identified as\r
+  authors of the code.  All rights reserved.\r
+  Redistribution and use in source and binary forms, with or\r
+  without modification, is permitted pursuant to, and subject\r
+  to the license terms contained in, the Simplified BSD License\r
+  set forth in Section 4.c of the IETF Trust's Legal Provisions\r
+  Relating to IETF Documents\r
+  (http://trustee.ietf.org/license-info).\r
+  This version of this YANG module is part of RFC 6991; see\r
+  the RFC itself for full legal notices.";\r
+\r
+revision 2013-07-15 {\r
+  description\r
+   "This revision adds the following new data types:\r
+    - yang-identifier\r
+    - hex-string\r
+    - uuid\r
+    - dotted-quad";\r
+  reference\r
+   "RFC 6991: Common YANG Data Types";\r
+}\r
+\r
+revision 2010-09-24 {\r
+  description\r
+   "Initial revision.";\r
+  reference\r
+   "RFC 6021: Common YANG Data Types";\r
+}\r
+\r
+/*** collection of counter and gauge types ***/\r
+\r
+typedef counter32 {\r
+  type uint32;\r
+  description\r
+   "The counter32 type represents a non-negative integer\r
+    that monotonically increases until it reaches a\r
+    maximum value of 2^32-1 (4294967295 decimal), when it\r
+    wraps around and starts increasing again from zero.\r
+    Counters have no defined 'initial' value, and thus, a\r
+    single value of a counter has (in general) no information\r
+    content.  Discontinuities in the monotonically increasing\r
+    value normally occur at re-initialization of the\r
+    management system, and at other times as specified in the\r
+    description of a schema node using this type.  If such\r
+    other times can occur, for example, the creation of\r
+    a schema node of type counter32 at times other than\r
+    re-initialization, then a corresponding schema node\r
+    should be defined, with an appropriate type, to indicate\r
+    the last discontinuity.\r
+    The counter32 type should not be used for configuration\r
+    schema nodes.  A default statement SHOULD NOT be used in\r
+    combination with the type counter32.\r
+    In the value set and its semantics, this type is equivalent\r
+    to the Counter32 type of the SMIv2.";\r
+  reference\r
+   "RFC 2578: Structure of Management Information Version 2\r
+              (SMIv2)";\r
+}\r
+\r
+typedef zero-based-counter32 {\r
+  type yang:counter32;\r
+  default "0";\r
+  description\r
+   "The zero-based-counter32 type represents a counter32\r
+    that has the defined 'initial' value zero.\r
+    A schema node of this type will be set to zero (0) on creation\r
+    and will thereafter increase monotonically until it reaches\r
+    a maximum value of 2^32-1 (4294967295 decimal), when it\r
+    wraps around and starts increasing again from zero.\r
+    Provided that an application discovers a new schema node\r
+    of this type within the minimum time to wrap, it can use the\r
+    'initial' value as a delta.  It is important for a management\r
+    station to be aware of this minimum time and the actual time\r
+    between polls, and to discard data if the actual time is too\r
+    long or there is no defined minimum time.\r
+    In the value set and its semantics, this type is equivalent\r
+    to the ZeroBasedCounter32 textual convention of the SMIv2.";\r
+  reference\r
+    "RFC 4502: Remote Network Monitoring Management Information\r
+               Base Version 2";\r
+}\r
+\r
+typedef counter64 {\r
+  type uint64;\r
+  description\r
+   "The counter64 type represents a non-negative integer\r
+    that monotonically increases until it reaches a\r
+    maximum value of 2^64-1 (18446744073709551615 decimal),\r
+    when it wraps around and starts increasing again from zero.\r
+    Counters have no defined 'initial' value, and thus, a\r
+    single value of a counter has (in general) no information\r
+    content.  Discontinuities in the monotonically increasing\r
+    value normally occur at re-initialization of the\r
+    management system, and at other times as specified in the\r
+    description of a schema node using this type.  If such\r
+    other times can occur, for example, the creation of\r
+    a schema node of type counter64 at times other than\r
+    re-initialization, then a corresponding schema node\r
+    should be defined, with an appropriate type, to indicate\r
+    the last discontinuity.\r
+    The counter64 type should not be used for configuration\r
+    schema nodes.  A default statement SHOULD NOT be used in\r
+    combination with the type counter64.\r
+    In the value set and its semantics, this type is equivalent\r
+    to the Counter64 type of the SMIv2.";\r
+  reference\r
+   "RFC 2578: Structure of Management Information Version 2\r
+              (SMIv2)";\r
+}\r
+\r
+typedef zero-based-counter64 {\r
+  type yang:counter64;\r
+  default "0";\r
+  description\r
+   "The zero-based-counter64 type represents a counter64 that\r
+    has the defined 'initial' value zero.\r
+    A schema node of this type will be set to zero (0) on creation\r
+    and will thereafter increase monotonically until it reaches\r
+    a maximum value of 2^64-1 (18446744073709551615 decimal),\r
+    when it wraps around and starts increasing again from zero.\r
+    Provided that an application discovers a new schema node\r
+    of this type within the minimum time to wrap, it can use the\r
+    'initial' value as a delta.  It is important for a management\r
+    station to be aware of this minimum time and the actual time\r
+    between polls, and to discard data if the actual time is too\r
+    long or there is no defined minimum time.\r
+    In the value set and its semantics, this type is equivalent\r
+    to the ZeroBasedCounter64 textual convention of the SMIv2.";\r
+  reference\r
+   "RFC 2856: Textual Conventions for Additional High Capacity\r
+              Data Types";\r
+}\r
+\r
+typedef gauge32 {\r
+  type uint32;\r
+  description\r
+   "The gauge32 type represents a non-negative integer, which\r
+    may increase or decrease, but shall never exceed a maximum\r
+    value, nor fall below a minimum value.  The maximum value\r
+    cannot be greater than 2^32-1 (4294967295 decimal), and\r
+    the minimum value cannot be smaller than 0.  The value of\r
+    a gauge32 has its maximum value whenever the information\r
+    being modeled is greater than or equal to its maximum\r
+    value, and has its minimum value whenever the information\r
+    being modeled is smaller than or equal to its minimum value.\r
+    If the information being modeled subsequently decreases\r
+    below (increases above) the maximum (minimum) value, the\r
+    gauge32 also decreases (increases).\r
+    In the value set and its semantics, this type is equivalent\r
+    to the Gauge32 type of the SMIv2.";\r
+  reference\r
+   "RFC 2578: Structure of Management Information Version 2\r
+              (SMIv2)";\r
+}\r
+\r
+typedef gauge64 {\r
+  type uint64;\r
+  description\r
+   "The gauge64 type represents a non-negative integer, which\r
+    may increase or decrease, but shall never exceed a maximum\r
+    value, nor fall below a minimum value.  The maximum value\r
+    cannot be greater than 2^64-1 (18446744073709551615), and\r
+    the minimum value cannot be smaller than 0.  The value of\r
+    a gauge64 has its maximum value whenever the information\r
+    being modeled is greater than or equal to its maximum\r
+    value, and has its minimum value whenever the information\r
+    being modeled is smaller than or equal to its minimum value.\r
+    If the information being modeled subsequently decreases\r
+    below (increases above) the maximum (minimum) value, the\r
+    gauge64 also decreases (increases).\r
+    In the value set and its semantics, this type is equivalent\r
+    to the CounterBasedGauge64 SMIv2 textual convention defined\r
+    in RFC 2856";\r
+  reference\r
+   "RFC 2856: Textual Conventions for Additional High Capacity\r
+              Data Types";\r
+}\r
+\r
+/*** collection of identifier-related types ***/\r
+\r
+typedef object-identifier {\r
+  type string {\r
+    pattern '(([0-1](\.[1-3]?[0-9]))|(2\.(0|([1-9]\d*))))'\r
+          + '(\.(0|([1-9]\d*)))*';\r
+  }\r
+  description\r
+   "The object-identifier type represents administratively\r
+    assigned names in a registration-hierarchical-name tree.\r
+    Values of this type are denoted as a sequence of numerical\r
+    non-negative sub-identifier values.  Each sub-identifier\r
+    value MUST NOT exceed 2^32-1 (4294967295).  Sub-identifiers\r
+    are separated by single dots and without any intermediate\r
+    whitespace.\r
+    The ASN.1 standard restricts the value space of the first\r
+    sub-identifier to 0, 1, or 2.  Furthermore, the value space\r
+    of the second sub-identifier is restricted to the range\r
+    0 to 39 if the first sub-identifier is 0 or 1.  Finally,\r
+    the ASN.1 standard requires that an object identifier\r
+    has always at least two sub-identifiers.  The pattern\r
+    captures these restrictions.\r
+    Although the number of sub-identifiers is not limited,\r
+    module designers should realize that there may be\r
+    implementations that stick with the SMIv2 limit of 128\r
+    sub-identifiers.\r
+    This type is a superset of the SMIv2 OBJECT IDENTIFIER type\r
+    since it is not restricted to 128 sub-identifiers.  Hence,\r
+    this type SHOULD NOT be used to represent the SMIv2 OBJECT\r
+    IDENTIFIER type; the object-identifier-128 type SHOULD be\r
+    used instead.";\r
+  reference\r
+   "ISO9834-1: Information technology -- Open Systems\r
+    Interconnection -- Procedures for the operation of OSI\r
+    Registration Authorities: General procedures and top\r
+    arcs of the ASN.1 Object Identifier tree";\r
+}\r
+\r
+typedef object-identifier-128 {\r
+  type object-identifier {\r
+    pattern '\d*(\.\d*){1,127}';\r
+  }\r
+  description\r
+   "This type represents object-identifiers restricted to 128\r
+    sub-identifiers.\r
+    In the value set and its semantics, this type is equivalent\r
+    to the OBJECT IDENTIFIER type of the SMIv2.";\r
+  reference\r
+   "RFC 2578: Structure of Management Information Version 2\r
+              (SMIv2)";\r
+}\r
+\r
+typedef yang-identifier {\r
+  type string {\r
+    length "1..max";\r
+    pattern '[a-zA-Z_][a-zA-Z0-9\-_.]*';\r
+    pattern '.|..|[^xX].*|.[^mM].*|..[^lL].*';\r
+  }\r
+  description\r
+    "A YANG identifier string as defined by the 'identifier'\r
+     rule in Section 12 of RFC 6020.  An identifier must\r
+     start with an alphabetic character or an underscore\r
+     followed by an arbitrary sequence of alphabetic or\r
+     numeric characters, underscores, hyphens, or dots.\r
+     A YANG identifier MUST NOT start with any possible\r
+     combination of the lowercase or uppercase character\r
+     sequence 'xml'.";\r
+  reference\r
+    "RFC 6020: YANG - A Data Modeling Language for the Network\r
+               Configuration Protocol (NETCONF)";\r
+}\r
+\r
+/*** collection of types related to date and time***/\r
+\r
+typedef date-and-time {\r
+  type string {\r
+    pattern '\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d+)?'\r
+          + '(Z|[\+\-]\d{2}:\d{2})';\r
+  }\r
+  description\r
+   "The date-and-time type is a profile of the ISO 8601\r
+    standard for representation of dates and times using the\r
+    Gregorian calendar.  The profile is defined by the\r
+    date-time production in Section 5.6 of RFC 3339.\r
+    The date-and-time type is compatible with the dateTime XML\r
+    schema type with the following notable exceptions:\r
+    (a) The date-and-time type does not allow negative years.\r
+    (b) The date-and-time time-offset -00:00 indicates an unknown\r
+        time zone (see RFC 3339) while -00:00 and +00:00 and Z\r
+        all represent the same time zone in dateTime.\r
+    (c) The canonical format (see below) of data-and-time values\r
+        differs from the canonical format used by the dateTime XML\r
+        schema type, which requires all times to be in UTC using\r
+        the time-offset 'Z'.\r
+    This type is not equivalent to the DateAndTime textual\r
+    convention of the SMIv2 since RFC 3339 uses a different\r
+    separator between full-date and full-time and provides\r
+    higher resolution of time-secfrac.\r
+    The canonical format for date-and-time values with a known time\r
+    zone uses a numeric time zone offset that is calculated using\r
+    the device's configured known offset to UTC time.  A change of\r
+    the device's offset to UTC time will cause date-and-time values\r
+    to change accordingly.  Such changes might happen periodically\r
+    in case a server follows automatically daylight saving time\r
+    (DST) time zone offset changes.  The canonical format for\r
+    date-and-time values with an unknown time zone (usually\r
+    referring to the notion of local time) uses the time-offset\r
+    -00:00.";\r
+  reference\r
+   "RFC 3339: Date and Time on the Internet: Timestamps\r
+    RFC 2579: Textual Conventions for SMIv2\r
+    XSD-TYPES: XML Schema Part 2: Datatypes Second Edition";\r
+}\r
+\r
+typedef timeticks {\r
+  type uint32;\r
+  description\r
+   "The timeticks type represents a non-negative integer that\r
+    represents the time, modulo 2^32 (4294967296 decimal), in\r
+    hundredths of a second between two epochs.  When a schema\r
+    node is defined that uses this type, the description of\r
+    the schema node identifies both of the reference epochs.\r
+    In the value set and its semantics, this type is equivalent\r
+    to the TimeTicks type of the SMIv2.";\r
+  reference\r
+   "RFC 2578: Structure of Management Information Version 2\r
+              (SMIv2)";\r
+}\r
+\r
+typedef timestamp {\r
+  type yang:timeticks;\r
+  description\r
+   "The timestamp type represents the value of an associated\r
+    timeticks schema node at which a specific occurrence\r
+    happened.  The specific occurrence must be defined in the\r
+    description of any schema node defined using this type.  When\r
+    the specific occurrence occurred prior to the last time the\r
+    associated timeticks attribute was zero, then the timestamp\r
+    value is zero.  Note that this requires all timestamp values\r
+    to be reset to zero when the value of the associated timeticks\r
+    attribute reaches 497+ days and wraps around to zero.\r
+    The associated timeticks schema node must be specified\r
+    in the description of any schema node using this type.\r
+    In the value set and its semantics, this type is equivalent\r
+    to the TimeStamp textual convention of the SMIv2.";\r
+  reference\r
+   "RFC 2579: Textual Conventions for SMIv2";\r
+}\r
+\r
+/*** collection of generic address types ***/\r
+\r
+typedef phys-address {\r
+  type string {\r
+    pattern '([0-9a-fA-F]{2}(:[0-9a-fA-F]{2})*)?';\r
+  }\r
+\r
+  description\r
+   "Represents media- or physical-level addresses represented\r
+    as a sequence octets, each octet represented by two hexadecimal\r
+    numbers.  Octets are separated by colons.  The canonical\r
+    representation uses lowercase characters.\r
+    In the value set and its semantics, this type is equivalent\r
+    to the PhysAddress textual convention of the SMIv2.";\r
+  reference\r
+   "RFC 2579: Textual Conventions for SMIv2";\r
+}\r
+\r
+typedef mac-address {\r
+  type string {\r
+    pattern '[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}';\r
+  }\r
+  description\r
+   "The mac-address type represents an IEEE 802 MAC address.\r
+    The canonical representation uses lowercase characters.\r
+    In the value set and its semantics, this type is equivalent\r
+    to the MacAddress textual convention of the SMIv2.";\r
+  reference\r
+   "IEEE 802: IEEE Standard for Local and Metropolitan Area\r
+              Networks: Overview and Architecture\r
+    RFC 2579: Textual Conventions for SMIv2";\r
+}\r
+\r
+/*** collection of XML-specific types ***/\r
+\r
+typedef xpath1.0 {\r
+  type string;\r
+  description\r
+   "This type represents an XPATH 1.0 expression.\r
+    When a schema node is defined that uses this type, the\r
+    description of the schema node MUST specify the XPath\r
+    context in which the XPath expression is evaluated.";\r
+  reference\r
+   "XPATH: XML Path Language (XPath) Version 1.0";\r
+}\r
+\r
+/*** collection of string types ***/\r
+\r
+typedef hex-string {\r
+  type string {\r
+    pattern '([0-9a-fA-F]{2}(:[0-9a-fA-F]{2})*)?';\r
+  }\r
+  description\r
+   "A hexadecimal string with octets represented as hex digits\r
+    separated by colons.  The canonical representation uses\r
+    lowercase characters.";\r
+}\r
+\r
+typedef uuid {\r
+  type string {\r
+    pattern '[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-'\r
+          + '[0-9a-fA-F]{4}-[0-9a-fA-F]{12}';\r
+  }\r
+  description\r
+   "A Universally Unique IDentifier in the string representation\r
+    defined in RFC 4122.  The canonical representation uses\r
+    lowercase characters.\r
+    The following is an example of a UUID in string representation:\r
+    f81d4fae-7dec-11d0-a765-00a0c91e6bf6\r
+    ";\r
+  reference\r
+   "RFC 4122: A Universally Unique IDentifier (UUID) URN\r
+              Namespace";\r
+}\r
+\r
+typedef dotted-quad {\r
+  type string {\r
+    pattern\r
+      '(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}'\r
+    + '([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])';\r
+  }\r
+  description\r
+    "An unsigned 32-bit number expressed in the dotted-quad\r
+     notation, i.e., four octets written as decimal numbers\r
+     and separated with the '.' (full stop) character.";\r
+}\r
+}\r
diff --git a/netconf-server/schemas/o-ran-file-management.yang b/netconf-server/schemas/o-ran-file-management.yang
new file mode 100644 (file)
index 0000000..27ab9ee
--- /dev/null
@@ -0,0 +1,213 @@
+module o-ran-file-management {\r
+  yang-version 1.1;\r
+  namespace "urn:o-ran:file-management:1.0";\r
+  prefix "o-ran-file-mgmt";\r
+\r
+  import ietf-crypto-types {\r
+    prefix "ct";\r
+  }\r
+\r
+\r
+  organization "O-RAN Alliance";\r
+\r
+  contact\r
+    "www.o-ran.org";\r
+\r
+  description\r
+    "This module defines the configuration and operations for handling upload.\r
+\r
+    Copyright 2019 the O-RAN Alliance.\r
+\r
+    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS'\r
+    AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
+    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r
+    ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE\r
+    LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\r
+    CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\r
+    SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r
+    INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\r
+    CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r
+    ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\r
+    POSSIBILITY OF SUCH DAMAGE.\r
+\r
+    Redistribution and use in source and binary forms, with or without\r
+    modification, are permitted provided that the following conditions are met:\r
+\r
+    * Redistributions of source code must retain the above copyright notice,\r
+    this list of conditions and the above disclaimer.\r
+    * Redistributions in binary form must reproduce the above copyright notice,\r
+    this list of conditions and the above disclaimer in the documentation\r
+    and/or other materials provided with the distribution.\r
+    * Neither the Members of the O-RAN Alliance nor the names of its\r
+    contributors may be used to endorse or promote products derived from\r
+    this software without specific prior written permission.";\r
+\r
+  revision "2019-07-03" {\r
+    description\r
+      "version 1.1.0\r
+\r
+      1) backward compatible changes to correct sFTP Server Authentication .\r
+      2) minor fixes according to lack of descriptions\r
+      3) backward compatible changes to introduce groupings";\r
+\r
+    reference "ORAN-WG4.M.0-v01.00";\r
+  }\r
+\r
+  revision "2019-02-04" {\r
+    description\r
+      "version 1.0.0\r
+\r
+      1) imported model from xRAN\r
+      2) changed namespace and reference from xran to o-ran";\r
+\r
+    reference "ORAN-WG4.M.0-v01.00";\r
+  }\r
+\r
+  grouping file-path-grouping {\r
+    description "Complete logical path of the file to upload/download\r
+    (no wildcard is allowed) ex : /o-RAN/log/syslog.1";\r
+\r
+    leaf local-logical-file-path {\r
+      type string;\r
+      mandatory true;\r
+      description "Local logical file path";\r
+    }\r
+\r
+    leaf remote-file-path {\r
+      type string;\r
+      mandatory true;\r
+      description "URI specifying the remote-file-path on O-DU/NMS.\r
+      Format:sftp://<username>@<host>[:port]/path";\r
+    }\r
+  }\r
+\r
+  grouping output-status-grouping {\r
+    description "Status grouping";\r
+\r
+    leaf status {\r
+      type enumeration {\r
+        enum SUCCESS {\r
+            description "";}\r
+        enum FAILURE {\r
+            description "";}\r
+      }\r
+      description "Operation status";\r
+      }\r
+\r
+    leaf reject-reason {\r
+      when "../status = 'FAILURE'";\r
+      type string;\r
+      description "";\r
+    }\r
+  }\r
+\r
+  grouping credential-information {\r
+    description "Type of authentication to use for SFTP upload or download.";\r
+    choice credentials {\r
+      case password {\r
+        container password {\r
+          presence true;\r
+          leaf password {\r
+            type string;\r
+            mandatory true;\r
+            description\r
+              "password needed for O-RU authentication.";\r
+          }\r
+          description\r
+            "password for O-RU authentication method in use";\r
+        }\r
+        container server {\r
+          list keys {\r
+            key algorithm;\r
+            ordered-by user;\r
+            uses ct:public-key-grouping;\r
+            description\r
+              "List of allowed algorithms with its keys";\r
+          }\r
+          description\r
+            "Key for sFTP server authentication";\r
+        }\r
+      }\r
+      case certificate {\r
+        container certificate {\r
+          presence true;\r
+          description\r
+            "certificate authentication method in use";\r
+        }\r
+      }\r
+     description "";\r
+    }\r
+  }\r
+\r
+  grouping retrieve-input {\r
+    description "Grouping for information retrieval RPC input";\r
+    leaf logical-path {\r
+      type string;\r
+      mandatory true;\r
+      description "O-RAN unit of which the files are to be listed.\r
+      ex :  O-RAN/log, o-RAN/PM, O-RAN/transceiver";\r
+    }\r
+    leaf file-name-filter {\r
+      type string;\r
+      description "Filter which are to be applied on the result list of file names (* is allowed as wild-card).";\r
+    }\r
+  }\r
+\r
+  grouping retrieve-output {\r
+    description "Grouping for information retrieval RPC output";\r
+    uses output-status-grouping;\r
+    leaf-list file-list {\r
+      when "../status = 'SUCCESS'";\r
+      type string;\r
+      description "List of files in the unit with the filter applied.";\r
+    }\r
+  }\r
+\r
+// RPCs\r
+\r
+  rpc file-upload {\r
+    description "File upload over SFTP from equipment to NETCONF client";\r
+    input {\r
+      uses file-path-grouping;\r
+      uses credential-information;\r
+    }\r
+    output {\r
+      uses output-status-grouping;\r
+    }\r
+  }\r
+\r
+  rpc retrieve-file-list {\r
+    description "List all the files in the logical O-RAN unit (* is allowed as wild-card).";\r
+    input {\r
+      uses retrieve-input;\r
+\r
+    }\r
+    output {\r
+      uses retrieve-output;\r
+    }\r
+  }\r
+\r
+  notification file-upload-notification {\r
+    uses file-path-grouping;\r
+    uses output-status-grouping;\r
+    description "";\r
+  }\r
+\r
+  rpc file-download {\r
+    description\r
+      "Management plane triggered to generate the download file of O-RU.";\r
+    input {\r
+      uses file-path-grouping;\r
+      uses credential-information;\r
+    }\r
+    output {\r
+      uses output-status-grouping;\r
+    }\r
+  }\r
+\r
+  notification file-download-event {\r
+    uses file-path-grouping;\r
+    uses output-status-grouping;\r
+    description "";\r
+  }\r
+}\r
diff --git a/netconf-server/schemas/o-ran-hardware.yang b/netconf-server/schemas/o-ran-hardware.yang
new file mode 100644 (file)
index 0000000..0787ebb
--- /dev/null
@@ -0,0 +1,271 @@
+module o-ran-hardware {\r
+  yang-version 1.1;\r
+  namespace "urn:o-ran:hardware:1.0";\r
+  prefix "o-ran-hw";\r
+\r
+  import ietf-hardware {\r
+    prefix hw;\r
+  }\r
+  import iana-hardware {\r
+    prefix ianahw;\r
+  }\r
+\r
+  organization "O-RAN Alliance";\r
+\r
+  contact\r
+    "www.o-ran.org";\r
+\r
+  description\r
+    "This module defines the YANG definitions for managng the O-RAN hardware.\r
+\r
+     Copyright 2019 the O-RAN Alliance.\r
+\r
+     THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS'\r
+     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
+     IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r
+     ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE\r
+     LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\r
+     CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\r
+     SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r
+     INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\r
+     CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r
+     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\r
+     POSSIBILITY OF SUCH DAMAGE.\r
+\r
+     Redistribution and use in source and binary forms, with or without\r
+     modification, are permitted provided that the following conditions are met:\r
+\r
+     * Redistributions of source code must retain the above copyright notice,\r
+     this list of conditions and the above disclaimer.\r
+     * Redistributions in binary form must reproduce the above copyright notice,\r
+     this list of conditions and the above disclaimer in the documentation\r
+     and/or other materials provided with the distribution.\r
+     * Neither the Members of the O-RAN Alliance nor the names of its\r
+     contributors may be used to endorse or promote products derived from\r
+     this software without specific prior written permission.";\r
+\r
+   revision "2019-07-03" {\r
+    description\r
+      "version 1.1.0\r
+\r
+      1) added new identities to accommodate cross working group use of\r
+      o-ran-hardware and assoicated set of augmentations that are backwards\r
+      compatible to version 1.0.0";\r
+\r
+    reference "ORAN-WG4.M.0-v01.00";\r
+   }\r
+\r
+  revision "2019-02-04" {\r
+   description\r
+     "version 1.0.0\r
+\r
+     1) imported model from xRAN\r
+     2) changed namespace and reference from xran to o-ran";\r
+\r
+   reference "ORAN-WG4.M.0-v01.00";\r
+  }\r
+\r
+  feature ENERGYSAVING {\r
+    description\r
+      "Indicates that the Radio Unit supports energy saving state.";\r
+  }\r
+\r
+  // identity statements\r
+  identity O-RAN-RADIO {\r
+    base ianahw:module;\r
+    description\r
+      "Module used as it represents a self-contained sub-system\r
+      used in /hw:/hardware/hw:component/hw:class to represent\r
+      an O-RAN RU";\r
+  }\r
+\r
+  identity O-RAN-HW-COMPONENT {\r
+    base ianahw:module;\r
+    description\r
+      "Module used as it represents a self-contained sub-system\r
+      used in /hw:/hardware/hw:component/hw:class to represent\r
+      any O-RAN hardware component";\r
+  }\r
+\r
+  identity O-DU-COMPONENT {\r
+    base O-RAN-HW-COMPONENT;\r
+    description\r
+      "Used in /hw:/hardware/hw:component/hw:class to represent\r
+      any O-RAN defined O-DU hardware component";\r
+  }\r
+\r
+  identity O-RU-COMPONENT {\r
+    base O-RAN-HW-COMPONENT;\r
+    description\r
+      "Used in /hw:/hardware/hw:component/hw:class to represent\r
+      any O-RAN defined O-RU hardware component, including a stand-alone\r
+      O-RU or an O-RU component integrated into a multi-module system.";\r
+  }\r
+\r
+  // typedef statements\r
+  typedef energysaving-state {\r
+    type enumeration {\r
+      enum UNKNOWN {\r
+        description "The Radio Unit is unable to report energy saving state.";\r
+      }\r
+      enum SLEEPING {\r
+        description\r
+          "The Radio Unit is in a sleep state. The NETCONF management plane\r
+           connection is functioning. Other functions and hardware which are\r
+           not needed for management plane may be in energy saving mode.";\r
+      }\r
+      enum AWAKE {\r
+        description\r
+          "The Radio Unit is not in an energy saving state.";\r
+      }\r
+    }\r
+    description\r
+      "new typedef since ietf-hardware only covers pwer-state\r
+      for redundancy purposes and not power saving operations.";\r
+  }\r
+\r
+  typedef availability-type {\r
+    type enumeration {\r
+      enum UNKNOWN {\r
+        description "The Radio Unit is unable to report its availability state.";\r
+      }\r
+      enum NORMAL {\r
+        description\r
+          "The equipment is functioning correctly.";\r
+      }\r
+      enum DEGRADED {\r
+        description\r
+          "The equipment may be reporting a major alarm or may be reporting a critical\r
+           alarm that is only impacting one or more subcomponent, but where the\r
+           equipment's implementation permit it to continue operation (server traffic)\r
+           in a degraded state.\r
+\r
+           Used for example, when the equipment has M identical sub-components and\r
+           when a critical alarm is imapcting only N subcomponents, where N<M.";\r
+      }\r
+      enum FAULTY {\r
+        description\r
+          "The (sub-)components impacted by the critical alarm(s) impact the\r
+          ability of the equipment to continue operation (serve traffic).";\r
+      }\r
+    }\r
+    description\r
+      "Equipment's availability-state is derived by matching active faults\r
+       and their impact to module's operation and enables an equipment to indicate\r
+       that even though it may have one or more critical alarms, it can continue\r
+       to serve traffic.";\r
+  }\r
+\r
+  // common WG4 and croos-WG augmentations using O-RAN-RADIO identity\r
+\r
+  augment "/hw:hardware/hw:component" {\r
+    when "(derived-from-or-self(hw:class, 'o-ran-hw:O-RAN-RADIO')) or\r
+    (derived-from-or-self(hw:class, 'o-ran-hw:O-RAN-HW-COMPONENT'))";\r
+    description "New O-RAN parameters for o-ran hardware";\r
+\r
+    container label-content {\r
+      config false;\r
+      description\r
+        "Which set of attributes are printed on the Radio Unit's label";\r
+      leaf model-name {\r
+        type boolean;\r
+        description\r
+          "indicates whether model-name is included on the equipment's label";\r
+      }\r
+      leaf serial-number {\r
+        type boolean;\r
+        description\r
+          "indicates whether serial number is included on the equipment's label";\r
+      }\r
+    }\r
+    leaf product-code {\r
+      type string;\r
+      config false;\r
+      mandatory true;\r
+      description\r
+        "O-RAN term that is distinct from model-name in ietf-hardware.";\r
+    }\r
+    leaf energy-saving-enabled {\r
+      if-feature "ENERGYSAVING";\r
+      type boolean;\r
+      config true;\r
+      default false;\r
+      description\r
+        "This parameter can enable O-RAN unit to be switched to energy\r
+         saving mode.\r
+         TRUE indicates to switch the energy saving mode.\r
+         FALSE indicates to cancel the energy saving mode.\r
+         At the energy saving mode, all power of whole O-RAN unit becomes\r
+         lowest level whereas M-plane is still available";\r
+    }\r
+  }\r
+\r
+  augment "/hw:hardware/hw:component" {\r
+    when "(derived-from-or-self(hw:class, 'o-ran-hw:O-RAN-RADIO')) or\r
+    (derived-from-or-self(hw:class, 'ianahw:port')) or\r
+    (derived-from-or-self(hw:class, 'o-ran-hw:O-RAN-HW-COMPONENT'))";\r
+    description "New O-RAN parameters for o-ran naming";\r
+    leaf o-ran-name {\r
+      type leafref {\r
+        path "/hw:hardware/hw:component/hw:name";\r
+      }\r
+      must "re-match(current(),'[a-zA-Z0-9][a-zA-Z0-9\\.\\-_]{0,253}[a-zA-Z0-9]')" {\r
+        error-message "Name must match pattern and length.";\r
+      }\r
+      mandatory true;\r
+      description\r
+        "O-RAN name needed to bind and match with the name of hw element,\r
+        to be compliant with O-RAN naming convention.";\r
+    }\r
+  }\r
+\r
+  augment "/hw:hardware/hw:component/hw:state"  {\r
+    when "(derived-from-or-self(../hw:class, 'o-ran-hw:O-RAN-RADIO')) or\r
+    (derived-from-or-self(../hw:class, 'o-ran-hw:O-RAN-HW-COMPONENT'))";\r
+    description\r
+      "new O-RAN defined state";\r
+    leaf power-state {\r
+      if-feature "ENERGYSAVING";\r
+      type energysaving-state;\r
+      config false;\r
+      description\r
+        "The current power saving state for this component.\r
+        Note - hw:/hardware/compnent/state/standby-state defined in RFC 4268 is\r
+        used for redundancy purposes and not power saving operations.";\r
+    }\r
+    leaf availability-state {\r
+      type availability-type;\r
+      config false;\r
+      description\r
+        "Equipment's availability-state is derived by matching active faults\r
+         and their impact to module's operation and enables an equipment to indicate\r
+         that even though it may have one or more critical alarms, it can continue\r
+         to serve traffic.";\r
+    }\r
+  }\r
+\r
+\r
+// augmentations to Notifications\r
+\r
+  augment "/hw:hardware-state-oper-enabled"  {\r
+    description "new availability state";\r
+    leaf availability-state {\r
+      type leafref {\r
+        path "/hw:hardware/hw:component/hw:state/o-ran-hw:availability-state";\r
+      }\r
+      description\r
+        "The availability-state of the O-RU.";\r
+    }\r
+  }\r
+\r
+  augment "/hw:hardware-state-oper-disabled"  {\r
+    description "new availability state";\r
+    leaf availability-state {\r
+      type leafref {\r
+        path "/hw:hardware/hw:component/hw:state/o-ran-hw:availability-state";\r
+      }\r
+      description\r
+        "The availability-state of the O-RU.";\r
+    }\r
+  }\r
+}\r
diff --git a/netconf-server/schemas/o-ran-heartbeat-management.yang b/netconf-server/schemas/o-ran-heartbeat-management.yang
new file mode 100644 (file)
index 0000000..60747a4
--- /dev/null
@@ -0,0 +1,64 @@
+module o-ran-heartbeat-management {\r
+  yang-version 1.1;\r
+  namespace "urn:o-ran:heartbeat-management:1.0";\r
+  prefix o-ran-hbeat;\r
+\r
+  organization\r
+    "CommScope Inc";\r
+  contact\r
+    "Radio access OneCell <5g@commscope.com>\r
+\r
+     CommScope Inc\r
+     1100 10th Ave Ct SE,\r
+     Hickory,\r
+     NC 28602,\r
+     USA";\r
+  description\r
+    "This module defines operations and configuration for the heart beat event management.";\r
+\r
+  revision 2020-06-30 {\r
+    description\r
+      "PLEASE READ BELOW NOTES BEFORE USING THE MODEL:\r
+       1)  All attributes of TR 196, 181 and OneCell extensions are all covered\r
+           in this same YANG File. In future this shall split into three\r
+           different yang models.\r
+\r
+       2) The reason for using single file is that the SDN-R Configuration APP\r
+          doesn't load the UI properly if the yang model uses augmentations.\r
+          Once the SDN-R Configuration App supports augmented yang files then\r
+          the model could be split into different files.\r
+\r
+       3) For tabular parameters, in yang model 'index' is used as a key and it\r
+          is introduced to indicate the row id/index value in table. ";\r
+    reference\r
+      "Subset of BBF TR-196, TR-181 and CommScope OneCell Vendor Extensions\r
+       Models";\r
+  }\r
+\r
+  container heartbeat {\r
+       \r
+    description\r
+      "This object contains parameters relating to HeartBeat parameters.";\r
+    leaf heartbeatPeriod {\r
+      type uint8 {\r
+        range "0 | 5..60";\r
+      }\r
+      units "minutes";\r
+      default "5";\r
+      description\r
+        "It specifies the time between two emissions of heartbeat notifications. A value of zero implies there is no heartbeat emission. The unit is minute";\r
+    }\r
+    leaf countDownTimer {\r
+      type uint8 {\r
+        range "0..60";\r
+      }\r
+      units "minutes";\r
+      default "0";\r
+      description\r
+        "It represents the current value of a countdown timer. Heartbeat is emitted when value reaches or is set to 0. The unit is minute.";\r
+      reference\r
+        "count down timer to emit next heart beat pulse";\r
+    }\r
+  }\r
+}\r
+\r
diff --git a/netconf-server/schemas/o-ran-software-management.yang b/netconf-server/schemas/o-ran-software-management.yang
new file mode 100644 (file)
index 0000000..ed84774
--- /dev/null
@@ -0,0 +1,595 @@
+module o-ran-software-management {\r
+  yang-version 1.1;\r
+  namespace "urn:o-ran:software-management:1.0";\r
+  prefix o-ran-swm;\r
+\r
+  import ietf-inet-types {\r
+    prefix "inet";\r
+    revision-date 2013-07-15;\r
+  }\r
+\r
+  import ietf-hardware {\r
+    prefix "hw";\r
+  }\r
+\r
+  import o-ran-hardware {\r
+    prefix "o-ran-hw";\r
+  }\r
+\r
+  import o-ran-file-management {\r
+    prefix "o-ran-fm";\r
+  }\r
+\r
+  organization "O-RAN Alliance";\r
+\r
+  contact\r
+    "www.o-ran.org";\r
+\r
+  description\r
+    "This module defines operations and configuration for the management of software packages.\r
+    This module is derived out of opencpe-firmware-mgmt@2014-02-06.yang\r
+\r
+    Copyright 2019 the O-RAN Alliance.\r
+\r
+    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS'\r
+    AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
+    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r
+    ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE\r
+    LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\r
+    CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\r
+    SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r
+    INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\r
+    CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r
+    ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\r
+    POSSIBILITY OF SUCH DAMAGE.\r
+\r
+    Redistribution and use in source and binary forms, with or without\r
+    modification, are permitted provided that the following conditions are met:\r
+\r
+    * Redistributions of source code must retain the above copyright notice,\r
+    this list of conditions and the above disclaimer.\r
+    * Redistributions in binary form must reproduce the above copyright notice,\r
+    this list of conditions and the above disclaimer in the documentation\r
+    and/or other materials provided with the distribution.\r
+    * Neither the Members of the O-RAN Alliance nor the names of its\r
+    contributors may be used to endorse or promote products derived from\r
+    this software without specific prior written permission.";\r
+\r
+  revision "2019-07-03" {\r
+    description\r
+      "version 1.0.2\r
+\r
+      1) backward compatible changes to correct sFTP Server Authentication .\r
+      2) simplifying file management and authentication to reuse from o-ran-file-management module\r
+      3) minor fixes according to lack of descriptions\r
+      4) removal of not used grouping\r
+      5) backward compatible changes to introduce groupings.";\r
+\r
+    reference "ORAN-WG4.M.0-v01.00";\r
+  }\r
+\r
+  revision "2019-02-04" {\r
+    description\r
+      "version 1.0.0\r
+\r
+      1) imported model from xRAN\r
+      2) changed namespace and reference from xran to o-ran";\r
+\r
+    reference "ORAN-WG4.M.0-v01.00";\r
+  }\r
+\r
+  // groupings\r
+\r
+  grouping slot-group {\r
+    description\r
+      "Contains information about each software slot and its content.";\r
+    list software-slot {\r
+      key name;\r
+      min-elements 2;\r
+\r
+      description\r
+        "Information about available software-slots and their software.";\r
+\r
+      leaf name {\r
+        type string;\r
+\r
+        description\r
+          "Name of the software package. This shall be unique to identify the software-slot.";\r
+      }\r
+\r
+      leaf status {\r
+        type enumeration {\r
+          enum VALID {\r
+            description\r
+              "Slot Contains software build considered as proven valid";\r
+          }\r
+          enum INVALID {\r
+            description\r
+              "software build is not currently used by O-RU. The software is considered by O-RU as damaged (e.g. wrong CRC)";\r
+          }\r
+          enum EMPTY {\r
+            description\r
+              "W slot does not contain software package.";\r
+          }\r
+        }\r
+        config false;\r
+        mandatory true;\r
+\r
+        description "Indicates the status of the software slot";\r
+      }\r
+\r
+      leaf active {\r
+          type boolean;\r
+      must "../status = 'VALID'";\r
+        config false;\r
+          description\r
+            "informs if software stored in particular slot is activated at the moment";\r
+      }\r
+\r
+      leaf running {\r
+          type boolean;\r
+      must "../status = 'VALID'";\r
+        config false;\r
+          description\r
+            "informs if software stored in particular slot is used at the moment";\r
+      }\r
+\r
+      leaf access {\r
+        type enumeration {\r
+          enum READ_ONLY {\r
+            description\r
+              "slot intended only for factory software,\r
+              activation of such software slot means getting back to factory defaults";\r
+          }\r
+          enum READ_WRITE {\r
+            description\r
+              "slot used for updating software";\r
+          }\r
+        }\r
+        default READ_WRITE;\r
+        config false;\r
+\r
+        description\r
+          "Indicates the writability of the slot.\r
+          A Read-Only software slot is one which has a factory installed software-slot";\r
+      }\r
+\r
+      leaf product-code {\r
+        type leafref {\r
+        path "/hw:hardware/hw:component/o-ran-hw:product-code";\r
+        }\r
+        config false;\r
+\r
+        description "product code provided by the vendor, specific to the product. This is derived from manifest file.";\r
+      }\r
+\r
+      leaf vendor-code {\r
+        type string {\r
+          length 1..2;\r
+        }\r
+        config false;\r
+\r
+        description\r
+          "Unique code of the vendor. This is derived from manifest file.";\r
+      }\r
+\r
+      leaf build-id {\r
+        type string;\r
+        config false;\r
+\r
+        description\r
+          "Identity associated with the software build. This is derived from manifest file.";\r
+      }\r
+\r
+      leaf build-name {\r
+        type string;\r
+        config false;\r
+\r
+        description\r
+          "Name of the build. This is derived from manifest file.";\r
+      }\r
+\r
+      leaf build-version {\r
+        type string;\r
+        description "The vendor-specific version string of the software build.";\r
+      }\r
+\r
+      list files {\r
+        key "name";\r
+        config false;\r
+\r
+        description "List of all the files present in the software package.";\r
+\r
+        leaf name {\r
+          type string;\r
+\r
+          description\r
+            "Name of the file installed in the slot.";\r
+        }\r
+\r
+        leaf version {\r
+          type string;\r
+\r
+          description\r
+            "Version of the file installed in the slot";\r
+        }\r
+        leaf local-path {\r
+          type string;\r
+          mandatory true;\r
+\r
+          description\r
+            "Complete path of the file stored locally";\r
+        }\r
+\r
+        leaf integrity {\r
+          type enumeration {\r
+            enum OK {\r
+              description "OK - indicates that file integrity is correct";\r
+            }\r
+            enum NOK {\r
+              description "NOK - indicates corrupted file";\r
+            }\r
+          }\r
+          config false;\r
+\r
+          description\r
+            "Result of the file integrity check (checksum calculation) during installation.";\r
+        }\r
+      }\r
+    }\r
+  }\r
+\r
+  grouping download-input {\r
+    description\r
+      "Grouping for sw download rpc input";\r
+    leaf remote-file-path {\r
+      type inet:uri;\r
+      mandatory true;\r
+      description\r
+        "URI of the software image including username.\r
+        The following format is possible:\r
+        sftp://<username>@<host>[:<port>]/path";\r
+    }\r
+\r
+    uses o-ran-fm:credential-information;\r
+  }\r
+\r
+  grouping download-output {\r
+    description\r
+      "Grouping for sw download rpc output";\r
+    leaf status {\r
+      type enumeration {\r
+        enum STARTED {\r
+          description\r
+            "Operation has been started without error.";\r
+        }\r
+        enum FAILED {\r
+          description\r
+            "Operation cannot be started because of error, more detailed information can be found in error-message.";\r
+        }\r
+      }\r
+      mandatory true;\r
+\r
+      description\r
+        "Status of the software files download";\r
+    }\r
+    leaf error-message {\r
+      when "../status = 'FAILED'";\r
+      type string;\r
+\r
+      description\r
+        "Detailed error Message when the status is failed.";\r
+    }\r
+\r
+    leaf notification-timeout {\r
+      type int32;\r
+      units seconds;\r
+      default 30;\r
+\r
+      description\r
+        "Notification timeout is the time NETCONF client shall\r
+        wait for a 'download-event' notification from O-RU. If there is no\r
+        'download-event' notification received within notification-timeout,\r
+        NETCONF client shall assume the download timeout/failure, and follow necessary steps.";\r
+    }\r
+  }\r
+\r
+  grouping install-input {\r
+    description\r
+      "Grouping for sw installation rpc input";\r
+    leaf slot-name {\r
+      type leafref {\r
+        path "/software-inventory/software-slot/name";\r
+        }\r
+      must "/software-inventory/software-slot[name = current()][active = 'false' and running = 'false']" {\r
+        error-message "software-install may be requested only against active::false and running::false slot!";\r
+      }\r
+      mandatory true;\r
+\r
+      description\r
+        "software-slot to which the software shall be installed to.";\r
+    }\r
+\r
+    leaf-list file-names {\r
+      type string;\r
+\r
+      description\r
+        "Names of the files within software package to be installed";\r
+    }\r
+  }\r
+\r
+  grouping install-output {\r
+    description\r
+      "Grouping for sw installation rpc output";\r
+    leaf status {\r
+      type enumeration {\r
+        enum STARTED {\r
+          description\r
+            "Operation has been started without error.";\r
+        }\r
+        enum FAILED {\r
+          description\r
+            "Operation cannot be started because of error, more detailed information can be found in error-message.";\r
+        }\r
+      }\r
+      mandatory true;\r
+\r
+      description\r
+        "Status of the software package install.";\r
+    }\r
+    leaf error-message {\r
+      when "../status = 'FAILED'";\r
+      type string;\r
+\r
+      description\r
+        "Detailed error Message when the status is failed.";\r
+    }\r
+  }\r
+\r
+  grouping activate-input {\r
+    description\r
+      "Grouping for sw activation rpc input";\r
+    leaf slot-name {\r
+      type leafref {\r
+        path "/software-inventory/software-slot/name";\r
+      }\r
+      must "/software-inventory/software-slot[name = current()][status = 'VALID']" {\r
+        error-message "software activation may be requested only on VALID slot!";\r
+      }\r
+      mandatory true;\r
+\r
+      description\r
+        "Slot name on which software has to be activated.";\r
+    }\r
+  }\r
+\r
+  grouping activate-output {\r
+    description\r
+      "Grouping for sw activation rpc output";\r
+    leaf status {\r
+      type enumeration {\r
+        enum STARTED {\r
+          description\r
+            "Operation has been started without error.";\r
+        }\r
+        enum FAILED {\r
+          description\r
+            "Operation cannot be started because of error, more detailed information can be found in error-message.";\r
+        }\r
+      }\r
+      mandatory true;\r
+\r
+      description\r
+        "Status of the software files activation";\r
+    }\r
+    leaf error-message {\r
+      when "../status = 'FAILED'";\r
+      type string;\r
+\r
+      description\r
+        "Detailed error Message when the status is failed.";\r
+    }\r
+\r
+    leaf notification-timeout {\r
+      type int32;\r
+      units seconds;\r
+      default 30;\r
+\r
+      description\r
+        "Timeout on client waiting for the activate event";\r
+    }\r
+  }\r
+\r
+  grouping download-notification {\r
+    description\r
+      "Grouping for notification event structure for download completion";\r
+    leaf file-name {\r
+      type string;\r
+      mandatory true;\r
+\r
+      description\r
+        "File name of downloaded software package";\r
+    }\r
+\r
+    leaf status {\r
+      type enumeration {\r
+        enum COMPLETED {\r
+          description\r
+            "Operation completed succesfully";\r
+        }\r
+        enum AUTHENTICATION_ERROR {\r
+          description "source available, wrong credentials";\r
+        }\r
+        enum PROTOCOL_ERROR {\r
+          description "SFTP errors";\r
+        }\r
+        enum FILE_NOT_FOUND {\r
+          description "source not available.";\r
+        }\r
+        enum APPLICATION_ERROR {\r
+          description "Application related errors";\r
+        }\r
+        enum TIMEOUT {\r
+          description "Timeout waiting for download";\r
+        }\r
+      }\r
+\r
+      description\r
+        "Status of finished operation execution";\r
+    }\r
+    leaf error-message {\r
+      when "../status != 'COMPLETED'";\r
+      type string;\r
+\r
+      description\r
+        "Detailed description of faulty situation";\r
+    }\r
+  }\r
+\r
+  grouping install-notification {\r
+    description\r
+      "Grouping for notification event structure for installation completion";\r
+    leaf slot-name {\r
+      type leafref {\r
+        path "/software-inventory/software-slot/name";\r
+      }\r
+\r
+      description\r
+        "Name of the slot to which software was installed.";\r
+    }\r
+    leaf status {\r
+      type enumeration {\r
+        enum COMPLETED {\r
+          description\r
+            "Operation completed succesfully";\r
+        }\r
+        enum FILE_ERROR {\r
+          description "operation on the file resulted in in error, disk failure, not enough disk space,\r
+                      incompatible file format";\r
+        }\r
+        enum INTEGRITY_ERROR {\r
+          description "file is corrupted";\r
+        }\r
+        enum APPLICATION_ERROR {\r
+          description "operation failed due to internal reason";\r
+        }\r
+      }\r
+\r
+      description\r
+        "Status of finished operation execution";\r
+    }\r
+    leaf error-message {\r
+      when "../status != 'COMPLETED'";\r
+      type string;\r
+\r
+      description\r
+        "Detailed description of faulty situation";\r
+    }\r
+  }\r
+\r
+  grouping activation-notification {\r
+    description\r
+      "Grouping for notification event structure for activation completion";\r
+    leaf slot-name {\r
+      type leafref {\r
+        path "/software-inventory/software-slot/name";\r
+      }\r
+\r
+      description\r
+        "Name of the slot which was activated";\r
+    }\r
+\r
+    leaf status {\r
+      type enumeration {\r
+        enum COMPLETED {\r
+          description\r
+            "Operation completed succesfully";\r
+        }\r
+        enum APPLICATION_ERROR {\r
+          description\r
+            "Operation finished with error, more details can by found in error-message";\r
+        }\r
+      }\r
+\r
+      description\r
+        "Status of finished operation execution";\r
+    }\r
+    leaf return-code {\r
+      type uint8;\r
+\r
+      description\r
+        "status code return when the software is tried to activate";\r
+    }\r
+    leaf error-message {\r
+      when "../status != 'COMPLETED'";\r
+      type string;\r
+\r
+      description\r
+        "Detailed description of faulty situation";\r
+    }\r
+  }\r
+\r
+  // top level container\r
+\r
+  container software-inventory {\r
+    config false;\r
+    description\r
+      "Contains information about each software slot and its content.";\r
+\r
+    uses slot-group;\r
+\r
+  }\r
+    // rpc statements\r
+\r
+  rpc software-download {\r
+    description\r
+      "Rpc needed to perform software download operation.";\r
+\r
+    input {\r
+      uses download-input;\r
+    }\r
+    output {\r
+      uses download-output;\r
+    }\r
+  }\r
+\r
+  rpc software-install {\r
+    description\r
+      "Install a previously downloaded software package.";\r
+\r
+    input {\r
+      uses install-input;\r
+    }\r
+    output {\r
+      uses install-output;\r
+    }\r
+  }\r
+\r
+  rpc software-activate {\r
+    description\r
+      "Activate a previously installed software.";\r
+    input {\r
+      uses activate-input;\r
+    }\r
+    output {\r
+      uses activate-output;\r
+    }\r
+  }\r
+\r
+    // notification definitions\r
+  notification download-event {\r
+    description "Notification event structure for download completion";\r
+    uses download-notification;\r
+\r
+  }\r
+\r
+  notification install-event {\r
+    description "Notification event structure for installation completion";\r
+    uses install-notification;\r
+  }\r
+\r
+  notification activation-event {\r
+    description "Notification event structure for activation completion";\r
+    uses activation-notification;\r
+  }\r
+}\r
index f692039..549fcc5 100644 (file)
@@ -27,7 +27,7 @@ module tr-181-2-12-0-cwmp-full {
        See the License for the specific language governing permissions and
        limitations under the License.";
 
-  revision 2020-06-23 {
+  revision 2020-06-24 {
     description
       "Initial version, used only for ONAP PoC 2018-06-25";
     reference
index 738f4a9..e1f6efb 100644 (file)
@@ -32,10 +32,10 @@ public class NetConfServerProperties {
   private String mapperPath;\r
   private String netconfServerRestPort;\r
   private String netconfServersStartPort;\r
-  private String netconfServersEndPort;\r
   private String maxNumOfNetconfServers;\r
   private String netconfServerIP;\r
   private String schemaDirPath;\r
+  private String vesURI;\r
 \r
   public String getRequestTimeOut() {\r
     return requestTimeOut;\r
@@ -77,14 +77,6 @@ public class NetConfServerProperties {
     this.netconfServersStartPort = netconfServersStartPort;\r
   }\r
 \r
-  public String getNetconfServersEndPort() {\r
-    return netconfServersEndPort;\r
-  }\r
-\r
-  public void setNetconfServersEndPort(String netconfServersEndPort) {\r
-    this.netconfServersEndPort = netconfServersEndPort;\r
-  }\r
-\r
   public Integer getDefaultNetconfStartPort() {\r
     return defaultNetconfStartPort;\r
   }\r
@@ -117,4 +109,11 @@ public class NetConfServerProperties {
     this.schemaDirPath = schemaDirPath;\r
   }\r
 \r
+  public String getVesURI() {\r
+    return vesURI;\r
+  }\r
+\r
+  public void setVesURI(String vesURI) {\r
+    this.vesURI = vesURI;\r
+  }\r
 }\r
index 046db19..416df8f 100644 (file)
@@ -1,21 +1,3 @@
-/*\r
- * ============LICENSE_START========================================================================\r
- * ONAP : tr-069-adapter\r
- * =================================================================================================\r
- * Copyright (C) 2020 CommScope Inc Intellectual Property.\r
- * =================================================================================================\r
- * This tr-069-adapter software file is distributed by CommScope Inc under the Apache License,\r
- * Version 2.0 (the "License"); you may not use this file except in compliance with the License. You\r
- * may obtain a copy of the License at\r
- *\r
- * http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,\r
- * either express or implied. See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- * ===============LICENSE_END=======================================================================\r
- */\r
-\r
 package org.commscope.tr069adapter.netconf.notification;\r
 \r
 import java.io.IOException;\r
@@ -27,7 +9,6 @@ import java.util.List;
 import java.util.Map;\r
 import java.util.StringTokenizer;\r
 \r
-import javax.xml.XMLConstants;\r
 import javax.xml.parsers.DocumentBuilder;\r
 import javax.xml.parsers.DocumentBuilderFactory;\r
 import javax.xml.parsers.ParserConfigurationException;\r
@@ -36,8 +17,8 @@ import javax.xml.transform.TransformerFactory;
 import javax.xml.transform.dom.DOMSource;\r
 import javax.xml.transform.stream.StreamResult;\r
 \r
-import org.commscope.tr069adapter.acs.common.DeviceInform;\r
 import org.commscope.tr069adapter.acs.common.ParameterDTO;\r
+import org.commscope.tr069adapter.mapper.model.NetConfNotificationDTO;\r
 import org.commscope.tr069adapter.netconf.rpc.CreateSubscription;\r
 import org.opendaylight.netconf.api.NetconfMessage;\r
 import org.opendaylight.netconf.api.xml.XmlNetconfConstants;\r
@@ -58,37 +39,39 @@ public class NetConfSessionUtil {
   private static final String INDEX_REGEX = "[0-9]{1,}";\r
   private static final String NS_URI = "urn:onf:otcc:wireless:yang:tr069-notification";\r
 \r
-  public void sendNetConfNotification(DeviceInform notification) {\r
-    NetconfMessage netconfMessage = convertToNetConfMessage(notification);\r
-    LOG.debug("Notification converted to NetConf format {}", netconfMessage);\r
-    CreateSubscription.sendNotification(netconfMessage,\r
-        notification.getDeviceDetails().getDeviceId());\r
+  public void sendNetConfNotification(NetConfNotificationDTO netConNotifDTO) {\r
+    NetconfMessage netconfMessage = convertToNetConfMessage(netConNotifDTO);\r
+    LOG.debug("Notification converted to NetConf format" + netconfMessage);\r
+    CreateSubscription.sendNotification(netconfMessage, netConNotifDTO.getDeviceID());\r
   }\r
 \r
-  private NetconfMessage convertToNetConfMessage(DeviceInform notification) {\r
+  private NetconfMessage convertToNetConfMessage(NetConfNotificationDTO netConNotifDTO) {\r
     try {\r
-      String netConfXmlMsg = getNetconfResponseXML(notification);\r
-      if (netConfXmlMsg == null)\r
-        throw new IllegalArgumentException("There are no parameters found in the response");\r
-      return new NetconfMessage(XmlUtil.readXmlToDocument(netConfXmlMsg));\r
+      String nameSpace = "";\r
+      if (netConNotifDTO.getUri() != null) {\r
+        nameSpace = netConNotifDTO.getUri();\r
+      } else {\r
+        nameSpace = NS_URI;\r
+      }\r
+      return new NetconfMessage(\r
+          XmlUtil.readXmlToDocument(getNetconfResponseXML(netConNotifDTO, nameSpace)));\r
     } catch (SAXException | IOException e) {\r
       throw new IllegalArgumentException("Cannot parse notifications", e);\r
     }\r
   }\r
 \r
-  private static String getNetconfResponseXML(DeviceInform notification) {\r
-    if (notification == null || notification.getParameters().isEmpty()) {\r
+  private static String getNetconfResponseXML(NetConfNotificationDTO netConNotifDTO,\r
+      String nameSpace) {\r
+    if (netConNotifDTO == null || netConNotifDTO.getParameters().isEmpty()) {\r
       LOG.debug("There are no parameters found in the response.");\r
       return null;\r
     }\r
 \r
-    List<ParameterDTO> parameters = notification.getParameters();\r
+    List<ParameterDTO> parameters = netConNotifDTO.getParameters();\r
 \r
     String result = null;\r
     try {\r
       DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();\r
-      docFactory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, "");\r
-      docFactory.setAttribute(XMLConstants.ACCESS_EXTERNAL_SCHEMA, "");\r
       DocumentBuilder docBuilder = docFactory.newDocumentBuilder();\r
       Document doc = docBuilder.newDocument();\r
 \r
@@ -100,35 +83,38 @@ public class NetConfSessionUtil {
         String paramValue = paramDto.getParamValue();\r
         StringTokenizer tokenizer = new StringTokenizer(paramName, ".");\r
         String parentNodeName = null;\r
-        StringBuilder parentNodeKey = null;\r
+        String parentNodeKey = null;\r
         Element parentNode = null;\r
         while (tokenizer.hasMoreElements()) {\r
           String nodeName = (String) tokenizer.nextElement();\r
           if (null == parentNodeName) { // construct first node or\r
                                         // Device node\r
             parentNodeName = nodeName;\r
-            parentNodeKey = new StringBuilder(nodeName);\r
+            parentNodeKey = nodeName;\r
             // check if the node already exists in parentNodeMap\r
-            parentNode = parentNodeMap.get(parentNodeKey.toString());\r
+            parentNode = parentNodeMap.get(parentNodeKey);\r
             if (null == dataNode) {\r
               dataNode = parentNode;\r
             }\r
+            continue;\r
           } else if (nodeName.matches(INDEX_REGEX)) { // construct\r
                                                       // tabular and\r
                                                       // index nodes\r
 \r
             // get parent tabular node from parent MAP\r
-            parentNodeKey = parentNodeKey.append(".").append(nodeName);\r
-            Element node = parentNodeMap.get(parentNodeKey.toString());\r
+            parentNodeKey = parentNodeKey + "." + nodeName;\r
+            Element node = parentNodeMap.get(parentNodeKey);\r
 \r
             // create a tabular parent node if doesn't exit in MAP\r
             if (null == node) {\r
               node = doc.createElement(parentNodeName);\r
-              parentNodeMap.put(parentNodeKey.toString(), node);\r
+              parentNodeMap.put(parentNodeKey, node);\r
 \r
               // update current tabular parent node.\r
               if (null != parentNode)\r
                 parentNode.appendChild(node);\r
+              else\r
+                parentNode = node;\r
 \r
               // prepare and add index node to tabular parent node\r
               Element indexNode = doc.createElement(INDEX_STR);\r
@@ -145,23 +131,23 @@ public class NetConfSessionUtil {
                                                             // attribute\r
                                                             // is\r
                                                             // found\r
-            parentNodeKey = parentNodeKey.append(".").append(nodeName);\r
+            parentNodeKey = parentNodeKey + "." + nodeName;\r
             parentNodeName = nodeName;\r
           } else {\r
             // construct intermediate nodes\r
-            Element node = parentNodeMap.get(parentNodeKey.toString());\r
+            Element node = parentNodeMap.get(parentNodeKey);\r
             if (null == node) {\r
               if (null == dataNode) {\r
-                node = doc.createElementNS(NS_URI, parentNodeName);\r
+                node = doc.createElementNS(nameSpace, parentNodeName);\r
                 dataNode = node;\r
               } else {\r
                 node = doc.createElement(parentNodeName);\r
               }\r
-              parentNodeMap.put(parentNodeKey.toString(), node);\r
+              parentNodeMap.put(parentNodeKey, node);\r
               if (null != parentNode)\r
                 parentNode.appendChild(node);\r
             }\r
-            parentNodeKey = parentNodeKey.append(".").append(nodeName);\r
+            parentNodeKey = parentNodeKey + "." + nodeName;\r
             parentNodeName = nodeName;\r
             parentNode = node;\r
           }\r
@@ -169,8 +155,7 @@ public class NetConfSessionUtil {
         // construct leaf node\r
         Element leafNode = doc.createElement(parentNodeName);\r
         leafNode.setTextContent(paramValue);\r
-        if (null != parentNode)\r
-          parentNode.appendChild(leafNode);\r
+        parentNode.appendChild(leafNode);\r
       }\r
 \r
       if (null != dataNode) {\r
@@ -178,16 +163,21 @@ public class NetConfSessionUtil {
         final Element eventTime = doc.createElement(XmlNetconfConstants.EVENT_TIME);\r
         eventTime\r
             .setTextContent(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX").format(new Date()));\r
-\r
-        final Element evtTypeElement =\r
-            doc.createElementNS(NS_URI, notification.getInformTypeList().get(0).toString());\r
-        evtTypeElement.appendChild(dataNode);\r
         element.appendChild(element.getOwnerDocument().importNode(eventTime, true));\r
-        element.appendChild(element.getOwnerDocument().importNode(evtTypeElement, true));\r
+\r
+        if (netConNotifDTO.getNotificationType() != null) {\r
+          final Element evtTypeElement =\r
+              doc.createElementNS(nameSpace, netConNotifDTO.getNotificationType());\r
+          evtTypeElement.appendChild(dataNode);\r
+          element.appendChild(element.getOwnerDocument().importNode(evtTypeElement, true));\r
+        } else {\r
+          element.appendChild(element.getOwnerDocument().importNode(dataNode, true));\r
+        }\r
+\r
         result = convertDocumentToString(element);\r
       }\r
     } catch (ParserConfigurationException pce) {\r
-      LOG.error("Error while getNetconfResponseXML {}", pce.toString());\r
+      pce.printStackTrace();\r
     }\r
 \r
     return result;\r
@@ -197,17 +187,15 @@ public class NetConfSessionUtil {
     String strxml = null;\r
     try {\r
       TransformerFactory transformerFactory = TransformerFactory.newInstance();\r
-      transformerFactory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, "");\r
-      transformerFactory.setAttribute(XMLConstants.ACCESS_EXTERNAL_STYLESHEET, "");\r
       Transformer transformer = transformerFactory.newTransformer();\r
       DOMSource source = new DOMSource(element);\r
       StreamResult result = new StreamResult(new StringWriter());\r
       transformer.transform(source, result);\r
       strxml = result.getWriter().toString();\r
     } catch (Exception e) {\r
-      LOG.error("Error while converting Element to String {}", e.toString());\r
+      LOG.error("Error while converting Element to String" + e);\r
     }\r
-    LOG.debug("Converted XML is : {}", strxml);\r
+    LOG.debug("Converted XML is : " + strxml);\r
     return strxml;\r
   }\r
 \r
index 24192f2..71197d0 100644 (file)
@@ -18,7 +18,7 @@
 \r
 package org.commscope.tr069adapter.netconf.notification;\r
 \r
-import org.commscope.tr069adapter.acs.common.DeviceInform;\r
+import org.commscope.tr069adapter.mapper.model.NetConfNotificationDTO;\r
 import org.slf4j.Logger;\r
 import org.slf4j.LoggerFactory;\r
 import org.springframework.beans.factory.annotation.Autowired;\r
@@ -32,9 +32,9 @@ public class NotificationHandler {
   @Autowired\r
   NetConfSessionUtil netConfSessionUtil;\r
 \r
-  public void handleNetConfNotification(DeviceInform notification) {\r
-    LOG.debug("processing netconf notification {}", notification);\r
-    netConfSessionUtil.sendNetConfNotification(notification);\r
+  public void handleNetConfNotification(NetConfNotificationDTO netConNotifDTO) {\r
+    LOG.debug("processing netconf notification " + netConNotifDTO);\r
+    netConfSessionUtil.sendNetConfNotification(netConNotifDTO);\r
   }\r
 \r
 }\r
index c05e4ad..7f60040 100644 (file)
@@ -59,14 +59,14 @@ public class NetConfServerManagerRestApi {
   }\r
 \r
   @PostMapping("/unregisterServer")\r
-  public boolean unregisterNetConfServerInstance(@RequestParam String deviceId,\r
+  public String unregisterNetConfServerInstance(@RequestParam String deviceId,\r
       @RequestParam String enodeBName) {\r
-    LOG.info("Received request for Unregister NetConf Server for deviceID: {}, enodeBName: {}",\r
+    LOG.info("Received request for Unregister NetConf Server for deviceID: {}, enodeBName: {} ",\r
         deviceId, enodeBName);\r
-    boolean status = manager.unregister(deviceId, enodeBName);\r
-    LOG.info("Unregister request is processed. NetConf Server for deviceID: {} , unregistered= {}",\r
-        deviceId, status);\r
-    return status;\r
+    String result = manager.unregister(deviceId, enodeBName);\r
+    LOG.info("Unregister request is processed. NetConf Server for deviceID: {} , unregisted= {}",\r
+        deviceId, result);\r
+    return result;\r
   }\r
 \r
 }\r
index 47a794c..e2863e1 100644 (file)
@@ -1,24 +1,6 @@
-/*\r
- * ============LICENSE_START========================================================================\r
- * ONAP : tr-069-adapter\r
- * =================================================================================================\r
- * Copyright (C) 2020 CommScope Inc Intellectual Property.\r
- * =================================================================================================\r
- * This tr-069-adapter software file is distributed by CommScope Inc under the Apache License,\r
- * Version 2.0 (the "License"); you may not use this file except in compliance with the License. You\r
- * may obtain a copy of the License at\r
- *\r
- * http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,\r
- * either express or implied. See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- * ===============LICENSE_END=======================================================================\r
- */\r
-\r
 package org.commscope.tr069adapter.netconf.restapi;\r
 \r
-import org.commscope.tr069adapter.acs.common.DeviceInform;\r
+import org.commscope.tr069adapter.mapper.model.NetConfNotificationDTO;\r
 import org.commscope.tr069adapter.netconf.notification.NotificationHandler;\r
 import org.slf4j.Logger;\r
 import org.slf4j.LoggerFactory;\r
@@ -38,10 +20,11 @@ public class NotificationReceiverService {
   NotificationHandler handler;\r
 \r
   @PostMapping("/notification")\r
-  public void processNotification(@RequestBody DeviceInform notification) {\r
-    LOG.debug("Received NetConf Notification : {}", notification);\r
-    handler.handleNetConfNotification(notification);\r
-    LOG.debug("Processed NetConf Notification for :{}", notification);\r
+  public void processNotification(@RequestBody NetConfNotificationDTO netConNotifDTO) {\r
+    System.out.println("Received NetConf Notification :" + netConNotifDTO);\r
+    LOG.debug("Received NetConf Notification :" + netConNotifDTO);\r
+    handler.handleNetConfNotification(netConNotifDTO);\r
+    LOG.debug("Processed NetConf Notification for :" + netConNotifDTO);\r
+    System.out.println("Processed NetConf Notification for :" + netConNotifDTO);\r
   }\r
-\r
 }\r
index b6f4dc9..00bf175 100644 (file)
 \r
 package org.commscope.tr069adapter.netconf.rpc;\r
 \r
+import java.io.StringReader;\r
+\r
+import javax.xml.parsers.DocumentBuilder;\r
+import javax.xml.parsers.DocumentBuilderFactory;\r
+\r
+import org.commscope.tr069adapter.mapper.model.ErrorCodeDetails;\r
+import org.commscope.tr069adapter.mapper.model.NetConfResponse;\r
 import org.commscope.tr069adapter.netconf.boot.NetConfServiceBooter;\r
 import org.commscope.tr069adapter.netconf.config.NetConfServerProperties;\r
 import org.opendaylight.netconf.api.DocumentedException;\r
+import org.opendaylight.netconf.api.DocumentedException.ErrorSeverity;\r
+import org.opendaylight.netconf.api.DocumentedException.ErrorTag;\r
+import org.opendaylight.netconf.api.DocumentedException.ErrorType;\r
 import org.opendaylight.netconf.api.xml.XmlElement;\r
 import org.opendaylight.netconf.api.xml.XmlNetconfConstants;\r
 import org.opendaylight.netconf.mapping.api.HandlingPriority;\r
@@ -29,6 +39,7 @@ import org.opendaylight.netconf.mapping.api.NetconfOperationChainedExecution;
 import org.slf4j.Logger;\r
 import org.slf4j.LoggerFactory;\r
 import org.w3c.dom.Document;\r
+import org.xml.sax.InputSource;\r
 \r
 public class SoftwareDownloadOperation implements NetconfOperation {\r
   private static final Logger logger = LoggerFactory.getLogger(SoftwareDownloadOperation.class);\r
@@ -52,18 +63,48 @@ public class SoftwareDownloadOperation implements NetconfOperation {
   public Document handle(Document requestMessage,\r
       NetconfOperationChainedExecution subsequentOperation) throws DocumentedException {\r
 \r
-    logger.debug("sw-download rpc recevied in netconf server");\r
+    logger.debug("soft-ware download rpc is received in netconfserver");\r
+\r
     final XmlElement requestElement = XmlElement.fromDomDocument(requestMessage);\r
+    final String msgId = requestElement.getAttribute(XmlNetconfConstants.MESSAGE_ID);\r
 \r
     String requestXml = XmlUtility.convertDocumentToString(requestElement);\r
-    logger.debug("sw-download rpc recevied requestXml = {}", requestXml);\r
+    logger.debug("soft-ware download rpc requestXml=" + requestXml);\r
+\r
     NetConfServerProperties config =\r
         NetConfServiceBooter.getApplicationContext().getBean(NetConfServerProperties.class);\r
 \r
     final String baseUrl = config.getMapperPath() + "/softwareDowload";\r
-    XmlUtility.invokeMapperCall(baseUrl, requestXml, deviceID);\r
+    NetConfResponse restResponse = XmlUtility.invokeMapperCall(baseUrl, requestXml, deviceID);\r
+\r
+    Document document = null;\r
+\r
+    ErrorCodeDetails errorCode = restResponse.getErrorCode();\r
+    if (errorCode != null && errorCode.getFaultCode() != null\r
+        && !errorCode.getFaultCode().equalsIgnoreCase("0")) {\r
+      logger.error("Error recevied : " + errorCode);\r
+      throw new DocumentedException(errorCode.getErrorMessage(),\r
+          ErrorType.from(errorCode.getErrorType()), ErrorTag.from(errorCode.getErrorTag()),\r
+          ErrorSeverity.from(errorCode.getErrorSeverity()));\r
+    } else if (restResponse != null && restResponse.getNetconfResponseXml() != null) {\r
+      logger.debug("soft-ware download rpc response received from mapper "\r
+          + restResponse.getNetconfResponseXml());\r
+      DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();\r
+      DocumentBuilder builder;\r
+      try {\r
+        builder = factory.newDocumentBuilder();\r
+        document =\r
+            builder.parse(new InputSource(new StringReader(restResponse.getNetconfResponseXml())));\r
+        document.getDocumentElement().setAttribute("xmlns:ns1", getOperationNamespace());\r
+        document.getDocumentElement().setAttribute("xmlns",\r
+            XmlNetconfConstants.URN_IETF_PARAMS_XML_NS_NETCONF_BASE_1_0);\r
+        document.getDocumentElement().setAttribute(XmlNetconfConstants.MESSAGE_ID, msgId);\r
+      } catch (Exception e) {\r
+        logger.error("while contruscting the response; ", e.toString());\r
+      }\r
+    }\r
 \r
-    return null;\r
+    return document;\r
   }\r
 \r
   protected HandlingPriority canHandle(final String operationName,\r
@@ -107,4 +148,12 @@ public class SoftwareDownloadOperation implements NetconfOperation {
     return XmlElement.fromDomElementWithExpected(message.getDocumentElement(),\r
         XmlNetconfConstants.RPC_KEY, XmlNetconfConstants.URN_IETF_PARAMS_XML_NS_NETCONF_BASE_1_0);\r
   }\r
+\r
+  protected String getOperationNamespace() {\r
+    return "urn:o-ran:software-management:1.0";\r
+  }\r
+\r
+  protected String getOperationName() {\r
+    return "software-download";\r
+  }\r
 }\r
index eee8db6..ed1164e 100644 (file)
@@ -24,15 +24,24 @@ import java.util.ArrayList;
 import java.util.List;\r
 import java.util.Map;\r
 import java.util.Map.Entry;\r
+import java.util.concurrent.ExecutorService;\r
+import java.util.concurrent.Executors;\r
 \r
+import org.commscope.tr069adapter.acs.common.OperationDetails;\r
+import org.commscope.tr069adapter.acs.common.ParameterDTO;\r
+import org.commscope.tr069adapter.acs.common.dto.TR069OperationCode;\r
 import org.commscope.tr069adapter.mapper.model.NetConfServerDetails;\r
 import org.commscope.tr069adapter.mapper.model.NetconfServerManagementError;\r
+import org.commscope.tr069adapter.mapper.model.VESNotification;\r
+import org.commscope.tr069adapter.mapper.model.VESNotificationResponse;\r
 import org.commscope.tr069adapter.netconf.config.NetConfServerProperties;\r
 import org.commscope.tr069adapter.netconf.dao.NetConfServerDetailsRepository;\r
 import org.commscope.tr069adapter.netconf.entity.NetConfServerDetailsEntity;\r
 import org.commscope.tr069adapter.netconf.error.RetryFailedException;\r
 import org.commscope.tr069adapter.netconf.error.ServerPortAllocationException;\r
 import org.commscope.tr069adapter.netconf.server.helper.ServerPortAllocationHelper;\r
+import org.commscope.tr069adapter.netconf.server.utils.NetConfServerConstants;\r
+import org.commscope.tr069adapter.netconf.server.ves.VESNotificationSender;\r
 import org.slf4j.Logger;\r
 import org.slf4j.LoggerFactory;\r
 import org.springframework.beans.factory.annotation.Autowired;\r
@@ -61,21 +70,26 @@ public class NetConfServerManagerImpl {
   @Autowired\r
   RestartNetconfServerHandler restartServersHandler;\r
 \r
+  @Autowired\r
+  VESNotificationSender vesNotificationSender;\r
+\r
+  ExecutorService executorService = Executors.newFixedThreadPool(10);\r
+\r
   public void restartServers() {\r
     LOG.debug("Restarting all netconf servers during startup...");\r
     Iterable<NetConfServerDetailsEntity> entities = netconfDAO.findAll();\r
-    List<NetConfServerDetailsEntity> serverDetailsList = new ArrayList<>();\r
-    for (NetConfServerDetailsEntity entity : entities) {\r
-      serverDetailsList.add(entity);\r
-    }\r
-    restartServersOnStartup(serverDetailsList);\r
 \r
-    if (!serverDetailsList.isEmpty()) {\r
-      LOG.debug("Attempting to start failed netconf servers {}", serverDetailsList);\r
-      try {\r
-        restartServersHandler.restart(serverDetailsList);\r
-      } catch (RetryFailedException e) {\r
-        LOG.error("Failed to restart all netconf servers. {}", e.toString());\r
+    for (NetConfServerDetailsEntity entity : entities) {\r
+      boolean isReserved = serverPortAllocator.checkAndReserveServerPort(entity.getListenPort());\r
+      if (isReserved) {\r
+        ServerStartTask task = new ServerStartTask(entity, this);\r
+        executorService.execute(task);\r
+      } else {\r
+        try {\r
+          restartServersHandler.restart(entity);\r
+        } catch (RetryFailedException e) {\r
+          e.printStackTrace();\r
+        }\r
       }\r
     }\r
     LOG.debug("Restarting netconf servers during startup is completed.");\r
@@ -110,17 +124,25 @@ public class NetConfServerManagerImpl {
     try {\r
 \r
       String port = serverPortAllocator.reserveServerPort();\r
-      LOG.debug("Successfully reserved a port for deviceID={} ,port={}", deviceId, port);\r
-\r
-      // start the server\r
-      boolean isServerStarted = ncServerStarter.startServer(port, deviceId);\r
-      boolean isPortInUse = serverPortAllocator.isServerPortInUse(port);\r
-\r
-      if (!isServerStarted || !isPortInUse) {\r
+      if (port == null) {\r
+        result.setError(NetconfServerManagementError.PORT_NOT_AVAILBLE);\r
         LOG.error(\r
-            "Failed to start netconf server for deviceID: {}, at port:{} , isServerStarted={} ,isPortInUse={}",\r
-            deviceId, port, isServerStarted, isPortInUse);\r
-        return null;\r
+            "All ports are exhausted. Hence cannot allocate a port to start new netconf server");\r
+        return result;\r
+      } else {\r
+        LOG.debug("Successfully reserved a port for deviceID={} ,port={}", deviceId, port);\r
+\r
+        // start the server\r
+        boolean isServerStarted = ncServerStarter.startServer(port, deviceId);\r
+        boolean isPortInUse = serverPortAllocator.isServerPortInUse(port);\r
+\r
+        if (!isServerStarted || !isPortInUse) {\r
+          LOG.error(\r
+              "Failed to start netconf server for deviceID: {}, at port:{} , isServerStarted={} ,isPortInUse={}",\r
+              deviceId, port, isServerStarted, isPortInUse);\r
+          result.setError(NetconfServerManagementError.PORT_IN_USE);\r
+          return result;\r
+        }\r
       }\r
 \r
       // save the record in db\r
@@ -150,52 +172,41 @@ public class NetConfServerManagerImpl {
     return result;\r
   }\r
 \r
-  public void restartServersOnStartup(List<NetConfServerDetailsEntity> serverDetailsList) {\r
-\r
-    List<NetConfServerDetailsEntity> startedServers = new ArrayList<>();\r
-    for (NetConfServerDetailsEntity entity : serverDetailsList) {\r
+  public boolean restartServersOnStartup(NetConfServerDetailsEntity entity) {\r
+    boolean isSuccess = false;\r
 \r
-      serverPortAllocator.checkAndReserveServerPort(entity.getListenPort());\r
+    boolean isServerStarted =\r
+        ncServerStarter.startServer(entity.getListenPort(), entity.getDeviceId());\r
+    if (isServerStarted) {\r
+      LOG.info("Successfully restarted NETCONF server {}  on port {}  upon application startup.",\r
+          entity.getDeviceId(), entity.getListenPort());\r
+      // we need to push the pnfEntry for IP updated\r
+      NetConfServerDetails details = getNetConfServerDetails(entity.getDeviceId(), entity);\r
 \r
-      serverPortAllocator.isServerPortInUse(entity.getListenPort());\r
-      boolean isServerStarted =\r
-          ncServerStarter.startServer(entity.getListenPort(), entity.getDeviceId());\r
-\r
-      if (isServerStarted) {\r
-        LOG.info("Successfully restarted NETCONF server {}  on port {}  upon application startup.",\r
-            entity.getDeviceId(), entity.getListenPort());\r
-        // we need to push the pnfEntry for IP updated\r
-        NetConfServerDetails details = getNetConfServerDetails(entity.getDeviceId(), entity);\r
-\r
-        final String baseUrl = config.getMapperPath() + "/registerNetconfServer";\r
-        URI uri = null;\r
-        try {\r
-          uri = new URI(baseUrl);\r
-        } catch (URISyntaxException e) {\r
-          LOG.error("error while contructing the URI {}", e.toString());\r
-        }\r
-        RestTemplate restTemplate = new RestTemplate();\r
-        HttpHeaders headers = new HttpHeaders();\r
-        HttpEntity<NetConfServerDetails> httpentity = new HttpEntity<>(details, headers);\r
-        boolean isSuccess = false;\r
-        if (uri != null) {\r
-          isSuccess = restTemplate.postForObject(uri, httpentity, Boolean.class);\r
-        }\r
+      final String baseUrl = config.getMapperPath() + "/registerNetconfServer";\r
+      URI uri = null;\r
+      try {\r
+        uri = new URI(baseUrl);\r
+      } catch (URISyntaxException e) {\r
+        LOG.error("error while contructing the URI {}", e.toString());\r
+      }\r
+      RestTemplate restTemplate = new RestTemplate();\r
+      HttpHeaders headers = new HttpHeaders();\r
+      HttpEntity<NetConfServerDetails> httpentity = new HttpEntity<>(details, headers);\r
+      if (uri != null) {\r
+        isSuccess = restTemplate.postForObject(uri, httpentity, Boolean.class);\r
+      }\r
 \r
-        if (!isSuccess) {\r
-          LOG.error("Netconf Register request is failed update the updated host details..");\r
-        } else {\r
-          LOG.debug("successfully started the server");\r
-        }\r
-        startedServers.add(entity);\r
+      if (!isSuccess) {\r
+        LOG.error("Netconf Register request is failed update the updated host details..");\r
       } else {\r
-        LOG.error("Failed to restart NETCONF server {}  on port {}  upon application startup.",\r
-            entity.getDeviceId(), entity.getListenPort());\r
+        LOG.debug("successfully started the server");\r
       }\r
+    } else {\r
+      LOG.error("Failed to restart NETCONF server {}  on port {}  upon application startup.",\r
+          entity.getDeviceId(), entity.getListenPort());\r
     }\r
-    if (!serverDetailsList.isEmpty()) {\r
-      serverDetailsList.removeAll(startedServers);\r
-    }\r
+    return isSuccess;\r
   }\r
 \r
   private NetConfServerDetails getNetConfServerDetails(String deviceId,\r
@@ -213,9 +224,67 @@ public class NetConfServerManagerImpl {
     return result;\r
   }\r
 \r
-  public boolean unregister(String deviceId, String enodeBName) {\r
-    LOG.debug("Unregister is not yet supported deviceId={} enodeBName={}", deviceId, enodeBName);\r
-    return false;\r
+  public String unregister(String deviceId, String enodeBName) {\r
+    String resultMsg = null;\r
+    NetConfServerDetailsEntity entity = null;\r
+    if (deviceId != null) {\r
+      entity = this.netconfDAO.findByDeviceId(deviceId);\r
+    } else if (enodeBName != null) {\r
+      entity = this.netconfDAO.findByEnodeBName(enodeBName);\r
+    } else {\r
+      LOG.error(\r
+          "Both deviceID and enodeBName are null. Hence failed to unregister the netconf server.");\r
+      resultMsg = "Failed to unregister the device " + deviceId + ", enodeBName=" + enodeBName\r
+          + ". Invalid deviceId/enodeBName specified.";\r
+    }\r
+    if (entity == null) {\r
+      resultMsg = "Failed to unregister the device " + deviceId + ", enodeBName=" + enodeBName\r
+          + ". Invalid deviceId/enodeBName specified.";\r
+      LOG.info(resultMsg);\r
+    }\r
+    boolean result = this.ncServerStarter.stopServer(deviceId);\r
+    if (result) {\r
+      resultMsg =\r
+          "Successfully unregistered the device " + deviceId + " and enodeBName=" + enodeBName;\r
+      this.serverPortAllocator.unReserveServerPort(entity.getListenPort());\r
+      this.netconfDAO.delete(entity);\r
+      LOG.info(resultMsg);\r
+      delteHeartBeatTimer(deviceId);\r
+    } else {\r
+      resultMsg = "Failed to unregister the device " + deviceId + ", enodeBName=" + enodeBName;\r
+      LOG.error(resultMsg);\r
+    }\r
+\r
+    return resultMsg;\r
+  }\r
+\r
+  private void delteHeartBeatTimer(String deviceId) {\r
+    VESNotification vesNotification = new VESNotification();\r
+\r
+    vesNotification.seteNodeBName(deviceId);\r
+\r
+    ParameterDTO paramDTO = new ParameterDTO();\r
+    paramDTO.setParamName(NetConfServerConstants.HEART_BEAT);\r
+\r
+    List<ParameterDTO> paramDTOList = new ArrayList<>();\r
+    paramDTOList.add(paramDTO);\r
+\r
+    OperationDetails opDetails = new OperationDetails();\r
+    opDetails.setOpCode(TR069OperationCode.DELETE_OBJECT);\r
+    opDetails.setParmeters(paramDTOList);\r
+\r
+    vesNotification.setOperationDetails(opDetails);\r
+\r
+    VESNotificationResponse response =\r
+        vesNotificationSender.sendDeleteConfigNotification(vesNotification);\r
+\r
+    if (response.getStatusCode() == NetConfServerConstants.SUCCESS) {\r
+      LOG.info("Heart beat timer is deleted successfully for device {}", deviceId);\r
+    } else {\r
+      LOG.error("Failed to delete heart beat timer for device {}. ErrorMsg : {}", deviceId,\r
+          response.getResponseMsg());\r
+    }\r
+\r
   }\r
 \r
   public List<NetConfServerDetails> getServersInfo() {\r
@@ -247,4 +316,29 @@ public class NetConfServerManagerImpl {
     }\r
     return null;\r
   }\r
+\r
+  class ServerStartTask implements Runnable {\r
+\r
+    NetConfServerDetailsEntity entity;\r
+    NetConfServerManagerImpl netconfServerManager;\r
+\r
+    public ServerStartTask(NetConfServerDetailsEntity entity,\r
+        NetConfServerManagerImpl netconfServerManager) {\r
+      this.entity = entity;\r
+      this.netconfServerManager = netconfServerManager;\r
+    }\r
+\r
+    @Override\r
+    public void run() {\r
+      boolean isSuccess = netconfServerManager.restartServersOnStartup(entity);\r
+      if (isSuccess) {\r
+        try {\r
+          netconfServerManager.restartServersHandler.restart(entity);\r
+        } catch (RetryFailedException e) {\r
+          e.printStackTrace();// TODO: logg\r
+        }\r
+      }\r
+    }\r
+\r
+  }\r
 }\r
index 39e4e3b..c438ee5 100644 (file)
 \r
 package org.commscope.tr069adapter.netconf.server;\r
 \r
+import com.google.common.base.Preconditions;\r
+\r
 import java.io.BufferedReader;\r
 import java.io.File;\r
 import java.io.FileReader;\r
 import java.io.IOException;\r
 import java.util.Arrays;\r
 import java.util.Collections;\r
+import java.util.HashMap;\r
 import java.util.List;\r
+import java.util.Map;\r
 import java.util.concurrent.TimeUnit;\r
 import java.util.regex.Matcher;\r
 import java.util.regex.Pattern;\r
+\r
 import org.commscope.tr069adapter.netconf.config.NetConfServerProperties;\r
 import org.commscope.tr069adapter.netconf.operations.CustomOperationsCreator;\r
 import org.opendaylight.netconf.test.tool.NetconfDeviceSimulator;\r
@@ -39,7 +44,6 @@ import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;\r
 import org.springframework.context.annotation.Scope;\r
 import org.springframework.stereotype.Component;\r
-import com.google.common.base.Preconditions;\r
 \r
 @Component\r
 @Scope("singleton")\r
@@ -47,6 +51,8 @@ public class NetconfServerStarter {
 \r
   private static final Logger LOG = LoggerFactory.getLogger(NetconfServerStarter.class);\r
 \r
+  private static Map<String, NetconfDevice> serversMap = new HashMap<>();\r
+\r
   @Autowired\r
   NetConfServerProperties config;\r
 \r
@@ -95,13 +101,14 @@ public class NetconfServerStarter {
       return false;\r
     }\r
 \r
-    try(final NetconfDevice netconfDevice = new NetconfDevice(configuration)){\r
+    try (final NetconfDevice netconfDevice = new NetconfDevice(configuration)) {\r
       final List<Integer> openDevices = netconfDevice.start();\r
       if (openDevices.isEmpty()) {\r
         LOG.debug("Failed to start netconf server instance {}", macID);\r
         return false;\r
       }\r
       netconfDevice.setAutoClose(false);\r
+      serversMap.put(macID, netconfDevice);\r
     } catch (RuntimeException e) {\r
       LOG.error("Unhandled exception. Failed to start the server", e);\r
       return false;\r
@@ -110,6 +117,22 @@ public class NetconfServerStarter {
     return true;\r
   }\r
 \r
+  public boolean stopServer(String macID) {\r
+    try {\r
+      LOG.debug("Stopping Netconf server for MACID {}", macID);\r
+      NetconfDevice netconf = serversMap.get(macID);\r
+      netconf.setAutoClose(true);\r
+      netconf.close();\r
+      LOG.debug("Completed stopping Netconf server for MACID {}", macID);\r
+      return true;\r
+    } catch (Exception e) {\r
+      LOG.debug("Error while stopping Netconf server for MACID {}; error message {}", macID,\r
+          e.getMessage());\r
+    }\r
+\r
+    return false;\r
+  }\r
+\r
   private boolean loadSchemas(File schemasDir) {\r
     if (schemasDir != null) {\r
       if (!schemasDir.exists() || !schemasDir.isDirectory() || !schemasDir.canRead()) {\r
index 57e3602..6f7f9f2 100644 (file)
 \r
 package org.commscope.tr069adapter.netconf.server;\r
 \r
-import java.util.List;\r
-\r
 import org.commscope.tr069adapter.netconf.entity.NetConfServerDetailsEntity;\r
 import org.commscope.tr069adapter.netconf.error.RetryFailedException;\r
+import org.commscope.tr069adapter.netconf.server.helper.ServerPortAllocationHelper;\r
 import org.slf4j.Logger;\r
 import org.slf4j.LoggerFactory;\r
 import org.springframework.beans.factory.annotation.Autowired;\r
@@ -38,32 +37,33 @@ public class RestartNetconfServerHandler {
   @Autowired\r
   NetConfServerManagerImpl manager;\r
 \r
+  @Autowired\r
+  ServerPortAllocationHelper serverPortAllocator;\r
+\r
   @Retryable(value = {RetryFailedException.class}, maxAttempts = 100,\r
       backoff = @Backoff(delay = 15000))\r
-  public void restart(List<NetConfServerDetailsEntity> serverDetailsList)\r
-      throws RetryFailedException {\r
+  public void restart(NetConfServerDetailsEntity entity) throws RetryFailedException {\r
+    boolean isSucess = false;\r
     try {\r
       // restart netconf servers\r
-      manager.restartServersOnStartup(serverDetailsList);\r
+      serverPortAllocator.checkAndReserveServerPort(entity.getListenPort());\r
+      isSucess = manager.restartServersOnStartup(entity);\r
     } catch (Exception e) {\r
       logger.error("Retry to netconf servers has  is failed. {}", e.toString());\r
       throw new RetryFailedException(e);\r
     }\r
-\r
-    if (!serverDetailsList.isEmpty()) {\r
-      logger.error("Failed to start some of netconf servers. Retrying starting servers : {}",\r
-          serverDetailsList);\r
+    if (!isSucess) {\r
       throw new RetryFailedException(\r
-          "Failed to start some of netconf servers. server list : " + serverDetailsList);\r
+          "Failed to start some of netconf servers. server list : " + entity);\r
     }\r
     logger.debug("Successfully started all failed netconf servers.");\r
   }\r
 \r
   @Recover\r
-  public void recover(List<NetConfServerDetailsEntity> serverDetailsList) {\r
+  public void recover(NetConfServerDetailsEntity entity) {\r
     logger.debug("Retrying starting failed netconf servers.");\r
     try {\r
-      restart(serverDetailsList);\r
+      restart(entity);\r
     } catch (RetryFailedException e) {\r
       logger.error("Failed to start failed netconf servers. {}", e.toString());\r
     }\r
index a843e62..f5ff597 100644 (file)
@@ -81,6 +81,7 @@ public class ServerPortAllocationHelper {
     if (availablePorts.isEmpty()) {\r
       LOG.debug(\r
           "All ports are exhausted. Hence cannot allocate a port to start new netconf server.");\r
+      return null;\r
     }\r
 \r
     String port = availablePorts.peek();\r
@@ -104,6 +105,23 @@ public class ServerPortAllocationHelper {
     return port;\r
   }\r
 \r
+  public boolean unReserveServerPort(String port) {\r
+\r
+    try {\r
+      Semaphore semaphore = semaphoreMap.get(port);\r
+      semaphore.acquire();\r
+      availablePorts.add(port);\r
+      semaphore.release();\r
+      LOG.error("Successfully un-reserved the port " + port + " to start netconf server.");\r
+    } catch (InterruptedException e) {\r
+      LOG.warn("Failed to un-reserve the port " + port, e);\r
+      Thread.currentThread().interrupt();\r
+      return false;\r
+    }\r
+\r
+    return true;\r
+  }\r
+\r
   public boolean checkAndReserveServerPort(String port) {\r
 \r
     try {\r
diff --git a/netconf-server/src/main/java/org/commscope/tr069adapter/netconf/server/utils/NetConfServerConstants.java b/netconf-server/src/main/java/org/commscope/tr069adapter/netconf/server/utils/NetConfServerConstants.java
new file mode 100644 (file)
index 0000000..ca2f98a
--- /dev/null
@@ -0,0 +1,10 @@
+package org.commscope.tr069adapter.netconf.server.utils;\r
+\r
+public class NetConfServerConstants {\r
+  private NetConfServerConstants() {\r
+    throw new IllegalStateException("Utility class");\r
+  }\r
+\r
+  public static final String HEART_BEAT = "heartbeat";\r
+  public static final int SUCCESS = 0;\r
+}\r
diff --git a/netconf-server/src/main/java/org/commscope/tr069adapter/netconf/server/ves/VESNotificationSender.java b/netconf-server/src/main/java/org/commscope/tr069adapter/netconf/server/ves/VESNotificationSender.java
new file mode 100644 (file)
index 0000000..ff04e65
--- /dev/null
@@ -0,0 +1,30 @@
+package org.commscope.tr069adapter.netconf.server.ves;\r
+\r
+import org.commscope.tr069adapter.mapper.model.VESNotification;\r
+import org.commscope.tr069adapter.mapper.model.VESNotificationResponse;\r
+import org.commscope.tr069adapter.netconf.config.NetConfServerProperties;\r
+import org.slf4j.Logger;\r
+import org.slf4j.LoggerFactory;\r
+import org.springframework.beans.factory.annotation.Autowired;\r
+import org.springframework.stereotype.Component;\r
+import org.springframework.web.client.RestTemplate;\r
+\r
+@Component\r
+public class VESNotificationSender {\r
+\r
+  private static final Logger LOG = LoggerFactory.getLogger(VESNotificationSender.class);\r
+  private RestTemplate restTemplate = new RestTemplate();\r
+\r
+  @Autowired\r
+  NetConfServerProperties config;\r
+\r
+  public VESNotificationResponse sendDeleteConfigNotification(VESNotification vesNotification) {\r
+    final String uri = getUri() + "/deleteConfig";\r
+    LOG.debug("Posting delete-config request to ves agent {}", uri);\r
+    return restTemplate.postForObject(uri, vesNotification, VESNotificationResponse.class);\r
+  }\r
+\r
+  private String getUri() {\r
+    return config.getVesURI();\r
+  }\r
+}\r
index 63c820a..eb38a44 100644 (file)
@@ -27,6 +27,7 @@ config.netconfServersEndPort=${NETCONFSRVS_END_PORT}
 config.maxNumOfNetconfServers=${NUM_SERVERS}\r
 config.netconfServerIP=${netConfServerIP}\r
 config.schemaDirPath=/opt/CSAdapter/schemas/\r
+config.vesURI=http://${VES_REST_HOST}:${VES_REST_PORT}/vesagent\r
 \r
 \r
 ## Datasource properties\r
index 32d995d..2445048 100644 (file)
     <Loggers>\r
        <Logger name="org.commscope.tr069adapter" level="debug" additivity="false">\r
                <appender-ref ref="console"/>\r
-               <appender-ref ref="applicationLog"/>\r
-       </Logger>\r
-       \r
-       <Logger name="org" level="debug" additivity="false">\r
-               <appender-ref ref="console"/>\r
+                       <appender-ref ref="applicationLog"/>\r
+               </Logger>\r
+               \r
+               <Logger name="org" level="debug" additivity="false">\r
+                       <appender-ref ref="console"/>\r
             <AppenderRef ref="thirdPartyLog" />\r
         </Logger>\r
-       \r
-       <Logger name="org.springframework" level="error" additivity="false">\r
+               \r
+               <Logger name="org.springframework" level="error" additivity="false">\r
             <AppenderRef ref="springLog" />\r
         </Logger>\r
         \r
index 3a865c5..1e035cb 100644 (file)
@@ -21,12 +21,8 @@ package org.commscope.tr069adapter.netconf.restapi;
 import java.util.ArrayList;\r
 import java.util.List;\r
 \r
-import org.commscope.tr069adapter.acs.common.DeviceDetails;\r
-import org.commscope.tr069adapter.acs.common.DeviceInform;\r
-import org.commscope.tr069adapter.acs.common.InformType;\r
 import org.commscope.tr069adapter.acs.common.ParameterDTO;\r
-import org.commscope.tr069adapter.acs.common.dto.TR069DeviceDetails;\r
-import org.commscope.tr069adapter.acs.common.dto.TR069InformType;\r
+import org.commscope.tr069adapter.mapper.model.NetConfNotificationDTO;\r
 import org.commscope.tr069adapter.netconf.boot.NetConfServiceBooter;\r
 import org.junit.FixMethodOrder;\r
 import org.junit.jupiter.api.Test;\r
@@ -50,19 +46,15 @@ public class NotificationServerRestApiTest {
   @Test\r
   public void createNetconfServer() {\r
 \r
-    DeviceInform notification = new DeviceInform();\r
 \r
-    DeviceDetails deviceDetails = new TR069DeviceDetails();\r
-    notification.setDeviceDetails(deviceDetails);\r
-    List<InformType> notificationTypeList = new ArrayList<>();\r
-    InformType itype = TR069InformType.BOOTSTRAP;\r
-    notificationTypeList.add(itype);\r
-    notification.setInformTypeList(notificationTypeList);\r
+    NetConfNotificationDTO netConNotifDTO =\r
+        new NetConfNotificationDTO("00005B9432910", null, false);\r
+\r
     List<ParameterDTO> parameters = new ArrayList<>();\r
     ParameterDTO param1 = new ParameterDTO("Device.Info", "info-details");\r
     parameters.add(param1);\r
-    notification.setParameters(parameters);\r
-    service.processNotification(notification);\r
+    netConNotifDTO.setParameters(parameters);\r
+    service.processNotification(netConNotifDTO);\r
 \r
   }\r
 }\r
index 97f4ed2..faa79a6 100644 (file)
 \r
 package org.commscope.tr069adapter.netconf.server;\r
 \r
-import static org.junit.Assert.assertTrue;\r
-import static org.junit.Assert.fail;\r
-\r
-import java.util.ArrayList;\r
-import java.util.List;\r
-\r
 import org.commscope.tr069adapter.netconf.boot.NetConfServiceBooter;\r
-import org.commscope.tr069adapter.netconf.entity.NetConfServerDetailsEntity;\r
-import org.commscope.tr069adapter.netconf.error.RetryFailedException;\r
 import org.junit.FixMethodOrder;\r
-import org.junit.jupiter.api.Test;\r
 import org.junit.jupiter.api.extension.ExtendWith;\r
 import org.junit.runners.MethodSorters;\r
 import org.springframework.beans.factory.annotation.Autowired;\r
@@ -50,23 +41,16 @@ class RestartNetconfServerHandlerTest {
 \r
   @Autowired\r
   RestartNetconfServerHandler restartHandler;\r
-\r
-  @Test\r
-  void testRestart() {\r
-    List<NetConfServerDetailsEntity> sList = new ArrayList<NetConfServerDetailsEntity>();\r
-    try {\r
-      restartHandler.restart(sList);\r
-    } catch (RetryFailedException e) {\r
-      fail("Exception while retry.");\r
-    }\r
-    assertTrue(true);\r
-  }\r
-\r
-  @Test\r
-  void testRecover() {\r
-    List<NetConfServerDetailsEntity> sList = new ArrayList<NetConfServerDetailsEntity>();\r
-    restartHandler.recover(sList);\r
-    assertTrue(true);\r
-  }\r
-\r
+  /*\r
+   * @Test void testRestart() { NetConfServerDetailsEntity entity = new\r
+   * NetConfServerDetailsEntity(); entity.setDeviceId("0005B9AB1");\r
+   * entity.setEnodeBName("0005B9AB1"); entity.setId(1l); entity.setListenPort("17830"); try {\r
+   * restartHandler.restart(entity); } catch (RetryFailedException e) {\r
+   * fail("Exception while retry."); } assertTrue(true); }\r
+   * \r
+   * @Test void testRecover() { NetConfServerDetailsEntity entity = new\r
+   * NetConfServerDetailsEntity(); entity.setDeviceId("0005B9AB1");\r
+   * entity.setEnodeBName("0005B9AB1"); entity.setId(1l); entity.setListenPort("17830");\r
+   * restartHandler.recover(entity); assertTrue(true); }\r
+   */\r
 }\r
diff --git a/netconf-server/src/test/resources/log4j2.xml b/netconf-server/src/test/resources/log4j2.xml
new file mode 100644 (file)
index 0000000..cb6ba0b
--- /dev/null
@@ -0,0 +1,86 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<!--\r
+/*\r
+ * ============LICENSE_START========================================================================\r
+ * ONAP : tr-069-adapter\r
+ * =================================================================================================\r
+ * Copyright (C) 2020 CommScope Inc Intellectual Property.\r
+ * =================================================================================================\r
+ * This tr-069-adapter software file is distributed by CommScope Inc\r
+ * under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ * http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * This file is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ * ===============LICENSE_END=======================================================================\r
+*/\r
+-->\r
+<Configuration status="DEBUG" monitorInterval="30">\r
+    <Properties>\r
+        <Property name="LOG_PATTERN">%d{yyyy-MM-dd HH:mm:ss} %m%n</Property>\r
+        <Property name="APP_LOG_ROOT">./target/test-logs</Property>\r
+    </Properties>\r
+    <Appenders>\r
+       <Console name="console" target="SYSTEM_OUT" follow="true">\r
+            <PatternLayout pattern="${LOG_PATTERN}"/>\r
+        </Console>\r
+        \r
+        <RollingFile name="applicationLog"\r
+            fileName="${APP_LOG_ROOT}/debug/application-debug.log"\r
+            filePattern="${APP_LOG_ROOT}/debug/application-debug-%d{yyyy-MM-dd}-%i.log">\r
+            <PatternLayout>\r
+               <pattern>[%d{yyyy-MM-dd HH:mm:ss:SSS}] [%X{client}] [%.-40t] %-25.45c{1} %-5p: %m%n</pattern>\r
+               <header>Debug Log started at: $${date:yyyy-MM-dd HH:mm:ss}</header>\r
+            </PatternLayout>\r
+            <Policies>\r
+                <SizeBasedTriggeringPolicy size="4MB" />\r
+                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>\r
+            </Policies>\r
+            <DefaultRolloverStrategy max="100" />\r
+        </RollingFile>\r
+  \r
+               <RollingFile name="springLog" \r
+                       fileName="${APP_LOG_ROOT}/thirdparty/spring-framework.log"\r
+            filePattern="${APP_LOG_ROOT}/thirdparty/spring-%d{yyyy-MM-dd}-%i.log">\r
+            <PatternLayout pattern="${LOG_PATTERN}"/>\r
+            <Policies>\r
+                <SizeBasedTriggeringPolicy size="2MB" />\r
+            </Policies>\r
+            <DefaultRolloverStrategy max="100"/>\r
+        </RollingFile>\r
+   \r
+       <RollingFile name="thirdPartyLog" \r
+                       fileName="${APP_LOG_ROOT}/thirdparty/third-party-framework.log"\r
+            filePattern="${APP_LOG_ROOT}/thirdparty/spring-%d{yyyy-MM-dd}-%i.log">\r
+            <PatternLayout pattern="${LOG_PATTERN}"/>\r
+            <Policies>\r
+                <SizeBasedTriggeringPolicy size="2MB" />\r
+            </Policies>\r
+            <DefaultRolloverStrategy max="100"/>\r
+        </RollingFile>\r
+             \r
+    </Appenders>\r
+    \r
+    <Loggers>\r
+       <Logger name="org.commscope.tr069adapter" level="debug" additivity="false">\r
+               <appender-ref ref="console"/>\r
+                       <appender-ref ref="applicationLog"/>\r
+               </Logger>\r
+               \r
+               <Logger name="org" level="debug" additivity="false">\r
+                       <appender-ref ref="console"/>\r
+            <AppenderRef ref="thirdPartyLog" />\r
+        </Logger>\r
+               \r
+               <Logger name="org.springframework" level="error" additivity="false">\r
+            <AppenderRef ref="springLog" />\r
+        </Logger>\r
+        \r
+        <Root level="DEBUG" additivity="false"/>\r
+    </Loggers>\r
+</Configuration>\r
diff --git a/pom.xml b/pom.xml
index 8ba365d..ebfd52f 100644 (file)
--- a/pom.xml
+++ b/pom.xml
@@ -34,7 +34,7 @@
    <name>tr069adapter</name>\r
    <properties>\r
       <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\r
-      <build.version>1.12.0</build.version>\r
+      <build.version>latest</build.version>\r
       <jdk.version>1.7</jdk.version>\r
       <java.version>1.8</java.version>\r
       <org.apache.axis.version>1.4</org.apache.axis.version>\r
@@ -65,4 +65,4 @@
       <module>ves-agent</module>\r
       <module>config-data</module>\r
    </modules>\r
-</project>
\ No newline at end of file
+</project>\r
index c92a4c4..20aac87 100644 (file)
@@ -34,6 +34,13 @@ ENV pnfRegEventType=CommScope_RAN_pnfRegistration
 ENV unitFamily=OneCell\r
 ENV unitType=BasebandController\r
 ENV faultEventSourcePrefix=OneCell\r
+ENV DB_SERVICE=tr069adapter-mariadb\r
+ENV DB_NAME=dmsdb\r
+ENV DB_USERNAME=root\r
+ENV DB_PASSWORD=root\r
+ENV MAPPER_REST_HOST=tr069adapter-netconfig-mapper\r
+ENV MAPPER_REST_PORT=9999\r
+ENV CONFIG_MAP_ENABLE=true\r
 \r
 WORKDIR /opt/CSAdapter/\r
 \r
index 30c9fdc..3991c27 100644 (file)
          <artifactId>spring-boot-starter-test</artifactId>\r
          <scope>test</scope>\r
       </dependency>\r
+      <dependency>\r
+         <groupId>org.springframework.boot</groupId>\r
+         <artifactId>spring-boot-starter-data-jpa</artifactId>\r
+      </dependency>\r
       <dependency>\r
          <groupId>junit</groupId>\r
          <artifactId>junit</artifactId>\r
          <version>4.11</version>\r
          <scope>test</scope>\r
       </dependency>\r
+      <dependency>\r
+         <groupId>com.h2database</groupId>\r
+         <artifactId>h2</artifactId>\r
+         <scope>test</scope>\r
+      </dependency>\r
       <dependency>\r
          <groupId>org.springframework.cloud</groupId>\r
          <artifactId>spring-cloud-starter-kubernetes-config</artifactId>\r
          <version>1.0.0</version>\r
          <classifier>lib</classifier>\r
       </dependency>\r
+      <dependency>\r
+         <groupId>org.mariadb.jdbc</groupId>\r
+         <artifactId>mariadb-java-client</artifactId>\r
+      </dependency>\r
+      <dependency>\r
+         <groupId>com.googlecode.json-simple</groupId>\r
+         <artifactId>json-simple</artifactId>\r
+         <version>1.1</version>\r
+      </dependency>\r
    </dependencies>\r
    <build>\r
       <plugins>\r
          <plugin>\r
             <groupId>org.apache.maven.plugins</groupId>\r
             <artifactId>maven-surefire-plugin</artifactId>\r
-             <version>2.17</version>\r
+            <version>2.17</version>\r
             <configuration>\r
                <skipTests>false</skipTests>\r
             </configuration>\r
                   <phase>package</phase>\r
                   <goals>\r
                      <goal>build</goal>\r
-                                <goal>save</goal>\r
+                     <goal>save</goal>\r
                   </goals>\r
                   <configuration>\r
                      <pullRegistry>${env.CONTAINER_PULL_REGISTRY}</pullRegistry>\r
                      <images>\r
                         <image>\r
-                           <name>${docker.image.name}</name>\r
+                           <name>${docker.image.name}:${build.version}</name>\r
                            <build>\r
                               <cleanup>try</cleanup>\r
                               <contextDir>${basedir}</contextDir>\r
index 7ec6b66..75e26ae 100644 (file)
@@ -40,6 +40,9 @@ public class VesConfiguration {
   private String unitType;\r
   private String faultEventSourcePrefix;\r
 \r
+  private String requestTimeout;\r
+  private String mapperPath;\r
+\r
   public String getFaultvesCollectorHost() {\r
     return faultvesCollectorHost;\r
   }\r
@@ -161,4 +164,21 @@ public class VesConfiguration {
   public void setPnfRegEventType(String pnfRegEventType) {\r
     this.pnfRegEventType = pnfRegEventType;\r
   }\r
+\r
+  public String getRequestTimeout() {\r
+    return requestTimeout;\r
+  }\r
+\r
+  public void setRequestTimeout(String requestTimeout) {\r
+    this.requestTimeout = requestTimeout;\r
+  }\r
+\r
+  public String getMapperPath() {\r
+    return mapperPath;\r
+  }\r
+\r
+  public void setMapperPath(String mapperPath) {\r
+    this.mapperPath = mapperPath;\r
+  }\r
+\r
 }\r
diff --git a/ves-agent/src/main/java/org/commscope/tr069adapter/vesagent/async/AsyncRequestHandler.java b/ves-agent/src/main/java/org/commscope/tr069adapter/vesagent/async/AsyncRequestHandler.java
new file mode 100644 (file)
index 0000000..fd6530f
--- /dev/null
@@ -0,0 +1,143 @@
+package org.commscope.tr069adapter.vesagent.async;\r
+\r
+import java.util.concurrent.Future;\r
+\r
+import org.commscope.tr069adapter.acs.common.DeviceDetails;\r
+import org.commscope.tr069adapter.acs.common.DeviceRPCRequest;\r
+import org.commscope.tr069adapter.acs.common.DeviceRPCResponse;\r
+import org.commscope.tr069adapter.acs.common.OperationCode;\r
+import org.commscope.tr069adapter.acs.common.OperationOptions;\r
+import org.commscope.tr069adapter.acs.common.dto.CustomOperationCode;\r
+import org.commscope.tr069adapter.acs.common.dto.TR069OperationDetails;\r
+import org.commscope.tr069adapter.vesagent.VesConfiguration;\r
+import org.commscope.tr069adapter.vesagent.controller.HeartBeatMessageHandler;\r
+import org.commscope.tr069adapter.vesagent.entity.DeviceDataEntity;\r
+import org.commscope.tr069adapter.vesagent.mapper.MapperRequestSender;\r
+import org.commscope.tr069adapter.vesagent.util.VesAgentConstants;\r
+import org.commscope.tr069adapter.vesagent.util.VesAgentUtils;\r
+import org.slf4j.Logger;\r
+import org.slf4j.LoggerFactory;\r
+import org.springframework.beans.factory.annotation.Autowired;\r
+import org.springframework.scheduling.annotation.Async;\r
+import org.springframework.stereotype.Component;\r
+\r
+/**\r
+ * \r
+ * @version 1.0\r
+ * @since June 12, 2020\r
+ * @author Prashant Kumar\r
+ */\r
+@Component\r
+public class AsyncRequestHandler {\r
+\r
+  private static final Logger LOG = LoggerFactory.getLogger(AsyncRequestHandler.class);\r
+\r
+  @Autowired\r
+  MapperRequestSender mapperRequestSender;\r
+\r
+  @Autowired\r
+  WaitForNotifications waitForNotifications;\r
+\r
+  @Autowired\r
+  HeartBeatMessageHandler heartBeatMessageHandler;\r
+\r
+  @Autowired\r
+  VesConfiguration config;\r
+\r
+  public DeviceRPCResponse performDeviceOperation(DeviceRPCRequest deviceRPCRequest) {\r
+    LOG.info("Initiating device connectivity request to ACS for device {}",\r
+        deviceRPCRequest.getDeviceDetails().getDeviceId());\r
+\r
+    Future<DeviceRPCResponse> futureResponse = mapperRequestSender.sendRequest(deviceRPCRequest);\r
+    if (null == futureResponse) {\r
+      LOG.error("Request could not be sent. response is null");\r
+      return null;\r
+    }\r
+\r
+    boolean isSuccess = false;\r
+    DeviceRPCResponse response = null;\r
+\r
+    OperationCode opCode = deviceRPCRequest.getOpDetails().getOpCode();\r
+    String deviceId = deviceRPCRequest.getDeviceDetails().getDeviceId();\r
+    long timeOut = getOperationTimeOut(deviceRPCRequest.getOptions().getExecutionTimeout());\r
+\r
+    try {\r
+      waitForNotifications.waitForResult(deviceId, opCode, futureResponse, timeOut);\r
+      response = waitForNotifications.getOperationResult(deviceId, opCode);\r
+\r
+      if (null == response) {\r
+        LOG.error("Request got timed out.");\r
+      } else {\r
+        LOG.debug("Received operation result for device : {}, operation = {} as {}", deviceId,\r
+            opCode, response);\r
+      }\r
+      waitForNotifications.stopOperation(deviceId, opCode);\r
+\r
+      // if(isSuccess) {\r
+      // response = waitForNotifications.getOperationResult(deviceId, opCode);\r
+      // LOG.debug("Received operation result for device : {}, operation = {} as {}",deviceId,\r
+      // opCode,response);\r
+      //\r
+      // waitForNotifications.stopOperation(deviceId, opCode);\r
+      // }else {\r
+      // LOG.error("Request got timed out.");\r
+      // }\r
+    } catch (InterruptedException e) {\r
+      LOG.debug(\r
+          "InterruptedException while waiting for mapper operation result for device : {}, operation : {} request.",\r
+          deviceId, opCode);\r
+    }\r
+\r
+    return response;\r
+  }\r
+\r
+  private long getOperationTimeOut(long timeOut) {\r
+    if (timeOut > 0) {\r
+      return timeOut;\r
+    }\r
+\r
+    if (null != config.getRequestTimeout()) {\r
+      timeOut = Long.valueOf(config.getRequestTimeout());\r
+    }\r
+\r
+    return timeOut;\r
+  }\r
+\r
+  @Async\r
+  public void initiateDeviceReachabilityCheck(DeviceDataEntity deviceDataEntity) {\r
+    DeviceDetails deviceDetails = new DeviceDetails();\r
+    deviceDetails.setDeviceId(deviceDataEntity.getDeviceId());\r
+    deviceDetails.setOui(deviceDataEntity.getOui());\r
+    deviceDetails.setProductClass(deviceDataEntity.getProductClass());\r
+\r
+    TR069OperationDetails operationDetails = new TR069OperationDetails();\r
+    operationDetails.setOpCode(CustomOperationCode.CONNECT);\r
+\r
+    DeviceRPCRequest deviceRPCRequest = new DeviceRPCRequest();\r
+\r
+    deviceRPCRequest.setDeviceDetails(deviceDetails);\r
+    deviceRPCRequest.setOpDetails(operationDetails);\r
+\r
+    OperationOptions options = new OperationOptions();\r
+    if (null != config.getRequestTimeout()) {\r
+      options.setExecutionTimeout(Integer.valueOf(config.getRequestTimeout()));\r
+    }\r
+\r
+    deviceRPCRequest.setOptions(options);\r
+\r
+    DeviceRPCResponse deviceRPCResponse = performDeviceOperation(deviceRPCRequest);\r
+\r
+    if (VesAgentUtils.isDeviceReachable(deviceRPCResponse)) {\r
+      LOG.debug("Device {} is reachable.", deviceDataEntity.getDeviceId());\r
+      try {\r
+        LOG.debug("Sending heatbeat event for device {}.", deviceDataEntity.getDeviceId());\r
+        heartBeatMessageHandler.sendHeartBeatEvent(deviceDataEntity, Integer.parseInt(\r
+            deviceDataEntity.getAttributesMap().get(VesAgentConstants.HEART_BEAT_PERIOD)));\r
+      } catch (NumberFormatException e) {\r
+        LOG.error("heartBeatPeriod doesn't have numeric value. ErrorMsg: {}", e.getMessage());\r
+      } catch (Exception e) {\r
+        LOG.error("Error while sending heart beat ves event. ErrorMsg: {}", e.getMessage());\r
+      }\r
+    }\r
+  }\r
+}\r
diff --git a/ves-agent/src/main/java/org/commscope/tr069adapter/vesagent/async/AsyncThreadPoolConfig.java b/ves-agent/src/main/java/org/commscope/tr069adapter/vesagent/async/AsyncThreadPoolConfig.java
new file mode 100644 (file)
index 0000000..b968608
--- /dev/null
@@ -0,0 +1,36 @@
+package org.commscope.tr069adapter.vesagent.async;\r
+\r
+import java.util.concurrent.Executor;\r
+\r
+import org.springframework.context.annotation.Configuration;\r
+import org.springframework.scheduling.annotation.AsyncConfigurer;\r
+import org.springframework.scheduling.annotation.EnableAsync;\r
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;\r
+\r
+/**\r
+ * \r
+ * @version 1.0\r
+ * @since June 12, 2020\r
+ * @author Prashant Kumar\r
+ */\r
+\r
+@Configuration\r
+@EnableAsync\r
+public class AsyncThreadPoolConfig implements AsyncConfigurer {\r
+\r
+  @Override\r
+  public Executor getAsyncExecutor() {\r
+    ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();\r
+    executor.setCorePoolSize(7);\r
+    executor.setMaxPoolSize(25);\r
+    executor.setQueueCapacity(11);\r
+    executor.setThreadNamePrefix("MyExecutor-");\r
+    executor.initialize();\r
+    return executor;\r
+  }\r
+\r
+  // @Override\r
+  // public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {\r
+  // return new MyAsyncUncaughtExceptionHandler();\r
+  // }\r
+}\r
diff --git a/ves-agent/src/main/java/org/commscope/tr069adapter/vesagent/async/WaitForNotifications.java b/ves-agent/src/main/java/org/commscope/tr069adapter/vesagent/async/WaitForNotifications.java
new file mode 100644 (file)
index 0000000..614ce44
--- /dev/null
@@ -0,0 +1,100 @@
+package org.commscope.tr069adapter.vesagent.async;\r
+\r
+import java.util.HashMap;\r
+import java.util.Map;\r
+import java.util.concurrent.Future;\r
+import java.util.concurrent.Semaphore;\r
+import java.util.concurrent.TimeUnit;\r
+\r
+import org.commscope.tr069adapter.acs.common.DeviceRPCResponse;\r
+import org.commscope.tr069adapter.acs.common.OperationCode;\r
+import org.commscope.tr069adapter.acs.common.OperationResponse;\r
+import org.commscope.tr069adapter.acs.common.dto.CustomOperationCode;\r
+import org.commscope.tr069adapter.mapper.model.VESNotification;\r
+import org.commscope.tr069adapter.vesagent.util.VesAgentConstants;\r
+import org.commscope.tr069adapter.vesagent.util.VesAgentUtils;\r
+import org.slf4j.Logger;\r
+import org.slf4j.LoggerFactory;\r
+import org.springframework.stereotype.Component;\r
+\r
+@Component\r
+public class WaitForNotifications {\r
+\r
+  private static final Logger LOG = LoggerFactory.getLogger(WaitForNotifications.class);\r
+\r
+  private static Map<String, Future<DeviceRPCResponse>> opFutureMap = new HashMap<>();\r
+  private static Map<String, DeviceRPCResponse> opResultMap = new HashMap<>();\r
+  private static Map<String, Semaphore> semaphoreMap = new HashMap<>();\r
+\r
+  public void notifyDeviceNotification(VESNotification notification) {\r
+    String deviceOperationKey = VesAgentUtils.getDeviceOperationKey(\r
+        notification.getDevnotification().getDeviceDetails().getDeviceId(),\r
+        CustomOperationCode.CONNECT);\r
+\r
+    if (!semaphoreMap.containsKey(deviceOperationKey)) {\r
+      return;\r
+    }\r
+\r
+    DeviceRPCResponse response = new DeviceRPCResponse();\r
+    response.setDeviceDetails(notification.getDevnotification().getDeviceDetails());\r
+\r
+    OperationResponse operationResponse = new OperationResponse();\r
+    operationResponse.setStatus(VesAgentConstants.DEVICE_IS_REACHABLE);\r
+    operationResponse.setOperationCode(CustomOperationCode.CONNECT);\r
+\r
+    response.setOperationResponse(operationResponse);\r
+\r
+    opResultMap.put(deviceOperationKey, response);\r
+    Semaphore mutex = semaphoreMap.remove(deviceOperationKey);\r
+    mutex.release();\r
+  }\r
+\r
+\r
+  public void notifyResult(DeviceRPCResponse opResult) {\r
+    String deviceOperationKey =\r
+        VesAgentUtils.getDeviceOperationKey(opResult.getDeviceDetails().getDeviceId(),\r
+            opResult.getOperationResponse().getOperationCode());\r
+\r
+    if (!semaphoreMap.containsKey(deviceOperationKey)) {\r
+      return;\r
+    }\r
+\r
+    opResultMap.put(deviceOperationKey, opResult);\r
+    Semaphore mutex = semaphoreMap.remove(deviceOperationKey);\r
+    mutex.release();\r
+  }\r
+\r
+  public DeviceRPCResponse getOperationResult(String deviceId, OperationCode opCode) {\r
+    return opResultMap.remove(VesAgentUtils.getDeviceOperationKey(deviceId, opCode));\r
+  }\r
+\r
+  public boolean waitForResult(String deviceId, OperationCode opCode,\r
+      Future<DeviceRPCResponse> futureResponse, long timeout) throws InterruptedException {\r
+    LOG.debug("Waiting for operation result for device:{}, operation: {}", deviceId, opCode);\r
+\r
+    String deviceOperationKey = VesAgentUtils.getDeviceOperationKey(deviceId, opCode);\r
+    opFutureMap.put(deviceOperationKey, futureResponse);\r
+\r
+    Semaphore semaphore = new Semaphore(0);\r
+    semaphoreMap.put(deviceOperationKey, semaphore);\r
+\r
+    LOG.debug("Semaphore MAP size = {}", semaphoreMap.size());\r
+    LOG.debug("opResultMap MAP size = {}", opResultMap.size());\r
+    LOG.debug("opFutureMap MAP size = {}", opFutureMap.size());\r
+\r
+    return semaphore.tryAcquire(timeout, TimeUnit.SECONDS);\r
+  }\r
+\r
+  public void stopOperation(String deviceId, OperationCode opCode) {\r
+    LOG.debug("Stopping waiting for operation result thread for device:{}, operation: {}", deviceId,\r
+        opCode);\r
+\r
+    Future<DeviceRPCResponse> operationInstance =\r
+        opFutureMap.remove(VesAgentUtils.getDeviceOperationKey(deviceId, opCode));\r
+\r
+    if (null != operationInstance) {\r
+      LOG.info("Stopping operation result waiting thread for operation : {}", operationInstance);\r
+      operationInstance.cancel(true);\r
+    }\r
+  }\r
+}\r
index ee86898..84863a7 100644 (file)
@@ -20,10 +20,14 @@ package org.commscope.tr069adapter.vesagent.boot;
 \r
 import org.springframework.boot.SpringApplication;\r
 import org.springframework.boot.autoconfigure.SpringBootApplication;\r
+import org.springframework.boot.autoconfigure.domain.EntityScan;\r
 import org.springframework.context.annotation.ComponentScan;\r
+import org.springframework.data.jpa.repository.config.EnableJpaRepositories;\r
 \r
 @SpringBootApplication\r
 @ComponentScan({"org.commscope.tr069adapter.vesagent"})\r
+@EnableJpaRepositories("org.commscope.tr069adapter.vesagent.repository")\r
+@EntityScan("org.commscope.tr069adapter.vesagent.entity")\r
 public class VESAgentServiceBooter {\r
 \r
   public static void main(String[] args) {\r
index 02addc1..9d099fd 100644 (file)
@@ -42,6 +42,7 @@ import org.commscope.tr069adapter.vesagent.model.CommonEventHeader;
 import org.commscope.tr069adapter.vesagent.model.Event;\r
 import org.commscope.tr069adapter.vesagent.model.EventMessage;\r
 import org.commscope.tr069adapter.vesagent.model.FaultFields;\r
+import org.commscope.tr069adapter.vesagent.util.EventUtil;\r
 import org.slf4j.Logger;\r
 import org.slf4j.LoggerFactory;\r
 import org.springframework.beans.factory.annotation.Autowired;\r
@@ -117,18 +118,7 @@ public class AlarmMappingHandler {
       eventHeader.setTimeZoneOffset(extractTimeZoneOffSet(event.getAdditionalInformation()));\r
       eventHeader.setPriority(extractPriority(event.getPerceivedSeverity()));\r
 \r
-      if (eNodeBName == null) {\r
-        eventHeader.setReportingEntityName(notification.getDeviceDetails().getDeviceId());\r
-        eventHeader.setReportingEntityId(notification.getDeviceDetails().getDeviceId());\r
-        eventHeader.setSourceId(notification.getDeviceDetails().getDeviceId());\r
-        eventHeader.setSourceName(notification.getDeviceDetails().getDeviceId());\r
-      } else {\r
-        eventHeader.setReportingEntityName(eNodeBName);\r
-        eventHeader.setSourceName(eNodeBName);\r
-\r
-        eventHeader.setReportingEntityId(notification.getDeviceDetails().getDeviceId());\r
-        eventHeader.setSourceId(notification.getDeviceDetails().getDeviceId());\r
-      }\r
+      EventUtil.populateEnodeBName(eventHeader, notification, eNodeBName);\r
 \r
       eventHeader.setSequence(1);\r
       eventHeader.setStartEpochMicrosec(System.currentTimeMillis());\r
index be253c3..c62681c 100644 (file)
  */\r
 package org.commscope.tr069adapter.vesagent.controller;\r
 \r
-import com.fasterxml.jackson.core.JsonProcessingException;\r
 import com.fasterxml.jackson.databind.ObjectMapper;\r
 \r
-import org.commscope.tr069adapter.acs.common.DeviceInform;\r
+import java.util.ArrayList;\r
+import java.util.List;\r
+\r
+import org.commscope.tr069adapter.acs.common.DeviceRPCRequest;\r
+import org.commscope.tr069adapter.acs.common.DeviceRPCResponse;\r
+import org.commscope.tr069adapter.acs.common.OperationDetails;\r
+import org.commscope.tr069adapter.acs.common.ParameterDTO;\r
 import org.commscope.tr069adapter.mapper.model.VESNotification;\r
 import org.commscope.tr069adapter.mapper.model.VESNotificationResponse;\r
 import org.commscope.tr069adapter.vesagent.VesConfiguration;\r
+import org.commscope.tr069adapter.vesagent.entity.DeviceDataEntity;\r
+import org.commscope.tr069adapter.vesagent.exception.VesAgentException;\r
 import org.commscope.tr069adapter.vesagent.http.HttpRequestSender;\r
 import org.commscope.tr069adapter.vesagent.model.CommonEventHeader;\r
 import org.commscope.tr069adapter.vesagent.model.Event;\r
 import org.commscope.tr069adapter.vesagent.model.EventMessage;\r
 import org.commscope.tr069adapter.vesagent.model.HeartbeatFields;\r
+import org.commscope.tr069adapter.vesagent.service.VesAgentServiceHelper;\r
+import org.commscope.tr069adapter.vesagent.util.VesAgentConstants;\r
+import org.commscope.tr069adapter.vesagent.util.VesAgentUtils;\r
 import org.slf4j.Logger;\r
 import org.slf4j.LoggerFactory;\r
 import org.springframework.beans.factory.annotation.Autowired;\r
@@ -39,16 +49,18 @@ public class HeartBeatMessageHandler {
 \r
   private static final Logger logger = LoggerFactory.getLogger(HeartBeatMessageHandler.class);\r
 \r
+  @Autowired\r
+  VesAgentServiceHelper vesAgentServiceHelper;\r
+\r
   @Autowired\r
   VesConfiguration config;\r
 \r
   @Autowired\r
   HttpRequestSender sender;\r
 \r
-  public VESNotificationResponse handlePINotification(VESNotification vesNoti)\r
-      throws JsonProcessingException {\r
-    Event event =\r
-        convertNotificationToVESEvent(vesNoti.getDevnotification(), vesNoti.geteNodeBName());\r
+  public VESNotificationResponse sendHeartBeatEvent(DeviceDataEntity deviceDataEntity,\r
+      int heartBeatPeriod) throws Exception {\r
+    Event event = convertNotificationToVESEvent(deviceDataEntity, heartBeatPeriod);\r
 \r
     EventMessage evMsg = new EventMessage();\r
     evMsg.setEvent(event);\r
@@ -64,34 +76,152 @@ public class HeartBeatMessageHandler {
     return sender.postRequest(url, requestBody);\r
   }\r
 \r
-  Event convertNotificationToVESEvent(DeviceInform notification, String eNodeBName) {\r
+  public void handleRegisterRequest(VESNotification vesNotification) {\r
+    try {\r
+      VesAgentUtils.validateVESNotification(vesNotification);\r
+    } catch (VesAgentException e) {\r
+      logger.error(\r
+          "Failed to create heartbeat timers for device on recieving bootstrap. ErrorMsg: {}",\r
+          e.getMessage());\r
+      return;\r
+    }\r
+\r
+    List<DeviceDataEntity> deviceDataEntityList = vesAgentServiceHelper.findByDeviceIdAndGroup(\r
+        vesNotification.getDevnotification().getDeviceDetails().getDeviceId(),\r
+        VesAgentConstants.HEART_BEAT);\r
+\r
+    if (Boolean.FALSE.equals(VesAgentUtils.isNullOrEmpty(deviceDataEntityList))) {\r
+      DeviceDataEntity deviceDataEntity = deviceDataEntityList.get(0);\r
+      String heartbeatPeriod =\r
+          deviceDataEntity.getAttributesMap().get(VesAgentConstants.HEART_BEAT_PERIOD);\r
+\r
+      if (!VesAgentUtils.isNullOrEmpty(heartbeatPeriod)\r
+          && !heartbeatPeriod.equalsIgnoreCase(VesAgentConstants.REMOVE_HEART_BEAT_TIMER_VAL)) {\r
+        return;\r
+      }\r
+    }\r
+\r
+    logger.info("Creating heartbeat records and timer using default heartbeatPeriod {} minutes.",\r
+        VesAgentConstants.HEART_BEAT_PERIOD_DEFAULT_VAL);\r
+\r
+    DeviceRPCRequest deviceRPCRequest = new DeviceRPCRequest();\r
+    deviceRPCRequest.setDeviceDetails(vesNotification.getDevnotification().getDeviceDetails());\r
+\r
+    OperationDetails opDetails = new OperationDetails();\r
+\r
+    ParameterDTO heartBeatPeriodParam = new ParameterDTO();\r
+    heartBeatPeriodParam.setParamName(VesAgentConstants.HEART_BEAT_PERIOD);\r
+    heartBeatPeriodParam.setParamValue(VesAgentConstants.HEART_BEAT_PERIOD_DEFAULT_VAL);\r
+\r
+    List<ParameterDTO> paramList = new ArrayList<>();\r
+    paramList.add(heartBeatPeriodParam);\r
+\r
+    opDetails.setParmeters(paramList);\r
+    deviceRPCRequest.setOpDetails(opDetails);\r
+\r
+    deviceRPCRequest.addContextParam(VesAgentConstants.ENODEB_NAME,\r
+        vesNotification.geteNodeBName());\r
+\r
+    handleSetConfigRequest(deviceRPCRequest);\r
+\r
+  }\r
+\r
+  public DeviceRPCResponse handleSetConfigRequest(DeviceRPCRequest deviceRPCRequest) {\r
+    try {\r
+      VesAgentUtils.validateDeviceRPCRequest(deviceRPCRequest);\r
+    } catch (VesAgentException e) {\r
+      return VesAgentUtils.getErrorResponse(deviceRPCRequest, e.getErrorCode(), e.getMessage());\r
+    }\r
+\r
+    OperationDetails operationDetails = deviceRPCRequest.getOpDetails();\r
+\r
+    String heartBeatPeriod = null;\r
+    String countDownTimer = null;\r
+\r
+    ParameterDTO countDownTimerDTO = null;\r
+\r
+    List<ParameterDTO> paramDTOList = operationDetails.getParmeters();\r
+    for (ParameterDTO paramDTO : paramDTOList) {\r
+      if (paramDTO.getParamName().equalsIgnoreCase(VesAgentConstants.HEART_BEAT_PERIOD)) {\r
+        heartBeatPeriod = paramDTO.getParamValue();\r
+      }\r
+\r
+      if (paramDTO.getParamName().equalsIgnoreCase(VesAgentConstants.COUNT_DOWN_TIMER)) {\r
+        countDownTimer = paramDTO.getParamValue();\r
+        countDownTimerDTO = paramDTO;\r
+      }\r
+    }\r
+\r
+    try {\r
+      vesAgentServiceHelper.processHeartBeatSetRequest(deviceRPCRequest, heartBeatPeriod,\r
+          countDownTimer);\r
+    } catch (VesAgentException e) {\r
+      return VesAgentUtils.getErrorResponse(deviceRPCRequest, e.getErrorCode(), e.getMessage());\r
+    }\r
+\r
+    copyHeartBeatPeriodToTimerForResponse(countDownTimerDTO, heartBeatPeriod);\r
+    return VesAgentUtils.getSuccessResponse(deviceRPCRequest);\r
+  }\r
+\r
+  private void copyHeartBeatPeriodToTimerForResponse(ParameterDTO countDownParam,\r
+      String heartBeatPeriod) {\r
+    if (null != countDownParam && !VesAgentUtils.isNullOrEmpty(heartBeatPeriod)) {\r
+      countDownParam.setParamValue(heartBeatPeriod);\r
+    }\r
+  }\r
+\r
+  public DeviceRPCResponse handleGetConfigRequest(DeviceRPCRequest deviceRPCRequest) {\r
+    try {\r
+      VesAgentUtils.validateDeviceRPCRequest(deviceRPCRequest);\r
+    } catch (VesAgentException e) {\r
+      return VesAgentUtils.getErrorResponse(deviceRPCRequest, e.getErrorCode(), e.getMessage());\r
+    }\r
+\r
+    vesAgentServiceHelper.processHeartBeatGetRequest(deviceRPCRequest);\r
+    return VesAgentUtils.getSuccessResponse(deviceRPCRequest);\r
+  }\r
+\r
+  public VESNotificationResponse handleDeleteConfigRequest(VESNotification vesNotification) {\r
+    try {\r
+      VesAgentUtils.validateDelVESNotification(vesNotification);\r
+      vesAgentServiceHelper.processHeartBeatDeleteRequest(vesNotification);\r
+    } catch (VesAgentException e) {\r
+      return new VESNotificationResponse(Integer.parseInt(e.getErrorCode()), e.getMessage());\r
+    } catch (Exception e) {\r
+      return new VESNotificationResponse(VesAgentConstants.RPC_FAILED, e.getMessage());\r
+    }\r
+\r
+    return new VESNotificationResponse(VesAgentConstants.RPC_SUCCESS, "success");\r
+  }\r
+\r
+  Event convertNotificationToVESEvent(DeviceDataEntity deviceDataEntity, int heartBeatPeriod) {\r
     Event hbEvent = new Event();\r
     CommonEventHeader eventHeader = new CommonEventHeader();\r
 \r
     eventHeader.setDomain("heartbeat");\r
-    eventHeader.setEventId(\r
-        "Heartbeat_" + notification.getDeviceDetails().getDeviceId() + System.currentTimeMillis());\r
-    eventHeader.setEventName("Heartbeat_" + notification.getDeviceDetails().getProductClass() + "-"\r
-        + config.getVendorName());\r
-    eventHeader.setEventType("CommScope_RAN_Vnf");\r
-    eventHeader.setLastEpochMicrosec(System.currentTimeMillis());\r
-\r
-    eventHeader.setPriority("Normal");\r
+    eventHeader\r
+        .setEventId("heartbeat_" + deviceDataEntity.getDeviceId() + System.currentTimeMillis());\r
+    eventHeader.setEventName(\r
+        "heartbeat_" + deviceDataEntity.getProductClass() + "-" + config.getVendorName());\r
+    eventHeader.setEventType("CommScope_RAN_heartbeat");\r
+    eventHeader.setLastEpochMicrosec(System.currentTimeMillis() * 1000);\r
+\r
+    eventHeader.setPriority("High");\r
     eventHeader.setSequence(0);\r
 \r
-    if (eNodeBName == null) {\r
-      eventHeader.setReportingEntityName(notification.getDeviceDetails().getDeviceId());\r
-      eventHeader.setReportingEntityId(notification.getDeviceDetails().getDeviceId());\r
-      eventHeader.setSourceId(notification.getDeviceDetails().getDeviceId());\r
-      eventHeader.setSourceName(notification.getDeviceDetails().getDeviceId());\r
+    if (deviceDataEntity.geteNodeBName() == null) {\r
+      eventHeader.setReportingEntityName(deviceDataEntity.getDeviceId());\r
+      eventHeader.setReportingEntityId(deviceDataEntity.getDeviceId());\r
+      eventHeader.setSourceId(deviceDataEntity.getDeviceId());\r
+      eventHeader.setSourceName(deviceDataEntity.getDeviceId());\r
     } else {\r
-      eventHeader.setReportingEntityName(eNodeBName);\r
-      eventHeader.setSourceName(eNodeBName);\r
-      eventHeader.setReportingEntityId(notification.getDeviceDetails().getDeviceId());\r
-      eventHeader.setSourceId(notification.getDeviceDetails().getDeviceId());\r
+      eventHeader.setReportingEntityName(deviceDataEntity.geteNodeBName());\r
+      eventHeader.setSourceName(deviceDataEntity.geteNodeBName());\r
+      eventHeader.setReportingEntityId(deviceDataEntity.getDeviceId());\r
+      eventHeader.setSourceId(deviceDataEntity.getDeviceId());\r
     }\r
 \r
-    eventHeader.setStartEpochMicrosec(System.currentTimeMillis());\r
+    eventHeader.setStartEpochMicrosec(System.currentTimeMillis() * 1000);\r
     eventHeader.setVersion(config.getEventVersion());\r
     eventHeader.setNfNamingCode("");\r
     eventHeader.setNfcNamingCode("");\r
@@ -101,7 +231,7 @@ public class HeartBeatMessageHandler {
 \r
     HeartbeatFields heartbeatFields = new HeartbeatFields();\r
     heartbeatFields.setHeartbeatFieldsVersion("3.0");\r
-    heartbeatFields.setHeartbeatInterval(60);\r
+    heartbeatFields.setHeartbeatInterval(heartBeatPeriod * 60);\r
     hbEvent.setHeartbeatFields(heartbeatFields);\r
 \r
     return hbEvent;\r
index d449d0b..25c7b69 100644 (file)
@@ -36,6 +36,7 @@ import org.commscope.tr069adapter.vesagent.model.Event;
 import org.commscope.tr069adapter.vesagent.model.EventMessage;\r
 import org.commscope.tr069adapter.vesagent.model.PnfRegEventAdditionalFeilds;\r
 import org.commscope.tr069adapter.vesagent.model.PnfRegEventFields;\r
+import org.commscope.tr069adapter.vesagent.util.EventUtil;\r
 import org.slf4j.Logger;\r
 import org.slf4j.LoggerFactory;\r
 import org.springframework.beans.factory.annotation.Autowired;\r
@@ -109,30 +110,8 @@ public class PnfRegMappingHandler {
     eventHeader.setEventName("pnfReg_" + notification.getDeviceDetails().getProductClass() + "-"\r
         + config.getVendorName());\r
     eventHeader.setEventType(config.getPnfRegEventType());\r
-    eventHeader.setLastEpochMicrosec(System.currentTimeMillis());\r
-\r
     eventHeader.setPriority("High");\r
-    eventHeader.setSequence(0);\r
-\r
-    if (eNodeBName == null) {\r
-      eventHeader.setReportingEntityName(notification.getDeviceDetails().getDeviceId());\r
-      eventHeader.setReportingEntityId(notification.getDeviceDetails().getDeviceId());\r
-      eventHeader.setSourceId(notification.getDeviceDetails().getDeviceId());\r
-      eventHeader.setSourceName(notification.getDeviceDetails().getDeviceId());\r
-    } else {\r
-      eventHeader.setReportingEntityName(eNodeBName);\r
-      eventHeader.setSourceName(eNodeBName);\r
-\r
-      eventHeader.setReportingEntityId(notification.getDeviceDetails().getDeviceId());\r
-      eventHeader.setSourceId(notification.getDeviceDetails().getDeviceId());\r
-    }\r
-\r
-    eventHeader.setStartEpochMicrosec(System.currentTimeMillis());\r
-    eventHeader.setVersion(config.getEventVersion());\r
-    eventHeader.setNfNamingCode("");\r
-    eventHeader.setNfcNamingCode("");\r
-    eventHeader.setNfVendorName(config.getVendorName());\r
-    eventHeader.setVesEventListenerVersion(config.getVesVersion());\r
+    EventUtil.populateEventHeaderFields(eventHeader, notification, eNodeBName, config);\r
     regEvent.setCommonEventHeader(eventHeader);\r
 \r
     PnfRegEventFields pnfRegistrationFields =\r
index 1836163..9a1ec07 100644 (file)
@@ -20,11 +20,15 @@ package org.commscope.tr069adapter.vesagent.controller;
 \r
 import com.fasterxml.jackson.core.JsonProcessingException;\r
 \r
+import org.commscope.tr069adapter.acs.common.DeviceRPCRequest;\r
+import org.commscope.tr069adapter.acs.common.DeviceRPCResponse;\r
 import org.commscope.tr069adapter.acs.common.inform.BootstrapInform;\r
+import org.commscope.tr069adapter.acs.common.inform.ConnectionRequestInform;\r
 import org.commscope.tr069adapter.acs.common.inform.PeriodicInform;\r
 import org.commscope.tr069adapter.acs.common.inform.ValueChangeInform;\r
 import org.commscope.tr069adapter.mapper.model.VESNotification;\r
 import org.commscope.tr069adapter.mapper.model.VESNotificationResponse;\r
+import org.commscope.tr069adapter.vesagent.async.WaitForNotifications;\r
 import org.commscope.tr069adapter.vesagent.exception.InvalidFaultOperationException;\r
 import org.slf4j.Logger;\r
 import org.slf4j.LoggerFactory;\r
@@ -49,6 +53,9 @@ public class VESAgentService {
   @Autowired\r
   HeartBeatMessageHandler hbHandler;\r
 \r
+  @Autowired\r
+  WaitForNotifications waitForNotifications;\r
+\r
   @PostMapping(path = "/deviceEvent", consumes = "application/json")\r
   public VESNotificationResponse processDeviceNotificationAsVESEvent(\r
       @RequestBody VESNotification notification)\r
@@ -61,15 +68,20 @@ public class VESAgentService {
     } else if (notification.getDevnotification() instanceof BootstrapInform) {\r
       logger.debug("VES Notification request PnfRegister processing started");\r
       response = pnfHandler.handlePnfRegNotification(notification);\r
+      hbHandler.handleRegisterRequest(notification);\r
       logger.debug("VES Notification request PnfRegister processing completed");\r
     } else if (notification.getDevnotification() instanceof ValueChangeInform) {\r
       logger.debug("VES Notification request Fault processing started");\r
       response = alarmHanler.handleAlarmNotification(notification);\r
+      waitForNotifications.notifyDeviceNotification(notification);\r
       logger.debug("VES Notification request Fault processing completed");\r
     } else if (notification.getDevnotification() instanceof PeriodicInform) {\r
       logger.debug("VES Notification request PI processing started");\r
-      response = hbHandler.handlePINotification(notification);\r
+      waitForNotifications.notifyDeviceNotification(notification);\r
       logger.debug("VES Notification request PI processing completed");\r
+    } else if (notification.getDevnotification() instanceof ConnectionRequestInform) {\r
+      logger.debug("Recieived ConnectionRequest inform from device.");\r
+      waitForNotifications.notifyDeviceNotification(notification);\r
     } else {\r
       logger.error("VES Notification request is unknown");\r
       response =\r
@@ -78,4 +90,36 @@ public class VESAgentService {
     logger.debug("VES Notification request processing completed");\r
     return response;\r
   }\r
+\r
+  @PostMapping(path = "/deleteConfig", consumes = "application/json")\r
+  public VESNotificationResponse processDeleteConfigRequest(\r
+      @RequestBody VESNotification vesNotification) {\r
+    VESNotificationResponse response = null;\r
+\r
+    logger.debug("Initiating deleteConfig VES Notification request");\r
+    response = hbHandler.handleDeleteConfigRequest(vesNotification);\r
+    logger.debug("deleteConfig VES Notification request is completed");\r
+    return response;\r
+  }\r
+\r
+  @PostMapping(path = "/editConfig", consumes = "application/json")\r
+  public DeviceRPCResponse processEditConfigRequest(\r
+      @RequestBody DeviceRPCRequest deviceRPCRequest) {\r
+    DeviceRPCResponse response = null;\r
+\r
+    logger.debug("Initiating setConfig VES Notification request");\r
+    response = hbHandler.handleSetConfigRequest(deviceRPCRequest);\r
+    logger.debug("setConfig VES Notification request is compelted");\r
+    return response;\r
+  }\r
+\r
+  @PostMapping(path = "/getConfig", consumes = "application/json")\r
+  public DeviceRPCResponse processGetConfigRequest(@RequestBody DeviceRPCRequest deviceRPCRequest) {\r
+    DeviceRPCResponse response = null;\r
+\r
+    logger.debug("Initiating getConfig VES Notification request");\r
+    response = hbHandler.handleGetConfigRequest(deviceRPCRequest);\r
+    logger.debug("getConfig VES Notification request is compelted");\r
+    return response;\r
+  }\r
 }\r
diff --git a/ves-agent/src/main/java/org/commscope/tr069adapter/vesagent/entity/DeviceDataEntity.java b/ves-agent/src/main/java/org/commscope/tr069adapter/vesagent/entity/DeviceDataEntity.java
new file mode 100644 (file)
index 0000000..ca97e93
--- /dev/null
@@ -0,0 +1,137 @@
+package org.commscope.tr069adapter.vesagent.entity;\r
+\r
+import com.google.gson.Gson;\r
+\r
+import java.util.Date;\r
+import java.util.Map;\r
+\r
+import javax.persistence.Column;\r
+import javax.persistence.Entity;\r
+import javax.persistence.GeneratedValue;\r
+import javax.persistence.GenerationType;\r
+import javax.persistence.Id;\r
+import javax.persistence.Table;\r
+import javax.persistence.Transient;\r
+import javax.persistence.UniqueConstraint;\r
+\r
+/**\r
+ * \r
+ * @version 1.0\r
+ * @since May 21, 2020\r
+ * @author Prashant Kumar\r
+ */\r
+\r
+@Entity\r
+@Table(name = "VES_DEVICE_DATA",\r
+    uniqueConstraints = @UniqueConstraint(columnNames = {"DEVICE_ID", "ATTR_GROUP"}))\r
+public class DeviceDataEntity {\r
+\r
+  @Id\r
+  @Column(name = "ID")\r
+  @GeneratedValue(strategy = GenerationType.AUTO)\r
+  private Long id;\r
+\r
+  @Column(name = "DEVICE_ID", length = 30)\r
+  private String deviceId;\r
+\r
+  @Column(name = "ENODEB_NAME", length = 100)\r
+  private String eNodeBName;\r
+\r
+  @Column(name = "OUI", length = 30)\r
+  private String oui;\r
+\r
+  @Column(name = "PRODUCT_CLASS", length = 100)\r
+  private String productClass;\r
+\r
+  @Column(name = "ATTR_JSON", length = 4000)\r
+  private String attrJson;\r
+\r
+  @Column(name = "ATTR_GROUP", length = 255)\r
+  private String attrGroup;\r
+\r
+  @Column(name = "LAST_UPDATED_TIME")\r
+  private Date lastUpdateTime = new Date();\r
+\r
+  public Long getId() {\r
+    return id;\r
+  }\r
+\r
+  public void setId(Long id) {\r
+    this.id = id;\r
+  }\r
+\r
+  public String getDeviceId() {\r
+    return deviceId;\r
+  }\r
+\r
+  public void setDeviceId(String deviceId) {\r
+    this.deviceId = deviceId;\r
+  }\r
+\r
+  public String geteNodeBName() {\r
+    return eNodeBName;\r
+  }\r
+\r
+  public void seteNodeBName(String eNodeBName) {\r
+    this.eNodeBName = eNodeBName;\r
+  }\r
+\r
+  public String getOui() {\r
+    return oui;\r
+  }\r
+\r
+  public void setOui(String oui) {\r
+    this.oui = oui;\r
+  }\r
+\r
+  public String getProductClass() {\r
+    return productClass;\r
+  }\r
+\r
+  public void setProductClass(String productClass) {\r
+    this.productClass = productClass;\r
+  }\r
+\r
+  public String getAttrJson() {\r
+    return attrJson;\r
+  }\r
+\r
+  public void setAttrJson(String attrJson) {\r
+    this.attrJson = attrJson;\r
+  }\r
+\r
+  public String getAttrGroup() {\r
+    return attrGroup;\r
+  }\r
+\r
+  public void setAttrGroup(String attrGroup) {\r
+    this.attrGroup = attrGroup;\r
+  }\r
+\r
+  public Date getLastUpdateTime() {\r
+    return lastUpdateTime;\r
+  }\r
+\r
+  public void setLastUpdateTime(Date lastUpdateTime) {\r
+    this.lastUpdateTime = lastUpdateTime;\r
+  }\r
+\r
+  @Transient\r
+  public void setAttributesMap(Map<String, String> attributesMap) {\r
+    if (null == attributesMap || attributesMap.isEmpty()) {\r
+      return;\r
+    }\r
+\r
+    this.attrJson = new Gson().toJson(attributesMap);\r
+\r
+  }\r
+\r
+  @Transient\r
+  public Map<String, String> getAttributesMap() {\r
+    Map<String, String> attributesMap = null;\r
+    if (null != this.attrJson && !this.attrJson.isEmpty()) {\r
+      attributesMap = new Gson().fromJson(this.attrJson, Map.class);\r
+    }\r
+    return attributesMap;\r
+  }\r
+}\r
diff --git a/ves-agent/src/main/java/org/commscope/tr069adapter/vesagent/exception/VesAgentException.java b/ves-agent/src/main/java/org/commscope/tr069adapter/vesagent/exception/VesAgentException.java
new file mode 100644 (file)
index 0000000..d51efdf
--- /dev/null
@@ -0,0 +1,81 @@
+package org.commscope.tr069adapter.vesagent.exception;\r
+\r
+/**\r
+ * \r
+ * @version 1.0\r
+ * @since May 21, 2020\r
+ * @author Prashant\r
+ */\r
+public class VesAgentException extends Exception {\r
+  private static final long serialVersionUID = -3742697051389101875L;\r
+\r
+  private static final String ERRORMSG_PREFIX = "ves-agent";\r
+\r
+  private String[] arguments;\r
+\r
+  private String errorCode;\r
+  private String message;\r
+\r
+  // index of the error occurred in the given list or in the given file\r
+  protected int errorIndex = -1;\r
+\r
+\r
+  /**\r
+   * Constructs a <code>VesOperationException</code> with no detail message.\r
+   * \r
+   */\r
+  public VesAgentException() {\r
+    super();\r
+  }\r
+\r
+  /**\r
+   * Constructs a <code>VesOperationException</code> with the specified detail message.\r
+   * \r
+   * @param s as the details message\r
+   */\r
+  public VesAgentException(String s) {\r
+    super(s);\r
+  }\r
+\r
+  public VesAgentException(String... args) {\r
+    super();\r
+    arguments = args;\r
+    setErrorMessage(getErrorMessage());\r
+  }\r
+\r
+  public VesAgentException(String errorCode, String errorMsg) {\r
+    super();\r
+    this.errorCode = errorCode;\r
+    setErrorMessage(getErrorMessage());\r
+  }\r
+\r
+  public int getErrorIndex() {\r
+    return errorIndex;\r
+  }\r
+\r
+  public void setErrorIndex(int errorIndex) {\r
+    this.errorIndex = errorIndex;\r
+  }\r
+\r
+\r
+  public String getMessage() {\r
+    return message;\r
+  }\r
+\r
+  private String getErrorMessage() {\r
+    String key = ERRORMSG_PREFIX + ".";\r
+    return key;\r
+  }\r
+\r
+  private void setErrorMessage(String message) {\r
+    this.message = message;\r
+  }\r
+\r
+  public String getErrorCode() {\r
+    return errorCode;\r
+  }\r
+\r
+  public void setErrorCode(String errorCode) {\r
+    this.errorCode = errorCode;\r
+  }\r
+}\r
diff --git a/ves-agent/src/main/java/org/commscope/tr069adapter/vesagent/mapper/MapperRequestSender.java b/ves-agent/src/main/java/org/commscope/tr069adapter/vesagent/mapper/MapperRequestSender.java
new file mode 100644 (file)
index 0000000..0c98329
--- /dev/null
@@ -0,0 +1,46 @@
+package org.commscope.tr069adapter.vesagent.mapper;\r
+\r
+import java.util.concurrent.Future;\r
+\r
+import org.commscope.tr069adapter.acs.common.DeviceRPCRequest;\r
+import org.commscope.tr069adapter.acs.common.DeviceRPCResponse;\r
+import org.commscope.tr069adapter.vesagent.VesConfiguration;\r
+import org.commscope.tr069adapter.vesagent.async.WaitForNotifications;\r
+import org.slf4j.Logger;\r
+import org.slf4j.LoggerFactory;\r
+import org.springframework.beans.factory.annotation.Autowired;\r
+import org.springframework.scheduling.annotation.Async;\r
+import org.springframework.scheduling.annotation.AsyncResult;\r
+import org.springframework.stereotype.Component;\r
+import org.springframework.web.client.RestTemplate;\r
+\r
+@Component\r
+// @EnableAsync\r
+public class MapperRequestSender {\r
+  private static final Logger LOG = LoggerFactory.getLogger(MapperRequestSender.class);\r
+  private RestTemplate restTemplate = new RestTemplate();\r
+\r
+  @Autowired\r
+  VesConfiguration config;\r
+\r
+  @Autowired\r
+  WaitForNotifications waitForNotifications;\r
+\r
+  // public DeviceRPCResponse sendRequest(DeviceRPCRequest deviceRPCRequest) {\r
+  // return restTemplate.postForObject(config.getMapperPath(), deviceRPCRequest,\r
+  // DeviceRPCResponse.class);\r
+  // }\r
+\r
+  @Async\r
+  public Future<DeviceRPCResponse> sendRequest(DeviceRPCRequest deviceRPCRequest) {\r
+    LOG.info("Sending device connectivity request to ACS for device {}",\r
+        deviceRPCRequest.getDeviceDetails().getDeviceId());\r
+    DeviceRPCResponse response = restTemplate.postForObject(config.getMapperPath(),\r
+        deviceRPCRequest, DeviceRPCResponse.class);\r
+\r
+    waitForNotifications.notifyResult(response);\r
+\r
+    return new AsyncResult<>(response);\r
+  }\r
+\r
+}\r
index c85edbe..f3853b4 100644 (file)
@@ -1,35 +1,11 @@
-/*\r
- * ============LICENSE_START========================================================================\r
- * ONAP : tr-069-adapter\r
- * =================================================================================================\r
- * Copyright (C) 2020 CommScope Inc Intellectual Property.\r
- * =================================================================================================\r
- * This tr-069-adapter software file is distributed by CommScope Inc under the Apache License,\r
- * Version 2.0 (the "License"); you may not use this file except in compliance with the License. You\r
- * may obtain a copy of the License at\r
- *\r
- * http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,\r
- * either express or implied. See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- * ===============LICENSE_END=======================================================================\r
- */\r
-\r
 package org.commscope.tr069adapter.vesagent.model;\r
 \r
 import com.fasterxml.jackson.annotation.JsonInclude;\r
 \r
-import java.io.Serializable;\r
-\r
 @JsonInclude(JsonInclude.Include.NON_NULL)\r
-public class HeartbeatFields implements Serializable {\r
-  /**\r
-   * \r
-   */\r
-  private static final long serialVersionUID = -4654513718975538805L;\r
-  private String heartbeatFieldsVersion;\r
-  private int heartbeatInterval;\r
+public class HeartbeatFields {\r
+  public String heartbeatFieldsVersion;\r
+  public int heartbeatInterval;\r
 \r
   public String getHeartbeatFieldsVersion() {\r
     return heartbeatFieldsVersion;\r
diff --git a/ves-agent/src/main/java/org/commscope/tr069adapter/vesagent/repository/VesDataRepository.java b/ves-agent/src/main/java/org/commscope/tr069adapter/vesagent/repository/VesDataRepository.java
new file mode 100644 (file)
index 0000000..94c76cd
--- /dev/null
@@ -0,0 +1,24 @@
+package org.commscope.tr069adapter.vesagent.repository;\r
+\r
+import java.util.List;\r
+\r
+import org.commscope.tr069adapter.vesagent.entity.DeviceDataEntity;\r
+import org.springframework.data.repository.CrudRepository;\r
+import org.springframework.stereotype.Repository;\r
+\r
+/**\r
+ * \r
+ * @version 1.0\r
+ * @since June 10, 2020\r
+ * @author Prashant Kumar\r
+ */\r
+\r
+@Repository\r
+public interface VesDataRepository extends CrudRepository<DeviceDataEntity, Long> {\r
+  public List<DeviceDataEntity> findByDeviceId(String deviceId);\r
+\r
+  public List<DeviceDataEntity> findByDeviceIdAndAttrGroup(String deviceId, String attrGroup);\r
+\r
+  public List<DeviceDataEntity> findByAttrGroup(String attrGroup);\r
+\r
+}\r
diff --git a/ves-agent/src/main/java/org/commscope/tr069adapter/vesagent/service/VesAgentServiceHelper.java b/ves-agent/src/main/java/org/commscope/tr069adapter/vesagent/service/VesAgentServiceHelper.java
new file mode 100644 (file)
index 0000000..d492a42
--- /dev/null
@@ -0,0 +1,303 @@
+package org.commscope.tr069adapter.vesagent.service;\r
+\r
+import com.google.gson.Gson;\r
+\r
+import java.util.ArrayList;\r
+import java.util.HashMap;\r
+import java.util.List;\r
+import java.util.Map;\r
+import java.util.concurrent.TimeUnit;\r
+import java.util.function.Function;\r
+\r
+import org.commscope.tr069adapter.acs.common.DeviceDetails;\r
+import org.commscope.tr069adapter.acs.common.DeviceRPCRequest;\r
+import org.commscope.tr069adapter.acs.common.ParameterDTO;\r
+import org.commscope.tr069adapter.mapper.model.VESNotification;\r
+import org.commscope.tr069adapter.vesagent.async.WaitForNotifications;\r
+import org.commscope.tr069adapter.vesagent.entity.DeviceDataEntity;\r
+import org.commscope.tr069adapter.vesagent.exception.VesAgentException;\r
+import org.commscope.tr069adapter.vesagent.repository.VesDataRepository;\r
+import org.commscope.tr069adapter.vesagent.timer.HeartBeatTimeoutTask;\r
+import org.commscope.tr069adapter.vesagent.timer.ScheduleInfo;\r
+import org.commscope.tr069adapter.vesagent.timer.ScheduleTaskService;\r
+import org.commscope.tr069adapter.vesagent.util.VesAgentConstants;\r
+import org.commscope.tr069adapter.vesagent.util.VesAgentUtils;\r
+import org.slf4j.Logger;\r
+import org.slf4j.LoggerFactory;\r
+import org.springframework.beans.factory.annotation.Autowired;\r
+import org.springframework.stereotype.Component;\r
+\r
+@Component\r
+public class VesAgentServiceHelper {\r
+  private final Logger logger = LoggerFactory.getLogger(this.getClass());\r
+\r
+  @Autowired\r
+  private Function<String, HeartBeatTimeoutTask> beanFactory;\r
+\r
+  public HeartBeatTimeoutTask getBeanInstance(String name) {\r
+    return beanFactory.apply(name);\r
+  }\r
+\r
+  @Autowired\r
+  VesDataRepository vesDataRepository;\r
+\r
+  @Autowired\r
+  WaitForNotifications waitForNotifications;\r
+\r
+  @Autowired\r
+  ScheduleTaskService timerService;\r
+\r
+  private boolean saveDeviceDataEntity(DeviceDetails deviceDetails, String eNodeBName,\r
+      String heartBeatPeriod) throws VesAgentException {\r
+\r
+    List<DeviceDataEntity> deviceDataEntityList = vesDataRepository\r
+        .findByDeviceIdAndAttrGroup(deviceDetails.getDeviceId(), VesAgentConstants.HEART_BEAT);\r
+\r
+    DeviceDataEntity deviceDataEntity = null;\r
+    Map<String, String> attrJsonMap = null;\r
+\r
+    if (null == deviceDataEntityList || deviceDataEntityList.isEmpty()) {\r
+      deviceDataEntity = new DeviceDataEntity();\r
+\r
+      deviceDataEntity.setDeviceId(deviceDetails.getDeviceId());\r
+      deviceDataEntity.seteNodeBName(eNodeBName);\r
+      deviceDataEntity.setOui(deviceDetails.getOui());\r
+      deviceDataEntity.setProductClass(deviceDetails.getProductClass());\r
+      deviceDataEntity.setAttrGroup(VesAgentConstants.HEART_BEAT);\r
+\r
+      attrJsonMap = new HashMap<>();\r
+    } else {\r
+      deviceDataEntity = deviceDataEntityList.get(0);\r
+      attrJsonMap = deviceDataEntity.getAttributesMap();\r
+    }\r
+\r
+    String existingHeartBeatPeriod = attrJsonMap.get(VesAgentConstants.HEART_BEAT_PERIOD);\r
+\r
+    if (null == heartBeatPeriod\r
+        && (Boolean.TRUE.equals(VesAgentUtils.isNullOrEmpty(existingHeartBeatPeriod))\r
+            || existingHeartBeatPeriod\r
+                .equalsIgnoreCase(VesAgentConstants.REMOVE_HEART_BEAT_TIMER_VAL))) {\r
+      return false;\r
+    }\r
+\r
+    if (!VesAgentUtils.isNullOrEmpty(heartBeatPeriod)) {\r
+      attrJsonMap.put(VesAgentConstants.HEART_BEAT_PERIOD, heartBeatPeriod);\r
+    }\r
+\r
+    deviceDataEntity.setAttributesMap(attrJsonMap);\r
+\r
+    vesDataRepository.save(deviceDataEntity);\r
+\r
+    return true;\r
+  }\r
+\r
+  public void processHeartBeatSetRequest(DeviceRPCRequest deviceRPCRequest, String heartBeatPeriod,\r
+      String countDownTimer) throws VesAgentException {\r
+\r
+    String deviceId = deviceRPCRequest.getDeviceDetails().getDeviceId();\r
+\r
+    VesAgentUtils.validateDeviceId(deviceId);\r
+\r
+    if (VesAgentUtils.isNullOrEmpty(heartBeatPeriod)\r
+        && VesAgentUtils.isNullOrEmpty(countDownTimer)) {\r
+      String errorMsg =\r
+          "Invalid input: HeartBeatPeriod and countDownTimer both are null for device " + deviceId;\r
+      logger.error(errorMsg);\r
+      throw new VesAgentException(VesAgentConstants.INVALID_PARAMETER_VALUE, errorMsg);\r
+    }\r
+\r
+    Object eNodeBNameObj = deviceRPCRequest.getContext().get(VesAgentConstants.ENODEB_NAME);\r
+\r
+    String eNodeBName = null;\r
+    if (null != eNodeBNameObj) {\r
+      eNodeBName = (String) eNodeBNameObj;\r
+    }\r
+\r
+    boolean resetTimerJob =\r
+        saveDeviceDataEntity(deviceRPCRequest.getDeviceDetails(), eNodeBName, heartBeatPeriod);\r
+\r
+    if (resetTimerJob) {\r
+      resetTimerJob(deviceId, heartBeatPeriod, countDownTimer);\r
+      abortRunningDeviceConnectivityCheck(deviceRPCRequest);\r
+    }\r
+\r
+  }\r
+\r
+  public void processHeartBeatGetRequest(DeviceRPCRequest deviceRPCRequest) {\r
+\r
+    String deviceId = deviceRPCRequest.getDeviceDetails().getDeviceId();\r
+    List<DeviceDataEntity> deviceDataEntityList =\r
+        vesDataRepository.findByDeviceIdAndAttrGroup(deviceId, VesAgentConstants.HEART_BEAT);\r
+\r
+    if (VesAgentUtils.isNullOrEmpty(deviceDataEntityList)\r
+        || VesAgentUtils.isNullOrEmpty(deviceDataEntityList.get(0).getAttributesMap())) {\r
+      return;\r
+    }\r
+\r
+    DeviceDataEntity deviceDataEntity = deviceDataEntityList.get(0);\r
+\r
+    List<ParameterDTO> resultparamDTOList = null;\r
+    List<ParameterDTO> paramDTOList = deviceRPCRequest.getOpDetails().getParmeters();\r
+\r
+    for (ParameterDTO paramDTO : paramDTOList) {\r
+      resultparamDTOList = ifDataTypeObject(paramDTO, deviceDataEntity);\r
+\r
+      if (!resultparamDTOList.isEmpty()) {\r
+        break;\r
+      }\r
+\r
+      if (paramDTO.getParamName().equalsIgnoreCase(VesAgentConstants.COUNT_DOWN_TIMER)) {\r
+        paramDTO.setParamValue(getCountDownTimerParam(deviceDataEntity).getParamValue());\r
+      } else {\r
+        paramDTO.setParamValue(deviceDataEntity.getAttributesMap().get(paramDTO.getParamName()));\r
+      }\r
+    }\r
+\r
+    if (null != resultparamDTOList && !resultparamDTOList.isEmpty()) {\r
+      deviceRPCRequest.getOpDetails().setParmeters(resultparamDTOList);\r
+    }\r
+  }\r
+\r
+  public void processHeartBeatDeleteRequest(VESNotification vesNotification) {\r
+    List<ParameterDTO> paramDTOList = vesNotification.getOperationDetails().getParmeters();\r
+\r
+    for (ParameterDTO paramDTO : paramDTOList) {\r
+      if (Boolean.TRUE.equals(VesAgentUtils.isVesNotificationRequest(paramDTO))) {\r
+        List<DeviceDataEntity> deviceDataEntityList = vesDataRepository.findByDeviceIdAndAttrGroup(\r
+            vesNotification.geteNodeBName(), VesAgentConstants.HEART_BEAT);\r
+\r
+        if (Boolean.TRUE.equals(VesAgentUtils.isNullOrEmpty(deviceDataEntityList))) {\r
+          return;\r
+        }\r
+        vesDataRepository.delete(deviceDataEntityList.get(0));\r
+        timerService.cancelSchedule(vesNotification.geteNodeBName());\r
+        break;\r
+      }\r
+    }\r
+  }\r
+\r
+  private List<ParameterDTO> ifDataTypeObject(ParameterDTO paramDTO,\r
+      DeviceDataEntity deviceDataEntity) {\r
+    List<ParameterDTO> paramDTOList = new ArrayList<>();\r
+\r
+    if (null != paramDTO.getDataType()\r
+        && paramDTO.getDataType().equalsIgnoreCase(VesAgentConstants.OBJECT_DATA_TYPE.toLowerCase())\r
+        && paramDTO.getParamName().toLowerCase()\r
+            .contains(VesAgentConstants.HEART_BEAT.toLowerCase())) {\r
+\r
+      Map<String, String> attrMap = deviceDataEntity.getAttributesMap();\r
+\r
+      for (Map.Entry<String, String> entry : attrMap.entrySet()) {\r
+        ParameterDTO param = new ParameterDTO();\r
+        param.setParamName(entry.getKey());\r
+        param.setParamValue(entry.getValue());\r
+\r
+        paramDTOList.add(param);\r
+      }\r
+\r
+      ParameterDTO countDownParam = getCountDownTimerParam(deviceDataEntity);\r
+      paramDTOList.add(countDownParam);\r
+    }\r
+\r
+    return paramDTOList;\r
+  }\r
+\r
+  private ParameterDTO getCountDownTimerParam(DeviceDataEntity deviceDataEntity) {\r
+    Long countDownTimerVal = timerService\r
+        .getTimeRemainingTillNextExecution(deviceDataEntity.getDeviceId(), TimeUnit.MINUTES);\r
+\r
+    ParameterDTO param = new ParameterDTO();\r
+    param.setParamName(VesAgentConstants.COUNT_DOWN_TIMER);\r
+\r
+    if (null != countDownTimerVal) {\r
+      param.setParamValue(countDownTimerVal.toString());\r
+    }\r
+\r
+    return param;\r
+  }\r
+\r
+\r
+  public void processHeartBeatGetRequest(String deviceId, Integer HeartBeatPeriod,\r
+      Integer countDownTimer) throws VesAgentException {\r
+    VesAgentUtils.validateDeviceId(deviceId);\r
+\r
+\r
+    if (null == HeartBeatPeriod && null == countDownTimer) {// this should just check if heartbeat\r
+                                                            // is null\r
+      String errorMsg =\r
+          "Invalid input: HeartBeatPeriod and countDownTimer both are null for device " + deviceId;\r
+      logger.error(errorMsg);\r
+      throw new VesAgentException(errorMsg);\r
+    }\r
+\r
+    List<DeviceDataEntity> deviceDataEntityList =\r
+        vesDataRepository.findByDeviceIdAndAttrGroup(deviceId, VesAgentConstants.HEART_BEAT);\r
+\r
+    DeviceDataEntity deviceDataEntity = null;\r
+    Map<String, String> attrJsonMap = null;\r
+\r
+    if (null == deviceDataEntityList || deviceDataEntityList.isEmpty()) {\r
+      deviceDataEntity = new DeviceDataEntity();\r
+      deviceDataEntity.setDeviceId(deviceId);\r
+      deviceDataEntity.setAttrGroup(VesAgentConstants.HEART_BEAT);\r
+\r
+      attrJsonMap = new HashMap<String, String>();\r
+    } else {\r
+      deviceDataEntity = deviceDataEntityList.get(0);\r
+      attrJsonMap = new Gson().fromJson(deviceDataEntity.getAttrJson(), Map.class);\r
+    }\r
+\r
+\r
+    if (null != HeartBeatPeriod) {\r
+      attrJsonMap.put(VesAgentConstants.HEART_BEAT_PERIOD, HeartBeatPeriod.toString());\r
+    }\r
+\r
+    if (null != countDownTimer) {\r
+      attrJsonMap.put(VesAgentConstants.COUNT_DOWN_TIMER, countDownTimer.toString());\r
+    }\r
+\r
+    String attrJson = new Gson().toJson(attrJsonMap);\r
+    deviceDataEntity.setAttrJson(attrJson);\r
+\r
+    vesDataRepository.save(deviceDataEntity);\r
+  }\r
+\r
+  private void resetTimerJob(String deviceId, String heartBeatPeriod, String countDownTimer) {\r
+    if (null == heartBeatPeriod || heartBeatPeriod.isEmpty()) {\r
+      scheduleTimerJob(deviceId, Integer.parseInt(countDownTimer));\r
+    } else if (heartBeatPeriod.equals(VesAgentConstants.REMOVE_HEART_BEAT_TIMER_VAL)) {\r
+      timerService.cancelSchedule(deviceId);\r
+    } else {\r
+      if (Boolean.FALSE.equals(VesAgentUtils.isNullOrEmpty(countDownTimer))) {\r
+        scheduleTimerJob(deviceId, Integer.parseInt(countDownTimer));\r
+      } else {\r
+        scheduleTimerJob(deviceId, Integer.parseInt(heartBeatPeriod));\r
+      }\r
+    }\r
+  }\r
+\r
+  private void scheduleTimerJob(String deviceId, Integer timeoutInterval) {\r
+    ScheduleInfo scheduleInfo = new ScheduleInfo();\r
+    scheduleInfo.setInterval(timeoutInterval);\r
+    scheduleInfo.setTimeUnit(TimeUnit.MINUTES);\r
+\r
+    HeartBeatTimeoutTask callbackTask = getBeanInstance(deviceId);\r
+\r
+    timerService.schedule(deviceId, scheduleInfo, callbackTask);\r
+  }\r
+\r
+  private void abortRunningDeviceConnectivityCheck(DeviceRPCRequest deviceRPCRequest) {\r
+    waitForNotifications.notifyResult(VesAgentUtils.getErrorResponse(deviceRPCRequest, null, null));\r
+  }\r
+\r
+  public List<DeviceDataEntity> getAllDeviceDataEntity() {\r
+    return (List<DeviceDataEntity>) vesDataRepository.findAll();\r
+  }\r
+\r
+  public List<DeviceDataEntity> findByDeviceIdAndGroup(String deviceId, String attrGroup) {\r
+    return vesDataRepository.findByDeviceIdAndAttrGroup(deviceId, attrGroup);\r
+  }\r
+\r
+\r
+\r
+}\r
diff --git a/ves-agent/src/main/java/org/commscope/tr069adapter/vesagent/timer/HeartBeatTimeoutTask.java b/ves-agent/src/main/java/org/commscope/tr069adapter/vesagent/timer/HeartBeatTimeoutTask.java
new file mode 100644 (file)
index 0000000..aa32275
--- /dev/null
@@ -0,0 +1,80 @@
+package org.commscope.tr069adapter.vesagent.timer;\r
+\r
+import java.util.List;\r
+import java.util.concurrent.TimeUnit;\r
+\r
+import org.commscope.tr069adapter.vesagent.VesConfiguration;\r
+import org.commscope.tr069adapter.vesagent.async.AsyncRequestHandler;\r
+import org.commscope.tr069adapter.vesagent.controller.HeartBeatMessageHandler;\r
+import org.commscope.tr069adapter.vesagent.entity.DeviceDataEntity;\r
+import org.commscope.tr069adapter.vesagent.repository.VesDataRepository;\r
+import org.commscope.tr069adapter.vesagent.util.VesAgentConstants;\r
+import org.commscope.tr069adapter.vesagent.util.VesAgentUtils;\r
+import org.slf4j.Logger;\r
+import org.slf4j.LoggerFactory;\r
+import org.springframework.beans.factory.annotation.Autowired;\r
+\r
+public class HeartBeatTimeoutTask implements Runnable {\r
+  private static final Logger logger = LoggerFactory.getLogger(HeartBeatTimeoutTask.class);\r
+\r
+  @Autowired\r
+  VesDataRepository vesDataRepository;\r
+\r
+  @Autowired\r
+  ScheduleTaskService timerService;\r
+\r
+  @Autowired\r
+  AsyncRequestHandler asyncHandler;\r
+\r
+  @Autowired\r
+  HeartBeatMessageHandler heartBeatMessageHandler;\r
+\r
+  @Autowired\r
+  VesConfiguration config;\r
+\r
+  private String deviceId;\r
+\r
+  @Override\r
+  public void run() {\r
+    logger.debug("Timer task: checking device {} connectivity.", deviceId);\r
+    List<DeviceDataEntity> deviceDataEntityList =\r
+        vesDataRepository.findByDeviceIdAndAttrGroup(deviceId, VesAgentConstants.HEART_BEAT);\r
+\r
+    if (VesAgentUtils.isNullOrEmpty(deviceDataEntityList)\r
+        || VesAgentUtils.isNullOrEmpty(deviceDataEntityList.get(0).getAttributesMap())) {\r
+      timerService.cancelSchedule(deviceId);\r
+      return;\r
+    }\r
+\r
+    DeviceDataEntity deviceDataEntity = deviceDataEntityList.get(0);\r
+    String heartBeatPeriod =\r
+        deviceDataEntity.getAttributesMap().get(VesAgentConstants.HEART_BEAT_PERIOD);\r
+\r
+    if (VesAgentUtils.isNullOrEmpty(heartBeatPeriod)\r
+        || heartBeatPeriod.equals(VesAgentConstants.REMOVE_HEART_BEAT_TIMER_VAL)) {\r
+      timerService.cancelSchedule(deviceId);\r
+      return;\r
+    }\r
+\r
+    ScheduleInfo scheduleInfo = new ScheduleInfo();\r
+    scheduleInfo.setInterval(Integer.parseInt(heartBeatPeriod));\r
+    scheduleInfo.setTimeUnit(TimeUnit.MINUTES);\r
+\r
+    timerService.schedule(deviceId, scheduleInfo, this);\r
+\r
+    asyncHandler.initiateDeviceReachabilityCheck(deviceDataEntity);\r
+  }\r
+\r
+  public HeartBeatTimeoutTask(String deviceId) {\r
+    super();\r
+    this.deviceId = deviceId;\r
+  }\r
+\r
+  public String getDeviceId() {\r
+    return deviceId;\r
+  }\r
+\r
+  public void setDeviceId(String deviceId) {\r
+    this.deviceId = deviceId;\r
+  }\r
+}\r
diff --git a/ves-agent/src/main/java/org/commscope/tr069adapter/vesagent/timer/ScheduleConfig.java b/ves-agent/src/main/java/org/commscope/tr069adapter/vesagent/timer/ScheduleConfig.java
new file mode 100644 (file)
index 0000000..c1ca695
--- /dev/null
@@ -0,0 +1,24 @@
+package org.commscope.tr069adapter.vesagent.timer;\r
+\r
+import org.springframework.context.annotation.Bean;\r
+import org.springframework.context.annotation.Configuration;\r
+import org.springframework.scheduling.TaskScheduler;\r
+import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;\r
+\r
+/**\r
+ * \r
+ * @version 1.0\r
+ * @since June 5, 2020\r
+ * @author Prashant Kumar\r
+ */\r
+\r
+@Configuration\r
+public class ScheduleConfig {\r
+  @Bean\r
+  public TaskScheduler taskScheduler() {\r
+    final ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();\r
+    scheduler.setPoolSize(10);\r
+    scheduler.setThreadNamePrefix("scheduled-task-pool-");\r
+    return scheduler;\r
+  }\r
+}\r
diff --git a/ves-agent/src/main/java/org/commscope/tr069adapter/vesagent/timer/ScheduleInfo.java b/ves-agent/src/main/java/org/commscope/tr069adapter/vesagent/timer/ScheduleInfo.java
new file mode 100644 (file)
index 0000000..0cb4551
--- /dev/null
@@ -0,0 +1,32 @@
+package org.commscope.tr069adapter.vesagent.timer;\r
+\r
+import java.util.concurrent.TimeUnit;\r
+\r
+/**\r
+ * \r
+ * @version 1.0\r
+ * @since June 5, 2020\r
+ * @author Prashant Kumar\r
+ */\r
+\r
+public class ScheduleInfo {\r
+  private int interval;\r
+  private TimeUnit timeUnit;\r
+\r
+  public int getInterval() {\r
+    return interval;\r
+  }\r
+\r
+  public void setInterval(int interval) {\r
+    this.interval = interval;\r
+  }\r
+\r
+  public TimeUnit getTimeUnit() {\r
+    return timeUnit;\r
+  }\r
+\r
+  public void setTimeUnit(TimeUnit timeUnit) {\r
+    this.timeUnit = timeUnit;\r
+  }\r
+\r
+}\r
diff --git a/ves-agent/src/main/java/org/commscope/tr069adapter/vesagent/timer/ScheduleTaskService.java b/ves-agent/src/main/java/org/commscope/tr069adapter/vesagent/timer/ScheduleTaskService.java
new file mode 100644 (file)
index 0000000..aa2d6c6
--- /dev/null
@@ -0,0 +1,66 @@
+package org.commscope.tr069adapter.vesagent.timer;\r
+\r
+import java.util.HashMap;\r
+import java.util.Map;\r
+import java.util.concurrent.ScheduledFuture;\r
+import java.util.concurrent.TimeUnit;\r
+\r
+import org.springframework.beans.factory.annotation.Autowired;\r
+import org.springframework.scheduling.TaskScheduler;\r
+import org.springframework.scheduling.annotation.EnableScheduling;\r
+import org.springframework.scheduling.support.PeriodicTrigger;\r
+import org.springframework.stereotype.Service;\r
+\r
+/**\r
+ * \r
+ * @version 1.0\r
+ * @since June 5, 2020\r
+ * @author Prashant Kumar\r
+ */\r
+\r
+@Service\r
+@EnableScheduling\r
+public class ScheduleTaskService {\r
+\r
+  @Autowired\r
+  TaskScheduler scheduler;\r
+\r
+  Map<String, ScheduledFuture<?>> jobsMap = new HashMap<>();\r
+\r
+  public ScheduleTaskService(TaskScheduler scheduler) {\r
+    this.scheduler = scheduler;\r
+  }\r
+\r
+  public void schedule(String jobId, ScheduleInfo scheduleInfo, Runnable callBackTask) {\r
+    cancelSchedule(jobId);\r
+\r
+    PeriodicTrigger trigger =\r
+        new PeriodicTrigger(scheduleInfo.getInterval(), scheduleInfo.getTimeUnit());\r
+    trigger.setInitialDelay(scheduleInfo.getInterval());\r
+\r
+    ScheduledFuture<?> scheduledTask = scheduler.schedule(callBackTask, trigger);\r
+    jobsMap.put(jobId, scheduledTask);\r
+  }\r
+\r
+  public void cancelSchedule(String id) {\r
+    ScheduledFuture<?> scheduledTask = jobsMap.get(id);\r
+    if (scheduledTask != null) {\r
+      scheduledTask.cancel(true);\r
+      jobsMap.remove(id);\r
+    }\r
+  }\r
+\r
+  public ScheduledFuture<?> getSchedule(String id) {\r
+    return jobsMap.get(id);\r
+  }\r
+\r
+  public Long getTimeRemainingTillNextExecution(String id, TimeUnit timeUnit) {\r
+    ScheduledFuture<?> scheduledTask = jobsMap.get(id);\r
+\r
+    if (scheduledTask != null) {\r
+      return scheduledTask.getDelay(timeUnit);\r
+    } else {\r
+      return null;\r
+    }\r
+  }\r
+}\r
diff --git a/ves-agent/src/main/java/org/commscope/tr069adapter/vesagent/timer/ServiceConfig.java b/ves-agent/src/main/java/org/commscope/tr069adapter/vesagent/timer/ServiceConfig.java
new file mode 100644 (file)
index 0000000..7b2d227
--- /dev/null
@@ -0,0 +1,28 @@
+package org.commscope.tr069adapter.vesagent.timer;\r
+\r
+import java.util.function.Function;\r
+\r
+import org.springframework.context.annotation.Bean;\r
+import org.springframework.context.annotation.Configuration;\r
+import org.springframework.context.annotation.Scope;\r
+\r
+/**\r
+ * \r
+ * @version 1.0\r
+ * @since June 5, 2020\r
+ * @author Prashant Kumar\r
+ */\r
+\r
+@Configuration\r
+public class ServiceConfig {\r
+  @Bean\r
+  public Function<String, HeartBeatTimeoutTask> myPrototypeFactory() {\r
+    return arg -> getBeanInstance(arg);\r
+  }\r
+\r
+  @Bean\r
+  @Scope(value = "prototype")\r
+  public HeartBeatTimeoutTask getBeanInstance(String arg) {\r
+    return new HeartBeatTimeoutTask(arg);\r
+  }\r
+}\r
diff --git a/ves-agent/src/main/java/org/commscope/tr069adapter/vesagent/timer/StartupTimerService.java b/ves-agent/src/main/java/org/commscope/tr069adapter/vesagent/timer/StartupTimerService.java
new file mode 100644 (file)
index 0000000..8702d47
--- /dev/null
@@ -0,0 +1,68 @@
+package org.commscope.tr069adapter.vesagent.timer;\r
+\r
+import java.util.List;\r
+import java.util.concurrent.TimeUnit;\r
+import java.util.function.Function;\r
+\r
+import javax.annotation.PostConstruct;\r
+\r
+import org.commscope.tr069adapter.vesagent.entity.DeviceDataEntity;\r
+import org.commscope.tr069adapter.vesagent.repository.VesDataRepository;\r
+import org.commscope.tr069adapter.vesagent.util.VesAgentConstants;\r
+import org.commscope.tr069adapter.vesagent.util.VesAgentUtils;\r
+import org.slf4j.Logger;\r
+import org.slf4j.LoggerFactory;\r
+import org.springframework.beans.factory.annotation.Autowired;\r
+import org.springframework.stereotype.Component;\r
+\r
+@Component\r
+public class StartupTimerService {\r
+  private static final Logger logger = LoggerFactory.getLogger(StartupTimerService.class);\r
+\r
+  @Autowired\r
+  private Function<String, HeartBeatTimeoutTask> beanFactory;\r
+\r
+  public HeartBeatTimeoutTask getBeanInstance(String name) {\r
+    return beanFactory.apply(name);\r
+  }\r
+\r
+  @Autowired\r
+  VesDataRepository vesDataRepository;\r
+\r
+  @Autowired\r
+  ScheduleTaskService timerService;\r
+\r
+  @PostConstruct\r
+  public void initializeDeviceReachabilityCheckTimers() {\r
+    logger.debug("Initializing all device connectivity check timer tasks.");\r
+    List<DeviceDataEntity> deviceDataEntityList =\r
+        vesDataRepository.findByAttrGroup(VesAgentConstants.HEART_BEAT);\r
+\r
+    if (VesAgentUtils.isNullOrEmpty(deviceDataEntityList)) {\r
+      logger.debug("No device reachability check timer tasks exist.");\r
+      return;\r
+    }\r
+\r
+    for (DeviceDataEntity deviceDataEntity : deviceDataEntityList) {\r
+      String heartBeatPeriod = null;\r
+\r
+      if (null != deviceDataEntity.getAttributesMap()) {\r
+        heartBeatPeriod =\r
+            deviceDataEntity.getAttributesMap().get(VesAgentConstants.HEART_BEAT_PERIOD);\r
+      }\r
+\r
+      if (!VesAgentUtils.isNullOrEmpty(heartBeatPeriod)\r
+          && !heartBeatPeriod.equals(VesAgentConstants.REMOVE_HEART_BEAT_TIMER_VAL)) {\r
+        logger.info("Creating device connectivity check timer tasks for device {}.",\r
+            deviceDataEntity.getDeviceId());\r
+        ScheduleInfo scheduleInfo = new ScheduleInfo();\r
+        scheduleInfo.setInterval(Integer.parseInt(heartBeatPeriod));\r
+        scheduleInfo.setTimeUnit(TimeUnit.SECONDS);\r
+\r
+        HeartBeatTimeoutTask callbackTask = getBeanInstance(deviceDataEntity.getDeviceId());\r
+\r
+        timerService.schedule(deviceDataEntity.getDeviceId(), scheduleInfo, callbackTask);\r
+      }\r
+    }\r
+  }\r
+}\r
diff --git a/ves-agent/src/main/java/org/commscope/tr069adapter/vesagent/util/EventUtil.java b/ves-agent/src/main/java/org/commscope/tr069adapter/vesagent/util/EventUtil.java
new file mode 100644 (file)
index 0000000..217b2bc
--- /dev/null
@@ -0,0 +1,41 @@
+package org.commscope.tr069adapter.vesagent.util;\r
+\r
+import org.commscope.tr069adapter.acs.common.DeviceInform;\r
+import org.commscope.tr069adapter.vesagent.VesConfiguration;\r
+import org.commscope.tr069adapter.vesagent.model.CommonEventHeader;\r
+\r
+public class EventUtil {\r
+  private EventUtil() {\r
+\r
+  }\r
+\r
+  public static void populateEventHeaderFields(CommonEventHeader eventHeader,\r
+      DeviceInform notification, String eNodeBName, VesConfiguration config) {\r
+    eventHeader.setLastEpochMicrosec(System.currentTimeMillis());\r
+    eventHeader.setSequence(0);\r
+    populateEnodeBName(eventHeader, notification, eNodeBName);\r
+\r
+    eventHeader.setStartEpochMicrosec(System.currentTimeMillis());\r
+    eventHeader.setVersion(config.getEventVersion());\r
+    eventHeader.setNfNamingCode("");\r
+    eventHeader.setNfcNamingCode("");\r
+    eventHeader.setNfVendorName(config.getVendorName());\r
+    eventHeader.setVesEventListenerVersion(config.getVesVersion());\r
+  }\r
+\r
+  public static void populateEnodeBName(CommonEventHeader eventHeader, DeviceInform notification,\r
+      String eNodeBName) {\r
+    if (eNodeBName == null) {\r
+      eventHeader.setReportingEntityName(notification.getDeviceDetails().getDeviceId());\r
+      eventHeader.setReportingEntityId(notification.getDeviceDetails().getDeviceId());\r
+      eventHeader.setSourceId(notification.getDeviceDetails().getDeviceId());\r
+      eventHeader.setSourceName(notification.getDeviceDetails().getDeviceId());\r
+    } else {\r
+      eventHeader.setReportingEntityName(eNodeBName);\r
+      eventHeader.setSourceName(eNodeBName);\r
+      eventHeader.setReportingEntityId(notification.getDeviceDetails().getDeviceId());\r
+      eventHeader.setSourceId(notification.getDeviceDetails().getDeviceId());\r
+    }\r
+  }\r
+\r
+}\r
diff --git a/ves-agent/src/main/java/org/commscope/tr069adapter/vesagent/util/VesAgentConstants.java b/ves-agent/src/main/java/org/commscope/tr069adapter/vesagent/util/VesAgentConstants.java
new file mode 100644 (file)
index 0000000..3c45381
--- /dev/null
@@ -0,0 +1,34 @@
+package org.commscope.tr069adapter.vesagent.util;\r
+\r
+/**\r
+ * \r
+ * @version 1.0\r
+ * @since June 5, 2020\r
+ * @author Prashant Kumar\r
+ */\r
+\r
+public class VesAgentConstants {\r
+\r
+  public static final String HEART_BEAT = "heartbeat";\r
+\r
+  public static final String HEART_BEAT_PERIOD = "heartbeat.heartbeatPeriod";\r
+  public static final String HEART_BEAT_PERIOD_DEFAULT_VAL = "5"; // IN MIUTES\r
+\r
+  public static final String COUNT_DOWN_TIMER = "heartbeat.countDownTimer";\r
+\r
+  public static final String ENODEB_NAME = "ENODEB_NAME";\r
+\r
+  public static final String OBJECT_DATA_TYPE = "object";\r
+\r
+  public static final String REMOVE_HEART_BEAT_TIMER_VAL = "0";\r
+  public static final int DEVICE_IS_REACHABLE = 100;\r
+  public static final String ABORTED_BY_BOOT_BOOTSTRAP = "8002";\r
+\r
+  public static final int RPC_SUCCESS = 0;\r
+  public static final int RPC_FAILED = 1;\r
+  public static final String INVALID_ARGUMENTS = "9003";\r
+  public static final String INVALID_PARAMETER_NAME = "9005";\r
+  public static final String INVALID_PARAMETER_VALUE = "9007";\r
+\r
+\r
+}\r
diff --git a/ves-agent/src/main/java/org/commscope/tr069adapter/vesagent/util/VesAgentUtils.java b/ves-agent/src/main/java/org/commscope/tr069adapter/vesagent/util/VesAgentUtils.java
new file mode 100644 (file)
index 0000000..fc1128d
--- /dev/null
@@ -0,0 +1,168 @@
+package org.commscope.tr069adapter.vesagent.util;\r
+\r
+import java.util.List;\r
+import java.util.Map;\r
+\r
+import org.apache.commons.logging.Log;\r
+import org.apache.commons.logging.LogFactory;\r
+import org.commscope.tr069adapter.acs.common.DeviceRPCRequest;\r
+import org.commscope.tr069adapter.acs.common.DeviceRPCResponse;\r
+import org.commscope.tr069adapter.acs.common.OperationCode;\r
+import org.commscope.tr069adapter.acs.common.OperationResponse;\r
+import org.commscope.tr069adapter.acs.common.ParameterDTO;\r
+import org.commscope.tr069adapter.mapper.model.VESNotification;\r
+import org.commscope.tr069adapter.vesagent.exception.VesAgentException;\r
+\r
+\r
+public class VesAgentUtils {\r
+  private static final Log logger = LogFactory.getLog(VesAgentUtils.class);\r
+\r
+  private static String errorMsg = null;\r
+\r
+  public static boolean isNullOrEmpty(String object) {\r
+    return (null == object || object.isEmpty());\r
+  }\r
+\r
+  public static Boolean isNullOrEmpty(List list) {\r
+    return (null == list || list.isEmpty());\r
+  }\r
+\r
+  public static Boolean isNullOrEmpty(Map map) {\r
+    return (null == map || map.isEmpty());\r
+  }\r
+\r
+  public static void validateDeviceId(String deviceId) throws VesAgentException {\r
+    if (null == deviceId || deviceId.isEmpty()) {\r
+      errorMsg = "Error: deviceId in request is null or empty";\r
+      logger.error(errorMsg);\r
+      throw new VesAgentException(errorMsg);\r
+    }\r
+  }\r
+\r
+  public static void validateHeartBeatPeriod(Integer heartBeatPeriod) throws VesAgentException {\r
+    if (null == heartBeatPeriod) {\r
+      errorMsg = "Error: heartBeatPeriod in request is null or empty";\r
+      logger.error(errorMsg);\r
+      throw new VesAgentException(errorMsg);\r
+    }\r
+  }\r
+\r
+\r
+  public static void validateCountDownTimer(Integer countDownTimer) throws VesAgentException {\r
+    if (null == countDownTimer) {\r
+      errorMsg = "Error: countDownTimer in request is null or empty";\r
+      logger.error(errorMsg);\r
+      throw new VesAgentException(errorMsg);\r
+    }\r
+  }\r
+\r
+  public static void validateDeviceRPCRequest(DeviceRPCRequest deviceRPCRequest)\r
+      throws VesAgentException {\r
+    if (null == deviceRPCRequest || null == deviceRPCRequest.getOpDetails()\r
+        || null == deviceRPCRequest.getOpDetails().getParmeters()\r
+        || deviceRPCRequest.getOpDetails().getParmeters().isEmpty()) {\r
+      errorMsg = "Error: Input parameter list is null or empty";\r
+      logger.error(errorMsg);\r
+      throw new VesAgentException(VesAgentConstants.INVALID_ARGUMENTS, errorMsg);\r
+    }\r
+\r
+    if (null == deviceRPCRequest.getDeviceDetails()\r
+        || null == deviceRPCRequest.getDeviceDetails().getDeviceId()\r
+        || deviceRPCRequest.getDeviceDetails().getDeviceId().isEmpty()) {\r
+      errorMsg = "Error: Input deviceId is null or empty";\r
+      logger.error(errorMsg);\r
+      throw new VesAgentException(VesAgentConstants.INVALID_ARGUMENTS, errorMsg);\r
+    }\r
+  }\r
+\r
+  public static void validateVESNotification(VESNotification notification)\r
+      throws VesAgentException {\r
+    if (null == notification || null == notification.getDevnotification()\r
+        || null == notification.getDevnotification().getDeviceDetails()\r
+        || null == notification.getDevnotification().getDeviceDetails().getDeviceId()\r
+        || notification.getDevnotification().getDeviceDetails().getDeviceId().isEmpty()) {\r
+\r
+      errorMsg = "Error: Input device details is null or empty";\r
+      logger.error(errorMsg);\r
+      throw new VesAgentException(VesAgentConstants.INVALID_ARGUMENTS, errorMsg);\r
+    }\r
+  }\r
+\r
+  public static void validateDelVESNotification(VESNotification notification)\r
+      throws VesAgentException {\r
+    if (null == notification || null == notification.getOperationDetails()\r
+        || null == notification.getOperationDetails().getParmeters()\r
+        || notification.getOperationDetails().getParmeters().isEmpty()) {\r
+      errorMsg = "Error: Input parameter list is null or empty";\r
+      logger.error(errorMsg);\r
+      throw new VesAgentException(VesAgentConstants.INVALID_ARGUMENTS, errorMsg);\r
+    }\r
+\r
+    if (null == notification.geteNodeBName() || notification.geteNodeBName().isEmpty()) {\r
+      errorMsg = "Error: Input deviceId/enodeBName is null or empty";\r
+      logger.error(errorMsg);\r
+      throw new VesAgentException(VesAgentConstants.INVALID_ARGUMENTS, errorMsg);\r
+    }\r
+  }\r
+\r
+\r
+  public static DeviceRPCResponse getErrorResponse(DeviceRPCRequest deviceRPCRequest,\r
+      String faultCode, String faultMessage) {\r
+    DeviceRPCResponse errorResponse = new DeviceRPCResponse();\r
+\r
+    errorResponse.setDeviceDetails(deviceRPCRequest.getDeviceDetails());\r
+\r
+    OperationResponse operationResponse = new OperationResponse();\r
+    operationResponse.setStatus(VesAgentConstants.RPC_FAILED);// device reachable...change value 1\r
+                                                              // to some constant or enum\r
+    operationResponse.setOperationCode(deviceRPCRequest.getOpDetails().getOpCode());\r
+\r
+    errorResponse.setOperationResponse(operationResponse);\r
+    errorResponse.setFaultKey(faultCode);\r
+    errorResponse.setFaultString(faultMessage);\r
+\r
+    return errorResponse;\r
+  }\r
+\r
+  public static DeviceRPCResponse getSuccessResponse(DeviceRPCRequest deviceRPCRequest) {\r
+    DeviceRPCResponse response = new DeviceRPCResponse();\r
+\r
+    response.setDeviceDetails(deviceRPCRequest.getDeviceDetails());\r
+\r
+    OperationResponse operationResponse = new OperationResponse();\r
+    operationResponse.setStatus(VesAgentConstants.RPC_SUCCESS);\r
+    operationResponse.setOperationCode(deviceRPCRequest.getOpDetails().getOpCode());\r
+    operationResponse.setParameterDTOs(deviceRPCRequest.getOpDetails().getParmeters());\r
+\r
+    response.setOperationResponse(operationResponse);\r
+    return response;\r
+  }\r
+\r
+  public static boolean isDeviceReachable(DeviceRPCResponse deviceRPCResponse) {\r
+    if (null == deviceRPCResponse || null == deviceRPCResponse.getOperationResponse()) {\r
+      return false;\r
+    }\r
+\r
+    if (deviceRPCResponse.getOperationResponse()\r
+        .getStatus() == VesAgentConstants.DEVICE_IS_REACHABLE) {\r
+      return true;\r
+    }\r
+\r
+    return (null != deviceRPCResponse.getFaultKey() && deviceRPCResponse.getFaultKey()\r
+        .equalsIgnoreCase(VesAgentConstants.ABORTED_BY_BOOT_BOOTSTRAP));\r
+  }\r
+\r
+  public static Boolean isVesNotificationRequest(ParameterDTO param) {\r
+    if (null == param.getParamName() || param.getParamName().isEmpty()) {\r
+      return false;\r
+    }\r
+\r
+    return param.getParamName().toLowerCase().contains(VesAgentConstants.HEART_BEAT.toLowerCase());\r
+  }\r
+\r
+\r
+  public static String getDeviceOperationKey(String deviceId, OperationCode opCode) {\r
+    return deviceId + "-" + opCode;\r
+  }\r
+\r
+}\r
index b4827c2..ea43f9b 100644 (file)
 # Spring boot application properties\r
 spring.application.name=${CONFIG_MAP_NAME}\r
 spring.cloud.kubernetes.config.namespace=${CONFIG_NAME_SPACE}\r
-spring.cloud.kubernetes.reload.enabled=true\r
-management.endpoint.restart.enabled=true\r
+spring.cloud.kubernetes.reload.enabled=${CONFIG_MAP_ENABLE}\r
+management.endpoint.restart.enabled=${CONFIG_MAP_ENABLE}\r
 spring.cloud.kubernetes.reload.strategy=refresh\r
-management.endpoint.refresh.enabled=true\r
+management.endpoint.refresh.enabled=${CONFIG_MAP_ENABLE}\r
 spring.cloud.kubernetes.reload.mode=polling\r
 spring.cloud.kubernetes.reload.period=${CONFIG_RELOAD_TIME}\r
 #spring.cloud.kubernetes.reload.monitoring-config-maps=true\r
 server.port=${VES_REST_PORT}\r
+config.requestTimeout=120\r
 config.vendorName=${vendorName}\r
 config.vesVersion=7.0.1\r
 config.eventVersion=4.0.1\r
@@ -40,4 +41,14 @@ config.pnfregvesCollectorHost=${pnfregvesCollectorHost}
 config.pnfregvesCollectorPort=${pnfregvesCollectorPort}\r
 config.unitFamily=${unitFamily}\r
 config.unitType=${unitType}\r
-config.faultEventSourcePrefix=${faultEventSourcePrefix}
\ No newline at end of file
+config.faultEventSourcePrefix=${faultEventSourcePrefix}\r
+config.MapperPath=http://${MAPPER_REST_HOST}:${MAPPER_REST_PORT}/tr069MapperVesNBI/checkDeviceConnectivity/\r
+\r
+spring.datasource.username=${DB_USERNAME}\r
+spring.datasource.password=${DB_PASSWORD}\r
+spring.datasource.url=jdbc:mariadb://${DB_SERVICE}:3306/${DB_NAME}\r
+spring.datasource.driver-class-name=org.mariadb.jdbc.Driver\r
+spring.datasource.platform=mariadb\r
+spring.datasource.initialization-mode=always\r
+spring.jpa.show-sql=true\r
+spring.jpa.hibernate.ddl-auto=none
\ No newline at end of file
index 4dcef81..3ce4544 100644 (file)
@@ -1,26 +1,26 @@
-<?xml version="1.0" encoding="UTF-8"?>\r
-<!--\r
-/*\r
- * ============LICENSE_START========================================================================\r
- * ONAP : tr-069-adapter\r
- * =================================================================================================\r
- * Copyright (C) 2020 CommScope Inc Intellectual Property.\r
- * =================================================================================================\r
- * This tr-069-adapter software file is distributed by CommScope Inc\r
- * under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- * http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * This file is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- * ===============LICENSE_END=======================================================================\r
-*/\r
--->\r
-\r
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+ * ============LICENSE_START========================================================================
+ * ONAP : tr-069-adapter
+ * =================================================================================================
+ * Copyright (C) 2020 CommScope Inc Intellectual Property.
+ * =================================================================================================
+ * This tr-069-adapter software file is distributed by CommScope Inc
+ * 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
+ *
+ * This file 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.
+ * ===============LICENSE_END=======================================================================
+*/
+-->
+
 <Configuration status="DEBUG" monitorInterval="30">\r
     <Properties>\r
         <Property name="LOG_PATTERN">%d{yyyy-MM-dd HH:mm:ss} %m%n</Property>\r
     <Loggers>\r
        <Logger name="org.commscope.tr069adapter" level="debug" additivity="false">\r
                <appender-ref ref="console"/>\r
-               <appender-ref ref="applicationLog"/>\r
-       </Logger>\r
-       \r
-       <Logger name="org" level="debug" additivity="false">\r
-               <appender-ref ref="console"/>\r
+                       <appender-ref ref="applicationLog"/>\r
+               </Logger>\r
+               \r
+               <Logger name="org" level="debug" additivity="false">\r
+                       <appender-ref ref="console"/>\r
             <AppenderRef ref="thirdPartyLog" />\r
         </Logger>\r
-       \r
-       <Logger name="org.springframework" level="debug" additivity="false">\r
-               <appender-ref ref="console"/>\r
+               \r
+               <Logger name="org.springframework" level="debug" additivity="false">\r
+                       <appender-ref ref="console"/>\r
             <AppenderRef ref="springLog" />\r
         </Logger>\r
         \r
         <Root level="DEBUG" additivity="false"/>\r
     </Loggers>\r
-</Configuration>\r
+</Configuration>
diff --git a/ves-agent/src/main/resources/schema-mariadb.sql b/ves-agent/src/main/resources/schema-mariadb.sql
new file mode 100644 (file)
index 0000000..3540aad
--- /dev/null
@@ -0,0 +1,15 @@
+\r
+CREATE TABLE IF NOT EXISTS ves_device_data \r
+       (\r
+       ID bigint null,\r
+       DEVICE_ID varchar(30) not null,\r
+       ENODEB_NAME varchar(100),\r
+       OUI varchar(30),\r
+       PRODUCT_CLASS varchar(100),\r
+       ATTR_JSON varchar(4000),\r
+       ATTR_GROUP varchar(256) not null,\r
+       LAST_UPDATED_TIME TIMESTAMP DEFAULT CURRENT_TIMESTAMP,\r
+       UNIQUE(DEVICE_ID,ATTR_GROUP)\r
+);\r
+\r
+\r
index f44ff94..b68b1b5 100644 (file)
@@ -28,7 +28,6 @@ import org.commscope.tr069adapter.acs.common.InformType;
 import org.commscope.tr069adapter.acs.common.ParameterDTO;\r
 import org.commscope.tr069adapter.acs.common.dto.TR069InformType;\r
 import org.commscope.tr069adapter.acs.common.inform.BootstrapInform;\r
-import org.commscope.tr069adapter.acs.common.inform.PeriodicInform;\r
 import org.commscope.tr069adapter.acs.common.inform.ValueChangeInform;\r
 import org.commscope.tr069adapter.mapper.model.NetConfServerDetails;\r
 import org.commscope.tr069adapter.mapper.model.VESNotification;\r
@@ -209,58 +208,35 @@ public class VESAgentServiceRestTest {
     }\r
   }\r
 \r
-  @Test\r
-  public void processHBEventTest() {\r
-    try {\r
-      VESNotificationResponse res =\r
-          new VESNotificationResponse(HttpStatus.ACCEPTED.value(), "Sucess");\r
-      Mockito.when(sender.postRequest(Mockito.anyString(), Mockito.anyString())).thenReturn(res);\r
-      VESNotification ves = new VESNotification();\r
-      ves.seteNodeBName("0005B9A1");\r
-      ves.setNetconfDetails(getNetConfDetails());\r
-      DeviceInform inform = new PeriodicInform();\r
-      inform.setDeviceDetails(getDeviceDetails());\r
-      ArrayList<InformType> list = new ArrayList<>();\r
-      list.add(TR069InformType.PERIODIC);\r
-      inform.setInformTypeList(list);\r
-      inform.setParameters(getGeneralParams());\r
-      ves.setDevnotification(inform);\r
-\r
-      VESNotificationResponse vesResponse = agent.processDeviceNotificationAsVESEvent(ves);\r
-      Assert.assertNotNull(vesResponse);\r
-      Assert.assertEquals(HttpStatus.ACCEPTED.value(), vesResponse.getStatusCode());\r
-      res.getStatusCode();\r
-    } catch (Exception e) {\r
-      e.printStackTrace();\r
-    }\r
-  }\r
-\r
-  @Test\r
-  public void processHBEventWhenEnbNullTest() {\r
-    try {\r
-      VESNotificationResponse res =\r
-          new VESNotificationResponse(HttpStatus.ACCEPTED.value(), "Sucess");\r
-      Mockito.when(sender.postRequest(Mockito.anyString(), Mockito.anyString())).thenReturn(res);\r
-      VESNotification ves = new VESNotification();\r
-      ves.seteNodeBName(null);\r
-      ves.setNetconfDetails(getNetConfDetails());\r
-      DeviceInform inform = new PeriodicInform();\r
-      inform.setDeviceDetails(getDeviceDetails());\r
-      ArrayList<InformType> list = new ArrayList<>();\r
-      list.add(TR069InformType.PERIODIC);\r
-      inform.setInformTypeList(list);\r
-      inform.setParameters(getGeneralParams());\r
-      ves.setDevnotification(inform);\r
-\r
-      VESNotificationResponse vesResponse = agent.processDeviceNotificationAsVESEvent(ves);\r
-      Assert.assertNotNull(vesResponse);\r
-      Assert.assertEquals(HttpStatus.ACCEPTED.value(), vesResponse.getStatusCode());\r
-      res.getStatusCode();\r
-    } catch (Exception e) {\r
-      e.printStackTrace();\r
-    }\r
-  }\r
-\r
+  /*\r
+   * @Test public void processHBEventTest() { try { VESNotificationResponse res = new\r
+   * VESNotificationResponse(HttpStatus.ACCEPTED.value(), "Sucess");\r
+   * Mockito.when(sender.postRequest(Mockito.anyString(), Mockito.anyString())).thenReturn(res);\r
+   * VESNotification ves = new VESNotification(); ves.seteNodeBName("0005B9A1");\r
+   * ves.setNetconfDetails(getNetConfDetails()); DeviceInform inform = new PeriodicInform();\r
+   * inform.setDeviceDetails(getDeviceDetails()); ArrayList<InformType> list = new ArrayList<>();\r
+   * list.add(TR069InformType.PERIODIC); inform.setInformTypeList(list);\r
+   * inform.setParameters(getGeneralParams()); ves.setDevnotification(inform);\r
+   * \r
+   * VESNotificationResponse vesResponse = agent.processDeviceNotificationAsVESEvent(ves);\r
+   * Assert.assertNotNull(vesResponse); Assert.assertEquals(HttpStatus.ACCEPTED.value(),\r
+   * vesResponse.getStatusCode()); res.getStatusCode(); } catch (Exception e) { e.printStackTrace();\r
+   * } }\r
+   * \r
+   * @Test public void processHBEventWhenEnbNullTest() { try { VESNotificationResponse res = new\r
+   * VESNotificationResponse(HttpStatus.ACCEPTED.value(), "Sucess");\r
+   * Mockito.when(sender.postRequest(Mockito.anyString(), Mockito.anyString())).thenReturn(res);\r
+   * VESNotification ves = new VESNotification(); ves.seteNodeBName(null);\r
+   * ves.setNetconfDetails(getNetConfDetails()); DeviceInform inform = new PeriodicInform();\r
+   * inform.setDeviceDetails(getDeviceDetails()); ArrayList<InformType> list = new ArrayList<>();\r
+   * list.add(TR069InformType.PERIODIC); inform.setInformTypeList(list);\r
+   * inform.setParameters(getGeneralParams()); ves.setDevnotification(inform);\r
+   * \r
+   * VESNotificationResponse vesResponse = agent.processDeviceNotificationAsVESEvent(ves);\r
+   * Assert.assertNotNull(vesResponse); Assert.assertEquals(HttpStatus.ACCEPTED.value(),\r
+   * vesResponse.getStatusCode()); res.getStatusCode(); } catch (Exception e) { e.printStackTrace();\r
+   * } }\r
+   */\r
   @Test\r
   public void processOnRestartEventTest() {\r
     try {\r
index d75fe21..2336e79 100644 (file)
@@ -40,4 +40,14 @@ config.pnfregvesCollectorHost=10.211.5.55
 config.pnfregvesCollectorPort=30325\r
 config.unitFamily=ORAN\r
 config.unitType=TR069\r
-config.faultEventSourcePrefix=faultEventSourcePrefix
\ No newline at end of file
+config.faultEventSourcePrefix=faultEventSourcePrefix\r
+\r
+config.MapperPath=http://${MAPPER_REST_HOST}:${MAPPER_REST_PORT}/tr069MapperVesNBI/checkDeviceConnectivity/\r
+\r
+## Datasource properties\r
+spring.datasource.driver-class-name=org.h2.Driver\r
+spring.datasource.url=jdbc:h2:mem:db;DB_CLOSE_DELAY=-1\r
+spring.datasource.username=sa\r
+spring.datasource.password=sa\r
+spring.jpa.show-sql=true\r
+spring.jpa.hibernate.ddl-auto=create\r
diff --git a/ves-agent/src/test/resources/log4j2.xml b/ves-agent/src/test/resources/log4j2.xml
new file mode 100644 (file)
index 0000000..ac227c7
--- /dev/null
@@ -0,0 +1,103 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+ * ============LICENSE_START========================================================================
+ * ONAP : tr-069-adapter
+ * =================================================================================================
+ * Copyright (C) 2020 CommScope Inc Intellectual Property.
+ * =================================================================================================
+ * This tr-069-adapter software file is distributed by CommScope Inc
+ * 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
+ *
+ * This file 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.
+ * ===============LICENSE_END=======================================================================
+*/
+-->
+
+<Configuration status="DEBUG" monitorInterval="30">\r
+    <Properties>\r
+        <Property name="LOG_PATTERN">%d{yyyy-MM-dd HH:mm:ss} %m%n</Property>\r
+        <Property name="APP_LOG_ROOT">./target/test-logs</Property>\r
+    </Properties>\r
+    <Appenders>\r
+       <Console name="console" target="SYSTEM_OUT" follow="true">\r
+            <PatternLayout pattern="${LOG_PATTERN}"/>\r
+        </Console>\r
+        \r
+        <RollingFile name="applicationLog"\r
+            fileName="${APP_LOG_ROOT}/debug/application-debug.log"\r
+            filePattern="${APP_LOG_ROOT}/debug/application-debug-%d{yyyy-MM-dd}-%i.log">\r
+            <PatternLayout>\r
+               <pattern>[%d{yyyy-MM-dd HH:mm:ss:SSS}] [%X{client}] [%.-40t] %-25.45c{1} %-5p: %m%n</pattern>\r
+               <header>Debug Log started at: $${date:yyyy-MM-dd HH:mm:ss}</header>\r
+            </PatternLayout>\r
+            <Policies>\r
+                <SizeBasedTriggeringPolicy size="4MB" />\r
+                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>\r
+            </Policies>\r
+            <DefaultRolloverStrategy>\r
+                <Delete basePath="${APP_LOG_ROOT}/debug/" maxDepth="1">\r
+                    <IfFileName glob="application-debug-*.log" />\r
+                    <IfAccumulatedFileCount exceeds="10" />\r
+                </Delete>\r
+            </DefaultRolloverStrategy>\r
+        </RollingFile>\r
+  \r
+               <RollingFile name="springLog" \r
+                       fileName="${APP_LOG_ROOT}/thirdparty/spring-framework.log"\r
+            filePattern="${APP_LOG_ROOT}/thirdparty/spring-%d{yyyy-MM-dd}-%i.log">\r
+            <PatternLayout pattern="${LOG_PATTERN}"/>\r
+            <Policies>\r
+                <SizeBasedTriggeringPolicy size="4MB" />\r
+            </Policies>\r
+            <DefaultRolloverStrategy>\r
+                <Delete basePath="${APP_LOG_ROOT}/thirdparty/" maxDepth="1">\r
+                    <IfFileName glob="spring-*.log" />\r
+                    <IfAccumulatedFileCount exceeds="10" />\r
+                </Delete>\r
+            </DefaultRolloverStrategy>\r
+        </RollingFile>\r
+   \r
+       <RollingFile name="thirdPartyLog" \r
+                       fileName="${APP_LOG_ROOT}/thirdparty/third-party-framework.log"\r
+            filePattern="${APP_LOG_ROOT}/thirdparty/third-party-framework-%d{yyyy-MM-dd}-%i.log">\r
+            <PatternLayout pattern="${LOG_PATTERN}"/>\r
+            <Policies>\r
+                <SizeBasedTriggeringPolicy size="4MB" />\r
+            </Policies>\r
+            <DefaultRolloverStrategy>\r
+                <Delete basePath="${APP_LOG_ROOT}/thirdparty/" maxDepth="1">\r
+                    <IfFileName glob="third-party-framework*.log" />\r
+                    <IfAccumulatedFileCount exceeds="10" />\r
+                </Delete>\r
+            </DefaultRolloverStrategy>\r
+        </RollingFile>\r
+             \r
+    </Appenders>\r
+    \r
+    <Loggers>\r
+       <Logger name="org.commscope.tr069adapter" level="debug" additivity="false">\r
+               <appender-ref ref="console"/>\r
+                       <appender-ref ref="applicationLog"/>\r
+               </Logger>\r
+               \r
+               <Logger name="org" level="debug" additivity="false">\r
+                       <appender-ref ref="console"/>\r
+            <AppenderRef ref="thirdPartyLog" />\r
+        </Logger>\r
+               \r
+               <Logger name="org.springframework" level="debug" additivity="false">\r
+                       <appender-ref ref="console"/>\r
+            <AppenderRef ref="springLog" />\r
+        </Logger>\r
+        \r
+        <Root level="DEBUG" additivity="false"/>\r
+    </Loggers>\r
+</Configuration>