diff options
author | Alexis de Talhouët <adetalhouet89@gmail.com> | 2019-02-12 23:05:01 -0500 |
---|---|---|
committer | Alexis de Talhouët <adetalhouet89@gmail.com> | 2019-02-16 19:08:17 -0500 |
commit | 3daf7d0156076f868ae566f4503135757a4afd4d (patch) | |
tree | 2785e921af1b24e83b919382a267294b9a5af357 | |
parent | 7b2f2d11ebfa0671af1d5fc401df7945c0d658ec (diff) |
Rework netconf-executor
- 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>
7 files changed, 126 insertions, 116 deletions
diff --git a/components/model-catalog/blueprint-model/test-blueprint/baseconfiguration/Definitions/activation-blueprint.json b/components/model-catalog/blueprint-model/test-blueprint/baseconfiguration/Definitions/activation-blueprint.json index 84c78c62c..07c988b19 100644 --- a/components/model-catalog/blueprint-model/test-blueprint/baseconfiguration/Definitions/activation-blueprint.json +++ b/components/model-catalog/blueprint-model/test-blueprint/baseconfiguration/Definitions/activation-blueprint.json @@ -211,7 +211,7 @@ "activate-netconf": { "type": "component-netconf-executor", "interfaces": { - "NetconfExecutorComponent": { + "ComponentNetconfExecutor": { "operations": { "process": { "implementation": { @@ -240,7 +240,7 @@ "artifacts": { "component-script": { "type": "artifact-script-jython", - "file": "Scripts/python/DefaultGetNetConfig.py" + "file": "Scripts/python/NetconfRpcExample.py" } } }, diff --git a/components/model-catalog/blueprint-model/test-blueprint/baseconfiguration/Definitions/node_types.json b/components/model-catalog/blueprint-model/test-blueprint/baseconfiguration/Definitions/node_types.json index 400db435c..527307048 100644 --- a/components/model-catalog/blueprint-model/test-blueprint/baseconfiguration/Definitions/node_types.json +++ b/components/model-catalog/blueprint-model/test-blueprint/baseconfiguration/Definitions/node_types.json @@ -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 index c966b1a4b..000000000 --- a/components/model-catalog/blueprint-model/test-blueprint/baseconfiguration/Scripts/python/DefaultGetNetConfig.py +++ /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 index 000000000..acdb94aa1 --- /dev/null +++ b/components/model-catalog/blueprint-model/test-blueprint/baseconfiguration/Scripts/python/NetconfRpcExample.py @@ -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 diff --git a/components/model-catalog/definition-type/starter-type/node_type/component-netconf-executor.json b/components/model-catalog/definition-type/starter-type/node_type/component-netconf-executor.json index b8ac762e5..9565f6611 100644 --- a/components/model-catalog/definition-type/starter-type/node_type/component-netconf-executor.json +++ b/components/model-catalog/definition-type/starter-type/node_type/component-netconf-executor.json @@ -14,7 +14,7 @@ }
},
"interfaces": {
- "NetconfExecutorComponent": {
+ "ComponentNetconfExecutor": {
"operations": {
"process": {
"inputs": {
diff --git a/components/scripts/python/ccsdk_netconf/constant.py b/components/scripts/python/ccsdk_netconf/constant.py deleted file mode 100644 index 534ca9e13..000000000 --- a/components/scripts/python/ccsdk_netconf/constant.py +++ /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" diff --git a/components/scripts/python/ccsdk_netconf/netconfclient.py b/components/scripts/python/ccsdk_netconf/netconfclient.py index 421e50098..cdaf84092 100644 --- a/components/scripts/python/ccsdk_netconf/netconfclient.py +++ b/components/scripts/python/ccsdk_netconf/netconfclient.py @@ -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 |