{"id":21810111,"url":"https://github.com/yunionio/mcclient_python","last_synced_at":"2025-04-13T22:01:34.270Z","repository":{"id":41854325,"uuid":"119767660","full_name":"yunionio/mcclient_python","owner":"yunionio","description":"Python 3 SDK for Cloudpods API","archived":false,"fork":false,"pushed_at":"2024-12-18T07:47:53.000Z","size":412,"stargazers_count":9,"open_issues_count":0,"forks_count":13,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-04-11T19:09:40.412Z","etag":null,"topics":["api","cloudpods","hybridcloud","multicloud","python","python3","sdk"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":false,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/yunionio.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2018-02-01T01:48:47.000Z","updated_at":"2024-12-20T02:54:42.000Z","dependencies_parsed_at":"2023-01-20T00:04:48.447Z","dependency_job_id":"d2fb2952-9cd4-441e-bf5c-c2ac2c89aa33","html_url":"https://github.com/yunionio/mcclient_python","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yunionio%2Fmcclient_python","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yunionio%2Fmcclient_python/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yunionio%2Fmcclient_python/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yunionio%2Fmcclient_python/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/yunionio","download_url":"https://codeload.github.com/yunionio/mcclient_python/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248788873,"owners_count":21161726,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["api","cloudpods","hybridcloud","multicloud","python","python3","sdk"],"created_at":"2024-11-27T13:31:26.515Z","updated_at":"2025-04-13T22:01:34.254Z","avatar_url":"https://github.com/yunionio.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"Cloudpods Python 3 SDK\n======================\n\n本仓库提供了访问Cloudpods API的Python 3 SDK以及基于该SDK的climc客户端代码。\n\n\n命令行使用方法\n---------------\n\n\n首先准备rc文件，内容如下(密码认证)：\n\n    export OS_USERNAME=sysadmin\n    export OS_PASSWORD=MXX2VKe067jtD\n    export OS_PROJECT_NAME=system\n    export OS_DOMAIN_NAME=Default\n    export OS_AUTH_URL=http://10.68.22.1:5000/v3\n    export OS_REGION_NAME=LocalTest\n\n或aksk认证rc文件:\n\n    export OS_AUTH_URL=http://10.68.22.1:5000/v3\n    export OS_ACCESS_KEY=355270364e0a46eb84429e5ffa043842\n    export OS_SECRET_KEY=cktuREpGUnVrcjRNeGp0UlZQMmJaRjI4OVQ4UUdLanE=\n    export OS_REGION_NAME=LocalTest\n    export YUNION_INSECURE=true\n\n首先source该rc文件，然后执行climc，例如：\n\n    $ source ~/rc_admin\n    $ climc server-list # 列出主机\n    $ climc image-list # 列出模板\n    $ climc server-create --disk \u003cimage_id\u003e --disk 40g --mem 2g --ncpu 2 --allow-delete test --hypervisor esxi # 以模板 image_id 创建主机，数据盘40g，内存2g，虚拟CPU 2核，允许删除，机器名称test，虚拟化平台为esxi (VMWare)\n\n\nSDK调用方法\n----------------\n\n\n首先安装yunionclient，执行\n\n    sudo python3 setup.py install\n\n依赖安装包：\n\n* argparse\n* prettytable\n* httplib2\n* requests\n* pycrypto\u003e=2.6\n\n首先，需要认证初始化client实例：\n\n可以使用用户名和密码认证\n\n```python\nimport yunionclient.api.client\n\ndesc = {\n    'project_name': 'system',\n    'project_id': None,\n    'args': (\n        'https://nn.nnn.nnn.nnn:30357/v3',  # auth_url\n        'sysadmin',                         # username\n        'pppppppppppppppp',                 # password\n        None,                               # domain\n    ),\n    'kwargs': {\n        'region': 'region0',\n        'zone': None,\n        'insecure': True,\n        'endpoint_type': 'publicURL',\n    },\n}\n\nargs = desc['args']\nkwargs = desc['kwargs']\nclient = yunionclient.api.client.Client(*args, **kwargs)\nproject_name = desc.get('project_name')\nproject_id = desc.get('project_id')\nif project_name is not None or project_id is not None:\n    client.set_project(project_name=project_name, project_id=project_id)\n```\n\n也可以使用Access Key/Secret认证：\n\n```python\nclient = yunionclient.api.client.Client(\n    'https://nn.nnn.nnn.nnn:30500/v3',\n    region='region0',\n    endpoint_type='publicURL',\n    insecure=True,\n)\nclient.authenticate_by_access_key('355270364e0a46eb84429e5ffa043842', 'cktuREpGUnVrcjRNeGp0UlZQMmJaRjI4OVQ4UUdLanE=')\n```\n\n使用网关 Access Key/Secret认证：\n\n```python\nclient = yunionclient.api.client.Client(\n    'https://nn.nnn.nnn.nnn/api/s/identity/v3',\n    region='region0',\n    endpoint_type='apigateway',\n    insecure=True,\n)\nclient.authenticate_by_access_key('355270364e0a46eb84429e5ffa043842', 'cktuREpGUnVrcjRNeGp0UlZQMmJaRjI4OVQ4UUdLanE=')\n```\n\nAccess Key/Secret可以通过climc获取：\n\n```bash\nclimc credential-create-aksk\n```\n\n初始化client之后，则可以调用client的各个资源实例来访问各个资源的API，例如，虚拟机使用client.guests，镜像使用 client.images。\n\nclient目前仅支持了部分资源，具体参考 yunionclient/api/client.py 中 client.__init__ 方法的资源的初始化列表。如果您有需要使用的资源未支持的，可以给我们提issue或者自行添加。\n\n一般来说，每个资源实例都实现了下列的一系列方法：\n\n| 操作                   | 方法                                                      | 举例                                                                 |\n|------------------------|-----------------------------------------------------------|----------------------------------------------------------------------|\n| 创建资源               | client.\u003cresources\u003e.create(**kwargs)                       | client.guests.create(**kwargs)                                       |\n| 获得资源列表           | client.\u003cresources\u003e.list(**filters)                        | client.guests.list(**{scope=system})                                 |\n| 执行资源的操作         | client.\u003cresources\u003e.perform_class_action(action, **kwargs) | client.guests.perform_class_action('validate_create_data', **kwargs) |\n| 获取某个资源的详情     | client.\u003cresources\u003e.get(id)                                | client.guests.get(id)                                                |\n| 获取某个资源的特定属性 | client.\u003cresources\u003e.get_spec(id, spec)                     | client.guests.get_spec(id, 'vnc')                                    |\n| 更新资源的属性         | client.\u003cresources\u003e.update(id, **kwargs)                   | client.guests.update(id, **{name: 'new-name'})                       |\n| 执行某个资源的操作     | client.\u003cresources\u003e.perform_action(id, action, **kwargs)   | client.guests.perform_action(id, 'start')                            |\n| 删除某个资源           | client.\u003cresources\u003e.delete(id)                             | client.guests.delete(id)                                             |\n\n具体方法参数，可以参考API文档：https://www.cloudpods.org/zh/docs/swagger\n\n\n示例代码\n-------------------\n\n\n```python\n#!/usr/bin/env python3\n# -*- encoding: utf-8 -*-\n\nimport yunionclient.api.client\n\n#desc = {\n#    'project_name': 'system',\n#    'project_id': None,\n#    'args': (\n#        'https://nn.nnn.nnn.nnn:30357/v3',  # auth_url\n#        'sysadmin',                         # username\n#        'pppppppppppppppp',                 # password\n#        None,                               # domain\n#    ),\n#    'kwargs': {\n#        'region': 'region0',\n#        'zone': None,\n#        'insecure': True,\n#        'endpoint_type': 'publicURL',\n#    },\n#}\n#\n#args = desc['args']\n#kwargs = desc['kwargs']\n#client = yunionclient.api.client.Client(*args, **kwargs)\n#project_name = desc.get('project_name')\n#project_id = desc.get('project_id')\n#if project_name is not None or project_id is not None:\n#    client.set_project(project_name=project_name, project_id=project_id)\n\n# 秘钥认证方式\nclient = yunionclient.api.client.Client(\n    'https://nn.nnn.nnn.nnn:30357/v3',\n    region='region0',\n    endpoint_type='publicURL',\n    insecure=True,\n)\nclient.authenticate_by_access_key('355270364e0a46eb84429e5ffa043842', 'cktuREpGUnVrcjRNeGp0UlZQMmJaRjI4OVQ4UUdLanE=')\n\n# List all public images\nimgs, total, limit, offset = client.images.list(is_public='false', status='active')\nif len(imgs) == 0:\n    raise Exception('No image found')\n\ndef waitStatus(guest, xstatus):\n\timport time\n\twhile True:\n\t\ttime.sleep(1)\n\t\tguest = client.guests.get(guest['id'])\n\t\tstatus = guest['status']\n\t\tprint('guest status: {}'.format(status))\n\t\tif status in xstatus:\n\t\t\treturn\n\n# Create a guest server with the 1st image in the list\nimg_id = imgs[0]['id']\nparams = {}\nparams['generate_name'] = 'test' # or params['name'] = 'test'\nparams['vcpu_count'] = 1\nparams['vmem_size'] = 64 # memory size 64MB\nparams['disable_delete'] = False\nparams['disks'] = [\n    {\n        'index': 0,\n        'image_id': img_id,\t# rootfs for operating system\n    },\n    {\n        'index': 1,\n        'size': '1024',\t\t# data disk 1024MB\n    },\n]\n\n# To do batch create, call client.guests.batch_create(3, **params).  When count\n# is greater than 1, the returned value will be a list of created guests\nguest = client.guests.create(**params)\nif isinstance(guest, list) and len(guest) \u003e 0:\n    guest = guest[0]['body']\nprint('guest created:', guest)\n\nprint('start guest when it\\'s ready')\nwaitStatus(guest, ['ready'])\nclient.guests.perform_action(guest['id'], 'start')\nwaitStatus(guest, ['running'])\n\nprint('put it into recycle bin (pending_deleted=True)')\nclient.guests.delete(guest['id'])\nwaitStatus(guest, ['ready'])\n\nprint('real delete it to actually reclaim resources')\nclient.guests.delete(guest['id'], override_pending_delete=True)\nfrom yunionclient.common import exceptions\ntry:\n\twaitStatus(guest, [])\nexcept exceptions.NotFound:\n\tprint('guest deleted')\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyunionio%2Fmcclient_python","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fyunionio%2Fmcclient_python","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyunionio%2Fmcclient_python/lists"}