add file sync func

(cherry picked from commit fd1a4d057bba861e75e96bc3ac76e2ce205e378e)
This commit is contained in:
rabbitali 2023-09-13 14:59:00 +08:00 committed by openeuler-sync-bot
parent b19882cca5
commit 8a340fb683
2 changed files with 147 additions and 2 deletions

View File

@ -0,0 +1,141 @@
From 0e2ad3cc141390e26d7a20bccf5ccc0660f7c172 Mon Sep 17 00:00:00 2001
From: smjiao <smjiao@isoftstone.com>
Date: Thu, 7 Sep 2023 16:24:42 +0800
Subject: [PATCH] add file sync func
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
zeus/conf/constant.py | 2 ++
zeus/config_manager/view.py | 45 ++++++++++++++++++++++++++++++++--
zeus/function/verify/config.py | 9 +++++++
zeus/url.py | 6 ++++-
4 files changed, 59 insertions(+), 3 deletions(-)
diff --git a/zeus/conf/constant.py b/zeus/conf/constant.py
index 2fbf1be..3175c65 100644
--- a/zeus/conf/constant.py
+++ b/zeus/conf/constant.py
@@ -33,6 +33,7 @@ CERES_CVE_REPO_SET = "aops-ceres apollo --set-repo '%s'"
CERES_CVE_SCAN = "aops-ceres apollo --scan '%s'"
CERES_CVE_FIX = "aops-ceres apollo --fix '%s'"
CERES_CVE_ROLLBACK = "aops-ceres apollo --rollback '%s'"
+CERES_SYNC_CONF = "aops-ceres sync --conf '%s'"
# zeus route
ADD_HOST = "/manage/host/add"
@@ -54,6 +55,7 @@ DELETE_GROUP = "/manage/host/group/delete"
GET_GROUP = "/manage/host/group/get"
COLLECT_CONFIG = '/manage/config/collect'
+SYNC_CONFIG = '/manage/config/sync'
USER_LOGIN = "/manage/account/login"
LOGOUT = "/manage/account/logout"
diff --git a/zeus/config_manager/view.py b/zeus/config_manager/view.py
index cd83e35..baeef7e 100644
--- a/zeus/config_manager/view.py
+++ b/zeus/config_manager/view.py
@@ -21,10 +21,11 @@ from typing import List, Dict
from vulcanus.multi_thread_handler import MultiThreadHandler
from vulcanus.restful.resp import state
from vulcanus.restful.response import BaseResponse
-from zeus.conf.constant import CERES_COLLECT_FILE
+from zeus.conf import configuration
+from zeus.conf.constant import CERES_COLLECT_FILE, CERES_SYNC_CONF
from zeus.database.proxy.host import HostProxy
from zeus.function.model import ClientConnectArgs
-from zeus.function.verify.config import CollectConfigSchema
+from zeus.function.verify.config import CollectConfigSchema, SyncConfigSchema
from zeus.host_manager.ssh import execute_command_and_parse_its_result
@@ -218,3 +219,43 @@ class CollectConfig(BaseResponse):
return self.response(
state.SUCCEED, None, self.generate_target_data_format(multi_thread.get_result(), host_id_with_config_file)
)
+
+
+class SyncConfig(BaseResponse):
+
+ @staticmethod
+ def sync_config_content(host_info: Dict, sync_config_info: Dict):
+ command = CERES_SYNC_CONF % json.dumps(sync_config_info)
+ status, content = execute_command_and_parse_its_result(
+ ClientConnectArgs(host_info.get("host_ip"), host_info.get("ssh_port"),
+ host_info.get("ssh_user"), host_info.get("pkey")), command)
+ return status
+
+ @BaseResponse.handle(schema=SyncConfigSchema, token=False)
+ def put(self, **params):
+
+ sync_config_info = dict()
+ sync_config_info['file_path'] = params.get('file_path')
+ sync_config_info['content'] = params.get('content')
+
+ sync_result = {
+ "file_path": sync_config_info['file_path'],
+ "sync_result": False
+ }
+
+ # Query host address from database
+ proxy = HostProxy(configuration)
+ if not proxy.connect():
+ return self.response(code=state.DATABASE_CONNECT_ERROR, data={"resp": sync_result})
+
+ status, host_list = proxy.get_host_info(
+ {"username": "admin", "host_list": [params.get('host_id')]}, True)
+ if status != state.SUCCEED or len(host_list) == 1:
+ return self.response(code=status, data={"resp": sync_result})
+
+ host_info = host_list[0]
+ status = self.sync_config_content(host_info, sync_config_info)
+ if status == state.SUCCEED:
+ sync_result['sync_result'] = True
+ return self.response(code=state.SUCCEED, data={"resp": sync_result})
+ return self.response(code=state.UNKNOWN_ERROR, data={"resp": sync_result})
diff --git a/zeus/function/verify/config.py b/zeus/function/verify/config.py
index 230b65d..6e5bf64 100644
--- a/zeus/function/verify/config.py
+++ b/zeus/function/verify/config.py
@@ -36,3 +36,12 @@ class CollectConfigSchema(Schema):
"""
infos = fields.List(fields.Nested(ConfigSchema(), required=True), required=True, validate=lambda s: len(s) > 0)
+
+
+class SyncConfigSchema(Schema):
+ """
+ validators for SyncConfigSchema
+ """
+ host_id = fields.Integer(required=True, validate=lambda s: s > 0)
+ file_path = fields.String(required=True, validate=lambda s: len(s) > 0)
+ content = fields.String(required=True, validate=lambda s: len(s) > 0)
diff --git a/zeus/url.py b/zeus/url.py
index e0cf1de..597dcc7 100644
--- a/zeus/url.py
+++ b/zeus/url.py
@@ -49,6 +49,7 @@ from zeus.conf.constant import (
REFRESH_TOKEN,
UPDATE_HOST,
USER_LOGIN,
+ SYNC_CONFIG,
)
from zeus.config_manager import view as config_view
from zeus.host_manager import view as host_view
@@ -83,7 +84,10 @@ SPECIFIC_URLS = {
(host_view.DeleteHostGroup, DELETE_GROUP),
(host_view.GetHostGroup, GET_GROUP),
],
- "CONFIG_URLS": [(config_view.CollectConfig, COLLECT_CONFIG)],
+ "CONFIG_URLS": [
+ (config_view.CollectConfig, COLLECT_CONFIG),
+ (config_view.SyncConfig, SYNC_CONFIG)
+ ],
'AGENT_URLS': [
(agent_view.AgentPluginInfo, AGENT_PLUGIN_INFO),
(agent_view.SetAgentPluginStatus, AGENT_PLUGIN_SET),
--
Gitee

View File

@ -1,10 +1,11 @@
Name: aops-zeus
Version: v1.3.0
Release: 1
Release: 2
Summary: A host and user manager service which is the foundation of aops.
License: MulanPSL2
URL: https://gitee.com/openeuler/%{name}
Source0: %{name}-%{version}.tar.gz
Patch0001: 0001-add-file-sync-func.patch
BuildRequires: python3-setuptools
Requires: aops-vulcanus >= v1.2.0
@ -20,7 +21,7 @@ A host and user manager service which is the foundation of aops.
%prep
%autosetup -n %{name}-%{version}
%autosetup -n %{name}-%{version} -p1
# build for aops-zeus
@ -44,6 +45,9 @@ cp -r database %{buildroot}/opt/aops/
%changelog
* Wed Sep 13 2023 wenxin<shusheng.wen@outlook.com> - v1.3.0-2
- add file sync func
* Tue Sep 05 2023 wenxin<shusheng.wen@outlook.com> - v1.3.0-1
- optimize the method of executing apollo tasks