regions.go raw

   1  package linodego
   2  
   3  import (
   4  	"context"
   5  	"time"
   6  )
   7  
   8  // This is an enumeration of Capabilities Linode offers that can be referenced
   9  // through the user-facing parts of the application.
  10  // Defined as strings rather than a custom type to avoid breaking change.
  11  // Can be changed in the potential v2 version.
  12  const (
  13  	CapabilityACLB                          string = "Akamai Cloud Load Balancer"
  14  	CapabilityBackups                       string = "Backups"
  15  	CapabilityBareMetal                     string = "Bare Metal"
  16  	CapabilityBlockStorage                  string = "Block Storage"
  17  	CapabilityBlockStorageEncryption        string = "Block Storage Encryption"
  18  	CapabilityBlockStorageMigrations        string = "Block Storage Migrations"
  19  	CapabilityCloudFirewall                 string = "Cloud Firewall"
  20  	CapabilityDBAAS                         string = "Managed Databases"
  21  	CapabilityDiskEncryption                string = "Disk Encryption"
  22  	CapabilityEdgePlans                     string = "Edge Plans"
  23  	CapabilityGPU                           string = "GPU Linodes"
  24  	CapabilityKubernetesEnterprise          string = "Kubernetes Enterprise"
  25  	CapabilityLinodeInterfaces              string = "Linode Interfaces"
  26  	CapabilityLADiskEncryption              string = "LA Disk Encryption"
  27  	CapabilityLKE                           string = "Kubernetes"
  28  	CapabilityLKEControlPlaneACL            string = "LKE Network Access Control List (IP ACL)"
  29  	CapabilityLinodes                       string = "Linodes"
  30  	CapabilityLkeHaControlPlanes            string = "LKE HA Control Planes"
  31  	CapabilityMachineImages                 string = "Machine Images"
  32  	CapabilityMaintenancePolicy             string = "Maintenance Policy"
  33  	CapabilityMetadata                      string = "Metadata"
  34  	CapabilityNodeBalancers                 string = "NodeBalancers"
  35  	CapabilityObjectStorage                 string = "Object Storage"
  36  	CapabilityObjectStorageAccessKeyRegions string = "Object Storage Access Key Regions"
  37  	CapabilityObjectStorageEndpointTypes    string = "Object Storage Endpoint Types"
  38  	CapabilityPlacementGroup                string = "Placement Group"
  39  	CapabilityPremiumPlans                  string = "Premium Plans"
  40  	CapabilityQuadraT1UVPU                  string = "NETINT Quadra T1U"
  41  	CapabilitySupportTicketSeverity         string = "Support Ticket Severity"
  42  	CapabilityVPCs                          string = "VPCs"
  43  	CapabilityVPCDualStack                  string = "VPC Dual Stack"
  44  	CapabilityVPCsExtra                     string = "VPCs Extra"
  45  	CapabilityVlans                         string = "Vlans"
  46  
  47  	// Deprecated: CapabilityObjectStorageRegions constant has been
  48  	// renamed to `CapabilityObjectStorageAccessKeyRegions`.
  49  	CapabilityObjectStorageRegions string = CapabilityObjectStorageAccessKeyRegions
  50  )
  51  
  52  // Region-related endpoints have a custom expiry time as the
  53  // `status` field may update for database outages.
  54  var cacheExpiryTime = time.Minute
  55  
  56  // Region represents a linode region object
  57  type Region struct {
  58  	ID      string `json:"id"`
  59  	Country string `json:"country"`
  60  
  61  	// A List of enums from the above constants
  62  	Capabilities []string `json:"capabilities"`
  63  
  64  	Monitors RegionMonitors `json:"monitors"`
  65  
  66  	Status   string `json:"status"`
  67  	Label    string `json:"label"`
  68  	SiteType string `json:"site_type"`
  69  
  70  	Resolvers            RegionResolvers             `json:"resolvers"`
  71  	PlacementGroupLimits *RegionPlacementGroupLimits `json:"placement_group_limits"`
  72  }
  73  
  74  // RegionResolvers contains the DNS resolvers of a region
  75  type RegionResolvers struct {
  76  	IPv4 string `json:"ipv4"`
  77  	IPv6 string `json:"ipv6"`
  78  }
  79  
  80  // RegionMonitors contains the monitoring configuration for a region
  81  type RegionMonitors struct {
  82  	Alerts  []string `json:"alerts"`
  83  	Metrics []string `json:"metrics"`
  84  }
  85  
  86  // RegionPlacementGroupLimits contains information about the
  87  // placement group limits for the current user in the current region.
  88  type RegionPlacementGroupLimits struct {
  89  	MaximumPGsPerCustomer int `json:"maximum_pgs_per_customer"`
  90  	MaximumLinodesPerPG   int `json:"maximum_linodes_per_pg"`
  91  }
  92  
  93  // ListRegions lists Regions. This endpoint is cached by default.
  94  func (c *Client) ListRegions(ctx context.Context, opts *ListOptions) ([]Region, error) {
  95  	endpoint, err := generateListCacheURL("regions", opts)
  96  	if err != nil {
  97  		return nil, err
  98  	}
  99  
 100  	if result := c.getCachedResponse(endpoint); result != nil {
 101  		return result.([]Region), nil
 102  	}
 103  
 104  	response, err := getPaginatedResults[Region](ctx, c, "regions", opts)
 105  	if err != nil {
 106  		return nil, err
 107  	}
 108  
 109  	c.addCachedResponse(endpoint, response, &cacheExpiryTime)
 110  
 111  	return response, nil
 112  }
 113  
 114  // GetRegion gets the template with the provided ID. This endpoint is cached by default.
 115  func (c *Client) GetRegion(ctx context.Context, regionID string) (*Region, error) {
 116  	e := formatAPIPath("regions/%s", regionID)
 117  
 118  	if result := c.getCachedResponse(e); result != nil {
 119  		result := result.(Region)
 120  		return &result, nil
 121  	}
 122  
 123  	response, err := doGETRequest[Region](ctx, c, e)
 124  	if err != nil {
 125  		return nil, err
 126  	}
 127  
 128  	c.addCachedResponse(e, response, &cacheExpiryTime)
 129  
 130  	return response, nil
 131  }
 132