新增资产相关视图,模型的增删查改接口

This commit is contained in:
chenzuoqing 2021-12-08 11:24:45 +08:00
parent b6686adef5
commit 58d8cdf3d5
4 changed files with 131 additions and 25 deletions

View File

@ -67,6 +67,7 @@ RedisInstanceFields = {
RedisInstanceFields.update(DatabaseServerFields) RedisInstanceFields.update(DatabaseServerFields)
MiddlewareFields = { MiddlewareFields = {
"id": fields.String,
"host": fields.String, "host": fields.String,
"manage": fields.String, "manage": fields.String,
"data": fields.Raw, "data": fields.Raw,
@ -74,8 +75,17 @@ MiddlewareFields = {
"labels": fields.Raw, "labels": fields.Raw,
} }
NginxInstance = { NginxInstanceFields = {
"port": fields.Integer, "port": fields.Integer,
"url": fields.String, "url": fields.String,
} }
NginxInstance.update(MiddlewareFields) NginxInstanceFields.update(MiddlewareFields)
# CDN 序列化字段
CDNFields = {
"id": fields.String,
"domain": fields.String,
"data": fields.Raw,
"tags": fields.List(fields.String),
"labels": fields.Raw,
}

View File

@ -74,7 +74,7 @@ class RedisInstance(DatabaseServer):
port = mongo.IntField(default=6379) port = mongo.IntField(default=6379)
memory = mongo.IntField(required=True) memory = mongo.IntField(required=True)
replicas = mongo.IntField(required=True, default=0) replicas = mongo.IntField(required=True, default=0)
password = mongo.StringField(max_length=128, required=True) password = mongo.StringField(max_length=128, default="")
class Middleware(DocumentBase): class Middleware(DocumentBase):
@ -92,12 +92,13 @@ class Middleware(DocumentBase):
class NginxInstance(Middleware): class NginxInstance(Middleware):
"""nginx服务器""" """nginx服务器"""
port = mongo.IntField(default=80) port = mongo.IntField(default=80)
url = mongo.StringField(required=True) url = mongo.StringField(max_length=128, default="/")
class CDN(DocumentBase): class CDN(DocumentBase):
"""cdn域名""" """cdn域名"""
domain = mongo.StringField(max_length=256, required=True) # cdn域名 domain = mongo.StringField(max_length=256, required=True) # cdn域名
data = mongo.DictField(default=dict)
# 标记和标签 # 标记和标签
tags = mongo.ListField(mongo.StringField(), default=list) # tags 默认是空列表 tags = mongo.ListField(mongo.StringField(), default=list) # tags 默认是空列表
labels = mongo.DictField(default=dict) labels = mongo.DictField(default=dict)

View File

@ -14,3 +14,12 @@ api.add_resource(views.HostDetailViews, '/host/<string:pk>/', endpoint="host-det
api.add_resource(views.MySQLInstanceViews, '/database/mysql/', endpoint="db-mysql") api.add_resource(views.MySQLInstanceViews, '/database/mysql/', endpoint="db-mysql")
api.add_resource(views.MySQLInstanceDetail, '/database/mysql/<string:pk>/', endpoint="db-mysql-detail") api.add_resource(views.MySQLInstanceDetail, '/database/mysql/<string:pk>/', endpoint="db-mysql-detail")
api.add_resource(views.RedisInstanceViews, '/database/redis/', endpoint="db-redis")
api.add_resource(views.RedisInstanceDetail, '/database/redis/<string:pk>/', endpoint="db-redis-detail")
api.add_resource(views.NginxInstanceViews, '/middleware/nginx/', endpoint="middleware-nginx")
api.add_resource(views.NginxInstanceDetail, '/middleware/nginx/<string:pk>/', endpoint="middleware-nginx-detail")
api.add_resource(views.CDNViews, '/cdn/', endpoint="cdn")
api.add_resource(views.CDNDetail, '/cdn/<string:pk>/', endpoint="cdn-detail")

View File

@ -4,14 +4,13 @@ from flask_restful import reqparse
from asset import fields from asset import fields
from asset import models from asset import models
from common.views import ListCreateViewSet, DetailViewSet from common.views import ListCreateViewSet, DetailViewSet
from common.utils import abort_response
class HostParse: class HostParse:
model = None model = None
request_parse = None request_parse = None
uniq_fields = ("public_ip", "minion_id")
def init_parse(self): def init_parse(self):
self.request_parse = reqparse.RequestParser() self.request_parse = reqparse.RequestParser()
@ -27,25 +26,14 @@ class HostParse:
self.request_parse.add_argument("tags", required=False, type=list, 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') self.request_parse.add_argument("labels", required=False, type=dict, location='json')
def validate_or_abort(self, args, obj=None):
"""判断是否冲突"""
exists = self.model.objects(public_ip=args.get('public_ip', '')).first()
if exists:
if obj and exists.id == obj.id: # 同个对象,不算冲突
return
# 截断请求
abort_response(400, 1001, msg="ip已存在")
def pre_create(self, args): def pre_create(self, args):
# 标记创建时间 # 标记创建时间
args["created"] = datetime.datetime.now() args["created"] = datetime.datetime.now()
self.validate_or_abort(args)
return args return args
def pre_update(self, obj, args): def pre_update(self, obj, args):
if "created" in args: if "created" in args:
args.pop("created") args.pop("created")
self.validate_or_abort(args, obj)
return args return args
@ -71,23 +59,18 @@ class HostDetailViews(HostParse, DetailViewSet):
class DatabaseServerParse: class DatabaseServerParse:
model = None
request_parse = None request_parse = None
# 给子类用的唯一字段,用于校验
uniq_fields = ("name", "host", "domain")
def init_parse(self): def init_parse(self):
self.request_parse = reqparse.RequestParser() self.request_parse = reqparse.RequestParser()
self.request_parse.add_argument("domain", required=False, type=str, location='json') 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("tags", required=False, type=list, location='json')
self.request_parse.add_argument("labels", required=False, type=dict, location='json') self.request_parse.add_argument("labels", required=False, type=dict, location='json')
class RedisInstanceParse(DatabaseServerParse):
def init_parse(self):
super(RedisInstanceParse, self).init_parse()
self.request_parse.add_argument("port", required=False, type=int, location='json')
class MySQLInstanceViews(DatabaseServerParse, ListCreateViewSet): class MySQLInstanceViews(DatabaseServerParse, ListCreateViewSet):
model = models.MySQLInstance model = models.MySQLInstance
fields = fields.MySQLInstanceFields fields = fields.MySQLInstanceFields
@ -125,3 +108,106 @@ class MySQLInstanceDetail(DatabaseServerParse, DetailViewSet):
self.request_parse.add_argument("memory", 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') self.request_parse.add_argument("core", required=False, type=int, location='json')
super(MySQLInstanceDetail, self).__init__() super(MySQLInstanceDetail, self).__init__()
class RedisInstanceViews(DatabaseServerParse, ListCreateViewSet):
model = models.RedisInstance
fields = fields.RedisInstanceFields
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(DatabaseServerParse, DetailViewSet):
model = models.RedisInstance
fields = fields.RedisInstanceFields
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 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')
class NginxInstanceViews(MiddlewareParse, ListCreateViewSet):
model = models.NginxInstance
fields = fields.NginxInstanceFields
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(MiddlewareParse, DetailViewSet):
model = models.NginxInstance
fields = fields.NginxInstanceFields
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 = models.CDN
fields = fields.CDNFields
uniq_fields = ("domain",)
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 = models.CDN
fields = fields.CDNFields
uniq_fields = ("domain",)
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')