package awsserversdk import ( "context" "encoding/json" "errors" "time" ) type Page[T any] struct { Items []T `json:"items"` Total int `json:"total"` Limit int `json:"limit"` Offset int `json:"offset"` } type ListOptions struct { Query string CategoryID string Limit int Offset int } type Region struct { ID string `json:"id"` NameEN string `json:"name_en"` NameZH string `json:"name_zh"` PlacementCount int `json:"placement_count"` Ready bool `json:"ready"` } type Placement struct { ID string `json:"id"` PlacementID string `json:"placement_id"` Name string `json:"name"` Region string `json:"region"` AvailabilityZone string `json:"availability_zone"` CIDR string `json:"cidr"` MapPublicIPOnLaunch bool `json:"map_public_ip_on_launch"` SortOrder int `json:"sort_order"` Enabled bool `json:"enabled"` } type Category struct { ID string `json:"id"` Name string `json:"name"` Description string `json:"description,omitempty"` SortOrder int `json:"sort_order"` Enabled bool `json:"enabled"` } type Image struct { CatalogID string `json:"catalog_id"` Region string `json:"region"` CategoryID string `json:"category_id"` ImageID string `json:"image_id"` SourceScope string `json:"source_scope"` SourceName string `json:"source_name"` DisplayName string `json:"display_name"` DisplayIntro string `json:"display_intro"` AvailabilityStatus string `json:"availability_status"` Description string `json:"description,omitempty"` Architecture string `json:"architecture"` Platform string `json:"platform,omitempty"` PlatformDetails string `json:"platform_details,omitempty"` OSFamily string `json:"os_family,omitempty"` RecommendedUser string `json:"recommended_user,omitempty"` CreationDate string `json:"creation_date,omitempty"` DeprecationTime string `json:"deprecation_time,omitempty"` OwnerID string `json:"owner_id,omitempty"` OwnerAlias string `json:"owner_alias,omitempty"` RootDeviceType string `json:"root_device_type,omitempty"` RootDeviceName string `json:"root_device_name,omitempty"` RootSnapshotID string `json:"root_snapshot_id,omitempty"` RootVolumeSizeGiB int32 `json:"root_volume_size_gib,omitempty"` RootVolumeType string `json:"root_volume_type,omitempty"` VirtualizationType string `json:"virtualization_type,omitempty"` Hypervisor string `json:"hypervisor,omitempty"` BootMode string `json:"boot_mode,omitempty"` IMDSSupport string `json:"imds_support,omitempty"` UsageOperation string `json:"usage_operation,omitempty"` ENASupport bool `json:"ena_support"` Public bool `json:"public"` ProductCodes []string `json:"product_codes,omitempty"` Metadata map[string]any `json:"metadata"` } type GPUDeviceInfo struct { Manufacturer string `json:"manufacturer,omitempty"` Name string `json:"name,omitempty"` Count int32 `json:"count"` LogicalCount int32 `json:"logical_count,omitempty"` PartitionSize float64 `json:"partition_size,omitempty"` MemoryMiB int32 `json:"memory_mib,omitempty"` SupportedWorkloads []string `json:"supported_workloads,omitempty"` } type InstanceType struct { ID string `json:"id"` Region string `json:"region"` CategoryID string `json:"category_id"` InstanceType string `json:"instance_type"` DisplayName string `json:"display_name"` Description string `json:"description"` VCPUs int32 `json:"vcpus"` MemoryMiB int64 `json:"memory_mib"` Architectures []string `json:"architectures"` NetworkPerformance string `json:"network_performance"` NetworkBaselineGbps float64 `json:"network_baseline_gbps"` NetworkPeakGbps float64 `json:"network_peak_gbps"` GPUCount float64 `json:"gpu_count"` GPUMemoryMiB int64 `json:"gpu_memory_mib"` GPUs []GPUDeviceInfo `json:"gpus"` CurrentGeneration bool `json:"current_generation"` BurstablePerformance bool `json:"burstable_performance"` FreeTierEligible bool `json:"free_tier_eligible"` OSPrices map[string]float64 `json:"os_prices"` HourlyRate float64 `json:"hourly_rate"` Currency string `json:"currency"` PriceMode string `json:"price_mode"` PriceValue float64 `json:"price_value"` } type CreateOptions struct { Region string `json:"region"` ImageCategories []Category `json:"image_categories"` Images []Image `json:"images"` InstanceTypeCategories []Category `json:"instance_type_categories"` InstanceTypes []InstanceType `json:"instance_types"` Placements []Placement `json:"placements"` } type VolumeSpec struct { DeviceName string `json:"device_name,omitempty"` SizeGiB int32 `json:"size_gib,omitempty"` Type string `json:"type,omitempty"` IOPS int32 `json:"iops,omitempty"` Throughput int32 `json:"throughput,omitempty"` Encrypted bool `json:"encrypted,omitempty"` KMSKeyID string `json:"kms_key_id,omitempty"` DeleteOnTermination *bool `json:"delete_on_termination,omitempty"` } type CreateInstanceRequest struct { PlacementID string `json:"placement_id,omitempty"` ImageID string `json:"image_id"` InstanceType string `json:"instance_type"` Name string `json:"name,omitempty"` SecurityGroupMode string `json:"security_group_mode,omitempty"` IAMInstanceProfileARN string `json:"iam_instance_profile_arn,omitempty"` UserData string `json:"user_data,omitempty"` PrivateIPAddress string `json:"private_ip_address,omitempty"` AssociateEIP bool `json:"associate_eip,omitempty"` Monitoring bool `json:"monitoring,omitempty"` EBSOptimized bool `json:"ebs_optimized,omitempty"` ShutdownBehavior string `json:"shutdown_behavior,omitempty"` RootVolume *VolumeSpec `json:"root_volume,omitempty"` DataVolumes []VolumeSpec `json:"data_volumes,omitempty"` Tags map[string]string `json:"tags,omitempty"` InstallAgent *bool `json:"install_agent,omitempty"` TrafficLimitGiB *float64 `json:"traffic_limit_gib,omitempty"` } type PriceEstimate struct { Currency string `json:"currency"` HourlyPrice float64 `json:"hourly_price"` MonthlyPrice float64 `json:"monthly_price"` CalendarMonthPrice float64 `json:"calendar_month_price"` Breakdown map[string]any `json:"breakdown"` ConfigurationFingerprint string `json:"configuration_fingerprint,omitempty"` ResourceSyncedAt time.Time `json:"resource_synced_at,omitempty"` Raw map[string]any `json:"-"` } const ( InstanceChangeEIPAdd = "eip_add" InstanceChangeEIPReplace = "eip_replace" InstanceChangeVolumeCreate = "volume_create" InstanceChangeVolumeExpand = "volume_expand" InstanceChangeRootVolumeExpand = "root_volume_expand" InstanceChangeRebuildImage = "rebuild_image" InstanceChangeTrafficLimit = "traffic_limit" ) type InstanceChangePriceRequest struct { Kind string `json:"kind"` PeriodEnd time.Time `json:"period_end"` VolumeID string `json:"volume_id,omitempty"` Volume *CreateVolumeRequest `json:"volume,omitempty"` SizeGiB int32 `json:"size_gib,omitempty"` ImageID string `json:"image_id,omitempty"` LimitGiB *float64 `json:"limit_gib,omitempty"` } type InstanceChangePriceEstimate struct { Kind string `json:"kind"` Currency string `json:"currency"` QuotedAt time.Time `json:"quoted_at"` ValidUntil time.Time `json:"valid_until"` PeriodEnd time.Time `json:"period_end"` CurrentMonthlyPrice float64 `json:"current_monthly_price"` TargetMonthlyPrice float64 `json:"target_monthly_price"` MonthlyDelta float64 `json:"monthly_delta"` CurrentPeriodPrice float64 `json:"current_period_price"` TargetPeriodPrice float64 `json:"target_period_price"` PeriodDelta float64 `json:"period_delta"` ChargePrice float64 `json:"charge_price"` ConfigurationFingerprint string `json:"configuration_fingerprint"` ResourceSyncedAt time.Time `json:"resource_synced_at"` NormalizedRequest InstanceChangePriceRequest `json:"normalized_request"` Breakdown map[string]any `json:"breakdown"` } type Instance struct { ID string `json:"id"` InstanceID string `json:"instance_id,omitempty"` Name string `json:"name"` Region string `json:"region"` State string `json:"state"` ProvisionStatus string `json:"provision_status"` ImageID string `json:"image_id"` InstanceType string `json:"instance_type"` AvailabilityZone string `json:"availability_zone"` PrivateIPAddress string `json:"private_ip_address"` PublicIPAddress string `json:"public_ip_address"` HourlyRate float64 `json:"hourly_rate"` MonthCost float64 `json:"month_cost"` ProjectedCost float64 `json:"projected_month_cost"` FullMonthCost float64 `json:"full_month_cost"` CostCurrency string `json:"cost_currency"` LastTaskID string `json:"last_task_id"` LastError string `json:"last_error"` CreatedAt time.Time `json:"created_at"` UpdatedAt time.Time `json:"updated_at"` } type CatalogResourceDetails map[string]any type InstanceDetails map[string]any func (d InstanceDetails) InstanceTypeDetails() CatalogResourceDetails { return catalogResourceDetails(d["instance_type_details"]) } func (d InstanceDetails) ImageDetails() CatalogResourceDetails { return catalogResourceDetails(d["image_details"]) } func catalogResourceDetails(value any) CatalogResourceDetails { if details, ok := value.(map[string]any); ok { return CatalogResourceDetails(details) } if details, ok := value.(CatalogResourceDetails); ok { return details } return nil } type Operation struct { client *Client ID string `json:"id"` TaskID string `json:"task_id"` CommandID string `json:"command_id,omitempty"` Status string `json:"status"` PlacementID string `json:"placement_id,omitempty"` } func (o *Operation) Wait(ctx context.Context, options ...WaitOption) (*Task, error) { if o == nil || o.client == nil { return nil, errors.New("awsserversdk: invalid operation") } if o.TaskID == "" { if o.Status == "deleted" || o.Status == "succeeded" { return &Task{ID: o.ID, ResourceID: o.ID, Status: "succeeded", Progress: 100}, nil } return nil, errors.New("awsserversdk: operation has no task ID") } return o.client.Tasks.Wait(ctx, o.TaskID, options...) } type Task struct { ID string `json:"id"` Type string `json:"type"` QueueName string `json:"queue_name"` Region string `json:"region"` ResourceID string `json:"resource_id"` Status string `json:"status"` Progress int `json:"progress"` Attempts int `json:"attempts"` State json.RawMessage `json:"state"` Result json.RawMessage `json:"result"` ErrorCode string `json:"error_code"` ErrorMessage string `json:"error_message"` CreatedAt time.Time `json:"created_at"` UpdatedAt time.Time `json:"updated_at"` FinishedAt *time.Time `json:"finished_at"` }