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 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 let client = TencentCloudClient::new(secret_id, secret_key);
17
18 let instance_service = InstanceService::new(&client);
20
21 let region = "ap-guangzhou";
23
24 let args: Vec<String> = env::args().collect();
26
27 if args.len() > 1 {
28 match args[1].as_str() {
29 "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 "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 "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 "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 "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 "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
186fn 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
242fn 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}