1use serde::{Deserialize, Serialize};
6
7use crate::client::TencentCloudClient;
8use crate::error::Result;
9
10#[derive(Debug, Clone, Serialize, Deserialize)]
12#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
13pub enum InstanceChargeType {
14 Prepaid,
16 PostpaidByHour,
18 Cdhpaid,
20 Spotpaid,
22 Cdcpaid,
24}
25
26#[derive(Debug, Clone, Serialize, Deserialize)]
28pub struct InstanceChargePrepaid {
29 pub Period: i32,
31
32 #[serde(skip_serializing_if = "Option::is_none")]
39 pub RenewFlag: Option<String>,
40}
41
42#[derive(Debug, Clone, Serialize, Deserialize)]
44pub struct Placement {
45 #[serde(skip_serializing_if = "Option::is_none")]
47 pub Zone: Option<String>,
48
49 #[serde(skip_serializing_if = "Option::is_none")]
52 pub ProjectId: Option<i32>,
53
54 #[serde(skip_serializing_if = "Option::is_none")]
56 pub HostIds: Option<Vec<String>>,
57
58 #[serde(skip_serializing_if = "Option::is_none")]
65 pub HostIps: Option<Vec<String>>,
66
67 #[serde(skip_serializing_if = "Option::is_none")]
69 pub DedicatedClusterId: Option<String>,
70}
71
72#[derive(Debug, Clone, Serialize, Deserialize)]
74pub struct SystemDisk {
75 #[serde(skip_serializing_if = "Option::is_none")]
84 pub DiskType: Option<String>,
85
86 #[serde(skip_serializing_if = "Option::is_none")]
89 pub DiskId: Option<String>,
90
91 #[serde(skip_serializing_if = "Option::is_none")]
95 pub DiskSize: Option<i32>,
96}
97
98#[derive(Debug, Clone, Serialize, Deserialize)]
100pub struct DataDisk {
101 pub DiskType: String,
116
117 #[serde(skip_serializing_if = "Option::is_none")]
121 pub DiskId: Option<String>,
122
123 pub DiskSize: i32,
125
126 #[serde(skip_serializing_if = "Option::is_none")]
136 pub DeleteWithInstance: Option<bool>,
137}
138
139#[derive(Debug, Clone, Serialize, Deserialize)]
141pub struct VirtualPrivateCloud {
142 pub VpcId: String,
145
146 pub SubnetId: String,
148
149 #[serde(skip_serializing_if = "Option::is_none")]
155 pub AsVpcGateway: Option<bool>,
156
157 #[serde(skip_serializing_if = "Option::is_none")]
160 pub PrivateIpAddresses: Option<Vec<String>>,
161}
162
163#[derive(Debug, Clone, Serialize, Deserialize)]
165pub struct InternetAccessible {
166 pub InternetChargeType: String,
174
175 pub InternetMaxBandwidthOut: i32,
177
178 #[serde(skip_serializing_if = "Option::is_none")]
186 pub PublicIpAssigned: Option<bool>,
187
188 #[serde(skip_serializing_if = "Option::is_none")]
190 pub BandwidthPackageId: Option<String>,
191}
192
193#[derive(Debug, Clone, Serialize, Deserialize)]
195pub struct LoginSettings {
196 #[serde(skip_serializing_if = "Option::is_none")]
204 pub Password: Option<String>,
205
206 #[serde(skip_serializing_if = "Option::is_none")]
212 pub KeyIds: Option<Vec<String>>,
213
214 #[serde(skip_serializing_if = "Option::is_none")]
224 pub KeepImageLogin: Option<bool>,
225}
226
227#[derive(Debug, Clone, Serialize, Deserialize)]
229pub struct EnhancedService {
230 #[serde(skip_serializing_if = "Option::is_none")]
232 pub SecurityService: Option<RunSecurityServiceEnabled>,
233
234 #[serde(skip_serializing_if = "Option::is_none")]
236 pub MonitorService: Option<RunMonitorServiceEnabled>,
237
238 #[serde(skip_serializing_if = "Option::is_none")]
240 pub AutomationService: Option<RunAutomationServiceEnabled>,
241}
242
243#[derive(Debug, Clone, Serialize, Deserialize)]
245pub struct RunMonitorServiceEnabled {
246 pub Enabled: bool,
252}
253
254#[derive(Debug, Clone, Serialize, Deserialize)]
256pub struct RunSecurityServiceEnabled {
257 pub Enabled: bool,
263}
264
265#[derive(Debug, Clone, Serialize, Deserialize)]
267pub struct RunAutomationServiceEnabled {
268 pub Enabled: bool,
274}
275
276#[derive(Debug, Clone, Serialize, Deserialize)]
278pub struct TagSpecification {
279 pub ResourceType: String,
281
282 pub Tags: Vec<Tag>,
284}
285
286#[derive(Debug, Clone, Serialize, Deserialize)]
288pub struct Tag {
289 pub Key: String,
291
292 pub Value: String,
294}
295
296#[derive(Debug, Clone, Serialize, Deserialize)]
298pub struct ActionTimer {
299 pub TimerAction: String,
302
303 pub ActionTime: String,
305}
306
307#[derive(Debug, Clone, Serialize, Deserialize)]
309pub struct CpuTopology {
310 pub ThreadsPerCore: i32,
312
313 pub CoreCount: i32,
315}
316
317#[derive(Debug, Clone, Serialize, Deserialize)]
319pub struct InstanceMarketOptionsRequest {
320 pub SpotOptions: SpotMarketOptions,
322
323 pub MarketType: String,
325}
326
327#[derive(Debug, Clone, Serialize, Deserialize)]
329pub struct SpotMarketOptions {
330 #[serde(skip_serializing_if = "Option::is_none")]
332 pub MaxPrice: Option<String>,
333
334 #[serde(skip_serializing_if = "Option::is_none")]
339 pub SpotInstanceType: Option<String>,
340
341 #[serde(skip_serializing_if = "Option::is_none")]
344 pub SpotDurationHours: Option<i32>,
345}
346
347#[derive(Debug, Clone, Serialize, Deserialize)]
349pub struct LaunchTemplate {
350 #[serde(skip_serializing_if = "Option::is_none")]
352 pub LaunchTemplateId: Option<String>,
353
354 #[serde(skip_serializing_if = "Option::is_none")]
356 pub LaunchTemplateVersion: Option<String>,
357}
358
359#[derive(Debug, Clone, Serialize)]
361pub struct RunInstancesRequest {
362 #[serde(skip_serializing_if = "Option::is_none")]
364 pub Placement: Option<Placement>,
365
366 #[serde(skip_serializing_if = "Option::is_none")]
372 pub ImageId: Option<String>,
373
374 #[serde(skip_serializing_if = "Option::is_none")]
376 pub InstanceChargeType: Option<InstanceChargeType>,
377
378 #[serde(skip_serializing_if = "Option::is_none")]
381 pub InstanceChargePrepaid: Option<InstanceChargePrepaid>,
382
383 #[serde(skip_serializing_if = "Option::is_none")]
385 pub InstanceType: Option<String>,
386
387 #[serde(skip_serializing_if = "Option::is_none")]
389 pub SystemDisk: Option<SystemDisk>,
390
391 #[serde(skip_serializing_if = "Option::is_none")]
393 pub DataDisks: Option<Vec<DataDisk>>,
394
395 #[serde(skip_serializing_if = "Option::is_none")]
397 pub VirtualPrivateCloud: Option<VirtualPrivateCloud>,
398
399 #[serde(skip_serializing_if = "Option::is_none")]
401 pub InternetAccessible: Option<InternetAccessible>,
402
403 #[serde(skip_serializing_if = "Option::is_none")]
405 pub InstanceCount: Option<i32>,
406
407 #[serde(skip_serializing_if = "Option::is_none")]
409 pub InstanceName: Option<String>,
410
411 #[serde(skip_serializing_if = "Option::is_none")]
413 pub LoginSettings: Option<LoginSettings>,
414
415 #[serde(skip_serializing_if = "Option::is_none")]
417 pub SecurityGroupIds: Option<Vec<String>>,
418
419 #[serde(skip_serializing_if = "Option::is_none")]
421 pub EnhancedService: Option<EnhancedService>,
422
423 #[serde(skip_serializing_if = "Option::is_none")]
425 pub ClientToken: Option<String>,
426
427 #[serde(skip_serializing_if = "Option::is_none")]
429 pub HostName: Option<String>,
430
431 #[serde(skip_serializing_if = "Option::is_none")]
433 pub TagSpecification: Option<Vec<TagSpecification>>,
434
435 #[serde(skip_serializing_if = "Option::is_none")]
437 pub ProjectId: Option<i32>,
438
439 #[serde(skip_serializing_if = "Option::is_none")]
444 pub UserData: Option<String>,
445
446 #[serde(skip_serializing_if = "Option::is_none")]
448 pub ActionTimer: Option<ActionTimer>,
449
450 #[serde(skip_serializing_if = "Option::is_none")]
452 pub DisasterRecoverGroupIds: Option<Vec<String>>,
453
454 #[serde(skip_serializing_if = "Option::is_none")]
456 pub InstanceMarketOptions: Option<InstanceMarketOptionsRequest>,
457
458 #[serde(skip_serializing_if = "Option::is_none")]
464 pub DryRun: Option<bool>,
465
466 #[serde(skip_serializing_if = "Option::is_none")]
468 pub CpuTopology: Option<CpuTopology>,
469
470 #[serde(skip_serializing_if = "Option::is_none")]
472 pub CamRoleName: Option<String>,
473
474 #[serde(skip_serializing_if = "Option::is_none")]
476 pub HpcClusterId: Option<String>,
477
478 #[serde(skip_serializing_if = "Option::is_none")]
480 pub LaunchTemplate: Option<LaunchTemplate>,
481
482 #[serde(skip_serializing_if = "Option::is_none")]
484 pub DedicatedClusterId: Option<String>,
485
486 #[serde(skip_serializing_if = "Option::is_none")]
488 pub ChcIds: Option<Vec<String>>,
489
490 #[serde(skip_serializing_if = "Option::is_none")]
495 pub DisableApiTermination: Option<bool>,
496}
497
498#[derive(Debug, Deserialize)]
500pub struct RunInstancesResponse {
501 pub InstanceIdSet: Vec<String>,
503
504 pub RequestId: String,
506}
507
508#[derive(Debug, Deserialize)]
510pub struct ApiResponse<T> {
511 pub Response: T,
513}
514
515pub type RunInstancesResponseType = ApiResponse<RunInstancesResponse>;
517
518#[derive(Debug, Clone, Serialize, Deserialize)]
520pub struct Filter {
521 pub Name: String,
523
524 pub Values: Vec<String>,
526}
527
528pub struct InstanceService<'a> {
530 client: &'a TencentCloudClient,
531}
532
533impl<'a> InstanceService<'a> {
534 pub fn new(client: &'a TencentCloudClient) -> Self {
536 Self { client }
537 }
538
539 pub async fn run_instances(&self, request: &RunInstancesRequest, region: &str) -> Result<RunInstancesResponseType> {
543 self.client.request(
545 "RunInstances",
546 request,
547 "cvm",
548 "2017-03-12",
549 Some(region)
550 ).await
551 }
552}
553
554#[derive(Debug, Clone, Deserialize)]
556pub struct Instance {
557 pub InstanceId: String,
559
560 pub InstanceName: String,
562
563 pub InstanceType: String,
565
566 pub InstanceChargeType: String,
572
573 pub InstanceState: String,
584
585 pub CPU: i32,
587
588 pub Memory: i32,
590
591 pub CreatedTime: String,
593
594 #[serde(skip_serializing_if = "Option::is_none")]
596 pub ExpiredTime: Option<String>,
597
598 pub OsName: String,
600
601 #[serde(skip_serializing_if = "Option::is_none")]
603 pub SecurityGroupIds: Option<Vec<String>>,
604
605 #[serde(skip_serializing_if = "Option::is_none")]
607 pub LoginSettings: Option<LoginSettings>,
608
609 #[serde(skip_serializing_if = "Option::is_none")]
611 pub PublicIpAddresses: Option<Vec<String>>,
612
613 #[serde(skip_serializing_if = "Option::is_none")]
615 pub PrivateIpAddresses: Option<Vec<String>>,
616
617 pub Placement: Placement,
619
620 #[serde(skip_serializing_if = "Option::is_none")]
622 pub SystemDisk: Option<SystemDisk>,
623
624 #[serde(skip_serializing_if = "Option::is_none")]
626 pub DataDisks: Option<Vec<DataDisk>>,
627
628 #[serde(skip_serializing_if = "Option::is_none")]
630 pub VirtualPrivateCloud: Option<VirtualPrivateCloud>,
631
632 #[serde(skip_serializing_if = "Option::is_none")]
634 pub InternetAccessible: Option<InternetAccessible>,
635}