Skip to main content

instance_describe/
instance_describe.rs

1use tencent_cloud_sdk::{
2    TencentCloudClient,
3    services::cvm::instance_query::{InstanceQueryService, DescribeInstancesRequest, DescribeInstancesResponse},
4    services::cvm::instance::Filter
5};
6use std::env;
7
8#[tokio::main]
9async fn main() -> Result<(), Box<dyn std::error::Error>> {
10    // 从环境变量读取密钥
11    let secret_id = env::var("TENCENTCLOUD_SECRET_ID")
12        .expect("请设置环境变量TENCENTCLOUD_SECRET_ID");
13    let secret_key = env::var("TENCENTCLOUD_SECRET_KEY")
14        .expect("请设置环境变量TENCENTCLOUD_SECRET_KEY");
15
16    // 创建客户端
17    let client = TencentCloudClient::new(secret_id, secret_key);
18    
19    // 创建实例查询服务
20    let instance_query_service = InstanceQueryService::new(&client);
21    
22    // 设置区域
23    let region = "ap-guangzhou";
24    
25    // 获取命令行参数
26    let args: Vec<String> = env::args().collect();
27    
28    if args.len() > 1 {
29        match args[1].as_str() {
30            // 按ID查询实例
31            "id" => {
32                if args.len() < 3 {
33                    println!("缺少实例ID参数,用法: cargo run --example instance_describe id <实例ID>");
34                    return Ok(());
35                }
36                
37                let instance_ids = args[2..].to_vec();
38                println!("正在查询以下实例ID: {:?}", instance_ids);
39                
40                let request = DescribeInstancesRequest {
41                    InstanceIds: Some(instance_ids),
42                    Filters: None,
43                    Offset: None,
44                    Limit: None,
45                };
46                
47                let response = instance_query_service.describe_instances(&request, region).await?;
48                display_instances(&response.Response);
49            },
50            
51            // 按可用区查询实例
52            "zone" => {
53                if args.len() < 3 {
54                    println!("缺少可用区参数,用法: cargo run --example instance_describe zone <可用区>");
55                    return Ok(());
56                }
57                
58                let zone = args[2].clone();
59                println!("正在查询可用区 {} 的实例", zone);
60                
61                let mut filters = Vec::new();
62                filters.push(Filter {
63                    Name: "zone".to_string(),
64                    Values: vec![zone],
65                });
66                
67                let request = DescribeInstancesRequest {
68                    InstanceIds: None,
69                    Filters: Some(filters),
70                    Offset: None,
71                    Limit: Some(20),
72                };
73                
74                let response = instance_query_service.describe_instances(&request, region).await?;
75                display_instances(&response.Response);
76            },
77            
78            // 按实例名称查询实例
79            "name" => {
80                if args.len() < 3 {
81                    println!("缺少实例名称参数,用法: cargo run --example instance_describe name <实例名称>");
82                    return Ok(());
83                }
84                
85                let name = args[2].clone();
86                println!("正在查询名称为 {} 的实例", name);
87                
88                let mut filters = Vec::new();
89                filters.push(Filter {
90                    Name: "instance-name".to_string(),
91                    Values: vec![name],
92                });
93                
94                let request = DescribeInstancesRequest {
95                    InstanceIds: None,
96                    Filters: Some(filters),
97                    Offset: None,
98                    Limit: Some(20),
99                };
100                
101                let response = instance_query_service.describe_instances(&request, region).await?;
102                display_instances(&response.Response);
103            },
104            
105            // 按标签查询实例
106            "tag" => {
107                if args.len() < 4 {
108                    println!("缺少标签参数,用法: cargo run --example instance_describe tag <标签键> <标签值>");
109                    return Ok(());
110                }
111                
112                let tag_key = args[2].clone();
113                let tag_value = args[3].clone();
114                println!("正在查询标签键值对为 {}:{} 的实例", tag_key, tag_value);
115                
116                let mut filters = Vec::new();
117                filters.push(Filter {
118                    Name: format!("tag:{}", tag_key),
119                    Values: vec![tag_value],
120                });
121                
122                let request = DescribeInstancesRequest {
123                    InstanceIds: None,
124                    Filters: Some(filters),
125                    Offset: None,
126                    Limit: Some(20),
127                };
128                
129                let response = instance_query_service.describe_instances(&request, region).await?;
130                display_instances(&response.Response);
131            },
132            
133            // 查询所有实例
134            "all" => {
135                println!("正在查询所有实例");
136                
137                let request = DescribeInstancesRequest {
138                    InstanceIds: None,
139                    Filters: None,
140                    Offset: None,
141                    Limit: Some(20),
142                };
143                
144                let response = instance_query_service.describe_instances(&request, region).await?;
145                display_instances(&response.Response);
146            },
147            
148            // 按状态查询实例
149            "state" => {
150                if args.len() < 3 {
151                    println!("缺少实例状态参数,用法: cargo run --example instance_describe state <状态>");
152                    println!("支持的状态: PENDING, RUNNING, STOPPED, STOPPING, REBOOTING, STARTING, SHUTDOWN, TERMINATING");
153                    return Ok(());
154                }
155                
156                let state = args[2].clone();
157                println!("正在查询状态为 {} 的实例", state);
158                
159                let mut filters = Vec::new();
160                filters.push(Filter {
161                    Name: "instance-state".to_string(),
162                    Values: vec![state],
163                });
164                
165                let request = DescribeInstancesRequest {
166                    InstanceIds: None,
167                    Filters: Some(filters),
168                    Offset: None,
169                    Limit: Some(20),
170                };
171                
172                let response = instance_query_service.describe_instances(&request, region).await?;
173                display_instances(&response.Response);
174            },
175            
176            _ => {
177                print_usage();
178            }
179        }
180    } else {
181        print_usage();
182    }
183    
184    Ok(())
185}
186
187// 格式化显示实例信息
188fn display_instances(response: &DescribeInstancesResponse) {
189    println!("找到 {} 个符合条件的实例:", response.TotalCount);
190    println!("{:<20} {:<15} {:<15} {:<15} {:<15}", "实例ID", "实例名称", "状态", "实例类型", "可用区");
191    println!("{}", "-".repeat(80));
192    
193    for instance in &response.InstanceSet {
194        let n_a = String::from("N/A");
195        let zone_value = instance.Placement.Zone.as_ref().unwrap_or(&n_a);
196        println!("{:<20} {:<15} {:<15} {:<15} {:<15}", 
197            instance.InstanceId, 
198            instance.InstanceName, 
199            instance.InstanceState, 
200            instance.InstanceType, 
201            zone_value
202        );
203    }
204    
205    if response.TotalCount > 0 && !response.InstanceSet.is_empty() {
206        println!("\n详细信息示例 (第一个实例):");
207        let instance = &response.InstanceSet[0];
208        println!("ID: {}", instance.InstanceId);
209        println!("名称: {}", instance.InstanceName);
210        println!("状态: {}", instance.InstanceState);
211        println!("创建时间: {}", instance.CreatedTime);
212        println!("操作系统: {}", instance.OsName);
213        println!("CPU: {} 核", instance.CPU);
214        println!("内存: {} GB", instance.Memory);
215        
216        if let Some(ips) = &instance.PrivateIpAddresses {
217            println!("内网IP: {:?}", ips);
218        }
219        
220        if let Some(ips) = &instance.PublicIpAddresses {
221            if !ips.is_empty() {
222                println!("公网IP: {:?}", ips);
223            }
224        }
225        
226        // 显示VPC信息(如果有)
227        if let Some(vpc) = &instance.VirtualPrivateCloud {
228            println!("VPC ID: {}", vpc.VpcId);
229            println!("子网ID: {}", vpc.SubnetId);
230        }
231    }
232}
233
234// 打印使用说明
235fn print_usage() {
236    println!("用法:");
237    println!("  cargo run --example instance_describe [选项] [参数...]");
238    println!();
239    println!("选项:");
240    println!("  id <实例ID...>               按实例ID查询");
241    println!("  zone <可用区>                按可用区查询");
242    println!("  name <实例名称>              按实例名称查询");
243    println!("  tag <标签键> <标签值>        按标签查询");
244    println!("  state <状态>                 按实例状态查询");
245    println!("  all                          查询所有实例");
246    println!();
247    println!("示例:");
248    println!("  cargo run --example instance_describe id ins-xxxxxxxx");
249    println!("  cargo run --example instance_describe zone ap-guangzhou-4");
250    println!("  cargo run --example instance_describe name my-instance");
251    println!("  cargo run --example instance_describe tag project test");
252    println!("  cargo run --example instance_describe state RUNNING");
253    println!("  cargo run --example instance_describe all");
254}