Add Get function in Netconf execution service for operational commands 71/94371/1
authorSteve Siani <alphonse.steve.siani.djissitchi@ibm.com>
Tue, 27 Aug 2019 18:58:30 +0000 (14:58 -0400)
committerSteve Siani <alphonse.steve.siani.djissitchi@ibm.com>
Tue, 27 Aug 2019 18:58:30 +0000 (14:58 -0400)
Issue-ID: CCSDK-1657
Signed-off-by: Steve Siani <alphonse.steve.siani.djissitchi@ibm.com>
Change-Id: I12b82a7f1233fce256190ec0d35a5b85ad937b7b

components/scripts/python/ccsdk_netconf/netconfclient.py
ms/blueprintsprocessor/functions/netconf-executor/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/netconf/executor/api/NetconfRpcService.kt
ms/blueprintsprocessor/functions/netconf-executor/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/netconf/executor/core/NetconfRpcServiceImpl.kt
ms/blueprintsprocessor/functions/netconf-executor/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/netconf/executor/utils/NetconfMessageUtils.kt
ms/blueprintsprocessor/functions/netconf-executor/src/test/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/netconf/executor/core/NetconfRpcServiceImplTest.kt
ms/blueprintsprocessor/functions/netconf-executor/src/test/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/netconf/executor/utils/NetconfMessageUtilsTest.kt
ms/blueprintsprocessor/functions/netconf-executor/src/test/resources/netconf-messages/get-response.xml [new file with mode: 0644]

index b3aef11..97f7300 100644 (file)
@@ -62,3 +62,10 @@ class NetconfClient:
 
     def set_execution_attribute_response_data(self, response_data):
         self.setAttribute(ATTRIBUTE_RESPONSE_DATA, response_data)
+
+    def get(self, filter_content):
+        device_response = self.netconf_rpc_client.get(filter_content)
+        return device_response
+
+    def set_execution_attribute_response_data(self, response_data):
+        self.component_function.setAttribute(ATTRIBUTE_RESPONSE_DATA, response_data)
index 60345b5..ecb6267 100644 (file)
@@ -1,5 +1,6 @@
 /*
  * Copyright © 2017-2018 AT&T Intellectual Property.
+ * Modifications Copyright (c) 2019 IBM, Bell Canada
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -139,4 +140,12 @@ interface NetconfRpcService {
      * @return Device response
      */
     fun asyncRpc(request: String, messageId: String): DeviceResponse
+
+    /**
+     * Get
+     *
+     * @param filter filter content for operational command
+     * @return Device response
+     */
+    fun get(filter: String): DeviceResponse
 }
\ No newline at end of file
index e4e3ffe..6fa167a 100644 (file)
@@ -1,5 +1,6 @@
 /*
  * Copyright © 2017-2019 AT&T, Bell Canada
+ * Modifications Copyright (c) 2019 IBM, Bell Canada
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -54,6 +55,20 @@ class NetconfRpcServiceImpl(private var deviceInfo: DeviceInfo) : NetconfRpcServ
         return output
     }
 
+    override fun get(filter: String): DeviceResponse {
+        var output = DeviceResponse()
+        val messageId = messageIdInteger.getAndIncrement().toString()
+        log.info("$deviceInfo: get operational config: messageId($messageId)")
+        try {
+            val message = NetconfMessageUtils.get(messageId, filter)
+            output = asyncRpc(message, messageId)
+        } catch (e: Exception) {
+            output.status = RpcStatus.FAILURE
+            output.errorMessage = "$deviceInfo: failed in 'get' command ${e.message}"
+        }
+        return output
+    }
+
     override fun getConfig(filter: String, configTarget: String): DeviceResponse {
         var output = DeviceResponse()
         val messageId = messageIdInteger.getAndIncrement().toString()
index bb5cdb0..37ff674 100644 (file)
@@ -1,5 +1,6 @@
 /*
  * Copyright © 2017-2019 AT&T, Bell Canada
+ * Modifications Copyright (c) 2019 IBM.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -44,6 +45,20 @@ class NetconfMessageUtils {
         private val CHUNKED_SIZE_PATTERN: Pattern = Pattern.compile("\\n#([1-9][0-9]*)\\n")
         private val MSG_ID_STRING_PATTERN = Pattern.compile("${RpcMessageUtils.MESSAGE_ID_STRING}=\"(.*?)\"")
 
+        fun get(messageId: String, filterContent: String): String {
+            val request = StringBuilder()
+
+            request.append("<get>").append(NEW_LINE)
+            if (!filterContent.isNullOrEmpty()) {
+                request.append(RpcMessageUtils.SUBTREE_FILTER_OPEN).append(NEW_LINE)
+                request.append(filterContent).append(NEW_LINE)
+                request.append(RpcMessageUtils.SUBTREE_FILTER_CLOSE).append(NEW_LINE)
+            }
+            request.append("</get>").append(NEW_LINE)
+
+            return doWrappedRpc(messageId, request.toString())
+        }
+
         fun getConfig(messageId: String, configType: String, filterContent: String?): String {
             val request = StringBuilder()
 
index eb32c54..7b0b799 100644 (file)
@@ -1,5 +1,6 @@
 /*
  * Copyright © 2019 Bell Canada
+ * Modifications Copyright (c) 2019 IBM
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -80,14 +81,35 @@ class NetconfRpcServiceImplTest {
         assertTrue { invokeRpcrResult.errorMessage!!.contains("failed in 'invokeRpc' command") }
     }
 
+    @Test
+    fun `get completes normally`() {
+        val netconfRpcService = NetconfRpcServiceImpl(deviceInfo)
+        netconfRpcService.setNetconfSession(mockNetconfSession)
+        val spy = spyk(netconfRpcService)
+        every { spy.asyncRpc(any(), any()) } returns successfulDeviceResponse
+        val getRpcrResult = spy.get(someString)
+        assertEquals(successfulDeviceResponse, getRpcrResult)
+    }
+
+    @Test
+    fun `get on error sets DeviceResponse status to FAILURE`() {
+        val netconfRpcService = NetconfRpcServiceImpl(deviceInfo)
+        netconfRpcService.setNetconfSession(mockNetconfSession)
+        val spy = spyk(netconfRpcService)
+        every { spy.asyncRpc(any(), any()) } throws IOException("Some IO exception...")
+        val getRpcResult = spy.get(someString)
+        assertEquals(failedDeviceResponse.status, getRpcResult.status)
+        assertTrue { getRpcResult.errorMessage!!.contains("failed in 'get' command") }
+    }
+
     @Test
     fun `getConfig completes normally`() {
         val netconfRpcService = NetconfRpcServiceImpl(deviceInfo)
         netconfRpcService.setNetconfSession(mockNetconfSession)
         val spy = spyk(netconfRpcService)
         every { spy.asyncRpc(any(), any()) } returns successfulDeviceResponse
-        val invokeRpcrResult = spy.getConfig(someString)
-        assertEquals(successfulDeviceResponse, invokeRpcrResult)
+        val getConfigRpcResult = spy.getConfig(someString)
+        assertEquals(successfulDeviceResponse, getConfigRpcResult)
     }
 
     @Test
index e24659d..33135e3 100644 (file)
@@ -1,3 +1,19 @@
+/*
+ * Copyright © 2019 Bell Canada
+ * Modifications Copyright (c) 2019 IBM
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
 package org.onap.ccsdk.cds.blueprintsprocessor.functions.netconf.executor.utils
 
 import org.junit.Assert.*
@@ -15,6 +31,13 @@ class NetconfMessageUtilsTest {
         assertEquals("getConfig return was not correct", expectation, outcome)
     }
 
+    @Test
+    fun `test get operational`() {
+        val outcome = NetconfMessageUtils.get("customMessageId", "customConfigType")
+        val expectation = JacksonUtils.getClassPathFileContent("netconf-messages/get-response.xml")
+        assertEquals("get return was not correct", expectation, outcome)
+    }
+
     @Test
     fun `test getConfig with filterContent parameter null`() {
         val outcome = NetconfMessageUtils.getConfig("customMessageId", "customConfigType",null)
diff --git a/ms/blueprintsprocessor/functions/netconf-executor/src/test/resources/netconf-messages/get-response.xml b/ms/blueprintsprocessor/functions/netconf-executor/src/test/resources/netconf-messages/get-response.xml
new file mode 100644 (file)
index 0000000..d9fd72e
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<rpc message-id="customMessageId" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
+<get>
+<filter type="subtree">
+customConfigType
+</filter>
+</get>
+</rpc>
\ No newline at end of file