package ionet import ( "time" ) // Client represents the IO.NET API client type Client struct { BaseURL string APIKey string HTTPClient HTTPClient } // HTTPClient interface for making HTTP requests type HTTPClient interface { Do(req *HTTPRequest) (*HTTPResponse, error) } // HTTPRequest represents an HTTP request type HTTPRequest struct { Method string URL string Headers map[string]string Body []byte } // HTTPResponse represents an HTTP response type HTTPResponse struct { StatusCode int Headers map[string]string Body []byte } // DeploymentRequest represents a container deployment request type DeploymentRequest struct { ResourcePrivateName string `json:"resource_private_name"` DurationHours int `json:"duration_hours"` GPUsPerContainer int `json:"gpus_per_container"` HardwareID int `json:"hardware_id"` LocationIDs []int `json:"location_ids"` ContainerConfig ContainerConfig `json:"container_config"` RegistryConfig RegistryConfig `json:"registry_config"` } // ContainerConfig represents container configuration type ContainerConfig struct { ReplicaCount int `json:"replica_count"` EnvVariables map[string]string `json:"env_variables,omitempty"` SecretEnvVariables map[string]string `json:"secret_env_variables,omitempty"` Entrypoint []string `json:"entrypoint,omitempty"` TrafficPort int `json:"traffic_port,omitempty"` Args []string `json:"args,omitempty"` } // RegistryConfig represents registry configuration type RegistryConfig struct { ImageURL string `json:"image_url"` RegistryUsername string `json:"registry_username,omitempty"` RegistrySecret string `json:"registry_secret,omitempty"` } // DeploymentResponse represents the response from deployment creation type DeploymentResponse struct { DeploymentID string `json:"deployment_id"` Status string `json:"status"` } // DeploymentDetail represents detailed deployment information type DeploymentDetail struct { ID string `json:"id"` Status string `json:"status"` CreatedAt time.Time `json:"created_at"` StartedAt *time.Time `json:"started_at,omitempty"` FinishedAt *time.Time `json:"finished_at,omitempty"` AmountPaid float64 `json:"amount_paid"` CompletedPercent float64 `json:"completed_percent"` TotalGPUs int `json:"total_gpus"` GPUsPerContainer int `json:"gpus_per_container"` TotalContainers int `json:"total_containers"` HardwareName string `json:"hardware_name"` HardwareID int `json:"hardware_id"` Locations []DeploymentLocation `json:"locations"` BrandName string `json:"brand_name"` ComputeMinutesServed int `json:"compute_minutes_served"` ComputeMinutesRemaining int `json:"compute_minutes_remaining"` ContainerConfig DeploymentContainerConfig `json:"container_config"` } // DeploymentLocation represents a location in deployment details type DeploymentLocation struct { ID int `json:"id"` ISO2 string `json:"iso2"` Name string `json:"name"` } // DeploymentContainerConfig represents container config in deployment details type DeploymentContainerConfig struct { Entrypoint []string `json:"entrypoint"` EnvVariables map[string]interface{} `json:"env_variables"` TrafficPort int `json:"traffic_port"` ImageURL string `json:"image_url"` } // Container represents a container within a deployment type Container struct { DeviceID string `json:"device_id"` ContainerID string `json:"container_id"` Hardware string `json:"hardware"` BrandName string `json:"brand_name"` CreatedAt time.Time `json:"created_at"` UptimePercent int `json:"uptime_percent"` GPUsPerContainer int `json:"gpus_per_container"` Status string `json:"status"` ContainerEvents []ContainerEvent `json:"container_events"` PublicURL string `json:"public_url"` } // ContainerEvent represents a container event type ContainerEvent struct { Time time.Time `json:"time"` Message string `json:"message"` } // ContainerList represents a list of containers type ContainerList struct { Total int `json:"total"` Workers []Container `json:"workers"` } // Deployment represents a deployment in the list type Deployment struct { ID string `json:"id"` Status string `json:"status"` Name string `json:"name"` CompletedPercent float64 `json:"completed_percent"` HardwareQuantity int `json:"hardware_quantity"` BrandName string `json:"brand_name"` HardwareName string `json:"hardware_name"` Served string `json:"served"` Remaining string `json:"remaining"` ComputeMinutesServed int `json:"compute_minutes_served"` ComputeMinutesRemaining int `json:"compute_minutes_remaining"` CreatedAt time.Time `json:"created_at"` GPUCount int `json:"-"` // Derived from HardwareQuantity Replicas int `json:"-"` // Derived from HardwareQuantity } // DeploymentList represents a list of deployments with pagination type DeploymentList struct { Deployments []Deployment `json:"deployments"` Total int `json:"total"` Statuses []string `json:"statuses"` } // AvailableReplica represents replica availability for a location type AvailableReplica struct { LocationID int `json:"location_id"` LocationName string `json:"location_name"` HardwareID int `json:"hardware_id"` HardwareName string `json:"hardware_name"` AvailableCount int `json:"available_count"` MaxGPUs int `json:"max_gpus"` } // AvailableReplicasResponse represents the response for available replicas type AvailableReplicasResponse struct { Replicas []AvailableReplica `json:"replicas"` } // MaxGPUResponse represents the response for maximum GPUs per container type MaxGPUResponse struct { Hardware []MaxGPUInfo `json:"hardware"` Total int `json:"total"` } // MaxGPUInfo represents max GPU information for a hardware type type MaxGPUInfo struct { MaxGPUsPerContainer int `json:"max_gpus_per_container"` Available int `json:"available"` HardwareID int `json:"hardware_id"` HardwareName string `json:"hardware_name"` BrandName string `json:"brand_name"` } // PriceEstimationRequest represents a price estimation request type PriceEstimationRequest struct { LocationIDs []int `json:"location_ids"` HardwareID int `json:"hardware_id"` GPUsPerContainer int `json:"gpus_per_container"` DurationHours int `json:"duration_hours"` ReplicaCount int `json:"replica_count"` Currency string `json:"currency"` DurationType string `json:"duration_type"` DurationQty int `json:"duration_qty"` HardwareQty int `json:"hardware_qty"` } // PriceEstimationResponse represents the price estimation response type PriceEstimationResponse struct { EstimatedCost float64 `json:"estimated_cost"` Currency string `json:"currency"` PriceBreakdown PriceBreakdown `json:"price_breakdown"` EstimationValid bool `json:"estimation_valid"` } // PriceBreakdown represents detailed cost breakdown type PriceBreakdown struct { ComputeCost float64 `json:"compute_cost"` NetworkCost float64 `json:"network_cost,omitempty"` StorageCost float64 `json:"storage_cost,omitempty"` TotalCost float64 `json:"total_cost"` HourlyRate float64 `json:"hourly_rate"` } // ContainerLogs represents container log entries type ContainerLogs struct { ContainerID string `json:"container_id"` Logs []LogEntry `json:"logs"` HasMore bool `json:"has_more"` NextCursor string `json:"next_cursor,omitempty"` } // LogEntry represents a single log entry type LogEntry struct { Timestamp time.Time `json:"timestamp"` Level string `json:"level,omitempty"` Message string `json:"message"` Source string `json:"source,omitempty"` } // UpdateDeploymentRequest represents request to update deployment configuration type UpdateDeploymentRequest struct { EnvVariables map[string]string `json:"env_variables,omitempty"` SecretEnvVariables map[string]string `json:"secret_env_variables,omitempty"` Entrypoint []string `json:"entrypoint,omitempty"` TrafficPort *int `json:"traffic_port,omitempty"` ImageURL string `json:"image_url,omitempty"` RegistryUsername string `json:"registry_username,omitempty"` RegistrySecret string `json:"registry_secret,omitempty"` Args []string `json:"args,omitempty"` Command string `json:"command,omitempty"` } // ExtendDurationRequest represents request to extend deployment duration type ExtendDurationRequest struct { DurationHours int `json:"duration_hours"` } // UpdateDeploymentResponse represents response from deployment update type UpdateDeploymentResponse struct { Status string `json:"status"` DeploymentID string `json:"deployment_id"` } // UpdateClusterNameRequest represents request to update cluster name type UpdateClusterNameRequest struct { Name string `json:"cluster_name"` } // UpdateClusterNameResponse represents response from cluster name update type UpdateClusterNameResponse struct { Status string `json:"status"` Message string `json:"message"` } // APIError represents an API error response type APIError struct { Code int `json:"code"` Message string `json:"message"` Details string `json:"details,omitempty"` } // Error implements the error interface func (e *APIError) Error() string { if e.Details != "" { return e.Message + ": " + e.Details } return e.Message } // ListDeploymentsOptions represents options for listing deployments type ListDeploymentsOptions struct { Status string `json:"status,omitempty"` // filter by status LocationID int `json:"location_id,omitempty"` // filter by location Page int `json:"page,omitempty"` // pagination PageSize int `json:"page_size,omitempty"` // pagination SortBy string `json:"sort_by,omitempty"` // sort field SortOrder string `json:"sort_order,omitempty"` // asc/desc } // GetLogsOptions represents options for retrieving container logs type GetLogsOptions struct { StartTime *time.Time `json:"start_time,omitempty"` EndTime *time.Time `json:"end_time,omitempty"` Level string `json:"level,omitempty"` // filter by log level Stream string `json:"stream,omitempty"` // filter by stdout/stderr streams Limit int `json:"limit,omitempty"` // max number of log entries Cursor string `json:"cursor,omitempty"` // pagination cursor Follow bool `json:"follow,omitempty"` // stream logs } // HardwareType represents a hardware type available for deployment type HardwareType struct { ID int `json:"id"` Name string `json:"name"` Description string `json:"description,omitempty"` GPUType string `json:"gpu_type"` GPUMemory int `json:"gpu_memory"` // in GB MaxGPUs int `json:"max_gpus"` CPU string `json:"cpu,omitempty"` Memory int `json:"memory,omitempty"` // in GB Storage int `json:"storage,omitempty"` // in GB HourlyRate float64 `json:"hourly_rate"` Available bool `json:"available"` BrandName string `json:"brand_name,omitempty"` AvailableCount int `json:"available_count,omitempty"` } // Location represents a deployment location type Location struct { ID int `json:"id"` Name string `json:"name"` ISO2 string `json:"iso2,omitempty"` Region string `json:"region,omitempty"` Country string `json:"country,omitempty"` Latitude float64 `json:"latitude,omitempty"` Longitude float64 `json:"longitude,omitempty"` Available int `json:"available,omitempty"` Description string `json:"description,omitempty"` } // LocationsResponse represents the list of locations and aggregated metadata. type LocationsResponse struct { Locations []Location `json:"locations"` Total int `json:"total"` } // LocationAvailability represents real-time availability for a location type LocationAvailability struct { LocationID int `json:"location_id"` LocationName string `json:"location_name"` Available bool `json:"available"` HardwareAvailability []HardwareAvailability `json:"hardware_availability"` UpdatedAt time.Time `json:"updated_at"` } // HardwareAvailability represents availability for specific hardware at a location type HardwareAvailability struct { HardwareID int `json:"hardware_id"` HardwareName string `json:"hardware_name"` AvailableCount int `json:"available_count"` MaxGPUs int `json:"max_gpus"` }