127 lines
4.9 KiB
Plaintext
127 lines
4.9 KiB
Plaintext
async def new_cluster(params_kw={}):
|
||
# params_kw:
|
||
# cpcid
|
||
# cluster_type
|
||
# ctl_nodeid
|
||
# cluster_name
|
||
debug(f'{params_kw=}')
|
||
dbname = 'kboss'
|
||
db = DBPools()
|
||
cpcid = params_kw.cpcid
|
||
nodeid = params_kw.ctl_nodeid
|
||
cluster_type = params_kw.cluster_type
|
||
cluster_name = params_kw.cluster_name
|
||
enable_date = params_kw.enable_date
|
||
export_date = params_kw.export_date
|
||
# debug(f"=====> {cluster_type=} {cluster_name=} {nodeid=} {cpcid=}")
|
||
|
||
async with db.sqlorContext(dbname) as sor:
|
||
cpcs = await sor.R('cpclist', {'id': cpcid})
|
||
if len(cpcs) < 1:
|
||
e = Exception(f'cpclist {cpcid=} not exists')
|
||
exception(f'{e}')
|
||
raise e
|
||
cpc = cpcs[0]
|
||
nodes = await sor.R('cpcnode', {'id': nodeid})
|
||
# 这里有问题:没有匹配到节点信息!!!
|
||
if len(nodes) < 1:
|
||
e = Exception(f'cpcnode {nodeid=} 节点基础信息不匹配')
|
||
exception(f'{e}')
|
||
raise e
|
||
node = nodes[0]
|
||
url = cpc.pcapi_url + "/pcapi/api/v1/cluster/common/new_cluster"
|
||
debug(f"请求url: {url=}")
|
||
debug(f"目标IP认证信息: {node.ip=} {node.sshport=} {node.adminuser=} {node.adminpwd=}")
|
||
# 请求方式待定,取决于获取参数值方式
|
||
pcapi_user = cpc.api_user
|
||
pcapi_passwd = cpc.api_pwd
|
||
debug(f'pacpi auth: {pcapi_user} + {pcapi_passwd}')
|
||
headers = basic_auth_headers(pcapi_user, pcapi_passwd)
|
||
hc = HttpClient()
|
||
import requests
|
||
params = {
|
||
'cluster_type': cluster_type,
|
||
'host': node.ip,
|
||
'port': node.sshport,
|
||
'user': node.adminuser,
|
||
'password': node.adminpwd,
|
||
'role': "master"
|
||
}
|
||
debug(f'{params=}')
|
||
|
||
clusterid = uuid()
|
||
debug(f"###集群新增数据盘部件库存(目前采用控制节点上提供NFS共享存储服务,即容器数据盘)")
|
||
|
||
#已手动执行,代码不用做更改了
|
||
#alert_sql = f'''alter table cpcwidget add unique key unique_cpc_entry (cpcid, type, clusterid, model)'''
|
||
#debug(f'{alert_sql=}')
|
||
#await sor.sqlExe(alert_sql, {})
|
||
|
||
disk_data_stock_tuple = (uuid(), cpcid, 'disk', 'DATA', 'Gi', clusterid, node.datadisk_stock)
|
||
debug(f'{disk_data_stock_tuple=}')
|
||
|
||
cluster_disk_sys_stock_sql = f'''insert into cpcwidget (id, cpcid, type, model, resource_unit, clusterid, stock)
|
||
values {disk_data_stock_tuple} on duplicate key update stock = greatest(stock + {node.datadisk_stock}, 0)'''
|
||
|
||
debug(f'{cluster_disk_sys_stock_sql=}')
|
||
await sor.sqlExe(cluster_disk_sys_stock_sql, {})
|
||
|
||
await_resp = await async_post(
|
||
url=url,
|
||
headers=headers,
|
||
data=params,
|
||
timeout=600,
|
||
verify=False
|
||
)
|
||
status_code = await_resp.get('status_code',505)
|
||
if status_code != 200:
|
||
raise
|
||
return {'status': False, 'msg': f'算力中心服务操作失败{status_code}'}
|
||
resp = await_resp.get("content")
|
||
todatas = json.loads(resp).get('data')
|
||
debug(f"todatas: {todatas=}")
|
||
if not todatas:
|
||
return {'status': False, 'msg': f'安装失败,算力中心返回{todatas}'}
|
||
todatas = todatas.split("###")
|
||
clusterjoin = todatas[0]
|
||
kubeconfig_context = todatas[1]
|
||
# 目前以集群上下文的实体长度来判断集群是否安装正常
|
||
if len(kubeconfig_context) < 2000:
|
||
raise "集群上下文异常"
|
||
if json.loads(resp).get("status") == True:
|
||
# new cluster info write to database
|
||
# update node_status to '1' cpcnode record identify by ctl_nodeid ctl_node
|
||
ns = {
|
||
'id': clusterid,
|
||
'clustertype': cluster_type,
|
||
'cpcid': cpcid,
|
||
'controllerid': nodeid,
|
||
'name': cluster_name,
|
||
'enable_date': enable_date,
|
||
'export_date': export_date,
|
||
'clusterjoin': clusterjoin,
|
||
'kubeconfig': kubeconfig_context,
|
||
'ready': 1
|
||
}
|
||
debug(f"新创建的集群元数据: {ns=}")
|
||
await sor.C('cpccluster', ns)
|
||
node_ns = {
|
||
'id': nodeid,
|
||
'node_status': '1',
|
||
'clusterid': clusterid,
|
||
'cpcid': cpcid,
|
||
'role': 'master'
|
||
}
|
||
debug(f"更新控制节点元数据 {node_ns=}")
|
||
await sor.U('cpcnode', node_ns)
|
||
|
||
return {'status': True,'msg': f'操作成功! 加入集群凭证: {clusterjoin}','data': node_ns}
|
||
else:
|
||
raise
|
||
return {'status': False, 'msg': '算力中心服务操作失败'}
|
||
|
||
return {'status': False, 'msg': '创建失败'}
|
||
|
||
ret = await new_cluster(params_kw)
|
||
return ret
|