|
|
# -*- coding: utf-8 -*-
|
|
|
import logging
|
|
|
import os
|
|
|
import requests
|
|
|
|
|
|
from sqlalchemy import text
|
|
|
|
|
|
from website import consts
|
|
|
from website import db_mysql
|
|
|
from website import errors
|
|
|
from website import settings
|
|
|
from website.handler import APIHandler, authenticated
|
|
|
|
|
|
|
|
|
class ListHandler(APIHandler):
|
|
|
"""
|
|
|
- 描述: 模型运行库列表
|
|
|
- 请求方式:post
|
|
|
- 请求参数:
|
|
|
> - pageNo, int
|
|
|
> - pageSize, int
|
|
|
> - name, string, 名称
|
|
|
- 返回值:
|
|
|
```
|
|
|
{
|
|
|
"count": 123,
|
|
|
"data": [
|
|
|
{
|
|
|
"id": 123,
|
|
|
"name": "xx",
|
|
|
"create_time": "xxx",
|
|
|
"update_time": "xxx"
|
|
|
},
|
|
|
...
|
|
|
]
|
|
|
}
|
|
|
```
|
|
|
"""
|
|
|
|
|
|
@authenticated
|
|
|
def post(self):
|
|
|
pageNo = self.get_int_argument("pageNo", 1)
|
|
|
pageSize = self.get_int_argument("pageSize", consts.PAGE_SIZE)
|
|
|
name = self.get_escaped_argument("name", "")
|
|
|
|
|
|
result = []
|
|
|
count = 0
|
|
|
|
|
|
with self.app_mysql.connect() as conn:
|
|
|
sql = "select id, name, path, create_time, update_time from model_hub where 1=1"
|
|
|
param = {}
|
|
|
|
|
|
sql_count = "select count(id) from model_hub where 1=1"
|
|
|
param_count = {}
|
|
|
|
|
|
if name:
|
|
|
sql += " and name like :name"
|
|
|
param["name"] = "%{}%".format(name)
|
|
|
|
|
|
sql_count += " and name like :name"
|
|
|
param_count["name"] = "%{}%".format(name)
|
|
|
|
|
|
sql += " order by id desc limit :pageSize offset :offset"
|
|
|
param["pageSize"] = pageSize
|
|
|
param["offset"] = (pageNo - 1) * pageSize
|
|
|
|
|
|
cur = conn.execute(text(sql), param)
|
|
|
result = db_mysql.to_json_list(cur)
|
|
|
|
|
|
count = conn.execute(text(sql_count), param_count).fetchone()[0]
|
|
|
|
|
|
data = []
|
|
|
for item in result:
|
|
|
data.append(
|
|
|
{
|
|
|
"id": item["id"],
|
|
|
"name": item["name"],
|
|
|
"path": item["path"],
|
|
|
"create_time": item["create_time"].strftime("%Y-%m-%d %H:%M:%S"),
|
|
|
"update_time": item["update_time"].strftime("%Y-%m-%d %H:%M:%S"),
|
|
|
}
|
|
|
)
|
|
|
|
|
|
self.finish({"count": count, "data": data})
|
|
|
|
|
|
|
|
|
class SyncHandler(APIHandler):
|
|
|
"""
|
|
|
- 描述: 查询docker registry中的镜像
|
|
|
- 请求方式:post
|
|
|
- 请求参数:
|
|
|
> - host, string, ip地址
|
|
|
> - port, int, 端口
|
|
|
- 返回值:
|
|
|
```
|
|
|
{
|
|
|
"data": [
|
|
|
"xxx", # docker registry中docker images的地址
|
|
|
"xxx",
|
|
|
...
|
|
|
]
|
|
|
}
|
|
|
```
|
|
|
"""
|
|
|
|
|
|
@authenticated
|
|
|
def post(self):
|
|
|
host = self.get_escaped_argument("host", "")
|
|
|
port = self.get_int_argument("port")
|
|
|
if not host or not port:
|
|
|
raise errors.HTTPAPIError(
|
|
|
errors.ERROR_BAD_REQUEST, "host and port must be provided."
|
|
|
)
|
|
|
|
|
|
images = []
|
|
|
# 查询docker registry中的镜像
|
|
|
repositories = requests.get(
|
|
|
"http://{}:{}/v2/_catalog".format(host, port)
|
|
|
).json()["repositories"]
|
|
|
for repository in repositories:
|
|
|
# 查询docker registry中的镜像的tag
|
|
|
tags = requests.get(
|
|
|
"http://{}:{}/v2/{}/tags/list".format(host, port, repository)
|
|
|
).json()["tags"]
|
|
|
for tag in tags:
|
|
|
image_name = "{}:{}/{}:{}".format(host, port, repository, tag)
|
|
|
images.append(image_name)
|
|
|
self.finish({"data": images})
|
|
|
|
|
|
|
|
|
class AddHandler(APIHandler):
|
|
|
"""
|
|
|
- 描述: 新建模型运行库
|
|
|
- 请求方式:post
|
|
|
- 请求参数:
|
|
|
> - name, string, 名称
|
|
|
> - host, string,
|
|
|
> - port, int
|
|
|
> - path, string, 镜像路径
|
|
|
> - comment, string, 备注
|
|
|
- 返回值:无
|
|
|
"""
|
|
|
|
|
|
@authenticated
|
|
|
def post(self):
|
|
|
name = self.get_escaped_argument("name", "")
|
|
|
host = self.get_escaped_argument("host", "")
|
|
|
port = self.get_int_argument("port")
|
|
|
path = self.get_escaped_argument("path", "")
|
|
|
comment = self.get_escaped_argument("comment", "")
|
|
|
if not name or not host or not port:
|
|
|
raise errors.HTTPAPIError(
|
|
|
errors.ERROR_BAD_REQUEST, "name and host and port must be provided."
|
|
|
)
|
|
|
|
|
|
with self.app_mysql.connect() as conn:
|
|
|
conn.execute(
|
|
|
text(
|
|
|
"""insert into model_hub (name, host, port, path, comment, create_time, update_time)
|
|
|
values (:name, :host, :port, :path, :comment, NOW(), NOW())"""
|
|
|
),
|
|
|
{
|
|
|
"name": name,
|
|
|
"host": host,
|
|
|
"port": port,
|
|
|
"path": path,
|
|
|
"comment": comment,
|
|
|
},
|
|
|
)
|
|
|
|
|
|
conn.commit()
|
|
|
|
|
|
self.finish()
|
|
|
|
|
|
|
|
|
class EditHandler(APIHandler):
|
|
|
"""
|
|
|
- 描述: 编辑模型运行库
|
|
|
- 请求方式:post
|
|
|
- 请求参数:
|
|
|
> - id, int
|
|
|
> - name, string, 名称
|
|
|
> - host, string,
|
|
|
> - port, int
|
|
|
> - path, string, 镜像路径
|
|
|
> - comment, string, 备注
|
|
|
- 返回值:无
|
|
|
"""
|
|
|
|
|
|
@authenticated
|
|
|
def post(self):
|
|
|
id = self.get_int_argument("id")
|
|
|
name = self.get_escaped_argument("name", "")
|
|
|
host = self.get_escaped_argument("host", "")
|
|
|
port = self.get_int_argument("port")
|
|
|
path = self.get_escaped_argument("path", "")
|
|
|
comment = self.get_escaped_argument("comment", "")
|
|
|
if not id or not name or not host or not port or path:
|
|
|
raise errors.HTTPAPIError(errors.ERROR_BAD_REQUEST, "parameter error")
|
|
|
with self.app_mysql.connect() as conn:
|
|
|
conn.execute(
|
|
|
text(
|
|
|
"""update model_hub set name=:name, host=:host, port=:port, path=:path, comment=:comment, update_time=NOW()
|
|
|
where id=:id"""
|
|
|
),
|
|
|
{
|
|
|
"id": id,
|
|
|
"name": name,
|
|
|
"host": host,
|
|
|
"port": port,
|
|
|
"path": path,
|
|
|
"comment": comment,
|
|
|
},
|
|
|
)
|
|
|
conn.commit()
|
|
|
self.finish()
|
|
|
|
|
|
|
|
|
class InfoHandler(APIHandler):
|
|
|
"""
|
|
|
- 描述: 模型运行库信息
|
|
|
- 请求方式:post
|
|
|
- 请求参数:
|
|
|
> - id, int
|
|
|
- 返回值:
|
|
|
```
|
|
|
{
|
|
|
"name": "xxx",
|
|
|
"host": "xxx",
|
|
|
"port": 123,
|
|
|
"path": "xxx",
|
|
|
"comment": "xxx",
|
|
|
}
|
|
|
```
|
|
|
"""
|
|
|
|
|
|
@authenticated
|
|
|
def post(self):
|
|
|
hid = self.get_int_argument("id")
|
|
|
if not id:
|
|
|
raise errors.HTTPAPIError(errors.ERROR_BAD_REQUEST, "parameter error")
|
|
|
|
|
|
result = {}
|
|
|
with self.app_mysql.connect() as conn:
|
|
|
cur = conn.execute(
|
|
|
text(
|
|
|
"""select name, host, port, path, comment from model_hub where id=:id"""
|
|
|
),
|
|
|
{"id": hid},
|
|
|
)
|
|
|
result = db_mysql.to_json(cur)
|
|
|
if not result:
|
|
|
raise errors.HTTPAPIError(
|
|
|
errors.ERROR_BAD_REQUEST, "model hub not found"
|
|
|
)
|
|
|
self.finish(result)
|
|
|
|
|
|
|
|
|
class DeleteHandler(APIHandler):
|
|
|
"""
|
|
|
- 描述: 删除模型运行库
|
|
|
- 请求方式:post
|
|
|
- 请求参数:
|
|
|
> - id, int
|
|
|
- 返回值:无
|
|
|
"""
|
|
|
|
|
|
@authenticated
|
|
|
def post(self):
|
|
|
hid = self.get_int_argument("id")
|
|
|
if not id:
|
|
|
raise errors.HTTPAPIError(errors.ERROR_BAD_REQUEST, "parameter error")
|
|
|
with self.app_mysql.connect() as conn:
|
|
|
conn.execute(text("""delete from model_hub where id=:id"""), {"id": hid})
|
|
|
conn.commit()
|
|
|
self.finish()
|