287 lines
13 KiB
Go
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"`
|
|
}
|