instance_describe/
instance_describe.rs

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