
Huawei Cloud Computing Query
- 119 installs
- 19 repo stars
- Updated July 31, 2026
- huaweicloud/huaweicloud-skills
Query Huawei Cloud Auto Scaling resources: scaling groups, configurations, group instances, and v1/v2 scaling policies via Python scripts.
About
Read-only query guide for Huawei Cloud Auto Scaling (AS): scaling groups, scaling configurations, group instances, and v1/v2 scaling policies. A developer uses it to inspect auto-scaling setups and instance lifecycle states.
- Lists scaling groups, configs, instances, and policies
- Read-only queries via bundled Python scripts
Huawei Cloud Computing Query by the numbers
- 119 all-time installs (skills.sh)
- +18 installs in the week ending Aug 2, 2026 (Skillselion tracking)
- Ranked #538 of 1,042 Cloud & Infrastructure skills by installs in the Skillselion catalog
- Data as of Aug 2, 2026 (Skillselion catalog sync)
npx skills add https://github.com/huaweicloud/huaweicloud-skills --skill huawei-cloud-computing-queryAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 119 |
|---|---|
| repo stars | ★ 19 |
| Last updated | July 31, 2026 |
| Repository | huaweicloud/huaweicloud-skills ↗ |
What it does
Query Huawei Cloud Auto Scaling resources: scaling groups, configurations, group instances, and v1/v2 scaling policies via Python scripts.
Files
Huawei Cloud Auto Scaling (AS) Query Guide
Scaling Groups
list_scaling_groups.py — Query Auto Scaling Group List
Purpose: Query all scaling groups, returning scaling group ID, name, status, current/desired/min/max instance count, VPC ID, creation time, etc. Usage: python scripts/as/list_scaling_groups.py -h
show_scaling_group.py — Query Auto Scaling Group Details
Purpose: Query the complete details of a single scaling group, including network, security group, availability zone, load balancer listener, tags, etc. Usage: python scripts/as/show_scaling_group.py -h
---
Scaling Configurations
list_scaling_configs.py — Query Auto Scaling Configuration List
Purpose: Query all scaling configurations, returning configuration ID, name, associated scaling group ID, creation time, etc. Usage: python scripts/as/list_scaling_configs.py -h
show_scaling_config.py — Query Auto Scaling Configuration Details
Purpose: Query the complete details of a single scaling configuration, including flavor, image, disk, keypair, public IP, security group, etc. Usage: python scripts/as/show_scaling_config.py -h
---
Scaling Group Instances
list_scaling_instances.py — Query Scaling Group Instance List
Purpose: Query instances within a specified scaling group, returning instance ID, name, lifecycle state, health status, protection status, etc. Usage: python scripts/as/list_scaling_instances.py -h
---
Scaling Policies (v1)
list_scaling_policies.py — Query Scaling Policy List (v1)
Purpose: Query the policy list of a specified scaling group (v1), returning policy ID, name, status, type, alarm ID, etc. Usage: python scripts/as/list_scaling_policies.py -h
show_scaling_policy.py — Query Scaling Policy Details (v1)
Purpose: Query details of a single policy (v1), including policy action, scheduled policy, etc. Usage: python scripts/as/show_scaling_policy.py -h
---
Scaling Policies (v2)
list_scaling_v2_policies.py — Query Scaling Policy List (v2)
Purpose: Query the policy list of a specified scaling group (v2), supporting step interval alarm policies. Usage: python scripts/as/list_scaling_v2_policies.py -h
show_scaling_v2_policy.py — Query Scaling Policy Details (v2)
Purpose: Query details of a single policy (v2), including step interval alarm actions, metadata, etc. Usage: python scripts/as/show_scaling_v2_policy.py -h
list_all_scaling_v2_policies.py — Query All Scaling Policy List (v2)
Purpose: Query the policy list for all scaling groups and bandwidth (v2), supporting sorting, enterprise project filtering, etc. Usage: python scripts/as/list_all_scaling_v2_policies.py -h
---
Scaling Activity Logs
list_scaling_activity_logs.py — Query Scaling Activity Log List (v1)
Purpose: Query the activity logs of a specified scaling group, returning activity ID, status, time, scaling value, description, etc. Usage: python scripts/as/list_scaling_activity_logs.py -h
list_scaling_activity_v2_logs.py — Query Scaling Activity Log List (v2)
Purpose: Query the activity logs of a specified scaling group (v2), supporting filtering by type and status, returning more detailed instance change information. Usage: python scripts/as/list_scaling_activity_v2_logs.py -h
---
Policy Execution Logs
list_scaling_policy_execute_logs.py — Query Policy Execution Log List
Purpose: Query the execution logs of a specified policy, returning execution status, type, time, old value/desired value/limit value, etc. Usage: python scripts/as/list_scaling_policy_execute_logs.py -h
---
Notifications
list_scaling_notifications.py — Query Scaling Group Notification List
Purpose: Query the SMN notification configuration of a specified scaling group, returning Topic URN, name, scenario, etc. Usage: python scripts/as/list_scaling_notifications.py -h
---
Lifecycle Hooks
list_life_cycle_hooks.py — Query Lifecycle Hook List
Purpose: Query the lifecycle hooks of a specified scaling group, returning hook name, type, default result, timeout, etc. Usage: python scripts/as/list_life_cycle_hooks.py -h
show_life_cycle_hook.py — Query Lifecycle Hook Details
Purpose: Query details of a single lifecycle hook, including SMN notification configuration, etc. Usage: python scripts/as/show_life_cycle_hook.py -h
list_hook_instances.py — Query Scaling Group Hook Instance List
Purpose: Query instances in lifecycle hook waiting state, returning instance ID, hook name, status, timeout, etc. Usage: python scripts/as/list_hook_instances.py -h
---
Scheduled Tasks
list_group_scheduled_tasks.py — Query Scaling Group Scheduled Task List
Purpose: Query the scheduled tasks of a specified scaling group, returning task ID, name, creation/update time, etc. Usage: python scripts/as/list_group_scheduled_tasks.py -h
---
Warm Pool
list_warm_pool_instances.py — Query Warm Pool Instance List
Purpose: Query the warm pool instances of a specified scaling group, returning instance ID, name, status, etc. Usage: python scripts/as/list_warm_pool_instances.py -h
list_warm_pool_instances_new.py — Query Warm Pool Instance List (New)
Purpose: Query the warm pool instances of a specified scaling group (new API), returning instance ID, name, status, etc. Usage: python scripts/as/list_warm_pool_instances_new.py -h
show_warm_pool.py — Query Warm Pool Information
Purpose: Query the warm pool configuration of a specified scaling group, returning min/max capacity, initialization wait time, status, etc. Usage: python scripts/as/show_warm_pool.py -h
show_warm_pool_new.py — Query Warm Pool Information (New)
Purpose: Query the warm pool configuration of a specified scaling group (new API), returning min/max capacity, initialization wait time, status, etc. Usage: python scripts/as/show_warm_pool_new.py -h
---
Quotas
show_resource_quota.py — Query AS Resource Quota
Purpose: Query the resource quota of the AS service, returning used/quota/max/min values for each resource type. Usage: python scripts/as/show_resource_quota.py -h
show_policy_and_instance_quota.py — Query Scaling Group Policy and Instance Quota
Purpose: Query the policy and instance quota of a specified scaling group, returning used/quota/max/min values for each type. Usage: python scripts/as/show_policy_and_instance_quota.py -h
---
Tags
list_scaling_tag_infos_by_resource_id.py — Query Tags by Resource ID
Purpose: Query the tag list of a specified resource, returning user tags and system tags. Usage: python scripts/as/list_scaling_tag_infos_by_resource_id.py -h
list_scaling_tag_infos_by_tenant_id.py — Query Tags by Tenant ID
Purpose: Query tags for all resources under a tenant, returning tag key and value list. Usage: python scripts/as/list_scaling_tag_infos_by_tenant_id.py -h
list_resource_instances.py — Query Resource Instances by Tag
Purpose: Query resource instances filtered by tag, returning resource ID, name, details, and tags. Usage: python scripts/as/list_resource_instances.py -h
---
API Versions
list_api_versions.py — Query AS API Version List
Purpose: Query the list of API versions supported by the AS service. Usage: python scripts/as/list_api_versions.py -h
show_api_version.py — Query AS API Version Details
Purpose: Query the details of a specified API version, including version ID, status, links, etc. Usage: python scripts/as/show_api_version.py -h
BMS (Bare Metal Server) Query Guide
List Query
list_bare_metal_servers.py — Query Bare Metal Server List (OpenStack Native, with Total Count)
Purpose: Query the list of bare metal servers, returning key information such as server ID, name, status, flavor, vCPU, memory, disk, availability zone, and creation time, including total count. Usage: python scripts/bms/list_bare_metal_servers.py -h
list_bare_metal_servers_detail.py — Query Bare Metal Server Detail List (OpenStack Native, without Total Count)
Purpose: Query the detail list of bare metal servers, returning key information such as server ID, name, status, flavor, vCPU, memory, disk, availability zone, and creation time, without total count. Usage: python scripts/bms/list_bare_metal_servers_detail.py -h
list_bare_metal_server_details.py — Query Bare Metal Server Details (by ID)
Purpose: Query detailed information of a single bare metal server by server ID, including flavor details (GPU/ASIC accelerators), image, metadata (billing mode, OS type, etc.), attached disks, tags, etc. Usage: python scripts/bms/list_bare_metal_server_details.py -h
list_baremetal_flavor_detail_extends.py — Query Bare Metal Server Flavor Detail List
Purpose: Query the list of bare metal server flavor details, returning flavor ID, name, vCPU, memory, disk, resource type, CPU architecture, disk details, etc. Usage: python scripts/bms/list_baremetal_flavor_detail_extends.py -h
---
Detail Query
show_available_resource.py — Query Availability Zone Resource Information
Purpose: Query the resource availability of bare metal servers for a specified availability zone and flavor, returning availability zone, flavor ID, available count, and status. Usage: python scripts/bms/show_available_resource.py -h
show_baremetal_server_interface_attachments.py — Query Bare Metal Server NIC Information
Purpose: Query the NIC information of a specified bare metal server, returning port ID, network ID, MAC address, port state, driver mode, PCI address, IP address, etc. Usage: python scripts/bms/show_baremetal_server_interface_attachments.py -h
show_baremetal_server_tags.py — Query Bare Metal Server Tags
Purpose: Query the tag list of a specified bare metal server, returning tag key and value. Usage: python scripts/bms/show_baremetal_server_tags.py -h
show_baremetal_server_volume_info.py — Query Bare Metal Server Attached Disk Information
Purpose: Query the attached disk information of a specified bare metal server, returning disk ID, server ID, volume ID, and device name. Usage: python scripts/bms/show_baremetal_server_volume_info.py -h
show_job_infos.py — Query Asynchronous Task Status
Purpose: Query the status information of an asynchronous task, returning task ID, status, type, start time, end time, error code, failure reason, etc., including subtask information. Usage: python scripts/bms/show_job_infos.py -h
show_metadata_options.py — Query Bare Metal Server Metadata Configuration
Purpose: Query the metadata configuration of a specified bare metal server, returning http_endpoint and http_tokens configuration. Usage: python scripts/bms/show_metadata_options.py -h
show_reset_pwd.py — Query Whether Bare Metal Server Supports Password Reset
Purpose: Query whether a specified bare metal server supports password reset, returning the resetpwd_flag. Usage: python scripts/bms/show_reset_pwd.py -h
show_server_remote_console.py — Get Bare Metal Server VNC Remote Login Address
Purpose: Get the VNC remote login address of a specified bare metal server, returning protocol, type, and URL. Usage: python scripts/bms/show_server_remote_console.py -h
show_specified_version.py — Query BMS API Specified Version Information
Purpose: Query the specified version information of BMS API, returning version ID, status, minimum version, update time, etc. Usage: python scripts/bms/show_specified_version.py -h
show_tenant_quota.py — Query Bare Metal Server Tenant Quota
Purpose: Query the bare metal server quota information of the current tenant, returning max instances, used instances, max cores, used cores, max memory, used memory, and other quota data. Usage: python scripts/bms/show_tenant_quota.py -h
show_windows_baremetal_server_pwd.py — Query Windows Bare Metal Server Initial Password
Purpose: Query the initial password of a specified Windows bare metal server, returning the encrypted password. Usage: python scripts/bms/show_windows_baremetal_server_pwd.py -h
ECS Python Script Usage Guide
---
List Query Scripts
list_servers_details.py — Query ECS Instance List
Purpose: Query the list of ECS instances, including ID, name, status, flavor_id, vCPU, memory(GiB). Usage: python scripts/ecs/list_servers_details.py -h
---
list_servers_details_by_id.py — Query ECS Details by Instance ID
Purpose: Query ECS instance details, including name, status, flavor_id, vCPU, memory(GiB). Usage: python scripts/ecs/list_servers_details_by_id.py -h
---
list_cloud_servers.py — Query Cloud Server List (v1.1)
Purpose: Query the list of ECS cloud servers, including name, status, flavor_id, vCPU, ram(GiB), image ID. Usage: python scripts/ecs/list_cloud_servers.py -h
---
list_flavors.py — Query ECS Flavor List
Purpose: Query the list of ECS flavors, including flavor name, vCPU, memory(GiB). Usage: python scripts/ecs/list_flavors.py -h
---
list_flavor_sell_policies.py — Query Flavor Sell Policies
Purpose: Query the list of ECS flavor sell policies, including ID, flavor_id, sell mode, sell status, availability_zone_id. Usage: python scripts/ecs/list_flavor_sell_policies.py -h
---
list_resize_flavors.py — Query Resize Flavor List
Purpose: Query the list of ECS resize flavors, including flavor_id, name, vCPU, ram(GiB). Usage: python scripts/ecs/list_resize_flavors.py -h
---
list_server_az_info.py — Query Availability Zone List
Purpose: Query the list of ECS availability zone information, including availability_zone_id and type. Usage: python scripts/ecs/list_server_az_info.py -h
---
list_server_block_devices.py — Query Server Block Device List Details
Purpose: Query the list of ECS server block devices, including cloud disk ID, boot_index, device, size(GB). Usage: python scripts/ecs/list_server_block_devices.py -h
---
list_server_groups.py — Query Server Group List
Purpose: Query the list of ECS server groups, including ID, name, policy. Usage: python scripts/ecs/list_server_groups.py -h
---
list_server_interfaces.py — Query Server Network Interface Information
Purpose: Query the list of ECS server network interfaces, including port ID, network ID, ip_addr, mac_addr. Usage: python scripts/ecs/list_server_interfaces.py -h
---
list_server_tags.py — Query Project Tags
Purpose: Query the list of ECS server tags, including key and values. Usage: python scripts/ecs/list_server_tags.py -h
---
list_server_volume_attachments.py — Query Server Volume Attachment List
Purpose: Query the list of ECS server volume attachments, including ID, device, server ID, cloud disk ID. Usage: python scripts/ecs/list_server_volume_attachments.py -h
---
list_servers_by_tag.py — Query Server List by Tag
Purpose: Query the list of ECS servers by tag, including resource ID, resource name, and tags. Usage: python scripts/ecs/list_servers_by_tag.py -h
---
list_launch_template_versions.py — Query Launch Template Version List
Purpose: Query the list of ECS launch template versions, including version_number, launch template ID, and creation time. Usage: python scripts/ecs/list_launch_template_versions.py -h
---
list_recycle_bin_servers.py — Query Recycle Bin Server List
Purpose: Query the list of ECS recycle bin servers, including ID, name, status, flavor_id. Usage: python scripts/ecs/list_recycle_bin_servers.py -h
---
list_scheduled_events.py — Query Scheduled Event List
Purpose: Query the list of ECS scheduled events, including ID, instance_id, type, state, publish_time. Usage: python scripts/ecs/list_scheduled_events.py -h
---
list_templates.py — Query Launch Template List
Purpose: Query the list of ECS launch templates, including ID, name, and creation time. Usage: python scripts/ecs/list_templates.py -h
---
show_server.py — Query Server Details
Purpose: Query ECS server details. Usage: python scripts/ecs/show_server.py -h
---
show_server_block_device.py — Query Single Block Device Details
Purpose: Query ECS server block device details. Usage: python scripts/ecs/show_server_block_device.py -h
---
show_server_group.py — Query Server Group Details
Purpose: Query ECS server group details. Usage: python scripts/ecs/show_server_group.py -h
---
show_server_limits.py — Query Tenant Quota
Purpose: Query ECS server quota. Usage: python scripts/ecs/show_server_limits.py -h
---
show_server_tags.py — Query Server Tags
Purpose: Query ECS server tag details, including key and value. Usage: python scripts/ecs/show_server_tags.py -h
---
show_server_password.py — Get Server Password
Purpose: Query ECS server password. Usage: python scripts/ecs/show_server_password.py -h
---
show_server_remote_console.py — Get VNC Remote Login Address
Purpose: Query ECS server remote console. Usage: python scripts/ecs/show_server_remote_console.py -h
---
show_server_attachable_nic_num.py — Query Attachable NIC Count
Purpose: Query the number of attachable NICs for an ECS server. Usage: python scripts/ecs/show_server_attachable_nic_num.py -h
---
show_appendable_volume_quota.py — Query Appendable Volume Quota
Purpose: Query the appendable volume quota for an ECS server. Usage: python scripts/ecs/show_appendable_volume_quota.py -h
---
show_flavor_capacity.py — Query Flavor Capacity
Purpose: Query ECS flavor capacity, including availability zone, region ID, and prefer. Usage: python scripts/ecs/show_flavor_capacity.py -h
---
show_metadata_options.py — Query Metadata Configuration
Purpose: Query ECS server metadata options. Usage: python scripts/ecs/show_metadata_options.py -h
---
show_recycle_bin.py — Query Recycle Bin Configuration
Purpose: Query ECS recycle bin configuration. Usage: python scripts/ecs/show_recycle_bin.py -h
---
show_reset_password_flag.py — Query Whether Password Reset is Supported
Purpose: Query the ECS server reset password flag. Usage: python scripts/ecs/show_reset_password_flag.py -h
---
show_serial_console_actions.py — Get Serial Console Login Address
Purpose: Query ECS server serial console. Usage: python scripts/ecs/show_serial_console_actions.py -h
---
show_job.py — Query Asynchronous Task Status
Purpose: Query ECS asynchronous task details. Usage: python scripts/ecs/show_job.py -h
---
nova_list_keypairs.py — Query SSH Keypair List
Purpose: Query the list of ECS SSH keypairs, including name, type, fingerprint. Usage: python scripts/ecs/nova_list_keypairs.py -h
---
nova_show_keypair.py — Query SSH Keypair Details
Purpose: Query ECS SSH keypair details, including name, type, fingerprint, public_key, created_at, user_id. Usage: python scripts/ecs/nova_show_keypair.py -h
---
nova_list_server_security_groups.py — Query Server Security Group List
Purpose: Query the list of ECS server security groups, including id, name, description. Usage: python scripts/ecs/nova_list_server_security_groups.py -h
---
nova_show_flavor_extra_specs.py — Query Flavor Extra Specs
Purpose: Query ECS flavor extra specs, including key and value. Usage: python scripts/ecs/nova_show_flavor_extra_specs.py -h
---
nova_show_server_interface.py — Query Server Specified NIC Details
Purpose: Query ECS server specified NIC details, including port_id, net_id, mac_addr, port_state, fixed_ips. Usage: python scripts/ecs/nova_show_server_interface.py -h
IMS Python Script Usage Guide
---
list_images.py — Query Image List
Purpose: Query the list of IMS images, including ID, name, OS type, OS bit, status, imagetype, visibility. Usage: python scripts/ims/list_images.py -h
---
list_image_by_tags.py — Query Images by Tag
Purpose: Query IMS images by tag, including resource ID, resource name, and status. Usage: python scripts/ims/list_image_by_tags.py -h
---
list_image_members.py — Query Image Member List
Purpose: Query the list of IMS image members, including member_id, status, member_type, and creation time. Usage: python scripts/ims/list_image_members.py -h
---
list_image_tags.py — Query Image Tags
Purpose: Query IMS image tags, including key and value. Usage: python scripts/ims/list_image_tags.py -h
---
list_images_tags.py — Query All Tenant Image Tags
Purpose: Query all IMS image tags for a tenant, including key and values. Usage: python scripts/ims/list_images_tags.py -h
---
list_os_versions.py — Query OS Version List Supported by Images
Purpose: Query the list of OS versions supported by IMS images, including platform, os_version_key, OS version, OS bit, and OS type. Usage: python scripts/ims/list_os_versions.py -h
---
list_tags.py — Query Tenant Image Tag List
Purpose: Query the list of tenant IMS image tags, including tag. Usage: python scripts/ims/list_tags.py -h
---
show_image_quota.py — Query Image Quota
Purpose: Query IMS image quota, including type, used, quota, minimum, and maximum. Usage: python scripts/ims/show_image_quota.py -h
---
show_job.py — Query Asynchronous Task Information
Purpose: Query IMS asynchronous task information. Usage: python scripts/ims/show_job.py -h
---
show_job_progress.py — Query Asynchronous Task Progress
Purpose: Query IMS asynchronous task progress. Usage: python scripts/ims/show_job_progress.py -h
---
show_image.py — Query Image Details
Purpose: Query IMS image details, including id, name, status, visibility, imagetype, protected, os_type, os_bit, os_version, platform, disk_format, min_disk, min_ram, image_size, created_at, updated_at, support_kvm, support_xen, etc. Usage: python scripts/ims/show_image.py -h
---
show_image_member.py — Query Image Member Details
Purpose: Query IMS image member details, including image_id, member_id, status, member_type, created_at, updated_at. Usage: python scripts/ims/show_image_member.py -h
huaweicloudsdkcore>=3.1.0
huaweicloudsdkecs>=3.1.0
huaweicloudsdkiam>=3.1.0
huaweicloudsdkims>=3.1.0
huaweicloudsdkbms>=3.1.0
huaweicloudsdkas>=3.1.0"""AS 模块公共工具函数"""
import os
import sys
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..'))
from config import load_credentials, build_http_config
from huaweicloudsdkcore.auth.credentials import BasicCredentials
from huaweicloudsdkiam.v3 import IamClient
from huaweicloudsdkiam.v3.model import KeystoneListProjectsRequest
from huaweicloudsdkiam.v3.region.iam_region import IamRegion
def resolve_project_id(region, project_id=None):
"""解析项目 ID
优先使用传入的 project_id,否则从环境变量 HW_PROJECT_ID 获取,
最后通过 IAM KeystoneListProjects 接口按 region 自动获取。
:param region: 区域名称,如 cn-north-4
:param project_id: 可选的项目 ID,若提供则直接返回
:return: 项目 ID 字符串
"""
if project_id:
return project_id
env_pid = os.getenv("HW_PROJECT_ID", "")
if env_pid:
return env_pid
ak = os.getenv("HW_ACCESS_KEY", "")
sk = os.getenv("HW_SECRET_KEY", "")
security_token = os.getenv("HW_SECURITY_TOKEN", "")
if not ak or not sk:
print("未配置 AK/SK,请设置环境变量 HW_ACCESS_KEY 和 HW_SECRET_KEY")
exit(-1)
try:
http_config = build_http_config()
credentials = BasicCredentials(ak, sk)
if security_token:
credentials = credentials.with_security_token(security_token)
client = (IamClient.new_builder()
.with_http_config(http_config)
.with_credentials(credentials)
.with_region(IamRegion.value_of(region))
.build())
request = KeystoneListProjectsRequest()
request.name = region
response = client.keystone_list_projects(request)
projects = response.projects
if not projects:
print(f"未找到可访问的项目 (区域: {region})")
exit(0)
for project in projects:
if getattr(project, 'name', '') == region:
return project.id
return projects[0].id
except Exception as e:
print(f"自动获取项目 ID 失败: {e}")
print("请通过 --project_id 参数指定,或设置 HW_PROJECT_ID 环境变量")
exit(-1)
def _build_vpc_client(region, project_id):
"""构建 VPC 客户端"""
try:
from huaweicloudsdkvpc.v3 import VpcClient
from huaweicloudsdkvpc.v3.region.vpc_region import VpcRegion
except ImportError:
return None
ak = os.getenv("HW_ACCESS_KEY", "")
sk = os.getenv("HW_SECRET_KEY", "")
security_token = os.getenv("HW_SECURITY_TOKEN", "")
credentials = BasicCredentials(ak, sk, project_id)
if security_token:
credentials = credentials.with_security_token(security_token)
http_config = build_http_config()
return VpcClient.new_builder().with_http_config(http_config).with_credentials(credentials).with_region(VpcRegion.value_of(region)).build()
def resolve_vpc_info(region, project_id, vpc_ids):
"""批量解析 VPC 名称和 CIDR
:param region: 区域名称
:param project_id: 项目 ID
:param vpc_ids: VPC ID 列表
:return: dict {vpc_id: {name, cidr}}
"""
if not vpc_ids:
return {}
client = _build_vpc_client(region, project_id)
if not client:
return {vid: {"name": "", "cidr": ""} for vid in vpc_ids}
try:
from huaweicloudsdkvpc.v3 import ListVpcsRequest
result = {}
for vid in vpc_ids:
req = ListVpcsRequest()
req.id = [vid]
resp = client.list_vpcs(req)
vpcs = getattr(resp, 'vpcs', []) or []
if vpcs:
result[vid] = {"name": getattr(vpcs[0], 'name', ''), "cidr": getattr(vpcs[0], 'cidr', '')}
else:
result[vid] = {"name": "", "cidr": ""}
return result
except Exception:
return {vid: {"name": "", "cidr": ""} for vid in vpc_ids}
def resolve_subnet_info(region, project_id, subnet_ids, vpc_id=None):
"""批量解析子网名称、CIDR、可用区等信息
:param region: 区域名称
:param project_id: 项目 ID
:param subnet_ids: 子网 ID 列表
:param vpc_id: 可选的 VPC ID,用于缩小查询范围
:return: dict {subnet_id: {name, cidr, gateway_ip, availability_zone, available_ip_address_count}}
"""
if not subnet_ids:
return {}
try:
from huaweicloudsdkvpc.v2 import VpcClient as VpcClientV2
from huaweicloudsdkvpc.v2.region.vpc_region import VpcRegion as VpcRegionV2
from huaweicloudsdkvpc.v2 import ListSubnetsRequest
except ImportError:
return {sid: {"name": "", "cidr": "", "gateway_ip": "", "availability_zone": "", "available_ip_address_count": ""} for sid in subnet_ids}
ak = os.getenv("HW_ACCESS_KEY", "")
sk = os.getenv("HW_SECRET_KEY", "")
security_token = os.getenv("HW_SECURITY_TOKEN", "")
credentials = BasicCredentials(ak, sk, project_id)
if security_token:
credentials = credentials.with_security_token(security_token)
http_config = build_http_config()
try:
client = VpcClientV2.new_builder().with_http_config(http_config).with_credentials(credentials).with_region(VpcRegionV2.value_of(region)).build()
result = {}
req = ListSubnetsRequest()
if vpc_id:
req.vpc_id = vpc_id
resp = client.list_subnets(req)
subnets = getattr(resp, 'subnets', []) or []
subnet_map = {getattr(s, 'id', ''): s for s in subnets}
for sid in subnet_ids:
s = subnet_map.get(sid)
if s:
result[sid] = {
"name": getattr(s, 'name', ''),
"cidr": getattr(s, 'cidr', ''),
"gateway_ip": getattr(s, 'gateway_ip', ''),
"availability_zone": getattr(s, 'availability_zone', ''),
"available_ip_address_count": getattr(s, 'available_ip_address_count', ''),
}
else:
result[sid] = {"name": "", "cidr": "", "gateway_ip": "", "availability_zone": "", "available_ip_address_count": ""}
return result
except Exception:
return {sid: {"name": "", "cidr": "", "gateway_ip": "", "availability_zone": "", "available_ip_address_count": ""} for sid in subnet_ids}
# 资源类型对应的列表查询脚本提示
_RESOURCE_LIST_HINTS = {
"scalingGroup": "list_scaling_groups.py",
"scalingConfiguration": "list_scaling_configs.py",
"scalingPolicy": "list_scaling_policies.py",
"lifecycleHook": "list_life_cycle_hooks.py",
"warmPool": "list_warm_pool_instances.py",
}
def handle_not_found_error(error, resource_type, resource_id):
"""处理 404 资源不存在错误,输出友好提示
:param error: 异常对象
:param resource_type: 资源类型英文名,如 scalingGroup
:param resource_id: 请求的资源 ID
"""
error_str = str(error)
is_404 = "404" in error_str or "could not be found" in error_str or "not exist" in error_str
if is_404:
list_script = _RESOURCE_LIST_HINTS.get(resource_type, "")
hint = f"资源 [{resource_type}] 不存在 (ID: {resource_id}),请检查 ID 是否正确。"
if list_script:
hint += f"\n提示:可先运行 {list_script} 查看可用资源列表。"
print(hint)
else:
print(f"查询失败: {error}")
exit(1)
import argparse
import sys
import os
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..'))
from config import load_credentials, build_http_config
from _common import resolve_project_id
from huaweicloudsdkcore.auth.credentials import BasicCredentials
from huaweicloudsdkas.v1 import AsClient, ListAllScalingV2PoliciesRequest
from huaweicloudsdkas.v1.region.as_region import AsRegion
# 初始化凭据
AK, SK, Region, SecurityToken = load_credentials()
Offset = 0
parser = argparse.ArgumentParser(description='查询全量弹性伸缩策略列表(v2)')
parser.add_argument('--scaling_resource_id', type=str, default=None,
help='伸缩组ID')
parser.add_argument('--scaling_resource_type', type=str, default=None,
choices=['SCALING_GROUP', 'BANDWIDTH'],
help='伸缩资源类型:SCALING_GROUP-伸缩组;BANDWIDTH-带宽')
parser.add_argument('--scaling_policy_name', type=str, default=None,
help='伸缩策略名称')
parser.add_argument('--scaling_policy_type', type=str, default=None,
choices=['ALARM', 'SCHEDULED', 'RECURRENCE'],
help='策略类型:ALARM-告警策略;SCHEDULED-定时策略;RECURRENCE-周期策略')
parser.add_argument('--scaling_policy_id', type=str, default=None,
help='伸缩策略ID')
parser.add_argument('--start_number', type=int, default=0,
help='查询的起始行号,默认为0')
parser.add_argument('--limit', type=int, default=100,
help='查询记录数,默认20,最大100')
parser.add_argument('--sort_by', type=str, default=None,
choices=['POLICY_NAME', 'TRIGGER_CONDITION', 'CREATE_TIME'],
help='排序方法:POLICY_NAME-策略名称;TRIGGER_CONDITION-触发条件;CREATE_TIME-创建时间')
parser.add_argument('--order', type=str, default=None,
choices=['ASC', 'DESC'],
help='排序顺序:ASC-升序;DESC-降序')
parser.add_argument('--enterprise_project_id', type=str, default=None,
help='企业项目ID,传入all_granted_eps表示查询所有授权企业项目')
parser.add_argument('--alarm_id', type=str, default=None,
help='告警ID,即告警规则的ID')
parser.add_argument('--project_id', type=str, default=None,
help='项目ID')
parser.add_argument('--region', type=str,
help='区域,默认从环境变量获取')
parser.add_argument('--offset', type=int,
help='客户端分页偏移量,从0开始')
def render(policies):
if not policies:
print(f"没有找到伸缩策略 (区域: {Region})")
return
header = "scaling_policy_id\tscaling_policy_name\tpolicy_status\tscaling_policy_type\tscaling_resource_id\talarm_id\tcool_down_time\tcreate_time"
print(header)
start = Offset
end = min(Offset + 50, len(policies))
for p in policies[start:end]:
print(f"{getattr(p, 'scaling_policy_id', '')}\t{getattr(p, 'scaling_policy_name', '')}\t{getattr(p, 'policy_status', '')}\t{getattr(p, 'scaling_policy_type', '')}\t{getattr(p, 'scaling_resource_id', '')}\t{getattr(p, 'alarm_id', '')}\t{getattr(p, 'cool_down_time', 0)}\t{getattr(p, 'create_time', '')}")
if len(policies) > end:
print(f"可以使用 --offset={end} 参数继续获取后续数据")
def main():
global Region, Offset
args = parser.parse_args()
if args.region is not None:
Region = args.region
if args.offset is not None:
Offset = args.offset
if Offset < 0:
Offset = 0
# 使用 sdk
try:
project_id = resolve_project_id(Region, args.project_id)
credentials = BasicCredentials(AK, SK, project_id)
if SecurityToken:
credentials = credentials.with_security_token(SecurityToken)
http_config = build_http_config()
client = AsClient.new_builder().with_http_config(http_config).with_credentials(credentials).with_region(AsRegion.value_of(Region)).build()
all_policies = []
start = args.start_number
while True:
request = ListAllScalingV2PoliciesRequest()
if args.scaling_resource_id:
request.scaling_resource_id = args.scaling_resource_id
if args.scaling_resource_type:
request.scaling_resource_type = args.scaling_resource_type
if args.scaling_policy_name:
request.scaling_policy_name = args.scaling_policy_name
if args.scaling_policy_type:
request.scaling_policy_type = args.scaling_policy_type
if args.scaling_policy_id:
request.scaling_policy_id = args.scaling_policy_id
if args.sort_by:
request.sort_by = args.sort_by
if args.order:
request.order = args.order
if args.enterprise_project_id:
request.enterprise_project_id = args.enterprise_project_id
if args.alarm_id:
request.alarm_id = args.alarm_id
request.start_number = start
request.limit = args.limit
response = client.list_all_scaling_v2_policies(request)
policies = getattr(response, 'scaling_policies', []) or []
all_policies.extend(policies)
total = getattr(response, 'total_number', 0)
if total <= 0 or len(all_policies) >= total:
break
start = len(all_policies)
render(all_policies)
except Exception as e:
print(f"as.list_all_scaling_v2_policies 查询失败: {e}")
exit(1)
if __name__ == '__main__':
main()
import argparse
import sys
import os
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..'))
from config import load_credentials, build_http_config
from _common import resolve_project_id
from huaweicloudsdkcore.auth.credentials import BasicCredentials
from huaweicloudsdkas.v1 import AsClient, ListApiVersionsRequest
from huaweicloudsdkas.v1.region.as_region import AsRegion
# 初始化凭据
AK, SK, Region, SecurityToken = load_credentials()
parser = argparse.ArgumentParser(description='查询AS API版本列表')
parser.add_argument('--project_id', type=str, default=None,
help='项目ID')
parser.add_argument('--region', type=str,
help='区域,默认从环境变量获取')
def main():
global Region
args = parser.parse_args()
if args.region is not None:
Region = args.region
# 使用 sdk
try:
project_id = resolve_project_id(Region, args.project_id)
credentials = BasicCredentials(AK, SK, project_id)
if SecurityToken:
credentials = credentials.with_security_token(SecurityToken)
http_config = build_http_config()
client = AsClient.new_builder().with_http_config(http_config).with_credentials(credentials).with_region(AsRegion.value_of(Region)).build()
request = ListApiVersionsRequest()
response = client.list_api_versions(request)
versions = getattr(response, 'versions', []) or []
if not versions:
print(f"没有找到API版本 (区域: {Region})")
return
header = "id\tstatus\tmin_version\tversion\tupdate"
print(header)
for v in versions:
print(f"{getattr(v, 'id', '')}\t{getattr(v, 'status', '')}\t{getattr(v, 'min_version', '')}\t{getattr(v, 'version', '')}\t{getattr(v, 'update', '')}")
except Exception as e:
print(f"as.list_api_versions 查询失败: {e}")
exit(1)
if __name__ == '__main__':
main()
import argparse
import sys
import os
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..'))
from config import load_credentials, build_http_config
from _common import resolve_project_id
from huaweicloudsdkcore.auth.credentials import BasicCredentials
from huaweicloudsdkas.v1 import AsClient, ListGroupScheduledTasksRequest
from huaweicloudsdkas.v1.region.as_region import AsRegion
# 初始化凭据
AK, SK, Region, SecurityToken = load_credentials()
Offset = 0
parser = argparse.ArgumentParser(description='查询伸缩组计划任务列表')
parser.add_argument('--scaling_group_id', type=str, required=True,
help='伸缩组ID,可通过 list_scaling_groups.py 获取')
parser.add_argument('--limit', type=int, default=100,
help='查询的记录条数,默认20,最大100')
parser.add_argument('--marker', type=str, default=None,
help='查询的分页marker')
parser.add_argument('--project_id', type=str, default=None,
help='项目ID')
parser.add_argument('--region', type=str,
help='区域,默认从环境变量获取')
parser.add_argument('--offset', type=int,
help='客户端分页偏移量,从0开始')
def render(tasks):
if not tasks:
print(f"没有找到计划任务 (区域: {Region})")
return
header = "task_id\tname\tcreate_time\tupdate_time"
print(header)
start = Offset
end = min(Offset + 50, len(tasks))
for t in tasks[start:end]:
print(f"{getattr(t, 'task_id', '')}\t{getattr(t, 'name', '')}\t{getattr(t, 'create_time', '')}\t{getattr(t, 'update_time', '')}")
if len(tasks) > end:
print(f"可以使用 --offset={end} 参数继续获取后续数据")
def main():
global Region, Offset
args = parser.parse_args()
if args.region is not None:
Region = args.region
if args.offset is not None:
Offset = args.offset
if Offset < 0:
Offset = 0
# 使用 sdk
try:
project_id = resolve_project_id(Region, args.project_id)
credentials = BasicCredentials(AK, SK, project_id)
if SecurityToken:
credentials = credentials.with_security_token(SecurityToken)
http_config = build_http_config()
client = AsClient.new_builder().with_http_config(http_config).with_credentials(credentials).with_region(AsRegion.value_of(Region)).build()
all_tasks = []
marker = args.marker
while True:
request = ListGroupScheduledTasksRequest()
request.scaling_group_id = args.scaling_group_id
request.limit = args.limit
if marker:
request.marker = marker
response = client.list_group_scheduled_tasks(request)
tasks = getattr(response, 'scheduled_tasks', []) or []
all_tasks.extend(tasks)
page_info = getattr(response, 'page_info', None)
next_marker = getattr(page_info, 'next_marker', '') if page_info else ''
if not next_marker:
break
marker = next_marker
render(all_tasks)
except Exception as e:
print(f"as.list_group_scheduled_tasks 查询失败: {e}")
exit(1)
if __name__ == '__main__':
main()
import argparse
import sys
import os
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..'))
from config import load_credentials, build_http_config
from _common import resolve_project_id
from huaweicloudsdkcore.auth.credentials import BasicCredentials
from huaweicloudsdkas.v1 import AsClient, ListHookInstancesRequest
from huaweicloudsdkas.v1.region.as_region import AsRegion
# 初始化凭据
AK, SK, Region, SecurityToken = load_credentials()
parser = argparse.ArgumentParser(description='查询伸缩组挂钩实例列表')
parser.add_argument('--scaling_group_id', type=str, required=True,
help='伸缩组ID,可通过 list_scaling_groups.py 获取')
parser.add_argument('--instance_id', type=str, default=None,
help='伸缩实例ID')
parser.add_argument('--project_id', type=str, default=None,
help='项目ID')
parser.add_argument('--region', type=str,
help='区域,默认从环境变量获取')
def main():
global Region
args = parser.parse_args()
if args.region is not None:
Region = args.region
# 使用 sdk
try:
project_id = resolve_project_id(Region, args.project_id)
credentials = BasicCredentials(AK, SK, project_id)
if SecurityToken:
credentials = credentials.with_security_token(SecurityToken)
http_config = build_http_config()
client = AsClient.new_builder().with_http_config(http_config).with_credentials(credentials).with_region(AsRegion.value_of(Region)).build()
request = ListHookInstancesRequest()
request.scaling_group_id = args.scaling_group_id
if args.instance_id:
request.instance_id = args.instance_id
response = client.list_hook_instances(request)
infos = getattr(response, 'instance_hanging_info', []) or []
if not infos:
print(f"没有找到挂钩实例 (区域: {Region})")
return
header = "instance_id\tlifecycle_hook_name\tlifecycle_action_key\tlifecycle_hook_status\ttimeout\tdefault_result"
print(header)
for i in infos:
print(f"{getattr(i, 'instance_id', '')}\t{getattr(i, 'lifecycle_hook_name', '')}\t{getattr(i, 'lifecycle_action_key', '')}\t{getattr(i, 'lifecycle_hook_status', '')}\t{getattr(i, 'timeout', '')}\t{getattr(i, 'default_result', '')}")
except Exception as e:
print(f"as.list_hook_instances 查询失败: {e}")
exit(1)
if __name__ == '__main__':
main()
import argparse
import sys
import os
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..'))
from config import load_credentials, build_http_config
from _common import resolve_project_id
from huaweicloudsdkcore.auth.credentials import BasicCredentials
from huaweicloudsdkas.v1 import AsClient, ListLifeCycleHooksRequest
from huaweicloudsdkas.v1.region.as_region import AsRegion
# 初始化凭据
AK, SK, Region, SecurityToken = load_credentials()
parser = argparse.ArgumentParser(description='查询生命周期挂钩列表')
parser.add_argument('--scaling_group_id', type=str, required=True,
help='伸缩组ID,可通过 list_scaling_groups.py 获取')
parser.add_argument('--project_id', type=str, default=None,
help='项目ID')
parser.add_argument('--region', type=str,
help='区域,默认从环境变量获取')
def main():
global Region
args = parser.parse_args()
if args.region is not None:
Region = args.region
# 使用 sdk
try:
project_id = resolve_project_id(Region, args.project_id)
credentials = BasicCredentials(AK, SK, project_id)
if SecurityToken:
credentials = credentials.with_security_token(SecurityToken)
http_config = build_http_config()
client = AsClient.new_builder().with_http_config(http_config).with_credentials(credentials).with_region(AsRegion.value_of(Region)).build()
request = ListLifeCycleHooksRequest()
request.scaling_group_id = args.scaling_group_id
response = client.list_life_cycle_hooks(request)
hooks = getattr(response, 'lifecycle_hooks', []) or []
if not hooks:
print(f"没有找到生命周期挂钩 (区域: {Region})")
return
header = "lifecycle_hook_name\tlifecycle_hook_type\tdefault_result\tdefault_timeout\tnotification_topic_urn\tnotification_topic_name\tcreate_time"
print(header)
for h in hooks:
print(f"{getattr(h, 'lifecycle_hook_name', '')}\t{getattr(h, 'lifecycle_hook_type', '')}\t{getattr(h, 'default_result', '')}\t{getattr(h, 'default_timeout', 0)}\t{getattr(h, 'notification_topic_urn', '')}\t{getattr(h, 'notification_topic_name', '')}\t{getattr(h, 'create_time', '')}")
except Exception as e:
print(f"as.list_life_cycle_hooks 查询失败: {e}")
exit(1)
if __name__ == '__main__':
main()
import argparse
import sys
import os
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..'))
from config import load_credentials, build_http_config
from _common import resolve_project_id
from huaweicloudsdkcore.auth.credentials import BasicCredentials
from huaweicloudsdkas.v1 import AsClient, ListResourceInstancesRequest
from huaweicloudsdkas.v1.region.as_region import AsRegion
# 初始化凭据
AK, SK, Region, SecurityToken = load_credentials()
parser = argparse.ArgumentParser(description='按标签查询资源实例')
parser.add_argument('--resource_type', type=str, required=True,
help='资源类型,枚举类:SCALING_GROUP_TAG')
parser.add_argument('--project_id', type=str, default=None,
help='项目ID')
parser.add_argument('--region', type=str,
help='区域,默认从环境变量获取')
def main():
global Region
args = parser.parse_args()
if args.region is not None:
Region = args.region
# 使用 sdk
try:
project_id = resolve_project_id(Region, args.project_id)
credentials = BasicCredentials(AK, SK, project_id)
if SecurityToken:
credentials = credentials.with_security_token(SecurityToken)
http_config = build_http_config()
client = AsClient.new_builder().with_http_config(http_config).with_credentials(credentials).with_region(AsRegion.value_of(Region)).build()
request = ListResourceInstancesRequest()
request.resource_type = args.resource_type
response = client.list_resource_instances(request)
resources = getattr(response, 'resources', []) or []
total_count = getattr(response, 'total_count', 0)
if not resources:
print(f"没有找到资源实例 (区域: {Region})")
return
print(f"total_count:\t{total_count}")
header = "resource_id\tresource_name\tresource_detail"
print(header)
for r in resources:
print(f"{getattr(r, 'resource_id', '')}\t{getattr(r, 'resource_name', '')}\t{getattr(r, 'resource_detail', '')}")
tags = getattr(r, 'tags', []) or []
if tags:
tag_str = ', '.join(f"{getattr(t, 'key', '')}={getattr(t, 'value', '')}" for t in tags)
print(f" tags: {tag_str}")
except Exception as e:
print(f"as.list_resource_instances 查询失败: {e}")
exit(1)
if __name__ == '__main__':
main()
import argparse
import sys
import os
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..'))
from config import load_credentials, build_http_config
from _common import resolve_project_id
from huaweicloudsdkcore.auth.credentials import BasicCredentials
from huaweicloudsdkas.v1 import AsClient, ListScalingActivityLogsRequest
from huaweicloudsdkas.v1.region.as_region import AsRegion
# 初始化凭据
AK, SK, Region, SecurityToken = load_credentials()
Offset = 0
parser = argparse.ArgumentParser(description='查询弹性伸缩活动日志列表(v1)')
parser.add_argument('--scaling_group_id', type=str, required=True,
help='伸缩组ID,可通过 list_scaling_groups.py 获取')
parser.add_argument('--start_time', type=str, default=None,
help='查询的起始时间,格式为yyyy-MM-ddThh:mm:ssZ')
parser.add_argument('--end_time', type=str, default=None,
help='查询的截止时间,格式为yyyy-MM-ddThh:mm:ssZ')
parser.add_argument('--start_number', type=int, default=0,
help='查询的起始行号,默认为0')
parser.add_argument('--limit', type=int, default=100,
help='查询记录数,默认20,最大100')
parser.add_argument('--project_id', type=str, default=None,
help='项目ID')
parser.add_argument('--region', type=str,
help='区域,默认从环境变量获取')
parser.add_argument('--offset', type=int,
help='客户端分页偏移量,从0开始')
def render(logs):
if not logs:
print(f"没有找到伸缩活动日志 (区域: {Region})")
return
header = "id\tstatus\tstart_time\tend_time\tscaling_value\tinstance_value\tdesire_value\tdescription"
print(header)
start = Offset
end = min(Offset + 50, len(logs))
for l in logs[start:end]:
print(f"{getattr(l, 'id', '')}\t{getattr(l, 'status', '')}\t{getattr(l, 'start_time', '')}\t{getattr(l, 'end_time', '')}\t{getattr(l, 'scaling_value', 0)}\t{getattr(l, 'instance_value', 0)}\t{getattr(l, 'desire_value', 0)}\t{getattr(l, 'description', '')}")
if len(logs) > end:
print(f"可以使用 --offset={end} 参数继续获取后续数据")
def main():
global Region, Offset
args = parser.parse_args()
if args.region is not None:
Region = args.region
if args.offset is not None:
Offset = args.offset
if Offset < 0:
Offset = 0
# 使用 sdk
try:
project_id = resolve_project_id(Region, args.project_id)
credentials = BasicCredentials(AK, SK, project_id)
if SecurityToken:
credentials = credentials.with_security_token(SecurityToken)
http_config = build_http_config()
client = AsClient.new_builder().with_http_config(http_config).with_credentials(credentials).with_region(AsRegion.value_of(Region)).build()
all_logs = []
start = args.start_number
while True:
request = ListScalingActivityLogsRequest()
request.scaling_group_id = args.scaling_group_id
if args.start_time:
request.start_time = args.start_time
if args.end_time:
request.end_time = args.end_time
request.start_number = start
request.limit = args.limit
response = client.list_scaling_activity_logs(request)
logs = getattr(response, 'scaling_activity_log', []) or []
all_logs.extend(logs)
total = getattr(response, 'total_number', 0)
if total <= 0 or len(all_logs) >= total:
break
start = len(all_logs)
render(all_logs)
except Exception as e:
print(f"as.list_scaling_activity_logs 查询失败: {e}")
exit(1)
if __name__ == '__main__':
main()
import argparse
import sys
import os
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..'))
from config import load_credentials, build_http_config
from _common import resolve_project_id
from huaweicloudsdkcore.auth.credentials import BasicCredentials
from huaweicloudsdkas.v1 import AsClient, ListScalingActivityV2LogsRequest
from huaweicloudsdkas.v1.region.as_region import AsRegion
# 初始化凭据
AK, SK, Region, SecurityToken = load_credentials()
Offset = 0
parser = argparse.ArgumentParser(description='查询弹性伸缩活动日志列表(v2)')
parser.add_argument('--scaling_group_id', type=str, required=True,
help='伸缩组ID,可通过 list_scaling_groups.py 获取')
parser.add_argument('--log_id', type=str, default=None,
help='伸缩活动日志ID')
parser.add_argument('--start_time', type=str, default=None,
help='查询的起始时间,格式为yyyy-MM-ddThh:mm:ssZ')
parser.add_argument('--end_time', type=str, default=None,
help='查询的截止时间,格式为yyyy-MM-ddThh:mm:ssZ')
parser.add_argument('--type', type=str, default=None,
help='查询的伸缩活动类型(逗号分隔):NORMAL-普通;MANNUAL_REMOVE-手动移除;MANNUAL_DELETE-手动移除并删除;MANNUAL_ADD-手动加入;ELB_CHECK_DELETE-ELB检查移除并删除;AUDIT_CHECK_DELETE-审计移除并删除;DIFF-期望实例数与实际不一致;MODIFY_ELB-LB迁移;ENTER_STANDBY-转入备用;EXIT_STANDBY-移出备用')
parser.add_argument('--status', type=str, default=None,
choices=['SUCCESS', 'FAIL', 'DOING'],
help='查询的伸缩活动状态:SUCCESS-成功;FAIL-失败;DOING-伸缩中')
parser.add_argument('--start_number', type=int, default=0,
help='查询的起始行号,默认为0')
parser.add_argument('--limit', type=int, default=100,
help='查询记录数,默认20,最大100')
parser.add_argument('--project_id', type=str, default=None,
help='项目ID')
parser.add_argument('--region', type=str,
help='区域,默认从环境变量获取')
parser.add_argument('--offset', type=int,
help='客户端分页偏移量,从0开始')
def render(logs):
if not logs:
print(f"没有找到伸缩活动日志 (区域: {Region})")
return
header = "id\tstatus\ttype\tstart_time\tend_time\tscaling_value\tinstance_value\tdesire_value\tdescription"
print(header)
start = Offset
end = min(Offset + 50, len(logs))
for l in logs[start:end]:
print(f"{getattr(l, 'id', '')}\t{getattr(l, 'status', '')}\t{getattr(l, 'type', '')}\t{getattr(l, 'start_time', '')}\t{getattr(l, 'end_time', '')}\t{getattr(l, 'scaling_value', 0)}\t{getattr(l, 'instance_value', 0)}\t{getattr(l, 'desire_value', 0)}\t{getattr(l, 'description', '')}")
if len(logs) > end:
print(f"可以使用 --offset={end} 参数继续获取后续数据")
def main():
global Region, Offset
args = parser.parse_args()
if args.region is not None:
Region = args.region
if args.offset is not None:
Offset = args.offset
if Offset < 0:
Offset = 0
# 使用 sdk
try:
project_id = resolve_project_id(Region, args.project_id)
credentials = BasicCredentials(AK, SK, project_id)
if SecurityToken:
credentials = credentials.with_security_token(SecurityToken)
http_config = build_http_config()
client = AsClient.new_builder().with_http_config(http_config).with_credentials(credentials).with_region(AsRegion.value_of(Region)).build()
all_logs = []
start = args.start_number
while True:
request = ListScalingActivityV2LogsRequest()
request.scaling_group_id = args.scaling_group_id
if args.log_id:
request.log_id = args.log_id
if args.start_time:
request.start_time = args.start_time
if args.end_time:
request.end_time = args.end_time
if args.type:
request.type = args.type
if args.status:
request.status = args.status
request.start_number = start
request.limit = args.limit
response = client.list_scaling_activity_v2_logs(request)
logs = getattr(response, 'scaling_activity_log', []) or []
all_logs.extend(logs)
total = getattr(response, 'total_number', 0)
if total <= 0 or len(all_logs) >= total:
break
start = len(all_logs)
render(all_logs)
except Exception as e:
print(f"as.list_scaling_activity_v2_logs 查询失败: {e}")
exit(1)
if __name__ == '__main__':
main()
import argparse
import sys
import os
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..'))
from config import load_credentials, build_http_config
from _common import resolve_project_id
from huaweicloudsdkcore.auth.credentials import BasicCredentials
from huaweicloudsdkas.v1 import AsClient, ListScalingConfigsRequest
from huaweicloudsdkas.v1.region.as_region import AsRegion
# 初始化凭据
AK, SK, Region, SecurityToken = load_credentials()
Offset = 0
parser = argparse.ArgumentParser(description='查询弹性伸缩配置列表')
parser.add_argument('--scaling_configuration_name', type=str, default=None,
help='伸缩配置名称')
parser.add_argument('--image_id', type=str, default=None,
help='镜像ID,同imageRef')
parser.add_argument('--start_number', type=int, default=0,
help='查询的起始行号,默认为0')
parser.add_argument('--limit', type=int, default=100,
help='查询的记录条数,默认为20')
parser.add_argument('--project_id', type=str, default=None,
help='项目ID')
parser.add_argument('--region', type=str,
help='区域,默认从环境变量获取')
parser.add_argument('--offset', type=int,
help='客户端分页偏移量,从0开始')
def render(configs):
if not configs:
print(f"没有找到伸缩配置 (区域: {Region})")
return
header = "scaling_configuration_id\tscaling_configuration_name\tscaling_group_id\tcreate_time"
print(header)
start = Offset
end = min(Offset + 50, len(configs))
for c in configs[start:end]:
print(f"{getattr(c, 'scaling_configuration_id', '')}\t{getattr(c, 'scaling_configuration_name', '')}\t{getattr(c, 'scaling_group_id', '')}\t{getattr(c, 'create_time', '')}")
if len(configs) > end:
print(f"可以使用 --offset={end} 参数继续获取后续数据")
def main():
global Region, Offset
args = parser.parse_args()
if args.region is not None:
Region = args.region
if args.offset is not None:
Offset = args.offset
if Offset < 0:
Offset = 0
# 使用 sdk
try:
project_id = resolve_project_id(Region, args.project_id)
credentials = BasicCredentials(AK, SK, project_id)
if SecurityToken:
credentials = credentials.with_security_token(SecurityToken)
http_config = build_http_config()
client = AsClient.new_builder().with_http_config(http_config).with_credentials(credentials).with_region(AsRegion.value_of(Region)).build()
all_configs = []
start = args.start_number
while True:
request = ListScalingConfigsRequest()
if args.scaling_configuration_name:
request.scaling_configuration_name = args.scaling_configuration_name
if args.image_id:
request.image_id = args.image_id
request.start_number = start
request.limit = args.limit
response = client.list_scaling_configs(request)
configs = getattr(response, 'scaling_configurations', []) or []
all_configs.extend(configs)
total = getattr(response, 'total_number', 0)
if total <= 0 or len(all_configs) >= total:
break
start = len(all_configs)
render(all_configs)
except Exception as e:
print(f"as.list_scaling_configs 查询失败: {e}")
exit(1)
if __name__ == '__main__':
main()
import argparse
import sys
import os
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..'))
from config import load_credentials, build_http_config
from _common import resolve_project_id, resolve_vpc_info
from huaweicloudsdkcore.auth.credentials import BasicCredentials
from huaweicloudsdkas.v1 import AsClient, ListScalingGroupsRequest
from huaweicloudsdkas.v1.region.as_region import AsRegion
# 初始化凭据
AK, SK, Region, SecurityToken = load_credentials()
Offset = 0
parser = argparse.ArgumentParser(description='查询弹性伸缩组列表')
parser.add_argument('--scaling_group_name', type=str, default=None,
help='伸缩组名称')
parser.add_argument('--scaling_configuration_id', type=str, default=None,
help='伸缩配置ID,通过查询弹性伸缩配置列表接口获取')
parser.add_argument('--scaling_group_status', type=str, default=None,
choices=['INSERVICE', 'PAUSED', 'ERROR', 'DELETING', 'FREEZED'],
help='伸缩组状态:INSERVICE-正常;PAUSED-停用;ERROR-异常;DELETING-删除中;FREEZED-已冻结')
parser.add_argument('--start_number', type=int, default=0,
help='查询的起始行号,默认为0')
parser.add_argument('--limit', type=int, default=100,
help='查询的记录条数,默认为20,最大100')
parser.add_argument('--enterprise_project_id', type=str, default=None,
help='企业项目ID,传入all_granted_eps表示查询所有授权企业项目下的伸缩组')
parser.add_argument('--project_id', type=str, default=None,
help='项目ID')
parser.add_argument('--region', type=str,
help='区域,默认从环境变量获取')
parser.add_argument('--offset', type=int,
help='客户端分页偏移量,从0开始')
def render(groups, vpc_info=None):
if not groups:
print(f"没有找到伸缩组 (区域: {Region})")
return
header = "scaling_group_id\tscaling_group_name\tstatus\tscaling_configuration_id\tcurrent_instance_number\tdesire_instance_number\tmin_instance_number\tmax_instance_number\tvpc_id\tvpc_name\tcreate_time"
print(header)
start = Offset
end = min(Offset + 50, len(groups))
for g in groups[start:end]:
vid = getattr(g, 'vpc_id', '')
vname = (vpc_info or {}).get(vid, {}).get('name', '')
print(f"{getattr(g, 'scaling_group_id', '')}\t{getattr(g, 'scaling_group_name', '')}\t{getattr(g, 'scaling_group_status', '')}\t{getattr(g, 'scaling_configuration_id', '')}\t{getattr(g, 'current_instance_number', 0)}\t{getattr(g, 'desire_instance_number', 0)}\t{getattr(g, 'min_instance_number', 0)}\t{getattr(g, 'max_instance_number', 0)}\t{vid}\t{vname}\t{getattr(g, 'create_time', '')}")
if len(groups) > end:
print(f"可以使用 --offset={end} 参数继续获取后续数据")
def main():
global Offset, Region
args = parser.parse_args()
if args.region is not None:
Region = args.region
if args.offset is not None:
Offset = args.offset
if Offset < 0:
Offset = 0
# 使用 sdk
try:
project_id = resolve_project_id(Region, args.project_id)
credentials = BasicCredentials(AK, SK, project_id)
if SecurityToken:
credentials = credentials.with_security_token(SecurityToken)
http_config = build_http_config()
client = AsClient.new_builder().with_http_config(http_config).with_credentials(credentials).with_region(AsRegion.value_of(Region)).build()
all_groups = []
start = args.start_number
while True:
request = ListScalingGroupsRequest()
if args.scaling_group_name:
request.scaling_group_name = args.scaling_group_name
if args.scaling_configuration_id:
request.scaling_configuration_id = args.scaling_configuration_id
if args.scaling_group_status:
request.scaling_group_status = args.scaling_group_status
if args.enterprise_project_id:
request.enterprise_project_id = args.enterprise_project_id
request.start_number = start
request.limit = args.limit
response = client.list_scaling_groups(request)
groups = getattr(response, 'scaling_groups', []) or []
all_groups.extend(groups)
total = getattr(response, 'total_number', 0)
if total <= 0 or len(all_groups) >= total:
break
start = len(all_groups)
vpc_ids = list(set(getattr(g, 'vpc_id', '') for g in all_groups if getattr(g, 'vpc_id', '')))
vpc_info = resolve_vpc_info(Region, project_id, vpc_ids) if vpc_ids else {}
render(all_groups, vpc_info)
except Exception as e:
print(f"as.list_scaling_groups 查询失败: {e}")
exit(1)
if __name__ == '__main__':
main()
import argparse
import sys
import os
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..'))
from config import load_credentials, build_http_config
from _common import resolve_project_id
from huaweicloudsdkcore.auth.credentials import BasicCredentials
from huaweicloudsdkas.v1 import AsClient, ListScalingInstancesRequest
from huaweicloudsdkas.v1.region.as_region import AsRegion
# 初始化凭据
AK, SK, Region, SecurityToken = load_credentials()
Offset = 0
parser = argparse.ArgumentParser(description='查询弹性伸缩组实例列表')
parser.add_argument('--scaling_group_id', type=str, required=True,
help='伸缩组ID,可通过 list_scaling_groups.py 获取')
parser.add_argument('--life_cycle_state', type=str, default=None,
choices=['INSERVICE', 'PENDING', 'REMOVING', 'PENDING_WAIT', 'REMOVING_WAIT'],
help='实例生命周期状态:INSERVICE-正在使用;PENDING-正在加入;REMOVING-正在移出;PENDING_WAIT-正在加入等待;REMOVING_WAIT-正在移出等待')
parser.add_argument('--health_status', type=str, default=None,
choices=['INITIALIZING', 'NORMAL', 'ERROR'],
help='实例健康状态:INITIALIZING-初始化;NORMAL-正常;ERROR-异常')
parser.add_argument('--protect_from_scaling_down', type=str, default=None,
choices=['true', 'false'],
help='实例保护状态:true-已设置实例保护;false-未设置实例保护')
parser.add_argument('--start_number', type=int, default=0,
help='查询的起始行号,默认为0')
parser.add_argument('--limit', type=int, default=100,
help='查询的记录条数,默认为20')
parser.add_argument('--project_id', type=str, default=None,
help='项目ID')
parser.add_argument('--region', type=str,
help='区域,默认从环境变量获取')
parser.add_argument('--offset', type=int,
help='客户端分页偏移量,从0开始')
def render(instances):
if not instances:
print(f"没有找到伸缩组实例 (区域: {Region})")
return
header = "instance_id\tinstance_name\tlife_cycle_state\thealth_status\tscaling_configuration_id\tprotect_from_scaling_down\tcreate_time"
print(header)
start = Offset
end = min(Offset + 50, len(instances))
for i in instances[start:end]:
print(f"{getattr(i, 'instance_id', '')}\t{getattr(i, 'instance_name', '')}\t{getattr(i, 'life_cycle_state', '')}\t{getattr(i, 'health_status', '')}\t{getattr(i, 'scaling_configuration_id', '')}\t{getattr(i, 'protect_from_scaling_down', False)}\t{getattr(i, 'create_time', '')}")
if len(instances) > end:
print(f"可以使用 --offset={end} 参数继续获取后续数据")
def main():
global Region, Offset
args = parser.parse_args()
if args.region is not None:
Region = args.region
if args.offset is not None:
Offset = args.offset
if Offset < 0:
Offset = 0
# 使用 sdk
try:
project_id = resolve_project_id(Region, args.project_id)
credentials = BasicCredentials(AK, SK, project_id)
if SecurityToken:
credentials = credentials.with_security_token(SecurityToken)
http_config = build_http_config()
client = AsClient.new_builder().with_http_config(http_config).with_credentials(credentials).with_region(AsRegion.value_of(Region)).build()
all_instances = []
start = args.start_number
while True:
request = ListScalingInstancesRequest()
request.scaling_group_id = args.scaling_group_id
if args.life_cycle_state:
request.life_cycle_state = args.life_cycle_state
if args.health_status:
request.health_status = args.health_status
if args.protect_from_scaling_down:
request.protect_from_scaling_down = args.protect_from_scaling_down
request.start_number = start
request.limit = args.limit
response = client.list_scaling_instances(request)
instances = getattr(response, 'scaling_group_instances', []) or []
all_instances.extend(instances)
total = getattr(response, 'total_number', 0)
if total <= 0 or len(all_instances) >= total:
break
start = len(all_instances)
render(all_instances)
except Exception as e:
print(f"as.list_scaling_instances 查询失败: {e}")
exit(1)
if __name__ == '__main__':
main()
import argparse
import sys
import os
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..'))
from config import load_credentials, build_http_config
from _common import resolve_project_id
from huaweicloudsdkcore.auth.credentials import BasicCredentials
from huaweicloudsdkas.v1 import AsClient, ListScalingNotificationsRequest
from huaweicloudsdkas.v1.region.as_region import AsRegion
# 初始化凭据
AK, SK, Region, SecurityToken = load_credentials()
parser = argparse.ArgumentParser(description='查询弹性伸缩组通知列表')
parser.add_argument('--scaling_group_id', type=str, required=True,
help='伸缩组ID,可通过 list_scaling_groups.py 获取')
parser.add_argument('--project_id', type=str, default=None,
help='项目ID')
parser.add_argument('--region', type=str,
help='区域,默认从环境变量获取')
def main():
global Region
args = parser.parse_args()
if args.region is not None:
Region = args.region
# 使用 sdk
try:
project_id = resolve_project_id(Region, args.project_id)
credentials = BasicCredentials(AK, SK, project_id)
if SecurityToken:
credentials = credentials.with_security_token(SecurityToken)
http_config = build_http_config()
client = AsClient.new_builder().with_http_config(http_config).with_credentials(credentials).with_region(AsRegion.value_of(Region)).build()
request = ListScalingNotificationsRequest()
request.scaling_group_id = args.scaling_group_id
response = client.list_scaling_notifications(request)
topics = getattr(response, 'topics', []) or []
if not topics:
print(f"没有找到通知 (区域: {Region})")
return
header = "topic_urn\ttopic_name\ttopic_scene"
print(header)
for t in topics:
scene = ', '.join(getattr(t, 'topic_scene', []) or [])
print(f"{getattr(t, 'topic_urn', '')}\t{getattr(t, 'topic_name', '')}\t{scene}")
except Exception as e:
print(f"as.list_scaling_notifications 查询失败: {e}")
exit(1)
if __name__ == '__main__':
main()
import argparse
import sys
import os
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..'))
from config import load_credentials, build_http_config
from _common import resolve_project_id
from huaweicloudsdkcore.auth.credentials import BasicCredentials
from huaweicloudsdkas.v1 import AsClient, ListScalingPoliciesRequest
from huaweicloudsdkas.v1.region.as_region import AsRegion
# 初始化凭据
AK, SK, Region, SecurityToken = load_credentials()
Offset = 0
parser = argparse.ArgumentParser(description='查询弹性伸缩策略列表(v1)')
parser.add_argument('--scaling_group_id', type=str, required=True,
help='伸缩组ID,可通过 list_scaling_groups.py 获取')
parser.add_argument('--scaling_policy_name', type=str, default=None,
help='伸缩策略名称')
parser.add_argument('--scaling_policy_type', type=str, default=None,
choices=['ALARM', 'SCHEDULED', 'RECURRENCE'],
help='策略类型:ALARM-告警策略;SCHEDULED-定时策略;RECURRENCE-周期策略')
parser.add_argument('--scaling_policy_id', type=str, default=None,
help='伸缩策略ID')
parser.add_argument('--start_number', type=int, default=0,
help='查询的起始行号,默认为0')
parser.add_argument('--limit', type=int, default=100,
help='查询记录数,默认20,最大100')
parser.add_argument('--project_id', type=str, default=None,
help='项目ID')
parser.add_argument('--region', type=str,
help='区域,默认从环境变量获取')
parser.add_argument('--offset', type=int,
help='客户端分页偏移量,从0开始')
def render(policies):
if not policies:
print(f"没有找到伸缩策略 (区域: {Region})")
return
header = "scaling_policy_id\tscaling_policy_name\tpolicy_status\tscaling_policy_type\talarm_id\tcool_down_time\tcreate_time"
print(header)
start = Offset
end = min(Offset + 50, len(policies))
for p in policies[start:end]:
print(f"{getattr(p, 'scaling_policy_id', '')}\t{getattr(p, 'scaling_policy_name', '')}\t{getattr(p, 'policy_status', '')}\t{getattr(p, 'scaling_policy_type', '')}\t{getattr(p, 'alarm_id', '')}\t{getattr(p, 'cool_down_time', 0)}\t{getattr(p, 'create_time', '')}")
if len(policies) > end:
print(f"可以使用 --offset={end} 参数继续获取后续数据")
def main():
global Region, Offset
args = parser.parse_args()
if args.region is not None:
Region = args.region
if args.offset is not None:
Offset = args.offset
if Offset < 0:
Offset = 0
# 使用 sdk
try:
project_id = resolve_project_id(Region, args.project_id)
credentials = BasicCredentials(AK, SK, project_id)
if SecurityToken:
credentials = credentials.with_security_token(SecurityToken)
http_config = build_http_config()
client = AsClient.new_builder().with_http_config(http_config).with_credentials(credentials).with_region(AsRegion.value_of(Region)).build()
all_policies = []
start = args.start_number
while True:
request = ListScalingPoliciesRequest()
request.scaling_group_id = args.scaling_group_id
if args.scaling_policy_name:
request.scaling_policy_name = args.scaling_policy_name
if args.scaling_policy_type:
request.scaling_policy_type = args.scaling_policy_type
if args.scaling_policy_id:
request.scaling_policy_id = args.scaling_policy_id
request.start_number = start
request.limit = args.limit
response = client.list_scaling_policies(request)
policies = getattr(response, 'scaling_policies', []) or []
all_policies.extend(policies)
total = getattr(response, 'total_number', 0)
if total <= 0 or len(all_policies) >= total:
break
start = len(all_policies)
render(all_policies)
except Exception as e:
print(f"as.list_scaling_policies 查询失败: {e}")
exit(1)
if __name__ == '__main__':
main()
import argparse
import sys
import os
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..'))
from config import load_credentials, build_http_config
from _common import resolve_project_id
from huaweicloudsdkcore.auth.credentials import BasicCredentials
from huaweicloudsdkas.v1 import AsClient, ListScalingPolicyExecuteLogsRequest
from huaweicloudsdkas.v1.region.as_region import AsRegion
# 初始化凭据
AK, SK, Region, SecurityToken = load_credentials()
Offset = 0
parser = argparse.ArgumentParser(description='查询弹性伸缩策略执行日志列表')
parser.add_argument('--scaling_policy_id', type=str, required=True,
help='伸缩策略ID,可通过 list_scaling_policies.py 获取')
parser.add_argument('--log_id', type=str, default=None,
help='日志ID')
parser.add_argument('--scaling_resource_type', type=str, default=None,
choices=['SCALING_GROUP', 'BANDWIDTH'],
help='伸缩资源类型:SCALING_GROUP-伸缩组;BANDWIDTH-带宽')
parser.add_argument('--scaling_resource_id', type=str, default=None,
help='伸缩资源ID')
parser.add_argument('--execute_type', type=str, default=None,
choices=['SCHEDULED', 'RECURRENCE', 'ALARM', 'MANUAL'],
help='策略执行类型:SCHEDULED-自动触发(定时);RECURRENCE-自动触发(周期);ALARM-自动触发(告警);MANUAL-手动触发')
parser.add_argument('--start_time', type=str, default=None,
help='查询的起始时间,格式为yyyy-MM-ddThh:mm:ssZ')
parser.add_argument('--end_time', type=str, default=None,
help='查询的截止时间,格式为yyyy-MM-ddThh:mm:ssZ')
parser.add_argument('--start_number', type=int, default=0,
help='查询的起始行号,默认为0')
parser.add_argument('--limit', type=int, default=100,
help='查询记录数,默认20,最大100')
parser.add_argument('--project_id', type=str, default=None,
help='项目ID')
parser.add_argument('--region', type=str,
help='区域,默认从环境变量获取')
parser.add_argument('--offset', type=int,
help='客户端分页偏移量,从0开始')
def render(logs):
if not logs:
print(f"没有找到策略执行日志 (区域: {Region})")
return
header = "id\tstatus\texecute_type\texecute_time\told_value\tdesire_value\tlimit_value\ttype\tfailed_reason"
print(header)
start = Offset
end = min(Offset + 50, len(logs))
for l in logs[start:end]:
print(f"{getattr(l, 'id', '')}\t{getattr(l, 'status', '')}\t{getattr(l, 'execute_type', '')}\t{getattr(l, 'execute_time', '')}\t{getattr(l, 'old_value', '')}\t{getattr(l, 'desire_value', '')}\t{getattr(l, 'limit_value', '')}\t{getattr(l, 'type', '')}\t{getattr(l, 'failed_reason', '')}")
if len(logs) > end:
print(f"可以使用 --offset={end} 参数继续获取后续数据")
def main():
global Region, Offset
args = parser.parse_args()
if args.region is not None:
Region = args.region
if args.offset is not None:
Offset = args.offset
if Offset < 0:
Offset = 0
# 使用 sdk
try:
project_id = resolve_project_id(Region, args.project_id)
credentials = BasicCredentials(AK, SK, project_id)
if SecurityToken:
credentials = credentials.with_security_token(SecurityToken)
http_config = build_http_config()
client = AsClient.new_builder().with_http_config(http_config).with_credentials(credentials).with_region(AsRegion.value_of(Region)).build()
all_logs = []
start = args.start_number
while True:
request = ListScalingPolicyExecuteLogsRequest()
request.scaling_policy_id = args.scaling_policy_id
if args.log_id:
request.log_id = args.log_id
if args.scaling_resource_type:
request.scaling_resource_type = args.scaling_resource_type
if args.scaling_resource_id:
request.scaling_resource_id = args.scaling_resource_id
if args.execute_type:
request.execute_type = args.execute_type
if args.start_time:
request.start_time = args.start_time
if args.end_time:
request.end_time = args.end_time
request.start_number = start
request.limit = args.limit
response = client.list_scaling_policy_execute_logs(request)
logs = getattr(response, 'scaling_policy_execute_log', []) or []
all_logs.extend(logs)
total = getattr(response, 'total_number', 0)
if total <= 0 or len(all_logs) >= total:
break
start = len(all_logs)
render(all_logs)
except Exception as e:
print(f"as.list_scaling_policy_execute_logs 查询失败: {e}")
exit(1)
if __name__ == '__main__':
main()
import argparse
import sys
import os
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..'))
from config import load_credentials, build_http_config
from _common import resolve_project_id
from huaweicloudsdkcore.auth.credentials import BasicCredentials
from huaweicloudsdkas.v1 import AsClient, ListScalingTagInfosByResourceIdRequest
from huaweicloudsdkas.v1.region.as_region import AsRegion
# 初始化凭据
AK, SK, Region, SecurityToken = load_credentials()
parser = argparse.ArgumentParser(description='按资源ID查询标签')
parser.add_argument('--resource_type', type=str, required=True,
help='资源类型,枚举类:scaling_group_tag')
parser.add_argument('--resource_id', type=str, required=True,
help='资源ID')
parser.add_argument('--project_id', type=str, default=None,
help='项目ID')
parser.add_argument('--region', type=str,
help='区域,默认从环境变量获取')
def main():
global Region
args = parser.parse_args()
if args.region is not None:
Region = args.region
# 使用 sdk
try:
project_id = resolve_project_id(Region, args.project_id)
credentials = BasicCredentials(AK, SK, project_id)
if SecurityToken:
credentials = credentials.with_security_token(SecurityToken)
http_config = build_http_config()
client = AsClient.new_builder().with_http_config(http_config).with_credentials(credentials).with_region(AsRegion.value_of(Region)).build()
request = ListScalingTagInfosByResourceIdRequest()
request.resource_type = args.resource_type
request.resource_id = args.resource_id
response = client.list_scaling_tag_infos_by_resource_id(request)
tags = getattr(response, 'tags', []) or []
sys_tags = getattr(response, 'sys_tags', []) or []
if tags:
print("tags:")
header = "key\tvalue"
print(header)
for t in tags:
print(f"{getattr(t, 'key', '')}\t{getattr(t, 'value', '')}")
if sys_tags:
print("\nsys_tags:")
header = "key\tvalue"
print(header)
for t in sys_tags:
print(f"{getattr(t, 'key', '')}\t{getattr(t, 'value', '')}")
if not tags and not sys_tags:
print(f"没有找到标签 (区域: {Region})")
except Exception as e:
print(f"as.list_scaling_tag_infos_by_resource_id 查询失败: {e}")
exit(1)
if __name__ == '__main__':
main()
import argparse
import sys
import os
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..'))
from config import load_credentials, build_http_config
from _common import resolve_project_id
from huaweicloudsdkcore.auth.credentials import BasicCredentials
from huaweicloudsdkas.v1 import AsClient, ListScalingTagInfosByTenantIdRequest
from huaweicloudsdkas.v1.region.as_region import AsRegion
# 初始化凭据
AK, SK, Region, SecurityToken = load_credentials()
parser = argparse.ArgumentParser(description='按租户ID查询标签')
parser.add_argument('--resource_type', type=str, required=True,
help='资源类型,枚举类:scaling_group_tag')
parser.add_argument('--project_id', type=str, default=None,
help='项目ID')
parser.add_argument('--region', type=str,
help='区域,默认从环境变量获取')
def main():
global Region
args = parser.parse_args()
if args.region is not None:
Region = args.region
# 使用 sdk
try:
project_id = resolve_project_id(Region, args.project_id)
credentials = BasicCredentials(AK, SK, project_id)
if SecurityToken:
credentials = credentials.with_security_token(SecurityToken)
http_config = build_http_config()
client = AsClient.new_builder().with_http_config(http_config).with_credentials(credentials).with_region(AsRegion.value_of(Region)).build()
request = ListScalingTagInfosByTenantIdRequest()
request.resource_type = args.resource_type
response = client.list_scaling_tag_infos_by_tenant_id(request)
tags = getattr(response, 'tags', []) or []
if not tags:
print(f"没有找到标签 (区域: {Region})")
return
header = "key\tvalues"
print(header)
for t in tags:
values = ', '.join(getattr(t, 'values', []) or [])
print(f"{getattr(t, 'key', '')}\t{values}")
except Exception as e:
print(f"as.list_scaling_tag_infos_by_tenant_id 查询失败: {e}")
exit(1)
if __name__ == '__main__':
main()
import argparse
import sys
import os
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..'))
from config import load_credentials, build_http_config
from _common import resolve_project_id
from huaweicloudsdkcore.auth.credentials import BasicCredentials
from huaweicloudsdkas.v1 import AsClient, ListScalingV2PoliciesRequest
from huaweicloudsdkas.v1.region.as_region import AsRegion
# 初始化凭据
AK, SK, Region, SecurityToken = load_credentials()
Offset = 0
parser = argparse.ArgumentParser(description='查询弹性伸缩策略列表(v2)')
parser.add_argument('--scaling_resource_id', type=str, required=True,
help='伸缩组ID')
parser.add_argument('--scaling_policy_name', type=str, default=None,
help='伸缩策略名称')
parser.add_argument('--scaling_policy_type', type=str, default=None,
choices=['ALARM', 'SCHEDULED', 'RECURRENCE'],
help='策略类型:ALARM-告警策略;SCHEDULED-定时策略;RECURRENCE-周期策略')
parser.add_argument('--scaling_policy_id', type=str, default=None,
help='伸缩策略ID')
parser.add_argument('--start_number', type=int, default=0,
help='查询的起始行号,默认为0')
parser.add_argument('--limit', type=int, default=100,
help='查询记录数,默认20,最大100')
parser.add_argument('--project_id', type=str, default=None,
help='项目ID')
parser.add_argument('--region', type=str,
help='区域,默认从环境变量获取')
parser.add_argument('--offset', type=int,
help='客户端分页偏移量,从0开始')
def render(policies):
if not policies:
print(f"没有找到伸缩策略 (区域: {Region})")
return
header = "scaling_policy_id\tscaling_policy_name\tpolicy_status\tscaling_policy_type\talarm_id\tcool_down_time\tcreate_time"
print(header)
start = Offset
end = min(Offset + 50, len(policies))
for p in policies[start:end]:
print(f"{getattr(p, 'scaling_policy_id', '')}\t{getattr(p, 'scaling_policy_name', '')}\t{getattr(p, 'policy_status', '')}\t{getattr(p, 'scaling_policy_type', '')}\t{getattr(p, 'alarm_id', '')}\t{getattr(p, 'cool_down_time', 0)}\t{getattr(p, 'create_time', '')}")
if len(policies) > end:
print(f"可以使用 --offset={end} 参数继续获取后续数据")
def main():
global Region, Offset
args = parser.parse_args()
if args.region is not None:
Region = args.region
if args.offset is not None:
Offset = args.offset
if Offset < 0:
Offset = 0
# 使用 sdk
try:
project_id = resolve_project_id(Region, args.project_id)
credentials = BasicCredentials(AK, SK, project_id)
if SecurityToken:
credentials = credentials.with_security_token(SecurityToken)
http_config = build_http_config()
client = AsClient.new_builder().with_http_config(http_config).with_credentials(credentials).with_region(AsRegion.value_of(Region)).build()
all_policies = []
start = args.start_number
while True:
request = ListScalingV2PoliciesRequest()
request.scaling_resource_id = args.scaling_resource_id
if args.scaling_policy_name:
request.scaling_policy_name = args.scaling_policy_name
if args.scaling_policy_type:
request.scaling_policy_type = args.scaling_policy_type
if args.scaling_policy_id:
request.scaling_policy_id = args.scaling_policy_id
request.start_number = start
request.limit = args.limit
response = client.list_scaling_v2_policies(request)
policies = getattr(response, 'scaling_policies', []) or []
all_policies.extend(policies)
total = getattr(response, 'total_number', 0)
if total <= 0 or len(all_policies) >= total:
break
start = len(all_policies)
render(all_policies)
except Exception as e:
print(f"as.list_scaling_v2_policies 查询失败: {e}")
exit(1)
if __name__ == '__main__':
main()
import argparse
import sys
import os
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..'))
from config import load_credentials, build_http_config
from _common import resolve_project_id
from huaweicloudsdkcore.auth.credentials import BasicCredentials
from huaweicloudsdkas.v1 import AsClient, ListWarmPoolInstancesNewRequest
from huaweicloudsdkas.v1.region.as_region import AsRegion
# 初始化凭据
AK, SK, Region, SecurityToken = load_credentials()
Offset = 0
parser = argparse.ArgumentParser(description='查询暖池实例列表(新)')
parser.add_argument('--scaling_group_id', type=str, required=True,
help='伸缩组ID,可通过 list_scaling_groups.py 获取')
parser.add_argument('--limit', type=int, default=100,
help='查询的记录条数,默认20,最大100')
parser.add_argument('--marker', type=str, default=None,
help='查询暖池实例的分页marker')
parser.add_argument('--project_id', type=str, default=None,
help='项目ID')
parser.add_argument('--region', type=str,
help='区域,默认从环境变量获取')
parser.add_argument('--offset', type=int,
help='客户端分页偏移量,从0开始')
def render(instances):
if not instances:
print(f"没有找到暖池实例 (区域: {Region})")
return
header = "id\tinstance_id\tname\tstatus"
print(header)
start = Offset
end = min(Offset + 50, len(instances))
for i in instances[start:end]:
print(f"{getattr(i, 'id', '')}\t{getattr(i, 'instance_id', '')}\t{getattr(i, 'name', '')}\t{getattr(i, 'status', '')}")
if len(instances) > end:
print(f"可以使用 --offset={end} 参数继续获取后续数据")
def main():
global Region, Offset
args = parser.parse_args()
if args.region is not None:
Region = args.region
if args.offset is not None:
Offset = args.offset
if Offset < 0:
Offset = 0
# 使用 sdk
try:
project_id = resolve_project_id(Region, args.project_id)
credentials = BasicCredentials(AK, SK, project_id)
if SecurityToken:
credentials = credentials.with_security_token(SecurityToken)
http_config = build_http_config()
client = AsClient.new_builder().with_http_config(http_config).with_credentials(credentials).with_region(AsRegion.value_of(Region)).build()
all_instances = []
marker = args.marker
while True:
request = ListWarmPoolInstancesNewRequest()
request.scaling_group_id = args.scaling_group_id
request.limit = args.limit
if marker:
request.marker = marker
response = client.list_warm_pool_instances_new(request)
instances = getattr(response, 'warm_pool_instances', []) or []
all_instances.extend(instances)
page_info = getattr(response, 'page_info', None)
next_marker = getattr(page_info, 'next_marker', '') if page_info else ''
if not next_marker:
break
marker = next_marker
render(all_instances)
except Exception as e:
print(f"as.list_warm_pool_instances_new 查询失败: {e}")
exit(1)
if __name__ == '__main__':
main()
import argparse
import sys
import os
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..'))
from config import load_credentials, build_http_config
from _common import resolve_project_id
from huaweicloudsdkcore.auth.credentials import BasicCredentials
from huaweicloudsdkas.v1 import AsClient, ListWarmPoolInstancesRequest
from huaweicloudsdkas.v1.region.as_region import AsRegion
# 初始化凭据
AK, SK, Region, SecurityToken = load_credentials()
Offset = 0
parser = argparse.ArgumentParser(description='查询暖池实例列表')
parser.add_argument('--scaling_group_id', type=str, required=True,
help='伸缩组ID,可通过 list_scaling_groups.py 获取')
parser.add_argument('--limit', type=int, default=100,
help='查询的记录条数,默认20,最大100')
parser.add_argument('--marker', type=str, default=None,
help='查询暖池实例的分页marker')
parser.add_argument('--project_id', type=str, default=None,
help='项目ID')
parser.add_argument('--region', type=str,
help='区域,默认从环境变量获取')
parser.add_argument('--offset', type=int,
help='客户端分页偏移量,从0开始')
def render(instances):
if not instances:
print(f"没有找到暖池实例 (区域: {Region})")
return
header = "id\tinstance_id\tname\tstatus"
print(header)
start = Offset
end = min(Offset + 50, len(instances))
for i in instances[start:end]:
print(f"{getattr(i, 'id', '')}\t{getattr(i, 'instance_id', '')}\t{getattr(i, 'name', '')}\t{getattr(i, 'status', '')}")
if len(instances) > end:
print(f"可以使用 --offset={end} 参数继续获取后续数据")
def main():
global Region, Offset
args = parser.parse_args()
if args.region is not None:
Region = args.region
if args.offset is not None:
Offset = args.offset
if Offset < 0:
Offset = 0
# 使用 sdk
try:
project_id = resolve_project_id(Region, args.project_id)
credentials = BasicCredentials(AK, SK, project_id)
if SecurityToken:
credentials = credentials.with_security_token(SecurityToken)
http_config = build_http_config()
client = AsClient.new_builder().with_http_config(http_config).with_credentials(credentials).with_region(AsRegion.value_of(Region)).build()
all_instances = []
marker = args.marker
while True:
request = ListWarmPoolInstancesRequest()
request.scaling_group_id = args.scaling_group_id
request.limit = args.limit
if marker:
request.marker = marker
response = client.list_warm_pool_instances(request)
instances = getattr(response, 'warm_pool_instances', []) or []
all_instances.extend(instances)
page_info = getattr(response, 'page_info', None)
next_marker = getattr(page_info, 'next_marker', '') if page_info else ''
if not next_marker:
break
marker = next_marker
render(all_instances)
except Exception as e:
print(f"as.list_warm_pool_instances 查询失败: {e}")
exit(1)
if __name__ == '__main__':
main()
import argparse
import sys
import os
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..'))
from config import load_credentials, build_http_config
from _common import resolve_project_id
from huaweicloudsdkcore.auth.credentials import BasicCredentials
from huaweicloudsdkas.v1 import AsClient, ShowApiVersionRequest
from huaweicloudsdkas.v1.region.as_region import AsRegion
# 初始化凭据
AK, SK, Region, SecurityToken = load_credentials()
parser = argparse.ArgumentParser(description='查询AS API版本详情')
parser.add_argument('--api_version', type=str, required=True,
help='API版本ID,如v1')
parser.add_argument('--project_id', type=str, default=None,
help='项目ID')
parser.add_argument('--region', type=str,
help='区域,默认从环境变量获取')
def main():
global Region
args = parser.parse_args()
if args.region is not None:
Region = args.region
# 使用 sdk
try:
project_id = resolve_project_id(Region, args.project_id)
credentials = BasicCredentials(AK, SK, project_id)
if SecurityToken:
credentials = credentials.with_security_token(SecurityToken)
http_config = build_http_config()
client = AsClient.new_builder().with_http_config(http_config).with_credentials(credentials).with_region(AsRegion.value_of(Region)).build()
request = ShowApiVersionRequest()
request.api_version = args.api_version
response = client.show_api_version(request)
version = getattr(response, 'version', None)
if not version:
print("未找到API版本")
return
print(f"id:\t{getattr(version, 'id', '')}")
print(f"status:\t{getattr(version, 'status', '')}")
print(f"min_version:\t{getattr(version, 'min_version', '')}")
print(f"version:\t{getattr(version, 'version', '')}")
print(f"update:\t{getattr(version, 'update', '')}")
links = getattr(version, 'links', []) or []
if links:
print("\nlinks:")
for l in links:
print(f" rel={getattr(l, 'rel', '')}, href={getattr(l, 'href', '')}")
except Exception as e:
print(f"as.show_api_version 查询失败: {e}")
exit(1)
if __name__ == '__main__':
main()
import argparse
import sys
import os
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..'))
from config import load_credentials, build_http_config
from _common import resolve_project_id, handle_not_found_error
from huaweicloudsdkcore.auth.credentials import BasicCredentials
from huaweicloudsdkas.v1 import AsClient, ShowLifeCycleHookRequest
from huaweicloudsdkas.v1.region.as_region import AsRegion
# 初始化凭据
AK, SK, Region, SecurityToken = load_credentials()
parser = argparse.ArgumentParser(description='查询生命周期挂钩详情')
parser.add_argument('--scaling_group_id', type=str, required=True,
help='伸缩组ID,可通过 list_scaling_groups.py 获取')
parser.add_argument('--lifecycle_hook_name', type=str, required=True,
help='生命周期挂钩名称,可通过 list_life_cycle_hooks.py 获取')
parser.add_argument('--project_id', type=str, default=None,
help='项目ID')
parser.add_argument('--region', type=str,
help='区域,默认从环境变量获取')
def main():
global Region
args = parser.parse_args()
if args.region is not None:
Region = args.region
# 使用 sdk
try:
project_id = resolve_project_id(Region, args.project_id)
credentials = BasicCredentials(AK, SK, project_id)
if SecurityToken:
credentials = credentials.with_security_token(SecurityToken)
http_config = build_http_config()
client = AsClient.new_builder().with_http_config(http_config).with_credentials(credentials).with_region(AsRegion.value_of(Region)).build()
request = ShowLifeCycleHookRequest()
request.scaling_group_id = args.scaling_group_id
request.lifecycle_hook_name = args.lifecycle_hook_name
response = client.show_life_cycle_hook(request)
print(f"lifecycle_hook_name:\t{getattr(response, 'lifecycle_hook_name', '')}")
print(f"lifecycle_hook_type:\t{getattr(response, 'lifecycle_hook_type', '')}")
print(f"default_result:\t{getattr(response, 'default_result', '')}")
print(f"default_timeout:\t{getattr(response, 'default_timeout', 0)}")
print(f"notification_topic_urn:\t{getattr(response, 'notification_topic_urn', '')}")
print(f"notification_topic_name:\t{getattr(response, 'notification_topic_name', '')}")
print(f"notification_metadata:\t{getattr(response, 'notification_metadata', '')}")
print(f"create_time:\t{getattr(response, 'create_time', '')}")
except Exception as e:
handle_not_found_error(e, "lifecycleHook", args.lifecycle_hook_name)
if __name__ == '__main__':
main()
import argparse
import sys
import os
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..'))
from config import load_credentials, build_http_config
from _common import resolve_project_id
from huaweicloudsdkcore.auth.credentials import BasicCredentials
from huaweicloudsdkas.v1 import AsClient, ShowPolicyAndInstanceQuotaRequest
from huaweicloudsdkas.v1.region.as_region import AsRegion
# 初始化凭据
AK, SK, Region, SecurityToken = load_credentials()
parser = argparse.ArgumentParser(description='查询伸缩组策略和实例配额')
parser.add_argument('--scaling_group_id', type=str, required=True,
help='伸缩组ID,可通过 list_scaling_groups.py 获取')
parser.add_argument('--project_id', type=str, default=None,
help='项目ID')
parser.add_argument('--region', type=str,
help='区域,默认从环境变量获取')
def main():
global Region
args = parser.parse_args()
if args.region is not None:
Region = args.region
# 使用 sdk
try:
project_id = resolve_project_id(Region, args.project_id)
credentials = BasicCredentials(AK, SK, project_id)
if SecurityToken:
credentials = credentials.with_security_token(SecurityToken)
http_config = build_http_config()
client = AsClient.new_builder().with_http_config(http_config).with_credentials(credentials).with_region(AsRegion.value_of(Region)).build()
request = ShowPolicyAndInstanceQuotaRequest()
request.scaling_group_id = args.scaling_group_id
response = client.show_policy_and_instance_quota(request)
quotas = getattr(response, 'quotas', None)
if not quotas:
print("未找到配额信息")
return
resources = getattr(quotas, 'resources', []) or []
if not resources:
print("无配额数据")
return
header = "type\tused\tquota\tmax\tmin"
print(header)
for r in resources:
print(f"{getattr(r, 'type', '')}\t{getattr(r, 'used', 0)}\t{getattr(r, 'quota', 0)}\t{getattr(r, 'max', 0)}\t{getattr(r, 'min', 0)}")
except Exception as e:
print(f"as.show_policy_and_instance_quota 查询失败: {e}")
exit(1)
if __name__ == '__main__':
main()
import argparse
import sys
import os
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..'))
from config import load_credentials, build_http_config
from _common import resolve_project_id
from huaweicloudsdkcore.auth.credentials import BasicCredentials
from huaweicloudsdkas.v1 import AsClient, ShowResourceQuotaRequest
from huaweicloudsdkas.v1.region.as_region import AsRegion
# 初始化凭据
AK, SK, Region, SecurityToken = load_credentials()
parser = argparse.ArgumentParser(description='查询AS资源配额')
parser.add_argument('--project_id', type=str, default=None,
help='项目ID')
parser.add_argument('--region', type=str,
help='区域,默认从环境变量获取')
def main():
global Region
args = parser.parse_args()
if args.region is not None:
Region = args.region
# 使用 sdk
try:
project_id = resolve_project_id(Region, args.project_id)
credentials = BasicCredentials(AK, SK, project_id)
if SecurityToken:
credentials = credentials.with_security_token(SecurityToken)
http_config = build_http_config()
client = AsClient.new_builder().with_http_config(http_config).with_credentials(credentials).with_region(AsRegion.value_of(Region)).build()
request = ShowResourceQuotaRequest()
response = client.show_resource_quota(request)
quotas = getattr(response, 'quotas', None)
if not quotas:
print("未找到配额信息")
return
resources = getattr(quotas, 'resources', []) or []
if not resources:
print("无配额数据")
return
header = "type\tused\tquota\tmax\tmin"
print(header)
for r in resources:
print(f"{getattr(r, 'type', '')}\t{getattr(r, 'used', 0)}\t{getattr(r, 'quota', 0)}\t{getattr(r, 'max', 0)}\t{getattr(r, 'min', 0)}")
except Exception as e:
print(f"as.show_resource_quota 查询失败: {e}")
exit(1)
if __name__ == '__main__':
main()
import argparse
import sys
import os
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..'))
from config import load_credentials, build_http_config
from _common import resolve_project_id, handle_not_found_error
from huaweicloudsdkcore.auth.credentials import BasicCredentials
from huaweicloudsdkas.v1 import AsClient, ShowScalingConfigRequest
from huaweicloudsdkas.v1.region.as_region import AsRegion
# 初始化凭据
AK, SK, Region, SecurityToken = load_credentials()
parser = argparse.ArgumentParser(description='查询弹性伸缩配置详情')
parser.add_argument('--scaling_configuration_id', type=str, required=True,
help='伸缩配置ID,可通过 list_scaling_configs.py 获取')
parser.add_argument('--project_id', type=str, default=None,
help='项目ID')
parser.add_argument('--region', type=str,
help='区域,默认从环境变量获取')
def main():
global Region
args = parser.parse_args()
if args.region is not None:
Region = args.region
# 使用 sdk
try:
project_id = resolve_project_id(Region, args.project_id)
credentials = BasicCredentials(AK, SK, project_id)
if SecurityToken:
credentials = credentials.with_security_token(SecurityToken)
http_config = build_http_config()
client = AsClient.new_builder().with_http_config(http_config).with_credentials(credentials).with_region(AsRegion.value_of(Region)).build()
request = ShowScalingConfigRequest()
request.scaling_configuration_id = args.scaling_configuration_id
response = client.show_scaling_config(request)
config = getattr(response, 'scaling_configuration', None)
if not config:
print("未找到伸缩配置")
return
print(f"scaling_configuration_id:\t{getattr(config, 'scaling_configuration_id', '')}")
print(f"scaling_configuration_name:\t{getattr(config, 'scaling_configuration_name', '')}")
print(f"scaling_group_id:\t{getattr(config, 'scaling_group_id', '')}")
print(f"create_time:\t{getattr(config, 'create_time', '')}")
instance_config = getattr(config, 'instance_config', None)
if instance_config:
print(f"\ninstance_config:")
print(f" flavor_ref:\t{getattr(instance_config, 'flavor_ref', '')}")
print(f" image_ref:\t{getattr(instance_config, 'image_ref', '')}")
print(f" key_name:\t{getattr(instance_config, 'key_name', '')}")
print(f" instance_name:\t{getattr(instance_config, 'instance_name', '')}")
print(f" instance_id:\t{getattr(instance_config, 'instance_id', '')}")
print(f" server_group_id:\t{getattr(instance_config, 'server_group_id', '')}")
disks = getattr(instance_config, 'disk', []) or []
if disks:
print(" disks:")
for d in disks:
print(f" size={getattr(d, 'size', 0)}, volume_type={getattr(d, 'volume_type', '')}, disk_type={getattr(d, 'disk_type', '')}")
public_ip = getattr(instance_config, 'public_ip', None)
if public_ip:
print(f" public_ip: eip_id={getattr(public_ip, 'eip_id', '')}, ip_type={getattr(public_ip, 'ip_type', '')}")
security_groups = getattr(instance_config, 'security_groups', []) or []
if security_groups:
print(" security_groups:")
for sg in security_groups:
print(f" id={getattr(sg, 'id', '')}")
except Exception as e:
handle_not_found_error(e, "scalingConfiguration", args.scaling_configuration_id)
if __name__ == '__main__':
main()
import argparse
import sys
import os
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..'))
from config import load_credentials, build_http_config
from _common import resolve_project_id, resolve_vpc_info, resolve_subnet_info, handle_not_found_error
from huaweicloudsdkcore.auth.credentials import BasicCredentials
from huaweicloudsdkas.v1 import AsClient, ShowScalingGroupRequest
from huaweicloudsdkas.v1.region.as_region import AsRegion
# 初始化凭据
AK, SK, Region, SecurityToken = load_credentials()
parser = argparse.ArgumentParser(description='查询弹性伸缩组详情')
parser.add_argument('--scaling_group_id', type=str, required=True,
help='伸缩组ID,可通过 list_scaling_groups.py 获取')
parser.add_argument('--project_id', type=str, default=None,
help='项目ID')
parser.add_argument('--region', type=str,
help='区域,默认从环境变量获取')
def main():
global Region
args = parser.parse_args()
if args.region is not None:
Region = args.region
# 使用 sdk
try:
project_id = resolve_project_id(Region, args.project_id)
credentials = BasicCredentials(AK, SK, project_id)
if SecurityToken:
credentials = credentials.with_security_token(SecurityToken)
http_config = build_http_config()
client = AsClient.new_builder().with_http_config(http_config).with_credentials(credentials).with_region(AsRegion.value_of(Region)).build()
request = ShowScalingGroupRequest()
request.scaling_group_id = args.scaling_group_id
response = client.show_scaling_group(request)
group = getattr(response, 'scaling_group', None)
if not group:
print("未找到伸缩组")
return
print(f"scaling_group_id:\t{getattr(group, 'scaling_group_id', '')}")
print(f"scaling_group_name:\t{getattr(group, 'scaling_group_name', '')}")
print(f"status:\t{getattr(group, 'scaling_group_status', '')}")
print(f"scaling_configuration_id:\t{getattr(group, 'scaling_configuration_id', '')}")
print(f"scaling_configuration_name:\t{getattr(group, 'scaling_configuration_name', '')}")
print(f"current_instance_number:\t{getattr(group, 'current_instance_number', 0)}")
print(f"desire_instance_number:\t{getattr(group, 'desire_instance_number', 0)}")
print(f"min_instance_number:\t{getattr(group, 'min_instance_number', 0)}")
print(f"max_instance_number:\t{getattr(group, 'max_instance_number', 0)}")
print(f"cool_down_time:\t{getattr(group, 'cool_down_time', 0)}")
vpc_id = getattr(group, 'vpc_id', '')
vpc_info = resolve_vpc_info(Region, project_id, [vpc_id]) if vpc_id else {}
vpc_detail = vpc_info.get(vpc_id, {})
print(f"vpc_id:\t{vpc_id}")
if vpc_detail.get("name"):
print(f"vpc_name:\t{vpc_detail['name']}")
print(f"vpc_cidr:\t{vpc_detail['cidr']}")
print(f"health_periodic_audit_method:\t{getattr(group, 'health_periodic_audit_method', '')}")
print(f"health_periodic_audit_time:\t{getattr(group, 'health_periodic_audit_time', 0)}")
print(f"health_periodic_audit_grace_period:\t{getattr(group, 'health_periodic_audit_grace_period', 0)}")
print(f"instance_terminate_policy:\t{getattr(group, 'instance_terminate_policy', '')}")
print(f"delete_publicip:\t{getattr(group, 'delete_publicip', False)}")
print(f"delete_volume:\t{getattr(group, 'delete_volume', False)}")
print(f"enterprise_project_id:\t{getattr(group, 'enterprise_project_id', '')}")
print(f"multi_az_priority_policy:\t{getattr(group, 'multi_az_priority_policy', '')}")
print(f"description:\t{getattr(group, 'detail', '')}")
print(f"create_time:\t{getattr(group, 'create_time', '')}")
print(f"is_scaling:\t{getattr(group, 'is_scaling', False)}")
networks = getattr(group, 'networks', []) or []
if networks:
subnet_ids = [getattr(n, 'id', '') for n in networks]
subnet_info = resolve_subnet_info(Region, project_id, subnet_ids, vpc_id)
print("\nnetworks:")
for n in networks:
nid = getattr(n, 'id', '')
sd = subnet_info.get(nid, {})
print(f" subnet_id={nid}, subnet_name={sd.get('name', '')}, cidr={sd.get('cidr', '')}, gateway_ip={sd.get('gateway_ip', '')}, availability_zone={sd.get('availability_zone', '')}, available_ip_count={sd.get('available_ip_address_count', '')}, ipv6_enable={getattr(n, 'ipv6_enable', False)}")
security_groups = getattr(group, 'security_groups', []) or []
if security_groups:
print("\nsecurity_groups:")
for sg in security_groups:
print(f" security_group_id={getattr(sg, 'id', '')}")
available_zones = getattr(group, 'available_zones', []) or []
if available_zones:
print(f"\navailable_zones:\t{', '.join(available_zones)}")
notifications = getattr(group, 'notifications', []) or []
if notifications:
print(f"\nnotifications:\t{', '.join(notifications)}")
lbaas_listeners = getattr(group, 'lbaas_listeners', []) or []
if lbaas_listeners:
print("\nlbaas_listeners:")
for lb in lbaas_listeners:
print(f" listener_id={getattr(lb, 'listener_id', '')}, pool_id={getattr(lb, 'pool_id', '')}, protocol_port={getattr(lb, 'protocol_port', 0)}")
tags = getattr(group, 'tags', []) or []
if tags:
print("\ntags:")
for t in tags:
print(f" {getattr(t, 'key', '')}={getattr(t, 'value', '')}")
except Exception as e:
handle_not_found_error(e, "scalingGroup", args.scaling_group_id)
if __name__ == '__main__':
main()
import argparse
import sys
import os
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..'))
from config import load_credentials, build_http_config
from _common import resolve_project_id, handle_not_found_error
from huaweicloudsdkcore.auth.credentials import BasicCredentials
from huaweicloudsdkas.v1 import AsClient, ShowScalingPolicyRequest
from huaweicloudsdkas.v1.region.as_region import AsRegion
# 初始化凭据
AK, SK, Region, SecurityToken = load_credentials()
parser = argparse.ArgumentParser(description='查询弹性伸缩策略详情(v1)')
parser.add_argument('--scaling_policy_id', type=str, required=True,
help='伸缩策略ID,可通过 list_scaling_policies.py 获取')
parser.add_argument('--project_id', type=str, default=None,
help='项目ID')
parser.add_argument('--region', type=str,
help='区域,默认从环境变量获取')
def main():
global Region
args = parser.parse_args()
if args.region is not None:
Region = args.region
# 使用 sdk
try:
project_id = resolve_project_id(Region, args.project_id)
credentials = BasicCredentials(AK, SK, project_id)
if SecurityToken:
credentials = credentials.with_security_token(SecurityToken)
http_config = build_http_config()
client = AsClient.new_builder().with_http_config(http_config).with_credentials(credentials).with_region(AsRegion.value_of(Region)).build()
request = ShowScalingPolicyRequest()
request.scaling_policy_id = args.scaling_policy_id
response = client.show_scaling_policy(request)
policy = getattr(response, 'scaling_policy', None)
if not policy:
print("未找到伸缩策略")
return
print(f"scaling_policy_id:\t{getattr(policy, 'scaling_policy_id', '')}")
print(f"scaling_policy_name:\t{getattr(policy, 'scaling_policy_name', '')}")
print(f"scaling_group_id:\t{getattr(policy, 'scaling_group_id', '')}")
print(f"policy_status:\t{getattr(policy, 'policy_status', '')}")
print(f"scaling_policy_type:\t{getattr(policy, 'scaling_policy_type', '')}")
print(f"alarm_id:\t{getattr(policy, 'alarm_id', '')}")
print(f"cool_down_time:\t{getattr(policy, 'cool_down_time', 0)}")
print(f"create_time:\t{getattr(policy, 'create_time', '')}")
action = getattr(policy, 'scaling_policy_action', None)
if action:
print(f"\nscaling_policy_action:")
print(f" operation:\t{getattr(action, 'operation', '')}")
print(f" instance_number:\t{getattr(action, 'instance_number', 0)}")
print(f" instance_percentage:\t{getattr(action, 'instance_percentage', 0)}")
scheduled = getattr(policy, 'scheduled_policy', None)
if scheduled:
print(f"\nscheduled_policy:")
print(f" launch_time:\t{getattr(scheduled, 'launch_time', '')}")
print(f" recurrence_type:\t{getattr(scheduled, 'recurrence_type', '')}")
print(f" recurrence_value:\t{getattr(scheduled, 'recurrence_value', '')}")
print(f" start_time:\t{getattr(scheduled, 'start_time', '')}")
print(f" end_time:\t{getattr(scheduled, 'end_time', '')}")
except Exception as e:
handle_not_found_error(e, "scalingPolicy", args.scaling_policy_id)
if __name__ == '__main__':
main()
import argparse
import sys
import os
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..'))
from config import load_credentials, build_http_config
from _common import resolve_project_id, handle_not_found_error
from huaweicloudsdkcore.auth.credentials import BasicCredentials
from huaweicloudsdkas.v1 import AsClient, ShowScalingV2PolicyRequest
from huaweicloudsdkas.v1.region.as_region import AsRegion
# 初始化凭据
AK, SK, Region, SecurityToken = load_credentials()
parser = argparse.ArgumentParser(description='查询弹性伸缩策略详情(v2)')
parser.add_argument('--scaling_policy_id', type=str, required=True,
help='伸缩策略ID,可通过 list_scaling_v2_policies.py 获取')
parser.add_argument('--project_id', type=str, default=None,
help='项目ID')
parser.add_argument('--region', type=str,
help='区域,默认从环境变量获取')
def main():
global Region
args = parser.parse_args()
if args.region is not None:
Region = args.region
# 使用 sdk
try:
project_id = resolve_project_id(Region, args.project_id)
credentials = BasicCredentials(AK, SK, project_id)
if SecurityToken:
credentials = credentials.with_security_token(SecurityToken)
http_config = build_http_config()
client = AsClient.new_builder().with_http_config(http_config).with_credentials(credentials).with_region(AsRegion.value_of(Region)).build()
request = ShowScalingV2PolicyRequest()
request.scaling_policy_id = args.scaling_policy_id
response = client.show_scaling_v2_policy(request)
policy = getattr(response, 'scaling_policy', None)
if not policy:
print("未找到伸缩策略")
return
print(f"scaling_policy_id:\t{getattr(policy, 'scaling_policy_id', '')}")
print(f"scaling_policy_name:\t{getattr(policy, 'scaling_policy_name', '')}")
print(f"scaling_resource_id:\t{getattr(policy, 'scaling_resource_id', '')}")
print(f"scaling_resource_type:\t{getattr(policy, 'scaling_resource_type', '')}")
print(f"policy_status:\t{getattr(policy, 'policy_status', '')}")
print(f"scaling_policy_type:\t{getattr(policy, 'scaling_policy_type', '')}")
print(f"alarm_id:\t{getattr(policy, 'alarm_id', '')}")
print(f"cool_down_time:\t{getattr(policy, 'cool_down_time', 0)}")
print(f"create_time:\t{getattr(policy, 'create_time', '')}")
print(f"description:\t{getattr(policy, 'description', '')}")
action = getattr(policy, 'scaling_policy_action', None)
if action:
print(f"\nscaling_policy_action:")
print(f" operation:\t{getattr(action, 'operation', '')}")
print(f" size:\t{getattr(action, 'size', 0)}")
print(f" percentage:\t{getattr(action, 'percentage', 0)}")
print(f" limits:\t{getattr(action, 'limits', 0)}")
scheduled = getattr(policy, 'scheduled_policy', None)
if scheduled:
print(f"\nscheduled_policy:")
print(f" launch_time:\t{getattr(scheduled, 'launch_time', '')}")
print(f" recurrence_type:\t{getattr(scheduled, 'recurrence_type', '')}")
print(f" recurrence_value:\t{getattr(scheduled, 'recurrence_value', '')}")
print(f" start_time:\t{getattr(scheduled, 'start_time', '')}")
print(f" end_time:\t{getattr(scheduled, 'end_time', '')}")
interval_actions = getattr(policy, 'interval_alarm_actions', []) or []
if interval_actions:
print(f"\ninterval_alarm_actions:")
for ia in interval_actions:
print(f" operation={getattr(ia, 'operation', '')}, size={getattr(ia, 'size', 0)}, lower_bound={getattr(ia, 'lower_bound', 0)}, upper_bound={getattr(ia, 'upper_bound', 0)}")
meta = getattr(policy, 'meta_data', None)
if meta:
print(f"\nmeta_data:")
print(f" metadata_bandwidth_share_type:\t{getattr(meta, 'metadata_bandwidth_share_type', '')}")
print(f" metadata_eip_id:\t{getattr(meta, 'metadata_eip_id', '')}")
print(f" metadata_eip_address:\t{getattr(meta, 'metadata_eip_address', '')}")
except Exception as e:
handle_not_found_error(e, "scalingPolicy", args.scaling_policy_id)
if __name__ == '__main__':
main()
import argparse
import sys
import os
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..'))
from config import load_credentials, build_http_config
from _common import resolve_project_id, handle_not_found_error
from huaweicloudsdkcore.auth.credentials import BasicCredentials
from huaweicloudsdkas.v1 import AsClient, ShowWarmPoolNewRequest
from huaweicloudsdkas.v1.region.as_region import AsRegion
# 初始化凭据
AK, SK, Region, SecurityToken = load_credentials()
parser = argparse.ArgumentParser(description='查询暖池信息(新)')
parser.add_argument('--scaling_group_id', type=str, required=True,
help='伸缩组ID,可通过 list_scaling_groups.py 获取')
parser.add_argument('--project_id', type=str, default=None,
help='项目ID')
parser.add_argument('--region', type=str,
help='区域,默认从环境变量获取')
def main():
global Region
args = parser.parse_args()
if args.region is not None:
Region = args.region
# 使用 sdk
try:
project_id = resolve_project_id(Region, args.project_id)
credentials = BasicCredentials(AK, SK, project_id)
if SecurityToken:
credentials = credentials.with_security_token(SecurityToken)
http_config = build_http_config()
client = AsClient.new_builder().with_http_config(http_config).with_credentials(credentials).with_region(AsRegion.value_of(Region)).build()
request = ShowWarmPoolNewRequest()
request.scaling_group_id = args.scaling_group_id
response = client.show_warm_pool_new(request)
pool = getattr(response, 'warm_pool', None)
if not pool:
print("未找到暖池信息")
return
print(f"min_capacity:\t{getattr(pool, 'min_capacity', 0)}")
print(f"max_capacity:\t{getattr(pool, 'max_capacity', 0)}")
print(f"instance_init_wait_time:\t{getattr(pool, 'instance_init_wait_time', 0)}")
print(f"status:\t{getattr(pool, 'status', '')}")
except Exception as e:
handle_not_found_error(e, "warmPool", args.scaling_group_id)
if __name__ == '__main__':
main()
import argparse
import sys
import os
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..'))
from config import load_credentials, build_http_config
from _common import resolve_project_id, handle_not_found_error
from huaweicloudsdkcore.auth.credentials import BasicCredentials
from huaweicloudsdkas.v1 import AsClient, ShowWarmPoolRequest
from huaweicloudsdkas.v1.region.as_region import AsRegion
# 初始化凭据
AK, SK, Region, SecurityToken = load_credentials()
parser = argparse.ArgumentParser(description='查询暖池信息')
parser.add_argument('--scaling_group_id', type=str, required=True,
help='伸缩组ID,可通过 list_scaling_groups.py 获取')
parser.add_argument('--project_id', type=str, default=None,
help='项目ID')
parser.add_argument('--region', type=str,
help='区域,默认从环境变量获取')
def main():
global Region
args = parser.parse_args()
if args.region is not None:
Region = args.region
# 使用 sdk
try:
project_id = resolve_project_id(Region, args.project_id)
credentials = BasicCredentials(AK, SK, project_id)
if SecurityToken:
credentials = credentials.with_security_token(SecurityToken)
http_config = build_http_config()
client = AsClient.new_builder().with_http_config(http_config).with_credentials(credentials).with_region(AsRegion.value_of(Region)).build()
request = ShowWarmPoolRequest()
request.scaling_group_id = args.scaling_group_id
response = client.show_warm_pool(request)
pool = getattr(response, 'warm_pool', None)
if not pool:
print("未找到暖池信息")
return
print(f"min_capacity:\t{getattr(pool, 'min_capacity', 0)}")
print(f"max_capacity:\t{getattr(pool, 'max_capacity', 0)}")
print(f"instance_init_wait_time:\t{getattr(pool, 'instance_init_wait_time', 0)}")
print(f"status:\t{getattr(pool, 'status', '')}")
except Exception as e:
handle_not_found_error(e, "warmPool", args.scaling_group_id)
if __name__ == '__main__':
main()
import argparse
import sys
import os
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..'))
from config import load_credentials, build_http_config
from huaweicloudsdkcore.auth.credentials import BasicCredentials
from huaweicloudsdkbms.v1 import BmsClient
from huaweicloudsdkbms.v1.model import ShowBaremetalServerTagsRequest
from huaweicloudsdkbms.v1.region.bms_region import BmsRegion
# 初始化凭据
AK, SK, Region, SecurityToken = load_credentials()
# 参数
parser = argparse.ArgumentParser(description="查询裸金属服务器标签")
parser.add_argument("--project_id", type=str, required=True, help="项目 ID,可通过 ../iam/get_project_id.py 获取")
parser.add_argument("--region", type=str, help="区域,默认 cn-north-4")
parser.add_argument("--server_id", type=str, required=True, help="裸金属服务器ID,可通过 list_bare_metal_servers.py 获取")
args = parser.parse_args()
if args.region is not None:
Region = args.region
# 使用 sdk
try:
http_config = build_http_config()
client = BmsClient.new_builder().with_http_config(http_config).with_credentials(
BasicCredentials(AK, SK, args.project_id) if not SecurityToken else BasicCredentials(AK, SK, args.project_id).with_security_token(SecurityToken)
).with_region(BmsRegion.value_of(Region)).build()
if not client:
print("无法获取 BMS 客户端")
exit(-1)
# 构建请求
request = ShowBaremetalServerTagsRequest()
request.server_id = args.server_id
response = client.show_baremetal_server_tags(request)
tags = response.tags
if not tags:
print(f"没有找到标签 (区域: {Region}, 服务器ID: {args.server_id})")
exit(0)
# 渲染
output = f"key\tvalue\n"
for tag in tags:
key = getattr(tag, 'key', '')
value = getattr(tag, 'value', '')
output += f"{key}\t{value}\n"
print(output)
except Exception as e:
print(f"bms.show_baremetal_server_tags 查询失败: {e}")
exit(1)