使用Python调用ManageOne运营API

举报
Ragnar 发表于 2020/08/04 19:06:37 2020/08/04
【摘要】 使用Python调用ManageOne运营API在运营环境中遇到一个需求,就是如何很方便的获取环境中各租户的资源使用情况,这里可以使用python requests 的方式来操作。首先要通过API获取数据import requestsimport jsonres_body = {"auth": { "identity": { "metho...

使用Python调用ManageOne运营API

在运营环境中遇到一个需求,就是如何很方便的获取环境中各租户的资源使用情况,这里可以使用python requests 的方式来操作。

首先要通过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

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。