From 480e3de63f475477138c45f551def992ba8d8b9d Mon Sep 17 00:00:00 2001 From: Edyta Krukowska Date: Thu, 25 Mar 2021 14:55:24 +0100 Subject: Add endopint for config change Issue-ID: INT-1869 Signed-off-by: Edyta Krukowska Change-Id: Ib016779b3539ebaac186d92d3cd95a19f81e45cd --- .../netconf_server/netconf_change_listener.py | 2 +- .../netconf_change_listener_factory.py | 2 +- src/python/netconf_server/netconf_rest_server.py | 15 ++++++-- .../sysrepo_configuration_manager.py | 41 ++++++++++++++++++++++ .../sysrepo_interface/sysrepo_client.py | 2 +- 5 files changed, 56 insertions(+), 6 deletions(-) create mode 100644 src/python/netconf_server/sysrepo_configuration/sysrepo_configuration_manager.py (limited to 'src/python/netconf_server') diff --git a/src/python/netconf_server/netconf_change_listener.py b/src/python/netconf_server/netconf_change_listener.py index 4bb748c..44910d1 100644 --- a/src/python/netconf_server/netconf_change_listener.py +++ b/src/python/netconf_server/netconf_change_listener.py @@ -21,7 +21,7 @@ import logging from netconf_server.sysrepo_interface.config_change_data import ConfigChangeData -logger = logging.getLogger("netconf_saver") +logger = logging.getLogger(__name__) class NetconfChangeListener(object): diff --git a/src/python/netconf_server/netconf_change_listener_factory.py b/src/python/netconf_server/netconf_change_listener_factory.py index 00725dc..fa5e071 100644 --- a/src/python/netconf_server/netconf_change_listener_factory.py +++ b/src/python/netconf_server/netconf_change_listener_factory.py @@ -22,7 +22,7 @@ import logging from netconf_server.netconf_change_listener import NetconfChangeListener from netconf_server.sysrepo_interface.config_change_subscriber import ConfigChangeSubscriber -logger = logging.getLogger("netconf_saver") +logger = logging.getLogger(__name__) class NetconfChangeListenerFactory(object): diff --git a/src/python/netconf_server/netconf_rest_server.py b/src/python/netconf_server/netconf_rest_server.py index 2c44029..dce4f82 100644 --- a/src/python/netconf_server/netconf_rest_server.py +++ b/src/python/netconf_server/netconf_rest_server.py @@ -19,19 +19,21 @@ ### import logging as sys_logging -from flask import Flask, logging, make_response, Response +from flask import Flask, logging, make_response, Response, request +from netconf_server.sysrepo_configuration.sysrepo_configuration_manager import SysrepoConfigurationManager class NetconfRestServer: _rest_server: Flask = Flask("server") - sys_logging.basicConfig(level=sys_logging.DEBUG) logger = logging.create_logger(_rest_server) + _configuration_manager: SysrepoConfigurationManager def __init__(self, host='0.0.0.0', port=6555): self._host = host self._port = port - def start(self): + def start(self, configuration_manager: SysrepoConfigurationManager): + NetconfRestServer._configuration_manager = configuration_manager Flask.run( NetconfRestServer._rest_server, host=self._host, @@ -43,6 +45,13 @@ class NetconfRestServer: def __health_check(): return "UP" + @staticmethod + @_rest_server.route("/change_config/", methods=['POST']) + def __change_config(module_name): + config_data = request.data.decode("utf-8") + NetconfRestServer._configuration_manager.change_configuration(config_data, module_name) + return NetconfRestServer.__create_http_response(202, "Accepted") + @staticmethod def __create_http_response(code, message): return make_response( diff --git a/src/python/netconf_server/sysrepo_configuration/sysrepo_configuration_manager.py b/src/python/netconf_server/sysrepo_configuration/sysrepo_configuration_manager.py new file mode 100644 index 0000000..0e8ad94 --- /dev/null +++ b/src/python/netconf_server/sysrepo_configuration/sysrepo_configuration_manager.py @@ -0,0 +1,41 @@ +# ================================================================================ +# Copyright (C) 2021 Nokia. All rights reserved. +# ================================================================================ +# 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. +# ============LICENSE_END========================================================= +### + +import logging + + +class SysrepoConfigurationManager(object): + logger = logging.getLogger(__name__) + + def __init__(self, session, connection): + self._connection = connection + self._session = session + + def __parse_config_data(self, config_data): + self.logger.debug(config_data) + ctx = self._connection.get_ly_ctx() + data = ctx.parse_data_mem( + config_data, + "xml", + config=True, + strict=False, + ) + return data + + def change_configuration(self, config_data: str, module_name: str): + data = self.__parse_config_data(config_data) + self._session.replace_config_ly(data, module_name) diff --git a/src/python/netconf_server/sysrepo_interface/sysrepo_client.py b/src/python/netconf_server/sysrepo_interface/sysrepo_client.py index fcd29e2..3528747 100644 --- a/src/python/netconf_server/sysrepo_interface/sysrepo_client.py +++ b/src/python/netconf_server/sysrepo_interface/sysrepo_client.py @@ -26,4 +26,4 @@ class SysrepoClient(object): def run_in_session(method_to_run: callable, *extra_args): with sysrepo.SysrepoConnection() as connection: with connection.start_session() as session: - method_to_run(session, *extra_args) + method_to_run(session, connection, *extra_args) -- cgit 1.2.3-korg