feat: add instance change pricing and catalog metadata
test / go (push) Successful in 51s

This commit is contained in:
shiran
2026-08-31 16:40:43 +08:00
parent 8392db9ae3
commit 0a1b3ac8c0
6 changed files with 215 additions and 37 deletions
+115 -16
View File
@@ -54,25 +54,66 @@ type Image struct {
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"`
GPUCount float64 `json:"gpu_count"`
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"`
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"`
@@ -121,6 +162,43 @@ type PriceEstimate struct {
ResourceSyncedAt time.Time `json:"resource_synced_at,omitempty"`
Raw map[string]any `json:"-"`
}
const (
InstanceChangeEIPAdd = "eip_add"
InstanceChangeVolumeCreate = "volume_create"
InstanceChangeVolumeExpand = "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"`
@@ -143,7 +221,28 @@ type Instance struct {
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"`