简化接口中模型必要的参数的解析,根据请求方法判断,更新可缺少
删除数据库相关的模型、解析方法、视图和路由,归类到中间件和实例中
This commit is contained in:
parent
b354fe14bf
commit
f9d08d0125
|
@ -1,7 +1,7 @@
|
|||
from flask import Blueprint
|
||||
from flask_restful import Api
|
||||
|
||||
from controller.asset import views
|
||||
from controller.asset import host
|
||||
from controller.asset import instance
|
||||
from controller.asset import middleware
|
||||
from controller.asset import credential
|
||||
|
@ -11,8 +11,8 @@ asset = Blueprint('asset', __name__, url_prefix="/asset")
|
|||
|
||||
# 增加路由
|
||||
api = Api(asset)
|
||||
api.add_resource(views.HostViews, '/host/', endpoint="host")
|
||||
api.add_resource(views.HostDetailViews, '/host/<string:pk>/', endpoint="host-detail")
|
||||
api.add_resource(host.HostViews, '/host/', endpoint="host")
|
||||
api.add_resource(host.HostDetailViews, '/host/<string:pk>/', endpoint="host-detail")
|
||||
|
||||
# 凭据相关视图
|
||||
api.add_resource(credential.CredentialViews, '/credential/', endpoint="cred-all")
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
from flask_restful import marshal
|
||||
from common.serializer import marshal as marshal_fields
|
||||
from common.serializer import marshal_fields
|
||||
from functools import reduce
|
||||
|
||||
|
||||
|
|
|
@ -1,7 +1,8 @@
|
|||
from flask_restful import marshal
|
||||
from collections import OrderedDict
|
||||
|
||||
|
||||
def marshal(data, fields, envelope=None, only_exist=False, required_fields=None, **kwargs):
|
||||
def marshal_fields(data, fields, envelope=None, only_exist=False, required_fields=None, **kwargs):
|
||||
"""Takes raw data (in the form of a dict, list, object) and a dict of
|
||||
fields to output and filters the data based on those fields.
|
||||
|
||||
|
@ -54,7 +55,6 @@ def marshal(data, fields, envelope=None, only_exist=False, required_fields=None,
|
|||
# else make(v).output(k, data))
|
||||
# for k, v in fields.items())
|
||||
items = ((k, v) for k, v in map(parse, fields.items()) if k is not None)
|
||||
print(items)
|
||||
return OrderedDict([(envelope, OrderedDict(items))]) if envelope else OrderedDict(items)
|
||||
|
||||
|
||||
|
|
|
@ -14,8 +14,11 @@ class CredentialParse:
|
|||
# 给子类用的唯一字段,用于校验
|
||||
# uniq_fields = ("name", "host")
|
||||
|
||||
def init_parse(self):
|
||||
def __init__(self):
|
||||
# 创建时必要的参数用此变量判断,更新默认都可以不传
|
||||
required = request.method == "POST"
|
||||
self.request_parse = reqparse.RequestParser()
|
||||
self.request_parse.add_argument("name", required=required, type=str, location='json')
|
||||
|
||||
self.request_parse.add_argument("class_name", required=False, type=str, location='json')
|
||||
|
||||
|
@ -42,21 +45,12 @@ class CredentialViews(CredentialParse, ListCreateViewSet):
|
|||
fields = CredentialFields
|
||||
filter_fields = (("name", "icontains"), )
|
||||
|
||||
def __init__(self):
|
||||
self.init_parse()
|
||||
print(request.method)
|
||||
self.request_parse.add_argument("name", required=True, type=str, location='json')
|
||||
|
||||
|
||||
class CredentialDetail(CredentialParse, CredentialClassNameValidate, DetailViewSet):
|
||||
"""凭据详情"""
|
||||
model = Credential
|
||||
fields = CredentialDetailFields
|
||||
|
||||
def __init__(self):
|
||||
self.init_parse()
|
||||
self.request_parse.add_argument("name", required=False, type=str, location='json')
|
||||
|
||||
|
||||
class CredentialClassViews(CredentialParse, CredentialClassNameValidate, ListCreateViewSet):
|
||||
"""凭据列表,带 class_name 参数"""
|
||||
|
@ -64,17 +58,9 @@ class CredentialClassViews(CredentialParse, CredentialClassNameValidate, ListCre
|
|||
fields = CredentialFields
|
||||
filter_fields = (("name", "icontains"),)
|
||||
|
||||
def __init__(self):
|
||||
self.init_parse()
|
||||
self.request_parse.add_argument("name", required=True, type=str, location='json')
|
||||
|
||||
|
||||
class CredentialClassDetail(CredentialParse, CredentialClassNameValidate,
|
||||
RetrieveClassMixin, DestroyClassMixin, UpdateClassMixin):
|
||||
"""凭据详情,带 class_name 和 pk 参数"""
|
||||
model = Credential
|
||||
fields = CredentialDetailFields
|
||||
|
||||
def __init__(self):
|
||||
self.init_parse()
|
||||
self.request_parse.add_argument("name", required=False, type=str, location='json')
|
||||
|
|
|
@ -0,0 +1,56 @@
|
|||
import datetime
|
||||
import logging
|
||||
|
||||
from flask import request
|
||||
from flask_restful import reqparse
|
||||
|
||||
from models.asset import fields as assetField
|
||||
from models.asset import models as assetModel
|
||||
from common.views import ListCreateViewSet, DetailViewSet
|
||||
from common.permission import session_or_token_required
|
||||
|
||||
logger = logging.getLogger("views")
|
||||
|
||||
|
||||
class HostParse:
|
||||
model = None
|
||||
request_parse = None
|
||||
uniq_fields = ("public_ip", "minion_id")
|
||||
|
||||
def __init__(self):
|
||||
# 创建时必要的参数用此变量判断,更新默认都可以不传
|
||||
required = request.method == "POST"
|
||||
self.request_parse = reqparse.RequestParser()
|
||||
# 创建时必须,修改时可选
|
||||
self.request_parse.add_argument("public_ip", type=str, required=required,
|
||||
help='not public_ip provided', location='json')
|
||||
self.request_parse.add_argument("private_ip", required=False, type=str, location='json')
|
||||
self.request_parse.add_argument("minion_id", required=False, type=str, location='json')
|
||||
self.request_parse.add_argument("weights", required=False, type=int, location='json')
|
||||
self.request_parse.add_argument("cpu_num", required=False, type=int, location='json')
|
||||
self.request_parse.add_argument("cpu_core", required=False, type=int, location='json')
|
||||
self.request_parse.add_argument("memory", required=False, type=int, location='json')
|
||||
self.request_parse.add_argument("tags", required=False, type=list, location='json')
|
||||
self.request_parse.add_argument("data", required=False, type=dict, location='json')
|
||||
self.request_parse.add_argument("labels", required=False, type=dict, location='json')
|
||||
|
||||
def validate_fields(self, args: dict, create=True) -> dict:
|
||||
if create:
|
||||
args["created"] = datetime.datetime.now()
|
||||
else:
|
||||
if "created" in args:
|
||||
args.pop("created")
|
||||
return args
|
||||
|
||||
|
||||
class HostViews(HostParse, ListCreateViewSet):
|
||||
model = assetModel.Host
|
||||
fields = assetField.HostFields
|
||||
method_decorators = [session_or_token_required]
|
||||
filter_fields = (("public_ip", "contains"), ("private_ip", "contains"), ("tags", ""))
|
||||
|
||||
|
||||
class HostDetailViews(HostParse, DetailViewSet):
|
||||
model = assetModel.Host
|
||||
fields = assetField.HostFields
|
||||
method_decorators = [session_or_token_required]
|
|
@ -1,3 +1,4 @@
|
|||
from flask import request
|
||||
from flask_restful import reqparse
|
||||
|
||||
from models.asset.middleware import Middleware
|
||||
|
@ -16,8 +17,11 @@ class InstanceParse:
|
|||
# 给子类用的唯一字段,用于校验
|
||||
uniq_fields = (("name", "class_name"),)
|
||||
|
||||
def init_parse(self):
|
||||
def __init__(self):
|
||||
# 创建时必要的参数用此变量判断,更新默认都可以不传
|
||||
required = request.method == "POST"
|
||||
self.request_parse = reqparse.RequestParser()
|
||||
self.request_parse.add_argument("name", required=required, type=str, location='json')
|
||||
self.request_parse.add_argument("class_name", required=False, type=str, location='json')
|
||||
self.request_parse.add_argument("middleware_id", required=False, type=str, location='json')
|
||||
self.request_parse.add_argument("credentials", required=False, type=list, location='json')
|
||||
|
@ -54,29 +58,17 @@ class InstanceViews(InstanceParse, ListCreateViewSet):
|
|||
fields = InstanceFields
|
||||
filter_fields = (("name", "icontains"), ("class_name", ""))
|
||||
|
||||
def __init__(self):
|
||||
self.init_parse()
|
||||
self.request_parse.add_argument("name", required=True, type=str, location='json')
|
||||
|
||||
|
||||
class InstanceDetailViews(InstanceParse, DetailViewSet):
|
||||
model = Instance
|
||||
fields = InstanceDetailFields
|
||||
|
||||
def __init__(self):
|
||||
self.init_parse()
|
||||
self.request_parse.add_argument("name", required=False, type=str, location='json')
|
||||
|
||||
|
||||
class InstanceClassViews(InstanceParse, InstanceClassNameValidate, ListCreateViewSet):
|
||||
"""某类别的实例列表"""
|
||||
model = Instance
|
||||
fields = InstanceFields
|
||||
|
||||
def __init__(self):
|
||||
self.init_parse()
|
||||
self.request_parse.add_argument("name", required=True, type=str, location='json')
|
||||
|
||||
def get_queryset(self, *args, **kwargs):
|
||||
self.queryset = self.model.objects(**kwargs)
|
||||
|
||||
|
@ -86,9 +78,5 @@ class InstanceClassDetail(InstanceParse, InstanceClassNameValidate, RetrieveClas
|
|||
model = Instance
|
||||
fields = InstanceDetailFields
|
||||
|
||||
def __init__(self):
|
||||
self.init_parse()
|
||||
self.request_parse.add_argument("name", required=False, type=str, location='json')
|
||||
|
||||
def get_queryset(self, *args, **kwargs):
|
||||
self.queryset = self.model.objects(**kwargs)
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
from flask import request
|
||||
from flask_restful import reqparse
|
||||
|
||||
from models.asset.middleware import Middleware
|
||||
|
@ -16,7 +17,10 @@ class MiddlewareParse:
|
|||
uniq_fields = ("name", "host")
|
||||
|
||||
def init_parse(self):
|
||||
# 创建时必要的参数用此变量判断,更新默认都可以不传
|
||||
required = request.method == "POST"
|
||||
self.request_parse = reqparse.RequestParser()
|
||||
self.request_parse.add_argument("name", required=required, type=str, location='json')
|
||||
|
||||
self.request_parse.add_argument("class_name", required=False, type=str, location='json')
|
||||
self.request_parse.add_argument("host", required=False, type=str, location='json')
|
||||
|
@ -46,10 +50,6 @@ class MiddlewareViews(MiddlewareParse, ListCreateViewSet):
|
|||
uniq_fields = ("name",)
|
||||
filter_fields = (("name", "icontains"), ("host", "icontains"), ("manage", "icontains"), ("class_name", ""))
|
||||
|
||||
def __init__(self):
|
||||
self.init_parse()
|
||||
self.request_parse.add_argument("name", required=True, type=str, location='json')
|
||||
|
||||
|
||||
class MiddlewareDetail(MiddlewareParse, DetailViewSet):
|
||||
"""分类别的视图"""
|
||||
|
@ -57,10 +57,6 @@ class MiddlewareDetail(MiddlewareParse, DetailViewSet):
|
|||
fields = MiddlewareFields
|
||||
uniq_fields = ("name",)
|
||||
|
||||
def __init__(self):
|
||||
self.init_parse()
|
||||
self.request_parse.add_argument("name", required=True, type=str, location='json')
|
||||
|
||||
|
||||
class MiddlewareClassViews(MiddlewareParse, MiddlewareClassNameValidate, ListCreateViewSet):
|
||||
"""按分类的中间件视图,带 class_name 参数"""
|
||||
|
@ -69,10 +65,6 @@ class MiddlewareClassViews(MiddlewareParse, MiddlewareClassNameValidate, ListCre
|
|||
uniq_fields = ("name",)
|
||||
filter_fields = (("name", "icontains"), ("host", "icontains"), ("manage", "icontains"))
|
||||
|
||||
def __init__(self):
|
||||
self.init_parse()
|
||||
self.request_parse.add_argument("name", required=True, type=str, location='json')
|
||||
|
||||
def get_queryset(self, *args, **kwargs):
|
||||
"""按分类查找"""
|
||||
self.queryset = self.model.objects(**kwargs)
|
||||
|
@ -84,7 +76,3 @@ class MiddlewareClassDetail(MiddlewareParse, MiddlewareClassNameValidate,
|
|||
model = Middleware
|
||||
fields = MiddlewareFields
|
||||
uniq_fields = ("name",)
|
||||
|
||||
def __init__(self):
|
||||
self.init_parse()
|
||||
self.request_parse.add_argument("name", required=False, type=str, location='json')
|
||||
|
|
|
@ -1,71 +0,0 @@
|
|||
import datetime
|
||||
|
||||
from flask_restful import reqparse
|
||||
|
||||
|
||||
class HostParse:
|
||||
model = None
|
||||
request_parse = None
|
||||
uniq_fields = ("public_ip", "minion_id")
|
||||
|
||||
def init_parse(self):
|
||||
self.request_parse = reqparse.RequestParser()
|
||||
# 创建时必须,修改时可选
|
||||
# self.request_parse.add_argument("public_ip", type=str, required=True,
|
||||
# help='not public_ip provided', location='json')
|
||||
self.request_parse.add_argument("private_ip", required=False, type=str, location='json')
|
||||
self.request_parse.add_argument("minion_id", required=False, type=str, location='json')
|
||||
self.request_parse.add_argument("weights", required=False, type=int, location='json')
|
||||
self.request_parse.add_argument("cpu_num", required=False, type=int, location='json')
|
||||
self.request_parse.add_argument("cpu_core", required=False, type=int, location='json')
|
||||
self.request_parse.add_argument("memory", required=False, type=int, location='json')
|
||||
self.request_parse.add_argument("tags", required=False, type=list, location='json')
|
||||
self.request_parse.add_argument("data", required=False, type=dict, location='json')
|
||||
self.request_parse.add_argument("labels", required=False, type=dict, location='json')
|
||||
|
||||
def validate_fields(self, args: dict, create=True) -> dict:
|
||||
if create:
|
||||
args["created"] = datetime.datetime.now()
|
||||
else:
|
||||
if "created" in args:
|
||||
args.pop("created")
|
||||
return args
|
||||
|
||||
|
||||
class DatabaseServerParse:
|
||||
request_parse = None
|
||||
# 给子类用的唯一字段,用于校验
|
||||
uniq_fields = ("name", "host", "domain")
|
||||
|
||||
def init_parse(self):
|
||||
self.request_parse = reqparse.RequestParser()
|
||||
self.request_parse.add_argument("domain", required=False, type=str, location='json')
|
||||
self.request_parse.add_argument("data", required=False, type=dict, location='json')
|
||||
self.request_parse.add_argument("tags", required=False, type=list, location='json')
|
||||
self.request_parse.add_argument("labels", required=False, type=dict, location='json')
|
||||
|
||||
|
||||
class DatabaseParse:
|
||||
request_parse = None
|
||||
|
||||
def init_parse(self):
|
||||
self.request_parse = reqparse.RequestParser()
|
||||
self.request_parse.add_argument("username", type=str, location='json')
|
||||
self.request_parse.add_argument("password", type=str, location='json')
|
||||
|
||||
self.request_parse.add_argument("data", required=False, type=dict, location='json')
|
||||
self.request_parse.add_argument("tags", required=False, type=list, location='json')
|
||||
self.request_parse.add_argument("labels", required=False, type=dict, location='json')
|
||||
|
||||
|
||||
class MiddlewareParse:
|
||||
request_parse = None
|
||||
# 给子类用的唯一字段,用于校验
|
||||
uniq_fields = ("name", "host")
|
||||
|
||||
def init_parse(self):
|
||||
self.request_parse = reqparse.RequestParser()
|
||||
# self.request_parse.add_argument("domain", required=False, type=str, location='json')
|
||||
self.request_parse.add_argument("data", required=False, type=dict, location='json')
|
||||
self.request_parse.add_argument("tags", required=False, type=list, location='json')
|
||||
self.request_parse.add_argument("labels", required=False, type=dict, location='json')
|
|
@ -1,284 +0,0 @@
|
|||
import datetime
|
||||
import logging
|
||||
|
||||
from flask_restful import reqparse, marshal, Resource
|
||||
|
||||
from models.asset import fields as assetField
|
||||
from models.asset import models as assetModel
|
||||
from common.views import (
|
||||
ListCreateViewSet, DetailViewSet, ListMixin, UpdateMixin, DestroyMixin, RetrieveMixin,
|
||||
EncryptRequiredCreateView, EncryptRequiredUpdateView
|
||||
)
|
||||
from common.permission import session_or_token_required
|
||||
from common.utils import abort_response
|
||||
from controller.asset import parsers
|
||||
from common.crypto import quick_crypto
|
||||
|
||||
logger = logging.getLogger("views")
|
||||
|
||||
|
||||
class HostViews(parsers.HostParse, ListCreateViewSet):
|
||||
model = assetModel.Host
|
||||
fields = assetField.HostFields
|
||||
method_decorators = [session_or_token_required]
|
||||
filter_fields = (("public_ip", "contains"), ("private_ip", "contains"), ("tags", ""))
|
||||
|
||||
def __init__(self):
|
||||
self.init_parse()
|
||||
self.request_parse.add_argument("public_ip", type=str, required=True,
|
||||
help='not public_ip provided', location='json')
|
||||
super(HostViews, self).__init__()
|
||||
|
||||
|
||||
class HostDetailViews(parsers.HostParse, DetailViewSet):
|
||||
model = assetModel.Host
|
||||
fields = assetField.HostFields
|
||||
method_decorators = [session_or_token_required]
|
||||
|
||||
def __init__(self):
|
||||
self.init_parse()
|
||||
self.request_parse.add_argument("public_ip", type=str, location='json')
|
||||
super(HostDetailViews, self).__init__()
|
||||
|
||||
|
||||
class MySQLInstanceViews(parsers.DatabaseServerParse, ListMixin, EncryptRequiredCreateView):
|
||||
model = assetModel.MySQLInstance
|
||||
fields = assetField.MySQLInstanceFields
|
||||
method_decorators = [session_or_token_required]
|
||||
filter_fields = (("name", "icontains"), ("host", "icontains"), ("manage", ""), ("tags", ""),
|
||||
("databases__name", ""), )
|
||||
encrypt_fields = ["password"]
|
||||
|
||||
def __init__(self):
|
||||
self.init_parse()
|
||||
self.request_parse.add_argument("name", required=True, type=str, location='json')
|
||||
self.request_parse.add_argument("host", required=True, type=str, location='json')
|
||||
self.request_parse.add_argument("manage", required=True, type=str, location='json')
|
||||
|
||||
self.request_parse.add_argument("port", required=False, type=str, location='json')
|
||||
self.request_parse.add_argument("username", required=True, type=str, location='json')
|
||||
self.request_parse.add_argument("password", required=True, type=str, location='json')
|
||||
self.request_parse.add_argument("storage", required=True, type=int, location='json')
|
||||
self.request_parse.add_argument("memory", required=True, type=int, location='json')
|
||||
self.request_parse.add_argument("core", required=True, type=int, location='json')
|
||||
super(MySQLInstanceViews, self).__init__()
|
||||
|
||||
|
||||
class MySQLInstanceDetail(parsers.DatabaseServerParse, RetrieveMixin, DestroyMixin, EncryptRequiredUpdateView):
|
||||
model = assetModel.MySQLInstance
|
||||
fields = assetField.MySQLInstanceFields
|
||||
method_decorators = [session_or_token_required]
|
||||
encrypt_fields = ["password"]
|
||||
|
||||
def __init__(self):
|
||||
"""对象修改的参数解析"""
|
||||
self.init_parse()
|
||||
self.request_parse.add_argument("host", required=False, type=str, location='json')
|
||||
self.request_parse.add_argument("name", required=False, type=str, location='json')
|
||||
self.request_parse.add_argument("manage", required=False, type=str, location='json')
|
||||
|
||||
self.request_parse.add_argument("port", required=False, type=str, location='json')
|
||||
self.request_parse.add_argument("username", required=False, type=str, location='json')
|
||||
self.request_parse.add_argument("password", required=False, type=str, location='json')
|
||||
self.request_parse.add_argument("storage", required=False, type=int, location='json')
|
||||
self.request_parse.add_argument("memory", required=False, type=int, location='json')
|
||||
self.request_parse.add_argument("core", required=False, type=int, location='json')
|
||||
super(MySQLInstanceDetail, self).__init__()
|
||||
|
||||
|
||||
class DatabaseViews(parsers.DatabaseParse, Resource):
|
||||
model = assetModel.DatabaseServer
|
||||
db_model = assetModel.Database
|
||||
db_fields = assetField.DatabaseFields
|
||||
|
||||
def __init__(self):
|
||||
self.init_parse()
|
||||
self.request_parse.add_argument("name", type=str, location='json', required=True)
|
||||
|
||||
def post(self, pk):
|
||||
"""创建实例中的内嵌数据库对象"""
|
||||
# 解析参数
|
||||
args = self.request_parse.parse_args()
|
||||
|
||||
# 找到数据库服务器示例,传入的pk是数据库实例的id
|
||||
try:
|
||||
db_server = assetModel.DatabaseServer.objects(id=pk).first_or_404(message="db instance not found.")
|
||||
except:
|
||||
abort_response(404, code=1404, msg="db instance not found.")
|
||||
return
|
||||
|
||||
# 库名不能重复
|
||||
name = args.get("name")
|
||||
exists = db_server.databases.filter(name=name).first()
|
||||
if exists:
|
||||
abort_response(400, 1400, msg=f"数据库{name}在实例中已存在!")
|
||||
|
||||
# 加密存储密码
|
||||
if "password" in args:
|
||||
password = args["password"]
|
||||
if password:
|
||||
args["password"] = quick_crypto(password)
|
||||
|
||||
# 保存对象,追加到实例的数据库列表中
|
||||
try:
|
||||
obj = self.db_model(**args)
|
||||
db_server.databases.append(obj)
|
||||
db_server.save()
|
||||
except Exception as e:
|
||||
logger.exception(f"{self.db_model} 创建对象失败! data={args}")
|
||||
abort_response(500, 1500, msg=f"保存对象失败!{str(e)}")
|
||||
return
|
||||
# 返回创建信息
|
||||
return marshal(obj, self.db_fields)
|
||||
|
||||
|
||||
class DatabaseDetailViews(parsers.DatabaseParse, Resource):
|
||||
model = assetModel.DatabaseServer
|
||||
db_model = assetModel.Database
|
||||
db_fields = assetField.DatabaseFields
|
||||
|
||||
def __init__(self):
|
||||
self.init_parse()
|
||||
self.request_parse.add_argument("name", type=str, location='json', required=True)
|
||||
|
||||
def put(self, pk, db):
|
||||
"""创建实例中的内嵌数据库对象"""
|
||||
# 解析参数
|
||||
args = self.request_parse.parse_args()
|
||||
# 找到数据库服务器示例,传入的pk是数据库实例的id,db为内嵌数据库列表的对象id
|
||||
try:
|
||||
db_server = assetModel.DatabaseServer.objects(id=pk).first_or_404(message="db instance not found.")
|
||||
db_obj = db_server.databases.filter(id=db).first()
|
||||
assert db_obj
|
||||
except Exception as e:
|
||||
print(e)
|
||||
abort_response(404, code=1404, msg="db not found.")
|
||||
return
|
||||
name = args.get("name")
|
||||
if name:
|
||||
exists = db_server.databases.filter(name=name).first()
|
||||
if exists and exists.id != db_obj.id:
|
||||
abort_response(400, 1400, msg=f"数据库{name}在实例中已存在!")
|
||||
|
||||
# 若更新密码,重新加密保存
|
||||
if "password" in args:
|
||||
password = args["password"]
|
||||
if password != db_obj.password:
|
||||
args["password"] = quick_crypto(password)
|
||||
# 去除id
|
||||
args.pop("id", "")
|
||||
|
||||
# 更新内嵌对象
|
||||
try:
|
||||
db_server.databases.filter(id=db).update(**args)
|
||||
db_server.save()
|
||||
db_server.reload()
|
||||
except Exception as e:
|
||||
logger.exception(f"{self.db_model} 更新对象失败! data={args}")
|
||||
abort_response(500, 1500, msg=f"更新对象失败!{str(e)}")
|
||||
return
|
||||
# 重载数据
|
||||
db_obj = db_server.databases.filter(id=db).first()
|
||||
# 返回信息
|
||||
return marshal(db_obj, self.db_fields)
|
||||
|
||||
|
||||
class RedisInstanceViews(parsers.DatabaseServerParse, ListMixin, EncryptRequiredCreateView):
|
||||
model = assetModel.RedisInstance
|
||||
fields = assetField.RedisInstanceFields
|
||||
method_decorators = [session_or_token_required]
|
||||
filter_fields = (("name", "icontains"), ("host", "icontains"), ("manage", ""), ("tags", ""))
|
||||
encrypt_fields = ["password"]
|
||||
|
||||
def __init__(self):
|
||||
self.init_parse()
|
||||
self.request_parse.add_argument("name", required=True, type=str, location='json')
|
||||
self.request_parse.add_argument("host", required=True, type=str, location='json')
|
||||
self.request_parse.add_argument("manage", required=True, type=str, location='json')
|
||||
|
||||
self.request_parse.add_argument("port", required=False, type=str, location='json')
|
||||
self.request_parse.add_argument("memory", required=True, type=str, location='json')
|
||||
self.request_parse.add_argument("password", required=False, type=str, location='json')
|
||||
self.request_parse.add_argument("replicas", required=False, type=int, location='json')
|
||||
super(RedisInstanceViews, self).__init__()
|
||||
|
||||
|
||||
class RedisInstanceDetail(parsers.DatabaseServerParse, DestroyMixin, RetrieveMixin, EncryptRequiredUpdateView):
|
||||
model = assetModel.RedisInstance
|
||||
fields = assetField.RedisInstanceFields
|
||||
method_decorators = [session_or_token_required]
|
||||
encrypt_fields = ["password"]
|
||||
|
||||
def __init__(self):
|
||||
self.init_parse()
|
||||
self.request_parse.add_argument("name", required=False, type=str, location='json')
|
||||
self.request_parse.add_argument("host", required=False, type=str, location='json')
|
||||
self.request_parse.add_argument("manage", required=False, type=str, location='json')
|
||||
|
||||
self.request_parse.add_argument("port", required=False, type=str, location='json')
|
||||
self.request_parse.add_argument("memory", required=False, type=str, location='json')
|
||||
self.request_parse.add_argument("password", required=False, type=str, location='json')
|
||||
self.request_parse.add_argument("replicas", required=False, type=int, location='json')
|
||||
super().__init__()
|
||||
|
||||
|
||||
class NginxInstanceViews(parsers.MiddlewareParse, ListCreateViewSet):
|
||||
model = assetModel.NginxInstance
|
||||
fields = assetField.NginxInstanceFields
|
||||
filter_fields = (("host", "icontains"), ("manage", ""), ("url", "icontains"), ("tags", ""))
|
||||
method_decorators = [session_or_token_required]
|
||||
|
||||
def __init__(self):
|
||||
self.init_parse()
|
||||
self.request_parse.add_argument("host", required=True, type=str, location='json')
|
||||
self.request_parse.add_argument("manage", required=True, type=str, location='json')
|
||||
|
||||
self.request_parse.add_argument("port", required=False, type=str, location='json')
|
||||
self.request_parse.add_argument("url", required=True, type=str, location='json')
|
||||
super().__init__()
|
||||
|
||||
|
||||
class NginxInstanceDetail(parsers.MiddlewareParse, DetailViewSet):
|
||||
model = assetModel.NginxInstance
|
||||
fields = assetField.NginxInstanceFields
|
||||
method_decorators = [session_or_token_required]
|
||||
|
||||
def __init__(self):
|
||||
self.init_parse()
|
||||
self.request_parse.add_argument("host", required=False, type=str, location='json')
|
||||
self.request_parse.add_argument("manage", required=False, type=str, location='json')
|
||||
|
||||
self.request_parse.add_argument("port", required=False, type=str, location='json')
|
||||
self.request_parse.add_argument("url", required=False, type=str, location='json')
|
||||
super().__init__()
|
||||
|
||||
|
||||
class CDNViews(ListCreateViewSet):
|
||||
model = assetModel.CDN
|
||||
fields = assetField.CDNFields
|
||||
uniq_fields = ("domain",)
|
||||
filter_fields = (("domain", "icontains"), ("tags", ""),)
|
||||
method_decorators = [session_or_token_required]
|
||||
|
||||
def __init__(self):
|
||||
self.request_parse = reqparse.RequestParser()
|
||||
self.request_parse.add_argument("domain", required=True, type=str, location='json')
|
||||
|
||||
self.request_parse.add_argument("data", required=False, type=dict, location='json')
|
||||
self.request_parse.add_argument("tags", required=False, type=list, location='json')
|
||||
self.request_parse.add_argument("labels", required=False, type=dict, location='json')
|
||||
|
||||
|
||||
class CDNDetail(DetailViewSet):
|
||||
model = assetModel.CDN
|
||||
fields = assetField.CDNFields
|
||||
uniq_fields = ("domain",)
|
||||
method_decorators = [session_or_token_required]
|
||||
|
||||
def __init__(self):
|
||||
self.request_parse = reqparse.RequestParser()
|
||||
self.request_parse.add_argument("domain", required=False, type=str, location='json')
|
||||
|
||||
self.request_parse.add_argument("data", required=False, type=dict, location='json')
|
||||
self.request_parse.add_argument("tags", required=False, type=list, location='json')
|
||||
self.request_parse.add_argument("labels", required=False, type=dict, location='json')
|
|
@ -3,19 +3,21 @@
|
|||
有使用到该父类的部分方法,主要抽出部分请求参数定义、解析后的进一步校验,供 `post` 和 `put 请求方法使用
|
||||
"""
|
||||
|
||||
from flask import current_app as app
|
||||
from flask_restful import reqparse
|
||||
from flask import request
|
||||
from flask_restful import reqparse, inputs
|
||||
|
||||
from models.asset import models as assetModel
|
||||
from models.project import models as projectModel
|
||||
from common.utils import abort_response
|
||||
|
||||
|
||||
class ProjectParse:
|
||||
request_parse = None
|
||||
|
||||
def init_parse(self):
|
||||
def __init__(self):
|
||||
# 创建时必要的参数用此变量判断,更新默认都可以不传
|
||||
required = request.method == "POST"
|
||||
self.request_parse = reqparse.RequestParser()
|
||||
self.request_parse.add_argument("name", type=inputs.regex(r'^\w{4}$'), location='json', required=required)
|
||||
self.request_parse.add_argument("fork", type=inputs.regex(r'^\w{2}$'), location='json', required=required)
|
||||
self.request_parse.add_argument("domain", type=str, location='json')
|
||||
self.request_parse.add_argument("www_ip", type=str, location='json')
|
||||
self.request_parse.add_argument("ops_ip", type=str, location='json')
|
||||
|
@ -32,8 +34,12 @@ class ProjectParse:
|
|||
class ChannelParse:
|
||||
request_parse = None
|
||||
|
||||
def init_parse(self):
|
||||
def __init__(self):
|
||||
# 创建时必要的参数用此变量判断,更新默认都可以不传
|
||||
required = request.method == "POST"
|
||||
self.request_parse = reqparse.RequestParser()
|
||||
self.request_parse.add_argument("spid", type=str, location='json', required=required)
|
||||
self.request_parse.add_argument("project_id", type=str, location='json', required=required)
|
||||
|
||||
self.request_parse.add_argument("name", type=str, location='json')
|
||||
self.request_parse.add_argument("version", type=dict, location='json')
|
||||
|
@ -59,15 +65,21 @@ class ServerParse:
|
|||
"""views 中使用的解析、校验方法"""
|
||||
request_parse = None
|
||||
|
||||
def init_parse(self):
|
||||
def __init__(self):
|
||||
# 创建时必要的参数用此变量判断,更新默认都可以不传
|
||||
required = request.method == "POST"
|
||||
self.request_parse = reqparse.RequestParser()
|
||||
|
||||
self.request_parse.add_argument("num", type=int, location='json', required=required)
|
||||
self.request_parse.add_argument("channel_id", type=str, location='json', required=required)
|
||||
|
||||
self.request_parse.add_argument("data", type=dict, location='json')
|
||||
self.request_parse.add_argument("tags", type=list, location='json')
|
||||
self.request_parse.add_argument("labels", type=dict, location='json')
|
||||
|
||||
self.request_parse.add_argument("host_id", type=str, location='json')
|
||||
self.request_parse.add_argument("game_db_id", type=str, location='json')
|
||||
self.request_parse.add_argument("admin_db_id", type=str, location='json')
|
||||
# self.request_parse.add_argument("game_db_id", type=str, location='json')
|
||||
# self.request_parse.add_argument("admin_db_id", type=str, location='json')
|
||||
self.request_parse.add_argument("domain", type=str, location='json', default="")
|
||||
# status是枚举
|
||||
self.request_parse.add_argument("status", choices=projectModel.Server.STATUS.keys(),
|
||||
|
@ -85,16 +97,16 @@ class ServerParse:
|
|||
for field in projectModel.Version._fields:
|
||||
defaults[field] = version.get(field, "")
|
||||
args["version"] = projectModel.Version(**defaults)
|
||||
game_db_id = args.get("game_db_id")
|
||||
if game_db_id:
|
||||
try:
|
||||
assert assetModel.DatabaseServer.objects(databases__id=game_db_id).first()
|
||||
except:
|
||||
abort_response(400, 1400, msg="game_db_id not exists")
|
||||
admin_db_id = args.get("admin_db_id")
|
||||
if admin_db_id:
|
||||
try:
|
||||
assert assetModel.DatabaseServer.objects(databases__id=admin_db_id).first()
|
||||
except:
|
||||
abort_response(400, 1400, msg="admin_db_id not exists")
|
||||
# game_db_id = args.get("game_db_id")
|
||||
# if game_db_id:
|
||||
# try:
|
||||
# assert assetModel.DatabaseServer.objects(databases__id=game_db_id).first()
|
||||
# except:
|
||||
# abort_response(400, 1400, msg="game_db_id not exists")
|
||||
# admin_db_id = args.get("admin_db_id")
|
||||
# if admin_db_id:
|
||||
# try:
|
||||
# assert assetModel.DatabaseServer.objects(databases__id=admin_db_id).first()
|
||||
# except:
|
||||
# abort_response(400, 1400, msg="admin_db_id not exists")
|
||||
return args
|
||||
|
|
|
@ -19,11 +19,6 @@ class ProjectViews(parsers.ProjectParse, ListMixin, CreateMixin):
|
|||
method_decorators = [session_or_token_required]
|
||||
filter_fields = (("name", ""), ("fork", ""), ("ops_ip", ""), ("domain", "icontains"), ("tags", ""))
|
||||
|
||||
def __init__(self):
|
||||
self.init_parse()
|
||||
self.request_parse.add_argument("name", type=inputs.regex(r'^\w{4}$'), location='json', required=True)
|
||||
self.request_parse.add_argument("fork", type=inputs.regex(r'^\w{2}$'), location='json', required=True)
|
||||
|
||||
|
||||
class ProjectDetailViews(parsers.ProjectParse, DetailViewSet):
|
||||
model = Project
|
||||
|
@ -31,11 +26,6 @@ class ProjectDetailViews(parsers.ProjectParse, DetailViewSet):
|
|||
uniq_fields = (("name", "fork"),)
|
||||
method_decorators = [session_or_token_required]
|
||||
|
||||
def __init__(self):
|
||||
self.init_parse()
|
||||
self.request_parse.add_argument("name", type=inputs.regex(r'^\w{4}$'), location='json', required=False)
|
||||
self.request_parse.add_argument("fork", type=inputs.regex(r'^\w{2}$'), location='json', required=False)
|
||||
|
||||
|
||||
class ChannelViews(parsers.ChannelParse, ListCreateViewSet):
|
||||
model = Channel
|
||||
|
@ -45,12 +35,6 @@ class ChannelViews(parsers.ChannelParse, ListCreateViewSet):
|
|||
method_decorators = [session_or_token_required]
|
||||
filter_fields = (("name", ""), ("spid", ""), ("tags", ""))
|
||||
|
||||
def __init__(self):
|
||||
self.init_parse()
|
||||
self.request_parse.add_argument("spid", type=str, location='json', required=True)
|
||||
self.request_parse.add_argument("project_id", type=str, location='json', required=True)
|
||||
super().__init__()
|
||||
|
||||
def get_queryset(self):
|
||||
self.queryset = self.model.objects
|
||||
project_full_name = request.args.get("project")
|
||||
|
@ -71,12 +55,6 @@ class ChannelDetailViews(parsers.ChannelParse, DetailViewSet):
|
|||
relation_fields = (("project_id", Project, True),)
|
||||
method_decorators = [session_or_token_required]
|
||||
|
||||
def __init__(self):
|
||||
self.init_parse()
|
||||
self.request_parse.add_argument("spid", type=str, location='json', required=False)
|
||||
self.request_parse.add_argument("project_id", type=str, location='json', required=False)
|
||||
super().__init__()
|
||||
|
||||
|
||||
class ServerViews(parsers.ServerParse, ListCreateViewSet):
|
||||
model = Server
|
||||
|
@ -86,11 +64,6 @@ class ServerViews(parsers.ServerParse, ListCreateViewSet):
|
|||
relation_fields = (("host_id", assetModel.Host, ""), ("channel_id", Channel, True))
|
||||
filter_fields = (("num", ""), ("spid", ""), ("tags", ""), ("channel_id", ""), ("host_id", ""))
|
||||
|
||||
def __init__(self):
|
||||
self.init_parse()
|
||||
self.request_parse.add_argument("num", type=int, location='json', required=True)
|
||||
self.request_parse.add_argument("channel_id", type=str, location='json', required=True)
|
||||
|
||||
def get_queryset(self):
|
||||
"""这些都是有关联的查询,模型内部字段的匹配字段放在 `filter_fields` 中"""
|
||||
project = None
|
||||
|
@ -122,8 +95,3 @@ class ServerDetailView(parsers.ServerParse, DetailViewSet):
|
|||
uniq_fields = (("num", "channel_id"),)
|
||||
method_decorators = [session_or_token_required]
|
||||
relation_fields = (("host_id", assetModel.Host, ""), ("channel_id", Channel, True))
|
||||
|
||||
def __init__(self):
|
||||
self.init_parse()
|
||||
self.request_parse.add_argument("num", type=int, location='json')
|
||||
self.request_parse.add_argument("channel_id", type=str, location='json')
|
||||
|
|
Loading…
Reference in New Issue