Rework netconf-executor
authorAlexis de Talhouët <adetalhouet89@gmail.com>
Wed, 13 Feb 2019 04:05:01 +0000 (23:05 -0500)
committerAlexis de Talhouët <adetalhouet89@gmail.com>
Sun, 17 Feb 2019 00:08:17 +0000 (19:08 -0500)
- rework connection logic
- rework rpc service
- rework netconf session handling
- rework netconf device communicator
- rework python netconf bindings
- rework python netconf client
- add python script showcasing netconf functions

Change-Id: Ibb9bf811e7d96e993aa866371d56c172de83be2c
Issue-ID: CCSDK-790:x
Signed-off-by: Alexis de Talhouët <adetalhouet89@gmail.com>
components/model-catalog/blueprint-model/test-blueprint/baseconfiguration/Definitions/activation-blueprint.json
components/model-catalog/blueprint-model/test-blueprint/baseconfiguration/Definitions/node_types.json
components/model-catalog/blueprint-model/test-blueprint/baseconfiguration/Scripts/python/DefaultGetNetConfig.py [deleted file]
components/model-catalog/blueprint-model/test-blueprint/baseconfiguration/Scripts/python/NetconfRpcExample.py [new file with mode: 0644]
components/model-catalog/definition-type/starter-type/node_type/component-netconf-executor.json
components/scripts/python/ccsdk_netconf/constant.py [deleted file]
components/scripts/python/ccsdk_netconf/netconfclient.py

index 84c78c6..07c988b 100644 (file)
       "activate-netconf": {
         "type": "component-netconf-executor",
         "interfaces": {
-          "NetconfExecutorComponent": {
+          "ComponentNetconfExecutor": {
             "operations": {
               "process": {
                 "implementation": {
         "artifacts": {
           "component-script": {
             "type": "artifact-script-jython",
-            "file": "Scripts/python/DefaultGetNetConfig.py"
+            "file": "Scripts/python/NetconfRpcExample.py"
           }
         }
       },
index 400db43..5273070 100644 (file)
@@ -60,7 +60,7 @@
         }
       },
       "interfaces": {
-        "NetconfExecutorComponent": {
+        "ComponentNetconfExecutor": {
           "operations": {
             "process": {
               "inputs": {
diff --git a/components/model-catalog/blueprint-model/test-blueprint/baseconfiguration/Scripts/python/DefaultGetNetConfig.py b/components/model-catalog/blueprint-model/test-blueprint/baseconfiguration/Scripts/python/DefaultGetNetConfig.py
deleted file mode 100644 (file)
index c966b1a..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-import  netconf_constant
-from netconfclient import NetconfClient
-from java.lang import Exception
-from org.onap.ccsdk.apps.blueprintsprocessor.functions.netconf.executor import NetconfComponentFunction
-
-class DefaultGetNetConfig(NetconfComponentFunction):
-
-    def process(self, execution_request):
-        try:
-            log = globals()[netconf_constant.SERVICE_LOG]
-            print(globals())
-            #requestId = globals()[netconf_constant.PARAM_REQUEST_ID]
-            requestId = '1234'
-            nc = NetconfClient(log, self)
-
-            # Create RPC Serivice
-            nc.createRPCServiceFromRequirement("netconf-connection")
-
-            runningConfigTemplate = "runningconfig-template"
-
-            runningConfigMessageId = "get-config-" + requestId
-
-            deviceResponse = nc.getConfig(messageId=runningConfigMessageId,
-                                          filter=runningConfigTemplate)
-
-            log.info("Get Running Config Response {} ", deviceResponse.responseMessage)
-            if(deviceResponse !='null') :
-                status = deviceResponse.status
-                responseData = "{}"
-                if (deviceResponse.status != netconf_constant.STATUS_SUCCESS and deviceResponse.errorMessage != 'null'):
-                    errorMessage = "Get Running Config Failure ::"+ deviceResponse.errorMessage
-
-        except Exception, err:
-            log.error("Exception in the script {}",err.getMessage())
-            status = netconf_constant.STATUS_FAILURE
-            errorMessage = "Get Running Config Failure ::"+err.getMessage()
-
-    def  recover(self, runtime_exception, execution_request):
-        print "Recovering calling.." + PROPERTY_BLUEPRINT_BASE_PATH
-        return None
-
diff --git a/components/model-catalog/blueprint-model/test-blueprint/baseconfiguration/Scripts/python/NetconfRpcExample.py b/components/model-catalog/blueprint-model/test-blueprint/baseconfiguration/Scripts/python/NetconfRpcExample.py
new file mode 100644 (file)
index 0000000..acdb94a
--- /dev/null
@@ -0,0 +1,52 @@
+#  Copyright (c) 2019 Bell Canada.
+#
+#  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.
+
+import netconf_constant
+from java.lang import Exception as JavaException
+from netconfclient import NetconfClient
+from org.onap.ccsdk.apps.blueprintsprocessor.functions.netconf.executor import \
+  NetconfComponentFunction
+
+
+class NetconfRpcExample(NetconfComponentFunction):
+
+  def process(self, execution_request):
+    try:
+      log = globals()[netconf_constant.SERVICE_LOG]
+      print(globals())
+      nc = NetconfClient(log, self, "netconf-connection")
+      nc.connect()
+
+      payload = "<configuration xmlns:junos=\"http://xml.juniper.net/junos/17.4R1/junos\"><system xmlns=\"http://yang.juniper.net/junos-qfx/conf/system\"><host-name operation=\"delete\"/><host-name operation=\"create\">DEMO</host-name></system></configuration>"
+
+      response = nc.lock(message_id="lock-123")
+      if not response.isSuccess():
+        log.error(response.errorMessage)
+
+      # nc.edit_config(message_id="edit-config-1", message_content=payload,edit_default_peration="none")
+      # nc.validate(message_id="validate-123")
+      # nc.discard_change(message_id="discard-123")
+      # nc.validate(message_id="validate-123")
+      # nc.commit(message_id="commit-123")
+      # nc.unlock(message_id="unlock-123")
+      # nc.disconnect()
+
+    except JavaException, err:
+      log.error("Java Exception in the script {}", err)
+    except Exception, err:
+      log.error("Python Exception in the script {}", err)
+
+  def recover(self, runtime_exception, execution_request):
+    print "Recovering calling.." + PROPERTY_BLUEPRINT_BASE_PATH
+    return None
index b8ac762..9565f66 100644 (file)
@@ -14,7 +14,7 @@
     }\r
   },\r
   "interfaces": {\r
-    "NetconfExecutorComponent": {\r
+    "ComponentNetconfExecutor": {\r
       "operations": {\r
         "process": {\r
           "inputs": {\r
diff --git a/components/scripts/python/ccsdk_netconf/constant.py b/components/scripts/python/ccsdk_netconf/constant.py
deleted file mode 100644 (file)
index 534ca9e..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-SERVICE_LOG = "log"
-SERVICE_NETCONF = "netconfService"
-SERVICE_MESSAGE = "messageService"
-
-PARAM_REQUEST_ID = "requestId"
-PARAM_ACTION = "action"
-
-STATUS_SUCCESS = "success"
-STATUS_FAILURE = "failure"
-
-CONFIG_TARGET_RUNNING = "running"
-CONFIG_TARGET_CANDIDATE = "candidate"
-CONFIG_DEFAULT_OPERATION_MERGE = "merge"
-CONFIG_DEFAULT_OPERATION_REPLACE = "replace"
-CONFIG_DEFAULT_OPERATION_NONE = "none"
index 421e500..cdaf840 100644 (file)
@@ -1,60 +1,74 @@
-from netconf_constant import CONFIG_TARGET_RUNNING, CONFIG_DEFAULT_OPERATION_REPLACE
-
+from netconf_constant import CONFIG_TARGET_RUNNING, CONFIG_TARGET_CANDIDATE, \
+  CONFIG_DEFAULT_OPERATION_REPLACE
 
 
 class NetconfClient:
 
-    def __init__(self, log, componentFunction):
-        self.log = log
-        self.componentFunction = componentFunction
-        self.nc = None
-
-    def createRPCServiceFromRequirement(self, requirementName):
-        self.nc = self.componentFunction.netconfRpcClientService(requirementName)
-
-    def disconnect(self):
-        self.nc.disconnect()
-        return
-
-    def connect(self, deviceInfo):
-        self.nc.connect(deviceInfo)
-        return
-
-    def lock(self, messageId, configTarget, messageTimeout=30):
-        deviceResponse = self.nc.lock(messageId, configTarget, messageTimeout)
-        return deviceResponse
-
-    def getConfig(self, messageId, filter, configTarget=CONFIG_TARGET_RUNNING, messageTimeout=30):
-        self.log.info("in the ncclient getConfig {}",messageId)
-        self.log.info("in the ncclient getConfig {}",filter)
-        deviceResponse = self.nc.getConfig(messageId, filter, configTarget, messageTimeout)
-        return deviceResponse
-    
-    def editConfig(self, messageId, messageContent, reConnect=False, wait=0, lock=False,
-                   configTarget=CONFIG_TARGET_RUNNING, editDefaultOperation=CONFIG_DEFAULT_OPERATION_REPLACE, 
-                   deleteConfig= False, validate= False, commit=False, discardChanges =True, unlock=False, 
-                   preRestartWait=0, postRestartWait=0, messageTimeout=30):
-        deviceResponse = self.nc.editConfig(messageId, messageContent, reConnect, wait, lock, configTarget,
-                                            editDefaultOperation, deleteConfig, validate, commit, discardChanges, unlock,
-                                            preRestartWait, postRestartWait, messageTimeout)
-        return deviceResponse
-
-    def commit(self, messageId, message, discardChanges =True, messageTimeout=30):
-        deviceResponse = self.nc.commit(messageId, message, discardChanges, messageTimeout)
-        return deviceResponse
-
-    def unLock(self, messageId, configTarget, messageTimeout=30):
-        deviceResponse = self.nc.unLock(messageId, configTarget, messageTimeout)
-        return deviceResponse
-
-    def discardChanges(self, messageId, messageTimeout=30):
-        deviceResponse = self.nc.discardChanges(messageId, messageTimeout)
-        return deviceResponse
-
-    def close(self, messageId, force=False, messageTimeout=30):
-        deviceResponse = self.nc.close(messageId, force, messageTimeout)
-        return deviceResponse
-
-    def rpc(self, request, messageId, messageTimeout=30):
-        deviceResponse = self.nc.rpc(request, messageId, messageTimeout)
-        return deviceResponse
+  def __init__(self, log, component_function, requirement_name):
+    self.log = log
+    self.component_function = component_function
+    netconf_device = self.component_function.initializeNetconfConnection(
+        requirement_name)
+    self.netconf_rpc_client = netconf_device.netconfRpcService
+    self.netconf_session = netconf_device.netconfSession
+
+  def disconnect(self):
+    self.netconf_session.disconnect()
+    return
+
+  def connect(self):
+    self.netconf_session.connect()
+    return
+
+  def lock(self, message_id, config_target=CONFIG_TARGET_CANDIDATE,
+      message_timeout=30):
+    device_response = self.netconf_rpc_client.lock(message_id, config_target,
+                                                   message_timeout)
+    return device_response
+
+  def get_config(self, message_id, filter="",
+      config_target=CONFIG_TARGET_RUNNING, message_timeout=30):
+    self.log.info("in the ncclient getConfig {}", message_id)
+    device_response = self.netconf_rpc_client.getConfig(message_id, filter,
+                                                        config_target,
+                                                        message_timeout)
+    return device_response
+
+  def edit_config(self, message_id, message_content, lock=False,
+      config_target=CONFIG_TARGET_CANDIDATE,
+      edit_default_peration=CONFIG_DEFAULT_OPERATION_REPLACE,
+      deleteConfig=False, validate=False, commit=False, discard_change=False,
+      unlock=False, message_timeout=30):
+    device_response = self.netconf_rpc_client.editConfig(message_id,
+                                                         message_content, lock,
+                                                         config_target,
+                                                         edit_default_peration,
+                                                         deleteConfig, validate,
+                                                         commit, discard_change,
+                                                         unlock,
+                                                         message_timeout)
+    return device_response
+
+  def commit(self, message_id, discard_change=True,
+      message_timeout=30):
+    device_response = self.netconf_rpc_client.commit(message_id, discard_change,
+                                                     message_timeout)
+    return device_response
+
+  def unlock(self, message_id, config_target=CONFIG_TARGET_CANDIDATE,
+      message_timeout=30):
+    device_response = self.netconf_rpc_client.unLock(message_id, config_target,
+                                                     message_timeout)
+    return device_response
+
+  def validate(self, message_id, config_target=CONFIG_TARGET_CANDIDATE,
+      message_timeout=30):
+    device_response = self.netconf_rpc_client.validate(message_id,
+                                                       config_target,
+                                                       message_timeout)
+    return device_response
+
+  def discard_change(self, message_id, message_timeout=30):
+    device_response = self.netconf_rpc_client.discardConfig(message_id,
+                                                            message_timeout)
+    return device_response