Files
2026-09-01 15:02:21 +08:00

287 lines
13 KiB
Go

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"`
}