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 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 let client = TencentCloudClient::new(secret_id, secret_key);
18
19 let instance_query_service = InstanceQueryService::new(&client);
21
22 let region = "ap-guangzhou";
24
25 let args: Vec<String> = env::args().collect();
27
28 if args.len() > 1 {
29 match args[1].as_str() {
30 "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 "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 "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 "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 "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 "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
187fn 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 if let Some(vpc) = &instance.VirtualPrivateCloud {
228 println!("VPC ID: {}", vpc.VpcId);
229 println!("子网ID: {}", vpc.SubnetId);
230 }
231 }
232}
233
234fn 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}