使用Python调用ManageOne运营API
【摘要】 使用Python调用ManageOne运营API在运营环境中遇到一个需求,就是如何很方便的获取环境中各租户的资源使用情况,这里可以使用python requests 的方式来操作。首先要通过API获取数据import requestsimport jsonres_body = {"auth": { "identity": { "metho...
首先要通过API获取数据
import requests
import json
res_body = {"auth": {
"identity": {
"methods": ["password"],
"password": {
"user": {
"domain": {
"name": "mo_bss_admin"
},
"name": "xxx",
"password": "xxx",
}
}
},
"scope":
{
"domain":
{
"name": "mo_bss_admin"
},
},
},
}
res_headers = {
'Content-Type': 'application/json',
'Accept': 'application/json; charset=UTF-8'
}
res_url = "https://iam-apigateway-proxy.demo.com/v3/auth/tokens"
res = requests.post(url = res_url, headers = res_headers, json = res_body, verify = False)
# 将token从headers中提取出来
token = res.headers['X-Subject-Token']
MIIEEgYJKoZIhvcNAQcCoIIEAzCCxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxmgOHw=
import copy
# 使用token获取vdc的列表
url1 = "https://sc.demo.com/rest/vdc/v3.0/vdcs?start=0&limit=1000"
new_headers = copy.deepcopy(res_headers)
new_headers['X-Auth-Token'] = token
res1 = requests.get(url=url1, headers = new_headers, verify=False)
parsed = json.loads(res1.text)
print(res1.status_code, "\n\r", json.dumps(parsed, indent=4, sort_keys=True))
200
# 这里只展示其中一个vdc
{
"total": 1,
"vdcs": [
{
"az_id": null,
"create_at": 1589418019000,
"create_user_id": "385xxxxxxxxxd",
"create_user_name": "bss_admin",
"description": "",
"domain_id": "ea3xxxxxxxxx60",
"domain_name": "demo",
"ecs_used": 0.0,
"enabled": true,
"enterprise_id": null,
"enterprise_project_id": null,
"evs_used": 0.0,
"extra": "{\"manager\":\"\",\"phone\":\"\",\"email\":\"\"}",
"id": "bdc8cxxxxxxxxxxxxxxxxxx32a6a", # vdc的id
"idp_name": null,
"ldap_id": null,
"level": 2, # 2级vdc
"name": "demo",
"project_count": 1,
"region_id": null,
"tag": "vdc",
"third_id": null,
"third_type": "0",
"top_vdc_id": "d9xxxxxxxxxxxxxxxxxxxxxxxxxxxx72",
"upper_vdc_id": "d9xxxxxxxxxxxxxxxxxxxxxxxxxxxx72",
"upper_vdc_name": "demo",
"utc_create_at": "2020-05-14 01:00:19.0"
},
]
}
这里会将所有vdc的基本信息获取到,我们需要将vdc id记录下来,后面会用到。
import re
c = []
count = 0
id_dict = {}
for i in parsed['vdcs']:
id_dict[i['name']] = i['id']
# 将vdc的id打印出来
print("{0:<25}".format(i['name']),":",i['id'])
demo : d9xxxxxxxxxxxxxxxxxxxxxxxxxxxx72
利用vdc id去获取vdc的全部细节。这里可以使用一个for循环对所有的vdc进行标准化处理。
url2 = "https://sc.demo.com/rest/vdc/v3.0/vdcs/{}/details"
vid = "d9xxxxxxxxxxxxxxxxxxxxxxxxxxxx72"
res2 = requests.get(url=url2.format(vid),headers = new_headers,verify=False)
parsed1 = json.loads(res2.text)
print(res2.status_code,json.dumps(parsed1, indent=4, sort_keys=True))
返回的json示例如下(示例内容选自《ManageOne 8.0.0 运营面API参考》)
200 {
"vdc": {
"domain_id": "f8310f0f46f04656b10475d260b3026f",
"domain_name": "baiqiang1",
"upper_vdc_id": "0",
"regions": [{
"cloud_infras": [{
"quotas": [{
"service_id": "nfvivpc",
"resources": [{
"local_used": 45001,
"resource": "vpc",
"other_limit": 50000,
"other_used": 50001,
"local_limit": 50000
}]
}],
"name": "xian-alpha-2",
"cloud_infra_id": "NFVI_xian-alpha-2",
"status": "normal",
"available_zones": [{
"quotas": [{
"service_id": "nfviecs",
"resources": [{
"local_used": 0,
"resource": "cores",
"other_limit": 100000,
"other_used": 110002,
"local_limit": 100000
}]
}],
"az_id": "fsp.type2"
}]
}],
"name": "{\"zh_cn\":\"alpha-2\",\"en_us\":\"xian-alpha-2\"}",
"region_id": "xian-alpha-2",
"type": "private_cloud"
}],
"regionId": "xian-beta2-1",
"status": "normal"
}],
"level": 1,
"name": "baiqiang1",
"description": "",
"id": "a24b93f0-2c17-4c2f-b14c-0fb8128a1a5a",
"create_at": 1512169700000,
"enabled": true
}
}
VDCDetailsResponses对象包含如下属性:
参数 | 是否必选 | 类型 | 值域 | 说明 |
---|---|---|---|---|
vdc | 否 | VDCDetailBean对象 | 无 | VDC信息。 |
VDCDetailBean对象包含如下属性:
参数 | 是否必选 | 类型 | 值域 | 说明 |
---|---|---|---|---|
id | 否 | string | 无 | VDC id,只能包含小写字母、数字、中划线,长度在1-36之间。 |
name | 否 | string | 无 | VDC 名称。 |
tag | 否 | string | 无 | VDC 类型。 |
description | 否 | string | 无 | VDC 描述。 |
upper_vdc_id | 否 | string | 无 | 上级VDC id,只能包含小写字母、数字、中划线,长度在1-36之间。 |
upper_vdc_name | 否 | string | 无 | 上级 VDC 名称。 |
top_vdc_id | 否 | string | 无 | 一级VDC id,只能包含小写字母、数字、中划线,长度在1-36之间。 |
extra | 否 | object | 无 | 扩展信息。 |
ecs_used | 否 | double | 无 | ECS 总数。 |
evs_used | 否 | double | 无 | EVS 总数。 |
project_count | 否 | int32 | 无 | 项目总数。 |
enabled | 否 | boolean | true,false | VDC使能开关。 |
domain_id | 否 | string | 无 | 域标识,长度在1-36之间。 |
level | 否 | int32 | 无 | VDC级别,取值在1-5之间。 |
create_user_id | 否 | string | 无 | 创建用户ID。 |
create_user_name | 否 | string | 无 | 创建用户名称。 |
create_at | 否 | int64 | 无 | 创建时间。 |
utc_create_at | 否 | string | 无 | 创建时间。 |
domain_name | 否 | string | 无 | 域名称。 |
ldap_id | 否 | string | 无 | AD id,只能包含小写字母、数字、中划线,长度在1-36之间。 |
mfa_status | 否 | string | 无 | 该租户下用户是否开启双因子认证,false默认不开启。 |
process_id | 否 | string | 无 | 审批流程ID,只能包含小写字母、数字、中划线,长度为1-36个字符。 |
third_type | 否 | string | 无 | 对接类型,1表示对接SAML,2表示ldap |
enterprise_id | 否 | string | 无 | 华为云帐户。 |
enterprise_project_id | 否 | string | 无 | 华为云项目ID。 |
cloud_federation_status | 否 | boolean | true,false | 华为云状态。 |
cloud_federation_rate | 否 | Map<object, object> | 无 | 华为云使用率。 |
regions | 否 | List<Region> | 无 | 区域信息。 |
Region对象包含如下属性:
参数 | 是否必选 | 类型 | 值域 | 说明 |
---|---|---|---|---|
region_id | 是 | string | 无 | 地域ID,长度在1-32之间。 |
action | 否 | string | 无 | 服务操作参数,取值范围 bind,unbind,modify。VDC创建时指定为bind,不校验,配额修改时默认为modify。 |
name | 否 | string | 无 | 地域名称,长度在1-512之间,只读参数。 |
type | 否 | string | 无 | 地域类型,包含private_cloud、public_cloud等,只读参数。 |
status | 否 | string | 无 | 地域类型,包含private_cloud、public_cloud等,只读参数。 |
cloud_infras | 否 | List<Cloud_infra> | 无 | 资源池配额。 |
Cloud_infra对象包含如下属性:
参数 | 是否必选 | 类型 | 值域 | 说明 |
---|---|---|---|---|
cloud_infra_id | 否 | string | 无 | 资源池ID,长度在1-64之间。 |
name | 否 | string | 无 | 资源池区名称,长度在1-255之间,只读参数。 |
type | 否 | string | 无 | 资源池区类型,长度在1-255之间,只读参数。 |
status | 否 | string | 无 | 资源池状态,包含normal、abnormal等,只读参数。 |
available_zones | 否 | List<Available_zone> | 无 | 可用分区配额。 |
quotas | 否 | List<Quota> | 无 | 资源池配额。 |
Available_zone对象包含如下属性:
参数 | 是否必选 | 类型 | 值域 | 说明 |
---|---|---|---|---|
az_id | 否 | string | 无 | 可用分区ID,长度在1-128之间。 |
name | 否 | string | 无 | 可用分区名称,长度在1-255之间,只读参数。 |
status | 否 | string | 无 | 可用分区状态,包含normal、abnormal等,只读参数。 |
type | 否 | string | 无 | 可用分区类型,只读参数。 |
extend_param | 否 | string | 无 | 拓展参数,只读参数。 |
cloud_infra_id | 否 | string | 无 | 资源池ID,长度在1-64之间。 |
quotas | 否 | List<Quota> | 无 | 可用分区下配额。 |
Quota对象包含如下属性:
参数 | 是否必选 | 类型 | 值域 | 说明 |
---|---|---|---|---|
service_id | 否 | string | 无 | 配额服务ID,长度在1-255之间。 |
action | 否 | string | 无 | 服务操作参数,取值范围 bind,unbind,modify。 |
resources | 否 | List<Dict> | 无 | 配额项。 |
Dict对象包含如下属性:
参数 | 是否必选 | 类型 | 值域 | 说明 |
---|---|---|---|---|
resource | 否 | string | 无 | 配额ID,长度在1-255之间。 |
local_limit | 否 | int32 | 无 | 本级配额上限,取值在[-1,2147483647]。取值为-1时,表示不限配额。 |
other_limit | 否 | int32 | 无 | 本级配额上限,取值在[-1,2147483647]。取值为-1时,表示不限配额。 |
local_used | 否 | double | 无 | 本级配额使用量,取值在[0,2147483647],只读参数。 |
other_used | 否 | double | 无 | 下级配额使用量,取值在[0,2147483647],只读参数。 |
Quota对象包含如下属性:
参数 | 是否必选 | 类型 | 值域 | 说明 |
---|---|---|---|---|
service_id | 否 | string | 无 | 配额服务ID,长度在1-255之间。 |
action | 否 | string | 无 | 服务操作参数,取值范围 bind,unbind,modify。 |
resources | 否 | List<Dict> | 无 | 配额项。 |
Dict对象包含如下属性:
参数 | 是否必选 | 类型 | 值域 | 说明 |
---|---|---|---|---|
resource | 否 | string | 无 | 配额ID,长度在1-255之间。 |
local_limit | 否 | int32 | 无 | 本级配额上限,取值在[-1,2147483647]。取值为-1时,表示不限配额。 |
other_limit | 否 | int32 | 无 | 本级配额上限,取值在[-1,2147483647]。取值为-1时,表示不限配额。 |
local_used | 否 | double | 无 | 本级配额使用量,取值在[0,2147483647],只读参数。 |
other_used | 否 | double | 无 | 下级配额使用量,取值在[0,2147483647],只读参数。 |
接下来对我们需要的数据进行提取,由于我只关注有关ECS的服务quota,所以可以使用下面的方法进行提取。
regions = parsed1['vdc']['regions']
def print_vdc_detail(regions):
azs = []
for region in regions:
for ci in region['cloud_infras']:
for az in ci['available_zones']:
azs.append(az)
for az in azs:
print("\n\r",az['az_id'],':\n')
for src in az['quotas']: # az['quotas'] -> list
print('资源类型:{}'.format(src['service_id']))
for det in src['resources']:
print(" # {0:<25}: {1}".format(det['resource'],det['local_used']))
print_vdc_detail(regions)
#########结果如下################
az0.dc0 :
资源类型:ecs
# cores : 17.0 #使用的CPU核数
# ram : 40.0 #已经使用的内存数
# gpu_instances : 0.0
# npu_instances : 0.0
# instance_snapshot : 0.0
# instances : 44.0 #创建的ECS数
资源类型:evs
# gigabytes : 448.0 #使用的卷容量
# volumes : 25.0 #创建的云硬盘数量
az1.dc1 :
资源类型:bms
# cores : 192.0
# ram : 512.0
# instances : 2.0
资源类型:evs
# gigabytes : 0.0
# volumes : 0.0
az2.dc2 :
资源类型:ecs
# cores : 8.0
# ram : 16.0
# gpu_instances : 0.0
# npu_instances : 0.0
# instance_snapshot : 0.0
# instances : 1.0
资源类型:evs
# gigabytes : 400.0
# volumes : 2.0
可以循环调用上面的步骤,获取所有vdc的资源数据
def get_resource(name,vid):
url2 = "https://sc.armcloud.hcs.huawei.com/rest/vdc/v3.0/vdcs/{}/details"
res2 = requests.get(url=url2.format(vid),headers = new_headers,verify=False)
parsed1 = json.loads(res2.text)
regions = parsed1['vdc']['regions']
print("VDC: {}".format(name))
print_vdc_detail(regions)
print('\n')
for name, vid in id_dict.items():
get_resource(name, vid)
###########结果如下#################
VDC: demo
az0.dc0 :
资源类型:ecs
# cores : 16.0
# ram : 33.0
# gpu_instances : 0.0
# npu_instances : 0.0
# instance_snapshot : 0.0
# instances : 21.0
资源类型:evs
# gigabytes : 555.0
# volumes : 23.0
VDC: demo1
az0.dc0 :
资源类型:ecs
# cores : 0.0
# ram : 0.0
# gpu_instances : 0.0
# npu_instances : 0.0
# instance_snapshot : 0.0
# instances : 0.0
资源类型:evs
# gigabytes : 0.0
# volumes : 0.0
VDC: demo2
az0.dc0 :
资源类型:ecs
# cores : 24.0
# ram : 86.0
# gpu_instances : 0.0
# npu_instances : 0.0
# instance_snapshot : 0.0
# instances : 26.0
资源类型:evs
# gigabytes : 642.0
# volumes : 36.0
接下来可以基于这个调用链,将代码改成可复用的SDK的形式,前端展示可以通过Django、Flask或者GUI等,也可以输出成excel表格并自动发送邮件给干系人。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)