项目同步接口,可触发从运维后台同步项目信息

This commit is contained in:
chenzuoqing 2021-12-16 19:43:31 +08:00
parent bae428c975
commit be964c54a4
4 changed files with 67 additions and 1 deletions

View File

@ -12,6 +12,8 @@ api = Api(project)
# 项目模型的视图
api.add_resource(views.ProjectViews, '/item/', endpoint="project")
api.add_resource(views.ProjectDetailViews, '/item/<string:pk>/', endpoint="project-detail")
# 同步项目信息从ops1同步
api.add_resource(operation.ProjectSyncView, '/item/sync/', endpoint="project-sync")
# 渠道模型视图
api.add_resource(views.ChannelViews, '/channel/', endpoint="channel")

View File

@ -1,7 +1,7 @@
import datetime
from flask import current_app as app
from flask_restful import reqparse, marshal, fields as F
from flask_restful import Resource, reqparse, marshal, fields as F
from models.asset.models import Host
from models.asset.fields import HostFields
@ -10,6 +10,17 @@ from models.project.models import Project, Channel, Server, Version
from common.views import CreateMixin, RetrieveMixin
from common.permission import token_header_required
from common.utils import make_response
from service.project.sync import sync_project_for_ops1
class ProjectSyncView(Resource):
"""从 OPS1 同步项目,触发接口"""
def get(self):
success = sync_project_for_ops1()
if success:
return make_response(200, code=1000, msg="success")
return make_response(200, code=1001, msg="有项目同步失败!")
class ServerSyncView(CreateMixin):

View File

View File

@ -0,0 +1,53 @@
import logging
import requests
from settings.common import CONFIG
from models.project.models import Project
logger = logging.getLogger("common")
def sync_project_for_ops1() -> bool:
"""从 ops1 同步项目,返回成功或失败"""
# 从配置文件获取 OPS1 信息
ops_conf = CONFIG.get("ops1")
server = ops_conf.get("server")
headers = ops_conf.get("headers", {})
uri = ops_conf.get("project_list", "")
try:
res = requests.get(f"{server}{uri}", headers=headers)
res.raise_for_status()
project_list = res.json()
except:
logger.exception(f"请求ops1失败: {server}")
return False
success = True
# 获取 model 定义的全部字段
model_fields = list(Project._fields.keys())
for proj in project_list:
# 名称判断,是否合法
fullname = proj.get("name")
if not fullname:
continue
try:
name, fork = fullname.split('/')
except:
continue
params = {"name": name, "fork": fork}
for field_name, value in proj.items():
if field_name in ("id", "name") or field_name not in model_fields:
continue
else:
params[field_name] = value
try:
# 更新或创建项目对象,以 name 和 fork 唯一组合查询
Project.update_or_create(name=name, fork=fork, defaults=params)
except:
logger.exception(f"保存项目:{name}/{fork}失败: {params}")
success = False
continue
logger.info(f"保存项目:{name}/{fork}成功: {params}")
return success