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