diff --git a/account.go b/account.go index 9201fd62c..15b3d4073 100644 --- a/account.go +++ b/account.go @@ -34,18 +34,18 @@ type Account struct { // AccountUpdateOptions fields are those accepted by UpdateAccount type AccountUpdateOptions struct { - Address1 string `json:"address_1,omitempty"` - Address2 string `json:"address_2,omitempty"` - City string `json:"city,omitempty"` - Company string `json:"company,omitempty"` - Country string `json:"country,omitempty"` - Email string `json:"email,omitempty"` - FirstName string `json:"first_name,omitempty"` - LastName string `json:"last_name,omitempty"` - Phone string `json:"phone,omitempty"` - State string `json:"state,omitempty"` - TaxID string `json:"tax_id,omitempty"` - Zip string `json:"zip,omitempty"` + Address1 string `json:"address_1,omitzero"` + Address2 string `json:"address_2,omitzero"` + City string `json:"city,omitzero"` + Company string `json:"company,omitzero"` + Country string `json:"country,omitzero"` + Email string `json:"email,omitzero"` + FirstName string `json:"first_name,omitzero"` + LastName string `json:"last_name,omitzero"` + Phone string `json:"phone,omitzero"` + State string `json:"state,omitzero"` + TaxID string `json:"tax_id,omitzero"` + Zip string `json:"zip,omitzero"` } // GetUpdateOptions converts an Account to AccountUpdateOptions for use in UpdateAccount diff --git a/account_agreements.go b/account_agreements.go index 795244a4a..1c4272651 100644 --- a/account_agreements.go +++ b/account_agreements.go @@ -11,9 +11,9 @@ type AccountAgreements struct { // AccountAgreementsUpdateOptions fields are those accepted by UpdateAccountAgreements type AccountAgreementsUpdateOptions struct { - EUModel bool `json:"eu_model,omitempty"` - MasterServiceAgreement bool `json:"master_service_agreement,omitempty"` - PrivacyPolicy bool `json:"privacy_policy,omitempty"` + EUModel bool `json:"eu_model,omitzero"` + MasterServiceAgreement bool `json:"master_service_agreement,omitzero"` + PrivacyPolicy bool `json:"privacy_policy,omitzero"` } // GetUpdateOptions converts an AccountAgreements to AccountAgreementsUpdateOptions for use in UpdateAccountAgreements diff --git a/account_events.go b/account_events.go index 190ea221e..bf2bdd17e 100644 --- a/account_events.go +++ b/account_events.go @@ -231,14 +231,6 @@ const ( ActionVPCSubnetCreate EventAction = "subnet_create" ActionVPCSubnetDelete EventAction = "subnet_delete" ActionVPCSubnetUpdate EventAction = "subnet_update" - - // Deprecated: incorrect spelling, - // to be removed in the next major version release. - ActionVolumeDelte EventAction = "volume_delete" - - // Deprecated: incorrect spelling, - // to be removed in the next major version - ActionCreateCardUpdated = ActionCreditCardUpdated ) // EntityType constants start with Entity and include Linode API Event Entity Types @@ -343,16 +335,6 @@ func (c *Client) GetEvent(ctx context.Context, eventID int) (*Event, error) { return doGETRequest[Event](ctx, c, e) } -// MarkEventRead marks a single Event as read. -// -// Deprecated: `MarkEventRead` is a deprecated API, please consider using `MarkEventsSeen` instead. -// Please note that the `MarkEventsSeen` API functions differently and will mark all events up to and -// including the referenced event-id as "seen" rather than individual events. -func (c *Client) MarkEventRead(ctx context.Context, event *Event) error { - e := formatAPIPath("account/events/%d/read", event.ID) - return doPOSTRequestNoRequestResponseBody(ctx, c, e) -} - // MarkEventsSeen marks all Events up to and including this Event by ID as seen. func (c *Client) MarkEventsSeen(ctx context.Context, event *Event) error { e := formatAPIPath("account/events/%d/seen", event.ID) diff --git a/account_maintenance.go b/account_maintenance.go index ec7e2e479..b5917c9a9 100644 --- a/account_maintenance.go +++ b/account_maintenance.go @@ -22,9 +22,6 @@ type AccountMaintenance struct { NotBefore *time.Time `json:"-"` StartTime *time.Time `json:"-"` CompleteTime *time.Time `json:"-"` - - // Deprecated: When is a deprecated property - When *time.Time `json:"when"` } // Entity represents the entity being affected by maintenance @@ -57,7 +54,6 @@ func (accountMaintenance *AccountMaintenance) UnmarshalJSON(b []byte) error { accountMaintenance.NotBefore = (*time.Time)(p.NotBefore) accountMaintenance.StartTime = (*time.Time)(p.StartTime) accountMaintenance.CompleteTime = (*time.Time)(p.CompleteTime) - accountMaintenance.When = (*time.Time)(p.When) return nil } diff --git a/account_payments.go b/account_payments.go index af2488e9e..6cf3d4384 100644 --- a/account_payments.go +++ b/account_payments.go @@ -23,7 +23,7 @@ type Payment struct { // PaymentCreateOptions fields are those accepted by CreatePayment type PaymentCreateOptions struct { // CVV (Card Verification Value) of the credit card to be used for the Payment - CVV string `json:"cvv,omitempty"` + CVV string `json:"cvv,omitzero"` // The amount, in US dollars, of the Payment USD json.Number `json:"usd"` diff --git a/account_settings.go b/account_settings.go index 5b487d199..068e0847f 100644 --- a/account_settings.go +++ b/account_settings.go @@ -40,17 +40,17 @@ type AccountSettings struct { // AccountSettingsUpdateOptions are the updateable account wide flags or plans that effect new resources. type AccountSettingsUpdateOptions struct { // The default backups enrollment status for all new Linodes for all users on the account. When enabled, backups are mandatory per instance. - BackupsEnabled *bool `json:"backups_enabled,omitempty"` + BackupsEnabled *bool `json:"backups_enabled,omitzero"` // The default network helper setting for all new Linodes and Linode Configs for all users on the account. - NetworkHelper *bool `json:"network_helper,omitempty"` + NetworkHelper *bool `json:"network_helper,omitzero"` // NOTE: Interfaces for new linode setting may not currently be available to all users. // A new configuration flag defines whether new Linodes can use Linode and/or legacy config interfaces. InterfacesForNewLinodes *InterfacesForNewLinodes `json:"interfaces_for_new_linodes"` // The slug of the maintenance policy to set the account to. - MaintenancePolicy *string `json:"maintenance_policy,omitempty"` + MaintenancePolicy *string `json:"maintenance_policy,omitzero"` } // GetAccountSettings gets the account wide flags or plans that effect new resources diff --git a/account_user_grants.go b/account_user_grants.go index 5314c79b9..ea00a4110 100644 --- a/account_user_grants.go +++ b/account_user_grants.go @@ -56,17 +56,17 @@ type UserGrants struct { } type UserGrantsUpdateOptions struct { - Database []GrantedEntity `json:"database,omitempty"` - Domain []EntityUserGrant `json:"domain,omitempty"` - Firewall []EntityUserGrant `json:"firewall,omitempty"` - Image []EntityUserGrant `json:"image,omitempty"` - Linode []EntityUserGrant `json:"linode,omitempty"` - Longview []EntityUserGrant `json:"longview,omitempty"` - NodeBalancer []EntityUserGrant `json:"nodebalancer,omitempty"` - PlacementGroup []EntityUserGrant `json:"placement_group,omitempty"` - StackScript []EntityUserGrant `json:"stackscript,omitempty"` - Volume []EntityUserGrant `json:"volume,omitempty"` - VPC []EntityUserGrant `json:"vpc,omitempty"` + Database []GrantedEntity `json:"database,omitzero"` + Domain []EntityUserGrant `json:"domain,omitzero"` + Firewall []EntityUserGrant `json:"firewall,omitzero"` + Image []EntityUserGrant `json:"image,omitzero"` + Linode []EntityUserGrant `json:"linode,omitzero"` + Longview []EntityUserGrant `json:"longview,omitzero"` + NodeBalancer []EntityUserGrant `json:"nodebalancer,omitzero"` + PlacementGroup []EntityUserGrant `json:"placement_group,omitzero"` + StackScript []EntityUserGrant `json:"stackscript,omitzero"` + Volume []EntityUserGrant `json:"volume,omitzero"` + VPC []EntityUserGrant `json:"vpc,omitzero"` Global GlobalUserGrants `json:"global"` } diff --git a/account_users.go b/account_users.go index 13e71c520..73cb099e9 100644 --- a/account_users.go +++ b/account_users.go @@ -45,9 +45,9 @@ type UserCreateOptions struct { // UserUpdateOptions fields are those accepted by UpdateUser type UserUpdateOptions struct { - Username string `json:"username,omitempty"` - Restricted *bool `json:"restricted,omitempty"` - Email string `json:"email,omitempty"` + Username string `json:"username,omitzero"` + Restricted *bool `json:"restricted,omitzero"` + Email string `json:"email,omitzero"` } // UnmarshalJSON implements the json.Unmarshaler interface diff --git a/client.go b/client.go index 3d245c855..b96d1abee 100644 --- a/client.go +++ b/client.go @@ -3,6 +3,9 @@ package linodego import ( "bytes" "context" + "crypto/tls" + "crypto/x509" + _ "embed" "encoding/json" "fmt" "io" @@ -14,13 +17,13 @@ import ( "path/filepath" "reflect" "regexp" + "runtime" + "sort" "strconv" "strings" "sync" "text/template" "time" - - "github.com/go-resty/resty/v2" ) const ( @@ -50,20 +53,35 @@ const ( APIDefaultCacheExpiration = time.Minute * 15 ) -//nolint:unused +// Embed the log template files +// +//go:embed request_log_template.tmpl +var requestTemplateStr string + +//go:embed response_log_template.tmpl +var responseTemplateStr string + var ( - reqLogTemplate = template.Must(template.New("request").Parse(`Sending request: -Method: {{.Method}} -URL: {{.URL}} -Headers: {{.Headers}} -Body: {{.Body}}`)) - - respLogTemplate = template.Must(template.New("response").Parse(`Received response: -Status: {{.Status}} -Headers: {{.Headers}} -Body: {{.Body}}`)) + reqLogTemplate = template.Must(template.New("request").Parse(requestTemplateStr)) + respLogTemplate = template.Must(template.New("response").Parse(responseTemplateStr)) ) +type RequestLog struct { + Request string + Host string + Headers http.Header + Body string +} + +type ResponseLog struct { + Status string + Proto string + ReceivedAt string + TimeDuration string + Headers http.Header + Body string +} + var envDebug = false // redactHeadersMap is a map of headers that should be redacted in logs, @@ -72,18 +90,19 @@ var redactHeadersMap = map[string]string{ "Authorization": "Bearer *******************************", } -// Client is a wrapper around the Resty client +// Client is a wrapper around the http client type Client struct { - resty *resty.Client - userAgent string - debug bool - retryConditionals []RetryConditional + httpClient *http.Client + userAgent string + debug bool pollInterval time.Duration baseURL string apiVersion string apiProto string + hostURL string + header http.Header selectedProfile string loadedProfile string @@ -94,6 +113,16 @@ type Client struct { cacheExpiration time.Duration cachedEntries map[string]clientCacheEntry cachedEntryLock *sync.RWMutex + logger Logger + requestLog func(*RequestLog) error + onBeforeRequest []func(*http.Request) error + onAfterResponse []func(*http.Response) error + + retryConditionals []RetryConditional + retryMaxWaitTime time.Duration + retryMinWaitTime time.Duration + retryAfter RetryAfter + retryCount int } type EnvDefaults struct { @@ -110,13 +139,11 @@ type clientCacheEntry struct { } type ( - Request = resty.Request - Response = resty.Response - Logger = resty.Logger + Request = http.Request + Response = http.Response ) func init() { - // Whether we will enable Resty debugging output if apiDebug, ok := os.LookupEnv("LINODE_DEBUG"); ok { if parsed, err := strconv.ParseBool(apiDebug); err == nil { envDebug = parsed @@ -128,22 +155,37 @@ func init() { } // NewClient factory to create new Client struct +// nolint:funlen func NewClient(hc *http.Client) (client Client) { if hc != nil { - client.resty = resty.NewWithClient(hc) + client.httpClient = hc } else { - client.resty = resty.New() + client.httpClient = &http.Client{} + } + + // Ensure that the Header map is not nil + if client.httpClient.Transport == nil { + client.httpClient.Transport = &http.Transport{} } client.shouldCache = true client.cacheExpiration = APIDefaultCacheExpiration client.cachedEntries = make(map[string]clientCacheEntry) client.cachedEntryLock = &sync.RWMutex{} + client.configProfiles = make(map[string]ConfigProfile) + + const ( + retryMinWaitDuration = 100 * time.Millisecond + retryMaxWaitDuration = 2 * time.Second + ) + + client.retryMinWaitTime = retryMinWaitDuration + client.retryMaxWaitTime = retryMaxWaitDuration client.SetUserAgent(DefaultUserAgent) + client.SetLogger(createLogger()) baseURL, baseURLExists := os.LookupEnv(APIHostVar) - if baseURLExists { client.SetBaseURL(baseURL) } @@ -156,17 +198,11 @@ func NewClient(hc *http.Client) (client Client) { } certPath, certPathExists := os.LookupEnv(APIHostCert) - - if certPathExists && !hasCustomTransport(hc) { - cert, err := os.ReadFile(filepath.Clean(certPath)) - if err != nil { - log.Fatalf("[ERROR] Error when reading cert at %s: %s\n", certPath, err.Error()) - } - + if certPathExists { client.SetRootCertificate(certPath) if envDebug { - log.Printf("[DEBUG] Set API root certificate to %s with contents %s\n", certPath, cert) + log.Printf("[DEBUG] Set API root certificate to %s\n", certPath) } } @@ -174,6 +210,7 @@ func NewClient(hc *http.Client) (client Client) { SetRetryWaitTime(APISecondsPerPoll * time.Second). SetPollDelay(APISecondsPerPoll * time.Second). SetRetries(). + SetLogger(createLogger()). SetDebug(envDebug). enableLogSanitization() @@ -213,8 +250,8 @@ func NewClientFromEnv(hc *http.Client) (*Client, error) { client.selectedProfile = configProfile // We should only load the config if the config file exists - if _, err = os.Stat(configPath); err != nil { - return nil, fmt.Errorf("error loading config file %s: %w", configPath, err) + if _, statErr := os.Stat(configPath); statErr != nil { + return nil, fmt.Errorf("error loading config file %s: %w", configPath, statErr) } err = client.preLoadConfig(configPath) @@ -225,42 +262,284 @@ func NewClientFromEnv(hc *http.Client) (*Client, error) { // SetUserAgent sets a custom user-agent for HTTP requests func (c *Client) SetUserAgent(ua string) *Client { c.userAgent = ua - c.resty.SetHeader("User-Agent", c.userAgent) + c.SetHeader("User-Agent", c.userAgent) return c } -type RequestParams struct { - Body any +type requestParams struct { + Body *bytes.Reader Response any + // Headers are per-request headers that will be applied only to + // the individual request, not stored on the shared client state. + Headers http.Header +} + +func (c *Client) ErrorAndLogf(format string, args ...any) error { + if c.debug && c.logger != nil { + c.logger.Errorf(format, args...) + } + + return fmt.Errorf(format, args...) +} + +// SetRootCertificate adds a root certificate to the underlying TLS client config +func (c *Client) SetRootCertificate(certPath string) *Client { + config, err := c.tlsConfig() + if err != nil { + log.Println("[WARN] Custom transport is not allowed with a custom root CA") + return c + } + + if config.RootCAs == nil { + config.RootCAs = x509.NewCertPool() + } + + pem, err := os.ReadFile(filepath.Clean(certPath)) + if err != nil { + log.Printf("[ERROR] Failed to read root certificate at %s: %s\n", certPath, err.Error()) + return c + } + + config.RootCAs.AppendCertsFromPEM(pem) + + return c +} + +// SetToken sets the API token for all requests from this client +// Only necessary if you haven't already provided the http client to NewClient() configured with the token. +func (c *Client) SetToken(token string) *Client { + c.SetHeader("Authorization", fmt.Sprintf("Bearer %s", token)) + return c +} + +// SetRetries adds retry conditions for "Linode Busy." errors and 429s. +func (c *Client) SetRetries() *Client { + c. + AddRetryCondition(LinodeBusyRetryCondition). + AddRetryCondition(TooManyRequestsRetryCondition). + AddRetryCondition(ServiceUnavailableRetryCondition). + AddRetryCondition(RequestTimeoutRetryCondition). + AddRetryCondition(RequestGOAWAYRetryCondition). + AddRetryCondition(RequestNGINXRetryCondition). + SetRetryMaxWaitTime(APIRetryMaxWaitTime) + ConfigureRetries(c) + + return c +} + +// AddRetryCondition adds a RetryConditional function to the Client +func (c *Client) AddRetryCondition(retryCondition RetryConditional) *Client { + c.retryConditionals = append(c.retryConditionals, retryCondition) + + return c +} + +func (c *Client) SetDebug(debug bool) *Client { + c.debug = debug + + return c +} + +func (c *Client) SetLogger(logger Logger) *Client { + c.logger = logger + + return c +} + +func (c *Client) OnBeforeRequest(m func(*http.Request) error) { + c.onBeforeRequest = append(c.onBeforeRequest, m) +} + +func (c *Client) OnAfterResponse(m func(*http.Response) error) { + c.onAfterResponse = append(c.onAfterResponse, m) +} + +// UseURL parses the individual components of the given API URL and configures the client +// accordingly. For example, a valid URL. +// For example: +// +// client.UseURL("https://api.test.linode.com/v4beta") +func (c *Client) UseURL(apiURL string) (*Client, error) { + parsedURL, err := url.Parse(apiURL) + if err != nil { + return nil, fmt.Errorf("failed to parse URL: %w", err) + } + + if parsedURL.Scheme == "" || parsedURL.Host == "" { + return nil, fmt.Errorf("need both scheme and host in API URL, got %q", apiURL) + } + + // Create a new URL excluding the path to use as the base URL + baseURL := &url.URL{ + Host: parsedURL.Host, + Scheme: parsedURL.Scheme, + } + + c.SetBaseURL(baseURL.String()) + + versionMatches := regexp.MustCompile(`/v[a-zA-Z0-9]+`).FindAllString(parsedURL.Path, -1) + + // Only set the version if a version is found in the URL, else use the default + if len(versionMatches) > 0 { + c.SetAPIVersion( + strings.Trim(versionMatches[len(versionMatches)-1], "/"), + ) + } + + return c, nil +} + +func (c *Client) SetBaseURL(baseURL string) *Client { + baseURLPath, _ := url.Parse(baseURL) + + c.baseURL = path.Join(baseURLPath.Host, baseURLPath.Path) + c.apiProto = baseURLPath.Scheme + + c.updateHostURL() + + return c +} + +// SetAPIVersion sets the version of the API to interface with +func (c *Client) SetAPIVersion(apiVersion string) *Client { + c.apiVersion = apiVersion + + c.updateHostURL() + + return c +} + +// InvalidateCache clears all cached responses for all endpoints. +func (c *Client) InvalidateCache() { + c.cachedEntryLock.Lock() + defer c.cachedEntryLock.Unlock() + + // GC will handle the old map + c.cachedEntries = make(map[string]clientCacheEntry) +} + +// InvalidateCacheEndpoint invalidates a single cached endpoint. +func (c *Client) InvalidateCacheEndpoint(endpoint string) error { + u, err := url.Parse(endpoint) + if err != nil { + return fmt.Errorf("failed to parse URL for caching: %w", err) + } + + c.cachedEntryLock.Lock() + defer c.cachedEntryLock.Unlock() + + delete(c.cachedEntries, u.Path) + + return nil +} + +// SetGlobalCacheExpiration sets the desired time for any cached response +// to be valid for. +func (c *Client) SetGlobalCacheExpiration(expiryTime time.Duration) { + c.cacheExpiration = expiryTime +} + +// UseCache sets whether response caching should be used +func (c *Client) UseCache(value bool) { + c.shouldCache = value +} + +// SetRetryMaxWaitTime sets the maximum delay before retrying a request. +func (c *Client) SetRetryMaxWaitTime(maxWaitTime time.Duration) *Client { + c.retryMaxWaitTime = maxWaitTime + return c +} + +// SetRetryWaitTime sets the default (minimum) delay before retrying a request. +func (c *Client) SetRetryWaitTime(minWaitTime time.Duration) *Client { + c.retryMinWaitTime = minWaitTime + return c +} + +// SetRetryAfter sets the callback function to be invoked with a failed request +// to determine wben it should be retried. +func (c *Client) SetRetryAfter(callback RetryAfter) *Client { + c.retryAfter = callback + return c +} + +// SetRetryCount sets the maximum retry attempts before aborting. +func (c *Client) SetRetryCount(count int) *Client { + c.retryCount = count + return c +} + +// SetPollDelay sets the number of milliseconds to wait between events or status polls. +// Affects all WaitFor* functions and retries. +func (c *Client) SetPollDelay(delay time.Duration) *Client { + c.pollInterval = delay + return c +} + +// GetPollDelay gets the number of milliseconds to wait between events or status polls. +// Affects all WaitFor* functions and retries. +func (c *Client) GetPollDelay() time.Duration { + return c.pollInterval +} + +// SetHeader sets a custom header to be used in all API requests made with the current +// client. +// NOTE: Some headers may be overridden by the individual request functions. +func (c *Client) SetHeader(name, value string) { + if c.header == nil { + c.header = make(http.Header) // Initialize header if nil + } + + c.header.Set(name, value) +} + +func (c *Client) Transport() (*http.Transport, error) { + if transport, ok := c.httpClient.Transport.(*http.Transport); ok { + return transport, nil + } + + return nil, fmt.Errorf("current transport is not an *http.Transport instance") } // Generic helper to execute HTTP requests using the net/http package // -// nolint:unused, funlen, gocognit -func (c *httpClient) doRequest(ctx context.Context, method, url string, params RequestParams) error { +// nolint:funlen, gocognit, nestif +func (c *Client) doRequest(ctx context.Context, method, endpoint string, params requestParams, paginationMutator *func(*http.Request) error) error { var ( - req *http.Request - bodyBuffer *bytes.Buffer - resp *http.Response - err error + req *http.Request + resp *http.Response + err error ) - for range httpDefaultRetryCount { - req, bodyBuffer, err = c.createRequest(ctx, method, url, params) + for range c.retryCount { + // Reset the body to the start for each retry if it's not nil + if params.Body != nil { + if _, seekErr := params.Body.Seek(0, io.SeekStart); seekErr != nil { + return c.ErrorAndLogf("failed to seek to the start of the body: %v", seekErr.Error()) + } + } + + req, err = c.createRequest(ctx, method, endpoint, params) if err != nil { return err } + if paginationMutator != nil { + if mutErr := (*paginationMutator)(req); mutErr != nil { + return c.ErrorAndLogf("failed to mutate before request: %v", mutErr.Error()) + } + } + if err = c.applyBeforeRequest(req); err != nil { return err } if c.debug && c.logger != nil { - c.logRequest(req, method, url, bodyBuffer) + req = c.logRequest(req) } - processResponse := func() error { + processResponse := func(start, end time.Time) error { defer func() { closeErr := resp.Body.Close() if closeErr != nil && err == nil { @@ -273,12 +552,7 @@ func (c *httpClient) doRequest(ctx context.Context, method, url string, params R } if c.debug && c.logger != nil { - var logErr error - - resp, logErr = c.logResponse(resp) - if logErr != nil { - return logErr - } + resp = c.logResponse(resp, start, end) } if params.Response != nil { @@ -295,9 +569,12 @@ func (c *httpClient) doRequest(ctx context.Context, method, url string, params R return nil } + startTime := time.Now() resp, err = c.sendRequest(req) + endTime := time.Now() + if err == nil { - if err = processResponse(); err == nil { + if err = processResponse(startTime, endTime); err == nil { return nil } } @@ -311,19 +588,33 @@ func (c *httpClient) doRequest(ctx context.Context, method, url string, params R return retryErr } - // Sleep for the specified duration before retrying. - // If retryAfter is 0 (i.e., Retry-After header is not found), - // no delay is applied. - time.Sleep(retryAfter) + // Determine wait time before retrying. + // If the server provided a Retry-After duration, use it (clamped to bounds). + // Otherwise, fall back to the configured minimum wait time. + waitTime := c.retryMinWaitTime + + if retryAfter > 0 { + waitTime = retryAfter + } + + // Ensure the wait time is within the defined bounds + if waitTime < c.retryMinWaitTime { + waitTime = c.retryMinWaitTime + } else if waitTime > c.retryMaxWaitTime { + waitTime = c.retryMaxWaitTime + } + + // Sleep for the calculated duration before retrying + time.Sleep(waitTime) } return err } -// nolint:unused -func (c *httpClient) shouldRetry(resp *http.Response, err error) bool { +func (c *Client) shouldRetry(resp *http.Response, err error) bool { for _, retryConditional := range c.retryConditionals { if retryConditional(resp, err) { + log.Printf("[INFO] Received error %v - Retrying", err) return true } } @@ -331,35 +622,26 @@ func (c *httpClient) shouldRetry(resp *http.Response, err error) bool { return false } -// nolint:unused -func (c *httpClient) createRequest(ctx context.Context, method, url string, params RequestParams) (*http.Request, *bytes.Buffer, error) { - var ( - bodyReader io.Reader - bodyBuffer *bytes.Buffer - ) +func (c *Client) createRequest(ctx context.Context, method, endpoint string, params requestParams) (*http.Request, error) { + var bodyReader io.Reader if params.Body != nil { - bodyBuffer = new(bytes.Buffer) - if err := json.NewEncoder(bodyBuffer).Encode(params.Body); err != nil { - if c.debug && c.logger != nil { - c.logger.Errorf("failed to encode body: %v", err) - } - - return nil, nil, fmt.Errorf("failed to encode body: %w", err) + // Reset the body position to the start before using it + _, err := params.Body.Seek(0, io.SeekStart) + if err != nil { + return nil, c.ErrorAndLogf("failed to seek to the start of the body: %v", err.Error()) } - bodyReader = bodyBuffer + bodyReader = params.Body } - req, err := http.NewRequestWithContext(ctx, method, url, bodyReader) + req, err := http.NewRequestWithContext(ctx, method, fmt.Sprintf("%s/%s", strings.TrimRight(c.hostURL, "/"), + strings.TrimLeft(endpoint, "/")), bodyReader) if err != nil { - if c.debug && c.logger != nil { - c.logger.Errorf("failed to create request: %v", err) - } - - return nil, nil, fmt.Errorf("failed to create request: %w", err) + return nil, c.ErrorAndLogf("failed to create request: %v", err.Error()) } + // Set the default headers req.Header.Set("Content-Type", "application/json") req.Header.Set("Accept", "application/json") @@ -367,40 +649,43 @@ func (c *httpClient) createRequest(ctx context.Context, method, url string, para req.Header.Set("User-Agent", c.userAgent) } - return req, bodyBuffer, nil + // Set additional headers added to the client + for name, values := range c.header { + for _, value := range values { + req.Header.Set(name, value) + } + } + + // Apply per-request headers (these take priority over client headers) + for name, values := range params.Headers { + for _, value := range values { + req.Header.Set(name, value) + } + } + + return req, nil } -// nolint:unused -func (c *httpClient) applyBeforeRequest(req *http.Request) error { +func (c *Client) applyBeforeRequest(req *http.Request) error { for _, mutate := range c.onBeforeRequest { if err := mutate(req); err != nil { - if c.debug && c.logger != nil { - c.logger.Errorf("failed to mutate before request: %v", err) - } - - return fmt.Errorf("failed to mutate before request: %w", err) + return c.ErrorAndLogf("failed to mutate before request: %v", err.Error()) } } return nil } -// nolint:unused -func (c *httpClient) applyAfterResponse(resp *http.Response) error { +func (c *Client) applyAfterResponse(resp *http.Response) error { for _, mutate := range c.onAfterResponse { if err := mutate(resp); err != nil { - if c.debug && c.logger != nil { - c.logger.Errorf("failed to mutate after response: %v", err) - } - - return fmt.Errorf("failed to mutate after response: %w", err) + return c.ErrorAndLogf("failed to mutate after response: %v", err.Error()) } } return nil } -// nolint:unused func redactHeaders(headers http.Header) http.Header { redacted := headers.Clone() @@ -413,333 +698,224 @@ func redactHeaders(headers http.Header) http.Header { return redacted } -// nolint:unused -func (c *httpClient) logRequest(req *http.Request, method, url string, bodyBuffer *bytes.Buffer) { - var reqBody string - if bodyBuffer != nil { - reqBody = bodyBuffer.String() - } else { - reqBody = "nil" - } - - var logBuf bytes.Buffer +func (c *Client) logRequest(req *http.Request) *http.Request { + var reqBody bytes.Buffer + if req.Body != nil { + if _, err := io.Copy(&reqBody, req.Body); err != nil { + c.logger.Errorf("failed to read request body: %v", err) + } - err := reqLogTemplate.Execute(&logBuf, map[string]any{ - "Method": method, - "URL": url, - "Headers": redactHeaders(req.Header), - "Body": reqBody, - }) - if err == nil { - c.logger.Debugf(logBuf.String()) + req.Body = io.NopCloser(bytes.NewReader(reqBody.Bytes())) } -} -// nolint:unused -func (c *httpClient) sendRequest(req *http.Request) (*http.Response, error) { - // #nosec G704 - resp, err := c.httpClient.Do(req) - if err != nil { - if c.debug && c.logger != nil { - c.logger.Errorf("failed to send request: %v", err) - } + reqLog := &RequestLog{ + Request: strings.Join([]string{req.Method, req.URL.Path, req.Proto}, " "), + Host: req.Host, + Headers: redactHeaders(req.Header.Clone()), + Body: reqBody.String(), + } - return nil, fmt.Errorf("failed to send request: %w", err) + e := c.requestLog(reqLog) + if e != nil { + _ = c.ErrorAndLogf("failed to log request: %v", e.Error()) } - return resp, nil -} + sanitizedBody := sanitizeLogValue(reqLog.Body) -// nolint:unused -func (c *httpClient) checkHTTPError(resp *http.Response) error { - _, err := coupleAPIErrorsHTTP(resp, nil) - if err != nil { + body, jsonErr := formatBody(sanitizedBody) + if jsonErr != nil { if c.debug && c.logger != nil { - c.logger.Errorf("received HTTP error: %v", err) + c.logger.Errorf("%v", jsonErr) } - - return err - } - - return nil -} - -// nolint:unused -func (c *httpClient) logResponse(resp *http.Response) (*http.Response, error) { - var respBody bytes.Buffer - if _, err := io.Copy(&respBody, resp.Body); err != nil { - c.logger.Errorf("failed to read response body: %v", err) } var logBuf bytes.Buffer - err := respLogTemplate.Execute(&logBuf, map[string]any{ - "Status": resp.Status, - "Headers": redactHeaders(resp.Header), - "Body": respBody.String(), + err := reqLogTemplate.Execute(&logBuf, map[string]any{ + "Request": reqLog.Request, + "Host": reqLog.Host, + "Headers": formatHeaders(reqLog.Headers), + "Body": body, }) if err == nil { - c.logger.Debugf(logBuf.String()) + c.logger.Debugf(sanitizeLogValue(logBuf.String())) } - resp.Body = io.NopCloser(bytes.NewReader(respBody.Bytes())) - - return resp, nil + return req } -// nolint:unused -func (c *httpClient) decodeResponseBody(resp *http.Response, response any) error { - if err := json.NewDecoder(resp.Body).Decode(response); err != nil { - if c.debug && c.logger != nil { - c.logger.Errorf("failed to decode response: %v", err) - } +func formatHeaders(headers map[string][]string) string { + var builder strings.Builder + builder.WriteString("\n") - return fmt.Errorf("failed to decode response: %w", err) + keys := make([]string, 0, len(headers)) + for key := range headers { + keys = append(keys, key) } - return nil -} + sort.Strings(keys) -// R wraps resty's R method -func (c *Client) R(ctx context.Context) *resty.Request { - return c.resty.R(). - ExpectContentType("application/json"). - SetHeader("Content-Type", "application/json"). - SetContext(ctx). - SetError(APIError{}) -} - -// SetDebug sets the debug on resty's client -func (c *Client) SetDebug(debug bool) *Client { - c.debug = debug - c.resty.SetDebug(debug) + for _, key := range keys { + builder.WriteString(fmt.Sprintf(" %s: %s\n", key, strings.Join(headers[key], ", "))) + } - return c + return strings.TrimSuffix(builder.String(), "\n") } -// SetLogger allows the user to override the output -// logger for debug logs. -func (c *Client) SetLogger(logger Logger) *Client { - c.resty.SetLogger(logger) +// sanitizeLogValue removes or escapes control characters that could +// enable log injection (e.g., \r, \n) from a string before it is written +// to a log entry. Uses strings.ReplaceAll so static-analysis tools +// (e.g., CodeQL) can recognize the sanitization. +func sanitizeLogValue(s string) string { + s = strings.ReplaceAll(s, "\r\n", "\\n") + s = strings.ReplaceAll(s, "\r", "\\n") + s = strings.ReplaceAll(s, "\n", "\\n") - return c + return s } -//nolint:unused -func (c *httpClient) httpSetDebug(debug bool) *httpClient { - c.debug = debug +func formatBody(body string) (string, error) { + body = strings.TrimSpace(body) + if body == "null" || body == "nil" || body == "" { + return "", nil + } - return c -} + var jsonData any -//nolint:unused -func (c *httpClient) httpSetLogger(logger httpLogger) *httpClient { - c.logger = logger + err := json.Unmarshal([]byte(body), &jsonData) + if err != nil { + return "", fmt.Errorf("error unmarshalling JSON: %w", err) + } - return c -} + prettyJSON, err := json.MarshalIndent(jsonData, "", " ") + if err != nil { + return "", fmt.Errorf("error marshalling JSON: %w", err) + } -// OnBeforeRequest adds a handler to the request body to run before the request is sent -func (c *Client) OnBeforeRequest(m func(request *Request) error) { - c.resty.OnBeforeRequest(func(_ *resty.Client, req *resty.Request) error { - return m(req) - }) + return "\n" + string(prettyJSON), nil } -// OnAfterResponse adds a handler to the request body to run before the request is sent -func (c *Client) OnAfterResponse(m func(response *Response) error) { - c.resty.OnAfterResponse(func(_ *resty.Client, req *resty.Response) error { - return m(req) - }) -} +func formatDate(dateStr string) (string, error) { + parsedTime, err := time.Parse(time.RFC1123, dateStr) + if err != nil { + return "", fmt.Errorf("error parsing date: %v", err) + } -// nolint:unused -func (c *httpClient) httpOnBeforeRequest(m func(*http.Request) error) *httpClient { - c.onBeforeRequest = append(c.onBeforeRequest, m) + formattedDate := parsedTime.In(time.Local).Format("2006-01-02T15:04:05-07:00") // nolint:gosmopolitan - return c + return formattedDate, nil } -// nolint:unused -func (c *httpClient) httpOnAfterResponse(m func(*http.Response) error) *httpClient { - c.onAfterResponse = append(c.onAfterResponse, m) +func (c *Client) sendRequest(req *http.Request) (*http.Response, error) { + resp, err := c.httpClient.Do(req) //#nosec G704 // URL is constructed from client-configured base URL + endpoint + if err != nil { + return nil, c.ErrorAndLogf("failed to send request: %w", err) + } - return c + return resp, nil } -// UseURL parses the individual components of the given API URL and configures the client -// accordingly. For example, a valid URL. -// For example: -// -// client.UseURL("https://api.test.linode.com/v4beta") -func (c *Client) UseURL(apiURL string) (*Client, error) { - parsedURL, err := url.Parse(apiURL) +func (c *Client) checkHTTPError(resp *http.Response) error { + _, err := coupleAPIErrors(resp, nil) if err != nil { - return nil, fmt.Errorf("failed to parse URL: %w", err) + _ = c.ErrorAndLogf("received HTTP error: %v", err.Error()) + return err } - if parsedURL.Scheme == "" || parsedURL.Host == "" { - return nil, fmt.Errorf("need both scheme and host in API URL, got %q", apiURL) - } + return nil +} - // Create a new URL excluding the path to use as the base URL - baseURL := &url.URL{ - Host: parsedURL.Host, - Scheme: parsedURL.Scheme, +func (c *Client) logResponse(resp *http.Response, start, end time.Time) *http.Response { + var respBody bytes.Buffer + if _, err := io.Copy(&respBody, resp.Body); err != nil { + c.logger.Errorf("failed to read response body: %v", err) } - c.SetBaseURL(baseURL.String()) - - versionMatches := regexp.MustCompile(`/v[a-zA-Z0-9]+`).FindAllString(parsedURL.Path, -1) - - // Only set the version if a version is found in the URL, else use the default - if len(versionMatches) > 0 { - c.SetAPIVersion( - strings.Trim(versionMatches[len(versionMatches)-1], "/"), - ) + receivedAt, dateErr := formatDate(resp.Header.Get("Date")) + if dateErr != nil { + if c.debug && c.logger != nil { + c.logger.Errorf("failed to format date: %v", dateErr) + } } - return c, nil -} - -// SetBaseURL sets the base URL of the Linode v4 API (https://api.linode.com/v4) -func (c *Client) SetBaseURL(baseURL string) *Client { - baseURLPath, _ := url.Parse(baseURL) - - c.baseURL = path.Join(baseURLPath.Host, baseURLPath.Path) - c.apiProto = baseURLPath.Scheme - - c.updateHostURL() - - return c -} - -// SetAPIVersion sets the version of the API to interface with -func (c *Client) SetAPIVersion(apiVersion string) *Client { - c.apiVersion = apiVersion + duration := end.Sub(start).String() - c.updateHostURL() - - return c -} - -// SetRootCertificate adds a root certificate to the underlying TLS client config -func (c *Client) SetRootCertificate(path string) *Client { - c.resty.SetRootCertificate(path) - return c -} - -// SetToken sets the API token for all requests from this client -// Only necessary if you haven't already provided the http client to NewClient() configured with the token. -func (c *Client) SetToken(token string) *Client { - c.resty.SetHeader("Authorization", fmt.Sprintf("Bearer %s", token)) - return c -} + respLog := &ResponseLog{ + Status: resp.Status, + Proto: resp.Proto, + ReceivedAt: receivedAt, + TimeDuration: duration, + Headers: resp.Header, + Body: respBody.String(), + } -// SetRetries adds retry conditions for "Linode Busy." errors and 429s. -func (c *Client) SetRetries() *Client { - c. - addRetryConditional(linodeBusyRetryCondition). - addRetryConditional(tooManyRequestsRetryCondition). - addRetryConditional(serviceUnavailableRetryCondition). - addRetryConditional(requestTimeoutRetryCondition). - addRetryConditional(requestGOAWAYRetryCondition). - addRetryConditional(requestNGINXRetryCondition). - SetRetryMaxWaitTime(APIRetryMaxWaitTime) - configureRetries(c) + body, jsonErr := formatBody(sanitizeLogValue(respLog.Body)) + if jsonErr != nil { + if c.debug && c.logger != nil { + c.logger.Errorf("%v", jsonErr) + } + } - return c -} + var logBuf bytes.Buffer -// AddRetryCondition adds a RetryConditional function to the Client -func (c *Client) AddRetryCondition(retryCondition RetryConditional) *Client { - c.resty.AddRetryCondition(resty.RetryConditionFunc(retryCondition)) - return c -} + err := respLogTemplate.Execute(&logBuf, map[string]any{ + "Status": respLog.Status, + "Proto": respLog.Proto, + "ReceivedAt": respLog.ReceivedAt, + "TimeDuration": respLog.TimeDuration, + "Headers": formatHeaders(redactHeaders(respLog.Headers)), + "Body": body, + }) + if err == nil { + c.logger.Debugf(sanitizeLogValue(logBuf.String())) + } -// InvalidateCache clears all cached responses for all endpoints. -func (c *Client) InvalidateCache() { - c.cachedEntryLock.Lock() - defer c.cachedEntryLock.Unlock() + resp.Body = io.NopCloser(bytes.NewReader(respBody.Bytes())) - // GC will handle the old map - c.cachedEntries = make(map[string]clientCacheEntry) + return resp } -// InvalidateCacheEndpoint invalidates a single cached endpoint. -func (c *Client) InvalidateCacheEndpoint(endpoint string) error { - u, err := url.Parse(endpoint) - if err != nil { - return fmt.Errorf("failed to parse URL for caching: %w", err) +func (c *Client) decodeResponseBody(resp *http.Response, response any) error { + if err := json.NewDecoder(resp.Body).Decode(response); err != nil { + return c.ErrorAndLogf("failed to decode response: %v", err.Error()) } - c.cachedEntryLock.Lock() - defer c.cachedEntryLock.Unlock() - - delete(c.cachedEntries, u.Path) - return nil } -// SetGlobalCacheExpiration sets the desired time for any cached response -// to be valid for. -func (c *Client) SetGlobalCacheExpiration(expiryTime time.Duration) { - c.cacheExpiration = expiryTime -} - -// UseCache sets whether response caching should be used -func (c *Client) UseCache(value bool) { - c.shouldCache = value -} - -// SetRetryMaxWaitTime sets the maximum delay before retrying a request. -func (c *Client) SetRetryMaxWaitTime(maxWaitTime time.Duration) *Client { - c.resty.SetRetryMaxWaitTime(maxWaitTime) - return c -} +func (c *Client) updateHostURL() { + apiProto := APIProto + baseURL := APIHost + apiVersion := APIVersion -// SetRetryWaitTime sets the default (minimum) delay before retrying a request. -func (c *Client) SetRetryWaitTime(minWaitTime time.Duration) *Client { - c.resty.SetRetryWaitTime(minWaitTime) - return c -} + if c.baseURL != "" { + baseURL = c.baseURL + } -// SetRetryAfter sets the callback function to be invoked with a failed request -// to determine wben it should be retried. -func (c *Client) SetRetryAfter(callback RetryAfter) *Client { - c.resty.SetRetryAfter(resty.RetryAfterFunc(callback)) - return c -} + if c.apiVersion != "" { + apiVersion = c.apiVersion + } -// SetRetryCount sets the maximum retry attempts before aborting. -func (c *Client) SetRetryCount(count int) *Client { - c.resty.SetRetryCount(count) - return c -} + if c.apiProto != "" { + apiProto = c.apiProto + } -// SetPollDelay sets the number of milliseconds to wait between events or status polls. -// Affects all WaitFor* functions and retries. -func (c *Client) SetPollDelay(delay time.Duration) *Client { - c.pollInterval = delay - return c + c.hostURL = strings.TrimRight(fmt.Sprintf("%s://%s/%s", apiProto, baseURL, url.PathEscape(apiVersion)), "/") } -// GetPollDelay gets the number of milliseconds to wait between events or status polls. -// Affects all WaitFor* functions and retries. -func (c *Client) GetPollDelay() time.Duration { - return c.pollInterval -} +func (c *Client) tlsConfig() (*tls.Config, error) { + transport, err := c.Transport() + if err != nil { + return nil, err + } -// SetHeader sets a custom header to be used in all API requests made with the current -// client. -// NOTE: Some headers may be overridden by the individual request functions. -func (c *Client) SetHeader(name, value string) { - c.resty.SetHeader(name, value) -} + if transport.TLSClientConfig == nil { + transport.TLSClientConfig = &tls.Config{ + MinVersion: tls.VersionTLS12, + } + } -func (c *Client) addRetryConditional(retryConditional RetryConditional) *Client { - c.retryConditionals = append(c.retryConditionals, retryConditional) - return c + return transport.TLSClientConfig, nil } func (c *Client) addCachedResponse(endpoint string, response any, expiry *time.Duration) { @@ -819,49 +995,25 @@ func (c *Client) getCachedResponse(endpoint string) any { return c.cachedEntries[endpoint].Data } -func (c *Client) updateHostURL() { - apiProto := APIProto - baseURL := APIHost - apiVersion := APIVersion - - if c.baseURL != "" { - baseURL = c.baseURL +func (c *Client) onRequestLog(rl func(*RequestLog) error) *Client { + if c.requestLog != nil { + c.logger.Warnf("Overwriting an existing on-request-log callback from=%s to=%s", + functionName(c.requestLog), functionName(rl)) } - if c.apiVersion != "" { - apiVersion = c.apiVersion - } + c.requestLog = rl - if c.apiProto != "" { - apiProto = c.apiProto - } - - c.resty.SetBaseURL( - fmt.Sprintf( - "%s://%s/%s", - apiProto, - baseURL, - url.PathEscape(apiVersion), - ), - ) + return c } -func redactLogHeaders(header http.Header) { - for h, redactedValue := range redactHeadersMap { - if header.Get(h) != "" { - header.Set(h, redactedValue) - } - } +func functionName(i any) string { + return runtime.FuncForPC(reflect.ValueOf(i).Pointer()).Name() } func (c *Client) enableLogSanitization() *Client { - c.resty.OnRequestLog(func(r *resty.RequestLog) error { - redactLogHeaders(r.Header) - return nil - }) - - c.resty.OnResponseLog(func(r *resty.ResponseLog) error { - redactLogHeaders(r.Header) + c.onRequestLog(func(r *RequestLog) error { + // masking authorization header + r.Headers.Set("Authorization", "Bearer *******************************") return nil }) @@ -958,16 +1110,3 @@ func generateListCacheURL(endpoint string, opts *ListOptions) (string, error) { return fmt.Sprintf("%s:%s", endpoint, hashedOpts), nil } - -func hasCustomTransport(hc *http.Client) bool { - if hc == nil || hc.Transport == nil { - return false - } - - if _, ok := hc.Transport.(*http.Transport); !ok { - log.Println("[WARN] Custom transport is not allowed with a custom root CA.") - return true - } - - return false -} diff --git a/client_http.go b/client_http.go deleted file mode 100644 index 7f16362c5..000000000 --- a/client_http.go +++ /dev/null @@ -1,56 +0,0 @@ -package linodego - -import ( - "net/http" - "sync" - "time" -) - -// Client is a wrapper around the Resty client -// -//nolint:unused -type httpClient struct { - //nolint:unused - httpClient *http.Client - //nolint:unused - userAgent string - //nolint:unused - debug bool - //nolint:unused - retryConditionals []httpRetryConditional - //nolint:unused - retryAfter httpRetryAfter - - //nolint:unused - pollInterval time.Duration - - //nolint:unused - baseURL string - //nolint:unused - apiVersion string - //nolint:unused - apiProto string - //nolint:unused - selectedProfile string - //nolint:unused - loadedProfile string - - //nolint:unused - configProfiles map[string]ConfigProfile - - // Fields for caching endpoint responses - //nolint:unused - shouldCache bool - //nolint:unused - cacheExpiration time.Duration - //nolint:unused - cachedEntries map[string]clientCacheEntry - //nolint:unused - cachedEntryLock *sync.RWMutex - //nolint:unused - logger httpLogger - //nolint:unused - onBeforeRequest []func(*http.Request) error - //nolint:unused - onAfterResponse []func(*http.Response) error -} diff --git a/client_monitor.go b/client_monitor.go index b54dc8284..3cb959854 100644 --- a/client_monitor.go +++ b/client_monitor.go @@ -2,13 +2,17 @@ package linodego import ( "context" + "crypto/tls" + "crypto/x509" + "encoding/json" "fmt" + "io" "net/http" "net/url" "os" "path" - - "github.com/go-resty/resty/v2" + "path/filepath" + "strings" ) const ( @@ -24,25 +28,36 @@ const ( MonitorAPIEnvVar = "MONITOR_API_TOKEN" ) -// MonitorClient is a wrapper around the Resty client +// MonitorClient is a wrapper around the http client type MonitorClient struct { - resty *resty.Client + httpClient *http.Client debug bool apiBaseURL string apiProtocol string apiVersion string + hostURL string userAgent string + header http.Header + logger Logger } // NewMonitorClient is the entry point for user to create a new MonitorClient // It utilizes default values and looks for environment variables to initialize a MonitorClient. func NewMonitorClient(hc *http.Client) (mClient MonitorClient) { if hc != nil { - mClient.resty = resty.NewWithClient(hc) + mClient.httpClient = hc } else { - mClient.resty = resty.New() + mClient.httpClient = &http.Client{} + } + + // Ensure transport is initialized so SetRootCertificate can configure TLS + if mClient.httpClient.Transport == nil { + mClient.httpClient.Transport = &http.Transport{} } + mClient.header = make(http.Header) + mClient.logger = createLogger() + mClient.SetUserAgent(DefaultUserAgent) baseURL, baseURLExists := os.LookupEnv(MonitorAPIHostVar) @@ -72,24 +87,14 @@ func NewMonitorClient(hc *http.Client) (mClient MonitorClient) { // SetUserAgent sets a custom user-agent for HTTP requests func (mc *MonitorClient) SetUserAgent(ua string) *MonitorClient { mc.userAgent = ua - mc.resty.SetHeader("User-Agent", mc.userAgent) + mc.header.Set("User-Agent", ua) return mc } -// R wraps resty's R method -func (mc *MonitorClient) R(ctx context.Context) *resty.Request { - return mc.resty.R(). - ExpectContentType("application/json"). - SetHeader("Content-Type", "application/json"). - SetContext(ctx). - SetError(APIError{}) -} - -// SetDebug sets the debug on resty's client +// SetDebug sets the debug on the client func (mc *MonitorClient) SetDebug(debug bool) *MonitorClient { mc.debug = debug - mc.resty.SetDebug(debug) return mc } @@ -97,7 +102,7 @@ func (mc *MonitorClient) SetDebug(debug bool) *MonitorClient { // SetLogger allows the user to override the output // logger for debug logs. func (mc *MonitorClient) SetLogger(logger Logger) *MonitorClient { - mc.resty.SetLogger(logger) + mc.logger = logger return mc } @@ -124,21 +129,44 @@ func (mc *MonitorClient) SetAPIVersion(apiVersion string) *MonitorClient { } // SetRootCertificate adds a root certificate to the underlying TLS client config -func (mc *MonitorClient) SetRootCertificate(path string) *MonitorClient { - mc.resty.SetRootCertificate(path) +func (mc *MonitorClient) SetRootCertificate(certPath string) *MonitorClient { + transport, ok := mc.httpClient.Transport.(*http.Transport) + if !ok { + mc.logger.Errorf("current transport is not an *http.Transport instance") + return mc + } + + if transport.TLSClientConfig == nil { + transport.TLSClientConfig = &tls.Config{ + MinVersion: tls.VersionTLS12, + } + } + + if transport.TLSClientConfig.RootCAs == nil { + transport.TLSClientConfig.RootCAs = x509.NewCertPool() + } + + pem, err := os.ReadFile(filepath.Clean(certPath)) + if err != nil { + mc.logger.Errorf("Failed to read root certificate at %s: %s", certPath, err.Error()) + return mc + } + + transport.TLSClientConfig.RootCAs.AppendCertsFromPEM(pem) + return mc } // SetToken sets the API token for all requests from this client func (mc *MonitorClient) SetToken(token string) *MonitorClient { - mc.resty.SetHeader("Authorization", fmt.Sprintf("Bearer %s", token)) + mc.header.Set("Authorization", fmt.Sprintf("Bearer %s", token)) return mc } // SetHeader sets a custom header to be used in all API requests made with the current client. // NOTE: Some headers may be overridden by the individual request functions. func (mc *MonitorClient) SetHeader(name, value string) { - mc.resty.SetHeader(name, value) + mc.header.Set(name, value) } func (mc *MonitorClient) updateMonitorHostURL() { @@ -158,12 +186,66 @@ func (mc *MonitorClient) updateMonitorHostURL() { apiProto = mc.apiProtocol } - mc.resty.SetBaseURL( - fmt.Sprintf( - "%s://%s/%s", - apiProto, - baseURL, - url.PathEscape(apiVersion), - ), + mc.hostURL = fmt.Sprintf( + "%s://%s/%s", + apiProto, + baseURL, + url.PathEscape(apiVersion), ) } + +// doRequest is a generic helper to execute HTTP requests for the MonitorClient +func (mc *MonitorClient) doRequest(ctx context.Context, method, endpoint string, params requestParams) error { + var bodyReader io.Reader + + if params.Body != nil { + if _, err := params.Body.Seek(0, io.SeekStart); err != nil { + return fmt.Errorf("failed to seek body: %w", err) + } + + bodyReader = params.Body + } + + reqURL := fmt.Sprintf("%s/%s", strings.TrimRight(mc.hostURL, "/"), strings.TrimLeft(endpoint, "/")) + + req, err := http.NewRequestWithContext(ctx, method, reqURL, bodyReader) + if err != nil { + return fmt.Errorf("failed to create request: %w", err) + } + + req.Header.Set("Content-Type", "application/json") + req.Header.Set("Accept", "application/json") + + for name, values := range mc.header { + for _, value := range values { + req.Header.Set(name, value) + } + } + + if mc.debug && mc.logger != nil { + mc.logger.Debugf("Sending request: %s %s", method, reqURL) + } + + resp, err := mc.httpClient.Do(req) + if err != nil { + return fmt.Errorf("failed to send request: %w", err) + } + defer resp.Body.Close() + + _, err = coupleAPIErrors(resp, nil) + if err != nil { + return err + } + + if mc.debug && mc.logger != nil { + mc.logger.Debugf("Received response: %s", resp.Status) + } + + if params.Response != nil { + if err := json.NewDecoder(resp.Body).Decode(params.Response); err != nil { + return fmt.Errorf("failed to decode response: %w", err) + } + } + + return nil +} diff --git a/client_test.go b/client_test.go index f925f3678..da4997c17 100644 --- a/client_test.go +++ b/client_test.go @@ -37,39 +37,39 @@ func TestClient_SetAPIVersion(t *testing.T) { client := NewClient(nil) - if client.resty.BaseURL != defaultURL { - t.Fatal(cmp.Diff(client.resty.BaseURL, defaultURL)) + if client.hostURL != defaultURL { + t.Fatal(cmp.Diff(client.hostURL, defaultURL)) } client.SetBaseURL(baseURL) client.SetAPIVersion(apiVersion) - if client.resty.BaseURL != expectedHost { - t.Fatal(cmp.Diff(client.resty.BaseURL, expectedHost)) + if client.hostURL != expectedHost { + t.Fatal(cmp.Diff(client.hostURL, expectedHost)) } // Ensure setting twice does not cause conflicts client.SetBaseURL(updatedBaseURL) client.SetAPIVersion(updatedAPIVersion) - if client.resty.BaseURL != updatedExpectedHost { - t.Fatal(cmp.Diff(client.resty.BaseURL, updatedExpectedHost)) + if client.hostURL != updatedExpectedHost { + t.Fatal(cmp.Diff(client.hostURL, updatedExpectedHost)) } // Revert client.SetBaseURL(baseURL) client.SetAPIVersion(apiVersion) - if client.resty.BaseURL != expectedHost { - t.Fatal(cmp.Diff(client.resty.BaseURL, expectedHost)) + if client.hostURL != expectedHost { + t.Fatal(cmp.Diff(client.hostURL, expectedHost)) } // Custom protocol client.SetBaseURL(protocolBaseURL) client.SetAPIVersion(protocolAPIVersion) - if client.resty.BaseURL != protocolExpectedHost { - t.Fatal(cmp.Diff(client.resty.BaseURL, expectedHost)) + if client.hostURL != protocolExpectedHost { + t.Fatal(cmp.Diff(client.hostURL, expectedHost)) } } @@ -111,7 +111,7 @@ func TestClient_NewFromEnvToken(t *testing.T) { t.Fatal(err) } - if client.resty.Header.Get("Authorization") != "Bearer blah" { + if client.header.Get("Authorization") != "Bearer blah" { t.Fatal("token not found in auth header: blah") } } @@ -171,8 +171,8 @@ func TestClient_UseURL(t *testing.T) { t.Fatalf("unexpected error: %v", err) } - if client.resty.BaseURL != tt.wantBaseURL { - t.Fatalf("mismatched base url: got %s, want %s", client.resty.BaseURL, tt.wantBaseURL) + if client.hostURL != tt.wantBaseURL { + t.Fatalf("mismatched base url: got %s, want %s", client.hostURL, tt.wantBaseURL) } }) } @@ -209,12 +209,12 @@ func TestDebugLogSanitization(t *testing.T) { logger.L.SetOutput(&lgr) mockClient.SetDebug(true) - if !mockClient.resty.Debug { + if !mockClient.debug { t.Fatal("debug should be enabled") } mockClient.SetHeader("Authorization", fmt.Sprintf("Bearer %s", plainTextToken)) - if mockClient.resty.Header.Get("Authorization") != fmt.Sprintf("Bearer %s", plainTextToken) { + if mockClient.header.Get("Authorization") != fmt.Sprintf("Bearer %s", plainTextToken) { t.Fatal("token not found in auth header") } @@ -242,22 +242,25 @@ func TestDebugLogSanitization(t *testing.T) { func TestDoRequest_Success(t *testing.T) { handler := func(w http.ResponseWriter, r *http.Request) { - w.WriteHeader(http.StatusOK) - w.Header().Set("Content-Type", "application/json") - _, _ = w.Write([]byte(`{"message":"success"}`)) + if r.URL.Path == "/v4/foo/bar" { + w.WriteHeader(http.StatusOK) + w.Header().Set("Content-Type", "application/json") + _, _ = w.Write([]byte(`{"message":"success"}`)) + } else { + http.NotFound(w, r) + } } server := httptest.NewServer(http.HandlerFunc(handler)) defer server.Close() - client := &httpClient{ - httpClient: server.Client(), - } + client := NewClient(server.Client()) + client.SetBaseURL(server.URL) - params := RequestParams{ + params := requestParams{ Response: &map[string]string{}, } - err := client.doRequest(context.Background(), http.MethodGet, server.URL, params) + err := client.doRequest(context.Background(), http.MethodGet, "/foo/bar", params, nil) // Pass only the endpoint if err != nil { t.Fatal(cmp.Diff(nil, err)) } @@ -269,31 +272,11 @@ func TestDoRequest_Success(t *testing.T) { } } -func TestDoRequest_FailedEncodeBody(t *testing.T) { - client := &httpClient{ - httpClient: http.DefaultClient, - } - - params := RequestParams{ - Body: map[string]interface{}{ - "invalid": func() {}, - }, - } - - err := client.doRequest(context.Background(), http.MethodPost, "http://example.com", params) - expectedErr := "failed to encode body" - if err == nil || !strings.Contains(err.Error(), expectedErr) { - t.Fatalf("expected error %q, got: %v", expectedErr, err) - } -} - func TestDoRequest_FailedCreateRequest(t *testing.T) { - client := &httpClient{ - httpClient: http.DefaultClient, - } + client := NewClient(nil) - // Create a request with an invalid URL to simulate a request creation failure - err := client.doRequest(context.Background(), http.MethodGet, "http://invalid url", RequestParams{}) + // Create a request with an invalid method to simulate a request creation failure + err := client.doRequest(context.Background(), "bad method", "/foo/bar", requestParams{}, nil) expectedErr := "failed to create request" if err == nil || !strings.Contains(err.Error(), expectedErr) { t.Fatalf("expected error %q, got: %v", expectedErr, err) @@ -302,26 +285,28 @@ func TestDoRequest_FailedCreateRequest(t *testing.T) { func TestDoRequest_Non2xxStatusCode(t *testing.T) { handler := func(w http.ResponseWriter, r *http.Request) { - http.Error(w, "error", http.StatusInternalServerError) + http.Error(w, "error", http.StatusInternalServerError) // Simulate a 500 Internal Server Error } server := httptest.NewServer(http.HandlerFunc(handler)) defer server.Close() - client := &httpClient{ - httpClient: server.Client(), - } + client := NewClient(server.Client()) + client.SetBaseURL(server.URL) - err := client.doRequest(context.Background(), http.MethodGet, server.URL, RequestParams{}) + err := client.doRequest(context.Background(), http.MethodGet, "/foo/bar", requestParams{}, nil) if err == nil { t.Fatal("expected error, got nil") } - httpError, ok := err.(Error) + + httpError, ok := err.(*Error) if !ok { t.Fatalf("expected error to be of type Error, got %T", err) } + if httpError.Code != http.StatusInternalServerError { t.Fatalf("expected status code %d, got %d", http.StatusInternalServerError, httpError.Code) } + if !strings.Contains(httpError.Message, "error") { t.Fatalf("expected error message to contain %q, got %v", "error", httpError.Message) } @@ -331,21 +316,21 @@ func TestDoRequest_FailedDecodeResponse(t *testing.T) { handler := func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) w.Header().Set("Content-Type", "application/json") - _, _ = w.Write([]byte(`invalid json`)) + _, _ = w.Write([]byte(`invalid json`)) // Simulate invalid JSON } server := httptest.NewServer(http.HandlerFunc(handler)) defer server.Close() - client := &httpClient{ - httpClient: server.Client(), - } + client := NewClient(server.Client()) + client.SetBaseURL(server.URL) - params := RequestParams{ + params := requestParams{ Response: &map[string]string{}, } - err := client.doRequest(context.Background(), http.MethodGet, server.URL, params) + err := client.doRequest(context.Background(), http.MethodGet, "/foo/bar", params, nil) expectedErr := "failed to decode response" + if err == nil || !strings.Contains(err.Error(), expectedErr) { t.Fatalf("expected error %q, got: %v", expectedErr, err) } @@ -363,24 +348,21 @@ func TestDoRequest_BeforeRequestSuccess(t *testing.T) { server := httptest.NewServer(http.HandlerFunc(handler)) defer server.Close() - client := &httpClient{ - httpClient: server.Client(), - } + client := NewClient(server.Client()) + client.SetBaseURL(server.URL) - // Define a mutator that successfully modifies the request mutator := func(req *http.Request) error { req.Header.Set("X-Custom-Header", "CustomValue") return nil } - client.httpOnBeforeRequest(mutator) + client.OnBeforeRequest(mutator) - err := client.doRequest(context.Background(), http.MethodGet, server.URL, RequestParams{}) + err := client.doRequest(context.Background(), http.MethodGet, "/foo/bar", requestParams{}, nil) if err != nil { t.Fatalf("expected no error, got: %v", err) } - // Check if the header was successfully added to the captured request if reqHeader := capturedRequest.Header.Get("X-Custom-Header"); reqHeader != "CustomValue" { t.Fatalf("expected X-Custom-Header to be set to CustomValue, got: %v", reqHeader) } @@ -395,18 +377,18 @@ func TestDoRequest_BeforeRequestError(t *testing.T) { server := httptest.NewServer(http.HandlerFunc(handler)) defer server.Close() - client := &httpClient{ - httpClient: server.Client(), - } + client := NewClient(server.Client()) + client.SetBaseURL(server.URL) mutator := func(req *http.Request) error { return errors.New("mutator error") } - client.httpOnBeforeRequest(mutator) + client.OnBeforeRequest(mutator) - err := client.doRequest(context.Background(), http.MethodGet, server.URL, RequestParams{}) + err := client.doRequest(context.Background(), http.MethodGet, "/foo/bar", requestParams{}, nil) expectedErr := "failed to mutate before request" + if err == nil || !strings.Contains(err.Error(), expectedErr) { t.Fatalf("expected error %q, got: %v", expectedErr, err) } @@ -425,23 +407,21 @@ func TestDoRequest_AfterResponseSuccess(t *testing.T) { tr := &testRoundTripper{ Transport: server.Client().Transport, } - client := &httpClient{ - httpClient: &http.Client{Transport: tr}, - } + client := NewClient(&http.Client{Transport: tr}) + client.SetBaseURL(server.URL) mutator := func(resp *http.Response) error { resp.Header.Set("X-Modified-Header", "ModifiedValue") return nil } - client.httpOnAfterResponse(mutator) + client.OnAfterResponse(mutator) - err := client.doRequest(context.Background(), http.MethodGet, server.URL, RequestParams{}) + err := client.doRequest(context.Background(), http.MethodGet, "/foo/bar", requestParams{}, nil) if err != nil { t.Fatalf("expected no error, got: %v", err) } - // Check if the header was successfully added to the response if respHeader := tr.Response.Header.Get("X-Modified-Header"); respHeader != "ModifiedValue" { t.Fatalf("expected X-Modified-Header to be set to ModifiedValue, got: %v", respHeader) } @@ -456,17 +436,16 @@ func TestDoRequest_AfterResponseError(t *testing.T) { server := httptest.NewServer(http.HandlerFunc(handler)) defer server.Close() - client := &httpClient{ - httpClient: server.Client(), - } + client := NewClient(server.Client()) + client.SetBaseURL(server.URL) mutator := func(resp *http.Response) error { return errors.New("mutator error") } - client.httpOnAfterResponse(mutator) + client.OnAfterResponse(mutator) - err := client.doRequest(context.Background(), http.MethodGet, server.URL, RequestParams{}) + err := client.doRequest(context.Background(), http.MethodGet, "/foo/bar", requestParams{}, nil) expectedErr := "failed to mutate after response" if err == nil || !strings.Contains(err.Error(), expectedErr) { t.Fatalf("expected error %q, got: %v", expectedErr, err) @@ -478,11 +457,9 @@ func TestDoRequestLogging_Success(t *testing.T) { logger := createLogger() logger.l.SetOutput(&logBuffer) // Redirect log output to buffer - client := &httpClient{ - httpClient: http.DefaultClient, - debug: true, - logger: logger, - } + client := NewClient(nil) + client.SetDebug(true) + client.SetLogger(logger) handler := func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) @@ -490,29 +467,46 @@ func TestDoRequestLogging_Success(t *testing.T) { _, _ = w.Write([]byte(`{"message":"success"}`)) } server := httptest.NewServer(http.HandlerFunc(handler)) + client.SetBaseURL(server.URL) defer server.Close() - params := RequestParams{ + params := requestParams{ Response: &map[string]string{}, } + endpoint := "/foo/bar" - err := client.doRequest(context.Background(), http.MethodGet, server.URL, params) + err := client.doRequest(context.Background(), http.MethodGet, endpoint, params, nil) if err != nil { t.Fatal(cmp.Diff(nil, err)) } logInfo := logBuffer.String() - logInfoWithoutTimestamps := removeTimestamps(logInfo) - // Expected logs with templates filled in - expectedRequestLog := "DEBUG RESTY Sending request:\nMethod: GET\nURL: " + server.URL + "\nHeaders: map[Accept:[application/json] Content-Type:[application/json]]\nBody: " - expectedResponseLog := "DEBUG RESTY Received response:\nStatus: 200 OK\nHeaders: map[Content-Length:[21] Content-Type:[text/plain; charset=utf-8]]\nBody: {\"message\":\"success\"}" + expectedRequestParts := []string{ + "GET /v4/foo/bar HTTP/1.1", + "Accept: application/json", + "Authorization: Bearer *******************************", + "Content-Type: application/json", + "User-Agent: linodego/dev https://github.com/linode/linodego", + } - if !strings.Contains(logInfo, expectedRequestLog) { - t.Fatalf("expected log %q not found in logs", expectedRequestLog) + expectedResponseParts := []string{ + "STATUS: 200 OK", + "PROTO: HTTP/1.1", + "Content-Length: 21", + "Content-Type: application/json", + `"message": "success"`, } - if !strings.Contains(logInfoWithoutTimestamps, expectedResponseLog) { - t.Fatalf("expected log %q not found in logs", expectedResponseLog) + + for _, part := range expectedRequestParts { + if !strings.Contains(logInfo, part) { + t.Fatalf("expected request part %q not found in logs", part) + } + } + for _, part := range expectedResponseParts { + if !strings.Contains(logInfo, part) { + t.Fatalf("expected response part %q not found in logs", part) + } } } @@ -521,26 +515,19 @@ func TestDoRequestLogging_Error(t *testing.T) { logger := createLogger() logger.l.SetOutput(&logBuffer) // Redirect log output to buffer - client := &httpClient{ - httpClient: http.DefaultClient, - debug: true, - logger: logger, - } - - params := RequestParams{ - Body: map[string]interface{}{ - "invalid": func() {}, - }, - } + client := NewClient(nil) + client.SetDebug(true) + client.SetLogger(logger) - err := client.doRequest(context.Background(), http.MethodPost, "http://example.com", params) - expectedErr := "failed to encode body" + // Create a request with an invalid method to simulate a request creation failure + err := client.doRequest(context.Background(), "bad method", "/foo/bar", requestParams{}, nil) + expectedErr := "failed to create request" if err == nil || !strings.Contains(err.Error(), expectedErr) { t.Fatalf("expected error %q, got: %v", expectedErr, err) } logInfo := logBuffer.String() - expectedLog := "ERROR RESTY failed to encode body" + expectedLog := "ERROR failed to create request" if !strings.Contains(logInfo, expectedLog) { t.Fatalf("expected log %q not found in logs", expectedLog) @@ -638,9 +625,9 @@ func TestClient_CustomRootCAWithoutCustomRoundTripper(t *testing.T) { } client := NewClient(test.httpClient) - transport, err := client.resty.Transport() - if err != nil { - t.Fatal(err) + transport, ok := client.httpClient.Transport.(*http.Transport) + if !ok { + t.Fatal("expected *http.Transport") } if test.setCA && (transport.TLSClientConfig == nil || transport.TLSClientConfig.RootCAs == nil) { t.Error("expected root CAs to be set") @@ -669,39 +656,39 @@ func TestMonitorClient_SetAPIBasics(t *testing.T) { client := NewMonitorClient(nil) - if client.resty.BaseURL != defaultURL { - t.Fatal(cmp.Diff(client.resty.BaseURL, defaultURL)) + if client.hostURL != defaultURL { + t.Fatal(cmp.Diff(client.hostURL, defaultURL)) } client.SetBaseURL(baseURL) client.SetAPIVersion(apiVersion) - if client.resty.BaseURL != expectedHost { - t.Fatal(cmp.Diff(client.resty.BaseURL, expectedHost)) + if client.hostURL != expectedHost { + t.Fatal(cmp.Diff(client.hostURL, expectedHost)) } // Ensure setting twice does not cause conflicts client.SetBaseURL(updatedBaseURL) client.SetAPIVersion(updatedAPIVersion) - if client.resty.BaseURL != updatedExpectedHost { - t.Fatal(cmp.Diff(client.resty.BaseURL, updatedExpectedHost)) + if client.hostURL != updatedExpectedHost { + t.Fatal(cmp.Diff(client.hostURL, updatedExpectedHost)) } // Revert client.SetBaseURL(baseURL) client.SetAPIVersion(apiVersion) - if client.resty.BaseURL != expectedHost { - t.Fatal(cmp.Diff(client.resty.BaseURL, expectedHost)) + if client.hostURL != expectedHost { + t.Fatal(cmp.Diff(client.hostURL, expectedHost)) } // Custom protocol client.SetBaseURL(protocolBaseURL) client.SetAPIVersion(protocolAPIVersion) - if client.resty.BaseURL != protocolExpectedHost { - t.Fatal(cmp.Diff(client.resty.BaseURL, expectedHost)) + if client.hostURL != protocolExpectedHost { + t.Fatal(cmp.Diff(client.hostURL, expectedHost)) } } @@ -787,7 +774,7 @@ func TestEnableLogSanitization(t *testing.T) { "Authorization": []string{"Bearer " + plainTextToken}, })) - _, err := mockClient.resty.R().Get("https://api.linode.com/v4/test") + err := mockClient.doRequest(context.Background(), http.MethodGet, "/test", requestParams{}, nil) require.NoError(t, err) logOutput := logBuf.String() diff --git a/config_test.go b/config_test.go index b4b3db418..628cc1415 100644 --- a/config_test.go +++ b/config_test.go @@ -42,11 +42,11 @@ func TestConfig_LoadWithDefaults(t *testing.T) { expectedURL := "https://api.cool.linode.com/v4beta" - if client.resty.BaseURL != expectedURL { - t.Fatalf("mismatched host url: %s != %s", client.resty.BaseURL, expectedURL) + if client.hostURL != expectedURL { + t.Fatalf("mismatched host url: %s != %s", client.hostURL, expectedURL) } - if client.resty.Header.Get("Authorization") != "Bearer "+p.APIToken { + if client.header.Get("Authorization") != "Bearer "+p.APIToken { t.Fatalf("token not found in auth header: %s", p.APIToken) } } @@ -88,11 +88,11 @@ func TestConfig_OverrideDefaults(t *testing.T) { expectedURL := "https://api.cool.linode.com/v4" - if client.resty.BaseURL != expectedURL { - t.Fatalf("mismatched host url: %s != %s", client.resty.BaseURL, expectedURL) + if client.hostURL != expectedURL { + t.Fatalf("mismatched host url: %s != %s", client.hostURL, expectedURL) } - if client.resty.Header.Get("Authorization") != "Bearer "+p.APIToken { + if client.header.Get("Authorization") != "Bearer "+p.APIToken { t.Fatalf("token not found in auth header: %s", p.APIToken) } } @@ -124,7 +124,7 @@ func TestConfig_NoDefaults(t *testing.T) { t.Fatalf("mismatched api token: %s != %s", p.APIToken, "mytoken") } - if client.resty.Header.Get("Authorization") != "Bearer "+p.APIToken { + if client.header.Get("Authorization") != "Bearer "+p.APIToken { t.Fatalf("token not found in auth header: %s", p.APIToken) } } diff --git a/databases.go b/databases.go index ead5317eb..5d05eed98 100644 --- a/databases.go +++ b/databases.go @@ -90,7 +90,7 @@ type Database struct { Updated *time.Time `json:"-"` OldestRestoreTime *time.Time `json:"-"` - PrivateNetwork *DatabasePrivateNetwork `json:"private_network,omitempty"` + PrivateNetwork *DatabasePrivateNetwork `json:"private_network,omitzero"` } // DatabaseHost for Primary/Secondary of Database @@ -119,7 +119,7 @@ type DatabaseMaintenanceWindow struct { Frequency DatabaseMaintenanceFrequency `json:"frequency"` HourOfDay int `json:"hour_of_day"` - Pending []DatabaseMaintenanceWindowPending `json:"pending,omitempty"` + Pending []DatabaseMaintenanceWindowPending `json:"pending,omitzero"` } type DatabaseMaintenanceWindowPending struct { @@ -161,7 +161,7 @@ type ClusterPrice struct { // DatabaseFork describes the source and restore time for the fork for forked DBs type DatabaseFork struct { Source int `json:"source"` - RestoreTime *time.Time `json:"-,omitempty"` + RestoreTime *time.Time `json:"-,omitzero"` } func (d *Database) UnmarshalJSON(b []byte) error { diff --git a/domain_records.go b/domain_records.go index 2d8865e66..79bc18f0e 100644 --- a/domain_records.go +++ b/domain_records.go @@ -30,27 +30,27 @@ type DomainRecordCreateOptions struct { Type DomainRecordType `json:"type"` Name string `json:"name"` Target string `json:"target"` - Priority *int `json:"priority,omitempty"` - Weight *int `json:"weight,omitempty"` - Port *int `json:"port,omitempty"` - Service *string `json:"service,omitempty"` - Protocol *string `json:"protocol,omitempty"` - TTLSec int `json:"ttl_sec,omitempty"` // 0 is not accepted by Linode, so can be omitted - Tag *string `json:"tag,omitempty"` + Priority *int `json:"priority,omitzero"` + Weight *int `json:"weight,omitzero"` + Port *int `json:"port,omitzero"` + Service *string `json:"service,omitzero"` + Protocol *string `json:"protocol,omitzero"` + TTLSec int `json:"ttl_sec,omitzero"` // 0 is not accepted by Linode, so can be omitted + Tag *string `json:"tag,omitzero"` } // DomainRecordUpdateOptions fields are those accepted by UpdateDomainRecord type DomainRecordUpdateOptions struct { - Type DomainRecordType `json:"type,omitempty"` - Name string `json:"name,omitempty"` - Target string `json:"target,omitempty"` - Priority *int `json:"priority,omitempty"` // 0 is valid, so omit only nil values - Weight *int `json:"weight,omitempty"` // 0 is valid, so omit only nil values - Port *int `json:"port,omitempty"` // 0 is valid to spec, so omit only nil values - Service *string `json:"service,omitempty"` - Protocol *string `json:"protocol,omitempty"` - TTLSec int `json:"ttl_sec,omitempty"` // 0 is not accepted by Linode, so can be omitted - Tag *string `json:"tag,omitempty"` + Type DomainRecordType `json:"type,omitzero"` + Name string `json:"name,omitzero"` + Target string `json:"target,omitzero"` + Priority *int `json:"priority,omitzero"` // 0 is valid, so omit only nil values + Weight *int `json:"weight,omitzero"` // 0 is valid, so omit only nil values + Port *int `json:"port,omitzero"` // 0 is valid to spec, so omit only nil values + Service *string `json:"service,omitzero"` + Protocol *string `json:"protocol,omitzero"` + TTLSec int `json:"ttl_sec,omitzero"` // 0 is not accepted by Linode, so can be omitted + Tag *string `json:"tag,omitzero"` } // DomainRecordType constants start with RecordType and include Linode API Domain Record Types diff --git a/domains.go b/domains.go index 4f2f2179b..9ca0e1e69 100644 --- a/domains.go +++ b/domains.go @@ -15,9 +15,6 @@ type Domain struct { // If this Domain represents the authoritative source of information for the domain it describes, or if it is a read-only copy of a master (also called a slave). Type DomainType `json:"type"` // Enum:"master" "slave" - // Deprecated: The group this Domain belongs to. This is for display purposes only. - Group string `json:"group"` - // Used to control whether this Domain is currently being rendered. Status DomainStatus `json:"status"` // Enum:"disabled" "active" "edit_mode" "has_errors" @@ -64,22 +61,19 @@ type DomainCreateOptions struct { // Enum:"master" "slave" Type DomainType `json:"type"` - // Deprecated: The group this Domain belongs to. This is for display purposes only. - Group string `json:"group,omitempty"` - // Used to control whether this Domain is currently being rendered. // Enum:"disabled" "active" "edit_mode" "has_errors" - Status DomainStatus `json:"status,omitempty"` + Status DomainStatus `json:"status,omitzero"` // A description for this Domain. This is for display purposes only. - Description string `json:"description,omitempty"` + Description string `json:"description,omitzero"` // Start of Authority email address. This is required for master Domains. - SOAEmail string `json:"soa_email,omitempty"` + SOAEmail string `json:"soa_email,omitzero"` // The interval, in seconds, at which a failed refresh should be retried. // Valid values are 300, 3600, 7200, 14400, 28800, 57600, 86400, 172800, 345600, 604800, 1209600, and 2419200 - any other value will be rounded to the nearest valid value. - RetrySec int `json:"retry_sec,omitempty"` + RetrySec int `json:"retry_sec,omitzero"` // The IP addresses representing the master DNS for this Domain. MasterIPs []string `json:"master_ips"` @@ -91,40 +85,37 @@ type DomainCreateOptions struct { Tags []string `json:"tags"` // The amount of time in seconds that may pass before this Domain is no longer authoritative. Valid values are 300, 3600, 7200, 14400, 28800, 57600, 86400, 172800, 345600, 604800, 1209600, and 2419200 - any other value will be rounded to the nearest valid value. - ExpireSec int `json:"expire_sec,omitempty"` + ExpireSec int `json:"expire_sec,omitzero"` // The amount of time in seconds before this Domain should be refreshed. Valid values are 300, 3600, 7200, 14400, 28800, 57600, 86400, 172800, 345600, 604800, 1209600, and 2419200 - any other value will be rounded to the nearest valid value. - RefreshSec int `json:"refresh_sec,omitempty"` + RefreshSec int `json:"refresh_sec,omitzero"` // "Time to Live" - the amount of time in seconds that this Domain's records may be cached by resolvers or other domain servers. Valid values are 300, 3600, 7200, 14400, 28800, 57600, 86400, 172800, 345600, 604800, 1209600, and 2419200 - any other value will be rounded to the nearest valid value. - TTLSec int `json:"ttl_sec,omitempty"` + TTLSec int `json:"ttl_sec,omitzero"` } // DomainUpdateOptions converts a Domain to DomainUpdateOptions for use in UpdateDomain type DomainUpdateOptions struct { // The domain this Domain represents. These must be unique in our system; you cannot have two Domains representing the same domain. - Domain string `json:"domain,omitempty"` + Domain string `json:"domain,omitzero"` // If this Domain represents the authoritative source of information for the domain it describes, or if it is a read-only copy of a master (also called a slave). // Enum:"master" "slave" - Type DomainType `json:"type,omitempty"` - - // Deprecated: The group this Domain belongs to. This is for display purposes only. - Group string `json:"group,omitempty"` + Type DomainType `json:"type,omitzero"` // Used to control whether this Domain is currently being rendered. // Enum:"disabled" "active" "edit_mode" "has_errors" - Status DomainStatus `json:"status,omitempty"` + Status DomainStatus `json:"status,omitzero"` // A description for this Domain. This is for display purposes only. - Description string `json:"description,omitempty"` + Description string `json:"description,omitzero"` // Start of Authority email address. This is required for master Domains. - SOAEmail string `json:"soa_email,omitempty"` + SOAEmail string `json:"soa_email,omitzero"` // The interval, in seconds, at which a failed refresh should be retried. // Valid values are 300, 3600, 7200, 14400, 28800, 57600, 86400, 172800, 345600, 604800, 1209600, and 2419200 - any other value will be rounded to the nearest valid value. - RetrySec int `json:"retry_sec,omitempty"` + RetrySec int `json:"retry_sec,omitzero"` // The IP addresses representing the master DNS for this Domain. MasterIPs []string `json:"master_ips"` @@ -136,13 +127,13 @@ type DomainUpdateOptions struct { Tags []string `json:"tags"` // The amount of time in seconds that may pass before this Domain is no longer authoritative. Valid values are 300, 3600, 7200, 14400, 28800, 57600, 86400, 172800, 345600, 604800, 1209600, and 2419200 - any other value will be rounded to the nearest valid value. - ExpireSec int `json:"expire_sec,omitempty"` + ExpireSec int `json:"expire_sec,omitzero"` // The amount of time in seconds before this Domain should be refreshed. Valid values are 300, 3600, 7200, 14400, 28800, 57600, 86400, 172800, 345600, 604800, 1209600, and 2419200 - any other value will be rounded to the nearest valid value. - RefreshSec int `json:"refresh_sec,omitempty"` + RefreshSec int `json:"refresh_sec,omitzero"` // "Time to Live" - the amount of time in seconds that this Domain's records may be cached by resolvers or other domain servers. Valid values are 300, 3600, 7200, 14400, 28800, 57600, 86400, 172800, 345600, 604800, 1209600, and 2419200 - any other value will be rounded to the nearest valid value. - TTLSec int `json:"ttl_sec,omitempty"` + TTLSec int `json:"ttl_sec,omitzero"` } // DomainType constants start with DomainType and include Linode API Domain Type values @@ -178,7 +169,6 @@ type DomainImportOptions struct { func (d Domain) GetUpdateOptions() (du DomainUpdateOptions) { du.Domain = d.Domain du.Type = d.Type - du.Group = d.Group du.Status = d.Status du.Description = d.Description du.SOAEmail = d.SOAEmail diff --git a/errors.go b/errors.go index 873b40450..db7fc2a34 100644 --- a/errors.go +++ b/errors.go @@ -1,7 +1,7 @@ package linodego import ( - "encoding/json" + "bytes" "errors" "fmt" "io" @@ -9,8 +9,6 @@ import ( "reflect" "slices" "strings" - - "github.com/go-resty/resty/v2" ) const ( @@ -49,74 +47,43 @@ type APIError struct { Errors []APIErrorReason `json:"errors"` } -// String returns the error reason in a formatted string -func (r APIErrorReason) String() string { - return fmt.Sprintf("[%s] %s", r.Field, r.Reason) -} - -func coupleAPIErrors(r *resty.Response, err error) (*resty.Response, error) { +//nolint:nestif,unparam +func coupleAPIErrors(resp *http.Response, err error) (*http.Response, error) { if err != nil { - // an error was raised in go code, no need to check the resty Response return nil, NewError(err) } - if r.Error() == nil { - // no error in the resty Response - return r, nil - } - - // handle the resty Response errors - - // Check that response is of the correct content-type before unmarshalling - expectedContentType := r.Request.Header.Get("Accept") - responseContentType := r.Header().Get("Content-Type") - - // If the upstream Linode API server being fronted fails to respond to the request, - // the http server will respond with a default "Bad Gateway" page with Content-Type - // "text/html". - if r.StatusCode() == http.StatusBadGateway && responseContentType == "text/html" { //nolint:goconst - return nil, Error{Code: http.StatusBadGateway, Message: http.StatusText(http.StatusBadGateway)} - } - - if responseContentType != expectedContentType { - msg := fmt.Sprintf( - "Unexpected Content-Type: Expected: %v, Received: %v\nResponse body: %s", - expectedContentType, - responseContentType, - string(r.Body()), - ) - - return nil, Error{Code: r.StatusCode(), Message: msg} - } - - apiError, ok := r.Error().(*APIError) - if !ok || (ok && len(apiError.Errors) == 0) { - return r, nil + if resp == nil { + return nil, NewError(fmt.Errorf("response is nil")) } - return nil, NewError(r) -} - -//nolint:unused -func coupleAPIErrorsHTTP(resp *http.Response, err error) (*http.Response, error) { - if err != nil { - // an error was raised in go code, no need to check the http.Response - return nil, NewError(err) - } - - if resp == nil || resp.StatusCode < 200 || resp.StatusCode >= 300 { + if resp.StatusCode < 200 || resp.StatusCode >= 300 { // Check that response is of the correct content-type before unmarshalling - expectedContentType := resp.Request.Header.Get("Accept") + expectedContentType := "" + if resp.Request != nil && resp.Request.Header != nil { + expectedContentType = resp.Request.Header.Get("Accept") + } + responseContentType := resp.Header.Get("Content-Type") // If the upstream server fails to respond to the request, - // the http server will respond with a default error page with Content-Type "text/html". - if resp.StatusCode == http.StatusBadGateway && responseContentType == "text/html" { //nolint:goconst - return nil, Error{Code: http.StatusBadGateway, Message: http.StatusText(http.StatusBadGateway)} + // the HTTP server will respond with a default error page with Content-Type "text/html". + if resp.StatusCode == http.StatusBadGateway && responseContentType == "text/html" { + return nil, &Error{Code: http.StatusBadGateway, Message: http.StatusText(http.StatusBadGateway), Response: resp} } if responseContentType != expectedContentType { - bodyBytes, _ := io.ReadAll(resp.Body) + if resp.Body == nil { + return nil, NewError(fmt.Errorf("response body is nil")) + } + + bodyBytes, readErr := io.ReadAll(resp.Body) + if readErr != nil { + return nil, NewError(fmt.Errorf("failed to read response body: %w", readErr)) + } + + resp.Body = io.NopCloser(bytes.NewBuffer(bodyBytes)) + msg := fmt.Sprintf( "Unexpected Content-Type: Expected: %v, Received: %v\nResponse body: %s", expectedContentType, @@ -124,22 +91,22 @@ func coupleAPIErrorsHTTP(resp *http.Response, err error) (*http.Response, error) string(bodyBytes), ) - return nil, Error{Code: resp.StatusCode, Message: msg} + return nil, &Error{Code: resp.StatusCode, Message: msg, Response: resp} } - var apiError APIError - if err := json.NewDecoder(resp.Body).Decode(&apiError); err != nil { - return nil, NewError(fmt.Errorf("failed to decode response body: %w", err)) + // Must check if there is no list of reasons in the error before making a call to NewError + apiError, ok := getAPIError(resp) + if !ok { + return nil, NewError(fmt.Errorf("failed to decode response body")) } if len(apiError.Errors) == 0 { return resp, nil } - return nil, Error{Code: resp.StatusCode, Message: apiError.Errors[0].String()} + return nil, NewError(resp) } - // no error in the http.Response return resp, nil } @@ -156,7 +123,7 @@ func (e APIError) Error() string { // - ErrorFromString (1) from a string // - ErrorFromError (2) for an error // - ErrorFromStringer (3) for a Stringer -// - HTTP Status Codes (100-600) for a resty.Response object +// - HTTP Status Codes (100-600) for a http.Response object func NewError(err any) *Error { if err == nil { return nil @@ -165,17 +132,17 @@ func NewError(err any) *Error { switch e := err.(type) { case *Error: return e - case *resty.Response: - apiError, ok := e.Error().(*APIError) + case *http.Response: + apiError, ok := getAPIError(e) if !ok { - return &Error{Code: ErrorUnsupported, Message: "Unexpected Resty Error Response, no error"} + return &Error{Code: ErrorUnsupported, Message: "Unexpected HTTP Error Response, no error"} } return &Error{ - Code: e.RawResponse.StatusCode, + Code: e.StatusCode, Message: apiError.Error(), - Response: e.RawResponse, + Response: e, } case error: return &Error{Code: ErrorFromError, Message: e.Error()} diff --git a/errors_test.go b/errors_test.go index 68428fcd6..4a182c36e 100644 --- a/errors_test.go +++ b/errors_test.go @@ -9,9 +9,10 @@ import ( "io" "net/http" "net/http/httptest" + "strconv" + "strings" "testing" - "github.com/go-resty/resty/v2" "github.com/google/go-cmp/cmp" ) @@ -27,10 +28,10 @@ func (e testError) Error() string { return string(e) } -func restyError(reason, field string) *resty.Response { +func httpError(reason, field string) *http.Response { var reasons []APIErrorReason - // allow for an empty reasons + // Allow for an empty reasons if reason != "" && field != "" { reasons = append(reasons, APIErrorReason{ Reason: reason, @@ -38,15 +39,18 @@ func restyError(reason, field string) *resty.Response { }) } - return &resty.Response{ - RawResponse: &http.Response{ - StatusCode: 500, - }, - Request: &resty.Request{ - Error: &APIError{ - Errors: reasons, - }, - }, + apiError := &APIError{ + Errors: reasons, + } + + body, err := json.Marshal(apiError) + if err != nil { + panic("Failed to marshal APIError") + } + + return &http.Response{ + StatusCode: 500, + Body: io.NopCloser(bytes.NewReader(body)), } } @@ -73,12 +77,12 @@ func TestNewError(t *testing.T) { t.Error("Error should be itself") } - if err := NewError(&resty.Response{Request: &resty.Request{}}); err.Message != "Unexpected Resty Error Response, no error" { - t.Error("Unexpected Resty Error Response, no error") + if err := NewError(&http.Response{Request: &http.Request{}}); err.Message != "Unexpected HTTP Error Response, no error" { + t.Error("Unexpected HTTP Error Response, no error") } - if err := NewError(restyError("testreason", "testfield")); err.Message != "[testfield] testreason" { - t.Error("rest response error should should be set") + if err := NewError(httpError("testreason", "testfield")); err.Message != "[testfield] testreason" { + t.Error("http response error should should be set") } if err := NewError("stringerror"); err.Message != "stringerror" || err.Code != ErrorFromString { @@ -119,98 +123,6 @@ func TestCoupleAPIErrors(t *testing.T) { } }) - t.Run("resty 500 response error with reasons", func(t *testing.T) { - if _, err := coupleAPIErrors(restyError("testreason", "testfield"), nil); err.Error() != "[500] [testfield] testreason" { - t.Error("resty error should return with proper format [code] [field] reason") - } - }) - - t.Run("resty 500 response error without reasons", func(t *testing.T) { - if _, err := coupleAPIErrors(restyError("", ""), nil); err != nil { - t.Error("resty error with no reasons should return no error") - } - }) - - t.Run("resty response with nil error", func(t *testing.T) { - emptyErr := &resty.Response{ - RawResponse: &http.Response{ - StatusCode: 500, - }, - Request: &resty.Request{ - Error: nil, - }, - } - if _, err := coupleAPIErrors(emptyErr, nil); err != nil { - t.Error("resty error with no reasons should return no error") - } - }) - - t.Run("generic html error", func(t *testing.T) { - rawResponse := ` -500 Internal Server Error - -

500 Internal Server Error

-
nginx
- -` - route := "/v4/linode/instances/123" - ts, client := createTestServer(http.MethodGet, route, "text/html", rawResponse, http.StatusInternalServerError) - // client.SetDebug(true) - defer ts.Close() - - expectedError := Error{ - Code: http.StatusInternalServerError, - Message: "Unexpected Content-Type: Expected: application/json, Received: text/html\nResponse body: " + rawResponse, - } - - _, err := coupleAPIErrors(client.R(context.Background()).SetResult(&Instance{}).Get(ts.URL + route)) - if diff := cmp.Diff(expectedError, err); diff != "" { - t.Errorf("expected error to match but got diff:\n%s", diff) - } - }) - - t.Run("bad gateway error", func(t *testing.T) { - rawResponse := []byte(` -502 Bad Gateway - -

502 Bad Gateway

-
nginx
- -`) - buf := io.NopCloser(bytes.NewBuffer(rawResponse)) - - resp := &resty.Response{ - Request: &resty.Request{ - Error: errors.New("Bad Gateway"), - }, - RawResponse: &http.Response{ - Header: http.Header{ - "Content-Type": []string{"text/html"}, - }, - StatusCode: http.StatusBadGateway, - Body: buf, - }, - } - - expectedError := Error{ - Code: http.StatusBadGateway, - Message: http.StatusText(http.StatusBadGateway), - } - - if _, err := coupleAPIErrors(resp, nil); !cmp.Equal(err, expectedError) { - t.Errorf("expected error %#v to match error %#v", err, expectedError) - } - }) -} - -func TestCoupleAPIErrorsHTTP(t *testing.T) { - t.Run("not nil error generates error", func(t *testing.T) { - err := errors.New("test") - if _, err := coupleAPIErrorsHTTP(nil, err); !cmp.Equal(err, NewError(err)) { - t.Errorf("expect a not nil error to be returned as an Error") - } - }) - t.Run("http 500 response error with reasons", func(t *testing.T) { // Create the simulated HTTP response with a 500 status and a JSON body containing the error details apiError := APIError{ @@ -228,7 +140,7 @@ func TestCoupleAPIErrorsHTTP(t *testing.T) { Request: &http.Request{Header: http.Header{"Accept": []string{"application/json"}}}, } - _, err := coupleAPIErrorsHTTP(resp, nil) + _, err := coupleAPIErrors(resp, nil) expectedMessage := "[500] [testfield] testreason" if err == nil || err.Error() != expectedMessage { t.Errorf("expected error message %q, got: %v", expectedMessage, err) @@ -250,7 +162,7 @@ func TestCoupleAPIErrorsHTTP(t *testing.T) { Request: &http.Request{Header: http.Header{"Accept": []string{"application/json"}}}, } - _, err := coupleAPIErrorsHTTP(resp, nil) + _, err := coupleAPIErrors(resp, nil) if err != nil { t.Error("http error with no reasons should return no error") } @@ -265,7 +177,7 @@ func TestCoupleAPIErrorsHTTP(t *testing.T) { Request: &http.Request{Header: http.Header{"Accept": []string{"application/json"}}}, } - _, err := coupleAPIErrorsHTTP(resp, nil) + _, err := coupleAPIErrors(resp, nil) if err != nil { t.Error("http error with no reasons should return no error") } @@ -288,15 +200,10 @@ func TestCoupleAPIErrorsHTTP(t *testing.T) { })) defer ts.Close() - client := &httpClient{ + client := &Client{ httpClient: ts.Client(), } - expectedError := Error{ - Code: http.StatusInternalServerError, - Message: "Unexpected Content-Type: Expected: application/json, Received: text/html\nResponse body: " + rawResponse, - } - req, err := http.NewRequestWithContext(context.Background(), http.MethodGet, ts.URL+route, nil) if err != nil { t.Fatalf("failed to create request: %v", err) @@ -308,11 +215,23 @@ func TestCoupleAPIErrorsHTTP(t *testing.T) { if err != nil { t.Fatalf("failed to send request: %v", err) } + + expectedError := &Error{ + Response: resp, + Code: http.StatusInternalServerError, + Message: "Unexpected Content-Type: Expected: application/json, Received: text/html\nResponse body: " + rawResponse, + } + defer resp.Body.Close() - _, err = coupleAPIErrorsHTTP(resp, nil) - if diff := cmp.Diff(expectedError, err); diff != "" { - t.Errorf("expected error to match but got diff:\n%s", diff) + _, err = coupleAPIErrors(resp, nil) + + if !strings.Contains(err.Error(), strconv.Itoa(expectedError.Code)) { + t.Errorf("expected error code %d, got %d", expectedError.Code, resp.StatusCode) + } + + if !strings.Contains(err.Error(), expectedError.Message) { + t.Errorf("expected error message %s, got %s", expectedError.Message, err.Error()) } }) @@ -337,14 +256,19 @@ func TestCoupleAPIErrorsHTTP(t *testing.T) { }, } - expectedError := Error{ - Code: http.StatusBadGateway, - Message: http.StatusText(http.StatusBadGateway), + expectedError := &Error{ + Response: resp, + Code: http.StatusBadGateway, + Message: http.StatusText(http.StatusBadGateway), + } + + _, err := coupleAPIErrors(resp, nil) + if !strings.Contains(err.Error(), strconv.Itoa(expectedError.Code)) { + t.Errorf("expected error code %d, got %d", expectedError.Code, resp.StatusCode) } - _, err := coupleAPIErrorsHTTP(resp, nil) - if !cmp.Equal(err, expectedError) { - t.Errorf("expected error %#v to match error %#v", err, expectedError) + if !strings.Contains(err.Error(), expectedError.Message) { + t.Errorf("expected error message %s, got %s", expectedError.Message, err.Error()) } }) } @@ -382,26 +306,26 @@ func TestErrorIs(t *testing.T) { expectedResult: true, }, { - testName: "default and Error from empty resty error", - err1: NewError(restyError("", "")), + testName: "default and Error from empty http error", + err1: NewError(httpError("", "")), err2: defaultError, expectedResult: true, }, { - testName: "default and Error from resty error with field", - err1: NewError(restyError("", "test field")), + testName: "default and Error from http error with field", + err1: NewError(httpError("", "test field")), err2: defaultError, expectedResult: true, }, { - testName: "default and Error from resty error with field and reason", - err1: NewError(restyError("test reason", "test field")), + testName: "default and Error from http error with field and reason", + err1: NewError(httpError("test reason", "test field")), err2: defaultError, expectedResult: true, }, { - testName: "default and Error from resty error with reason", - err1: NewError(restyError("test reason", "")), + testName: "default and Error from http error with reason", + err1: NewError(httpError("test reason", "")), err2: defaultError, expectedResult: true, }, diff --git a/firewall_rules.go b/firewall_rules.go index b394ed1f0..548a9aa6c 100644 --- a/firewall_rules.go +++ b/firewall_rules.go @@ -18,8 +18,8 @@ const ( // NetworkAddresses are arrays of ipv4 and v6 addresses type NetworkAddresses struct { - IPv4 *[]string `json:"ipv4,omitempty"` - IPv6 *[]string `json:"ipv6,omitempty"` + IPv4 []string `json:"ipv4,omitzero"` + IPv6 []string `json:"ipv6,omitzero"` } // A FirewallRule is a whitelist of ports, protocols, and addresses for which traffic should be allowed. @@ -28,15 +28,15 @@ type NetworkAddresses struct { type FirewallRule struct { Action string `json:"action"` Label string `json:"label"` - Description string `json:"description,omitempty"` - Ports string `json:"ports,omitempty"` + Description string `json:"description,omitzero"` + Ports string `json:"ports,omitzero"` Protocol NetworkProtocol `json:"protocol"` Addresses NetworkAddresses `json:"addresses"` // FirewallRule references one `Rule Set` by ID. When provided, this entry // represents a reference and should be mutually exclusive with ordinary // rule fields according to the API contract. - RuleSet int `json:"ruleset,omitempty"` + RuleSet int `json:"ruleset,omitzero"` } // MarshalJSON ensures that when a rule references a Rule Set (RuleSet != 0), @@ -54,8 +54,8 @@ func (r FirewallRule) MarshalJSON() ([]byte, error) { type normal struct { Action string `json:"action"` Label string `json:"label"` - Description string `json:"description,omitempty"` - Ports string `json:"ports,omitempty"` + Description string `json:"description,omitzero"` + Ports string `json:"ports,omitzero"` Protocol NetworkProtocol `json:"protocol"` Addresses NetworkAddresses `json:"addresses"` } @@ -79,9 +79,9 @@ type FirewallRuleSet struct { // TODO: separate request and response types in linodego v2 // read-only, can't be used in creating or updating a Firewall - Version int `json:"version,omitempty"` + Version int `json:"version,omitzero"` // read-only, can't be used in creating or updating a Firewall - Fingerprint string `json:"fingerprint,omitempty"` + Fingerprint string `json:"fingerprint,omitzero"` } // GetFirewallRules gets the FirewallRuleSet for the given Firewall. diff --git a/firewall_rulesets.go b/firewall_rulesets.go index c702d3b9b..97d5182f9 100644 --- a/firewall_rulesets.go +++ b/firewall_rulesets.go @@ -22,7 +22,7 @@ const ( type RuleSet struct { ID int `json:"id"` Label string `json:"label"` - Description string `json:"description,omitempty"` + Description string `json:"description,omitzero"` Type FirewallRuleSetType `json:"type"` Rules []FirewallRule `json:"rules"` IsServiceDefined bool `json:"is_service_defined"` @@ -69,7 +69,7 @@ func (r *RuleSet) UnmarshalJSON(b []byte) error { // RuleSetCreateOptions fields accepted by CreateRuleSet. type RuleSetCreateOptions struct { Label string `json:"label"` - Description string `json:"description,omitempty"` + Description string `json:"description,omitzero"` Type FirewallRuleSetType `json:"type"` Rules []FirewallRule `json:"rules"` } @@ -78,9 +78,9 @@ type RuleSetCreateOptions struct { // Omit a top-level field to leave it unchanged. If Rules is provided, it // replaces the entire ordered rules array. type RuleSetUpdateOptions struct { - Label *string `json:"label,omitempty"` - Description *string `json:"description,omitempty"` - Rules *[]FirewallRule `json:"rules,omitempty"` + Label *string `json:"label,omitzero"` + Description *string `json:"description,omitzero"` + Rules []FirewallRule `json:"rules,omitzero"` } // ListFirewallRuleSets returns a paginated list of Rule Sets. diff --git a/firewalls.go b/firewalls.go index 1c698e1cc..02cbd9799 100644 --- a/firewalls.go +++ b/firewalls.go @@ -32,24 +32,24 @@ type Firewall struct { // DevicesCreationOptions fields are used when adding devices during the Firewall creation process. type DevicesCreationOptions struct { - Linodes []int `json:"linodes,omitempty"` - NodeBalancers []int `json:"nodebalancers,omitempty"` - LinodeInterfaces []int `json:"linode_interfaces,omitempty"` + Linodes []int `json:"linodes,omitzero"` + NodeBalancers []int `json:"nodebalancers,omitzero"` + LinodeInterfaces []int `json:"linode_interfaces,omitzero"` } // FirewallCreateOptions fields are those accepted by CreateFirewall type FirewallCreateOptions struct { - Label string `json:"label,omitempty"` + Label string `json:"label,omitzero"` Rules FirewallRuleSet `json:"rules"` - Tags []string `json:"tags,omitempty"` + Tags []string `json:"tags,omitzero"` Devices DevicesCreationOptions `json:"devices,omitzero"` } // FirewallUpdateOptions is an options struct used when Updating a Firewall type FirewallUpdateOptions struct { - Label string `json:"label,omitempty"` - Status FirewallStatus `json:"status,omitempty"` - Tags *[]string `json:"tags,omitempty"` + Label string `json:"label,omitzero"` + Status FirewallStatus `json:"status,omitzero"` + Tags []string `json:"tags,omitzero"` } // FirewallSettings represents the default firewalls for Linodes, @@ -67,14 +67,14 @@ type DefaultFirewallIDs struct { // FirewallSettingsUpdateOptions is an options struct used when Updating FirewallSettings type FirewallSettingsUpdateOptions struct { - DefaultFirewallIDs *DefaultFirewallIDsOptions `json:"default_firewall_ids,omitempty"` + DefaultFirewallIDs *DefaultFirewallIDsOptions `json:"default_firewall_ids,omitzero"` } type DefaultFirewallIDsOptions struct { - Linode **int `json:"linode,omitempty"` - NodeBalancer **int `json:"nodebalancer,omitempty"` - PublicInterface **int `json:"public_interface,omitempty"` - VPCInterface **int `json:"vpc_interface,omitempty"` + Linode **int `json:"linode,omitzero"` + NodeBalancer **int `json:"nodebalancer,omitzero"` + PublicInterface **int `json:"public_interface,omitzero"` + VPCInterface **int `json:"vpc_interface,omitzero"` } // GetUpdateOptions converts a Firewall to FirewallUpdateOptions for use in Client.UpdateFirewall. @@ -82,7 +82,7 @@ func (f *Firewall) GetUpdateOptions() FirewallUpdateOptions { return FirewallUpdateOptions{ Label: f.Label, Status: f.Status, - Tags: &f.Tags, + Tags: f.Tags, } } diff --git a/go.mod b/go.mod index 7dd2786cc..6e22e2ddb 100644 --- a/go.mod +++ b/go.mod @@ -1,7 +1,6 @@ module github.com/linode/linodego require ( - github.com/go-resty/resty/v2 v2.17.2 github.com/google/go-cmp v0.7.0 github.com/google/go-querystring v1.2.0 github.com/jarcoal/httpmock v1.4.1 diff --git a/go.sum b/go.sum index ae46e535d..7166d607a 100644 --- a/go.sum +++ b/go.sum @@ -1,8 +1,6 @@ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/go-resty/resty/v2 v2.17.2 h1:FQW5oHYcIlkCNrMD2lloGScxcHJ0gkjshV3qcQAyHQk= -github.com/go-resty/resty/v2 v2.17.2/go.mod h1:kCKZ3wWmwJaNc7S29BRtUhJwy7iqmn+2mLtQrOyQlVA= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= @@ -29,8 +27,6 @@ golang.org/x/oauth2 v0.36.0 h1:peZ/1z27fi9hUOFCAZaHyrpWG5lwe0RJEEEeH0ThlIs= golang.org/x/oauth2 v0.36.0/go.mod h1:YDBUJMTkDnJS+A4BP4eZBjCqtokkg1hODuPjwiGPO7Q= golang.org/x/text v0.36.0 h1:JfKh3XmcRPqZPKevfXVpI1wXPTqbkE5f7JA92a55Yxg= golang.org/x/text v0.36.0/go.mod h1:NIdBknypM8iqVmPiuco0Dh6P5Jcdk8lJL0CUebqK164= -golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= -golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/ini.v1 v1.67.2 h1:JtOSMb9OuaCZKr7h5D/h6iii14sK0hLbplTc6frx4Ss= diff --git a/image_sharegroups_consumer.go b/image_sharegroups_consumer.go index e9150b667..4dd1faa87 100644 --- a/image_sharegroups_consumer.go +++ b/image_sharegroups_consumer.go @@ -125,7 +125,7 @@ func (t *ImageShareGroupCreateTokenResponse) UnmarshalJSON(b []byte) error { // ImageShareGroupCreateTokenOptions fields are those accepted by ImageShareGroupCreateToken type ImageShareGroupCreateTokenOptions struct { - Label *string `json:"label,omitempty"` + Label *string `json:"label,omitzero"` ValidForShareGroupUUID string `json:"valid_for_sharegroup_uuid"` } diff --git a/image_sharegroups_producer.go b/image_sharegroups_producer.go index 9d21392b2..555ecb1cb 100644 --- a/image_sharegroups_producer.go +++ b/image_sharegroups_producer.go @@ -50,14 +50,14 @@ func (isg *ProducerImageShareGroup) UnmarshalJSON(b []byte) error { // ImageShareGroupCreateOptions fields are those accepted by CreateImageShareGroup. type ImageShareGroupCreateOptions struct { Label string `json:"label"` - Description *string `json:"description,omitempty"` - Images []ImageShareGroupImage `json:"images,omitempty"` + Description *string `json:"description,omitzero"` + Images []ImageShareGroupImage `json:"images,omitzero"` } // ImageShareGroupUpdateOptions fields are those accepted by UpdateImageShareGroup. type ImageShareGroupUpdateOptions struct { - Label *string `json:"label,omitempty"` - Description *string `json:"description,omitempty"` + Label *string `json:"label,omitzero"` + Description *string `json:"description,omitzero"` } // ImageShareGroupAddImagesOptions fields are those accepted by ImageShareGroupAddImages. @@ -67,15 +67,15 @@ type ImageShareGroupAddImagesOptions struct { // ImageShareGroupUpdateImageOptions fields are those accepted by ImageShareGroupUpdateImage. type ImageShareGroupUpdateImageOptions struct { - Label *string `json:"label,omitempty"` - Description *string `json:"description,omitempty"` + Label *string `json:"label,omitzero"` + Description *string `json:"description,omitzero"` } // ImageShareGroupImage represents an Image to be included in a ProducerImageShareGroup. type ImageShareGroupImage struct { ID string `json:"id"` - Label *string `json:"label,omitempty"` - Description *string `json:"description,omitempty"` + Label *string `json:"label,omitzero"` + Description *string `json:"description,omitzero"` } // ImageShareGroupMember represents a Member of an ImageShareGroup owned by the producer. diff --git a/images.go b/images.go index 5fdf644fb..aed63b48a 100644 --- a/images.go +++ b/images.go @@ -4,9 +4,9 @@ import ( "context" "encoding/json" "io" + "net/http" "time" - "github.com/go-resty/resty/v2" "github.com/linode/linodego/internal/parseabletime" ) @@ -115,18 +115,18 @@ type ImageShareEntry struct { // ImageCreateOptions fields are those accepted by CreateImage type ImageCreateOptions struct { - DiskID int `json:"disk_id"` - Label string `json:"label"` - Description string `json:"description,omitempty"` - CloudInit bool `json:"cloud_init,omitempty"` - Tags *[]string `json:"tags,omitempty"` + DiskID int `json:"disk_id"` + Label string `json:"label"` + Description string `json:"description,omitzero"` + CloudInit bool `json:"cloud_init,omitzero"` + Tags []string `json:"tags,omitzero"` } // ImageUpdateOptions fields are those accepted by UpdateImage type ImageUpdateOptions struct { - Label string `json:"label,omitempty"` - Description *string `json:"description,omitempty"` - Tags *[]string `json:"tags,omitempty"` + Label string `json:"label,omitzero"` + Description *string `json:"description,omitzero"` + Tags []string `json:"tags,omitzero"` } // ImageReplicateOptions represents the options accepted by the @@ -143,20 +143,20 @@ type ImageCreateUploadResponse struct { // ImageCreateUploadOptions fields are those accepted by CreateImageUpload type ImageCreateUploadOptions struct { - Region string `json:"region"` - Label string `json:"label"` - Description string `json:"description,omitempty"` - CloudInit bool `json:"cloud_init,omitempty"` - Tags *[]string `json:"tags,omitempty"` + Region string `json:"region"` + Label string `json:"label"` + Description string `json:"description,omitzero"` + CloudInit bool `json:"cloud_init,omitzero"` + Tags []string `json:"tags,omitzero"` } // ImageUploadOptions fields are those accepted by UploadImage type ImageUploadOptions struct { - Region string `json:"region"` - Label string `json:"label"` - Description string `json:"description,omitempty"` - CloudInit bool `json:"cloud_init"` - Tags *[]string `json:"tags,omitempty"` + Region string `json:"region"` + Label string `json:"label"` + Description string `json:"description,omitzero"` + CloudInit bool `json:"cloud_init"` + Tags []string `json:"tags,omitzero"` Image io.Reader } @@ -297,17 +297,48 @@ func (c *Client) CreateImageUpload(ctx context.Context, opts ImageCreateUploadOp // UploadImageToURL uploads the given image to the given upload URL. func (c *Client) UploadImageToURL(ctx context.Context, uploadURL string, image io.Reader) error { - // Linode-specific headers do not need to be sent to this endpoint - req := resty.New().SetDebug(c.resty.Debug).R(). - SetContext(ctx). - SetContentLength(true). - SetHeader("Content-Type", "application/octet-stream"). - SetBody(image) + clonedClient := *c.httpClient + clonedClient.Transport = http.DefaultTransport - _, err := coupleAPIErrors(req. - Put(uploadURL)) + var contentLength int64 = -1 - return err + if seeker, ok := image.(io.Seeker); ok { + size, err := seeker.Seek(0, io.SeekEnd) + if err != nil { + return err + } + + _, err = seeker.Seek(0, io.SeekStart) + if err != nil { + return err + } + + contentLength = size + } + + req, err := http.NewRequestWithContext(ctx, http.MethodPut, uploadURL, image) + if err != nil { + return err + } + + if contentLength >= 0 { + req.ContentLength = contentLength + } + + req.Header.Set("Content-Type", "application/octet-stream") + req.Header.Set("User-Agent", c.userAgent) + + resp, err := clonedClient.Do(req) + if resp != nil && resp.Body != nil { + defer resp.Body.Close() + } + + _, err = coupleAPIErrors(resp, err) + if err != nil { + return err + } + + return nil } // UploadImage creates and uploads an image. diff --git a/instance_config_interfaces.go b/instance_config_interfaces.go index c1c8735f8..d9dd06764 100644 --- a/instance_config_interfaces.go +++ b/instance_config_interfaces.go @@ -45,31 +45,31 @@ type InstanceConfigInterfaceIPv6Range struct { } type VPCIPv4 struct { - VPC string `json:"vpc,omitempty"` - NAT1To1 *string `json:"nat_1_1,omitempty"` + VPC string `json:"vpc,omitzero"` + NAT1To1 *string `json:"nat_1_1,omitzero"` } type InstanceConfigInterfaceCreateOptions struct { - IPAMAddress string `json:"ipam_address,omitempty"` - Label string `json:"label,omitempty"` - Purpose ConfigInterfacePurpose `json:"purpose,omitempty"` - Primary bool `json:"primary,omitempty"` - SubnetID *int `json:"subnet_id,omitempty"` - IPv4 *VPCIPv4 `json:"ipv4,omitempty"` + IPAMAddress string `json:"ipam_address,omitzero"` + Label string `json:"label,omitzero"` + Purpose ConfigInterfacePurpose `json:"purpose,omitzero"` + Primary bool `json:"primary,omitzero"` + SubnetID *int `json:"subnet_id,omitzero"` + IPv4 *VPCIPv4 `json:"ipv4,omitzero"` // NOTE: IPv6 interfaces may not currently be available to all users. - IPv6 *InstanceConfigInterfaceCreateOptionsIPv6 `json:"ipv6,omitempty"` + IPv6 *InstanceConfigInterfaceCreateOptionsIPv6 `json:"ipv6,omitzero"` - IPRanges []string `json:"ip_ranges,omitempty"` + IPRanges []string `json:"ip_ranges,omitzero"` } // InstanceConfigInterfaceCreateOptionsIPv6 represents the IPv6 configuration of a Linode interface // specified during creation. // NOTE: IPv6 interfaces may not currently be available to all users. type InstanceConfigInterfaceCreateOptionsIPv6 struct { - SLAAC []InstanceConfigInterfaceCreateOptionsIPv6SLAAC `json:"slaac,omitempty"` - Ranges []InstanceConfigInterfaceCreateOptionsIPv6Range `json:"ranges,omitempty"` - IsPublic *bool `json:"is_public,omitempty"` + SLAAC []InstanceConfigInterfaceCreateOptionsIPv6SLAAC `json:"slaac,omitzero"` + Ranges []InstanceConfigInterfaceCreateOptionsIPv6Range `json:"ranges,omitzero"` + IsPublic *bool `json:"is_public,omitzero"` } // InstanceConfigInterfaceCreateOptionsIPv6SLAAC represents a single IPv6 SLAAC of a Linode interface @@ -83,40 +83,40 @@ type InstanceConfigInterfaceCreateOptionsIPv6SLAAC struct { // specified during creation. // NOTE: IPv6 interfaces may not currently be available to all users. type InstanceConfigInterfaceCreateOptionsIPv6Range struct { - Range *string `json:"range,omitempty"` + Range *string `json:"range,omitzero"` } type InstanceConfigInterfaceUpdateOptions struct { - Primary bool `json:"primary,omitempty"` - IPv4 *VPCIPv4 `json:"ipv4,omitempty"` + Primary bool `json:"primary,omitzero"` + IPv4 *VPCIPv4 `json:"ipv4,omitzero"` // NOTE: IPv6 interfaces may not currently be available to all users. - IPv6 *InstanceConfigInterfaceUpdateOptionsIPv6 `json:"ipv6,omitempty"` + IPv6 *InstanceConfigInterfaceUpdateOptionsIPv6 `json:"ipv6,omitzero"` - IPRanges *[]string `json:"ip_ranges,omitempty"` + IPRanges []string `json:"ip_ranges,omitzero"` } // InstanceConfigInterfaceUpdateOptionsIPv6 represents the IPv6 configuration of a Linode interface // specified during updates. // NOTE: IPv6 interfaces may not currently be available to all users. type InstanceConfigInterfaceUpdateOptionsIPv6 struct { - SLAAC *[]InstanceConfigInterfaceUpdateOptionsIPv6SLAAC `json:"slaac,omitempty"` - Ranges *[]InstanceConfigInterfaceUpdateOptionsIPv6Range `json:"ranges,omitempty"` - IsPublic *bool `json:"is_public,omitempty"` + SLAAC []InstanceConfigInterfaceUpdateOptionsIPv6SLAAC `json:"slaac,omitzero"` + Ranges []InstanceConfigInterfaceUpdateOptionsIPv6Range `json:"ranges,omitzero"` + IsPublic *bool `json:"is_public,omitzero"` } // InstanceConfigInterfaceUpdateOptionsIPv6SLAAC represents a single IPv6 SLAAC of a Linode interface // specified during updates. // NOTE: IPv6 interfaces may not currently be available to all users. type InstanceConfigInterfaceUpdateOptionsIPv6SLAAC struct { - Range *string `json:"range,omitempty"` + Range *string `json:"range,omitzero"` } // InstanceConfigInterfaceUpdateOptionsIPv6Range represents a single IPv6 ranges of a Linode interface // specified during updates. // NOTE: IPv6 interfaces may not currently be available to all users. type InstanceConfigInterfaceUpdateOptionsIPv6Range struct { - Range *string `json:"range,omitempty"` + Range *string `json:"range,omitzero"` } type InstanceConfigInterfacesReorderOptions struct { @@ -217,8 +217,8 @@ func (i InstanceConfigInterface) GetUpdateOptions() InstanceConfigInterfaceUpdat ) opts.IPv6 = &InstanceConfigInterfaceUpdateOptionsIPv6{ - SLAAC: &newSLAAC, - Ranges: &newRanges, + SLAAC: newSLAAC, + Ranges: newRanges, IsPublic: copyValue(ipv6.IsPublic), } } @@ -230,7 +230,7 @@ func (i InstanceConfigInterface) GetUpdateOptions() InstanceConfigInterfaceUpdat copiedIPRanges := make([]string, len(i.IPRanges)) copy(copiedIPRanges, i.IPRanges) - opts.IPRanges = &copiedIPRanges + opts.IPRanges = copiedIPRanges } return opts diff --git a/instance_configs.go b/instance_configs.go index 089cf882b..a59962dc2 100644 --- a/instance_configs.go +++ b/instance_configs.go @@ -28,81 +28,81 @@ type InstanceConfig struct { // InstanceConfigDevice contains either the DiskID or VolumeID assigned to a Config Device type InstanceConfigDevice struct { - DiskID int `json:"disk_id,omitempty"` - VolumeID int `json:"volume_id,omitempty"` + DiskID int `json:"disk_id,omitzero"` + VolumeID int `json:"volume_id,omitzero"` } // InstanceConfigDeviceMap contains SDA-SDH InstanceConfigDevice settings type InstanceConfigDeviceMap struct { // sda-sdz - SDA *InstanceConfigDevice `json:"sda,omitempty"` - SDB *InstanceConfigDevice `json:"sdb,omitempty"` - SDC *InstanceConfigDevice `json:"sdc,omitempty"` - SDD *InstanceConfigDevice `json:"sdd,omitempty"` - SDE *InstanceConfigDevice `json:"sde,omitempty"` - SDF *InstanceConfigDevice `json:"sdf,omitempty"` - SDG *InstanceConfigDevice `json:"sdg,omitempty"` - SDH *InstanceConfigDevice `json:"sdh,omitempty"` - SDI *InstanceConfigDevice `json:"sdi,omitempty"` - SDJ *InstanceConfigDevice `json:"sdj,omitempty"` - SDK *InstanceConfigDevice `json:"sdk,omitempty"` - SDL *InstanceConfigDevice `json:"sdl,omitempty"` - SDM *InstanceConfigDevice `json:"sdm,omitempty"` - SDN *InstanceConfigDevice `json:"sdn,omitempty"` - SDO *InstanceConfigDevice `json:"sdo,omitempty"` - SDP *InstanceConfigDevice `json:"sdp,omitempty"` - SDQ *InstanceConfigDevice `json:"sdq,omitempty"` - SDR *InstanceConfigDevice `json:"sdr,omitempty"` - SDS *InstanceConfigDevice `json:"sds,omitempty"` - SDT *InstanceConfigDevice `json:"sdt,omitempty"` - SDU *InstanceConfigDevice `json:"sdu,omitempty"` - SDV *InstanceConfigDevice `json:"sdv,omitempty"` - SDW *InstanceConfigDevice `json:"sdw,omitempty"` - SDX *InstanceConfigDevice `json:"sdx,omitempty"` - SDY *InstanceConfigDevice `json:"sdy,omitempty"` - SDZ *InstanceConfigDevice `json:"sdz,omitempty"` + SDA *InstanceConfigDevice `json:"sda,omitzero"` + SDB *InstanceConfigDevice `json:"sdb,omitzero"` + SDC *InstanceConfigDevice `json:"sdc,omitzero"` + SDD *InstanceConfigDevice `json:"sdd,omitzero"` + SDE *InstanceConfigDevice `json:"sde,omitzero"` + SDF *InstanceConfigDevice `json:"sdf,omitzero"` + SDG *InstanceConfigDevice `json:"sdg,omitzero"` + SDH *InstanceConfigDevice `json:"sdh,omitzero"` + SDI *InstanceConfigDevice `json:"sdi,omitzero"` + SDJ *InstanceConfigDevice `json:"sdj,omitzero"` + SDK *InstanceConfigDevice `json:"sdk,omitzero"` + SDL *InstanceConfigDevice `json:"sdl,omitzero"` + SDM *InstanceConfigDevice `json:"sdm,omitzero"` + SDN *InstanceConfigDevice `json:"sdn,omitzero"` + SDO *InstanceConfigDevice `json:"sdo,omitzero"` + SDP *InstanceConfigDevice `json:"sdp,omitzero"` + SDQ *InstanceConfigDevice `json:"sdq,omitzero"` + SDR *InstanceConfigDevice `json:"sdr,omitzero"` + SDS *InstanceConfigDevice `json:"sds,omitzero"` + SDT *InstanceConfigDevice `json:"sdt,omitzero"` + SDU *InstanceConfigDevice `json:"sdu,omitzero"` + SDV *InstanceConfigDevice `json:"sdv,omitzero"` + SDW *InstanceConfigDevice `json:"sdw,omitzero"` + SDX *InstanceConfigDevice `json:"sdx,omitzero"` + SDY *InstanceConfigDevice `json:"sdy,omitzero"` + SDZ *InstanceConfigDevice `json:"sdz,omitzero"` // sdaa-sdaz - SDAA *InstanceConfigDevice `json:"sdaa,omitempty"` - SDAB *InstanceConfigDevice `json:"sdab,omitempty"` - SDAC *InstanceConfigDevice `json:"sdac,omitempty"` - SDAD *InstanceConfigDevice `json:"sdad,omitempty"` - SDAE *InstanceConfigDevice `json:"sdae,omitempty"` - SDAF *InstanceConfigDevice `json:"sdaf,omitempty"` - SDAG *InstanceConfigDevice `json:"sdag,omitempty"` - SDAH *InstanceConfigDevice `json:"sdah,omitempty"` - SDAI *InstanceConfigDevice `json:"sdai,omitempty"` - SDAJ *InstanceConfigDevice `json:"sdaj,omitempty"` - SDAK *InstanceConfigDevice `json:"sdak,omitempty"` - SDAL *InstanceConfigDevice `json:"sdal,omitempty"` - SDAM *InstanceConfigDevice `json:"sdam,omitempty"` - SDAN *InstanceConfigDevice `json:"sdan,omitempty"` - SDAO *InstanceConfigDevice `json:"sdao,omitempty"` - SDAP *InstanceConfigDevice `json:"sdap,omitempty"` - SDAQ *InstanceConfigDevice `json:"sdaq,omitempty"` - SDAR *InstanceConfigDevice `json:"sdar,omitempty"` - SDAS *InstanceConfigDevice `json:"sdas,omitempty"` - SDAT *InstanceConfigDevice `json:"sdat,omitempty"` - SDAU *InstanceConfigDevice `json:"sdau,omitempty"` - SDAV *InstanceConfigDevice `json:"sdav,omitempty"` - SDAW *InstanceConfigDevice `json:"sdaw,omitempty"` - SDAX *InstanceConfigDevice `json:"sdax,omitempty"` - SDAY *InstanceConfigDevice `json:"sday,omitempty"` - SDAZ *InstanceConfigDevice `json:"sdaz,omitempty"` + SDAA *InstanceConfigDevice `json:"sdaa,omitzero"` + SDAB *InstanceConfigDevice `json:"sdab,omitzero"` + SDAC *InstanceConfigDevice `json:"sdac,omitzero"` + SDAD *InstanceConfigDevice `json:"sdad,omitzero"` + SDAE *InstanceConfigDevice `json:"sdae,omitzero"` + SDAF *InstanceConfigDevice `json:"sdaf,omitzero"` + SDAG *InstanceConfigDevice `json:"sdag,omitzero"` + SDAH *InstanceConfigDevice `json:"sdah,omitzero"` + SDAI *InstanceConfigDevice `json:"sdai,omitzero"` + SDAJ *InstanceConfigDevice `json:"sdaj,omitzero"` + SDAK *InstanceConfigDevice `json:"sdak,omitzero"` + SDAL *InstanceConfigDevice `json:"sdal,omitzero"` + SDAM *InstanceConfigDevice `json:"sdam,omitzero"` + SDAN *InstanceConfigDevice `json:"sdan,omitzero"` + SDAO *InstanceConfigDevice `json:"sdao,omitzero"` + SDAP *InstanceConfigDevice `json:"sdap,omitzero"` + SDAQ *InstanceConfigDevice `json:"sdaq,omitzero"` + SDAR *InstanceConfigDevice `json:"sdar,omitzero"` + SDAS *InstanceConfigDevice `json:"sdas,omitzero"` + SDAT *InstanceConfigDevice `json:"sdat,omitzero"` + SDAU *InstanceConfigDevice `json:"sdau,omitzero"` + SDAV *InstanceConfigDevice `json:"sdav,omitzero"` + SDAW *InstanceConfigDevice `json:"sdaw,omitzero"` + SDAX *InstanceConfigDevice `json:"sdax,omitzero"` + SDAY *InstanceConfigDevice `json:"sday,omitzero"` + SDAZ *InstanceConfigDevice `json:"sdaz,omitzero"` // sdba-sdbl - SDBA *InstanceConfigDevice `json:"sdba,omitempty"` - SDBB *InstanceConfigDevice `json:"sdbb,omitempty"` - SDBC *InstanceConfigDevice `json:"sdbc,omitempty"` - SDBD *InstanceConfigDevice `json:"sdbd,omitempty"` - SDBE *InstanceConfigDevice `json:"sdbe,omitempty"` - SDBF *InstanceConfigDevice `json:"sdbf,omitempty"` - SDBG *InstanceConfigDevice `json:"sdbg,omitempty"` - SDBH *InstanceConfigDevice `json:"sdbh,omitempty"` - SDBI *InstanceConfigDevice `json:"sdbi,omitempty"` - SDBJ *InstanceConfigDevice `json:"sdbj,omitempty"` - SDBK *InstanceConfigDevice `json:"sdbk,omitempty"` - SDBL *InstanceConfigDevice `json:"sdbl,omitempty"` + SDBA *InstanceConfigDevice `json:"sdba,omitzero"` + SDBB *InstanceConfigDevice `json:"sdbb,omitzero"` + SDBC *InstanceConfigDevice `json:"sdbc,omitzero"` + SDBD *InstanceConfigDevice `json:"sdbd,omitzero"` + SDBE *InstanceConfigDevice `json:"sdbe,omitzero"` + SDBF *InstanceConfigDevice `json:"sdbf,omitzero"` + SDBG *InstanceConfigDevice `json:"sdbg,omitzero"` + SDBH *InstanceConfigDevice `json:"sdbh,omitzero"` + SDBI *InstanceConfigDevice `json:"sdbi,omitzero"` + SDBJ *InstanceConfigDevice `json:"sdbj,omitzero"` + SDBK *InstanceConfigDevice `json:"sdbk,omitzero"` + SDBL *InstanceConfigDevice `json:"sdbl,omitzero"` } // InstanceConfigHelpers are Instance Config options that control Linux distribution specific tweaks @@ -125,34 +125,34 @@ const ( // InstanceConfigCreateOptions are InstanceConfig settings that can be used at creation type InstanceConfigCreateOptions struct { - Label string `json:"label,omitempty"` - Comments string `json:"comments,omitempty"` + Label string `json:"label,omitzero"` + Comments string `json:"comments,omitzero"` Devices InstanceConfigDeviceMap `json:"devices"` - Helpers *InstanceConfigHelpers `json:"helpers,omitempty"` + Helpers *InstanceConfigHelpers `json:"helpers,omitzero"` Interfaces []InstanceConfigInterfaceCreateOptions `json:"interfaces"` - MemoryLimit int `json:"memory_limit,omitempty"` - Kernel string `json:"kernel,omitempty"` - InitRD int `json:"init_rd,omitempty"` - RootDevice *string `json:"root_device,omitempty"` - RunLevel string `json:"run_level,omitempty"` - VirtMode string `json:"virt_mode,omitempty"` + MemoryLimit int `json:"memory_limit,omitzero"` + Kernel string `json:"kernel,omitzero"` + InitRD int `json:"init_rd,omitzero"` + RootDevice *string `json:"root_device,omitzero"` + RunLevel string `json:"run_level,omitzero"` + VirtMode string `json:"virt_mode,omitzero"` } // InstanceConfigUpdateOptions are InstanceConfig settings that can be used in updates type InstanceConfigUpdateOptions struct { - Label string `json:"label,omitempty"` + Label string `json:"label,omitzero"` Comments string `json:"comments"` - Devices *InstanceConfigDeviceMap `json:"devices,omitempty"` - Helpers *InstanceConfigHelpers `json:"helpers,omitempty"` + Devices *InstanceConfigDeviceMap `json:"devices,omitzero"` + Helpers *InstanceConfigHelpers `json:"helpers,omitzero"` Interfaces []InstanceConfigInterfaceCreateOptions `json:"interfaces"` // MemoryLimit 0 means unlimitted, this is not omitted MemoryLimit int `json:"memory_limit"` - Kernel string `json:"kernel,omitempty"` + Kernel string `json:"kernel,omitzero"` // InitRD is nullable, permit the sending of null InitRD *int `json:"init_rd"` - RootDevice string `json:"root_device,omitempty"` - RunLevel string `json:"run_level,omitempty"` - VirtMode string `json:"virt_mode,omitempty"` + RootDevice string `json:"root_device,omitzero"` + RunLevel string `json:"run_level,omitzero"` + VirtMode string `json:"virt_mode,omitzero"` } // UnmarshalJSON implements the json.Unmarshaler interface diff --git a/instance_disks.go b/instance_disks.go index 6dc1b000f..375dd8ca6 100644 --- a/instance_disks.go +++ b/instance_disks.go @@ -47,16 +47,15 @@ type InstanceDiskCreateOptions struct { Label string `json:"label"` Size int `json:"size"` - // Image is optional, but requires at least one of RootPass, AuthorizedUsers, or AuthorizedKeys if provided - Image string `json:"image,omitempty"` - - RootPass string `json:"root_pass,omitempty"` - AuthorizedKeys []string `json:"authorized_keys,omitempty"` - AuthorizedUsers []string `json:"authorized_users,omitempty"` - - Filesystem string `json:"filesystem,omitempty"` - StackscriptID int `json:"stackscript_id,omitempty"` - StackscriptData map[string]string `json:"stackscript_data,omitempty"` + // Image is optional, but requires RootPass if provided + Image string `json:"image,omitzero"` + RootPass string `json:"root_pass,omitzero"` + + Filesystem string `json:"filesystem,omitzero"` + AuthorizedKeys []string `json:"authorized_keys,omitzero"` + AuthorizedUsers []string `json:"authorized_users,omitzero"` + StackscriptID int `json:"stackscript_id,omitzero"` + StackscriptData map[string]string `json:"stackscript_data,omitzero"` } // InstanceDiskUpdateOptions are InstanceDisk settings that can be used in updates diff --git a/instance_ips.go b/instance_ips.go index 943dbdd39..05724238b 100644 --- a/instance_ips.go +++ b/instance_ips.go @@ -35,6 +35,10 @@ type InstanceIP struct { Reserved bool `json:"reserved"` } +type InstanceIPAddressUpdateOptions struct { + RDNS **string `json:"rdns,omitzero"` +} + // VPCIP represents a private IP address in a VPC subnet with additional networking details type VPCIP struct { Address *string `json:"address"` @@ -139,7 +143,7 @@ func (c *Client) AddInstanceIPAddress(ctx context.Context, linodeID int, public } // UpdateInstanceIPAddress updates the IPAddress with the specified instance id and IP address -func (c *Client) UpdateInstanceIPAddress(ctx context.Context, linodeID int, ipAddress string, opts IPAddressUpdateOptions) (*InstanceIP, error) { +func (c *Client) UpdateInstanceIPAddress(ctx context.Context, linodeID int, ipAddress string, opts InstanceIPAddressUpdateOptions) (*InstanceIP, error) { e := formatAPIPath("linode/instances/%d/ips/%s", linodeID, ipAddress) return doPUTRequest[InstanceIP](ctx, c, e, opts) } diff --git a/instances.go b/instances.go index b68d83094..b0a602d2e 100644 --- a/instances.go +++ b/instances.go @@ -100,12 +100,12 @@ type InstanceAlert struct { // InstanceBackup represents backup settings for an instance type InstanceBackup struct { - Available bool `json:"available,omitempty"` // read-only - Enabled bool `json:"enabled,omitempty"` // read-only - LastSuccessful *time.Time `json:"-"` // read-only + Available bool `json:"available,omitzero"` // read-only + Enabled bool `json:"enabled,omitzero"` // read-only + LastSuccessful *time.Time `json:"-"` // read-only Schedule struct { - Day string `json:"day,omitempty"` - Window string `json:"window,omitempty"` + Day string `json:"day,omitzero"` + Window string `json:"window,omitzero"` } `json:"schedule"` } @@ -128,22 +128,8 @@ type InstanceTransfer struct { Quota int `json:"quota"` } -// Deprecated: use MonthlyInstanceTransferStatsV2 for new implementations -// // MonthlyInstanceTransferStats pool stats for a Linode Instance network transfer statistics for a specific month type MonthlyInstanceTransferStats struct { - // The amount of inbound public network traffic received by this Linode, in bytes, for a specific year/month. - BytesIn int `json:"bytes_in"` - - // The amount of outbound public network traffic sent by this Linode, in bytes, for a specific year/month. - BytesOut int `json:"bytes_out"` - - // The total amount of public network traffic sent and received by this Linode, in bytes, for a specific year/month. - BytesTotal int `json:"bytes_total"` -} - -// MonthlyInstanceTransferStatsV2 pool stats for a Linode Instance network transfer statistics for a specific month -type MonthlyInstanceTransferStatsV2 struct { // The amount of inbound public network traffic received by this Linode, in bytes, for a specific year/month. BytesIn uint64 `json:"bytes_in"` @@ -168,7 +154,7 @@ type InstancePlacementGroup struct { // that relate to the Linode Metadata service. type InstanceMetadataOptions struct { // UserData expects a Base64-encoded string - UserData string `json:"user_data,omitempty"` + UserData string `json:"user_data,omitzero"` } // InstancePasswordResetOptions specifies the new password for the Linode @@ -178,30 +164,25 @@ type InstancePasswordResetOptions struct { // InstanceCreateOptions require only Region and Type type InstanceCreateOptions struct { - Region string `json:"region"` - Type string `json:"type"` - Label string `json:"label,omitempty"` - - StackScriptID int `json:"stackscript_id,omitempty"` - StackScriptData map[string]string `json:"stackscript_data,omitempty"` - BackupID int `json:"backup_id,omitempty"` - - // Image is optional, but requires at least one of RootPass, AuthorizedUsers, or AuthorizedKeys if provided - Image string `json:"image,omitempty"` - - RootPass string `json:"root_pass,omitempty"` - AuthorizedKeys []string `json:"authorized_keys,omitempty"` - AuthorizedUsers []string `json:"authorized_users,omitempty"` - - BackupsEnabled bool `json:"backups_enabled,omitempty"` - PrivateIP bool `json:"private_ip,omitempty"` - NetworkHelper *bool `json:"network_helper,omitempty"` - Tags []string `json:"tags,omitempty"` - Metadata *InstanceMetadataOptions `json:"metadata,omitempty"` - FirewallID int `json:"firewall_id,omitempty"` - InterfaceGeneration InterfaceGeneration `json:"interface_generation,omitempty"` - DiskEncryption InstanceDiskEncryption `json:"disk_encryption,omitempty"` - PlacementGroup *InstanceCreatePlacementGroupOptions `json:"placement_group,omitempty"` + Region string `json:"region"` + Type string `json:"type"` + Label string `json:"label,omitzero"` + RootPass string `json:"root_pass,omitzero"` + AuthorizedKeys []string `json:"authorized_keys,omitzero"` + AuthorizedUsers []string `json:"authorized_users,omitzero"` + StackScriptID int `json:"stackscript_id,omitzero"` + StackScriptData map[string]string `json:"stackscript_data,omitzero"` + BackupID int `json:"backup_id,omitzero"` + Image string `json:"image,omitzero"` + BackupsEnabled bool `json:"backups_enabled,omitzero"` + PrivateIP bool `json:"private_ip,omitzero"` + NetworkHelper *bool `json:"network_helper,omitzero"` + Tags []string `json:"tags,omitzero"` + Metadata *InstanceMetadataOptions `json:"metadata,omitzero"` + FirewallID int `json:"firewall_id,omitzero"` + InterfaceGeneration InterfaceGeneration `json:"interface_generation,omitzero"` + DiskEncryption InstanceDiskEncryption `json:"disk_encryption,omitzero"` + PlacementGroup *InstanceCreatePlacementGroupOptions `json:"placement_group,omitzero"` // Linode Interfaces to create the new instance with. // Conflicts with Interfaces. @@ -212,38 +193,33 @@ type InstanceCreateOptions struct { Interfaces []InstanceConfigInterfaceCreateOptions `json:"-"` // Creation fields that need to be set explicitly false, "", or 0 use pointers - SwapSize *int `json:"swap_size,omitempty"` - Booted *bool `json:"booted,omitempty"` + SwapSize *int `json:"swap_size,omitzero"` + Booted *bool `json:"booted,omitzero"` - // Deprecated: group is a deprecated property denoting a group label for the Linode. - Group string `json:"group,omitempty"` + IPv4 []string `json:"ipv4,omitzero"` - IPv4 []string `json:"ipv4,omitempty"` + MaintenancePolicy *string `json:"maintenance_policy,omitzero"` - MaintenancePolicy *string `json:"maintenance_policy,omitempty"` - Kernel *string `json:"kernel,omitzero"` - BootSize *int `json:"boot_size,omitzero"` + Kernel *string `json:"kernel,omitzero"` + BootSize *int `json:"boot_size,omitzero"` } // InstanceCreatePlacementGroupOptions represents the placement group // to create this Linode under. type InstanceCreatePlacementGroupOptions struct { ID int `json:"id"` - CompliantOnly *bool `json:"compliant_only,omitempty"` + CompliantOnly *bool `json:"compliant_only,omitzero"` } // InstanceUpdateOptions is an options struct used when Updating an Instance type InstanceUpdateOptions struct { - Label string `json:"label,omitempty"` - Backups *InstanceBackup `json:"backups,omitempty"` - Alerts *InstanceAlert `json:"alerts,omitempty"` - WatchdogEnabled *bool `json:"watchdog_enabled,omitempty"` - Tags *[]string `json:"tags,omitempty"` - - // Deprecated: group is a deprecated property denoting a group label for the Linode. - Group *string `json:"group,omitempty"` + Label string `json:"label,omitzero"` + Backups *InstanceBackup `json:"backups,omitzero"` + Alerts *InstanceAlert `json:"alerts,omitzero"` + WatchdogEnabled *bool `json:"watchdog_enabled,omitzero"` + Tags []string `json:"tags,omitzero"` - MaintenancePolicy *string `json:"maintenance_policy,omitempty"` + MaintenancePolicy *string `json:"maintenance_policy,omitzero"` } // MarshalJSON contains logic necessary to populate the `interfaces` field of @@ -255,7 +231,7 @@ func (i InstanceCreateOptions) MarshalJSON() ([]byte, error) { resultData := struct { *Mask - Interfaces any `json:"interfaces,omitempty"` + Interfaces any `json:"interfaces,omitzero"` }{ Mask: (*Mask)(&i), Interfaces: nil, @@ -284,7 +260,7 @@ func (i *InstanceCreateOptions) UnmarshalJSON(b []byte) error { p := struct { *Mask - GenericInterfaces any `json:"interfaces,omitempty"` + GenericInterfaces any `json:"interfaces,omitzero"` }{ Mask: (*Mask)(i), } @@ -371,50 +347,46 @@ func (backup *InstanceBackup) UnmarshalJSON(b []byte) error { func (i *Instance) GetUpdateOptions() InstanceUpdateOptions { return InstanceUpdateOptions{ Label: i.Label, - Group: &i.Group, Backups: i.Backups, Alerts: i.Alerts, WatchdogEnabled: &i.WatchdogEnabled, - Tags: &i.Tags, + Tags: i.Tags, MaintenancePolicy: &i.MaintenancePolicy, } } // InstanceCloneOptions is an options struct sent when Cloning an Instance type InstanceCloneOptions struct { - Region string `json:"region,omitempty"` - Type string `json:"type,omitempty"` + Region string `json:"region,omitzero"` + Type string `json:"type,omitzero"` // LinodeID is an optional existing instance to use as the target of the clone - LinodeID int `json:"linode_id,omitempty"` - Label string `json:"label,omitempty"` + LinodeID int `json:"linode_id,omitzero"` + Label string `json:"label,omitzero"` BackupsEnabled bool `json:"backups_enabled"` - Disks []int `json:"disks,omitempty"` - Configs []int `json:"configs,omitempty"` - PrivateIP bool `json:"private_ip,omitempty"` - Metadata *InstanceMetadataOptions `json:"metadata,omitempty"` - PlacementGroup *InstanceCreatePlacementGroupOptions `json:"placement_group,omitempty"` - - // Deprecated: group is a deprecated property denoting a group label for the Linode. - Group string `json:"group,omitempty"` + Disks []int `json:"disks,omitzero"` + Configs []int `json:"configs,omitzero"` + PrivateIP bool `json:"private_ip,omitzero"` + Metadata *InstanceMetadataOptions `json:"metadata,omitzero"` + PlacementGroup *InstanceCreatePlacementGroupOptions `json:"placement_group,omitzero"` } // InstanceResizeOptions is an options struct used when resizing an instance type InstanceResizeOptions struct { Type string `json:"type"` - MigrationType InstanceMigrationType `json:"migration_type,omitempty"` + MigrationType InstanceMigrationType `json:"migration_type,omitzero"` // When enabled, an instance resize will also resize a data disk if the instance has no more than one data disk and one swap disk - AllowAutoDiskResize *bool `json:"allow_auto_disk_resize,omitempty"` + AllowAutoDiskResize *bool `json:"allow_auto_disk_resize,omitzero"` } // InstanceMigrateOptions is an options struct used when migrating an instance type InstanceMigrateOptions struct { - Type InstanceMigrationType `json:"type,omitempty"` - Region string `json:"region,omitempty"` - Upgrade *bool `json:"upgrade,omitempty"` + Type InstanceMigrationType `json:"type,omitzero"` + Region string `json:"region,omitzero"` + Upgrade *bool `json:"upgrade,omitzero"` - PlacementGroup *InstanceCreatePlacementGroupOptions `json:"placement_group,omitempty"` + PlacementGroup *InstanceCreatePlacementGroupOptions `json:"placement_group,omitzero"` } // ListInstances lists linode instances @@ -440,12 +412,6 @@ func (c *Client) GetInstanceTransferMonthly(ctx context.Context, linodeID, year, return doGETRequest[MonthlyInstanceTransferStats](ctx, c, e) } -// GetInstanceTransferMonthlyV2 gets the instance's network transfer pool statistics for a specific month. -func (c *Client) GetInstanceTransferMonthlyV2(ctx context.Context, linodeID, year, month int) (*MonthlyInstanceTransferStatsV2, error) { - e := formatAPIPath("linode/instances/%d/transfer/%d/%d", linodeID, year, month) - return doGETRequest[MonthlyInstanceTransferStatsV2](ctx, c, e) -} - // CreateInstance creates a Linode instance func (c *Client) CreateInstance(ctx context.Context, opts InstanceCreateOptions) (*Instance, error) { return doPOSTRequest[Instance](ctx, c, "linode/instances", opts) @@ -510,19 +476,16 @@ func (c *Client) RebootInstance(ctx context.Context, linodeID int, configID int) // InstanceRebuildOptions is a struct representing the options to send to the rebuild linode endpoint type InstanceRebuildOptions struct { - // Image is the image to deploy when rebuilding the Linode - Image string `json:"image,omitempty"` - - RootPass string `json:"root_pass,omitempty"` - AuthorizedKeys []string `json:"authorized_keys,omitempty"` - AuthorizedUsers []string `json:"authorized_users,omitempty"` - - StackScriptID int `json:"stackscript_id,omitempty"` - StackScriptData map[string]string `json:"stackscript_data,omitempty"` - Booted *bool `json:"booted,omitempty"` - Metadata *InstanceMetadataOptions `json:"metadata,omitempty"` - Type string `json:"type,omitempty"` - DiskEncryption InstanceDiskEncryption `json:"disk_encryption,omitempty"` + Image string `json:"image,omitzero"` + RootPass string `json:"root_pass,omitzero"` + AuthorizedKeys []string `json:"authorized_keys,omitzero"` + AuthorizedUsers []string `json:"authorized_users,omitzero"` + StackScriptID int `json:"stackscript_id,omitzero"` + StackScriptData map[string]string `json:"stackscript_data,omitzero"` + Booted *bool `json:"booted,omitzero"` + Metadata *InstanceMetadataOptions `json:"metadata,omitzero"` + Type string `json:"type,omitzero"` + DiskEncryption InstanceDiskEncryption `json:"disk_encryption,omitzero"` } // RebuildInstance Deletes all Disks and Configs on this Linode, @@ -557,12 +520,6 @@ func (c *Client) ShutdownInstance(ctx context.Context, id int) error { return c.simpleInstanceAction(ctx, "shutdown", id) } -// Deprecated: Please use UpgradeInstance instead. -// MutateInstance Upgrades a Linode to its next generation. -func (c *Client) MutateInstance(ctx context.Context, id int) error { - return c.simpleInstanceAction(ctx, "mutate", id) -} - // InstanceUpgradeOptions is a struct representing the options for upgrading a Linode type InstanceUpgradeOptions struct { // Automatically resize disks when resizing a Linode. diff --git a/interfaces.go b/interfaces.go index b2d4e53c4..7d812c820 100644 --- a/interfaces.go +++ b/interfaces.go @@ -21,8 +21,8 @@ type LinodeInterface struct { } type InterfaceDefaultRoute struct { - IPv4 *bool `json:"ipv4,omitempty"` - IPv6 *bool `json:"ipv6,omitempty"` + IPv4 *bool `json:"ipv4,omitzero"` + IPv6 *bool `json:"ipv6,omitzero"` } type PublicInterface struct { @@ -108,39 +108,39 @@ type VPCInterfaceIPv6Range struct { type VLANInterface struct { VLANLabel string `json:"vlan_label"` - IPAMAddress *string `json:"ipam_address,omitempty"` + IPAMAddress *string `json:"ipam_address,omitzero"` } type LinodeInterfaceCreateOptions struct { - FirewallID *int `json:"firewall_id,omitempty"` - DefaultRoute *InterfaceDefaultRoute `json:"default_route,omitempty"` - Public *PublicInterfaceCreateOptions `json:"public,omitempty"` - VPC *VPCInterfaceCreateOptions `json:"vpc,omitempty"` - VLAN *VLANInterface `json:"vlan,omitempty"` + FirewallID *int `json:"firewall_id,omitzero"` + DefaultRoute *InterfaceDefaultRoute `json:"default_route,omitzero"` + Public *PublicInterfaceCreateOptions `json:"public,omitzero"` + VPC *VPCInterfaceCreateOptions `json:"vpc,omitzero"` + VLAN *VLANInterface `json:"vlan,omitzero"` } type LinodeInterfaceUpdateOptions struct { - DefaultRoute *InterfaceDefaultRoute `json:"default_route,omitempty"` - Public *PublicInterfaceCreateOptions `json:"public,omitempty"` - VPC *VPCInterfaceUpdateOptions `json:"vpc,omitempty"` + DefaultRoute *InterfaceDefaultRoute `json:"default_route,omitzero"` + Public *PublicInterfaceCreateOptions `json:"public,omitzero"` + VPC *VPCInterfaceUpdateOptions `json:"vpc,omitzero"` } type PublicInterfaceCreateOptions struct { - IPv4 *PublicInterfaceIPv4CreateOptions `json:"ipv4,omitempty"` - IPv6 *PublicInterfaceIPv6CreateOptions `json:"ipv6,omitempty"` + IPv4 *PublicInterfaceIPv4CreateOptions `json:"ipv4,omitzero"` + IPv6 *PublicInterfaceIPv6CreateOptions `json:"ipv6,omitzero"` } type PublicInterfaceIPv4CreateOptions struct { - Addresses *[]PublicInterfaceIPv4AddressCreateOptions `json:"addresses,omitempty"` + Addresses []PublicInterfaceIPv4AddressCreateOptions `json:"addresses,omitzero"` } type PublicInterfaceIPv4AddressCreateOptions struct { - Address *string `json:"address,omitempty"` - Primary *bool `json:"primary,omitempty"` + Address *string `json:"address,omitzero"` + Primary *bool `json:"primary,omitzero"` } type PublicInterfaceIPv6CreateOptions struct { - Ranges *[]PublicInterfaceIPv6RangeCreateOptions `json:"ranges,omitempty"` + Ranges []PublicInterfaceIPv6RangeCreateOptions `json:"ranges,omitzero"` } type PublicInterfaceIPv6RangeCreateOptions struct { @@ -149,19 +149,19 @@ type PublicInterfaceIPv6RangeCreateOptions struct { type VPCInterfaceCreateOptions struct { SubnetID int `json:"subnet_id"` - IPv4 *VPCInterfaceIPv4CreateOptions `json:"ipv4,omitempty"` - IPv6 *VPCInterfaceIPv6CreateOptions `json:"ipv6,omitempty"` + IPv4 *VPCInterfaceIPv4CreateOptions `json:"ipv4,omitzero"` + IPv6 *VPCInterfaceIPv6CreateOptions `json:"ipv6,omitzero"` } type VPCInterfaceIPv4CreateOptions struct { - Addresses *[]VPCInterfaceIPv4AddressCreateOptions `json:"addresses,omitempty"` - Ranges *[]VPCInterfaceIPv4RangeCreateOptions `json:"ranges,omitempty"` + Addresses []VPCInterfaceIPv4AddressCreateOptions `json:"addresses,omitzero"` + Ranges []VPCInterfaceIPv4RangeCreateOptions `json:"ranges,omitzero"` } type VPCInterfaceIPv4AddressCreateOptions struct { - Address *string `json:"address,omitempty"` - Primary *bool `json:"primary,omitempty"` - NAT1To1Address *string `json:"nat_1_1_address,omitempty"` + Address *string `json:"address,omitzero"` + Primary *bool `json:"primary,omitzero"` + NAT1To1Address *string `json:"nat_1_1_address,omitzero"` } type VPCInterfaceIPv4RangeCreateOptions struct { @@ -171,9 +171,9 @@ type VPCInterfaceIPv4RangeCreateOptions struct { // VPCInterfaceIPv6CreateOptions specifies IPv6 configuration parameters for VPC creation. // NOTE: IPv6 interfaces may not currently be available to all users. type VPCInterfaceIPv6CreateOptions struct { - SLAAC *[]VPCInterfaceIPv6SLAACCreateOptions `json:"slaac,omitempty"` - Ranges *[]VPCInterfaceIPv6RangeCreateOptions `json:"ranges,omitempty"` - IsPublic *bool `json:"is_public"` + SLAAC []VPCInterfaceIPv6SLAACCreateOptions `json:"slaac,omitzero"` + Ranges []VPCInterfaceIPv6RangeCreateOptions `json:"ranges,omitzero"` + IsPublic *bool `json:"is_public"` } // VPCInterfaceIPv6SLAACCreateOptions defines the IPv6 SLAAC configuration parameters for VPC creation. @@ -189,8 +189,8 @@ type VPCInterfaceIPv6RangeCreateOptions struct { } type VPCInterfaceUpdateOptions struct { - IPv4 *VPCInterfaceIPv4CreateOptions `json:"ipv4,omitempty"` - IPv6 *VPCInterfaceIPv6CreateOptions `json:"ipv6,omitempty"` + IPv4 *VPCInterfaceIPv4CreateOptions `json:"ipv4,omitzero"` + IPv6 *VPCInterfaceIPv6CreateOptions `json:"ipv6,omitzero"` } type LinodeInterfacesUpgrade struct { @@ -200,8 +200,8 @@ type LinodeInterfacesUpgrade struct { } type LinodeInterfacesUpgradeOptions struct { - ConfigID *int `json:"config_id,omitempty"` - DryRun *bool `json:"dry_run,omitempty"` + ConfigID *int `json:"config_id,omitzero"` + DryRun *bool `json:"dry_run,omitzero"` } type InterfaceSettings struct { @@ -210,13 +210,13 @@ type InterfaceSettings struct { } type InterfaceSettingsUpdateOptions struct { - NetworkHelper *bool `json:"network_helper,omitempty"` - DefaultRoute *InterfaceDefaultRouteSettingUpdateOptions `json:"default_route,omitempty"` + NetworkHelper *bool `json:"network_helper,omitzero"` + DefaultRoute *InterfaceDefaultRouteSettingUpdateOptions `json:"default_route,omitzero"` } type InterfaceDefaultRouteSettingUpdateOptions struct { - IPv4InterfaceID *int `json:"ipv4_interface_id,omitempty"` - IPv6InterfaceID *int `json:"ipv6_interface_id,omitempty"` + IPv4InterfaceID *int `json:"ipv4_interface_id,omitzero"` + IPv6InterfaceID *int `json:"ipv6_interface_id,omitzero"` } type InterfaceDefaultRouteSetting struct { diff --git a/internal/testutil/mock.go b/internal/testutil/mock.go index c8235ce65..752b27f9f 100644 --- a/internal/testutil/mock.go +++ b/internal/testutil/mock.go @@ -116,15 +116,15 @@ type TestLogger struct { } func (l *TestLogger) Errorf(format string, v ...any) { - l.outputf("ERROR RESTY "+format, v...) + l.outputf("ERROR "+format, v...) } func (l *TestLogger) Warnf(format string, v ...any) { - l.outputf("WARN RESTY "+format, v...) + l.outputf("WARN "+format, v...) } func (l *TestLogger) Debugf(format string, v ...any) { - l.outputf("DEBUG RESTY "+format, v...) + l.outputf("DEBUG "+format, v...) } func (l *TestLogger) outputf(format string, v ...any) { diff --git a/k8s/go.mod b/k8s/go.mod index d31b1238f..2d0373b94 100644 --- a/k8s/go.mod +++ b/k8s/go.mod @@ -14,7 +14,6 @@ require ( github.com/go-openapi/jsonpointer v0.19.6 // indirect github.com/go-openapi/jsonreference v0.20.2 // indirect github.com/go-openapi/swag v0.22.3 // indirect - github.com/go-resty/resty/v2 v2.17.2 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/protobuf v1.5.4 // indirect github.com/google/gnostic-models v0.6.8 // indirect diff --git a/k8s/go.sum b/k8s/go.sum index 7c61f0e02..1da7bf2d8 100644 --- a/k8s/go.sum +++ b/k8s/go.sum @@ -12,8 +12,6 @@ github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2Kv github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g= github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= -github.com/go-resty/resty/v2 v2.17.2 h1:FQW5oHYcIlkCNrMD2lloGScxcHJ0gkjshV3qcQAyHQk= -github.com/go-resty/resty/v2 v2.17.2/go.mod h1:kCKZ3wWmwJaNc7S29BRtUhJwy7iqmn+2mLtQrOyQlVA= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= diff --git a/kernels.go b/kernels.go index 11d647dba..079458b73 100644 --- a/kernels.go +++ b/kernels.go @@ -10,16 +10,14 @@ import ( // LinodeKernel represents a Linode Instance kernel object type LinodeKernel struct { - ID string `json:"id"` - Label string `json:"label"` - Version string `json:"version"` - Architecture string `json:"architecture"` - Deprecated bool `json:"deprecated"` - KVM bool `json:"kvm"` - // Deprecated: this field is no longer populated by the API, but it is included here for backward compatibility with existing implementations. - XEN bool `json:"xen"` - PVOPS bool `json:"pvops"` - Built *time.Time `json:"-"` + ID string `json:"id"` + Label string `json:"label"` + Version string `json:"version"` + Architecture string `json:"architecture"` + Deprecated bool `json:"deprecated"` + KVM bool `json:"kvm"` + PVOPS bool `json:"pvops"` + Built *time.Time `json:"-"` } // UnmarshalJSON implements the json.Unmarshaler interface diff --git a/lke_cluster_pools.go b/lke_cluster_pools.go deleted file mode 100644 index 5f5207655..000000000 --- a/lke_cluster_pools.go +++ /dev/null @@ -1,53 +0,0 @@ -package linodego - -import ( - "context" -) - -// Deprecated: LKEClusterPoolDisk represents a Node disk in an LKEClusterPool object -type LKEClusterPoolDisk = LKENodePoolDisk - -// Deprecated: LKEClusterPoolAutoscaler represents an AutoScaler configuration -type LKEClusterPoolAutoscaler = LKENodePoolAutoscaler - -// Deprecated: LKEClusterPoolLinode represents a LKEClusterPoolLinode object -type LKEClusterPoolLinode = LKENodePoolLinode - -// Deprecated: LKEClusterPool represents a LKEClusterPool object -type LKEClusterPool = LKENodePool - -// Deprecated: LKEClusterPoolCreateOptions fields are those accepted by CreateLKEClusterPool -type LKEClusterPoolCreateOptions = LKENodePoolCreateOptions - -// Deprecated: LKEClusterPoolUpdateOptions fields are those accepted by UpdateLKEClusterPool -type LKEClusterPoolUpdateOptions = LKENodePoolUpdateOptions - -// Deprecated: ListLKEClusterPools lists LKEClusterPools -func (c *Client) ListLKEClusterPools(ctx context.Context, clusterID int, opts *ListOptions) ([]LKEClusterPool, error) { - return c.ListLKENodePools(ctx, clusterID, opts) -} - -// Deprecated: GetLKEClusterPool gets the lkeClusterPool with the provided ID -func (c *Client) GetLKEClusterPool(ctx context.Context, clusterID, id int) (*LKEClusterPool, error) { - return c.GetLKENodePool(ctx, clusterID, id) -} - -// Deprecated: CreateLKEClusterPool creates a LKEClusterPool -func (c *Client) CreateLKEClusterPool(ctx context.Context, clusterID int, createOpts LKEClusterPoolCreateOptions) (*LKEClusterPool, error) { - return c.CreateLKENodePool(ctx, clusterID, createOpts) -} - -// Deprecated: UpdateLKEClusterPool updates the LKEClusterPool with the specified id -func (c *Client) UpdateLKEClusterPool(ctx context.Context, clusterID, id int, updateOpts LKEClusterPoolUpdateOptions) (*LKEClusterPool, error) { - return c.UpdateLKENodePool(ctx, clusterID, id, updateOpts) -} - -// Deprecated: DeleteLKEClusterPool deletes the LKEClusterPool with the specified id -func (c *Client) DeleteLKEClusterPool(ctx context.Context, clusterID, id int) error { - return c.DeleteLKENodePool(ctx, clusterID, id) -} - -// Deprecated: DeleteLKEClusterPoolNode deletes a given node from a cluster pool -func (c *Client) DeleteLKEClusterPoolNode(ctx context.Context, clusterID int, id string) error { - return c.DeleteLKENodePoolNode(ctx, clusterID, id) -} diff --git a/lke_clusters.go b/lke_clusters.go index 786b6faaf..0fadf2f70 100644 --- a/lke_clusters.go +++ b/lke_clusters.go @@ -55,27 +55,27 @@ type LKEClusterCreateOptions struct { Label string `json:"label"` Region string `json:"region"` K8sVersion string `json:"k8s_version"` - Tags []string `json:"tags,omitempty"` - ControlPlane *LKEClusterControlPlaneOptions `json:"control_plane,omitempty"` + Tags []string `json:"tags,omitzero"` + ControlPlane *LKEClusterControlPlaneOptions `json:"control_plane,omitzero"` // NOTE: Tier may not currently be available to all users and can only be used with v4beta. - Tier string `json:"tier,omitempty"` + Tier string `json:"tier,omitzero"` // NOTE: APLEnabled is currently in beta and may only function with API version v4beta. - APLEnabled bool `json:"apl_enabled,omitempty"` + APLEnabled bool `json:"apl_enabled,omitzero"` // NOTE: SubnetID, VpcID, and StackType may not currently be available to all users and can only be used with v4beta. - SubnetID *int `json:"subnet_id,omitempty"` - VpcID *int `json:"vpc_id,omitempty"` - StackType *LKEClusterStackType `json:"stack_type,omitempty"` + SubnetID *int `json:"subnet_id,omitzero"` + VpcID *int `json:"vpc_id,omitzero"` + StackType *LKEClusterStackType `json:"stack_type,omitzero"` } // LKEClusterUpdateOptions fields are those accepted by UpdateLKECluster type LKEClusterUpdateOptions struct { - K8sVersion string `json:"k8s_version,omitempty"` - Label string `json:"label,omitempty"` - Tags *[]string `json:"tags,omitempty"` - ControlPlane *LKEClusterControlPlaneOptions `json:"control_plane,omitempty"` + K8sVersion string `json:"k8s_version,omitzero"` + Label string `json:"label,omitzero"` + Tags []string `json:"tags,omitzero"` + ControlPlane *LKEClusterControlPlaneOptions `json:"control_plane,omitzero"` } // LKEClusterAPIEndpoint fields are those returned by ListLKEClusterAPIEndpoints @@ -165,7 +165,7 @@ func (i LKECluster) GetCreateOptions() (o LKEClusterCreateOptions) { func (i LKECluster) GetUpdateOptions() (o LKEClusterUpdateOptions) { o.K8sVersion = i.K8sVersion o.Label = i.Label - o.Tags = &i.Tags + o.Tags = i.Tags isHA := i.ControlPlane.HighAvailability diff --git a/lke_clusters_control_plane.go b/lke_clusters_control_plane.go index 5a3544a25..86a062186 100644 --- a/lke_clusters_control_plane.go +++ b/lke_clusters_control_plane.go @@ -7,7 +7,7 @@ type LKEClusterControlPlane struct { HighAvailability bool `json:"high_availability"` // AuditLogsEnabled may not currently be available to all users and can only be used with v4beta. - AuditLogsEnabled bool `json:"audit_logs_enabled,omitempty"` + AuditLogsEnabled bool `json:"audit_logs_enabled,omitzero"` } // LKEClusterControlPlaneACLAddresses describes the @@ -28,26 +28,26 @@ type LKEClusterControlPlaneACL struct { // LKEClusterControlPlaneACLAddressesOptions are the options used to // specify the allowed IP ranges for an LKE cluster's control plane. type LKEClusterControlPlaneACLAddressesOptions struct { - IPv4 *[]string `json:"ipv4,omitempty"` - IPv6 *[]string `json:"ipv6,omitempty"` + IPv4 []string `json:"ipv4,omitzero"` + IPv6 []string `json:"ipv6,omitzero"` } // LKEClusterControlPlaneACLOptions represents the options used when // configuring an LKE cluster's control plane ACL policy. type LKEClusterControlPlaneACLOptions struct { - Enabled *bool `json:"enabled,omitempty"` - Addresses *LKEClusterControlPlaneACLAddressesOptions `json:"addresses,omitempty"` - RevisionID string `json:"revision-id,omitempty"` + Enabled *bool `json:"enabled,omitzero"` + Addresses *LKEClusterControlPlaneACLAddressesOptions `json:"addresses,omitzero"` + RevisionID string `json:"revision-id,omitzero"` } // LKEClusterControlPlaneOptions represents the options used when // configuring an LKE cluster's control plane. type LKEClusterControlPlaneOptions struct { - HighAvailability *bool `json:"high_availability,omitempty"` - ACL *LKEClusterControlPlaneACLOptions `json:"acl,omitempty"` + HighAvailability *bool `json:"high_availability,omitzero"` + ACL *LKEClusterControlPlaneACLOptions `json:"acl,omitzero"` // AuditLogsEnabled may not currently be available to all users and can only be used with v4beta. - AuditLogsEnabled *bool `json:"audit_logs_enabled,omitempty"` + AuditLogsEnabled *bool `json:"audit_logs_enabled,omitzero"` } // LKEClusterControlPlaneACLUpdateOptions represents the options diff --git a/lke_node_pools.go b/lke_node_pools.go index b50507d6d..3efbc21ee 100644 --- a/lke_node_pools.go +++ b/lke_node_pools.go @@ -55,7 +55,7 @@ const ( // LKENodePoolTaint represents a corev1.Taint to add to an LKENodePool type LKENodePoolTaint struct { Key string `json:"key"` - Value string `json:"value,omitempty"` + Value string `json:"value,omitzero"` Effect LKENodePoolTaintEffect `json:"effect"` } @@ -75,14 +75,14 @@ type LKENodePool struct { Label *string `json:"label"` Autoscaler LKENodePoolAutoscaler `json:"autoscaler"` - FirewallID *int `json:"firewall_id,omitempty"` + FirewallID *int `json:"firewall_id,omitzero"` - DiskEncryption InstanceDiskEncryption `json:"disk_encryption,omitempty"` + DiskEncryption InstanceDiskEncryption `json:"disk_encryption,omitzero"` // K8sVersion and UpdateStrategy are only for LKE Enterprise to support node pool upgrades. // It may not currently be available to all users and is under v4beta. - K8sVersion *string `json:"k8s_version,omitempty"` - UpdateStrategy *LKENodePoolUpdateStrategy `json:"update_strategy,omitempty"` + K8sVersion *string `json:"k8s_version,omitzero"` + UpdateStrategy *LKENodePoolUpdateStrategy `json:"update_strategy,omitzero"` } // LKENodePoolCreateOptions fields are those accepted by CreateLKENodePool @@ -93,34 +93,34 @@ type LKENodePoolCreateOptions struct { Tags []string `json:"tags"` Labels LKENodePoolLabels `json:"labels"` Taints []LKENodePoolTaint `json:"taints"` - Label *string `json:"label,omitempty"` + Label *string `json:"label,omitzero"` - Autoscaler *LKENodePoolAutoscaler `json:"autoscaler,omitempty"` - FirewallID *int `json:"firewall_id,omitempty"` + Autoscaler *LKENodePoolAutoscaler `json:"autoscaler,omitzero"` + FirewallID *int `json:"firewall_id,omitzero"` // K8sVersion and UpdateStrategy only works for LKE Enterprise to support node pool upgrades. // It may not currently be available to all users and is under v4beta. - K8sVersion *string `json:"k8s_version,omitempty"` - UpdateStrategy *LKENodePoolUpdateStrategy `json:"update_strategy,omitempty"` + K8sVersion *string `json:"k8s_version,omitzero"` + UpdateStrategy *LKENodePoolUpdateStrategy `json:"update_strategy,omitzero"` - DiskEncryption *InstanceDiskEncryption `json:"disk_encryption,omitempty"` + DiskEncryption *InstanceDiskEncryption `json:"disk_encryption,omitzero"` } // LKENodePoolUpdateOptions fields are those accepted by UpdateLKENodePoolUpdate type LKENodePoolUpdateOptions struct { - Count int `json:"count,omitempty"` - Tags *[]string `json:"tags,omitempty"` - Labels *LKENodePoolLabels `json:"labels,omitempty"` - Taints *[]LKENodePoolTaint `json:"taints,omitempty"` - Label *string `json:"label,omitempty"` + Count int `json:"count,omitzero"` + Tags []string `json:"tags,omitzero"` + Labels *LKENodePoolLabels `json:"labels,omitzero"` + Taints []LKENodePoolTaint `json:"taints,omitzero"` + Label *string `json:"label,omitzero"` - Autoscaler *LKENodePoolAutoscaler `json:"autoscaler,omitempty"` - FirewallID *int `json:"firewall_id,omitempty"` + Autoscaler *LKENodePoolAutoscaler `json:"autoscaler,omitzero"` + FirewallID *int `json:"firewall_id,omitzero"` // K8sVersion and UpdateStrategy only works for LKE Enterprise to support node pool upgrades. // It may not currently be available to all users and is under v4beta. - K8sVersion *string `json:"k8s_version,omitempty"` - UpdateStrategy *LKENodePoolUpdateStrategy `json:"update_strategy,omitempty"` + K8sVersion *string `json:"k8s_version,omitzero"` + UpdateStrategy *LKENodePoolUpdateStrategy `json:"update_strategy,omitzero"` } // GetCreateOptions converts a LKENodePool to LKENodePoolCreateOptions for @@ -144,9 +144,9 @@ func (l LKENodePool) GetCreateOptions() (o LKENodePoolCreateOptions) { // GetUpdateOptions converts a LKENodePool to LKENodePoolUpdateOptions for use in UpdateLKENodePoolUpdate func (l LKENodePool) GetUpdateOptions() (o LKENodePoolUpdateOptions) { o.Count = l.Count - o.Tags = &l.Tags + o.Tags = l.Tags o.Labels = &l.Labels - o.Taints = &l.Taints + o.Taints = l.Taints o.Autoscaler = &l.Autoscaler o.K8sVersion = l.K8sVersion o.UpdateStrategy = l.UpdateStrategy diff --git a/logger.go b/logger.go index 890327e2b..fc9504b50 100644 --- a/logger.go +++ b/logger.go @@ -1,52 +1,54 @@ package linodego import ( + "fmt" "log" "os" + "strings" ) -//nolint:unused -type httpLogger interface { +type Logger interface { Errorf(format string, v ...any) Warnf(format string, v ...any) Debugf(format string, v ...any) } -//nolint:unused type logger struct { l *log.Logger } -//nolint:unused func createLogger() *logger { l := &logger{l: log.New(os.Stderr, "", log.Ldate|log.Lmicroseconds)} return l } -//nolint:unused -var _ httpLogger = (*logger)(nil) +var _ Logger = (*logger)(nil) -//nolint:unused func (l *logger) Errorf(format string, v ...any) { - l.output("ERROR RESTY "+format, v...) + l.output("ERROR "+format, v...) } -//nolint:unused func (l *logger) Warnf(format string, v ...any) { - l.output("WARN RESTY "+format, v...) + l.output("WARN "+format, v...) } -//nolint:unused func (l *logger) Debugf(format string, v ...any) { - l.output("DEBUG RESTY "+format, v...) + l.output("DEBUG "+format, v...) } -//nolint:unused func (l *logger) output(format string, v ...any) { //nolint:goprintffuncname + // Render the final message first, then sanitize control characters + // to prevent log injection via both the format string and variadic args. + var msg string if len(v) == 0 { - l.l.Print(format) - return + msg = format + } else { + msg = fmt.Sprintf(format, v...) } - l.l.Printf(format, v...) + msg = strings.ReplaceAll(msg, "\r\n", "\\n") + msg = strings.ReplaceAll(msg, "\r", "\\n") + msg = strings.ReplaceAll(msg, "\n", "\\n") + + l.l.Print(msg) } diff --git a/monitor_alert_definitions.go b/monitor_alert_definitions.go index 730665655..dc4a4a0a0 100644 --- a/monitor_alert_definitions.go +++ b/monitor_alert_definitions.go @@ -1,8 +1,10 @@ package linodego import ( + "bytes" "context" "encoding/json" + "net/http" "time" "github.com/linode/linodego/internal/parseabletime" @@ -53,7 +55,6 @@ type AlertDefinition struct { Type string `json:"type"` ServiceType string `json:"service_type"` Status AlertDefinitionStatus `json:"status"` - HasMoreResources bool `json:"has_more_resources"` // Deprecated: use Entities.HasMoreResources. RuleCriteria RuleCriteria `json:"rule_criteria"` TriggerConditions TriggerConditions `json:"trigger_conditions"` AlertChannels []AlertChannelEnvelope `json:"alert_channels"` @@ -61,7 +62,6 @@ type AlertDefinition struct { Updated *time.Time `json:"-"` UpdatedBy string `json:"updated_by"` CreatedBy string `json:"created_by"` - EntityIDs []string `json:"entity_ids"` // Deprecated: use Entities.url to list associated entities. Description string `json:"description"` Class string `json:"class"` Scope AlertDefinitionScope `json:"scope"` @@ -69,24 +69,17 @@ type AlertDefinition struct { Entities AlertDefinitionEntities `json:"entities"` } -// Backwards-compatible alias - -// MonitorAlertDefinition represents an ACLP Alert Definition object -// -// Deprecated: AlertDefinition should be used in all new implementations. -type MonitorAlertDefinition = AlertDefinition - // TriggerConditions represents the trigger conditions for an alert. type TriggerConditions struct { - CriteriaCondition string `json:"criteria_condition,omitempty"` - EvaluationPeriodSeconds int `json:"evaluation_period_seconds,omitempty"` - PollingIntervalSeconds int `json:"polling_interval_seconds,omitempty"` - TriggerOccurrences int `json:"trigger_occurrences,omitempty"` + CriteriaCondition string `json:"criteria_condition,omitzero"` + EvaluationPeriodSeconds int `json:"evaluation_period_seconds,omitzero"` + PollingIntervalSeconds int `json:"polling_interval_seconds,omitzero"` + TriggerOccurrences int `json:"trigger_occurrences,omitzero"` } // RuleCriteria represents the rule criteria for an alert. type RuleCriteria struct { - Rules []Rule `json:"rules,omitempty"` + Rules []Rule `json:"rules,omitzero"` } // Rule represents a single rule for an alert. @@ -110,23 +103,23 @@ type DimensionFilter struct { // RuleCriteriaOptions represents the rule criteria options for an alert. type RuleCriteriaOptions struct { - Rules []RuleOptions `json:"rules,omitempty"` + Rules []RuleOptions `json:"rules,omitzero"` } // RuleOptions represents a single rule option for an alert. type RuleOptions struct { - AggregateFunction string `json:"aggregate_function,omitempty"` - DimensionFilters []DimensionFilterOptions `json:"dimension_filters,omitempty"` - Metric string `json:"metric,omitempty"` - Operator string `json:"operator,omitempty"` - Threshold float64 `json:"threshold,omitempty"` + AggregateFunction string `json:"aggregate_function,omitzero"` + DimensionFilters []DimensionFilterOptions `json:"dimension_filters,omitzero"` + Metric string `json:"metric,omitzero"` + Operator string `json:"operator,omitzero"` + Threshold float64 `json:"threshold,omitzero"` } // DimensionFilterOptions represents a single dimension filter option used inside a Rule. type DimensionFilterOptions struct { - DimensionLabel string `json:"dimension_label,omitempty"` - Operator string `json:"operator,omitempty"` - Value string `json:"value,omitempty"` + DimensionLabel string `json:"dimension_label,omitzero"` + Operator string `json:"operator,omitzero"` + Value string `json:"value,omitzero"` } // AlertChannelEnvelope represents a single alert channel entry returned inside alert definition @@ -168,11 +161,11 @@ type AlertDefinitionCreateOptions struct { Label string `json:"label"` Severity int `json:"severity"` ChannelIDs []int `json:"channel_ids"` - RuleCriteria *RuleCriteriaOptions `json:"rule_criteria,omitempty"` - TriggerConditions *TriggerConditions `json:"trigger_conditions,omitempty"` - EntityIDs []string `json:"entity_ids,omitempty"` - Description *string `json:"description,omitempty"` - Scope AlertDefinitionScope `json:"scope,omitempty"` + RuleCriteria *RuleCriteriaOptions `json:"rule_criteria,omitzero"` + TriggerConditions *TriggerConditions `json:"trigger_conditions,omitzero"` + EntityIDs []string `json:"entity_ids,omitzero"` + Description *string `json:"description,omitzero"` + Scope AlertDefinitionScope `json:"scope,omitzero"` Regions []string `json:"regions,omitzero"` } @@ -181,11 +174,11 @@ type AlertDefinitionUpdateOptions struct { Label string `json:"label"` Severity int `json:"severity"` ChannelIDs []int `json:"channel_ids"` - RuleCriteria *RuleCriteriaOptions `json:"rule_criteria,omitempty"` - TriggerConditions *TriggerConditions `json:"trigger_conditions,omitempty"` - EntityIDs []string `json:"entity_ids,omitempty"` - Description *string `json:"description,omitempty"` - Status *AlertDefinitionStatus `json:"status,omitempty"` + RuleCriteria *RuleCriteriaOptions `json:"rule_criteria,omitzero"` + TriggerConditions *TriggerConditions `json:"trigger_conditions,omitzero"` + EntityIDs []string `json:"entity_ids,omitzero"` + Description *string `json:"description,omitzero"` + Status *AlertDefinitionStatus `json:"status,omitzero"` Regions []string `json:"regions,omitzero"` } @@ -236,7 +229,7 @@ func (c *Client) GetMonitorAlertDefinition( ctx context.Context, serviceType string, alertID int, -) (*MonitorAlertDefinition, error) { +) (*AlertDefinition, error) { e := formatAPIPath("monitor/services/%s/alert-definitions/%d", serviceType, alertID) return doGETRequest[AlertDefinition](ctx, c, e) } @@ -246,7 +239,7 @@ func (c *Client) CreateMonitorAlertDefinition( ctx context.Context, serviceType string, opts AlertDefinitionCreateOptions, -) (*MonitorAlertDefinition, error) { +) (*AlertDefinition, error) { e := formatAPIPath("monitor/services/%s/alert-definitions", serviceType) return doPOSTRequest[AlertDefinition](ctx, c, e, opts) } @@ -258,30 +251,33 @@ func (c *Client) CreateMonitorAlertDefinitionWithIdempotency( serviceType string, opts AlertDefinitionCreateOptions, idempotencyKey string, -) (*MonitorAlertDefinition, error) { +) (*AlertDefinition, error) { e := formatAPIPath("monitor/services/%s/alert-definitions", serviceType) var result AlertDefinition - req := c.R(ctx).SetResult(&result) - - if idempotencyKey != "" { - req.SetHeader("Idempotency-Key", idempotencyKey) - } - body, err := json.Marshal(opts) if err != nil { return nil, err } - req.SetBody(string(body)) + params := requestParams{ + Response: &result, + Body: bytes.NewReader(body), + } + + if idempotencyKey != "" { + params.Headers = http.Header{ + "Idempotency-Key": {idempotencyKey}, + } + } - r, err := coupleAPIErrors(req.Post(e)) + err = c.doRequest(ctx, http.MethodPost, e, params, nil) if err != nil { return nil, err } - return r.Result().(*AlertDefinition), nil + return &result, nil } // UpdateMonitorAlertDefinition updates an ACLP Monitor Alert Definition. diff --git a/monitor_api_services.go b/monitor_api_services.go index 9d379353e..d847a7e3f 100644 --- a/monitor_api_services.go +++ b/monitor_api_services.go @@ -4,8 +4,10 @@ package linodego import ( + "bytes" "context" "encoding/json" + "net/http" "time" ) @@ -59,11 +61,11 @@ type EntityMetricsFetchOptions struct { // EntityIDs are expected to be type "any" as different service_types have different variable type for their entity_ids. For example, Linode has "int" entity_ids whereas object storage has "string" as entity_ids. EntityIDs []any `json:"entity_ids"` - Filters []MetricFilter `json:"filters,omitempty"` + Filters []MetricFilter `json:"filters,omitzero"` Metrics []EntityMetric `json:"metrics"` - TimeGranularity []MetricTimeGranularity `json:"time_granularity,omitempty"` - RelativeTimeDuration *MetricRelativeTimeDuration `json:"relative_time_duration,omitempty"` - AbsoluteTimeDuration *MetricAbsoluteTimeDuration `json:"absolute_time_duration,omitempty"` + TimeGranularity []MetricTimeGranularity `json:"time_granularity,omitzero"` + RelativeTimeDuration *MetricRelativeTimeDuration `json:"relative_time_duration,omitzero"` + AbsoluteTimeDuration *MetricAbsoluteTimeDuration `json:"absolute_time_duration,omitzero"` } // MetricFilter describes individual objects that define dimension filters for the query. @@ -101,7 +103,11 @@ type MetricAbsoluteTimeDuration struct { func (mc *MonitorClient) FetchEntityMetrics(ctx context.Context, serviceType string, opts *EntityMetricsFetchOptions) (*EntityMetrics, error) { endpoint := formatAPIPath("monitor/services/%s/metrics", serviceType) - req := mc.R(ctx).SetResult(&EntityMetrics{}) + var result EntityMetrics + + params := requestParams{ + Response: &result, + } if opts != nil { body, err := json.Marshal(opts) @@ -109,13 +115,13 @@ func (mc *MonitorClient) FetchEntityMetrics(ctx context.Context, serviceType str return nil, err } - req.SetBody(string(body)) + params.Body = bytes.NewReader(body) } - r, err := coupleAPIErrors(req.Post(endpoint)) + err := mc.doRequest(ctx, http.MethodPost, endpoint, params) if err != nil { return nil, err } - return r.Result().(*EntityMetrics), nil + return &result, nil } diff --git a/mysql.go b/mysql.go index 7b334f55e..bd1607366 100644 --- a/mysql.go +++ b/mysql.go @@ -46,42 +46,42 @@ type MySQLDatabase struct { Port int `json:"port"` EngineConfig MySQLDatabaseEngineConfig `json:"engine_config"` - PrivateNetwork *DatabasePrivateNetwork `json:"private_network,omitempty"` + PrivateNetwork *DatabasePrivateNetwork `json:"private_network,omitzero"` } type MySQLDatabaseEngineConfig struct { - MySQL *MySQLDatabaseEngineConfigMySQL `json:"mysql,omitempty"` - BinlogRetentionPeriod *int `json:"binlog_retention_period,omitempty"` + MySQL *MySQLDatabaseEngineConfigMySQL `json:"mysql,omitzero"` + BinlogRetentionPeriod *int `json:"binlog_retention_period,omitzero"` } type MySQLDatabaseEngineConfigMySQL struct { - ConnectTimeout *int `json:"connect_timeout,omitempty"` - DefaultTimeZone *string `json:"default_time_zone,omitempty"` - GroupConcatMaxLen *float64 `json:"group_concat_max_len,omitempty"` - InformationSchemaStatsExpiry *int `json:"information_schema_stats_expiry,omitempty"` - InnoDBChangeBufferMaxSize *int `json:"innodb_change_buffer_max_size,omitempty"` - InnoDBFlushNeighbors *int `json:"innodb_flush_neighbors,omitempty"` - InnoDBFTMinTokenSize *int `json:"innodb_ft_min_token_size,omitempty"` - InnoDBFTServerStopwordTable **string `json:"innodb_ft_server_stopword_table,omitempty"` - InnoDBLockWaitTimeout *int `json:"innodb_lock_wait_timeout,omitempty"` - InnoDBLogBufferSize *int `json:"innodb_log_buffer_size,omitempty"` - InnoDBOnlineAlterLogMaxSize *int `json:"innodb_online_alter_log_max_size,omitempty"` - InnoDBReadIOThreads *int `json:"innodb_read_io_threads,omitempty"` - InnoDBRollbackOnTimeout *bool `json:"innodb_rollback_on_timeout,omitempty"` - InnoDBThreadConcurrency *int `json:"innodb_thread_concurrency,omitempty"` - InnoDBWriteIOThreads *int `json:"innodb_write_io_threads,omitempty"` - InteractiveTimeout *int `json:"interactive_timeout,omitempty"` - InternalTmpMemStorageEngine *string `json:"internal_tmp_mem_storage_engine,omitempty"` - MaxAllowedPacket *int `json:"max_allowed_packet,omitempty"` - MaxHeapTableSize *int `json:"max_heap_table_size,omitempty"` - NetBufferLength *int `json:"net_buffer_length,omitempty"` - NetReadTimeout *int `json:"net_read_timeout,omitempty"` - NetWriteTimeout *int `json:"net_write_timeout,omitempty"` - SortBufferSize *int `json:"sort_buffer_size,omitempty"` - SQLMode *string `json:"sql_mode,omitempty"` - SQLRequirePrimaryKey *bool `json:"sql_require_primary_key,omitempty"` - TmpTableSize *int `json:"tmp_table_size,omitempty"` - WaitTimeout *int `json:"wait_timeout,omitempty"` + ConnectTimeout *int `json:"connect_timeout,omitzero"` + DefaultTimeZone *string `json:"default_time_zone,omitzero"` + GroupConcatMaxLen *float64 `json:"group_concat_max_len,omitzero"` + InformationSchemaStatsExpiry *int `json:"information_schema_stats_expiry,omitzero"` + InnoDBChangeBufferMaxSize *int `json:"innodb_change_buffer_max_size,omitzero"` + InnoDBFlushNeighbors *int `json:"innodb_flush_neighbors,omitzero"` + InnoDBFTMinTokenSize *int `json:"innodb_ft_min_token_size,omitzero"` + InnoDBFTServerStopwordTable **string `json:"innodb_ft_server_stopword_table,omitzero"` + InnoDBLockWaitTimeout *int `json:"innodb_lock_wait_timeout,omitzero"` + InnoDBLogBufferSize *int `json:"innodb_log_buffer_size,omitzero"` + InnoDBOnlineAlterLogMaxSize *int `json:"innodb_online_alter_log_max_size,omitzero"` + InnoDBReadIOThreads *int `json:"innodb_read_io_threads,omitzero"` + InnoDBRollbackOnTimeout *bool `json:"innodb_rollback_on_timeout,omitzero"` + InnoDBThreadConcurrency *int `json:"innodb_thread_concurrency,omitzero"` + InnoDBWriteIOThreads *int `json:"innodb_write_io_threads,omitzero"` + InteractiveTimeout *int `json:"interactive_timeout,omitzero"` + InternalTmpMemStorageEngine *string `json:"internal_tmp_mem_storage_engine,omitzero"` + MaxAllowedPacket *int `json:"max_allowed_packet,omitzero"` + MaxHeapTableSize *int `json:"max_heap_table_size,omitzero"` + NetBufferLength *int `json:"net_buffer_length,omitzero"` + NetReadTimeout *int `json:"net_read_timeout,omitzero"` + NetWriteTimeout *int `json:"net_write_timeout,omitzero"` + SortBufferSize *int `json:"sort_buffer_size,omitzero"` + SQLMode *string `json:"sql_mode,omitzero"` + SQLRequirePrimaryKey *bool `json:"sql_require_primary_key,omitzero"` + TmpTableSize *int `json:"tmp_table_size,omitzero"` + WaitTimeout *int `json:"wait_timeout,omitzero"` } type MySQLDatabaseConfigInfo struct { @@ -397,24 +397,24 @@ type MySQLCreateOptions struct { Region string `json:"region"` Type string `json:"type"` Engine string `json:"engine"` - AllowList []string `json:"allow_list,omitempty"` - ClusterSize int `json:"cluster_size,omitempty"` + AllowList []string `json:"allow_list,omitzero"` + ClusterSize int `json:"cluster_size,omitzero"` - Fork *DatabaseFork `json:"fork,omitempty"` - EngineConfig *MySQLDatabaseEngineConfig `json:"engine_config,omitempty"` - PrivateNetwork *DatabasePrivateNetwork `json:"private_network,omitempty"` + Fork *DatabaseFork `json:"fork,omitzero"` + EngineConfig *MySQLDatabaseEngineConfig `json:"engine_config,omitzero"` + PrivateNetwork *DatabasePrivateNetwork `json:"private_network,omitzero"` } // MySQLUpdateOptions fields are used when altering the existing MySQL Database type MySQLUpdateOptions struct { - Label string `json:"label,omitempty"` - AllowList *[]string `json:"allow_list,omitempty"` - Updates *DatabaseMaintenanceWindow `json:"updates,omitempty"` - Type string `json:"type,omitempty"` - ClusterSize int `json:"cluster_size,omitempty"` - Version string `json:"version,omitempty"` - EngineConfig *MySQLDatabaseEngineConfig `json:"engine_config,omitempty"` - PrivateNetwork **DatabasePrivateNetwork `json:"private_network,omitempty"` + Label string `json:"label,omitzero"` + AllowList []string `json:"allow_list,omitzero"` + Updates *DatabaseMaintenanceWindow `json:"updates,omitzero"` + Type string `json:"type,omitzero"` + ClusterSize int `json:"cluster_size,omitzero"` + Version string `json:"version,omitzero"` + EngineConfig *MySQLDatabaseEngineConfig `json:"engine_config,omitzero"` + PrivateNetwork **DatabasePrivateNetwork `json:"private_network,omitzero"` } // MySQLDatabaseCredential is the Root Credentials to access the Linode Managed Database diff --git a/network_ips.go b/network_ips.go index d4500c4d6..d9c83ee58 100644 --- a/network_ips.go +++ b/network_ips.go @@ -4,23 +4,16 @@ import ( "context" ) -// IPAddressUpdateOptionsV2 fields are those accepted by UpdateIPAddress. +// IPAddressUpdateOptions fields are those accepted by UpdateIPAddress. // NOTE: An IP's RDNS can be reset to default using the following pattern: // -// IPAddressUpdateOptionsV2{ +// IPAddressUpdateOptions{ // RDNS: linodego.Pointer[*string](nil), // } -type IPAddressUpdateOptionsV2 struct { - // The reverse DNS assigned to this address. For public IPv4 addresses, this will be set to a default value provided by Linode if set to nil. - Reserved *bool `json:"reserved,omitempty"` - RDNS **string `json:"rdns,omitempty"` -} - -// IPAddressUpdateOptions fields are those accepted by UpdateIPAddress. -// -// Deprecated: Please use IPAddressUpdateOptionsV2 for all new implementations. type IPAddressUpdateOptions struct { - RDNS *string `json:"rdns"` + // The reverse DNS assigned to this address. For public IPv4 addresses, this will be set to a default value provided by Linode if set to nil. + Reserved *bool `json:"reserved,omitzero"` + RDNS **string `json:"rdns,omitzero"` } // LinodeIPAssignment stores an assignment between an IP address and a Linode instance. @@ -32,9 +25,9 @@ type LinodeIPAssignment struct { type AllocateReserveIPOptions struct { Type string `json:"type"` Public bool `json:"public"` - Reserved bool `json:"reserved,omitempty"` - Region string `json:"region,omitempty"` - LinodeID int `json:"linode_id,omitempty"` + Reserved bool `json:"reserved,omitzero"` + Region string `json:"region,omitzero"` + LinodeID int `json:"linode_id,omitzero"` } // LinodesAssignIPsOptions fields are those accepted by InstancesAssignIPs. @@ -56,24 +49,16 @@ type ListIPAddressesQuery struct { SkipIPv6RDNS bool `query:"skip_ipv6_rdns"` } -// GetUpdateOptionsV2 converts a IPAddress to IPAddressUpdateOptionsV2 for use in UpdateIPAddressV2. -func (i InstanceIP) GetUpdateOptionsV2() IPAddressUpdateOptionsV2 { +// GetUpdateOptions converts a IPAddress to IPAddressUpdateOptions for use in UpdateIPAddress. +func (i InstanceIP) GetUpdateOptions() IPAddressUpdateOptions { rdns := copyString(&i.RDNS) - return IPAddressUpdateOptionsV2{ + return IPAddressUpdateOptions{ RDNS: &rdns, Reserved: copyBool(&i.Reserved), } } -// GetUpdateOptions converts a IPAddress to IPAddressUpdateOptions for use in UpdateIPAddress. -// -// Deprecated: Please use GetUpdateOptionsV2 for all new implementations. -func (i InstanceIP) GetUpdateOptions() (o IPAddressUpdateOptions) { - o.RDNS = copyString(&i.RDNS) - return o -} - // ListIPAddresses lists IPAddresses. func (c *Client) ListIPAddresses(ctx context.Context, opts *ListOptions) ([]InstanceIP, error) { return getPaginatedResults[InstanceIP](ctx, c, "networking/ips", opts) @@ -85,20 +70,12 @@ func (c *Client) GetIPAddress(ctx context.Context, id string) (*InstanceIP, erro return doGETRequest[InstanceIP](ctx, c, e) } -// UpdateIPAddressV2 updates the IP address with the specified address. -func (c *Client) UpdateIPAddressV2(ctx context.Context, address string, opts IPAddressUpdateOptionsV2) (*InstanceIP, error) { +// UpdateIPAddress updates the IP address with the specified address. +func (c *Client) UpdateIPAddress(ctx context.Context, address string, opts IPAddressUpdateOptions) (*InstanceIP, error) { e := formatAPIPath("networking/ips/%s", address) return doPUTRequest[InstanceIP](ctx, c, e, opts) } -// UpdateIPAddress updates the IP address with the specified id. -// -// Deprecated: Please use UpdateIPAddressV2 for all new implementation. -func (c *Client) UpdateIPAddress(ctx context.Context, id string, opts IPAddressUpdateOptions) (*InstanceIP, error) { - e := formatAPIPath("networking/ips/%s", id) - return doPUTRequest[InstanceIP](ctx, c, e, opts) -} - // InstancesAssignIPs assigns multiple IPv4 addresses and/or IPv6 ranges to multiple Linodes in one Region. // This allows swapping, shuffling, or otherwise reorganizing IPs to your Linodes. func (c *Client) InstancesAssignIPs(ctx context.Context, opts LinodesAssignIPsOptions) error { diff --git a/network_ranges.go b/network_ranges.go index 00350b604..b8b7f0e15 100644 --- a/network_ranges.go +++ b/network_ranges.go @@ -6,9 +6,9 @@ import ( // IPv6RangeCreateOptions fields are those accepted by CreateIPv6Range type IPv6RangeCreateOptions struct { - LinodeID int `json:"linode_id,omitempty"` + LinodeID int `json:"linode_id,omitzero"` PrefixLength int `json:"prefix_length"` - RouteTarget string `json:"route_target,omitempty"` + RouteTarget string `json:"route_target,omitzero"` } // ListIPv6Ranges lists IPv6Ranges diff --git a/nodebalancer.go b/nodebalancer.go index 3fe80b1a5..b1877ec4f 100644 --- a/nodebalancer.go +++ b/nodebalancer.go @@ -57,38 +57,38 @@ type NodeBalancerTransfer struct { } type NodeBalancerVPCOptions struct { - IPv4Range string `json:"ipv4_range,omitempty"` - IPv6Range string `json:"ipv6_range,omitempty"` + IPv4Range string `json:"ipv4_range,omitzero"` + IPv6Range string `json:"ipv6_range,omitzero"` SubnetID int `json:"subnet_id"` - IPv4RangeAutoAssign bool `json:"ipv4_range_auto_assign,omitempty"` + IPv4RangeAutoAssign bool `json:"ipv4_range_auto_assign,omitzero"` } // NodeBalancerCreateOptions are the options permitted for CreateNodeBalancer type NodeBalancerCreateOptions struct { - Label *string `json:"label,omitempty"` - Region string `json:"region,omitempty"` - ClientConnThrottle *int `json:"client_conn_throttle,omitempty"` + Label *string `json:"label,omitzero"` + Region string `json:"region,omitzero"` + ClientConnThrottle *int `json:"client_conn_throttle,omitzero"` // NOTE: ClientUDPSessThrottle may not currently be available to all users. - ClientUDPSessThrottle *int `json:"client_udp_sess_throttle,omitempty"` + ClientUDPSessThrottle *int `json:"client_udp_sess_throttle,omitzero"` - Configs []*NodeBalancerConfigCreateOptions `json:"configs,omitempty"` + Configs []*NodeBalancerConfigCreateOptions `json:"configs,omitzero"` Tags []string `json:"tags"` - FirewallID int `json:"firewall_id,omitempty"` - Type NodeBalancerPlanType `json:"type,omitempty"` - VPCs []NodeBalancerVPCOptions `json:"vpcs,omitempty"` - IPv4 *string `json:"ipv4,omitempty"` + FirewallID int `json:"firewall_id,omitzero"` + Type NodeBalancerPlanType `json:"type,omitzero"` + VPCs []NodeBalancerVPCOptions `json:"vpcs,omitzero"` + IPv4 *string `json:"ipv4,omitzero"` } // NodeBalancerUpdateOptions are the options permitted for UpdateNodeBalancer type NodeBalancerUpdateOptions struct { - Label *string `json:"label,omitempty"` - ClientConnThrottle *int `json:"client_conn_throttle,omitempty"` + Label *string `json:"label,omitzero"` + ClientConnThrottle *int `json:"client_conn_throttle,omitzero"` // NOTE: ClientUDPSessThrottle may not currently be available to all users. - ClientUDPSessThrottle *int `json:"client_udp_sess_throttle,omitempty"` + ClientUDPSessThrottle *int `json:"client_udp_sess_throttle,omitzero"` - Tags *[]string `json:"tags,omitempty"` + Tags []string `json:"tags,omitzero"` } // NodeBalancerPlanType constants start with NBType and include Linode API NodeBalancer's plan types @@ -142,7 +142,7 @@ func (i NodeBalancer) GetUpdateOptions() NodeBalancerUpdateOptions { Label: i.Label, ClientConnThrottle: &i.ClientConnThrottle, ClientUDPSessThrottle: &i.ClientUDPSessThrottle, - Tags: &i.Tags, + Tags: i.Tags, } } diff --git a/nodebalancer_config_nodes.go b/nodebalancer_config_nodes.go index 6516ba717..a98df52ea 100644 --- a/nodebalancer_config_nodes.go +++ b/nodebalancer_config_nodes.go @@ -38,18 +38,18 @@ var ( type NodeBalancerNodeCreateOptions struct { Address string `json:"address"` Label string `json:"label"` - Weight int `json:"weight,omitempty"` - Mode NodeMode `json:"mode,omitempty"` - SubnetID int `json:"subnet_id,omitempty"` + Weight int `json:"weight,omitzero"` + Mode NodeMode `json:"mode,omitzero"` + SubnetID int `json:"subnet_id,omitzero"` } // NodeBalancerNodeUpdateOptions fields are those accepted by UpdateNodeBalancerNode type NodeBalancerNodeUpdateOptions struct { - Address string `json:"address,omitempty"` - Label string `json:"label,omitempty"` - Weight int `json:"weight,omitempty"` - Mode NodeMode `json:"mode,omitempty"` - SubnetID int `json:"subnet_id,omitempty"` + Address string `json:"address,omitzero"` + Label string `json:"label,omitzero"` + Weight int `json:"weight,omitzero"` + Mode NodeMode `json:"mode,omitzero"` + SubnetID int `json:"subnet_id,omitzero"` } // GetCreateOptions converts a NodeBalancerNode to NodeBalancerNodeCreateOptions for use in CreateNodeBalancerNode diff --git a/nodebalancer_config_vpc.go b/nodebalancer_config_vpc.go index 122d4c9b8..3e3d8987c 100644 --- a/nodebalancer_config_vpc.go +++ b/nodebalancer_config_vpc.go @@ -10,7 +10,7 @@ import ( type NodeBalancerVPCConfig struct { ID int `json:"id"` IPv4Range string `json:"ipv4_range"` - IPv6Range string `json:"ipv6_range,omitempty"` + IPv6Range string `json:"ipv6_range,omitzero"` NodeBalancerID int `json:"nodebalancer_id"` SubnetID int `json:"subnet_id"` VPCID int `json:"vpc_id"` diff --git a/nodebalancer_configs.go b/nodebalancer_configs.go index 2c532837b..fee304fde 100644 --- a/nodebalancer_configs.go +++ b/nodebalancer_configs.go @@ -108,48 +108,48 @@ type NodeBalancerNodeStatus struct { // NodeBalancerConfigCreateOptions are permitted by CreateNodeBalancerConfig type NodeBalancerConfigCreateOptions struct { Port int `json:"port"` - Protocol ConfigProtocol `json:"protocol,omitempty"` - ProxyProtocol ConfigProxyProtocol `json:"proxy_protocol,omitempty"` - Algorithm ConfigAlgorithm `json:"algorithm,omitempty"` - Stickiness ConfigStickiness `json:"stickiness,omitempty"` - Check ConfigCheck `json:"check,omitempty"` - CheckInterval int `json:"check_interval,omitempty"` - CheckAttempts int `json:"check_attempts,omitempty"` - CheckPath string `json:"check_path,omitempty"` - CheckBody string `json:"check_body,omitempty"` - CheckPassive *bool `json:"check_passive,omitempty"` - CheckTimeout int `json:"check_timeout,omitempty"` + Protocol ConfigProtocol `json:"protocol,omitzero"` + ProxyProtocol ConfigProxyProtocol `json:"proxy_protocol,omitzero"` + Algorithm ConfigAlgorithm `json:"algorithm,omitzero"` + Stickiness ConfigStickiness `json:"stickiness,omitzero"` + Check ConfigCheck `json:"check,omitzero"` + CheckInterval int `json:"check_interval,omitzero"` + CheckAttempts int `json:"check_attempts,omitzero"` + CheckPath string `json:"check_path,omitzero"` + CheckBody string `json:"check_body,omitzero"` + CheckPassive *bool `json:"check_passive,omitzero"` + CheckTimeout int `json:"check_timeout,omitzero"` // NOTE: UDPCheckPort may not currently be available to all users. - UDPCheckPort *int `json:"udp_check_port,omitempty"` + UDPCheckPort *int `json:"udp_check_port,omitzero"` - CipherSuite ConfigCipher `json:"cipher_suite,omitempty"` - SSLCert string `json:"ssl_cert,omitempty"` - SSLKey string `json:"ssl_key,omitempty"` - Nodes []NodeBalancerNodeCreateOptions `json:"nodes,omitempty"` + CipherSuite ConfigCipher `json:"cipher_suite,omitzero"` + SSLCert string `json:"ssl_cert,omitzero"` + SSLKey string `json:"ssl_key,omitzero"` + Nodes []NodeBalancerNodeCreateOptions `json:"nodes,omitzero"` } // NodeBalancerConfigRebuildOptions used by RebuildNodeBalancerConfig type NodeBalancerConfigRebuildOptions struct { Port int `json:"port"` - Protocol ConfigProtocol `json:"protocol,omitempty"` - ProxyProtocol ConfigProxyProtocol `json:"proxy_protocol,omitempty"` - Algorithm ConfigAlgorithm `json:"algorithm,omitempty"` - Stickiness ConfigStickiness `json:"stickiness,omitempty"` - Check ConfigCheck `json:"check,omitempty"` - CheckInterval int `json:"check_interval,omitempty"` - CheckAttempts int `json:"check_attempts,omitempty"` - CheckPath string `json:"check_path,omitempty"` - CheckBody string `json:"check_body,omitempty"` - CheckPassive *bool `json:"check_passive,omitempty"` - CheckTimeout int `json:"check_timeout,omitempty"` + Protocol ConfigProtocol `json:"protocol,omitzero"` + ProxyProtocol ConfigProxyProtocol `json:"proxy_protocol,omitzero"` + Algorithm ConfigAlgorithm `json:"algorithm,omitzero"` + Stickiness ConfigStickiness `json:"stickiness,omitzero"` + Check ConfigCheck `json:"check,omitzero"` + CheckInterval int `json:"check_interval,omitzero"` + CheckAttempts int `json:"check_attempts,omitzero"` + CheckPath string `json:"check_path,omitzero"` + CheckBody string `json:"check_body,omitzero"` + CheckPassive *bool `json:"check_passive,omitzero"` + CheckTimeout int `json:"check_timeout,omitzero"` // NOTE: UDPCheckPort may not currently be available to all users. - UDPCheckPort *int `json:"udp_check_port,omitempty"` + UDPCheckPort *int `json:"udp_check_port,omitzero"` - CipherSuite ConfigCipher `json:"cipher_suite,omitempty"` - SSLCert string `json:"ssl_cert,omitempty"` - SSLKey string `json:"ssl_key,omitempty"` + CipherSuite ConfigCipher `json:"cipher_suite,omitzero"` + SSLCert string `json:"ssl_cert,omitzero"` + SSLKey string `json:"ssl_key,omitzero"` Nodes []NodeBalancerConfigRebuildNodeOptions `json:"nodes"` } @@ -158,7 +158,7 @@ type NodeBalancerConfigRebuildOptions struct { type NodeBalancerConfigRebuildNodeOptions struct { NodeBalancerNodeCreateOptions - ID int `json:"id,omitempty"` + ID int `json:"id,omitzero"` } // NodeBalancerConfigUpdateOptions are permitted by UpdateNodeBalancerConfig diff --git a/object_storage_bucket_certs.go b/object_storage_bucket_certs.go index 36fb5301f..e38abd8d6 100644 --- a/object_storage_bucket_certs.go +++ b/object_storage_bucket_certs.go @@ -4,12 +4,7 @@ import ( "context" ) -// Deprecated: Please use ObjectStorageBucketCertV2 for all new implementations. type ObjectStorageBucketCert struct { - SSL bool `json:"ssl"` -} - -type ObjectStorageBucketCertV2 struct { SSL *bool `json:"ssl"` } @@ -19,43 +14,23 @@ type ObjectStorageBucketCertUploadOptions struct { } // UploadObjectStorageBucketCert uploads a TLS/SSL Cert to be used with an Object Storage Bucket. -// -// Deprecated: Please use UploadObjectStorageBucketCertV2 for all new implementations. func (c *Client) UploadObjectStorageBucketCert( ctx context.Context, - clusterOrRegionID, bucket string, + regionID, bucket string, opts ObjectStorageBucketCertUploadOptions, ) (*ObjectStorageBucketCert, error) { - e := formatAPIPath("object-storage/buckets/%s/%s/ssl", clusterOrRegionID, bucket) + e := formatAPIPath("object-storage/buckets/%s/%s/ssl", regionID, bucket) return doPOSTRequest[ObjectStorageBucketCert](ctx, c, e, opts) } // GetObjectStorageBucketCert gets an ObjectStorageBucketCert -// -// Deprecated: Please use GetObjectStorageBucketCertV2 for all new implementations. -func (c *Client) GetObjectStorageBucketCert(ctx context.Context, clusterOrRegionID, bucket string) (*ObjectStorageBucketCert, error) { - e := formatAPIPath("object-storage/buckets/%s/%s/ssl", clusterOrRegionID, bucket) +func (c *Client) GetObjectStorageBucketCert(ctx context.Context, regionID, bucket string) (*ObjectStorageBucketCert, error) { + e := formatAPIPath("object-storage/buckets/%s/%s/ssl", regionID, bucket) return doGETRequest[ObjectStorageBucketCert](ctx, c, e) } -// UploadObjectStorageBucketCertV2 uploads a TLS/SSL Cert to be used with an Object Storage Bucket. -func (c *Client) UploadObjectStorageBucketCertV2( - ctx context.Context, - clusterOrRegionID, bucket string, - opts ObjectStorageBucketCertUploadOptions, -) (*ObjectStorageBucketCertV2, error) { - e := formatAPIPath("object-storage/buckets/%s/%s/ssl", clusterOrRegionID, bucket) - return doPOSTRequest[ObjectStorageBucketCertV2](ctx, c, e, opts) -} - -// GetObjectStorageBucketCertV2 gets an ObjectStorageBucketCert -func (c *Client) GetObjectStorageBucketCertV2(ctx context.Context, clusterOrRegionID, bucket string) (*ObjectStorageBucketCertV2, error) { - e := formatAPIPath("object-storage/buckets/%s/%s/ssl", clusterOrRegionID, bucket) - return doGETRequest[ObjectStorageBucketCertV2](ctx, c, e) -} - // DeleteObjectStorageBucketCert deletes an ObjectStorageBucketCert -func (c *Client) DeleteObjectStorageBucketCert(ctx context.Context, clusterOrRegionID, bucket string) error { - e := formatAPIPath("object-storage/buckets/%s/%s/ssl", clusterOrRegionID, bucket) +func (c *Client) DeleteObjectStorageBucketCert(ctx context.Context, regionID, bucket string) error { + e := formatAPIPath("object-storage/buckets/%s/%s/ssl", regionID, bucket) return doDELETERequest(ctx, c, e) } diff --git a/object_storage_buckets.go b/object_storage_buckets.go index f8eed4963..717946490 100644 --- a/object_storage_buckets.go +++ b/object_storage_buckets.go @@ -14,15 +14,7 @@ import ( type ObjectStorageBucket struct { Label string `json:"label"` - // Deprecated: The 'Cluster' field has been deprecated in favor of the 'Region' field. - // For example, a Cluster value of `us-mia-1` will translate to a Region value of `us-mia`. - // - // This is necessary because there are now multiple Object Storage clusters to a region. - // - // NOTE: The 'Cluster' field will always return a value similar to `-1` (e.g., `us-mia-1`) - // for backward compatibility purposes. - Cluster string `json:"cluster"` - Region string `json:"region"` + Region string `json:"region"` S3Endpoint string `json:"s3_endpoint"` EndpointType ObjectStorageEndpointType `json:"endpoint_type"` @@ -32,13 +24,7 @@ type ObjectStorageBucket struct { Size int `json:"size"` } -// ObjectStorageBucketAccess holds Object Storage access info type ObjectStorageBucketAccess struct { - ACL ObjectStorageACL `json:"acl"` - CorsEnabled bool `json:"cors_enabled"` -} - -type ObjectStorageBucketAccessV2 struct { ACL ObjectStorageACL `json:"acl"` ACLXML string `json:"acl_xml"` CorsEnabled *bool `json:"cors_enabled"` @@ -84,26 +70,26 @@ func (i *ObjectStorageBucket) UnmarshalJSON(b []byte) error { // ObjectStorageBucketCreateOptions fields are those accepted by CreateObjectStorageBucket type ObjectStorageBucketCreateOptions struct { - // Deprecated: The 'Cluster' field has been deprecated. - // - // Going forward, the 'Region' field will be the supported way to designate where an - // Object Storage Bucket should be created. For example, a 'Cluster' value of `us-mia-1` - // will translate to a Region value of `us-mia`. - Cluster string `json:"cluster,omitempty"` - Region string `json:"region,omitempty"` + Region string `json:"region,omitzero"` Label string `json:"label"` - S3Endpoint string `json:"s3_endpoint,omitempty"` - EndpointType ObjectStorageEndpointType `json:"endpoint_type,omitempty"` + S3Endpoint string `json:"s3_endpoint,omitzero"` + EndpointType ObjectStorageEndpointType `json:"endpoint_type,omitzero"` - ACL ObjectStorageACL `json:"acl,omitempty"` - CorsEnabled *bool `json:"cors_enabled,omitempty"` + ACL ObjectStorageACL `json:"acl,omitzero"` + CorsEnabled *bool `json:"cors_enabled,omitzero"` +} + +// ObjectStorageBucketModifyAccessOptions fields are those accepted by ModifyObjectStorageBucketAccess +type ObjectStorageBucketModifyAccessOptions struct { + ACL ObjectStorageACL `json:"acl,omitzero"` + CorsEnabled *bool `json:"cors_enabled,omitzero"` } // ObjectStorageBucketUpdateAccessOptions fields are those accepted by UpdateObjectStorageBucketAccess type ObjectStorageBucketUpdateAccessOptions struct { - ACL ObjectStorageACL `json:"acl,omitempty"` - CorsEnabled *bool `json:"cors_enabled,omitempty"` + ACL ObjectStorageACL `json:"acl,omitzero"` + CorsEnabled *bool `json:"cors_enabled,omitzero"` } // ObjectStorageBucketListContentsParams fields are the query parameters for ListObjectStorageBucketContents @@ -130,14 +116,14 @@ func (c *Client) ListObjectStorageBuckets(ctx context.Context, opts *ListOptions return getPaginatedResults[ObjectStorageBucket](ctx, c, "object-storage/buckets", opts) } -// ListObjectStorageBucketsInCluster lists all ObjectStorageBuckets of a cluster -func (c *Client) ListObjectStorageBucketsInCluster(ctx context.Context, opts *ListOptions, clusterOrRegionID string) ([]ObjectStorageBucket, error) { - return getPaginatedResults[ObjectStorageBucket](ctx, c, formatAPIPath("object-storage/buckets/%s", clusterOrRegionID), opts) +// ListObjectStorageBucketsInRegion lists all ObjectStorageBuckets in the specified region +func (c *Client) ListObjectStorageBucketsInRegion(ctx context.Context, opts *ListOptions, regionID string) ([]ObjectStorageBucket, error) { + return getPaginatedResults[ObjectStorageBucket](ctx, c, formatAPIPath("object-storage/buckets/%s", regionID), opts) } // GetObjectStorageBucket gets the ObjectStorageBucket with the provided label -func (c *Client) GetObjectStorageBucket(ctx context.Context, clusterOrRegionID, label string) (*ObjectStorageBucket, error) { - e := formatAPIPath("object-storage/buckets/%s/%s", clusterOrRegionID, label) +func (c *Client) GetObjectStorageBucket(ctx context.Context, regionID, label string) (*ObjectStorageBucket, error) { + e := formatAPIPath("object-storage/buckets/%s/%s", regionID, label) return doGETRequest[ObjectStorageBucket](ctx, c, e) } @@ -146,39 +132,37 @@ func (c *Client) CreateObjectStorageBucket(ctx context.Context, opts ObjectStora return doPOSTRequest[ObjectStorageBucket](ctx, c, "object-storage/buckets", opts) } -// GetObjectStorageBucketAccess gets the current access config for a bucket -// -// Deprecated: use GetObjectStorageBucketAccessV2 for new implementations -func (c *Client) GetObjectStorageBucketAccess(ctx context.Context, clusterOrRegionID, label string) (*ObjectStorageBucketAccess, error) { - e := formatAPIPath("object-storage/buckets/%s/%s/access", clusterOrRegionID, label) - return doGETRequest[ObjectStorageBucketAccess](ctx, c, e) +// ModifyObjectStorageBucketAccess modifies the access configuration for an ObjectStorageBucket +func (c *Client) ModifyObjectStorageBucketAccess(ctx context.Context, regionID, label string, opts ObjectStorageBucketModifyAccessOptions) error { + e := formatAPIPath("object-storage/buckets/%s/%s/access", regionID, label) + return doPOSTRequestNoResponseBody(ctx, c, e, opts) } // UpdateObjectStorageBucketAccess updates the access configuration for an ObjectStorageBucket -func (c *Client) UpdateObjectStorageBucketAccess(ctx context.Context, clusterOrRegionID, label string, opts ObjectStorageBucketUpdateAccessOptions) error { - e := formatAPIPath("object-storage/buckets/%s/%s/access", clusterOrRegionID, label) - return doPOSTRequestNoResponseBody(ctx, c, e, opts) +func (c *Client) UpdateObjectStorageBucketAccess(ctx context.Context, regionID, label string, opts ObjectStorageBucketUpdateAccessOptions) error { + e := formatAPIPath("object-storage/buckets/%s/%s/access", regionID, label) + return doPUTRequestNoResponseBody(ctx, c, e, opts) } -// GetObjectStorageBucketAccessV2 gets the current access config for a bucket -func (c *Client) GetObjectStorageBucketAccessV2(ctx context.Context, clusterOrRegionID, label string) (*ObjectStorageBucketAccessV2, error) { - e := formatAPIPath("object-storage/buckets/%s/%s/access", clusterOrRegionID, label) - return doGETRequest[ObjectStorageBucketAccessV2](ctx, c, e) +// GetObjectStorageBucketAccess gets the current access config for a bucket +func (c *Client) GetObjectStorageBucketAccess(ctx context.Context, regionID, label string) (*ObjectStorageBucketAccess, error) { + e := formatAPIPath("object-storage/buckets/%s/%s/access", regionID, label) + return doGETRequest[ObjectStorageBucketAccess](ctx, c, e) } // DeleteObjectStorageBucket deletes the ObjectStorageBucket with the specified label -func (c *Client) DeleteObjectStorageBucket(ctx context.Context, clusterOrRegionID, label string) error { - e := formatAPIPath("object-storage/buckets/%s/%s", clusterOrRegionID, label) +func (c *Client) DeleteObjectStorageBucket(ctx context.Context, regionID, label string) error { + e := formatAPIPath("object-storage/buckets/%s/%s", regionID, label) return doDELETERequest(ctx, c, e) } // ListObjectStorageBucketContents lists the contents of the specified ObjectStorageBucket func (c *Client) ListObjectStorageBucketContents( ctx context.Context, - clusterOrRegionID, label string, + regionID, label string, params *ObjectStorageBucketListContentsParams, ) (*ObjectStorageBucketContent, error) { - basePath := formatAPIPath("object-storage/buckets/%s/%s/object-list", clusterOrRegionID, label) + basePath := formatAPIPath("object-storage/buckets/%s/%s/object-list", regionID, label) queryString := "" diff --git a/object_storage_clusters.go b/object_storage_clusters.go deleted file mode 100644 index e4793241c..000000000 --- a/object_storage_clusters.go +++ /dev/null @@ -1,26 +0,0 @@ -package linodego - -import ( - "context" -) - -// ObjectStorageCluster represents a linode object storage cluster object -type ObjectStorageCluster struct { - ID string `json:"id"` - Domain string `json:"domain"` - Status string `json:"status"` - Region string `json:"region"` - StaticSiteDomain string `json:"static_site_domain"` -} - -// ListObjectStorageClusters lists ObjectStorageClusters -func (c *Client) ListObjectStorageClusters(ctx context.Context, opts *ListOptions) ([]ObjectStorageCluster, error) { - return getPaginatedResults[ObjectStorageCluster](ctx, c, "object-storage/clusters", opts) -} - -// Deprecated: GetObjectStorageCluster uses a deprecated API endpoint. -// GetObjectStorageCluster gets the template with the provided ID -func (c *Client) GetObjectStorageCluster(ctx context.Context, clusterID string) (*ObjectStorageCluster, error) { - e := formatAPIPath("object-storage/clusters/%s", clusterID) - return doGETRequest[ObjectStorageCluster](ctx, c, e) -} diff --git a/object_storage_keys.go b/object_storage_keys.go index cfc2ef480..b372bb3bf 100644 --- a/object_storage_keys.go +++ b/object_storage_keys.go @@ -23,11 +23,7 @@ type ObjectStorageKey struct { // ObjectStorageKeyBucketAccess represents a linode limited object storage key's bucket access type ObjectStorageKeyBucketAccess struct { - // Deprecated: Cluster field has been deprecated. - // Please consider switching to use the 'Region' field. - // If your Cluster is `us-mia-1`, then the region would be `us-mia`. - Cluster string `json:"cluster,omitempty"` - Region string `json:"region,omitempty"` + Region string `json:"region,omitzero"` BucketName string `json:"bucket_name"` Permissions string `json:"permissions"` @@ -35,15 +31,15 @@ type ObjectStorageKeyBucketAccess struct { // ObjectStorageKeyCreateOptions fields are those accepted by CreateObjectStorageKey type ObjectStorageKeyCreateOptions struct { - Label string `json:"label"` - BucketAccess *[]ObjectStorageKeyBucketAccess `json:"bucket_access,omitempty"` - Regions []string `json:"regions,omitempty"` + Label string `json:"label"` + BucketAccess []ObjectStorageKeyBucketAccess `json:"bucket_access,omitzero"` + Regions []string `json:"regions,omitzero"` } // ObjectStorageKeyUpdateOptions fields are those accepted by UpdateObjectStorageKey type ObjectStorageKeyUpdateOptions struct { - Label string `json:"label,omitempty"` - Regions []string `json:"regions,omitempty"` + Label string `json:"label,omitzero"` + Regions []string `json:"regions,omitzero"` } // ListObjectStorageKeys lists ObjectStorageKeys diff --git a/object_storage_object.go b/object_storage_object.go index 2e9cf8890..1f2d6fbad 100644 --- a/object_storage_object.go +++ b/object_storage_object.go @@ -7,9 +7,9 @@ import ( type ObjectStorageObjectURLCreateOptions struct { Name string `json:"name"` Method string `json:"method"` - ContentType string `json:"content_type,omitempty"` - ContentDisposition string `json:"content_disposition,omitempty"` - ExpiresIn *int `json:"expires_in,omitempty"` + ContentType string `json:"content_type,omitzero"` + ContentDisposition string `json:"content_disposition,omitzero"` + ExpiresIn *int `json:"expires_in,omitzero"` } type ObjectStorageObjectURL struct { @@ -17,13 +17,7 @@ type ObjectStorageObjectURL struct { Exists bool `json:"exists"` } -// Deprecated: Please use ObjectStorageObjectACLConfigV2 for all new implementations. type ObjectStorageObjectACLConfig struct { - ACL string `json:"acl"` - ACLXML string `json:"acl_xml"` -} - -type ObjectStorageObjectACLConfigV2 struct { ACL *string `json:"acl"` ACLXML *string `json:"acl_xml"` } @@ -35,39 +29,23 @@ type ObjectStorageObjectACLConfigUpdateOptions struct { func (c *Client) CreateObjectStorageObjectURL( ctx context.Context, - objectID, label string, + regionID, label string, opts ObjectStorageObjectURLCreateOptions, ) (*ObjectStorageObjectURL, error) { - e := formatAPIPath("object-storage/buckets/%s/%s/object-url", objectID, label) + e := formatAPIPath("object-storage/buckets/%s/%s/object-url", regionID, label) return doPOSTRequest[ObjectStorageObjectURL](ctx, c, e, opts) } -// Deprecated: use GetObjectStorageObjectACLConfigV2 for new implementations -func (c *Client) GetObjectStorageObjectACLConfig(ctx context.Context, objectID, label, object string) (*ObjectStorageObjectACLConfig, error) { - e := formatAPIPath("object-storage/buckets/%s/%s/object-acl?name=%s", objectID, label, object) +func (c *Client) GetObjectStorageObjectACLConfig(ctx context.Context, regionID, label, object string) (*ObjectStorageObjectACLConfig, error) { + e := formatAPIPath("object-storage/buckets/%s/%s/object-acl?name=%s", regionID, label, object) return doGETRequest[ObjectStorageObjectACLConfig](ctx, c, e) } -// Deprecated: use UpdateObjectStorageObjectACLConfigV2 for new implementations func (c *Client) UpdateObjectStorageObjectACLConfig( ctx context.Context, - objectID, label string, + regionID, label string, opts ObjectStorageObjectACLConfigUpdateOptions, ) (*ObjectStorageObjectACLConfig, error) { - e := formatAPIPath("object-storage/buckets/%s/%s/object-acl", objectID, label) + e := formatAPIPath("object-storage/buckets/%s/%s/object-acl", regionID, label) return doPUTRequest[ObjectStorageObjectACLConfig](ctx, c, e, opts) } - -func (c *Client) GetObjectStorageObjectACLConfigV2(ctx context.Context, objectID, label, object string) (*ObjectStorageObjectACLConfigV2, error) { - e := formatAPIPath("object-storage/buckets/%s/%s/object-acl?name=%s", objectID, label, object) - return doGETRequest[ObjectStorageObjectACLConfigV2](ctx, c, e) -} - -func (c *Client) UpdateObjectStorageObjectACLConfigV2( - ctx context.Context, - objectID, label string, - opts ObjectStorageObjectACLConfigUpdateOptions, -) (*ObjectStorageObjectACLConfigV2, error) { - e := formatAPIPath("object-storage/buckets/%s/%s/object-acl", objectID, label) - return doPUTRequest[ObjectStorageObjectACLConfigV2](ctx, c, e, opts) -} diff --git a/paged_response_structs.go b/paged_response_structs.go deleted file mode 100644 index 50af24c64..000000000 --- a/paged_response_structs.go +++ /dev/null @@ -1,174 +0,0 @@ -package linodego - -// Deprecated: AccountAvailabilityPagedResponse exists for historical compatibility and should not be used. -type AccountAvailabilityPagedResponse legacyPagedResponse[AccountAvailability] - -// Deprecated: AccountBetasPagedResponse exists for historical compatibility and should not be used. -type AccountBetasPagedResponse legacyPagedResponse[AccountBetaProgram] - -// Deprecated: BetaProgramPagedResponse exists for historical compatibility and should not be used. -type BetaProgramPagedResponse legacyPagedResponse[BetaProgram] - -// Deprecated: DatabaseEnginesPagedResponse exists for historical compatibility and should not be used. -type DatabaseEnginesPagedResponse legacyPagedResponse[DatabaseEngine] - -// Deprecated: DatabaseTypesPagedResponse exists for historical compatibility and should not be used. -type DatabaseTypesPagedResponse legacyPagedResponse[DatabaseType] - -// Deprecated: DatabasesPagedResponse exists for historical compatibility and should not be used. -type DatabasesPagedResponse legacyPagedResponse[Database] - -// Deprecated: DomainRecordsPagedResponse exists for historical compatibility and should not be used. -type DomainRecordsPagedResponse legacyPagedResponse[DomainRecord] - -// Deprecated: DomainsPagedResponse exists for historical compatibility and should not be used. -type DomainsPagedResponse legacyPagedResponse[Domain] - -// Deprecated: EventsPagedResponse exists for historical compatibility and should not be used. -type EventsPagedResponse legacyPagedResponse[Event] - -// Deprecated: FirewallDevicesPagedResponse exists for historical compatibility and should not be used. -type FirewallDevicesPagedResponse legacyPagedResponse[FirewallDevice] - -// Deprecated: FirewallsPagedResponse exists for historical compatibility and should not be used. -type FirewallsPagedResponse legacyPagedResponse[Firewall] - -// Deprecated: ImagesPagedResponse exists for historical compatibility and should not be used. -type ImagesPagedResponse legacyPagedResponse[Image] - -// Deprecated: InstanceConfigsPagedResponse exists for historical compatibility and should not be used. -type InstanceConfigsPagedResponse legacyPagedResponse[InstanceConfig] - -// Deprecated: InstanceDisksPagedResponse exists for historical compatibility and should not be used. -type InstanceDisksPagedResponse legacyPagedResponse[InstanceDisk] - -// Deprecated: InstanceFirewallsPagedResponse exists for historical compatibility and should not be used. -type InstanceFirewallsPagedResponse legacyPagedResponse[Firewall] - -// Deprecated: InstanceVolumesPagedResponse exists for historical compatibility and should not be used. -type InstanceVolumesPagedResponse legacyPagedResponse[Volume] - -// Deprecated: InstancesPagedResponse exists for historical compatibility and should not be used. -type InstancesPagedResponse legacyPagedResponse[Instance] - -// Deprecated: InvoiceItemsPagedResponse exists for historical compatibility and should not be used. -type InvoiceItemsPagedResponse legacyPagedResponse[InvoiceItem] - -// Deprecated: InvoicesPagedResponse exists for historical compatibility and should not be used. -type InvoicesPagedResponse legacyPagedResponse[Invoice] - -// Deprecated: LKEClusterPoolsPagedResponse exists for historical compatibility and should not be used. -// LKEClusterPoolsPagedResponse represents a paginated LKEClusterPool API response. -type LKEClusterPoolsPagedResponse LKENodePoolsPagedResponse - -// Deprecated: LKEVersionsPagedResponse exists for historical compatibility and should not be used. -type LKEVersionsPagedResponse legacyPagedResponse[LKEVersion] - -// Deprecated: LKEClusterAPIEndpointsPagedResponse exists for historical compatibility and should not be used. -type LKEClusterAPIEndpointsPagedResponse legacyPagedResponse[LKEClusterAPIEndpoint] - -// Deprecated: LKEClustersPagedResponse exists for historical compatibility and should not be used. -type LKEClustersPagedResponse legacyPagedResponse[LKECluster] - -// Deprecated: LKENodePoolsPagedResponse exists for historical compatibility and should not be used. -type LKENodePoolsPagedResponse legacyPagedResponse[LKENodePool] - -// Deprecated: IPAddressesPagedResponse exists for historical compatibility and should not be used. -type IPAddressesPagedResponse legacyPagedResponse[InstanceIP] - -// Deprecated: IPv6PoolsPagedResponse exists for historical compatibility and should not be used. -type IPv6PoolsPagedResponse legacyPagedResponse[IPv6Range] - -// Deprecated: IPv6RangesPagedResponse exists for historical compatibility and should not be used. -type IPv6RangesPagedResponse legacyPagedResponse[IPv6Range] - -// Deprecated: LinodeKernelsPagedResponse exists for historical compatibility and should not be used. -type LinodeKernelsPagedResponse legacyPagedResponse[LinodeKernel] - -// Deprecated: LinodeTypesPagedResponse exists for historical compatibility and should not be used. -type LinodeTypesPagedResponse legacyPagedResponse[LinodeType] - -// Deprecated: LoginsPagedResponse exists for historical compatibility and should not be used. -type LoginsPagedResponse legacyPagedResponse[Login] - -// Deprecated: LongviewClientsPagedResponse exists for historical compatibility and should not be used. -type LongviewClientsPagedResponse legacyPagedResponse[LongviewClient] - -// Deprecated: LongviewSubscriptionsPagedResponse exists for historical compatibility and should not be used. -type LongviewSubscriptionsPagedResponse legacyPagedResponse[LongviewSubscription] - -// Deprecated: MySQLDatabasesPagedResponse exists for historical compatibility and should not be used. -type MySQLDatabasesPagedResponse legacyPagedResponse[MySQLDatabase] - -// Deprecated: NodeBalancersPagedResponse exists for historical compatibility and should not be used. -type NodeBalancersPagedResponse legacyPagedResponse[NodeBalancer] - -// Deprecated: NodeBalancerConfigsPagedResponse exists for historical compatibility and should not be used. -type NodeBalancerConfigsPagedResponse legacyPagedResponse[NodeBalancerConfig] - -// Deprecated: NodeBalancerNodesPagedResponse exists for historical compatibility and should not be used. -type NodeBalancerNodesPagedResponse legacyPagedResponse[NodeBalancerNode] - -// Deprecated: NodeBalancerFirewallsPagedResponse exists for historical compatibility and should not be used. -type NodeBalancerFirewallsPagedResponse legacyPagedResponse[Firewall] - -// Deprecated: NotificationsPagedResponse exists for historical compatibility and should not be used. -type NotificationsPagedResponse legacyPagedResponse[Notification] - -// Deprecated: OAuthClientsPagedResponse exists for historical compatibility and should not be used. -type OAuthClientsPagedResponse legacyPagedResponse[OAuthClient] - -// Deprecated: ObjectStorageKeysPagedResponse exists for historical compatibility and should not be used. -type ObjectStorageKeysPagedResponse legacyPagedResponse[ObjectStorageKey] - -// Deprecated: ObjectStorageBucketsPagedResponse exists for historical compatibility and should not be used. -type ObjectStorageBucketsPagedResponse legacyPagedResponse[ObjectStorageBucket] - -// Deprecated: ObjectStorageClustersPagedResponse exists for historical compatibility and should not be used. -type ObjectStorageClustersPagedResponse legacyPagedResponse[ObjectStorageCluster] - -// Deprecated: PaymentsPagedResponse exists for historical compatibility and should not be used. -type PaymentsPagedResponse legacyPagedResponse[Payment] - -// Deprecated: RegionsPagedResponse exists for historical compatibility and should not be used. -type RegionsPagedResponse legacyPagedResponse[Region] - -// Deprecated: SSHKeysPagedResponse exists for historical compatibility and should not be used. -type SSHKeysPagedResponse legacyPagedResponse[SSHKey] - -// Deprecated: TokensPagedResponse exists for historical compatibility and should not be used. -type ( - TokensPagedResponse legacyPagedResponse[Token] - // Deprecated: RegionsAvailabilityPagedResponse exists for historical compatibility and should not be used. - RegionsAvailabilityPagedResponse legacyPagedResponse[RegionAvailability] -) - -// Deprecated: StackscriptsPagedResponse exists for historical compatibility and should not be used. -type StackscriptsPagedResponse legacyPagedResponse[Stackscript] - -// Deprecated: TagsPagedResponse exists for historical compatibility and should not be used. -type TagsPagedResponse legacyPagedResponse[Tag] - -// Deprecated: TaggedObjectsPagedResponse exists for historical compatibility and should not be used. -type TaggedObjectsPagedResponse legacyPagedResponse[TaggedObject] - -// Deprecated: TicketsPagedResponse exists for historical compatibility and should not be used. -type TicketsPagedResponse legacyPagedResponse[Ticket] - -// Deprecated: PostgresDatabasesPagedResponse exists for historical compatibility and should not be used. -type PostgresDatabasesPagedResponse legacyPagedResponse[PostgresDatabase] - -// Deprecated: ProfileLoginsPagedResponse exists for historical compatibility and should not be used. -type ProfileLoginsPagedResponse legacyPagedResponse[ProfileLogin] - -// Deprecated: UsersPagedResponse exists for historical compatibility and should not be used. -type UsersPagedResponse legacyPagedResponse[User] - -// Deprecated: VolumesPagedResponse exists for historical compatibility and should not be used. -type VolumesPagedResponse legacyPagedResponse[Volume] - -// Deprecated: VPCsPagedResponse exists for historical compatibility and should not be used. -type VPCsPagedResponse legacyPagedResponse[VPC] - -// Deprecated: VPCSubnetsPagedResponse exists for historical compatibility and should not be used. -type VPCSubnetsPagedResponse legacyPagedResponse[VPCSubnet] diff --git a/pagination.go b/pagination.go index 074720e82..57ca27ca7 100644 --- a/pagination.go +++ b/pagination.go @@ -9,17 +9,16 @@ import ( "encoding/hex" "encoding/json" "fmt" + "net/http" "reflect" "strconv" - - "github.com/go-resty/resty/v2" ) // PageOptions are the pagination parameters for List endpoints type PageOptions struct { - Page int `json:"page" url:"page,omitempty"` - Pages int `json:"pages" url:"pages,omitempty"` - Results int `json:"results" url:"results,omitempty"` + Page int `json:"page"` + Pages int `json:"pages"` + Results int `json:"results"` } // ListOptions are the pagination and filtering (TODO) parameters for endpoints @@ -56,38 +55,51 @@ func (l ListOptions) Hash() (string, error) { return hex.EncodeToString(h.Sum(nil)), nil } -func applyListOptionsToRequest(opts *ListOptions, req *resty.Request) error { +func createListOptionsToRequestMutator(opts *ListOptions) func(*http.Request) error { if opts == nil { return nil } - if opts.QueryParams != nil { - params, err := flattenQueryStruct(opts.QueryParams) - if err != nil { - return fmt.Errorf("failed to apply list options: %w", err) + // Return a mutator to apply query parameters and headers + return func(req *http.Request) error { + query := req.URL.Query() + + // Apply QueryParams from ListOptions if present + if opts.QueryParams != nil { + params, err := flattenQueryStruct(opts.QueryParams) + if err != nil { + return fmt.Errorf("failed to apply list options: %w", err) + } + + for key, value := range params { + query.Set(key, value) + } } - req.SetQueryParams(params) - } + // Apply pagination options + if opts.PageOptions != nil && opts.Page > 0 { + query.Set("page", strconv.Itoa(opts.Page)) + } - if opts.PageOptions != nil && opts.Page > 0 { - req.SetQueryParam("page", strconv.Itoa(opts.Page)) - } + if opts.PageSize > 0 { + query.Set("page_size", strconv.Itoa(opts.PageSize)) + } - if opts.PageSize > 0 { - req.SetQueryParam("page_size", strconv.Itoa(opts.PageSize)) - } + // Apply filters as headers + if len(opts.Filter) > 0 { + req.Header.Set("X-Filter", opts.Filter) + } - if len(opts.Filter) > 0 { - req.SetHeader("X-Filter", opts.Filter) - } + // Assign the updated query back to the request URL + req.URL.RawQuery = query.Encode() - return nil + return nil + } } type PagedResponse interface { endpoint(...any) string - castResult(*resty.Request, string) (int, int, error) + castResult(*http.Request, string) (int, int, error) } // flattenQueryStruct flattens a structure into a Resty-compatible query param map. @@ -162,9 +174,3 @@ func queryFieldToString(value reflect.Value) (string, error) { return "", fmt.Errorf("unsupported query param type: %s", value.Type().Name()) } } - -type legacyPagedResponse[T any] struct { - *PageOptions - - Data []T `json:"data"` -} diff --git a/placement_groups.go b/placement_groups.go index 189b3ace1..04effa2d9 100644 --- a/placement_groups.go +++ b/placement_groups.go @@ -61,14 +61,14 @@ type PlacementGroupCreateOptions struct { // PlacementGroupUpdateOptions represents the options to use // when updating a placement group. type PlacementGroupUpdateOptions struct { - Label string `json:"label,omitempty"` + Label string `json:"label,omitzero"` } // PlacementGroupAssignOptions represents options used when // assigning Linodes to a placement group. type PlacementGroupAssignOptions struct { Linodes []int `json:"linodes"` - CompliantOnly *bool `json:"compliant_only,omitempty"` + CompliantOnly *bool `json:"compliant_only,omitzero"` } // PlacementGroupUnAssignOptions represents options used when diff --git a/postgres.go b/postgres.go index ac4a78cf5..c410156a5 100644 --- a/postgres.go +++ b/postgres.go @@ -62,65 +62,65 @@ type PostgresDatabase struct { UsedDiskSizeGB int `json:"used_disk_size_gb"` TotalDiskSizeGB int `json:"total_disk_size_gb"` EngineConfig PostgresDatabaseEngineConfig `json:"engine_config"` - PrivateNetwork *DatabasePrivateNetwork `json:"private_network,omitempty"` + PrivateNetwork *DatabasePrivateNetwork `json:"private_network,omitzero"` } type PostgresDatabaseEngineConfig struct { - PG *PostgresDatabaseEngineConfigPG `json:"pg,omitempty"` - PGStatMonitorEnable *bool `json:"pg_stat_monitor_enable,omitempty"` - PGLookout *PostgresDatabaseEngineConfigPGLookout `json:"pglookout,omitempty"` - SharedBuffersPercentage *float64 `json:"shared_buffers_percentage,omitempty"` - WorkMem *int `json:"work_mem,omitempty"` + PG *PostgresDatabaseEngineConfigPG `json:"pg,omitzero"` + PGStatMonitorEnable *bool `json:"pg_stat_monitor_enable,omitzero"` + PGLookout *PostgresDatabaseEngineConfigPGLookout `json:"pglookout,omitzero"` + SharedBuffersPercentage *float64 `json:"shared_buffers_percentage,omitzero"` + WorkMem *int `json:"work_mem,omitzero"` } type PostgresDatabaseEngineConfigPG struct { - AutovacuumAnalyzeScaleFactor *float64 `json:"autovacuum_analyze_scale_factor,omitempty"` - AutovacuumAnalyzeThreshold *int32 `json:"autovacuum_analyze_threshold,omitempty"` - AutovacuumMaxWorkers *int `json:"autovacuum_max_workers,omitempty"` - AutovacuumNaptime *int `json:"autovacuum_naptime,omitempty"` - AutovacuumVacuumCostDelay *int `json:"autovacuum_vacuum_cost_delay,omitempty"` - AutovacuumVacuumCostLimit *int `json:"autovacuum_vacuum_cost_limit,omitempty"` - AutovacuumVacuumScaleFactor *float64 `json:"autovacuum_vacuum_scale_factor,omitempty"` - AutovacuumVacuumThreshold *int32 `json:"autovacuum_vacuum_threshold,omitempty"` - BGWriterDelay *int `json:"bgwriter_delay,omitempty"` - BGWriterFlushAfter *int `json:"bgwriter_flush_after,omitempty"` - BGWriterLRUMaxPages *int `json:"bgwriter_lru_maxpages,omitempty"` - BGWriterLRUMultiplier *float64 `json:"bgwriter_lru_multiplier,omitempty"` - DeadlockTimeout *int `json:"deadlock_timeout,omitempty"` - DefaultToastCompression *string `json:"default_toast_compression,omitempty"` - IdleInTransactionSessionTimeout *int `json:"idle_in_transaction_session_timeout,omitempty"` - JIT *bool `json:"jit,omitempty"` - MaxFilesPerProcess *int `json:"max_files_per_process,omitempty"` - MaxLocksPerTransaction *int `json:"max_locks_per_transaction,omitempty"` - MaxLogicalReplicationWorkers *int `json:"max_logical_replication_workers,omitempty"` - MaxParallelWorkers *int `json:"max_parallel_workers,omitempty"` - MaxParallelWorkersPerGather *int `json:"max_parallel_workers_per_gather,omitempty"` - MaxPredLocksPerTransaction *int `json:"max_pred_locks_per_transaction,omitempty"` - MaxReplicationSlots *int `json:"max_replication_slots,omitempty"` - MaxSlotWALKeepSize *int32 `json:"max_slot_wal_keep_size,omitempty"` - MaxStackDepth *int `json:"max_stack_depth,omitempty"` - MaxStandbyArchiveDelay *int `json:"max_standby_archive_delay,omitempty"` - MaxStandbyStreamingDelay *int `json:"max_standby_streaming_delay,omitempty"` - MaxWALSenders *int `json:"max_wal_senders,omitempty"` - MaxWorkerProcesses *int `json:"max_worker_processes,omitempty"` - PasswordEncryption *string `json:"password_encryption,omitempty"` - PGPartmanBGWInterval *int `json:"pg_partman_bgw.interval,omitempty"` - PGPartmanBGWRole *string `json:"pg_partman_bgw.role,omitempty"` - PGStatMonitorPGSMEnableQueryPlan *bool `json:"pg_stat_monitor.pgsm_enable_query_plan,omitempty"` - PGStatMonitorPGSMMaxBuckets *int `json:"pg_stat_monitor.pgsm_max_buckets,omitempty"` - PGStatStatementsTrack *string `json:"pg_stat_statements.track,omitempty"` - TempFileLimit *int32 `json:"temp_file_limit,omitempty"` - Timezone *string `json:"timezone,omitempty"` - TrackActivityQuerySize *int `json:"track_activity_query_size,omitempty"` - TrackCommitTimestamp *string `json:"track_commit_timestamp,omitempty"` - TrackFunctions *string `json:"track_functions,omitempty"` - TrackIOTiming *string `json:"track_io_timing,omitempty"` - WALSenderTimeout *int `json:"wal_sender_timeout,omitempty"` - WALWriterDelay *int `json:"wal_writer_delay,omitempty"` + AutovacuumAnalyzeScaleFactor *float64 `json:"autovacuum_analyze_scale_factor,omitzero"` + AutovacuumAnalyzeThreshold *int32 `json:"autovacuum_analyze_threshold,omitzero"` + AutovacuumMaxWorkers *int `json:"autovacuum_max_workers,omitzero"` + AutovacuumNaptime *int `json:"autovacuum_naptime,omitzero"` + AutovacuumVacuumCostDelay *int `json:"autovacuum_vacuum_cost_delay,omitzero"` + AutovacuumVacuumCostLimit *int `json:"autovacuum_vacuum_cost_limit,omitzero"` + AutovacuumVacuumScaleFactor *float64 `json:"autovacuum_vacuum_scale_factor,omitzero"` + AutovacuumVacuumThreshold *int32 `json:"autovacuum_vacuum_threshold,omitzero"` + BGWriterDelay *int `json:"bgwriter_delay,omitzero"` + BGWriterFlushAfter *int `json:"bgwriter_flush_after,omitzero"` + BGWriterLRUMaxPages *int `json:"bgwriter_lru_maxpages,omitzero"` + BGWriterLRUMultiplier *float64 `json:"bgwriter_lru_multiplier,omitzero"` + DeadlockTimeout *int `json:"deadlock_timeout,omitzero"` + DefaultToastCompression *string `json:"default_toast_compression,omitzero"` + IdleInTransactionSessionTimeout *int `json:"idle_in_transaction_session_timeout,omitzero"` + JIT *bool `json:"jit,omitzero"` + MaxFilesPerProcess *int `json:"max_files_per_process,omitzero"` + MaxLocksPerTransaction *int `json:"max_locks_per_transaction,omitzero"` + MaxLogicalReplicationWorkers *int `json:"max_logical_replication_workers,omitzero"` + MaxParallelWorkers *int `json:"max_parallel_workers,omitzero"` + MaxParallelWorkersPerGather *int `json:"max_parallel_workers_per_gather,omitzero"` + MaxPredLocksPerTransaction *int `json:"max_pred_locks_per_transaction,omitzero"` + MaxReplicationSlots *int `json:"max_replication_slots,omitzero"` + MaxSlotWALKeepSize *int32 `json:"max_slot_wal_keep_size,omitzero"` + MaxStackDepth *int `json:"max_stack_depth,omitzero"` + MaxStandbyArchiveDelay *int `json:"max_standby_archive_delay,omitzero"` + MaxStandbyStreamingDelay *int `json:"max_standby_streaming_delay,omitzero"` + MaxWALSenders *int `json:"max_wal_senders,omitzero"` + MaxWorkerProcesses *int `json:"max_worker_processes,omitzero"` + PasswordEncryption *string `json:"password_encryption,omitzero"` + PGPartmanBGWInterval *int `json:"pg_partman_bgw.interval,omitzero"` + PGPartmanBGWRole *string `json:"pg_partman_bgw.role,omitzero"` + PGStatMonitorPGSMEnableQueryPlan *bool `json:"pg_stat_monitor.pgsm_enable_query_plan,omitzero"` + PGStatMonitorPGSMMaxBuckets *int `json:"pg_stat_monitor.pgsm_max_buckets,omitzero"` + PGStatStatementsTrack *string `json:"pg_stat_statements.track,omitzero"` + TempFileLimit *int32 `json:"temp_file_limit,omitzero"` + Timezone *string `json:"timezone,omitzero"` + TrackActivityQuerySize *int `json:"track_activity_query_size,omitzero"` + TrackCommitTimestamp *string `json:"track_commit_timestamp,omitzero"` + TrackFunctions *string `json:"track_functions,omitzero"` + TrackIOTiming *string `json:"track_io_timing,omitzero"` + WALSenderTimeout *int `json:"wal_sender_timeout,omitzero"` + WALWriterDelay *int `json:"wal_writer_delay,omitzero"` } type PostgresDatabaseEngineConfigPGLookout struct { - MaxFailoverReplicationTimeLag *int64 `json:"max_failover_replication_time_lag,omitempty"` + MaxFailoverReplicationTimeLag *int64 `json:"max_failover_replication_time_lag,omitzero"` } type PostgresDatabaseConfigInfo struct { @@ -594,25 +594,25 @@ type PostgresCreateOptions struct { Region string `json:"region"` Type string `json:"type"` Engine string `json:"engine"` - AllowList []string `json:"allow_list,omitempty"` - ClusterSize int `json:"cluster_size,omitempty"` + AllowList []string `json:"allow_list,omitzero"` + ClusterSize int `json:"cluster_size,omitzero"` - Fork *DatabaseFork `json:"fork,omitempty"` + Fork *DatabaseFork `json:"fork,omitzero"` - EngineConfig *PostgresDatabaseEngineConfig `json:"engine_config,omitempty"` - PrivateNetwork *DatabasePrivateNetwork `json:"private_network,omitempty"` + EngineConfig *PostgresDatabaseEngineConfig `json:"engine_config,omitzero"` + PrivateNetwork *DatabasePrivateNetwork `json:"private_network,omitzero"` } // PostgresUpdateOptions fields are used when altering the existing Postgres Database type PostgresUpdateOptions struct { - Label string `json:"label,omitempty"` - AllowList *[]string `json:"allow_list,omitempty"` - Updates *DatabaseMaintenanceWindow `json:"updates,omitempty"` - Type string `json:"type,omitempty"` - ClusterSize int `json:"cluster_size,omitempty"` - Version string `json:"version,omitempty"` - EngineConfig *PostgresDatabaseEngineConfig `json:"engine_config,omitempty"` - PrivateNetwork *DatabasePrivateNetwork `json:"private_network,omitempty"` + Label string `json:"label,omitzero"` + AllowList []string `json:"allow_list,omitzero"` + Updates *DatabaseMaintenanceWindow `json:"updates,omitzero"` + Type string `json:"type,omitzero"` + ClusterSize int `json:"cluster_size,omitzero"` + Version string `json:"version,omitzero"` + EngineConfig *PostgresDatabaseEngineConfig `json:"engine_config,omitzero"` + PrivateNetwork *DatabasePrivateNetwork `json:"private_network,omitzero"` } // PostgresDatabaseSSL is the SSL Certificate to access the Linode Managed Postgres Database diff --git a/profile.go b/profile.go index c290d62b5..68e6bb0dd 100644 --- a/profile.go +++ b/profile.go @@ -38,19 +38,19 @@ type Profile struct { Referrals ProfileReferrals `json:"referrals"` AuthorizedKeys []string `json:"authorized_keys"` AuthenticationType string `json:"authentication_type"` - VerifiedPhoneNumber string `json:"verified_phone_number,omitempty"` + VerifiedPhoneNumber string `json:"verified_phone_number,omitzero"` } // ProfileUpdateOptions fields are those accepted by UpdateProfile type ProfileUpdateOptions struct { - Email string `json:"email,omitempty"` - Timezone string `json:"timezone,omitempty"` - EmailNotifications *bool `json:"email_notifications,omitempty"` - IPWhitelistEnabled *bool `json:"ip_whitelist_enabled,omitempty"` - LishAuthMethod LishAuthMethod `json:"lish_auth_method,omitempty"` - AuthorizedKeys *[]string `json:"authorized_keys,omitempty"` - TwoFactorAuth *bool `json:"two_factor_auth,omitempty"` - Restricted *bool `json:"restricted,omitempty"` + Email string `json:"email,omitzero"` + Timezone string `json:"timezone,omitzero"` + EmailNotifications *bool `json:"email_notifications,omitzero"` + IPWhitelistEnabled *bool `json:"ip_whitelist_enabled,omitzero"` + LishAuthMethod LishAuthMethod `json:"lish_auth_method,omitzero"` + AuthorizedKeys []string `json:"authorized_keys,omitzero"` + TwoFactorAuth *bool `json:"two_factor_auth,omitzero"` + Restricted *bool `json:"restricted,omitzero"` } // GetUpdateOptions converts a Profile to ProfileUpdateOptions for use in UpdateProfile @@ -62,7 +62,7 @@ func (i Profile) GetUpdateOptions() (o ProfileUpdateOptions) { o.LishAuthMethod = i.LishAuthMethod authorizedKeys := make([]string, len(i.AuthorizedKeys)) copy(authorizedKeys, i.AuthorizedKeys) - o.AuthorizedKeys = &authorizedKeys + o.AuthorizedKeys = authorizedKeys o.TwoFactorAuth = copyBool(&i.TwoFactorAuth) o.Restricted = copyBool(&i.Restricted) diff --git a/regions.go b/regions.go index 935d9aba4..b049cc1a5 100644 --- a/regions.go +++ b/regions.go @@ -5,63 +5,60 @@ import ( "time" ) +// RegionCapability constants start with Capability and include all known Linode region capabilities. +type RegionCapability string + // This is an enumeration of Capabilities Linode offers that can be referenced // through the user-facing parts of the application. -// Defined as strings rather than a custom type to avoid breaking change. -// Can be changed in the potential v2 version. const ( - CapabilityACLB string = "Akamai Cloud Load Balancer" - CapabilityACLP string = "Akamai Cloud Pulse" - CapabilityACLPStreams string = "Akamai Cloud Pulse Streams" - CapabilityAkamaiRAMProtection string = "Akamai RAM Protection" - CapabilityBackups string = "Backups" - CapabilityBlockStorage string = "Block Storage" - CapabilityBlockStorageEncryption string = "Block Storage Encryption" - CapabilityBlockStorageMigrations string = "Block Storage Migrations" - CapabilityBlockStoragePerformanceB1 string = "Block Storage Performance B1" - CapabilityBlockStoragePerformanceB1Default string = "Block Storage Performance B1 Default" - CapabilityCloudFirewall string = "Cloud Firewall" - CapabilityCloudFirewallRuleSet string = "Cloud Firewall Rule Set" - CapabilityCloudNAT string = "Cloud NAT" - CapabilityDBAAS string = "Managed Databases" - CapabilityDBAASBeta string = "Managed Databases Beta" - CapabilityDiskEncryption string = "Disk Encryption" - CapabilityDistributedPlans string = "Distributed Plans" - CapabilityEdgePlans string = "Edge Plans" - CapabilityGPU string = "GPU Linodes" - CapabilityKubernetesEnterprise string = "Kubernetes Enterprise" - CapabilityKubernetesEnterpriseBYOVPC string = "Kubernetes Enterprise BYO VPC" - CapabilityKubernetesEnterpriseDualStack string = "Kubernetes Enterprise Dual Stack" - CapabilityLADiskEncryption string = "LA Disk Encryption" - CapabilityLinodeInterfaces string = "Linode Interfaces" - CapabilityLinodes string = "Linodes" - CapabilityLKE string = "Kubernetes" - CapabilityLKEControlPlaneACL string = "LKE Network Access Control List (IP ACL)" - CapabilityLkeHaControlPlanes string = "LKE HA Control Planes" - CapabilityMachineImages string = "Machine Images" - CapabilityMaintenancePolicy string = "Maintenance Policy" - CapabilityMetadata string = "Metadata" - CapabilityNLB string = "Network LoadBalancer" - CapabilityNodeBalancers string = "NodeBalancers" - CapabilityObjectStorage string = "Object Storage" - CapabilityObjectStorageAccessKeyRegions string = "Object Storage Access Key Regions" - CapabilityObjectStorageEndpointTypes string = "Object Storage Endpoint Types" - CapabilityPlacementGroup string = "Placement Group" - CapabilityPremiumPlans string = "Premium Plans" - CapabilityQuadraT1UVPU string = "NETINT Quadra T1U" - CapabilitySMTPEnabled string = "SMTP Enabled" - CapabilityStackScripts string = "StackScripts" - CapabilitySupportTicketSeverity string = "Support Ticket Severity" - CapabilityVlans string = "Vlans" - CapabilityVPCs string = "VPCs" - CapabilityVPCDualStack string = "VPC Dual Stack" - CapabilityVPCIPv6LargePrefixes string = "VPC IPv6 Large Prefixes" - CapabilityVPCIPv6Stack string = "VPC IPv6 Stack" - CapabilityVPCsExtra string = "VPCs Extra" - - // Deprecated: CapabilityObjectStorageRegions constant has been - // renamed to `CapabilityObjectStorageAccessKeyRegions`. - CapabilityObjectStorageRegions string = CapabilityObjectStorageAccessKeyRegions + CapabilityACLP RegionCapability = "Akamai Cloud Pulse" + CapabilityACLPStreams RegionCapability = "Akamai Cloud Pulse Streams" + CapabilityAkamaiRAMProtection RegionCapability = "Akamai RAM Protection" + CapabilityACLB RegionCapability = "Akamai Cloud Load Balancer" + CapabilityBackups RegionCapability = "Backups" + CapabilityBlockStorage RegionCapability = "Block Storage" + CapabilityBlockStorageEncryption RegionCapability = "Block Storage Encryption" + CapabilityBlockStorageMigrations RegionCapability = "Block Storage Migrations" + CapabilityBlockStoragePerformanceB1 RegionCapability = "Block Storage Performance B1" + CapabilityBlockStoragePerformanceB1Default RegionCapability = "Block Storage Performance B1 Default" + CapabilityCloudFirewall RegionCapability = "Cloud Firewall" + CapabilityCloudFirewallRuleSet RegionCapability = "Cloud Firewall Rule Set" + CapabilityCloudNAT RegionCapability = "Cloud NAT" + CapabilityDBAAS RegionCapability = "Managed Databases" + CapabilityDBAASBeta RegionCapability = "Managed Databases Beta" + CapabilityDiskEncryption RegionCapability = "Disk Encryption" + CapabilityDistributedPlans RegionCapability = "Distributed Plans" + CapabilityEdgePlans RegionCapability = "Edge Plans" + CapabilityGPU RegionCapability = "GPU Linodes" + CapabilityKubernetesEnterprise RegionCapability = "Kubernetes Enterprise" + CapabilityKubernetesEnterpriseBYOVPC RegionCapability = "Kubernetes Enterprise BYO VPC" + CapabilityKubernetesEnterpriseDualStack RegionCapability = "Kubernetes Enterprise Dual Stack" + CapabilityLADiskEncryption RegionCapability = "LA Disk Encryption" + CapabilityLinodeInterfaces RegionCapability = "Linode Interfaces" + CapabilityLinodes RegionCapability = "Linodes" + CapabilityLKE RegionCapability = "Kubernetes" + CapabilityLKEControlPlaneACL RegionCapability = "LKE Network Access Control List (IP ACL)" + CapabilityLkeHaControlPlanes RegionCapability = "LKE HA Control Planes" + CapabilityMachineImages RegionCapability = "Machine Images" + CapabilityMaintenancePolicy RegionCapability = "Maintenance Policy" + CapabilityMetadata RegionCapability = "Metadata" + CapabilityNLB RegionCapability = "Network LoadBalancer" + CapabilityNodeBalancers RegionCapability = "NodeBalancers" + CapabilityObjectStorage RegionCapability = "Object Storage" + CapabilityObjectStorageAccessKeyRegions RegionCapability = "Object Storage Access Key Regions" + CapabilityObjectStorageEndpointTypes RegionCapability = "Object Storage Endpoint Types" + CapabilityPlacementGroup RegionCapability = "Placement Group" + CapabilityPremiumPlans RegionCapability = "Premium Plans" + CapabilityQuadraT1UVPU RegionCapability = "NETINT Quadra T1U" + CapabilitySMTPEnabled RegionCapability = "SMTP Enabled" + CapabilityStackScripts RegionCapability = "StackScripts" + CapabilitySupportTicketSeverity RegionCapability = "Support Ticket Severity" + CapabilityVlans RegionCapability = "Vlans" + CapabilityVPCs RegionCapability = "VPCs" + CapabilityVPCDualStack RegionCapability = "VPC Dual Stack" + CapabilityVPCIPv6LargePrefixes RegionCapability = "VPC IPv6 Large Prefixes" + CapabilityVPCIPv6Stack RegionCapability = "VPC IPv6 Stack" + CapabilityVPCsExtra RegionCapability = "VPCs Extra" ) // Region-related endpoints have a custom expiry time as the diff --git a/request_helpers.go b/request_helpers.go index 470bc1845..3efdeca3b 100644 --- a/request_helpers.go +++ b/request_helpers.go @@ -1,9 +1,11 @@ package linodego import ( + "bytes" "context" "encoding/json" "fmt" + "net/http" "net/url" "reflect" ) @@ -11,9 +13,9 @@ import ( // paginatedResponse represents a single response from a paginated // endpoint. type paginatedResponse[T any] struct { - Page int `json:"page" url:"page,omitempty"` - Pages int `json:"pages" url:"pages,omitempty"` - Results int `json:"results" url:"results,omitempty"` + Page int `json:"page"` + Pages int `json:"pages"` + Results int `json:"results"` Data []T `json:"data"` } @@ -60,56 +62,33 @@ func handlePaginatedResults[T any, O any]( handlePage := func(page int) error { var resultType paginatedResponse[T] - // Override the page to be applied in applyListOptionsToRequest(...) + // Override the page to be applied in createListOptionsToRequestMutator(...) opts.Page = page - // This request object cannot be reused for each page request - // because it can lead to possible data corruption - req := client.R(ctx).SetResult(&resultType) - - // Apply all user-provided list options to the request - if err := applyListOptionsToRequest(opts, req); err != nil { - return err + params := requestParams{ + Response: &resultType, } - // Set request body if provided if reqBody != "" { - req.SetBody(reqBody) + params.Body = bytes.NewReader([]byte(reqBody)) } - var response *paginatedResponse[T] - // Execute the appropriate HTTP method - switch method { - case "GET": - res, err := coupleAPIErrors(req.Get(endpoint)) - if err != nil { - return err - } - - response = res.Result().(*paginatedResponse[T]) - case "PUT": - res, err := coupleAPIErrors(req.Put(endpoint)) - if err != nil { - return err - } - - response = res.Result().(*paginatedResponse[T]) - case "POST": - res, err := coupleAPIErrors(req.Post(endpoint)) - if err != nil { - return err - } - - response = res.Result().(*paginatedResponse[T]) - default: - return fmt.Errorf("unsupported HTTP method: %s", method) + // Create a mutator to apply all user-provided list options to the request + mutator := createListOptionsToRequestMutator(opts) + + // Make the request using doRequest + err := client.doRequest(ctx, method, endpoint, params, &mutator) + if err != nil { + return err } // Update pagination metadata opts.Page = page - opts.Pages = response.Pages - opts.Results = response.Results - result = append(result, response.Data...) + opts.Pages = resultType.Pages + opts.Results = resultType.Results + + // Append the data to the result slice + result = append(result, resultType.Data...) return nil } @@ -127,13 +106,12 @@ func handlePaginatedResults[T any, O any]( return nil, err } - // If the user has explicitly specified a page, we don't - // need to get any other pages. + // If a specific page is defined, return the result if pageDefined { return result, nil } - // Get the rest of the pages + // Get the remaining pages for page := 2; page <= opts.Pages; page++ { if err := handlePage(page); err != nil { return nil, err @@ -187,14 +165,16 @@ func doGETRequest[T any]( ) (*T, error) { var resultType T - req := client.R(ctx).SetResult(&resultType) + params := requestParams{ + Response: &resultType, + } - r, err := coupleAPIErrors(req.Get(endpoint)) + err := client.doRequest(ctx, http.MethodGet, endpoint, params, nil) if err != nil { return nil, err } - return r.Result().(*T), nil + return &resultType, nil } // doPOSTRequest runs a PUT request using the given client, API endpoint, @@ -208,12 +188,13 @@ func doPOSTRequest[T, O any]( var resultType T numOpts := len(options) - if numOpts > 1 { - return nil, fmt.Errorf("invalid number of options: %d", len(options)) + return nil, fmt.Errorf("invalid number of options: %d", numOpts) } - req := client.R(ctx).SetResult(&resultType) + params := requestParams{ + Response: &resultType, + } if numOpts > 0 && !isNil(options[0]) { body, err := json.Marshal(options[0]) @@ -221,15 +202,15 @@ func doPOSTRequest[T, O any]( return nil, err } - req.SetBody(string(body)) + params.Body = bytes.NewReader(body) } - r, err := coupleAPIErrors(req.Post(endpoint)) + err := client.doRequest(ctx, http.MethodPost, endpoint, params, nil) if err != nil { return nil, err } - return r.Result().(*T), nil + return &resultType, nil } // doPOSTRequestNoResponseBody runs a POST request using the given client, API endpoint, @@ -241,6 +222,7 @@ func doPOSTRequestNoResponseBody[T any]( options ...T, ) error { _, err := doPOSTRequest[any, T](ctx, client, endpoint, options...) + return err } @@ -265,12 +247,13 @@ func doPUTRequest[T, O any]( var resultType T numOpts := len(options) - if numOpts > 1 { - return nil, fmt.Errorf("invalid number of options: %d", len(options)) + return nil, fmt.Errorf("invalid number of options: %d", numOpts) } - req := client.R(ctx).SetResult(&resultType) + params := requestParams{ + Response: &resultType, + } if numOpts > 0 && !isNil(options[0]) { body, err := json.Marshal(options[0]) @@ -278,15 +261,28 @@ func doPUTRequest[T, O any]( return nil, err } - req.SetBody(string(body)) + params.Body = bytes.NewReader(body) } - r, err := coupleAPIErrors(req.Put(endpoint)) + err := client.doRequest(ctx, http.MethodPut, endpoint, params, nil) if err != nil { return nil, err } - return r.Result().(*T), nil + return &resultType, nil +} + +// doPUTRequestNoResponseBody runs a PUT request using the given client, API endpoint, +// and options/body. It expects only empty response from the endpoint. +func doPUTRequestNoResponseBody[T any]( + ctx context.Context, + client *Client, + endpoint string, + options ...T, +) error { + _, err := doPUTRequest[any, T](ctx, client, endpoint, options...) + + return err } // doDELETERequest runs a DELETE request using the given client @@ -296,8 +292,8 @@ func doDELETERequest( client *Client, endpoint string, ) error { - req := client.R(ctx) - _, err := coupleAPIErrors(req.Delete(endpoint)) + params := requestParams{} + err := client.doRequest(ctx, http.MethodDelete, endpoint, params, nil) return err } diff --git a/request_helpers_test.go b/request_helpers_test.go index ce4bf80b5..033c86628 100644 --- a/request_helpers_test.go +++ b/request_helpers_test.go @@ -80,11 +80,8 @@ func TestRequestHelpers_post(t *testing.T) { func TestRequestHelpers_postNoOptions(t *testing.T) { client := testutil.CreateMockClient(t, NewClient) - httpmock.RegisterRegexpResponder( - "POST", - testutil.MockRequestURL("/foo/bar"), - testutil.MockRequestBodyValidateNoBody(t, testResponse), - ) + httpmock.RegisterRegexpResponder("POST", testutil.MockRequestURL("/foo/bar"), + testutil.MockRequestBodyValidateNoBody(t, testResponse)) result, err := doPOSTRequest[testResultType, any]( context.Background(), @@ -124,11 +121,8 @@ func TestRequestHelpers_put(t *testing.T) { func TestRequestHelpers_putNoOptions(t *testing.T) { client := testutil.CreateMockClient(t, NewClient) - httpmock.RegisterRegexpResponder( - "PUT", - testutil.MockRequestURL("/foo/bar"), - testutil.MockRequestBodyValidateNoBody(t, testResponse), - ) + httpmock.RegisterRegexpResponder("PUT", testutil.MockRequestURL("/foo/bar"), + testutil.MockRequestBodyValidateNoBody(t, testResponse)) result, err := doPUTRequest[testResultType, any]( context.Background(), @@ -147,11 +141,8 @@ func TestRequestHelpers_putNoOptions(t *testing.T) { func TestRequestHelpers_delete(t *testing.T) { client := testutil.CreateMockClient(t, NewClient) - httpmock.RegisterRegexpResponder( - "DELETE", - testutil.MockRequestURL("/foo/bar/foo%20bar"), - httpmock.NewStringResponder(200, "{}"), - ) + httpmock.RegisterRegexpResponder("DELETE", testutil.MockRequestURL("/foo/bar/foo%20bar"), + httpmock.NewStringResponder(200, "{}")) if err := doDELETERequest( context.Background(), @@ -169,14 +160,8 @@ func TestRequestHelpers_paginateAll(t *testing.T) { numRequests := 0 - httpmock.RegisterRegexpResponder( - "GET", - testutil.MockRequestURL("/foo/bar"), - mockPaginatedResponse( - buildPaginatedEntries(totalResults), - &numRequests, - ), - ) + httpmock.RegisterRegexpResponder("GET", testutil.MockRequestURL("/foo/bar"), + mockPaginatedResponse(buildPaginatedEntries(totalResults), &numRequests)) response, err := getPaginatedResults[testResultType]( context.Background(), @@ -205,14 +190,8 @@ func TestRequestHelpers_paginateSingle(t *testing.T) { numRequests := 0 - httpmock.RegisterRegexpResponder( - "GET", - testutil.MockRequestURL("/foo/bar"), - mockPaginatedResponse( - buildPaginatedEntries(12), - &numRequests, - ), - ) + httpmock.RegisterRegexpResponder("GET", testutil.MockRequestURL("/foo/bar"), + mockPaginatedResponse(buildPaginatedEntries(12), &numRequests)) response, err := getPaginatedResults[testResultType]( context.Background(), diff --git a/request_log_template.tmpl b/request_log_template.tmpl new file mode 100644 index 000000000..250547bd8 --- /dev/null +++ b/request_log_template.tmpl @@ -0,0 +1,8 @@ + +============================================================================================ +~~~ REQUEST ~~~ +{{.Request}} +HOST: {{.Host}} +HEADERS: {{.Headers}} +BODY: {{.Body}} +-------------------------------------------------------------------------------------------- \ No newline at end of file diff --git a/response_log_template.tmpl b/response_log_template.tmpl new file mode 100644 index 000000000..7bd5f38d8 --- /dev/null +++ b/response_log_template.tmpl @@ -0,0 +1,10 @@ + +============================================================================================ +~~~ RESPONSE ~~~ +STATUS: {{.Status}} +PROTO: {{.Proto}} +RECEIVED AT: {{.ReceivedAt}} +TIME DURATION: {{.TimeDuration}} +HEADERS: {{.Headers}} +BODY: {{.Body}} +-------------------------------------------------------------------------------------------- \ No newline at end of file diff --git a/retries.go b/retries.go index 88f01e3c8..24cbf2454 100644 --- a/retries.go +++ b/retries.go @@ -1,74 +1,91 @@ package linodego import ( + "bytes" + "encoding/json" "errors" + "io" "log" "net/http" "strconv" "time" - "github.com/go-resty/resty/v2" "golang.org/x/net/http2" ) const ( - retryAfterHeaderName = "Retry-After" - maintenanceModeHeaderName = "X-Maintenance-Mode" - - defaultRetryCount = 1000 + RetryAfterHeaderName = "Retry-After" + MaintenanceModeHeaderName = "X-Maintenance-Mode" + DefaultRetryCount = 1000 ) -// RetryConditional func(r *resty.Response) (shouldRetry bool) -type RetryConditional resty.RetryConditionFunc +// RetryConditional is a type alias for a function that determines if a request should be retried based on the response and error. +type RetryConditional func(*http.Response, error) bool -// RetryAfter func(c *resty.Client, r *resty.Response) (time.Duration, error) -type RetryAfter resty.RetryAfterFunc +// RetryAfter is a type alias for a function that determines the duration to wait before retrying based on the response. +type RetryAfter func(*http.Response) (time.Duration, error) -// Configures resty to -// lock until enough time has passed to retry the request as determined by the Retry-After response header. -// If the Retry-After header is not set, we fall back to value of SetPollDelay. -func configureRetries(c *Client) { - c.resty. - SetRetryCount(defaultRetryCount). - AddRetryCondition(checkRetryConditionals(c)). - SetRetryAfter(respectRetryAfter) +// ConfigureRetries configures http.Client to lock until enough time has passed to retry the request as determined by the Retry-After response header. +// If the Retry-After header is not set, we fall back to the value of SetPollDelay. +func ConfigureRetries(c *Client) { + c.SetRetryAfter(RespectRetryAfter) + c.SetRetryCount(DefaultRetryCount) } -func checkRetryConditionals(c *Client) func(*resty.Response, error) bool { - return func(r *resty.Response, err error) bool { - for _, retryConditional := range c.retryConditionals { - retry := retryConditional(r, err) - if retry { - log.Printf("[INFO] Received error %s - Retrying", r.Error()) - return true - } - } +func RespectRetryAfter(resp *http.Response) (time.Duration, error) { + if resp == nil { + return 0, nil + } - return false + retryAfterStr := resp.Header.Get(RetryAfterHeaderName) + if retryAfterStr == "" { + return 0, nil + } + + retryAfter, err := strconv.Atoi(retryAfterStr) + if err != nil { + return 0, err } + + duration := time.Duration(retryAfter) * time.Second + log.Printf("[INFO] Respecting Retry-After Header of %d (%s)", retryAfter, duration) + + return duration, nil } -// SetLinodeBusyRetry configures resty to retry specifically on "Linode busy." errors -// The retry wait time is configured in SetPollDelay -func linodeBusyRetryCondition(r *resty.Response, _ error) bool { - apiError, ok := r.Error().(*APIError) +// Retry conditions + +func LinodeBusyRetryCondition(resp *http.Response, _ error) bool { + if resp == nil { + return false + } + + apiError, ok := getAPIError(resp) linodeBusy := ok && apiError.Error() == "Linode busy." - retry := r.StatusCode() == http.StatusBadRequest && linodeBusy + retry := resp.StatusCode == http.StatusBadRequest && linodeBusy return retry } -func tooManyRequestsRetryCondition(r *resty.Response, _ error) bool { - return r.StatusCode() == http.StatusTooManyRequests +func TooManyRequestsRetryCondition(resp *http.Response, _ error) bool { + if resp == nil { + return false + } + + return resp.StatusCode == http.StatusTooManyRequests } -func serviceUnavailableRetryCondition(r *resty.Response, _ error) bool { - serviceUnavailable := r.StatusCode() == http.StatusServiceUnavailable +func ServiceUnavailableRetryCondition(resp *http.Response, _ error) bool { + if resp == nil { + return false + } + + serviceUnavailable := resp.StatusCode == http.StatusServiceUnavailable // During maintenance events, the API will return a 503 and add // an `X-MAINTENANCE-MODE` header. Don't retry during maintenance // events, only for legitimate 503s. - if serviceUnavailable && r.Header().Get(maintenanceModeHeaderName) != "" { + if serviceUnavailable && resp.Header.Get(MaintenanceModeHeaderName) != "" { log.Printf("[INFO] Linode API is under maintenance, request will not be retried - please see status.linode.com for more information") return false } @@ -76,33 +93,47 @@ func serviceUnavailableRetryCondition(r *resty.Response, _ error) bool { return serviceUnavailable } -func requestTimeoutRetryCondition(r *resty.Response, _ error) bool { - return r.StatusCode() == http.StatusRequestTimeout +func RequestTimeoutRetryCondition(resp *http.Response, _ error) bool { + if resp == nil { + return false + } + + return resp.StatusCode == http.StatusRequestTimeout } -func requestGOAWAYRetryCondition(_ *resty.Response, e error) bool { - return errors.As(e, &http2.GoAwayError{}) +func RequestGOAWAYRetryCondition(_ *http.Response, err error) bool { + return errors.As(err, &http2.GoAwayError{}) } -func requestNGINXRetryCondition(r *resty.Response, _ error) bool { - return r.StatusCode() == http.StatusBadRequest && - r.Header().Get("Server") == "nginx" && - r.Header().Get("Content-Type") == "text/html" //nolint:goconst +func RequestNGINXRetryCondition(resp *http.Response, _ error) bool { + if resp == nil { + return false + } + + return resp.StatusCode == http.StatusBadRequest && + resp.Header.Get("Server") == "nginx" && + resp.Header.Get("Content-Type") == "text/html" } -func respectRetryAfter(client *resty.Client, resp *resty.Response) (time.Duration, error) { - retryAfterStr := resp.Header().Get(retryAfterHeaderName) - if retryAfterStr == "" { - return 0, nil +// Helper function to extract APIError from response +func getAPIError(resp *http.Response) (*APIError, bool) { + if resp.Body == nil { + return nil, false } - retryAfter, err := strconv.Atoi(retryAfterStr) + body, err := io.ReadAll(resp.Body) if err != nil { - return 0, err + return nil, false } - duration := time.Duration(retryAfter) * time.Second - log.Printf("[INFO] Respecting Retry-After Header of %d (%s) (max %s)", retryAfter, duration, client.RetryMaxWaitTime) + resp.Body = io.NopCloser(bytes.NewReader(body)) - return duration, nil + var apiError APIError + + err = json.Unmarshal(body, &apiError) + if err != nil { + return nil, false + } + + return &apiError, true } diff --git a/retries_http.go b/retries_http.go deleted file mode 100644 index b832c62f9..000000000 --- a/retries_http.go +++ /dev/null @@ -1,132 +0,0 @@ -package linodego - -import ( - "encoding/json" - "errors" - "log" - "net/http" - "strconv" - "time" - - "golang.org/x/net/http2" -) - -const ( - // nolint:unused - httpRetryAfterHeaderName = "Retry-After" - // nolint:unused - httpMaintenanceModeHeaderName = "X-Maintenance-Mode" - - // nolint:unused - httpDefaultRetryCount = 1000 -) - -// RetryConditional is a type alias for a function that determines if a request should be retried based on the response and error. -// nolint:unused -type httpRetryConditional func(*http.Response, error) bool - -// RetryAfter is a type alias for a function that determines the duration to wait before retrying based on the response. -// nolint:unused -type httpRetryAfter func(*http.Response) (time.Duration, error) - -// Configures http.Client to lock until enough time has passed to retry the request as determined by the Retry-After response header. -// If the Retry-After header is not set, we fall back to the value of SetPollDelay. -// nolint:unused -func httpConfigureRetries(c *httpClient) { - c.retryConditionals = append(c.retryConditionals, httpcheckRetryConditionals(c)) - c.retryAfter = httpRespectRetryAfter -} - -// nolint:unused -func httpcheckRetryConditionals(c *httpClient) httpRetryConditional { - return func(resp *http.Response, err error) bool { - for _, retryConditional := range c.retryConditionals { - retry := retryConditional(resp, err) - if retry { - log.Printf("[INFO] Received error %v - Retrying", err) - return true - } - } - - return false - } -} - -// nolint:unused -func httpRespectRetryAfter(resp *http.Response) (time.Duration, error) { - retryAfterStr := resp.Header.Get(retryAfterHeaderName) - if retryAfterStr == "" { - return 0, nil - } - - retryAfter, err := strconv.Atoi(retryAfterStr) - if err != nil { - return 0, err - } - - duration := time.Duration(retryAfter) * time.Second - log.Printf("[INFO] Respecting Retry-After Header of %d (%s)", retryAfter, duration) - - return duration, nil -} - -// Retry conditions - -// nolint:unused -func httpLinodeBusyRetryCondition(resp *http.Response, _ error) bool { - apiError, ok := getAPIError(resp) - linodeBusy := ok && apiError.Error() == "Linode busy." - retry := resp.StatusCode == http.StatusBadRequest && linodeBusy - - return retry -} - -// nolint:unused -func httpTooManyRequestsRetryCondition(resp *http.Response, _ error) bool { - return resp.StatusCode == http.StatusTooManyRequests -} - -// nolint:unused -func httpServiceUnavailableRetryCondition(resp *http.Response, _ error) bool { - serviceUnavailable := resp.StatusCode == http.StatusServiceUnavailable - - // During maintenance events, the API will return a 503 and add - // an `X-MAINTENANCE-MODE` header. Don't retry during maintenance - // events, only for legitimate 503s. - if serviceUnavailable && resp.Header.Get(maintenanceModeHeaderName) != "" { - log.Printf("[INFO] Linode API is under maintenance, request will not be retried - please see status.linode.com for more information") - return false - } - - return serviceUnavailable -} - -// nolint:unused -func httpRequestTimeoutRetryCondition(resp *http.Response, _ error) bool { - return resp.StatusCode == http.StatusRequestTimeout -} - -// nolint:unused -func httpRequestGOAWAYRetryCondition(_ *http.Response, err error) bool { - return errors.As(err, &http2.GoAwayError{}) -} - -// nolint:unused -func httpRequestNGINXRetryCondition(resp *http.Response, _ error) bool { - return resp.StatusCode == http.StatusBadRequest && - resp.Header.Get("Server") == "nginx" && - resp.Header.Get("Content-Type") == "text/html" //nolint:goconst -} - -// Helper function to extract APIError from response -// nolint:unused -func getAPIError(resp *http.Response) (*APIError, bool) { - var apiError APIError - - err := json.NewDecoder(resp.Body).Decode(&apiError) - if err != nil { - return nil, false - } - - return &apiError, true -} diff --git a/retries_http_test.go b/retries_http_test.go deleted file mode 100644 index 35eea5fc9..000000000 --- a/retries_http_test.go +++ /dev/null @@ -1,81 +0,0 @@ -package linodego - -import ( - "bytes" - "encoding/json" - "io" - "net/http" - "testing" - "time" -) - -func TestHTTPLinodeBusyRetryCondition(t *testing.T) { - var retry bool - - // Initialize response body - rawResponse := &http.Response{ - StatusCode: http.StatusBadRequest, - Body: io.NopCloser(bytes.NewBuffer(nil)), - } - - retry = httpLinodeBusyRetryCondition(rawResponse, nil) - - if retry { - t.Errorf("Should not have retried") - } - - apiError := APIError{ - Errors: []APIErrorReason{ - {Reason: "Linode busy."}, - }, - } - rawResponse.Body = createResponseBody(apiError) - - retry = httpLinodeBusyRetryCondition(rawResponse, nil) - - if !retry { - t.Errorf("Should have retried") - } -} - -func TestHTTPServiceUnavailableRetryCondition(t *testing.T) { - rawResponse := &http.Response{ - StatusCode: http.StatusServiceUnavailable, - Header: http.Header{httpRetryAfterHeaderName: []string{"20"}}, - Body: io.NopCloser(bytes.NewBuffer(nil)), // Initialize response body - } - - if retry := httpServiceUnavailableRetryCondition(rawResponse, nil); !retry { - t.Error("expected request to be retried") - } - - if retryAfter, err := httpRespectRetryAfter(rawResponse); err != nil { - t.Errorf("expected error to be nil but got %s", err) - } else if retryAfter != time.Second*20 { - t.Errorf("expected retryAfter to be 20 but got %d", retryAfter) - } -} - -func TestHTTPServiceMaintenanceModeRetryCondition(t *testing.T) { - rawResponse := &http.Response{ - StatusCode: http.StatusServiceUnavailable, - Header: http.Header{ - httpRetryAfterHeaderName: []string{"20"}, - httpMaintenanceModeHeaderName: []string{"Currently in maintenance mode."}, - }, - Body: io.NopCloser(bytes.NewBuffer(nil)), // Initialize response body - } - - if retry := httpServiceUnavailableRetryCondition(rawResponse, nil); retry { - t.Error("expected retry to be skipped due to maintenance mode header") - } -} - -// Helper function to create a response body from an object -func createResponseBody(obj interface{}) io.ReadCloser { - body, err := json.Marshal(obj) - if err != nil { - panic(err) - } - return io.NopCloser(bytes.NewBuffer(body)) -} diff --git a/retries_test.go b/retries_test.go index 4f0029388..45b5fc4d3 100644 --- a/retries_test.go +++ b/retries_test.go @@ -1,24 +1,24 @@ package linodego import ( + "bytes" + "encoding/json" + "io" "net/http" "testing" "time" - - "github.com/go-resty/resty/v2" ) func TestLinodeBusyRetryCondition(t *testing.T) { var retry bool - request := resty.Request{} - rawResponse := http.Response{StatusCode: http.StatusBadRequest} - response := resty.Response{ - Request: &request, - RawResponse: &rawResponse, + // Initialize response body + rawResponse := &http.Response{ + StatusCode: http.StatusBadRequest, + Body: io.NopCloser(bytes.NewBuffer(nil)), } - retry = linodeBusyRetryCondition(&response, nil) + retry = LinodeBusyRetryCondition(rawResponse, nil) if retry { t.Errorf("Should not have retried") @@ -29,48 +29,53 @@ func TestLinodeBusyRetryCondition(t *testing.T) { {Reason: "Linode busy."}, }, } - request.SetError(&apiError) + rawResponse.Body = createResponseBody(apiError) - retry = linodeBusyRetryCondition(&response, nil) + retry = LinodeBusyRetryCondition(rawResponse, nil) if !retry { t.Errorf("Should have retried") } } -func TestLinodeServiceUnavailableRetryCondition(t *testing.T) { - request := resty.Request{} - rawResponse := http.Response{StatusCode: http.StatusServiceUnavailable, Header: http.Header{ - retryAfterHeaderName: []string{"20"}, - }} - response := resty.Response{ - Request: &request, - RawResponse: &rawResponse, +func TestServiceUnavailableRetryCondition(t *testing.T) { + rawResponse := &http.Response{ + StatusCode: http.StatusServiceUnavailable, + Header: http.Header{RetryAfterHeaderName: []string{"20"}}, + Body: io.NopCloser(bytes.NewBuffer(nil)), // Initialize response body } - if retry := serviceUnavailableRetryCondition(&response, nil); !retry { + if retry := ServiceUnavailableRetryCondition(rawResponse, nil); !retry { t.Error("expected request to be retried") } - if retryAfter, err := respectRetryAfter(NewClient(nil).resty, &response); err != nil { + if retryAfter, err := RespectRetryAfter(rawResponse); err != nil { t.Errorf("expected error to be nil but got %s", err) } else if retryAfter != time.Second*20 { t.Errorf("expected retryAfter to be 20 but got %d", retryAfter) } } -func TestLinodeServiceMaintenanceModeRetryCondition(t *testing.T) { - request := resty.Request{} - rawResponse := http.Response{StatusCode: http.StatusServiceUnavailable, Header: http.Header{ - retryAfterHeaderName: []string{"20"}, - maintenanceModeHeaderName: []string{"Currently in maintenance mode."}, - }} - response := resty.Response{ - Request: &request, - RawResponse: &rawResponse, +func TestServiceMaintenanceModeRetryCondition(t *testing.T) { + rawResponse := &http.Response{ + StatusCode: http.StatusServiceUnavailable, + Header: http.Header{ + RetryAfterHeaderName: []string{"20"}, + MaintenanceModeHeaderName: []string{"Currently in maintenance mode."}, + }, + Body: io.NopCloser(bytes.NewBuffer(nil)), // Initialize response body } - if retry := serviceUnavailableRetryCondition(&response, nil); retry { + if retry := ServiceUnavailableRetryCondition(rawResponse, nil); retry { t.Error("expected retry to be skipped due to maintenance mode header") } } + +// Helper function to create a response body from an object +func createResponseBody(obj interface{}) io.ReadCloser { + body, err := json.Marshal(obj) + if err != nil { + panic(err) + } + return io.NopCloser(bytes.NewBuffer(body)) +} diff --git a/stackscripts.go b/stackscripts.go index 19b61ce4c..1a8f55e27 100644 --- a/stackscripts.go +++ b/stackscripts.go @@ -41,13 +41,13 @@ type StackscriptUDF struct { Example string `json:"example"` // A list of acceptable single values for the field. - OneOf string `json:"oneOf,omitempty"` + OneOf string `json:"oneOf,omitzero"` // A list of acceptable values for the field in any quantity, combination or order. - ManyOf string `json:"manyOf,omitempty"` + ManyOf string `json:"manyOf,omitzero"` // The default value. If not specified, this value will be used. - Default string `json:"default,omitempty"` + Default string `json:"default,omitzero"` } // StackscriptCreateOptions fields are those accepted by CreateStackscript diff --git a/tags.go b/tags.go index e23ba2168..bfadc0a8b 100644 --- a/tags.go +++ b/tags.go @@ -36,12 +36,12 @@ type TaggedObjectList []TaggedObject // TagCreateOptions fields are those accepted by CreateTag type TagCreateOptions struct { Label string `json:"label"` - Linodes []int `json:"linodes,omitempty"` + Linodes []int `json:"linodes,omitzero"` // @TODO is this implemented? - LKEClusters []int `json:"lke_clusters,omitempty"` - Domains []int `json:"domains,omitempty"` - Volumes []int `json:"volumes,omitempty"` - NodeBalancers []int `json:"nodebalancers,omitempty"` + LKEClusters []int `json:"lke_clusters,omitzero"` + Domains []int `json:"domains,omitzero"` + Volumes []int `json:"volumes,omitzero"` + NodeBalancers []int `json:"nodebalancers,omitzero"` } // GetCreateOptions converts a Tag to TagCreateOptions for use in CreateTag diff --git a/test/go.mod b/test/go.mod index 080d724cd..ef7beac04 100644 --- a/test/go.mod +++ b/test/go.mod @@ -20,7 +20,6 @@ require ( github.com/go-openapi/jsonpointer v0.19.6 // indirect github.com/go-openapi/jsonreference v0.20.2 // indirect github.com/go-openapi/swag v0.22.3 // indirect - github.com/go-resty/resty/v2 v2.17.2 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/protobuf v1.5.4 // indirect github.com/google/gnostic-models v0.6.8 // indirect diff --git a/test/go.sum b/test/go.sum index e38dfaf3a..11113682f 100644 --- a/test/go.sum +++ b/test/go.sum @@ -14,8 +14,6 @@ github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2Kv github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g= github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= -github.com/go-resty/resty/v2 v2.17.2 h1:FQW5oHYcIlkCNrMD2lloGScxcHJ0gkjshV3qcQAyHQk= -github.com/go-resty/resty/v2 v2.17.2/go.mod h1:kCKZ3wWmwJaNc7S29BRtUhJwy7iqmn+2mLtQrOyQlVA= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= diff --git a/test/integration/cache_test.go b/test/integration/cache_test.go index fd4207de2..9468e870c 100644 --- a/test/integration/cache_test.go +++ b/test/integration/cache_test.go @@ -28,8 +28,8 @@ func TestCache_RegionList(t *testing.T) { totalRequests := int64(0) client.OnBeforeRequest(func(request *linodego.Request) error { - page := request.QueryParam.Get("page") - if !strings.Contains(request.URL, "regions") || page != "1" { + page := request.URL.Query().Get("page") + if !strings.Contains(request.URL.String(), "regions") || page != "1" { return nil } @@ -91,8 +91,8 @@ func TestCache_Expiration(t *testing.T) { totalRequests := int64(0) client.OnBeforeRequest(func(request *linodego.Request) error { - page := request.QueryParam.Get("page") - if !strings.Contains(request.URL, "kernels") || page != "1" { + page := request.URL.Query().Get("page") + if !strings.Contains(request.URL.String(), "kernels") || page != "1" { return nil } diff --git a/test/integration/firewall_rules_test.go b/test/integration/firewall_rules_test.go index a32331f7c..dda91056e 100644 --- a/test/integration/firewall_rules_test.go +++ b/test/integration/firewall_rules_test.go @@ -15,8 +15,8 @@ var ( Ports: "22", Protocol: "TCP", Addresses: linodego.NetworkAddresses{ - IPv4: &[]string{"0.0.0.0/0"}, - IPv6: &[]string{"::0/0"}, + IPv4: []string{"0.0.0.0/0"}, + IPv6: []string{"::0/0"}, }, } @@ -82,8 +82,8 @@ func TestFirewallRules_Update(t *testing.T) { Ports: "22", Protocol: "TCP", Addresses: linodego.NetworkAddresses{ - IPv4: &[]string{"0.0.0.0/0"}, - IPv6: &[]string{"::0/0"}, + IPv4: []string{"0.0.0.0/0"}, + IPv6: []string{"::0/0"}, }, }, }, diff --git a/test/integration/firewall_rulesets_test.go b/test/integration/firewall_rulesets_test.go index db7601f7b..4bb1c2398 100644 --- a/test/integration/firewall_rulesets_test.go +++ b/test/integration/firewall_rulesets_test.go @@ -25,7 +25,7 @@ func TestFirewallRuleSets_CRUD(t *testing.T) { Protocol: linodego.NetworkProtocol("TCP"), Ports: "80", Addresses: linodego.NetworkAddresses{ - IPv4: &[]string{"0.0.0.0/0"}, + IPv4: []string{"0.0.0.0/0"}, }, }, }, @@ -71,7 +71,7 @@ func TestFirewallRuleSets_CRUD(t *testing.T) { Protocol: linodego.NetworkProtocol("TCP"), Ports: "443", Addresses: linodego.NetworkAddresses{ - IPv6: &[]string{"::/0"}, + IPv6: []string{"::/0"}, }, }, } @@ -79,7 +79,7 @@ func TestFirewallRuleSets_CRUD(t *testing.T) { updateOpts := linodego.RuleSetUpdateOptions{ Label: &updatedLabel, Description: &updatedDescription, - Rules: &updatedRules, + Rules: updatedRules, } updated, err := client.UpdateFirewallRuleSet(ctx, ruleSet.ID, updateOpts) diff --git a/test/integration/firewalls_test.go b/test/integration/firewalls_test.go index 1f18a500f..3b8b01333 100644 --- a/test/integration/firewalls_test.go +++ b/test/integration/firewalls_test.go @@ -53,8 +53,8 @@ func TestFirewall_Get(t *testing.T) { Action: "DROP", Protocol: linodego.ICMP, Addresses: linodego.NetworkAddresses{ - IPv4: &[]string{"0.0.0.0/0"}, - IPv6: &[]string{"::/0"}, + IPv4: []string{"0.0.0.0/0"}, + IPv6: []string{"::/0"}, }, }, }, @@ -95,7 +95,7 @@ func TestFirewall_Update(t *testing.T) { Action: "DROP", Protocol: linodego.ICMP, Addresses: linodego.NetworkAddresses{ - IPv4: &[]string{"0.0.0.0/0"}, + IPv4: []string{"0.0.0.0/0"}, }, }, }, @@ -117,7 +117,7 @@ func TestFirewall_Update(t *testing.T) { updateOpts := firewall.GetUpdateOptions() updateOpts.Status = linodego.FirewallDisabled updateOpts.Label = firewall.Label + "-updated" - updateOpts.Tags = &[]string{} + updateOpts.Tags = []string{} updated, err := client.UpdateFirewall(context.Background(), firewall.ID, updateOpts) if err != nil { @@ -128,8 +128,8 @@ func TestFirewall_Update(t *testing.T) { t.Errorf("expected no firewall entities after update, got %d", len(updated.Entities)) } - if !cmp.Equal(updated.Tags, *updateOpts.Tags) { - t.Errorf("expected tags to be updated: %s", cmp.Diff(updated.Tags, *updateOpts.Tags)) + if !cmp.Equal(updated.Tags, updateOpts.Tags) { + t.Errorf("expected tags to be updated: %s", cmp.Diff(updated.Tags, updateOpts.Tags)) } if updated.Status != updateOpts.Status { t.Errorf("expected status %s but got %s", updateOpts.Status, updated.Status) diff --git a/test/integration/fixtures/TestFirewallDevice_Delete.yaml b/test/integration/fixtures/TestFirewallDevice_Delete.yaml index 80debbdca..b74565fba 100644 --- a/test/integration/fixtures/TestFirewallDevice_Delete.yaml +++ b/test/integration/fixtures/TestFirewallDevice_Delete.yaml @@ -30,74 +30,75 @@ interactions: "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", "NETINT Quadra - T1U", "Maintenance Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed - Databases"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", - "resolvers": {"ipv4": "172.233.128.45,172.233.128.38,172.233.128.53,172.233.128.37,172.233.128.34,172.233.128.36,172.233.128.33,172.233.128.39,172.233.128.43,172.233.128.44", + T1U", "Maintenance Policy", "Linode Interfaces", "ACLP Logs Datacenter LKE-E"], + "monitors": {"alerts": ["Managed Databases", "NodeBalancers"], "metrics": ["Managed + Databases", "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "172.233.128.45,172.233.128.38,172.233.128.53,172.233.128.37,172.233.128.34,172.233.128.36,172.233.128.33,172.233.128.39,172.233.128.43,172.233.128.44", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "nz-akl-1", "label": "Auckland, NZ", "country": "nz", "capabilities": ["Linodes", "Disk - Encryption", "Cloud Firewall", "Vlans", "VPCs", "Metadata", "Distributed Plans", - "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": - "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", "Maintenance + Policy"], "monitors": {"alerts": [], "metrics": []}, "status": "ok", "resolvers": + {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": "us-den-1", "label": "Denver, CO", "country": "us", "capabilities": ["Linodes", - "Disk Encryption", "Cloud Firewall", "Vlans", "VPCs", "Metadata", "Distributed - Plans", "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": + "Disk Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", + "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": "de-ham-1", "label": "Hamburg, DE", "country": "de", "capabilities": ["Linodes", - "Disk Encryption", "Cloud Firewall", "Vlans", "VPCs", "Metadata", "Distributed - Plans", "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": + "Disk Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", + "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": "za-jnb-1", "label": "Johannesburg, ZA", "country": "za", "capabilities": ["Linodes", - "Disk Encryption", "Cloud Firewall", "Vlans", "VPCs", "Metadata", "Distributed - Plans", "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": + "Disk Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", + "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": "my-kul-1", "label": "Kuala Lumpur, MY", "country": "my", "capabilities": ["Linodes", - "Disk Encryption", "Cloud Firewall", "Vlans", "VPCs", "Metadata", "Distributed - Plans", "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": + "Disk Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", + "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": "co-bog-1", "label": "Bogot\u00e1, CO", "country": "co", "capabilities": ["Linodes", - "Disk Encryption", "Cloud Firewall", "Vlans", "VPCs", "Metadata", "Distributed - Plans", "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": + "Disk Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", + "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": "mx-qro-1", "label": "Quer\u00e9taro, MX", "country": "mx", "capabilities": - ["Linodes", "Disk Encryption", "Cloud Firewall", "Vlans", "VPCs", "Metadata", - "Distributed Plans", "Maintenance Policy"], "monitors": {"alerts": [], "metrics": - []}, "status": "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", - "ipv6": "1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": - 0, "maximum_linodes_per_pg": 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": - "distributed"}, {"id": "us-hou-1", "label": "Houston, TX", "country": "us", - "capabilities": ["Linodes", "Disk Encryption", "Cloud Firewall", "Vlans", "VPCs", - "Metadata", "Distributed Plans", "Maintenance Policy"], "monitors": {"alerts": - [], "metrics": []}, "status": "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", - "ipv6": "1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": - 0, "maximum_linodes_per_pg": 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": - "distributed"}, {"id": "cl-scl-1", "label": "Santiago, CL", "country": "cl", - "capabilities": ["Linodes", "Disk Encryption", "Cloud Firewall", "Vlans", "VPCs", - "Metadata", "Distributed Plans", "Maintenance Policy"], "monitors": {"alerts": - [], "metrics": []}, "status": "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", - "ipv6": "1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": - 0, "maximum_linodes_per_pg": 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": - "distributed"}, {"id": "gb-lon", "label": "London 2, UK", "country": "gb", "capabilities": - ["Linodes", "Block Storage Encryption", "LA Disk Encryption", "Disk Encryption", - "Backups", "NodeBalancers", "Block Storage", "Object Storage", "GPU Linodes", - "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC - Dual Stack", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", - "StackScripts", "NETINT Quadra T1U", "Maintenance Policy", "Linode Interfaces"], - "monitors": {"alerts": ["Managed Databases"], "metrics": ["Managed Databases", - "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "172.236.0.46,172.236.0.50,172.236.0.47,172.236.0.53,172.236.0.52,172.236.0.45,172.236.0.49,172.236.0.51,172.236.0.54,172.236.0.48", + ["Linodes", "Disk Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed + Plans", "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": + "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": + 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": + "us-hou-1", "label": "Houston, TX", "country": "us", "capabilities": ["Linodes", + "Disk Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", + "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": + "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": + 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": + "cl-scl-1", "label": "Santiago, CL", "country": "cl", "capabilities": ["Linodes", + "Disk Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", + "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": + "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": + 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": + "gb-lon", "label": "London 2, UK", "country": "gb", "capabilities": ["Linodes", + "Block Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", + "NodeBalancers", "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", + "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", + "Managed Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", + "NETINT Quadra T1U", "Maintenance Policy", "Linode Interfaces", "ACLP Logs Datacenter + LKE-E"], "monitors": {"alerts": ["Managed Databases", "NodeBalancers"], "metrics": + ["Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": + "172.236.0.46,172.236.0.50,172.236.0.47,172.236.0.53,172.236.0.52,172.236.0.45,172.236.0.49,172.236.0.51,172.236.0.54,172.236.0.48", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "id-cgk", @@ -106,20 +107,20 @@ interactions: "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance - Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases"], - "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": - {"ipv4": "172.232.224.23,172.232.224.32,172.232.224.26,172.232.224.27,172.232.224.21,172.232.224.24,172.232.224.22,172.232.224.20,172.232.224.31,172.232.224.28", + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "172.232.224.23,172.232.224.32,172.232.224.26,172.232.224.27,172.232.224.21,172.232.224.24,172.232.224.22,172.232.224.20,172.232.224.31,172.232.224.28", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "in-bom-2", "label": "Mumbai 2, IN", "country": "in", "capabilities": ["Linodes", "Block Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", - "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes - Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", - "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance - Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases"], - "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": - {"ipv4": "172.236.171.41,172.236.171.42,172.236.171.25,172.236.171.44,172.236.171.26,172.236.171.45,172.236.171.24,172.236.171.43,172.236.171.27,172.236.171.28", + "Block Storage", "GPU Linodes", "Kubernetes", "Kubernetes Enterprise", "Cloud + Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", + "Premium Plans", "Placement Group", "StackScripts", "Maintenance Policy", "Linode + Interfaces", "ACLP Logs Datacenter LKE-E"], "monitors": {"alerts": ["Managed + Databases", "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "172.236.171.41,172.236.171.42,172.236.171.25,172.236.171.44,172.236.171.26,172.236.171.45,172.236.171.24,172.236.171.43,172.236.171.27,172.236.171.28", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "de-fra-2", @@ -128,9 +129,9 @@ interactions: "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", "NETINT Quadra - T1U", "Maintenance Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed - Databases"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", - "resolvers": {"ipv4": "172.236.203.9,172.236.203.16,172.236.203.19,172.236.203.15,172.236.203.17,172.236.203.11,172.236.203.18,172.236.203.14,172.236.203.13,172.236.203.12", + T1U", "Maintenance Policy", "Linode Interfaces", "ACLP Logs Datacenter LKE-E"], + "monitors": {"alerts": ["Managed Databases", "NodeBalancers"], "metrics": ["Managed + Databases", "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "172.236.203.9,172.236.203.16,172.236.203.19,172.236.203.15,172.236.203.17,172.236.203.11,172.236.203.18,172.236.203.14,172.236.203.13,172.236.203.12", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "sg-sin-2", @@ -139,9 +140,9 @@ interactions: "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance - Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases"], - "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": - {"ipv4": "172.236.129.8,172.236.129.42,172.236.129.41,172.236.129.19,172.236.129.46,172.236.129.23,172.236.129.48,172.236.129.20,172.236.129.21,172.236.129.47", + Policy", "Linode Interfaces", "ACLP Logs Datacenter LKE-E"], "monitors": {"alerts": + ["Managed Databases", "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "172.236.129.8,172.236.129.42,172.236.129.41,172.236.129.19,172.236.129.46,172.236.129.23,172.236.129.48,172.236.129.20,172.236.129.21,172.236.129.47", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "jp-tyo-3", @@ -150,25 +151,26 @@ interactions: "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance - Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases"], - "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": - {"ipv4": "172.237.4.15,172.237.4.19,172.237.4.17,172.237.4.21,172.237.4.16,172.237.4.18,172.237.4.23,172.237.4.24,172.237.4.20,172.237.4.14", + Policy", "Linode Interfaces", "ACLP Logs Datacenter LKE-E"], "monitors": {"alerts": + ["Managed Databases", "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "172.237.4.15,172.237.4.19,172.237.4.17,172.237.4.21,172.237.4.16,172.237.4.18,172.237.4.23,172.237.4.24,172.237.4.20,172.237.4.14", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "de-ber-1", "label": "Berlin, DE", "country": "de", "capabilities": ["Linodes", "Disk Encryption", - "Cloud Firewall", "Vlans", "VPCs", "Metadata", "Distributed Plans", "Maintenance - Policy"], "monitors": {"alerts": [], "metrics": []}, "status": "ok", "resolvers": - {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", "Maintenance Policy"], + "monitors": {"alerts": [], "metrics": []}, "status": "ok", "resolvers": {"ipv4": + "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": "no-osl-1", "label": "Oslo, NO", "country": "no", "capabilities": ["Linodes", "Block Storage Encryption", "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", "Object Storage", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", "Premium - Plans", "Placement Group", "StackScripts", "Maintenance Policy", "Linode Interfaces"], - "monitors": {"alerts": ["Managed Databases", "NodeBalancers"], "metrics": ["Managed - Databases", "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "172.238.140.33,172.238.140.25,172.238.140.30,172.238.140.31,172.238.140.26,172.238.140.28,172.238.140.34,172.238.140.32,172.238.140.27,172.238.140.29", + Plans", "Placement Group", "StackScripts", "Maintenance Policy", "Linode Interfaces", + "ACLP Logs Datacenter LKE-E"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "172.238.140.33,172.238.140.25,172.238.140.30,172.238.140.31,172.238.140.26,172.238.140.28,172.238.140.34,172.238.140.32,172.238.140.27,172.238.140.29", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "us-iad-2", @@ -177,30 +179,37 @@ interactions: "Object Storage", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance Policy", "Linode Interfaces"], - "monitors": {"alerts": ["Managed Databases"], "metrics": ["Managed Databases", - "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "172.239.142.102,172.239.142.89,172.239.142.92,172.239.142.87,172.239.142.88,172.239.142.103,172.239.142.91,172.239.142.90,172.239.142.86,172.239.142.100", + "monitors": {"alerts": ["Managed Databases", "NodeBalancers"], "metrics": ["Managed + Databases", "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "172.239.142.102,172.239.142.89,172.239.142.92,172.239.142.87,172.239.142.88,172.239.142.103,172.239.142.91,172.239.142.90,172.239.142.86,172.239.142.100", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "fr-par-2", "label": "Paris 2, FR", "country": "fr", "capabilities": ["Linodes", "Block Storage Encryption", "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", - "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes Enterprise", "Cloud - Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", - "Premium Plans", "Placement Group", "StackScripts", "Maintenance Policy", "Linode - Interfaces"], "monitors": {"alerts": ["Managed Databases"], "metrics": ["Managed - Databases", "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "172.239.11.24,172.239.11.22,172.239.11.17,172.239.11.20,172.239.11.23,172.239.11.19,172.239.11.21,172.239.11.15,172.239.11.16,172.239.11.18", + "GPU Linodes", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", + "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", "Premium Plans", + "Placement Group", "StackScripts", "Maintenance Policy", "Linode Interfaces", + "ACLP Logs Datacenter LKE-E"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "172.239.11.24,172.239.11.22,172.239.11.17,172.239.11.20,172.239.11.23,172.239.11.19,172.239.11.21,172.239.11.15,172.239.11.16,172.239.11.18", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "us-rno-1", + "label": "Reno, NV", "country": "us", "capabilities": ["Linodes", "Disk Encryption", + "Backups", "NodeBalancers", "GPU Linodes", "Metadata", "Premium Plans", "Placement + Group", "StackScripts", "Maintenance Policy"], "monitors": {"alerts": ["NodeBalancers"], + "metrics": ["NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "", "ipv6": + ""}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "co-bog-2", "label": "Bogot\u00e1 2, CO", "country": "co", "capabilities": ["Linodes", "Disk - Encryption", "Cloud Firewall", "Vlans", "VPCs", "Metadata", "Distributed Plans", - "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": - "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", "Maintenance + Policy"], "monitors": {"alerts": [], "metrics": []}, "status": "ok", "resolvers": + {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": "fr-mrs-2", "label": "Marseille 2, FR", "country": "fr", "capabilities": ["Linodes", - "Disk Encryption", "Cloud Firewall", "Vlans", "VPCs", "Metadata", "Distributed - Plans", "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": + "Disk Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", + "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": @@ -210,8 +219,8 @@ interactions: "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", "NETINT Quadra T1U", "Maintenance Policy", "Linode Interfaces"], "monitors": - {"alerts": ["Managed Databases"], "metrics": ["Managed Databases", "NodeBalancers"]}, - "status": "ok", "resolvers": {"ipv4": "172.233.160.34,172.233.160.27,172.233.160.30,172.233.160.29,172.233.160.32,172.233.160.28,172.233.160.33,172.233.160.26,172.233.160.25,172.233.160.31", + {"alerts": ["Managed Databases", "NodeBalancers"], "metrics": ["Managed Databases", + "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "172.233.160.34,172.233.160.27,172.233.160.30,172.233.160.29,172.233.160.32,172.233.160.28,172.233.160.33,172.233.160.26,172.233.160.25,172.233.160.31", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "ap-west", @@ -220,8 +229,8 @@ interactions: "Block Storage", "GPU Linodes", "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", "Managed Databases", "Metadata", "Placement Group", "StackScripts", "Maintenance Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed - Databases"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", - "resolvers": {"ipv4": "172.105.34.5,172.105.35.5,172.105.36.5,172.105.37.5,172.105.38.5,172.105.39.5,172.105.40.5,172.105.41.5,172.105.42.5,172.105.43.5", + Databases", "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "172.105.34.5,172.105.35.5,172.105.36.5,172.105.37.5,172.105.38.5,172.105.39.5,172.105.40.5,172.105.41.5,172.105.42.5,172.105.43.5", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "ca-central", @@ -230,8 +239,8 @@ interactions: "Block Storage", "GPU Linodes", "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", "Managed Databases", "Metadata", "Placement Group", "StackScripts", "Maintenance Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed - Databases"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", - "resolvers": {"ipv4": "172.105.0.5,172.105.3.5,172.105.4.5,172.105.5.5,172.105.6.5,172.105.7.5,172.105.8.5,172.105.9.5,172.105.10.5,172.105.11.5", + Databases", "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "172.105.0.5,172.105.3.5,172.105.4.5,172.105.5.5,172.105.6.5,172.105.7.5,172.105.8.5,172.105.9.5,172.105.10.5,172.105.11.5", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "ap-southeast", @@ -250,9 +259,9 @@ interactions: "Block Storage", "Object Storage", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance Policy", "Linode - Interfaces"], "monitors": {"alerts": ["Managed Databases", "NodeBalancers"], - "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": - {"ipv4": "139.144.192.62,139.144.192.60,139.144.192.61,139.144.192.53,139.144.192.54,139.144.192.67,139.144.192.69,139.144.192.66,139.144.192.52,139.144.192.68", + Interfaces", "ACLP Logs Datacenter LKE-E"], "monitors": {"alerts": ["Managed + Databases", "NodeBalancers"], "metrics": ["Linodes", "Managed Databases", "NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "139.144.192.62,139.144.192.60,139.144.192.61,139.144.192.53,139.144.192.54,139.144.192.67,139.144.192.69,139.144.192.66,139.144.192.52,139.144.192.68", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "us-ord", @@ -261,9 +270,9 @@ interactions: "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance - Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases"], - "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": - {"ipv4": "172.232.0.17,172.232.0.16,172.232.0.21,172.232.0.13,172.232.0.22,172.232.0.9,172.232.0.19,172.232.0.20,172.232.0.15,172.232.0.18", + Policy", "Linode Interfaces", "ACLP Logs Datacenter LKE-E"], "monitors": {"alerts": + ["Managed Databases", "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "172.232.0.17,172.232.0.16,172.232.0.21,172.232.0.13,172.232.0.22,172.232.0.9,172.232.0.19,172.232.0.20,172.232.0.15,172.232.0.18", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "fr-par", @@ -272,9 +281,9 @@ interactions: "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance - Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases"], - "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": - {"ipv4": "172.232.32.21,172.232.32.23,172.232.32.17,172.232.32.18,172.232.32.16,172.232.32.22,172.232.32.20,172.232.32.14,172.232.32.11,172.232.32.12", + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "172.232.32.21,172.232.32.23,172.232.32.17,172.232.32.18,172.232.32.16,172.232.32.22,172.232.32.20,172.232.32.14,172.232.32.11,172.232.32.12", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "us-sea", @@ -283,9 +292,9 @@ interactions: "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance - Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases"], - "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": - {"ipv4": "172.232.160.19,172.232.160.21,172.232.160.17,172.232.160.15,172.232.160.18,172.232.160.8,172.232.160.12,172.232.160.11,172.232.160.14,172.232.160.16", + Policy", "Linode Interfaces", "ACLP Logs Datacenter LKE-E"], "monitors": {"alerts": + ["Managed Databases", "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "172.232.160.19,172.232.160.21,172.232.160.17,172.232.160.15,172.232.160.18,172.232.160.8,172.232.160.12,172.232.160.11,172.232.160.14,172.232.160.16", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "br-gru", @@ -294,8 +303,9 @@ interactions: "Block Storage", "Object Storage", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance Policy", "Linode - Interfaces"], "monitors": {"alerts": ["Managed Databases"], "metrics": ["Managed - Databases", "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "172.233.0.4,172.233.0.9,172.233.0.7,172.233.0.12,172.233.0.5,172.233.0.13,172.233.0.10,172.233.0.6,172.233.0.8,172.233.0.11", + Interfaces"], "monitors": {"alerts": ["Managed Databases", "NodeBalancers"], + "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": + {"ipv4": "172.233.0.4,172.233.0.9,172.233.0.7,172.233.0.12,172.233.0.5,172.233.0.13,172.233.0.10,172.233.0.6,172.233.0.8,172.233.0.11", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "nl-ams", @@ -304,9 +314,9 @@ interactions: "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance - Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases"], - "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": - {"ipv4": "172.233.33.36,172.233.33.38,172.233.33.35,172.233.33.39,172.233.33.34,172.233.33.33,172.233.33.31,172.233.33.30,172.233.33.37,172.233.33.32", + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "172.233.33.36,172.233.33.38,172.233.33.35,172.233.33.39,172.233.33.34,172.233.33.33,172.233.33.31,172.233.33.30,172.233.33.37,172.233.33.32", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "se-sto", @@ -315,9 +325,9 @@ interactions: "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance - Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases"], - "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": - {"ipv4": "172.232.128.24,172.232.128.26,172.232.128.20,172.232.128.22,172.232.128.25,172.232.128.19,172.232.128.23,172.232.128.18,172.232.128.21,172.232.128.27", + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "172.232.128.24,172.232.128.26,172.232.128.20,172.232.128.22,172.232.128.25,172.232.128.19,172.232.128.23,172.232.128.18,172.232.128.21,172.232.128.27", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "es-mad", @@ -326,9 +336,9 @@ interactions: "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance - Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases"], - "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": - {"ipv4": "172.233.111.6,172.233.111.17,172.233.111.21,172.233.111.25,172.233.111.19,172.233.111.12,172.233.111.26,172.233.111.16,172.233.111.18,172.233.111.9", + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "172.233.111.6,172.233.111.17,172.233.111.21,172.233.111.25,172.233.111.19,172.233.111.12,172.233.111.26,172.233.111.16,172.233.111.18,172.233.111.9", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "in-maa", @@ -338,8 +348,8 @@ interactions: Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", "NETINT Quadra T1U", "Maintenance Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed - Databases"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", - "resolvers": {"ipv4": "172.232.96.17,172.232.96.26,172.232.96.19,172.232.96.20,172.232.96.25,172.232.96.21,172.232.96.18,172.232.96.22,172.232.96.23,172.232.96.24", + Databases", "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "172.232.96.17,172.232.96.26,172.232.96.19,172.232.96.20,172.232.96.25,172.232.96.21,172.232.96.18,172.232.96.22,172.232.96.23,172.232.96.24", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "jp-osa", @@ -348,9 +358,9 @@ interactions: "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance - Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases"], - "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": - {"ipv4": "172.233.64.44,172.233.64.43,172.233.64.37,172.233.64.40,172.233.64.46,172.233.64.41,172.233.64.39,172.233.64.42,172.233.64.45,172.233.64.38", + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "172.233.64.44,172.233.64.43,172.233.64.37,172.233.64.40,172.233.64.46,172.233.64.41,172.233.64.39,172.233.64.42,172.233.64.45,172.233.64.38", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "it-mil", @@ -359,9 +369,9 @@ interactions: "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance - Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases"], - "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": - {"ipv4": "172.232.192.19,172.232.192.18,172.232.192.16,172.232.192.20,172.232.192.24,172.232.192.21,172.232.192.22,172.232.192.17,172.232.192.15,172.232.192.23", + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "172.232.192.19,172.232.192.18,172.232.192.16,172.232.192.20,172.232.192.24,172.232.192.21,172.232.192.22,172.232.192.17,172.232.192.15,172.232.192.23", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "us-central", @@ -369,9 +379,9 @@ interactions: Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", "Managed Databases", "Metadata", "Placement Group", "StackScripts", "Maintenance - Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases"], - "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": - {"ipv4": "72.14.179.5,72.14.188.5,173.255.199.5,66.228.53.5,96.126.122.5,96.126.124.5,96.126.127.5,198.58.107.5,198.58.111.5,23.239.24.5", + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "72.14.179.5,72.14.188.5,173.255.199.5,66.228.53.5,96.126.122.5,96.126.124.5,96.126.127.5,198.58.107.5,198.58.111.5,23.239.24.5", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "ap-northeast", @@ -379,9 +389,9 @@ interactions: Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", "Managed Databases", "Metadata", "Placement Group", "StackScripts", "Maintenance - Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases"], - "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": - {"ipv4": "139.162.66.5,139.162.67.5,139.162.68.5,139.162.69.5,139.162.70.5,139.162.71.5,139.162.72.5,139.162.73.5,139.162.74.5,139.162.75.5", + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "139.162.66.5,139.162.67.5,139.162.68.5,139.162.69.5,139.162.70.5,139.162.71.5,139.162.72.5,139.162.73.5,139.162.74.5,139.162.75.5", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "eu-central", @@ -390,8 +400,8 @@ interactions: "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", "Managed Databases", "Metadata", "Placement Group", "StackScripts", "Maintenance Policy", "Linode Interfaces"], "monitors": - {"alerts": ["Managed Databases"], "metrics": ["Managed Databases", "NodeBalancers"]}, - "status": "ok", "resolvers": {"ipv4": "139.162.130.5,139.162.131.5,139.162.132.5,139.162.133.5,139.162.134.5,139.162.135.5,139.162.136.5,139.162.137.5,139.162.138.5,139.162.139.5", + {"alerts": ["Managed Databases", "NodeBalancers"], "metrics": ["Managed Databases", + "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "139.162.130.5,139.162.131.5,139.162.132.5,139.162.133.5,139.162.134.5,139.162.135.5,139.162.136.5,139.162.137.5,139.162.138.5,139.162.139.5", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "ap-south", @@ -399,8 +409,8 @@ interactions: Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", "Metadata", "Placement Group", "StackScripts", - "Maintenance Policy", "Linode Interfaces"], "monitors": {"alerts": [], "metrics": - ["NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "139.162.11.5,139.162.13.5,139.162.14.5,139.162.15.5,139.162.16.5,139.162.21.5,139.162.27.5,103.3.60.18,103.3.60.19,103.3.60.20", + "Maintenance Policy", "Linode Interfaces"], "monitors": {"alerts": ["NodeBalancers"], + "metrics": ["NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "139.162.11.5,139.162.13.5,139.162.14.5,139.162.15.5,139.162.16.5,139.162.21.5,139.162.27.5,103.3.60.18,103.3.60.19,103.3.60.20", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "eu-west", @@ -408,20 +418,20 @@ interactions: Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", "Metadata", "Placement Group", "StackScripts", "Maintenance Policy", "Linode - Interfaces"], "monitors": {"alerts": [], "metrics": ["NodeBalancers"]}, "status": - "ok", "resolvers": {"ipv4": "178.79.182.5, 176.58.107.5, 176.58.116.5, 176.58.121.5, - 151.236.220.5, 212.71.252.5, 212.71.253.5, 109.74.192.20, 109.74.193.20, 109.74.194.20", - "ipv6": "1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678"}, "placement_group_limits": - {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": - 5}, "site_type": "core"}, {"id": "us-east", "label": "Newark, NJ", "country": - "us", "capabilities": ["Linodes", "Block Storage Encryption", "LA Disk Encryption", - "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", "Object Storage", - "GPU Linodes", "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", - "Managed Databases", "Metadata", "Placement Group", "StackScripts", "Maintenance - Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases"], - "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": - {"ipv4": "66.228.42.5,96.126.106.5,50.116.53.5,50.116.58.5,50.116.61.5,50.116.62.5,66.175.211.5,97.107.133.4,173.255.225.5,66.228.35.5", + Interfaces"], "monitors": {"alerts": ["NodeBalancers"], "metrics": ["NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "178.79.182.5, 176.58.107.5, 176.58.116.5, + 176.58.121.5, 151.236.220.5, 212.71.252.5, 212.71.253.5, 109.74.192.20, 109.74.193.20, + 109.74.194.20", "ipv6": "1234::5678, 1234::5678, 1234::5678, 1234::5678, + 1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "us-east", + "label": "Newark, NJ", "country": "us", "capabilities": ["Linodes", "Block Storage + Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Cloud Firewall", + "Vlans", "Block Storage Migrations", "Managed Databases", "Metadata", "Placement + Group", "StackScripts", "Maintenance Policy", "Linode Interfaces"], "monitors": + {"alerts": ["Managed Databases", "NodeBalancers"], "metrics": ["Managed Databases", + "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "66.228.42.5,96.126.106.5,50.116.53.5,50.116.58.5,50.116.61.5,50.116.62.5,66.175.211.5,97.107.133.4,173.255.225.5,66.228.35.5", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "us-southeast", @@ -430,8 +440,8 @@ interactions: "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", "Managed Databases", "Metadata", "Placement Group", "StackScripts", "Maintenance Policy", "Linode Interfaces"], "monitors": - {"alerts": ["Managed Databases"], "metrics": ["Managed Databases", "NodeBalancers"]}, - "status": "ok", "resolvers": {"ipv4": "74.207.231.5,173.230.128.5,173.230.129.5,173.230.136.5,173.230.140.5,66.228.59.5,66.228.62.5,50.116.35.5,50.116.41.5,23.239.18.5", + {"alerts": ["Managed Databases", "NodeBalancers"], "metrics": ["Managed Databases", + "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "74.207.231.5,173.230.128.5,173.230.129.5,173.230.136.5,173.230.140.5,66.228.59.5,66.228.62.5,50.116.35.5,50.116.41.5,23.239.18.5", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "us-west", @@ -439,14 +449,14 @@ interactions: Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", "Managed Databases", "Metadata", "Placement Group", "StackScripts", "Maintenance - Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases"], - "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": - {"ipv4": "173.230.145.5, 173.230.147.5, 173.230.155.5, 173.255.212.5, 173.255.219.5, - 173.255.241.5, 173.255.243.5, 173.255.244.5, 74.207.241.5, 74.207.242.5", "ipv6": - "1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678, 1234::5678"}, "placement_group_limits": + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "173.230.145.5, 173.230.147.5, 173.230.155.5, 173.255.212.5, + 173.255.219.5, 173.255.241.5, 173.255.243.5, 173.255.244.5, 74.207.241.5, 74.207.242.5", + "ipv6": "1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678, + 1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": - 5}, "site_type": "core"}], "page": 1, "pages": 1, "results": 46}' + 5}, "site_type": "core"}], "page": 1, "pages": 1, "results": 47}' headers: Access-Control-Allow-Credentials: - "true" @@ -469,7 +479,7 @@ interactions: Content-Type: - application/json Expires: - - Wed, 04 Mar 2026 22:51:20 GMT + - Tue, 05 May 2026 23:45:19 GMT Pragma: - no-cache Strict-Transport-Security: @@ -495,134 +505,7 @@ interactions: code: 200 duration: "" - request: - body: "" - form: {} - headers: - Accept: - - application/json - Content-Type: - - application/json - User-Agent: - - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/account/availability?page=1 - method: GET - response: - body: '{"data": [{"region": "us-central", "available": ["Linodes", "NodeBalancers", - "Block Storage", "Kubernetes"], "unavailable": []}, {"region": "us-west", "available": - ["Linodes", "NodeBalancers", "Block Storage", "Kubernetes"], "unavailable": - []}, {"region": "us-southeast", "available": ["Linodes", "NodeBalancers", "Block - Storage", "Kubernetes"], "unavailable": []}, {"region": "us-east", "available": - ["Linodes", "NodeBalancers", "Block Storage", "Kubernetes"], "unavailable": - []}, {"region": "eu-west", "available": [], "unavailable": ["Linodes", "NodeBalancers", - "Block Storage", "Kubernetes"]}, {"region": "ap-south", "available": ["Linodes", - "NodeBalancers", "Block Storage", "Kubernetes"], "unavailable": []}, {"region": - "eu-central", "available": ["Linodes", "NodeBalancers", "Block Storage", "Kubernetes"], - "unavailable": []}, {"region": "ap-northeast", "available": ["Linodes", "NodeBalancers", - "Block Storage", "Kubernetes"], "unavailable": []}, {"region": "ap-west", "available": - ["Linodes", "NodeBalancers", "Block Storage", "Kubernetes"], "unavailable": - []}, {"region": "ca-central", "available": ["Linodes", "NodeBalancers", "Block - Storage", "Kubernetes"], "unavailable": []}, {"region": "ap-southeast", "available": - ["Linodes", "NodeBalancers", "Block Storage", "Kubernetes"], "unavailable": - []}, {"region": "us-iad", "available": ["Linodes", "NodeBalancers", "Block Storage", - "Kubernetes"], "unavailable": []}, {"region": "us-ord", "available": ["Linodes", - "NodeBalancers", "Block Storage", "Kubernetes"], "unavailable": []}, {"region": - "fr-par", "available": ["Linodes", "NodeBalancers", "Block Storage", "Kubernetes"], - "unavailable": []}, {"region": "us-sea", "available": ["Linodes", "NodeBalancers", - "Block Storage", "Kubernetes"], "unavailable": []}, {"region": "br-gru", "available": - ["Linodes", "NodeBalancers", "Block Storage", "Kubernetes"], "unavailable": - []}, {"region": "nl-ams", "available": ["Linodes", "NodeBalancers", "Block Storage", - "Kubernetes"], "unavailable": []}, {"region": "se-sto", "available": ["Linodes", - "NodeBalancers", "Block Storage", "Kubernetes"], "unavailable": []}, {"region": - "es-mad", "available": ["Linodes", "Kubernetes"], "unavailable": ["NodeBalancers", - "Block Storage"]}, {"region": "in-maa", "available": ["Linodes", "NodeBalancers", - "Block Storage", "Kubernetes"], "unavailable": []}, {"region": "jp-osa", "available": - ["Linodes", "NodeBalancers", "Block Storage", "Kubernetes"], "unavailable": - []}, {"region": "it-mil", "available": ["Linodes", "NodeBalancers", "Block Storage", - "Kubernetes"], "unavailable": []}, {"region": "us-mia", "available": ["Linodes", - "NodeBalancers", "Block Storage", "Kubernetes"], "unavailable": []}, {"region": - "id-cgk", "available": ["Linodes", "NodeBalancers", "Block Storage", "Kubernetes"], - "unavailable": []}, {"region": "us-lax", "available": ["Linodes", "NodeBalancers", - "Block Storage", "Kubernetes"], "unavailable": []}, {"region": "nz-akl-1", "available": - ["Linodes", "NodeBalancers", "Block Storage", "Kubernetes"], "unavailable": - []}, {"region": "us-den-1", "available": ["Linodes"], "unavailable": ["NodeBalancers", - "Block Storage", "Kubernetes"]}, {"region": "de-ham-1", "available": ["Linodes"], - "unavailable": ["NodeBalancers", "Block Storage", "Kubernetes"]}, {"region": - "za-jnb-1", "available": ["Linodes"], "unavailable": ["NodeBalancers", "Block - Storage", "Kubernetes"]}, {"region": "my-kul-1", "available": ["Linodes"], "unavailable": - ["NodeBalancers", "Block Storage", "Kubernetes"]}, {"region": "co-bog-1", "available": - ["Linodes"], "unavailable": ["NodeBalancers", "Block Storage", "Kubernetes"]}, - {"region": "mx-qro-1", "available": ["Linodes"], "unavailable": ["NodeBalancers", - "Block Storage", "Kubernetes"]}, {"region": "us-hou-1", "available": ["Linodes"], - "unavailable": ["NodeBalancers", "Block Storage", "Kubernetes"]}, {"region": - "cl-scl-1", "available": ["Linodes"], "unavailable": ["NodeBalancers", "Block - Storage", "Kubernetes"]}, {"region": "gb-lon", "available": ["Linodes", "NodeBalancers", - "Block Storage", "Kubernetes"], "unavailable": []}, {"region": "au-mel", "available": - ["Linodes", "Kubernetes"], "unavailable": ["NodeBalancers", "Block Storage"]}, - {"region": "in-bom-2", "available": ["Linodes", "NodeBalancers", "Block Storage", - "Kubernetes"], "unavailable": []}, {"region": "de-fra-2", "available": ["Linodes", - "NodeBalancers", "Block Storage", "Kubernetes"], "unavailable": []}, {"region": - "sg-sin-2", "available": ["Linodes", "NodeBalancers", "Block Storage", "Kubernetes"], - "unavailable": []}, {"region": "jp-tyo-3", "available": ["Linodes", "NodeBalancers", - "Block Storage", "Kubernetes"], "unavailable": []}, {"region": "de-ber-1", "available": - ["Linodes", "NodeBalancers", "Block Storage", "Kubernetes"], "unavailable": - []}, {"region": "no-osl-1", "available": ["Linodes", "NodeBalancers", "Block - Storage", "Kubernetes"], "unavailable": []}, {"region": "us-iad-2", "available": - ["Linodes", "NodeBalancers", "Block Storage", "Kubernetes"], "unavailable": - []}, {"region": "fr-par-2", "available": ["Linodes", "NodeBalancers", "Block - Storage", "Kubernetes"], "unavailable": []}, {"region": "co-bog-2", "available": - ["Linodes", "NodeBalancers", "Block Storage", "Kubernetes"], "unavailable": - []}, {"region": "fr-mrs-2", "available": ["Linodes", "NodeBalancers", "Block - Storage", "Kubernetes"], "unavailable": []}], "page": 1, "pages": 1, "results": - 46}' - headers: - Access-Control-Allow-Credentials: - - "true" - Access-Control-Allow-Headers: - - Authorization, Origin, X-Requested-With, Content-Type, Accept, X-Filter - Access-Control-Allow-Methods: - - HEAD, GET, OPTIONS, POST, PUT, DELETE - Access-Control-Allow-Origin: - - '*' - Access-Control-Expose-Headers: - - X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Status - Akamai-Internal-Account: - - '*' - Cache-Control: - - max-age=0, no-cache, no-store - Connection: - - keep-alive - Content-Security-Policy: - - default-src 'none' - Content-Type: - - application/json - Expires: - - Wed, 04 Mar 2026 22:51:20 GMT - Pragma: - - no-cache - Strict-Transport-Security: - - max-age=31536000 - Vary: - - Authorization, X-Filter - - Authorization, X-Filter - - Accept-Encoding - X-Accepted-Oauth-Scopes: - - account:read_only - X-Content-Type-Options: - - nosniff - X-Frame-Options: - - DENY - - DENY - X-Oauth-Scopes: - - '*' - X-Ratelimit-Limit: - - "1840" - X-Xss-Protection: - - 1; mode=block - status: 200 OK - code: 200 - duration: "" -- request: - body: '{"region":"au-mel","type":"g6-nanode-1","label":"go-test-ins-w9325gz70sqd","root_pass":"0J]6i895JaSqL]\\$d41J8b\u003e~(Tc!1?+yMRs{J!6NVxQm6tO8LbaJz78b)3@4\u003c,Lk","image":"linode/debian12","booted":false}' + body: '{"region":"au-mel","type":"g6-nanode-1","label":"go-test-ins-o2em4jg116a5","root_pass":"*?YGoH+''C''4FQ8:yOr@g]YV`p7pJHg59koA6O!^:Oi8Qr0u4[431@c88e)]c20aA","image":"linode/debian12","booted":false}' form: {} headers: Accept: @@ -634,19 +517,19 @@ interactions: url: https://api.linode.com/v4beta/linode/instances method: POST response: - body: '{"id": 93152833, "label": "go-test-ins-w9325gz70sqd", "group": "", "status": + body: '{"id": 97185941, "label": "go-test-ins-o2em4jg116a5", "group": "", "status": "provisioning", "created": "2018-01-02T03:04:05", "updated": "2018-01-02T03:04:05", - "type": "g6-nanode-1", "ipv4": ["172.236.44.156"], "ipv6": "1234::5678/128", + "type": "g6-nanode-1", "ipv4": ["172.236.33.27"], "ipv6": "1234::5678/128", "image": "linode/debian12", "region": "au-mel", "site_type": "core", "specs": {"disk": 25600, "memory": 1024, "vcpus": 1, "gpus": 0, "transfer": 1000, "accelerated_devices": 0}, "alerts": {"cpu": 90, "network_in": 10, "network_out": 10, "transfer_quota": - 80, "io": 10000}, "backups": {"enabled": false, "available": false, "schedule": - {"day": null, "window": null}, "last_successful": null}, "hypervisor": "kvm", - "watchdog_enabled": true, "tags": [], "host_uuid": "0f2b1b5738ceb6a8b0b9be46f010a4f34c762cce", - "has_user_data": false, "placement_group": null, "disk_encryption": "enabled", - "lke_cluster_id": null, "capabilities": ["Block Storage Encryption", "SMTP Enabled", - "Maintenance Policy"], "interface_generation": "legacy_config", "maintenance_policy": - "linode/migrate", "locks": []}' + 80, "io": 10000, "system_alerts": [], "user_alerts": []}, "backups": {"enabled": + false, "available": false, "schedule": {"day": null, "window": null}, "last_successful": + null}, "hypervisor": "kvm", "watchdog_enabled": true, "tags": [], "host_uuid": + "288e63c85b047d1cb41106d47e6898933356966a", "has_user_data": false, "placement_group": + null, "disk_encryption": "enabled", "lke_cluster_id": null, "capabilities": + ["Block Storage Encryption", "SMTP Enabled", "Maintenance Policy"], "interface_generation": + "legacy_config", "maintenance_policy": "linode/migrate", "locks": []}' headers: Access-Control-Allow-Credentials: - "true" @@ -669,7 +552,7 @@ interactions: Content-Type: - application/json Expires: - - Wed, 04 Mar 2026 22:51:23 GMT + - Tue, 05 May 2026 23:45:21 GMT Pragma: - no-cache Strict-Transport-Security: @@ -706,7 +589,7 @@ interactions: url: https://api.linode.com/v4beta/networking/firewalls method: POST response: - body: '{"id": 3913131, "label": "linodego-fw-test", "created": "2018-01-02T03:04:05", + body: '{"id": 9618630, "label": "linodego-fw-test", "created": "2018-01-02T03:04:05", "updated": "2018-01-02T03:04:05", "status": "enabled", "rules": {"inbound": [{"protocol": "TCP", "addresses": {"ipv6": ["1234::5678/0"], "ipv4": ["0.0.0.0/0"]}, "action": "ACCEPT", "label": "go-fwrule-test", "ports": "22"}], "inbound_policy": @@ -738,7 +621,7 @@ interactions: Content-Type: - application/json Expires: - - Wed, 04 Mar 2026 22:51:23 GMT + - Tue, 05 May 2026 23:45:21 GMT Pragma: - no-cache Strict-Transport-Security: @@ -762,7 +645,7 @@ interactions: code: 200 duration: "" - request: - body: '{"id":93152833,"type":"linode"}' + body: '{"id":97185941,"type":"linode"}' form: {} headers: Accept: @@ -771,12 +654,12 @@ interactions: - application/json User-Agent: - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/networking/firewalls/3913131/devices + url: https://api.linode.com/v4beta/networking/firewalls/9618630/devices method: POST response: - body: '{"id": 10483459, "created": "2018-01-02T03:04:05", "updated": "2018-01-02T03:04:05", - "entity": {"id": 93152833, "type": "linode", "label": "go-test-ins-w9325gz70sqd", - "url": "/v4/linode/instances/93152833", "parent_entity": null}}' + body: '{"id": 11909960, "created": "2018-01-02T03:04:05", "updated": "2018-01-02T03:04:05", + "entity": {"id": 97185941, "type": "linode", "label": "go-test-ins-o2em4jg116a5", + "url": "/v4/linode/instances/97185941", "parent_entity": null}}' headers: Access-Control-Allow-Credentials: - "true" @@ -801,7 +684,7 @@ interactions: Content-Type: - application/json Expires: - - Wed, 04 Mar 2026 22:51:24 GMT + - Tue, 05 May 2026 23:45:21 GMT Pragma: - no-cache Strict-Transport-Security: @@ -834,7 +717,7 @@ interactions: - application/json User-Agent: - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/networking/firewalls/3913131/devices/10483459 + url: https://api.linode.com/v4beta/networking/firewalls/9618630/devices/11909960 method: DELETE response: body: '{}' @@ -862,7 +745,7 @@ interactions: Content-Type: - application/json Expires: - - Wed, 04 Mar 2026 22:51:24 GMT + - Tue, 05 May 2026 23:45:22 GMT Pragma: - no-cache Strict-Transport-Security: @@ -895,7 +778,7 @@ interactions: - application/json User-Agent: - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/networking/firewalls/3913131/devices/10483459 + url: https://api.linode.com/v4beta/networking/firewalls/9618630/devices/11909960 method: GET response: body: '{"errors": [{"reason": "Not found"}]}' @@ -917,7 +800,7 @@ interactions: Content-Type: - application/json Expires: - - Wed, 04 Mar 2026 22:51:24 GMT + - Tue, 05 May 2026 23:45:22 GMT Pragma: - no-cache Strict-Transport-Security: @@ -945,7 +828,7 @@ interactions: - application/json User-Agent: - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/networking/firewalls/3913131 + url: https://api.linode.com/v4beta/networking/firewalls/9618630 method: DELETE response: body: '{}' @@ -973,7 +856,7 @@ interactions: Content-Type: - application/json Expires: - - Wed, 04 Mar 2026 22:51:25 GMT + - Tue, 05 May 2026 23:45:22 GMT Pragma: - no-cache Strict-Transport-Security: @@ -1006,7 +889,7 @@ interactions: - application/json User-Agent: - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/linode/instances/93152833 + url: https://api.linode.com/v4beta/linode/instances/97185941 method: DELETE response: body: '{}' @@ -1034,7 +917,7 @@ interactions: Content-Type: - application/json Expires: - - Wed, 04 Mar 2026 22:51:25 GMT + - Tue, 05 May 2026 23:45:23 GMT Pragma: - no-cache Strict-Transport-Security: diff --git a/test/integration/fixtures/TestFirewallDevice_Get.yaml b/test/integration/fixtures/TestFirewallDevice_Get.yaml index f697cc3d1..48adf7f03 100644 --- a/test/integration/fixtures/TestFirewallDevice_Get.yaml +++ b/test/integration/fixtures/TestFirewallDevice_Get.yaml @@ -30,74 +30,75 @@ interactions: "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", "NETINT Quadra - T1U", "Maintenance Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed - Databases"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", - "resolvers": {"ipv4": "172.233.128.45,172.233.128.38,172.233.128.53,172.233.128.37,172.233.128.34,172.233.128.36,172.233.128.33,172.233.128.39,172.233.128.43,172.233.128.44", + T1U", "Maintenance Policy", "Linode Interfaces", "ACLP Logs Datacenter LKE-E"], + "monitors": {"alerts": ["Managed Databases", "NodeBalancers"], "metrics": ["Managed + Databases", "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "172.233.128.45,172.233.128.38,172.233.128.53,172.233.128.37,172.233.128.34,172.233.128.36,172.233.128.33,172.233.128.39,172.233.128.43,172.233.128.44", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "nz-akl-1", "label": "Auckland, NZ", "country": "nz", "capabilities": ["Linodes", "Disk - Encryption", "Cloud Firewall", "Vlans", "VPCs", "Metadata", "Distributed Plans", - "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": - "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", "Maintenance + Policy"], "monitors": {"alerts": [], "metrics": []}, "status": "ok", "resolvers": + {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": "us-den-1", "label": "Denver, CO", "country": "us", "capabilities": ["Linodes", - "Disk Encryption", "Cloud Firewall", "Vlans", "VPCs", "Metadata", "Distributed - Plans", "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": + "Disk Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", + "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": "de-ham-1", "label": "Hamburg, DE", "country": "de", "capabilities": ["Linodes", - "Disk Encryption", "Cloud Firewall", "Vlans", "VPCs", "Metadata", "Distributed - Plans", "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": + "Disk Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", + "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": "za-jnb-1", "label": "Johannesburg, ZA", "country": "za", "capabilities": ["Linodes", - "Disk Encryption", "Cloud Firewall", "Vlans", "VPCs", "Metadata", "Distributed - Plans", "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": + "Disk Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", + "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": "my-kul-1", "label": "Kuala Lumpur, MY", "country": "my", "capabilities": ["Linodes", - "Disk Encryption", "Cloud Firewall", "Vlans", "VPCs", "Metadata", "Distributed - Plans", "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": + "Disk Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", + "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": "co-bog-1", "label": "Bogot\u00e1, CO", "country": "co", "capabilities": ["Linodes", - "Disk Encryption", "Cloud Firewall", "Vlans", "VPCs", "Metadata", "Distributed - Plans", "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": + "Disk Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", + "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": "mx-qro-1", "label": "Quer\u00e9taro, MX", "country": "mx", "capabilities": - ["Linodes", "Disk Encryption", "Cloud Firewall", "Vlans", "VPCs", "Metadata", - "Distributed Plans", "Maintenance Policy"], "monitors": {"alerts": [], "metrics": - []}, "status": "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", - "ipv6": "1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": - 0, "maximum_linodes_per_pg": 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": - "distributed"}, {"id": "us-hou-1", "label": "Houston, TX", "country": "us", - "capabilities": ["Linodes", "Disk Encryption", "Cloud Firewall", "Vlans", "VPCs", - "Metadata", "Distributed Plans", "Maintenance Policy"], "monitors": {"alerts": - [], "metrics": []}, "status": "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", - "ipv6": "1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": - 0, "maximum_linodes_per_pg": 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": - "distributed"}, {"id": "cl-scl-1", "label": "Santiago, CL", "country": "cl", - "capabilities": ["Linodes", "Disk Encryption", "Cloud Firewall", "Vlans", "VPCs", - "Metadata", "Distributed Plans", "Maintenance Policy"], "monitors": {"alerts": - [], "metrics": []}, "status": "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", - "ipv6": "1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": - 0, "maximum_linodes_per_pg": 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": - "distributed"}, {"id": "gb-lon", "label": "London 2, UK", "country": "gb", "capabilities": - ["Linodes", "Block Storage Encryption", "LA Disk Encryption", "Disk Encryption", - "Backups", "NodeBalancers", "Block Storage", "Object Storage", "GPU Linodes", - "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC - Dual Stack", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", - "StackScripts", "NETINT Quadra T1U", "Maintenance Policy", "Linode Interfaces"], - "monitors": {"alerts": ["Managed Databases"], "metrics": ["Managed Databases", - "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "172.236.0.46,172.236.0.50,172.236.0.47,172.236.0.53,172.236.0.52,172.236.0.45,172.236.0.49,172.236.0.51,172.236.0.54,172.236.0.48", + ["Linodes", "Disk Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed + Plans", "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": + "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": + 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": + "us-hou-1", "label": "Houston, TX", "country": "us", "capabilities": ["Linodes", + "Disk Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", + "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": + "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": + 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": + "cl-scl-1", "label": "Santiago, CL", "country": "cl", "capabilities": ["Linodes", + "Disk Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", + "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": + "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": + 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": + "gb-lon", "label": "London 2, UK", "country": "gb", "capabilities": ["Linodes", + "Block Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", + "NodeBalancers", "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", + "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", + "Managed Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", + "NETINT Quadra T1U", "Maintenance Policy", "Linode Interfaces", "ACLP Logs Datacenter + LKE-E"], "monitors": {"alerts": ["Managed Databases", "NodeBalancers"], "metrics": + ["Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": + "172.236.0.46,172.236.0.50,172.236.0.47,172.236.0.53,172.236.0.52,172.236.0.45,172.236.0.49,172.236.0.51,172.236.0.54,172.236.0.48", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "id-cgk", @@ -106,20 +107,20 @@ interactions: "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance - Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases"], - "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": - {"ipv4": "172.232.224.23,172.232.224.32,172.232.224.26,172.232.224.27,172.232.224.21,172.232.224.24,172.232.224.22,172.232.224.20,172.232.224.31,172.232.224.28", + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "172.232.224.23,172.232.224.32,172.232.224.26,172.232.224.27,172.232.224.21,172.232.224.24,172.232.224.22,172.232.224.20,172.232.224.31,172.232.224.28", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "in-bom-2", "label": "Mumbai 2, IN", "country": "in", "capabilities": ["Linodes", "Block Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", - "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes - Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", - "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance - Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases"], - "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": - {"ipv4": "172.236.171.41,172.236.171.42,172.236.171.25,172.236.171.44,172.236.171.26,172.236.171.45,172.236.171.24,172.236.171.43,172.236.171.27,172.236.171.28", + "Block Storage", "GPU Linodes", "Kubernetes", "Kubernetes Enterprise", "Cloud + Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", + "Premium Plans", "Placement Group", "StackScripts", "Maintenance Policy", "Linode + Interfaces", "ACLP Logs Datacenter LKE-E"], "monitors": {"alerts": ["Managed + Databases", "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "172.236.171.41,172.236.171.42,172.236.171.25,172.236.171.44,172.236.171.26,172.236.171.45,172.236.171.24,172.236.171.43,172.236.171.27,172.236.171.28", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "de-fra-2", @@ -128,9 +129,9 @@ interactions: "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", "NETINT Quadra - T1U", "Maintenance Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed - Databases"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", - "resolvers": {"ipv4": "172.236.203.9,172.236.203.16,172.236.203.19,172.236.203.15,172.236.203.17,172.236.203.11,172.236.203.18,172.236.203.14,172.236.203.13,172.236.203.12", + T1U", "Maintenance Policy", "Linode Interfaces", "ACLP Logs Datacenter LKE-E"], + "monitors": {"alerts": ["Managed Databases", "NodeBalancers"], "metrics": ["Managed + Databases", "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "172.236.203.9,172.236.203.16,172.236.203.19,172.236.203.15,172.236.203.17,172.236.203.11,172.236.203.18,172.236.203.14,172.236.203.13,172.236.203.12", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "sg-sin-2", @@ -139,9 +140,9 @@ interactions: "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance - Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases"], - "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": - {"ipv4": "172.236.129.8,172.236.129.42,172.236.129.41,172.236.129.19,172.236.129.46,172.236.129.23,172.236.129.48,172.236.129.20,172.236.129.21,172.236.129.47", + Policy", "Linode Interfaces", "ACLP Logs Datacenter LKE-E"], "monitors": {"alerts": + ["Managed Databases", "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "172.236.129.8,172.236.129.42,172.236.129.41,172.236.129.19,172.236.129.46,172.236.129.23,172.236.129.48,172.236.129.20,172.236.129.21,172.236.129.47", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "jp-tyo-3", @@ -150,25 +151,26 @@ interactions: "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance - Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases"], - "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": - {"ipv4": "172.237.4.15,172.237.4.19,172.237.4.17,172.237.4.21,172.237.4.16,172.237.4.18,172.237.4.23,172.237.4.24,172.237.4.20,172.237.4.14", + Policy", "Linode Interfaces", "ACLP Logs Datacenter LKE-E"], "monitors": {"alerts": + ["Managed Databases", "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "172.237.4.15,172.237.4.19,172.237.4.17,172.237.4.21,172.237.4.16,172.237.4.18,172.237.4.23,172.237.4.24,172.237.4.20,172.237.4.14", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "de-ber-1", "label": "Berlin, DE", "country": "de", "capabilities": ["Linodes", "Disk Encryption", - "Cloud Firewall", "Vlans", "VPCs", "Metadata", "Distributed Plans", "Maintenance - Policy"], "monitors": {"alerts": [], "metrics": []}, "status": "ok", "resolvers": - {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", "Maintenance Policy"], + "monitors": {"alerts": [], "metrics": []}, "status": "ok", "resolvers": {"ipv4": + "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": "no-osl-1", "label": "Oslo, NO", "country": "no", "capabilities": ["Linodes", "Block Storage Encryption", "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", "Object Storage", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", "Premium - Plans", "Placement Group", "StackScripts", "Maintenance Policy", "Linode Interfaces"], - "monitors": {"alerts": ["Managed Databases", "NodeBalancers"], "metrics": ["Managed - Databases", "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "172.238.140.33,172.238.140.25,172.238.140.30,172.238.140.31,172.238.140.26,172.238.140.28,172.238.140.34,172.238.140.32,172.238.140.27,172.238.140.29", + Plans", "Placement Group", "StackScripts", "Maintenance Policy", "Linode Interfaces", + "ACLP Logs Datacenter LKE-E"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "172.238.140.33,172.238.140.25,172.238.140.30,172.238.140.31,172.238.140.26,172.238.140.28,172.238.140.34,172.238.140.32,172.238.140.27,172.238.140.29", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "us-iad-2", @@ -177,30 +179,37 @@ interactions: "Object Storage", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance Policy", "Linode Interfaces"], - "monitors": {"alerts": ["Managed Databases"], "metrics": ["Managed Databases", - "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "172.239.142.102,172.239.142.89,172.239.142.92,172.239.142.87,172.239.142.88,172.239.142.103,172.239.142.91,172.239.142.90,172.239.142.86,172.239.142.100", + "monitors": {"alerts": ["Managed Databases", "NodeBalancers"], "metrics": ["Managed + Databases", "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "172.239.142.102,172.239.142.89,172.239.142.92,172.239.142.87,172.239.142.88,172.239.142.103,172.239.142.91,172.239.142.90,172.239.142.86,172.239.142.100", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "fr-par-2", "label": "Paris 2, FR", "country": "fr", "capabilities": ["Linodes", "Block Storage Encryption", "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", - "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes Enterprise", "Cloud - Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", - "Premium Plans", "Placement Group", "StackScripts", "Maintenance Policy", "Linode - Interfaces"], "monitors": {"alerts": ["Managed Databases"], "metrics": ["Managed - Databases", "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "172.239.11.24,172.239.11.22,172.239.11.17,172.239.11.20,172.239.11.23,172.239.11.19,172.239.11.21,172.239.11.15,172.239.11.16,172.239.11.18", + "GPU Linodes", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", + "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", "Premium Plans", + "Placement Group", "StackScripts", "Maintenance Policy", "Linode Interfaces", + "ACLP Logs Datacenter LKE-E"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "172.239.11.24,172.239.11.22,172.239.11.17,172.239.11.20,172.239.11.23,172.239.11.19,172.239.11.21,172.239.11.15,172.239.11.16,172.239.11.18", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "us-rno-1", + "label": "Reno, NV", "country": "us", "capabilities": ["Linodes", "Disk Encryption", + "Backups", "NodeBalancers", "GPU Linodes", "Metadata", "Premium Plans", "Placement + Group", "StackScripts", "Maintenance Policy"], "monitors": {"alerts": ["NodeBalancers"], + "metrics": ["NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "", "ipv6": + ""}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "co-bog-2", "label": "Bogot\u00e1 2, CO", "country": "co", "capabilities": ["Linodes", "Disk - Encryption", "Cloud Firewall", "Vlans", "VPCs", "Metadata", "Distributed Plans", - "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": - "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", "Maintenance + Policy"], "monitors": {"alerts": [], "metrics": []}, "status": "ok", "resolvers": + {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": "fr-mrs-2", "label": "Marseille 2, FR", "country": "fr", "capabilities": ["Linodes", - "Disk Encryption", "Cloud Firewall", "Vlans", "VPCs", "Metadata", "Distributed - Plans", "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": + "Disk Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", + "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": @@ -210,8 +219,8 @@ interactions: "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", "NETINT Quadra T1U", "Maintenance Policy", "Linode Interfaces"], "monitors": - {"alerts": ["Managed Databases"], "metrics": ["Managed Databases", "NodeBalancers"]}, - "status": "ok", "resolvers": {"ipv4": "172.233.160.34,172.233.160.27,172.233.160.30,172.233.160.29,172.233.160.32,172.233.160.28,172.233.160.33,172.233.160.26,172.233.160.25,172.233.160.31", + {"alerts": ["Managed Databases", "NodeBalancers"], "metrics": ["Managed Databases", + "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "172.233.160.34,172.233.160.27,172.233.160.30,172.233.160.29,172.233.160.32,172.233.160.28,172.233.160.33,172.233.160.26,172.233.160.25,172.233.160.31", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "ap-west", @@ -220,8 +229,8 @@ interactions: "Block Storage", "GPU Linodes", "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", "Managed Databases", "Metadata", "Placement Group", "StackScripts", "Maintenance Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed - Databases"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", - "resolvers": {"ipv4": "172.105.34.5,172.105.35.5,172.105.36.5,172.105.37.5,172.105.38.5,172.105.39.5,172.105.40.5,172.105.41.5,172.105.42.5,172.105.43.5", + Databases", "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "172.105.34.5,172.105.35.5,172.105.36.5,172.105.37.5,172.105.38.5,172.105.39.5,172.105.40.5,172.105.41.5,172.105.42.5,172.105.43.5", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "ca-central", @@ -230,8 +239,8 @@ interactions: "Block Storage", "GPU Linodes", "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", "Managed Databases", "Metadata", "Placement Group", "StackScripts", "Maintenance Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed - Databases"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", - "resolvers": {"ipv4": "172.105.0.5,172.105.3.5,172.105.4.5,172.105.5.5,172.105.6.5,172.105.7.5,172.105.8.5,172.105.9.5,172.105.10.5,172.105.11.5", + Databases", "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "172.105.0.5,172.105.3.5,172.105.4.5,172.105.5.5,172.105.6.5,172.105.7.5,172.105.8.5,172.105.9.5,172.105.10.5,172.105.11.5", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "ap-southeast", @@ -250,9 +259,9 @@ interactions: "Block Storage", "Object Storage", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance Policy", "Linode - Interfaces"], "monitors": {"alerts": ["Managed Databases", "NodeBalancers"], - "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": - {"ipv4": "139.144.192.62,139.144.192.60,139.144.192.61,139.144.192.53,139.144.192.54,139.144.192.67,139.144.192.69,139.144.192.66,139.144.192.52,139.144.192.68", + Interfaces", "ACLP Logs Datacenter LKE-E"], "monitors": {"alerts": ["Managed + Databases", "NodeBalancers"], "metrics": ["Linodes", "Managed Databases", "NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "139.144.192.62,139.144.192.60,139.144.192.61,139.144.192.53,139.144.192.54,139.144.192.67,139.144.192.69,139.144.192.66,139.144.192.52,139.144.192.68", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "us-ord", @@ -261,9 +270,9 @@ interactions: "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance - Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases"], - "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": - {"ipv4": "172.232.0.17,172.232.0.16,172.232.0.21,172.232.0.13,172.232.0.22,172.232.0.9,172.232.0.19,172.232.0.20,172.232.0.15,172.232.0.18", + Policy", "Linode Interfaces", "ACLP Logs Datacenter LKE-E"], "monitors": {"alerts": + ["Managed Databases", "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "172.232.0.17,172.232.0.16,172.232.0.21,172.232.0.13,172.232.0.22,172.232.0.9,172.232.0.19,172.232.0.20,172.232.0.15,172.232.0.18", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "fr-par", @@ -272,9 +281,9 @@ interactions: "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance - Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases"], - "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": - {"ipv4": "172.232.32.21,172.232.32.23,172.232.32.17,172.232.32.18,172.232.32.16,172.232.32.22,172.232.32.20,172.232.32.14,172.232.32.11,172.232.32.12", + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "172.232.32.21,172.232.32.23,172.232.32.17,172.232.32.18,172.232.32.16,172.232.32.22,172.232.32.20,172.232.32.14,172.232.32.11,172.232.32.12", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "us-sea", @@ -283,9 +292,9 @@ interactions: "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance - Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases"], - "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": - {"ipv4": "172.232.160.19,172.232.160.21,172.232.160.17,172.232.160.15,172.232.160.18,172.232.160.8,172.232.160.12,172.232.160.11,172.232.160.14,172.232.160.16", + Policy", "Linode Interfaces", "ACLP Logs Datacenter LKE-E"], "monitors": {"alerts": + ["Managed Databases", "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "172.232.160.19,172.232.160.21,172.232.160.17,172.232.160.15,172.232.160.18,172.232.160.8,172.232.160.12,172.232.160.11,172.232.160.14,172.232.160.16", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "br-gru", @@ -294,8 +303,9 @@ interactions: "Block Storage", "Object Storage", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance Policy", "Linode - Interfaces"], "monitors": {"alerts": ["Managed Databases"], "metrics": ["Managed - Databases", "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "172.233.0.4,172.233.0.9,172.233.0.7,172.233.0.12,172.233.0.5,172.233.0.13,172.233.0.10,172.233.0.6,172.233.0.8,172.233.0.11", + Interfaces"], "monitors": {"alerts": ["Managed Databases", "NodeBalancers"], + "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": + {"ipv4": "172.233.0.4,172.233.0.9,172.233.0.7,172.233.0.12,172.233.0.5,172.233.0.13,172.233.0.10,172.233.0.6,172.233.0.8,172.233.0.11", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "nl-ams", @@ -304,9 +314,9 @@ interactions: "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance - Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases"], - "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": - {"ipv4": "172.233.33.36,172.233.33.38,172.233.33.35,172.233.33.39,172.233.33.34,172.233.33.33,172.233.33.31,172.233.33.30,172.233.33.37,172.233.33.32", + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "172.233.33.36,172.233.33.38,172.233.33.35,172.233.33.39,172.233.33.34,172.233.33.33,172.233.33.31,172.233.33.30,172.233.33.37,172.233.33.32", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "se-sto", @@ -315,9 +325,9 @@ interactions: "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance - Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases"], - "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": - {"ipv4": "172.232.128.24,172.232.128.26,172.232.128.20,172.232.128.22,172.232.128.25,172.232.128.19,172.232.128.23,172.232.128.18,172.232.128.21,172.232.128.27", + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "172.232.128.24,172.232.128.26,172.232.128.20,172.232.128.22,172.232.128.25,172.232.128.19,172.232.128.23,172.232.128.18,172.232.128.21,172.232.128.27", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "es-mad", @@ -326,9 +336,9 @@ interactions: "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance - Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases"], - "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": - {"ipv4": "172.233.111.6,172.233.111.17,172.233.111.21,172.233.111.25,172.233.111.19,172.233.111.12,172.233.111.26,172.233.111.16,172.233.111.18,172.233.111.9", + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "172.233.111.6,172.233.111.17,172.233.111.21,172.233.111.25,172.233.111.19,172.233.111.12,172.233.111.26,172.233.111.16,172.233.111.18,172.233.111.9", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "in-maa", @@ -338,8 +348,8 @@ interactions: Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", "NETINT Quadra T1U", "Maintenance Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed - Databases"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", - "resolvers": {"ipv4": "172.232.96.17,172.232.96.26,172.232.96.19,172.232.96.20,172.232.96.25,172.232.96.21,172.232.96.18,172.232.96.22,172.232.96.23,172.232.96.24", + Databases", "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "172.232.96.17,172.232.96.26,172.232.96.19,172.232.96.20,172.232.96.25,172.232.96.21,172.232.96.18,172.232.96.22,172.232.96.23,172.232.96.24", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "jp-osa", @@ -348,9 +358,9 @@ interactions: "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance - Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases"], - "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": - {"ipv4": "172.233.64.44,172.233.64.43,172.233.64.37,172.233.64.40,172.233.64.46,172.233.64.41,172.233.64.39,172.233.64.42,172.233.64.45,172.233.64.38", + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "172.233.64.44,172.233.64.43,172.233.64.37,172.233.64.40,172.233.64.46,172.233.64.41,172.233.64.39,172.233.64.42,172.233.64.45,172.233.64.38", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "it-mil", @@ -359,9 +369,9 @@ interactions: "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance - Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases"], - "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": - {"ipv4": "172.232.192.19,172.232.192.18,172.232.192.16,172.232.192.20,172.232.192.24,172.232.192.21,172.232.192.22,172.232.192.17,172.232.192.15,172.232.192.23", + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "172.232.192.19,172.232.192.18,172.232.192.16,172.232.192.20,172.232.192.24,172.232.192.21,172.232.192.22,172.232.192.17,172.232.192.15,172.232.192.23", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "us-central", @@ -369,9 +379,9 @@ interactions: Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", "Managed Databases", "Metadata", "Placement Group", "StackScripts", "Maintenance - Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases"], - "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": - {"ipv4": "72.14.179.5,72.14.188.5,173.255.199.5,66.228.53.5,96.126.122.5,96.126.124.5,96.126.127.5,198.58.107.5,198.58.111.5,23.239.24.5", + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "72.14.179.5,72.14.188.5,173.255.199.5,66.228.53.5,96.126.122.5,96.126.124.5,96.126.127.5,198.58.107.5,198.58.111.5,23.239.24.5", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "ap-northeast", @@ -379,9 +389,9 @@ interactions: Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", "Managed Databases", "Metadata", "Placement Group", "StackScripts", "Maintenance - Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases"], - "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": - {"ipv4": "139.162.66.5,139.162.67.5,139.162.68.5,139.162.69.5,139.162.70.5,139.162.71.5,139.162.72.5,139.162.73.5,139.162.74.5,139.162.75.5", + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "139.162.66.5,139.162.67.5,139.162.68.5,139.162.69.5,139.162.70.5,139.162.71.5,139.162.72.5,139.162.73.5,139.162.74.5,139.162.75.5", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "eu-central", @@ -390,8 +400,8 @@ interactions: "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", "Managed Databases", "Metadata", "Placement Group", "StackScripts", "Maintenance Policy", "Linode Interfaces"], "monitors": - {"alerts": ["Managed Databases"], "metrics": ["Managed Databases", "NodeBalancers"]}, - "status": "ok", "resolvers": {"ipv4": "139.162.130.5,139.162.131.5,139.162.132.5,139.162.133.5,139.162.134.5,139.162.135.5,139.162.136.5,139.162.137.5,139.162.138.5,139.162.139.5", + {"alerts": ["Managed Databases", "NodeBalancers"], "metrics": ["Managed Databases", + "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "139.162.130.5,139.162.131.5,139.162.132.5,139.162.133.5,139.162.134.5,139.162.135.5,139.162.136.5,139.162.137.5,139.162.138.5,139.162.139.5", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "ap-south", @@ -399,8 +409,8 @@ interactions: Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", "Metadata", "Placement Group", "StackScripts", - "Maintenance Policy", "Linode Interfaces"], "monitors": {"alerts": [], "metrics": - ["NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "139.162.11.5,139.162.13.5,139.162.14.5,139.162.15.5,139.162.16.5,139.162.21.5,139.162.27.5,103.3.60.18,103.3.60.19,103.3.60.20", + "Maintenance Policy", "Linode Interfaces"], "monitors": {"alerts": ["NodeBalancers"], + "metrics": ["NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "139.162.11.5,139.162.13.5,139.162.14.5,139.162.15.5,139.162.16.5,139.162.21.5,139.162.27.5,103.3.60.18,103.3.60.19,103.3.60.20", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "eu-west", @@ -408,20 +418,20 @@ interactions: Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", "Metadata", "Placement Group", "StackScripts", "Maintenance Policy", "Linode - Interfaces"], "monitors": {"alerts": [], "metrics": ["NodeBalancers"]}, "status": - "ok", "resolvers": {"ipv4": "178.79.182.5, 176.58.107.5, 176.58.116.5, 176.58.121.5, - 151.236.220.5, 212.71.252.5, 212.71.253.5, 109.74.192.20, 109.74.193.20, 109.74.194.20", - "ipv6": "1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678"}, "placement_group_limits": - {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": - 5}, "site_type": "core"}, {"id": "us-east", "label": "Newark, NJ", "country": - "us", "capabilities": ["Linodes", "Block Storage Encryption", "LA Disk Encryption", - "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", "Object Storage", - "GPU Linodes", "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", - "Managed Databases", "Metadata", "Placement Group", "StackScripts", "Maintenance - Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases"], - "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": - {"ipv4": "66.228.42.5,96.126.106.5,50.116.53.5,50.116.58.5,50.116.61.5,50.116.62.5,66.175.211.5,97.107.133.4,173.255.225.5,66.228.35.5", + Interfaces"], "monitors": {"alerts": ["NodeBalancers"], "metrics": ["NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "178.79.182.5, 176.58.107.5, 176.58.116.5, + 176.58.121.5, 151.236.220.5, 212.71.252.5, 212.71.253.5, 109.74.192.20, 109.74.193.20, + 109.74.194.20", "ipv6": "1234::5678, 1234::5678, 1234::5678, 1234::5678, + 1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "us-east", + "label": "Newark, NJ", "country": "us", "capabilities": ["Linodes", "Block Storage + Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Cloud Firewall", + "Vlans", "Block Storage Migrations", "Managed Databases", "Metadata", "Placement + Group", "StackScripts", "Maintenance Policy", "Linode Interfaces"], "monitors": + {"alerts": ["Managed Databases", "NodeBalancers"], "metrics": ["Managed Databases", + "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "66.228.42.5,96.126.106.5,50.116.53.5,50.116.58.5,50.116.61.5,50.116.62.5,66.175.211.5,97.107.133.4,173.255.225.5,66.228.35.5", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "us-southeast", @@ -430,8 +440,8 @@ interactions: "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", "Managed Databases", "Metadata", "Placement Group", "StackScripts", "Maintenance Policy", "Linode Interfaces"], "monitors": - {"alerts": ["Managed Databases"], "metrics": ["Managed Databases", "NodeBalancers"]}, - "status": "ok", "resolvers": {"ipv4": "74.207.231.5,173.230.128.5,173.230.129.5,173.230.136.5,173.230.140.5,66.228.59.5,66.228.62.5,50.116.35.5,50.116.41.5,23.239.18.5", + {"alerts": ["Managed Databases", "NodeBalancers"], "metrics": ["Managed Databases", + "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "74.207.231.5,173.230.128.5,173.230.129.5,173.230.136.5,173.230.140.5,66.228.59.5,66.228.62.5,50.116.35.5,50.116.41.5,23.239.18.5", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "us-west", @@ -439,14 +449,14 @@ interactions: Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", "Managed Databases", "Metadata", "Placement Group", "StackScripts", "Maintenance - Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases"], - "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": - {"ipv4": "173.230.145.5, 173.230.147.5, 173.230.155.5, 173.255.212.5, 173.255.219.5, - 173.255.241.5, 173.255.243.5, 173.255.244.5, 74.207.241.5, 74.207.242.5", "ipv6": - "1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678, 1234::5678"}, "placement_group_limits": + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "173.230.145.5, 173.230.147.5, 173.230.155.5, 173.255.212.5, + 173.255.219.5, 173.255.241.5, 173.255.243.5, 173.255.244.5, 74.207.241.5, 74.207.242.5", + "ipv6": "1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678, + 1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": - 5}, "site_type": "core"}], "page": 1, "pages": 1, "results": 46}' + 5}, "site_type": "core"}], "page": 1, "pages": 1, "results": 47}' headers: Access-Control-Allow-Credentials: - "true" @@ -469,7 +479,7 @@ interactions: Content-Type: - application/json Expires: - - Wed, 04 Mar 2026 22:50:33 GMT + - Tue, 05 May 2026 23:45:15 GMT Pragma: - no-cache Strict-Transport-Security: @@ -495,134 +505,7 @@ interactions: code: 200 duration: "" - request: - body: "" - form: {} - headers: - Accept: - - application/json - Content-Type: - - application/json - User-Agent: - - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/account/availability?page=1 - method: GET - response: - body: '{"data": [{"region": "us-central", "available": ["Linodes", "NodeBalancers", - "Block Storage", "Kubernetes"], "unavailable": []}, {"region": "us-west", "available": - ["Linodes", "NodeBalancers", "Block Storage", "Kubernetes"], "unavailable": - []}, {"region": "us-southeast", "available": ["Linodes", "NodeBalancers", "Block - Storage", "Kubernetes"], "unavailable": []}, {"region": "us-east", "available": - ["Linodes", "NodeBalancers", "Block Storage", "Kubernetes"], "unavailable": - []}, {"region": "eu-west", "available": [], "unavailable": ["Linodes", "NodeBalancers", - "Block Storage", "Kubernetes"]}, {"region": "ap-south", "available": ["Linodes", - "NodeBalancers", "Block Storage", "Kubernetes"], "unavailable": []}, {"region": - "eu-central", "available": ["Linodes", "NodeBalancers", "Block Storage", "Kubernetes"], - "unavailable": []}, {"region": "ap-northeast", "available": ["Linodes", "NodeBalancers", - "Block Storage", "Kubernetes"], "unavailable": []}, {"region": "ap-west", "available": - ["Linodes", "NodeBalancers", "Block Storage", "Kubernetes"], "unavailable": - []}, {"region": "ca-central", "available": ["Linodes", "NodeBalancers", "Block - Storage", "Kubernetes"], "unavailable": []}, {"region": "ap-southeast", "available": - ["Linodes", "NodeBalancers", "Block Storage", "Kubernetes"], "unavailable": - []}, {"region": "us-iad", "available": ["Linodes", "NodeBalancers", "Block Storage", - "Kubernetes"], "unavailable": []}, {"region": "us-ord", "available": ["Linodes", - "NodeBalancers", "Block Storage", "Kubernetes"], "unavailable": []}, {"region": - "fr-par", "available": ["Linodes", "NodeBalancers", "Block Storage", "Kubernetes"], - "unavailable": []}, {"region": "us-sea", "available": ["Linodes", "NodeBalancers", - "Block Storage", "Kubernetes"], "unavailable": []}, {"region": "br-gru", "available": - ["Linodes", "NodeBalancers", "Block Storage", "Kubernetes"], "unavailable": - []}, {"region": "nl-ams", "available": ["Linodes", "NodeBalancers", "Block Storage", - "Kubernetes"], "unavailable": []}, {"region": "se-sto", "available": ["Linodes", - "NodeBalancers", "Block Storage", "Kubernetes"], "unavailable": []}, {"region": - "es-mad", "available": ["Linodes", "Kubernetes"], "unavailable": ["NodeBalancers", - "Block Storage"]}, {"region": "in-maa", "available": ["Linodes", "NodeBalancers", - "Block Storage", "Kubernetes"], "unavailable": []}, {"region": "jp-osa", "available": - ["Linodes", "NodeBalancers", "Block Storage", "Kubernetes"], "unavailable": - []}, {"region": "it-mil", "available": ["Linodes", "NodeBalancers", "Block Storage", - "Kubernetes"], "unavailable": []}, {"region": "us-mia", "available": ["Linodes", - "NodeBalancers", "Block Storage", "Kubernetes"], "unavailable": []}, {"region": - "id-cgk", "available": ["Linodes", "NodeBalancers", "Block Storage", "Kubernetes"], - "unavailable": []}, {"region": "us-lax", "available": ["Linodes", "NodeBalancers", - "Block Storage", "Kubernetes"], "unavailable": []}, {"region": "nz-akl-1", "available": - ["Linodes", "NodeBalancers", "Block Storage", "Kubernetes"], "unavailable": - []}, {"region": "us-den-1", "available": ["Linodes"], "unavailable": ["NodeBalancers", - "Block Storage", "Kubernetes"]}, {"region": "de-ham-1", "available": ["Linodes"], - "unavailable": ["NodeBalancers", "Block Storage", "Kubernetes"]}, {"region": - "za-jnb-1", "available": ["Linodes"], "unavailable": ["NodeBalancers", "Block - Storage", "Kubernetes"]}, {"region": "my-kul-1", "available": ["Linodes"], "unavailable": - ["NodeBalancers", "Block Storage", "Kubernetes"]}, {"region": "co-bog-1", "available": - ["Linodes"], "unavailable": ["NodeBalancers", "Block Storage", "Kubernetes"]}, - {"region": "mx-qro-1", "available": ["Linodes"], "unavailable": ["NodeBalancers", - "Block Storage", "Kubernetes"]}, {"region": "us-hou-1", "available": ["Linodes"], - "unavailable": ["NodeBalancers", "Block Storage", "Kubernetes"]}, {"region": - "cl-scl-1", "available": ["Linodes"], "unavailable": ["NodeBalancers", "Block - Storage", "Kubernetes"]}, {"region": "gb-lon", "available": ["Linodes", "NodeBalancers", - "Block Storage", "Kubernetes"], "unavailable": []}, {"region": "au-mel", "available": - ["Linodes", "Kubernetes"], "unavailable": ["NodeBalancers", "Block Storage"]}, - {"region": "in-bom-2", "available": ["Linodes", "NodeBalancers", "Block Storage", - "Kubernetes"], "unavailable": []}, {"region": "de-fra-2", "available": ["Linodes", - "NodeBalancers", "Block Storage", "Kubernetes"], "unavailable": []}, {"region": - "sg-sin-2", "available": ["Linodes", "NodeBalancers", "Block Storage", "Kubernetes"], - "unavailable": []}, {"region": "jp-tyo-3", "available": ["Linodes", "NodeBalancers", - "Block Storage", "Kubernetes"], "unavailable": []}, {"region": "de-ber-1", "available": - ["Linodes", "NodeBalancers", "Block Storage", "Kubernetes"], "unavailable": - []}, {"region": "no-osl-1", "available": ["Linodes", "NodeBalancers", "Block - Storage", "Kubernetes"], "unavailable": []}, {"region": "us-iad-2", "available": - ["Linodes", "NodeBalancers", "Block Storage", "Kubernetes"], "unavailable": - []}, {"region": "fr-par-2", "available": ["Linodes", "NodeBalancers", "Block - Storage", "Kubernetes"], "unavailable": []}, {"region": "co-bog-2", "available": - ["Linodes", "NodeBalancers", "Block Storage", "Kubernetes"], "unavailable": - []}, {"region": "fr-mrs-2", "available": ["Linodes", "NodeBalancers", "Block - Storage", "Kubernetes"], "unavailable": []}], "page": 1, "pages": 1, "results": - 46}' - headers: - Access-Control-Allow-Credentials: - - "true" - Access-Control-Allow-Headers: - - Authorization, Origin, X-Requested-With, Content-Type, Accept, X-Filter - Access-Control-Allow-Methods: - - HEAD, GET, OPTIONS, POST, PUT, DELETE - Access-Control-Allow-Origin: - - '*' - Access-Control-Expose-Headers: - - X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Status - Akamai-Internal-Account: - - '*' - Cache-Control: - - max-age=0, no-cache, no-store - Connection: - - keep-alive - Content-Security-Policy: - - default-src 'none' - Content-Type: - - application/json - Expires: - - Wed, 04 Mar 2026 22:50:33 GMT - Pragma: - - no-cache - Strict-Transport-Security: - - max-age=31536000 - Vary: - - Authorization, X-Filter - - Authorization, X-Filter - - Accept-Encoding - X-Accepted-Oauth-Scopes: - - account:read_only - X-Content-Type-Options: - - nosniff - X-Frame-Options: - - DENY - - DENY - X-Oauth-Scopes: - - '*' - X-Ratelimit-Limit: - - "1840" - X-Xss-Protection: - - 1; mode=block - status: 200 OK - code: 200 - duration: "" -- request: - body: '{"region":"au-mel","type":"g6-nanode-1","label":"go-test-ins-q27m167oya7q","root_pass":"1;N2vve+~7TsyXbvPJ60+J45mmmM09d,V5U.[j;(Qf+AeZNn7*7K5+D6M:8f|@`7","image":"linode/debian12","booted":false}' + body: '{"region":"au-mel","type":"g6-nanode-1","label":"go-test-ins-507phxdcj126","root_pass":"brgTP0601\u0026(X8?Ty687zxJD:)$Up|CwMf1''R8sa\u0026b}5`9UXg\u0026gWV8[|G\u003e9B''41ki","image":"linode/debian12","booted":false}' form: {} headers: Accept: @@ -634,19 +517,19 @@ interactions: url: https://api.linode.com/v4beta/linode/instances method: POST response: - body: '{"id": 93152753, "label": "go-test-ins-q27m167oya7q", "group": "", "status": + body: '{"id": 97185937, "label": "go-test-ins-507phxdcj126", "group": "", "status": "provisioning", "created": "2018-01-02T03:04:05", "updated": "2018-01-02T03:04:05", - "type": "g6-nanode-1", "ipv4": ["172.236.44.156"], "ipv6": "1234::5678/128", + "type": "g6-nanode-1", "ipv4": ["172.236.33.27"], "ipv6": "1234::5678/128", "image": "linode/debian12", "region": "au-mel", "site_type": "core", "specs": {"disk": 25600, "memory": 1024, "vcpus": 1, "gpus": 0, "transfer": 1000, "accelerated_devices": 0}, "alerts": {"cpu": 90, "network_in": 10, "network_out": 10, "transfer_quota": - 80, "io": 10000}, "backups": {"enabled": false, "available": false, "schedule": - {"day": null, "window": null}, "last_successful": null}, "hypervisor": "kvm", - "watchdog_enabled": true, "tags": [], "host_uuid": "e6fb7e51a1d7b36635dda16eb686150d00ac7289", - "has_user_data": false, "placement_group": null, "disk_encryption": "enabled", - "lke_cluster_id": null, "capabilities": ["Block Storage Encryption", "SMTP Enabled", - "Maintenance Policy"], "interface_generation": "legacy_config", "maintenance_policy": - "linode/migrate", "locks": []}' + 80, "io": 10000, "system_alerts": [], "user_alerts": []}, "backups": {"enabled": + false, "available": false, "schedule": {"day": null, "window": null}, "last_successful": + null}, "hypervisor": "kvm", "watchdog_enabled": true, "tags": [], "host_uuid": + "7c21ff8b1596655206e1b4c6bc4f1c8ebd03c68c", "has_user_data": false, "placement_group": + null, "disk_encryption": "enabled", "lke_cluster_id": null, "capabilities": + ["Block Storage Encryption", "SMTP Enabled", "Maintenance Policy"], "interface_generation": + "legacy_config", "maintenance_policy": "linode/migrate", "locks": []}' headers: Access-Control-Allow-Credentials: - "true" @@ -669,7 +552,7 @@ interactions: Content-Type: - application/json Expires: - - Wed, 04 Mar 2026 22:50:35 GMT + - Tue, 05 May 2026 23:45:17 GMT Pragma: - no-cache Strict-Transport-Security: @@ -706,7 +589,7 @@ interactions: url: https://api.linode.com/v4beta/networking/firewalls method: POST response: - body: '{"id": 3913123, "label": "linodego-fw-test", "created": "2018-01-02T03:04:05", + body: '{"id": 9618589, "label": "linodego-fw-test", "created": "2018-01-02T03:04:05", "updated": "2018-01-02T03:04:05", "status": "enabled", "rules": {"inbound": [{"protocol": "TCP", "addresses": {"ipv6": ["1234::5678/0"], "ipv4": ["0.0.0.0/0"]}, "action": "ACCEPT", "label": "go-fwrule-test", "ports": "22"}], "inbound_policy": @@ -738,7 +621,7 @@ interactions: Content-Type: - application/json Expires: - - Wed, 04 Mar 2026 22:50:35 GMT + - Tue, 05 May 2026 23:45:17 GMT Pragma: - no-cache Strict-Transport-Security: @@ -762,7 +645,7 @@ interactions: code: 200 duration: "" - request: - body: '{"id":93152753,"type":"linode"}' + body: '{"id":97185937,"type":"linode"}' form: {} headers: Accept: @@ -771,12 +654,12 @@ interactions: - application/json User-Agent: - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/networking/firewalls/3913123/devices + url: https://api.linode.com/v4beta/networking/firewalls/9618589/devices method: POST response: - body: '{"id": 10483434, "created": "2018-01-02T03:04:05", "updated": "2018-01-02T03:04:05", - "entity": {"id": 93152753, "type": "linode", "label": "go-test-ins-q27m167oya7q", - "url": "/v4/linode/instances/93152753", "parent_entity": null}}' + body: '{"id": 11909959, "created": "2018-01-02T03:04:05", "updated": "2018-01-02T03:04:05", + "entity": {"id": 97185937, "type": "linode", "label": "go-test-ins-507phxdcj126", + "url": "/v4/linode/instances/97185937", "parent_entity": null}}' headers: Access-Control-Allow-Credentials: - "true" @@ -801,7 +684,7 @@ interactions: Content-Type: - application/json Expires: - - Wed, 04 Mar 2026 22:50:35 GMT + - Tue, 05 May 2026 23:45:17 GMT Pragma: - no-cache Strict-Transport-Security: @@ -834,12 +717,12 @@ interactions: - application/json User-Agent: - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/networking/firewalls/3913123/devices/10483434 + url: https://api.linode.com/v4beta/networking/firewalls/9618589/devices/11909959 method: GET response: - body: '{"id": 10483434, "created": "2018-01-02T03:04:05", "updated": "2018-01-02T03:04:05", - "entity": {"id": 93152753, "type": "linode", "label": "go-test-ins-q27m167oya7q", - "url": "/v4/linode/instances/93152753", "parent_entity": null}}' + body: '{"id": 11909959, "created": "2018-01-02T03:04:05", "updated": "2018-01-02T03:04:05", + "entity": {"id": 97185937, "type": "linode", "label": "go-test-ins-507phxdcj126", + "url": "/v4/linode/instances/97185937", "parent_entity": null}}' headers: Access-Control-Allow-Credentials: - "true" @@ -864,7 +747,7 @@ interactions: Content-Type: - application/json Expires: - - Wed, 04 Mar 2026 22:50:36 GMT + - Tue, 05 May 2026 23:45:18 GMT Pragma: - no-cache Strict-Transport-Security: @@ -898,18 +781,18 @@ interactions: - application/json User-Agent: - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/networking/firewalls/3913123 + url: https://api.linode.com/v4beta/networking/firewalls/9618589 method: GET response: - body: '{"id": 3913123, "label": "linodego-fw-test", "created": "2018-01-02T03:04:05", + body: '{"id": 9618589, "label": "linodego-fw-test", "created": "2018-01-02T03:04:05", "updated": "2018-01-02T03:04:05", "status": "enabled", "rules": {"inbound": [{"protocol": "TCP", "addresses": {"ipv6": ["1234::5678/0"], "ipv4": ["0.0.0.0/0"]}, "action": "ACCEPT", "label": "go-fwrule-test", "ports": "22"}], "inbound_policy": "ACCEPT", "outbound": [{"protocol": "TCP", "addresses": {"ipv6": ["1234::5678/0"], "ipv4": ["0.0.0.0/0"]}, "action": "ACCEPT", "label": "go-fwrule-test", "ports": "22"}], "outbound_policy": "ACCEPT", "version": 1, "fingerprint": "7bcc0f03"}, "tags": - ["testing"], "entities": [{"id": 93152753, "type": "linode", "label": "go-test-ins-q27m167oya7q", - "url": "/v4/linode/instances/93152753", "parent_entity": null}]}' + ["testing"], "entities": [{"id": 97185937, "type": "linode", "label": "go-test-ins-507phxdcj126", + "url": "/v4/linode/instances/97185937", "parent_entity": null}]}' headers: Access-Control-Allow-Credentials: - "true" @@ -934,7 +817,7 @@ interactions: Content-Type: - application/json Expires: - - Wed, 04 Mar 2026 22:50:36 GMT + - Tue, 05 May 2026 23:45:18 GMT Pragma: - no-cache Strict-Transport-Security: @@ -968,7 +851,7 @@ interactions: - application/json User-Agent: - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/networking/firewalls/3913123 + url: https://api.linode.com/v4beta/networking/firewalls/9618589 method: DELETE response: body: '{}' @@ -996,7 +879,7 @@ interactions: Content-Type: - application/json Expires: - - Wed, 04 Mar 2026 22:50:36 GMT + - Tue, 05 May 2026 23:45:18 GMT Pragma: - no-cache Strict-Transport-Security: @@ -1029,7 +912,7 @@ interactions: - application/json User-Agent: - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/linode/instances/93152753 + url: https://api.linode.com/v4beta/linode/instances/97185937 method: DELETE response: body: '{}' @@ -1057,7 +940,7 @@ interactions: Content-Type: - application/json Expires: - - Wed, 04 Mar 2026 22:50:37 GMT + - Tue, 05 May 2026 23:45:19 GMT Pragma: - no-cache Strict-Transport-Security: diff --git a/test/integration/fixtures/TestFirewallDevices_List.yaml b/test/integration/fixtures/TestFirewallDevices_List.yaml index 5ce84fbf9..1e827c47d 100644 --- a/test/integration/fixtures/TestFirewallDevices_List.yaml +++ b/test/integration/fixtures/TestFirewallDevices_List.yaml @@ -30,74 +30,75 @@ interactions: "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", "NETINT Quadra - T1U", "Maintenance Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed - Databases"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", - "resolvers": {"ipv4": "172.233.128.45,172.233.128.38,172.233.128.53,172.233.128.37,172.233.128.34,172.233.128.36,172.233.128.33,172.233.128.39,172.233.128.43,172.233.128.44", + T1U", "Maintenance Policy", "Linode Interfaces", "ACLP Logs Datacenter LKE-E"], + "monitors": {"alerts": ["Managed Databases", "NodeBalancers"], "metrics": ["Managed + Databases", "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "172.233.128.45,172.233.128.38,172.233.128.53,172.233.128.37,172.233.128.34,172.233.128.36,172.233.128.33,172.233.128.39,172.233.128.43,172.233.128.44", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "nz-akl-1", "label": "Auckland, NZ", "country": "nz", "capabilities": ["Linodes", "Disk - Encryption", "Cloud Firewall", "Vlans", "VPCs", "Metadata", "Distributed Plans", - "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": - "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", "Maintenance + Policy"], "monitors": {"alerts": [], "metrics": []}, "status": "ok", "resolvers": + {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": "us-den-1", "label": "Denver, CO", "country": "us", "capabilities": ["Linodes", - "Disk Encryption", "Cloud Firewall", "Vlans", "VPCs", "Metadata", "Distributed - Plans", "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": + "Disk Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", + "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": "de-ham-1", "label": "Hamburg, DE", "country": "de", "capabilities": ["Linodes", - "Disk Encryption", "Cloud Firewall", "Vlans", "VPCs", "Metadata", "Distributed - Plans", "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": + "Disk Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", + "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": "za-jnb-1", "label": "Johannesburg, ZA", "country": "za", "capabilities": ["Linodes", - "Disk Encryption", "Cloud Firewall", "Vlans", "VPCs", "Metadata", "Distributed - Plans", "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": + "Disk Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", + "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": "my-kul-1", "label": "Kuala Lumpur, MY", "country": "my", "capabilities": ["Linodes", - "Disk Encryption", "Cloud Firewall", "Vlans", "VPCs", "Metadata", "Distributed - Plans", "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": + "Disk Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", + "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": "co-bog-1", "label": "Bogot\u00e1, CO", "country": "co", "capabilities": ["Linodes", - "Disk Encryption", "Cloud Firewall", "Vlans", "VPCs", "Metadata", "Distributed - Plans", "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": + "Disk Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", + "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": "mx-qro-1", "label": "Quer\u00e9taro, MX", "country": "mx", "capabilities": - ["Linodes", "Disk Encryption", "Cloud Firewall", "Vlans", "VPCs", "Metadata", - "Distributed Plans", "Maintenance Policy"], "monitors": {"alerts": [], "metrics": - []}, "status": "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", - "ipv6": "1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": - 0, "maximum_linodes_per_pg": 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": - "distributed"}, {"id": "us-hou-1", "label": "Houston, TX", "country": "us", - "capabilities": ["Linodes", "Disk Encryption", "Cloud Firewall", "Vlans", "VPCs", - "Metadata", "Distributed Plans", "Maintenance Policy"], "monitors": {"alerts": - [], "metrics": []}, "status": "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", - "ipv6": "1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": - 0, "maximum_linodes_per_pg": 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": - "distributed"}, {"id": "cl-scl-1", "label": "Santiago, CL", "country": "cl", - "capabilities": ["Linodes", "Disk Encryption", "Cloud Firewall", "Vlans", "VPCs", - "Metadata", "Distributed Plans", "Maintenance Policy"], "monitors": {"alerts": - [], "metrics": []}, "status": "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", - "ipv6": "1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": - 0, "maximum_linodes_per_pg": 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": - "distributed"}, {"id": "gb-lon", "label": "London 2, UK", "country": "gb", "capabilities": - ["Linodes", "Block Storage Encryption", "LA Disk Encryption", "Disk Encryption", - "Backups", "NodeBalancers", "Block Storage", "Object Storage", "GPU Linodes", - "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC - Dual Stack", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", - "StackScripts", "NETINT Quadra T1U", "Maintenance Policy", "Linode Interfaces"], - "monitors": {"alerts": ["Managed Databases"], "metrics": ["Managed Databases", - "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "172.236.0.46,172.236.0.50,172.236.0.47,172.236.0.53,172.236.0.52,172.236.0.45,172.236.0.49,172.236.0.51,172.236.0.54,172.236.0.48", + ["Linodes", "Disk Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed + Plans", "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": + "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": + 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": + "us-hou-1", "label": "Houston, TX", "country": "us", "capabilities": ["Linodes", + "Disk Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", + "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": + "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": + 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": + "cl-scl-1", "label": "Santiago, CL", "country": "cl", "capabilities": ["Linodes", + "Disk Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", + "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": + "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": + 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": + "gb-lon", "label": "London 2, UK", "country": "gb", "capabilities": ["Linodes", + "Block Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", + "NodeBalancers", "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", + "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", + "Managed Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", + "NETINT Quadra T1U", "Maintenance Policy", "Linode Interfaces", "ACLP Logs Datacenter + LKE-E"], "monitors": {"alerts": ["Managed Databases", "NodeBalancers"], "metrics": + ["Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": + "172.236.0.46,172.236.0.50,172.236.0.47,172.236.0.53,172.236.0.52,172.236.0.45,172.236.0.49,172.236.0.51,172.236.0.54,172.236.0.48", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "id-cgk", @@ -106,20 +107,20 @@ interactions: "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance - Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases"], - "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": - {"ipv4": "172.232.224.23,172.232.224.32,172.232.224.26,172.232.224.27,172.232.224.21,172.232.224.24,172.232.224.22,172.232.224.20,172.232.224.31,172.232.224.28", + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "172.232.224.23,172.232.224.32,172.232.224.26,172.232.224.27,172.232.224.21,172.232.224.24,172.232.224.22,172.232.224.20,172.232.224.31,172.232.224.28", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "in-bom-2", "label": "Mumbai 2, IN", "country": "in", "capabilities": ["Linodes", "Block Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", - "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes - Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", - "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance - Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases"], - "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": - {"ipv4": "172.236.171.41,172.236.171.42,172.236.171.25,172.236.171.44,172.236.171.26,172.236.171.45,172.236.171.24,172.236.171.43,172.236.171.27,172.236.171.28", + "Block Storage", "GPU Linodes", "Kubernetes", "Kubernetes Enterprise", "Cloud + Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", + "Premium Plans", "Placement Group", "StackScripts", "Maintenance Policy", "Linode + Interfaces", "ACLP Logs Datacenter LKE-E"], "monitors": {"alerts": ["Managed + Databases", "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "172.236.171.41,172.236.171.42,172.236.171.25,172.236.171.44,172.236.171.26,172.236.171.45,172.236.171.24,172.236.171.43,172.236.171.27,172.236.171.28", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "de-fra-2", @@ -128,9 +129,9 @@ interactions: "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", "NETINT Quadra - T1U", "Maintenance Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed - Databases"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", - "resolvers": {"ipv4": "172.236.203.9,172.236.203.16,172.236.203.19,172.236.203.15,172.236.203.17,172.236.203.11,172.236.203.18,172.236.203.14,172.236.203.13,172.236.203.12", + T1U", "Maintenance Policy", "Linode Interfaces", "ACLP Logs Datacenter LKE-E"], + "monitors": {"alerts": ["Managed Databases", "NodeBalancers"], "metrics": ["Managed + Databases", "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "172.236.203.9,172.236.203.16,172.236.203.19,172.236.203.15,172.236.203.17,172.236.203.11,172.236.203.18,172.236.203.14,172.236.203.13,172.236.203.12", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "sg-sin-2", @@ -139,9 +140,9 @@ interactions: "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance - Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases"], - "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": - {"ipv4": "172.236.129.8,172.236.129.42,172.236.129.41,172.236.129.19,172.236.129.46,172.236.129.23,172.236.129.48,172.236.129.20,172.236.129.21,172.236.129.47", + Policy", "Linode Interfaces", "ACLP Logs Datacenter LKE-E"], "monitors": {"alerts": + ["Managed Databases", "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "172.236.129.8,172.236.129.42,172.236.129.41,172.236.129.19,172.236.129.46,172.236.129.23,172.236.129.48,172.236.129.20,172.236.129.21,172.236.129.47", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "jp-tyo-3", @@ -150,25 +151,26 @@ interactions: "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance - Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases"], - "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": - {"ipv4": "172.237.4.15,172.237.4.19,172.237.4.17,172.237.4.21,172.237.4.16,172.237.4.18,172.237.4.23,172.237.4.24,172.237.4.20,172.237.4.14", + Policy", "Linode Interfaces", "ACLP Logs Datacenter LKE-E"], "monitors": {"alerts": + ["Managed Databases", "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "172.237.4.15,172.237.4.19,172.237.4.17,172.237.4.21,172.237.4.16,172.237.4.18,172.237.4.23,172.237.4.24,172.237.4.20,172.237.4.14", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "de-ber-1", "label": "Berlin, DE", "country": "de", "capabilities": ["Linodes", "Disk Encryption", - "Cloud Firewall", "Vlans", "VPCs", "Metadata", "Distributed Plans", "Maintenance - Policy"], "monitors": {"alerts": [], "metrics": []}, "status": "ok", "resolvers": - {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", "Maintenance Policy"], + "monitors": {"alerts": [], "metrics": []}, "status": "ok", "resolvers": {"ipv4": + "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": "no-osl-1", "label": "Oslo, NO", "country": "no", "capabilities": ["Linodes", "Block Storage Encryption", "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", "Object Storage", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", "Premium - Plans", "Placement Group", "StackScripts", "Maintenance Policy", "Linode Interfaces"], - "monitors": {"alerts": ["Managed Databases", "NodeBalancers"], "metrics": ["Managed - Databases", "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "172.238.140.33,172.238.140.25,172.238.140.30,172.238.140.31,172.238.140.26,172.238.140.28,172.238.140.34,172.238.140.32,172.238.140.27,172.238.140.29", + Plans", "Placement Group", "StackScripts", "Maintenance Policy", "Linode Interfaces", + "ACLP Logs Datacenter LKE-E"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "172.238.140.33,172.238.140.25,172.238.140.30,172.238.140.31,172.238.140.26,172.238.140.28,172.238.140.34,172.238.140.32,172.238.140.27,172.238.140.29", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "us-iad-2", @@ -177,30 +179,37 @@ interactions: "Object Storage", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance Policy", "Linode Interfaces"], - "monitors": {"alerts": ["Managed Databases"], "metrics": ["Managed Databases", - "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "172.239.142.102,172.239.142.89,172.239.142.92,172.239.142.87,172.239.142.88,172.239.142.103,172.239.142.91,172.239.142.90,172.239.142.86,172.239.142.100", + "monitors": {"alerts": ["Managed Databases", "NodeBalancers"], "metrics": ["Managed + Databases", "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "172.239.142.102,172.239.142.89,172.239.142.92,172.239.142.87,172.239.142.88,172.239.142.103,172.239.142.91,172.239.142.90,172.239.142.86,172.239.142.100", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "fr-par-2", "label": "Paris 2, FR", "country": "fr", "capabilities": ["Linodes", "Block Storage Encryption", "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", - "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes Enterprise", "Cloud - Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", - "Premium Plans", "Placement Group", "StackScripts", "Maintenance Policy", "Linode - Interfaces"], "monitors": {"alerts": ["Managed Databases"], "metrics": ["Managed - Databases", "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "172.239.11.24,172.239.11.22,172.239.11.17,172.239.11.20,172.239.11.23,172.239.11.19,172.239.11.21,172.239.11.15,172.239.11.16,172.239.11.18", + "GPU Linodes", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", + "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", "Premium Plans", + "Placement Group", "StackScripts", "Maintenance Policy", "Linode Interfaces", + "ACLP Logs Datacenter LKE-E"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "172.239.11.24,172.239.11.22,172.239.11.17,172.239.11.20,172.239.11.23,172.239.11.19,172.239.11.21,172.239.11.15,172.239.11.16,172.239.11.18", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "us-rno-1", + "label": "Reno, NV", "country": "us", "capabilities": ["Linodes", "Disk Encryption", + "Backups", "NodeBalancers", "GPU Linodes", "Metadata", "Premium Plans", "Placement + Group", "StackScripts", "Maintenance Policy"], "monitors": {"alerts": ["NodeBalancers"], + "metrics": ["NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "", "ipv6": + ""}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "co-bog-2", "label": "Bogot\u00e1 2, CO", "country": "co", "capabilities": ["Linodes", "Disk - Encryption", "Cloud Firewall", "Vlans", "VPCs", "Metadata", "Distributed Plans", - "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": - "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", "Maintenance + Policy"], "monitors": {"alerts": [], "metrics": []}, "status": "ok", "resolvers": + {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": "fr-mrs-2", "label": "Marseille 2, FR", "country": "fr", "capabilities": ["Linodes", - "Disk Encryption", "Cloud Firewall", "Vlans", "VPCs", "Metadata", "Distributed - Plans", "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": + "Disk Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", + "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": @@ -210,8 +219,8 @@ interactions: "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", "NETINT Quadra T1U", "Maintenance Policy", "Linode Interfaces"], "monitors": - {"alerts": ["Managed Databases"], "metrics": ["Managed Databases", "NodeBalancers"]}, - "status": "ok", "resolvers": {"ipv4": "172.233.160.34,172.233.160.27,172.233.160.30,172.233.160.29,172.233.160.32,172.233.160.28,172.233.160.33,172.233.160.26,172.233.160.25,172.233.160.31", + {"alerts": ["Managed Databases", "NodeBalancers"], "metrics": ["Managed Databases", + "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "172.233.160.34,172.233.160.27,172.233.160.30,172.233.160.29,172.233.160.32,172.233.160.28,172.233.160.33,172.233.160.26,172.233.160.25,172.233.160.31", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "ap-west", @@ -220,8 +229,8 @@ interactions: "Block Storage", "GPU Linodes", "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", "Managed Databases", "Metadata", "Placement Group", "StackScripts", "Maintenance Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed - Databases"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", - "resolvers": {"ipv4": "172.105.34.5,172.105.35.5,172.105.36.5,172.105.37.5,172.105.38.5,172.105.39.5,172.105.40.5,172.105.41.5,172.105.42.5,172.105.43.5", + Databases", "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "172.105.34.5,172.105.35.5,172.105.36.5,172.105.37.5,172.105.38.5,172.105.39.5,172.105.40.5,172.105.41.5,172.105.42.5,172.105.43.5", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "ca-central", @@ -230,8 +239,8 @@ interactions: "Block Storage", "GPU Linodes", "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", "Managed Databases", "Metadata", "Placement Group", "StackScripts", "Maintenance Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed - Databases"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", - "resolvers": {"ipv4": "172.105.0.5,172.105.3.5,172.105.4.5,172.105.5.5,172.105.6.5,172.105.7.5,172.105.8.5,172.105.9.5,172.105.10.5,172.105.11.5", + Databases", "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "172.105.0.5,172.105.3.5,172.105.4.5,172.105.5.5,172.105.6.5,172.105.7.5,172.105.8.5,172.105.9.5,172.105.10.5,172.105.11.5", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "ap-southeast", @@ -250,9 +259,9 @@ interactions: "Block Storage", "Object Storage", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance Policy", "Linode - Interfaces"], "monitors": {"alerts": ["Managed Databases", "NodeBalancers"], - "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": - {"ipv4": "139.144.192.62,139.144.192.60,139.144.192.61,139.144.192.53,139.144.192.54,139.144.192.67,139.144.192.69,139.144.192.66,139.144.192.52,139.144.192.68", + Interfaces", "ACLP Logs Datacenter LKE-E"], "monitors": {"alerts": ["Managed + Databases", "NodeBalancers"], "metrics": ["Linodes", "Managed Databases", "NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "139.144.192.62,139.144.192.60,139.144.192.61,139.144.192.53,139.144.192.54,139.144.192.67,139.144.192.69,139.144.192.66,139.144.192.52,139.144.192.68", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "us-ord", @@ -261,9 +270,9 @@ interactions: "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance - Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases"], - "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": - {"ipv4": "172.232.0.17,172.232.0.16,172.232.0.21,172.232.0.13,172.232.0.22,172.232.0.9,172.232.0.19,172.232.0.20,172.232.0.15,172.232.0.18", + Policy", "Linode Interfaces", "ACLP Logs Datacenter LKE-E"], "monitors": {"alerts": + ["Managed Databases", "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "172.232.0.17,172.232.0.16,172.232.0.21,172.232.0.13,172.232.0.22,172.232.0.9,172.232.0.19,172.232.0.20,172.232.0.15,172.232.0.18", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "fr-par", @@ -272,9 +281,9 @@ interactions: "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance - Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases"], - "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": - {"ipv4": "172.232.32.21,172.232.32.23,172.232.32.17,172.232.32.18,172.232.32.16,172.232.32.22,172.232.32.20,172.232.32.14,172.232.32.11,172.232.32.12", + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "172.232.32.21,172.232.32.23,172.232.32.17,172.232.32.18,172.232.32.16,172.232.32.22,172.232.32.20,172.232.32.14,172.232.32.11,172.232.32.12", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "us-sea", @@ -283,9 +292,9 @@ interactions: "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance - Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases"], - "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": - {"ipv4": "172.232.160.19,172.232.160.21,172.232.160.17,172.232.160.15,172.232.160.18,172.232.160.8,172.232.160.12,172.232.160.11,172.232.160.14,172.232.160.16", + Policy", "Linode Interfaces", "ACLP Logs Datacenter LKE-E"], "monitors": {"alerts": + ["Managed Databases", "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "172.232.160.19,172.232.160.21,172.232.160.17,172.232.160.15,172.232.160.18,172.232.160.8,172.232.160.12,172.232.160.11,172.232.160.14,172.232.160.16", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "br-gru", @@ -294,8 +303,9 @@ interactions: "Block Storage", "Object Storage", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance Policy", "Linode - Interfaces"], "monitors": {"alerts": ["Managed Databases"], "metrics": ["Managed - Databases", "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "172.233.0.4,172.233.0.9,172.233.0.7,172.233.0.12,172.233.0.5,172.233.0.13,172.233.0.10,172.233.0.6,172.233.0.8,172.233.0.11", + Interfaces"], "monitors": {"alerts": ["Managed Databases", "NodeBalancers"], + "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": + {"ipv4": "172.233.0.4,172.233.0.9,172.233.0.7,172.233.0.12,172.233.0.5,172.233.0.13,172.233.0.10,172.233.0.6,172.233.0.8,172.233.0.11", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "nl-ams", @@ -304,9 +314,9 @@ interactions: "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance - Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases"], - "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": - {"ipv4": "172.233.33.36,172.233.33.38,172.233.33.35,172.233.33.39,172.233.33.34,172.233.33.33,172.233.33.31,172.233.33.30,172.233.33.37,172.233.33.32", + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "172.233.33.36,172.233.33.38,172.233.33.35,172.233.33.39,172.233.33.34,172.233.33.33,172.233.33.31,172.233.33.30,172.233.33.37,172.233.33.32", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "se-sto", @@ -315,9 +325,9 @@ interactions: "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance - Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases"], - "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": - {"ipv4": "172.232.128.24,172.232.128.26,172.232.128.20,172.232.128.22,172.232.128.25,172.232.128.19,172.232.128.23,172.232.128.18,172.232.128.21,172.232.128.27", + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "172.232.128.24,172.232.128.26,172.232.128.20,172.232.128.22,172.232.128.25,172.232.128.19,172.232.128.23,172.232.128.18,172.232.128.21,172.232.128.27", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "es-mad", @@ -326,9 +336,9 @@ interactions: "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance - Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases"], - "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": - {"ipv4": "172.233.111.6,172.233.111.17,172.233.111.21,172.233.111.25,172.233.111.19,172.233.111.12,172.233.111.26,172.233.111.16,172.233.111.18,172.233.111.9", + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "172.233.111.6,172.233.111.17,172.233.111.21,172.233.111.25,172.233.111.19,172.233.111.12,172.233.111.26,172.233.111.16,172.233.111.18,172.233.111.9", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "in-maa", @@ -338,8 +348,8 @@ interactions: Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", "NETINT Quadra T1U", "Maintenance Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed - Databases"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", - "resolvers": {"ipv4": "172.232.96.17,172.232.96.26,172.232.96.19,172.232.96.20,172.232.96.25,172.232.96.21,172.232.96.18,172.232.96.22,172.232.96.23,172.232.96.24", + Databases", "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "172.232.96.17,172.232.96.26,172.232.96.19,172.232.96.20,172.232.96.25,172.232.96.21,172.232.96.18,172.232.96.22,172.232.96.23,172.232.96.24", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "jp-osa", @@ -348,9 +358,9 @@ interactions: "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance - Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases"], - "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": - {"ipv4": "172.233.64.44,172.233.64.43,172.233.64.37,172.233.64.40,172.233.64.46,172.233.64.41,172.233.64.39,172.233.64.42,172.233.64.45,172.233.64.38", + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "172.233.64.44,172.233.64.43,172.233.64.37,172.233.64.40,172.233.64.46,172.233.64.41,172.233.64.39,172.233.64.42,172.233.64.45,172.233.64.38", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "it-mil", @@ -359,9 +369,9 @@ interactions: "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance - Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases"], - "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": - {"ipv4": "172.232.192.19,172.232.192.18,172.232.192.16,172.232.192.20,172.232.192.24,172.232.192.21,172.232.192.22,172.232.192.17,172.232.192.15,172.232.192.23", + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "172.232.192.19,172.232.192.18,172.232.192.16,172.232.192.20,172.232.192.24,172.232.192.21,172.232.192.22,172.232.192.17,172.232.192.15,172.232.192.23", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "us-central", @@ -369,9 +379,9 @@ interactions: Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", "Managed Databases", "Metadata", "Placement Group", "StackScripts", "Maintenance - Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases"], - "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": - {"ipv4": "72.14.179.5,72.14.188.5,173.255.199.5,66.228.53.5,96.126.122.5,96.126.124.5,96.126.127.5,198.58.107.5,198.58.111.5,23.239.24.5", + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "72.14.179.5,72.14.188.5,173.255.199.5,66.228.53.5,96.126.122.5,96.126.124.5,96.126.127.5,198.58.107.5,198.58.111.5,23.239.24.5", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "ap-northeast", @@ -379,9 +389,9 @@ interactions: Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", "Managed Databases", "Metadata", "Placement Group", "StackScripts", "Maintenance - Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases"], - "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": - {"ipv4": "139.162.66.5,139.162.67.5,139.162.68.5,139.162.69.5,139.162.70.5,139.162.71.5,139.162.72.5,139.162.73.5,139.162.74.5,139.162.75.5", + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "139.162.66.5,139.162.67.5,139.162.68.5,139.162.69.5,139.162.70.5,139.162.71.5,139.162.72.5,139.162.73.5,139.162.74.5,139.162.75.5", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "eu-central", @@ -390,8 +400,8 @@ interactions: "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", "Managed Databases", "Metadata", "Placement Group", "StackScripts", "Maintenance Policy", "Linode Interfaces"], "monitors": - {"alerts": ["Managed Databases"], "metrics": ["Managed Databases", "NodeBalancers"]}, - "status": "ok", "resolvers": {"ipv4": "139.162.130.5,139.162.131.5,139.162.132.5,139.162.133.5,139.162.134.5,139.162.135.5,139.162.136.5,139.162.137.5,139.162.138.5,139.162.139.5", + {"alerts": ["Managed Databases", "NodeBalancers"], "metrics": ["Managed Databases", + "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "139.162.130.5,139.162.131.5,139.162.132.5,139.162.133.5,139.162.134.5,139.162.135.5,139.162.136.5,139.162.137.5,139.162.138.5,139.162.139.5", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "ap-south", @@ -399,8 +409,8 @@ interactions: Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", "Metadata", "Placement Group", "StackScripts", - "Maintenance Policy", "Linode Interfaces"], "monitors": {"alerts": [], "metrics": - ["NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "139.162.11.5,139.162.13.5,139.162.14.5,139.162.15.5,139.162.16.5,139.162.21.5,139.162.27.5,103.3.60.18,103.3.60.19,103.3.60.20", + "Maintenance Policy", "Linode Interfaces"], "monitors": {"alerts": ["NodeBalancers"], + "metrics": ["NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "139.162.11.5,139.162.13.5,139.162.14.5,139.162.15.5,139.162.16.5,139.162.21.5,139.162.27.5,103.3.60.18,103.3.60.19,103.3.60.20", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "eu-west", @@ -408,20 +418,20 @@ interactions: Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", "Metadata", "Placement Group", "StackScripts", "Maintenance Policy", "Linode - Interfaces"], "monitors": {"alerts": [], "metrics": ["NodeBalancers"]}, "status": - "ok", "resolvers": {"ipv4": "178.79.182.5, 176.58.107.5, 176.58.116.5, 176.58.121.5, - 151.236.220.5, 212.71.252.5, 212.71.253.5, 109.74.192.20, 109.74.193.20, 109.74.194.20", - "ipv6": "1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678"}, "placement_group_limits": - {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": - 5}, "site_type": "core"}, {"id": "us-east", "label": "Newark, NJ", "country": - "us", "capabilities": ["Linodes", "Block Storage Encryption", "LA Disk Encryption", - "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", "Object Storage", - "GPU Linodes", "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", - "Managed Databases", "Metadata", "Placement Group", "StackScripts", "Maintenance - Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases"], - "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": - {"ipv4": "66.228.42.5,96.126.106.5,50.116.53.5,50.116.58.5,50.116.61.5,50.116.62.5,66.175.211.5,97.107.133.4,173.255.225.5,66.228.35.5", + Interfaces"], "monitors": {"alerts": ["NodeBalancers"], "metrics": ["NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "178.79.182.5, 176.58.107.5, 176.58.116.5, + 176.58.121.5, 151.236.220.5, 212.71.252.5, 212.71.253.5, 109.74.192.20, 109.74.193.20, + 109.74.194.20", "ipv6": "1234::5678, 1234::5678, 1234::5678, 1234::5678, + 1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "us-east", + "label": "Newark, NJ", "country": "us", "capabilities": ["Linodes", "Block Storage + Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Cloud Firewall", + "Vlans", "Block Storage Migrations", "Managed Databases", "Metadata", "Placement + Group", "StackScripts", "Maintenance Policy", "Linode Interfaces"], "monitors": + {"alerts": ["Managed Databases", "NodeBalancers"], "metrics": ["Managed Databases", + "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "66.228.42.5,96.126.106.5,50.116.53.5,50.116.58.5,50.116.61.5,50.116.62.5,66.175.211.5,97.107.133.4,173.255.225.5,66.228.35.5", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "us-southeast", @@ -430,8 +440,8 @@ interactions: "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", "Managed Databases", "Metadata", "Placement Group", "StackScripts", "Maintenance Policy", "Linode Interfaces"], "monitors": - {"alerts": ["Managed Databases"], "metrics": ["Managed Databases", "NodeBalancers"]}, - "status": "ok", "resolvers": {"ipv4": "74.207.231.5,173.230.128.5,173.230.129.5,173.230.136.5,173.230.140.5,66.228.59.5,66.228.62.5,50.116.35.5,50.116.41.5,23.239.18.5", + {"alerts": ["Managed Databases", "NodeBalancers"], "metrics": ["Managed Databases", + "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "74.207.231.5,173.230.128.5,173.230.129.5,173.230.136.5,173.230.140.5,66.228.59.5,66.228.62.5,50.116.35.5,50.116.41.5,23.239.18.5", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "us-west", @@ -439,14 +449,14 @@ interactions: Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", "Managed Databases", "Metadata", "Placement Group", "StackScripts", "Maintenance - Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases"], - "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": - {"ipv4": "173.230.145.5, 173.230.147.5, 173.230.155.5, 173.255.212.5, 173.255.219.5, - 173.255.241.5, 173.255.243.5, 173.255.244.5, 74.207.241.5, 74.207.242.5", "ipv6": - "1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678, 1234::5678"}, "placement_group_limits": + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "173.230.145.5, 173.230.147.5, 173.230.155.5, 173.255.212.5, + 173.255.219.5, 173.255.241.5, 173.255.243.5, 173.255.244.5, 74.207.241.5, 74.207.242.5", + "ipv6": "1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678, + 1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": - 5}, "site_type": "core"}], "page": 1, "pages": 1, "results": 46}' + 5}, "site_type": "core"}], "page": 1, "pages": 1, "results": 47}' headers: Access-Control-Allow-Credentials: - "true" @@ -469,7 +479,7 @@ interactions: Content-Type: - application/json Expires: - - Wed, 04 Mar 2026 22:49:45 GMT + - Tue, 05 May 2026 23:45:12 GMT Pragma: - no-cache Strict-Transport-Security: @@ -495,134 +505,7 @@ interactions: code: 200 duration: "" - request: - body: "" - form: {} - headers: - Accept: - - application/json - Content-Type: - - application/json - User-Agent: - - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/account/availability?page=1 - method: GET - response: - body: '{"data": [{"region": "us-central", "available": ["Linodes", "NodeBalancers", - "Block Storage", "Kubernetes"], "unavailable": []}, {"region": "us-west", "available": - ["Linodes", "NodeBalancers", "Block Storage", "Kubernetes"], "unavailable": - []}, {"region": "us-southeast", "available": ["Linodes", "NodeBalancers", "Block - Storage", "Kubernetes"], "unavailable": []}, {"region": "us-east", "available": - ["Linodes", "NodeBalancers", "Block Storage", "Kubernetes"], "unavailable": - []}, {"region": "eu-west", "available": [], "unavailable": ["Linodes", "NodeBalancers", - "Block Storage", "Kubernetes"]}, {"region": "ap-south", "available": ["Linodes", - "NodeBalancers", "Block Storage", "Kubernetes"], "unavailable": []}, {"region": - "eu-central", "available": ["Linodes", "NodeBalancers", "Block Storage", "Kubernetes"], - "unavailable": []}, {"region": "ap-northeast", "available": ["Linodes", "NodeBalancers", - "Block Storage", "Kubernetes"], "unavailable": []}, {"region": "ap-west", "available": - ["Linodes", "NodeBalancers", "Block Storage", "Kubernetes"], "unavailable": - []}, {"region": "ca-central", "available": ["Linodes", "NodeBalancers", "Block - Storage", "Kubernetes"], "unavailable": []}, {"region": "ap-southeast", "available": - ["Linodes", "NodeBalancers", "Block Storage", "Kubernetes"], "unavailable": - []}, {"region": "us-iad", "available": ["Linodes", "NodeBalancers", "Block Storage", - "Kubernetes"], "unavailable": []}, {"region": "us-ord", "available": ["Linodes", - "NodeBalancers", "Block Storage", "Kubernetes"], "unavailable": []}, {"region": - "fr-par", "available": ["Linodes", "NodeBalancers", "Block Storage", "Kubernetes"], - "unavailable": []}, {"region": "us-sea", "available": ["Linodes", "NodeBalancers", - "Block Storage", "Kubernetes"], "unavailable": []}, {"region": "br-gru", "available": - ["Linodes", "NodeBalancers", "Block Storage", "Kubernetes"], "unavailable": - []}, {"region": "nl-ams", "available": ["Linodes", "NodeBalancers", "Block Storage", - "Kubernetes"], "unavailable": []}, {"region": "se-sto", "available": ["Linodes", - "NodeBalancers", "Block Storage", "Kubernetes"], "unavailable": []}, {"region": - "es-mad", "available": ["Linodes", "Kubernetes"], "unavailable": ["NodeBalancers", - "Block Storage"]}, {"region": "in-maa", "available": ["Linodes", "NodeBalancers", - "Block Storage", "Kubernetes"], "unavailable": []}, {"region": "jp-osa", "available": - ["Linodes", "NodeBalancers", "Block Storage", "Kubernetes"], "unavailable": - []}, {"region": "it-mil", "available": ["Linodes", "NodeBalancers", "Block Storage", - "Kubernetes"], "unavailable": []}, {"region": "us-mia", "available": ["Linodes", - "NodeBalancers", "Block Storage", "Kubernetes"], "unavailable": []}, {"region": - "id-cgk", "available": ["Linodes", "NodeBalancers", "Block Storage", "Kubernetes"], - "unavailable": []}, {"region": "us-lax", "available": ["Linodes", "NodeBalancers", - "Block Storage", "Kubernetes"], "unavailable": []}, {"region": "nz-akl-1", "available": - ["Linodes", "NodeBalancers", "Block Storage", "Kubernetes"], "unavailable": - []}, {"region": "us-den-1", "available": ["Linodes"], "unavailable": ["NodeBalancers", - "Block Storage", "Kubernetes"]}, {"region": "de-ham-1", "available": ["Linodes"], - "unavailable": ["NodeBalancers", "Block Storage", "Kubernetes"]}, {"region": - "za-jnb-1", "available": ["Linodes"], "unavailable": ["NodeBalancers", "Block - Storage", "Kubernetes"]}, {"region": "my-kul-1", "available": ["Linodes"], "unavailable": - ["NodeBalancers", "Block Storage", "Kubernetes"]}, {"region": "co-bog-1", "available": - ["Linodes"], "unavailable": ["NodeBalancers", "Block Storage", "Kubernetes"]}, - {"region": "mx-qro-1", "available": ["Linodes"], "unavailable": ["NodeBalancers", - "Block Storage", "Kubernetes"]}, {"region": "us-hou-1", "available": ["Linodes"], - "unavailable": ["NodeBalancers", "Block Storage", "Kubernetes"]}, {"region": - "cl-scl-1", "available": ["Linodes"], "unavailable": ["NodeBalancers", "Block - Storage", "Kubernetes"]}, {"region": "gb-lon", "available": ["Linodes", "NodeBalancers", - "Block Storage", "Kubernetes"], "unavailable": []}, {"region": "au-mel", "available": - ["Linodes", "Kubernetes"], "unavailable": ["NodeBalancers", "Block Storage"]}, - {"region": "in-bom-2", "available": ["Linodes", "NodeBalancers", "Block Storage", - "Kubernetes"], "unavailable": []}, {"region": "de-fra-2", "available": ["Linodes", - "NodeBalancers", "Block Storage", "Kubernetes"], "unavailable": []}, {"region": - "sg-sin-2", "available": ["Linodes", "NodeBalancers", "Block Storage", "Kubernetes"], - "unavailable": []}, {"region": "jp-tyo-3", "available": ["Linodes", "NodeBalancers", - "Block Storage", "Kubernetes"], "unavailable": []}, {"region": "de-ber-1", "available": - ["Linodes", "NodeBalancers", "Block Storage", "Kubernetes"], "unavailable": - []}, {"region": "no-osl-1", "available": ["Linodes", "NodeBalancers", "Block - Storage", "Kubernetes"], "unavailable": []}, {"region": "us-iad-2", "available": - ["Linodes", "NodeBalancers", "Block Storage", "Kubernetes"], "unavailable": - []}, {"region": "fr-par-2", "available": ["Linodes", "NodeBalancers", "Block - Storage", "Kubernetes"], "unavailable": []}, {"region": "co-bog-2", "available": - ["Linodes", "NodeBalancers", "Block Storage", "Kubernetes"], "unavailable": - []}, {"region": "fr-mrs-2", "available": ["Linodes", "NodeBalancers", "Block - Storage", "Kubernetes"], "unavailable": []}], "page": 1, "pages": 1, "results": - 46}' - headers: - Access-Control-Allow-Credentials: - - "true" - Access-Control-Allow-Headers: - - Authorization, Origin, X-Requested-With, Content-Type, Accept, X-Filter - Access-Control-Allow-Methods: - - HEAD, GET, OPTIONS, POST, PUT, DELETE - Access-Control-Allow-Origin: - - '*' - Access-Control-Expose-Headers: - - X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Status - Akamai-Internal-Account: - - '*' - Cache-Control: - - max-age=0, no-cache, no-store - Connection: - - keep-alive - Content-Security-Policy: - - default-src 'none' - Content-Type: - - application/json - Expires: - - Wed, 04 Mar 2026 22:49:45 GMT - Pragma: - - no-cache - Strict-Transport-Security: - - max-age=31536000 - Vary: - - Authorization, X-Filter - - Authorization, X-Filter - - Accept-Encoding - X-Accepted-Oauth-Scopes: - - account:read_only - X-Content-Type-Options: - - nosniff - X-Frame-Options: - - DENY - - DENY - X-Oauth-Scopes: - - '*' - X-Ratelimit-Limit: - - "1840" - X-Xss-Protection: - - 1; mode=block - status: 200 OK - code: 200 - duration: "" -- request: - body: '{"region":"au-mel","type":"g6-nanode-1","label":"go-test-ins-lc0pul6h9485","root_pass":"c*y5+ugacvYby!|J\\mJ,5u\u00269^!#\u003e2p3m66VN!GAD*KYX)c58z1B09K6OS40s)E7!","image":"linode/debian12","booted":false}' + body: '{"region":"au-mel","type":"g6-nanode-1","label":"go-test-ins-ald015i102rx","root_pass":"P~0zuUbC8G22u1b{}SVlxa\u003e}7+mTmLZ}715y67W4F1`:a2r\u0026BU\u003cP''v9/OSq\u003e$t7~","image":"linode/debian12","booted":false}' form: {} headers: Accept: @@ -634,19 +517,19 @@ interactions: url: https://api.linode.com/v4beta/linode/instances method: POST response: - body: '{"id": 93152714, "label": "go-test-ins-lc0pul6h9485", "group": "", "status": + body: '{"id": 97185936, "label": "go-test-ins-ald015i102rx", "group": "", "status": "provisioning", "created": "2018-01-02T03:04:05", "updated": "2018-01-02T03:04:05", - "type": "g6-nanode-1", "ipv4": ["172.236.44.156"], "ipv6": "1234::5678/128", + "type": "g6-nanode-1", "ipv4": ["172.236.33.27"], "ipv6": "1234::5678/128", "image": "linode/debian12", "region": "au-mel", "site_type": "core", "specs": {"disk": 25600, "memory": 1024, "vcpus": 1, "gpus": 0, "transfer": 1000, "accelerated_devices": 0}, "alerts": {"cpu": 90, "network_in": 10, "network_out": 10, "transfer_quota": - 80, "io": 10000}, "backups": {"enabled": false, "available": false, "schedule": - {"day": null, "window": null}, "last_successful": null}, "hypervisor": "kvm", - "watchdog_enabled": true, "tags": [], "host_uuid": "e6fb7e51a1d7b36635dda16eb686150d00ac7289", - "has_user_data": false, "placement_group": null, "disk_encryption": "enabled", - "lke_cluster_id": null, "capabilities": ["Block Storage Encryption", "SMTP Enabled", - "Maintenance Policy"], "interface_generation": "legacy_config", "maintenance_policy": - "linode/migrate", "locks": []}' + 80, "io": 10000, "system_alerts": [], "user_alerts": []}, "backups": {"enabled": + false, "available": false, "schedule": {"day": null, "window": null}, "last_successful": + null}, "hypervisor": "kvm", "watchdog_enabled": true, "tags": [], "host_uuid": + "6c9b57be39471d7888b736f623fe5527fd93c553", "has_user_data": false, "placement_group": + null, "disk_encryption": "enabled", "lke_cluster_id": null, "capabilities": + ["Block Storage Encryption", "SMTP Enabled", "Maintenance Policy"], "interface_generation": + "legacy_config", "maintenance_policy": "linode/migrate", "locks": []}' headers: Access-Control-Allow-Credentials: - "true" @@ -669,7 +552,7 @@ interactions: Content-Type: - application/json Expires: - - Wed, 04 Mar 2026 22:49:47 GMT + - Tue, 05 May 2026 23:45:13 GMT Pragma: - no-cache Strict-Transport-Security: @@ -694,7 +577,7 @@ interactions: code: 200 duration: "" - request: - body: '{"label":"linodego-fw-test","rules":{"inbound":[{"action":"ACCEPT","label":"go-fwrule-test","ports":"22","protocol":"TCP","addresses":{"ipv4":["0.0.0.0/0"],"ipv6":["1234::5678/0"]}}],"inbound_policy":"ACCEPT","outbound":[{"action":"ACCEPT","label":"go-fwrule-test","ports":"22","protocol":"TCP","addresses":{"ipv4":["0.0.0.0/0"],"ipv6":["1234::5678/0"]}}],"outbound_policy":"ACCEPT"},"tags":["testing"],"devices":{"linodes":[93152714]}}' + body: '{"label":"linodego-fw-test","rules":{"inbound":[{"action":"ACCEPT","label":"go-fwrule-test","ports":"22","protocol":"TCP","addresses":{"ipv4":["0.0.0.0/0"],"ipv6":["1234::5678/0"]}}],"inbound_policy":"ACCEPT","outbound":[{"action":"ACCEPT","label":"go-fwrule-test","ports":"22","protocol":"TCP","addresses":{"ipv4":["0.0.0.0/0"],"ipv6":["1234::5678/0"]}}],"outbound_policy":"ACCEPT"},"tags":["testing"],"devices":{"linodes":[97185936]}}' form: {} headers: Accept: @@ -706,15 +589,15 @@ interactions: url: https://api.linode.com/v4beta/networking/firewalls method: POST response: - body: '{"id": 3913113, "label": "linodego-fw-test", "created": "2018-01-02T03:04:05", + body: '{"id": 9618549, "label": "linodego-fw-test", "created": "2018-01-02T03:04:05", "updated": "2018-01-02T03:04:05", "status": "enabled", "rules": {"inbound": [{"protocol": "TCP", "addresses": {"ipv6": ["1234::5678/0"], "ipv4": ["0.0.0.0/0"]}, "action": "ACCEPT", "label": "go-fwrule-test", "ports": "22"}], "inbound_policy": "ACCEPT", "outbound": [{"protocol": "TCP", "addresses": {"ipv6": ["1234::5678/0"], "ipv4": ["0.0.0.0/0"]}, "action": "ACCEPT", "label": "go-fwrule-test", "ports": "22"}], "outbound_policy": "ACCEPT", "version": 1, "fingerprint": "7bcc0f03"}, "tags": - ["testing"], "entities": [{"id": 93152714, "type": "linode", "label": "go-test-ins-lc0pul6h9485", - "url": "/v4/linode/instances/93152714", "parent_entity": null}]}' + ["testing"], "entities": [{"id": 97185936, "type": "linode", "label": "go-test-ins-ald015i102rx", + "url": "/v4/linode/instances/97185936", "parent_entity": null}]}' headers: Access-Control-Allow-Credentials: - "true" @@ -739,7 +622,7 @@ interactions: Content-Type: - application/json Expires: - - Wed, 04 Mar 2026 22:49:48 GMT + - Tue, 05 May 2026 23:45:14 GMT Pragma: - no-cache Strict-Transport-Security: @@ -772,12 +655,12 @@ interactions: - application/json User-Agent: - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/networking/firewalls/3913113/devices?page=1 + url: https://api.linode.com/v4beta/networking/firewalls/9618549/devices?page=1 method: GET response: - body: '{"data": [{"id": 10483419, "created": "2018-01-02T03:04:05", "updated": - "2018-01-02T03:04:05", "entity": {"id": 93152714, "type": "linode", "label": - "go-test-ins-lc0pul6h9485", "url": "/v4/linode/instances/93152714", "parent_entity": + body: '{"data": [{"id": 11909957, "created": "2018-01-02T03:04:05", "updated": + "2018-01-02T03:04:05", "entity": {"id": 97185936, "type": "linode", "label": + "go-test-ins-ald015i102rx", "url": "/v4/linode/instances/97185936", "parent_entity": null}}], "page": 1, "pages": 1, "results": 1}' headers: Access-Control-Allow-Credentials: @@ -803,7 +686,7 @@ interactions: Content-Type: - application/json Expires: - - Wed, 04 Mar 2026 22:49:48 GMT + - Tue, 05 May 2026 23:45:14 GMT Pragma: - no-cache Strict-Transport-Security: @@ -837,7 +720,7 @@ interactions: - application/json User-Agent: - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/networking/firewalls/3913113 + url: https://api.linode.com/v4beta/networking/firewalls/9618549 method: DELETE response: body: '{}' @@ -865,7 +748,7 @@ interactions: Content-Type: - application/json Expires: - - Wed, 04 Mar 2026 22:49:48 GMT + - Tue, 05 May 2026 23:45:14 GMT Pragma: - no-cache Strict-Transport-Security: @@ -898,7 +781,7 @@ interactions: - application/json User-Agent: - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/linode/instances/93152714 + url: https://api.linode.com/v4beta/linode/instances/97185936 method: DELETE response: body: '{}' @@ -926,7 +809,7 @@ interactions: Content-Type: - application/json Expires: - - Wed, 04 Mar 2026 22:49:48 GMT + - Tue, 05 May 2026 23:45:15 GMT Pragma: - no-cache Strict-Transport-Security: diff --git a/test/integration/fixtures/TestFirewallRuleSets_CRUD.yaml b/test/integration/fixtures/TestFirewallRuleSets_CRUD.yaml index 2ed5bab0c..dfef91138 100644 --- a/test/integration/fixtures/TestFirewallRuleSets_CRUD.yaml +++ b/test/integration/fixtures/TestFirewallRuleSets_CRUD.yaml @@ -14,10 +14,11 @@ interactions: url: https://api.linode.com/v4beta/networking/firewalls/rulesets method: POST response: - body: '{"id": 78, "version": 1, "label": "rs-51452000", "description": "Allow + body: '{"id": 66319, "version": 1, "label": "rs-51452000", "description": "Allow inbound HTTP", "type": "inbound", "is_service_defined": false, "rules": [{"action": "ACCEPT", "label": "allow-http", "ports": "80", "protocol": "TCP", "addresses": - {"ipv4": ["0.0.0.0/0"]}}], "created": "2018-01-02T03:04:05", "updated": "2018-01-02T03:04:05"}' + {"ipv4": ["0.0.0.0/0"]}}], "created": "2018-01-02T03:04:05", "updated": "2018-01-02T03:04:05", + "deleted": null}' headers: Access-Control-Allow-Credentials: - "true" @@ -36,13 +37,13 @@ interactions: Connection: - keep-alive Content-Length: - - "325" + - "349" Content-Security-Policy: - default-src 'none' Content-Type: - application/json Expires: - - Mon, 13 Oct 2025 21:57:58 GMT + - Tue, 05 May 2026 23:45:09 GMT Pragma: - no-cache Strict-Transport-Security: @@ -75,13 +76,14 @@ interactions: - application/json User-Agent: - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/networking/firewalls/rulesets/78 + url: https://api.linode.com/v4beta/networking/firewalls/rulesets/66319 method: GET response: - body: '{"id": 78, "version": 1, "label": "rs-51452000", "description": "Allow + body: '{"id": 66319, "version": 1, "label": "rs-51452000", "description": "Allow inbound HTTP", "type": "inbound", "is_service_defined": false, "rules": [{"label": "allow-http", "ports": "80", "action": "ACCEPT", "protocol": "TCP", "addresses": - {"ipv4": ["0.0.0.0/0"]}}], "created": "2018-01-02T03:04:05", "updated": "2018-01-02T03:04:05"}' + {"ipv4": ["0.0.0.0/0"]}}], "created": "2018-01-02T03:04:05", "updated": "2018-01-02T03:04:05", + "deleted": null}' headers: Access-Control-Allow-Credentials: - "true" @@ -100,13 +102,13 @@ interactions: Connection: - keep-alive Content-Length: - - "325" + - "349" Content-Security-Policy: - default-src 'none' Content-Type: - application/json Expires: - - Mon, 13 Oct 2025 21:57:58 GMT + - Tue, 05 May 2026 23:45:09 GMT Pragma: - no-cache Strict-Transport-Security: @@ -140,14 +142,14 @@ interactions: - application/json User-Agent: - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/networking/firewalls/rulesets/78 + url: https://api.linode.com/v4beta/networking/firewalls/rulesets/66319 method: PUT response: - body: '{"id": 78, "version": 2, "label": "rs-51452000-updated", "description": + body: '{"id": 66319, "version": 2, "label": "rs-51452000-updated", "description": "Updated description", "type": "inbound", "is_service_defined": false, "rules": - [{"action": "ACCEPT", "label": "allow-https", "ports": "443", "protocol": "TCP", + [{"label": "allow-https", "ports": "443", "action": "ACCEPT", "protocol": "TCP", "addresses": {"ipv6": ["1234::5678/0"]}}], "created": "2018-01-02T03:04:05", "updated": - "2018-01-02T03:04:05"}' + "2018-01-02T03:04:05", "deleted": null}' headers: Access-Control-Allow-Credentials: - "true" @@ -166,13 +168,13 @@ interactions: Connection: - keep-alive Content-Length: - - "331" + - "355" Content-Security-Policy: - default-src 'none' Content-Type: - application/json Expires: - - Mon, 13 Oct 2025 21:57:58 GMT + - Tue, 05 May 2026 23:45:09 GMT Pragma: - no-cache Strict-Transport-Security: @@ -208,24 +210,16 @@ interactions: url: https://api.linode.com/v4beta/networking/firewalls/rulesets?page=1 method: GET response: - body: '{"data": [{"id": 74, "version": 1, "label": "testRuleSet", "description": - "test", "type": "inbound", "is_service_defined": false, "rules": [{"label": "test", - "ports": "22-24", "action": "ACCEPT", "protocol": "TCP", "addresses": {"ipv4": - ["192.0.2.0/24"]}, "description": "test"}], "created": "2018-01-02T03:04:05", - "updated": "2018-01-02T03:04:05"}, {"id": 75, "version": 1, "label": "testRuleSet2", - "description": "test2", "type": "inbound", "is_service_defined": false, "rules": - [{"label": "test", "ports": "22-24", "action": "ACCEPT", "protocol": "TCP", - "addresses": {"ipv4": ["192.0.2.0/24"]}, "description": "test"}], "created": - "2018-01-02T03:04:05", "updated": "2018-01-02T03:04:05"}, {"id": 76, "version": - 1, "label": "ruleset-1760391571119054000", "description": "Allow inbound HTTP", - "type": "inbound", "is_service_defined": false, "rules": [{"label": "allow-http", - "ports": "80", "action": "ACCEPT", "protocol": "TCP", "addresses": {"ipv4": - ["0.0.0.0/0"]}}], "created": "2018-01-02T03:04:05", "updated": "2018-01-02T03:04:05"}, - {"id": 78, "version": 2, "label": "rs-51452000-updated", "description": "Updated - description", "type": "inbound", "is_service_defined": false, "rules": [{"label": - "allow-https", "ports": "443", "action": "ACCEPT", "protocol": "TCP", "addresses": - {"ipv6": ["1234::5678/0"]}}], "created": "2018-01-02T03:04:05", "updated": "2018-01-02T03:04:05"}], - "page": 1, "pages": 1, "results": 4}' + body: '{"data": [{"id": 66318, "version": 2, "label": "rs-51452000-updated", "description": + "Updated description", "type": "inbound", "is_service_defined": false, "rules": + [{"label": "allow-https", "ports": "443", "action": "ACCEPT", "protocol": "TCP", + "addresses": {"ipv6": ["1234::5678/0"]}}], "created": "2018-01-02T03:04:05", "updated": + "2018-01-02T03:04:05", "deleted": "2018-01-02T03:04:05"}, {"id": 66319, "version": + 2, "label": "rs-51452000-updated", "description": "Updated description", "type": + "inbound", "is_service_defined": false, "rules": [{"label": "allow-https", "ports": + "443", "action": "ACCEPT", "protocol": "TCP", "addresses": {"ipv6": ["1234::5678/0"]}}], + "created": "2018-01-02T03:04:05", "updated": "2018-01-02T03:04:05", "deleted": + null}], "page": 1, "pages": 1, "results": 2}' headers: Access-Control-Allow-Credentials: - "true" @@ -243,12 +237,14 @@ interactions: - max-age=0, no-cache, no-store Connection: - keep-alive + Content-Length: + - "778" Content-Security-Policy: - default-src 'none' Content-Type: - application/json Expires: - - Mon, 13 Oct 2025 21:57:58 GMT + - Tue, 05 May 2026 23:45:10 GMT Pragma: - no-cache Strict-Transport-Security: @@ -256,7 +252,6 @@ interactions: Vary: - Authorization, X-Filter - Authorization, X-Filter - - Accept-Encoding X-Accepted-Oauth-Scopes: - firewall:read_only X-Content-Type-Options: @@ -283,7 +278,7 @@ interactions: - application/json User-Agent: - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/networking/firewalls/rulesets/78 + url: https://api.linode.com/v4beta/networking/firewalls/rulesets/66319 method: DELETE response: body: '{}' @@ -311,7 +306,7 @@ interactions: Content-Type: - application/json Expires: - - Mon, 13 Oct 2025 21:57:58 GMT + - Tue, 05 May 2026 23:45:11 GMT Pragma: - no-cache Strict-Transport-Security: diff --git a/test/integration/fixtures/TestFirewallRules_Get.yaml b/test/integration/fixtures/TestFirewallRules_Get.yaml index f8c9dacbd..3ffc7ca10 100644 --- a/test/integration/fixtures/TestFirewallRules_Get.yaml +++ b/test/integration/fixtures/TestFirewallRules_Get.yaml @@ -2,7 +2,7 @@ version: 1 interactions: - request: - body: '{"label":"linodego-fw-test","rules":{"inbound":[{"action":"ACCEPT","label":"go-fwrule-test","ports":"22","protocol":"TCP","addresses":{"ipv4":["0.0.0.0/0"],"ipv6":["1234::5678/0"]}}],"inbound_policy":"ACCEPT","outbound":[{"action":"ACCEPT","label":"go-fwrule-test","ports":"22","protocol":"TCP","addresses":{"ipv4":["0.0.0.0/0"],"ipv6":["1234::5678/0"]}}],"outbound_policy":"ACCEPT","version":0,"fingerprint":""},"tags":["testing"]}' + body: '{"label":"linodego-fw-test","rules":{"inbound":[{"action":"ACCEPT","label":"go-fwrule-test","ports":"22","protocol":"TCP","addresses":{"ipv4":["0.0.0.0/0"],"ipv6":["1234::5678/0"]}}],"inbound_policy":"ACCEPT","outbound":[{"action":"ACCEPT","label":"go-fwrule-test","ports":"22","protocol":"TCP","addresses":{"ipv4":["0.0.0.0/0"],"ipv6":["1234::5678/0"]}}],"outbound_policy":"ACCEPT"},"tags":["testing"]}' form: {} headers: Accept: @@ -14,7 +14,7 @@ interactions: url: https://api.linode.com/v4beta/networking/firewalls method: POST response: - body: '{"id": 3885660, "label": "linodego-fw-test", "created": "2018-01-02T03:04:05", + body: '{"id": 9618466, "label": "linodego-fw-test", "created": "2018-01-02T03:04:05", "updated": "2018-01-02T03:04:05", "status": "enabled", "rules": {"inbound": [{"protocol": "TCP", "addresses": {"ipv6": ["1234::5678/0"], "ipv4": ["0.0.0.0/0"]}, "action": "ACCEPT", "label": "go-fwrule-test", "ports": "22"}], "inbound_policy": @@ -46,7 +46,7 @@ interactions: Content-Type: - application/json Expires: - - Sat, 28 Feb 2026 07:07:58 GMT + - Tue, 05 May 2026 23:45:07 GMT Pragma: - no-cache Strict-Transport-Security: @@ -79,7 +79,7 @@ interactions: - application/json User-Agent: - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/networking/firewalls/3885660/rules + url: https://api.linode.com/v4beta/networking/firewalls/9618466/rules method: GET response: body: '{"inbound": [{"protocol": "TCP", "addresses": {"ipv6": ["1234::5678/0"], "ipv4": @@ -111,7 +111,7 @@ interactions: Content-Type: - application/json Expires: - - Sat, 28 Feb 2026 07:07:58 GMT + - Tue, 05 May 2026 23:45:07 GMT Pragma: - no-cache Strict-Transport-Security: @@ -145,7 +145,7 @@ interactions: - application/json User-Agent: - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/networking/firewalls/3885660 + url: https://api.linode.com/v4beta/networking/firewalls/9618466 method: DELETE response: body: '{}' @@ -173,7 +173,7 @@ interactions: Content-Type: - application/json Expires: - - Sat, 28 Feb 2026 07:07:59 GMT + - Tue, 05 May 2026 23:45:08 GMT Pragma: - no-cache Strict-Transport-Security: diff --git a/test/integration/fixtures/TestFirewallRules_Update.yaml b/test/integration/fixtures/TestFirewallRules_Update.yaml index 49fd6b381..a16157a3e 100644 --- a/test/integration/fixtures/TestFirewallRules_Update.yaml +++ b/test/integration/fixtures/TestFirewallRules_Update.yaml @@ -2,7 +2,7 @@ version: 1 interactions: - request: - body: '{"label":"linodego-fw-test","rules":{"inbound":[{"action":"ACCEPT","label":"go-fwrule-test","ports":"22","protocol":"TCP","addresses":{"ipv4":["0.0.0.0/0"],"ipv6":["1234::5678/0"]}}],"inbound_policy":"ACCEPT","outbound":[{"action":"ACCEPT","label":"go-fwrule-test","ports":"22","protocol":"TCP","addresses":{"ipv4":["0.0.0.0/0"],"ipv6":["1234::5678/0"]}}],"outbound_policy":"ACCEPT"},"tags":["testing"],"devices":{}}' + body: '{"label":"linodego-fw-test","rules":{"inbound":[{"action":"ACCEPT","label":"go-fwrule-test","ports":"22","protocol":"TCP","addresses":{"ipv4":["0.0.0.0/0"],"ipv6":["1234::5678/0"]}}],"inbound_policy":"ACCEPT","outbound":[{"action":"ACCEPT","label":"go-fwrule-test","ports":"22","protocol":"TCP","addresses":{"ipv4":["0.0.0.0/0"],"ipv6":["1234::5678/0"]}}],"outbound_policy":"ACCEPT"},"tags":["testing"]}' form: {} headers: Accept: @@ -14,12 +14,12 @@ interactions: url: https://api.linode.com/v4beta/networking/firewalls method: POST response: - body: '{"id": 692860, "label": "linodego-fw-test", "created": "2018-01-02T03:04:05", + body: '{"id": 9618482, "label": "linodego-fw-test", "created": "2018-01-02T03:04:05", "updated": "2018-01-02T03:04:05", "status": "enabled", "rules": {"inbound": - [{"action": "ACCEPT", "label": "go-fwrule-test", "ports": "22", "protocol": - "TCP", "addresses": {"ipv4": ["0.0.0.0/0"], "ipv6": ["1234::5678/0"]}}], "inbound_policy": - "ACCEPT", "outbound": [{"action": "ACCEPT", "label": "go-fwrule-test", "ports": - "22", "protocol": "TCP", "addresses": {"ipv4": ["0.0.0.0/0"], "ipv6": ["1234::5678/0"]}}], + [{"protocol": "TCP", "addresses": {"ipv6": ["1234::5678/0"], "ipv4": ["0.0.0.0/0"]}, + "action": "ACCEPT", "label": "go-fwrule-test", "ports": "22"}], "inbound_policy": + "ACCEPT", "outbound": [{"protocol": "TCP", "addresses": {"ipv6": ["1234::5678/0"], "ipv4": + ["0.0.0.0/0"]}, "action": "ACCEPT", "label": "go-fwrule-test", "ports": "22"}], "outbound_policy": "ACCEPT", "version": 1, "fingerprint": "7bcc0f03"}, "tags": ["testing"], "entities": []}' headers: @@ -40,13 +40,13 @@ interactions: Connection: - keep-alive Content-Length: - - "583" + - "584" Content-Security-Policy: - default-src 'none' Content-Type: - application/json Expires: - - Thu, 25 Jul 2024 17:44:42 GMT + - Tue, 05 May 2026 23:45:08 GMT Pragma: - no-cache Strict-Transport-Security: @@ -61,12 +61,9 @@ interactions: - DENY - DENY X-Oauth-Scopes: - - account:read_write databases:read_write domains:read_write events:read_write - firewall:read_write images:read_write ips:read_write linodes:read_write lke:read_write - longview:read_write nodebalancers:read_write object_storage:read_write stackscripts:read_write - volumes:read_write vpc:read_write + - '*' X-Ratelimit-Limit: - - "400" + - "1840" X-Xss-Protection: - 1; mode=block status: 200 OK @@ -82,11 +79,11 @@ interactions: - application/json User-Agent: - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/networking/firewalls/692860/rules + url: https://api.linode.com/v4beta/networking/firewalls/9618482/rules method: PUT response: - body: '{"inbound": [{"action": "DROP", "label": "go-fwrule-test_r", "ports": "22", - "protocol": "TCP", "addresses": {"ipv4": ["0.0.0.0/0"], "ipv6": ["1234::5678/0"]}}], + body: '{"inbound": [{"protocol": "TCP", "addresses": {"ipv6": ["1234::5678/0"], "ipv4": + ["0.0.0.0/0"]}, "action": "DROP", "label": "go-fwrule-test_r", "ports": "22"}], "inbound_policy": "ACCEPT", "outbound": null, "outbound_policy": "ACCEPT", "version": 2, "fingerprint": "cddbc8f5"}' headers: @@ -113,7 +110,7 @@ interactions: Content-Type: - application/json Expires: - - Thu, 25 Jul 2024 17:44:42 GMT + - Tue, 05 May 2026 23:45:08 GMT Pragma: - no-cache Strict-Transport-Security: @@ -128,12 +125,9 @@ interactions: - DENY - DENY X-Oauth-Scopes: - - account:read_write databases:read_write domains:read_write events:read_write - firewall:read_write images:read_write ips:read_write linodes:read_write lke:read_write - longview:read_write nodebalancers:read_write object_storage:read_write stackscripts:read_write - volumes:read_write vpc:read_write + - '*' X-Ratelimit-Limit: - - "400" + - "1840" X-Xss-Protection: - 1; mode=block status: 200 OK @@ -149,11 +143,11 @@ interactions: - application/json User-Agent: - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/networking/firewalls/692860/rules + url: https://api.linode.com/v4beta/networking/firewalls/9618482/rules method: GET response: - body: '{"inbound": [{"action": "DROP", "label": "go-fwrule-test_r", "ports": "22", - "protocol": "TCP", "addresses": {"ipv4": ["0.0.0.0/0"], "ipv6": ["1234::5678/0"]}}], + body: '{"inbound": [{"protocol": "TCP", "addresses": {"ipv6": ["1234::5678/0"], "ipv4": + ["0.0.0.0/0"]}, "action": "DROP", "label": "go-fwrule-test_r", "ports": "22"}], "inbound_policy": "ACCEPT", "outbound": null, "outbound_policy": "ACCEPT", "version": 2, "fingerprint": "cddbc8f5"}' headers: @@ -180,7 +174,7 @@ interactions: Content-Type: - application/json Expires: - - Thu, 25 Jul 2024 17:44:42 GMT + - Tue, 05 May 2026 23:45:09 GMT Pragma: - no-cache Strict-Transport-Security: @@ -196,12 +190,9 @@ interactions: - DENY - DENY X-Oauth-Scopes: - - account:read_write databases:read_write domains:read_write events:read_write - firewall:read_write images:read_write ips:read_write linodes:read_write lke:read_write - longview:read_write nodebalancers:read_write object_storage:read_write stackscripts:read_write - volumes:read_write vpc:read_write + - '*' X-Ratelimit-Limit: - - "400" + - "1840" X-Xss-Protection: - 1; mode=block status: 200 OK @@ -217,7 +208,7 @@ interactions: - application/json User-Agent: - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/networking/firewalls/692860 + url: https://api.linode.com/v4beta/networking/firewalls/9618482 method: DELETE response: body: '{}' @@ -245,7 +236,7 @@ interactions: Content-Type: - application/json Expires: - - Thu, 25 Jul 2024 17:44:42 GMT + - Tue, 05 May 2026 23:45:09 GMT Pragma: - no-cache Strict-Transport-Security: @@ -260,12 +251,9 @@ interactions: - DENY - DENY X-Oauth-Scopes: - - account:read_write databases:read_write domains:read_write events:read_write - firewall:read_write images:read_write ips:read_write linodes:read_write lke:read_write - longview:read_write nodebalancers:read_write object_storage:read_write stackscripts:read_write - volumes:read_write vpc:read_write + - '*' X-Ratelimit-Limit: - - "400" + - "1840" X-Xss-Protection: - 1; mode=block status: 200 OK diff --git a/test/integration/fixtures/TestFirewallSettings_Get.yaml b/test/integration/fixtures/TestFirewallSettings_Get.yaml index 691d46647..f230c90d9 100644 --- a/test/integration/fixtures/TestFirewallSettings_Get.yaml +++ b/test/integration/fixtures/TestFirewallSettings_Get.yaml @@ -14,8 +14,8 @@ interactions: url: https://api.linode.com/v4beta/networking/firewalls/settings method: GET response: - body: '{"default_firewall_ids": {"linode": 2630203, "nodebalancer": 1629606, "public_interface": - 1629606, "vpc_interface": 1629606}}' + body: '{"default_firewall_ids": {"linode": null, "nodebalancer": null, "public_interface": + null, "vpc_interface": null}}' headers: Access-Control-Allow-Credentials: - "true" @@ -34,13 +34,13 @@ interactions: Connection: - keep-alive Content-Length: - - "125" + - "113" Content-Security-Policy: - default-src 'none' Content-Type: - application/json Expires: - - Fri, 20 Jun 2025 21:00:18 GMT + - Tue, 05 May 2026 23:45:26 GMT Pragma: - no-cache Strict-Transport-Security: @@ -58,7 +58,7 @@ interactions: X-Oauth-Scopes: - '*' X-Ratelimit-Limit: - - "1600" + - "1840" X-Xss-Protection: - 1; mode=block status: 200 OK diff --git a/test/integration/fixtures/TestFirewallSettings_UpdateAllFields.yaml b/test/integration/fixtures/TestFirewallSettings_UpdateAllFields.yaml index 9899636ed..af7364f03 100644 --- a/test/integration/fixtures/TestFirewallSettings_UpdateAllFields.yaml +++ b/test/integration/fixtures/TestFirewallSettings_UpdateAllFields.yaml @@ -2,7 +2,7 @@ version: 1 interactions: - request: - body: '{"label":"fw-allfields-1750453218573434000","rules":{"inbound":[{"action":"ACCEPT","label":"go-fwrule-test","ports":"22","protocol":"TCP","addresses":{"ipv4":["0.0.0.0/0"],"ipv6":["1234::5678/0"]}}],"inbound_policy":"ACCEPT","outbound":[{"action":"ACCEPT","label":"go-fwrule-test","ports":"22","protocol":"TCP","addresses":{"ipv4":["0.0.0.0/0"],"ipv6":["1234::5678/0"]}}],"outbound_policy":"ACCEPT"},"tags":["testing"],"devices":{}}' + body: '{"label":"fw-allfields-1778024726382972000","rules":{"inbound":[{"action":"ACCEPT","label":"go-fwrule-test","ports":"22","protocol":"TCP","addresses":{"ipv4":["0.0.0.0/0"],"ipv6":["1234::5678/0"]}}],"inbound_policy":"ACCEPT","outbound":[{"action":"ACCEPT","label":"go-fwrule-test","ports":"22","protocol":"TCP","addresses":{"ipv4":["0.0.0.0/0"],"ipv6":["1234::5678/0"]}}],"outbound_policy":"ACCEPT"},"tags":["testing"]}' form: {} headers: Accept: @@ -14,7 +14,7 @@ interactions: url: https://api.linode.com/v4beta/networking/firewalls method: POST response: - body: '{"id": 2898496, "label": "fw-allfields-1750453218573434000", "created": + body: '{"id": 9618684, "label": "fw-allfields-1778024726382972000", "created": "2018-01-02T03:04:05", "updated": "2018-01-02T03:04:05", "status": "enabled", "rules": {"inbound": [{"protocol": "TCP", "addresses": {"ipv6": ["1234::5678/0"], "ipv4": ["0.0.0.0/0"]}, "action": "ACCEPT", "label": "go-fwrule-test", "ports": "22"}], @@ -46,7 +46,7 @@ interactions: Content-Type: - application/json Expires: - - Fri, 20 Jun 2025 21:00:18 GMT + - Tue, 05 May 2026 23:45:26 GMT Pragma: - no-cache Strict-Transport-Security: @@ -63,7 +63,7 @@ interactions: X-Oauth-Scopes: - '*' X-Ratelimit-Limit: - - "1600" + - "1840" X-Xss-Protection: - 1; mode=block status: 200 OK @@ -82,8 +82,8 @@ interactions: url: https://api.linode.com/v4beta/networking/firewalls/settings method: GET response: - body: '{"default_firewall_ids": {"linode": 2630203, "nodebalancer": 1629606, "public_interface": - 1629606, "vpc_interface": 1629606}}' + body: '{"default_firewall_ids": {"linode": null, "nodebalancer": null, "public_interface": + null, "vpc_interface": null}}' headers: Access-Control-Allow-Credentials: - "true" @@ -102,13 +102,13 @@ interactions: Connection: - keep-alive Content-Length: - - "125" + - "113" Content-Security-Policy: - default-src 'none' Content-Type: - application/json Expires: - - Fri, 20 Jun 2025 21:00:18 GMT + - Tue, 05 May 2026 23:45:26 GMT Pragma: - no-cache Strict-Transport-Security: @@ -126,14 +126,14 @@ interactions: X-Oauth-Scopes: - '*' X-Ratelimit-Limit: - - "1600" + - "1840" X-Xss-Protection: - 1; mode=block status: 200 OK code: 200 duration: "" - request: - body: '{"default_firewall_ids":{"linode":2898496,"nodebalancer":2898496,"public_interface":2898496,"vpc_interface":2898496}}' + body: '{"default_firewall_ids":{"linode":9618684,"nodebalancer":9618684,"public_interface":9618684,"vpc_interface":9618684}}' form: {} headers: Accept: @@ -145,8 +145,8 @@ interactions: url: https://api.linode.com/v4beta/networking/firewalls/settings method: PUT response: - body: '{"default_firewall_ids": {"linode": 2898496, "nodebalancer": 2898496, "public_interface": - 2898496, "vpc_interface": 2898496}}' + body: '{"default_firewall_ids": {"linode": 9618684, "nodebalancer": 9618684, "public_interface": + 9618684, "vpc_interface": 9618684}}' headers: Access-Control-Allow-Credentials: - "true" @@ -171,7 +171,7 @@ interactions: Content-Type: - application/json Expires: - - Fri, 20 Jun 2025 21:00:19 GMT + - Tue, 05 May 2026 23:45:27 GMT Pragma: - no-cache Strict-Transport-Security: @@ -188,14 +188,14 @@ interactions: X-Oauth-Scopes: - '*' X-Ratelimit-Limit: - - "1600" + - "1840" X-Xss-Protection: - 1; mode=block status: 200 OK code: 200 duration: "" - request: - body: '{"default_firewall_ids":{"linode":2630203,"nodebalancer":1629606,"public_interface":1629606,"vpc_interface":1629606}}' + body: '{"default_firewall_ids":{"linode":null,"nodebalancer":null,"public_interface":null,"vpc_interface":null}}' form: {} headers: Accept: @@ -207,8 +207,8 @@ interactions: url: https://api.linode.com/v4beta/networking/firewalls/settings method: PUT response: - body: '{"default_firewall_ids": {"linode": 2630203, "nodebalancer": 1629606, "public_interface": - 1629606, "vpc_interface": 1629606}}' + body: '{"default_firewall_ids": {"linode": null, "nodebalancer": null, "public_interface": + null, "vpc_interface": null}}' headers: Access-Control-Allow-Credentials: - "true" @@ -227,13 +227,13 @@ interactions: Connection: - keep-alive Content-Length: - - "125" + - "113" Content-Security-Policy: - default-src 'none' Content-Type: - application/json Expires: - - Fri, 20 Jun 2025 21:00:19 GMT + - Tue, 05 May 2026 23:45:27 GMT Pragma: - no-cache Strict-Transport-Security: @@ -250,7 +250,7 @@ interactions: X-Oauth-Scopes: - '*' X-Ratelimit-Limit: - - "1600" + - "1840" X-Xss-Protection: - 1; mode=block status: 200 OK @@ -266,7 +266,7 @@ interactions: - application/json User-Agent: - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/networking/firewalls/2898496 + url: https://api.linode.com/v4beta/networking/firewalls/9618684 method: DELETE response: body: '{}' @@ -294,7 +294,7 @@ interactions: Content-Type: - application/json Expires: - - Fri, 20 Jun 2025 21:00:19 GMT + - Tue, 05 May 2026 23:45:27 GMT Pragma: - no-cache Strict-Transport-Security: @@ -311,7 +311,7 @@ interactions: X-Oauth-Scopes: - '*' X-Ratelimit-Limit: - - "1600" + - "1840" X-Xss-Protection: - 1; mode=block status: 200 OK diff --git a/test/integration/fixtures/TestFirewallSettings_UpdatePartial.yaml b/test/integration/fixtures/TestFirewallSettings_UpdatePartial.yaml index 04c46d9b9..5450847b2 100644 --- a/test/integration/fixtures/TestFirewallSettings_UpdatePartial.yaml +++ b/test/integration/fixtures/TestFirewallSettings_UpdatePartial.yaml @@ -2,7 +2,7 @@ version: 1 interactions: - request: - body: '{"label":"fw-partial-1750453219295619000","rules":{"inbound":[{"action":"ACCEPT","label":"go-fwrule-test","ports":"22","protocol":"TCP","addresses":{"ipv4":["0.0.0.0/0"],"ipv6":["1234::5678/0"]}}],"inbound_policy":"ACCEPT","outbound":[{"action":"ACCEPT","label":"go-fwrule-test","ports":"22","protocol":"TCP","addresses":{"ipv4":["0.0.0.0/0"],"ipv6":["1234::5678/0"]}}],"outbound_policy":"ACCEPT"},"tags":["testing"],"devices":{}}' + body: '{"label":"fw-partial-1778024727842672000","rules":{"inbound":[{"action":"ACCEPT","label":"go-fwrule-test","ports":"22","protocol":"TCP","addresses":{"ipv4":["0.0.0.0/0"],"ipv6":["1234::5678/0"]}}],"inbound_policy":"ACCEPT","outbound":[{"action":"ACCEPT","label":"go-fwrule-test","ports":"22","protocol":"TCP","addresses":{"ipv4":["0.0.0.0/0"],"ipv6":["1234::5678/0"]}}],"outbound_policy":"ACCEPT"},"tags":["testing"]}' form: {} headers: Accept: @@ -14,7 +14,7 @@ interactions: url: https://api.linode.com/v4beta/networking/firewalls method: POST response: - body: '{"id": 2898497, "label": "fw-partial-1750453219295619000", "created": "2018-01-02T03:04:05", + body: '{"id": 9618701, "label": "fw-partial-1778024727842672000", "created": "2018-01-02T03:04:05", "updated": "2018-01-02T03:04:05", "status": "enabled", "rules": {"inbound": [{"protocol": "TCP", "addresses": {"ipv6": ["1234::5678/0"], "ipv4": ["0.0.0.0/0"]}, "action": "ACCEPT", "label": "go-fwrule-test", "ports": "22"}], "inbound_policy": @@ -46,7 +46,7 @@ interactions: Content-Type: - application/json Expires: - - Fri, 20 Jun 2025 21:00:19 GMT + - Tue, 05 May 2026 23:45:28 GMT Pragma: - no-cache Strict-Transport-Security: @@ -63,7 +63,7 @@ interactions: X-Oauth-Scopes: - '*' X-Ratelimit-Limit: - - "1600" + - "1840" X-Xss-Protection: - 1; mode=block status: 200 OK @@ -82,8 +82,8 @@ interactions: url: https://api.linode.com/v4beta/networking/firewalls/settings method: GET response: - body: '{"default_firewall_ids": {"linode": 2630203, "nodebalancer": 1629606, "public_interface": - 1629606, "vpc_interface": 1629606}}' + body: '{"default_firewall_ids": {"linode": null, "nodebalancer": null, "public_interface": + null, "vpc_interface": null}}' headers: Access-Control-Allow-Credentials: - "true" @@ -102,13 +102,13 @@ interactions: Connection: - keep-alive Content-Length: - - "125" + - "113" Content-Security-Policy: - default-src 'none' Content-Type: - application/json Expires: - - Fri, 20 Jun 2025 21:00:19 GMT + - Tue, 05 May 2026 23:45:28 GMT Pragma: - no-cache Strict-Transport-Security: @@ -126,14 +126,14 @@ interactions: X-Oauth-Scopes: - '*' X-Ratelimit-Limit: - - "1600" + - "1840" X-Xss-Protection: - 1; mode=block status: 200 OK code: 200 duration: "" - request: - body: '{"default_firewall_ids":{"linode":2898497}}' + body: '{"default_firewall_ids":{"linode":9618701}}' form: {} headers: Accept: @@ -145,8 +145,8 @@ interactions: url: https://api.linode.com/v4beta/networking/firewalls/settings method: PUT response: - body: '{"default_firewall_ids": {"linode": 2898497, "nodebalancer": 1629606, "public_interface": - 1629606, "vpc_interface": 1629606}}' + body: '{"default_firewall_ids": {"linode": 9618701, "nodebalancer": null, "public_interface": + null, "vpc_interface": null}}' headers: Access-Control-Allow-Credentials: - "true" @@ -165,13 +165,13 @@ interactions: Connection: - keep-alive Content-Length: - - "125" + - "116" Content-Security-Policy: - default-src 'none' Content-Type: - application/json Expires: - - Fri, 20 Jun 2025 21:00:19 GMT + - Tue, 05 May 2026 23:45:28 GMT Pragma: - no-cache Strict-Transport-Security: @@ -188,14 +188,14 @@ interactions: X-Oauth-Scopes: - '*' X-Ratelimit-Limit: - - "1600" + - "1840" X-Xss-Protection: - 1; mode=block status: 200 OK code: 200 duration: "" - request: - body: '{"default_firewall_ids":{"linode":2630203,"nodebalancer":1629606,"public_interface":1629606,"vpc_interface":1629606}}' + body: '{"default_firewall_ids":{"linode":null,"nodebalancer":null,"public_interface":null,"vpc_interface":null}}' form: {} headers: Accept: @@ -207,8 +207,8 @@ interactions: url: https://api.linode.com/v4beta/networking/firewalls/settings method: PUT response: - body: '{"default_firewall_ids": {"linode": 2630203, "nodebalancer": 1629606, "public_interface": - 1629606, "vpc_interface": 1629606}}' + body: '{"default_firewall_ids": {"linode": null, "nodebalancer": null, "public_interface": + null, "vpc_interface": null}}' headers: Access-Control-Allow-Credentials: - "true" @@ -227,13 +227,13 @@ interactions: Connection: - keep-alive Content-Length: - - "125" + - "113" Content-Security-Policy: - default-src 'none' Content-Type: - application/json Expires: - - Fri, 20 Jun 2025 21:00:19 GMT + - Tue, 05 May 2026 23:45:28 GMT Pragma: - no-cache Strict-Transport-Security: @@ -250,7 +250,7 @@ interactions: X-Oauth-Scopes: - '*' X-Ratelimit-Limit: - - "1600" + - "1840" X-Xss-Protection: - 1; mode=block status: 200 OK @@ -266,7 +266,7 @@ interactions: - application/json User-Agent: - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/networking/firewalls/2898497 + url: https://api.linode.com/v4beta/networking/firewalls/9618701 method: DELETE response: body: '{}' @@ -294,7 +294,7 @@ interactions: Content-Type: - application/json Expires: - - Fri, 20 Jun 2025 21:00:19 GMT + - Tue, 05 May 2026 23:45:28 GMT Pragma: - no-cache Strict-Transport-Security: @@ -311,7 +311,7 @@ interactions: X-Oauth-Scopes: - '*' X-Ratelimit-Limit: - - "1600" + - "1840" X-Xss-Protection: - 1; mode=block status: 200 OK diff --git a/test/integration/fixtures/TestFirewallTemplate_Get.yaml b/test/integration/fixtures/TestFirewallTemplate_Get.yaml index a3eb6eba3..915d533c2 100644 --- a/test/integration/fixtures/TestFirewallTemplate_Get.yaml +++ b/test/integration/fixtures/TestFirewallTemplate_Get.yaml @@ -14,12 +14,12 @@ interactions: url: https://api.linode.com/v4beta/networking/firewalls/templates/public method: GET response: - body: '{"slug": "public", "rules": {"inbound": [{"action": "ACCEPT", "addresses": - {"ipv4": ["0.0.0.0/0"], "ipv6": ["1234::5678/0"]}, "ports": "22", "protocol": "TCP", - "label": "accept-inbound-ssh", "description": "Accept inbound SSH"}, {"action": - "ACCEPT", "addresses": {"ipv4": ["0.0.0.0/0"], "ipv6": ["1234::5678/0"]}, "protocol": - "ICMP", "label": "accept-inbound-icmp", "description": "Accept inbound ICMP"}], - "inbound_policy": "DROP", "outbound": [], "outbound_policy": "ACCEPT"}}' + body: '{"slug": "public", "rules": {"inbound": [{"protocol": "TCP", "addresses": + {"ipv6": ["1234::5678/0"], "ipv4": ["0.0.0.0/0"]}, "action": "ACCEPT", "label": "accept-inbound-ssh", + "ports": "22", "description": "Accept inbound SSH"}, {"protocol": "ICMP", "addresses": + {"ipv6": ["1234::5678/0"], "ipv4": ["0.0.0.0/0"]}, "action": "ACCEPT", "label": "accept-inbound-icmp", + "description": "Accept inbound ICMP"}], "inbound_policy": "DROP", "outbound": + [], "outbound_policy": "ACCEPT"}}' headers: Access-Control-Allow-Credentials: - "true" @@ -44,7 +44,7 @@ interactions: Content-Type: - application/json Expires: - - Mon, 21 Apr 2025 07:03:52 GMT + - Tue, 05 May 2026 23:45:07 GMT Pragma: - no-cache Strict-Transport-Security: @@ -62,7 +62,7 @@ interactions: X-Oauth-Scopes: - '*' X-Ratelimit-Limit: - - "1600" + - "1840" X-Xss-Protection: - 1; mode=block status: 200 OK diff --git a/test/integration/fixtures/TestFirewallTemplates_List.yaml b/test/integration/fixtures/TestFirewallTemplates_List.yaml index bf2f1666f..1137c0b57 100644 --- a/test/integration/fixtures/TestFirewallTemplates_List.yaml +++ b/test/integration/fixtures/TestFirewallTemplates_List.yaml @@ -14,37 +14,36 @@ interactions: url: https://api.linode.com/v4beta/networking/firewalls/templates?page=1 method: GET response: - body: '{"data": [{"slug": "akamai-non-prod", "rules": {"inbound": [{"action": - "ACCEPT", "addresses": {"ipv4": ["0.0.0.0/0"], "ipv6": ["1234::5678/0"]}, "protocol": - "ICMP", "label": "accept-inbound-icmp", "description": "Accept inbound ICMP"}, - {"action": "ACCEPT", "addresses": {"ipv4": ["172.236.119.4/30", "172.234.160.4/30", - "172.236.94.4/30"], "ipv6": ["1234::5678/128", "1234::5678/128", + body: '{"data": [{"slug": "akamai-non-prod", "rules": {"inbound": [{"protocol": + "ICMP", "addresses": {"ipv6": ["1234::5678/0"], "ipv4": ["0.0.0.0/0"]}, "action": "ACCEPT", + "label": "accept-inbound-icmp", "description": "Accept inbound ICMP"}, {"protocol": + "TCP", "addresses": {"ipv6": ["1234::5678/128", "1234::5678/128", "1234::5678/128", "1234::5678/128", "1234::5678/128", "1234::5678/128", "1234::5678/128", "1234::5678/128", - "1234::5678/128"]}, "ports": "22,443", "protocol": "TCP", - "label": "accept-inbound-tcp-ssh-proxies", "description": "Accept inbound TCP - from SSH proxies"}, {"action": "ACCEPT", "addresses": {"ipv4": ["139.144.212.168/31", - "172.232.23.164/31"]}, "ports": "22,443", "protocol": "TCP", "label": "accept-inbound-tcp-eaa-proxies", - "description": "Accept inbound TCP from EAA proxies"}], "inbound_policy": "DROP", - "outbound": [], "outbound_policy": "ACCEPT"}}, {"slug": "vpc", "rules": {"inbound": - [{"action": "ACCEPT", "addresses": {"ipv4": ["0.0.0.0/0"], "ipv6": ["1234::5678/0"]}, - "ports": "22", "protocol": "TCP", "label": "accept-inbound-ssh", "description": - "Accept inbound SSH"}, {"action": "ACCEPT", "addresses": {"ipv4": ["0.0.0.0/0"], - "ipv6": ["1234::5678/0"]}, "protocol": "ICMP", "label": "accept-inbound-icmp", "description": - "Accept inbound ICMP"}, {"action": "ACCEPT", "addresses": {"ipv4": ["10.0.0.0/8", - "192.168.0.0/17", "172.16.0.0/12"]}, "ports": "1-65535", "protocol": "TCP", - "label": "accept-inbound-rfc1918", "description": "Accept inbound RFC-1918"}, - {"action": "ACCEPT", "addresses": {"ipv4": ["10.0.0.0/8", "192.168.0.0/17", - "172.16.0.0/12"]}, "description": "Accept inbound RFC-1918", "label": "accept-inbound-rfc1918", - "ports": "1-65535", "protocol": "UDP"}], "inbound_policy": "DROP", "outbound": - [], "outbound_policy": "ACCEPT"}}, {"slug": "public", "rules": {"inbound": [{"action": - "ACCEPT", "addresses": {"ipv4": ["0.0.0.0/0"], "ipv6": ["1234::5678/0"]}, "ports": "22", - "protocol": "TCP", "label": "accept-inbound-ssh", "description": "Accept inbound - SSH"}, {"action": "ACCEPT", "addresses": {"ipv4": ["0.0.0.0/0"], "ipv6": ["1234::5678/0"]}, - "protocol": "ICMP", "label": "accept-inbound-icmp", "description": "Accept inbound - ICMP"}], "inbound_policy": "DROP", "outbound": [], "outbound_policy": "ACCEPT"}}], - "page": 1, "pages": 1, "results": 3}' + "1234::5678/128"], "ipv4": ["172.236.119.4/30", "172.234.160.4/30", + "172.236.94.4/30"]}, "action": "ACCEPT", "label": "accept-inbound-tcp-ssh-proxies", + "ports": "22,443", "description": "Accept inbound TCP from SSH proxies"}, {"protocol": + "TCP", "addresses": {"ipv4": ["139.144.212.168/31", "172.232.23.164/31"]}, "action": + "ACCEPT", "label": "accept-inbound-tcp-eaa-proxies", "ports": "22,443", "description": + "Accept inbound TCP from EAA proxies"}], "inbound_policy": "DROP", "outbound": + [], "outbound_policy": "ACCEPT"}}, {"slug": "vpc", "rules": {"inbound": [{"protocol": + "TCP", "addresses": {"ipv6": ["1234::5678/0"], "ipv4": ["0.0.0.0/0"]}, "action": "ACCEPT", + "label": "accept-inbound-ssh", "ports": "22", "description": "Accept inbound + SSH"}, {"protocol": "ICMP", "addresses": {"ipv6": ["1234::5678/0"], "ipv4": ["0.0.0.0/0"]}, + "action": "ACCEPT", "label": "accept-inbound-icmp", "description": "Accept inbound + ICMP"}, {"protocol": "TCP", "addresses": {"ipv4": ["10.0.0.0/8", "192.168.0.0/17", + "172.16.0.0/12"]}, "action": "ACCEPT", "label": "accept-inbound-rfc1918", "ports": + "1-65535", "description": "Accept inbound RFC-1918"}, {"protocol": "UDP", "addresses": + {"ipv4": ["10.0.0.0/8", "192.168.0.0/17", "172.16.0.0/12"]}, "action": "ACCEPT", + "label": "accept-inbound-rfc1918", "ports": "1-65535", "description": "Accept + inbound RFC-1918"}], "inbound_policy": "DROP", "outbound": [], "outbound_policy": + "ACCEPT"}}, {"slug": "public", "rules": {"inbound": [{"protocol": "TCP", "addresses": + {"ipv6": ["1234::5678/0"], "ipv4": ["0.0.0.0/0"]}, "action": "ACCEPT", "label": "accept-inbound-ssh", + "ports": "22", "description": "Accept inbound SSH"}, {"protocol": "ICMP", "addresses": + {"ipv6": ["1234::5678/0"], "ipv4": ["0.0.0.0/0"]}, "action": "ACCEPT", "label": "accept-inbound-icmp", + "description": "Accept inbound ICMP"}], "inbound_policy": "DROP", "outbound": + [], "outbound_policy": "ACCEPT"}}], "page": 1, "pages": 1, "results": 3}' headers: Access-Control-Allow-Credentials: - "true" @@ -67,7 +66,7 @@ interactions: Content-Type: - application/json Expires: - - Mon, 21 Apr 2025 07:03:52 GMT + - Tue, 05 May 2026 23:45:07 GMT Pragma: - no-cache Strict-Transport-Security: @@ -86,7 +85,7 @@ interactions: X-Oauth-Scopes: - '*' X-Ratelimit-Limit: - - "1600" + - "1840" X-Xss-Protection: - 1; mode=block status: 200 OK diff --git a/test/integration/fixtures/TestFirewall_Get.yaml b/test/integration/fixtures/TestFirewall_Get.yaml index 74b990201..fe797ac97 100644 --- a/test/integration/fixtures/TestFirewall_Get.yaml +++ b/test/integration/fixtures/TestFirewall_Get.yaml @@ -14,7 +14,7 @@ interactions: url: https://api.linode.com/v4beta/networking/firewalls method: POST response: - body: '{"id": 3885331, "label": "linodego-fw-test", "created": "2018-01-02T03:04:05", + body: '{"id": 9618661, "label": "linodego-fw-test", "created": "2018-01-02T03:04:05", "updated": "2018-01-02T03:04:05", "status": "enabled", "rules": {"inbound": [{"protocol": "ICMP", "addresses": {"ipv6": ["1234::5678/0"], "ipv4": ["0.0.0.0/0"]}, "action": "DROP", "label": "linodego-fwrule-test"}], "inbound_policy": "ACCEPT", @@ -44,7 +44,7 @@ interactions: Content-Type: - application/json Expires: - - Sat, 28 Feb 2026 04:56:47 GMT + - Tue, 05 May 2026 23:45:24 GMT Pragma: - no-cache Strict-Transport-Security: @@ -77,10 +77,10 @@ interactions: - application/json User-Agent: - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/networking/firewalls/3885331 + url: https://api.linode.com/v4beta/networking/firewalls/9618661 method: GET response: - body: '{"id": 3885331, "label": "linodego-fw-test", "created": "2018-01-02T03:04:05", + body: '{"id": 9618661, "label": "linodego-fw-test", "created": "2018-01-02T03:04:05", "updated": "2018-01-02T03:04:05", "status": "enabled", "rules": {"inbound": [{"protocol": "ICMP", "addresses": {"ipv6": ["1234::5678/0"], "ipv4": ["0.0.0.0/0"]}, "action": "DROP", "label": "linodego-fwrule-test"}], "inbound_policy": "ACCEPT", @@ -110,7 +110,7 @@ interactions: Content-Type: - application/json Expires: - - Sat, 28 Feb 2026 04:56:47 GMT + - Tue, 05 May 2026 23:45:24 GMT Pragma: - no-cache Strict-Transport-Security: @@ -144,7 +144,7 @@ interactions: - application/json User-Agent: - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/networking/firewalls/3885331 + url: https://api.linode.com/v4beta/networking/firewalls/9618661 method: DELETE response: body: '{}' @@ -172,7 +172,7 @@ interactions: Content-Type: - application/json Expires: - - Sat, 28 Feb 2026 04:56:48 GMT + - Tue, 05 May 2026 23:45:24 GMT Pragma: - no-cache Strict-Transport-Security: diff --git a/test/integration/fixtures/TestFirewall_Update.yaml b/test/integration/fixtures/TestFirewall_Update.yaml index 4cd900d81..97bf03c5a 100644 --- a/test/integration/fixtures/TestFirewall_Update.yaml +++ b/test/integration/fixtures/TestFirewall_Update.yaml @@ -14,7 +14,7 @@ interactions: url: https://api.linode.com/v4beta/networking/firewalls method: POST response: - body: '{"id": 3885332, "label": "linodego-fw-test", "created": "2018-01-02T03:04:05", + body: '{"id": 9618668, "label": "linodego-fw-test", "created": "2018-01-02T03:04:05", "updated": "2018-01-02T03:04:05", "status": "enabled", "rules": {"inbound": [{"protocol": "ICMP", "addresses": {"ipv4": ["0.0.0.0/0"]}, "action": "DROP", "label": "linodego-fwrule-test"}], "inbound_policy": "ACCEPT", "outbound": null, @@ -44,7 +44,7 @@ interactions: Content-Type: - application/json Expires: - - Sat, 28 Feb 2026 04:56:48 GMT + - Tue, 05 May 2026 23:45:25 GMT Pragma: - no-cache Strict-Transport-Security: @@ -77,10 +77,10 @@ interactions: - application/json User-Agent: - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/networking/firewalls/3885332 + url: https://api.linode.com/v4beta/networking/firewalls/9618668 method: PUT response: - body: '{"id": 3885332, "label": "linodego-fw-test-updated", "created": "2018-01-02T03:04:05", + body: '{"id": 9618668, "label": "linodego-fw-test-updated", "created": "2018-01-02T03:04:05", "updated": "2018-01-02T03:04:05", "status": "disabled", "rules": {"inbound": [{"protocol": "ICMP", "addresses": {"ipv4": ["0.0.0.0/0"]}, "action": "DROP", "label": "linodego-fwrule-test"}], "inbound_policy": "ACCEPT", "outbound": null, @@ -110,7 +110,7 @@ interactions: Content-Type: - application/json Expires: - - Sat, 28 Feb 2026 04:56:48 GMT + - Tue, 05 May 2026 23:45:25 GMT Pragma: - no-cache Strict-Transport-Security: @@ -143,7 +143,7 @@ interactions: - application/json User-Agent: - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/networking/firewalls/3885332 + url: https://api.linode.com/v4beta/networking/firewalls/9618668 method: DELETE response: body: '{}' @@ -171,7 +171,7 @@ interactions: Content-Type: - application/json Expires: - - Sat, 28 Feb 2026 04:56:49 GMT + - Tue, 05 May 2026 23:45:26 GMT Pragma: - no-cache Strict-Transport-Security: diff --git a/test/integration/fixtures/TestFirewalls_List.yaml b/test/integration/fixtures/TestFirewalls_List.yaml index 5c5e853db..d808777f2 100644 --- a/test/integration/fixtures/TestFirewalls_List.yaml +++ b/test/integration/fixtures/TestFirewalls_List.yaml @@ -2,7 +2,7 @@ version: 1 interactions: - request: - body: '{"label":"linodego-fw-test","rules":{"inbound":[{"action":"ACCEPT","label":"go-fwrule-test","ports":"22","protocol":"TCP","addresses":{"ipv4":["0.0.0.0/0"],"ipv6":["1234::5678/0"]}}],"inbound_policy":"ACCEPT","outbound":[{"action":"ACCEPT","label":"go-fwrule-test","ports":"22","protocol":"TCP","addresses":{"ipv4":["0.0.0.0/0"],"ipv6":["1234::5678/0"]}}],"outbound_policy":"ACCEPT"},"tags":["testing"],"devices":{}}' + body: '{"label":"linodego-fw-test","rules":{"inbound":[{"action":"ACCEPT","label":"go-fwrule-test","ports":"22","protocol":"TCP","addresses":{"ipv4":["0.0.0.0/0"],"ipv6":["1234::5678/0"]}}],"inbound_policy":"ACCEPT","outbound":[{"action":"ACCEPT","label":"go-fwrule-test","ports":"22","protocol":"TCP","addresses":{"ipv4":["0.0.0.0/0"],"ipv6":["1234::5678/0"]}}],"outbound_policy":"ACCEPT"},"tags":["testing"]}' form: {} headers: Accept: @@ -14,12 +14,12 @@ interactions: url: https://api.linode.com/v4beta/networking/firewalls method: POST response: - body: '{"id": 692864, "label": "linodego-fw-test", "created": "2018-01-02T03:04:05", + body: '{"id": 9618652, "label": "linodego-fw-test", "created": "2018-01-02T03:04:05", "updated": "2018-01-02T03:04:05", "status": "enabled", "rules": {"inbound": - [{"action": "ACCEPT", "label": "go-fwrule-test", "ports": "22", "protocol": - "TCP", "addresses": {"ipv4": ["0.0.0.0/0"], "ipv6": ["1234::5678/0"]}}], "inbound_policy": - "ACCEPT", "outbound": [{"action": "ACCEPT", "label": "go-fwrule-test", "ports": - "22", "protocol": "TCP", "addresses": {"ipv4": ["0.0.0.0/0"], "ipv6": ["1234::5678/0"]}}], + [{"protocol": "TCP", "addresses": {"ipv6": ["1234::5678/0"], "ipv4": ["0.0.0.0/0"]}, + "action": "ACCEPT", "label": "go-fwrule-test", "ports": "22"}], "inbound_policy": + "ACCEPT", "outbound": [{"protocol": "TCP", "addresses": {"ipv6": ["1234::5678/0"], "ipv4": + ["0.0.0.0/0"]}, "action": "ACCEPT", "label": "go-fwrule-test", "ports": "22"}], "outbound_policy": "ACCEPT", "version": 1, "fingerprint": "7bcc0f03"}, "tags": ["testing"], "entities": []}' headers: @@ -40,13 +40,13 @@ interactions: Connection: - keep-alive Content-Length: - - "583" + - "584" Content-Security-Policy: - default-src 'none' Content-Type: - application/json Expires: - - Thu, 25 Jul 2024 17:44:49 GMT + - Tue, 05 May 2026 23:45:23 GMT Pragma: - no-cache Strict-Transport-Security: @@ -61,12 +61,9 @@ interactions: - DENY - DENY X-Oauth-Scopes: - - account:read_write databases:read_write domains:read_write events:read_write - firewall:read_write images:read_write ips:read_write linodes:read_write lke:read_write - longview:read_write nodebalancers:read_write object_storage:read_write stackscripts:read_write - volumes:read_write vpc:read_write + - '*' X-Ratelimit-Limit: - - "400" + - "1840" X-Xss-Protection: - 1; mode=block status: 200 OK @@ -85,105 +82,91 @@ interactions: url: https://api.linode.com/v4beta/networking/firewalls?page=1 method: GET response: - body: '{"data": [{"id": 433514, "label": "test-fw", "created": "2018-01-02T03:04:05", + body: '{"data": [{"id": 1629606, "label": "akamai-non-prod-1", "created": "2018-01-02T03:04:05", "updated": "2018-01-02T03:04:05", "status": "enabled", "rules": {"inbound": - [{"action": "ACCEPT", "addresses": {"ipv4": ["0.0.0.0/0"], "ipv6": ["1234::5678/0"]}, - "ports": "22", "protocol": "TCP", "label": "accept-inbound-SSH", "description": - null}], "inbound_policy": "DROP", "outbound": [], "outbound_policy": "ACCEPT", - "version": 4, "fingerprint": "20eec66f"}, "tags": [], "entities": [{"id": 57328123, - "type": "linode", "label": "debian-us-central", "url": "/v4/linode/instances/57328123"}, - {"id": 54748754, "type": "linode", "label": "debian-us-ord", "url": "/v4/linode/instances/54748754"}]}, - {"id": 624183, "label": "e2e-firewall-izUKXM", "created": "2018-01-02T03:04:05", + [{"protocol": "ICMP", "addresses": {"ipv6": ["1234::5678/0"], "ipv4": ["0.0.0.0/0"]}, + "action": "ACCEPT", "label": "accept-inbound-icmp", "description": "Accept inbound + ICMP"}, {"protocol": "TCP", "addresses": {"ipv6": ["1234::5678/128", + "1234::5678/128", "1234::5678/128", + "1234::5678/128", "1234::5678/128", + "1234::5678/128", "1234::5678/128", + "1234::5678/128", "1234::5678/128"], + "ipv4": ["172.236.119.4/30", "172.234.160.4/30", "172.236.94.4/30"]}, "action": + "ACCEPT", "label": "accept-inbound-tcp-ssh-proxies", "ports": "22,443", "description": + "Accept inbound TCP from SSH proxies"}, {"protocol": "TCP", "addresses": {"ipv4": + ["139.144.212.168/31", "172.232.23.164/31"]}, "action": "ACCEPT", "label": "accept-inbound-tcp-eaa-proxies", + "ports": "22,443", "description": "Accept inbound TCP from EAA proxies"}], "inbound_policy": + "DROP", "outbound": [], "outbound_policy": "ACCEPT", "version": 1, "fingerprint": + "aaa34813"}, "tags": ["linuke-keep"], "entities": [{"id": 379283, "type": "linode_interface", + "label": null, "url": "/v4/linode/instances/97114135/interfaces/379283", "parent_entity": + {"id": 97114135, "type": "linode", "label": "test-mcp", "url": "/v4/linode/instances/97114135", + "parent_entity": null}}]}, {"id": 6487222, "label": "tf_test-4730363105259144210", + "created": "2018-01-02T03:04:05", "updated": "2018-01-02T03:04:05", "status": + "enabled", "rules": {"inbound": [{"protocol": "TCP", "addresses": {"ipv6": ["1234::5678/128"], + "ipv4": ["74.102.235.249/32"]}, "action": "ACCEPT", "label": "tcp_inbound_ssh_accept_local", + "ports": "22"}], "inbound_policy": "DROP", "outbound": [], "outbound_policy": + "ACCEPT", "version": 1, "fingerprint": "5aa2d804"}, "tags": [], "entities": + []}, {"id": 6487694, "label": "tf_test-8181405914570718692", "created": "2018-01-02T03:04:05", "updated": "2018-01-02T03:04:05", "status": "enabled", "rules": {"inbound": - [{"label": "ssh-accept-inbound-rule", "addresses": {"ipv4": ["207.172.164.59/32"]}, - "description": "ACCEPT SSH from test machine", "ports": "22", "protocol": "TCP", - "action": "ACCEPT"}], "inbound_policy": "DROP", "outbound": [], "outbound_policy": - "ACCEPT", "version": 1, "fingerprint": "45912779"}, "tags": [], "entities": - []}, {"id": 624308, "label": "e2e-firewall-svVoqB", "created": "2018-01-02T03:04:05", + [{"protocol": "TCP", "addresses": {"ipv6": ["1234::5678/128"], + "ipv4": ["74.102.235.249/32"]}, "action": "ACCEPT", "label": "tcp_inbound_ssh_accept_local", + "ports": "22"}], "inbound_policy": "DROP", "outbound": [], "outbound_policy": + "ACCEPT", "version": 1, "fingerprint": "5aa2d804"}, "tags": [], "entities": + []}, {"id": 6488076, "label": "tf-test-2662579243763295399", "created": "2018-01-02T03:04:05", "updated": "2018-01-02T03:04:05", "status": "enabled", "rules": {"inbound": - [{"label": "ssh-accept-inbound-rule", "addresses": {"ipv4": ["207.172.164.59/32"]}, - "description": "ACCEPT SSH from test machine", "ports": "22", "protocol": "TCP", - "action": "ACCEPT"}], "inbound_policy": "DROP", "outbound": [], "outbound_policy": - "ACCEPT", "version": 1, "fingerprint": "45912779"}, "tags": [], "entities": - [{"id": 60939824, "type": "linode", "label": "ansible-test-471035164-updated", - "url": "/v4/linode/instances/60939824"}]}, {"id": 682410, "label": "e2e-firewall-bucVPC", - "created": "2018-01-02T03:04:05", "updated": "2018-01-02T03:04:05", "status": - "enabled", "rules": {"inbound": [{"label": "ssh-accept-inbound-rule", "addresses": - {"ipv4": ["207.172.164.59/32"]}, "description": "ACCEPT SSH from test machine", - "ports": "22", "protocol": "TCP", "action": "ACCEPT"}], "inbound_policy": "DROP", - "outbound": [], "outbound_policy": "ACCEPT", "version": 1, "fingerprint": "45912779"}, - "tags": [], "entities": []}, {"id": 682453, "label": "e2e-firewall-WJsukx", - "created": "2018-01-02T03:04:05", "updated": "2018-01-02T03:04:05", "status": - "enabled", "rules": {"inbound": [{"label": "ssh-accept-inbound-rule", "addresses": - {"ipv4": ["207.172.164.59/32"]}, "description": "ACCEPT SSH from test machine", - "ports": "22", "protocol": "TCP", "action": "ACCEPT"}], "inbound_policy": "DROP", - "outbound": [], "outbound_policy": "ACCEPT", "version": 1, "fingerprint": "45912779"}, - "tags": [], "entities": []}, {"id": 682477, "label": "e2e-firewall-IzEjvH", - "created": "2018-01-02T03:04:05", "updated": "2018-01-02T03:04:05", "status": - "enabled", "rules": {"inbound": [{"label": "ssh-accept-inbound-rule", "addresses": - {"ipv4": ["207.172.164.59/32"]}, "description": "ACCEPT SSH from test machine", - "ports": "22", "protocol": "TCP", "action": "ACCEPT"}], "inbound_policy": "DROP", - "outbound": [], "outbound_policy": "ACCEPT", "version": 1, "fingerprint": "45912779"}, - "tags": [], "entities": []}, {"id": 682500, "label": "e2e-firewall-QdxDkS", - "created": "2018-01-02T03:04:05", "updated": "2018-01-02T03:04:05", "status": - "enabled", "rules": {"inbound": [{"label": "ssh-accept-inbound-rule", "addresses": - {"ipv4": ["207.172.164.59/32"]}, "description": "ACCEPT SSH from test machine", - "ports": "22", "protocol": "TCP", "action": "ACCEPT"}], "inbound_policy": "DROP", - "outbound": [], "outbound_policy": "ACCEPT", "version": 1, "fingerprint": "45912779"}, - "tags": [], "entities": []}, {"id": 682505, "label": "e2e-firewall-KkroRq", - "created": "2018-01-02T03:04:05", "updated": "2018-01-02T03:04:05", "status": - "enabled", "rules": {"inbound": [{"label": "ssh-accept-inbound-rule", "addresses": - {"ipv4": ["207.172.164.59/32"]}, "description": "ACCEPT SSH from test machine", - "ports": "22", "protocol": "TCP", "action": "ACCEPT"}], "inbound_policy": "DROP", - "outbound": [], "outbound_policy": "ACCEPT", "version": 1, "fingerprint": "45912779"}, - "tags": [], "entities": []}, {"id": 682508, "label": "e2e-firewall-WPxzQk", - "created": "2018-01-02T03:04:05", "updated": "2018-01-02T03:04:05", "status": - "enabled", "rules": {"inbound": [{"label": "ssh-accept-inbound-rule", "addresses": - {"ipv4": ["207.172.164.59/32"]}, "description": "ACCEPT SSH from test machine", - "ports": "22", "protocol": "TCP", "action": "ACCEPT"}], "inbound_policy": "DROP", - "outbound": [], "outbound_policy": "ACCEPT", "version": 1, "fingerprint": "45912779"}, - "tags": [], "entities": []}, {"id": 682532, "label": "e2e-firewall-rBZhHt", - "created": "2018-01-02T03:04:05", "updated": "2018-01-02T03:04:05", "status": - "enabled", "rules": {"inbound": [{"label": "ssh-accept-inbound-rule", "addresses": - {"ipv4": ["207.172.164.59/32"]}, "description": "ACCEPT SSH from test machine", - "ports": "22", "protocol": "TCP", "action": "ACCEPT"}], "inbound_policy": "DROP", - "outbound": [], "outbound_policy": "ACCEPT", "version": 1, "fingerprint": "45912779"}, - "tags": [], "entities": []}, {"id": 692740, "label": "cloudfw-1721926678901029000", - "created": "2018-01-02T03:04:05", "updated": "2018-01-02T03:04:05", "status": - "enabled", "rules": {"inbound": [{"action": "ACCEPT", "label": "ssh-inbound-accept-local", - "ports": "22", "protocol": "TCP", "addresses": {"ipv4": ["207.172.164.59/32"]}}], - "inbound_policy": "DROP", "outbound": [], "outbound_policy": "ACCEPT", "version": - 1, "fingerprint": "3e4f4201"}, "tags": [], "entities": []}, {"id": 692760, "label": - "cloudfw-1721927227347144000", "created": "2018-01-02T03:04:05", "updated": - "2018-01-02T03:04:05", "status": "enabled", "rules": {"inbound": [{"action": - "ACCEPT", "label": "ssh-inbound-accept-local", "ports": "22", "protocol": "TCP", - "addresses": {"ipv4": ["207.172.164.59/32"]}}], "inbound_policy": "DROP", "outbound": - [], "outbound_policy": "ACCEPT", "version": 1, "fingerprint": "3e4f4201"}, "tags": - [], "entities": []}, {"id": 692763, "label": "cloudfw-1721927316071520000", - "created": "2018-01-02T03:04:05", "updated": "2018-01-02T03:04:05", "status": - "enabled", "rules": {"inbound": [{"action": "ACCEPT", "label": "ssh-inbound-accept-local", - "ports": "22", "protocol": "TCP", "addresses": {"ipv4": ["207.172.164.59/32"]}}], - "inbound_policy": "DROP", "outbound": [], "outbound_policy": "ACCEPT", "version": - 1, "fingerprint": "3e4f4201"}, "tags": [], "entities": []}, {"id": 692848, "label": - "cloudfw-1721929346146739000", "created": "2018-01-02T03:04:05", "updated": - "2018-01-02T03:04:05", "status": "enabled", "rules": {"inbound": [{"action": - "ACCEPT", "label": "ssh-inbound-accept-local", "ports": "22", "protocol": "TCP", - "addresses": {"ipv4": ["207.172.164.59/32"]}}], "inbound_policy": "DROP", "outbound": - [], "outbound_policy": "ACCEPT", "version": 1, "fingerprint": "3e4f4201"}, "tags": - [], "entities": []}, {"id": 692854, "label": "cloudfw-1721929441971780000", + [{"protocol": "TCP", "addresses": {"ipv6": ["1234::5678/128"], + "ipv4": ["74.102.235.249/32"]}, "action": "ACCEPT", "label": "tcp_inbound_ssh_accept_local", + "ports": "22"}], "inbound_policy": "DROP", "outbound": [], "outbound_policy": + "ACCEPT", "version": 1, "fingerprint": "5aa2d804"}, "tags": [], "entities": + []}, {"id": 6488152, "label": "tf-test-7434155876252647646", "created": "2018-01-02T03:04:05", + "updated": "2018-01-02T03:04:05", "status": "enabled", "rules": {"inbound": + [{"protocol": "TCP", "addresses": {"ipv6": ["1234::5678/128"], + "ipv4": ["74.102.235.249/32"]}, "action": "ACCEPT", "label": "tcp_inbound_ssh_accept_local", + "ports": "22"}], "inbound_policy": "DROP", "outbound": [], "outbound_policy": + "ACCEPT", "version": 1, "fingerprint": "5aa2d804"}, "tags": [], "entities": + []}, {"id": 6488643, "label": "tf_test-4497105480711871048", "created": "2018-01-02T03:04:05", + "updated": "2018-01-02T03:04:05", "status": "enabled", "rules": {"inbound": + [{"protocol": "TCP", "addresses": {"ipv6": ["1234::5678/128"], + "ipv4": ["74.102.235.249/32"]}, "action": "ACCEPT", "label": "tcp_inbound_ssh_accept_local", + "ports": "22"}], "inbound_policy": "DROP", "outbound": [], "outbound_policy": + "ACCEPT", "version": 1, "fingerprint": "5aa2d804"}, "tags": [], "entities": + []}, {"id": 6488833, "label": "tf_test-2716164270344383334", "created": "2018-01-02T03:04:05", + "updated": "2018-01-02T03:04:05", "status": "enabled", "rules": {"inbound": + [{"protocol": "TCP", "addresses": {"ipv6": ["1234::5678/128"], + "ipv4": ["74.102.235.249/32"]}, "action": "ACCEPT", "label": "tcp_inbound_ssh_accept_local", + "ports": "22"}], "inbound_policy": "DROP", "outbound": [], "outbound_policy": + "ACCEPT", "version": 1, "fingerprint": "5aa2d804"}, "tags": [], "entities": + []}, {"id": 6488942, "label": "tf_test-5198004906850423409", "created": "2018-01-02T03:04:05", + "updated": "2018-01-02T03:04:05", "status": "enabled", "rules": {"inbound": + [{"protocol": "TCP", "addresses": {"ipv6": ["1234::5678/128"], + "ipv4": ["74.102.235.249/32"]}, "action": "ACCEPT", "label": "tcp_inbound_ssh_accept_local", + "ports": "22"}], "inbound_policy": "DROP", "outbound": [], "outbound_policy": + "ACCEPT", "version": 1, "fingerprint": "5aa2d804"}, "tags": [], "entities": + []}, {"id": 6488991, "label": "tf_test-8335666987695131249", "created": "2018-01-02T03:04:05", + "updated": "2018-01-02T03:04:05", "status": "enabled", "rules": {"inbound": + [{"protocol": "TCP", "addresses": {"ipv6": ["1234::5678/128"], + "ipv4": ["74.102.235.249/32"]}, "action": "ACCEPT", "label": "tcp_inbound_ssh_accept_local", + "ports": "22"}], "inbound_policy": "DROP", "outbound": [], "outbound_policy": + "ACCEPT", "version": 1, "fingerprint": "5aa2d804"}, "tags": [], "entities": + []}, {"id": 6489132, "label": "tf_test-8711695578112956943", "created": "2018-01-02T03:04:05", + "updated": "2018-01-02T03:04:05", "status": "enabled", "rules": {"inbound": + [{"protocol": "TCP", "addresses": {"ipv6": ["1234::5678/128"], + "ipv4": ["74.102.235.249/32"]}, "action": "ACCEPT", "label": "tcp_inbound_ssh_accept_local", + "ports": "22"}], "inbound_policy": "DROP", "outbound": [], "outbound_policy": + "ACCEPT", "version": 1, "fingerprint": "5aa2d804"}, "tags": [], "entities": + []}, {"id": 9618460, "label": "cloudfw-1778024706560062000", "created": "2018-01-02T03:04:05", + "updated": "2018-01-02T03:04:05", "status": "enabled", "rules": {"inbound": + [{"protocol": "TCP", "addresses": {"ipv4": ["74.102.235.249/32"]}, "action": + "ACCEPT", "label": "ssh-inbound-accept-local", "ports": "22"}], "inbound_policy": + "DROP", "outbound": [], "outbound_policy": "ACCEPT", "version": 1, "fingerprint": + "e3c5e43b"}, "tags": [], "entities": []}, {"id": 9618652, "label": "linodego-fw-test", "created": "2018-01-02T03:04:05", "updated": "2018-01-02T03:04:05", "status": - "enabled", "rules": {"inbound": [{"action": "ACCEPT", "label": "ssh-inbound-accept-local", - "ports": "22", "protocol": "TCP", "addresses": {"ipv4": ["207.172.164.59/32"]}}], - "inbound_policy": "DROP", "outbound": [], "outbound_policy": "ACCEPT", "version": - 1, "fingerprint": "3e4f4201"}, "tags": [], "entities": []}, {"id": 692864, "label": - "linodego-fw-test", "created": "2018-01-02T03:04:05", "updated": "2018-01-02T03:04:05", - "status": "enabled", "rules": {"inbound": [{"action": "ACCEPT", "label": "go-fwrule-test", - "ports": "22", "protocol": "TCP", "addresses": {"ipv4": ["0.0.0.0/0"], "ipv6": - ["1234::5678/0"]}}], "inbound_policy": "ACCEPT", "outbound": [{"action": "ACCEPT", "label": - "go-fwrule-test", "ports": "22", "protocol": "TCP", "addresses": {"ipv4": ["0.0.0.0/0"], - "ipv6": ["1234::5678/0"]}}], "outbound_policy": "ACCEPT", "version": 1, "fingerprint": - "7bcc0f03"}, "tags": ["testing"], "entities": []}], "page": 1, "pages": 1, "results": - 16}' + "enabled", "rules": {"inbound": [{"protocol": "TCP", "addresses": {"ipv6": ["1234::5678/0"], + "ipv4": ["0.0.0.0/0"]}, "action": "ACCEPT", "label": "go-fwrule-test", "ports": + "22"}], "inbound_policy": "ACCEPT", "outbound": [{"protocol": "TCP", "addresses": + {"ipv6": ["1234::5678/0"], "ipv4": ["0.0.0.0/0"]}, "action": "ACCEPT", "label": "go-fwrule-test", + "ports": "22"}], "outbound_policy": "ACCEPT", "version": 1, "fingerprint": "7bcc0f03"}, + "tags": ["testing"], "entities": []}], "page": 1, "pages": 1, "results": 12}' headers: Access-Control-Allow-Credentials: - "true" @@ -206,7 +189,7 @@ interactions: Content-Type: - application/json Expires: - - Thu, 25 Jul 2024 17:44:49 GMT + - Tue, 05 May 2026 23:45:23 GMT Pragma: - no-cache Strict-Transport-Security: @@ -223,12 +206,9 @@ interactions: - DENY - DENY X-Oauth-Scopes: - - account:read_write databases:read_write domains:read_write events:read_write - firewall:read_write images:read_write ips:read_write linodes:read_write lke:read_write - longview:read_write nodebalancers:read_write object_storage:read_write stackscripts:read_write - volumes:read_write vpc:read_write + - '*' X-Ratelimit-Limit: - - "400" + - "1840" X-Xss-Protection: - 1; mode=block status: 200 OK @@ -244,7 +224,7 @@ interactions: - application/json User-Agent: - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/networking/firewalls/692864 + url: https://api.linode.com/v4beta/networking/firewalls/9618652 method: DELETE response: body: '{}' @@ -272,7 +252,7 @@ interactions: Content-Type: - application/json Expires: - - Thu, 25 Jul 2024 17:44:49 GMT + - Tue, 05 May 2026 23:45:24 GMT Pragma: - no-cache Strict-Transport-Security: @@ -287,12 +267,9 @@ interactions: - DENY - DENY X-Oauth-Scopes: - - account:read_write databases:read_write domains:read_write events:read_write - firewall:read_write images:read_write ips:read_write linodes:read_write lke:read_write - longview:read_write nodebalancers:read_write object_storage:read_write stackscripts:read_write - volumes:read_write vpc:read_write + - '*' X-Ratelimit-Limit: - - "400" + - "1840" X-Xss-Protection: - 1; mode=block status: 200 OK diff --git a/test/integration/fixtures/TestImage_CloudInit.yaml b/test/integration/fixtures/TestImage_CloudInit.yaml index 381d89283..51b70b1de 100644 --- a/test/integration/fixtures/TestImage_CloudInit.yaml +++ b/test/integration/fixtures/TestImage_CloudInit.yaml @@ -14,290 +14,449 @@ interactions: url: https://api.linode.com/v4beta/regions?page=1 method: GET response: - body: '{"data": [{"id": "ap-west", "label": "Mumbai, IN", "country": "in", "capabilities": - ["Linodes", "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", - "GPU Linodes", "Cloud Firewall", "Vlans", "Block Storage Migrations", "Managed - Databases", "Metadata", "Placement Group"], "status": "ok", "resolvers": {"ipv4": - "172.105.34.5, 172.105.35.5, 172.105.36.5, 172.105.37.5, 172.105.38.5, 172.105.39.5, - 172.105.40.5, 172.105.41.5, 172.105.42.5, 172.105.43.5", "ipv6": "1234::5678, - 1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "ca-central", "label": "Toronto, CA", "country": - "ca", "capabilities": ["Linodes", "Backups", "NodeBalancers", "Block Storage", - "Cloud Firewall", "Vlans", "Block Storage Migrations", "Managed Databases", - "Metadata", "Placement Group"], "status": "ok", "resolvers": {"ipv4": "172.105.0.5, - 172.105.3.5, 172.105.4.5, 172.105.5.5, 172.105.6.5, 172.105.7.5, 172.105.8.5, - 172.105.9.5, 172.105.10.5, 172.105.11.5", "ipv6": "1234::5678, - 1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "ap-southeast", "label": "Sydney, AU", "country": - "au", "capabilities": ["Linodes", "Disk Encryption", "Backups", "NodeBalancers", - "Block Storage", "Cloud Firewall", "Vlans", "Block Storage Migrations", "Managed - Databases", "Metadata", "Placement Group"], "status": "ok", "resolvers": {"ipv4": - "172.105.166.5, 172.105.169.5, 172.105.168.5, 172.105.172.5, 172.105.162.5, - 172.105.170.5, 172.105.167.5, 172.105.171.5, 172.105.181.5, 172.105.161.5", - "ipv6": "1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678, - 1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": - null, "maximum_linodes_per_pg": 5}, "site_type": "core"}, {"id": "us-iad", "label": - "Washington, DC", "country": "us", "capabilities": ["Linodes", "Disk Encryption", - "Backups", "NodeBalancers", "Block Storage", "Object Storage", "Cloud Firewall", - "Managed Databases", "Metadata", "Premium Plans", "Placement Group"], "status": - "ok", "resolvers": {"ipv4": "139.144.192.62, 139.144.192.60, 139.144.192.61, - 139.144.192.53, 139.144.192.54, 139.144.192.67, 139.144.192.69, 139.144.192.66, - 139.144.192.52, 139.144.192.68", "ipv6": "1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678"}, "placement_group_limits": - {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5}, "site_type": - "core"}, {"id": "us-ord", "label": "Chicago, IL", "country": "us", "capabilities": - ["Linodes", "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", - "Object Storage", "GPU Linodes", "Cloud Firewall", "Managed Databases", "Metadata", - "Premium Plans", "Placement Group"], "status": "ok", "resolvers": {"ipv4": "172.232.0.17, - 172.232.0.16, 172.232.0.21, 172.232.0.13, 172.232.0.22, 172.232.0.9, 172.232.0.19, - 172.232.0.20, 172.232.0.15, 172.232.0.18", "ipv6": "1234::5678, - 1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "fr-par", "label": "Paris, FR", "country": - "fr", "capabilities": ["Linodes", "Disk Encryption", "Backups", "NodeBalancers", - "Block Storage", "Object Storage", "GPU Linodes", "Cloud Firewall", "Managed - Databases", "Metadata", "Premium Plans", "Placement Group"], "status": "ok", - "resolvers": {"ipv4": "172.232.32.21, 172.232.32.23, 172.232.32.17, 172.232.32.18, - 172.232.32.16, 172.232.32.22, 172.232.32.20, 172.232.32.14, 172.232.32.11, 172.232.32.12", - "ipv6": "1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678, - 1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": - null, "maximum_linodes_per_pg": 5}, "site_type": "core"}, {"id": "us-sea", "label": - "Seattle, WA", "country": "us", "capabilities": ["Linodes", "Disk Encryption", - "Backups", "NodeBalancers", "Block Storage", "Object Storage", "GPU Linodes", - "Cloud Firewall", "Managed Databases", "Metadata", "Premium Plans", "Placement - Group"], "status": "ok", "resolvers": {"ipv4": "172.232.160.19, 172.232.160.21, - 172.232.160.17, 172.232.160.15, 172.232.160.18, 172.232.160.8, 172.232.160.12, - 172.232.160.11, 172.232.160.14, 172.232.160.16", "ipv6": "1234::5678, - 1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "br-gru", "label": "Sao Paulo, BR", "country": - "br", "capabilities": ["Linodes", "Disk Encryption", "Backups", "NodeBalancers", - "Block Storage", "Object Storage", "Cloud Firewall", "Metadata", "Premium Plans", - "Placement Group"], "status": "ok", "resolvers": {"ipv4": "172.233.0.4, 172.233.0.9, - 172.233.0.7, 172.233.0.12, 172.233.0.5, 172.233.0.13, 172.233.0.10, 172.233.0.6, - 172.233.0.8, 172.233.0.11", "ipv6": "1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678"}, "placement_group_limits": - {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5}, "site_type": - "core"}, {"id": "nl-ams", "label": "Amsterdam, NL", "country": "nl", "capabilities": - ["Linodes", "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", - "Object Storage", "Cloud Firewall", "Metadata", "Premium Plans", "Placement - Group"], "status": "ok", "resolvers": {"ipv4": "172.233.33.36, 172.233.33.38, - 172.233.33.35, 172.233.33.39, 172.233.33.34, 172.233.33.33, 172.233.33.31, 172.233.33.30, - 172.233.33.37, 172.233.33.32", "ipv6": "1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678"}, "placement_group_limits": - {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5}, "site_type": - "core"}, {"id": "se-sto", "label": "Stockholm, SE", "country": "se", "capabilities": - ["Linodes", "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", - "Object Storage", "Cloud Firewall", "Managed Databases", "Metadata", "Premium - Plans", "Placement Group"], "status": "ok", "resolvers": {"ipv4": "172.232.128.24, - 172.232.128.26, 172.232.128.20, 172.232.128.22, 172.232.128.25, 172.232.128.19, - 172.232.128.23, 172.232.128.18, 172.232.128.21, 172.232.128.27", "ipv6": "1234::5678, - 1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "es-mad", "label": "Madrid, ES", "country": - "es", "capabilities": ["Linodes", "Disk Encryption", "Backups", "NodeBalancers", - "Block Storage", "Object Storage", "Cloud Firewall", "VPCs", "Metadata", "Premium - Plans", "Placement Group"], "status": "ok", "resolvers": {"ipv4": "172.233.111.6, - 172.233.111.17, 172.233.111.21, 172.233.111.25, 172.233.111.19, 172.233.111.12, - 172.233.111.26, 172.233.111.16, 172.233.111.18, 172.233.111.9", "ipv6": "1234::5678, - 1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "in-maa", "label": "Chennai, IN", "country": - "in", "capabilities": ["Linodes", "Disk Encryption", "Backups", "NodeBalancers", - "Block Storage", "Object Storage", "Cloud Firewall", "Managed Databases", "Metadata", - "Premium Plans", "Placement Group"], "status": "ok", "resolvers": {"ipv4": "172.232.96.17, - 172.232.96.26, 172.232.96.19, 172.232.96.20, 172.232.96.25, 172.232.96.21, 172.232.96.18, - 172.232.96.22, 172.232.96.23, 172.232.96.24", "ipv6": "1234::5678, - 1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "jp-osa", "label": "Osaka, JP", "country": - "jp", "capabilities": ["Linodes", "Disk Encryption", "Backups", "NodeBalancers", - "Block Storage", "Object Storage", "GPU Linodes", "Cloud Firewall", "Metadata", - "Premium Plans", "Placement Group"], "status": "ok", "resolvers": {"ipv4": "172.233.64.44, - 172.233.64.43, 172.233.64.37, 172.233.64.40, 172.233.64.46, 172.233.64.41, 172.233.64.39, - 172.233.64.42, 172.233.64.45, 172.233.64.38", "ipv6": "1234::5678, - 1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "it-mil", "label": "Milan, IT", "country": - "it", "capabilities": ["Linodes", "Disk Encryption", "Backups", "NodeBalancers", - "Block Storage", "Object Storage", "Cloud Firewall", "Managed Databases", "Metadata", - "Premium Plans", "Placement Group"], "status": "ok", "resolvers": {"ipv4": "172.232.192.19, - 172.232.192.18, 172.232.192.16, 172.232.192.20, 172.232.192.24, 172.232.192.21, - 172.232.192.22, 172.232.192.17, 172.232.192.15, 172.232.192.23", "ipv6": "1234::5678, - 1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "us-mia", "label": "Miami, FL", "country": - "us", "capabilities": ["Linodes", "Disk Encryption", "Backups", "NodeBalancers", - "Block Storage", "Object Storage", "Cloud Firewall", "Vlans", "VPCs", "Metadata", - "Premium Plans", "Placement Group"], "status": "ok", "resolvers": {"ipv4": "172.233.160.34, - 172.233.160.27, 172.233.160.30, 172.233.160.29, 172.233.160.32, 172.233.160.28, - 172.233.160.33, 172.233.160.26, 172.233.160.25, 172.233.160.31", "ipv6": "1234::5678, - 1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "id-cgk", "label": "Jakarta, ID", "country": - "id", "capabilities": ["Linodes", "Disk Encryption", "Backups", "NodeBalancers", - "Block Storage", "Object Storage", "Cloud Firewall", "Managed Databases", "Metadata", - "Premium Plans", "Placement Group"], "status": "ok", "resolvers": {"ipv4": "172.232.224.23, - 172.232.224.32, 172.232.224.26, 172.232.224.27, 172.232.224.21, 172.232.224.24, - 172.232.224.22, 172.232.224.20, 172.232.224.31, 172.232.224.28", "ipv6": "1234::5678, - 1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "us-lax", "label": "Los Angeles, CA", "country": - "us", "capabilities": ["Linodes", "Disk Encryption", "Backups", "NodeBalancers", - "Block Storage", "Object Storage", "Cloud Firewall", "Vlans", "VPCs", "Metadata", - "Premium Plans", "Placement Group"], "status": "ok", "resolvers": {"ipv4": "172.233.128.45, - 172.233.128.38, 172.233.128.53, 172.233.128.37, 172.233.128.34, 172.233.128.36, - 172.233.128.33, 172.233.128.39, 172.233.128.43, 172.233.128.44", "ipv6": "1234::5678, - 1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "us-den-edge-1", "label": "Edge - Denver, CO", - "country": "us", "capabilities": ["Linodes", "Cloud Firewall", "Distributed - Plans"], "status": "ok", "resolvers": {"ipv4": "173.223.100.53, 173.223.101.53", - "ipv6": "1234::5678, 1234::5678"}, "placement_group_limits": - {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5}, "site_type": - "distributed"}, {"id": "de-ham-edge-1", "label": "Edge - Hamburg, DE", "country": - "de", "capabilities": ["Linodes", "Cloud Firewall", "Distributed Plans"], "status": - "ok", "resolvers": {"ipv4": "173.223.100.53, 173.223.101.53", "ipv6": "1234::5678, - 1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": - null, "maximum_linodes_per_pg": 5}, "site_type": "distributed"}, {"id": "fr-mrs-edge-1", - "label": "Edge - Marseille, FR", "country": "fr", "capabilities": ["Linodes", - "Cloud Firewall", "Distributed Plans"], "status": "ok", "resolvers": {"ipv4": - "173.223.100.53, 173.223.101.53", "ipv6": "1234::5678, 1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "distributed"}, {"id": "za-jnb-edge-1", "label": "Edge - Johannesburg, - ZA\t", "country": "za", "capabilities": ["Linodes", "Cloud Firewall", "Distributed - Plans"], "status": "ok", "resolvers": {"ipv4": "173.223.100.53, 173.223.101.53", - "ipv6": "1234::5678, 1234::5678"}, "placement_group_limits": - {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5}, "site_type": - "distributed"}, {"id": "my-kul-edge-1", "label": "Edge - Kuala Lumpur, MY", - "country": "my", "capabilities": ["Linodes", "Cloud Firewall", "Distributed - Plans"], "status": "ok", "resolvers": {"ipv4": "173.223.100.53, 173.223.101.53", - "ipv6": "1234::5678, 1234::5678"}, "placement_group_limits": - {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5}, "site_type": - "distributed"}, {"id": "co-bog-edge-1", "label": "Edge - Bogot\u00e1, CO", "country": - "co", "capabilities": ["Linodes", "Cloud Firewall", "Distributed Plans"], "status": - "ok", "resolvers": {"ipv4": "173.223.100.53, 173.223.101.53", "ipv6": "1234::5678, - 1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": - null, "maximum_linodes_per_pg": 5}, "site_type": "distributed"}, {"id": "mx-qro-edge-1", - "label": "Edge - Quer\u00e9taro, MX", "country": "mx", "capabilities": ["Linodes", - "Cloud Firewall", "Distributed Plans"], "status": "ok", "resolvers": {"ipv4": - "173.223.100.53, 173.223.101.53", "ipv6": "1234::5678, 1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "distributed"}, {"id": "us-hou-edge-1", "label": "Edge - Houston, - TX", "country": "us", "capabilities": ["Linodes", "Cloud Firewall", "Distributed - Plans"], "status": "ok", "resolvers": {"ipv4": "173.223.100.53, 173.223.101.53", - "ipv6": "1234::5678, 1234::5678"}, "placement_group_limits": - {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5}, "site_type": - "distributed"}, {"id": "cl-scl-edge-1", "label": "Edge - Santiago, CL", "country": - "cl", "capabilities": ["Linodes", "Cloud Firewall", "Distributed Plans"], "status": - "ok", "resolvers": {"ipv4": "173.223.100.53, 173.223.101.53", "ipv6": "1234::5678, - 1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": - null, "maximum_linodes_per_pg": 5}, "site_type": "distributed"}, {"id": "us-central", - "label": "Dallas, TX", "country": "us", "capabilities": ["Linodes", "Backups", - "NodeBalancers", "Block Storage", "Kubernetes", "Cloud Firewall", "Vlans", "Block - Storage Migrations", "Managed Databases", "Metadata", "Placement Group"], "status": - "ok", "resolvers": {"ipv4": "72.14.179.5, 72.14.188.5, 173.255.199.5, 66.228.53.5, - 96.126.122.5, 96.126.124.5, 96.126.127.5, 198.58.107.5, 198.58.111.5, 23.239.24.5", - "ipv6": "1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678"}, "placement_group_limits": - {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5}, "site_type": - "core"}, {"id": "us-west", "label": "Fremont, CA", "country": "us", "capabilities": - ["Linodes", "Backups", "NodeBalancers", "Block Storage", "Cloud Firewall", "Block - Storage Migrations", "Managed Databases", "Metadata", "Placement Group"], "status": - "ok", "resolvers": {"ipv4": "173.230.145.5, 173.230.147.5, 173.230.155.5, 173.255.212.5, - 173.255.219.5, 173.255.241.5, 173.255.243.5, 173.255.244.5, 74.207.241.5, 74.207.242.5", - "ipv6": "1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678"}, "placement_group_limits": - {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5}, "site_type": - "core"}, {"id": "us-southeast", "label": "Atlanta, GA", "country": "us", "capabilities": - ["Linodes", "Backups", "NodeBalancers", "Block Storage", "Object Storage", "GPU - Linodes", "Cloud Firewall", "Vlans", "Block Storage Migrations", "Managed Databases", - "Metadata", "Placement Group"], "status": "ok", "resolvers": {"ipv4": "74.207.231.5, - 173.230.128.5, 173.230.129.5, 173.230.136.5, 173.230.140.5, 66.228.59.5, 66.228.62.5, - 50.116.35.5, 50.116.41.5, 23.239.18.5", "ipv6": "1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": - null, "maximum_linodes_per_pg": 5}, "site_type": "core"}, {"id": "us-east", - "label": "Newark, NJ", "country": "us", "capabilities": ["Linodes", "Backups", - "NodeBalancers", "Block Storage", "Object Storage", "GPU Linodes", "Cloud Firewall", + body: '{"data": [{"id": "au-mel", "label": "Melbourne, AU", "country": "au", "capabilities": + ["Linodes", "Block Storage Encryption", "LA Disk Encryption", "Disk Encryption", + "Backups", "NodeBalancers", "Block Storage", "Object Storage", "Kubernetes", + "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", + "Premium Plans", "Placement Group", "StackScripts", "Maintenance Policy", "Linode + Interfaces"], "monitors": {"alerts": ["Managed Databases", "NodeBalancers"], + "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": + {"ipv4": "172.236.32.23,172.236.32.35,172.236.32.30,172.236.32.28,172.236.32.32,172.236.32.33,172.236.32.27,172.236.32.37,172.236.32.29,172.236.32.34", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "us-lax", + "label": "Los Angeles, CA", "country": "us", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes + Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", + "Metadata", "Premium Plans", "Placement Group", "StackScripts", "NETINT Quadra + T1U", "Maintenance Policy", "Linode Interfaces", "ACLP Logs Datacenter LKE-E"], + "monitors": {"alerts": ["Managed Databases", "NodeBalancers"], "metrics": ["Managed + Databases", "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "172.233.128.45,172.233.128.38,172.233.128.53,172.233.128.37,172.233.128.34,172.233.128.36,172.233.128.33,172.233.128.39,172.233.128.43,172.233.128.44", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "nz-akl-1", + "label": "Auckland, NZ", "country": "nz", "capabilities": ["Linodes", "Disk + Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", "Maintenance + Policy"], "monitors": {"alerts": [], "metrics": []}, "status": "ok", "resolvers": + {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": + 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": + "us-den-1", "label": "Denver, CO", "country": "us", "capabilities": ["Linodes", + "Disk Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", + "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": + "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": + 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": + "de-ham-1", "label": "Hamburg, DE", "country": "de", "capabilities": ["Linodes", + "Disk Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", + "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": + "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": + 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": + "za-jnb-1", "label": "Johannesburg, ZA", "country": "za", "capabilities": ["Linodes", + "Disk Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", + "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": + "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": + 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": + "my-kul-1", "label": "Kuala Lumpur, MY", "country": "my", "capabilities": ["Linodes", + "Disk Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", + "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": + "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": + 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": + "co-bog-1", "label": "Bogot\u00e1, CO", "country": "co", "capabilities": ["Linodes", + "Disk Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", + "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": + "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": + 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": + "mx-qro-1", "label": "Quer\u00e9taro, MX", "country": "mx", "capabilities": + ["Linodes", "Disk Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed + Plans", "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": + "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": + 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": + "us-hou-1", "label": "Houston, TX", "country": "us", "capabilities": ["Linodes", + "Disk Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", + "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": + "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": + 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": + "cl-scl-1", "label": "Santiago, CL", "country": "cl", "capabilities": ["Linodes", + "Disk Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", + "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": + "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": + 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": + "gb-lon", "label": "London 2, UK", "country": "gb", "capabilities": ["Linodes", + "Block Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", + "NodeBalancers", "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", + "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", + "Managed Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", + "NETINT Quadra T1U", "Maintenance Policy", "Linode Interfaces", "ACLP Logs Datacenter + LKE-E"], "monitors": {"alerts": ["Managed Databases", "NodeBalancers"], "metrics": + ["Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": + "172.236.0.46,172.236.0.50,172.236.0.47,172.236.0.53,172.236.0.52,172.236.0.45,172.236.0.49,172.236.0.51,172.236.0.54,172.236.0.48", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "id-cgk", + "label": "Jakarta, ID", "country": "id", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes + Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", + "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "172.232.224.23,172.232.224.32,172.232.224.26,172.232.224.27,172.232.224.21,172.232.224.24,172.232.224.22,172.232.224.20,172.232.224.31,172.232.224.28", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "in-bom-2", + "label": "Mumbai 2, IN", "country": "in", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "GPU Linodes", "Kubernetes", "Kubernetes Enterprise", "Cloud + Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", + "Premium Plans", "Placement Group", "StackScripts", "Maintenance Policy", "Linode + Interfaces", "ACLP Logs Datacenter LKE-E"], "monitors": {"alerts": ["Managed + Databases", "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "172.236.171.41,172.236.171.42,172.236.171.25,172.236.171.44,172.236.171.26,172.236.171.45,172.236.171.24,172.236.171.43,172.236.171.27,172.236.171.28", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "de-fra-2", + "label": "Frankfurt 2, DE", "country": "de", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes + Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", + "Metadata", "Premium Plans", "Placement Group", "StackScripts", "NETINT Quadra + T1U", "Maintenance Policy", "Linode Interfaces", "ACLP Logs Datacenter LKE-E"], + "monitors": {"alerts": ["Managed Databases", "NodeBalancers"], "metrics": ["Managed + Databases", "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "172.236.203.9,172.236.203.16,172.236.203.19,172.236.203.15,172.236.203.17,172.236.203.11,172.236.203.18,172.236.203.14,172.236.203.13,172.236.203.12", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "sg-sin-2", + "label": "Singapore 2, SG", "country": "sg", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes + Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", + "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance + Policy", "Linode Interfaces", "ACLP Logs Datacenter LKE-E"], "monitors": {"alerts": + ["Managed Databases", "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "172.236.129.8,172.236.129.42,172.236.129.41,172.236.129.19,172.236.129.46,172.236.129.23,172.236.129.48,172.236.129.20,172.236.129.21,172.236.129.47", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "jp-tyo-3", + "label": "Tokyo 3, JP", "country": "jp", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes + Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", + "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance + Policy", "Linode Interfaces", "ACLP Logs Datacenter LKE-E"], "monitors": {"alerts": + ["Managed Databases", "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "172.237.4.15,172.237.4.19,172.237.4.17,172.237.4.21,172.237.4.16,172.237.4.18,172.237.4.23,172.237.4.24,172.237.4.20,172.237.4.14", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "de-ber-1", + "label": "Berlin, DE", "country": "de", "capabilities": ["Linodes", "Disk Encryption", + "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", "Maintenance Policy"], + "monitors": {"alerts": [], "metrics": []}, "status": "ok", "resolvers": {"ipv4": + "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": + 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": + "no-osl-1", "label": "Oslo, NO", "country": "no", "capabilities": ["Linodes", + "Block Storage Encryption", "Disk Encryption", "Backups", "NodeBalancers", "Block + Storage", "Object Storage", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", + "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", "Premium + Plans", "Placement Group", "StackScripts", "Maintenance Policy", "Linode Interfaces", + "ACLP Logs Datacenter LKE-E"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "172.238.140.33,172.238.140.25,172.238.140.30,172.238.140.31,172.238.140.26,172.238.140.28,172.238.140.34,172.238.140.32,172.238.140.27,172.238.140.29", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "us-iad-2", + "label": "Washington 2, DC", "country": "us", "capabilities": ["Linodes", "Block + Storage Encryption", "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", + "Object Storage", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", + "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", "Premium Plans", + "Placement Group", "StackScripts", "Maintenance Policy", "Linode Interfaces"], + "monitors": {"alerts": ["Managed Databases", "NodeBalancers"], "metrics": ["Managed + Databases", "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "172.239.142.102,172.239.142.89,172.239.142.92,172.239.142.87,172.239.142.88,172.239.142.103,172.239.142.91,172.239.142.90,172.239.142.86,172.239.142.100", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "fr-par-2", + "label": "Paris 2, FR", "country": "fr", "capabilities": ["Linodes", "Block + Storage Encryption", "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", + "GPU Linodes", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", + "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", "Premium Plans", + "Placement Group", "StackScripts", "Maintenance Policy", "Linode Interfaces", + "ACLP Logs Datacenter LKE-E"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "172.239.11.24,172.239.11.22,172.239.11.17,172.239.11.20,172.239.11.23,172.239.11.19,172.239.11.21,172.239.11.15,172.239.11.16,172.239.11.18", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "us-rno-1", + "label": "Reno, NV", "country": "us", "capabilities": ["Linodes", "Disk Encryption", + "Backups", "NodeBalancers", "GPU Linodes", "Metadata", "Premium Plans", "Placement + Group", "StackScripts", "Maintenance Policy"], "monitors": {"alerts": ["NodeBalancers"], + "metrics": ["NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "", "ipv6": + ""}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "co-bog-2", + "label": "Bogot\u00e1 2, CO", "country": "co", "capabilities": ["Linodes", "Disk + Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", "Maintenance + Policy"], "monitors": {"alerts": [], "metrics": []}, "status": "ok", "resolvers": + {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": + 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": + "fr-mrs-2", "label": "Marseille 2, FR", "country": "fr", "capabilities": ["Linodes", + "Disk Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", + "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": + "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": + 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": + "us-mia", "label": "Miami, FL", "country": "us", "capabilities": ["Linodes", + "Block Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", + "NodeBalancers", "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", + "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", + "Managed Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", + "NETINT Quadra T1U", "Maintenance Policy", "Linode Interfaces"], "monitors": + {"alerts": ["Managed Databases", "NodeBalancers"], "metrics": ["Managed Databases", + "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "172.233.160.34,172.233.160.27,172.233.160.30,172.233.160.29,172.233.160.32,172.233.160.28,172.233.160.33,172.233.160.26,172.233.160.25,172.233.160.31", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "ap-west", + "label": "Mumbai, IN", "country": "in", "capabilities": ["Linodes", "Block Storage + Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "GPU Linodes", "Kubernetes", "Cloud Firewall", "Vlans", "Block + Storage Migrations", "Managed Databases", "Metadata", "Placement Group", "StackScripts", + "Maintenance Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed + Databases", "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "172.105.34.5,172.105.35.5,172.105.36.5,172.105.37.5,172.105.38.5,172.105.39.5,172.105.40.5,172.105.41.5,172.105.42.5,172.105.43.5", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "ca-central", + "label": "Toronto, CA", "country": "ca", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "GPU Linodes", "Kubernetes", "Cloud Firewall", "Vlans", "Block + Storage Migrations", "Managed Databases", "Metadata", "Placement Group", "StackScripts", + "Maintenance Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed + Databases", "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "172.105.0.5,172.105.3.5,172.105.4.5,172.105.5.5,172.105.6.5,172.105.7.5,172.105.8.5,172.105.9.5,172.105.10.5,172.105.11.5", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "ap-southeast", + "label": "Sydney, AU", "country": "au", "capabilities": ["Linodes", "Block Storage + Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", + "Managed Databases", "Metadata", "Placement Group", "StackScripts", "Maintenance + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "172.105.166.5,172.105.169.5,172.105.168.5,172.105.172.5,172.105.162.5,172.105.170.5,172.105.167.5,172.105.171.5,172.105.181.5,172.105.161.5", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "us-iad", + "label": "Washington, DC", "country": "us", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "Kubernetes", "Kubernetes Enterprise", "Cloud + Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", + "Premium Plans", "Placement Group", "StackScripts", "Maintenance Policy", "Linode + Interfaces", "ACLP Logs Datacenter LKE-E"], "monitors": {"alerts": ["Managed + Databases", "NodeBalancers"], "metrics": ["Linodes", "Managed Databases", "NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "139.144.192.62,139.144.192.60,139.144.192.61,139.144.192.53,139.144.192.54,139.144.192.67,139.144.192.69,139.144.192.66,139.144.192.52,139.144.192.68", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "us-ord", + "label": "Chicago, IL", "country": "us", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes + Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", + "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance + Policy", "Linode Interfaces", "ACLP Logs Datacenter LKE-E"], "monitors": {"alerts": + ["Managed Databases", "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "172.232.0.17,172.232.0.16,172.232.0.21,172.232.0.13,172.232.0.22,172.232.0.9,172.232.0.19,172.232.0.20,172.232.0.15,172.232.0.18", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "fr-par", + "label": "Paris, FR", "country": "fr", "capabilities": ["Linodes", "Block Storage + Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes + Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", + "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "172.232.32.21,172.232.32.23,172.232.32.17,172.232.32.18,172.232.32.16,172.232.32.22,172.232.32.20,172.232.32.14,172.232.32.11,172.232.32.12", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "us-sea", + "label": "Seattle, WA", "country": "us", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes + Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", + "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance + Policy", "Linode Interfaces", "ACLP Logs Datacenter LKE-E"], "monitors": {"alerts": + ["Managed Databases", "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "172.232.160.19,172.232.160.21,172.232.160.17,172.232.160.15,172.232.160.18,172.232.160.8,172.232.160.12,172.232.160.11,172.232.160.14,172.232.160.16", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "br-gru", + "label": "Sao Paulo, BR", "country": "br", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "Kubernetes", "Kubernetes Enterprise", "Cloud + Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", + "Premium Plans", "Placement Group", "StackScripts", "Maintenance Policy", "Linode + Interfaces"], "monitors": {"alerts": ["Managed Databases", "NodeBalancers"], + "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": + {"ipv4": "172.233.0.4,172.233.0.9,172.233.0.7,172.233.0.12,172.233.0.5,172.233.0.13,172.233.0.10,172.233.0.6,172.233.0.8,172.233.0.11", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "nl-ams", + "label": "Amsterdam, NL", "country": "nl", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes + Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", + "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "172.233.33.36,172.233.33.38,172.233.33.35,172.233.33.39,172.233.33.34,172.233.33.33,172.233.33.31,172.233.33.30,172.233.33.37,172.233.33.32", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "se-sto", + "label": "Stockholm, SE", "country": "se", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes + Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", + "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "172.232.128.24,172.232.128.26,172.232.128.20,172.232.128.22,172.232.128.25,172.232.128.19,172.232.128.23,172.232.128.18,172.232.128.21,172.232.128.27", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "es-mad", + "label": "Madrid, ES", "country": "es", "capabilities": ["Linodes", "Block Storage + Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes + Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", + "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "172.233.111.6,172.233.111.17,172.233.111.21,172.233.111.25,172.233.111.19,172.233.111.12,172.233.111.26,172.233.111.16,172.233.111.18,172.233.111.9", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "in-maa", + "label": "Chennai, IN", "country": "in", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes + Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", + "Metadata", "Premium Plans", "Placement Group", "StackScripts", "NETINT Quadra + T1U", "Maintenance Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed + Databases", "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "172.232.96.17,172.232.96.26,172.232.96.19,172.232.96.20,172.232.96.25,172.232.96.21,172.232.96.18,172.232.96.22,172.232.96.23,172.232.96.24", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "jp-osa", + "label": "Osaka, JP", "country": "jp", "capabilities": ["Linodes", "Block Storage + Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes + Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", + "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "172.233.64.44,172.233.64.43,172.233.64.37,172.233.64.40,172.233.64.46,172.233.64.41,172.233.64.39,172.233.64.42,172.233.64.45,172.233.64.38", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "it-mil", + "label": "Milan, IT", "country": "it", "capabilities": ["Linodes", "Block Storage + Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes + Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", + "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "172.232.192.19,172.232.192.18,172.232.192.16,172.232.192.20,172.232.192.24,172.232.192.21,172.232.192.22,172.232.192.17,172.232.192.15,172.232.192.23", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "us-central", + "label": "Dallas, TX", "country": "us", "capabilities": ["Linodes", "Block Storage + Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", + "Managed Databases", "Metadata", "Placement Group", "StackScripts", "Maintenance + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "72.14.179.5,72.14.188.5,173.255.199.5,66.228.53.5,96.126.122.5,96.126.124.5,96.126.127.5,198.58.107.5,198.58.111.5,23.239.24.5", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "ap-northeast", + "label": "Tokyo 2, JP", "country": "jp", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", + "Managed Databases", "Metadata", "Placement Group", "StackScripts", "Maintenance + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "139.162.66.5,139.162.67.5,139.162.68.5,139.162.69.5,139.162.70.5,139.162.71.5,139.162.72.5,139.162.73.5,139.162.74.5,139.162.75.5", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "eu-central", + "label": "Frankfurt, DE", "country": "de", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", "Managed Databases", "Metadata", "Placement - Group"], "status": "ok", "resolvers": {"ipv4": "66.228.42.5, 96.126.106.5, 50.116.53.5, - 50.116.58.5, 50.116.61.5, 50.116.62.5, 66.175.211.5, 97.107.133.4, 207.192.69.4, - 207.192.69.5", "ipv6": "1234::5678, 1234::5678, 1234::5678, 1234::5678, + Group", "StackScripts", "Maintenance Policy", "Linode Interfaces"], "monitors": + {"alerts": ["Managed Databases", "NodeBalancers"], "metrics": ["Managed Databases", + "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "139.162.130.5,139.162.131.5,139.162.132.5,139.162.133.5,139.162.134.5,139.162.135.5,139.162.136.5,139.162.137.5,139.162.138.5,139.162.139.5", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "ap-south", + "label": "Singapore, SG", "country": "sg", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Cloud Firewall", + "Vlans", "Block Storage Migrations", "Metadata", "Placement Group", "StackScripts", + "Maintenance Policy", "Linode Interfaces"], "monitors": {"alerts": ["NodeBalancers"], + "metrics": ["NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "139.162.11.5,139.162.13.5,139.162.14.5,139.162.15.5,139.162.16.5,139.162.21.5,139.162.27.5,103.3.60.18,103.3.60.19,103.3.60.20", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "eu-west", + "label": "London, UK", "country": "gb", "capabilities": ["Linodes", "Block Storage + Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", + "Metadata", "Placement Group", "StackScripts", "Maintenance Policy", "Linode + Interfaces"], "monitors": {"alerts": ["NodeBalancers"], "metrics": ["NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "178.79.182.5, 176.58.107.5, 176.58.116.5, + 176.58.121.5, 151.236.220.5, 212.71.252.5, 212.71.253.5, 109.74.192.20, 109.74.193.20, + 109.74.194.20", "ipv6": "1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "eu-west", "label": "London, UK", "country": - "gb", "capabilities": ["Linodes", "Backups", "NodeBalancers", "Block Storage", - "Cloud Firewall", "Vlans", "Block Storage Migrations", "Managed Databases", - "Metadata", "Placement Group"], "status": "ok", "resolvers": {"ipv4": "178.79.182.5, - 176.58.107.5, 176.58.116.5, 176.58.121.5, 151.236.220.5, 212.71.252.5, 212.71.253.5, - 109.74.192.20, 109.74.193.20, 109.74.194.20", "ipv6": "1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": - null, "maximum_linodes_per_pg": 5}, "site_type": "core"}, {"id": "ap-south", - "label": "Singapore, SG", "country": "sg", "capabilities": ["Linodes", "Backups", - "NodeBalancers", "Block Storage", "Object Storage", "GPU Linodes", "Cloud Firewall", + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "us-east", + "label": "Newark, NJ", "country": "us", "capabilities": ["Linodes", "Block Storage + Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", "Managed Databases", "Metadata", "Placement - Group"], "status": "ok", "resolvers": {"ipv4": "139.162.11.5, 139.162.13.5, - 139.162.14.5, 139.162.15.5, 139.162.16.5, 139.162.21.5, 139.162.27.5, 103.3.60.18, - 103.3.60.19, 103.3.60.20", "ipv6": "1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678, - 1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, - "maximum_linodes_per_pg": 5}, "site_type": "core"}, {"id": "eu-central", "label": - "Frankfurt, DE", "country": "de", "capabilities": ["Linodes", "Backups", "NodeBalancers", - "Block Storage", "Object Storage", "GPU Linodes", "Cloud Firewall", "Vlans", - "Block Storage Migrations", "Managed Databases", "Metadata", "Placement Group"], - "status": "ok", "resolvers": {"ipv4": "139.162.130.5, 139.162.131.5, 139.162.132.5, - 139.162.133.5, 139.162.134.5, 139.162.135.5, 139.162.136.5, 139.162.137.5, 139.162.138.5, - 139.162.139.5", "ipv6": "1234::5678, 1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678"}, + Group", "StackScripts", "Maintenance Policy", "Linode Interfaces"], "monitors": + {"alerts": ["Managed Databases", "NodeBalancers"], "metrics": ["Managed Databases", + "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "66.228.42.5,96.126.106.5,50.116.53.5,50.116.58.5,50.116.61.5,50.116.62.5,66.175.211.5,97.107.133.4,173.255.225.5,66.228.35.5", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "us-southeast", + "label": "Atlanta, GA", "country": "us", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Cloud Firewall", + "Vlans", "Block Storage Migrations", "Managed Databases", "Metadata", "Placement + Group", "StackScripts", "Maintenance Policy", "Linode Interfaces"], "monitors": + {"alerts": ["Managed Databases", "NodeBalancers"], "metrics": ["Managed Databases", + "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "74.207.231.5,173.230.128.5,173.230.129.5,173.230.136.5,173.230.140.5,66.228.59.5,66.228.62.5,50.116.35.5,50.116.41.5,23.239.18.5", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "ap-northeast", "label": "Tokyo, JP", "country": - "jp", "capabilities": ["Linodes", "Backups", "NodeBalancers", "Block Storage", - "Cloud Firewall", "Vlans", "Block Storage Migrations", "Managed Databases", - "Metadata", "Placement Group"], "status": "ok", "resolvers": {"ipv4": "139.162.66.5, - 139.162.67.5, 139.162.68.5, 139.162.69.5, 139.162.70.5, 139.162.71.5, 139.162.72.5, - 139.162.73.5, 139.162.74.5, 139.162.75.5", "ipv6": "1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": - null, "maximum_linodes_per_pg": 5}, "site_type": "core"}], "page": 1, "pages": - 1, "results": 34}' + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "us-west", + "label": "Fremont, CA", "country": "us", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", + "Managed Databases", "Metadata", "Placement Group", "StackScripts", "Maintenance + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "173.230.145.5, 173.230.147.5, 173.230.155.5, 173.255.212.5, + 173.255.219.5, 173.255.241.5, 173.255.243.5, 173.255.244.5, 74.207.241.5, 74.207.242.5", + "ipv6": "1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678, + 1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678"}, "placement_group_limits": + {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": + 5}, "site_type": "core"}], "page": 1, "pages": 1, "results": 47}' headers: Access-Control-Allow-Credentials: - "true" @@ -312,24 +471,23 @@ interactions: Akamai-Internal-Account: - '*' Cache-Control: - - private, max-age=900 - - private, max-age=60, s-maxage=60 + - max-age=0, no-cache, no-store Connection: - keep-alive - Content-Length: - - "24356" Content-Security-Policy: - default-src 'none' Content-Type: - application/json - Server: - - nginx/1.14.2 + Expires: + - Wed, 06 May 2026 01:41:43 GMT + Pragma: + - no-cache Strict-Transport-Security: - max-age=31536000 - - max-age=31536000 Vary: - Authorization, X-Filter - Authorization, X-Filter + - Accept-Encoding X-Accepted-Oauth-Scopes: - '*' X-Content-Type-Options: @@ -338,19 +496,16 @@ interactions: - DENY - DENY X-Oauth-Scopes: - - account:read_write databases:read_write domains:read_write events:read_write - firewall:read_write images:read_write ips:read_write linodes:read_write lke:read_write - longview:read_write nodebalancers:read_write object_storage:read_write stackscripts:read_write - volumes:read_write vpc:read_write + - '*' X-Ratelimit-Limit: - - "400" + - "1840" X-Xss-Protection: - 1; mode=block status: 200 OK code: 200 duration: "" - request: - body: '{"region":"ap-west","type":"g6-nanode-1","label":"go-test-ins-837hb70fb4qy","root_pass":"545$7Z)AA9sXKf,sXaf8^*W}jy((rk|96998De3YdYYw~cKZ{9,KB\u003c=84ki`uM7+","image":"linode/debian9","firewall_id":693368,"booted":false}' + body: '{"region":"au-mel","type":"g6-nanode-1","label":"go-test-ins-3o0411gu5ucp","root_pass":"U31M3!vA{fc02bspJ''S(H[NFB8G2;eb@2Hi7d/2zu709wg3`\u003cU+p4\\$LW7(Mq?J!","image":"linode/debian12","firewall_id":9689919,"booted":false}' form: {} headers: Accept: @@ -362,17 +517,19 @@ interactions: url: https://api.linode.com/v4beta/linode/instances method: POST response: - body: '{"id": 61877581, "label": "go-test-ins-837hb70fb4qy", "group": "", "status": + body: '{"id": 97189517, "label": "go-test-ins-3o0411gu5ucp", "group": "", "status": "provisioning", "created": "2018-01-02T03:04:05", "updated": "2018-01-02T03:04:05", - "type": "g6-nanode-1", "ipv4": ["192.46.208.15"], "ipv6": "1234::5678/128", - "image": "linode/debian9", "region": "ap-west", "site_type": "core", "specs": - {"disk": 25600, "memory": 1024, "vcpus": 1, "gpus": 0, "transfer": 1000}, "alerts": - {"cpu": 90, "network_in": 10, "network_out": 10, "transfer_quota": 80, "io": - 10000}, "backups": {"enabled": true, "available": false, "schedule": {"day": - null, "window": null}, "last_successful": null}, "hypervisor": "kvm", "watchdog_enabled": - true, "tags": [], "host_uuid": "0e0c1ef96c34828ce8b53e9e04870191260828c7", "has_user_data": - false, "placement_group": null, "disk_encryption": "disabled", "lke_cluster_id": - null}' + "type": "g6-nanode-1", "ipv4": ["172.236.44.171"], "ipv6": "1234::5678/128", + "image": "linode/debian12", "region": "au-mel", "site_type": "core", "specs": + {"disk": 25600, "memory": 1024, "vcpus": 1, "gpus": 0, "transfer": 1000, "accelerated_devices": + 0}, "alerts": {"cpu": 90, "network_in": 10, "network_out": 10, "transfer_quota": + 80, "io": 10000, "system_alerts": [], "user_alerts": []}, "backups": {"enabled": + false, "available": false, "schedule": {"day": null, "window": null}, "last_successful": + null}, "hypervisor": "kvm", "watchdog_enabled": true, "tags": [], "host_uuid": + "6c9b57be39471d7888b736f623fe5527fd93c553", "has_user_data": false, "placement_group": + null, "disk_encryption": "enabled", "lke_cluster_id": null, "capabilities": + ["Block Storage Encryption", "SMTP Enabled", "Maintenance Policy"], "interface_generation": + "legacy_config", "maintenance_policy": "linode/migrate", "locks": []}' headers: Access-Control-Allow-Credentials: - "true" @@ -387,22 +544,22 @@ interactions: Akamai-Internal-Account: - '*' Cache-Control: - - private, max-age=60, s-maxage=60 + - max-age=0, no-cache, no-store Connection: - keep-alive - Content-Length: - - "841" Content-Security-Policy: - default-src 'none' Content-Type: - application/json - Server: - - nginx/1.14.2 + Expires: + - Wed, 06 May 2026 01:41:45 GMT + Pragma: + - no-cache Strict-Transport-Security: - max-age=31536000 - - max-age=31536000 Vary: - Authorization, X-Filter + - Accept-Encoding X-Accepted-Oauth-Scopes: - linodes:read_write X-Content-Type-Options: @@ -411,12 +568,9 @@ interactions: - DENY - DENY X-Oauth-Scopes: - - account:read_write databases:read_write domains:read_write events:read_write - firewall:read_write images:read_write ips:read_write linodes:read_write lke:read_write - longview:read_write nodebalancers:read_write object_storage:read_write stackscripts:read_write - volumes:read_write vpc:read_write + - '*' X-Ratelimit-Limit: - - "10" + - "20" X-Xss-Protection: - 1; mode=block status: 200 OK @@ -432,15 +586,15 @@ interactions: - application/json User-Agent: - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/linode/instances/61877581/disks?page=1 + url: https://api.linode.com/v4beta/linode/instances/97189517/disks?page=1 method: GET response: - body: '{"data": [{"id": 121429953, "status": "not ready", "label": "Debian 9 Disk", - "created": "2018-01-02T03:04:05", "updated": "2018-01-02T03:04:05", "filesystem": - "ext4", "size": 25088, "disk_encryption": "disabled"}, {"id": 121429954, "status": + body: '{"data": [{"id": 183299550, "status": "not ready", "label": "Debian 12 + Disk", "created": "2018-01-02T03:04:05", "updated": "2018-01-02T03:04:05", "filesystem": + "ext4", "size": 25088, "disk_encryption": "enabled"}, {"id": 183299552, "status": "not ready", "label": "512 MB Swap Image", "created": "2018-01-02T03:04:05", "updated": "2018-01-02T03:04:05", "filesystem": "swap", "size": 512, "disk_encryption": - "disabled"}], "page": 1, "pages": 1, "results": 2}' + "enabled"}], "page": 1, "pages": 1, "results": 2}' headers: Access-Control-Allow-Credentials: - "true" @@ -455,21 +609,21 @@ interactions: Akamai-Internal-Account: - '*' Cache-Control: - - private, max-age=0, s-maxage=0, no-cache, no-store - - private, max-age=60, s-maxage=60 + - max-age=0, no-cache, no-store Connection: - keep-alive Content-Length: - - "457" + - "456" Content-Security-Policy: - default-src 'none' Content-Type: - application/json - Server: - - nginx/1.14.2 + Expires: + - Wed, 06 May 2026 01:41:45 GMT + Pragma: + - no-cache Strict-Transport-Security: - max-age=31536000 - - max-age=31536000 Vary: - Authorization, X-Filter - Authorization, X-Filter @@ -481,19 +635,16 @@ interactions: - DENY - DENY X-Oauth-Scopes: - - account:read_write databases:read_write domains:read_write events:read_write - firewall:read_write images:read_write ips:read_write linodes:read_write lke:read_write - longview:read_write nodebalancers:read_write object_storage:read_write stackscripts:read_write - volumes:read_write vpc:read_write + - '*' X-Ratelimit-Limit: - - "400" + - "1840" X-Xss-Protection: - 1; mode=block status: 200 OK code: 200 duration: "" - request: - body: '{"disk_id":121429953,"label":"linodego-test-cloud-init","cloud_init":true,"tags":["test1","test2"]}' + body: '{"disk_id":183299550,"label":"linodego-test-cloud-init","cloud_init":true,"tags":["test1","test2"]}' form: {} headers: Accept: @@ -505,12 +656,14 @@ interactions: url: https://api.linode.com/v4beta/images method: POST response: - body: '{"id": "private/26428978", "label": "linodego-test-cloud-init", "description": + body: '{"id": "private/38637317", "label": "linodego-test-cloud-init", "description": "", "created": "2018-01-02T03:04:05", "updated": "2018-01-02T03:04:05", "size": - 25088, "created_by": "ychen123", "type": "manual", "tags": ["test1", "test2"], - "is_public": false, "deprecated": false, "vendor": null, "expiry": null, "eol": - null, "status": "creating", "capabilities": ["cloud-init"], "regions": [], "total_size": - 25088}' + 25088, "created_by": "zliang27", "type": "manual", "tags": ["test1", "test2"], + "is_public": false, "is_shared": false, "deprecated": false, "vendor": null, + "expiry": null, "eol": null, "status": "creating", "capabilities": ["cloud-init"], + "regions": [], "total_size": 25088, "image_sharing": {"shared_with": {"sharegroup_count": + 0, "sharegroup_list_url": "/images/private/38637317/sharegroups"}, "shared_by": + null}}' headers: Access-Control-Allow-Credentials: - "true" @@ -525,20 +678,21 @@ interactions: Akamai-Internal-Account: - '*' Cache-Control: - - private, max-age=60, s-maxage=60 + - max-age=0, no-cache, no-store Connection: - keep-alive Content-Length: - - "413" + - "574" Content-Security-Policy: - default-src 'none' Content-Type: - application/json - Server: - - nginx/1.14.2 + Expires: + - Wed, 06 May 2026 01:41:45 GMT + Pragma: + - no-cache Strict-Transport-Security: - max-age=31536000 - - max-age=31536000 Vary: - Authorization, X-Filter X-Accepted-Oauth-Scopes: @@ -549,12 +703,9 @@ interactions: - DENY - DENY X-Oauth-Scopes: - - account:read_write databases:read_write domains:read_write events:read_write - firewall:read_write images:read_write ips:read_write linodes:read_write lke:read_write - longview:read_write nodebalancers:read_write object_storage:read_write stackscripts:read_write - volumes:read_write vpc:read_write + - '*' X-Ratelimit-Limit: - - "400" + - "1840" X-Xss-Protection: - 1; mode=block status: 200 OK @@ -570,7 +721,7 @@ interactions: - application/json User-Agent: - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/images/private%2F26428978 + url: https://api.linode.com/v4beta/images/private%2F38637317 method: DELETE response: body: '{}' @@ -588,7 +739,7 @@ interactions: Akamai-Internal-Account: - '*' Cache-Control: - - private, max-age=60, s-maxage=60 + - max-age=0, no-cache, no-store Connection: - keep-alive Content-Length: @@ -597,11 +748,12 @@ interactions: - default-src 'none' Content-Type: - application/json - Server: - - nginx/1.14.2 + Expires: + - Wed, 06 May 2026 01:41:46 GMT + Pragma: + - no-cache Strict-Transport-Security: - max-age=31536000 - - max-age=31536000 Vary: - Authorization, X-Filter X-Accepted-Oauth-Scopes: @@ -612,12 +764,9 @@ interactions: - DENY - DENY X-Oauth-Scopes: - - account:read_write databases:read_write domains:read_write events:read_write - firewall:read_write images:read_write ips:read_write linodes:read_write lke:read_write - longview:read_write nodebalancers:read_write object_storage:read_write stackscripts:read_write - volumes:read_write vpc:read_write + - '*' X-Ratelimit-Limit: - - "400" + - "1840" X-Xss-Protection: - 1; mode=block status: 200 OK @@ -633,7 +782,7 @@ interactions: - application/json User-Agent: - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/linode/instances/61877581 + url: https://api.linode.com/v4beta/linode/instances/97189517 method: DELETE response: body: '{}' @@ -651,7 +800,7 @@ interactions: Akamai-Internal-Account: - '*' Cache-Control: - - private, max-age=60, s-maxage=60 + - max-age=0, no-cache, no-store Connection: - keep-alive Content-Length: @@ -660,11 +809,12 @@ interactions: - default-src 'none' Content-Type: - application/json - Server: - - nginx/1.14.2 + Expires: + - Wed, 06 May 2026 01:41:46 GMT + Pragma: + - no-cache Strict-Transport-Security: - max-age=31536000 - - max-age=31536000 Vary: - Authorization, X-Filter X-Accepted-Oauth-Scopes: @@ -675,12 +825,9 @@ interactions: - DENY - DENY X-Oauth-Scopes: - - account:read_write databases:read_write domains:read_write events:read_write - firewall:read_write images:read_write ips:read_write linodes:read_write lke:read_write - longview:read_write nodebalancers:read_write object_storage:read_write stackscripts:read_write - volumes:read_write vpc:read_write + - '*' X-Ratelimit-Limit: - - "400" + - "1840" X-Xss-Protection: - 1; mode=block status: 200 OK diff --git a/test/integration/fixtures/TestInstance_ConfigInterface_Update.yaml b/test/integration/fixtures/TestInstance_ConfigInterface_Update.yaml index 6b27dad88..8d949dedb 100644 --- a/test/integration/fixtures/TestInstance_ConfigInterface_Update.yaml +++ b/test/integration/fixtures/TestInstance_ConfigInterface_Update.yaml @@ -14,308 +14,449 @@ interactions: url: https://api.linode.com/v4beta/regions?page=1 method: GET response: - body: '{"data": [{"id": "ap-west", "label": "Mumbai, IN", "country": "in", "capabilities": - ["Linodes", "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", - "GPU Linodes", "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", - "Managed Databases", "Metadata", "Placement Group", "StackScripts", "Linode - Interfaces"], "monitors": {"alerts": ["Managed Databases"], "metrics": ["Managed - Databases"]}, "status": "ok", "resolvers": {"ipv4": "172.105.34.5,172.105.35.5,172.105.36.5,172.105.37.5,172.105.38.5,172.105.39.5,172.105.40.5,172.105.41.5,172.105.42.5,172.105.43.5", + body: '{"data": [{"id": "au-mel", "label": "Melbourne, AU", "country": "au", "capabilities": + ["Linodes", "Block Storage Encryption", "LA Disk Encryption", "Disk Encryption", + "Backups", "NodeBalancers", "Block Storage", "Object Storage", "Kubernetes", + "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", + "Premium Plans", "Placement Group", "StackScripts", "Maintenance Policy", "Linode + Interfaces"], "monitors": {"alerts": ["Managed Databases", "NodeBalancers"], + "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": + {"ipv4": "172.236.32.23,172.236.32.35,172.236.32.30,172.236.32.28,172.236.32.32,172.236.32.33,172.236.32.27,172.236.32.37,172.236.32.29,172.236.32.34", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "us-lax", + "label": "Los Angeles, CA", "country": "us", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes + Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", + "Metadata", "Premium Plans", "Placement Group", "StackScripts", "NETINT Quadra + T1U", "Maintenance Policy", "Linode Interfaces", "ACLP Logs Datacenter LKE-E"], + "monitors": {"alerts": ["Managed Databases", "NodeBalancers"], "metrics": ["Managed + Databases", "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "172.233.128.45,172.233.128.38,172.233.128.53,172.233.128.37,172.233.128.34,172.233.128.36,172.233.128.33,172.233.128.39,172.233.128.43,172.233.128.44", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "nz-akl-1", + "label": "Auckland, NZ", "country": "nz", "capabilities": ["Linodes", "Disk + Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", "Maintenance + Policy"], "monitors": {"alerts": [], "metrics": []}, "status": "ok", "resolvers": + {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": + 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": + "us-den-1", "label": "Denver, CO", "country": "us", "capabilities": ["Linodes", + "Disk Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", + "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": + "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": + 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": + "de-ham-1", "label": "Hamburg, DE", "country": "de", "capabilities": ["Linodes", + "Disk Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", + "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": + "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": + 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": + "za-jnb-1", "label": "Johannesburg, ZA", "country": "za", "capabilities": ["Linodes", + "Disk Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", + "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": + "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": + 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": + "my-kul-1", "label": "Kuala Lumpur, MY", "country": "my", "capabilities": ["Linodes", + "Disk Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", + "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": + "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": + 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": + "co-bog-1", "label": "Bogot\u00e1, CO", "country": "co", "capabilities": ["Linodes", + "Disk Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", + "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": + "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": + 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": + "mx-qro-1", "label": "Quer\u00e9taro, MX", "country": "mx", "capabilities": + ["Linodes", "Disk Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed + Plans", "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": + "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": + 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": + "us-hou-1", "label": "Houston, TX", "country": "us", "capabilities": ["Linodes", + "Disk Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", + "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": + "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": + 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": + "cl-scl-1", "label": "Santiago, CL", "country": "cl", "capabilities": ["Linodes", + "Disk Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", + "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": + "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": + 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": + "gb-lon", "label": "London 2, UK", "country": "gb", "capabilities": ["Linodes", + "Block Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", + "NodeBalancers", "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", + "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", + "Managed Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", + "NETINT Quadra T1U", "Maintenance Policy", "Linode Interfaces", "ACLP Logs Datacenter + LKE-E"], "monitors": {"alerts": ["Managed Databases", "NodeBalancers"], "metrics": + ["Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": + "172.236.0.46,172.236.0.50,172.236.0.47,172.236.0.53,172.236.0.52,172.236.0.45,172.236.0.49,172.236.0.51,172.236.0.54,172.236.0.48", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "id-cgk", + "label": "Jakarta, ID", "country": "id", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes + Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", + "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "172.232.224.23,172.232.224.32,172.232.224.26,172.232.224.27,172.232.224.21,172.232.224.24,172.232.224.22,172.232.224.20,172.232.224.31,172.232.224.28", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "in-bom-2", + "label": "Mumbai 2, IN", "country": "in", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "GPU Linodes", "Kubernetes", "Kubernetes Enterprise", "Cloud + Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", + "Premium Plans", "Placement Group", "StackScripts", "Maintenance Policy", "Linode + Interfaces", "ACLP Logs Datacenter LKE-E"], "monitors": {"alerts": ["Managed + Databases", "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "172.236.171.41,172.236.171.42,172.236.171.25,172.236.171.44,172.236.171.26,172.236.171.45,172.236.171.24,172.236.171.43,172.236.171.27,172.236.171.28", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "de-fra-2", + "label": "Frankfurt 2, DE", "country": "de", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes + Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", + "Metadata", "Premium Plans", "Placement Group", "StackScripts", "NETINT Quadra + T1U", "Maintenance Policy", "Linode Interfaces", "ACLP Logs Datacenter LKE-E"], + "monitors": {"alerts": ["Managed Databases", "NodeBalancers"], "metrics": ["Managed + Databases", "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "172.236.203.9,172.236.203.16,172.236.203.19,172.236.203.15,172.236.203.17,172.236.203.11,172.236.203.18,172.236.203.14,172.236.203.13,172.236.203.12", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "sg-sin-2", + "label": "Singapore 2, SG", "country": "sg", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes + Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", + "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance + Policy", "Linode Interfaces", "ACLP Logs Datacenter LKE-E"], "monitors": {"alerts": + ["Managed Databases", "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "172.236.129.8,172.236.129.42,172.236.129.41,172.236.129.19,172.236.129.46,172.236.129.23,172.236.129.48,172.236.129.20,172.236.129.21,172.236.129.47", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "jp-tyo-3", + "label": "Tokyo 3, JP", "country": "jp", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes + Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", + "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance + Policy", "Linode Interfaces", "ACLP Logs Datacenter LKE-E"], "monitors": {"alerts": + ["Managed Databases", "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "172.237.4.15,172.237.4.19,172.237.4.17,172.237.4.21,172.237.4.16,172.237.4.18,172.237.4.23,172.237.4.24,172.237.4.20,172.237.4.14", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "de-ber-1", + "label": "Berlin, DE", "country": "de", "capabilities": ["Linodes", "Disk Encryption", + "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", "Maintenance Policy"], + "monitors": {"alerts": [], "metrics": []}, "status": "ok", "resolvers": {"ipv4": + "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": + 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": + "no-osl-1", "label": "Oslo, NO", "country": "no", "capabilities": ["Linodes", + "Block Storage Encryption", "Disk Encryption", "Backups", "NodeBalancers", "Block + Storage", "Object Storage", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", + "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", "Premium + Plans", "Placement Group", "StackScripts", "Maintenance Policy", "Linode Interfaces", + "ACLP Logs Datacenter LKE-E"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "172.238.140.33,172.238.140.25,172.238.140.30,172.238.140.31,172.238.140.26,172.238.140.28,172.238.140.34,172.238.140.32,172.238.140.27,172.238.140.29", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "us-iad-2", + "label": "Washington 2, DC", "country": "us", "capabilities": ["Linodes", "Block + Storage Encryption", "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", + "Object Storage", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", + "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", "Premium Plans", + "Placement Group", "StackScripts", "Maintenance Policy", "Linode Interfaces"], + "monitors": {"alerts": ["Managed Databases", "NodeBalancers"], "metrics": ["Managed + Databases", "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "172.239.142.102,172.239.142.89,172.239.142.92,172.239.142.87,172.239.142.88,172.239.142.103,172.239.142.91,172.239.142.90,172.239.142.86,172.239.142.100", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "fr-par-2", + "label": "Paris 2, FR", "country": "fr", "capabilities": ["Linodes", "Block + Storage Encryption", "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", + "GPU Linodes", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", + "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", "Premium Plans", + "Placement Group", "StackScripts", "Maintenance Policy", "Linode Interfaces", + "ACLP Logs Datacenter LKE-E"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "172.239.11.24,172.239.11.22,172.239.11.17,172.239.11.20,172.239.11.23,172.239.11.19,172.239.11.21,172.239.11.15,172.239.11.16,172.239.11.18", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "us-rno-1", + "label": "Reno, NV", "country": "us", "capabilities": ["Linodes", "Disk Encryption", + "Backups", "NodeBalancers", "GPU Linodes", "Metadata", "Premium Plans", "Placement + Group", "StackScripts", "Maintenance Policy"], "monitors": {"alerts": ["NodeBalancers"], + "metrics": ["NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "", "ipv6": + ""}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "co-bog-2", + "label": "Bogot\u00e1 2, CO", "country": "co", "capabilities": ["Linodes", "Disk + Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", "Maintenance + Policy"], "monitors": {"alerts": [], "metrics": []}, "status": "ok", "resolvers": + {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": + 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": + "fr-mrs-2", "label": "Marseille 2, FR", "country": "fr", "capabilities": ["Linodes", + "Disk Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", + "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": + "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": + 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": + "us-mia", "label": "Miami, FL", "country": "us", "capabilities": ["Linodes", + "Block Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", + "NodeBalancers", "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", + "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", + "Managed Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", + "NETINT Quadra T1U", "Maintenance Policy", "Linode Interfaces"], "monitors": + {"alerts": ["Managed Databases", "NodeBalancers"], "metrics": ["Managed Databases", + "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "172.233.160.34,172.233.160.27,172.233.160.30,172.233.160.29,172.233.160.32,172.233.160.28,172.233.160.33,172.233.160.26,172.233.160.25,172.233.160.31", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "ap-west", + "label": "Mumbai, IN", "country": "in", "capabilities": ["Linodes", "Block Storage + Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "GPU Linodes", "Kubernetes", "Cloud Firewall", "Vlans", "Block + Storage Migrations", "Managed Databases", "Metadata", "Placement Group", "StackScripts", + "Maintenance Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed + Databases", "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "172.105.34.5,172.105.35.5,172.105.36.5,172.105.37.5,172.105.38.5,172.105.39.5,172.105.40.5,172.105.41.5,172.105.42.5,172.105.43.5", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "ca-central", - "label": "Toronto, CA", "country": "ca", "capabilities": ["Linodes", "Disk Encryption", - "Backups", "NodeBalancers", "Block Storage", "Kubernetes", "Cloud Firewall", - "Vlans", "Block Storage Migrations", "Managed Databases", "Metadata", "Placement - Group", "StackScripts", "Linode Interfaces"], "monitors": {"alerts": ["Managed - Databases"], "metrics": ["Managed Databases"]}, "status": "ok", "resolvers": - {"ipv4": "172.105.0.5,172.105.3.5,172.105.4.5,172.105.5.5,172.105.6.5,172.105.7.5,172.105.8.5,172.105.9.5,172.105.10.5,172.105.11.5", + "label": "Toronto, CA", "country": "ca", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "GPU Linodes", "Kubernetes", "Cloud Firewall", "Vlans", "Block + Storage Migrations", "Managed Databases", "Metadata", "Placement Group", "StackScripts", + "Maintenance Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed + Databases", "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "172.105.0.5,172.105.3.5,172.105.4.5,172.105.5.5,172.105.6.5,172.105.7.5,172.105.8.5,172.105.9.5,172.105.10.5,172.105.11.5", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "ap-southeast", - "label": "Sydney, AU", "country": "au", "capabilities": ["Linodes", "Disk Encryption", - "Backups", "NodeBalancers", "Block Storage", "Kubernetes", "Cloud Firewall", - "Vlans", "Block Storage Migrations", "Managed Databases", "Metadata", "Placement - Group", "StackScripts", "Linode Interfaces"], "monitors": {"alerts": ["Managed - Databases"], "metrics": ["Managed Databases"]}, "status": "ok", "resolvers": - {"ipv4": "172.105.166.5,172.105.169.5,172.105.168.5,172.105.172.5,172.105.162.5,172.105.170.5,172.105.167.5,172.105.171.5,172.105.181.5,172.105.161.5", + "label": "Sydney, AU", "country": "au", "capabilities": ["Linodes", "Block Storage + Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", + "Managed Databases", "Metadata", "Placement Group", "StackScripts", "Maintenance + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "172.105.166.5,172.105.169.5,172.105.168.5,172.105.172.5,172.105.162.5,172.105.170.5,172.105.167.5,172.105.171.5,172.105.181.5,172.105.161.5", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "us-iad", "label": "Washington, DC", "country": "us", "capabilities": ["Linodes", "Block - Storage Encryption", "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", - "Object Storage", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", - "VPCs", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", - "StackScripts", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases"], - "metrics": ["Managed Databases"]}, "status": "ok", "resolvers": {"ipv4": "139.144.192.62,139.144.192.60,139.144.192.61,139.144.192.53,139.144.192.54,139.144.192.67,139.144.192.69,139.144.192.66,139.144.192.52,139.144.192.68", + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "Kubernetes", "Kubernetes Enterprise", "Cloud + Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", + "Premium Plans", "Placement Group", "StackScripts", "Maintenance Policy", "Linode + Interfaces", "ACLP Logs Datacenter LKE-E"], "monitors": {"alerts": ["Managed + Databases", "NodeBalancers"], "metrics": ["Linodes", "Managed Databases", "NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "139.144.192.62,139.144.192.60,139.144.192.61,139.144.192.53,139.144.192.54,139.144.192.67,139.144.192.69,139.144.192.66,139.144.192.52,139.144.192.68", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "us-ord", "label": "Chicago, IL", "country": "us", "capabilities": ["Linodes", "Block - Storage Encryption", "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", - "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes Enterprise", "Cloud - Firewall", "Vlans", "VPCs", "Managed Databases", "Metadata", "Premium Plans", - "Placement Group", "StackScripts", "Linode Interfaces"], "monitors": {"alerts": - ["Managed Databases"], "metrics": ["Managed Databases"]}, "status": "ok", "resolvers": - {"ipv4": "172.232.0.17,172.232.0.16,172.232.0.21,172.232.0.13,172.232.0.22,172.232.0.9,172.232.0.19,172.232.0.20,172.232.0.15,172.232.0.18", + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes + Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", + "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance + Policy", "Linode Interfaces", "ACLP Logs Datacenter LKE-E"], "monitors": {"alerts": + ["Managed Databases", "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "172.232.0.17,172.232.0.16,172.232.0.21,172.232.0.13,172.232.0.22,172.232.0.9,172.232.0.19,172.232.0.20,172.232.0.15,172.232.0.18", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "fr-par", "label": "Paris, FR", "country": "fr", "capabilities": ["Linodes", "Block Storage - Encryption", "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", - "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes Enterprise", "Cloud - Firewall", "Vlans", "VPCs", "Managed Databases", "Metadata", "Premium Plans", - "Placement Group", "StackScripts", "Linode Interfaces"], "monitors": {"alerts": - ["Managed Databases"], "metrics": ["Managed Databases"]}, "status": "ok", "resolvers": - {"ipv4": "172.232.32.21,172.232.32.23,172.232.32.17,172.232.32.18,172.232.32.16,172.232.32.22,172.232.32.20,172.232.32.14,172.232.32.11,172.232.32.12", + Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes + Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", + "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "172.232.32.21,172.232.32.23,172.232.32.17,172.232.32.18,172.232.32.16,172.232.32.22,172.232.32.20,172.232.32.14,172.232.32.11,172.232.32.12", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "us-sea", "label": "Seattle, WA", "country": "us", "capabilities": ["Linodes", "Block - Storage Encryption", "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", - "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes Enterprise", "Cloud - Firewall", "Vlans", "VPCs", "Managed Databases", "Metadata", "Premium Plans", - "Placement Group", "StackScripts", "Maintenance Policy", "Linode Interfaces"], - "monitors": {"alerts": ["Managed Databases"], "metrics": ["Managed Databases"]}, + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes + Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", + "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance + Policy", "Linode Interfaces", "ACLP Logs Datacenter LKE-E"], "monitors": {"alerts": + ["Managed Databases", "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "172.232.160.19,172.232.160.21,172.232.160.17,172.232.160.15,172.232.160.18,172.232.160.8,172.232.160.12,172.232.160.11,172.232.160.14,172.232.160.16", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "br-gru", "label": "Sao Paulo, BR", "country": "br", "capabilities": ["Linodes", "Block - Storage Encryption", "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", - "Object Storage", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", - "VPCs", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", - "StackScripts", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases"], - "metrics": ["Managed Databases"]}, "status": "ok", "resolvers": {"ipv4": "172.233.0.4,172.233.0.9,172.233.0.7,172.233.0.12,172.233.0.5,172.233.0.13,172.233.0.10,172.233.0.6,172.233.0.8,172.233.0.11", + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "Kubernetes", "Kubernetes Enterprise", "Cloud + Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", + "Premium Plans", "Placement Group", "StackScripts", "Maintenance Policy", "Linode + Interfaces"], "monitors": {"alerts": ["Managed Databases", "NodeBalancers"], + "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": + {"ipv4": "172.233.0.4,172.233.0.9,172.233.0.7,172.233.0.12,172.233.0.5,172.233.0.13,172.233.0.10,172.233.0.6,172.233.0.8,172.233.0.11", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "nl-ams", "label": "Amsterdam, NL", "country": "nl", "capabilities": ["Linodes", "Block - Storage Encryption", "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", - "Object Storage", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", - "VPCs", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", - "StackScripts", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases"], - "metrics": ["Managed Databases"]}, "status": "ok", "resolvers": {"ipv4": "172.233.33.36,172.233.33.38,172.233.33.35,172.233.33.39,172.233.33.34,172.233.33.33,172.233.33.31,172.233.33.30,172.233.33.37,172.233.33.32", + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes + Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", + "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "172.233.33.36,172.233.33.38,172.233.33.35,172.233.33.39,172.233.33.34,172.233.33.33,172.233.33.31,172.233.33.30,172.233.33.37,172.233.33.32", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "se-sto", "label": "Stockholm, SE", "country": "se", "capabilities": ["Linodes", "Block - Storage Encryption", "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", - "Object Storage", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", - "VPCs", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", - "StackScripts", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases"], - "metrics": ["Managed Databases"]}, "status": "ok", "resolvers": {"ipv4": "172.232.128.24,172.232.128.26,172.232.128.20,172.232.128.22,172.232.128.25,172.232.128.19,172.232.128.23,172.232.128.18,172.232.128.21,172.232.128.27", + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes + Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", + "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "172.232.128.24,172.232.128.26,172.232.128.20,172.232.128.22,172.232.128.25,172.232.128.19,172.232.128.23,172.232.128.18,172.232.128.21,172.232.128.27", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "es-mad", "label": "Madrid, ES", "country": "es", "capabilities": ["Linodes", "Block Storage - Encryption", "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", - "Object Storage", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", - "VPCs", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", - "StackScripts", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases"], - "metrics": ["Managed Databases"]}, "status": "ok", "resolvers": {"ipv4": "172.233.111.6,172.233.111.17,172.233.111.21,172.233.111.25,172.233.111.19,172.233.111.12,172.233.111.26,172.233.111.16,172.233.111.18,172.233.111.9", + Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes + Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", + "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "172.233.111.6,172.233.111.17,172.233.111.21,172.233.111.25,172.233.111.19,172.233.111.12,172.233.111.26,172.233.111.16,172.233.111.18,172.233.111.9", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "in-maa", "label": "Chennai, IN", "country": "in", "capabilities": ["Linodes", "Block - Storage Encryption", "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", - "Object Storage", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", - "VPCs", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", - "StackScripts", "NETINT Quadra T1U", "Linode Interfaces"], "monitors": {"alerts": - ["Managed Databases"], "metrics": ["Managed Databases"]}, "status": "ok", "resolvers": - {"ipv4": "172.232.96.17,172.232.96.26,172.232.96.19,172.232.96.20,172.232.96.25,172.232.96.21,172.232.96.18,172.232.96.22,172.232.96.23,172.232.96.24", + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes + Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", + "Metadata", "Premium Plans", "Placement Group", "StackScripts", "NETINT Quadra + T1U", "Maintenance Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed + Databases", "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "172.232.96.17,172.232.96.26,172.232.96.19,172.232.96.20,172.232.96.25,172.232.96.21,172.232.96.18,172.232.96.22,172.232.96.23,172.232.96.24", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "jp-osa", "label": "Osaka, JP", "country": "jp", "capabilities": ["Linodes", "Block Storage - Encryption", "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", - "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes Enterprise", "Cloud - Firewall", "Vlans", "VPCs", "Managed Databases", "Metadata", "Premium Plans", - "Placement Group", "StackScripts", "Linode Interfaces"], "monitors": {"alerts": - ["Managed Databases"], "metrics": ["Managed Databases"]}, "status": "ok", "resolvers": - {"ipv4": "172.233.64.44,172.233.64.43,172.233.64.37,172.233.64.40,172.233.64.46,172.233.64.41,172.233.64.39,172.233.64.42,172.233.64.45,172.233.64.38", + Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes + Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", + "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "172.233.64.44,172.233.64.43,172.233.64.37,172.233.64.40,172.233.64.46,172.233.64.41,172.233.64.39,172.233.64.42,172.233.64.45,172.233.64.38", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "it-mil", "label": "Milan, IT", "country": "it", "capabilities": ["Linodes", "Block Storage - Encryption", "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", - "Object Storage", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", - "VPCs", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", - "StackScripts", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases"], - "metrics": ["Managed Databases"]}, "status": "ok", "resolvers": {"ipv4": "172.232.192.19,172.232.192.18,172.232.192.16,172.232.192.20,172.232.192.24,172.232.192.21,172.232.192.22,172.232.192.17,172.232.192.15,172.232.192.23", - "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "us-mia", - "label": "Miami, FL", "country": "us", "capabilities": ["Linodes", "Block Storage - Encryption", "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", - "Object Storage", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", - "VPCs", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", - "StackScripts", "NETINT Quadra T1U", "Linode Interfaces"], "monitors": {"alerts": - ["Managed Databases"], "metrics": ["Managed Databases"]}, "status": "ok", "resolvers": - {"ipv4": "172.233.160.34,172.233.160.27,172.233.160.30,172.233.160.29,172.233.160.32,172.233.160.28,172.233.160.33,172.233.160.26,172.233.160.25,172.233.160.31", - "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "id-cgk", - "label": "Jakarta, ID", "country": "id", "capabilities": ["Linodes", "Block - Storage Encryption", "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", - "Object Storage", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", - "VPCs", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", - "StackScripts", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases"], - "metrics": ["Managed Databases"]}, "status": "ok", "resolvers": {"ipv4": "172.232.224.23,172.232.224.32,172.232.224.26,172.232.224.27,172.232.224.21,172.232.224.24,172.232.224.22,172.232.224.20,172.232.224.31,172.232.224.28", - "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "us-lax", - "label": "Los Angeles, CA", "country": "us", "capabilities": ["Linodes", "Block - Storage Encryption", "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", - "Object Storage", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", - "VPCs", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", - "StackScripts", "NETINT Quadra T1U", "Maintenance Policy", "Linode Interfaces"], - "monitors": {"alerts": ["Managed Databases"], "metrics": ["Managed Databases"]}, - "status": "ok", "resolvers": {"ipv4": "172.233.128.45,172.233.128.38,172.233.128.53,172.233.128.37,172.233.128.34,172.233.128.36,172.233.128.33,172.233.128.39,172.233.128.43,172.233.128.44", + Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes + Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", + "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "172.232.192.19,172.232.192.18,172.232.192.16,172.232.192.20,172.232.192.24,172.232.192.21,172.232.192.22,172.232.192.17,172.232.192.15,172.232.192.23", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "gb-lon", - "label": "London 2, UK", "country": "gb", "capabilities": ["Linodes", "Block - Storage Encryption", "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", - "Object Storage", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", - "VPCs", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", - "StackScripts", "Maintenance Policy", "Linode Interfaces"], "monitors": {"alerts": - ["Managed Databases"], "metrics": ["Managed Databases"]}, "status": "ok", "resolvers": - {"ipv4": "172.236.0.46,172.236.0.50,172.236.0.47,172.236.0.53,172.236.0.52,172.236.0.45,172.236.0.49,172.236.0.51,172.236.0.54,172.236.0.48", - "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "au-mel", - "label": "Melbourne, AU", "country": "au", "capabilities": ["Linodes", "Block - Storage Encryption", "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", - "Object Storage", "Kubernetes", "Cloud Firewall", "Vlans", "VPCs", "Managed - Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", - "NETINT Quadra T1U", "Linode Interfaces"], "monitors": {"alerts": ["Managed - Databases"], "metrics": ["Managed Databases"]}, "status": "ok", "resolvers": - {"ipv4": "172.236.32.23,172.236.32.35,172.236.32.30,172.236.32.28,172.236.32.32,172.236.32.33,172.236.32.27,172.236.32.37,172.236.32.29,172.236.32.34", + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "us-central", + "label": "Dallas, TX", "country": "us", "capabilities": ["Linodes", "Block Storage + Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", + "Managed Databases", "Metadata", "Placement Group", "StackScripts", "Maintenance + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "72.14.179.5,72.14.188.5,173.255.199.5,66.228.53.5,96.126.122.5,96.126.124.5,96.126.127.5,198.58.107.5,198.58.111.5,23.239.24.5", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "in-bom-2", - "label": "Mumbai 2, IN", "country": "in", "capabilities": ["Linodes", "Block - Storage Encryption", "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", - "GPU Linodes", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", - "VPCs", "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Linode - Interfaces"], "monitors": {"alerts": [], "metrics": []}, "status": "ok", "resolvers": - {"ipv4": "172.236.171.41,172.236.171.42,172.236.171.25,172.236.171.44,172.236.171.26,172.236.171.45,172.236.171.24,172.236.171.43,172.236.171.27,172.236.171.28", + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "ap-northeast", + "label": "Tokyo 2, JP", "country": "jp", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", + "Managed Databases", "Metadata", "Placement Group", "StackScripts", "Maintenance + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "139.162.66.5,139.162.67.5,139.162.68.5,139.162.69.5,139.162.70.5,139.162.71.5,139.162.72.5,139.162.73.5,139.162.74.5,139.162.75.5", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "de-fra-2", - "label": "Frankfurt 2, DE", "country": "de", "capabilities": ["Linodes", "Block - Storage Encryption", "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", - "GPU Linodes", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", - "VPCs", "Metadata", "Premium Plans", "Placement Group", "StackScripts", "NETINT - Quadra T1U", "Linode Interfaces"], "monitors": {"alerts": [], "metrics": []}, - "status": "ok", "resolvers": {"ipv4": "172.236.203.9,172.236.203.16,172.236.203.19,172.236.203.15,172.236.203.17,172.236.203.11,172.236.203.18,172.236.203.14,172.236.203.13,172.236.203.12", + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "eu-central", + "label": "Frankfurt, DE", "country": "de", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Cloud Firewall", + "Vlans", "Block Storage Migrations", "Managed Databases", "Metadata", "Placement + Group", "StackScripts", "Maintenance Policy", "Linode Interfaces"], "monitors": + {"alerts": ["Managed Databases", "NodeBalancers"], "metrics": ["Managed Databases", + "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "139.162.130.5,139.162.131.5,139.162.132.5,139.162.133.5,139.162.134.5,139.162.135.5,139.162.136.5,139.162.137.5,139.162.138.5,139.162.139.5", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "sg-sin-2", - "label": "Singapore 2, SG", "country": "sg", "capabilities": ["Linodes", "Block - Storage Encryption", "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", - "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes Enterprise", "Cloud - Firewall", "Vlans", "VPCs", "Managed Databases", "Metadata", "Premium Plans", - "Placement Group", "StackScripts", "Linode Interfaces"], "monitors": {"alerts": - ["Managed Databases"], "metrics": ["Managed Databases"]}, "status": "ok", "resolvers": - {"ipv4": "172.236.129.8,172.236.129.42,172.236.129.41,172.236.129.19,172.236.129.46,172.236.129.23,172.236.129.48,172.236.129.20,172.236.129.21,172.236.129.47", + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "ap-south", + "label": "Singapore, SG", "country": "sg", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Cloud Firewall", + "Vlans", "Block Storage Migrations", "Metadata", "Placement Group", "StackScripts", + "Maintenance Policy", "Linode Interfaces"], "monitors": {"alerts": ["NodeBalancers"], + "metrics": ["NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "139.162.11.5,139.162.13.5,139.162.14.5,139.162.15.5,139.162.16.5,139.162.21.5,139.162.27.5,103.3.60.18,103.3.60.19,103.3.60.20", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "jp-tyo-3", - "label": "Tokyo 3, JP", "country": "jp", "capabilities": ["Linodes", "Block - Storage Encryption", "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", - "Object Storage", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", - "VPCs", "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Linode - Interfaces"], "monitors": {"alerts": [], "metrics": []}, "status": "ok", "resolvers": - {"ipv4": "172.237.4.15,172.237.4.19,172.237.4.17,172.237.4.21,172.237.4.16,172.237.4.18,172.237.4.23,172.237.4.24,172.237.4.20,172.237.4.14", - "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "eu-west", + "label": "London, UK", "country": "gb", "capabilities": ["Linodes", "Block Storage + Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", + "Metadata", "Placement Group", "StackScripts", "Maintenance Policy", "Linode + Interfaces"], "monitors": {"alerts": ["NodeBalancers"], "metrics": ["NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "178.79.182.5, 176.58.107.5, 176.58.116.5, + 176.58.121.5, 151.236.220.5, 212.71.252.5, 212.71.253.5, 109.74.192.20, 109.74.193.20, + 109.74.194.20", "ipv6": "1234::5678, 1234::5678, 1234::5678, 1234::5678, + 1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "no-osl-1", - "label": "Oslo, NO", "country": "no", "capabilities": ["Linodes", "Block Storage - Encryption", "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", - "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "Managed - Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", - "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases"], "metrics": - ["Managed Databases"]}, "status": "ok", "resolvers": {"ipv4": "172.238.140.33,172.238.140.25,172.238.140.30,172.238.140.31,172.238.140.26,172.238.140.28,172.238.140.34,172.238.140.32,172.238.140.27,172.238.140.29", + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "us-east", + "label": "Newark, NJ", "country": "us", "capabilities": ["Linodes", "Block Storage + Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Cloud Firewall", + "Vlans", "Block Storage Migrations", "Managed Databases", "Metadata", "Placement + Group", "StackScripts", "Maintenance Policy", "Linode Interfaces"], "monitors": + {"alerts": ["Managed Databases", "NodeBalancers"], "metrics": ["Managed Databases", + "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "66.228.42.5,96.126.106.5,50.116.53.5,50.116.58.5,50.116.61.5,50.116.62.5,66.175.211.5,97.107.133.4,173.255.225.5,66.228.35.5", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "us-central", - "label": "Dallas, TX", "country": "us", "capabilities": ["Linodes", "Disk Encryption", - "Backups", "NodeBalancers", "Block Storage", "Kubernetes", "Cloud Firewall", + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "us-southeast", + "label": "Atlanta, GA", "country": "us", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", "Managed Databases", "Metadata", "Placement Group", "StackScripts", "Maintenance Policy", "Linode Interfaces"], "monitors": - {"alerts": ["Managed Databases"], "metrics": ["Managed Databases"]}, "status": - "ok", "resolvers": {"ipv4": "72.14.179.5,72.14.188.5,173.255.199.5,66.228.53.5,96.126.122.5,96.126.124.5,96.126.127.5,198.58.107.5,198.58.111.5,23.239.24.5", + {"alerts": ["Managed Databases", "NodeBalancers"], "metrics": ["Managed Databases", + "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "74.207.231.5,173.230.128.5,173.230.129.5,173.230.136.5,173.230.140.5,66.228.59.5,66.228.62.5,50.116.35.5,50.116.41.5,23.239.18.5", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "us-west", "label": "Fremont, CA", "country": "us", "capabilities": ["Linodes", "Block - Storage Encryption", "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", - "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", "Managed - Databases", "Metadata", "Placement Group", "StackScripts", "Maintenance Policy", - "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases"], "metrics": - ["Managed Databases"]}, "status": "ok", "resolvers": {"ipv4": "173.230.145.5, - 173.230.147.5, 173.230.155.5, 173.255.212.5, 173.255.219.5, 173.255.241.5, 173.255.243.5, - 173.255.244.5, 74.207.241.5, 74.207.242.5", "ipv6": "1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": - null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": - "core"}, {"id": "us-southeast", "label": "Atlanta, GA", "country": "us", "capabilities": - ["Linodes", "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", - "Object Storage", "GPU Linodes", "Kubernetes", "Cloud Firewall", "Vlans", "Block - Storage Migrations", "Managed Databases", "Metadata", "Placement Group", "StackScripts", - "Maintenance Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed - Databases"], "metrics": ["Managed Databases"]}, "status": "ok", "resolvers": - {"ipv4": "74.207.231.5,173.230.128.5,173.230.129.5,173.230.136.5,173.230.140.5,66.228.59.5,66.228.62.5,50.116.35.5,50.116.41.5,23.239.18.5", - "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "us-east", - "label": "Newark, NJ", "country": "us", "capabilities": ["Linodes", "Disk Encryption", - "Backups", "NodeBalancers", "Block Storage", "Object Storage", "GPU Linodes", - "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", "Managed - Databases", "Metadata", "Placement Group", "StackScripts", "Linode Interfaces"], - "monitors": {"alerts": ["Managed Databases"], "metrics": ["Managed Databases"]}, - "status": "ok", "resolvers": {"ipv4": "66.228.42.5,96.126.106.5,50.116.53.5,50.116.58.5,50.116.61.5,50.116.62.5,66.175.211.5,97.107.133.4,173.255.225.5,66.228.35.5", - "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "eu-west", - "label": "London, UK", "country": "gb", "capabilities": ["Linodes", "Disk Encryption", - "Backups", "NodeBalancers", "Block Storage", "Kubernetes", "Cloud Firewall", - "Vlans", "Block Storage Migrations", "Metadata", "Placement Group", "StackScripts", - "Linode Interfaces"], "monitors": {"alerts": [], "metrics": []}, "status": "ok", - "resolvers": {"ipv4": "178.79.182.5, 176.58.107.5, 176.58.116.5, 176.58.121.5, - 151.236.220.5, 212.71.252.5, 212.71.253.5, 109.74.192.20, 109.74.193.20, 109.74.194.20", + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", + "Managed Databases", "Metadata", "Placement Group", "StackScripts", "Maintenance + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "173.230.145.5, 173.230.147.5, 173.230.155.5, 173.255.212.5, + 173.255.219.5, 173.255.241.5, 173.255.243.5, 173.255.244.5, 74.207.241.5, 74.207.242.5", "ipv6": "1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": - 5}, "site_type": "core"}, {"id": "ap-south", "label": "Singapore, SG", "country": - "sg", "capabilities": ["Linodes", "Disk Encryption", "Backups", "NodeBalancers", - "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Cloud Firewall", - "Vlans", "Block Storage Migrations", "Metadata", "Placement Group", "StackScripts", - "Maintenance Policy", "Linode Interfaces"], "monitors": {"alerts": [], "metrics": - []}, "status": "ok", "resolvers": {"ipv4": "139.162.11.5,139.162.13.5,139.162.14.5,139.162.15.5,139.162.16.5,139.162.21.5,139.162.27.5,103.3.60.18,103.3.60.19,103.3.60.20", - "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "eu-central", - "label": "Frankfurt, DE", "country": "de", "capabilities": ["Linodes", "Disk - Encryption", "Backups", "NodeBalancers", "Block Storage", "Object Storage", - "GPU Linodes", "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", - "Managed Databases", "Metadata", "Placement Group", "StackScripts", "Maintenance - Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases"], - "metrics": ["Managed Databases"]}, "status": "ok", "resolvers": {"ipv4": "139.162.130.5,139.162.131.5,139.162.132.5,139.162.133.5,139.162.134.5,139.162.135.5,139.162.136.5,139.162.137.5,139.162.138.5,139.162.139.5", - "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "ap-northeast", - "label": "Tokyo 2, JP", "country": "jp", "capabilities": ["Linodes", "Disk Encryption", - "Backups", "NodeBalancers", "Block Storage", "Kubernetes", "Cloud Firewall", - "Vlans", "Block Storage Migrations", "Managed Databases", "Metadata", "Placement - Group", "StackScripts", "Maintenance Policy", "Linode Interfaces"], "monitors": - {"alerts": ["Managed Databases"], "metrics": ["Managed Databases"]}, "status": - "ok", "resolvers": {"ipv4": "139.162.66.5,139.162.67.5,139.162.68.5,139.162.69.5,139.162.70.5,139.162.71.5,139.162.72.5,139.162.73.5,139.162.74.5,139.162.75.5", - "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}], "page": 1, - "pages": 1, "results": 32}' + 5}, "site_type": "core"}], "page": 1, "pages": 1, "results": 47}' headers: Access-Control-Allow-Credentials: - "true" @@ -338,7 +479,7 @@ interactions: Content-Type: - application/json Expires: - - Fri, 22 Aug 2025 20:58:17 GMT + - Wed, 06 May 2026 01:42:16 GMT Pragma: - no-cache Strict-Transport-Security: @@ -364,7 +505,7 @@ interactions: code: 200 duration: "" - request: - body: '{"region":"us-iad","type":"g6-nanode-1","label":"go-test-ins-wo-disk-5w5bd648nt6s","firewall_id":3118155,"booted":false}' + body: '{"region":"au-mel","type":"g6-nanode-1","label":"go-test-ins-wo-disk-frs3e56081kn","firewall_id":9690256,"booted":false}' form: {} headers: Accept: @@ -376,18 +517,19 @@ interactions: url: https://api.linode.com/v4beta/linode/instances method: POST response: - body: '{"id": 82372490, "label": "go-test-ins-wo-disk-5w5bd648nt6s", "group": + body: '{"id": 97189528, "label": "go-test-ins-wo-disk-frs3e56081kn", "group": "", "status": "provisioning", "created": "2018-01-02T03:04:05", "updated": "2018-01-02T03:04:05", - "type": "g6-nanode-1", "ipv4": ["172.234.34.68"], "ipv6": "1234::5678/128", - "image": null, "region": "us-iad", "site_type": "core", "specs": {"disk": 25600, + "type": "g6-nanode-1", "ipv4": ["172.236.53.76"], "ipv6": "1234::5678/128", + "image": null, "region": "au-mel", "site_type": "core", "specs": {"disk": 25600, "memory": 1024, "vcpus": 1, "gpus": 0, "transfer": 1000, "accelerated_devices": 0}, "alerts": {"cpu": 90, "network_in": 10, "network_out": 10, "transfer_quota": - 80, "io": 10000}, "backups": {"enabled": false, "available": false, "schedule": - {"day": null, "window": null}, "last_successful": null}, "hypervisor": "kvm", - "watchdog_enabled": true, "tags": [], "host_uuid": "a43b13eb39143250ac287a23d5f4b7a6b9cbdcb8", - "has_user_data": false, "placement_group": null, "disk_encryption": "enabled", - "lke_cluster_id": null, "capabilities": ["Block Storage Encryption"], "interface_generation": - "legacy_config"}' + 80, "io": 10000, "system_alerts": [], "user_alerts": []}, "backups": {"enabled": + false, "available": false, "schedule": {"day": null, "window": null}, "last_successful": + null}, "hypervisor": "kvm", "watchdog_enabled": true, "tags": [], "host_uuid": + "6c9b57be39471d7888b736f623fe5527fd93c553", "has_user_data": false, "placement_group": + null, "disk_encryption": "enabled", "lke_cluster_id": null, "capabilities": + ["Block Storage Encryption", "SMTP Enabled", "Maintenance Policy"], "interface_generation": + "legacy_config", "maintenance_policy": "linode/migrate", "locks": []}' headers: Access-Control-Allow-Credentials: - "true" @@ -410,7 +552,7 @@ interactions: Content-Type: - application/json Expires: - - Fri, 22 Aug 2025 20:58:18 GMT + - Wed, 06 May 2026 01:42:17 GMT Pragma: - no-cache Strict-Transport-Security: @@ -435,7 +577,7 @@ interactions: code: 200 duration: "" - request: - body: '{"label":"go-test-conf-2w36vde54y4t","devices":{},"interfaces":null}' + body: '{"label":"go-test-conf-yj19236bv7xh","devices":{},"interfaces":null}' form: {} headers: Accept: @@ -444,10 +586,10 @@ interactions: - application/json User-Agent: - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/linode/instances/82372490/configs + url: https://api.linode.com/v4beta/linode/instances/97189528/configs method: POST response: - body: '{"id": 85836401, "label": "go-test-conf-2w36vde54y4t", "helpers": {"updatedb_disabled": + body: '{"id": 100667257, "label": "go-test-conf-yj19236bv7xh", "helpers": {"updatedb_disabled": true, "distro": true, "modules_dep": true, "network": false, "devtmpfs_automount": true}, "kernel": "linode/latest-64bit", "comments": "", "memory_limit": 0, "created": "2018-01-02T03:04:05", "updated": "2018-01-02T03:04:05", "root_device": "/dev/sda", @@ -472,13 +614,13 @@ interactions: Connection: - keep-alive Content-Length: - - "540" + - "541" Content-Security-Policy: - default-src 'none' Content-Type: - application/json Expires: - - Fri, 22 Aug 2025 20:58:18 GMT + - Wed, 06 May 2026 01:42:17 GMT Pragma: - no-cache Strict-Transport-Security: @@ -502,7 +644,7 @@ interactions: code: 200 duration: "" - request: - body: '{"label":"go-test-vpc-1755896298637431000","region":"us-iad","subnets":[{"label":"linodego-vpc-test-1755896298637567000","ipv4":"192.168.0.0/25"}]}' + body: '{"label":"go-test-vpc-1778031737830980000","region":"au-mel","subnets":[{"label":"linodego-vpc-test-1778031737831097000","ipv4":"192.168.0.0/25"}]}' form: {} headers: Accept: @@ -514,11 +656,13 @@ interactions: url: https://api.linode.com/v4beta/vpcs method: POST response: - body: '{"id": 234045, "label": "go-test-vpc-1755896298637431000", "description": - "", "region": "us-iad", "ipv6": null, "subnets": [{"id": 241126, "label": "linodego-vpc-test-1755896298637567000", - "ipv4": "192.168.0.0/25", "ipv6": null, "linodes": [], "databases": [], "nodebalancers": - [], "created": "2018-01-02T03:04:05", "updated": "2018-01-02T03:04:05"}], "created": - "2018-01-02T03:04:05", "updated": "2018-01-02T03:04:05"}' + body: '{"id": 471961, "label": "go-test-vpc-1778031737830980000", "description": + "", "region": "au-mel", "ipv4": [{"range": "10.0.0.0/8"}, {"range": "172.16.0.0/12"}, + {"range": "192.168.0.0/16"}], "ipv6": null, "subnets": [{"id": 629500, "label": + "linodego-vpc-test-1778031737831097000", "ipv4": "192.168.0.0/25", "ipv6": null, + "linodes": [], "databases": [], "nodebalancers": [], "created": "2018-01-02T03:04:05", + "updated": "2018-01-02T03:04:05"}], "created": "2018-01-02T03:04:05", "updated": + "2018-01-02T03:04:05"}' headers: Access-Control-Allow-Credentials: - "true" @@ -537,13 +681,13 @@ interactions: Connection: - keep-alive Content-Length: - - "419" + - "511" Content-Security-Policy: - default-src 'none' Content-Type: - application/json Expires: - - Fri, 22 Aug 2025 20:58:19 GMT + - Wed, 06 May 2026 01:42:18 GMT Pragma: - no-cache Strict-Transport-Security: @@ -567,7 +711,7 @@ interactions: code: 200 duration: "" - request: - body: '{"purpose":"vpc","subnet_id":241126,"ip_ranges":["192.168.0.5/32"]}' + body: '{"purpose":"vpc","subnet_id":629500,"ip_ranges":["192.168.0.5/32"]}' form: {} headers: Accept: @@ -576,11 +720,11 @@ interactions: - application/json User-Agent: - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/linode/instances/82372490/configs/85836401/interfaces + url: https://api.linode.com/v4beta/linode/instances/97189528/configs/100667257/interfaces method: POST response: - body: '{"id": 6763962, "purpose": "vpc", "primary": false, "active": false, "ipam_address": - null, "label": null, "vpc_id": 234045, "subnet_id": 241126, "ipv4": {"vpc": + body: '{"id": 12282598, "purpose": "vpc", "primary": false, "active": false, "ipam_address": + null, "label": null, "vpc_id": 471961, "subnet_id": 629500, "ipv4": {"vpc": "192.168.0.2", "nat_1_1": null}, "ip_ranges": ["192.168.0.5/32"], "ipv6": null}' headers: Access-Control-Allow-Credentials: @@ -600,13 +744,13 @@ interactions: Connection: - keep-alive Content-Length: - - "240" + - "241" Content-Security-Policy: - default-src 'none' Content-Type: - application/json Expires: - - Fri, 22 Aug 2025 20:58:19 GMT + - Wed, 06 May 2026 01:42:18 GMT Pragma: - no-cache Strict-Transport-Security: @@ -639,11 +783,11 @@ interactions: - application/json User-Agent: - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/linode/instances/82372490/configs/85836401/interfaces/6763962 + url: https://api.linode.com/v4beta/linode/instances/97189528/configs/100667257/interfaces/12282598 method: PUT response: - body: '{"id": 6763962, "purpose": "vpc", "primary": true, "active": false, "ipam_address": - null, "label": null, "vpc_id": 234045, "subnet_id": 241126, "ipv4": {"vpc": + body: '{"id": 12282598, "purpose": "vpc", "primary": true, "active": false, "ipam_address": + null, "label": null, "vpc_id": 471961, "subnet_id": 629500, "ipv4": {"vpc": "192.168.0.2", "nat_1_1": null}, "ip_ranges": ["192.168.0.5/32"], "ipv6": null}' headers: Access-Control-Allow-Credentials: @@ -663,13 +807,13 @@ interactions: Connection: - keep-alive Content-Length: - - "239" + - "240" Content-Security-Policy: - default-src 'none' Content-Type: - application/json Expires: - - Fri, 22 Aug 2025 20:58:19 GMT + - Wed, 06 May 2026 01:42:18 GMT Pragma: - no-cache Strict-Transport-Security: @@ -702,12 +846,12 @@ interactions: - application/json User-Agent: - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/linode/instances/82372490/configs/85836401/interfaces/6763962 + url: https://api.linode.com/v4beta/linode/instances/97189528/configs/100667257/interfaces/12282598 method: PUT response: - body: '{"id": 6763962, "purpose": "vpc", "primary": true, "active": false, "ipam_address": - null, "label": null, "vpc_id": 234045, "subnet_id": 241126, "ipv4": {"vpc": - "192.168.0.10", "nat_1_1": "172.234.34.68"}, "ip_ranges": [], "ipv6": null}' + body: '{"id": 12282598, "purpose": "vpc", "primary": true, "active": false, "ipam_address": + null, "label": null, "vpc_id": 471961, "subnet_id": 629500, "ipv4": {"vpc": + "192.168.0.10", "nat_1_1": "172.236.53.76"}, "ip_ranges": [], "ipv6": null}' headers: Access-Control-Allow-Credentials: - "true" @@ -726,13 +870,13 @@ interactions: Connection: - keep-alive Content-Length: - - "235" + - "236" Content-Security-Policy: - default-src 'none' Content-Type: - application/json Expires: - - Fri, 22 Aug 2025 20:58:19 GMT + - Wed, 06 May 2026 01:42:19 GMT Pragma: - no-cache Strict-Transport-Security: @@ -765,7 +909,7 @@ interactions: - application/json User-Agent: - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/linode/instances/82372490 + url: https://api.linode.com/v4beta/linode/instances/97189528 method: DELETE response: body: '{}' @@ -793,7 +937,7 @@ interactions: Content-Type: - application/json Expires: - - Fri, 22 Aug 2025 20:58:21 GMT + - Wed, 06 May 2026 01:42:19 GMT Pragma: - no-cache Strict-Transport-Security: @@ -826,7 +970,7 @@ interactions: - application/json User-Agent: - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/vpcs/234045 + url: https://api.linode.com/v4beta/vpcs/471961 method: DELETE response: body: '{}' @@ -854,7 +998,7 @@ interactions: Content-Type: - application/json Expires: - - Fri, 22 Aug 2025 20:58:22 GMT + - Wed, 06 May 2026 01:42:20 GMT Pragma: - no-cache Strict-Transport-Security: diff --git a/test/integration/fixtures/TestInstance_CreateWithLinodeInterfaces.yaml b/test/integration/fixtures/TestInstance_CreateWithLinodeInterfaces.yaml index c9f189648..5efcc3b0d 100644 --- a/test/integration/fixtures/TestInstance_CreateWithLinodeInterfaces.yaml +++ b/test/integration/fixtures/TestInstance_CreateWithLinodeInterfaces.yaml @@ -31,74 +31,74 @@ interactions: Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", "NETINT Quadra T1U", "Maintenance Policy", "Linode Interfaces", "ACLP Logs Datacenter LKE-E"], - "monitors": {"alerts": ["Managed Databases"], "metrics": ["Managed Databases", - "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "172.233.128.45,172.233.128.38,172.233.128.53,172.233.128.37,172.233.128.34,172.233.128.36,172.233.128.33,172.233.128.39,172.233.128.43,172.233.128.44", + "monitors": {"alerts": ["Managed Databases", "NodeBalancers"], "metrics": ["Managed + Databases", "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "172.233.128.45,172.233.128.38,172.233.128.53,172.233.128.37,172.233.128.34,172.233.128.36,172.233.128.33,172.233.128.39,172.233.128.43,172.233.128.44", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "nz-akl-1", "label": "Auckland, NZ", "country": "nz", "capabilities": ["Linodes", "Disk - Encryption", "Cloud Firewall", "Vlans", "VPCs", "Metadata", "Distributed Plans", - "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": - "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", "Maintenance + Policy"], "monitors": {"alerts": [], "metrics": []}, "status": "ok", "resolvers": + {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": "us-den-1", "label": "Denver, CO", "country": "us", "capabilities": ["Linodes", - "Disk Encryption", "Cloud Firewall", "Vlans", "VPCs", "Metadata", "Distributed - Plans", "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": + "Disk Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", + "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": "de-ham-1", "label": "Hamburg, DE", "country": "de", "capabilities": ["Linodes", - "Disk Encryption", "Cloud Firewall", "Vlans", "VPCs", "Metadata", "Distributed - Plans", "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": + "Disk Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", + "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": "za-jnb-1", "label": "Johannesburg, ZA", "country": "za", "capabilities": ["Linodes", - "Disk Encryption", "Cloud Firewall", "Vlans", "VPCs", "Metadata", "Distributed - Plans", "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": + "Disk Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", + "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": "my-kul-1", "label": "Kuala Lumpur, MY", "country": "my", "capabilities": ["Linodes", - "Disk Encryption", "Cloud Firewall", "Vlans", "VPCs", "Metadata", "Distributed - Plans", "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": + "Disk Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", + "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": "co-bog-1", "label": "Bogot\u00e1, CO", "country": "co", "capabilities": ["Linodes", - "Disk Encryption", "Cloud Firewall", "Vlans", "VPCs", "Metadata", "Distributed - Plans", "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": + "Disk Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", + "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": "mx-qro-1", "label": "Quer\u00e9taro, MX", "country": "mx", "capabilities": - ["Linodes", "Disk Encryption", "Cloud Firewall", "Vlans", "VPCs", "Metadata", - "Distributed Plans", "Maintenance Policy"], "monitors": {"alerts": [], "metrics": - []}, "status": "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", - "ipv6": "1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": - 0, "maximum_linodes_per_pg": 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": - "distributed"}, {"id": "us-hou-1", "label": "Houston, TX", "country": "us", - "capabilities": ["Linodes", "Disk Encryption", "Cloud Firewall", "Vlans", "VPCs", - "Metadata", "Distributed Plans", "Maintenance Policy"], "monitors": {"alerts": - [], "metrics": []}, "status": "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", - "ipv6": "1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": - 0, "maximum_linodes_per_pg": 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": - "distributed"}, {"id": "cl-scl-1", "label": "Santiago, CL", "country": "cl", - "capabilities": ["Linodes", "Disk Encryption", "Cloud Firewall", "Vlans", "VPCs", - "Metadata", "Distributed Plans", "Maintenance Policy"], "monitors": {"alerts": - [], "metrics": []}, "status": "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", - "ipv6": "1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": - 0, "maximum_linodes_per_pg": 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": - "distributed"}, {"id": "gb-lon", "label": "London 2, UK", "country": "gb", "capabilities": - ["Linodes", "Block Storage Encryption", "LA Disk Encryption", "Disk Encryption", - "Backups", "NodeBalancers", "Block Storage", "Object Storage", "GPU Linodes", - "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC - Dual Stack", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", - "StackScripts", "NETINT Quadra T1U", "Maintenance Policy", "Linode Interfaces", - "ACLP Logs Datacenter LKE-E"], "monitors": {"alerts": ["Managed Databases"], - "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": - {"ipv4": "172.236.0.46,172.236.0.50,172.236.0.47,172.236.0.53,172.236.0.52,172.236.0.45,172.236.0.49,172.236.0.51,172.236.0.54,172.236.0.48", + ["Linodes", "Disk Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed + Plans", "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": + "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": + 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": + "us-hou-1", "label": "Houston, TX", "country": "us", "capabilities": ["Linodes", + "Disk Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", + "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": + "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": + 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": + "cl-scl-1", "label": "Santiago, CL", "country": "cl", "capabilities": ["Linodes", + "Disk Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", + "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": + "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": + 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": + "gb-lon", "label": "London 2, UK", "country": "gb", "capabilities": ["Linodes", + "Block Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", + "NodeBalancers", "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", + "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", + "Managed Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", + "NETINT Quadra T1U", "Maintenance Policy", "Linode Interfaces", "ACLP Logs Datacenter + LKE-E"], "monitors": {"alerts": ["Managed Databases", "NodeBalancers"], "metrics": + ["Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": + "172.236.0.46,172.236.0.50,172.236.0.47,172.236.0.53,172.236.0.52,172.236.0.45,172.236.0.49,172.236.0.51,172.236.0.54,172.236.0.48", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "id-cgk", @@ -107,20 +107,20 @@ interactions: "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance - Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases"], - "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": - {"ipv4": "172.232.224.23,172.232.224.32,172.232.224.26,172.232.224.27,172.232.224.21,172.232.224.24,172.232.224.22,172.232.224.20,172.232.224.31,172.232.224.28", + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "172.232.224.23,172.232.224.32,172.232.224.26,172.232.224.27,172.232.224.21,172.232.224.24,172.232.224.22,172.232.224.20,172.232.224.31,172.232.224.28", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "in-bom-2", "label": "Mumbai 2, IN", "country": "in", "capabilities": ["Linodes", "Block Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", - "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes - Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", - "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance - Policy", "Linode Interfaces", "ACLP Logs Datacenter LKE-E"], "monitors": {"alerts": - ["Managed Databases"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": - "ok", "resolvers": {"ipv4": "172.236.171.41,172.236.171.42,172.236.171.25,172.236.171.44,172.236.171.26,172.236.171.45,172.236.171.24,172.236.171.43,172.236.171.27,172.236.171.28", + "Block Storage", "GPU Linodes", "Kubernetes", "Kubernetes Enterprise", "Cloud + Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", + "Premium Plans", "Placement Group", "StackScripts", "Maintenance Policy", "Linode + Interfaces", "ACLP Logs Datacenter LKE-E"], "monitors": {"alerts": ["Managed + Databases", "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "172.236.171.41,172.236.171.42,172.236.171.25,172.236.171.44,172.236.171.26,172.236.171.45,172.236.171.24,172.236.171.43,172.236.171.27,172.236.171.28", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "de-fra-2", @@ -130,8 +130,8 @@ interactions: Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", "NETINT Quadra T1U", "Maintenance Policy", "Linode Interfaces", "ACLP Logs Datacenter LKE-E"], - "monitors": {"alerts": ["Managed Databases"], "metrics": ["Managed Databases", - "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "172.236.203.9,172.236.203.16,172.236.203.19,172.236.203.15,172.236.203.17,172.236.203.11,172.236.203.18,172.236.203.14,172.236.203.13,172.236.203.12", + "monitors": {"alerts": ["Managed Databases", "NodeBalancers"], "metrics": ["Managed + Databases", "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "172.236.203.9,172.236.203.16,172.236.203.19,172.236.203.15,172.236.203.17,172.236.203.11,172.236.203.18,172.236.203.14,172.236.203.13,172.236.203.12", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "sg-sin-2", @@ -141,8 +141,8 @@ interactions: Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance Policy", "Linode Interfaces", "ACLP Logs Datacenter LKE-E"], "monitors": {"alerts": - ["Managed Databases"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": - "ok", "resolvers": {"ipv4": "172.236.129.8,172.236.129.42,172.236.129.41,172.236.129.19,172.236.129.46,172.236.129.23,172.236.129.48,172.236.129.20,172.236.129.21,172.236.129.47", + ["Managed Databases", "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "172.236.129.8,172.236.129.42,172.236.129.41,172.236.129.19,172.236.129.46,172.236.129.23,172.236.129.48,172.236.129.20,172.236.129.21,172.236.129.47", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "jp-tyo-3", @@ -152,15 +152,15 @@ interactions: Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance Policy", "Linode Interfaces", "ACLP Logs Datacenter LKE-E"], "monitors": {"alerts": - ["Managed Databases"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": - "ok", "resolvers": {"ipv4": "172.237.4.15,172.237.4.19,172.237.4.17,172.237.4.21,172.237.4.16,172.237.4.18,172.237.4.23,172.237.4.24,172.237.4.20,172.237.4.14", + ["Managed Databases", "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "172.237.4.15,172.237.4.19,172.237.4.17,172.237.4.21,172.237.4.16,172.237.4.18,172.237.4.23,172.237.4.24,172.237.4.20,172.237.4.14", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "de-ber-1", "label": "Berlin, DE", "country": "de", "capabilities": ["Linodes", "Disk Encryption", - "Cloud Firewall", "Vlans", "VPCs", "Metadata", "Distributed Plans", "Maintenance - Policy"], "monitors": {"alerts": [], "metrics": []}, "status": "ok", "resolvers": - {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", "Maintenance Policy"], + "monitors": {"alerts": [], "metrics": []}, "status": "ok", "resolvers": {"ipv4": + "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": "no-osl-1", "label": "Oslo, NO", "country": "no", "capabilities": ["Linodes", @@ -179,31 +179,37 @@ interactions: "Object Storage", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance Policy", "Linode Interfaces"], - "monitors": {"alerts": ["Managed Databases"], "metrics": ["Managed Databases", - "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "172.239.142.102,172.239.142.89,172.239.142.92,172.239.142.87,172.239.142.88,172.239.142.103,172.239.142.91,172.239.142.90,172.239.142.86,172.239.142.100", + "monitors": {"alerts": ["Managed Databases", "NodeBalancers"], "metrics": ["Managed + Databases", "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "172.239.142.102,172.239.142.89,172.239.142.92,172.239.142.87,172.239.142.88,172.239.142.103,172.239.142.91,172.239.142.90,172.239.142.86,172.239.142.100", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "fr-par-2", "label": "Paris 2, FR", "country": "fr", "capabilities": ["Linodes", "Block Storage Encryption", "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", - "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes Enterprise", "Cloud - Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", - "Premium Plans", "Placement Group", "StackScripts", "Maintenance Policy", "Linode - Interfaces", "ACLP Logs Datacenter LKE-E"], "monitors": {"alerts": ["Managed - Databases"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", - "resolvers": {"ipv4": "172.239.11.24,172.239.11.22,172.239.11.17,172.239.11.20,172.239.11.23,172.239.11.19,172.239.11.21,172.239.11.15,172.239.11.16,172.239.11.18", + "GPU Linodes", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", + "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", "Premium Plans", + "Placement Group", "StackScripts", "Maintenance Policy", "Linode Interfaces", + "ACLP Logs Datacenter LKE-E"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "172.239.11.24,172.239.11.22,172.239.11.17,172.239.11.20,172.239.11.23,172.239.11.19,172.239.11.21,172.239.11.15,172.239.11.16,172.239.11.18", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "us-rno-1", + "label": "Reno, NV", "country": "us", "capabilities": ["Linodes", "Disk Encryption", + "Backups", "NodeBalancers", "GPU Linodes", "Metadata", "Premium Plans", "Placement + Group", "StackScripts", "Maintenance Policy"], "monitors": {"alerts": ["NodeBalancers"], + "metrics": ["NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "", "ipv6": + ""}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "co-bog-2", "label": "Bogot\u00e1 2, CO", "country": "co", "capabilities": ["Linodes", "Disk - Encryption", "Cloud Firewall", "Vlans", "VPCs", "Metadata", "Distributed Plans", - "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": - "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", "Maintenance + Policy"], "monitors": {"alerts": [], "metrics": []}, "status": "ok", "resolvers": + {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": "fr-mrs-2", "label": "Marseille 2, FR", "country": "fr", "capabilities": ["Linodes", - "Disk Encryption", "Cloud Firewall", "Vlans", "VPCs", "Metadata", "Distributed - Plans", "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": + "Disk Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", + "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": @@ -213,8 +219,8 @@ interactions: "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", "NETINT Quadra T1U", "Maintenance Policy", "Linode Interfaces"], "monitors": - {"alerts": ["Managed Databases"], "metrics": ["Managed Databases", "NodeBalancers"]}, - "status": "ok", "resolvers": {"ipv4": "172.233.160.34,172.233.160.27,172.233.160.30,172.233.160.29,172.233.160.32,172.233.160.28,172.233.160.33,172.233.160.26,172.233.160.25,172.233.160.31", + {"alerts": ["Managed Databases", "NodeBalancers"], "metrics": ["Managed Databases", + "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "172.233.160.34,172.233.160.27,172.233.160.30,172.233.160.29,172.233.160.32,172.233.160.28,172.233.160.33,172.233.160.26,172.233.160.25,172.233.160.31", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "ap-west", @@ -223,8 +229,8 @@ interactions: "Block Storage", "GPU Linodes", "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", "Managed Databases", "Metadata", "Placement Group", "StackScripts", "Maintenance Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed - Databases"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", - "resolvers": {"ipv4": "172.105.34.5,172.105.35.5,172.105.36.5,172.105.37.5,172.105.38.5,172.105.39.5,172.105.40.5,172.105.41.5,172.105.42.5,172.105.43.5", + Databases", "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "172.105.34.5,172.105.35.5,172.105.36.5,172.105.37.5,172.105.38.5,172.105.39.5,172.105.40.5,172.105.41.5,172.105.42.5,172.105.43.5", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "ca-central", @@ -233,8 +239,8 @@ interactions: "Block Storage", "GPU Linodes", "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", "Managed Databases", "Metadata", "Placement Group", "StackScripts", "Maintenance Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed - Databases"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", - "resolvers": {"ipv4": "172.105.0.5,172.105.3.5,172.105.4.5,172.105.5.5,172.105.6.5,172.105.7.5,172.105.8.5,172.105.9.5,172.105.10.5,172.105.11.5", + Databases", "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "172.105.0.5,172.105.3.5,172.105.4.5,172.105.5.5,172.105.6.5,172.105.7.5,172.105.8.5,172.105.9.5,172.105.10.5,172.105.11.5", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "ap-southeast", @@ -265,8 +271,8 @@ interactions: Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance Policy", "Linode Interfaces", "ACLP Logs Datacenter LKE-E"], "monitors": {"alerts": - ["Managed Databases"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": - "ok", "resolvers": {"ipv4": "172.232.0.17,172.232.0.16,172.232.0.21,172.232.0.13,172.232.0.22,172.232.0.9,172.232.0.19,172.232.0.20,172.232.0.15,172.232.0.18", + ["Managed Databases", "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "172.232.0.17,172.232.0.16,172.232.0.21,172.232.0.13,172.232.0.22,172.232.0.9,172.232.0.19,172.232.0.20,172.232.0.15,172.232.0.18", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "fr-par", @@ -275,9 +281,9 @@ interactions: "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance - Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases"], - "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": - {"ipv4": "172.232.32.21,172.232.32.23,172.232.32.17,172.232.32.18,172.232.32.16,172.232.32.22,172.232.32.20,172.232.32.14,172.232.32.11,172.232.32.12", + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "172.232.32.21,172.232.32.23,172.232.32.17,172.232.32.18,172.232.32.16,172.232.32.22,172.232.32.20,172.232.32.14,172.232.32.11,172.232.32.12", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "us-sea", @@ -287,8 +293,8 @@ interactions: Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance Policy", "Linode Interfaces", "ACLP Logs Datacenter LKE-E"], "monitors": {"alerts": - ["Managed Databases"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": - "ok", "resolvers": {"ipv4": "172.232.160.19,172.232.160.21,172.232.160.17,172.232.160.15,172.232.160.18,172.232.160.8,172.232.160.12,172.232.160.11,172.232.160.14,172.232.160.16", + ["Managed Databases", "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "172.232.160.19,172.232.160.21,172.232.160.17,172.232.160.15,172.232.160.18,172.232.160.8,172.232.160.12,172.232.160.11,172.232.160.14,172.232.160.16", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "br-gru", @@ -297,8 +303,9 @@ interactions: "Block Storage", "Object Storage", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance Policy", "Linode - Interfaces"], "monitors": {"alerts": ["Managed Databases"], "metrics": ["Managed - Databases", "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "172.233.0.4,172.233.0.9,172.233.0.7,172.233.0.12,172.233.0.5,172.233.0.13,172.233.0.10,172.233.0.6,172.233.0.8,172.233.0.11", + Interfaces"], "monitors": {"alerts": ["Managed Databases", "NodeBalancers"], + "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": + {"ipv4": "172.233.0.4,172.233.0.9,172.233.0.7,172.233.0.12,172.233.0.5,172.233.0.13,172.233.0.10,172.233.0.6,172.233.0.8,172.233.0.11", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "nl-ams", @@ -307,9 +314,9 @@ interactions: "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance - Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases"], - "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": - {"ipv4": "172.233.33.36,172.233.33.38,172.233.33.35,172.233.33.39,172.233.33.34,172.233.33.33,172.233.33.31,172.233.33.30,172.233.33.37,172.233.33.32", + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "172.233.33.36,172.233.33.38,172.233.33.35,172.233.33.39,172.233.33.34,172.233.33.33,172.233.33.31,172.233.33.30,172.233.33.37,172.233.33.32", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "se-sto", @@ -318,9 +325,9 @@ interactions: "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance - Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases"], - "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": - {"ipv4": "172.232.128.24,172.232.128.26,172.232.128.20,172.232.128.22,172.232.128.25,172.232.128.19,172.232.128.23,172.232.128.18,172.232.128.21,172.232.128.27", + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "172.232.128.24,172.232.128.26,172.232.128.20,172.232.128.22,172.232.128.25,172.232.128.19,172.232.128.23,172.232.128.18,172.232.128.21,172.232.128.27", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "es-mad", @@ -329,9 +336,9 @@ interactions: "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance - Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases"], - "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": - {"ipv4": "172.233.111.6,172.233.111.17,172.233.111.21,172.233.111.25,172.233.111.19,172.233.111.12,172.233.111.26,172.233.111.16,172.233.111.18,172.233.111.9", + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "172.233.111.6,172.233.111.17,172.233.111.21,172.233.111.25,172.233.111.19,172.233.111.12,172.233.111.26,172.233.111.16,172.233.111.18,172.233.111.9", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "in-maa", @@ -341,8 +348,8 @@ interactions: Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", "NETINT Quadra T1U", "Maintenance Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed - Databases"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", - "resolvers": {"ipv4": "172.232.96.17,172.232.96.26,172.232.96.19,172.232.96.20,172.232.96.25,172.232.96.21,172.232.96.18,172.232.96.22,172.232.96.23,172.232.96.24", + Databases", "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "172.232.96.17,172.232.96.26,172.232.96.19,172.232.96.20,172.232.96.25,172.232.96.21,172.232.96.18,172.232.96.22,172.232.96.23,172.232.96.24", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "jp-osa", @@ -351,9 +358,9 @@ interactions: "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance - Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases"], - "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": - {"ipv4": "172.233.64.44,172.233.64.43,172.233.64.37,172.233.64.40,172.233.64.46,172.233.64.41,172.233.64.39,172.233.64.42,172.233.64.45,172.233.64.38", + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "172.233.64.44,172.233.64.43,172.233.64.37,172.233.64.40,172.233.64.46,172.233.64.41,172.233.64.39,172.233.64.42,172.233.64.45,172.233.64.38", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "it-mil", @@ -362,9 +369,9 @@ interactions: "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance - Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases"], - "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": - {"ipv4": "172.232.192.19,172.232.192.18,172.232.192.16,172.232.192.20,172.232.192.24,172.232.192.21,172.232.192.22,172.232.192.17,172.232.192.15,172.232.192.23", + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "172.232.192.19,172.232.192.18,172.232.192.16,172.232.192.20,172.232.192.24,172.232.192.21,172.232.192.22,172.232.192.17,172.232.192.15,172.232.192.23", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "us-central", @@ -372,9 +379,9 @@ interactions: Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", "Managed Databases", "Metadata", "Placement Group", "StackScripts", "Maintenance - Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases"], - "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": - {"ipv4": "72.14.179.5,72.14.188.5,173.255.199.5,66.228.53.5,96.126.122.5,96.126.124.5,96.126.127.5,198.58.107.5,198.58.111.5,23.239.24.5", + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "72.14.179.5,72.14.188.5,173.255.199.5,66.228.53.5,96.126.122.5,96.126.124.5,96.126.127.5,198.58.107.5,198.58.111.5,23.239.24.5", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "ap-northeast", @@ -382,9 +389,9 @@ interactions: Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", "Managed Databases", "Metadata", "Placement Group", "StackScripts", "Maintenance - Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases"], - "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": - {"ipv4": "139.162.66.5,139.162.67.5,139.162.68.5,139.162.69.5,139.162.70.5,139.162.71.5,139.162.72.5,139.162.73.5,139.162.74.5,139.162.75.5", + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "139.162.66.5,139.162.67.5,139.162.68.5,139.162.69.5,139.162.70.5,139.162.71.5,139.162.72.5,139.162.73.5,139.162.74.5,139.162.75.5", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "eu-central", @@ -393,8 +400,8 @@ interactions: "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", "Managed Databases", "Metadata", "Placement Group", "StackScripts", "Maintenance Policy", "Linode Interfaces"], "monitors": - {"alerts": ["Managed Databases"], "metrics": ["Managed Databases", "NodeBalancers"]}, - "status": "ok", "resolvers": {"ipv4": "139.162.130.5,139.162.131.5,139.162.132.5,139.162.133.5,139.162.134.5,139.162.135.5,139.162.136.5,139.162.137.5,139.162.138.5,139.162.139.5", + {"alerts": ["Managed Databases", "NodeBalancers"], "metrics": ["Managed Databases", + "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "139.162.130.5,139.162.131.5,139.162.132.5,139.162.133.5,139.162.134.5,139.162.135.5,139.162.136.5,139.162.137.5,139.162.138.5,139.162.139.5", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "ap-south", @@ -402,8 +409,8 @@ interactions: Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", "Metadata", "Placement Group", "StackScripts", - "Maintenance Policy", "Linode Interfaces"], "monitors": {"alerts": [], "metrics": - ["NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "139.162.11.5,139.162.13.5,139.162.14.5,139.162.15.5,139.162.16.5,139.162.21.5,139.162.27.5,103.3.60.18,103.3.60.19,103.3.60.20", + "Maintenance Policy", "Linode Interfaces"], "monitors": {"alerts": ["NodeBalancers"], + "metrics": ["NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "139.162.11.5,139.162.13.5,139.162.14.5,139.162.15.5,139.162.16.5,139.162.21.5,139.162.27.5,103.3.60.18,103.3.60.19,103.3.60.20", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "eu-west", @@ -411,20 +418,20 @@ interactions: Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", "Metadata", "Placement Group", "StackScripts", "Maintenance Policy", "Linode - Interfaces"], "monitors": {"alerts": [], "metrics": ["NodeBalancers"]}, "status": - "ok", "resolvers": {"ipv4": "178.79.182.5, 176.58.107.5, 176.58.116.5, 176.58.121.5, - 151.236.220.5, 212.71.252.5, 212.71.253.5, 109.74.192.20, 109.74.193.20, 109.74.194.20", - "ipv6": "1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678"}, "placement_group_limits": - {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": - 5}, "site_type": "core"}, {"id": "us-east", "label": "Newark, NJ", "country": - "us", "capabilities": ["Linodes", "Block Storage Encryption", "LA Disk Encryption", - "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", "Object Storage", - "GPU Linodes", "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", - "Managed Databases", "Metadata", "Placement Group", "StackScripts", "Maintenance - Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases"], - "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": - {"ipv4": "66.228.42.5,96.126.106.5,50.116.53.5,50.116.58.5,50.116.61.5,50.116.62.5,66.175.211.5,97.107.133.4,173.255.225.5,66.228.35.5", + Interfaces"], "monitors": {"alerts": ["NodeBalancers"], "metrics": ["NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "178.79.182.5, 176.58.107.5, 176.58.116.5, + 176.58.121.5, 151.236.220.5, 212.71.252.5, 212.71.253.5, 109.74.192.20, 109.74.193.20, + 109.74.194.20", "ipv6": "1234::5678, 1234::5678, 1234::5678, 1234::5678, + 1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "us-east", + "label": "Newark, NJ", "country": "us", "capabilities": ["Linodes", "Block Storage + Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Cloud Firewall", + "Vlans", "Block Storage Migrations", "Managed Databases", "Metadata", "Placement + Group", "StackScripts", "Maintenance Policy", "Linode Interfaces"], "monitors": + {"alerts": ["Managed Databases", "NodeBalancers"], "metrics": ["Managed Databases", + "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "66.228.42.5,96.126.106.5,50.116.53.5,50.116.58.5,50.116.61.5,50.116.62.5,66.175.211.5,97.107.133.4,173.255.225.5,66.228.35.5", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "us-southeast", @@ -433,8 +440,8 @@ interactions: "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", "Managed Databases", "Metadata", "Placement Group", "StackScripts", "Maintenance Policy", "Linode Interfaces"], "monitors": - {"alerts": ["Managed Databases"], "metrics": ["Managed Databases", "NodeBalancers"]}, - "status": "ok", "resolvers": {"ipv4": "74.207.231.5,173.230.128.5,173.230.129.5,173.230.136.5,173.230.140.5,66.228.59.5,66.228.62.5,50.116.35.5,50.116.41.5,23.239.18.5", + {"alerts": ["Managed Databases", "NodeBalancers"], "metrics": ["Managed Databases", + "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "74.207.231.5,173.230.128.5,173.230.129.5,173.230.136.5,173.230.140.5,66.228.59.5,66.228.62.5,50.116.35.5,50.116.41.5,23.239.18.5", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "us-west", @@ -442,14 +449,14 @@ interactions: Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", "Managed Databases", "Metadata", "Placement Group", "StackScripts", "Maintenance - Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases"], - "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": - {"ipv4": "173.230.145.5, 173.230.147.5, 173.230.155.5, 173.255.212.5, 173.255.219.5, - 173.255.241.5, 173.255.243.5, 173.255.244.5, 74.207.241.5, 74.207.242.5", "ipv6": - "1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678, 1234::5678"}, "placement_group_limits": + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "173.230.145.5, 173.230.147.5, 173.230.155.5, 173.255.212.5, + 173.255.219.5, 173.255.241.5, 173.255.243.5, 173.255.244.5, 74.207.241.5, 74.207.242.5", + "ipv6": "1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678, + 1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": - 5}, "site_type": "core"}], "page": 1, "pages": 1, "results": 46}' + 5}, "site_type": "core"}], "page": 1, "pages": 1, "results": 47}' headers: Access-Control-Allow-Credentials: - "true" @@ -472,7 +479,7 @@ interactions: Content-Type: - application/json Expires: - - Tue, 24 Mar 2026 17:06:58 GMT + - Wed, 06 May 2026 01:42:52 GMT Pragma: - no-cache Strict-Transport-Security: @@ -498,261 +505,7 @@ interactions: code: 200 duration: "" - request: - body: "" - form: {} - headers: - Accept: - - application/json - Content-Type: - - application/json - User-Agent: - - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/account/availability?page=1 - method: GET - response: - body: '{"data": [{"region": "us-central", "available": ["Linodes", "NodeBalancers", - "Block Storage", "Kubernetes"], "unavailable": []}, {"region": "us-west", "available": - ["Linodes", "NodeBalancers", "Block Storage", "Kubernetes"], "unavailable": - []}, {"region": "us-southeast", "available": ["Linodes", "NodeBalancers", "Block - Storage", "Kubernetes"], "unavailable": []}, {"region": "us-east", "available": - ["Linodes", "NodeBalancers", "Block Storage", "Kubernetes"], "unavailable": - []}, {"region": "eu-west", "available": [], "unavailable": ["Linodes", "NodeBalancers", - "Block Storage", "Kubernetes"]}, {"region": "ap-south", "available": ["Linodes", - "NodeBalancers", "Block Storage", "Kubernetes"], "unavailable": []}, {"region": - "eu-central", "available": ["Linodes", "NodeBalancers", "Block Storage", "Kubernetes"], - "unavailable": []}, {"region": "ap-northeast", "available": ["Linodes", "NodeBalancers", - "Block Storage", "Kubernetes"], "unavailable": []}, {"region": "ap-west", "available": - ["Linodes", "NodeBalancers", "Block Storage", "Kubernetes"], "unavailable": - []}, {"region": "ca-central", "available": ["Linodes", "NodeBalancers", "Block - Storage", "Kubernetes"], "unavailable": []}, {"region": "ap-southeast", "available": - ["Linodes", "NodeBalancers", "Block Storage", "Kubernetes"], "unavailable": - []}, {"region": "us-iad", "available": ["Linodes", "NodeBalancers", "Block Storage", - "Kubernetes"], "unavailable": []}, {"region": "us-ord", "available": ["Linodes", - "NodeBalancers", "Block Storage", "Kubernetes"], "unavailable": []}, {"region": - "fr-par", "available": ["Linodes", "NodeBalancers"], "unavailable": ["Block - Storage", "Kubernetes"]}, {"region": "us-sea", "available": ["Linodes", "NodeBalancers", - "Block Storage", "Kubernetes"], "unavailable": []}, {"region": "br-gru", "available": - ["Linodes", "NodeBalancers", "Block Storage", "Kubernetes"], "unavailable": - []}, {"region": "nl-ams", "available": ["Linodes", "NodeBalancers", "Block Storage", - "Kubernetes"], "unavailable": []}, {"region": "se-sto", "available": ["Linodes", - "NodeBalancers", "Block Storage", "Kubernetes"], "unavailable": []}, {"region": - "es-mad", "available": ["Linodes", "Kubernetes"], "unavailable": ["NodeBalancers", - "Block Storage"]}, {"region": "in-maa", "available": ["Linodes", "NodeBalancers", - "Block Storage", "Kubernetes"], "unavailable": []}, {"region": "jp-osa", "available": - ["Linodes", "NodeBalancers", "Block Storage", "Kubernetes"], "unavailable": - []}, {"region": "it-mil", "available": ["Linodes", "NodeBalancers", "Block Storage", - "Kubernetes"], "unavailable": []}, {"region": "us-mia", "available": ["Linodes", - "NodeBalancers", "Block Storage", "Kubernetes"], "unavailable": []}, {"region": - "id-cgk", "available": ["Linodes", "NodeBalancers", "Block Storage", "Kubernetes"], - "unavailable": []}, {"region": "us-lax", "available": ["Linodes", "NodeBalancers", - "Block Storage", "Kubernetes"], "unavailable": []}, {"region": "nz-akl-1", "available": - ["Linodes", "NodeBalancers", "Block Storage", "Kubernetes"], "unavailable": - []}, {"region": "us-den-1", "available": ["Linodes"], "unavailable": ["NodeBalancers", - "Block Storage", "Kubernetes"]}, {"region": "de-ham-1", "available": ["Linodes"], - "unavailable": ["NodeBalancers", "Block Storage", "Kubernetes"]}, {"region": - "za-jnb-1", "available": ["Linodes"], "unavailable": ["NodeBalancers", "Block - Storage", "Kubernetes"]}, {"region": "my-kul-1", "available": ["Linodes"], "unavailable": - ["NodeBalancers", "Block Storage", "Kubernetes"]}, {"region": "co-bog-1", "available": - ["Linodes"], "unavailable": ["NodeBalancers", "Block Storage", "Kubernetes"]}, - {"region": "mx-qro-1", "available": ["Linodes"], "unavailable": ["NodeBalancers", - "Block Storage", "Kubernetes"]}, {"region": "us-hou-1", "available": ["Linodes"], - "unavailable": ["NodeBalancers", "Block Storage", "Kubernetes"]}, {"region": - "cl-scl-1", "available": ["Linodes"], "unavailable": ["NodeBalancers", "Block - Storage", "Kubernetes"]}, {"region": "gb-lon", "available": ["Linodes", "NodeBalancers", - "Block Storage", "Kubernetes"], "unavailable": []}, {"region": "au-mel", "available": - ["Linodes", "Kubernetes"], "unavailable": ["NodeBalancers", "Block Storage"]}, - {"region": "in-bom-2", "available": ["Linodes", "NodeBalancers", "Block Storage", - "Kubernetes"], "unavailable": []}, {"region": "de-fra-2", "available": ["Linodes", - "NodeBalancers", "Block Storage", "Kubernetes"], "unavailable": []}, {"region": - "sg-sin-2", "available": ["Linodes", "NodeBalancers", "Block Storage", "Kubernetes"], - "unavailable": []}, {"region": "jp-tyo-3", "available": ["Linodes", "NodeBalancers", - "Block Storage", "Kubernetes"], "unavailable": []}, {"region": "de-ber-1", "available": - ["Linodes", "NodeBalancers", "Block Storage", "Kubernetes"], "unavailable": - []}, {"region": "no-osl-1", "available": ["Linodes", "NodeBalancers", "Block - Storage", "Kubernetes"], "unavailable": []}, {"region": "us-iad-2", "available": - ["Linodes", "NodeBalancers", "Block Storage", "Kubernetes"], "unavailable": - []}, {"region": "fr-par-2", "available": ["Linodes", "NodeBalancers", "Block - Storage", "Kubernetes"], "unavailable": []}, {"region": "co-bog-2", "available": - ["Linodes", "NodeBalancers", "Block Storage", "Kubernetes"], "unavailable": - []}, {"region": "fr-mrs-2", "available": ["Linodes", "NodeBalancers", "Block - Storage", "Kubernetes"], "unavailable": []}], "page": 1, "pages": 1, "results": - 46}' - headers: - Access-Control-Allow-Credentials: - - "true" - Access-Control-Allow-Headers: - - Authorization, Origin, X-Requested-With, Content-Type, Accept, X-Filter - Access-Control-Allow-Methods: - - HEAD, GET, OPTIONS, POST, PUT, DELETE - Access-Control-Allow-Origin: - - '*' - Access-Control-Expose-Headers: - - X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Status - Akamai-Internal-Account: - - '*' - Cache-Control: - - max-age=0, no-cache, no-store - Connection: - - keep-alive - Content-Security-Policy: - - default-src 'none' - Content-Type: - - application/json - Expires: - - Tue, 24 Mar 2026 17:06:58 GMT - Pragma: - - no-cache - Strict-Transport-Security: - - max-age=31536000 - Vary: - - Authorization, X-Filter - - Authorization, X-Filter - - Accept-Encoding - X-Accepted-Oauth-Scopes: - - account:read_only - X-Content-Type-Options: - - nosniff - X-Frame-Options: - - DENY - - DENY - X-Oauth-Scopes: - - '*' - X-Ratelimit-Limit: - - "1840" - X-Xss-Protection: - - 1; mode=block - status: 200 OK - code: 200 - duration: "" -- request: - body: "" - form: {} - headers: - Accept: - - application/json - Content-Type: - - application/json - User-Agent: - - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/account/availability?page=1 - method: GET - response: - body: '{"data": [{"region": "us-central", "available": ["Linodes", "NodeBalancers", - "Block Storage", "Kubernetes"], "unavailable": []}, {"region": "us-west", "available": - ["Linodes", "NodeBalancers", "Block Storage", "Kubernetes"], "unavailable": - []}, {"region": "us-southeast", "available": ["Linodes", "NodeBalancers", "Block - Storage", "Kubernetes"], "unavailable": []}, {"region": "us-east", "available": - ["Linodes", "NodeBalancers", "Block Storage", "Kubernetes"], "unavailable": - []}, {"region": "eu-west", "available": [], "unavailable": ["Linodes", "NodeBalancers", - "Block Storage", "Kubernetes"]}, {"region": "ap-south", "available": ["Linodes", - "NodeBalancers", "Block Storage", "Kubernetes"], "unavailable": []}, {"region": - "eu-central", "available": ["Linodes", "NodeBalancers", "Block Storage", "Kubernetes"], - "unavailable": []}, {"region": "ap-northeast", "available": ["Linodes", "NodeBalancers", - "Block Storage", "Kubernetes"], "unavailable": []}, {"region": "ap-west", "available": - ["Linodes", "NodeBalancers", "Block Storage", "Kubernetes"], "unavailable": - []}, {"region": "ca-central", "available": ["Linodes", "NodeBalancers", "Block - Storage", "Kubernetes"], "unavailable": []}, {"region": "ap-southeast", "available": - ["Linodes", "NodeBalancers", "Block Storage", "Kubernetes"], "unavailable": - []}, {"region": "us-iad", "available": ["Linodes", "NodeBalancers", "Block Storage", - "Kubernetes"], "unavailable": []}, {"region": "us-ord", "available": ["Linodes", - "NodeBalancers", "Block Storage", "Kubernetes"], "unavailable": []}, {"region": - "fr-par", "available": ["Linodes", "NodeBalancers"], "unavailable": ["Block - Storage", "Kubernetes"]}, {"region": "us-sea", "available": ["Linodes", "NodeBalancers", - "Block Storage", "Kubernetes"], "unavailable": []}, {"region": "br-gru", "available": - ["Linodes", "NodeBalancers", "Block Storage", "Kubernetes"], "unavailable": - []}, {"region": "nl-ams", "available": ["Linodes", "NodeBalancers", "Block Storage", - "Kubernetes"], "unavailable": []}, {"region": "se-sto", "available": ["Linodes", - "NodeBalancers", "Block Storage", "Kubernetes"], "unavailable": []}, {"region": - "es-mad", "available": ["Linodes", "Kubernetes"], "unavailable": ["NodeBalancers", - "Block Storage"]}, {"region": "in-maa", "available": ["Linodes", "NodeBalancers", - "Block Storage", "Kubernetes"], "unavailable": []}, {"region": "jp-osa", "available": - ["Linodes", "NodeBalancers", "Block Storage", "Kubernetes"], "unavailable": - []}, {"region": "it-mil", "available": ["Linodes", "NodeBalancers", "Block Storage", - "Kubernetes"], "unavailable": []}, {"region": "us-mia", "available": ["Linodes", - "NodeBalancers", "Block Storage", "Kubernetes"], "unavailable": []}, {"region": - "id-cgk", "available": ["Linodes", "NodeBalancers", "Block Storage", "Kubernetes"], - "unavailable": []}, {"region": "us-lax", "available": ["Linodes", "NodeBalancers", - "Block Storage", "Kubernetes"], "unavailable": []}, {"region": "nz-akl-1", "available": - ["Linodes", "NodeBalancers", "Block Storage", "Kubernetes"], "unavailable": - []}, {"region": "us-den-1", "available": ["Linodes"], "unavailable": ["NodeBalancers", - "Block Storage", "Kubernetes"]}, {"region": "de-ham-1", "available": ["Linodes"], - "unavailable": ["NodeBalancers", "Block Storage", "Kubernetes"]}, {"region": - "za-jnb-1", "available": ["Linodes"], "unavailable": ["NodeBalancers", "Block - Storage", "Kubernetes"]}, {"region": "my-kul-1", "available": ["Linodes"], "unavailable": - ["NodeBalancers", "Block Storage", "Kubernetes"]}, {"region": "co-bog-1", "available": - ["Linodes"], "unavailable": ["NodeBalancers", "Block Storage", "Kubernetes"]}, - {"region": "mx-qro-1", "available": ["Linodes"], "unavailable": ["NodeBalancers", - "Block Storage", "Kubernetes"]}, {"region": "us-hou-1", "available": ["Linodes"], - "unavailable": ["NodeBalancers", "Block Storage", "Kubernetes"]}, {"region": - "cl-scl-1", "available": ["Linodes"], "unavailable": ["NodeBalancers", "Block - Storage", "Kubernetes"]}, {"region": "gb-lon", "available": ["Linodes", "NodeBalancers", - "Block Storage", "Kubernetes"], "unavailable": []}, {"region": "au-mel", "available": - ["Linodes", "Kubernetes"], "unavailable": ["NodeBalancers", "Block Storage"]}, - {"region": "in-bom-2", "available": ["Linodes", "NodeBalancers", "Block Storage", - "Kubernetes"], "unavailable": []}, {"region": "de-fra-2", "available": ["Linodes", - "NodeBalancers", "Block Storage", "Kubernetes"], "unavailable": []}, {"region": - "sg-sin-2", "available": ["Linodes", "NodeBalancers", "Block Storage", "Kubernetes"], - "unavailable": []}, {"region": "jp-tyo-3", "available": ["Linodes", "NodeBalancers", - "Block Storage", "Kubernetes"], "unavailable": []}, {"region": "de-ber-1", "available": - ["Linodes", "NodeBalancers", "Block Storage", "Kubernetes"], "unavailable": - []}, {"region": "no-osl-1", "available": ["Linodes", "NodeBalancers", "Block - Storage", "Kubernetes"], "unavailable": []}, {"region": "us-iad-2", "available": - ["Linodes", "NodeBalancers", "Block Storage", "Kubernetes"], "unavailable": - []}, {"region": "fr-par-2", "available": ["Linodes", "NodeBalancers", "Block - Storage", "Kubernetes"], "unavailable": []}, {"region": "co-bog-2", "available": - ["Linodes", "NodeBalancers", "Block Storage", "Kubernetes"], "unavailable": - []}, {"region": "fr-mrs-2", "available": ["Linodes", "NodeBalancers", "Block - Storage", "Kubernetes"], "unavailable": []}], "page": 1, "pages": 1, "results": - 46}' - headers: - Access-Control-Allow-Credentials: - - "true" - Access-Control-Allow-Headers: - - Authorization, Origin, X-Requested-With, Content-Type, Accept, X-Filter - Access-Control-Allow-Methods: - - HEAD, GET, OPTIONS, POST, PUT, DELETE - Access-Control-Allow-Origin: - - '*' - Access-Control-Expose-Headers: - - X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Status - Akamai-Internal-Account: - - '*' - Cache-Control: - - max-age=0, no-cache, no-store - Connection: - - keep-alive - Content-Security-Policy: - - default-src 'none' - Content-Type: - - application/json - Expires: - - Tue, 24 Mar 2026 17:06:58 GMT - Pragma: - - no-cache - Strict-Transport-Security: - - max-age=31536000 - Vary: - - Authorization, X-Filter - - Authorization, X-Filter - - Accept-Encoding - X-Accepted-Oauth-Scopes: - - account:read_only - X-Content-Type-Options: - - nosniff - X-Frame-Options: - - DENY - - DENY - X-Oauth-Scopes: - - '*' - X-Ratelimit-Limit: - - "1840" - X-Xss-Protection: - - 1; mode=block - status: 200 OK - code: 200 - duration: "" -- request: - body: '{"label":"go-test-vpc-1774372018772667000","region":"au-mel","subnets":[{"label":"linodego-vpc-test-1774372018952471000","ipv4":"192.168.0.0/25"}]}' + body: '{"label":"go-test-vpc-1778031772656360000","region":"au-mel","subnets":[{"label":"linodego-vpc-test-1778031772656574000","ipv4":"192.168.0.0/25"}]}' form: {} headers: Accept: @@ -764,11 +517,13 @@ interactions: url: https://api.linode.com/v4beta/vpcs method: POST response: - body: '{"id": 422885, "label": "go-test-vpc-1774372018772667000", "description": - "", "region": "au-mel", "ipv6": null, "subnets": [{"id": 523986, "label": "linodego-vpc-test-1774372018952471000", - "ipv4": "192.168.0.0/25", "ipv6": null, "linodes": [], "databases": [], "nodebalancers": - [], "created": "2018-01-02T03:04:05", "updated": "2018-01-02T03:04:05"}], "created": - "2018-01-02T03:04:05", "updated": "2018-01-02T03:04:05"}' + body: '{"id": 471962, "label": "go-test-vpc-1778031772656360000", "description": + "", "region": "au-mel", "ipv4": [{"range": "10.0.0.0/8"}, {"range": "172.16.0.0/12"}, + {"range": "192.168.0.0/16"}], "ipv6": null, "subnets": [{"id": 629501, "label": + "linodego-vpc-test-1778031772656574000", "ipv4": "192.168.0.0/25", "ipv6": null, + "linodes": [], "databases": [], "nodebalancers": [], "created": "2018-01-02T03:04:05", + "updated": "2018-01-02T03:04:05"}], "created": "2018-01-02T03:04:05", "updated": + "2018-01-02T03:04:05"}' headers: Access-Control-Allow-Credentials: - "true" @@ -787,13 +542,13 @@ interactions: Connection: - keep-alive Content-Length: - - "419" + - "511" Content-Security-Policy: - default-src 'none' Content-Type: - application/json Expires: - - Tue, 24 Mar 2026 17:06:59 GMT + - Wed, 06 May 2026 01:42:53 GMT Pragma: - no-cache Strict-Transport-Security: @@ -817,134 +572,7 @@ interactions: code: 200 duration: "" - request: - body: "" - form: {} - headers: - Accept: - - application/json - Content-Type: - - application/json - User-Agent: - - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/account/availability?page=1 - method: GET - response: - body: '{"data": [{"region": "us-central", "available": ["Linodes", "NodeBalancers", - "Block Storage", "Kubernetes"], "unavailable": []}, {"region": "us-west", "available": - ["Linodes", "NodeBalancers", "Block Storage", "Kubernetes"], "unavailable": - []}, {"region": "us-southeast", "available": ["Linodes", "NodeBalancers", "Block - Storage", "Kubernetes"], "unavailable": []}, {"region": "us-east", "available": - ["Linodes", "NodeBalancers", "Block Storage", "Kubernetes"], "unavailable": - []}, {"region": "eu-west", "available": [], "unavailable": ["Linodes", "NodeBalancers", - "Block Storage", "Kubernetes"]}, {"region": "ap-south", "available": ["Linodes", - "NodeBalancers", "Block Storage", "Kubernetes"], "unavailable": []}, {"region": - "eu-central", "available": ["Linodes", "NodeBalancers", "Block Storage", "Kubernetes"], - "unavailable": []}, {"region": "ap-northeast", "available": ["Linodes", "NodeBalancers", - "Block Storage", "Kubernetes"], "unavailable": []}, {"region": "ap-west", "available": - ["Linodes", "NodeBalancers", "Block Storage", "Kubernetes"], "unavailable": - []}, {"region": "ca-central", "available": ["Linodes", "NodeBalancers", "Block - Storage", "Kubernetes"], "unavailable": []}, {"region": "ap-southeast", "available": - ["Linodes", "NodeBalancers", "Block Storage", "Kubernetes"], "unavailable": - []}, {"region": "us-iad", "available": ["Linodes", "NodeBalancers", "Block Storage", - "Kubernetes"], "unavailable": []}, {"region": "us-ord", "available": ["Linodes", - "NodeBalancers", "Block Storage", "Kubernetes"], "unavailable": []}, {"region": - "fr-par", "available": ["Linodes", "NodeBalancers"], "unavailable": ["Block - Storage", "Kubernetes"]}, {"region": "us-sea", "available": ["Linodes", "NodeBalancers", - "Block Storage", "Kubernetes"], "unavailable": []}, {"region": "br-gru", "available": - ["Linodes", "NodeBalancers", "Block Storage", "Kubernetes"], "unavailable": - []}, {"region": "nl-ams", "available": ["Linodes", "NodeBalancers", "Block Storage", - "Kubernetes"], "unavailable": []}, {"region": "se-sto", "available": ["Linodes", - "NodeBalancers", "Block Storage", "Kubernetes"], "unavailable": []}, {"region": - "es-mad", "available": ["Linodes", "Kubernetes"], "unavailable": ["NodeBalancers", - "Block Storage"]}, {"region": "in-maa", "available": ["Linodes", "NodeBalancers", - "Block Storage", "Kubernetes"], "unavailable": []}, {"region": "jp-osa", "available": - ["Linodes", "NodeBalancers", "Block Storage", "Kubernetes"], "unavailable": - []}, {"region": "it-mil", "available": ["Linodes", "NodeBalancers", "Block Storage", - "Kubernetes"], "unavailable": []}, {"region": "us-mia", "available": ["Linodes", - "NodeBalancers", "Block Storage", "Kubernetes"], "unavailable": []}, {"region": - "id-cgk", "available": ["Linodes", "NodeBalancers", "Block Storage", "Kubernetes"], - "unavailable": []}, {"region": "us-lax", "available": ["Linodes", "NodeBalancers", - "Block Storage", "Kubernetes"], "unavailable": []}, {"region": "nz-akl-1", "available": - ["Linodes", "NodeBalancers", "Block Storage", "Kubernetes"], "unavailable": - []}, {"region": "us-den-1", "available": ["Linodes"], "unavailable": ["NodeBalancers", - "Block Storage", "Kubernetes"]}, {"region": "de-ham-1", "available": ["Linodes"], - "unavailable": ["NodeBalancers", "Block Storage", "Kubernetes"]}, {"region": - "za-jnb-1", "available": ["Linodes"], "unavailable": ["NodeBalancers", "Block - Storage", "Kubernetes"]}, {"region": "my-kul-1", "available": ["Linodes"], "unavailable": - ["NodeBalancers", "Block Storage", "Kubernetes"]}, {"region": "co-bog-1", "available": - ["Linodes"], "unavailable": ["NodeBalancers", "Block Storage", "Kubernetes"]}, - {"region": "mx-qro-1", "available": ["Linodes"], "unavailable": ["NodeBalancers", - "Block Storage", "Kubernetes"]}, {"region": "us-hou-1", "available": ["Linodes"], - "unavailable": ["NodeBalancers", "Block Storage", "Kubernetes"]}, {"region": - "cl-scl-1", "available": ["Linodes"], "unavailable": ["NodeBalancers", "Block - Storage", "Kubernetes"]}, {"region": "gb-lon", "available": ["Linodes", "NodeBalancers", - "Block Storage", "Kubernetes"], "unavailable": []}, {"region": "au-mel", "available": - ["Linodes", "Kubernetes"], "unavailable": ["NodeBalancers", "Block Storage"]}, - {"region": "in-bom-2", "available": ["Linodes", "NodeBalancers", "Block Storage", - "Kubernetes"], "unavailable": []}, {"region": "de-fra-2", "available": ["Linodes", - "NodeBalancers", "Block Storage", "Kubernetes"], "unavailable": []}, {"region": - "sg-sin-2", "available": ["Linodes", "NodeBalancers", "Block Storage", "Kubernetes"], - "unavailable": []}, {"region": "jp-tyo-3", "available": ["Linodes", "NodeBalancers", - "Block Storage", "Kubernetes"], "unavailable": []}, {"region": "de-ber-1", "available": - ["Linodes", "NodeBalancers", "Block Storage", "Kubernetes"], "unavailable": - []}, {"region": "no-osl-1", "available": ["Linodes", "NodeBalancers", "Block - Storage", "Kubernetes"], "unavailable": []}, {"region": "us-iad-2", "available": - ["Linodes", "NodeBalancers", "Block Storage", "Kubernetes"], "unavailable": - []}, {"region": "fr-par-2", "available": ["Linodes", "NodeBalancers", "Block - Storage", "Kubernetes"], "unavailable": []}, {"region": "co-bog-2", "available": - ["Linodes", "NodeBalancers", "Block Storage", "Kubernetes"], "unavailable": - []}, {"region": "fr-mrs-2", "available": ["Linodes", "NodeBalancers", "Block - Storage", "Kubernetes"], "unavailable": []}], "page": 1, "pages": 1, "results": - 46}' - headers: - Access-Control-Allow-Credentials: - - "true" - Access-Control-Allow-Headers: - - Authorization, Origin, X-Requested-With, Content-Type, Accept, X-Filter - Access-Control-Allow-Methods: - - HEAD, GET, OPTIONS, POST, PUT, DELETE - Access-Control-Allow-Origin: - - '*' - Access-Control-Expose-Headers: - - X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Status - Akamai-Internal-Account: - - '*' - Cache-Control: - - max-age=0, no-cache, no-store - Connection: - - keep-alive - Content-Security-Policy: - - default-src 'none' - Content-Type: - - application/json - Expires: - - Tue, 24 Mar 2026 17:06:59 GMT - Pragma: - - no-cache - Strict-Transport-Security: - - max-age=31536000 - Vary: - - Authorization, X-Filter - - Authorization, X-Filter - - Accept-Encoding - X-Accepted-Oauth-Scopes: - - account:read_only - X-Content-Type-Options: - - nosniff - X-Frame-Options: - - DENY - - DENY - X-Oauth-Scopes: - - '*' - X-Ratelimit-Limit: - - "1840" - X-Xss-Protection: - - 1; mode=block - status: 200 OK - code: 200 - duration: "" -- request: - body: '{"region":"au-mel","type":"g6-nanode-1","label":"go-test-intf-du996l59d1lu","root_pass":"CP00c?8nd4w9;F@92B:ov[(h{Z)00Z07qxY*B8@1iaRhD/JA=jGd05O[u\u0026Y@R\u00261g","image":"linode/debian12","interface_generation":"linode","booted":false,"interfaces":[{"firewall_id":4016480,"public":{"ipv4":{"addresses":[{"address":"auto","primary":true}]},"ipv6":{}}},{"firewall_id":4016480,"vpc":{"subnet_id":523986,"ipv4":{"addresses":[{"address":"auto","primary":true,"nat_1_1_address":"auto"}]}}}]}' + body: '{"region":"au-mel","type":"g6-nanode-1","label":"go-test-intf-2x63ssy273oo","root_pass":"iDl^x+k7y)mu,3[A4~Z+2MtK04k(6HVCT^D5B6x-/0Qz{2m5eZ\u003cL*2l148.uKsI[","image":"linode/debian12","interface_generation":"linode","booted":false,"interfaces":[{"firewall_id":9690627,"public":{"ipv4":{"addresses":[{"address":"auto","primary":true}]},"ipv6":{}}},{"firewall_id":9690627,"vpc":{"subnet_id":629501,"ipv4":{"addresses":[{"address":"auto","primary":true,"nat_1_1_address":"auto"}]}}}]}' form: {} headers: Accept: @@ -956,20 +584,19 @@ interactions: url: https://api.linode.com/v4beta/linode/instances method: POST response: - body: '{"id": 94760148, "label": "go-test-intf-du996l59d1lu", "group": "", "status": + body: '{"id": 97189542, "label": "go-test-intf-2x63ssy273oo", "group": "", "status": "provisioning", "created": "2018-01-02T03:04:05", "updated": "2018-01-02T03:04:05", - "type": "g6-nanode-1", "ipv4": ["172.236.62.246", "172.236.62.247"], "ipv6": - "1234::5678/128", "image": "linode/debian12", "region": - "au-mel", "site_type": "core", "specs": {"disk": 25600, "memory": 1024, "vcpus": - 1, "gpus": 0, "transfer": 1000, "accelerated_devices": 0}, "alerts": {"cpu": - 90, "network_in": 10, "network_out": 10, "transfer_quota": 80, "io": 10000, - "system_alerts": [], "user_alerts": []}, "backups": {"enabled": false, "available": - false, "schedule": {"day": null, "window": null}, "last_successful": null}, - "hypervisor": "kvm", "watchdog_enabled": true, "tags": [], "host_uuid": "9a7697483a9ca8c5ddfadf4ddee2c1f1819f1be4", - "has_user_data": false, "placement_group": null, "disk_encryption": "enabled", - "lke_cluster_id": null, "capabilities": ["Block Storage Encryption", "SMTP Enabled", - "Maintenance Policy"], "interface_generation": "linode", "maintenance_policy": - "linode/migrate", "locks": []}' + "type": "g6-nanode-1", "ipv4": ["172.236.53.76", "172.236.53.98"], "ipv6": "1234::5678/128", + "image": "linode/debian12", "region": "au-mel", "site_type": "core", "specs": + {"disk": 25600, "memory": 1024, "vcpus": 1, "gpus": 0, "transfer": 1000, "accelerated_devices": + 0}, "alerts": {"cpu": 90, "network_in": 10, "network_out": 10, "transfer_quota": + 80, "io": 10000, "system_alerts": [], "user_alerts": []}, "backups": {"enabled": + false, "available": false, "schedule": {"day": null, "window": null}, "last_successful": + null}, "hypervisor": "kvm", "watchdog_enabled": true, "tags": [], "host_uuid": + "7c21ff8b1596655206e1b4c6bc4f1c8ebd03c68c", "has_user_data": false, "placement_group": + null, "disk_encryption": "enabled", "lke_cluster_id": null, "capabilities": + ["Block Storage Encryption", "SMTP Enabled", "Maintenance Policy"], "interface_generation": + "linode", "maintenance_policy": "linode/migrate", "locks": []}' headers: Access-Control-Allow-Credentials: - "true" @@ -992,7 +619,7 @@ interactions: Content-Type: - application/json Expires: - - Tue, 24 Mar 2026 17:07:01 GMT + - Wed, 06 May 2026 01:42:55 GMT Pragma: - no-cache Strict-Transport-Security: @@ -1026,7 +653,7 @@ interactions: - application/json User-Agent: - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/linode/instances/94760148 + url: https://api.linode.com/v4beta/linode/instances/97189542 method: DELETE response: body: '{}' @@ -1054,7 +681,7 @@ interactions: Content-Type: - application/json Expires: - - Tue, 24 Mar 2026 17:07:01 GMT + - Wed, 06 May 2026 01:42:55 GMT Pragma: - no-cache Strict-Transport-Security: @@ -1087,7 +714,7 @@ interactions: - application/json User-Agent: - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/vpcs/422885 + url: https://api.linode.com/v4beta/vpcs/471962 method: DELETE response: body: '{}' @@ -1115,7 +742,7 @@ interactions: Content-Type: - application/json Expires: - - Tue, 24 Mar 2026 17:07:02 GMT + - Wed, 06 May 2026 01:42:56 GMT Pragma: - no-cache Strict-Transport-Security: diff --git a/test/integration/fixtures/TestLKECluster_Update.yaml b/test/integration/fixtures/TestLKECluster_Update.yaml index 979b2fd63..c15695137 100644 --- a/test/integration/fixtures/TestLKECluster_Update.yaml +++ b/test/integration/fixtures/TestLKECluster_Update.yaml @@ -14,318 +14,449 @@ interactions: url: https://api.linode.com/v4beta/regions?page=1 method: GET response: - body: '{"data": [{"id": "ap-west", "label": "Mumbai, IN", "country": "in", "capabilities": - ["Linodes", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", - "Block Storage", "GPU Linodes", "Kubernetes", "Cloud Firewall", "Vlans", "Block - Storage Migrations", "Managed Databases", "Metadata", "Placement Group", "StackScripts", - "Linode Interfaces"], "status": "ok", "resolvers": {"ipv4": "172.105.34.5,172.105.35.5,172.105.36.5,172.105.37.5,172.105.38.5,172.105.39.5,172.105.40.5,172.105.41.5,172.105.42.5,172.105.43.5", + body: '{"data": [{"id": "au-mel", "label": "Melbourne, AU", "country": "au", "capabilities": + ["Linodes", "Block Storage Encryption", "LA Disk Encryption", "Disk Encryption", + "Backups", "NodeBalancers", "Block Storage", "Object Storage", "Kubernetes", + "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", + "Premium Plans", "Placement Group", "StackScripts", "Maintenance Policy", "Linode + Interfaces"], "monitors": {"alerts": ["Managed Databases", "NodeBalancers"], + "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": + {"ipv4": "172.236.32.23,172.236.32.35,172.236.32.30,172.236.32.28,172.236.32.32,172.236.32.33,172.236.32.27,172.236.32.37,172.236.32.29,172.236.32.34", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "ca-central", "label": "Toronto, CA", "country": - "ca", "capabilities": ["Linodes", "LA Disk Encryption", "Disk Encryption", "Backups", - "NodeBalancers", "Block Storage", "Kubernetes", "Cloud Firewall", "Vlans", "Block - Storage Migrations", "Managed Databases", "Metadata", "Placement Group", "StackScripts", - "Linode Interfaces"], "status": "ok", "resolvers": {"ipv4": "172.105.0.5,172.105.3.5,172.105.4.5,172.105.5.5,172.105.6.5,172.105.7.5,172.105.8.5,172.105.9.5,172.105.10.5,172.105.11.5", + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "us-lax", + "label": "Los Angeles, CA", "country": "us", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes + Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", + "Metadata", "Premium Plans", "Placement Group", "StackScripts", "NETINT Quadra + T1U", "Maintenance Policy", "Linode Interfaces", "ACLP Logs Datacenter LKE-E"], + "monitors": {"alerts": ["Managed Databases", "NodeBalancers"], "metrics": ["Managed + Databases", "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "172.233.128.45,172.233.128.38,172.233.128.53,172.233.128.37,172.233.128.34,172.233.128.36,172.233.128.33,172.233.128.39,172.233.128.43,172.233.128.44", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "ap-southeast", "label": "Sydney, AU", "country": - "au", "capabilities": ["Linodes", "LA Disk Encryption", "Disk Encryption", "Backups", - "NodeBalancers", "Block Storage", "Kubernetes", "Cloud Firewall", "Vlans", "Block - Storage Migrations", "Managed Databases", "Metadata", "Placement Group", "StackScripts", - "Linode Interfaces"], "status": "ok", "resolvers": {"ipv4": "172.105.166.5,172.105.169.5,172.105.168.5,172.105.172.5,172.105.162.5,172.105.170.5,172.105.167.5,172.105.171.5,172.105.181.5,172.105.161.5", + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "nz-akl-1", + "label": "Auckland, NZ", "country": "nz", "capabilities": ["Linodes", "Disk + Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", "Maintenance + Policy"], "monitors": {"alerts": [], "metrics": []}, "status": "ok", "resolvers": + {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": + 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": + "us-den-1", "label": "Denver, CO", "country": "us", "capabilities": ["Linodes", + "Disk Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", + "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": + "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": + 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": + "de-ham-1", "label": "Hamburg, DE", "country": "de", "capabilities": ["Linodes", + "Disk Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", + "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": + "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": + 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": + "za-jnb-1", "label": "Johannesburg, ZA", "country": "za", "capabilities": ["Linodes", + "Disk Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", + "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": + "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": + 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": + "my-kul-1", "label": "Kuala Lumpur, MY", "country": "my", "capabilities": ["Linodes", + "Disk Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", + "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": + "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": + 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": + "co-bog-1", "label": "Bogot\u00e1, CO", "country": "co", "capabilities": ["Linodes", + "Disk Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", + "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": + "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": + 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": + "mx-qro-1", "label": "Quer\u00e9taro, MX", "country": "mx", "capabilities": + ["Linodes", "Disk Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed + Plans", "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": + "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": + 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": + "us-hou-1", "label": "Houston, TX", "country": "us", "capabilities": ["Linodes", + "Disk Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", + "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": + "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": + 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": + "cl-scl-1", "label": "Santiago, CL", "country": "cl", "capabilities": ["Linodes", + "Disk Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", + "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": + "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": + 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": + "gb-lon", "label": "London 2, UK", "country": "gb", "capabilities": ["Linodes", + "Block Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", + "NodeBalancers", "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", + "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", + "Managed Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", + "NETINT Quadra T1U", "Maintenance Policy", "Linode Interfaces", "ACLP Logs Datacenter + LKE-E"], "monitors": {"alerts": ["Managed Databases", "NodeBalancers"], "metrics": + ["Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": + "172.236.0.46,172.236.0.50,172.236.0.47,172.236.0.53,172.236.0.52,172.236.0.45,172.236.0.49,172.236.0.51,172.236.0.54,172.236.0.48", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "us-iad", "label": "Washington, DC", "country": - "us", "capabilities": ["Linodes", "Block Storage Encryption", "LA Disk Encryption", - "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", "Object Storage", - "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "Managed - Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", - "Linode Interfaces"], "status": "ok", "resolvers": {"ipv4": "139.144.192.62,139.144.192.60,139.144.192.61,139.144.192.53,139.144.192.54,139.144.192.67,139.144.192.69,139.144.192.66,139.144.192.52,139.144.192.68", + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "id-cgk", + "label": "Jakarta, ID", "country": "id", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes + Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", + "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "172.232.224.23,172.232.224.32,172.232.224.26,172.232.224.27,172.232.224.21,172.232.224.24,172.232.224.22,172.232.224.20,172.232.224.31,172.232.224.28", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "us-ord", "label": "Chicago, IL", "country": - "us", "capabilities": ["Linodes", "Block Storage Encryption", "LA Disk Encryption", - "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", "Object Storage", - "GPU Linodes", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", - "VPCs", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", - "StackScripts", "Linode Interfaces"], "status": "ok", "resolvers": {"ipv4": - "172.232.0.17,172.232.0.16,172.232.0.21,172.232.0.13,172.232.0.22,172.232.0.9,172.232.0.19,172.232.0.20,172.232.0.15,172.232.0.18", + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "in-bom-2", + "label": "Mumbai 2, IN", "country": "in", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "GPU Linodes", "Kubernetes", "Kubernetes Enterprise", "Cloud + Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", + "Premium Plans", "Placement Group", "StackScripts", "Maintenance Policy", "Linode + Interfaces", "ACLP Logs Datacenter LKE-E"], "monitors": {"alerts": ["Managed + Databases", "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "172.236.171.41,172.236.171.42,172.236.171.25,172.236.171.44,172.236.171.26,172.236.171.45,172.236.171.24,172.236.171.43,172.236.171.27,172.236.171.28", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "fr-par", "label": "Paris, FR", "country": - "fr", "capabilities": ["Linodes", "Block Storage Encryption", "LA Disk Encryption", - "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", "Object Storage", - "GPU Linodes", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", - "VPCs", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", - "StackScripts", "Linode Interfaces"], "status": "ok", "resolvers": {"ipv4": - "172.232.32.21,172.232.32.23,172.232.32.17,172.232.32.18,172.232.32.16,172.232.32.22,172.232.32.20,172.232.32.14,172.232.32.11,172.232.32.12", + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "de-fra-2", + "label": "Frankfurt 2, DE", "country": "de", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes + Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", + "Metadata", "Premium Plans", "Placement Group", "StackScripts", "NETINT Quadra + T1U", "Maintenance Policy", "Linode Interfaces", "ACLP Logs Datacenter LKE-E"], + "monitors": {"alerts": ["Managed Databases", "NodeBalancers"], "metrics": ["Managed + Databases", "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "172.236.203.9,172.236.203.16,172.236.203.19,172.236.203.15,172.236.203.17,172.236.203.11,172.236.203.18,172.236.203.14,172.236.203.13,172.236.203.12", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "us-sea", "label": "Seattle, WA", "country": - "us", "capabilities": ["Linodes", "Block Storage Encryption", "LA Disk Encryption", - "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", "Object Storage", + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "sg-sin-2", + "label": "Singapore 2, SG", "country": "sg", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes + Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", + "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance + Policy", "Linode Interfaces", "ACLP Logs Datacenter LKE-E"], "monitors": {"alerts": + ["Managed Databases", "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "172.236.129.8,172.236.129.42,172.236.129.41,172.236.129.19,172.236.129.46,172.236.129.23,172.236.129.48,172.236.129.20,172.236.129.21,172.236.129.47", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "jp-tyo-3", + "label": "Tokyo 3, JP", "country": "jp", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes + Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", + "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance + Policy", "Linode Interfaces", "ACLP Logs Datacenter LKE-E"], "monitors": {"alerts": + ["Managed Databases", "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "172.237.4.15,172.237.4.19,172.237.4.17,172.237.4.21,172.237.4.16,172.237.4.18,172.237.4.23,172.237.4.24,172.237.4.20,172.237.4.14", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "de-ber-1", + "label": "Berlin, DE", "country": "de", "capabilities": ["Linodes", "Disk Encryption", + "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", "Maintenance Policy"], + "monitors": {"alerts": [], "metrics": []}, "status": "ok", "resolvers": {"ipv4": + "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": + 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": + "no-osl-1", "label": "Oslo, NO", "country": "no", "capabilities": ["Linodes", + "Block Storage Encryption", "Disk Encryption", "Backups", "NodeBalancers", "Block + Storage", "Object Storage", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", + "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", "Premium + Plans", "Placement Group", "StackScripts", "Maintenance Policy", "Linode Interfaces", + "ACLP Logs Datacenter LKE-E"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "172.238.140.33,172.238.140.25,172.238.140.30,172.238.140.31,172.238.140.26,172.238.140.28,172.238.140.34,172.238.140.32,172.238.140.27,172.238.140.29", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "us-iad-2", + "label": "Washington 2, DC", "country": "us", "capabilities": ["Linodes", "Block + Storage Encryption", "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", + "Object Storage", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", + "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", "Premium Plans", + "Placement Group", "StackScripts", "Maintenance Policy", "Linode Interfaces"], + "monitors": {"alerts": ["Managed Databases", "NodeBalancers"], "metrics": ["Managed + Databases", "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "172.239.142.102,172.239.142.89,172.239.142.92,172.239.142.87,172.239.142.88,172.239.142.103,172.239.142.91,172.239.142.90,172.239.142.86,172.239.142.100", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "fr-par-2", + "label": "Paris 2, FR", "country": "fr", "capabilities": ["Linodes", "Block + Storage Encryption", "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", "GPU Linodes", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", - "VPCs", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", - "StackScripts", "Linode Interfaces"], "status": "ok", "resolvers": {"ipv4": - "172.232.160.19,172.232.160.21,172.232.160.17,172.232.160.15,172.232.160.18,172.232.160.8,172.232.160.12,172.232.160.11,172.232.160.14,172.232.160.16", + "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", "Premium Plans", + "Placement Group", "StackScripts", "Maintenance Policy", "Linode Interfaces", + "ACLP Logs Datacenter LKE-E"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "172.239.11.24,172.239.11.22,172.239.11.17,172.239.11.20,172.239.11.23,172.239.11.19,172.239.11.21,172.239.11.15,172.239.11.16,172.239.11.18", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "us-rno-1", + "label": "Reno, NV", "country": "us", "capabilities": ["Linodes", "Disk Encryption", + "Backups", "NodeBalancers", "GPU Linodes", "Metadata", "Premium Plans", "Placement + Group", "StackScripts", "Maintenance Policy"], "monitors": {"alerts": ["NodeBalancers"], + "metrics": ["NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "", "ipv6": + ""}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "co-bog-2", + "label": "Bogot\u00e1 2, CO", "country": "co", "capabilities": ["Linodes", "Disk + Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", "Maintenance + Policy"], "monitors": {"alerts": [], "metrics": []}, "status": "ok", "resolvers": + {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": + 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": + "fr-mrs-2", "label": "Marseille 2, FR", "country": "fr", "capabilities": ["Linodes", + "Disk Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", + "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": + "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": + 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": + "us-mia", "label": "Miami, FL", "country": "us", "capabilities": ["Linodes", + "Block Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", + "NodeBalancers", "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", + "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", + "Managed Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", + "NETINT Quadra T1U", "Maintenance Policy", "Linode Interfaces"], "monitors": + {"alerts": ["Managed Databases", "NodeBalancers"], "metrics": ["Managed Databases", + "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "172.233.160.34,172.233.160.27,172.233.160.30,172.233.160.29,172.233.160.32,172.233.160.28,172.233.160.33,172.233.160.26,172.233.160.25,172.233.160.31", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "ap-west", + "label": "Mumbai, IN", "country": "in", "capabilities": ["Linodes", "Block Storage + Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "GPU Linodes", "Kubernetes", "Cloud Firewall", "Vlans", "Block + Storage Migrations", "Managed Databases", "Metadata", "Placement Group", "StackScripts", + "Maintenance Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed + Databases", "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "172.105.34.5,172.105.35.5,172.105.36.5,172.105.37.5,172.105.38.5,172.105.39.5,172.105.40.5,172.105.41.5,172.105.42.5,172.105.43.5", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "br-gru", "label": "Sao Paulo, BR", "country": - "br", "capabilities": ["Linodes", "Block Storage Encryption", "LA Disk Encryption", - "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", "Object Storage", - "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "Managed - Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", - "Linode Interfaces"], "status": "ok", "resolvers": {"ipv4": "172.233.0.4,172.233.0.9,172.233.0.7,172.233.0.12,172.233.0.5,172.233.0.13,172.233.0.10,172.233.0.6,172.233.0.8,172.233.0.11", + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "ca-central", + "label": "Toronto, CA", "country": "ca", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "GPU Linodes", "Kubernetes", "Cloud Firewall", "Vlans", "Block + Storage Migrations", "Managed Databases", "Metadata", "Placement Group", "StackScripts", + "Maintenance Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed + Databases", "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "172.105.0.5,172.105.3.5,172.105.4.5,172.105.5.5,172.105.6.5,172.105.7.5,172.105.8.5,172.105.9.5,172.105.10.5,172.105.11.5", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "nl-ams", "label": "Amsterdam, NL", "country": - "nl", "capabilities": ["Linodes", "Block Storage Encryption", "LA Disk Encryption", - "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", "Object Storage", - "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "Managed - Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", - "Linode Interfaces"], "status": "ok", "resolvers": {"ipv4": "172.233.33.36,172.233.33.38,172.233.33.35,172.233.33.39,172.233.33.34,172.233.33.33,172.233.33.31,172.233.33.30,172.233.33.37,172.233.33.32", + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "ap-southeast", + "label": "Sydney, AU", "country": "au", "capabilities": ["Linodes", "Block Storage + Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", + "Managed Databases", "Metadata", "Placement Group", "StackScripts", "Maintenance + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "172.105.166.5,172.105.169.5,172.105.168.5,172.105.172.5,172.105.162.5,172.105.170.5,172.105.167.5,172.105.171.5,172.105.181.5,172.105.161.5", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "se-sto", "label": "Stockholm, SE", "country": - "se", "capabilities": ["Linodes", "Block Storage Encryption", "LA Disk Encryption", - "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", "Object Storage", - "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "Managed - Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", - "Linode Interfaces"], "status": "ok", "resolvers": {"ipv4": "172.232.128.24,172.232.128.26,172.232.128.20,172.232.128.22,172.232.128.25,172.232.128.19,172.232.128.23,172.232.128.18,172.232.128.21,172.232.128.27", + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "us-iad", + "label": "Washington, DC", "country": "us", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "Kubernetes", "Kubernetes Enterprise", "Cloud + Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", + "Premium Plans", "Placement Group", "StackScripts", "Maintenance Policy", "Linode + Interfaces", "ACLP Logs Datacenter LKE-E"], "monitors": {"alerts": ["Managed + Databases", "NodeBalancers"], "metrics": ["Linodes", "Managed Databases", "NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "139.144.192.62,139.144.192.60,139.144.192.61,139.144.192.53,139.144.192.54,139.144.192.67,139.144.192.69,139.144.192.66,139.144.192.52,139.144.192.68", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "es-mad", "label": "Madrid, ES", "country": - "es", "capabilities": ["Linodes", "Block Storage Encryption", "LA Disk Encryption", - "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", "Object Storage", - "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "Managed - Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", - "Linode Interfaces"], "status": "ok", "resolvers": {"ipv4": "172.233.111.6,172.233.111.17,172.233.111.21,172.233.111.25,172.233.111.19,172.233.111.12,172.233.111.26,172.233.111.16,172.233.111.18,172.233.111.9", + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "us-ord", + "label": "Chicago, IL", "country": "us", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes + Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", + "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance + Policy", "Linode Interfaces", "ACLP Logs Datacenter LKE-E"], "monitors": {"alerts": + ["Managed Databases", "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "172.232.0.17,172.232.0.16,172.232.0.21,172.232.0.13,172.232.0.22,172.232.0.9,172.232.0.19,172.232.0.20,172.232.0.15,172.232.0.18", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "in-maa", "label": "Chennai, IN", "country": - "in", "capabilities": ["Linodes", "Block Storage Encryption", "LA Disk Encryption", - "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", "Object Storage", - "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "Managed - Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", - "NETINT Quadra T1U", "Linode Interfaces"], "status": "ok", "resolvers": {"ipv4": - "172.232.96.17,172.232.96.26,172.232.96.19,172.232.96.20,172.232.96.25,172.232.96.21,172.232.96.18,172.232.96.22,172.232.96.23,172.232.96.24", + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "fr-par", + "label": "Paris, FR", "country": "fr", "capabilities": ["Linodes", "Block Storage + Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes + Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", + "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "172.232.32.21,172.232.32.23,172.232.32.17,172.232.32.18,172.232.32.16,172.232.32.22,172.232.32.20,172.232.32.14,172.232.32.11,172.232.32.12", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "jp-osa", "label": "Osaka, JP", "country": - "jp", "capabilities": ["Linodes", "Block Storage Encryption", "LA Disk Encryption", - "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", "Object Storage", - "GPU Linodes", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", - "VPCs", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", - "StackScripts", "Linode Interfaces"], "status": "ok", "resolvers": {"ipv4": - "172.233.64.44,172.233.64.43,172.233.64.37,172.233.64.40,172.233.64.46,172.233.64.41,172.233.64.39,172.233.64.42,172.233.64.45,172.233.64.38", + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "us-sea", + "label": "Seattle, WA", "country": "us", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes + Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", + "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance + Policy", "Linode Interfaces", "ACLP Logs Datacenter LKE-E"], "monitors": {"alerts": + ["Managed Databases", "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "172.232.160.19,172.232.160.21,172.232.160.17,172.232.160.15,172.232.160.18,172.232.160.8,172.232.160.12,172.232.160.11,172.232.160.14,172.232.160.16", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "it-mil", "label": "Milan, IT", "country": - "it", "capabilities": ["Linodes", "Block Storage Encryption", "LA Disk Encryption", - "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", "Object Storage", - "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "Managed - Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", - "Linode Interfaces"], "status": "ok", "resolvers": {"ipv4": "172.232.192.19,172.232.192.18,172.232.192.16,172.232.192.20,172.232.192.24,172.232.192.21,172.232.192.22,172.232.192.17,172.232.192.15,172.232.192.23", + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "br-gru", + "label": "Sao Paulo, BR", "country": "br", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "Kubernetes", "Kubernetes Enterprise", "Cloud + Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", + "Premium Plans", "Placement Group", "StackScripts", "Maintenance Policy", "Linode + Interfaces"], "monitors": {"alerts": ["Managed Databases", "NodeBalancers"], + "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": + {"ipv4": "172.233.0.4,172.233.0.9,172.233.0.7,172.233.0.12,172.233.0.5,172.233.0.13,172.233.0.10,172.233.0.6,172.233.0.8,172.233.0.11", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "us-mia", "label": "Miami, FL", "country": - "us", "capabilities": ["Linodes", "Block Storage Encryption", "LA Disk Encryption", - "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", "Object Storage", - "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "Managed - Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", - "NETINT Quadra T1U", "Linode Interfaces"], "status": "ok", "resolvers": {"ipv4": - "172.233.160.34,172.233.160.27,172.233.160.30,172.233.160.29,172.233.160.32,172.233.160.28,172.233.160.33,172.233.160.26,172.233.160.25,172.233.160.31", + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "nl-ams", + "label": "Amsterdam, NL", "country": "nl", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes + Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", + "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "172.233.33.36,172.233.33.38,172.233.33.35,172.233.33.39,172.233.33.34,172.233.33.33,172.233.33.31,172.233.33.30,172.233.33.37,172.233.33.32", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "id-cgk", "label": "Jakarta, ID", "country": - "id", "capabilities": ["Linodes", "Block Storage Encryption", "LA Disk Encryption", - "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", "Object Storage", - "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "Managed - Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", - "Linode Interfaces"], "status": "ok", "resolvers": {"ipv4": "172.232.224.23,172.232.224.32,172.232.224.26,172.232.224.27,172.232.224.21,172.232.224.24,172.232.224.22,172.232.224.20,172.232.224.31,172.232.224.28", + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "se-sto", + "label": "Stockholm, SE", "country": "se", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes + Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", + "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "172.232.128.24,172.232.128.26,172.232.128.20,172.232.128.22,172.232.128.25,172.232.128.19,172.232.128.23,172.232.128.18,172.232.128.21,172.232.128.27", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "us-lax", "label": "Los Angeles, CA", "country": - "us", "capabilities": ["Linodes", "Block Storage Encryption", "LA Disk Encryption", - "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", "Object Storage", - "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "Managed - Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", - "NETINT Quadra T1U", "Linode Interfaces"], "status": "ok", "resolvers": {"ipv4": - "172.233.128.45,172.233.128.38,172.233.128.53,172.233.128.37,172.233.128.34,172.233.128.36,172.233.128.33,172.233.128.39,172.233.128.43,172.233.128.44", + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "es-mad", + "label": "Madrid, ES", "country": "es", "capabilities": ["Linodes", "Block Storage + Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes + Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", + "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "172.233.111.6,172.233.111.17,172.233.111.21,172.233.111.25,172.233.111.19,172.233.111.12,172.233.111.26,172.233.111.16,172.233.111.18,172.233.111.9", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "nz-akl-1", "label": "Auckland, NZ", "country": - "nz", "capabilities": ["Linodes", "Disk Encryption", "Cloud Firewall", "Vlans", - "VPCs", "Metadata", "Distributed Plans"], "status": "ok", "resolvers": {"ipv4": - "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": - 0}, "site_type": "distributed"}, {"id": "us-den-1", "label": "Denver, CO", "country": - "us", "capabilities": ["Linodes", "Disk Encryption", "Cloud Firewall", "Vlans", - "VPCs", "Metadata", "Distributed Plans"], "status": "ok", "resolvers": {"ipv4": - "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": - 0}, "site_type": "distributed"}, {"id": "de-ham-1", "label": "Hamburg, DE", - "country": "de", "capabilities": ["Linodes", "Disk Encryption", "Cloud Firewall", - "Vlans", "VPCs", "Metadata", "Distributed Plans"], "status": "ok", "resolvers": - {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": - 0}, "site_type": "distributed"}, {"id": "fr-mrs-1", "label": "Marseille, FR", - "country": "fr", "capabilities": ["Linodes", "Disk Encryption", "Cloud Firewall", - "Vlans", "VPCs", "Metadata", "Distributed Plans"], "status": "ok", "resolvers": - {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": - 0}, "site_type": "distributed"}, {"id": "za-jnb-1", "label": "Johannesburg, - ZA", "country": "za", "capabilities": ["Linodes", "Disk Encryption", "Cloud - Firewall", "Vlans", "VPCs", "Metadata", "Distributed Plans"], "status": "ok", - "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": - 0}, "site_type": "distributed"}, {"id": "my-kul-1", "label": "Kuala Lumpur, - MY", "country": "my", "capabilities": ["Linodes", "Disk Encryption", "Cloud - Firewall", "Vlans", "VPCs", "Metadata", "Distributed Plans"], "status": "ok", - "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": - 0}, "site_type": "distributed"}, {"id": "co-bog-1", "label": "Bogot\u00e1, CO", - "country": "co", "capabilities": ["Linodes", "Disk Encryption", "Cloud Firewall", - "Vlans", "VPCs", "Metadata", "Distributed Plans"], "status": "ok", "resolvers": - {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": - 0}, "site_type": "distributed"}, {"id": "mx-qro-1", "label": "Quer\u00e9taro, - MX", "country": "mx", "capabilities": ["Linodes", "Disk Encryption", "Cloud - Firewall", "Vlans", "VPCs", "Metadata", "Distributed Plans"], "status": "ok", - "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": - 0}, "site_type": "distributed"}, {"id": "us-hou-1", "label": "Houston, TX", - "country": "us", "capabilities": ["Linodes", "Disk Encryption", "Cloud Firewall", - "Vlans", "VPCs", "Metadata", "Distributed Plans"], "status": "ok", "resolvers": - {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": - 0}, "site_type": "distributed"}, {"id": "cl-scl-1", "label": "Santiago, CL", - "country": "cl", "capabilities": ["Linodes", "Disk Encryption", "Cloud Firewall", - "Vlans", "VPCs", "Metadata", "Distributed Plans"], "status": "ok", "resolvers": - {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": - 0}, "site_type": "distributed"}, {"id": "gb-lon", "label": "London 2, UK", "country": - "gb", "capabilities": ["Linodes", "Block Storage Encryption", "LA Disk Encryption", - "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", "Object Storage", - "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "Managed - Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", - "Linode Interfaces"], "status": "ok", "resolvers": {"ipv4": "172.236.0.46,172.236.0.50,172.236.0.47,172.236.0.53,172.236.0.52,172.236.0.45,172.236.0.49,172.236.0.51,172.236.0.54,172.236.0.48", - "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "au-mel", "label": "Melbourne, AU", "country": - "au", "capabilities": ["Linodes", "Block Storage Encryption", "LA Disk Encryption", - "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", "Object Storage", - "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "Managed - Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", - "NETINT Quadra T1U", "Linode Interfaces"], "status": "ok", "resolvers": {"ipv4": - "172.236.32.23,172.236.32.35,172.236.32.30,172.236.32.28,172.236.32.32,172.236.32.33,172.236.32.27,172.236.32.37,172.236.32.29,172.236.32.34", - "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "in-bom-2", "label": "Mumbai 2, IN", "country": - "in", "capabilities": ["Linodes", "Block Storage Encryption", "LA Disk Encryption", - "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", "GPU Linodes", - "Cloud Firewall", "Vlans", "VPCs", "Metadata", "Premium Plans", "Placement Group", - "StackScripts", "Linode Interfaces"], "status": "ok", "resolvers": {"ipv4": - "172.236.171.41,172.236.171.42,172.236.171.25,172.236.171.44,172.236.171.26,172.236.171.45,172.236.171.24,172.236.171.43,172.236.171.27,172.236.171.28", - "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "de-fra-2", "label": "Frankfurt 2, DE", "country": - "de", "capabilities": ["Linodes", "Block Storage Encryption", "LA Disk Encryption", - "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", "GPU Linodes", - "Kubernetes", "Cloud Firewall", "Vlans", "VPCs", "Metadata", "Premium Plans", - "Placement Group", "StackScripts", "NETINT Quadra T1U", "Linode Interfaces"], - "status": "ok", "resolvers": {"ipv4": "172.236.203.9,172.236.203.16,172.236.203.19,172.236.203.15,172.236.203.17,172.236.203.11,172.236.203.18,172.236.203.14,172.236.203.13,172.236.203.12", - "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "sg-sin-2", "label": "Singapore 2, SG", "country": - "sg", "capabilities": ["Linodes", "Block Storage Encryption", "LA Disk Encryption", - "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", "Object Storage", - "GPU Linodes", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", - "VPCs", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", - "StackScripts", "Linode Interfaces"], "status": "ok", "resolvers": {"ipv4": - "172.236.129.8,172.236.129.42,172.236.129.41,172.236.129.19,172.236.129.46,172.236.129.23,172.236.129.48,172.236.129.20,172.236.129.21,172.236.129.47", + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "in-maa", + "label": "Chennai, IN", "country": "in", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes + Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", + "Metadata", "Premium Plans", "Placement Group", "StackScripts", "NETINT Quadra + T1U", "Maintenance Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed + Databases", "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "172.232.96.17,172.232.96.26,172.232.96.19,172.232.96.20,172.232.96.25,172.232.96.21,172.232.96.18,172.232.96.22,172.232.96.23,172.232.96.24", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "jp-tyo-3", "label": "Tokyo 3, JP", "country": - "jp", "capabilities": ["Linodes", "Block Storage Encryption", "LA Disk Encryption", - "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", "Object Storage", - "Kubernetes", "Cloud Firewall", "Vlans", "VPCs", "Metadata", "Premium Plans", - "Placement Group", "StackScripts", "Linode Interfaces"], "status": "ok", "resolvers": - {"ipv4": "172.237.4.15,172.237.4.19,172.237.4.17,172.237.4.21,172.237.4.16,172.237.4.18,172.237.4.23,172.237.4.24,172.237.4.20,172.237.4.14", + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "jp-osa", + "label": "Osaka, JP", "country": "jp", "capabilities": ["Linodes", "Block Storage + Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes + Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", + "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "172.233.64.44,172.233.64.43,172.233.64.37,172.233.64.40,172.233.64.46,172.233.64.41,172.233.64.39,172.233.64.42,172.233.64.45,172.233.64.38", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "de-ber-1", "label": "Berlin, DE", "country": - "de", "capabilities": ["Linodes", "Disk Encryption", "Cloud Firewall", "Vlans", - "VPCs", "Metadata", "Distributed Plans"], "status": "ok", "resolvers": {"ipv4": - "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": - 0}, "site_type": "distributed"}, {"id": "us-central", "label": "Dallas, TX", - "country": "us", "capabilities": ["Linodes", "LA Disk Encryption", "Disk Encryption", - "Backups", "NodeBalancers", "Block Storage", "Kubernetes", "Cloud Firewall", - "Vlans", "Block Storage Migrations", "Managed Databases", "Metadata", "Placement - Group", "StackScripts", "Linode Interfaces"], "status": "ok", "resolvers": {"ipv4": - "72.14.179.5,72.14.188.5,173.255.199.5,66.228.53.5,96.126.122.5,96.126.124.5,96.126.127.5,198.58.107.5,198.58.111.5,23.239.24.5", + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "it-mil", + "label": "Milan, IT", "country": "it", "capabilities": ["Linodes", "Block Storage + Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes + Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", + "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "172.232.192.19,172.232.192.18,172.232.192.16,172.232.192.20,172.232.192.24,172.232.192.21,172.232.192.22,172.232.192.17,172.232.192.15,172.232.192.23", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "us-west", "label": "Fremont, CA", "country": - "us", "capabilities": ["Linodes", "Block Storage Encryption", "LA Disk Encryption", - "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", "Kubernetes", - "Cloud Firewall", "Vlans", "Block Storage Migrations", "Managed Databases", - "Metadata", "Placement Group", "StackScripts", "Linode Interfaces"], "status": - "ok", "resolvers": {"ipv4": "173.230.145.5, 173.230.147.5, 173.230.155.5, 173.255.212.5, - 173.255.219.5, 173.255.241.5, 173.255.243.5, 173.255.244.5, 74.207.241.5, 74.207.242.5", - "ipv6": "1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678"}, "placement_group_limits": - {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5}, "site_type": - "core"}, {"id": "us-southeast", "label": "Atlanta, GA", "country": "us", "capabilities": - ["Linodes", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "us-central", + "label": "Dallas, TX", "country": "us", "capabilities": ["Linodes", "Block Storage + Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", + "Managed Databases", "Metadata", "Placement Group", "StackScripts", "Maintenance + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "72.14.179.5,72.14.188.5,173.255.199.5,66.228.53.5,96.126.122.5,96.126.124.5,96.126.127.5,198.58.107.5,198.58.111.5,23.239.24.5", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "ap-northeast", + "label": "Tokyo 2, JP", "country": "jp", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", + "Managed Databases", "Metadata", "Placement Group", "StackScripts", "Maintenance + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "139.162.66.5,139.162.67.5,139.162.68.5,139.162.69.5,139.162.70.5,139.162.71.5,139.162.72.5,139.162.73.5,139.162.74.5,139.162.75.5", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "eu-central", + "label": "Frankfurt, DE", "country": "de", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", "Managed Databases", "Metadata", "Placement - Group", "StackScripts", "Linode Interfaces"], "status": "ok", "resolvers": {"ipv4": - "74.207.231.5,173.230.128.5,173.230.129.5,173.230.136.5,173.230.140.5,66.228.59.5,66.228.62.5,50.116.35.5,50.116.41.5,23.239.18.5", + Group", "StackScripts", "Maintenance Policy", "Linode Interfaces"], "monitors": + {"alerts": ["Managed Databases", "NodeBalancers"], "metrics": ["Managed Databases", + "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "139.162.130.5,139.162.131.5,139.162.132.5,139.162.133.5,139.162.134.5,139.162.135.5,139.162.136.5,139.162.137.5,139.162.138.5,139.162.139.5", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "us-east", "label": "Newark, NJ", "country": - "us", "capabilities": ["Linodes", "LA Disk Encryption", "Disk Encryption", "Backups", - "NodeBalancers", "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", - "Cloud Firewall", "Vlans", "Block Storage Migrations", "Managed Databases", - "Metadata", "Placement Group", "StackScripts", "Linode Interfaces"], "status": - "ok", "resolvers": {"ipv4": "66.228.42.5,96.126.106.5,50.116.53.5,50.116.58.5,50.116.61.5,50.116.62.5,66.175.211.5,97.107.133.4,173.255.225.5,66.228.35.5", - "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "eu-west", "label": "London, UK", "country": - "gb", "capabilities": ["Linodes", "LA Disk Encryption", "Disk Encryption", "Backups", - "NodeBalancers", "Block Storage", "Kubernetes", "Cloud Firewall", "Vlans", "Block - Storage Migrations", "Metadata", "Placement Group", "StackScripts", "Linode - Interfaces"], "status": "ok", "resolvers": {"ipv4": "178.79.182.5, 176.58.107.5, - 176.58.116.5, 176.58.121.5, 151.236.220.5, 212.71.252.5, 212.71.253.5, 109.74.192.20, - 109.74.193.20, 109.74.194.20", "ipv6": "1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678, - 1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, - "maximum_linodes_per_pg": 5}, "site_type": "core"}, {"id": "ap-south", "label": - "Singapore, SG", "country": "sg", "capabilities": ["Linodes", "LA Disk Encryption", - "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", "Object Storage", - "GPU Linodes", "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", - "Metadata", "Placement Group", "StackScripts", "Linode Interfaces"], "status": - "ok", "resolvers": {"ipv4": "139.162.11.5,139.162.13.5,139.162.14.5,139.162.15.5,139.162.16.5,139.162.21.5,139.162.27.5,103.3.60.18,103.3.60.19,103.3.60.20", - "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "eu-central", "label": "Frankfurt, DE", "country": - "de", "capabilities": ["Linodes", "LA Disk Encryption", "Disk Encryption", "Backups", - "NodeBalancers", "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", - "Cloud Firewall", "Vlans", "Block Storage Migrations", "Managed Databases", - "Metadata", "Placement Group", "StackScripts", "Linode Interfaces"], "status": - "ok", "resolvers": {"ipv4": "139.162.130.5,139.162.131.5,139.162.132.5,139.162.133.5,139.162.134.5,139.162.135.5,139.162.136.5,139.162.137.5,139.162.138.5,139.162.139.5", + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "ap-south", + "label": "Singapore, SG", "country": "sg", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Cloud Firewall", + "Vlans", "Block Storage Migrations", "Metadata", "Placement Group", "StackScripts", + "Maintenance Policy", "Linode Interfaces"], "monitors": {"alerts": ["NodeBalancers"], + "metrics": ["NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "139.162.11.5,139.162.13.5,139.162.14.5,139.162.15.5,139.162.16.5,139.162.21.5,139.162.27.5,103.3.60.18,103.3.60.19,103.3.60.20", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "ap-northeast", "label": "Tokyo 2, JP", "country": - "jp", "capabilities": ["Linodes", "LA Disk Encryption", "Disk Encryption", "Backups", - "NodeBalancers", "Block Storage", "Kubernetes", "Cloud Firewall", "Vlans", "Block - Storage Migrations", "Managed Databases", "Metadata", "Placement Group", "StackScripts", - "Linode Interfaces"], "status": "ok", "resolvers": {"ipv4": "139.162.66.5,139.162.67.5,139.162.68.5,139.162.69.5,139.162.70.5,139.162.71.5,139.162.72.5,139.162.73.5,139.162.74.5,139.162.75.5", + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "eu-west", + "label": "London, UK", "country": "gb", "capabilities": ["Linodes", "Block Storage + Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", + "Metadata", "Placement Group", "StackScripts", "Maintenance Policy", "Linode + Interfaces"], "monitors": {"alerts": ["NodeBalancers"], "metrics": ["NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "178.79.182.5, 176.58.107.5, 176.58.116.5, + 176.58.121.5, 151.236.220.5, 212.71.252.5, 212.71.253.5, 109.74.192.20, 109.74.193.20, + 109.74.194.20", "ipv6": "1234::5678, 1234::5678, 1234::5678, 1234::5678, + 1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "us-east", + "label": "Newark, NJ", "country": "us", "capabilities": ["Linodes", "Block Storage + Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Cloud Firewall", + "Vlans", "Block Storage Migrations", "Managed Databases", "Metadata", "Placement + Group", "StackScripts", "Maintenance Policy", "Linode Interfaces"], "monitors": + {"alerts": ["Managed Databases", "NodeBalancers"], "metrics": ["Managed Databases", + "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "66.228.42.5,96.126.106.5,50.116.53.5,50.116.58.5,50.116.61.5,50.116.62.5,66.175.211.5,97.107.133.4,173.255.225.5,66.228.35.5", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "us-southeast", + "label": "Atlanta, GA", "country": "us", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Cloud Firewall", + "Vlans", "Block Storage Migrations", "Managed Databases", "Metadata", "Placement + Group", "StackScripts", "Maintenance Policy", "Linode Interfaces"], "monitors": + {"alerts": ["Managed Databases", "NodeBalancers"], "metrics": ["Managed Databases", + "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "74.207.231.5,173.230.128.5,173.230.129.5,173.230.136.5,173.230.140.5,66.228.59.5,66.228.62.5,50.116.35.5,50.116.41.5,23.239.18.5", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}], "page": 1, "pages": 1, "results": 42}' + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "us-west", + "label": "Fremont, CA", "country": "us", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", + "Managed Databases", "Metadata", "Placement Group", "StackScripts", "Maintenance + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "173.230.145.5, 173.230.147.5, 173.230.155.5, 173.255.212.5, + 173.255.219.5, 173.255.241.5, 173.255.243.5, 173.255.244.5, 74.207.241.5, 74.207.242.5", + "ipv6": "1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678, + 1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678"}, "placement_group_limits": + {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": + 5}, "site_type": "core"}], "page": 1, "pages": 1, "results": 47}' headers: Access-Control-Allow-Credentials: - "true" @@ -348,7 +479,7 @@ interactions: Content-Type: - application/json Expires: - - Mon, 12 May 2025 19:03:38 GMT + - Wed, 06 May 2026 16:18:35 GMT Pragma: - no-cache Strict-Transport-Security: @@ -367,14 +498,75 @@ interactions: X-Oauth-Scopes: - '*' X-Ratelimit-Limit: - - "1600" + - "1840" + X-Xss-Protection: + - 1; mode=block + status: 200 OK + code: 200 + duration: "" +- request: + body: "" + form: {} + headers: + Accept: + - application/json + Content-Type: + - application/json + User-Agent: + - linodego/dev https://github.com/linode/linodego + url: https://api.linode.com/v4beta/lke/tiers/standard/versions?page=1 + method: GET + response: + body: '{"data": [{"id": "1.35", "tier": "standard"}, {"id": "1.34", "tier": "standard"}], + "page": 1, "pages": 1, "results": 2}' + headers: + Access-Control-Allow-Credentials: + - "true" + Access-Control-Allow-Headers: + - Authorization, Origin, X-Requested-With, Content-Type, Accept, X-Filter + Access-Control-Allow-Methods: + - HEAD, GET, OPTIONS, POST, PUT, DELETE + Access-Control-Allow-Origin: + - '*' + Access-Control-Expose-Headers: + - X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Status + Akamai-Internal-Account: + - '*' + Cache-Control: + - max-age=0, no-cache, no-store + Connection: + - keep-alive + Content-Length: + - "119" + Content-Security-Policy: + - default-src 'none' + Content-Type: + - application/json + Expires: + - Wed, 06 May 2026 16:18:35 GMT + Pragma: + - no-cache + Strict-Transport-Security: + - max-age=31536000 + Vary: + - Authorization, X-Filter + - Authorization, X-Filter + X-Accepted-Oauth-Scopes: + - lke:read_only + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - DENY + - DENY + X-Oauth-Scopes: + - '*' X-Xss-Protection: - 1; mode=block status: 200 OK code: 200 duration: "" - request: - body: '{"node_pools":[{"count":1,"type":"g6-standard-2","disks":null,"tags":["test"],"labels":null,"taints":null}],"label":"go-lke-test-update","region":"ap-west","k8s_version":"1.31","tags":["testing"],"tier":"standard"}' + body: '{"node_pools":[{"count":1,"type":"g6-standard-2","disks":null,"tags":["test"],"labels":null,"taints":null}],"label":"go-lke-test-update","region":"au-mel","k8s_version":"1.35","tags":["testing"],"tier":"standard"}' form: {} headers: Accept: @@ -386,10 +578,10 @@ interactions: url: https://api.linode.com/v4beta/lke/clusters method: POST response: - body: '{"id": 433100, "status": "ready", "created": "2018-01-02T03:04:05", "updated": - "2018-01-02T03:04:05", "label": "go-lke-test-update", "region": "ap-west", "k8s_version": - "1.31", "tier": "standard", "control_plane": {"high_availability": false}, "apl_enabled": - false, "tags": ["testing"]}' + body: '{"id": 600522, "status": "ready", "created": "2018-01-02T03:04:05", "updated": + "2018-01-02T03:04:05", "label": "go-lke-test-update", "region": "au-mel", "k8s_version": + "1.35", "tier": "standard", "control_plane": {"high_availability": false}, "apl_enabled": + false, "tags": ["testing"], "locks": []}' headers: Access-Control-Allow-Credentials: - "true" @@ -408,13 +600,13 @@ interactions: Connection: - keep-alive Content-Length: - - "286" + - "298" Content-Security-Policy: - default-src 'none' Content-Type: - application/json Expires: - - Mon, 12 May 2025 19:03:49 GMT + - Wed, 06 May 2026 16:18:42 GMT Pragma: - no-cache Strict-Transport-Security: @@ -431,14 +623,14 @@ interactions: X-Oauth-Scopes: - '*' X-Ratelimit-Limit: - - "1600" + - "1840" X-Xss-Protection: - 1; mode=block status: 200 OK code: 200 duration: "" - request: - body: '{"k8s_version":"1.32","label":"go-lke-test-update-updated","tags":["test=true"]}' + body: '{"label":"go-lke-test-update-updated","tags":["test=true"]}' form: {} headers: Accept: @@ -447,13 +639,13 @@ interactions: - application/json User-Agent: - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/lke/clusters/433100 + url: https://api.linode.com/v4beta/lke/clusters/600522 method: PUT response: - body: '{"id": 433100, "status": "ready", "created": "2018-01-02T03:04:05", "updated": - "2018-01-02T03:04:05", "label": "go-lke-test-update-updated", "region": "ap-west", - "k8s_version": "1.32", "tier": "standard", "control_plane": {"high_availability": - false}, "apl_enabled": false, "tags": ["test=true"]}' + body: '{"id": 600522, "status": "ready", "created": "2018-01-02T03:04:05", "updated": + "2018-01-02T03:04:05", "label": "go-lke-test-update-updated", "region": "au-mel", + "k8s_version": "1.35", "tier": "standard", "control_plane": {"high_availability": + false}, "apl_enabled": false, "tags": ["test=true"], "locks": []}' headers: Access-Control-Allow-Credentials: - "true" @@ -472,13 +664,13 @@ interactions: Connection: - keep-alive Content-Length: - - "296" + - "308" Content-Security-Policy: - default-src 'none' Content-Type: - application/json Expires: - - Mon, 12 May 2025 19:03:52 GMT + - Wed, 06 May 2026 16:18:42 GMT Pragma: - no-cache Strict-Transport-Security: @@ -495,7 +687,7 @@ interactions: X-Oauth-Scopes: - '*' X-Ratelimit-Limit: - - "1600" + - "1840" X-Xss-Protection: - 1; mode=block status: 200 OK @@ -511,13 +703,13 @@ interactions: - application/json User-Agent: - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/lke/clusters/433100 + url: https://api.linode.com/v4beta/lke/clusters/600522 method: PUT response: - body: '{"id": 433100, "status": "ready", "created": "2018-01-02T03:04:05", "updated": - "2018-01-02T03:04:05", "label": "go-lke-test-update-updated", "region": "ap-west", - "k8s_version": "1.32", "tier": "standard", "control_plane": {"high_availability": - true}, "apl_enabled": false, "tags": ["test=true"]}' + body: '{"id": 600522, "status": "ready", "created": "2018-01-02T03:04:05", "updated": + "2018-01-02T03:04:05", "label": "go-lke-test-update-updated", "region": "au-mel", + "k8s_version": "1.35", "tier": "standard", "control_plane": {"high_availability": + true}, "apl_enabled": false, "tags": ["test=true"], "locks": []}' headers: Access-Control-Allow-Credentials: - "true" @@ -536,13 +728,13 @@ interactions: Connection: - keep-alive Content-Length: - - "295" + - "307" Content-Security-Policy: - default-src 'none' Content-Type: - application/json Expires: - - Mon, 12 May 2025 19:03:55 GMT + - Wed, 06 May 2026 16:18:45 GMT Pragma: - no-cache Strict-Transport-Security: @@ -559,7 +751,7 @@ interactions: X-Oauth-Scopes: - '*' X-Ratelimit-Limit: - - "400" + - "1840" X-Xss-Protection: - 1; mode=block status: 200 OK @@ -575,7 +767,7 @@ interactions: - application/json User-Agent: - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/lke/clusters/433100 + url: https://api.linode.com/v4beta/lke/clusters/600522 method: DELETE response: body: '{}' @@ -603,7 +795,7 @@ interactions: Content-Type: - application/json Expires: - - Mon, 12 May 2025 19:03:59 GMT + - Wed, 06 May 2026 16:18:49 GMT Pragma: - no-cache Strict-Transport-Security: @@ -620,7 +812,7 @@ interactions: X-Oauth-Scopes: - '*' X-Ratelimit-Limit: - - "1600" + - "1840" X-Xss-Protection: - 1; mode=block status: 200 OK diff --git a/test/integration/fixtures/TestLKECluster_withACL.yaml b/test/integration/fixtures/TestLKECluster_withACL.yaml index 764a93201..29b2d65bb 100644 --- a/test/integration/fixtures/TestLKECluster_withACL.yaml +++ b/test/integration/fixtures/TestLKECluster_withACL.yaml @@ -14,318 +14,449 @@ interactions: url: https://api.linode.com/v4beta/regions?page=1 method: GET response: - body: '{"data": [{"id": "ap-west", "label": "Mumbai, IN", "country": "in", "capabilities": - ["Linodes", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", - "Block Storage", "GPU Linodes", "Kubernetes", "Cloud Firewall", "Vlans", "Block - Storage Migrations", "Managed Databases", "Metadata", "Placement Group", "StackScripts", - "Linode Interfaces"], "status": "ok", "resolvers": {"ipv4": "172.105.34.5,172.105.35.5,172.105.36.5,172.105.37.5,172.105.38.5,172.105.39.5,172.105.40.5,172.105.41.5,172.105.42.5,172.105.43.5", + body: '{"data": [{"id": "au-mel", "label": "Melbourne, AU", "country": "au", "capabilities": + ["Linodes", "Block Storage Encryption", "LA Disk Encryption", "Disk Encryption", + "Backups", "NodeBalancers", "Block Storage", "Object Storage", "Kubernetes", + "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", + "Premium Plans", "Placement Group", "StackScripts", "Maintenance Policy", "Linode + Interfaces"], "monitors": {"alerts": ["Managed Databases", "NodeBalancers"], + "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": + {"ipv4": "172.236.32.23,172.236.32.35,172.236.32.30,172.236.32.28,172.236.32.32,172.236.32.33,172.236.32.27,172.236.32.37,172.236.32.29,172.236.32.34", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "ca-central", "label": "Toronto, CA", "country": - "ca", "capabilities": ["Linodes", "LA Disk Encryption", "Disk Encryption", "Backups", - "NodeBalancers", "Block Storage", "Kubernetes", "Cloud Firewall", "Vlans", "Block - Storage Migrations", "Managed Databases", "Metadata", "Placement Group", "StackScripts", - "Linode Interfaces"], "status": "ok", "resolvers": {"ipv4": "172.105.0.5,172.105.3.5,172.105.4.5,172.105.5.5,172.105.6.5,172.105.7.5,172.105.8.5,172.105.9.5,172.105.10.5,172.105.11.5", + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "us-lax", + "label": "Los Angeles, CA", "country": "us", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes + Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", + "Metadata", "Premium Plans", "Placement Group", "StackScripts", "NETINT Quadra + T1U", "Maintenance Policy", "Linode Interfaces", "ACLP Logs Datacenter LKE-E"], + "monitors": {"alerts": ["Managed Databases", "NodeBalancers"], "metrics": ["Managed + Databases", "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "172.233.128.45,172.233.128.38,172.233.128.53,172.233.128.37,172.233.128.34,172.233.128.36,172.233.128.33,172.233.128.39,172.233.128.43,172.233.128.44", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "ap-southeast", "label": "Sydney, AU", "country": - "au", "capabilities": ["Linodes", "LA Disk Encryption", "Disk Encryption", "Backups", - "NodeBalancers", "Block Storage", "Kubernetes", "Cloud Firewall", "Vlans", "Block - Storage Migrations", "Managed Databases", "Metadata", "Placement Group", "StackScripts", - "Linode Interfaces"], "status": "ok", "resolvers": {"ipv4": "172.105.166.5,172.105.169.5,172.105.168.5,172.105.172.5,172.105.162.5,172.105.170.5,172.105.167.5,172.105.171.5,172.105.181.5,172.105.161.5", + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "nz-akl-1", + "label": "Auckland, NZ", "country": "nz", "capabilities": ["Linodes", "Disk + Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", "Maintenance + Policy"], "monitors": {"alerts": [], "metrics": []}, "status": "ok", "resolvers": + {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": + 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": + "us-den-1", "label": "Denver, CO", "country": "us", "capabilities": ["Linodes", + "Disk Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", + "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": + "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": + 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": + "de-ham-1", "label": "Hamburg, DE", "country": "de", "capabilities": ["Linodes", + "Disk Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", + "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": + "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": + 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": + "za-jnb-1", "label": "Johannesburg, ZA", "country": "za", "capabilities": ["Linodes", + "Disk Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", + "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": + "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": + 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": + "my-kul-1", "label": "Kuala Lumpur, MY", "country": "my", "capabilities": ["Linodes", + "Disk Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", + "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": + "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": + 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": + "co-bog-1", "label": "Bogot\u00e1, CO", "country": "co", "capabilities": ["Linodes", + "Disk Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", + "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": + "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": + 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": + "mx-qro-1", "label": "Quer\u00e9taro, MX", "country": "mx", "capabilities": + ["Linodes", "Disk Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed + Plans", "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": + "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": + 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": + "us-hou-1", "label": "Houston, TX", "country": "us", "capabilities": ["Linodes", + "Disk Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", + "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": + "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": + 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": + "cl-scl-1", "label": "Santiago, CL", "country": "cl", "capabilities": ["Linodes", + "Disk Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", + "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": + "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": + 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": + "gb-lon", "label": "London 2, UK", "country": "gb", "capabilities": ["Linodes", + "Block Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", + "NodeBalancers", "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", + "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", + "Managed Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", + "NETINT Quadra T1U", "Maintenance Policy", "Linode Interfaces", "ACLP Logs Datacenter + LKE-E"], "monitors": {"alerts": ["Managed Databases", "NodeBalancers"], "metrics": + ["Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": + "172.236.0.46,172.236.0.50,172.236.0.47,172.236.0.53,172.236.0.52,172.236.0.45,172.236.0.49,172.236.0.51,172.236.0.54,172.236.0.48", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "us-iad", "label": "Washington, DC", "country": - "us", "capabilities": ["Linodes", "Block Storage Encryption", "LA Disk Encryption", - "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", "Object Storage", - "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "Managed - Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", - "Linode Interfaces"], "status": "ok", "resolvers": {"ipv4": "139.144.192.62,139.144.192.60,139.144.192.61,139.144.192.53,139.144.192.54,139.144.192.67,139.144.192.69,139.144.192.66,139.144.192.52,139.144.192.68", + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "id-cgk", + "label": "Jakarta, ID", "country": "id", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes + Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", + "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "172.232.224.23,172.232.224.32,172.232.224.26,172.232.224.27,172.232.224.21,172.232.224.24,172.232.224.22,172.232.224.20,172.232.224.31,172.232.224.28", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "us-ord", "label": "Chicago, IL", "country": - "us", "capabilities": ["Linodes", "Block Storage Encryption", "LA Disk Encryption", - "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", "Object Storage", - "GPU Linodes", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", - "VPCs", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", - "StackScripts", "Linode Interfaces"], "status": "ok", "resolvers": {"ipv4": - "172.232.0.17,172.232.0.16,172.232.0.21,172.232.0.13,172.232.0.22,172.232.0.9,172.232.0.19,172.232.0.20,172.232.0.15,172.232.0.18", + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "in-bom-2", + "label": "Mumbai 2, IN", "country": "in", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "GPU Linodes", "Kubernetes", "Kubernetes Enterprise", "Cloud + Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", + "Premium Plans", "Placement Group", "StackScripts", "Maintenance Policy", "Linode + Interfaces", "ACLP Logs Datacenter LKE-E"], "monitors": {"alerts": ["Managed + Databases", "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "172.236.171.41,172.236.171.42,172.236.171.25,172.236.171.44,172.236.171.26,172.236.171.45,172.236.171.24,172.236.171.43,172.236.171.27,172.236.171.28", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "fr-par", "label": "Paris, FR", "country": - "fr", "capabilities": ["Linodes", "Block Storage Encryption", "LA Disk Encryption", - "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", "Object Storage", - "GPU Linodes", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", - "VPCs", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", - "StackScripts", "Linode Interfaces"], "status": "ok", "resolvers": {"ipv4": - "172.232.32.21,172.232.32.23,172.232.32.17,172.232.32.18,172.232.32.16,172.232.32.22,172.232.32.20,172.232.32.14,172.232.32.11,172.232.32.12", + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "de-fra-2", + "label": "Frankfurt 2, DE", "country": "de", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes + Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", + "Metadata", "Premium Plans", "Placement Group", "StackScripts", "NETINT Quadra + T1U", "Maintenance Policy", "Linode Interfaces", "ACLP Logs Datacenter LKE-E"], + "monitors": {"alerts": ["Managed Databases", "NodeBalancers"], "metrics": ["Managed + Databases", "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "172.236.203.9,172.236.203.16,172.236.203.19,172.236.203.15,172.236.203.17,172.236.203.11,172.236.203.18,172.236.203.14,172.236.203.13,172.236.203.12", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "sg-sin-2", + "label": "Singapore 2, SG", "country": "sg", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes + Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", + "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance + Policy", "Linode Interfaces", "ACLP Logs Datacenter LKE-E"], "monitors": {"alerts": + ["Managed Databases", "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "172.236.129.8,172.236.129.42,172.236.129.41,172.236.129.19,172.236.129.46,172.236.129.23,172.236.129.48,172.236.129.20,172.236.129.21,172.236.129.47", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "jp-tyo-3", + "label": "Tokyo 3, JP", "country": "jp", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes + Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", + "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance + Policy", "Linode Interfaces", "ACLP Logs Datacenter LKE-E"], "monitors": {"alerts": + ["Managed Databases", "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "172.237.4.15,172.237.4.19,172.237.4.17,172.237.4.21,172.237.4.16,172.237.4.18,172.237.4.23,172.237.4.24,172.237.4.20,172.237.4.14", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "us-sea", "label": "Seattle, WA", "country": - "us", "capabilities": ["Linodes", "Block Storage Encryption", "LA Disk Encryption", - "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", "Object Storage", + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "de-ber-1", + "label": "Berlin, DE", "country": "de", "capabilities": ["Linodes", "Disk Encryption", + "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", "Maintenance Policy"], + "monitors": {"alerts": [], "metrics": []}, "status": "ok", "resolvers": {"ipv4": + "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": + 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": + "no-osl-1", "label": "Oslo, NO", "country": "no", "capabilities": ["Linodes", + "Block Storage Encryption", "Disk Encryption", "Backups", "NodeBalancers", "Block + Storage", "Object Storage", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", + "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", "Premium + Plans", "Placement Group", "StackScripts", "Maintenance Policy", "Linode Interfaces", + "ACLP Logs Datacenter LKE-E"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "172.238.140.33,172.238.140.25,172.238.140.30,172.238.140.31,172.238.140.26,172.238.140.28,172.238.140.34,172.238.140.32,172.238.140.27,172.238.140.29", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "us-iad-2", + "label": "Washington 2, DC", "country": "us", "capabilities": ["Linodes", "Block + Storage Encryption", "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", + "Object Storage", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", + "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", "Premium Plans", + "Placement Group", "StackScripts", "Maintenance Policy", "Linode Interfaces"], + "monitors": {"alerts": ["Managed Databases", "NodeBalancers"], "metrics": ["Managed + Databases", "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "172.239.142.102,172.239.142.89,172.239.142.92,172.239.142.87,172.239.142.88,172.239.142.103,172.239.142.91,172.239.142.90,172.239.142.86,172.239.142.100", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "fr-par-2", + "label": "Paris 2, FR", "country": "fr", "capabilities": ["Linodes", "Block + Storage Encryption", "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", "GPU Linodes", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", - "VPCs", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", - "StackScripts", "Linode Interfaces"], "status": "ok", "resolvers": {"ipv4": - "172.232.160.19,172.232.160.21,172.232.160.17,172.232.160.15,172.232.160.18,172.232.160.8,172.232.160.12,172.232.160.11,172.232.160.14,172.232.160.16", + "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", "Premium Plans", + "Placement Group", "StackScripts", "Maintenance Policy", "Linode Interfaces", + "ACLP Logs Datacenter LKE-E"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "172.239.11.24,172.239.11.22,172.239.11.17,172.239.11.20,172.239.11.23,172.239.11.19,172.239.11.21,172.239.11.15,172.239.11.16,172.239.11.18", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "br-gru", "label": "Sao Paulo, BR", "country": - "br", "capabilities": ["Linodes", "Block Storage Encryption", "LA Disk Encryption", - "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", "Object Storage", - "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "Managed - Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", - "Linode Interfaces"], "status": "ok", "resolvers": {"ipv4": "172.233.0.4,172.233.0.9,172.233.0.7,172.233.0.12,172.233.0.5,172.233.0.13,172.233.0.10,172.233.0.6,172.233.0.8,172.233.0.11", + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "us-rno-1", + "label": "Reno, NV", "country": "us", "capabilities": ["Linodes", "Disk Encryption", + "Backups", "NodeBalancers", "GPU Linodes", "Metadata", "Premium Plans", "Placement + Group", "StackScripts", "Maintenance Policy"], "monitors": {"alerts": ["NodeBalancers"], + "metrics": ["NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "", "ipv6": + ""}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "co-bog-2", + "label": "Bogot\u00e1 2, CO", "country": "co", "capabilities": ["Linodes", "Disk + Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", "Maintenance + Policy"], "monitors": {"alerts": [], "metrics": []}, "status": "ok", "resolvers": + {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": + 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": + "fr-mrs-2", "label": "Marseille 2, FR", "country": "fr", "capabilities": ["Linodes", + "Disk Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", + "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": + "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": + 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": + "us-mia", "label": "Miami, FL", "country": "us", "capabilities": ["Linodes", + "Block Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", + "NodeBalancers", "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", + "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", + "Managed Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", + "NETINT Quadra T1U", "Maintenance Policy", "Linode Interfaces"], "monitors": + {"alerts": ["Managed Databases", "NodeBalancers"], "metrics": ["Managed Databases", + "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "172.233.160.34,172.233.160.27,172.233.160.30,172.233.160.29,172.233.160.32,172.233.160.28,172.233.160.33,172.233.160.26,172.233.160.25,172.233.160.31", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "nl-ams", "label": "Amsterdam, NL", "country": - "nl", "capabilities": ["Linodes", "Block Storage Encryption", "LA Disk Encryption", - "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", "Object Storage", - "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "Managed - Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", - "Linode Interfaces"], "status": "ok", "resolvers": {"ipv4": "172.233.33.36,172.233.33.38,172.233.33.35,172.233.33.39,172.233.33.34,172.233.33.33,172.233.33.31,172.233.33.30,172.233.33.37,172.233.33.32", + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "ap-west", + "label": "Mumbai, IN", "country": "in", "capabilities": ["Linodes", "Block Storage + Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "GPU Linodes", "Kubernetes", "Cloud Firewall", "Vlans", "Block + Storage Migrations", "Managed Databases", "Metadata", "Placement Group", "StackScripts", + "Maintenance Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed + Databases", "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "172.105.34.5,172.105.35.5,172.105.36.5,172.105.37.5,172.105.38.5,172.105.39.5,172.105.40.5,172.105.41.5,172.105.42.5,172.105.43.5", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "se-sto", "label": "Stockholm, SE", "country": - "se", "capabilities": ["Linodes", "Block Storage Encryption", "LA Disk Encryption", - "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", "Object Storage", - "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "Managed - Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", - "Linode Interfaces"], "status": "ok", "resolvers": {"ipv4": "172.232.128.24,172.232.128.26,172.232.128.20,172.232.128.22,172.232.128.25,172.232.128.19,172.232.128.23,172.232.128.18,172.232.128.21,172.232.128.27", + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "ca-central", + "label": "Toronto, CA", "country": "ca", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "GPU Linodes", "Kubernetes", "Cloud Firewall", "Vlans", "Block + Storage Migrations", "Managed Databases", "Metadata", "Placement Group", "StackScripts", + "Maintenance Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed + Databases", "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "172.105.0.5,172.105.3.5,172.105.4.5,172.105.5.5,172.105.6.5,172.105.7.5,172.105.8.5,172.105.9.5,172.105.10.5,172.105.11.5", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "es-mad", "label": "Madrid, ES", "country": - "es", "capabilities": ["Linodes", "Block Storage Encryption", "LA Disk Encryption", - "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", "Object Storage", - "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "Managed - Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", - "Linode Interfaces"], "status": "ok", "resolvers": {"ipv4": "172.233.111.6,172.233.111.17,172.233.111.21,172.233.111.25,172.233.111.19,172.233.111.12,172.233.111.26,172.233.111.16,172.233.111.18,172.233.111.9", + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "ap-southeast", + "label": "Sydney, AU", "country": "au", "capabilities": ["Linodes", "Block Storage + Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", + "Managed Databases", "Metadata", "Placement Group", "StackScripts", "Maintenance + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "172.105.166.5,172.105.169.5,172.105.168.5,172.105.172.5,172.105.162.5,172.105.170.5,172.105.167.5,172.105.171.5,172.105.181.5,172.105.161.5", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "in-maa", "label": "Chennai, IN", "country": - "in", "capabilities": ["Linodes", "Block Storage Encryption", "LA Disk Encryption", - "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", "Object Storage", - "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "Managed - Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", - "NETINT Quadra T1U", "Linode Interfaces"], "status": "ok", "resolvers": {"ipv4": - "172.232.96.17,172.232.96.26,172.232.96.19,172.232.96.20,172.232.96.25,172.232.96.21,172.232.96.18,172.232.96.22,172.232.96.23,172.232.96.24", + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "us-iad", + "label": "Washington, DC", "country": "us", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "Kubernetes", "Kubernetes Enterprise", "Cloud + Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", + "Premium Plans", "Placement Group", "StackScripts", "Maintenance Policy", "Linode + Interfaces", "ACLP Logs Datacenter LKE-E"], "monitors": {"alerts": ["Managed + Databases", "NodeBalancers"], "metrics": ["Linodes", "Managed Databases", "NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "139.144.192.62,139.144.192.60,139.144.192.61,139.144.192.53,139.144.192.54,139.144.192.67,139.144.192.69,139.144.192.66,139.144.192.52,139.144.192.68", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "jp-osa", "label": "Osaka, JP", "country": - "jp", "capabilities": ["Linodes", "Block Storage Encryption", "LA Disk Encryption", - "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", "Object Storage", - "GPU Linodes", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", - "VPCs", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", - "StackScripts", "Linode Interfaces"], "status": "ok", "resolvers": {"ipv4": - "172.233.64.44,172.233.64.43,172.233.64.37,172.233.64.40,172.233.64.46,172.233.64.41,172.233.64.39,172.233.64.42,172.233.64.45,172.233.64.38", + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "us-ord", + "label": "Chicago, IL", "country": "us", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes + Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", + "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance + Policy", "Linode Interfaces", "ACLP Logs Datacenter LKE-E"], "monitors": {"alerts": + ["Managed Databases", "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "172.232.0.17,172.232.0.16,172.232.0.21,172.232.0.13,172.232.0.22,172.232.0.9,172.232.0.19,172.232.0.20,172.232.0.15,172.232.0.18", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "it-mil", "label": "Milan, IT", "country": - "it", "capabilities": ["Linodes", "Block Storage Encryption", "LA Disk Encryption", - "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", "Object Storage", - "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "Managed - Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", - "Linode Interfaces"], "status": "ok", "resolvers": {"ipv4": "172.232.192.19,172.232.192.18,172.232.192.16,172.232.192.20,172.232.192.24,172.232.192.21,172.232.192.22,172.232.192.17,172.232.192.15,172.232.192.23", + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "fr-par", + "label": "Paris, FR", "country": "fr", "capabilities": ["Linodes", "Block Storage + Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes + Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", + "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "172.232.32.21,172.232.32.23,172.232.32.17,172.232.32.18,172.232.32.16,172.232.32.22,172.232.32.20,172.232.32.14,172.232.32.11,172.232.32.12", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "us-mia", "label": "Miami, FL", "country": - "us", "capabilities": ["Linodes", "Block Storage Encryption", "LA Disk Encryption", - "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", "Object Storage", - "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "Managed - Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", - "NETINT Quadra T1U", "Linode Interfaces"], "status": "ok", "resolvers": {"ipv4": - "172.233.160.34,172.233.160.27,172.233.160.30,172.233.160.29,172.233.160.32,172.233.160.28,172.233.160.33,172.233.160.26,172.233.160.25,172.233.160.31", + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "us-sea", + "label": "Seattle, WA", "country": "us", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes + Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", + "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance + Policy", "Linode Interfaces", "ACLP Logs Datacenter LKE-E"], "monitors": {"alerts": + ["Managed Databases", "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "172.232.160.19,172.232.160.21,172.232.160.17,172.232.160.15,172.232.160.18,172.232.160.8,172.232.160.12,172.232.160.11,172.232.160.14,172.232.160.16", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "id-cgk", "label": "Jakarta, ID", "country": - "id", "capabilities": ["Linodes", "Block Storage Encryption", "LA Disk Encryption", - "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", "Object Storage", - "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "Managed - Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", - "Linode Interfaces"], "status": "ok", "resolvers": {"ipv4": "172.232.224.23,172.232.224.32,172.232.224.26,172.232.224.27,172.232.224.21,172.232.224.24,172.232.224.22,172.232.224.20,172.232.224.31,172.232.224.28", + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "br-gru", + "label": "Sao Paulo, BR", "country": "br", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "Kubernetes", "Kubernetes Enterprise", "Cloud + Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", + "Premium Plans", "Placement Group", "StackScripts", "Maintenance Policy", "Linode + Interfaces"], "monitors": {"alerts": ["Managed Databases", "NodeBalancers"], + "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": + {"ipv4": "172.233.0.4,172.233.0.9,172.233.0.7,172.233.0.12,172.233.0.5,172.233.0.13,172.233.0.10,172.233.0.6,172.233.0.8,172.233.0.11", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "us-lax", "label": "Los Angeles, CA", "country": - "us", "capabilities": ["Linodes", "Block Storage Encryption", "LA Disk Encryption", - "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", "Object Storage", - "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "Managed - Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", - "NETINT Quadra T1U", "Linode Interfaces"], "status": "ok", "resolvers": {"ipv4": - "172.233.128.45,172.233.128.38,172.233.128.53,172.233.128.37,172.233.128.34,172.233.128.36,172.233.128.33,172.233.128.39,172.233.128.43,172.233.128.44", + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "nl-ams", + "label": "Amsterdam, NL", "country": "nl", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes + Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", + "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "172.233.33.36,172.233.33.38,172.233.33.35,172.233.33.39,172.233.33.34,172.233.33.33,172.233.33.31,172.233.33.30,172.233.33.37,172.233.33.32", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "nz-akl-1", "label": "Auckland, NZ", "country": - "nz", "capabilities": ["Linodes", "Disk Encryption", "Cloud Firewall", "Vlans", - "VPCs", "Metadata", "Distributed Plans"], "status": "ok", "resolvers": {"ipv4": - "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": - 0}, "site_type": "distributed"}, {"id": "us-den-1", "label": "Denver, CO", "country": - "us", "capabilities": ["Linodes", "Disk Encryption", "Cloud Firewall", "Vlans", - "VPCs", "Metadata", "Distributed Plans"], "status": "ok", "resolvers": {"ipv4": - "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": - 0}, "site_type": "distributed"}, {"id": "de-ham-1", "label": "Hamburg, DE", - "country": "de", "capabilities": ["Linodes", "Disk Encryption", "Cloud Firewall", - "Vlans", "VPCs", "Metadata", "Distributed Plans"], "status": "ok", "resolvers": - {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": - 0}, "site_type": "distributed"}, {"id": "fr-mrs-1", "label": "Marseille, FR", - "country": "fr", "capabilities": ["Linodes", "Disk Encryption", "Cloud Firewall", - "Vlans", "VPCs", "Metadata", "Distributed Plans"], "status": "ok", "resolvers": - {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": - 0}, "site_type": "distributed"}, {"id": "za-jnb-1", "label": "Johannesburg, - ZA", "country": "za", "capabilities": ["Linodes", "Disk Encryption", "Cloud - Firewall", "Vlans", "VPCs", "Metadata", "Distributed Plans"], "status": "ok", - "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": - 0}, "site_type": "distributed"}, {"id": "my-kul-1", "label": "Kuala Lumpur, - MY", "country": "my", "capabilities": ["Linodes", "Disk Encryption", "Cloud - Firewall", "Vlans", "VPCs", "Metadata", "Distributed Plans"], "status": "ok", - "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": - 0}, "site_type": "distributed"}, {"id": "co-bog-1", "label": "Bogot\u00e1, CO", - "country": "co", "capabilities": ["Linodes", "Disk Encryption", "Cloud Firewall", - "Vlans", "VPCs", "Metadata", "Distributed Plans"], "status": "ok", "resolvers": - {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": - 0}, "site_type": "distributed"}, {"id": "mx-qro-1", "label": "Quer\u00e9taro, - MX", "country": "mx", "capabilities": ["Linodes", "Disk Encryption", "Cloud - Firewall", "Vlans", "VPCs", "Metadata", "Distributed Plans"], "status": "ok", - "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": - 0}, "site_type": "distributed"}, {"id": "us-hou-1", "label": "Houston, TX", - "country": "us", "capabilities": ["Linodes", "Disk Encryption", "Cloud Firewall", - "Vlans", "VPCs", "Metadata", "Distributed Plans"], "status": "ok", "resolvers": - {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": - 0}, "site_type": "distributed"}, {"id": "cl-scl-1", "label": "Santiago, CL", - "country": "cl", "capabilities": ["Linodes", "Disk Encryption", "Cloud Firewall", - "Vlans", "VPCs", "Metadata", "Distributed Plans"], "status": "ok", "resolvers": - {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": - 0}, "site_type": "distributed"}, {"id": "gb-lon", "label": "London 2, UK", "country": - "gb", "capabilities": ["Linodes", "Block Storage Encryption", "LA Disk Encryption", - "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", "Object Storage", - "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "Managed - Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", - "Linode Interfaces"], "status": "ok", "resolvers": {"ipv4": "172.236.0.46,172.236.0.50,172.236.0.47,172.236.0.53,172.236.0.52,172.236.0.45,172.236.0.49,172.236.0.51,172.236.0.54,172.236.0.48", - "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "au-mel", "label": "Melbourne, AU", "country": - "au", "capabilities": ["Linodes", "Block Storage Encryption", "LA Disk Encryption", - "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", "Object Storage", - "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "Managed - Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", - "NETINT Quadra T1U", "Linode Interfaces"], "status": "ok", "resolvers": {"ipv4": - "172.236.32.23,172.236.32.35,172.236.32.30,172.236.32.28,172.236.32.32,172.236.32.33,172.236.32.27,172.236.32.37,172.236.32.29,172.236.32.34", - "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "in-bom-2", "label": "Mumbai 2, IN", "country": - "in", "capabilities": ["Linodes", "Block Storage Encryption", "LA Disk Encryption", - "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", "GPU Linodes", - "Cloud Firewall", "Vlans", "VPCs", "Metadata", "Premium Plans", "Placement Group", - "StackScripts", "Linode Interfaces"], "status": "ok", "resolvers": {"ipv4": - "172.236.171.41,172.236.171.42,172.236.171.25,172.236.171.44,172.236.171.26,172.236.171.45,172.236.171.24,172.236.171.43,172.236.171.27,172.236.171.28", - "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "de-fra-2", "label": "Frankfurt 2, DE", "country": - "de", "capabilities": ["Linodes", "Block Storage Encryption", "LA Disk Encryption", - "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", "GPU Linodes", - "Kubernetes", "Cloud Firewall", "Vlans", "VPCs", "Metadata", "Premium Plans", - "Placement Group", "StackScripts", "NETINT Quadra T1U", "Linode Interfaces"], - "status": "ok", "resolvers": {"ipv4": "172.236.203.9,172.236.203.16,172.236.203.19,172.236.203.15,172.236.203.17,172.236.203.11,172.236.203.18,172.236.203.14,172.236.203.13,172.236.203.12", - "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "sg-sin-2", "label": "Singapore 2, SG", "country": - "sg", "capabilities": ["Linodes", "Block Storage Encryption", "LA Disk Encryption", - "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", "Object Storage", - "GPU Linodes", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", - "VPCs", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", - "StackScripts", "Linode Interfaces"], "status": "ok", "resolvers": {"ipv4": - "172.236.129.8,172.236.129.42,172.236.129.41,172.236.129.19,172.236.129.46,172.236.129.23,172.236.129.48,172.236.129.20,172.236.129.21,172.236.129.47", + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "se-sto", + "label": "Stockholm, SE", "country": "se", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes + Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", + "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "172.232.128.24,172.232.128.26,172.232.128.20,172.232.128.22,172.232.128.25,172.232.128.19,172.232.128.23,172.232.128.18,172.232.128.21,172.232.128.27", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "jp-tyo-3", "label": "Tokyo 3, JP", "country": - "jp", "capabilities": ["Linodes", "Block Storage Encryption", "LA Disk Encryption", - "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", "Object Storage", - "Kubernetes", "Cloud Firewall", "Vlans", "VPCs", "Metadata", "Premium Plans", - "Placement Group", "StackScripts", "Linode Interfaces"], "status": "ok", "resolvers": - {"ipv4": "172.237.4.15,172.237.4.19,172.237.4.17,172.237.4.21,172.237.4.16,172.237.4.18,172.237.4.23,172.237.4.24,172.237.4.20,172.237.4.14", + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "es-mad", + "label": "Madrid, ES", "country": "es", "capabilities": ["Linodes", "Block Storage + Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes + Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", + "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "172.233.111.6,172.233.111.17,172.233.111.21,172.233.111.25,172.233.111.19,172.233.111.12,172.233.111.26,172.233.111.16,172.233.111.18,172.233.111.9", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "de-ber-1", "label": "Berlin, DE", "country": - "de", "capabilities": ["Linodes", "Disk Encryption", "Cloud Firewall", "Vlans", - "VPCs", "Metadata", "Distributed Plans"], "status": "ok", "resolvers": {"ipv4": - "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": - 0}, "site_type": "distributed"}, {"id": "us-central", "label": "Dallas, TX", - "country": "us", "capabilities": ["Linodes", "LA Disk Encryption", "Disk Encryption", - "Backups", "NodeBalancers", "Block Storage", "Kubernetes", "Cloud Firewall", - "Vlans", "Block Storage Migrations", "Managed Databases", "Metadata", "Placement - Group", "StackScripts", "Linode Interfaces"], "status": "ok", "resolvers": {"ipv4": - "72.14.179.5,72.14.188.5,173.255.199.5,66.228.53.5,96.126.122.5,96.126.124.5,96.126.127.5,198.58.107.5,198.58.111.5,23.239.24.5", + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "in-maa", + "label": "Chennai, IN", "country": "in", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes + Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", + "Metadata", "Premium Plans", "Placement Group", "StackScripts", "NETINT Quadra + T1U", "Maintenance Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed + Databases", "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "172.232.96.17,172.232.96.26,172.232.96.19,172.232.96.20,172.232.96.25,172.232.96.21,172.232.96.18,172.232.96.22,172.232.96.23,172.232.96.24", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "us-west", "label": "Fremont, CA", "country": - "us", "capabilities": ["Linodes", "Block Storage Encryption", "LA Disk Encryption", - "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", "Kubernetes", - "Cloud Firewall", "Vlans", "Block Storage Migrations", "Managed Databases", - "Metadata", "Placement Group", "StackScripts", "Linode Interfaces"], "status": - "ok", "resolvers": {"ipv4": "173.230.145.5, 173.230.147.5, 173.230.155.5, 173.255.212.5, - 173.255.219.5, 173.255.241.5, 173.255.243.5, 173.255.244.5, 74.207.241.5, 74.207.242.5", - "ipv6": "1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678"}, "placement_group_limits": - {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5}, "site_type": - "core"}, {"id": "us-southeast", "label": "Atlanta, GA", "country": "us", "capabilities": - ["Linodes", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "jp-osa", + "label": "Osaka, JP", "country": "jp", "capabilities": ["Linodes", "Block Storage + Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes + Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", + "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "172.233.64.44,172.233.64.43,172.233.64.37,172.233.64.40,172.233.64.46,172.233.64.41,172.233.64.39,172.233.64.42,172.233.64.45,172.233.64.38", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "it-mil", + "label": "Milan, IT", "country": "it", "capabilities": ["Linodes", "Block Storage + Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes + Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", + "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "172.232.192.19,172.232.192.18,172.232.192.16,172.232.192.20,172.232.192.24,172.232.192.21,172.232.192.22,172.232.192.17,172.232.192.15,172.232.192.23", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "us-central", + "label": "Dallas, TX", "country": "us", "capabilities": ["Linodes", "Block Storage + Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", + "Managed Databases", "Metadata", "Placement Group", "StackScripts", "Maintenance + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "72.14.179.5,72.14.188.5,173.255.199.5,66.228.53.5,96.126.122.5,96.126.124.5,96.126.127.5,198.58.107.5,198.58.111.5,23.239.24.5", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "ap-northeast", + "label": "Tokyo 2, JP", "country": "jp", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", + "Managed Databases", "Metadata", "Placement Group", "StackScripts", "Maintenance + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "139.162.66.5,139.162.67.5,139.162.68.5,139.162.69.5,139.162.70.5,139.162.71.5,139.162.72.5,139.162.73.5,139.162.74.5,139.162.75.5", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "eu-central", + "label": "Frankfurt, DE", "country": "de", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", "Managed Databases", "Metadata", "Placement - Group", "StackScripts", "Linode Interfaces"], "status": "ok", "resolvers": {"ipv4": - "74.207.231.5,173.230.128.5,173.230.129.5,173.230.136.5,173.230.140.5,66.228.59.5,66.228.62.5,50.116.35.5,50.116.41.5,23.239.18.5", + Group", "StackScripts", "Maintenance Policy", "Linode Interfaces"], "monitors": + {"alerts": ["Managed Databases", "NodeBalancers"], "metrics": ["Managed Databases", + "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "139.162.130.5,139.162.131.5,139.162.132.5,139.162.133.5,139.162.134.5,139.162.135.5,139.162.136.5,139.162.137.5,139.162.138.5,139.162.139.5", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "us-east", "label": "Newark, NJ", "country": - "us", "capabilities": ["Linodes", "LA Disk Encryption", "Disk Encryption", "Backups", - "NodeBalancers", "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", - "Cloud Firewall", "Vlans", "Block Storage Migrations", "Managed Databases", - "Metadata", "Placement Group", "StackScripts", "Linode Interfaces"], "status": - "ok", "resolvers": {"ipv4": "66.228.42.5,96.126.106.5,50.116.53.5,50.116.58.5,50.116.61.5,50.116.62.5,66.175.211.5,97.107.133.4,173.255.225.5,66.228.35.5", - "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "eu-west", "label": "London, UK", "country": - "gb", "capabilities": ["Linodes", "LA Disk Encryption", "Disk Encryption", "Backups", - "NodeBalancers", "Block Storage", "Kubernetes", "Cloud Firewall", "Vlans", "Block - Storage Migrations", "Metadata", "Placement Group", "StackScripts", "Linode - Interfaces"], "status": "ok", "resolvers": {"ipv4": "178.79.182.5, 176.58.107.5, - 176.58.116.5, 176.58.121.5, 151.236.220.5, 212.71.252.5, 212.71.253.5, 109.74.192.20, - 109.74.193.20, 109.74.194.20", "ipv6": "1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678, - 1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, - "maximum_linodes_per_pg": 5}, "site_type": "core"}, {"id": "ap-south", "label": - "Singapore, SG", "country": "sg", "capabilities": ["Linodes", "LA Disk Encryption", - "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", "Object Storage", - "GPU Linodes", "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", - "Metadata", "Placement Group", "StackScripts", "Linode Interfaces"], "status": - "ok", "resolvers": {"ipv4": "139.162.11.5,139.162.13.5,139.162.14.5,139.162.15.5,139.162.16.5,139.162.21.5,139.162.27.5,103.3.60.18,103.3.60.19,103.3.60.20", - "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "eu-central", "label": "Frankfurt, DE", "country": - "de", "capabilities": ["Linodes", "LA Disk Encryption", "Disk Encryption", "Backups", - "NodeBalancers", "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", - "Cloud Firewall", "Vlans", "Block Storage Migrations", "Managed Databases", - "Metadata", "Placement Group", "StackScripts", "Linode Interfaces"], "status": - "ok", "resolvers": {"ipv4": "139.162.130.5,139.162.131.5,139.162.132.5,139.162.133.5,139.162.134.5,139.162.135.5,139.162.136.5,139.162.137.5,139.162.138.5,139.162.139.5", + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "ap-south", + "label": "Singapore, SG", "country": "sg", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Cloud Firewall", + "Vlans", "Block Storage Migrations", "Metadata", "Placement Group", "StackScripts", + "Maintenance Policy", "Linode Interfaces"], "monitors": {"alerts": ["NodeBalancers"], + "metrics": ["NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "139.162.11.5,139.162.13.5,139.162.14.5,139.162.15.5,139.162.16.5,139.162.21.5,139.162.27.5,103.3.60.18,103.3.60.19,103.3.60.20", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "ap-northeast", "label": "Tokyo 2, JP", "country": - "jp", "capabilities": ["Linodes", "LA Disk Encryption", "Disk Encryption", "Backups", - "NodeBalancers", "Block Storage", "Kubernetes", "Cloud Firewall", "Vlans", "Block - Storage Migrations", "Managed Databases", "Metadata", "Placement Group", "StackScripts", - "Linode Interfaces"], "status": "ok", "resolvers": {"ipv4": "139.162.66.5,139.162.67.5,139.162.68.5,139.162.69.5,139.162.70.5,139.162.71.5,139.162.72.5,139.162.73.5,139.162.74.5,139.162.75.5", + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "eu-west", + "label": "London, UK", "country": "gb", "capabilities": ["Linodes", "Block Storage + Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", + "Metadata", "Placement Group", "StackScripts", "Maintenance Policy", "Linode + Interfaces"], "monitors": {"alerts": ["NodeBalancers"], "metrics": ["NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "178.79.182.5, 176.58.107.5, 176.58.116.5, + 176.58.121.5, 151.236.220.5, 212.71.252.5, 212.71.253.5, 109.74.192.20, 109.74.193.20, + 109.74.194.20", "ipv6": "1234::5678, 1234::5678, 1234::5678, 1234::5678, + 1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "us-east", + "label": "Newark, NJ", "country": "us", "capabilities": ["Linodes", "Block Storage + Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Cloud Firewall", + "Vlans", "Block Storage Migrations", "Managed Databases", "Metadata", "Placement + Group", "StackScripts", "Maintenance Policy", "Linode Interfaces"], "monitors": + {"alerts": ["Managed Databases", "NodeBalancers"], "metrics": ["Managed Databases", + "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "66.228.42.5,96.126.106.5,50.116.53.5,50.116.58.5,50.116.61.5,50.116.62.5,66.175.211.5,97.107.133.4,173.255.225.5,66.228.35.5", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "us-southeast", + "label": "Atlanta, GA", "country": "us", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Cloud Firewall", + "Vlans", "Block Storage Migrations", "Managed Databases", "Metadata", "Placement + Group", "StackScripts", "Maintenance Policy", "Linode Interfaces"], "monitors": + {"alerts": ["Managed Databases", "NodeBalancers"], "metrics": ["Managed Databases", + "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "74.207.231.5,173.230.128.5,173.230.129.5,173.230.136.5,173.230.140.5,66.228.59.5,66.228.62.5,50.116.35.5,50.116.41.5,23.239.18.5", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}], "page": 1, "pages": 1, "results": 42}' + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "us-west", + "label": "Fremont, CA", "country": "us", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", + "Managed Databases", "Metadata", "Placement Group", "StackScripts", "Maintenance + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "173.230.145.5, 173.230.147.5, 173.230.155.5, 173.255.212.5, + 173.255.219.5, 173.255.241.5, 173.255.243.5, 173.255.244.5, 74.207.241.5, 74.207.242.5", + "ipv6": "1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678, + 1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678"}, "placement_group_limits": + {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": + 5}, "site_type": "core"}], "page": 1, "pages": 1, "results": 47}' headers: Access-Control-Allow-Credentials: - "true" @@ -348,7 +479,7 @@ interactions: Content-Type: - application/json Expires: - - Mon, 19 May 2025 16:22:55 GMT + - Wed, 06 May 2026 01:49:41 GMT Pragma: - no-cache Strict-Transport-Security: @@ -367,7 +498,7 @@ interactions: X-Oauth-Scopes: - '*' X-Ratelimit-Limit: - - "1600" + - "1840" X-Xss-Protection: - 1; mode=block status: 200 OK @@ -386,7 +517,7 @@ interactions: url: https://api.linode.com/v4beta/lke/tiers/standard/versions?page=1 method: GET response: - body: '{"data": [{"id": "1.32", "tier": "standard"}, {"id": "1.31", "tier": "standard"}], + body: '{"data": [{"id": "1.35", "tier": "standard"}, {"id": "1.34", "tier": "standard"}], "page": 1, "pages": 1, "results": 2}' headers: Access-Control-Allow-Credentials: @@ -412,7 +543,7 @@ interactions: Content-Type: - application/json Expires: - - Mon, 19 May 2025 16:22:55 GMT + - Wed, 06 May 2026 01:49:41 GMT Pragma: - no-cache Strict-Transport-Security: @@ -435,7 +566,7 @@ interactions: code: 200 duration: "" - request: - body: '{"node_pools":[{"count":1,"type":"g6-standard-2","disks":null,"tags":["test"],"labels":null,"taints":null}],"label":"go-test-def","region":"ap-west","k8s_version":"1.32","tags":["testing"],"control_plane":{"acl":{"enabled":true,"addresses":{"ipv4":["10.0.0.1/32"],"ipv6":["1234::5678"]}}},"tier":"standard"}' + body: '{"node_pools":[{"count":1,"type":"g6-standard-2","disks":null,"tags":["test"],"labels":null,"taints":null}],"label":"go-test-def","region":"au-mel","k8s_version":"1.35","tags":["testing"],"control_plane":{"acl":{"enabled":true,"addresses":{"ipv4":["10.0.0.1/32"],"ipv6":["1234::5678"]}}},"tier":"standard"}' form: {} headers: Accept: @@ -447,10 +578,10 @@ interactions: url: https://api.linode.com/v4beta/lke/clusters method: POST response: - body: '{"id": 444268, "status": "ready", "created": "2018-01-02T03:04:05", "updated": - "2018-01-02T03:04:05", "label": "go-test-def", "region": "ap-west", "k8s_version": - "1.32", "tier": "standard", "control_plane": {"high_availability": false}, "apl_enabled": - false, "tags": ["testing"]}' + body: '{"id": 600208, "status": "ready", "created": "2018-01-02T03:04:05", "updated": + "2018-01-02T03:04:05", "label": "go-test-def", "region": "au-mel", "k8s_version": + "1.35", "tier": "standard", "control_plane": {"high_availability": false}, "apl_enabled": + false, "tags": ["testing"], "locks": []}' headers: Access-Control-Allow-Credentials: - "true" @@ -469,13 +600,13 @@ interactions: Connection: - keep-alive Content-Length: - - "279" + - "291" Content-Security-Policy: - default-src 'none' Content-Type: - application/json Expires: - - Mon, 19 May 2025 16:23:07 GMT + - Wed, 06 May 2026 01:49:48 GMT Pragma: - no-cache Strict-Transport-Security: @@ -492,7 +623,7 @@ interactions: X-Oauth-Scopes: - '*' X-Ratelimit-Limit: - - "1600" + - "1840" X-Xss-Protection: - 1; mode=block status: 200 OK @@ -508,10 +639,10 @@ interactions: - application/json User-Agent: - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/lke/clusters/444268/control_plane_acl + url: https://api.linode.com/v4beta/lke/clusters/600208/control_plane_acl method: GET response: - body: '{"acl": {"enabled": true, "revision-id": "8caa3c9d3da6426abcb99afde35e50b8", + body: '{"acl": {"enabled": true, "revision-id": "92be28fe966846a18e9af955d0237c95", "addresses": {"ipv4": ["10.0.0.1/32"], "ipv6": ["1234::5678/128"]}}}' headers: Access-Control-Allow-Credentials: @@ -537,7 +668,7 @@ interactions: Content-Type: - application/json Expires: - - Mon, 19 May 2025 16:23:08 GMT + - Wed, 06 May 2026 01:49:49 GMT Pragma: - no-cache Strict-Transport-Security: @@ -555,7 +686,7 @@ interactions: X-Oauth-Scopes: - '*' X-Ratelimit-Limit: - - "1600" + - "1840" X-Xss-Protection: - 1; mode=block status: 200 OK @@ -571,7 +702,7 @@ interactions: - application/json User-Agent: - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/lke/clusters/444268/control_plane_acl + url: https://api.linode.com/v4beta/lke/clusters/600208/control_plane_acl method: PUT response: body: '{"acl": {"enabled": true, "revision-id": "test-revision-id", "addresses": @@ -600,7 +731,7 @@ interactions: Content-Type: - application/json Expires: - - Mon, 19 May 2025 16:23:12 GMT + - Wed, 06 May 2026 01:49:52 GMT Pragma: - no-cache Strict-Transport-Security: @@ -617,7 +748,7 @@ interactions: X-Oauth-Scopes: - '*' X-Ratelimit-Limit: - - "1600" + - "1840" X-Xss-Protection: - 1; mode=block status: 200 OK @@ -633,7 +764,7 @@ interactions: - application/json User-Agent: - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/lke/clusters/444268/control_plane_acl + url: https://api.linode.com/v4beta/lke/clusters/600208/control_plane_acl method: DELETE response: body: '{}' @@ -661,7 +792,7 @@ interactions: Content-Type: - application/json Expires: - - Mon, 19 May 2025 16:23:15 GMT + - Wed, 06 May 2026 01:49:54 GMT Pragma: - no-cache Strict-Transport-Security: @@ -678,7 +809,7 @@ interactions: X-Oauth-Scopes: - '*' X-Ratelimit-Limit: - - "1600" + - "1840" X-Xss-Protection: - 1; mode=block status: 200 OK @@ -694,7 +825,7 @@ interactions: - application/json User-Agent: - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/lke/clusters/444268/control_plane_acl + url: https://api.linode.com/v4beta/lke/clusters/600208/control_plane_acl method: GET response: body: '{"acl": {"enabled": false, "addresses": {"ipv4": [], "ipv6": []}}}' @@ -722,7 +853,7 @@ interactions: Content-Type: - application/json Expires: - - Mon, 19 May 2025 16:23:16 GMT + - Wed, 06 May 2026 01:49:55 GMT Pragma: - no-cache Strict-Transport-Security: @@ -740,7 +871,7 @@ interactions: X-Oauth-Scopes: - '*' X-Ratelimit-Limit: - - "400" + - "1840" X-Xss-Protection: - 1; mode=block status: 200 OK @@ -756,7 +887,7 @@ interactions: - application/json User-Agent: - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/lke/clusters/444268 + url: https://api.linode.com/v4beta/lke/clusters/600208 method: DELETE response: body: '{}' @@ -784,7 +915,7 @@ interactions: Content-Type: - application/json Expires: - - Mon, 19 May 2025 16:23:20 GMT + - Wed, 06 May 2026 01:49:59 GMT Pragma: - no-cache Strict-Transport-Security: @@ -801,7 +932,7 @@ interactions: X-Oauth-Scopes: - '*' X-Ratelimit-Limit: - - "1600" + - "1840" X-Xss-Protection: - 1; mode=block status: 200 OK diff --git a/test/integration/fixtures/TestLKENodePool_Update.yaml b/test/integration/fixtures/TestLKENodePool_Update.yaml index 1492f6290..2df1d8d99 100644 --- a/test/integration/fixtures/TestLKENodePool_Update.yaml +++ b/test/integration/fixtures/TestLKENodePool_Update.yaml @@ -17,165 +17,157 @@ interactions: body: '{"data": [{"id": "au-mel", "label": "Melbourne, AU", "country": "au", "capabilities": ["Linodes", "Block Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", "Object Storage", "Kubernetes", - "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "VPC IPv6 Stack", "Managed - Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", - "Maintenance Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed - Databases", "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, - "status": "ok", "resolvers": {"ipv4": "172.236.32.23,172.236.32.35,172.236.32.30,172.236.32.28,172.236.32.32,172.236.32.33,172.236.32.27,172.236.32.37,172.236.32.29,172.236.32.34", - "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "es-mad", - "label": "Madrid, ES", "country": "es", "capabilities": ["Linodes", "Block Storage - Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", - "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes - Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "VPC IPv6 - Stack", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", - "StackScripts", "Maintenance Policy", "Linode Interfaces"], "monitors": {"alerts": - ["Managed Databases"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": - "ok", "resolvers": {"ipv4": "172.233.111.6,172.233.111.17,172.233.111.21,172.233.111.25,172.233.111.19,172.233.111.12,172.233.111.26,172.233.111.16,172.233.111.18,172.233.111.9", + "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", + "Premium Plans", "Placement Group", "StackScripts", "Maintenance Policy", "Linode + Interfaces"], "monitors": {"alerts": ["Managed Databases", "NodeBalancers"], + "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": + {"ipv4": "172.236.32.23,172.236.32.35,172.236.32.30,172.236.32.28,172.236.32.32,172.236.32.33,172.236.32.27,172.236.32.37,172.236.32.29,172.236.32.34", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "in-maa", - "label": "Chennai, IN", "country": "in", "capabilities": ["Linodes", "Block + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "us-lax", + "label": "Los Angeles, CA", "country": "us", "capabilities": ["Linodes", "Block Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes - Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "VPC IPv6 - Stack", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", - "StackScripts", "NETINT Quadra T1U", "Maintenance Policy", "Linode Interfaces"], - "monitors": {"alerts": ["Managed Databases"], "metrics": ["Managed Databases", - "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "172.232.96.17,172.232.96.26,172.232.96.19,172.232.96.20,172.232.96.25,172.232.96.21,172.232.96.18,172.232.96.22,172.232.96.23,172.232.96.24", - "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "jp-osa", - "label": "Osaka, JP", "country": "jp", "capabilities": ["Linodes", "Block Storage - Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", - "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes - Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "VPC IPv6 - Stack", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", - "StackScripts", "Maintenance Policy", "Linode Interfaces"], "monitors": {"alerts": - ["Managed Databases"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": - "ok", "resolvers": {"ipv4": "172.233.64.44,172.233.64.43,172.233.64.37,172.233.64.40,172.233.64.46,172.233.64.41,172.233.64.39,172.233.64.42,172.233.64.45,172.233.64.38", - "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "it-mil", - "label": "Milan, IT", "country": "it", "capabilities": ["Linodes", "Block Storage - Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", - "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes - Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "VPC IPv6 - Stack", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", - "StackScripts", "Maintenance Policy", "Linode Interfaces"], "monitors": {"alerts": - ["Managed Databases"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": - "ok", "resolvers": {"ipv4": "172.232.192.19,172.232.192.18,172.232.192.16,172.232.192.20,172.232.192.24,172.232.192.21,172.232.192.22,172.232.192.17,172.232.192.15,172.232.192.23", - "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "us-mia", - "label": "Miami, FL", "country": "us", "capabilities": ["Linodes", "Block Storage - Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", - "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes - Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "VPC IPv6 - Stack", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", - "StackScripts", "NETINT Quadra T1U", "Maintenance Policy", "Linode Interfaces"], - "monitors": {"alerts": ["Managed Databases"], "metrics": ["Managed Databases", - "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "172.233.160.34,172.233.160.27,172.233.160.30,172.233.160.29,172.233.160.32,172.233.160.28,172.233.160.33,172.233.160.26,172.233.160.25,172.233.160.31", + Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", + "Metadata", "Premium Plans", "Placement Group", "StackScripts", "NETINT Quadra + T1U", "Maintenance Policy", "Linode Interfaces", "ACLP Logs Datacenter LKE-E"], + "monitors": {"alerts": ["Managed Databases", "NodeBalancers"], "metrics": ["Managed + Databases", "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "172.233.128.45,172.233.128.38,172.233.128.53,172.233.128.37,172.233.128.34,172.233.128.36,172.233.128.33,172.233.128.39,172.233.128.43,172.233.128.44", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "nz-akl-1", + "label": "Auckland, NZ", "country": "nz", "capabilities": ["Linodes", "Disk + Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", "Maintenance + Policy"], "monitors": {"alerts": [], "metrics": []}, "status": "ok", "resolvers": + {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": + 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": + "us-den-1", "label": "Denver, CO", "country": "us", "capabilities": ["Linodes", + "Disk Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", + "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": + "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": + 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": + "de-ham-1", "label": "Hamburg, DE", "country": "de", "capabilities": ["Linodes", + "Disk Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", + "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": + "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": + 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": + "za-jnb-1", "label": "Johannesburg, ZA", "country": "za", "capabilities": ["Linodes", + "Disk Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", + "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": + "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": + 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": + "my-kul-1", "label": "Kuala Lumpur, MY", "country": "my", "capabilities": ["Linodes", + "Disk Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", + "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": + "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": + 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": + "co-bog-1", "label": "Bogot\u00e1, CO", "country": "co", "capabilities": ["Linodes", + "Disk Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", + "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": + "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": + 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": + "mx-qro-1", "label": "Quer\u00e9taro, MX", "country": "mx", "capabilities": + ["Linodes", "Disk Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed + Plans", "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": + "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": + 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": + "us-hou-1", "label": "Houston, TX", "country": "us", "capabilities": ["Linodes", + "Disk Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", + "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": + "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": + 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": + "cl-scl-1", "label": "Santiago, CL", "country": "cl", "capabilities": ["Linodes", + "Disk Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", + "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": + "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": + 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": + "gb-lon", "label": "London 2, UK", "country": "gb", "capabilities": ["Linodes", + "Block Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", + "NodeBalancers", "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", + "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", + "Managed Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", + "NETINT Quadra T1U", "Maintenance Policy", "Linode Interfaces", "ACLP Logs Datacenter + LKE-E"], "monitors": {"alerts": ["Managed Databases", "NodeBalancers"], "metrics": + ["Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": + "172.236.0.46,172.236.0.50,172.236.0.47,172.236.0.53,172.236.0.52,172.236.0.45,172.236.0.49,172.236.0.51,172.236.0.54,172.236.0.48", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "id-cgk", "label": "Jakarta, ID", "country": "id", "capabilities": ["Linodes", "Block Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes - Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "VPC IPv6 - Stack", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", - "StackScripts", "Maintenance Policy", "Linode Interfaces"], "monitors": {"alerts": - ["Managed Databases"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", + "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "172.232.224.23,172.232.224.32,172.232.224.26,172.232.224.27,172.232.224.21,172.232.224.24,172.232.224.22,172.232.224.20,172.232.224.31,172.232.224.28", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "us-lax", - "label": "Los Angeles, CA", "country": "us", "capabilities": ["Linodes", "Block - Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", - "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes - Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "VPC IPv6 - Stack", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", - "StackScripts", "NETINT Quadra T1U", "Maintenance Policy", "Linode Interfaces", - "ACLP Logs Datacenter LKE-E"], "monitors": {"alerts": ["Managed Databases"], - "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": - {"ipv4": "172.233.128.45,172.233.128.38,172.233.128.53,172.233.128.37,172.233.128.34,172.233.128.36,172.233.128.33,172.233.128.39,172.233.128.43,172.233.128.44", - "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "gb-lon", - "label": "London 2, UK", "country": "gb", "capabilities": ["Linodes", "Block - Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", - "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes - Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "VPC IPv6 - Stack", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", - "StackScripts", "NETINT Quadra T1U", "Maintenance Policy", "Linode Interfaces", - "ACLP Logs Datacenter LKE-E"], "monitors": {"alerts": ["Managed Databases"], - "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": - {"ipv4": "172.236.0.46,172.236.0.50,172.236.0.47,172.236.0.53,172.236.0.52,172.236.0.45,172.236.0.49,172.236.0.51,172.236.0.54,172.236.0.48", - "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "se-sto", - "label": "Stockholm, SE", "country": "se", "capabilities": ["Linodes", "Block - Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", - "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes - Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "VPC IPv6 - Stack", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", - "StackScripts", "Maintenance Policy", "Linode Interfaces"], "monitors": {"alerts": - ["Managed Databases"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": - "ok", "resolvers": {"ipv4": "172.232.128.24,172.232.128.26,172.232.128.20,172.232.128.22,172.232.128.25,172.232.128.19,172.232.128.23,172.232.128.18,172.232.128.21,172.232.128.27", - "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "in-bom-2", "label": "Mumbai 2, IN", "country": "in", "capabilities": ["Linodes", "Block Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", "GPU Linodes", "Kubernetes", "Kubernetes Enterprise", "Cloud - Firewall", "Vlans", "VPCs", "VPC Dual Stack", "VPC IPv6 Stack", "Managed Databases", - "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance - Policy", "Linode Interfaces", "ACLP Logs Datacenter LKE-E"], "monitors": {"alerts": - ["Managed Databases"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": - "ok", "resolvers": {"ipv4": "172.236.171.41,172.236.171.42,172.236.171.25,172.236.171.44,172.236.171.26,172.236.171.45,172.236.171.24,172.236.171.43,172.236.171.27,172.236.171.28", + Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", + "Premium Plans", "Placement Group", "StackScripts", "Maintenance Policy", "Linode + Interfaces", "ACLP Logs Datacenter LKE-E"], "monitors": {"alerts": ["Managed + Databases", "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "172.236.171.41,172.236.171.42,172.236.171.25,172.236.171.44,172.236.171.26,172.236.171.45,172.236.171.24,172.236.171.43,172.236.171.27,172.236.171.28", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "de-fra-2", "label": "Frankfurt 2, DE", "country": "de", "capabilities": ["Linodes", "Block Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes - Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "VPC IPv6 - Stack", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", - "StackScripts", "NETINT Quadra T1U", "Maintenance Policy", "Linode Interfaces", - "ACLP Logs Datacenter LKE-E"], "monitors": {"alerts": ["Managed Databases"], - "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": - {"ipv4": "172.236.203.9,172.236.203.16,172.236.203.19,172.236.203.15,172.236.203.17,172.236.203.11,172.236.203.18,172.236.203.14,172.236.203.13,172.236.203.12", + Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", + "Metadata", "Premium Plans", "Placement Group", "StackScripts", "NETINT Quadra + T1U", "Maintenance Policy", "Linode Interfaces", "ACLP Logs Datacenter LKE-E"], + "monitors": {"alerts": ["Managed Databases", "NodeBalancers"], "metrics": ["Managed + Databases", "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "172.236.203.9,172.236.203.16,172.236.203.19,172.236.203.15,172.236.203.17,172.236.203.11,172.236.203.18,172.236.203.14,172.236.203.13,172.236.203.12", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "sg-sin-2", "label": "Singapore 2, SG", "country": "sg", "capabilities": ["Linodes", "Block Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes - Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "VPC IPv6 - Stack", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", - "StackScripts", "Maintenance Policy", "Linode Interfaces", "ACLP Logs Datacenter - LKE-E"], "monitors": {"alerts": ["Managed Databases"], "metrics": ["Managed - Databases", "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "172.236.129.8,172.236.129.42,172.236.129.41,172.236.129.19,172.236.129.46,172.236.129.23,172.236.129.48,172.236.129.20,172.236.129.21,172.236.129.47", + Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", + "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance + Policy", "Linode Interfaces", "ACLP Logs Datacenter LKE-E"], "monitors": {"alerts": + ["Managed Databases", "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "172.236.129.8,172.236.129.42,172.236.129.41,172.236.129.19,172.236.129.46,172.236.129.23,172.236.129.48,172.236.129.20,172.236.129.21,172.236.129.47", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "jp-tyo-3", "label": "Tokyo 3, JP", "country": "jp", "capabilities": ["Linodes", "Block Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes - Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "VPC IPv6 - Stack", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", - "StackScripts", "Maintenance Policy", "Linode Interfaces", "ACLP Logs Datacenter - LKE-E"], "monitors": {"alerts": ["Managed Databases"], "metrics": ["Managed - Databases", "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "172.237.4.15,172.237.4.19,172.237.4.17,172.237.4.21,172.237.4.16,172.237.4.18,172.237.4.23,172.237.4.24,172.237.4.20,172.237.4.14", - "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "no-osl-1", - "label": "Oslo, NO", "country": "no", "capabilities": ["Linodes", "Block Storage - Encryption", "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", - "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC - Dual Stack", "VPC IPv6 Stack", "Managed Databases", "Metadata", "Premium Plans", - "Placement Group", "StackScripts", "Maintenance Policy", "Linode Interfaces", + Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", + "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance + Policy", "Linode Interfaces", "ACLP Logs Datacenter LKE-E"], "monitors": {"alerts": + ["Managed Databases", "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "172.237.4.15,172.237.4.19,172.237.4.17,172.237.4.21,172.237.4.16,172.237.4.18,172.237.4.23,172.237.4.24,172.237.4.20,172.237.4.14", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "de-ber-1", + "label": "Berlin, DE", "country": "de", "capabilities": ["Linodes", "Disk Encryption", + "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", "Maintenance Policy"], + "monitors": {"alerts": [], "metrics": []}, "status": "ok", "resolvers": {"ipv4": + "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": + 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": + "no-osl-1", "label": "Oslo, NO", "country": "no", "capabilities": ["Linodes", + "Block Storage Encryption", "Disk Encryption", "Backups", "NodeBalancers", "Block + Storage", "Object Storage", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", + "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", "Premium + Plans", "Placement Group", "StackScripts", "Maintenance Policy", "Linode Interfaces", "ACLP Logs Datacenter LKE-E"], "monitors": {"alerts": ["Managed Databases", "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "172.238.140.33,172.238.140.25,172.238.140.30,172.238.140.31,172.238.140.26,172.238.140.28,172.238.140.34,172.238.140.32,172.238.140.27,172.238.140.29", @@ -184,33 +176,51 @@ interactions: 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "us-iad-2", "label": "Washington 2, DC", "country": "us", "capabilities": ["Linodes", "Block Storage Encryption", "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", - "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC - Dual Stack", "VPC IPv6 Stack", "Managed Databases", "Metadata", "Premium Plans", + "Object Storage", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", + "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance Policy", "Linode Interfaces"], - "monitors": {"alerts": ["Managed Databases"], "metrics": ["Managed Databases", - "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "172.239.142.102,172.239.142.89,172.239.142.92,172.239.142.87,172.239.142.88,172.239.142.103,172.239.142.91,172.239.142.90,172.239.142.86,172.239.142.100", + "monitors": {"alerts": ["Managed Databases", "NodeBalancers"], "metrics": ["Managed + Databases", "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "172.239.142.102,172.239.142.89,172.239.142.92,172.239.142.87,172.239.142.88,172.239.142.103,172.239.142.91,172.239.142.90,172.239.142.86,172.239.142.100", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "fr-par-2", "label": "Paris 2, FR", "country": "fr", "capabilities": ["Linodes", "Block Storage Encryption", "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", "GPU Linodes", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", - "VPCs", "VPC Dual Stack", "VPC IPv6 Stack", "Managed Databases", "Metadata", - "Premium Plans", "Placement Group", "StackScripts", "Maintenance Policy", "Linode - Interfaces", "ACLP Logs Datacenter LKE-E"], "monitors": {"alerts": ["Managed - Databases"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", - "resolvers": {"ipv4": "172.239.11.24,172.239.11.22,172.239.11.17,172.239.11.20,172.239.11.23,172.239.11.19,172.239.11.21,172.239.11.15,172.239.11.16,172.239.11.18", - "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "nl-ams", - "label": "Amsterdam, NL", "country": "nl", "capabilities": ["Linodes", "Block - Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", - "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes - Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "VPC IPv6 - Stack", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", - "StackScripts", "Maintenance Policy", "Linode Interfaces"], "monitors": {"alerts": - ["Managed Databases"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": - "ok", "resolvers": {"ipv4": "172.233.33.36,172.233.33.38,172.233.33.35,172.233.33.39,172.233.33.34,172.233.33.33,172.233.33.31,172.233.33.30,172.233.33.37,172.233.33.32", + "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", "Premium Plans", + "Placement Group", "StackScripts", "Maintenance Policy", "Linode Interfaces", + "ACLP Logs Datacenter LKE-E"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "172.239.11.24,172.239.11.22,172.239.11.17,172.239.11.20,172.239.11.23,172.239.11.19,172.239.11.21,172.239.11.15,172.239.11.16,172.239.11.18", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "us-rno-1", + "label": "Reno, NV", "country": "us", "capabilities": ["Linodes", "Disk Encryption", + "Backups", "NodeBalancers", "GPU Linodes", "Metadata", "Premium Plans", "Placement + Group", "StackScripts", "Maintenance Policy"], "monitors": {"alerts": ["NodeBalancers"], + "metrics": ["NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "", "ipv6": + ""}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "co-bog-2", + "label": "Bogot\u00e1 2, CO", "country": "co", "capabilities": ["Linodes", "Disk + Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", "Maintenance + Policy"], "monitors": {"alerts": [], "metrics": []}, "status": "ok", "resolvers": + {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": + 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": + "fr-mrs-2", "label": "Marseille 2, FR", "country": "fr", "capabilities": ["Linodes", + "Disk Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", + "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": + "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": + 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": + "us-mia", "label": "Miami, FL", "country": "us", "capabilities": ["Linodes", + "Block Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", + "NodeBalancers", "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", + "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", + "Managed Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", + "NETINT Quadra T1U", "Maintenance Policy", "Linode Interfaces"], "monitors": + {"alerts": ["Managed Databases", "NodeBalancers"], "metrics": ["Managed Databases", + "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "172.233.160.34,172.233.160.27,172.233.160.30,172.233.160.29,172.233.160.32,172.233.160.28,172.233.160.33,172.233.160.26,172.233.160.25,172.233.160.31", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "ap-west", @@ -219,8 +229,8 @@ interactions: "Block Storage", "GPU Linodes", "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", "Managed Databases", "Metadata", "Placement Group", "StackScripts", "Maintenance Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed - Databases"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", - "resolvers": {"ipv4": "172.105.34.5,172.105.35.5,172.105.36.5,172.105.37.5,172.105.38.5,172.105.39.5,172.105.40.5,172.105.41.5,172.105.42.5,172.105.43.5", + Databases", "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "172.105.34.5,172.105.35.5,172.105.36.5,172.105.37.5,172.105.38.5,172.105.39.5,172.105.40.5,172.105.41.5,172.105.42.5,172.105.43.5", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "ca-central", @@ -229,8 +239,8 @@ interactions: "Block Storage", "GPU Linodes", "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", "Managed Databases", "Metadata", "Placement Group", "StackScripts", "Maintenance Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed - Databases"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", - "resolvers": {"ipv4": "172.105.0.5,172.105.3.5,172.105.4.5,172.105.5.5,172.105.6.5,172.105.7.5,172.105.8.5,172.105.9.5,172.105.10.5,172.105.11.5", + Databases", "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "172.105.0.5,172.105.3.5,172.105.4.5,172.105.5.5,172.105.6.5,172.105.7.5,172.105.8.5,172.105.9.5,172.105.10.5,172.105.11.5", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "ap-southeast", @@ -247,10 +257,10 @@ interactions: "label": "Washington, DC", "country": "us", "capabilities": ["Linodes", "Block Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", "Object Storage", "Kubernetes", "Kubernetes Enterprise", "Cloud - Firewall", "Vlans", "VPCs", "VPC Dual Stack", "VPC IPv6 Stack", "Managed Databases", - "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance - Policy", "Linode Interfaces", "ACLP Logs Datacenter LKE-E"], "monitors": {"alerts": - ["Managed Databases", "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, + Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", + "Premium Plans", "Placement Group", "StackScripts", "Maintenance Policy", "Linode + Interfaces", "ACLP Logs Datacenter LKE-E"], "monitors": {"alerts": ["Managed + Databases", "NodeBalancers"], "metrics": ["Linodes", "Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "139.144.192.62,139.144.192.60,139.144.192.61,139.144.192.53,139.144.192.54,139.144.192.67,139.144.192.69,139.144.192.66,139.144.192.52,139.144.192.68", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": @@ -258,21 +268,21 @@ interactions: "label": "Chicago, IL", "country": "us", "capabilities": ["Linodes", "Block Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes - Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "VPC IPv6 - Stack", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", - "StackScripts", "Maintenance Policy", "Linode Interfaces", "ACLP Logs Datacenter - LKE-E"], "monitors": {"alerts": ["Managed Databases"], "metrics": ["Managed - Databases", "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "172.232.0.17,172.232.0.16,172.232.0.21,172.232.0.13,172.232.0.22,172.232.0.9,172.232.0.19,172.232.0.20,172.232.0.15,172.232.0.18", + Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", + "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance + Policy", "Linode Interfaces", "ACLP Logs Datacenter LKE-E"], "monitors": {"alerts": + ["Managed Databases", "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "172.232.0.17,172.232.0.16,172.232.0.21,172.232.0.13,172.232.0.22,172.232.0.9,172.232.0.19,172.232.0.20,172.232.0.15,172.232.0.18", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "fr-par", "label": "Paris, FR", "country": "fr", "capabilities": ["Linodes", "Block Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes - Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "VPC IPv6 - Stack", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", - "StackScripts", "Maintenance Policy", "Linode Interfaces"], "monitors": {"alerts": - ["Managed Databases"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", + "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "172.232.32.21,172.232.32.23,172.232.32.17,172.232.32.18,172.232.32.16,172.232.32.22,172.232.32.20,172.232.32.14,172.232.32.11,172.232.32.12", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": @@ -280,32 +290,98 @@ interactions: "label": "Seattle, WA", "country": "us", "capabilities": ["Linodes", "Block Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes - Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "VPC IPv6 - Stack", "Managed Databases", "Metadata", "Premium Plans", "Placement Group", - "StackScripts", "Maintenance Policy", "Linode Interfaces", "ACLP Logs Datacenter - LKE-E"], "monitors": {"alerts": ["Managed Databases"], "metrics": ["Managed - Databases", "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "172.232.160.19,172.232.160.21,172.232.160.17,172.232.160.15,172.232.160.18,172.232.160.8,172.232.160.12,172.232.160.11,172.232.160.14,172.232.160.16", + Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", + "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance + Policy", "Linode Interfaces", "ACLP Logs Datacenter LKE-E"], "monitors": {"alerts": + ["Managed Databases", "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "172.232.160.19,172.232.160.21,172.232.160.17,172.232.160.15,172.232.160.18,172.232.160.8,172.232.160.12,172.232.160.11,172.232.160.14,172.232.160.16", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "br-gru", "label": "Sao Paulo, BR", "country": "br", "capabilities": ["Linodes", "Block Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", "Object Storage", "Kubernetes", "Kubernetes Enterprise", "Cloud - Firewall", "Vlans", "VPCs", "VPC Dual Stack", "VPC IPv6 Stack", "Managed Databases", - "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance - Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases"], + Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", + "Premium Plans", "Placement Group", "StackScripts", "Maintenance Policy", "Linode + Interfaces"], "monitors": {"alerts": ["Managed Databases", "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "172.233.0.4,172.233.0.9,172.233.0.7,172.233.0.12,172.233.0.5,172.233.0.13,172.233.0.10,172.233.0.6,172.233.0.8,172.233.0.11", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "nl-ams", + "label": "Amsterdam, NL", "country": "nl", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes + Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", + "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "172.233.33.36,172.233.33.38,172.233.33.35,172.233.33.39,172.233.33.34,172.233.33.33,172.233.33.31,172.233.33.30,172.233.33.37,172.233.33.32", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "se-sto", + "label": "Stockholm, SE", "country": "se", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes + Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", + "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "172.232.128.24,172.232.128.26,172.232.128.20,172.232.128.22,172.232.128.25,172.232.128.19,172.232.128.23,172.232.128.18,172.232.128.21,172.232.128.27", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "es-mad", + "label": "Madrid, ES", "country": "es", "capabilities": ["Linodes", "Block Storage + Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes + Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", + "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "172.233.111.6,172.233.111.17,172.233.111.21,172.233.111.25,172.233.111.19,172.233.111.12,172.233.111.26,172.233.111.16,172.233.111.18,172.233.111.9", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "in-maa", + "label": "Chennai, IN", "country": "in", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes + Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", + "Metadata", "Premium Plans", "Placement Group", "StackScripts", "NETINT Quadra + T1U", "Maintenance Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed + Databases", "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "172.232.96.17,172.232.96.26,172.232.96.19,172.232.96.20,172.232.96.25,172.232.96.21,172.232.96.18,172.232.96.22,172.232.96.23,172.232.96.24", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "jp-osa", + "label": "Osaka, JP", "country": "jp", "capabilities": ["Linodes", "Block Storage + Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes + Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", + "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "172.233.64.44,172.233.64.43,172.233.64.37,172.233.64.40,172.233.64.46,172.233.64.41,172.233.64.39,172.233.64.42,172.233.64.45,172.233.64.38", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "it-mil", + "label": "Milan, IT", "country": "it", "capabilities": ["Linodes", "Block Storage + Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes + Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", + "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "172.232.192.19,172.232.192.18,172.232.192.16,172.232.192.20,172.232.192.24,172.232.192.21,172.232.192.22,172.232.192.17,172.232.192.15,172.232.192.23", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "us-central", "label": "Dallas, TX", "country": "us", "capabilities": ["Linodes", "Block Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", "Managed Databases", "Metadata", "Placement Group", "StackScripts", "Maintenance - Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases"], - "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": - {"ipv4": "72.14.179.5,72.14.188.5,173.255.199.5,66.228.53.5,96.126.122.5,96.126.124.5,96.126.127.5,198.58.107.5,198.58.111.5,23.239.24.5", + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "72.14.179.5,72.14.188.5,173.255.199.5,66.228.53.5,96.126.122.5,96.126.124.5,96.126.127.5,198.58.107.5,198.58.111.5,23.239.24.5", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "ap-northeast", @@ -313,9 +389,9 @@ interactions: Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", "Managed Databases", "Metadata", "Placement Group", "StackScripts", "Maintenance - Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases"], - "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": - {"ipv4": "139.162.66.5,139.162.67.5,139.162.68.5,139.162.69.5,139.162.70.5,139.162.71.5,139.162.72.5,139.162.73.5,139.162.74.5,139.162.75.5", + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "139.162.66.5,139.162.67.5,139.162.68.5,139.162.69.5,139.162.70.5,139.162.71.5,139.162.72.5,139.162.73.5,139.162.74.5,139.162.75.5", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "eu-central", @@ -324,8 +400,8 @@ interactions: "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", "Managed Databases", "Metadata", "Placement Group", "StackScripts", "Maintenance Policy", "Linode Interfaces"], "monitors": - {"alerts": ["Managed Databases"], "metrics": ["Managed Databases", "NodeBalancers"]}, - "status": "ok", "resolvers": {"ipv4": "139.162.130.5,139.162.131.5,139.162.132.5,139.162.133.5,139.162.134.5,139.162.135.5,139.162.136.5,139.162.137.5,139.162.138.5,139.162.139.5", + {"alerts": ["Managed Databases", "NodeBalancers"], "metrics": ["Managed Databases", + "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "139.162.130.5,139.162.131.5,139.162.132.5,139.162.133.5,139.162.134.5,139.162.135.5,139.162.136.5,139.162.137.5,139.162.138.5,139.162.139.5", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "ap-south", @@ -333,8 +409,8 @@ interactions: Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", "Metadata", "Placement Group", "StackScripts", - "Maintenance Policy", "Linode Interfaces"], "monitors": {"alerts": [], "metrics": - ["NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "139.162.11.5,139.162.13.5,139.162.14.5,139.162.15.5,139.162.16.5,139.162.21.5,139.162.27.5,103.3.60.18,103.3.60.19,103.3.60.20", + "Maintenance Policy", "Linode Interfaces"], "monitors": {"alerts": ["NodeBalancers"], + "metrics": ["NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "139.162.11.5,139.162.13.5,139.162.14.5,139.162.15.5,139.162.16.5,139.162.21.5,139.162.27.5,103.3.60.18,103.3.60.19,103.3.60.20", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "eu-west", @@ -342,20 +418,20 @@ interactions: Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", "Metadata", "Placement Group", "StackScripts", "Maintenance Policy", "Linode - Interfaces"], "monitors": {"alerts": [], "metrics": ["NodeBalancers"]}, "status": - "ok", "resolvers": {"ipv4": "178.79.182.5, 176.58.107.5, 176.58.116.5, 176.58.121.5, - 151.236.220.5, 212.71.252.5, 212.71.253.5, 109.74.192.20, 109.74.193.20, 109.74.194.20", - "ipv6": "1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678"}, "placement_group_limits": - {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": - 5}, "site_type": "core"}, {"id": "us-east", "label": "Newark, NJ", "country": - "us", "capabilities": ["Linodes", "Block Storage Encryption", "LA Disk Encryption", - "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", "Object Storage", - "GPU Linodes", "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", - "Managed Databases", "Metadata", "Placement Group", "StackScripts", "Maintenance - Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases"], - "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": - {"ipv4": "66.228.42.5,96.126.106.5,50.116.53.5,50.116.58.5,50.116.61.5,50.116.62.5,66.175.211.5,97.107.133.4,173.255.225.5,66.228.35.5", + Interfaces"], "monitors": {"alerts": ["NodeBalancers"], "metrics": ["NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "178.79.182.5, 176.58.107.5, 176.58.116.5, + 176.58.121.5, 151.236.220.5, 212.71.252.5, 212.71.253.5, 109.74.192.20, 109.74.193.20, + 109.74.194.20", "ipv6": "1234::5678, 1234::5678, 1234::5678, 1234::5678, + 1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "us-east", + "label": "Newark, NJ", "country": "us", "capabilities": ["Linodes", "Block Storage + Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Cloud Firewall", + "Vlans", "Block Storage Migrations", "Managed Databases", "Metadata", "Placement + Group", "StackScripts", "Maintenance Policy", "Linode Interfaces"], "monitors": + {"alerts": ["Managed Databases", "NodeBalancers"], "metrics": ["Managed Databases", + "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "66.228.42.5,96.126.106.5,50.116.53.5,50.116.58.5,50.116.61.5,50.116.62.5,66.175.211.5,97.107.133.4,173.255.225.5,66.228.35.5", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "us-southeast", @@ -364,8 +440,8 @@ interactions: "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", "Managed Databases", "Metadata", "Placement Group", "StackScripts", "Maintenance Policy", "Linode Interfaces"], "monitors": - {"alerts": ["Managed Databases"], "metrics": ["Managed Databases", "NodeBalancers"]}, - "status": "ok", "resolvers": {"ipv4": "74.207.231.5,173.230.128.5,173.230.129.5,173.230.136.5,173.230.140.5,66.228.59.5,66.228.62.5,50.116.35.5,50.116.41.5,23.239.18.5", + {"alerts": ["Managed Databases", "NodeBalancers"], "metrics": ["Managed Databases", + "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "74.207.231.5,173.230.128.5,173.230.129.5,173.230.136.5,173.230.140.5,66.228.59.5,66.228.62.5,50.116.35.5,50.116.41.5,23.239.18.5", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "us-west", @@ -373,14 +449,14 @@ interactions: Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", "Managed Databases", "Metadata", "Placement Group", "StackScripts", "Maintenance - Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases"], - "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": - {"ipv4": "173.230.145.5, 173.230.147.5, 173.230.155.5, 173.255.212.5, 173.255.219.5, - 173.255.241.5, 173.255.243.5, 173.255.244.5, 74.207.241.5, 74.207.242.5", "ipv6": - "1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678, 1234::5678"}, "placement_group_limits": + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "173.230.145.5, 173.230.147.5, 173.230.155.5, 173.255.212.5, + 173.255.219.5, 173.255.241.5, 173.255.243.5, 173.255.244.5, 74.207.241.5, 74.207.242.5", + "ipv6": "1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678, + 1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": - 5}, "site_type": "core"}], "page": 1, "pages": 1, "results": 34}' + 5}, "site_type": "core"}], "page": 1, "pages": 1, "results": 47}' headers: Access-Control-Allow-Credentials: - "true" @@ -403,7 +479,7 @@ interactions: Content-Type: - application/json Expires: - - Thu, 26 Mar 2026 19:18:42 GMT + - Wed, 06 May 2026 02:20:20 GMT Pragma: - no-cache Strict-Transport-Security: @@ -441,17 +517,8 @@ interactions: url: https://api.linode.com/v4beta/lke/tiers/standard/versions?page=1 method: GET response: - body: '{"data": [{"id": "1.35", "tier": "standard"}, {"id": "1.34", "tier": "standard"}, - {"id": "1.33", "tier": "standard"}, {"id": "1.32", "tier": "standard"}, {"id": - "1.31", "tier": "standard"}, {"id": "1.30", "tier": "standard"}, {"id": "1.29", - "tier": "standard"}, {"id": "1.28", "tier": "standard"}, {"id": "1.27", "tier": - "standard"}, {"id": "1.26", "tier": "standard"}, {"id": "1.25", "tier": "standard"}, - {"id": "1.24", "tier": "standard"}, {"id": "1.23", "tier": "standard"}, {"id": - "1.22", "tier": "standard"}, {"id": "1.21", "tier": "standard"}, {"id": "1.20", - "tier": "standard"}, {"id": "1.19", "tier": "standard"}, {"id": "1.18", "tier": - "standard"}, {"id": "1.17", "tier": "standard"}, {"id": "1.15", "tier": "standard"}, - {"id": "1.16", "tier": "standard"}, {"id": "1.14", "tier": "standard"}, {"id": - "1.13", "tier": "standard"}], "page": 1, "pages": 1, "results": 23}' + body: '{"data": [{"id": "1.35", "tier": "standard"}, {"id": "1.34", "tier": "standard"}], + "page": 1, "pages": 1, "results": 2}' headers: Access-Control-Allow-Credentials: - "true" @@ -469,12 +536,14 @@ interactions: - max-age=0, no-cache, no-store Connection: - keep-alive + Content-Length: + - "119" Content-Security-Policy: - default-src 'none' Content-Type: - application/json Expires: - - Thu, 26 Mar 2026 19:18:42 GMT + - Wed, 06 May 2026 02:20:20 GMT Pragma: - no-cache Strict-Transport-Security: @@ -482,7 +551,6 @@ interactions: Vary: - Authorization, X-Filter - Authorization, X-Filter - - Accept-Encoding X-Accepted-Oauth-Scopes: - lke:read_only X-Content-Type-Options: @@ -510,7 +578,7 @@ interactions: url: https://api.linode.com/v4beta/lke/clusters method: POST response: - body: '{"id": 584698, "status": "ready", "created": "2018-01-02T03:04:05", "updated": + body: '{"id": 600212, "status": "ready", "created": "2018-01-02T03:04:05", "updated": "2018-01-02T03:04:05", "label": "go-lke-test-def", "region": "au-mel", "k8s_version": "1.35", "tier": "standard", "control_plane": {"high_availability": false}, "apl_enabled": false, "tags": ["testing"], "locks": []}' @@ -538,7 +606,7 @@ interactions: Content-Type: - application/json Expires: - - Thu, 26 Mar 2026 19:18:50 GMT + - Wed, 06 May 2026 02:20:28 GMT Pragma: - no-cache Strict-Transport-Security: @@ -571,12 +639,12 @@ interactions: - application/json User-Agent: - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/lke/clusters/584698/pools + url: https://api.linode.com/v4beta/lke/clusters/600212/pools method: POST response: - body: '{"id": 855505, "type": "g6-standard-2", "label": "", "count": 2, "nodes": - [{"id": "855505-03c5d1140000", "instance_id": 94907209, "status": "not_ready"}, - {"id": "855505-3b671b360000", "instance_id": null, "status": "not_ready"}], + body: '{"id": 880477, "type": "g6-standard-2", "label": "", "count": 2, "nodes": + [{"id": "880477-07c1ed2b0000", "instance_id": 97190708, "status": "not_ready"}, + {"id": "880477-082adf5a0000", "instance_id": null, "status": "not_ready"}], "disks": [{"size": 1000, "type": "ext4"}], "autoscaler": {"enabled": false, "min": 2, "max": 2}, "labels": {}, "taints": [], "tags": ["testing"], "disk_encryption": "enabled", "locks": []}' @@ -604,7 +672,7 @@ interactions: Content-Type: - application/json Expires: - - Thu, 26 Mar 2026 19:18:52 GMT + - Wed, 06 May 2026 02:20:30 GMT Pragma: - no-cache Strict-Transport-Security: @@ -637,12 +705,12 @@ interactions: - application/json User-Agent: - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/lke/clusters/584698/pools/855505 + url: https://api.linode.com/v4beta/lke/clusters/600212/pools/880477 method: PUT response: - body: '{"id": 855505, "type": "g6-standard-2", "label": "", "count": 2, "nodes": - [{"id": "855505-03c5d1140000", "instance_id": 94907209, "status": "not_ready"}, - {"id": "855505-3b671b360000", "instance_id": null, "status": "not_ready"}], + body: '{"id": 880477, "type": "g6-standard-2", "label": "", "count": 2, "nodes": + [{"id": "880477-07c1ed2b0000", "instance_id": 97190708, "status": "not_ready"}, + {"id": "880477-082adf5a0000", "instance_id": 97190709, "status": "not_ready"}], "disks": [{"size": 1000, "type": "ext4"}], "autoscaler": {"enabled": true, "min": 2, "max": 5}, "labels": {}, "taints": [], "tags": [], "disk_encryption": "enabled", "locks": []}' @@ -664,13 +732,13 @@ interactions: Connection: - keep-alive Content-Length: - - "408" + - "412" Content-Security-Policy: - default-src 'none' Content-Type: - application/json Expires: - - Thu, 26 Mar 2026 19:18:54 GMT + - Wed, 06 May 2026 02:20:32 GMT Pragma: - no-cache Strict-Transport-Security: @@ -703,13 +771,13 @@ interactions: - application/json User-Agent: - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/lke/clusters/584698/pools/855505 + url: https://api.linode.com/v4beta/lke/clusters/600212/pools/880477 method: PUT response: - body: '{"id": 855505, "type": "g6-standard-2", "label": "", "count": 3, "nodes": - [{"id": "855505-03c5d1140000", "instance_id": 94907209, "status": "not_ready"}, - {"id": "855505-242f20850000", "instance_id": 94907215, "status": "not_ready"}, - {"id": "855505-3b671b360000", "instance_id": 94907213, "status": "not_ready"}], + body: '{"id": 880477, "type": "g6-standard-2", "label": "", "count": 3, "nodes": + [{"id": "880477-07c1ed2b0000", "instance_id": 97190708, "status": "not_ready"}, + {"id": "880477-082adf5a0000", "instance_id": 97190709, "status": "not_ready"}, + {"id": "880477-2286c1820000", "instance_id": 97190711, "status": "not_ready"}], "disks": [{"size": 1000, "type": "ext4"}], "autoscaler": {"enabled": true, "min": 2, "max": 5}, "labels": {"foo": "bar"}, "taints": [{"key": "foo", "value": "bar", "effect": "NoSchedule"}], "tags": ["bar", "foo", "test"], "disk_encryption": @@ -738,7 +806,7 @@ interactions: Content-Type: - application/json Expires: - - Thu, 26 Mar 2026 19:18:57 GMT + - Wed, 06 May 2026 02:20:36 GMT Pragma: - no-cache Strict-Transport-Security: @@ -771,7 +839,7 @@ interactions: - application/json User-Agent: - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/lke/clusters/584698/pools/855505 + url: https://api.linode.com/v4beta/lke/clusters/600212/pools/880477 method: DELETE response: body: '{}' @@ -799,7 +867,7 @@ interactions: Content-Type: - application/json Expires: - - Thu, 26 Mar 2026 19:19:00 GMT + - Wed, 06 May 2026 02:20:38 GMT Pragma: - no-cache Strict-Transport-Security: @@ -832,7 +900,7 @@ interactions: - application/json User-Agent: - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/lke/clusters/584698 + url: https://api.linode.com/v4beta/lke/clusters/600212 method: DELETE response: body: '{}' @@ -860,7 +928,7 @@ interactions: Content-Type: - application/json Expires: - - Thu, 26 Mar 2026 19:19:04 GMT + - Wed, 06 May 2026 02:20:42 GMT Pragma: - no-cache Strict-Transport-Security: diff --git a/test/integration/fixtures/TestMaintenancePolicies_List.yaml b/test/integration/fixtures/TestMaintenancePolicies_List.yaml index 54b36a96c..e700c5a77 100644 --- a/test/integration/fixtures/TestMaintenancePolicies_List.yaml +++ b/test/integration/fixtures/TestMaintenancePolicies_List.yaml @@ -11,17 +11,17 @@ interactions: - application/json User-Agent: - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/maintenance/policies + url: https://api.linode.com/v4beta/maintenance/policies?page=1 method: GET response: body: '{"data": [{"slug": "linode/migrate", "label": "Migrate", "description": "Migrates the Linode to a new host while it remains fully operational. Recommended for maximizing availability.", "type": "migrate", "notification_period_sec": - 300, "is_default": true}, {"slug": "linode/power_off_on", "label": "Power-off/on", - "description": "Powers off the Linode at the start of the maintenance event - and reboots it once the maintenance finishes. Recommended for maximizing performance.", - "type": "power_off_on", "notification_period_sec": 1800, "is_default": false}], - "page": 1, "pages": 1, "results": 2}' + 10800, "is_default": true}, {"slug": "linode/power_off_on", "label": "Power + Off / Power On", "description": "Powers off the Linode at the start of the maintenance + event and reboots it once the maintenance finishes. Recommended for maximizing + performance.", "type": "power_off_on", "notification_period_sec": 604800, "is_default": + false}], "page": 1, "pages": 1, "results": 2}' headers: Access-Control-Allow-Credentials: - "true" @@ -33,22 +33,24 @@ interactions: - '*' Access-Control-Expose-Headers: - X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Status + Akamai-Internal-Account: + - '*' Cache-Control: - - private, max-age=0, s-maxage=0, no-cache, no-store - - private, max-age=60, s-maxage=60 + - max-age=0, no-cache, no-store Connection: - keep-alive Content-Length: - - "595" + - "607" Content-Security-Policy: - default-src 'none' Content-Type: - application/json - Server: - - nginx/1.18.0 + Expires: + - Tue, 21 Apr 2026 18:20:32 GMT + Pragma: + - no-cache Strict-Transport-Security: - max-age=31536000 - - max-age=31536000 Vary: - Authorization, X-Filter - Authorization, X-Filter @@ -62,7 +64,7 @@ interactions: X-Oauth-Scopes: - unknown X-Ratelimit-Limit: - - "400" + - "1840" X-Xss-Protection: - 1; mode=block status: 200 OK diff --git a/test/integration/fixtures/TestObjectStorageBucketCert.yaml b/test/integration/fixtures/TestObjectStorageBucketCert.yaml index 4f2026682..961169eb8 100644 --- a/test/integration/fixtures/TestObjectStorageBucketCert.yaml +++ b/test/integration/fixtures/TestObjectStorageBucketCert.yaml @@ -14,25 +14,33 @@ interactions: url: https://api.linode.com/v4beta/object-storage/endpoints?page=1 method: GET response: - body: '{"pages": 1, "page": 1, "results": 18, "data": [{"region": "fr-par", "endpoint_type": - "E1", "s3_endpoint": "fr-par-1.linodeobjects.com"}, {"region": "ap-south", "endpoint_type": - "E0", "s3_endpoint": "ap-south-1.linodeobjects.com"}, {"region": "us-sea", "endpoint_type": - "E1", "s3_endpoint": "us-sea-1.linodeobjects.com"}, {"region": "us-east", "endpoint_type": - "E0", "s3_endpoint": "us-east-1.linodeobjects.com"}, {"region": "us-southeast", + body: '{"data": [{"region": "ap-south", "endpoint_type": "E0", "s3_endpoint": + "ap-south-1.linodeobjects.com"}, {"region": "us-iad", "endpoint_type": "E1", + "s3_endpoint": "us-iad-1.linodeobjects.com"}, {"region": "fr-par", "endpoint_type": + "E1", "s3_endpoint": "fr-par-1.linodeobjects.com"}, {"region": "us-southeast", "endpoint_type": "E0", "s3_endpoint": "us-southeast-1.linodeobjects.com"}, {"region": - "jp-osa", "endpoint_type": "E1", "s3_endpoint": "jp-osa-1.linodeobjects.com"}, - {"region": "br-gru", "endpoint_type": "E1", "s3_endpoint": "br-gru-1.linodeobjects.com"}, - {"region": "us-ord", "endpoint_type": "E1", "s3_endpoint": "us-ord-1.linodeobjects.com"}, - {"region": "us-iad", "endpoint_type": "E1", "s3_endpoint": "us-iad-1.linodeobjects.com"}, - {"region": "se-sto", "endpoint_type": "E1", "s3_endpoint": "se-sto-1.linodeobjects.com"}, - {"region": "it-mil", "endpoint_type": "E1", "s3_endpoint": "it-mil-1.linodeobjects.com"}, + "br-gru", "endpoint_type": "E1", "s3_endpoint": "br-gru-1.linodeobjects.com"}, + {"region": "au-mel", "endpoint_type": "E2", "s3_endpoint": "au-mel-1.linodeobjects.com"}, + {"region": "in-maa", "endpoint_type": "E1", "s3_endpoint": "in-maa-1.linodeobjects.com"}, + {"region": "us-sea", "endpoint_type": "E1", "s3_endpoint": "us-sea-1.linodeobjects.com"}, + {"region": "de-fra-2", "endpoint_type": "E3", "s3_endpoint": "de-fra-1.linodeobjects.com"}, + {"region": "us-lax", "endpoint_type": "E3", "s3_endpoint": "us-lax-4.linodeobjects.com"}, {"region": "us-lax", "endpoint_type": "E1", "s3_endpoint": "us-lax-1.linodeobjects.com"}, - {"region": "nl-ams", "endpoint_type": "E1", "s3_endpoint": "nl-ams-1.linodeobjects.com"}, + {"region": "it-mil", "endpoint_type": "E1", "s3_endpoint": "it-mil-1.linodeobjects.com"}, {"region": "us-mia", "endpoint_type": "E1", "s3_endpoint": "us-mia-1.linodeobjects.com"}, + {"region": "se-sto", "endpoint_type": "E1", "s3_endpoint": "se-sto-1.linodeobjects.com"}, + {"region": "id-cgk", "endpoint_type": "E1", "s3_endpoint": "id-cgk-1.linodeobjects.com"}, {"region": "eu-central", "endpoint_type": "E0", "s3_endpoint": "eu-central-1.linodeobjects.com"}, - {"region": "in-maa", "endpoint_type": "E1", "s3_endpoint": "in-maa-1.linodeobjects.com"}, + {"region": "gb-lon", "endpoint_type": "E3", "s3_endpoint": "gb-lon-1.linodeobjects.com"}, + {"region": "nl-ams", "endpoint_type": "E1", "s3_endpoint": "nl-ams-1.linodeobjects.com"}, {"region": "es-mad", "endpoint_type": "E1", "s3_endpoint": "es-mad-1.linodeobjects.com"}, - {"region": "id-cgk", "endpoint_type": "E1", "s3_endpoint": "id-cgk-1.linodeobjects.com"}]}' + {"region": "jp-osa", "endpoint_type": "E1", "s3_endpoint": "jp-osa-1.linodeobjects.com"}, + {"region": "us-east", "endpoint_type": "E0", "s3_endpoint": "us-east-1.linodeobjects.com"}, + {"region": "sg-sin-2", "endpoint_type": "E3", "s3_endpoint": "sg-sin-1.linodeobjects.com"}, + {"region": "jp-tyo-3", "endpoint_type": "E3", "s3_endpoint": "jp-tyo-1.linodeobjects.com"}, + {"region": "us-ord", "endpoint_type": "E1", "s3_endpoint": "us-ord-1.linodeobjects.com"}, + {"region": "us-ord", "endpoint_type": "E3", "s3_endpoint": "us-ord-10.linodeobjects.com"}], + "page": 1, "pages": 1, "results": 25}' headers: Access-Control-Allow-Credentials: - "true" @@ -55,7 +63,7 @@ interactions: Content-Type: - application/json Expires: - - Wed, 08 Jan 2025 07:13:19 GMT + - Thu, 30 Apr 2026 20:17:48 GMT Pragma: - no-cache Strict-Transport-Security: @@ -74,14 +82,14 @@ interactions: X-Oauth-Scopes: - '*' X-Ratelimit-Limit: - - "1600" + - "1840" X-Xss-Protection: - 1; mode=block status: 200 OK code: 200 duration: "" - request: - body: '{"region":"fr-par","label":"linode-obj-bucket-cert-test.xyz","endpoint_type":"E1"}' + body: '{"region":"us-iad","label":"linode-obj-bucket-cert-test.xyz","endpoint_type":"E1"}' form: {} headers: Accept: @@ -93,10 +101,10 @@ interactions: url: https://api.linode.com/v4beta/object-storage/buckets method: POST response: - body: '{"hostname": "linode-obj-bucket-cert-test.xyz.fr-par-1.linodeobjects.com", + body: '{"hostname": "linode-obj-bucket-cert-test.xyz.us-iad-1.linodeobjects.com", "label": "linode-obj-bucket-cert-test.xyz", "created": "2018-01-02T03:04:05", - "region": "fr-par", "cluster": "fr-par-1", "size": 0, "objects": 0, "endpoint_type": - "E1", "s3_endpoint": "fr-par-1.linodeobjects.com"}' + "region": "us-iad", "cluster": "us-iad-1", "size": 0, "objects": 0, "endpoint_type": + "E1", "s3_endpoint": "us-iad-1.linodeobjects.com"}' headers: Access-Control-Allow-Credentials: - "true" @@ -121,7 +129,7 @@ interactions: Content-Type: - application/json Expires: - - Wed, 08 Jan 2025 07:13:22 GMT + - Thu, 30 Apr 2026 20:17:50 GMT Pragma: - no-cache Strict-Transport-Security: @@ -138,7 +146,7 @@ interactions: X-Oauth-Scopes: - '*' X-Ratelimit-Limit: - - "1600" + - "60" X-Xss-Protection: - 1; mode=block status: 200 OK @@ -156,7 +164,7 @@ interactions: - application/json User-Agent: - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/object-storage/buckets/fr-par/linode-obj-bucket-cert-test.xyz/ssl + url: https://api.linode.com/v4beta/object-storage/buckets/us-iad/linode-obj-bucket-cert-test.xyz/ssl method: POST response: body: '{"ssl": true}' @@ -184,68 +192,7 @@ interactions: Content-Type: - application/json Expires: - - Wed, 08 Jan 2025 07:13:24 GMT - Pragma: - - no-cache - Strict-Transport-Security: - - max-age=31536000 - Vary: - - Authorization, X-Filter - X-Accepted-Oauth-Scopes: - - object_storage:read_write - X-Content-Type-Options: - - nosniff - X-Frame-Options: - - DENY - - DENY - X-Oauth-Scopes: - - '*' - X-Ratelimit-Limit: - - "1600" - X-Xss-Protection: - - 1; mode=block - status: 200 OK - code: 200 - duration: "" -- request: - body: "" - form: {} - headers: - Accept: - - application/json - Content-Type: - - application/json - User-Agent: - - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/object-storage/buckets/fr-par/linode-obj-bucket-cert-test.xyz/ssl - method: DELETE - response: - body: '{}' - headers: - Access-Control-Allow-Credentials: - - "true" - Access-Control-Allow-Headers: - - Authorization, Origin, X-Requested-With, Content-Type, Accept, X-Filter - Access-Control-Allow-Methods: - - HEAD, GET, OPTIONS, POST, PUT, DELETE - Access-Control-Allow-Origin: - - '*' - Access-Control-Expose-Headers: - - X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Status - Akamai-Internal-Account: - - '*' - Cache-Control: - - max-age=0, no-cache, no-store - Connection: - - keep-alive - Content-Length: - - "2" - Content-Security-Policy: - - default-src 'none' - Content-Type: - - application/json - Expires: - - Wed, 08 Jan 2025 07:13:26 GMT + - Thu, 30 Apr 2026 20:17:51 GMT Pragma: - no-cache Strict-Transport-Security: @@ -262,132 +209,7 @@ interactions: X-Oauth-Scopes: - '*' X-Ratelimit-Limit: - - "1600" - X-Xss-Protection: - - 1; mode=block - status: 200 OK - code: 200 - duration: "" -- request: - body: '{"certificate":"-----BEGIN CERTIFICATE-----\nMIIF3DCCA8QCCQC0dUFu1HvjazANBgkqhkiG9w0BAQsFADCBrzELMAkGA1UEBhMC\nVVMxCzAJBgNVBAgMAlBBMRUwEwYDVQQHDAxQaGlsYWRlbHBoaWExDzANBgNVBAoM\nBkxpbm9kZTELMAkGA1UECwwCRFgxKDAmBgNVBAMMH2xpbm9kZS1vYmotYnVja2V0\nLWNlcnQtdGVzdC54eXoxNDAyBgkqhkiG9w0BCQEWJWFkbWluQGxpbm9kZS1vYmot\nYnVja2V0LWNlcnQtdGVzdC54eXowHhcNMjAxMDA1MTg0MDUyWhcNMjExMDA1MTg0\nMDUyWjCBrzELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAlBBMRUwEwYDVQQHDAxQaGls\nYWRlbHBoaWExDzANBgNVBAoMBkxpbm9kZTELMAkGA1UECwwCRFgxKDAmBgNVBAMM\nH2xpbm9kZS1vYmotYnVja2V0LWNlcnQtdGVzdC54eXoxNDAyBgkqhkiG9w0BCQEW\nJWFkbWluQGxpbm9kZS1vYmotYnVja2V0LWNlcnQtdGVzdC54eXowggIiMA0GCSqG\nSIb3DQEBAQUAA4ICDwAwggIKAoICAQCy4LqfRYXE314e6YkpR1BbKPH8ohO4lcMt\n+YzMUNlOC1KUktGjX8pWk4wAXYar7Mxccmbbh68pgE8iSio8V97CdQb8O64OQmre\n/y33z7Yts37/6mH5mBnfeiilVHOenQmh+4400tvF1jljU8MZSg6sLM4ZEBhfcT0V\n3yqxAwwzV8vk0t7uLRCMuDI5B4h4ZCsheCkA2roF4RGUG6KwGzf+dLSKzBcjy5ho\nh4huzp5jDYer7S86dV6/9Gwzh8CPhVaixbymHGoMbJM8lUtc/hFI+J8WVh/qLTKQ\nCcqvoZ96QU0LX2ib+ElvCMGl/UrznpHZUrGkLPfnnoxK/vKBNycJsENtWno9KgtN\nfsdmYy/blxNRW/qpi+l92f3zbjjpRqJ/oyA+hsSMn19O/v3O4wz+YS55xnVeEPIf\nfOq6VJ9BfVdXPPRp33sllM8EVWuS4ry3oJKI1CFTlhV7eU1RpJmbc5X8GhytiD2M\ngIrVlYzJTftSHw7J3v0orRD6SxI9enXI4o4pS1MMxRNb+ZQDvwx3ZujxjFXe3+qI\nkme3ih+Vl9W9rDeKAd95ciII9CxBqOvsso8zqDAEV25fn3tutk/7hQNMqv0APAah\nLo/eY1NK9i9YVJknVSzWBkE2MUyvpfFhiw6TPYh88qH+wN3CznWaCtXiAjH3kbOk\n6y2OmI8+4QIDAQABMA0GCSqGSIb3DQEBCwUAA4ICAQCP2UawP8GDWxyMOsHDPqKp\nPtedCxPpEPsQm8KMnt5KJ55NFqTcpARz1miHXT1aBedu9IoqxvTP4g8BQ4QFjP2s\nddNu2WKqnwyzkCtnB2zOrOKlvUtRAZ4x2iyhKNqls6D7I4tw22HMbTzW2TVeuGVa\noiRtawFcUsjSAcarRw6swLTln+BK54dWa9E5hiulBoHLosMWCEyUDrUnaiB+2+7C\nbsExYZTXRlii7YPSr46zPmte2iKa1+b0g5DXkzSazWp+R/dlGYp84uLWk71e4b/9\nSo1pIitPasCJHgO/ii9nIcmDXarkaGT5CEUP8WPp6mLY5W9NxgF2czdz6AMJa3P9\n2jNd4J1VFl8k+LDZ4GnwHGhyL3h3lFUmmoQV/0YVoXmA59SxE2JPvc2d1V6xh2gz\nyg2M+xcKliSXxshhAopsSSoEp5g3II2mCvzeSxwsXa4Ob5c5TJNdXslm1pugRCbB\ntjFNh70wZmCq+jY8C+vGsDwkf/5UeAd+c+14s3bwsBfWqZBGokVxyf/UWHtsWlVn\np3USWBwLxEWyQIioMmj4O6wROZeyePDlFDVky4hzTCrTS6EFIqkGBs5RneCHhTN0\ngNHFG8Ixql6mybJAwopvWGEL+7E4pbNdbhmgVvf2YEQuMZBCM7fGdBsRNkTs6jIA\n/8soO6buQgQoCq3GFbodZA==\n-----END - CERTIFICATE-----\n","private_key":"-----BEGIN PRIVATE KEY-----\nMIIJQgIBADANBgkqhkiG9w0BAQEFAASCCSwwggkoAgEAAoICAQCy4LqfRYXE314e\n6YkpR1BbKPH8ohO4lcMt+YzMUNlOC1KUktGjX8pWk4wAXYar7Mxccmbbh68pgE8i\nSio8V97CdQb8O64OQmre/y33z7Yts37/6mH5mBnfeiilVHOenQmh+4400tvF1jlj\nU8MZSg6sLM4ZEBhfcT0V3yqxAwwzV8vk0t7uLRCMuDI5B4h4ZCsheCkA2roF4RGU\nG6KwGzf+dLSKzBcjy5hoh4huzp5jDYer7S86dV6/9Gwzh8CPhVaixbymHGoMbJM8\nlUtc/hFI+J8WVh/qLTKQCcqvoZ96QU0LX2ib+ElvCMGl/UrznpHZUrGkLPfnnoxK\n/vKBNycJsENtWno9KgtNfsdmYy/blxNRW/qpi+l92f3zbjjpRqJ/oyA+hsSMn19O\n/v3O4wz+YS55xnVeEPIffOq6VJ9BfVdXPPRp33sllM8EVWuS4ry3oJKI1CFTlhV7\neU1RpJmbc5X8GhytiD2MgIrVlYzJTftSHw7J3v0orRD6SxI9enXI4o4pS1MMxRNb\n+ZQDvwx3ZujxjFXe3+qIkme3ih+Vl9W9rDeKAd95ciII9CxBqOvsso8zqDAEV25f\nn3tutk/7hQNMqv0APAahLo/eY1NK9i9YVJknVSzWBkE2MUyvpfFhiw6TPYh88qH+\nwN3CznWaCtXiAjH3kbOk6y2OmI8+4QIDAQABAoICAElFboxhMPtEt8wXwzxqXssI\niZ7/UO6yQeHqL7ddgrXKQ4hiX4b5bOtrwtQ/ezOfatKPdfyEpsZsLX4RPR28rJ2g\nzDyzwYdLw3UWt+Cjb69msCXp/zn7CNYWtuGKJ1YYY2K7pTOUD7wJFTbPj8IjKMF0\nFPQFOMaXnvr/kAA0DGJXm0he7DxJr1bE+KWNpWQTO+uYycr0zXAtEkNF0q0qaRRM\n/8s+8FeURRjEM6mX7x8J4sIVBNyASVB9sXimKcVgS+2e67hrOTFfpCwTx2wPEkt+\ns8O1gZst6mE/8Ythu+6bIxD+gt4opQPbZV810ubZ1Epd6jAiz2VL95Gcvv8Y9V7+\nEGfqeeiHqQkIkhSNO6Aqui/QBHEIuXlDvh6/Q23ln/AeniHFktYASK2WtbtzXON5\n3yL0d8S5ndCLYMch1uv1V+JQ67Y5JJYTAh+fev7uyZy7qLGnAjUoRnwRofwgig6a\nlKOf9aMlLJnIJSHlyzqni5wnVdO1y/RGMsE/BdJ15+F9LGYm/sy56VPsjU9rELIa\n9UGLAWNiEZQDQLgApZl8rawXVlANwW/iesxgAh4eZlaFXvaGtK72KcETBfn+jt8m\n2/LUbh4BL2O4F2OJ2F8+DET6JGDrNDBkcsSxYmtgtRpJjrV76MvjSli8uRAlaEd7\nR3n3ztdOEX25VeFExsdFAoIBAQDhFInwMNTY+phF57o/R6FNyLHQGkNz2w4pYXkR\nA6C4wgBDfwk/S/Sub16w4H6sr0C7MDw7t2cpmMhe+BG4V4a5sX+AjSSdMFBS/pgI\nuFgeJGBG1evyvp+8SycH7oojf106UH6gERpHmW0WMDf1r8Nueriw9DOKKqL1sJtx\nw/Diq2/8z2m5ESxL6SrEzagHmjliaNwBpwUlh5P2EMQzNTljE1fnEKl2E6LW35o0\nx4zoi3y57HtKcLNtD/GsvRYU8zjHDkDq2tUXwzxCVWmiTs3+NQVTEscJAgAahvbu\nJZ7hEXzmCR6sjoQIWCHc9Wusf/zt2XNiXYIKUJAQxv9sOgabAoIBAQDLc2Cxlz36\n3KcOGkfpWl9cGmS0t8FCOvOVV++7eNiWv0kKVdbwqqJYExmX4jmv2E1LfQ4G1vAh\nGtG7YN0rEzwLWiqd/frNLgMya7lYuCpWzxCNDoHIAtBvjPhyHRFFhLayxSsxRZLT\nPnKo2u9NjhPpm7RD+4b9uy++61jkDXK//ezI47oJWxCOxfyzaeejV8Iu9jHwKJ1o\nNpebAdPnlXU3itxaXvJIZiguHtNioTs1E6Ik433AC3Tb57Xy57lGXnOORm5Ximel\naJsB9dsh9rKsNScp+9VSD0ef7Cr8oZH0gOI+pmNnnXt+cOxH9Du4lvBql59QR9FY\nMbbigpvtJ6ozAoIBAG588ZV5sxJsOVGfhhrII9OWIEtCiTgXISWJFrAWctAfU5fO\nhZCPzaXPP9Fd8nD8eq8o53h8+GQ//qQ37CLsvFLtYeSN5JpQ/C0xkxo8u+zX+Hbt\nTizUDH+W+Kr5GtCAFhipKO+UVa0uEJGiy+WMCUhzb7RVu/MoKOSodDXtdJMgixG0\nE3boijEdXYRMXB6XQ3IefVlGTs10d1qEMnvctbX/6degoz82Nmp6Sy17g50n0+tE\nveT12+4+tGkSTQOtvYJhadaf45kNmsgJO5iUTKRsDJgSEKhIVhqvhAm1Z/+d4Qzf\nDzKvpvqdoMnho6CDF3r+kpiHxG0hzQafWQUcmt8CggEARD1461hNY71rEyHhiPXV\nEnGP4cXYvrxDQ45xTLJmA3o5p4vPQn4ZYe1WIkmxC7hDhNR3RfgGJzR1sKH2zSHw\ne+ZMcR3lZ7jNPbZAPu/W07M0W/vHsCyxeRkRpET3rBetqBzWNfqeGtjRYK2+oobL\nSwn81uihCK4mf6U09ZlFKfyj1WX82nJ/BUSHVC5rkbA348SUT3dwBKp7A3UDfKP2\n4yBidLVwErShOYcBZA2sbEsfkbv0S9wL4E7CCq2KyX2YyNn63MYBqcuCYo/yZlv2\n5igV8NEVZibV4WA3svEGoboxKM5qfTCnYWvC9QeImIuYLEibGTRdlXVnYGZqoosx\nXQKCAQEAmEbm8o37QaSMWYu/hixusHWprPRpEcz8qMmpenCTUeE7xgKeJupSx/2u\ns5WSGJy7U6jlmocMOsZ3/nPWNG219uWMUWz2REKi99KOHU7dT8N0OPigNzDBJFKe\nuJpHU2wWkg9CJtkDlQt+4/JP3gzskwpooRvUaEbsQkM0G/A1SMVSyYPuzBui3+E7\nHMuBpZsWkNKLh0hjC5i7YBZYtXGYPG2JCEE4mpiV8ClxTvmijsr8sYUOtnmIBXfG\n0fcsLA4W7xYCUqr74LA1dMQd6f8T00mZycR5eh0wXJ68i5QEotBTGS8ibTilUJbx\n7aJXvW2Q3oCt1sF576QNr9rLxhHl8A==\n-----END - PRIVATE KEY-----\n"}' - form: {} - headers: - Accept: - - application/json - Content-Type: - - application/json - User-Agent: - - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/object-storage/buckets/fr-par/linode-obj-bucket-cert-test.xyz/ssl - method: POST - response: - body: '{"ssl": true}' - headers: - Access-Control-Allow-Credentials: - - "true" - Access-Control-Allow-Headers: - - Authorization, Origin, X-Requested-With, Content-Type, Accept, X-Filter - Access-Control-Allow-Methods: - - HEAD, GET, OPTIONS, POST, PUT, DELETE - Access-Control-Allow-Origin: - - '*' - Access-Control-Expose-Headers: - - X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Status - Akamai-Internal-Account: - - '*' - Cache-Control: - - max-age=0, no-cache, no-store - Connection: - - keep-alive - Content-Length: - - "13" - Content-Security-Policy: - - default-src 'none' - Content-Type: - - application/json - Expires: - - Wed, 08 Jan 2025 07:13:29 GMT - Pragma: - - no-cache - Strict-Transport-Security: - - max-age=31536000 - Vary: - - Authorization, X-Filter - X-Accepted-Oauth-Scopes: - - object_storage:read_write - X-Content-Type-Options: - - nosniff - X-Frame-Options: - - DENY - - DENY - X-Oauth-Scopes: - - '*' - X-Ratelimit-Limit: - - "1600" - X-Xss-Protection: - - 1; mode=block - status: 200 OK - code: 200 - duration: "" -- request: - body: "" - form: {} - headers: - Accept: - - application/json - Content-Type: - - application/json - User-Agent: - - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/object-storage/buckets/fr-par/linode-obj-bucket-cert-test.xyz/ssl - method: GET - response: - body: '{"ssl": true}' - headers: - Access-Control-Allow-Credentials: - - "true" - Access-Control-Allow-Headers: - - Authorization, Origin, X-Requested-With, Content-Type, Accept, X-Filter - Access-Control-Allow-Methods: - - HEAD, GET, OPTIONS, POST, PUT, DELETE - Access-Control-Allow-Origin: - - '*' - Access-Control-Expose-Headers: - - X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Status - Akamai-Internal-Account: - - '*' - Cache-Control: - - max-age=0, no-cache, no-store - Connection: - - keep-alive - Content-Length: - - "13" - Content-Security-Policy: - - default-src 'none' - Content-Type: - - application/json - Expires: - - Wed, 08 Jan 2025 07:13:31 GMT - Pragma: - - no-cache - Strict-Transport-Security: - - max-age=31536000 - Vary: - - Authorization, X-Filter - - Authorization, X-Filter - X-Accepted-Oauth-Scopes: - - object_storage:read_only - X-Content-Type-Options: - - nosniff - X-Frame-Options: - - DENY - - DENY - X-Oauth-Scopes: - - '*' - X-Ratelimit-Limit: - - "1600" + - "1840" X-Xss-Protection: - 1; mode=block status: 200 OK @@ -403,7 +225,7 @@ interactions: - application/json User-Agent: - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/object-storage/buckets/fr-par/linode-obj-bucket-cert-test.xyz/ssl + url: https://api.linode.com/v4beta/object-storage/buckets/us-iad/linode-obj-bucket-cert-test.xyz/ssl method: GET response: body: '{"ssl": true}' @@ -431,7 +253,7 @@ interactions: Content-Type: - application/json Expires: - - Wed, 08 Jan 2025 07:13:33 GMT + - Thu, 30 Apr 2026 20:17:52 GMT Pragma: - no-cache Strict-Transport-Security: @@ -449,7 +271,7 @@ interactions: X-Oauth-Scopes: - '*' X-Ratelimit-Limit: - - "1600" + - "1840" X-Xss-Protection: - 1; mode=block status: 200 OK @@ -465,7 +287,7 @@ interactions: - application/json User-Agent: - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/object-storage/buckets/fr-par/linode-obj-bucket-cert-test.xyz/ssl + url: https://api.linode.com/v4beta/object-storage/buckets/us-iad/linode-obj-bucket-cert-test.xyz/ssl method: DELETE response: body: '{}' @@ -493,7 +315,7 @@ interactions: Content-Type: - application/json Expires: - - Wed, 08 Jan 2025 07:13:34 GMT + - Thu, 30 Apr 2026 20:17:53 GMT Pragma: - no-cache Strict-Transport-Security: @@ -510,7 +332,7 @@ interactions: X-Oauth-Scopes: - '*' X-Ratelimit-Limit: - - "1600" + - "1840" X-Xss-Protection: - 1; mode=block status: 200 OK @@ -526,7 +348,7 @@ interactions: - application/json User-Agent: - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/object-storage/buckets/fr-par/linode-obj-bucket-cert-test.xyz + url: https://api.linode.com/v4beta/object-storage/buckets/us-iad/linode-obj-bucket-cert-test.xyz method: DELETE response: body: '{}' @@ -554,7 +376,7 @@ interactions: Content-Type: - application/json Expires: - - Wed, 08 Jan 2025 07:13:38 GMT + - Thu, 30 Apr 2026 20:17:56 GMT Pragma: - no-cache Strict-Transport-Security: @@ -571,7 +393,7 @@ interactions: X-Oauth-Scopes: - '*' X-Ratelimit-Limit: - - "1600" + - "1840" X-Xss-Protection: - 1; mode=block status: 200 OK diff --git a/test/integration/fixtures/TestObjectStorageBucket_Access_Get.yaml b/test/integration/fixtures/TestObjectStorageBucket_Access_Get.yaml index 074365933..01278ccfe 100644 --- a/test/integration/fixtures/TestObjectStorageBucket_Access_Get.yaml +++ b/test/integration/fixtures/TestObjectStorageBucket_Access_Get.yaml @@ -14,25 +14,32 @@ interactions: url: https://api.linode.com/v4beta/object-storage/endpoints?page=1 method: GET response: - body: '{"pages": 1, "page": 1, "results": 18, "data": [{"region": "us-iad", "endpoint_type": - "E1", "s3_endpoint": "us-iad-1.linodeobjects.com"}, {"region": "in-maa", "endpoint_type": - "E1", "s3_endpoint": "in-maa-1.linodeobjects.com"}, {"region": "us-east", "endpoint_type": - "E0", "s3_endpoint": "us-east-1.linodeobjects.com"}, {"region": "eu-central", - "endpoint_type": "E0", "s3_endpoint": "eu-central-1.linodeobjects.com"}, {"region": - "us-mia", "endpoint_type": "E1", "s3_endpoint": "us-mia-1.linodeobjects.com"}, - {"region": "br-gru", "endpoint_type": "E1", "s3_endpoint": "br-gru-1.linodeobjects.com"}, - {"region": "fr-par", "endpoint_type": "E1", "s3_endpoint": "fr-par-1.linodeobjects.com"}, - {"region": "nl-ams", "endpoint_type": "E1", "s3_endpoint": "nl-ams-1.linodeobjects.com"}, - {"region": "se-sto", "endpoint_type": "E1", "s3_endpoint": "se-sto-1.linodeobjects.com"}, - {"region": "us-sea", "endpoint_type": "E1", "s3_endpoint": "us-sea-1.linodeobjects.com"}, - {"region": "jp-osa", "endpoint_type": "E1", "s3_endpoint": "jp-osa-1.linodeobjects.com"}, - {"region": "ap-south", "endpoint_type": "E0", "s3_endpoint": "ap-south-1.linodeobjects.com"}, - {"region": "us-ord", "endpoint_type": "E1", "s3_endpoint": "us-ord-1.linodeobjects.com"}, + body: '{"data": [{"region": "se-sto", "endpoint_type": "E1", "s3_endpoint": "se-sto-1.linodeobjects.com"}, + {"region": "sg-sin-2", "endpoint_type": "E3", "s3_endpoint": "sg-sin-1.linodeobjects.com"}, + {"region": "us-southeast", "endpoint_type": "E0", "s3_endpoint": "us-southeast-1.linodeobjects.com"}, + {"region": "in-maa", "endpoint_type": "E1", "s3_endpoint": "in-maa-1.linodeobjects.com"}, + {"region": "es-mad", "endpoint_type": "E1", "s3_endpoint": "es-mad-1.linodeobjects.com"}, {"region": "id-cgk", "endpoint_type": "E1", "s3_endpoint": "id-cgk-1.linodeobjects.com"}, + {"region": "us-iad", "endpoint_type": "E1", "s3_endpoint": "us-iad-1.linodeobjects.com"}, + {"region": "us-mia", "endpoint_type": "E1", "s3_endpoint": "us-mia-1.linodeobjects.com"}, + {"region": "us-ord", "endpoint_type": "E3", "s3_endpoint": "us-ord-10.linodeobjects.com"}, + {"region": "us-ord", "endpoint_type": "E1", "s3_endpoint": "us-ord-1.linodeobjects.com"}, + {"region": "jp-tyo-3", "endpoint_type": "E3", "s3_endpoint": "jp-tyo-1.linodeobjects.com"}, + {"region": "jp-osa", "endpoint_type": "E1", "s3_endpoint": "jp-osa-1.linodeobjects.com"}, + {"region": "us-lax", "endpoint_type": "E3", "s3_endpoint": "us-lax-4.linodeobjects.com"}, {"region": "us-lax", "endpoint_type": "E1", "s3_endpoint": "us-lax-1.linodeobjects.com"}, - {"region": "es-mad", "endpoint_type": "E1", "s3_endpoint": "es-mad-1.linodeobjects.com"}, + {"region": "au-mel", "endpoint_type": "E2", "s3_endpoint": "au-mel-1.linodeobjects.com"}, + {"region": "eu-central", "endpoint_type": "E0", "s3_endpoint": "eu-central-1.linodeobjects.com"}, + {"region": "us-sea", "endpoint_type": "E1", "s3_endpoint": "us-sea-1.linodeobjects.com"}, + {"region": "ap-south", "endpoint_type": "E0", "s3_endpoint": "ap-south-1.linodeobjects.com"}, + {"region": "de-fra-2", "endpoint_type": "E3", "s3_endpoint": "de-fra-1.linodeobjects.com"}, + {"region": "fr-par", "endpoint_type": "E1", "s3_endpoint": "fr-par-1.linodeobjects.com"}, + {"region": "us-east", "endpoint_type": "E0", "s3_endpoint": "us-east-1.linodeobjects.com"}, + {"region": "br-gru", "endpoint_type": "E1", "s3_endpoint": "br-gru-1.linodeobjects.com"}, {"region": "it-mil", "endpoint_type": "E1", "s3_endpoint": "it-mil-1.linodeobjects.com"}, - {"region": "us-southeast", "endpoint_type": "E0", "s3_endpoint": "us-southeast-1.linodeobjects.com"}]}' + {"region": "nl-ams", "endpoint_type": "E1", "s3_endpoint": "nl-ams-1.linodeobjects.com"}, + {"region": "gb-lon", "endpoint_type": "E3", "s3_endpoint": "gb-lon-1.linodeobjects.com"}], + "page": 1, "pages": 1, "results": 25}' headers: Access-Control-Allow-Credentials: - "true" @@ -55,7 +62,7 @@ interactions: Content-Type: - application/json Expires: - - Wed, 08 Jan 2025 07:40:53 GMT + - Thu, 30 Apr 2026 20:18:26 GMT Pragma: - no-cache Strict-Transport-Security: @@ -74,14 +81,14 @@ interactions: X-Oauth-Scopes: - '*' X-Ratelimit-Limit: - - "1600" + - "1840" X-Xss-Protection: - 1; mode=block status: 200 OK code: 200 duration: "" - request: - body: '{"region":"us-iad","label":"go-bucket-test-def","endpoint_type":"E1","acl":"authenticated-read","cors_enabled":false}' + body: '{"region":"se-sto","label":"go-bucket-test-def","endpoint_type":"E1","acl":"authenticated-read","cors_enabled":false}' form: {} headers: Accept: @@ -93,10 +100,10 @@ interactions: url: https://api.linode.com/v4beta/object-storage/buckets method: POST response: - body: '{"hostname": "go-bucket-test-def.us-iad-1.linodeobjects.com", "label": - "go-bucket-test-def", "created": "2018-01-02T03:04:05", "region": "us-iad", - "cluster": "us-iad-1", "size": 0, "objects": 0, "endpoint_type": "E1", "s3_endpoint": - "us-iad-1.linodeobjects.com"}' + body: '{"hostname": "go-bucket-test-def.se-sto-1.linodeobjects.com", "label": + "go-bucket-test-def", "created": "2018-01-02T03:04:05", "region": "se-sto", + "cluster": "se-sto-1", "size": 0, "objects": 0, "endpoint_type": "E1", "s3_endpoint": + "se-sto-1.linodeobjects.com"}' headers: Access-Control-Allow-Credentials: - "true" @@ -121,7 +128,7 @@ interactions: Content-Type: - application/json Expires: - - Wed, 08 Jan 2025 07:40:55 GMT + - Thu, 30 Apr 2026 20:18:30 GMT Pragma: - no-cache Strict-Transport-Security: @@ -138,72 +145,7 @@ interactions: X-Oauth-Scopes: - '*' X-Ratelimit-Limit: - - "1600" - X-Xss-Protection: - - 1; mode=block - status: 200 OK - code: 200 - duration: "" -- request: - body: "" - form: {} - headers: - Accept: - - application/json - Content-Type: - - application/json - User-Agent: - - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/object-storage/buckets/us-iad/go-bucket-test-def/access - method: GET - response: - body: '{"acl": "authenticated-read", "acl_xml": "c9539a32-3ece-47dd-a9a4-40bbfa5a2936c9539a32-3ece-47dd-a9a4-40bbfa5a2936http://acs.amazonaws.com/groups/global/AuthenticatedUsersREADc9539a32-3ece-47dd-a9a4-40bbfa5a2936c9539a32-3ece-47dd-a9a4-40bbfa5a2936FULL_CONTROL", - "cors_enabled": false, "cors_xml": null}' - headers: - Access-Control-Allow-Credentials: - - "true" - Access-Control-Allow-Headers: - - Authorization, Origin, X-Requested-With, Content-Type, Accept, X-Filter - Access-Control-Allow-Methods: - - HEAD, GET, OPTIONS, POST, PUT, DELETE - Access-Control-Allow-Origin: - - '*' - Access-Control-Expose-Headers: - - X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Status - Akamai-Internal-Account: - - '*' - Cache-Control: - - max-age=0, no-cache, no-store - Connection: - - keep-alive - Content-Length: - - "808" - Content-Security-Policy: - - default-src 'none' - Content-Type: - - application/json - Expires: - - Wed, 08 Jan 2025 07:40:57 GMT - Pragma: - - no-cache - Strict-Transport-Security: - - max-age=31536000 - Vary: - - Authorization, X-Filter - - Authorization, X-Filter - X-Accepted-Oauth-Scopes: - - object_storage:read_only - X-Content-Type-Options: - - nosniff - X-Frame-Options: - - DENY - - DENY - X-Oauth-Scopes: - - '*' - X-Ratelimit-Limit: - - "1600" + - "60" X-Xss-Protection: - 1; mode=block status: 200 OK @@ -219,12 +161,12 @@ interactions: - application/json User-Agent: - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/object-storage/buckets/us-iad/go-bucket-test-def/access + url: https://api.linode.com/v4beta/object-storage/buckets/se-sto/go-bucket-test-def/access method: GET response: - body: '{"acl": "authenticated-read", "acl_xml": "c9539a32-3ece-47dd-a9a4-40bbfa5a2936c9539a32-3ece-47dd-a9a4-40bbfa5a2936640757b5-ebe9-45b1-abd5-581f215ef89e640757b5-ebe9-45b1-abd5-581f215ef89ehttp://acs.amazonaws.com/groups/global/AuthenticatedUsersREADc9539a32-3ece-47dd-a9a4-40bbfa5a2936c9539a32-3ece-47dd-a9a4-40bbfa5a2936FULL_CONTROL", + xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:type=\"CanonicalUser\">640757b5-ebe9-45b1-abd5-581f215ef89e640757b5-ebe9-45b1-abd5-581f215ef89eFULL_CONTROL", "cors_enabled": false, "cors_xml": null}' headers: Access-Control-Allow-Credentials: @@ -250,7 +192,7 @@ interactions: Content-Type: - application/json Expires: - - Wed, 08 Jan 2025 07:40:58 GMT + - Thu, 30 Apr 2026 20:18:34 GMT Pragma: - no-cache Strict-Transport-Security: @@ -268,7 +210,7 @@ interactions: X-Oauth-Scopes: - '*' X-Ratelimit-Limit: - - "1600" + - "1840" X-Xss-Protection: - 1; mode=block status: 200 OK @@ -284,7 +226,7 @@ interactions: - application/json User-Agent: - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/object-storage/buckets/us-iad-1/go-bucket-test-def + url: https://api.linode.com/v4beta/object-storage/buckets/se-sto/go-bucket-test-def method: DELETE response: body: '{}' @@ -312,7 +254,7 @@ interactions: Content-Type: - application/json Expires: - - Wed, 08 Jan 2025 07:41:08 GMT + - Thu, 30 Apr 2026 20:18:38 GMT Pragma: - no-cache Strict-Transport-Security: @@ -329,7 +271,7 @@ interactions: X-Oauth-Scopes: - '*' X-Ratelimit-Limit: - - "1600" + - "1840" X-Xss-Protection: - 1; mode=block status: 200 OK diff --git a/test/integration/fixtures/TestObjectStorageBucket_Access_Modify.yaml b/test/integration/fixtures/TestObjectStorageBucket_Access_Modify.yaml new file mode 100644 index 000000000..d94cae081 --- /dev/null +++ b/test/integration/fixtures/TestObjectStorageBucket_Access_Modify.yaml @@ -0,0 +1,340 @@ +--- +version: 1 +interactions: +- request: + body: "" + form: {} + headers: + Accept: + - application/json + Content-Type: + - application/json + User-Agent: + - linodego/dev https://github.com/linode/linodego + url: https://api.linode.com/v4beta/object-storage/endpoints?page=1 + method: GET + response: + body: '{"data": [{"region": "in-maa", "endpoint_type": "E1", "s3_endpoint": "in-maa-1.linodeobjects.com"}, + {"region": "jp-tyo-3", "endpoint_type": "E3", "s3_endpoint": "jp-tyo-1.linodeobjects.com"}, + {"region": "us-southeast", "endpoint_type": "E0", "s3_endpoint": "us-southeast-1.linodeobjects.com"}, + {"region": "eu-central", "endpoint_type": "E0", "s3_endpoint": "eu-central-1.linodeobjects.com"}, + {"region": "jp-osa", "endpoint_type": "E1", "s3_endpoint": "jp-osa-1.linodeobjects.com"}, + {"region": "nl-ams", "endpoint_type": "E1", "s3_endpoint": "nl-ams-1.linodeobjects.com"}, + {"region": "us-iad", "endpoint_type": "E1", "s3_endpoint": "us-iad-1.linodeobjects.com"}, + {"region": "fr-par", "endpoint_type": "E1", "s3_endpoint": "fr-par-1.linodeobjects.com"}, + {"region": "it-mil", "endpoint_type": "E1", "s3_endpoint": "it-mil-1.linodeobjects.com"}, + {"region": "se-sto", "endpoint_type": "E1", "s3_endpoint": "se-sto-1.linodeobjects.com"}, + {"region": "ap-south", "endpoint_type": "E0", "s3_endpoint": "ap-south-1.linodeobjects.com"}, + {"region": "es-mad", "endpoint_type": "E1", "s3_endpoint": "es-mad-1.linodeobjects.com"}, + {"region": "us-mia", "endpoint_type": "E1", "s3_endpoint": "us-mia-1.linodeobjects.com"}, + {"region": "gb-lon", "endpoint_type": "E3", "s3_endpoint": "gb-lon-1.linodeobjects.com"}, + {"region": "de-fra-2", "endpoint_type": "E3", "s3_endpoint": "de-fra-1.linodeobjects.com"}, + {"region": "us-lax", "endpoint_type": "E3", "s3_endpoint": "us-lax-4.linodeobjects.com"}, + {"region": "us-lax", "endpoint_type": "E1", "s3_endpoint": "us-lax-1.linodeobjects.com"}, + {"region": "sg-sin-2", "endpoint_type": "E3", "s3_endpoint": "sg-sin-1.linodeobjects.com"}, + {"region": "us-ord", "endpoint_type": "E3", "s3_endpoint": "us-ord-10.linodeobjects.com"}, + {"region": "us-ord", "endpoint_type": "E1", "s3_endpoint": "us-ord-1.linodeobjects.com"}, + {"region": "br-gru", "endpoint_type": "E1", "s3_endpoint": "br-gru-1.linodeobjects.com"}, + {"region": "au-mel", "endpoint_type": "E2", "s3_endpoint": "au-mel-1.linodeobjects.com"}, + {"region": "us-sea", "endpoint_type": "E1", "s3_endpoint": "us-sea-1.linodeobjects.com"}, + {"region": "id-cgk", "endpoint_type": "E1", "s3_endpoint": "id-cgk-1.linodeobjects.com"}, + {"region": "us-east", "endpoint_type": "E0", "s3_endpoint": "us-east-1.linodeobjects.com"}, + {"region": "us-iad-2", "endpoint_type": "E3", "s3_endpoint": null}], "page": + 1, "pages": 1, "results": 26}' + headers: + Access-Control-Allow-Credentials: + - "true" + Access-Control-Allow-Headers: + - Authorization, Origin, X-Requested-With, Content-Type, Accept, X-Filter + Access-Control-Allow-Methods: + - HEAD, GET, OPTIONS, POST, PUT, DELETE + Access-Control-Allow-Origin: + - '*' + Access-Control-Expose-Headers: + - X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Status + Akamai-Internal-Account: + - '*' + Cache-Control: + - max-age=0, no-cache, no-store + Connection: + - keep-alive + Content-Security-Policy: + - default-src 'none' + Content-Type: + - application/json + Expires: + - Tue, 05 May 2026 20:24:35 GMT + Pragma: + - no-cache + Strict-Transport-Security: + - max-age=31536000 + Vary: + - Authorization, X-Filter + - Authorization, X-Filter + - Accept-Encoding + X-Accepted-Oauth-Scopes: + - object_storage:read_only + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - DENY + - DENY + X-Oauth-Scopes: + - '*' + X-Ratelimit-Limit: + - "1840" + X-Xss-Protection: + - 1; mode=block + status: 200 OK + code: 200 + duration: "" +- request: + body: '{"region":"in-maa","label":"go-bucket-test-def","endpoint_type":"E1"}' + form: {} + headers: + Accept: + - application/json + Content-Type: + - application/json + User-Agent: + - linodego/dev https://github.com/linode/linodego + url: https://api.linode.com/v4beta/object-storage/buckets + method: POST + response: + body: '{"hostname": "go-bucket-test-def.in-maa-1.linodeobjects.com", "label": + "go-bucket-test-def", "created": "2018-01-02T03:04:05", "region": "in-maa", + "cluster": "in-maa-1", "size": 0, "objects": 0, "endpoint_type": "E1", "s3_endpoint": + "in-maa-1.linodeobjects.com"}' + headers: + Access-Control-Allow-Credentials: + - "true" + Access-Control-Allow-Headers: + - Authorization, Origin, X-Requested-With, Content-Type, Accept, X-Filter + Access-Control-Allow-Methods: + - HEAD, GET, OPTIONS, POST, PUT, DELETE + Access-Control-Allow-Origin: + - '*' + Access-Control-Expose-Headers: + - X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Status + Akamai-Internal-Account: + - '*' + Cache-Control: + - max-age=0, no-cache, no-store + Connection: + - keep-alive + Content-Length: + - "262" + Content-Security-Policy: + - default-src 'none' + Content-Type: + - application/json + Expires: + - Tue, 05 May 2026 20:24:39 GMT + Pragma: + - no-cache + Strict-Transport-Security: + - max-age=31536000 + Vary: + - Authorization, X-Filter + X-Accepted-Oauth-Scopes: + - object_storage:read_write + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - DENY + - DENY + X-Oauth-Scopes: + - '*' + X-Ratelimit-Limit: + - "60" + X-Xss-Protection: + - 1; mode=block + status: 200 OK + code: 200 + duration: "" +- request: + body: '{"acl":"private","cors_enabled":false}' + form: {} + headers: + Accept: + - application/json + Content-Type: + - application/json + User-Agent: + - linodego/dev https://github.com/linode/linodego + url: https://api.linode.com/v4beta/object-storage/buckets/in-maa/go-bucket-test-def/access + method: POST + response: + body: '{}' + headers: + Access-Control-Allow-Credentials: + - "true" + Access-Control-Allow-Headers: + - Authorization, Origin, X-Requested-With, Content-Type, Accept, X-Filter + Access-Control-Allow-Methods: + - HEAD, GET, OPTIONS, POST, PUT, DELETE + Access-Control-Allow-Origin: + - '*' + Access-Control-Expose-Headers: + - X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Status + Akamai-Internal-Account: + - '*' + Cache-Control: + - max-age=0, no-cache, no-store + Connection: + - keep-alive + Content-Length: + - "2" + Content-Security-Policy: + - default-src 'none' + Content-Type: + - application/json + Expires: + - Tue, 05 May 2026 20:24:43 GMT + Pragma: + - no-cache + Strict-Transport-Security: + - max-age=31536000 + Vary: + - Authorization, X-Filter + X-Accepted-Oauth-Scopes: + - object_storage:read_write + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - DENY + - DENY + X-Oauth-Scopes: + - '*' + X-Ratelimit-Limit: + - "1840" + X-Xss-Protection: + - 1; mode=block + status: 200 OK + code: 200 + duration: "" +- request: + body: "" + form: {} + headers: + Accept: + - application/json + Content-Type: + - application/json + User-Agent: + - linodego/dev https://github.com/linode/linodego + url: https://api.linode.com/v4beta/object-storage/buckets/in-maa/go-bucket-test-def/access + method: GET + response: + body: '{"acl": "private", "acl_xml": "640757b5-ebe9-45b1-abd5-581f215ef89e640757b5-ebe9-45b1-abd5-581f215ef89e640757b5-ebe9-45b1-abd5-581f215ef89e640757b5-ebe9-45b1-abd5-581f215ef89eFULL_CONTROL", + "cors_enabled": false, "cors_xml": null}' + headers: + Access-Control-Allow-Credentials: + - "true" + Access-Control-Allow-Headers: + - Authorization, Origin, X-Requested-With, Content-Type, Accept, X-Filter + Access-Control-Allow-Methods: + - HEAD, GET, OPTIONS, POST, PUT, DELETE + Access-Control-Allow-Origin: + - '*' + Access-Control-Expose-Headers: + - X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Status + Akamai-Internal-Account: + - '*' + Cache-Control: + - max-age=0, no-cache, no-store + Connection: + - keep-alive + Content-Length: + - "591" + Content-Security-Policy: + - default-src 'none' + Content-Type: + - application/json + Expires: + - Tue, 05 May 2026 20:24:48 GMT + Pragma: + - no-cache + Strict-Transport-Security: + - max-age=31536000 + Vary: + - Authorization, X-Filter + - Authorization, X-Filter + X-Accepted-Oauth-Scopes: + - object_storage:read_only + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - DENY + - DENY + X-Oauth-Scopes: + - '*' + X-Ratelimit-Limit: + - "1840" + X-Xss-Protection: + - 1; mode=block + status: 200 OK + code: 200 + duration: "" +- request: + body: "" + form: {} + headers: + Accept: + - application/json + Content-Type: + - application/json + User-Agent: + - linodego/dev https://github.com/linode/linodego + url: https://api.linode.com/v4beta/object-storage/buckets/in-maa/go-bucket-test-def + method: DELETE + response: + body: '{}' + headers: + Access-Control-Allow-Credentials: + - "true" + Access-Control-Allow-Headers: + - Authorization, Origin, X-Requested-With, Content-Type, Accept, X-Filter + Access-Control-Allow-Methods: + - HEAD, GET, OPTIONS, POST, PUT, DELETE + Access-Control-Allow-Origin: + - '*' + Access-Control-Expose-Headers: + - X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Status + Akamai-Internal-Account: + - '*' + Cache-Control: + - max-age=0, no-cache, no-store + Connection: + - keep-alive + Content-Length: + - "2" + Content-Security-Policy: + - default-src 'none' + Content-Type: + - application/json + Expires: + - Tue, 05 May 2026 20:24:53 GMT + Pragma: + - no-cache + Strict-Transport-Security: + - max-age=31536000 + Vary: + - Authorization, X-Filter + X-Accepted-Oauth-Scopes: + - object_storage:read_write + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - DENY + - DENY + X-Oauth-Scopes: + - '*' + X-Ratelimit-Limit: + - "1840" + X-Xss-Protection: + - 1; mode=block + status: 200 OK + code: 200 + duration: "" diff --git a/test/integration/fixtures/TestObjectStorageBucket_Access_Update.yaml b/test/integration/fixtures/TestObjectStorageBucket_Access_Update.yaml index f16513000..a2e251c3e 100644 --- a/test/integration/fixtures/TestObjectStorageBucket_Access_Update.yaml +++ b/test/integration/fixtures/TestObjectStorageBucket_Access_Update.yaml @@ -14,25 +14,33 @@ interactions: url: https://api.linode.com/v4beta/object-storage/endpoints?page=1 method: GET response: - body: '{"pages": 1, "page": 1, "results": 18, "data": [{"region": "us-lax", "endpoint_type": - "E1", "s3_endpoint": "us-lax-1.linodeobjects.com"}, {"region": "us-southeast", - "endpoint_type": "E0", "s3_endpoint": "us-southeast-1.linodeobjects.com"}, {"region": - "in-maa", "endpoint_type": "E1", "s3_endpoint": "in-maa-1.linodeobjects.com"}, - {"region": "jp-osa", "endpoint_type": "E1", "s3_endpoint": "jp-osa-1.linodeobjects.com"}, - {"region": "nl-ams", "endpoint_type": "E1", "s3_endpoint": "nl-ams-1.linodeobjects.com"}, + body: '{"data": [{"region": "us-lax", "endpoint_type": "E1", "s3_endpoint": "us-lax-1.linodeobjects.com"}, + {"region": "us-lax", "endpoint_type": "E3", "s3_endpoint": "us-lax-4.linodeobjects.com"}, + {"region": "us-southeast", "endpoint_type": "E0", "s3_endpoint": "us-southeast-1.linodeobjects.com"}, + {"region": "se-sto", "endpoint_type": "E1", "s3_endpoint": "se-sto-1.linodeobjects.com"}, + {"region": "us-ord", "endpoint_type": "E3", "s3_endpoint": "us-ord-10.linodeobjects.com"}, + {"region": "us-ord", "endpoint_type": "E1", "s3_endpoint": "us-ord-1.linodeobjects.com"}, + {"region": "gb-lon", "endpoint_type": "E3", "s3_endpoint": "gb-lon-1.linodeobjects.com"}, + {"region": "sg-sin-2", "endpoint_type": "E3", "s3_endpoint": "sg-sin-1.linodeobjects.com"}, {"region": "it-mil", "endpoint_type": "E1", "s3_endpoint": "it-mil-1.linodeobjects.com"}, + {"region": "au-mel", "endpoint_type": "E2", "s3_endpoint": "au-mel-1.linodeobjects.com"}, + {"region": "de-fra-2", "endpoint_type": "E3", "s3_endpoint": "de-fra-1.linodeobjects.com"}, {"region": "fr-par", "endpoint_type": "E1", "s3_endpoint": "fr-par-1.linodeobjects.com"}, - {"region": "us-ord", "endpoint_type": "E1", "s3_endpoint": "us-ord-1.linodeobjects.com"}, + {"region": "jp-osa", "endpoint_type": "E1", "s3_endpoint": "jp-osa-1.linodeobjects.com"}, + {"region": "es-mad", "endpoint_type": "E1", "s3_endpoint": "es-mad-1.linodeobjects.com"}, {"region": "us-iad", "endpoint_type": "E1", "s3_endpoint": "us-iad-1.linodeobjects.com"}, - {"region": "br-gru", "endpoint_type": "E1", "s3_endpoint": "br-gru-1.linodeobjects.com"}, + {"region": "nl-ams", "endpoint_type": "E1", "s3_endpoint": "nl-ams-1.linodeobjects.com"}, {"region": "ap-south", "endpoint_type": "E0", "s3_endpoint": "ap-south-1.linodeobjects.com"}, - {"region": "es-mad", "endpoint_type": "E1", "s3_endpoint": "es-mad-1.linodeobjects.com"}, + {"region": "us-mia", "endpoint_type": "E1", "s3_endpoint": "us-mia-1.linodeobjects.com"}, {"region": "eu-central", "endpoint_type": "E0", "s3_endpoint": "eu-central-1.linodeobjects.com"}, - {"region": "se-sto", "endpoint_type": "E1", "s3_endpoint": "se-sto-1.linodeobjects.com"}, + {"region": "br-gru", "endpoint_type": "E1", "s3_endpoint": "br-gru-1.linodeobjects.com"}, + {"region": "jp-tyo-3", "endpoint_type": "E3", "s3_endpoint": "jp-tyo-1.linodeobjects.com"}, {"region": "us-east", "endpoint_type": "E0", "s3_endpoint": "us-east-1.linodeobjects.com"}, - {"region": "us-mia", "endpoint_type": "E1", "s3_endpoint": "us-mia-1.linodeobjects.com"}, {"region": "id-cgk", "endpoint_type": "E1", "s3_endpoint": "id-cgk-1.linodeobjects.com"}, - {"region": "us-sea", "endpoint_type": "E1", "s3_endpoint": "us-sea-1.linodeobjects.com"}]}' + {"region": "in-maa", "endpoint_type": "E1", "s3_endpoint": "in-maa-1.linodeobjects.com"}, + {"region": "us-sea", "endpoint_type": "E1", "s3_endpoint": "us-sea-1.linodeobjects.com"}, + {"region": "us-iad-2", "endpoint_type": "E3", "s3_endpoint": null}], "page": + 1, "pages": 1, "results": 26}' headers: Access-Control-Allow-Credentials: - "true" @@ -55,7 +63,7 @@ interactions: Content-Type: - application/json Expires: - - Wed, 08 Jan 2025 06:03:41 GMT + - Tue, 05 May 2026 20:23:21 GMT Pragma: - no-cache Strict-Transport-Security: @@ -74,7 +82,7 @@ interactions: X-Oauth-Scopes: - '*' X-Ratelimit-Limit: - - "1600" + - "1840" X-Xss-Protection: - 1; mode=block status: 200 OK @@ -121,7 +129,7 @@ interactions: Content-Type: - application/json Expires: - - Wed, 08 Jan 2025 06:03:42 GMT + - Tue, 05 May 2026 20:23:23 GMT Pragma: - no-cache Strict-Transport-Security: @@ -138,7 +146,7 @@ interactions: X-Oauth-Scopes: - '*' X-Ratelimit-Limit: - - "1600" + - "60" X-Xss-Protection: - 1; mode=block status: 200 OK @@ -155,7 +163,7 @@ interactions: User-Agent: - linodego/dev https://github.com/linode/linodego url: https://api.linode.com/v4beta/object-storage/buckets/us-lax/go-bucket-test-def/access - method: POST + method: PUT response: body: '{}' headers: @@ -182,7 +190,7 @@ interactions: Content-Type: - application/json Expires: - - Wed, 08 Jan 2025 06:03:43 GMT + - Tue, 05 May 2026 20:23:27 GMT Pragma: - no-cache Strict-Transport-Security: @@ -199,7 +207,7 @@ interactions: X-Oauth-Scopes: - '*' X-Ratelimit-Limit: - - "1600" + - "1840" X-Xss-Protection: - 1; mode=block status: 200 OK @@ -218,8 +226,8 @@ interactions: url: https://api.linode.com/v4beta/object-storage/buckets/us-lax/go-bucket-test-def/access method: GET response: - body: '{"acl": "private", "acl_xml": "c9539a32-3ece-47dd-a9a4-40bbfa5a2936c9539a32-3ece-47dd-a9a4-40bbfa5a2936c9539a32-3ece-47dd-a9a4-40bbfa5a2936c9539a32-3ece-47dd-a9a4-40bbfa5a2936FULL_CONTROL", + body: '{"acl": "private", "acl_xml": "640757b5-ebe9-45b1-abd5-581f215ef89e640757b5-ebe9-45b1-abd5-581f215ef89e640757b5-ebe9-45b1-abd5-581f215ef89e640757b5-ebe9-45b1-abd5-581f215ef89eFULL_CONTROL", "cors_enabled": false, "cors_xml": null}' headers: Access-Control-Allow-Credentials: @@ -245,7 +253,7 @@ interactions: Content-Type: - application/json Expires: - - Wed, 08 Jan 2025 06:03:45 GMT + - Tue, 05 May 2026 20:23:30 GMT Pragma: - no-cache Strict-Transport-Security: @@ -263,7 +271,7 @@ interactions: X-Oauth-Scopes: - '*' X-Ratelimit-Limit: - - "1600" + - "1840" X-Xss-Protection: - 1; mode=block status: 200 OK @@ -279,7 +287,7 @@ interactions: - application/json User-Agent: - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/object-storage/buckets/us-lax-1/go-bucket-test-def + url: https://api.linode.com/v4beta/object-storage/buckets/us-lax/go-bucket-test-def method: DELETE response: body: '{}' @@ -307,7 +315,7 @@ interactions: Content-Type: - application/json Expires: - - Wed, 08 Jan 2025 06:03:48 GMT + - Tue, 05 May 2026 20:23:33 GMT Pragma: - no-cache Strict-Transport-Security: @@ -324,7 +332,7 @@ interactions: X-Oauth-Scopes: - '*' X-Ratelimit-Limit: - - "1600" + - "1840" X-Xss-Protection: - 1; mode=block status: 200 OK diff --git a/test/integration/fixtures/TestObjectStorageBucket_Create.yaml b/test/integration/fixtures/TestObjectStorageBucket_Create.yaml index 2a4753831..02d29e4b8 100644 --- a/test/integration/fixtures/TestObjectStorageBucket_Create.yaml +++ b/test/integration/fixtures/TestObjectStorageBucket_Create.yaml @@ -42,7 +42,7 @@ interactions: Content-Type: - application/json Expires: - - Wed, 08 Jan 2025 06:02:49 GMT + - Thu, 30 Apr 2026 20:17:59 GMT Pragma: - no-cache Strict-Transport-Security: @@ -59,7 +59,7 @@ interactions: X-Oauth-Scopes: - '*' X-Ratelimit-Limit: - - "1600" + - "60" X-Xss-Protection: - 1; mode=block status: 200 OK @@ -75,7 +75,7 @@ interactions: - application/json User-Agent: - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/object-storage/buckets/us-east-1/go-bucket-test-def + url: https://api.linode.com/v4beta/object-storage/buckets/us-east/go-bucket-test-def method: DELETE response: body: '{}' @@ -103,7 +103,7 @@ interactions: Content-Type: - application/json Expires: - - Wed, 08 Jan 2025 06:02:53 GMT + - Thu, 30 Apr 2026 20:18:02 GMT Pragma: - no-cache Strict-Transport-Security: @@ -120,7 +120,7 @@ interactions: X-Oauth-Scopes: - '*' X-Ratelimit-Limit: - - "1600" + - "1840" X-Xss-Protection: - 1; mode=block status: 200 OK diff --git a/test/integration/fixtures/TestObjectStorageBucket_GetFound.yaml b/test/integration/fixtures/TestObjectStorageBucket_GetFound.yaml index eb8fb4b5c..3aab50b2f 100644 --- a/test/integration/fixtures/TestObjectStorageBucket_GetFound.yaml +++ b/test/integration/fixtures/TestObjectStorageBucket_GetFound.yaml @@ -42,7 +42,7 @@ interactions: Content-Type: - application/json Expires: - - Wed, 08 Jan 2025 06:03:13 GMT + - Thu, 30 Apr 2026 20:18:11 GMT Pragma: - no-cache Strict-Transport-Security: @@ -59,7 +59,7 @@ interactions: X-Oauth-Scopes: - '*' X-Ratelimit-Limit: - - "1600" + - "60" X-Xss-Protection: - 1; mode=block status: 200 OK @@ -75,7 +75,7 @@ interactions: - application/json User-Agent: - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/object-storage/buckets/us-east-1/go-bucket-test-def + url: https://api.linode.com/v4beta/object-storage/buckets/us-east/go-bucket-test-def method: GET response: body: '{"hostname": "go-bucket-test-def.us-east-1.linodeobjects.com", "label": @@ -106,7 +106,7 @@ interactions: Content-Type: - application/json Expires: - - Wed, 08 Jan 2025 06:03:14 GMT + - Thu, 30 Apr 2026 20:18:12 GMT Pragma: - no-cache Strict-Transport-Security: @@ -124,7 +124,7 @@ interactions: X-Oauth-Scopes: - '*' X-Ratelimit-Limit: - - "1600" + - "1840" X-Xss-Protection: - 1; mode=block status: 200 OK @@ -140,7 +140,7 @@ interactions: - application/json User-Agent: - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/object-storage/buckets/us-east-1/go-bucket-test-def + url: https://api.linode.com/v4beta/object-storage/buckets/us-east/go-bucket-test-def method: DELETE response: body: '{}' @@ -168,7 +168,7 @@ interactions: Content-Type: - application/json Expires: - - Wed, 08 Jan 2025 06:03:17 GMT + - Thu, 30 Apr 2026 20:18:15 GMT Pragma: - no-cache Strict-Transport-Security: @@ -185,7 +185,7 @@ interactions: X-Oauth-Scopes: - '*' X-Ratelimit-Limit: - - "1600" + - "1840" X-Xss-Protection: - 1; mode=block status: 200 OK diff --git a/test/integration/fixtures/TestObjectStorageBucket_GetMissing.yaml b/test/integration/fixtures/TestObjectStorageBucket_GetMissing.yaml index b5864d11b..adeabb5a6 100644 --- a/test/integration/fixtures/TestObjectStorageBucket_GetMissing.yaml +++ b/test/integration/fixtures/TestObjectStorageBucket_GetMissing.yaml @@ -42,7 +42,7 @@ interactions: Content-Type: - application/json Expires: - - Wed, 08 Jan 2025 06:03:07 GMT + - Thu, 30 Apr 2026 20:18:04 GMT Pragma: - no-cache Strict-Transport-Security: @@ -59,7 +59,7 @@ interactions: X-Oauth-Scopes: - '*' X-Ratelimit-Limit: - - "1600" + - "60" X-Xss-Protection: - 1; mode=block status: 200 OK @@ -78,7 +78,8 @@ interactions: url: https://api.linode.com/v4beta/object-storage/buckets/us-west-1/go-bucket-test-def method: GET response: - body: '{"errors": [{"reason": "Not found"}]}' + body: '{"errors": [{"reason": "The specified region was not found or does not + support Object Storage."}]}' headers: Access-Control-Allow-Headers: - Authorization, Origin, X-Requested-With, Content-Type, Accept, X-Filter @@ -93,13 +94,15 @@ interactions: Connection: - keep-alive Content-Length: - - "37" + - "98" Content-Type: - application/json Expires: - - Wed, 08 Jan 2025 06:03:07 GMT + - Thu, 30 Apr 2026 20:18:04 GMT Pragma: - no-cache + Strict-Transport-Security: + - max-age=31536000 Vary: - Authorization, X-Filter X-Accepted-Oauth-Scopes: @@ -109,7 +112,7 @@ interactions: X-Oauth-Scopes: - '*' X-Ratelimit-Limit: - - "1600" + - "1840" status: 404 Not Found code: 404 duration: "" @@ -123,7 +126,7 @@ interactions: - application/json User-Agent: - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/object-storage/buckets/us-east-1/go-bucket-test-def + url: https://api.linode.com/v4beta/object-storage/buckets/us-east/go-bucket-test-def method: DELETE response: body: '{}' @@ -151,7 +154,7 @@ interactions: Content-Type: - application/json Expires: - - Wed, 08 Jan 2025 06:03:11 GMT + - Thu, 30 Apr 2026 20:18:07 GMT Pragma: - no-cache Strict-Transport-Security: @@ -168,7 +171,7 @@ interactions: X-Oauth-Scopes: - '*' X-Ratelimit-Limit: - - "1600" + - "1840" X-Xss-Protection: - 1; mode=block status: 200 OK diff --git a/test/integration/fixtures/TestObjectStorageBucket_Regional.yaml b/test/integration/fixtures/TestObjectStorageBucket_Regional.yaml deleted file mode 100644 index 55aaf10c0..000000000 --- a/test/integration/fixtures/TestObjectStorageBucket_Regional.yaml +++ /dev/null @@ -1,539 +0,0 @@ ---- -version: 1 -interactions: -- request: - body: "" - form: {} - headers: - Accept: - - application/json - Content-Type: - - application/json - User-Agent: - - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/regions?page=1 - method: GET - response: - body: '{"data": [{"id": "ap-west", "label": "Mumbai, IN", "country": "in", "capabilities": - ["Linodes", "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", - "GPU Linodes", "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", - "Managed Databases", "Metadata", "Placement Group", "StackScripts"], "status": - "ok", "resolvers": {"ipv4": "172.105.34.5,172.105.35.5,172.105.36.5,172.105.37.5,172.105.38.5,172.105.39.5,172.105.40.5,172.105.41.5,172.105.42.5,172.105.43.5", - "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "ca-central", "label": "Toronto, CA", "country": - "ca", "capabilities": ["Linodes", "Disk Encryption", "Backups", "NodeBalancers", - "Block Storage", "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", - "Managed Databases", "Metadata", "Placement Group", "StackScripts"], "status": - "ok", "resolvers": {"ipv4": "172.105.0.5,172.105.3.5,172.105.4.5,172.105.5.5,172.105.6.5,172.105.7.5,172.105.8.5,172.105.9.5,172.105.10.5,172.105.11.5", - "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "ap-southeast", "label": "Sydney, AU", "country": - "au", "capabilities": ["Linodes", "Disk Encryption", "Backups", "NodeBalancers", - "Block Storage", "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", - "Managed Databases", "Metadata", "Placement Group", "StackScripts"], "status": - "ok", "resolvers": {"ipv4": "172.105.166.5,172.105.169.5,172.105.168.5,172.105.172.5,172.105.162.5,172.105.170.5,172.105.167.5,172.105.171.5,172.105.181.5,172.105.161.5", - "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "us-iad", "label": "Washington, DC", "country": - "us", "capabilities": ["Linodes", "Block Storage Encryption", "Disk Encryption", - "Backups", "NodeBalancers", "Block Storage", "Object Storage", "Kubernetes", - "Cloud Firewall", "Vlans", "VPCs", "Managed Databases", "Metadata", "Premium - Plans", "Placement Group", "StackScripts"], "status": "ok", "resolvers": {"ipv4": - "139.144.192.62,139.144.192.60,139.144.192.61,139.144.192.53,139.144.192.54,139.144.192.67,139.144.192.69,139.144.192.66,139.144.192.52,139.144.192.68", - "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "us-ord", "label": "Chicago, IL", "country": - "us", "capabilities": ["Linodes", "Block Storage Encryption", "Disk Encryption", - "Backups", "NodeBalancers", "Block Storage", "Object Storage", "GPU Linodes", - "Kubernetes", "Cloud Firewall", "Vlans", "VPCs", "Managed Databases", "Metadata", - "Premium Plans", "Placement Group", "StackScripts"], "status": "ok", "resolvers": - {"ipv4": "172.232.0.17,172.232.0.16,172.232.0.21,172.232.0.13,172.232.0.22,172.232.0.9,172.232.0.19,172.232.0.20,172.232.0.15,172.232.0.18", - "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "fr-par", "label": "Paris, FR", "country": - "fr", "capabilities": ["Linodes", "Block Storage Encryption", "Disk Encryption", - "Backups", "NodeBalancers", "Block Storage", "Object Storage", "GPU Linodes", - "Kubernetes", "Cloud Firewall", "Vlans", "VPCs", "Managed Databases", "Metadata", - "Premium Plans", "Placement Group", "StackScripts"], "status": "ok", "resolvers": - {"ipv4": "172.232.32.21,172.232.32.23,172.232.32.17,172.232.32.18,172.232.32.16,172.232.32.22,172.232.32.20,172.232.32.14,172.232.32.11,172.232.32.12", - "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "us-sea", "label": "Seattle, WA", "country": - "us", "capabilities": ["Linodes", "Block Storage Encryption", "Disk Encryption", - "Backups", "NodeBalancers", "Block Storage", "Object Storage", "GPU Linodes", - "Kubernetes", "Cloud Firewall", "Vlans", "VPCs", "Managed Databases", "Metadata", - "Premium Plans", "Placement Group", "StackScripts"], "status": "ok", "resolvers": - {"ipv4": "172.232.160.19,172.232.160.21,172.232.160.17,172.232.160.15,172.232.160.18,172.232.160.8,172.232.160.12,172.232.160.11,172.232.160.14,172.232.160.16", - "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "br-gru", "label": "Sao Paulo, BR", "country": - "br", "capabilities": ["Linodes", "Block Storage Encryption", "Disk Encryption", - "Backups", "NodeBalancers", "Block Storage", "Object Storage", "Kubernetes", - "Cloud Firewall", "Vlans", "VPCs", "Managed Databases", "Metadata", "Premium - Plans", "Placement Group", "StackScripts"], "status": "ok", "resolvers": {"ipv4": - "172.233.0.4,172.233.0.9,172.233.0.7,172.233.0.12,172.233.0.5,172.233.0.13,172.233.0.10,172.233.0.6,172.233.0.8,172.233.0.11", - "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "nl-ams", "label": "Amsterdam, NL", "country": - "nl", "capabilities": ["Linodes", "Block Storage Encryption", "Disk Encryption", - "Backups", "NodeBalancers", "Block Storage", "Object Storage", "Kubernetes", - "Cloud Firewall", "Vlans", "VPCs", "Managed Databases", "Metadata", "Premium - Plans", "Placement Group", "StackScripts"], "status": "ok", "resolvers": {"ipv4": - "172.233.33.36,172.233.33.38,172.233.33.35,172.233.33.39,172.233.33.34,172.233.33.33,172.233.33.31,172.233.33.30,172.233.33.37,172.233.33.32", - "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "se-sto", "label": "Stockholm, SE", "country": - "se", "capabilities": ["Linodes", "Block Storage Encryption", "Disk Encryption", - "Backups", "NodeBalancers", "Block Storage", "Object Storage", "Kubernetes", - "Cloud Firewall", "Vlans", "VPCs", "Managed Databases", "Metadata", "Premium - Plans", "Placement Group", "StackScripts"], "status": "ok", "resolvers": {"ipv4": - "172.232.128.24,172.232.128.26,172.232.128.20,172.232.128.22,172.232.128.25,172.232.128.19,172.232.128.23,172.232.128.18,172.232.128.21,172.232.128.27", - "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "es-mad", "label": "Madrid, ES", "country": - "es", "capabilities": ["Linodes", "Block Storage Encryption", "Disk Encryption", - "Backups", "NodeBalancers", "Block Storage", "Object Storage", "Kubernetes", - "Cloud Firewall", "Vlans", "VPCs", "Managed Databases", "Metadata", "Premium - Plans", "Placement Group", "StackScripts"], "status": "ok", "resolvers": {"ipv4": - "172.233.111.6,172.233.111.17,172.233.111.21,172.233.111.25,172.233.111.19,172.233.111.12,172.233.111.26,172.233.111.16,172.233.111.18,172.233.111.9", - "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "in-maa", "label": "Chennai, IN", "country": - "in", "capabilities": ["Linodes", "Block Storage Encryption", "Disk Encryption", - "Backups", "NodeBalancers", "Block Storage", "Object Storage", "Kubernetes", - "Cloud Firewall", "Vlans", "VPCs", "Managed Databases", "Metadata", "Premium - Plans", "Placement Group", "StackScripts", "NETINT Quadra T1U"], "status": "ok", - "resolvers": {"ipv4": "172.232.96.17,172.232.96.26,172.232.96.19,172.232.96.20,172.232.96.25,172.232.96.21,172.232.96.18,172.232.96.22,172.232.96.23,172.232.96.24", - "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "jp-osa", "label": "Osaka, JP", "country": - "jp", "capabilities": ["Linodes", "Block Storage Encryption", "Disk Encryption", - "Backups", "NodeBalancers", "Block Storage", "Object Storage", "GPU Linodes", - "Kubernetes", "Cloud Firewall", "Vlans", "VPCs", "Managed Databases", "Metadata", - "Premium Plans", "Placement Group", "StackScripts"], "status": "ok", "resolvers": - {"ipv4": "172.233.64.44,172.233.64.43,172.233.64.37,172.233.64.40,172.233.64.46,172.233.64.41,172.233.64.39,172.233.64.42,172.233.64.45,172.233.64.38", - "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "it-mil", "label": "Milan, IT", "country": - "it", "capabilities": ["Linodes", "Block Storage Encryption", "Disk Encryption", - "Backups", "NodeBalancers", "Block Storage", "Object Storage", "Kubernetes", - "Cloud Firewall", "Vlans", "VPCs", "Managed Databases", "Metadata", "Premium - Plans", "Placement Group", "StackScripts"], "status": "ok", "resolvers": {"ipv4": - "172.232.192.19,172.232.192.18,172.232.192.16,172.232.192.20,172.232.192.24,172.232.192.21,172.232.192.22,172.232.192.17,172.232.192.15,172.232.192.23", - "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "us-mia", "label": "Miami, FL", "country": - "us", "capabilities": ["Linodes", "Block Storage Encryption", "Disk Encryption", - "Backups", "NodeBalancers", "Block Storage", "Object Storage", "Kubernetes", - "Cloud Firewall", "Vlans", "VPCs", "Managed Databases", "Metadata", "Premium - Plans", "Placement Group", "StackScripts", "NETINT Quadra T1U"], "status": "ok", - "resolvers": {"ipv4": "172.233.160.34,172.233.160.27,172.233.160.30,172.233.160.29,172.233.160.32,172.233.160.28,172.233.160.33,172.233.160.26,172.233.160.25,172.233.160.31", - "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "id-cgk", "label": "Jakarta, ID", "country": - "id", "capabilities": ["Linodes", "Block Storage Encryption", "Disk Encryption", - "Backups", "NodeBalancers", "Block Storage", "Object Storage", "Kubernetes", - "Cloud Firewall", "Vlans", "VPCs", "Managed Databases", "Metadata", "Premium - Plans", "Placement Group", "StackScripts"], "status": "ok", "resolvers": {"ipv4": - "172.232.224.23,172.232.224.32,172.232.224.26,172.232.224.27,172.232.224.21,172.232.224.24,172.232.224.22,172.232.224.20,172.232.224.31,172.232.224.28", - "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "us-lax", "label": "Los Angeles, CA", "country": - "us", "capabilities": ["Linodes", "Block Storage Encryption", "Disk Encryption", - "Backups", "NodeBalancers", "Block Storage", "Object Storage", "Kubernetes", - "Cloud Firewall", "Vlans", "VPCs", "Managed Databases", "Metadata", "Premium - Plans", "Placement Group", "StackScripts", "NETINT Quadra T1U"], "status": "ok", - "resolvers": {"ipv4": "172.233.128.45,172.233.128.38,172.233.128.53,172.233.128.37,172.233.128.34,172.233.128.36,172.233.128.33,172.233.128.39,172.233.128.43,172.233.128.44", - "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "nz-akl-1", "label": "Auckland, NZ", "country": - "nz", "capabilities": ["Linodes", "Cloud Firewall", "Vlans", "Metadata", "Distributed - Plans"], "status": "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", - "ipv6": "1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": - 0, "maximum_linodes_per_pg": 0}, "site_type": "distributed"}, {"id": "us-den-1", - "label": "Denver, CO", "country": "us", "capabilities": ["Linodes", "Cloud Firewall", - "Vlans", "Metadata", "Distributed Plans"], "status": "ok", "resolvers": {"ipv4": - "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": - 0}, "site_type": "distributed"}, {"id": "de-ham-1", "label": "Hamburg, DE", - "country": "de", "capabilities": ["Linodes", "Cloud Firewall", "Vlans", "Metadata", - "Distributed Plans"], "status": "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", - "ipv6": "1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": - 0, "maximum_linodes_per_pg": 0}, "site_type": "distributed"}, {"id": "fr-mrs-1", - "label": "Marseille, FR", "country": "fr", "capabilities": ["Linodes", "Cloud - Firewall", "Vlans", "Metadata", "Distributed Plans"], "status": "ok", "resolvers": - {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": - 0}, "site_type": "distributed"}, {"id": "za-jnb-1", "label": "Johannesburg, - ZA", "country": "za", "capabilities": ["Linodes", "Cloud Firewall", "Vlans", - "Metadata", "Distributed Plans"], "status": "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", - "ipv6": "1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": - 0, "maximum_linodes_per_pg": 0}, "site_type": "distributed"}, {"id": "my-kul-1", - "label": "Kuala Lumpur, MY", "country": "my", "capabilities": ["Linodes", "Cloud - Firewall", "Vlans", "Metadata", "Distributed Plans"], "status": "ok", "resolvers": - {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": - 0}, "site_type": "distributed"}, {"id": "co-bog-1", "label": "Bogot\u00e1, CO", - "country": "co", "capabilities": ["Linodes", "Cloud Firewall", "Vlans", "Metadata", - "Distributed Plans"], "status": "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", - "ipv6": "1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": - 0, "maximum_linodes_per_pg": 0}, "site_type": "distributed"}, {"id": "mx-qro-1", - "label": "Quer\u00e9taro, MX", "country": "mx", "capabilities": ["Linodes", - "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans"], "status": "ok", - "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": - 0}, "site_type": "distributed"}, {"id": "us-hou-1", "label": "Houston, TX", - "country": "us", "capabilities": ["Linodes", "Cloud Firewall", "Vlans", "Metadata", - "Distributed Plans"], "status": "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", - "ipv6": "1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": - 0, "maximum_linodes_per_pg": 0}, "site_type": "distributed"}, {"id": "cl-scl-1", - "label": "Santiago, CL", "country": "cl", "capabilities": ["Linodes", "Cloud - Firewall", "Vlans", "Metadata", "Distributed Plans"], "status": "ok", "resolvers": - {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": - 0}, "site_type": "distributed"}, {"id": "gb-lon", "label": "London 2, UK", "country": - "gb", "capabilities": ["Linodes", "Block Storage Encryption", "Disk Encryption", - "Backups", "NodeBalancers", "Block Storage", "Kubernetes", "Cloud Firewall", - "Vlans", "VPCs", "Managed Databases", "Metadata", "Premium Plans", "Placement - Group", "StackScripts"], "status": "ok", "resolvers": {"ipv4": "172.236.0.46,172.236.0.50,172.236.0.47,172.236.0.53,172.236.0.52,172.236.0.45,172.236.0.49,172.236.0.51,172.236.0.54,172.236.0.48", - "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "au-mel", "label": "Melbourne, AU", "country": - "au", "capabilities": ["Linodes", "Block Storage Encryption", "Disk Encryption", - "Backups", "NodeBalancers", "Block Storage", "Kubernetes", "Cloud Firewall", - "Vlans", "VPCs", "Managed Databases", "Metadata", "Premium Plans", "Placement - Group", "StackScripts", "NETINT Quadra T1U"], "status": "ok", "resolvers": {"ipv4": - "172.236.32.23,172.236.32.35,172.236.32.30,172.236.32.28,172.236.32.32,172.236.32.33,172.236.32.27,172.236.32.37,172.236.32.29,172.236.32.34", - "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "in-bom-2", "label": "Mumbai 2, IN", "country": - "in", "capabilities": ["Linodes", "Block Storage Encryption", "Disk Encryption", - "Backups", "NodeBalancers", "Block Storage", "GPU Linodes", "Cloud Firewall", - "Vlans", "VPCs", "Metadata", "Premium Plans", "Placement Group", "StackScripts"], - "status": "ok", "resolvers": {"ipv4": "172.236.171.41,172.236.171.42,172.236.171.25,172.236.171.44,172.236.171.26,172.236.171.45,172.236.171.24,172.236.171.43,172.236.171.27,172.236.171.28", - "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "de-fra-2", "label": "Frankfurt 2, DE", "country": - "de", "capabilities": ["Linodes", "Block Storage Encryption", "Disk Encryption", - "Backups", "NodeBalancers", "Block Storage", "GPU Linodes", "Kubernetes", "Cloud - Firewall", "Vlans", "VPCs", "Metadata", "Premium Plans", "Placement Group", - "StackScripts", "NETINT Quadra T1U"], "status": "ok", "resolvers": {"ipv4": - "172.236.203.9,172.236.203.16,172.236.203.19,172.236.203.15,172.236.203.17,172.236.203.11,172.236.203.18,172.236.203.14,172.236.203.13,172.236.203.12", - "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "sg-sin-2", "label": "Singapore 2, SG", "country": - "sg", "capabilities": ["Linodes", "Block Storage Encryption", "Disk Encryption", - "Backups", "NodeBalancers", "Block Storage", "GPU Linodes", "Kubernetes", "Cloud - Firewall", "Vlans", "VPCs", "Managed Databases", "Metadata", "Premium Plans", - "Placement Group", "StackScripts"], "status": "ok", "resolvers": {"ipv4": "172.236.129.8,172.236.129.42,172.236.129.41,172.236.129.19,172.236.129.46,172.236.129.23,172.236.129.48,172.236.129.20,172.236.129.21,172.236.129.47", - "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "jp-tyo-3", "label": "Tokyo 3, JP", "country": - "jp", "capabilities": ["Linodes", "Block Storage Encryption", "Disk Encryption", - "Backups", "NodeBalancers", "Block Storage", "Kubernetes", "Cloud Firewall", - "Vlans", "VPCs", "Metadata", "Premium Plans", "Placement Group", "StackScripts"], - "status": "ok", "resolvers": {"ipv4": "172.237.4.15,172.237.4.19,172.237.4.17,172.237.4.21,172.237.4.16,172.237.4.18,172.237.4.23,172.237.4.24,172.237.4.20,172.237.4.14", - "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "us-central", "label": "Dallas, TX", "country": - "us", "capabilities": ["Linodes", "Disk Encryption", "Backups", "NodeBalancers", - "Block Storage", "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", - "Managed Databases", "Metadata", "Placement Group", "StackScripts"], "status": - "ok", "resolvers": {"ipv4": "72.14.179.5,72.14.188.5,173.255.199.5,66.228.53.5,96.126.122.5,96.126.124.5,96.126.127.5,198.58.107.5,198.58.111.5,23.239.24.5", - "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "us-west", "label": "Fremont, CA", "country": - "us", "capabilities": ["Linodes", "Block Storage Encryption", "Disk Encryption", - "Backups", "NodeBalancers", "Block Storage", "Kubernetes", "Cloud Firewall", - "Vlans", "Block Storage Migrations", "Managed Databases", "Metadata", "Placement - Group", "StackScripts"], "status": "ok", "resolvers": {"ipv4": "173.230.145.5, - 173.230.147.5, 173.230.155.5, 173.255.212.5, 173.255.219.5, 173.255.241.5, 173.255.243.5, - 173.255.244.5, 74.207.241.5, 74.207.242.5", "ipv6": "1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": - null, "maximum_linodes_per_pg": 5}, "site_type": "core"}, {"id": "us-southeast", - "label": "Atlanta, GA", "country": "us", "capabilities": ["Linodes", "Disk Encryption", - "Backups", "NodeBalancers", "Block Storage", "Object Storage", "GPU Linodes", - "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", "Managed - Databases", "Metadata", "Placement Group", "StackScripts"], "status": "ok", - "resolvers": {"ipv4": "74.207.231.5,173.230.128.5,173.230.129.5,173.230.136.5,173.230.140.5,66.228.59.5,66.228.62.5,50.116.35.5,50.116.41.5,23.239.18.5", - "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "us-east", "label": "Newark, NJ", "country": - "us", "capabilities": ["Linodes", "Disk Encryption", "Backups", "NodeBalancers", - "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Cloud Firewall", - "Vlans", "Block Storage Migrations", "Managed Databases", "Metadata", "Placement - Group", "StackScripts"], "status": "ok", "resolvers": {"ipv4": "66.228.42.5, - 96.126.106.5, 50.116.53.5, 50.116.58.5, 50.116.61.5, 50.116.62.5, 66.175.211.5, - 97.107.133.4, 207.192.69.4, 207.192.69.5", "ipv6": "1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": - null, "maximum_linodes_per_pg": 5}, "site_type": "core"}, {"id": "eu-west", - "label": "London, UK", "country": "gb", "capabilities": ["Linodes", "Disk Encryption", - "Backups", "NodeBalancers", "Block Storage", "Kubernetes", "Cloud Firewall", - "Vlans", "Block Storage Migrations", "Metadata", "Placement Group", "StackScripts"], - "status": "ok", "resolvers": {"ipv4": "178.79.182.5, 176.58.107.5, 176.58.116.5, - 176.58.121.5, 151.236.220.5, 212.71.252.5, 212.71.253.5, 109.74.192.20, 109.74.193.20, - 109.74.194.20", "ipv6": "1234::5678, 1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "ap-south", "label": "Singapore, SG", "country": - "sg", "capabilities": ["Linodes", "Disk Encryption", "Backups", "NodeBalancers", - "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Cloud Firewall", - "Vlans", "Block Storage Migrations", "Metadata", "Placement Group", "StackScripts"], - "status": "ok", "resolvers": {"ipv4": "139.162.11.5,139.162.13.5,139.162.14.5,139.162.15.5,139.162.16.5,139.162.21.5,139.162.27.5,103.3.60.18,103.3.60.19,103.3.60.20", - "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "eu-central", "label": "Frankfurt, DE", "country": - "de", "capabilities": ["Linodes", "Disk Encryption", "Backups", "NodeBalancers", - "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Cloud Firewall", - "Vlans", "Block Storage Migrations", "Managed Databases", "Metadata", "Placement - Group", "StackScripts"], "status": "ok", "resolvers": {"ipv4": "139.162.130.5,139.162.131.5,139.162.132.5,139.162.133.5,139.162.134.5,139.162.135.5,139.162.136.5,139.162.137.5,139.162.138.5,139.162.139.5", - "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "ap-northeast", "label": "Tokyo 2, JP", "country": - "jp", "capabilities": ["Linodes", "Disk Encryption", "Backups", "NodeBalancers", - "Block Storage", "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", - "Managed Databases", "Metadata", "Placement Group", "StackScripts"], "status": - "ok", "resolvers": {"ipv4": "139.162.66.5,139.162.67.5,139.162.68.5,139.162.69.5,139.162.70.5,139.162.71.5,139.162.72.5,139.162.73.5,139.162.74.5,139.162.75.5", - "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}], "page": 1, "pages": 1, "results": 41}' - headers: - Access-Control-Allow-Credentials: - - "true" - Access-Control-Allow-Headers: - - Authorization, Origin, X-Requested-With, Content-Type, Accept, X-Filter - Access-Control-Allow-Methods: - - HEAD, GET, OPTIONS, POST, PUT, DELETE - Access-Control-Allow-Origin: - - '*' - Access-Control-Expose-Headers: - - X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Status - Akamai-Internal-Account: - - '*' - Cache-Control: - - max-age=0, no-cache, no-store - Connection: - - keep-alive - Content-Security-Policy: - - default-src 'none' - Content-Type: - - application/json - Expires: - - Wed, 08 Jan 2025 06:02:53 GMT - Pragma: - - no-cache - Strict-Transport-Security: - - max-age=31536000 - Vary: - - Authorization, X-Filter - - Authorization, X-Filter - - Accept-Encoding - X-Accepted-Oauth-Scopes: - - '*' - X-Content-Type-Options: - - nosniff - X-Frame-Options: - - DENY - - DENY - X-Oauth-Scopes: - - '*' - X-Ratelimit-Limit: - - "1600" - X-Xss-Protection: - - 1; mode=block - status: 200 OK - code: 200 - duration: "" -- request: - body: '{"region":"us-iad","label":"go-bucket-test-def"}' - form: {} - headers: - Accept: - - application/json - Content-Type: - - application/json - User-Agent: - - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/object-storage/buckets - method: POST - response: - body: '{"hostname": "go-bucket-test-def.us-iad-1.linodeobjects.com", "label": - "go-bucket-test-def", "created": "2018-01-02T03:04:05", "region": "us-iad", - "cluster": "us-iad-1", "size": 0, "objects": 0, "endpoint_type": "E1", "s3_endpoint": - "us-iad-1.linodeobjects.com"}' - headers: - Access-Control-Allow-Credentials: - - "true" - Access-Control-Allow-Headers: - - Authorization, Origin, X-Requested-With, Content-Type, Accept, X-Filter - Access-Control-Allow-Methods: - - HEAD, GET, OPTIONS, POST, PUT, DELETE - Access-Control-Allow-Origin: - - '*' - Access-Control-Expose-Headers: - - X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Status - Akamai-Internal-Account: - - '*' - Cache-Control: - - max-age=0, no-cache, no-store - Connection: - - keep-alive - Content-Length: - - "262" - Content-Security-Policy: - - default-src 'none' - Content-Type: - - application/json - Expires: - - Wed, 08 Jan 2025 06:02:55 GMT - Pragma: - - no-cache - Strict-Transport-Security: - - max-age=31536000 - Vary: - - Authorization, X-Filter - X-Accepted-Oauth-Scopes: - - object_storage:read_write - X-Content-Type-Options: - - nosniff - X-Frame-Options: - - DENY - - DENY - X-Oauth-Scopes: - - '*' - X-Ratelimit-Limit: - - "1600" - X-Xss-Protection: - - 1; mode=block - status: 200 OK - code: 200 - duration: "" -- request: - body: "" - form: {} - headers: - Accept: - - application/json - Content-Type: - - application/json - User-Agent: - - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/object-storage/buckets/us-iad/go-bucket-test-def - method: GET - response: - body: '{"hostname": "go-bucket-test-def.us-iad-1.linodeobjects.com", "label": - "go-bucket-test-def", "created": "2018-01-02T03:04:05", "region": "us-iad", - "cluster": "us-iad-1", "size": 0, "objects": 0, "endpoint_type": "E1", "s3_endpoint": - "us-iad-1.linodeobjects.com"}' - headers: - Access-Control-Allow-Credentials: - - "true" - Access-Control-Allow-Headers: - - Authorization, Origin, X-Requested-With, Content-Type, Accept, X-Filter - Access-Control-Allow-Methods: - - HEAD, GET, OPTIONS, POST, PUT, DELETE - Access-Control-Allow-Origin: - - '*' - Access-Control-Expose-Headers: - - X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Status - Akamai-Internal-Account: - - '*' - Cache-Control: - - max-age=0, no-cache, no-store - Connection: - - keep-alive - Content-Length: - - "262" - Content-Security-Policy: - - default-src 'none' - Content-Type: - - application/json - Expires: - - Wed, 08 Jan 2025 06:02:56 GMT - Pragma: - - no-cache - Strict-Transport-Security: - - max-age=31536000 - Vary: - - Authorization, X-Filter - - Authorization, X-Filter - X-Accepted-Oauth-Scopes: - - object_storage:read_only - X-Content-Type-Options: - - nosniff - X-Frame-Options: - - DENY - - DENY - X-Oauth-Scopes: - - '*' - X-Ratelimit-Limit: - - "1600" - X-Xss-Protection: - - 1; mode=block - status: 200 OK - code: 200 - duration: "" -- request: - body: "" - form: {} - headers: - Accept: - - application/json - Content-Type: - - application/json - User-Agent: - - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/object-storage/buckets/us-iad-1/go-bucket-test-def - method: DELETE - response: - body: '{}' - headers: - Access-Control-Allow-Credentials: - - "true" - Access-Control-Allow-Headers: - - Authorization, Origin, X-Requested-With, Content-Type, Accept, X-Filter - Access-Control-Allow-Methods: - - HEAD, GET, OPTIONS, POST, PUT, DELETE - Access-Control-Allow-Origin: - - '*' - Access-Control-Expose-Headers: - - X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Status - Akamai-Internal-Account: - - '*' - Cache-Control: - - max-age=0, no-cache, no-store - Connection: - - keep-alive - Content-Length: - - "2" - Content-Security-Policy: - - default-src 'none' - Content-Type: - - application/json - Expires: - - Wed, 08 Jan 2025 06:03:05 GMT - Pragma: - - no-cache - Strict-Transport-Security: - - max-age=31536000 - Vary: - - Authorization, X-Filter - X-Accepted-Oauth-Scopes: - - object_storage:read_write - X-Content-Type-Options: - - nosniff - X-Frame-Options: - - DENY - - DENY - X-Oauth-Scopes: - - '*' - X-Ratelimit-Limit: - - "1600" - X-Xss-Protection: - - 1; mode=block - status: 200 OK - code: 200 - duration: "" diff --git a/test/integration/fixtures/TestObjectStorageBucketsInCluster_List.yaml b/test/integration/fixtures/TestObjectStorageBucketsInCluster_List.yaml deleted file mode 100644 index 9e0cc3b02..000000000 --- a/test/integration/fixtures/TestObjectStorageBucketsInCluster_List.yaml +++ /dev/null @@ -1,193 +0,0 @@ ---- -version: 1 -interactions: -- request: - body: '{"region":"us-east","label":"go-bucket-test-def"}' - form: {} - headers: - Accept: - - application/json - Content-Type: - - application/json - User-Agent: - - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/object-storage/buckets - method: POST - response: - body: '{"hostname": "go-bucket-test-def.us-east-1.linodeobjects.com", "label": - "go-bucket-test-def", "created": "2018-01-02T03:04:05", "region": "us-east", - "cluster": "us-east-1", "size": 0, "objects": 0, "endpoint_type": "E0", "s3_endpoint": - "us-east-1.linodeobjects.com"}' - headers: - Access-Control-Allow-Credentials: - - "true" - Access-Control-Allow-Headers: - - Authorization, Origin, X-Requested-With, Content-Type, Accept, X-Filter - Access-Control-Allow-Methods: - - HEAD, GET, OPTIONS, POST, PUT, DELETE - Access-Control-Allow-Origin: - - '*' - Access-Control-Expose-Headers: - - X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Status - Akamai-Internal-Account: - - '*' - Cache-Control: - - max-age=0, no-cache, no-store - Connection: - - keep-alive - Content-Length: - - "266" - Content-Security-Policy: - - default-src 'none' - Content-Type: - - application/json - Expires: - - Wed, 08 Jan 2025 06:03:28 GMT - Pragma: - - no-cache - Strict-Transport-Security: - - max-age=31536000 - Vary: - - Authorization, X-Filter - X-Accepted-Oauth-Scopes: - - object_storage:read_write - X-Content-Type-Options: - - nosniff - X-Frame-Options: - - DENY - - DENY - X-Oauth-Scopes: - - '*' - X-Ratelimit-Limit: - - "1600" - X-Xss-Protection: - - 1; mode=block - status: 200 OK - code: 200 - duration: "" -- request: - body: "" - form: {} - headers: - Accept: - - application/json - Content-Type: - - application/json - User-Agent: - - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/object-storage/buckets/us-east-1?page=1 - method: GET - response: - body: '{"data": [{"hostname": "go-bucket-test-def.us-east-1.linodeobjects.com", - "label": "go-bucket-test-def", "created": "2018-01-02T03:04:05", "region": "us-east", - "cluster": "us-east-1", "size": 0, "objects": 0, "endpoint_type": "E0", "s3_endpoint": - "us-east-1.linodeobjects.com"}], "page": 1, "pages": 1, "results": 1}' - headers: - Access-Control-Allow-Credentials: - - "true" - Access-Control-Allow-Headers: - - Authorization, Origin, X-Requested-With, Content-Type, Accept, X-Filter - Access-Control-Allow-Methods: - - HEAD, GET, OPTIONS, POST, PUT, DELETE - Access-Control-Allow-Origin: - - '*' - Access-Control-Expose-Headers: - - X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Status - Akamai-Internal-Account: - - '*' - Cache-Control: - - max-age=0, no-cache, no-store - Connection: - - keep-alive - Content-Length: - - "315" - Content-Security-Policy: - - default-src 'none' - Content-Type: - - application/json - Expires: - - Wed, 08 Jan 2025 06:03:29 GMT - Pragma: - - no-cache - Strict-Transport-Security: - - max-age=31536000 - Vary: - - Authorization, X-Filter - - Authorization, X-Filter - X-Accepted-Oauth-Scopes: - - object_storage:read_only - X-Content-Type-Options: - - nosniff - X-Frame-Options: - - DENY - - DENY - X-Oauth-Scopes: - - '*' - X-Ratelimit-Limit: - - "1600" - X-Xss-Protection: - - 1; mode=block - status: 200 OK - code: 200 - duration: "" -- request: - body: "" - form: {} - headers: - Accept: - - application/json - Content-Type: - - application/json - User-Agent: - - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/object-storage/buckets/us-east-1/go-bucket-test-def - method: DELETE - response: - body: '{}' - headers: - Access-Control-Allow-Credentials: - - "true" - Access-Control-Allow-Headers: - - Authorization, Origin, X-Requested-With, Content-Type, Accept, X-Filter - Access-Control-Allow-Methods: - - HEAD, GET, OPTIONS, POST, PUT, DELETE - Access-Control-Allow-Origin: - - '*' - Access-Control-Expose-Headers: - - X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Status - Akamai-Internal-Account: - - '*' - Cache-Control: - - max-age=0, no-cache, no-store - Connection: - - keep-alive - Content-Length: - - "2" - Content-Security-Policy: - - default-src 'none' - Content-Type: - - application/json - Expires: - - Wed, 08 Jan 2025 06:03:33 GMT - Pragma: - - no-cache - Strict-Transport-Security: - - max-age=31536000 - Vary: - - Authorization, X-Filter - X-Accepted-Oauth-Scopes: - - object_storage:read_write - X-Content-Type-Options: - - nosniff - X-Frame-Options: - - DENY - - DENY - X-Oauth-Scopes: - - '*' - X-Ratelimit-Limit: - - "1600" - X-Xss-Protection: - - 1; mode=block - status: 200 OK - code: 200 - duration: "" diff --git a/test/integration/fixtures/TestObjectStorageBuckets_List.yaml b/test/integration/fixtures/TestObjectStorageBuckets_List.yaml index 139f14f75..861804cd5 100644 --- a/test/integration/fixtures/TestObjectStorageBuckets_List.yaml +++ b/test/integration/fixtures/TestObjectStorageBuckets_List.yaml @@ -42,7 +42,7 @@ interactions: Content-Type: - application/json Expires: - - Thu, 30 Jan 2025 19:34:04 GMT + - Thu, 30 Apr 2026 20:18:17 GMT Pragma: - no-cache Strict-Transport-Security: @@ -59,7 +59,7 @@ interactions: X-Oauth-Scopes: - '*' X-Ratelimit-Limit: - - "1600" + - "60" X-Xss-Protection: - 1; mode=block status: 200 OK @@ -78,50 +78,10 @@ interactions: url: https://api.linode.com/v4beta/object-storage/buckets?page=1 method: GET response: - body: '{"data": [{"hostname": "bucket-1736798274052633022.gb-lon-1.linodeobjects.com", - "label": "bucket-1736798274052633022", "created": "2018-01-02T03:04:05", "region": - "gb-lon", "cluster": "", "size": 0, "objects": 0, "endpoint_type": "E3", "s3_endpoint": - "gb-lon-1.linodeobjects.com"}, {"hostname": "bucket-1738000793614673680.gb-lon-1.linodeobjects.com", - "label": "bucket-1738000793614673680", "created": "2018-01-02T03:04:05", "region": - "gb-lon", "cluster": "", "size": 0, "objects": 0, "endpoint_type": "E3", "s3_endpoint": - "gb-lon-1.linodeobjects.com"}, {"hostname": "go-bucket-test-def.us-east-1.linodeobjects.com", + body: '{"data": [{"hostname": "go-bucket-test-def.us-east-1.linodeobjects.com", "label": "go-bucket-test-def", "created": "2018-01-02T03:04:05", "region": "us-east", "cluster": "us-east-1", "size": 0, "objects": 0, "endpoint_type": "E0", "s3_endpoint": - "us-east-1.linodeobjects.com"}, {"hostname": "tf-test-1543819153442410267.sg-sin-1.linodeobjects.com", - "label": "tf-test-1543819153442410267", "created": "2018-01-02T03:04:05", "region": - "sg-sin-2", "cluster": "", "size": 0, "objects": 0, "endpoint_type": "E2", "s3_endpoint": - "sg-sin-1.linodeobjects.com"}, {"hostname": "tf-test-2484676038142344857.it-mil-1.linodeobjects.com", - "label": "tf-test-2484676038142344857", "created": "2018-01-02T03:04:05", "region": - "it-mil", "cluster": "it-mil-1", "size": 0, "objects": 0, "endpoint_type": "E1", - "s3_endpoint": "it-mil-1.linodeobjects.com"}, {"hostname": "tf-test-3502349996573909406.us-iad-1.linodeobjects.com", - "label": "tf-test-3502349996573909406", "created": "2018-01-02T03:04:05", "region": - "us-iad", "cluster": "us-iad-1", "size": 0, "objects": 0, "endpoint_type": "E1", - "s3_endpoint": "us-iad-1.linodeobjects.com"}, {"hostname": "tf-test-3632911602253826896.gb-lon-1.linodeobjects.com", - "label": "tf-test-3632911602253826896", "created": "2018-01-02T03:04:05", "region": - "gb-lon", "cluster": "", "size": 0, "objects": 0, "endpoint_type": "E3", "s3_endpoint": - "gb-lon-1.linodeobjects.com"}, {"hostname": "tf-test-3691810287020261631.us-iad-1.linodeobjects.com", - "label": "tf-test-3691810287020261631", "created": "2018-01-02T03:04:05", "region": - "us-iad", "cluster": "us-iad-1", "size": 0, "objects": 0, "endpoint_type": "E1", - "s3_endpoint": "us-iad-1.linodeobjects.com"}, {"hostname": "tf-test-3847259615974034792.us-iad-1.linodeobjects.com", - "label": "tf-test-3847259615974034792", "created": "2018-01-02T03:04:05", "region": - "us-iad", "cluster": "us-iad-1", "size": 0, "objects": 0, "endpoint_type": "E1", - "s3_endpoint": "us-iad-1.linodeobjects.com"}, {"hostname": "tf-test-5629732048996817677.us-iad-1.linodeobjects.com", - "label": "tf-test-5629732048996817677", "created": "2018-01-02T03:04:05", "region": - "us-iad", "cluster": "us-iad-1", "size": 0, "objects": 0, "endpoint_type": "E1", - "s3_endpoint": "us-iad-1.linodeobjects.com"}, {"hostname": "tf-test-6566002079784759866.us-iad-1.linodeobjects.com", - "label": "tf-test-6566002079784759866", "created": "2018-01-02T03:04:05", "region": - "us-iad", "cluster": "us-iad-1", "size": 0, "objects": 0, "endpoint_type": "E1", - "s3_endpoint": "us-iad-1.linodeobjects.com"}, {"hostname": "tf-test-6680232593917341773.us-iad-1.linodeobjects.com", - "label": "tf-test-6680232593917341773", "created": "2018-01-02T03:04:05", "region": - "us-iad", "cluster": "us-iad-1", "size": 0, "objects": 0, "endpoint_type": "E1", - "s3_endpoint": "us-iad-1.linodeobjects.com"}, {"hostname": "tf-test-6921913936824551527.id-cgk-1.linodeobjects.com", - "label": "tf-test-6921913936824551527", "created": "2018-01-02T03:04:05", "region": - "id-cgk", "cluster": "id-cgk-1", "size": 0, "objects": 0, "endpoint_type": "E1", - "s3_endpoint": "id-cgk-1.linodeobjects.com"}, {"hostname": "tf-test-8637208670123446138.us-iad-1.linodeobjects.com", - "label": "tf-test-8637208670123446138", "created": "2018-01-02T03:04:05", "region": - "us-iad", "cluster": "us-iad-1", "size": 0, "objects": 0, "endpoint_type": "E1", - "s3_endpoint": "us-iad-1.linodeobjects.com"}], "page": 1, "pages": 1, "results": - 14}' + "us-east-1.linodeobjects.com"}], "page": 1, "pages": 1, "results": 2}' headers: Access-Control-Allow-Credentials: - "true" @@ -139,12 +99,14 @@ interactions: - max-age=0, no-cache, no-store Connection: - keep-alive + Content-Length: + - "315" Content-Security-Policy: - default-src 'none' Content-Type: - application/json Expires: - - Thu, 30 Jan 2025 19:34:09 GMT + - Thu, 30 Apr 2026 20:18:19 GMT Pragma: - no-cache Strict-Transport-Security: @@ -152,7 +114,6 @@ interactions: Vary: - Authorization, X-Filter - Authorization, X-Filter - - Accept-Encoding X-Accepted-Oauth-Scopes: - object_storage:read_only X-Content-Type-Options: @@ -163,7 +124,7 @@ interactions: X-Oauth-Scopes: - '*' X-Ratelimit-Limit: - - "1600" + - "1840" X-Xss-Protection: - 1; mode=block status: 200 OK @@ -179,7 +140,7 @@ interactions: - application/json User-Agent: - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/object-storage/buckets/us-east-1/go-bucket-test-def + url: https://api.linode.com/v4beta/object-storage/buckets/us-east/go-bucket-test-def method: DELETE response: body: '{}' @@ -207,7 +168,7 @@ interactions: Content-Type: - application/json Expires: - - Thu, 30 Jan 2025 19:34:13 GMT + - Thu, 30 Apr 2026 20:18:22 GMT Pragma: - no-cache Strict-Transport-Security: @@ -224,7 +185,7 @@ interactions: X-Oauth-Scopes: - '*' X-Ratelimit-Limit: - - "1600" + - "1840" X-Xss-Protection: - 1; mode=block status: 200 OK diff --git a/test/integration/fixtures/TestObjectStorageClusters_List.yaml b/test/integration/fixtures/TestObjectStorageClusters_List.yaml deleted file mode 100644 index c6df53d93..000000000 --- a/test/integration/fixtures/TestObjectStorageClusters_List.yaml +++ /dev/null @@ -1,114 +0,0 @@ ---- -version: 1 -interactions: -- request: - body: "" - form: {} - headers: - Accept: - - application/json - Content-Type: - - application/json - User-Agent: - - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/object-storage/clusters?page=1 - method: GET - response: - body: '{"data": [{"id": "us-east-1", "region": "us-east", "status": "available", - "domain": "us-east-1.linodeobjects.com", "static_site_domain": "website-us-east-1.linodeobjects.com"}, - {"id": "eu-central-1", "region": "eu-central", "status": "available", "domain": - "eu-central-1.linodeobjects.com", "static_site_domain": "website-eu-central-1.linodeobjects.com"}, - {"id": "ap-south-1", "region": "ap-south", "status": "available", "domain": - "ap-south-1.linodeobjects.com", "static_site_domain": "website-ap-south-1.linodeobjects.com"}, - {"id": "us-southeast-1", "region": "us-southeast", "status": "available", "domain": - "us-southeast-1.linodeobjects.com", "static_site_domain": "website-us-southeast-1.linodeobjects.com"}, - {"id": "us-iad-1", "region": "us-iad", "status": "available", "domain": "us-iad-1.linodeobjects.com", - "static_site_domain": "website-us-iad-1.linodeobjects.com"}, {"id": "fr-par-1", - "region": "fr-par", "status": "available", "domain": "fr-par-1.linodeobjects.com", - "static_site_domain": "website-fr-par-1.linodeobjects.com"}, {"id": "us-ord-1", - "region": "us-ord", "status": "available", "domain": "us-ord-1.linodeobjects.com", - "static_site_domain": "website-us-ord-1.linodeobjects.com"}, {"id": "in-maa-1", - "region": "in-maa", "status": "available", "domain": "in-maa-1.linodeobjects.com", - "static_site_domain": "website-in-maa-1.linodeobjects.com"}, {"id": "se-sto-1", - "region": "se-sto", "status": "available", "domain": "se-sto-1.linodeobjects.com", - "static_site_domain": "website-se-sto-1.linodeobjects.com"}, {"id": "it-mil-1", - "region": "it-mil", "status": "available", "domain": "it-mil-1.linodeobjects.com", - "static_site_domain": "website-it-mil-1.linodeobjects.com"}, {"id": "us-sea-1", - "region": "us-sea", "status": "available", "domain": "us-sea-1.linodeobjects.com", - "static_site_domain": "website-us-sea-1.linodeobjects.com"}, {"id": "id-cgk-1", - "region": "id-cgk", "status": "available", "domain": "id-cgk-1.linodeobjects.com", - "static_site_domain": "website-id-cgk-1.linodeobjects.com"}, {"id": "jp-osa-1", - "region": "jp-osa", "status": "available", "domain": "jp-osa-1.linodeobjects.com", - "static_site_domain": "website-jp-osa-1.linodeobjects.com"}, {"id": "br-gru-1", - "region": "br-gru", "status": "available", "domain": "br-gru-1.linodeobjects.com", - "static_site_domain": "website-br-gru-1.linodeobjects.com"}, {"id": "us-lax-1", - "region": "us-lax", "status": "available", "domain": "us-lax-1.linodeobjects.com", - "static_site_domain": "website-us-lax-1.linodeobjects.com"}, {"id": "nl-ams-1", - "region": "nl-ams", "status": "available", "domain": "nl-ams-1.linodeobjects.com", - "static_site_domain": "website-nl-ams-1.linodeobjects.com"}, {"id": "us-mia-1", - "region": "us-mia", "status": "available", "domain": "us-mia-1.linodeobjects.com", - "static_site_domain": "website-us-mia-1.linodeobjects.com"}, {"id": "es-mad-1", - "region": "es-mad", "status": "available", "domain": "es-mad-1.linodeobjects.com", - "static_site_domain": "website-es-mad-1.linodeobjects.com"}, {"id": "us-iad-10", - "region": "us-iad", "status": "available", "domain": "us-iad-10.linodeobjects.com", - "static_site_domain": "website-us-iad-10.linodeobjects.com"}, {"id": "us-sea-9", - "region": "us-sea", "status": "hidden", "domain": "us-sea-9.linodeobjects.com", - "static_site_domain": "website-us-sea-9.linodeobjects.com"}, {"id": "au-mel-1", - "region": "au-mel", "status": "hidden", "domain": "au-mel-1.linodeobjects.com", - "static_site_domain": "website-au-mel-1.linodeobjects.com"}, {"id": "gb-lon-1", - "region": "gb-lon", "status": "hidden", "domain": "gb-lon-1.linodeobjects.com", - "static_site_domain": "website-gb-lon-1.linodeobjects.com"}, {"id": "in-bom-1", - "region": "in-bom-2", "status": "hidden", "domain": "in-bom-1.linodeobjects.com", - "static_site_domain": "website-in-bom-1.linodeobjects.com"}, {"id": "de-fra-1", - "region": "de-fra-2", "status": "hidden", "domain": "de-fra-1.linodeobjects.com", - "static_site_domain": "website-de-fra-1.linodeobjects.com"}, {"id": "sg-sin-1", - "region": "sg-sin-2", "status": "hidden", "domain": "sg-sin-1.linodeobjects.com", - "static_site_domain": "website-sg-sin-1.linodeobjects.com"}], "page": 1, "pages": - 1, "results": 25}' - headers: - Access-Control-Allow-Credentials: - - "true" - Access-Control-Allow-Headers: - - Authorization, Origin, X-Requested-With, Content-Type, Accept, X-Filter - Access-Control-Allow-Methods: - - HEAD, GET, OPTIONS, POST, PUT, DELETE - Access-Control-Allow-Origin: - - '*' - Access-Control-Expose-Headers: - - X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Status - Akamai-Internal-Account: - - '*' - Cache-Control: - - max-age=0, no-cache, no-store - Connection: - - keep-alive - Content-Security-Policy: - - default-src 'none' - Content-Type: - - application/json - Expires: - - Wed, 08 Jan 2025 06:03:49 GMT - Pragma: - - no-cache - Strict-Transport-Security: - - max-age=31536000 - Vary: - - Authorization, X-Filter - - Authorization, X-Filter - - Accept-Encoding - X-Accepted-Oauth-Scopes: - - object_storage:read_only - X-Content-Type-Options: - - nosniff - X-Frame-Options: - - DENY - - DENY - X-Oauth-Scopes: - - '*' - X-Ratelimit-Limit: - - "1600" - X-Xss-Protection: - - 1; mode=block - status: 200 OK - code: 200 - duration: "" diff --git a/test/integration/fixtures/TestObjectStorageKey_GetFound.yaml b/test/integration/fixtures/TestObjectStorageKey_GetFound.yaml index eded32ffc..df3671b78 100644 --- a/test/integration/fixtures/TestObjectStorageKey_GetFound.yaml +++ b/test/integration/fixtures/TestObjectStorageKey_GetFound.yaml @@ -14,7 +14,7 @@ interactions: url: https://api.linode.com/v4beta/object-storage/keys method: POST response: - body: '{"id": 1654583, "label": "go-test-def", "access_key": "[SANITIZED]", "secret_key": + body: '{"id": 3498033, "label": "go-test-def", "access_key": "[SANITIZED]", "secret_key": "[SANITIZED]", "limited": false, "bucket_access": null, "regions": [{"id": "ap-south", "s3_endpoint": "ap-south-1.linodeobjects.com", "endpoint_type": "E0"}, {"id": "br-gru", "s3_endpoint": "br-gru-1.linodeobjects.com", "endpoint_type": "E1"}, @@ -30,9 +30,11 @@ interactions: "endpoint_type": "E1"}, {"id": "us-east", "s3_endpoint": "us-east-1.linodeobjects.com", "endpoint_type": "E0"}, {"id": "us-iad", "s3_endpoint": "us-iad-1.linodeobjects.com", "endpoint_type": "E1"}, {"id": "us-lax", "s3_endpoint": "us-lax-1.linodeobjects.com", - "endpoint_type": "E1"}, {"id": "us-mia", "s3_endpoint": "us-mia-1.linodeobjects.com", + "endpoint_type": "E1"}, {"id": "us-lax", "s3_endpoint": "us-lax-4.linodeobjects.com", + "endpoint_type": "E3"}, {"id": "us-mia", "s3_endpoint": "us-mia-1.linodeobjects.com", "endpoint_type": "E1"}, {"id": "us-ord", "s3_endpoint": "us-ord-1.linodeobjects.com", - "endpoint_type": "E1"}, {"id": "us-sea", "s3_endpoint": "us-sea-1.linodeobjects.com", + "endpoint_type": "E1"}, {"id": "us-ord", "s3_endpoint": "us-ord-10.linodeobjects.com", + "endpoint_type": "E3"}, {"id": "us-sea", "s3_endpoint": "us-sea-1.linodeobjects.com", "endpoint_type": "E1"}, {"id": "us-southeast", "s3_endpoint": "us-southeast-1.linodeobjects.com", "endpoint_type": "E0"}]}' headers: @@ -57,7 +59,7 @@ interactions: Content-Type: - application/json Expires: - - Wed, 08 Jan 2025 06:03:51 GMT + - Thu, 30 Apr 2026 20:18:59 GMT Pragma: - no-cache Strict-Transport-Security: @@ -75,7 +77,7 @@ interactions: X-Oauth-Scopes: - '*' X-Ratelimit-Limit: - - "1600" + - "60" X-Xss-Protection: - 1; mode=block status: 200 OK @@ -91,10 +93,10 @@ interactions: - application/json User-Agent: - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/object-storage/keys/1654583 + url: https://api.linode.com/v4beta/object-storage/keys/3498033 method: GET response: - body: '{"id": 1654583, "label": "go-test-def", "access_key": "[SANITIZED]", "secret_key": + body: '{"id": 3498033, "label": "go-test-def", "access_key": "[SANITIZED]", "secret_key": "[REDACTED]", "limited": false, "bucket_access": null, "regions": [{"id": "ap-south", "s3_endpoint": "ap-south-1.linodeobjects.com", "endpoint_type": "E0"}, {"id": "br-gru", "s3_endpoint": "br-gru-1.linodeobjects.com", "endpoint_type": "E1"}, @@ -110,9 +112,11 @@ interactions: "endpoint_type": "E1"}, {"id": "us-east", "s3_endpoint": "us-east-1.linodeobjects.com", "endpoint_type": "E0"}, {"id": "us-iad", "s3_endpoint": "us-iad-1.linodeobjects.com", "endpoint_type": "E1"}, {"id": "us-lax", "s3_endpoint": "us-lax-1.linodeobjects.com", - "endpoint_type": "E1"}, {"id": "us-mia", "s3_endpoint": "us-mia-1.linodeobjects.com", + "endpoint_type": "E1"}, {"id": "us-lax", "s3_endpoint": "us-lax-4.linodeobjects.com", + "endpoint_type": "E3"}, {"id": "us-mia", "s3_endpoint": "us-mia-1.linodeobjects.com", "endpoint_type": "E1"}, {"id": "us-ord", "s3_endpoint": "us-ord-1.linodeobjects.com", - "endpoint_type": "E1"}, {"id": "us-sea", "s3_endpoint": "us-sea-1.linodeobjects.com", + "endpoint_type": "E1"}, {"id": "us-ord", "s3_endpoint": "us-ord-10.linodeobjects.com", + "endpoint_type": "E3"}, {"id": "us-sea", "s3_endpoint": "us-sea-1.linodeobjects.com", "endpoint_type": "E1"}, {"id": "us-southeast", "s3_endpoint": "us-southeast-1.linodeobjects.com", "endpoint_type": "E0"}]}' headers: @@ -137,7 +141,7 @@ interactions: Content-Type: - application/json Expires: - - Wed, 08 Jan 2025 06:03:52 GMT + - Thu, 30 Apr 2026 20:19:00 GMT Pragma: - no-cache Strict-Transport-Security: @@ -156,7 +160,7 @@ interactions: X-Oauth-Scopes: - '*' X-Ratelimit-Limit: - - "1600" + - "1840" X-Xss-Protection: - 1; mode=block status: 200 OK @@ -172,7 +176,7 @@ interactions: - application/json User-Agent: - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/object-storage/keys/1654583 + url: https://api.linode.com/v4beta/object-storage/keys/3498033 method: DELETE response: body: '{}' @@ -200,7 +204,7 @@ interactions: Content-Type: - application/json Expires: - - Wed, 08 Jan 2025 06:03:53 GMT + - Thu, 30 Apr 2026 20:19:01 GMT Pragma: - no-cache Strict-Transport-Security: @@ -217,7 +221,7 @@ interactions: X-Oauth-Scopes: - '*' X-Ratelimit-Limit: - - "1600" + - "60" X-Xss-Protection: - 1; mode=block status: 200 OK diff --git a/test/integration/fixtures/TestObjectStorageKey_GetMissing.yaml b/test/integration/fixtures/TestObjectStorageKey_GetMissing.yaml index 3ed97bae6..65eabaefb 100644 --- a/test/integration/fixtures/TestObjectStorageKey_GetMissing.yaml +++ b/test/integration/fixtures/TestObjectStorageKey_GetMissing.yaml @@ -14,7 +14,7 @@ interactions: url: https://api.linode.com/v4beta/object-storage/keys/123 method: GET response: - body: '{"errors": [{"reason": "Not found"}]}' + body: '{"errors": [{"reason": "The specified access key was not found."}]}' headers: Access-Control-Allow-Headers: - Authorization, Origin, X-Requested-With, Content-Type, Accept, X-Filter @@ -29,13 +29,15 @@ interactions: Connection: - keep-alive Content-Length: - - "37" + - "67" Content-Type: - application/json Expires: - - Wed, 08 Jan 2025 06:03:49 GMT + - Thu, 30 Apr 2026 20:18:55 GMT Pragma: - no-cache + Strict-Transport-Security: + - max-age=31536000 Vary: - Authorization, X-Filter X-Accepted-Oauth-Scopes: @@ -45,7 +47,7 @@ interactions: X-Oauth-Scopes: - '*' X-Ratelimit-Limit: - - "1600" + - "1840" status: 404 Not Found code: 404 duration: "" diff --git a/test/integration/fixtures/TestObjectStorageKey_List.yaml b/test/integration/fixtures/TestObjectStorageKey_List.yaml index 8d76c9713..62a719490 100644 --- a/test/integration/fixtures/TestObjectStorageKey_List.yaml +++ b/test/integration/fixtures/TestObjectStorageKey_List.yaml @@ -14,7 +14,7 @@ interactions: url: https://api.linode.com/v4beta/object-storage/keys method: POST response: - body: '{"id": 1654585, "label": "go-test-def", "access_key": "[SANITIZED]", "secret_key": + body: '{"id": 3573414, "label": "go-test-def", "access_key": "[SANITIZED]", "secret_key": "[SANITIZED]", "limited": false, "bucket_access": null, "regions": [{"id": "ap-south", "s3_endpoint": "ap-south-1.linodeobjects.com", "endpoint_type": "E0"}, {"id": "br-gru", "s3_endpoint": "br-gru-1.linodeobjects.com", "endpoint_type": "E1"}, @@ -30,9 +30,11 @@ interactions: "endpoint_type": "E1"}, {"id": "us-east", "s3_endpoint": "us-east-1.linodeobjects.com", "endpoint_type": "E0"}, {"id": "us-iad", "s3_endpoint": "us-iad-1.linodeobjects.com", "endpoint_type": "E1"}, {"id": "us-lax", "s3_endpoint": "us-lax-1.linodeobjects.com", - "endpoint_type": "E1"}, {"id": "us-mia", "s3_endpoint": "us-mia-1.linodeobjects.com", + "endpoint_type": "E1"}, {"id": "us-lax", "s3_endpoint": "us-lax-4.linodeobjects.com", + "endpoint_type": "E3"}, {"id": "us-mia", "s3_endpoint": "us-mia-1.linodeobjects.com", "endpoint_type": "E1"}, {"id": "us-ord", "s3_endpoint": "us-ord-1.linodeobjects.com", - "endpoint_type": "E1"}, {"id": "us-sea", "s3_endpoint": "us-sea-1.linodeobjects.com", + "endpoint_type": "E1"}, {"id": "us-ord", "s3_endpoint": "us-ord-10.linodeobjects.com", + "endpoint_type": "E3"}, {"id": "us-sea", "s3_endpoint": "us-sea-1.linodeobjects.com", "endpoint_type": "E1"}, {"id": "us-southeast", "s3_endpoint": "us-southeast-1.linodeobjects.com", "endpoint_type": "E0"}]}' headers: @@ -57,7 +59,7 @@ interactions: Content-Type: - application/json Expires: - - Wed, 08 Jan 2025 06:03:59 GMT + - Wed, 06 May 2026 02:22:10 GMT Pragma: - no-cache Strict-Transport-Security: @@ -75,7 +77,7 @@ interactions: X-Oauth-Scopes: - '*' X-Ratelimit-Limit: - - "1600" + - "60" X-Xss-Protection: - 1; mode=block status: 200 OK @@ -94,8 +96,8 @@ interactions: url: https://api.linode.com/v4beta/object-storage/keys?page=1 method: GET response: - body: '{"pages": 1, "page": 1, "results": 1, "data": [{"id": 1654585, "label": - "go-test-def", "access_key": "[SANITIZED]", "secret_key": "[REDACTED]", "limited": + body: '{"pages": 1, "page": 1, "results": 2, "data": [{"id": 3513975, "label": + "go-test-def_r", "access_key": "[SANITIZED]", "secret_key": "[REDACTED]", "limited": false, "bucket_access": null, "regions": [{"id": "ap-south", "s3_endpoint": "ap-south-1.linodeobjects.com", "endpoint_type": "E0"}, {"id": "br-gru", "s3_endpoint": "br-gru-1.linodeobjects.com", "endpoint_type": "E1"}, {"id": "es-mad", "s3_endpoint": @@ -110,11 +112,36 @@ interactions: "se-sto-1.linodeobjects.com", "endpoint_type": "E1"}, {"id": "us-east", "s3_endpoint": "us-east-1.linodeobjects.com", "endpoint_type": "E0"}, {"id": "us-iad", "s3_endpoint": "us-iad-1.linodeobjects.com", "endpoint_type": "E1"}, {"id": "us-lax", "s3_endpoint": - "us-lax-1.linodeobjects.com", "endpoint_type": "E1"}, {"id": "us-mia", "s3_endpoint": + "us-lax-1.linodeobjects.com", "endpoint_type": "E1"}, {"id": "us-lax", "s3_endpoint": + "us-lax-4.linodeobjects.com", "endpoint_type": "E3"}, {"id": "us-mia", "s3_endpoint": "us-mia-1.linodeobjects.com", "endpoint_type": "E1"}, {"id": "us-ord", "s3_endpoint": - "us-ord-1.linodeobjects.com", "endpoint_type": "E1"}, {"id": "us-sea", "s3_endpoint": + "us-ord-1.linodeobjects.com", "endpoint_type": "E1"}, {"id": "us-ord", "s3_endpoint": + "us-ord-10.linodeobjects.com", "endpoint_type": "E3"}, {"id": "us-sea", "s3_endpoint": "us-sea-1.linodeobjects.com", "endpoint_type": "E1"}, {"id": "us-southeast", - "s3_endpoint": "us-southeast-1.linodeobjects.com", "endpoint_type": "E0"}]}]}' + "s3_endpoint": "us-southeast-1.linodeobjects.com", "endpoint_type": "E0"}]}, + {"id": 3573414, "label": "go-test-def", "access_key": "[SANITIZED]", "secret_key": + "[REDACTED]", "limited": false, "bucket_access": null, "regions": [{"id": "ap-south", + "s3_endpoint": "ap-south-1.linodeobjects.com", "endpoint_type": "E0"}, {"id": + "br-gru", "s3_endpoint": "br-gru-1.linodeobjects.com", "endpoint_type": "E1"}, + {"id": "es-mad", "s3_endpoint": "es-mad-1.linodeobjects.com", "endpoint_type": + "E1"}, {"id": "eu-central", "s3_endpoint": "eu-central-1.linodeobjects.com", + "endpoint_type": "E0"}, {"id": "fr-par", "s3_endpoint": "fr-par-1.linodeobjects.com", + "endpoint_type": "E1"}, {"id": "id-cgk", "s3_endpoint": "id-cgk-1.linodeobjects.com", + "endpoint_type": "E1"}, {"id": "in-maa", "s3_endpoint": "in-maa-1.linodeobjects.com", + "endpoint_type": "E1"}, {"id": "it-mil", "s3_endpoint": "it-mil-1.linodeobjects.com", + "endpoint_type": "E1"}, {"id": "jp-osa", "s3_endpoint": "jp-osa-1.linodeobjects.com", + "endpoint_type": "E1"}, {"id": "nl-ams", "s3_endpoint": "nl-ams-1.linodeobjects.com", + "endpoint_type": "E1"}, {"id": "se-sto", "s3_endpoint": "se-sto-1.linodeobjects.com", + "endpoint_type": "E1"}, {"id": "us-east", "s3_endpoint": "us-east-1.linodeobjects.com", + "endpoint_type": "E0"}, {"id": "us-iad", "s3_endpoint": "us-iad-1.linodeobjects.com", + "endpoint_type": "E1"}, {"id": "us-lax", "s3_endpoint": "us-lax-1.linodeobjects.com", + "endpoint_type": "E1"}, {"id": "us-lax", "s3_endpoint": "us-lax-4.linodeobjects.com", + "endpoint_type": "E3"}, {"id": "us-mia", "s3_endpoint": "us-mia-1.linodeobjects.com", + "endpoint_type": "E1"}, {"id": "us-ord", "s3_endpoint": "us-ord-1.linodeobjects.com", + "endpoint_type": "E1"}, {"id": "us-ord", "s3_endpoint": "us-ord-10.linodeobjects.com", + "endpoint_type": "E3"}, {"id": "us-sea", "s3_endpoint": "us-sea-1.linodeobjects.com", + "endpoint_type": "E1"}, {"id": "us-southeast", "s3_endpoint": "us-southeast-1.linodeobjects.com", + "endpoint_type": "E0"}]}]}' headers: Access-Control-Allow-Credentials: - "true" @@ -137,7 +164,7 @@ interactions: Content-Type: - application/json Expires: - - Wed, 08 Jan 2025 06:04:00 GMT + - Wed, 06 May 2026 02:22:10 GMT Pragma: - no-cache Strict-Transport-Security: @@ -156,7 +183,7 @@ interactions: X-Oauth-Scopes: - '*' X-Ratelimit-Limit: - - "1600" + - "1840" X-Xss-Protection: - 1; mode=block status: 200 OK @@ -172,7 +199,7 @@ interactions: - application/json User-Agent: - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/object-storage/keys/1654585 + url: https://api.linode.com/v4beta/object-storage/keys/3573414 method: DELETE response: body: '{}' @@ -200,7 +227,7 @@ interactions: Content-Type: - application/json Expires: - - Wed, 08 Jan 2025 06:04:01 GMT + - Wed, 06 May 2026 02:22:11 GMT Pragma: - no-cache Strict-Transport-Security: @@ -217,7 +244,7 @@ interactions: X-Oauth-Scopes: - '*' X-Ratelimit-Limit: - - "1600" + - "60" X-Xss-Protection: - 1; mode=block status: 200 OK diff --git a/test/integration/fixtures/TestObjectStorageKey_Update.yaml b/test/integration/fixtures/TestObjectStorageKey_Update.yaml index f9804cc6b..738b51c19 100644 --- a/test/integration/fixtures/TestObjectStorageKey_Update.yaml +++ b/test/integration/fixtures/TestObjectStorageKey_Update.yaml @@ -14,7 +14,7 @@ interactions: url: https://api.linode.com/v4beta/object-storage/keys method: POST response: - body: '{"id": 1654584, "label": "go-test-def", "access_key": "[SANITIZED]", "secret_key": + body: '{"id": 3498035, "label": "go-test-def", "access_key": "[SANITIZED]", "secret_key": "[SANITIZED]", "limited": false, "bucket_access": null, "regions": [{"id": "ap-south", "s3_endpoint": "ap-south-1.linodeobjects.com", "endpoint_type": "E0"}, {"id": "br-gru", "s3_endpoint": "br-gru-1.linodeobjects.com", "endpoint_type": "E1"}, @@ -30,9 +30,11 @@ interactions: "endpoint_type": "E1"}, {"id": "us-east", "s3_endpoint": "us-east-1.linodeobjects.com", "endpoint_type": "E0"}, {"id": "us-iad", "s3_endpoint": "us-iad-1.linodeobjects.com", "endpoint_type": "E1"}, {"id": "us-lax", "s3_endpoint": "us-lax-1.linodeobjects.com", - "endpoint_type": "E1"}, {"id": "us-mia", "s3_endpoint": "us-mia-1.linodeobjects.com", + "endpoint_type": "E1"}, {"id": "us-lax", "s3_endpoint": "us-lax-4.linodeobjects.com", + "endpoint_type": "E3"}, {"id": "us-mia", "s3_endpoint": "us-mia-1.linodeobjects.com", "endpoint_type": "E1"}, {"id": "us-ord", "s3_endpoint": "us-ord-1.linodeobjects.com", - "endpoint_type": "E1"}, {"id": "us-sea", "s3_endpoint": "us-sea-1.linodeobjects.com", + "endpoint_type": "E1"}, {"id": "us-ord", "s3_endpoint": "us-ord-10.linodeobjects.com", + "endpoint_type": "E3"}, {"id": "us-sea", "s3_endpoint": "us-sea-1.linodeobjects.com", "endpoint_type": "E1"}, {"id": "us-southeast", "s3_endpoint": "us-southeast-1.linodeobjects.com", "endpoint_type": "E0"}]}' headers: @@ -57,7 +59,7 @@ interactions: Content-Type: - application/json Expires: - - Wed, 08 Jan 2025 06:03:55 GMT + - Thu, 30 Apr 2026 20:19:06 GMT Pragma: - no-cache Strict-Transport-Security: @@ -75,7 +77,7 @@ interactions: X-Oauth-Scopes: - '*' X-Ratelimit-Limit: - - "1600" + - "60" X-Xss-Protection: - 1; mode=block status: 200 OK @@ -91,10 +93,10 @@ interactions: - application/json User-Agent: - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/object-storage/keys/1654584 + url: https://api.linode.com/v4beta/object-storage/keys/3498035 method: PUT response: - body: '{"id": 1654584, "label": "go-test-def_r", "access_key": "[SANITIZED]", + body: '{"id": 3498035, "label": "go-test-def_r", "access_key": "[SANITIZED]", "secret_key": "[REDACTED]", "limited": false, "bucket_access": null, "regions": [{"id": "ap-south", "s3_endpoint": "ap-south-1.linodeobjects.com", "endpoint_type": "E0"}, {"id": "br-gru", "s3_endpoint": "br-gru-1.linodeobjects.com", "endpoint_type": @@ -110,9 +112,11 @@ interactions: "endpoint_type": "E1"}, {"id": "us-east", "s3_endpoint": "us-east-1.linodeobjects.com", "endpoint_type": "E0"}, {"id": "us-iad", "s3_endpoint": "us-iad-1.linodeobjects.com", "endpoint_type": "E1"}, {"id": "us-lax", "s3_endpoint": "us-lax-1.linodeobjects.com", - "endpoint_type": "E1"}, {"id": "us-mia", "s3_endpoint": "us-mia-1.linodeobjects.com", + "endpoint_type": "E1"}, {"id": "us-lax", "s3_endpoint": "us-lax-4.linodeobjects.com", + "endpoint_type": "E3"}, {"id": "us-mia", "s3_endpoint": "us-mia-1.linodeobjects.com", "endpoint_type": "E1"}, {"id": "us-ord", "s3_endpoint": "us-ord-1.linodeobjects.com", - "endpoint_type": "E1"}, {"id": "us-sea", "s3_endpoint": "us-sea-1.linodeobjects.com", + "endpoint_type": "E1"}, {"id": "us-ord", "s3_endpoint": "us-ord-10.linodeobjects.com", + "endpoint_type": "E3"}, {"id": "us-sea", "s3_endpoint": "us-sea-1.linodeobjects.com", "endpoint_type": "E1"}, {"id": "us-southeast", "s3_endpoint": "us-southeast-1.linodeobjects.com", "endpoint_type": "E0"}]}' headers: @@ -137,7 +141,7 @@ interactions: Content-Type: - application/json Expires: - - Wed, 08 Jan 2025 06:03:56 GMT + - Thu, 30 Apr 2026 20:19:07 GMT Pragma: - no-cache Strict-Transport-Security: @@ -155,7 +159,7 @@ interactions: X-Oauth-Scopes: - '*' X-Ratelimit-Limit: - - "1600" + - "60" X-Xss-Protection: - 1; mode=block status: 200 OK @@ -171,7 +175,7 @@ interactions: - application/json User-Agent: - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/object-storage/keys/1654584 + url: https://api.linode.com/v4beta/object-storage/keys/3498035 method: DELETE response: body: '{}' @@ -199,7 +203,7 @@ interactions: Content-Type: - application/json Expires: - - Wed, 08 Jan 2025 06:03:57 GMT + - Thu, 30 Apr 2026 20:19:08 GMT Pragma: - no-cache Strict-Transport-Security: @@ -216,7 +220,7 @@ interactions: X-Oauth-Scopes: - '*' X-Ratelimit-Limit: - - "1600" + - "60" X-Xss-Protection: - 1; mode=block status: 200 OK diff --git a/test/integration/fixtures/TestObjectStorageKeys_Limited.yaml b/test/integration/fixtures/TestObjectStorageKeys_Limited.yaml index 1b0984136..ff1b13a76 100644 --- a/test/integration/fixtures/TestObjectStorageKeys_Limited.yaml +++ b/test/integration/fixtures/TestObjectStorageKeys_Limited.yaml @@ -2,7 +2,7 @@ version: 1 interactions: - request: - body: '{"label":"go-test-def","bucket_access":[{"cluster":"us-east-1","region":"us-east","bucket_name":"go-bucket-test-def","permissions":"read_only"},{"cluster":"us-east-1","region":"us-east","bucket_name":"go-bucket-test-def","permissions":"read_write"}]}' + body: '{"label":"go-test-def","bucket_access":[{"region":"us-east","bucket_name":"go-bucket-test-def","permissions":"read_only"},{"region":"us-east","bucket_name":"go-bucket-test-def","permissions":"read_write"}]}' form: {} headers: Accept: @@ -14,7 +14,7 @@ interactions: url: https://api.linode.com/v4beta/object-storage/keys method: POST response: - body: '{"id": 1654586, "label": "go-test-def", "access_key": "[SANITIZED]", "secret_key": + body: '{"id": 3573416, "label": "go-test-def", "access_key": "[SANITIZED]", "secret_key": "[SANITIZED]", "limited": true, "bucket_access": [{"cluster": "us-east-1", "bucket_name": "go-bucket-test-def", "permissions": "read_only", "region": "us-east"}, {"cluster": "us-east-1", "bucket_name": "go-bucket-test-def", "permissions": "read_write", @@ -44,7 +44,7 @@ interactions: Content-Type: - application/json Expires: - - Wed, 08 Jan 2025 06:04:05 GMT + - Wed, 06 May 2026 02:22:18 GMT Pragma: - no-cache Strict-Transport-Security: @@ -61,7 +61,7 @@ interactions: X-Oauth-Scopes: - '*' X-Ratelimit-Limit: - - "1600" + - "60" X-Xss-Protection: - 1; mode=block status: 200 OK @@ -77,7 +77,7 @@ interactions: - application/json User-Agent: - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/object-storage/keys/1654586 + url: https://api.linode.com/v4beta/object-storage/keys/3573416 method: DELETE response: body: '{}' @@ -105,7 +105,7 @@ interactions: Content-Type: - application/json Expires: - - Wed, 08 Jan 2025 06:04:07 GMT + - Wed, 06 May 2026 02:22:19 GMT Pragma: - no-cache Strict-Transport-Security: @@ -122,7 +122,7 @@ interactions: X-Oauth-Scopes: - '*' X-Ratelimit-Limit: - - "1600" + - "60" X-Xss-Protection: - 1; mode=block status: 200 OK diff --git a/test/integration/fixtures/TestObjectStorageKeys_Limited_Bucket.yaml b/test/integration/fixtures/TestObjectStorageKeys_Limited_Bucket.yaml index 1c01b5723..383843d17 100644 --- a/test/integration/fixtures/TestObjectStorageKeys_Limited_Bucket.yaml +++ b/test/integration/fixtures/TestObjectStorageKeys_Limited_Bucket.yaml @@ -42,7 +42,7 @@ interactions: Content-Type: - application/json Expires: - - Wed, 08 Jan 2025 06:04:03 GMT + - Wed, 06 May 2026 02:22:14 GMT Pragma: - no-cache Strict-Transport-Security: @@ -59,7 +59,7 @@ interactions: X-Oauth-Scopes: - '*' X-Ratelimit-Limit: - - "1600" + - "60" X-Xss-Protection: - 1; mode=block status: 200 OK @@ -75,7 +75,7 @@ interactions: - application/json User-Agent: - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/object-storage/buckets/us-east-1/go-bucket-test-def + url: https://api.linode.com/v4beta/object-storage/buckets/us-east/go-bucket-test-def method: DELETE response: body: '{}' @@ -103,7 +103,7 @@ interactions: Content-Type: - application/json Expires: - - Wed, 08 Jan 2025 06:04:10 GMT + - Wed, 06 May 2026 02:22:23 GMT Pragma: - no-cache Strict-Transport-Security: @@ -120,7 +120,7 @@ interactions: X-Oauth-Scopes: - '*' X-Ratelimit-Limit: - - "1600" + - "1840" X-Xss-Protection: - 1; mode=block status: 200 OK diff --git a/test/integration/fixtures/TestObjectStorageKeys_Regional_Limited.yaml b/test/integration/fixtures/TestObjectStorageKeys_Regional_Limited.yaml index b43393d9d..d067a2ff3 100644 --- a/test/integration/fixtures/TestObjectStorageKeys_Regional_Limited.yaml +++ b/test/integration/fixtures/TestObjectStorageKeys_Regional_Limited.yaml @@ -14,292 +14,449 @@ interactions: url: https://api.linode.com/v4beta/regions?page=1 method: GET response: - body: '{"data": [{"id": "ap-west", "label": "Mumbai, IN", "country": "in", "capabilities": - ["Linodes", "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", - "GPU Linodes", "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", - "Managed Databases", "Metadata", "Placement Group", "StackScripts"], "status": - "ok", "resolvers": {"ipv4": "172.105.34.5,172.105.35.5,172.105.36.5,172.105.37.5,172.105.38.5,172.105.39.5,172.105.40.5,172.105.41.5,172.105.42.5,172.105.43.5", + body: '{"data": [{"id": "au-mel", "label": "Melbourne, AU", "country": "au", "capabilities": + ["Linodes", "Block Storage Encryption", "LA Disk Encryption", "Disk Encryption", + "Backups", "NodeBalancers", "Block Storage", "Object Storage", "Kubernetes", + "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", + "Premium Plans", "Placement Group", "StackScripts", "Maintenance Policy", "Linode + Interfaces"], "monitors": {"alerts": ["Managed Databases", "NodeBalancers"], + "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": + {"ipv4": "172.236.32.23,172.236.32.35,172.236.32.30,172.236.32.28,172.236.32.32,172.236.32.33,172.236.32.27,172.236.32.37,172.236.32.29,172.236.32.34", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "ca-central", "label": "Toronto, CA", "country": - "ca", "capabilities": ["Linodes", "Disk Encryption", "Backups", "NodeBalancers", - "Block Storage", "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", - "Managed Databases", "Metadata", "Placement Group", "StackScripts"], "status": - "ok", "resolvers": {"ipv4": "172.105.0.5,172.105.3.5,172.105.4.5,172.105.5.5,172.105.6.5,172.105.7.5,172.105.8.5,172.105.9.5,172.105.10.5,172.105.11.5", + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "us-lax", + "label": "Los Angeles, CA", "country": "us", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes + Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", + "Metadata", "Premium Plans", "Placement Group", "StackScripts", "NETINT Quadra + T1U", "Maintenance Policy", "Linode Interfaces", "ACLP Logs Datacenter LKE-E"], + "monitors": {"alerts": ["Managed Databases", "NodeBalancers"], "metrics": ["Managed + Databases", "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "172.233.128.45,172.233.128.38,172.233.128.53,172.233.128.37,172.233.128.34,172.233.128.36,172.233.128.33,172.233.128.39,172.233.128.43,172.233.128.44", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "ap-southeast", "label": "Sydney, AU", "country": - "au", "capabilities": ["Linodes", "Disk Encryption", "Backups", "NodeBalancers", - "Block Storage", "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", - "Managed Databases", "Metadata", "Placement Group", "StackScripts"], "status": - "ok", "resolvers": {"ipv4": "172.105.166.5,172.105.169.5,172.105.168.5,172.105.172.5,172.105.162.5,172.105.170.5,172.105.167.5,172.105.171.5,172.105.181.5,172.105.161.5", + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "nz-akl-1", + "label": "Auckland, NZ", "country": "nz", "capabilities": ["Linodes", "Disk + Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", "Maintenance + Policy"], "monitors": {"alerts": [], "metrics": []}, "status": "ok", "resolvers": + {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": + 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": + "us-den-1", "label": "Denver, CO", "country": "us", "capabilities": ["Linodes", + "Disk Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", + "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": + "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": + 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": + "de-ham-1", "label": "Hamburg, DE", "country": "de", "capabilities": ["Linodes", + "Disk Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", + "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": + "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": + 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": + "za-jnb-1", "label": "Johannesburg, ZA", "country": "za", "capabilities": ["Linodes", + "Disk Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", + "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": + "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": + 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": + "my-kul-1", "label": "Kuala Lumpur, MY", "country": "my", "capabilities": ["Linodes", + "Disk Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", + "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": + "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": + 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": + "co-bog-1", "label": "Bogot\u00e1, CO", "country": "co", "capabilities": ["Linodes", + "Disk Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", + "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": + "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": + 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": + "mx-qro-1", "label": "Quer\u00e9taro, MX", "country": "mx", "capabilities": + ["Linodes", "Disk Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed + Plans", "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": + "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": + 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": + "us-hou-1", "label": "Houston, TX", "country": "us", "capabilities": ["Linodes", + "Disk Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", + "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": + "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": + 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": + "cl-scl-1", "label": "Santiago, CL", "country": "cl", "capabilities": ["Linodes", + "Disk Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", + "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": + "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": + 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": + "gb-lon", "label": "London 2, UK", "country": "gb", "capabilities": ["Linodes", + "Block Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", + "NodeBalancers", "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", + "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", + "Managed Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", + "NETINT Quadra T1U", "Maintenance Policy", "Linode Interfaces", "ACLP Logs Datacenter + LKE-E"], "monitors": {"alerts": ["Managed Databases", "NodeBalancers"], "metrics": + ["Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": + "172.236.0.46,172.236.0.50,172.236.0.47,172.236.0.53,172.236.0.52,172.236.0.45,172.236.0.49,172.236.0.51,172.236.0.54,172.236.0.48", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "us-iad", "label": "Washington, DC", "country": - "us", "capabilities": ["Linodes", "Block Storage Encryption", "Disk Encryption", - "Backups", "NodeBalancers", "Block Storage", "Object Storage", "Kubernetes", - "Cloud Firewall", "Vlans", "VPCs", "Managed Databases", "Metadata", "Premium - Plans", "Placement Group", "StackScripts"], "status": "ok", "resolvers": {"ipv4": - "139.144.192.62,139.144.192.60,139.144.192.61,139.144.192.53,139.144.192.54,139.144.192.67,139.144.192.69,139.144.192.66,139.144.192.52,139.144.192.68", + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "id-cgk", + "label": "Jakarta, ID", "country": "id", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes + Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", + "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "172.232.224.23,172.232.224.32,172.232.224.26,172.232.224.27,172.232.224.21,172.232.224.24,172.232.224.22,172.232.224.20,172.232.224.31,172.232.224.28", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "us-ord", "label": "Chicago, IL", "country": - "us", "capabilities": ["Linodes", "Block Storage Encryption", "Disk Encryption", - "Backups", "NodeBalancers", "Block Storage", "Object Storage", "GPU Linodes", - "Kubernetes", "Cloud Firewall", "Vlans", "VPCs", "Managed Databases", "Metadata", - "Premium Plans", "Placement Group", "StackScripts"], "status": "ok", "resolvers": - {"ipv4": "172.232.0.17,172.232.0.16,172.232.0.21,172.232.0.13,172.232.0.22,172.232.0.9,172.232.0.19,172.232.0.20,172.232.0.15,172.232.0.18", + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "in-bom-2", + "label": "Mumbai 2, IN", "country": "in", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "GPU Linodes", "Kubernetes", "Kubernetes Enterprise", "Cloud + Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", + "Premium Plans", "Placement Group", "StackScripts", "Maintenance Policy", "Linode + Interfaces", "ACLP Logs Datacenter LKE-E"], "monitors": {"alerts": ["Managed + Databases", "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "172.236.171.41,172.236.171.42,172.236.171.25,172.236.171.44,172.236.171.26,172.236.171.45,172.236.171.24,172.236.171.43,172.236.171.27,172.236.171.28", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "fr-par", "label": "Paris, FR", "country": - "fr", "capabilities": ["Linodes", "Block Storage Encryption", "Disk Encryption", - "Backups", "NodeBalancers", "Block Storage", "Object Storage", "GPU Linodes", - "Kubernetes", "Cloud Firewall", "Vlans", "VPCs", "Managed Databases", "Metadata", - "Premium Plans", "Placement Group", "StackScripts"], "status": "ok", "resolvers": - {"ipv4": "172.232.32.21,172.232.32.23,172.232.32.17,172.232.32.18,172.232.32.16,172.232.32.22,172.232.32.20,172.232.32.14,172.232.32.11,172.232.32.12", + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "de-fra-2", + "label": "Frankfurt 2, DE", "country": "de", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes + Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", + "Metadata", "Premium Plans", "Placement Group", "StackScripts", "NETINT Quadra + T1U", "Maintenance Policy", "Linode Interfaces", "ACLP Logs Datacenter LKE-E"], + "monitors": {"alerts": ["Managed Databases", "NodeBalancers"], "metrics": ["Managed + Databases", "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "172.236.203.9,172.236.203.16,172.236.203.19,172.236.203.15,172.236.203.17,172.236.203.11,172.236.203.18,172.236.203.14,172.236.203.13,172.236.203.12", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "us-sea", "label": "Seattle, WA", "country": - "us", "capabilities": ["Linodes", "Block Storage Encryption", "Disk Encryption", - "Backups", "NodeBalancers", "Block Storage", "Object Storage", "GPU Linodes", - "Kubernetes", "Cloud Firewall", "Vlans", "VPCs", "Managed Databases", "Metadata", - "Premium Plans", "Placement Group", "StackScripts"], "status": "ok", "resolvers": - {"ipv4": "172.232.160.19,172.232.160.21,172.232.160.17,172.232.160.15,172.232.160.18,172.232.160.8,172.232.160.12,172.232.160.11,172.232.160.14,172.232.160.16", + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "sg-sin-2", + "label": "Singapore 2, SG", "country": "sg", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes + Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", + "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance + Policy", "Linode Interfaces", "ACLP Logs Datacenter LKE-E"], "monitors": {"alerts": + ["Managed Databases", "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "172.236.129.8,172.236.129.42,172.236.129.41,172.236.129.19,172.236.129.46,172.236.129.23,172.236.129.48,172.236.129.20,172.236.129.21,172.236.129.47", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "br-gru", "label": "Sao Paulo, BR", "country": - "br", "capabilities": ["Linodes", "Block Storage Encryption", "Disk Encryption", - "Backups", "NodeBalancers", "Block Storage", "Object Storage", "Kubernetes", - "Cloud Firewall", "Vlans", "VPCs", "Managed Databases", "Metadata", "Premium - Plans", "Placement Group", "StackScripts"], "status": "ok", "resolvers": {"ipv4": - "172.233.0.4,172.233.0.9,172.233.0.7,172.233.0.12,172.233.0.5,172.233.0.13,172.233.0.10,172.233.0.6,172.233.0.8,172.233.0.11", + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "jp-tyo-3", + "label": "Tokyo 3, JP", "country": "jp", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes + Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", + "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance + Policy", "Linode Interfaces", "ACLP Logs Datacenter LKE-E"], "monitors": {"alerts": + ["Managed Databases", "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "172.237.4.15,172.237.4.19,172.237.4.17,172.237.4.21,172.237.4.16,172.237.4.18,172.237.4.23,172.237.4.24,172.237.4.20,172.237.4.14", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "nl-ams", "label": "Amsterdam, NL", "country": - "nl", "capabilities": ["Linodes", "Block Storage Encryption", "Disk Encryption", - "Backups", "NodeBalancers", "Block Storage", "Object Storage", "Kubernetes", - "Cloud Firewall", "Vlans", "VPCs", "Managed Databases", "Metadata", "Premium - Plans", "Placement Group", "StackScripts"], "status": "ok", "resolvers": {"ipv4": - "172.233.33.36,172.233.33.38,172.233.33.35,172.233.33.39,172.233.33.34,172.233.33.33,172.233.33.31,172.233.33.30,172.233.33.37,172.233.33.32", + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "de-ber-1", + "label": "Berlin, DE", "country": "de", "capabilities": ["Linodes", "Disk Encryption", + "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", "Maintenance Policy"], + "monitors": {"alerts": [], "metrics": []}, "status": "ok", "resolvers": {"ipv4": + "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": + 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": + "no-osl-1", "label": "Oslo, NO", "country": "no", "capabilities": ["Linodes", + "Block Storage Encryption", "Disk Encryption", "Backups", "NodeBalancers", "Block + Storage", "Object Storage", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", + "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", "Premium + Plans", "Placement Group", "StackScripts", "Maintenance Policy", "Linode Interfaces", + "ACLP Logs Datacenter LKE-E"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "172.238.140.33,172.238.140.25,172.238.140.30,172.238.140.31,172.238.140.26,172.238.140.28,172.238.140.34,172.238.140.32,172.238.140.27,172.238.140.29", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "se-sto", "label": "Stockholm, SE", "country": - "se", "capabilities": ["Linodes", "Block Storage Encryption", "Disk Encryption", - "Backups", "NodeBalancers", "Block Storage", "Object Storage", "Kubernetes", - "Cloud Firewall", "Vlans", "VPCs", "Managed Databases", "Metadata", "Premium - Plans", "Placement Group", "StackScripts"], "status": "ok", "resolvers": {"ipv4": - "172.232.128.24,172.232.128.26,172.232.128.20,172.232.128.22,172.232.128.25,172.232.128.19,172.232.128.23,172.232.128.18,172.232.128.21,172.232.128.27", + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "us-iad-2", + "label": "Washington 2, DC", "country": "us", "capabilities": ["Linodes", "Block + Storage Encryption", "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", + "Object Storage", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", + "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", "Premium Plans", + "Placement Group", "StackScripts", "Maintenance Policy", "Linode Interfaces"], + "monitors": {"alerts": ["Managed Databases", "NodeBalancers"], "metrics": ["Managed + Databases", "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "172.239.142.102,172.239.142.89,172.239.142.92,172.239.142.87,172.239.142.88,172.239.142.103,172.239.142.91,172.239.142.90,172.239.142.86,172.239.142.100", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "es-mad", "label": "Madrid, ES", "country": - "es", "capabilities": ["Linodes", "Block Storage Encryption", "Disk Encryption", - "Backups", "NodeBalancers", "Block Storage", "Object Storage", "Kubernetes", - "Cloud Firewall", "Vlans", "VPCs", "Managed Databases", "Metadata", "Premium - Plans", "Placement Group", "StackScripts"], "status": "ok", "resolvers": {"ipv4": - "172.233.111.6,172.233.111.17,172.233.111.21,172.233.111.25,172.233.111.19,172.233.111.12,172.233.111.26,172.233.111.16,172.233.111.18,172.233.111.9", + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "fr-par-2", + "label": "Paris 2, FR", "country": "fr", "capabilities": ["Linodes", "Block + Storage Encryption", "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", + "GPU Linodes", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", + "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", "Premium Plans", + "Placement Group", "StackScripts", "Maintenance Policy", "Linode Interfaces", + "ACLP Logs Datacenter LKE-E"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "172.239.11.24,172.239.11.22,172.239.11.17,172.239.11.20,172.239.11.23,172.239.11.19,172.239.11.21,172.239.11.15,172.239.11.16,172.239.11.18", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "in-maa", "label": "Chennai, IN", "country": - "in", "capabilities": ["Linodes", "Block Storage Encryption", "Disk Encryption", - "Backups", "NodeBalancers", "Block Storage", "Object Storage", "Kubernetes", - "Cloud Firewall", "Vlans", "VPCs", "Managed Databases", "Metadata", "Premium - Plans", "Placement Group", "StackScripts", "NETINT Quadra T1U"], "status": "ok", - "resolvers": {"ipv4": "172.232.96.17,172.232.96.26,172.232.96.19,172.232.96.20,172.232.96.25,172.232.96.21,172.232.96.18,172.232.96.22,172.232.96.23,172.232.96.24", + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "us-rno-1", + "label": "Reno, NV", "country": "us", "capabilities": ["Linodes", "Disk Encryption", + "Backups", "NodeBalancers", "GPU Linodes", "Metadata", "Premium Plans", "Placement + Group", "StackScripts", "Maintenance Policy"], "monitors": {"alerts": ["NodeBalancers"], + "metrics": ["NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "", "ipv6": + ""}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "co-bog-2", + "label": "Bogot\u00e1 2, CO", "country": "co", "capabilities": ["Linodes", "Disk + Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", "Maintenance + Policy"], "monitors": {"alerts": [], "metrics": []}, "status": "ok", "resolvers": + {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": + 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": + "fr-mrs-2", "label": "Marseille 2, FR", "country": "fr", "capabilities": ["Linodes", + "Disk Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", + "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": + "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": + 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": + "us-mia", "label": "Miami, FL", "country": "us", "capabilities": ["Linodes", + "Block Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", + "NodeBalancers", "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", + "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", + "Managed Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", + "NETINT Quadra T1U", "Maintenance Policy", "Linode Interfaces"], "monitors": + {"alerts": ["Managed Databases", "NodeBalancers"], "metrics": ["Managed Databases", + "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "172.233.160.34,172.233.160.27,172.233.160.30,172.233.160.29,172.233.160.32,172.233.160.28,172.233.160.33,172.233.160.26,172.233.160.25,172.233.160.31", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "jp-osa", "label": "Osaka, JP", "country": - "jp", "capabilities": ["Linodes", "Block Storage Encryption", "Disk Encryption", - "Backups", "NodeBalancers", "Block Storage", "Object Storage", "GPU Linodes", - "Kubernetes", "Cloud Firewall", "Vlans", "VPCs", "Managed Databases", "Metadata", - "Premium Plans", "Placement Group", "StackScripts"], "status": "ok", "resolvers": - {"ipv4": "172.233.64.44,172.233.64.43,172.233.64.37,172.233.64.40,172.233.64.46,172.233.64.41,172.233.64.39,172.233.64.42,172.233.64.45,172.233.64.38", + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "ap-west", + "label": "Mumbai, IN", "country": "in", "capabilities": ["Linodes", "Block Storage + Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "GPU Linodes", "Kubernetes", "Cloud Firewall", "Vlans", "Block + Storage Migrations", "Managed Databases", "Metadata", "Placement Group", "StackScripts", + "Maintenance Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed + Databases", "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "172.105.34.5,172.105.35.5,172.105.36.5,172.105.37.5,172.105.38.5,172.105.39.5,172.105.40.5,172.105.41.5,172.105.42.5,172.105.43.5", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "it-mil", "label": "Milan, IT", "country": - "it", "capabilities": ["Linodes", "Block Storage Encryption", "Disk Encryption", - "Backups", "NodeBalancers", "Block Storage", "Object Storage", "Kubernetes", - "Cloud Firewall", "Vlans", "VPCs", "Managed Databases", "Metadata", "Premium - Plans", "Placement Group", "StackScripts"], "status": "ok", "resolvers": {"ipv4": - "172.232.192.19,172.232.192.18,172.232.192.16,172.232.192.20,172.232.192.24,172.232.192.21,172.232.192.22,172.232.192.17,172.232.192.15,172.232.192.23", + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "ca-central", + "label": "Toronto, CA", "country": "ca", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "GPU Linodes", "Kubernetes", "Cloud Firewall", "Vlans", "Block + Storage Migrations", "Managed Databases", "Metadata", "Placement Group", "StackScripts", + "Maintenance Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed + Databases", "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "172.105.0.5,172.105.3.5,172.105.4.5,172.105.5.5,172.105.6.5,172.105.7.5,172.105.8.5,172.105.9.5,172.105.10.5,172.105.11.5", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "us-mia", "label": "Miami, FL", "country": - "us", "capabilities": ["Linodes", "Block Storage Encryption", "Disk Encryption", - "Backups", "NodeBalancers", "Block Storage", "Object Storage", "Kubernetes", - "Cloud Firewall", "Vlans", "VPCs", "Managed Databases", "Metadata", "Premium - Plans", "Placement Group", "StackScripts", "NETINT Quadra T1U"], "status": "ok", - "resolvers": {"ipv4": "172.233.160.34,172.233.160.27,172.233.160.30,172.233.160.29,172.233.160.32,172.233.160.28,172.233.160.33,172.233.160.26,172.233.160.25,172.233.160.31", + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "ap-southeast", + "label": "Sydney, AU", "country": "au", "capabilities": ["Linodes", "Block Storage + Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", + "Managed Databases", "Metadata", "Placement Group", "StackScripts", "Maintenance + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "172.105.166.5,172.105.169.5,172.105.168.5,172.105.172.5,172.105.162.5,172.105.170.5,172.105.167.5,172.105.171.5,172.105.181.5,172.105.161.5", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "id-cgk", "label": "Jakarta, ID", "country": - "id", "capabilities": ["Linodes", "Block Storage Encryption", "Disk Encryption", - "Backups", "NodeBalancers", "Block Storage", "Object Storage", "Kubernetes", - "Cloud Firewall", "Vlans", "VPCs", "Managed Databases", "Metadata", "Premium - Plans", "Placement Group", "StackScripts"], "status": "ok", "resolvers": {"ipv4": - "172.232.224.23,172.232.224.32,172.232.224.26,172.232.224.27,172.232.224.21,172.232.224.24,172.232.224.22,172.232.224.20,172.232.224.31,172.232.224.28", + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "us-iad", + "label": "Washington, DC", "country": "us", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "Kubernetes", "Kubernetes Enterprise", "Cloud + Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", + "Premium Plans", "Placement Group", "StackScripts", "Maintenance Policy", "Linode + Interfaces", "ACLP Logs Datacenter LKE-E"], "monitors": {"alerts": ["Managed + Databases", "NodeBalancers"], "metrics": ["Linodes", "Managed Databases", "NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "139.144.192.62,139.144.192.60,139.144.192.61,139.144.192.53,139.144.192.54,139.144.192.67,139.144.192.69,139.144.192.66,139.144.192.52,139.144.192.68", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "us-lax", "label": "Los Angeles, CA", "country": - "us", "capabilities": ["Linodes", "Block Storage Encryption", "Disk Encryption", - "Backups", "NodeBalancers", "Block Storage", "Object Storage", "Kubernetes", - "Cloud Firewall", "Vlans", "VPCs", "Managed Databases", "Metadata", "Premium - Plans", "Placement Group", "StackScripts", "NETINT Quadra T1U"], "status": "ok", - "resolvers": {"ipv4": "172.233.128.45,172.233.128.38,172.233.128.53,172.233.128.37,172.233.128.34,172.233.128.36,172.233.128.33,172.233.128.39,172.233.128.43,172.233.128.44", - "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "nz-akl-1", "label": "Auckland, NZ", "country": - "nz", "capabilities": ["Linodes", "Cloud Firewall", "Vlans", "Metadata", "Distributed - Plans"], "status": "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", - "ipv6": "1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": - 0, "maximum_linodes_per_pg": 0}, "site_type": "distributed"}, {"id": "us-den-1", - "label": "Denver, CO", "country": "us", "capabilities": ["Linodes", "Cloud Firewall", - "Vlans", "Metadata", "Distributed Plans"], "status": "ok", "resolvers": {"ipv4": - "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": - 0}, "site_type": "distributed"}, {"id": "de-ham-1", "label": "Hamburg, DE", - "country": "de", "capabilities": ["Linodes", "Cloud Firewall", "Vlans", "Metadata", - "Distributed Plans"], "status": "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", - "ipv6": "1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": - 0, "maximum_linodes_per_pg": 0}, "site_type": "distributed"}, {"id": "fr-mrs-1", - "label": "Marseille, FR", "country": "fr", "capabilities": ["Linodes", "Cloud - Firewall", "Vlans", "Metadata", "Distributed Plans"], "status": "ok", "resolvers": - {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": - 0}, "site_type": "distributed"}, {"id": "za-jnb-1", "label": "Johannesburg, - ZA", "country": "za", "capabilities": ["Linodes", "Cloud Firewall", "Vlans", - "Metadata", "Distributed Plans"], "status": "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", - "ipv6": "1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": - 0, "maximum_linodes_per_pg": 0}, "site_type": "distributed"}, {"id": "my-kul-1", - "label": "Kuala Lumpur, MY", "country": "my", "capabilities": ["Linodes", "Cloud - Firewall", "Vlans", "Metadata", "Distributed Plans"], "status": "ok", "resolvers": - {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": - 0}, "site_type": "distributed"}, {"id": "co-bog-1", "label": "Bogot\u00e1, CO", - "country": "co", "capabilities": ["Linodes", "Cloud Firewall", "Vlans", "Metadata", - "Distributed Plans"], "status": "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", - "ipv6": "1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": - 0, "maximum_linodes_per_pg": 0}, "site_type": "distributed"}, {"id": "mx-qro-1", - "label": "Quer\u00e9taro, MX", "country": "mx", "capabilities": ["Linodes", - "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans"], "status": "ok", - "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": - 0}, "site_type": "distributed"}, {"id": "us-hou-1", "label": "Houston, TX", - "country": "us", "capabilities": ["Linodes", "Cloud Firewall", "Vlans", "Metadata", - "Distributed Plans"], "status": "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", - "ipv6": "1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": - 0, "maximum_linodes_per_pg": 0}, "site_type": "distributed"}, {"id": "cl-scl-1", - "label": "Santiago, CL", "country": "cl", "capabilities": ["Linodes", "Cloud - Firewall", "Vlans", "Metadata", "Distributed Plans"], "status": "ok", "resolvers": - {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": - 0}, "site_type": "distributed"}, {"id": "gb-lon", "label": "London 2, UK", "country": - "gb", "capabilities": ["Linodes", "Block Storage Encryption", "Disk Encryption", - "Backups", "NodeBalancers", "Block Storage", "Kubernetes", "Cloud Firewall", - "Vlans", "VPCs", "Managed Databases", "Metadata", "Premium Plans", "Placement - Group", "StackScripts"], "status": "ok", "resolvers": {"ipv4": "172.236.0.46,172.236.0.50,172.236.0.47,172.236.0.53,172.236.0.52,172.236.0.45,172.236.0.49,172.236.0.51,172.236.0.54,172.236.0.48", + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "us-ord", + "label": "Chicago, IL", "country": "us", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes + Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", + "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance + Policy", "Linode Interfaces", "ACLP Logs Datacenter LKE-E"], "monitors": {"alerts": + ["Managed Databases", "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "172.232.0.17,172.232.0.16,172.232.0.21,172.232.0.13,172.232.0.22,172.232.0.9,172.232.0.19,172.232.0.20,172.232.0.15,172.232.0.18", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "au-mel", "label": "Melbourne, AU", "country": - "au", "capabilities": ["Linodes", "Block Storage Encryption", "Disk Encryption", - "Backups", "NodeBalancers", "Block Storage", "Kubernetes", "Cloud Firewall", - "Vlans", "VPCs", "Managed Databases", "Metadata", "Premium Plans", "Placement - Group", "StackScripts", "NETINT Quadra T1U"], "status": "ok", "resolvers": {"ipv4": - "172.236.32.23,172.236.32.35,172.236.32.30,172.236.32.28,172.236.32.32,172.236.32.33,172.236.32.27,172.236.32.37,172.236.32.29,172.236.32.34", + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "fr-par", + "label": "Paris, FR", "country": "fr", "capabilities": ["Linodes", "Block Storage + Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes + Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", + "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "172.232.32.21,172.232.32.23,172.232.32.17,172.232.32.18,172.232.32.16,172.232.32.22,172.232.32.20,172.232.32.14,172.232.32.11,172.232.32.12", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "in-bom-2", "label": "Mumbai 2, IN", "country": - "in", "capabilities": ["Linodes", "Block Storage Encryption", "Disk Encryption", - "Backups", "NodeBalancers", "Block Storage", "GPU Linodes", "Cloud Firewall", - "Vlans", "VPCs", "Metadata", "Premium Plans", "Placement Group", "StackScripts"], - "status": "ok", "resolvers": {"ipv4": "172.236.171.41,172.236.171.42,172.236.171.25,172.236.171.44,172.236.171.26,172.236.171.45,172.236.171.24,172.236.171.43,172.236.171.27,172.236.171.28", + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "us-sea", + "label": "Seattle, WA", "country": "us", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes + Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", + "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance + Policy", "Linode Interfaces", "ACLP Logs Datacenter LKE-E"], "monitors": {"alerts": + ["Managed Databases", "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "172.232.160.19,172.232.160.21,172.232.160.17,172.232.160.15,172.232.160.18,172.232.160.8,172.232.160.12,172.232.160.11,172.232.160.14,172.232.160.16", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "de-fra-2", "label": "Frankfurt 2, DE", "country": - "de", "capabilities": ["Linodes", "Block Storage Encryption", "Disk Encryption", - "Backups", "NodeBalancers", "Block Storage", "GPU Linodes", "Kubernetes", "Cloud - Firewall", "Vlans", "VPCs", "Metadata", "Premium Plans", "Placement Group", - "StackScripts", "NETINT Quadra T1U"], "status": "ok", "resolvers": {"ipv4": - "172.236.203.9,172.236.203.16,172.236.203.19,172.236.203.15,172.236.203.17,172.236.203.11,172.236.203.18,172.236.203.14,172.236.203.13,172.236.203.12", + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "br-gru", + "label": "Sao Paulo, BR", "country": "br", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "Kubernetes", "Kubernetes Enterprise", "Cloud + Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", + "Premium Plans", "Placement Group", "StackScripts", "Maintenance Policy", "Linode + Interfaces"], "monitors": {"alerts": ["Managed Databases", "NodeBalancers"], + "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": + {"ipv4": "172.233.0.4,172.233.0.9,172.233.0.7,172.233.0.12,172.233.0.5,172.233.0.13,172.233.0.10,172.233.0.6,172.233.0.8,172.233.0.11", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "sg-sin-2", "label": "Singapore 2, SG", "country": - "sg", "capabilities": ["Linodes", "Block Storage Encryption", "Disk Encryption", - "Backups", "NodeBalancers", "Block Storage", "GPU Linodes", "Kubernetes", "Cloud - Firewall", "Vlans", "VPCs", "Managed Databases", "Metadata", "Premium Plans", - "Placement Group", "StackScripts"], "status": "ok", "resolvers": {"ipv4": "172.236.129.8,172.236.129.42,172.236.129.41,172.236.129.19,172.236.129.46,172.236.129.23,172.236.129.48,172.236.129.20,172.236.129.21,172.236.129.47", + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "nl-ams", + "label": "Amsterdam, NL", "country": "nl", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes + Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", + "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "172.233.33.36,172.233.33.38,172.233.33.35,172.233.33.39,172.233.33.34,172.233.33.33,172.233.33.31,172.233.33.30,172.233.33.37,172.233.33.32", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "jp-tyo-3", "label": "Tokyo 3, JP", "country": - "jp", "capabilities": ["Linodes", "Block Storage Encryption", "Disk Encryption", - "Backups", "NodeBalancers", "Block Storage", "Kubernetes", "Cloud Firewall", - "Vlans", "VPCs", "Metadata", "Premium Plans", "Placement Group", "StackScripts"], - "status": "ok", "resolvers": {"ipv4": "172.237.4.15,172.237.4.19,172.237.4.17,172.237.4.21,172.237.4.16,172.237.4.18,172.237.4.23,172.237.4.24,172.237.4.20,172.237.4.14", + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "se-sto", + "label": "Stockholm, SE", "country": "se", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes + Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", + "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "172.232.128.24,172.232.128.26,172.232.128.20,172.232.128.22,172.232.128.25,172.232.128.19,172.232.128.23,172.232.128.18,172.232.128.21,172.232.128.27", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "es-mad", + "label": "Madrid, ES", "country": "es", "capabilities": ["Linodes", "Block Storage + Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes + Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", + "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "172.233.111.6,172.233.111.17,172.233.111.21,172.233.111.25,172.233.111.19,172.233.111.12,172.233.111.26,172.233.111.16,172.233.111.18,172.233.111.9", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "in-maa", + "label": "Chennai, IN", "country": "in", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes + Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", + "Metadata", "Premium Plans", "Placement Group", "StackScripts", "NETINT Quadra + T1U", "Maintenance Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed + Databases", "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "172.232.96.17,172.232.96.26,172.232.96.19,172.232.96.20,172.232.96.25,172.232.96.21,172.232.96.18,172.232.96.22,172.232.96.23,172.232.96.24", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "jp-osa", + "label": "Osaka, JP", "country": "jp", "capabilities": ["Linodes", "Block Storage + Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes + Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", + "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "172.233.64.44,172.233.64.43,172.233.64.37,172.233.64.40,172.233.64.46,172.233.64.41,172.233.64.39,172.233.64.42,172.233.64.45,172.233.64.38", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "us-central", "label": "Dallas, TX", "country": - "us", "capabilities": ["Linodes", "Disk Encryption", "Backups", "NodeBalancers", + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "it-mil", + "label": "Milan, IT", "country": "it", "capabilities": ["Linodes", "Block Storage + Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes + Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", + "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "172.232.192.19,172.232.192.18,172.232.192.16,172.232.192.20,172.232.192.24,172.232.192.21,172.232.192.22,172.232.192.17,172.232.192.15,172.232.192.23", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "us-central", + "label": "Dallas, TX", "country": "us", "capabilities": ["Linodes", "Block Storage + Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", - "Managed Databases", "Metadata", "Placement Group", "StackScripts"], "status": + "Managed Databases", "Metadata", "Placement Group", "StackScripts", "Maintenance + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "72.14.179.5,72.14.188.5,173.255.199.5,66.228.53.5,96.126.122.5,96.126.124.5,96.126.127.5,198.58.107.5,198.58.111.5,23.239.24.5", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "us-west", "label": "Fremont, CA", "country": - "us", "capabilities": ["Linodes", "Block Storage Encryption", "Disk Encryption", - "Backups", "NodeBalancers", "Block Storage", "Kubernetes", "Cloud Firewall", - "Vlans", "Block Storage Migrations", "Managed Databases", "Metadata", "Placement - Group", "StackScripts"], "status": "ok", "resolvers": {"ipv4": "173.230.145.5, - 173.230.147.5, 173.230.155.5, 173.255.212.5, 173.255.219.5, 173.255.241.5, 173.255.243.5, - 173.255.244.5, 74.207.241.5, 74.207.242.5", "ipv6": "1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": - null, "maximum_linodes_per_pg": 5}, "site_type": "core"}, {"id": "us-southeast", - "label": "Atlanta, GA", "country": "us", "capabilities": ["Linodes", "Disk Encryption", - "Backups", "NodeBalancers", "Block Storage", "Object Storage", "GPU Linodes", - "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", "Managed - Databases", "Metadata", "Placement Group", "StackScripts"], "status": "ok", - "resolvers": {"ipv4": "74.207.231.5,173.230.128.5,173.230.129.5,173.230.136.5,173.230.140.5,66.228.59.5,66.228.62.5,50.116.35.5,50.116.41.5,23.239.18.5", - "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "us-east", "label": "Newark, NJ", "country": - "us", "capabilities": ["Linodes", "Disk Encryption", "Backups", "NodeBalancers", + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "ap-northeast", + "label": "Tokyo 2, JP", "country": "jp", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", + "Managed Databases", "Metadata", "Placement Group", "StackScripts", "Maintenance + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "139.162.66.5,139.162.67.5,139.162.68.5,139.162.69.5,139.162.70.5,139.162.71.5,139.162.72.5,139.162.73.5,139.162.74.5,139.162.75.5", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "eu-central", + "label": "Frankfurt, DE", "country": "de", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", "Managed Databases", "Metadata", "Placement - Group", "StackScripts"], "status": "ok", "resolvers": {"ipv4": "66.228.42.5, - 96.126.106.5, 50.116.53.5, 50.116.58.5, 50.116.61.5, 50.116.62.5, 66.175.211.5, - 97.107.133.4, 207.192.69.4, 207.192.69.5", "ipv6": "1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": - null, "maximum_linodes_per_pg": 5}, "site_type": "core"}, {"id": "eu-west", - "label": "London, UK", "country": "gb", "capabilities": ["Linodes", "Disk Encryption", - "Backups", "NodeBalancers", "Block Storage", "Kubernetes", "Cloud Firewall", - "Vlans", "Block Storage Migrations", "Metadata", "Placement Group", "StackScripts"], + Group", "StackScripts", "Maintenance Policy", "Linode Interfaces"], "monitors": + {"alerts": ["Managed Databases", "NodeBalancers"], "metrics": ["Managed Databases", + "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "139.162.130.5,139.162.131.5,139.162.132.5,139.162.133.5,139.162.134.5,139.162.135.5,139.162.136.5,139.162.137.5,139.162.138.5,139.162.139.5", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "ap-south", + "label": "Singapore, SG", "country": "sg", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Cloud Firewall", + "Vlans", "Block Storage Migrations", "Metadata", "Placement Group", "StackScripts", + "Maintenance Policy", "Linode Interfaces"], "monitors": {"alerts": ["NodeBalancers"], + "metrics": ["NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "139.162.11.5,139.162.13.5,139.162.14.5,139.162.15.5,139.162.16.5,139.162.21.5,139.162.27.5,103.3.60.18,103.3.60.19,103.3.60.20", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "eu-west", + "label": "London, UK", "country": "gb", "capabilities": ["Linodes", "Block Storage + Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", + "Metadata", "Placement Group", "StackScripts", "Maintenance Policy", "Linode + Interfaces"], "monitors": {"alerts": ["NodeBalancers"], "metrics": ["NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "178.79.182.5, 176.58.107.5, 176.58.116.5, 176.58.121.5, 151.236.220.5, 212.71.252.5, 212.71.253.5, 109.74.192.20, 109.74.193.20, 109.74.194.20", "ipv6": "1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "ap-south", "label": "Singapore, SG", "country": - "sg", "capabilities": ["Linodes", "Disk Encryption", "Backups", "NodeBalancers", + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "us-east", + "label": "Newark, NJ", "country": "us", "capabilities": ["Linodes", "Block Storage + Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Cloud Firewall", - "Vlans", "Block Storage Migrations", "Metadata", "Placement Group", "StackScripts"], - "status": "ok", "resolvers": {"ipv4": "139.162.11.5,139.162.13.5,139.162.14.5,139.162.15.5,139.162.16.5,139.162.21.5,139.162.27.5,103.3.60.18,103.3.60.19,103.3.60.20", + "Vlans", "Block Storage Migrations", "Managed Databases", "Metadata", "Placement + Group", "StackScripts", "Maintenance Policy", "Linode Interfaces"], "monitors": + {"alerts": ["Managed Databases", "NodeBalancers"], "metrics": ["Managed Databases", + "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "66.228.42.5,96.126.106.5,50.116.53.5,50.116.58.5,50.116.61.5,50.116.62.5,66.175.211.5,97.107.133.4,173.255.225.5,66.228.35.5", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "eu-central", "label": "Frankfurt, DE", "country": - "de", "capabilities": ["Linodes", "Disk Encryption", "Backups", "NodeBalancers", + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "us-southeast", + "label": "Atlanta, GA", "country": "us", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", "Managed Databases", "Metadata", "Placement - Group", "StackScripts"], "status": "ok", "resolvers": {"ipv4": "139.162.130.5,139.162.131.5,139.162.132.5,139.162.133.5,139.162.134.5,139.162.135.5,139.162.136.5,139.162.137.5,139.162.138.5,139.162.139.5", + Group", "StackScripts", "Maintenance Policy", "Linode Interfaces"], "monitors": + {"alerts": ["Managed Databases", "NodeBalancers"], "metrics": ["Managed Databases", + "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "74.207.231.5,173.230.128.5,173.230.129.5,173.230.136.5,173.230.140.5,66.228.59.5,66.228.62.5,50.116.35.5,50.116.41.5,23.239.18.5", "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "ap-northeast", "label": "Tokyo 2, JP", "country": - "jp", "capabilities": ["Linodes", "Disk Encryption", "Backups", "NodeBalancers", + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "us-west", + "label": "Fremont, CA", "country": "us", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", - "Managed Databases", "Metadata", "Placement Group", "StackScripts"], "status": - "ok", "resolvers": {"ipv4": "139.162.66.5,139.162.67.5,139.162.68.5,139.162.69.5,139.162.70.5,139.162.71.5,139.162.72.5,139.162.73.5,139.162.74.5,139.162.75.5", - "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": - 5}, "site_type": "core"}], "page": 1, "pages": 1, "results": 41}' + "Managed Databases", "Metadata", "Placement Group", "StackScripts", "Maintenance + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "173.230.145.5, 173.230.147.5, 173.230.155.5, 173.255.212.5, + 173.255.219.5, 173.255.241.5, 173.255.243.5, 173.255.244.5, 74.207.241.5, 74.207.242.5", + "ipv6": "1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678, + 1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678"}, "placement_group_limits": + {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": + 5}, "site_type": "core"}], "page": 1, "pages": 1, "results": 47}' headers: Access-Control-Allow-Credentials: - "true" @@ -322,7 +479,7 @@ interactions: Content-Type: - application/json Expires: - - Wed, 08 Jan 2025 06:04:11 GMT + - Wed, 06 May 2026 02:22:23 GMT Pragma: - no-cache Strict-Transport-Security: @@ -341,14 +498,14 @@ interactions: X-Oauth-Scopes: - '*' X-Ratelimit-Limit: - - "1600" + - "1840" X-Xss-Protection: - 1; mode=block status: 200 OK code: 200 duration: "" - request: - body: '{"region":"us-iad","label":"go-bucket-test-def"}' + body: '{"region":"au-mel","label":"go-bucket-test-defgo-test-def-regional"}' form: {} headers: Accept: @@ -360,10 +517,10 @@ interactions: url: https://api.linode.com/v4beta/object-storage/buckets method: POST response: - body: '{"hostname": "go-bucket-test-def.us-iad-1.linodeobjects.com", "label": - "go-bucket-test-def", "created": "2018-01-02T03:04:05", "region": "us-iad", - "cluster": "us-iad-1", "size": 0, "objects": 0, "endpoint_type": "E1", "s3_endpoint": - "us-iad-1.linodeobjects.com"}' + body: '{"hostname": "go-bucket-test-defgo-test-def-regional.au-mel-1.linodeobjects.com", + "label": "go-bucket-test-defgo-test-def-regional", "created": "2018-01-02T03:04:05", + "region": "au-mel", "cluster": "", "size": 0, "objects": 0, "endpoint_type": + "E2", "s3_endpoint": "au-mel-1.linodeobjects.com"}' headers: Access-Control-Allow-Credentials: - "true" @@ -382,13 +539,13 @@ interactions: Connection: - keep-alive Content-Length: - - "262" + - "294" Content-Security-Policy: - default-src 'none' Content-Type: - application/json Expires: - - Wed, 08 Jan 2025 06:04:13 GMT + - Wed, 06 May 2026 02:22:29 GMT Pragma: - no-cache Strict-Transport-Security: @@ -405,14 +562,14 @@ interactions: X-Oauth-Scopes: - '*' X-Ratelimit-Limit: - - "1600" + - "60" X-Xss-Protection: - 1; mode=block status: 200 OK code: 200 duration: "" - request: - body: '{"label":"go-test-def","bucket_access":[{"region":"us-iad","bucket_name":"go-bucket-test-def","permissions":"read_only"}],"regions":["us-iad"]}' + body: '{"label":"go-test-def","bucket_access":[{"region":"au-mel","bucket_name":"go-bucket-test-defgo-test-def-regional","permissions":"read_only"}],"regions":["au-mel"]}' form: {} headers: Accept: @@ -424,11 +581,11 @@ interactions: url: https://api.linode.com/v4beta/object-storage/keys method: POST response: - body: '{"id": 1654587, "label": "go-test-def", "access_key": "[SANITIZED]", "secret_key": - "[SANITIZED]", "limited": true, "bucket_access": [{"cluster": "us-iad-1", "bucket_name": - "go-bucket-test-def", "permissions": "read_only", "region": "us-iad"}], "regions": - [{"id": "us-iad", "s3_endpoint": "us-iad-1.linodeobjects.com", "endpoint_type": - "E1"}]}' + body: '{"id": 3573417, "label": "go-test-def", "access_key": "[SANITIZED]", "secret_key": + "[SANITIZED]", "limited": true, "bucket_access": [{"cluster": "", "bucket_name": + "go-bucket-test-defgo-test-def-regional", "permissions": "read_only", "region": + "au-mel"}], "regions": [{"id": "au-mel", "s3_endpoint": "au-mel-1.linodeobjects.com", + "endpoint_type": "E2"}]}' headers: Access-Control-Allow-Credentials: - "true" @@ -447,13 +604,13 @@ interactions: Connection: - keep-alive Content-Length: - - "380" + - "392" Content-Security-Policy: - default-src 'none' Content-Type: - application/json Expires: - - Wed, 08 Jan 2025 06:04:14 GMT + - Wed, 06 May 2026 02:22:36 GMT Pragma: - no-cache Strict-Transport-Security: @@ -470,14 +627,14 @@ interactions: X-Oauth-Scopes: - '*' X-Ratelimit-Limit: - - "1600" + - "60" X-Xss-Protection: - 1; mode=block status: 200 OK code: 200 duration: "" - request: - body: '{"regions":["us-iad","us-mia"]}' + body: '{"regions":["au-mel","us-mia"]}' form: {} headers: Accept: @@ -486,15 +643,15 @@ interactions: - application/json User-Agent: - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/object-storage/keys/1654587 + url: https://api.linode.com/v4beta/object-storage/keys/3573417 method: PUT response: - body: '{"id": 1654587, "label": "go-test-def", "access_key": "[SANITIZED]", "secret_key": - "[REDACTED]", "limited": true, "bucket_access": [{"cluster": "us-iad-1", "bucket_name": - "go-bucket-test-def", "permissions": "read_only", "region": "us-iad"}], "regions": - [{"id": "us-iad", "s3_endpoint": "us-iad-1.linodeobjects.com", "endpoint_type": - "E1"}, {"id": "us-mia", "s3_endpoint": "us-mia-1.linodeobjects.com", "endpoint_type": - "E1"}]}' + body: '{"id": 3573417, "label": "go-test-def", "access_key": "[SANITIZED]", "secret_key": + "[REDACTED]", "limited": true, "bucket_access": [{"cluster": "", "bucket_name": + "go-bucket-test-defgo-test-def-regional", "permissions": "read_only", "region": + "au-mel"}], "regions": [{"id": "au-mel", "s3_endpoint": "au-mel-1.linodeobjects.com", + "endpoint_type": "E2"}, {"id": "us-mia", "s3_endpoint": "us-mia-1.linodeobjects.com", + "endpoint_type": "E1"}]}' headers: Access-Control-Allow-Credentials: - "true" @@ -513,13 +670,13 @@ interactions: Connection: - keep-alive Content-Length: - - "436" + - "448" Content-Security-Policy: - default-src 'none' Content-Type: - application/json Expires: - - Wed, 08 Jan 2025 06:04:15 GMT + - Wed, 06 May 2026 02:22:39 GMT Pragma: - no-cache Strict-Transport-Security: @@ -536,7 +693,7 @@ interactions: X-Oauth-Scopes: - '*' X-Ratelimit-Limit: - - "1600" + - "60" X-Xss-Protection: - 1; mode=block status: 200 OK @@ -552,7 +709,7 @@ interactions: - application/json User-Agent: - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/object-storage/keys/1654587 + url: https://api.linode.com/v4beta/object-storage/keys/3573417 method: DELETE response: body: '{}' @@ -580,7 +737,7 @@ interactions: Content-Type: - application/json Expires: - - Wed, 08 Jan 2025 06:04:16 GMT + - Wed, 06 May 2026 02:22:42 GMT Pragma: - no-cache Strict-Transport-Security: @@ -597,7 +754,7 @@ interactions: X-Oauth-Scopes: - '*' X-Ratelimit-Limit: - - "1600" + - "60" X-Xss-Protection: - 1; mode=block status: 200 OK @@ -613,7 +770,7 @@ interactions: - application/json User-Agent: - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/object-storage/buckets/us-iad-1/go-bucket-test-def + url: https://api.linode.com/v4beta/object-storage/buckets/au-mel/go-bucket-test-defgo-test-def-regional method: DELETE response: body: '{}' @@ -641,7 +798,7 @@ interactions: Content-Type: - application/json Expires: - - Wed, 08 Jan 2025 06:04:29 GMT + - Wed, 06 May 2026 02:22:51 GMT Pragma: - no-cache Strict-Transport-Security: @@ -658,7 +815,7 @@ interactions: X-Oauth-Scopes: - '*' X-Ratelimit-Limit: - - "1600" + - "1840" X-Xss-Protection: - 1; mode=block status: 200 OK diff --git a/test/integration/fixtures/TestObjectStorageObject_ACLConfig_Bucket_Delete.yaml b/test/integration/fixtures/TestObjectStorageObject_ACLConfig_Bucket_Delete.yaml index 868fe0b01..3e0b2f5c8 100644 --- a/test/integration/fixtures/TestObjectStorageObject_ACLConfig_Bucket_Delete.yaml +++ b/test/integration/fixtures/TestObjectStorageObject_ACLConfig_Bucket_Delete.yaml @@ -5,7 +5,7 @@ interactions: body: "" form: {} headers: {} - url: https://us-east-1.linodeobjects.com:443/go-bucket-test-def/test?Signature=q40b1QCD%2FE5YyfsAW%2Fl5vZNfiRs%3D&Expires=1736322799&AWSAccessKeyID=SANITIZED + url: https://us-east-1.linodeobjects.com:443/go-bucket-test-def/test?Signature=AR8zXFhZ7YiFXg5d92BWdbftFNk%3D&Expires=1777580764&AWSAccessKeyID=SANITIZED method: DELETE response: body: "" @@ -13,7 +13,7 @@ interactions: Connection: - keep-alive X-Amz-Request-Id: - - tx000003f312b97ed86260d-00677e2d87-f1a4821b-default + - tx00000d61d93b8872788f2-0069f3b974-18c2cc906-default status: 204 No Content code: 204 duration: "" diff --git a/test/integration/fixtures/TestObjectStorageObject_ACLConfig_Bucket_Put.yaml b/test/integration/fixtures/TestObjectStorageObject_ACLConfig_Bucket_Put.yaml index 5d7ccf6ad..74d078e75 100644 --- a/test/integration/fixtures/TestObjectStorageObject_ACLConfig_Bucket_Put.yaml +++ b/test/integration/fixtures/TestObjectStorageObject_ACLConfig_Bucket_Put.yaml @@ -7,7 +7,7 @@ interactions: headers: Content-Type: - text/plain - url: https://us-east-1.linodeobjects.com:443/go-bucket-test-def/test?Signature=UZqhNnak%2FwLVHy0HB2TW87rl%2Baw%3D&Expires=1736322791&AWSAccessKeyID=SANITIZED + url: https://us-east-1.linodeobjects.com:443/go-bucket-test-def/test?Signature=uVC0ROXSh0pzdkwt%2FSF6aO8sSUE%3D&Expires=1777580757&AWSAccessKeyID=SANITIZED method: PUT response: body: "" @@ -21,7 +21,7 @@ interactions: Etag: - '"7f2ababa423061c509f4923dd04b6cf1"' X-Amz-Request-Id: - - tx000003d8b04716d761fbb-00677e2d7f-ef83577d-default + - tx00000a96d0bdfc69b8814-0069f3b96d-18c2db3f1-default status: 200 OK code: 200 duration: "" diff --git a/test/integration/fixtures/TestObjectStorageObject_Smoke.yaml b/test/integration/fixtures/TestObjectStorageObject_Smoke.yaml index 5898e1fd9..17e6e4c1e 100644 --- a/test/integration/fixtures/TestObjectStorageObject_Smoke.yaml +++ b/test/integration/fixtures/TestObjectStorageObject_Smoke.yaml @@ -42,7 +42,7 @@ interactions: Content-Type: - application/json Expires: - - Wed, 08 Jan 2025 07:47:09 GMT + - Thu, 30 Apr 2026 20:19:55 GMT Pragma: - no-cache Strict-Transport-Security: @@ -59,7 +59,7 @@ interactions: X-Oauth-Scopes: - '*' X-Ratelimit-Limit: - - "1600" + - "60" X-Xss-Protection: - 1; mode=block status: 200 OK @@ -75,10 +75,10 @@ interactions: - application/json User-Agent: - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/object-storage/buckets/us-east-1/go-bucket-test-def/object-url + url: https://api.linode.com/v4beta/object-storage/buckets/us-east/go-bucket-test-def/object-url method: POST response: - body: '{"url": "https://us-east-1.linodeobjects.com:443/go-bucket-test-def/test?Signature=UZqhNnak%2FwLVHy0HB2TW87rl%2Baw%3D&Expires=1736322791&AWSAccessKeyID=SANITIZED", + body: '{"url": "https://us-east-1.linodeobjects.com:443/go-bucket-test-def/test?Signature=uVC0ROXSh0pzdkwt%2FSF6aO8sSUE%3D&Expires=1777580757&AWSAccessKeyID=SANITIZED", "exists": false}' headers: Access-Control-Allow-Credentials: @@ -98,13 +98,13 @@ interactions: Connection: - keep-alive Content-Length: - - "191" + - "189" Content-Security-Policy: - default-src 'none' Content-Type: - application/json Expires: - - Wed, 08 Jan 2025 07:47:11 GMT + - Thu, 30 Apr 2026 20:19:57 GMT Pragma: - no-cache Strict-Transport-Security: @@ -121,7 +121,7 @@ interactions: X-Oauth-Scopes: - '*' X-Ratelimit-Limit: - - "1600" + - "1840" X-Xss-Protection: - 1; mode=block status: 200 OK @@ -137,11 +137,11 @@ interactions: - application/json User-Agent: - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/object-storage/buckets/us-east-1/go-bucket-test-def/object-acl?name=test + url: https://api.linode.com/v4beta/object-storage/buckets/us-east/go-bucket-test-def/object-acl?name=test method: GET response: - body: '{"acl": "private", "acl_xml": "c9539a32-3ece-47dd-a9a4-40bbfa5a2936c9539a32-3ece-47dd-a9a4-40bbfa5a2936c9539a32-3ece-47dd-a9a4-40bbfa5a2936c9539a32-3ece-47dd-a9a4-40bbfa5a2936FULL_CONTROL"}' + body: '{"acl": "private", "acl_xml": "640757b5-ebe9-45b1-abd5-581f215ef89e640757b5-ebe9-45b1-abd5-581f215ef89e640757b5-ebe9-45b1-abd5-581f215ef89e640757b5-ebe9-45b1-abd5-581f215ef89eFULL_CONTROL"}' headers: Access-Control-Allow-Credentials: - "true" @@ -166,7 +166,7 @@ interactions: Content-Type: - application/json Expires: - - Wed, 08 Jan 2025 07:47:12 GMT + - Thu, 30 Apr 2026 20:19:58 GMT Pragma: - no-cache Strict-Transport-Security: @@ -184,7 +184,7 @@ interactions: X-Oauth-Scopes: - '*' X-Ratelimit-Limit: - - "1600" + - "1840" X-Xss-Protection: - 1; mode=block status: 200 OK @@ -200,74 +200,11 @@ interactions: - application/json User-Agent: - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/object-storage/buckets/us-east-1/go-bucket-test-def/object-acl?name=test + url: https://api.linode.com/v4beta/object-storage/buckets/us-east/go-bucket-test-def/object-list method: GET response: - body: '{"acl": "private", "acl_xml": "c9539a32-3ece-47dd-a9a4-40bbfa5a2936c9539a32-3ece-47dd-a9a4-40bbfa5a2936c9539a32-3ece-47dd-a9a4-40bbfa5a2936c9539a32-3ece-47dd-a9a4-40bbfa5a2936FULL_CONTROL"}' - headers: - Access-Control-Allow-Credentials: - - "true" - Access-Control-Allow-Headers: - - Authorization, Origin, X-Requested-With, Content-Type, Accept, X-Filter - Access-Control-Allow-Methods: - - HEAD, GET, OPTIONS, POST, PUT, DELETE - Access-Control-Allow-Origin: - - '*' - Access-Control-Expose-Headers: - - X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Status - Akamai-Internal-Account: - - '*' - Cache-Control: - - max-age=0, no-cache, no-store - Connection: - - keep-alive - Content-Length: - - "550" - Content-Security-Policy: - - default-src 'none' - Content-Type: - - application/json - Expires: - - Wed, 08 Jan 2025 07:47:13 GMT - Pragma: - - no-cache - Strict-Transport-Security: - - max-age=31536000 - Vary: - - Authorization, X-Filter - - Authorization, X-Filter - X-Accepted-Oauth-Scopes: - - object_storage:read_only - X-Content-Type-Options: - - nosniff - X-Frame-Options: - - DENY - - DENY - X-Oauth-Scopes: - - '*' - X-Ratelimit-Limit: - - "1600" - X-Xss-Protection: - - 1; mode=block - status: 200 OK - code: 200 - duration: "" -- request: - body: "" - form: {} - headers: - Accept: - - application/json - Content-Type: - - application/json - User-Agent: - - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/object-storage/buckets/us-east-1/go-bucket-test-def/object-list - method: GET - response: - body: '{"data": [{"name": "test", "size": 10, "last_modified": "2018-01-02T03:04:05.723Z", - "etag": "7f2ababa423061c509f4923dd04b6cf1", "owner": "c9539a32-3ece-47dd-a9a4-40bbfa5a2936"}], + body: '{"data": [{"name": "test", "size": 10, "last_modified": "2018-01-02T03:04:05.368Z", + "etag": "7f2ababa423061c509f4923dd04b6cf1", "owner": "640757b5-ebe9-45b1-abd5-581f215ef89e"}], "next_marker": null, "is_truncated": false}' headers: Access-Control-Allow-Credentials: @@ -293,7 +230,7 @@ interactions: Content-Type: - application/json Expires: - - Wed, 08 Jan 2025 07:47:14 GMT + - Thu, 30 Apr 2026 20:19:59 GMT Pragma: - no-cache Strict-Transport-Security: @@ -311,7 +248,7 @@ interactions: X-Oauth-Scopes: - '*' X-Ratelimit-Limit: - - "1600" + - "1840" X-Xss-Protection: - 1; mode=block status: 200 OK @@ -327,7 +264,7 @@ interactions: - application/json User-Agent: - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/object-storage/buckets/us-east-1/go-bucket-test-def/object-acl + url: https://api.linode.com/v4beta/object-storage/buckets/us-east/go-bucket-test-def/object-acl method: PUT response: body: '{}' @@ -355,7 +292,7 @@ interactions: Content-Type: - application/json Expires: - - Wed, 08 Jan 2025 07:47:15 GMT + - Thu, 30 Apr 2026 20:20:00 GMT Pragma: - no-cache Strict-Transport-Security: @@ -372,132 +309,7 @@ interactions: X-Oauth-Scopes: - '*' X-Ratelimit-Limit: - - "1600" - X-Xss-Protection: - - 1; mode=block - status: 200 OK - code: 200 - duration: "" -- request: - body: '{"name":"test","acl":"public-read"}' - form: {} - headers: - Accept: - - application/json - Content-Type: - - application/json - User-Agent: - - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/object-storage/buckets/us-east-1/go-bucket-test-def/object-acl - method: PUT - response: - body: '{}' - headers: - Access-Control-Allow-Credentials: - - "true" - Access-Control-Allow-Headers: - - Authorization, Origin, X-Requested-With, Content-Type, Accept, X-Filter - Access-Control-Allow-Methods: - - HEAD, GET, OPTIONS, POST, PUT, DELETE - Access-Control-Allow-Origin: - - '*' - Access-Control-Expose-Headers: - - X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Status - Akamai-Internal-Account: - - '*' - Cache-Control: - - max-age=0, no-cache, no-store - Connection: - - keep-alive - Content-Length: - - "2" - Content-Security-Policy: - - default-src 'none' - Content-Type: - - application/json - Expires: - - Wed, 08 Jan 2025 07:47:16 GMT - Pragma: - - no-cache - Strict-Transport-Security: - - max-age=31536000 - Vary: - - Authorization, X-Filter - X-Accepted-Oauth-Scopes: - - object_storage:read_write - X-Content-Type-Options: - - nosniff - X-Frame-Options: - - DENY - - DENY - X-Oauth-Scopes: - - '*' - X-Ratelimit-Limit: - - "1600" - X-Xss-Protection: - - 1; mode=block - status: 200 OK - code: 200 - duration: "" -- request: - body: "" - form: {} - headers: - Accept: - - application/json - Content-Type: - - application/json - User-Agent: - - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/object-storage/buckets/us-east-1/go-bucket-test-def/object-acl?name=test - method: GET - response: - body: '{"acl": "public-read", "acl_xml": "c9539a32-3ece-47dd-a9a4-40bbfa5a2936c9539a32-3ece-47dd-a9a4-40bbfa5a2936http://acs.amazonaws.com/groups/global/AllUsersREADc9539a32-3ece-47dd-a9a4-40bbfa5a2936c9539a32-3ece-47dd-a9a4-40bbfa5a2936FULL_CONTROL"}' - headers: - Access-Control-Allow-Credentials: - - "true" - Access-Control-Allow-Headers: - - Authorization, Origin, X-Requested-With, Content-Type, Accept, X-Filter - Access-Control-Allow-Methods: - - HEAD, GET, OPTIONS, POST, PUT, DELETE - Access-Control-Allow-Origin: - - '*' - Access-Control-Expose-Headers: - - X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Status - Akamai-Internal-Account: - - '*' - Cache-Control: - - max-age=0, no-cache, no-store - Connection: - - keep-alive - Content-Length: - - "750" - Content-Security-Policy: - - default-src 'none' - Content-Type: - - application/json - Expires: - - Wed, 08 Jan 2025 07:47:17 GMT - Pragma: - - no-cache - Strict-Transport-Security: - - max-age=31536000 - Vary: - - Authorization, X-Filter - - Authorization, X-Filter - X-Accepted-Oauth-Scopes: - - object_storage:read_only - X-Content-Type-Options: - - nosniff - X-Frame-Options: - - DENY - - DENY - X-Oauth-Scopes: - - '*' - X-Ratelimit-Limit: - - "1600" + - "1840" X-Xss-Protection: - 1; mode=block status: 200 OK @@ -513,12 +325,12 @@ interactions: - application/json User-Agent: - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/object-storage/buckets/us-east-1/go-bucket-test-def/object-acl?name=test + url: https://api.linode.com/v4beta/object-storage/buckets/us-east/go-bucket-test-def/object-acl?name=test method: GET response: - body: '{"acl": "public-read", "acl_xml": "c9539a32-3ece-47dd-a9a4-40bbfa5a2936c9539a32-3ece-47dd-a9a4-40bbfa5a2936640757b5-ebe9-45b1-abd5-581f215ef89e640757b5-ebe9-45b1-abd5-581f215ef89ehttp://acs.amazonaws.com/groups/global/AllUsersREADc9539a32-3ece-47dd-a9a4-40bbfa5a2936c9539a32-3ece-47dd-a9a4-40bbfa5a2936FULL_CONTROL"}' + xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:type=\"CanonicalUser\">640757b5-ebe9-45b1-abd5-581f215ef89e640757b5-ebe9-45b1-abd5-581f215ef89eFULL_CONTROL"}' headers: Access-Control-Allow-Credentials: - "true" @@ -543,7 +355,7 @@ interactions: Content-Type: - application/json Expires: - - Wed, 08 Jan 2025 07:47:17 GMT + - Thu, 30 Apr 2026 20:20:02 GMT Pragma: - no-cache Strict-Transport-Security: @@ -561,7 +373,7 @@ interactions: X-Oauth-Scopes: - '*' X-Ratelimit-Limit: - - "1600" + - "1840" X-Xss-Protection: - 1; mode=block status: 200 OK @@ -577,10 +389,10 @@ interactions: - application/json User-Agent: - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/object-storage/buckets/us-east-1/go-bucket-test-def/object-url + url: https://api.linode.com/v4beta/object-storage/buckets/us-east/go-bucket-test-def/object-url method: POST response: - body: '{"url": "https://us-east-1.linodeobjects.com:443/go-bucket-test-def/test?Signature=q40b1QCD%2FE5YyfsAW%2Fl5vZNfiRs%3D&Expires=1736322799&AWSAccessKeyID=SANITIZED", + body: '{"url": "https://us-east-1.linodeobjects.com:443/go-bucket-test-def/test?Signature=AR8zXFhZ7YiFXg5d92BWdbftFNk%3D&Expires=1777580764&AWSAccessKeyID=SANITIZED", "exists": true}' headers: Access-Control-Allow-Credentials: @@ -600,13 +412,13 @@ interactions: Connection: - keep-alive Content-Length: - - "190" + - "186" Content-Security-Policy: - default-src 'none' Content-Type: - application/json Expires: - - Wed, 08 Jan 2025 07:47:19 GMT + - Thu, 30 Apr 2026 20:20:04 GMT Pragma: - no-cache Strict-Transport-Security: @@ -623,7 +435,7 @@ interactions: X-Oauth-Scopes: - '*' X-Ratelimit-Limit: - - "1600" + - "1840" X-Xss-Protection: - 1; mode=block status: 200 OK @@ -639,7 +451,7 @@ interactions: - application/json User-Agent: - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/object-storage/buckets/us-east-1/go-bucket-test-def + url: https://api.linode.com/v4beta/object-storage/buckets/us-east/go-bucket-test-def method: DELETE response: body: '{}' @@ -667,7 +479,7 @@ interactions: Content-Type: - application/json Expires: - - Wed, 08 Jan 2025 07:47:22 GMT + - Thu, 30 Apr 2026 20:20:06 GMT Pragma: - no-cache Strict-Transport-Security: @@ -684,7 +496,7 @@ interactions: X-Oauth-Scopes: - '*' X-Ratelimit-Limit: - - "1600" + - "1840" X-Xss-Protection: - 1; mode=block status: 200 OK diff --git a/test/integration/fixtures/TestObjectStorageQuotaUsage_Get.yaml b/test/integration/fixtures/TestObjectStorageQuotaUsage_Get.yaml index 04a756093..e464dd380 100644 --- a/test/integration/fixtures/TestObjectStorageQuotaUsage_Get.yaml +++ b/test/integration/fixtures/TestObjectStorageQuotaUsage_Get.yaml @@ -39,7 +39,7 @@ interactions: Content-Type: - application/json Expires: - - Thu, 24 Apr 2025 17:38:48 GMT + - Thu, 30 Apr 2026 20:20:07 GMT Pragma: - no-cache Strict-Transport-Security: @@ -57,7 +57,7 @@ interactions: X-Oauth-Scopes: - '*' X-Ratelimit-Limit: - - "1600" + - "1840" X-Xss-Protection: - 1; mode=block status: 200 OK diff --git a/test/integration/fixtures/TestObjectStorageQuotas_Get.yaml b/test/integration/fixtures/TestObjectStorageQuotas_Get.yaml index ee0134099..ec1048429 100644 --- a/test/integration/fixtures/TestObjectStorageQuotas_Get.yaml +++ b/test/integration/fixtures/TestObjectStorageQuotas_Get.yaml @@ -14,10 +14,10 @@ interactions: url: https://api.linode.com/v4beta/object-storage/quotas/obj-objects-us-ord-1.linodeobjects.com method: GET response: - body: '{"quota_id": "obj-objects-us-ord-1.linodeobjects.com", "quota_name": "max_objects", - "endpoint_type": "E1", "s3_endpoint": "us-ord-1.linodeobjects.com", "description": - "Maximum number of objects this customer is allowed to have on this endpoint", - "quota_limit": 100000000, "resource_metric": "object", "quota_type": "obj-objects", + body: '{"quota_id": "obj-objects-us-ord-1.linodeobjects.com", "quota_name": "Number + of Objects", "quota_type": "obj-objects", "endpoint_type": "E1", "s3_endpoint": + "us-ord-1.linodeobjects.com", "description": "Current number of objects per + account, per endpoint", "quota_limit": 100000000, "resource_metric": "object", "has_usage": true}' headers: Access-Control-Allow-Credentials: @@ -37,13 +37,13 @@ interactions: Connection: - keep-alive Content-Length: - - "300" + - "330" Content-Security-Policy: - default-src 'none' Content-Type: - application/json Expires: - - Thu, 24 Apr 2025 17:38:46 GMT + - Thu, 30 Apr 2026 20:20:06 GMT Pragma: - no-cache Strict-Transport-Security: @@ -61,7 +61,7 @@ interactions: X-Oauth-Scopes: - '*' X-Ratelimit-Limit: - - "1600" + - "1840" X-Xss-Protection: - 1; mode=block status: 200 OK diff --git a/test/integration/fixtures/TestObjectStorageQuotas_List.yaml b/test/integration/fixtures/TestObjectStorageQuotas_List.yaml index 7941017e8..012e45f5d 100644 --- a/test/integration/fixtures/TestObjectStorageQuotas_List.yaml +++ b/test/integration/fixtures/TestObjectStorageQuotas_List.yaml @@ -14,29 +14,17 @@ interactions: url: https://api.linode.com/v4beta/object-storage/quotas?page=1 method: GET response: - body: '{"data": [{"quota_id": "obj-bytes-br-gru-1.linodeobjects.com", "quota_name": + body: '{"data": [{"quota_id": "obj-bytes-us-mia-1.linodeobjects.com", "quota_name": "Total Capacity", "quota_type": "obj-bytes", "endpoint_type": "E1", "s3_endpoint": - "br-gru-1.linodeobjects.com", "description": "Current total capacity per account, + "us-mia-1.linodeobjects.com", "description": "Current total capacity per account, per endpoint", "quota_limit": 109951162777600, "resource_metric": "byte", "has_usage": - true}, {"quota_id": "obj-objects-br-gru-1.linodeobjects.com", "quota_name": + true}, {"quota_id": "obj-objects-us-mia-1.linodeobjects.com", "quota_name": "Number of Objects", "quota_type": "obj-objects", "endpoint_type": "E1", "s3_endpoint": - "br-gru-1.linodeobjects.com", "description": "Current number of objects per + "us-mia-1.linodeobjects.com", "description": "Current number of objects per account, per endpoint", "quota_limit": 100000000, "resource_metric": "object", - "has_usage": true}, {"quota_id": "obj-buckets-br-gru-1.linodeobjects.com", "quota_name": + "has_usage": true}, {"quota_id": "obj-buckets-us-mia-1.linodeobjects.com", "quota_name": "Number of Buckets", "quota_type": "obj-buckets", "endpoint_type": "E1", "s3_endpoint": - "br-gru-1.linodeobjects.com", "description": "Current number of buckets per - account, per endpoint", "quota_limit": 1000, "resource_metric": "bucket", "has_usage": - true}, {"quota_id": "obj-bytes-us-sea-1.linodeobjects.com", "quota_name": "Total - Capacity", "quota_type": "obj-bytes", "endpoint_type": "E1", "s3_endpoint": - "us-sea-1.linodeobjects.com", "description": "Current total capacity per account, - per endpoint", "quota_limit": 109951162777600, "resource_metric": "byte", "has_usage": - true}, {"quota_id": "obj-objects-us-sea-1.linodeobjects.com", "quota_name": - "Number of Objects", "quota_type": "obj-objects", "endpoint_type": "E1", "s3_endpoint": - "us-sea-1.linodeobjects.com", "description": "Current number of objects per - account, per endpoint", "quota_limit": 100000000, "resource_metric": "object", - "has_usage": true}, {"quota_id": "obj-buckets-us-sea-1.linodeobjects.com", "quota_name": - "Number of Buckets", "quota_type": "obj-buckets", "endpoint_type": "E1", "s3_endpoint": - "us-sea-1.linodeobjects.com", "description": "Current number of buckets per + "us-mia-1.linodeobjects.com", "description": "Current number of buckets per account, per endpoint", "quota_limit": 1000, "resource_metric": "bucket", "has_usage": true}, {"quota_id": "obj-bytes-id-cgk-1.linodeobjects.com", "quota_name": "Total Capacity", "quota_type": "obj-bytes", "endpoint_type": "E1", "s3_endpoint": @@ -50,41 +38,17 @@ interactions: "Number of Buckets", "quota_type": "obj-buckets", "endpoint_type": "E1", "s3_endpoint": "id-cgk-1.linodeobjects.com", "description": "Current number of buckets per account, per endpoint", "quota_limit": 1000, "resource_metric": "bucket", "has_usage": - true}, {"quota_id": "obj-bytes-us-iad-1.linodeobjects.com", "quota_name": "Total - Capacity", "quota_type": "obj-bytes", "endpoint_type": "E1", "s3_endpoint": - "us-iad-1.linodeobjects.com", "description": "Current total capacity per account, - per endpoint", "quota_limit": 109951162777600, "resource_metric": "byte", "has_usage": - true}, {"quota_id": "obj-objects-us-iad-1.linodeobjects.com", "quota_name": - "Number of Objects", "quota_type": "obj-objects", "endpoint_type": "E1", "s3_endpoint": - "us-iad-1.linodeobjects.com", "description": "Current number of objects per - account, per endpoint", "quota_limit": 100000000, "resource_metric": "object", - "has_usage": true}, {"quota_id": "obj-buckets-us-iad-1.linodeobjects.com", "quota_name": - "Number of Buckets", "quota_type": "obj-buckets", "endpoint_type": "E1", "s3_endpoint": - "us-iad-1.linodeobjects.com", "description": "Current number of buckets per - account, per endpoint", "quota_limit": 1000, "resource_metric": "bucket", "has_usage": - true}, {"quota_id": "obj-bytes-es-mad-1.linodeobjects.com", "quota_name": "Total + true}, {"quota_id": "obj-bytes-br-gru-1.linodeobjects.com", "quota_name": "Total Capacity", "quota_type": "obj-bytes", "endpoint_type": "E1", "s3_endpoint": - "es-mad-1.linodeobjects.com", "description": "Current total capacity per account, + "br-gru-1.linodeobjects.com", "description": "Current total capacity per account, per endpoint", "quota_limit": 109951162777600, "resource_metric": "byte", "has_usage": - true}, {"quota_id": "obj-objects-es-mad-1.linodeobjects.com", "quota_name": + true}, {"quota_id": "obj-objects-br-gru-1.linodeobjects.com", "quota_name": "Number of Objects", "quota_type": "obj-objects", "endpoint_type": "E1", "s3_endpoint": - "es-mad-1.linodeobjects.com", "description": "Current number of objects per + "br-gru-1.linodeobjects.com", "description": "Current number of objects per account, per endpoint", "quota_limit": 100000000, "resource_metric": "object", - "has_usage": true}, {"quota_id": "obj-buckets-es-mad-1.linodeobjects.com", "quota_name": + "has_usage": true}, {"quota_id": "obj-buckets-br-gru-1.linodeobjects.com", "quota_name": "Number of Buckets", "quota_type": "obj-buckets", "endpoint_type": "E1", "s3_endpoint": - "es-mad-1.linodeobjects.com", "description": "Current number of buckets per - account, per endpoint", "quota_limit": 1000, "resource_metric": "bucket", "has_usage": - true}, {"quota_id": "obj-bytes-no-osl-1.linodeobjects.com", "quota_name": "Total - Capacity", "quota_type": "obj-bytes", "endpoint_type": "E2", "s3_endpoint": - "no-osl-1.linodeobjects.com", "description": "Current total capacity per account, - per endpoint", "quota_limit": 109951162777600, "resource_metric": "byte", "has_usage": - true}, {"quota_id": "obj-objects-no-osl-1.linodeobjects.com", "quota_name": - "Number of Objects", "quota_type": "obj-objects", "endpoint_type": "E2", "s3_endpoint": - "no-osl-1.linodeobjects.com", "description": "Current number of objects per - account, per endpoint", "quota_limit": 100000000, "resource_metric": "object", - "has_usage": true}, {"quota_id": "obj-buckets-no-osl-1.linodeobjects.com", "quota_name": - "Number of Buckets", "quota_type": "obj-buckets", "endpoint_type": "E2", "s3_endpoint": - "no-osl-1.linodeobjects.com", "description": "Current number of buckets per + "br-gru-1.linodeobjects.com", "description": "Current number of buckets per account, per endpoint", "quota_limit": 1000, "resource_metric": "bucket", "has_usage": true}, {"quota_id": "obj-bytes-us-ord-1.linodeobjects.com", "quota_name": "Total Capacity", "quota_type": "obj-bytes", "endpoint_type": "E1", "s3_endpoint": @@ -98,115 +62,145 @@ interactions: "Number of Buckets", "quota_type": "obj-buckets", "endpoint_type": "E1", "s3_endpoint": "us-ord-1.linodeobjects.com", "description": "Current number of buckets per account, per endpoint", "quota_limit": 1000, "resource_metric": "bucket", "has_usage": - true}, {"quota_id": "obj-bytes-us-lax-1.linodeobjects.com", "quota_name": "Total + true}, {"quota_id": "obj-bytes-se-sto-1.linodeobjects.com", "quota_name": "Total Capacity", "quota_type": "obj-bytes", "endpoint_type": "E1", "s3_endpoint": - "us-lax-1.linodeobjects.com", "description": "Current total capacity per account, + "se-sto-1.linodeobjects.com", "description": "Current total capacity per account, per endpoint", "quota_limit": 109951162777600, "resource_metric": "byte", "has_usage": - true}, {"quota_id": "obj-objects-us-lax-1.linodeobjects.com", "quota_name": + true}, {"quota_id": "obj-objects-se-sto-1.linodeobjects.com", "quota_name": "Number of Objects", "quota_type": "obj-objects", "endpoint_type": "E1", "s3_endpoint": - "us-lax-1.linodeobjects.com", "description": "Current number of objects per + "se-sto-1.linodeobjects.com", "description": "Current number of objects per account, per endpoint", "quota_limit": 100000000, "resource_metric": "object", - "has_usage": true}, {"quota_id": "obj-buckets-us-lax-1.linodeobjects.com", "quota_name": + "has_usage": true}, {"quota_id": "obj-buckets-se-sto-1.linodeobjects.com", "quota_name": "Number of Buckets", "quota_type": "obj-buckets", "endpoint_type": "E1", "s3_endpoint": - "us-lax-1.linodeobjects.com", "description": "Current number of buckets per + "se-sto-1.linodeobjects.com", "description": "Current number of buckets per account, per endpoint", "quota_limit": 1000, "resource_metric": "bucket", "has_usage": - true}, {"quota_id": "obj-bytes-it-mil-1.linodeobjects.com", "quota_name": "Total + true}, {"quota_id": "obj-bytes-jp-osa-1.linodeobjects.com", "quota_name": "Total Capacity", "quota_type": "obj-bytes", "endpoint_type": "E1", "s3_endpoint": - "it-mil-1.linodeobjects.com", "description": "Current total capacity per account, + "jp-osa-1.linodeobjects.com", "description": "Current total capacity per account, per endpoint", "quota_limit": 109951162777600, "resource_metric": "byte", "has_usage": - true}, {"quota_id": "obj-objects-it-mil-1.linodeobjects.com", "quota_name": + true}, {"quota_id": "obj-objects-jp-osa-1.linodeobjects.com", "quota_name": "Number of Objects", "quota_type": "obj-objects", "endpoint_type": "E1", "s3_endpoint": - "it-mil-1.linodeobjects.com", "description": "Current number of objects per + "jp-osa-1.linodeobjects.com", "description": "Current number of objects per account, per endpoint", "quota_limit": 100000000, "resource_metric": "object", - "has_usage": true}, {"quota_id": "obj-buckets-it-mil-1.linodeobjects.com", "quota_name": + "has_usage": true}, {"quota_id": "obj-buckets-jp-osa-1.linodeobjects.com", "quota_name": "Number of Buckets", "quota_type": "obj-buckets", "endpoint_type": "E1", "s3_endpoint": - "it-mil-1.linodeobjects.com", "description": "Current number of buckets per + "jp-osa-1.linodeobjects.com", "description": "Current number of buckets per account, per endpoint", "quota_limit": 1000, "resource_metric": "bucket", "has_usage": - true}, {"quota_id": "obj-bytes-us-southeast-1.linodeobjects.com", "quota_name": - "Total Capacity", "quota_type": "obj-bytes", "endpoint_type": "E0", "s3_endpoint": - "us-southeast-1.linodeobjects.com", "description": "Current total capacity per - account, per endpoint", "quota_limit": 5497558138880, "resource_metric": "byte", - "has_usage": true}, {"quota_id": "obj-objects-us-southeast-1.linodeobjects.com", - "quota_name": "Number of Objects", "quota_type": "obj-objects", "endpoint_type": - "E0", "s3_endpoint": "us-southeast-1.linodeobjects.com", "description": "Current - number of objects per account, per endpoint", "quota_limit": 50000000, "resource_metric": - "object", "has_usage": true}, {"quota_id": "obj-buckets-us-southeast-1.linodeobjects.com", - "quota_name": "Number of Buckets", "quota_type": "obj-buckets", "endpoint_type": - "E0", "s3_endpoint": "us-southeast-1.linodeobjects.com", "description": "Current - number of buckets per account, per endpoint", "quota_limit": 1000, "resource_metric": - "bucket", "has_usage": true}, {"quota_id": "obj-bytes-ap-south-1.linodeobjects.com", - "quota_name": "Total Capacity", "quota_type": "obj-bytes", "endpoint_type": - "E0", "s3_endpoint": "ap-south-1.linodeobjects.com", "description": "Current - total capacity per account, per endpoint", "quota_limit": 5497558138880, "resource_metric": - "byte", "has_usage": true}, {"quota_id": "obj-objects-ap-south-1.linodeobjects.com", - "quota_name": "Number of Objects", "quota_type": "obj-objects", "endpoint_type": - "E0", "s3_endpoint": "ap-south-1.linodeobjects.com", "description": "Current - number of objects per account, per endpoint", "quota_limit": 50000000, "resource_metric": - "object", "has_usage": true}, {"quota_id": "obj-buckets-ap-south-1.linodeobjects.com", - "quota_name": "Number of Buckets", "quota_type": "obj-buckets", "endpoint_type": - "E0", "s3_endpoint": "ap-south-1.linodeobjects.com", "description": "Current - number of buckets per account, per endpoint", "quota_limit": 1000, "resource_metric": - "bucket", "has_usage": true}, {"quota_id": "obj-bytes-jp-osa-1.linodeobjects.com", + true}, {"quota_id": "obj-bytes-nl-ams-1.linodeobjects.com", "quota_name": "Total + Capacity", "quota_type": "obj-bytes", "endpoint_type": "E1", "s3_endpoint": + "nl-ams-1.linodeobjects.com", "description": "Current total capacity per account, + per endpoint", "quota_limit": 109951162777600, "resource_metric": "byte", "has_usage": + true}, {"quota_id": "obj-objects-nl-ams-1.linodeobjects.com", "quota_name": + "Number of Objects", "quota_type": "obj-objects", "endpoint_type": "E1", "s3_endpoint": + "nl-ams-1.linodeobjects.com", "description": "Current number of objects per + account, per endpoint", "quota_limit": 100000000, "resource_metric": "object", + "has_usage": true}, {"quota_id": "obj-buckets-nl-ams-1.linodeobjects.com", "quota_name": + "Number of Buckets", "quota_type": "obj-buckets", "endpoint_type": "E1", "s3_endpoint": + "nl-ams-1.linodeobjects.com", "description": "Current number of buckets per + account, per endpoint", "quota_limit": 1000, "resource_metric": "bucket", "has_usage": + true}, {"quota_id": "obj-bytes-us-lax-4.linodeobjects.com", "quota_name": "Total + Capacity", "quota_type": "obj-bytes", "endpoint_type": "E3", "s3_endpoint": + "us-lax-4.linodeobjects.com", "description": "Current total capacity per account, + per endpoint", "quota_limit": 549755813888000, "resource_metric": "byte", "has_usage": + true}, {"quota_id": "obj-objects-us-lax-4.linodeobjects.com", "quota_name": + "Number of Objects", "quota_type": "obj-objects", "endpoint_type": "E3", "s3_endpoint": + "us-lax-4.linodeobjects.com", "description": "Current number of objects per + account, per endpoint", "quota_limit": 500000000, "resource_metric": "object", + "has_usage": true}, {"quota_id": "obj-buckets-us-lax-4.linodeobjects.com", "quota_name": + "Number of Buckets", "quota_type": "obj-buckets", "endpoint_type": "E3", "s3_endpoint": + "us-lax-4.linodeobjects.com", "description": "Current number of buckets per + account, per endpoint", "quota_limit": 1000, "resource_metric": "bucket", "has_usage": + true}, {"quota_id": "obj-total-ingress-throughput-us-lax-4.linodeobjects.com", + "quota_name": "Ingress Throughput (per endpoint)", "quota_type": "obj-total-ingress-throughput", + "endpoint_type": "E3", "s3_endpoint": "us-lax-4.linodeobjects.com", "description": + "Current total ingress bandwidth per account, per endpoint", "quota_limit": + 1250000000, "resource_metric": "byte_per_second", "has_usage": false}, {"quota_id": + "obj-total-egress-throughput-us-lax-4.linodeobjects.com", "quota_name": "Egress + Throughput (per endpoint)", "quota_type": "obj-total-egress-throughput", "endpoint_type": + "E3", "s3_endpoint": "us-lax-4.linodeobjects.com", "description": "Current total + egress bandwidth per account, per endpoint", "quota_limit": 1250000000, "resource_metric": + "byte_per_second", "has_usage": false}, {"quota_id": "obj-per-ip-ingress-throughput-us-lax-4.linodeobjects.com", + "quota_name": "Ingress Throughput (per IP)", "quota_type": "obj-per-ip-ingress-throughput", + "endpoint_type": "E3", "s3_endpoint": "us-lax-4.linodeobjects.com", "description": + "Current ingress bandwidth per account, per destination IP address", "quota_limit": + 156250000, "resource_metric": "byte_per_second", "has_usage": false}, {"quota_id": + "obj-per-ip-egress-throughput-us-lax-4.linodeobjects.com", "quota_name": "Egress + Throughput (per IP)", "quota_type": "obj-per-ip-egress-throughput", "endpoint_type": + "E3", "s3_endpoint": "us-lax-4.linodeobjects.com", "description": "Current egress + bandwidth per account, per destination IP address", "quota_limit": 250000000, + "resource_metric": "byte_per_second", "has_usage": false}, {"quota_id": "obj-bytes-au-mel-1.linodeobjects.com", "quota_name": "Total Capacity", "quota_type": "obj-bytes", "endpoint_type": - "E1", "s3_endpoint": "jp-osa-1.linodeobjects.com", "description": "Current total + "E2", "s3_endpoint": "au-mel-1.linodeobjects.com", "description": "Current total capacity per account, per endpoint", "quota_limit": 109951162777600, "resource_metric": - "byte", "has_usage": true}, {"quota_id": "obj-objects-jp-osa-1.linodeobjects.com", + "byte", "has_usage": true}, {"quota_id": "obj-objects-au-mel-1.linodeobjects.com", "quota_name": "Number of Objects", "quota_type": "obj-objects", "endpoint_type": - "E1", "s3_endpoint": "jp-osa-1.linodeobjects.com", "description": "Current number + "E2", "s3_endpoint": "au-mel-1.linodeobjects.com", "description": "Current number of objects per account, per endpoint", "quota_limit": 100000000, "resource_metric": - "object", "has_usage": true}, {"quota_id": "obj-buckets-jp-osa-1.linodeobjects.com", + "object", "has_usage": true}, {"quota_id": "obj-buckets-au-mel-1.linodeobjects.com", "quota_name": "Number of Buckets", "quota_type": "obj-buckets", "endpoint_type": - "E1", "s3_endpoint": "jp-osa-1.linodeobjects.com", "description": "Current number + "E2", "s3_endpoint": "au-mel-1.linodeobjects.com", "description": "Current number of buckets per account, per endpoint", "quota_limit": 1000, "resource_metric": - "bucket", "has_usage": true}, {"quota_id": "obj-bytes-us-east-1.linodeobjects.com", + "bucket", "has_usage": true}, {"quota_id": "obj-total-ingress-throughput-au-mel-1.linodeobjects.com", + "quota_name": "Ingress Throughput (per endpoint)", "quota_type": "obj-total-ingress-throughput", + "endpoint_type": "E2", "s3_endpoint": "au-mel-1.linodeobjects.com", "description": + "Current total ingress bandwidth per account, per endpoint", "quota_limit": + 1250000000, "resource_metric": "byte_per_second", "has_usage": false}, {"quota_id": + "obj-total-egress-throughput-au-mel-1.linodeobjects.com", "quota_name": "Egress + Throughput (per endpoint)", "quota_type": "obj-total-egress-throughput", "endpoint_type": + "E2", "s3_endpoint": "au-mel-1.linodeobjects.com", "description": "Current total + egress bandwidth per account, per endpoint", "quota_limit": 1250000000, "resource_metric": + "byte_per_second", "has_usage": false}, {"quota_id": "obj-per-ip-ingress-throughput-au-mel-1.linodeobjects.com", + "quota_name": "Ingress Throughput (per IP)", "quota_type": "obj-per-ip-ingress-throughput", + "endpoint_type": "E2", "s3_endpoint": "au-mel-1.linodeobjects.com", "description": + "Current ingress bandwidth per account, per destination IP address", "quota_limit": + 156250000, "resource_metric": "byte_per_second", "has_usage": false}, {"quota_id": + "obj-per-ip-egress-throughput-au-mel-1.linodeobjects.com", "quota_name": "Egress + Throughput (per IP)", "quota_type": "obj-per-ip-egress-throughput", "endpoint_type": + "E2", "s3_endpoint": "au-mel-1.linodeobjects.com", "description": "Current egress + bandwidth per account, per destination IP address", "quota_limit": 250000000, + "resource_metric": "byte_per_second", "has_usage": false}, {"quota_id": "obj-bytes-eu-central-1.linodeobjects.com", "quota_name": "Total Capacity", "quota_type": "obj-bytes", "endpoint_type": - "E0", "s3_endpoint": "us-east-1.linodeobjects.com", "description": "Current + "E0", "s3_endpoint": "eu-central-1.linodeobjects.com", "description": "Current total capacity per account, per endpoint", "quota_limit": 5497558138880, "resource_metric": - "byte", "has_usage": true}, {"quota_id": "obj-objects-us-east-1.linodeobjects.com", + "byte", "has_usage": true}, {"quota_id": "obj-objects-eu-central-1.linodeobjects.com", "quota_name": "Number of Objects", "quota_type": "obj-objects", "endpoint_type": - "E0", "s3_endpoint": "us-east-1.linodeobjects.com", "description": "Current + "E0", "s3_endpoint": "eu-central-1.linodeobjects.com", "description": "Current number of objects per account, per endpoint", "quota_limit": 50000000, "resource_metric": - "object", "has_usage": true}, {"quota_id": "obj-buckets-us-east-1.linodeobjects.com", + "object", "has_usage": true}, {"quota_id": "obj-buckets-eu-central-1.linodeobjects.com", "quota_name": "Number of Buckets", "quota_type": "obj-buckets", "endpoint_type": - "E0", "s3_endpoint": "us-east-1.linodeobjects.com", "description": "Current + "E0", "s3_endpoint": "eu-central-1.linodeobjects.com", "description": "Current number of buckets per account, per endpoint", "quota_limit": 1000, "resource_metric": - "bucket", "has_usage": true}, {"quota_id": "obj-bytes-fr-par-1.linodeobjects.com", - "quota_name": "Total Capacity", "quota_type": "obj-bytes", "endpoint_type": - "E1", "s3_endpoint": "fr-par-1.linodeobjects.com", "description": "Current total - capacity per account, per endpoint", "quota_limit": 109951162777600, "resource_metric": - "byte", "has_usage": true}, {"quota_id": "obj-objects-fr-par-1.linodeobjects.com", - "quota_name": "Number of Objects", "quota_type": "obj-objects", "endpoint_type": - "E1", "s3_endpoint": "fr-par-1.linodeobjects.com", "description": "Current number - of objects per account, per endpoint", "quota_limit": 100000000, "resource_metric": - "object", "has_usage": true}, {"quota_id": "obj-buckets-fr-par-1.linodeobjects.com", - "quota_name": "Number of Buckets", "quota_type": "obj-buckets", "endpoint_type": - "E1", "s3_endpoint": "fr-par-1.linodeobjects.com", "description": "Current number - of buckets per account, per endpoint", "quota_limit": 1000, "resource_metric": - "bucket", "has_usage": true}, {"quota_id": "obj-bytes-se-sto-1.linodeobjects.com", - "quota_name": "Total Capacity", "quota_type": "obj-bytes", "endpoint_type": - "E1", "s3_endpoint": "se-sto-1.linodeobjects.com", "description": "Current total - capacity per account, per endpoint", "quota_limit": 109951162777600, "resource_metric": - "byte", "has_usage": true}, {"quota_id": "obj-objects-se-sto-1.linodeobjects.com", - "quota_name": "Number of Objects", "quota_type": "obj-objects", "endpoint_type": - "E1", "s3_endpoint": "se-sto-1.linodeobjects.com", "description": "Current number - of objects per account, per endpoint", "quota_limit": 100000000, "resource_metric": - "object", "has_usage": true}, {"quota_id": "obj-buckets-se-sto-1.linodeobjects.com", - "quota_name": "Number of Buckets", "quota_type": "obj-buckets", "endpoint_type": - "E1", "s3_endpoint": "se-sto-1.linodeobjects.com", "description": "Current number - of buckets per account, per endpoint", "quota_limit": 1000, "resource_metric": - "bucket", "has_usage": true}, {"quota_id": "obj-bytes-nl-ams-1.linodeobjects.com", + "bucket", "has_usage": true}, {"quota_id": "obj-bytes-us-ord-10.linodeobjects.com", "quota_name": "Total Capacity", "quota_type": "obj-bytes", "endpoint_type": - "E1", "s3_endpoint": "nl-ams-1.linodeobjects.com", "description": "Current total - capacity per account, per endpoint", "quota_limit": 109951162777600, "resource_metric": - "byte", "has_usage": true}, {"quota_id": "obj-objects-nl-ams-1.linodeobjects.com", + "E3", "s3_endpoint": "us-ord-10.linodeobjects.com", "description": "Current + total capacity per account, per endpoint", "quota_limit": 549755813888000, "resource_metric": + "byte", "has_usage": true}, {"quota_id": "obj-objects-us-ord-10.linodeobjects.com", "quota_name": "Number of Objects", "quota_type": "obj-objects", "endpoint_type": - "E1", "s3_endpoint": "nl-ams-1.linodeobjects.com", "description": "Current number - of objects per account, per endpoint", "quota_limit": 100000000, "resource_metric": - "object", "has_usage": true}, {"quota_id": "obj-buckets-nl-ams-1.linodeobjects.com", + "E3", "s3_endpoint": "us-ord-10.linodeobjects.com", "description": "Current + number of objects per account, per endpoint", "quota_limit": 500000000, "resource_metric": + "object", "has_usage": true}, {"quota_id": "obj-buckets-us-ord-10.linodeobjects.com", "quota_name": "Number of Buckets", "quota_type": "obj-buckets", "endpoint_type": - "E1", "s3_endpoint": "nl-ams-1.linodeobjects.com", "description": "Current number - of buckets per account, per endpoint", "quota_limit": 1000, "resource_metric": - "bucket", "has_usage": true}, {"quota_id": "obj-bytes-gb-lon-1.linodeobjects.com", + "E3", "s3_endpoint": "us-ord-10.linodeobjects.com", "description": "Current + number of buckets per account, per endpoint", "quota_limit": 1000, "resource_metric": + "bucket", "has_usage": true}, {"quota_id": "obj-total-ingress-throughput-us-ord-10.linodeobjects.com", + "quota_name": "Ingress Throughput (per endpoint)", "quota_type": "obj-total-ingress-throughput", + "endpoint_type": "E3", "s3_endpoint": "us-ord-10.linodeobjects.com", "description": + "Current total ingress bandwidth per account, per endpoint", "quota_limit": + 1250000000, "resource_metric": "byte_per_second", "has_usage": false}, {"quota_id": + "obj-total-egress-throughput-us-ord-10.linodeobjects.com", "quota_name": "Egress + Throughput (per endpoint)", "quota_type": "obj-total-egress-throughput", "endpoint_type": + "E3", "s3_endpoint": "us-ord-10.linodeobjects.com", "description": "Current + total egress bandwidth per account, per endpoint", "quota_limit": 1250000000, + "resource_metric": "byte_per_second", "has_usage": false}, {"quota_id": "obj-per-ip-ingress-throughput-us-ord-10.linodeobjects.com", + "quota_name": "Ingress Throughput (per IP)", "quota_type": "obj-per-ip-ingress-throughput", + "endpoint_type": "E3", "s3_endpoint": "us-ord-10.linodeobjects.com", "description": + "Current ingress bandwidth per account, per destination IP address", "quota_limit": + 156250000, "resource_metric": "byte_per_second", "has_usage": false}, {"quota_id": + "obj-per-ip-egress-throughput-us-ord-10.linodeobjects.com", "quota_name": "Egress + Throughput (per IP)", "quota_type": "obj-per-ip-egress-throughput", "endpoint_type": + "E3", "s3_endpoint": "us-ord-10.linodeobjects.com", "description": "Current + egress bandwidth per account, per destination IP address", "quota_limit": 250000000, + "resource_metric": "byte_per_second", "has_usage": false}, {"quota_id": "obj-bytes-gb-lon-1.linodeobjects.com", "quota_name": "Total Capacity", "quota_type": "obj-bytes", "endpoint_type": "E3", "s3_endpoint": "gb-lon-1.linodeobjects.com", "description": "Current total capacity per account, per endpoint", "quota_limit": 549755813888000, "resource_metric": @@ -218,19 +212,25 @@ interactions: "quota_name": "Number of Buckets", "quota_type": "obj-buckets", "endpoint_type": "E3", "s3_endpoint": "gb-lon-1.linodeobjects.com", "description": "Current number of buckets per account, per endpoint", "quota_limit": 1000, "resource_metric": - "bucket", "has_usage": true}, {"quota_id": "obj-bytes-au-mel-1.linodeobjects.com", - "quota_name": "Total Capacity", "quota_type": "obj-bytes", "endpoint_type": - "E2", "s3_endpoint": "au-mel-1.linodeobjects.com", "description": "Current total - capacity per account, per endpoint", "quota_limit": 109951162777600, "resource_metric": - "byte", "has_usage": true}, {"quota_id": "obj-objects-au-mel-1.linodeobjects.com", - "quota_name": "Number of Objects", "quota_type": "obj-objects", "endpoint_type": - "E2", "s3_endpoint": "au-mel-1.linodeobjects.com", "description": "Current number - of objects per account, per endpoint", "quota_limit": 100000000, "resource_metric": - "object", "has_usage": true}, {"quota_id": "obj-buckets-au-mel-1.linodeobjects.com", - "quota_name": "Number of Buckets", "quota_type": "obj-buckets", "endpoint_type": - "E2", "s3_endpoint": "au-mel-1.linodeobjects.com", "description": "Current number - of buckets per account, per endpoint", "quota_limit": 1000, "resource_metric": - "bucket", "has_usage": true}, {"quota_id": "obj-bytes-in-maa-1.linodeobjects.com", + "bucket", "has_usage": true}, {"quota_id": "obj-total-ingress-throughput-gb-lon-1.linodeobjects.com", + "quota_name": "Ingress Throughput (per endpoint)", "quota_type": "obj-total-ingress-throughput", + "endpoint_type": "E3", "s3_endpoint": "gb-lon-1.linodeobjects.com", "description": + "Current total ingress bandwidth per account, per endpoint", "quota_limit": + 1250000000, "resource_metric": "byte_per_second", "has_usage": false}, {"quota_id": + "obj-total-egress-throughput-gb-lon-1.linodeobjects.com", "quota_name": "Egress + Throughput (per endpoint)", "quota_type": "obj-total-egress-throughput", "endpoint_type": + "E3", "s3_endpoint": "gb-lon-1.linodeobjects.com", "description": "Current total + egress bandwidth per account, per endpoint", "quota_limit": 1250000000, "resource_metric": + "byte_per_second", "has_usage": false}, {"quota_id": "obj-per-ip-ingress-throughput-gb-lon-1.linodeobjects.com", + "quota_name": "Ingress Throughput (per IP)", "quota_type": "obj-per-ip-ingress-throughput", + "endpoint_type": "E3", "s3_endpoint": "gb-lon-1.linodeobjects.com", "description": + "Current ingress bandwidth per account, per destination IP address", "quota_limit": + 156250000, "resource_metric": "byte_per_second", "has_usage": false}, {"quota_id": + "obj-per-ip-egress-throughput-gb-lon-1.linodeobjects.com", "quota_name": "Egress + Throughput (per IP)", "quota_type": "obj-per-ip-egress-throughput", "endpoint_type": + "E3", "s3_endpoint": "gb-lon-1.linodeobjects.com", "description": "Current egress + bandwidth per account, per destination IP address", "quota_limit": 250000000, + "resource_metric": "byte_per_second", "has_usage": false}, {"quota_id": "obj-bytes-in-maa-1.linodeobjects.com", "quota_name": "Total Capacity", "quota_type": "obj-bytes", "endpoint_type": "E1", "s3_endpoint": "in-maa-1.linodeobjects.com", "description": "Current total capacity per account, per endpoint", "quota_limit": 109951162777600, "resource_metric": @@ -242,42 +242,90 @@ interactions: "quota_name": "Number of Buckets", "quota_type": "obj-buckets", "endpoint_type": "E1", "s3_endpoint": "in-maa-1.linodeobjects.com", "description": "Current number of buckets per account, per endpoint", "quota_limit": 1000, "resource_metric": - "bucket", "has_usage": true}, {"quota_id": "obj-bytes-jp-tyo-1.linodeobjects.com", + "bucket", "has_usage": true}, {"quota_id": "obj-bytes-de-fra-1.linodeobjects.com", + "quota_name": "Total Capacity", "quota_type": "obj-bytes", "endpoint_type": + "E3", "s3_endpoint": "de-fra-1.linodeobjects.com", "description": "Current total + capacity per account, per endpoint", "quota_limit": 549755813888000, "resource_metric": + "byte", "has_usage": true}, {"quota_id": "obj-objects-de-fra-1.linodeobjects.com", + "quota_name": "Number of Objects", "quota_type": "obj-objects", "endpoint_type": + "E3", "s3_endpoint": "de-fra-1.linodeobjects.com", "description": "Current number + of objects per account, per endpoint", "quota_limit": 500000000, "resource_metric": + "object", "has_usage": true}, {"quota_id": "obj-buckets-de-fra-1.linodeobjects.com", + "quota_name": "Number of Buckets", "quota_type": "obj-buckets", "endpoint_type": + "E3", "s3_endpoint": "de-fra-1.linodeobjects.com", "description": "Current number + of buckets per account, per endpoint", "quota_limit": 1000, "resource_metric": + "bucket", "has_usage": true}, {"quota_id": "obj-total-ingress-throughput-de-fra-1.linodeobjects.com", + "quota_name": "Ingress Throughput (per endpoint)", "quota_type": "obj-total-ingress-throughput", + "endpoint_type": "E3", "s3_endpoint": "de-fra-1.linodeobjects.com", "description": + "Current total ingress bandwidth per account, per endpoint", "quota_limit": + 1250000000, "resource_metric": "byte_per_second", "has_usage": false}, {"quota_id": + "obj-total-egress-throughput-de-fra-1.linodeobjects.com", "quota_name": "Egress + Throughput (per endpoint)", "quota_type": "obj-total-egress-throughput", "endpoint_type": + "E3", "s3_endpoint": "de-fra-1.linodeobjects.com", "description": "Current total + egress bandwidth per account, per endpoint", "quota_limit": 1250000000, "resource_metric": + "byte_per_second", "has_usage": false}, {"quota_id": "obj-per-ip-ingress-throughput-de-fra-1.linodeobjects.com", + "quota_name": "Ingress Throughput (per IP)", "quota_type": "obj-per-ip-ingress-throughput", + "endpoint_type": "E3", "s3_endpoint": "de-fra-1.linodeobjects.com", "description": + "Current ingress bandwidth per account, per destination IP address", "quota_limit": + 156250000, "resource_metric": "byte_per_second", "has_usage": false}, {"quota_id": + "obj-per-ip-egress-throughput-de-fra-1.linodeobjects.com", "quota_name": "Egress + Throughput (per IP)", "quota_type": "obj-per-ip-egress-throughput", "endpoint_type": + "E3", "s3_endpoint": "de-fra-1.linodeobjects.com", "description": "Current egress + bandwidth per account, per destination IP address", "quota_limit": 250000000, + "resource_metric": "byte_per_second", "has_usage": false}, {"quota_id": "obj-bytes-it-mil-1.linodeobjects.com", "quota_name": "Total Capacity", "quota_type": "obj-bytes", "endpoint_type": - "E2", "s3_endpoint": "jp-tyo-1.linodeobjects.com", "description": "Current total + "E1", "s3_endpoint": "it-mil-1.linodeobjects.com", "description": "Current total capacity per account, per endpoint", "quota_limit": 109951162777600, "resource_metric": - "byte", "has_usage": true}, {"quota_id": "obj-objects-jp-tyo-1.linodeobjects.com", + "byte", "has_usage": true}, {"quota_id": "obj-objects-it-mil-1.linodeobjects.com", "quota_name": "Number of Objects", "quota_type": "obj-objects", "endpoint_type": - "E2", "s3_endpoint": "jp-tyo-1.linodeobjects.com", "description": "Current number + "E1", "s3_endpoint": "it-mil-1.linodeobjects.com", "description": "Current number of objects per account, per endpoint", "quota_limit": 100000000, "resource_metric": - "object", "has_usage": true}, {"quota_id": "obj-buckets-jp-tyo-1.linodeobjects.com", + "object", "has_usage": true}, {"quota_id": "obj-buckets-it-mil-1.linodeobjects.com", "quota_name": "Number of Buckets", "quota_type": "obj-buckets", "endpoint_type": - "E2", "s3_endpoint": "jp-tyo-1.linodeobjects.com", "description": "Current number + "E1", "s3_endpoint": "it-mil-1.linodeobjects.com", "description": "Current number of buckets per account, per endpoint", "quota_limit": 1000, "resource_metric": - "bucket", "has_usage": true}, {"quota_id": "obj-bytes-us-lax-4.linodeobjects.com", + "bucket", "has_usage": true}, {"quota_id": "obj-bytes-jp-tyo-1.linodeobjects.com", "quota_name": "Total Capacity", "quota_type": "obj-bytes", "endpoint_type": - "E3", "s3_endpoint": "us-lax-4.linodeobjects.com", "description": "Current total + "E3", "s3_endpoint": "jp-tyo-1.linodeobjects.com", "description": "Current total capacity per account, per endpoint", "quota_limit": 549755813888000, "resource_metric": - "byte", "has_usage": true}, {"quota_id": "obj-objects-us-lax-4.linodeobjects.com", + "byte", "has_usage": true}, {"quota_id": "obj-objects-jp-tyo-1.linodeobjects.com", "quota_name": "Number of Objects", "quota_type": "obj-objects", "endpoint_type": - "E3", "s3_endpoint": "us-lax-4.linodeobjects.com", "description": "Current number + "E3", "s3_endpoint": "jp-tyo-1.linodeobjects.com", "description": "Current number of objects per account, per endpoint", "quota_limit": 500000000, "resource_metric": - "object", "has_usage": true}, {"quota_id": "obj-buckets-us-lax-4.linodeobjects.com", + "object", "has_usage": true}, {"quota_id": "obj-buckets-jp-tyo-1.linodeobjects.com", "quota_name": "Number of Buckets", "quota_type": "obj-buckets", "endpoint_type": - "E3", "s3_endpoint": "us-lax-4.linodeobjects.com", "description": "Current number + "E3", "s3_endpoint": "jp-tyo-1.linodeobjects.com", "description": "Current number of buckets per account, per endpoint", "quota_limit": 1000, "resource_metric": - "bucket", "has_usage": true}, {"quota_id": "obj-bytes-us-mia-1.linodeobjects.com", + "bucket", "has_usage": true}, {"quota_id": "obj-total-ingress-throughput-jp-tyo-1.linodeobjects.com", + "quota_name": "Ingress Throughput (per endpoint)", "quota_type": "obj-total-ingress-throughput", + "endpoint_type": "E3", "s3_endpoint": "jp-tyo-1.linodeobjects.com", "description": + "Current total ingress bandwidth per account, per endpoint", "quota_limit": + 1250000000, "resource_metric": "byte_per_second", "has_usage": false}, {"quota_id": + "obj-total-egress-throughput-jp-tyo-1.linodeobjects.com", "quota_name": "Egress + Throughput (per endpoint)", "quota_type": "obj-total-egress-throughput", "endpoint_type": + "E3", "s3_endpoint": "jp-tyo-1.linodeobjects.com", "description": "Current total + egress bandwidth per account, per endpoint", "quota_limit": 1250000000, "resource_metric": + "byte_per_second", "has_usage": false}, {"quota_id": "obj-per-ip-ingress-throughput-jp-tyo-1.linodeobjects.com", + "quota_name": "Ingress Throughput (per IP)", "quota_type": "obj-per-ip-ingress-throughput", + "endpoint_type": "E3", "s3_endpoint": "jp-tyo-1.linodeobjects.com", "description": + "Current ingress bandwidth per account, per destination IP address", "quota_limit": + 156250000, "resource_metric": "byte_per_second", "has_usage": false}, {"quota_id": + "obj-per-ip-egress-throughput-jp-tyo-1.linodeobjects.com", "quota_name": "Egress + Throughput (per IP)", "quota_type": "obj-per-ip-egress-throughput", "endpoint_type": + "E3", "s3_endpoint": "jp-tyo-1.linodeobjects.com", "description": "Current egress + bandwidth per account, per destination IP address", "quota_limit": 250000000, + "resource_metric": "byte_per_second", "has_usage": false}, {"quota_id": "obj-bytes-us-southeast-1.linodeobjects.com", "quota_name": "Total Capacity", "quota_type": "obj-bytes", "endpoint_type": - "E1", "s3_endpoint": "us-mia-1.linodeobjects.com", "description": "Current total - capacity per account, per endpoint", "quota_limit": 109951162777600, "resource_metric": - "byte", "has_usage": true}, {"quota_id": "obj-objects-us-mia-1.linodeobjects.com", + "E0", "s3_endpoint": "us-southeast-1.linodeobjects.com", "description": "Current + total capacity per account, per endpoint", "quota_limit": 5497558138880, "resource_metric": + "byte", "has_usage": true}, {"quota_id": "obj-objects-us-southeast-1.linodeobjects.com", "quota_name": "Number of Objects", "quota_type": "obj-objects", "endpoint_type": - "E1", "s3_endpoint": "us-mia-1.linodeobjects.com", "description": "Current number - of objects per account, per endpoint", "quota_limit": 100000000, "resource_metric": - "object", "has_usage": true}, {"quota_id": "obj-buckets-us-mia-1.linodeobjects.com", + "E0", "s3_endpoint": "us-southeast-1.linodeobjects.com", "description": "Current + number of objects per account, per endpoint", "quota_limit": 50000000, "resource_metric": + "object", "has_usage": true}, {"quota_id": "obj-buckets-us-southeast-1.linodeobjects.com", "quota_name": "Number of Buckets", "quota_type": "obj-buckets", "endpoint_type": - "E1", "s3_endpoint": "us-mia-1.linodeobjects.com", "description": "Current number - of buckets per account, per endpoint", "quota_limit": 1000, "resource_metric": + "E0", "s3_endpoint": "us-southeast-1.linodeobjects.com", "description": "Current + number of buckets per account, per endpoint", "quota_limit": 1000, "resource_metric": "bucket", "has_usage": true}, {"quota_id": "obj-bytes-sg-sin-1.linodeobjects.com", "quota_name": "Total Capacity", "quota_type": "obj-bytes", "endpoint_type": "E3", "s3_endpoint": "sg-sin-1.linodeobjects.com", "description": "Current total @@ -290,31 +338,170 @@ interactions: "quota_name": "Number of Buckets", "quota_type": "obj-buckets", "endpoint_type": "E3", "s3_endpoint": "sg-sin-1.linodeobjects.com", "description": "Current number of buckets per account, per endpoint", "quota_limit": 1000, "resource_metric": - "bucket", "has_usage": true}, {"quota_id": "obj-bytes-eu-central-1.linodeobjects.com", + "bucket", "has_usage": true}, {"quota_id": "obj-total-ingress-throughput-sg-sin-1.linodeobjects.com", + "quota_name": "Ingress Throughput (per endpoint)", "quota_type": "obj-total-ingress-throughput", + "endpoint_type": "E3", "s3_endpoint": "sg-sin-1.linodeobjects.com", "description": + "Current total ingress bandwidth per account, per endpoint", "quota_limit": + 1250000000, "resource_metric": "byte_per_second", "has_usage": false}, {"quota_id": + "obj-total-egress-throughput-sg-sin-1.linodeobjects.com", "quota_name": "Egress + Throughput (per endpoint)", "quota_type": "obj-total-egress-throughput", "endpoint_type": + "E3", "s3_endpoint": "sg-sin-1.linodeobjects.com", "description": "Current total + egress bandwidth per account, per endpoint", "quota_limit": 1250000000, "resource_metric": + "byte_per_second", "has_usage": false}, {"quota_id": "obj-per-ip-ingress-throughput-sg-sin-1.linodeobjects.com", + "quota_name": "Ingress Throughput (per IP)", "quota_type": "obj-per-ip-ingress-throughput", + "endpoint_type": "E3", "s3_endpoint": "sg-sin-1.linodeobjects.com", "description": + "Current ingress bandwidth per account, per destination IP address", "quota_limit": + 156250000, "resource_metric": "byte_per_second", "has_usage": false}, {"quota_id": + "obj-per-ip-egress-throughput-sg-sin-1.linodeobjects.com", "quota_name": "Egress + Throughput (per IP)", "quota_type": "obj-per-ip-egress-throughput", "endpoint_type": + "E3", "s3_endpoint": "sg-sin-1.linodeobjects.com", "description": "Current egress + bandwidth per account, per destination IP address", "quota_limit": 250000000, + "resource_metric": "byte_per_second", "has_usage": false}, {"quota_id": "obj-bytes-ap-south-1.linodeobjects.com", "quota_name": "Total Capacity", "quota_type": "obj-bytes", "endpoint_type": - "E0", "s3_endpoint": "eu-central-1.linodeobjects.com", "description": "Current + "E0", "s3_endpoint": "ap-south-1.linodeobjects.com", "description": "Current total capacity per account, per endpoint", "quota_limit": 5497558138880, "resource_metric": - "byte", "has_usage": true}, {"quota_id": "obj-objects-eu-central-1.linodeobjects.com", + "byte", "has_usage": true}, {"quota_id": "obj-objects-ap-south-1.linodeobjects.com", "quota_name": "Number of Objects", "quota_type": "obj-objects", "endpoint_type": - "E0", "s3_endpoint": "eu-central-1.linodeobjects.com", "description": "Current + "E0", "s3_endpoint": "ap-south-1.linodeobjects.com", "description": "Current number of objects per account, per endpoint", "quota_limit": 50000000, "resource_metric": - "object", "has_usage": true}, {"quota_id": "obj-buckets-eu-central-1.linodeobjects.com", + "object", "has_usage": true}, {"quota_id": "obj-buckets-ap-south-1.linodeobjects.com", "quota_name": "Number of Buckets", "quota_type": "obj-buckets", "endpoint_type": - "E0", "s3_endpoint": "eu-central-1.linodeobjects.com", "description": "Current + "E0", "s3_endpoint": "ap-south-1.linodeobjects.com", "description": "Current number of buckets per account, per endpoint", "quota_limit": 1000, "resource_metric": - "bucket", "has_usage": true}, {"quota_id": "obj-bytes-us-ord-10.linodeobjects.com", + "bucket", "has_usage": true}, {"quota_id": "obj-bytes-fr-par-1.linodeobjects.com", "quota_name": "Total Capacity", "quota_type": "obj-bytes", "endpoint_type": - "E3", "s3_endpoint": "us-ord-10.linodeobjects.com", "description": "Current - total capacity per account, per endpoint", "quota_limit": 549755813888000, "resource_metric": - "byte", "has_usage": true}, {"quota_id": "obj-objects-us-ord-10.linodeobjects.com", + "E1", "s3_endpoint": "fr-par-1.linodeobjects.com", "description": "Current total + capacity per account, per endpoint", "quota_limit": 109951162777600, "resource_metric": + "byte", "has_usage": true}, {"quota_id": "obj-objects-fr-par-1.linodeobjects.com", "quota_name": "Number of Objects", "quota_type": "obj-objects", "endpoint_type": - "E3", "s3_endpoint": "us-ord-10.linodeobjects.com", "description": "Current - number of objects per account, per endpoint", "quota_limit": 500000000, "resource_metric": - "object", "has_usage": true}, {"quota_id": "obj-buckets-us-ord-10.linodeobjects.com", + "E1", "s3_endpoint": "fr-par-1.linodeobjects.com", "description": "Current number + of objects per account, per endpoint", "quota_limit": 100000000, "resource_metric": + "object", "has_usage": true}, {"quota_id": "obj-buckets-fr-par-1.linodeobjects.com", "quota_name": "Number of Buckets", "quota_type": "obj-buckets", "endpoint_type": - "E3", "s3_endpoint": "us-ord-10.linodeobjects.com", "description": "Current + "E1", "s3_endpoint": "fr-par-1.linodeobjects.com", "description": "Current number + of buckets per account, per endpoint", "quota_limit": 1000, "resource_metric": + "bucket", "has_usage": true}, {"quota_id": "obj-bytes-us-iad-1.linodeobjects.com", + "quota_name": "Total Capacity", "quota_type": "obj-bytes", "endpoint_type": + "E1", "s3_endpoint": "us-iad-1.linodeobjects.com", "description": "Current total + capacity per account, per endpoint", "quota_limit": 109951162777600, "resource_metric": + "byte", "has_usage": true}, {"quota_id": "obj-objects-us-iad-1.linodeobjects.com", + "quota_name": "Number of Objects", "quota_type": "obj-objects", "endpoint_type": + "E1", "s3_endpoint": "us-iad-1.linodeobjects.com", "description": "Current number + of objects per account, per endpoint", "quota_limit": 100000000, "resource_metric": + "object", "has_usage": true}, {"quota_id": "obj-buckets-us-iad-1.linodeobjects.com", + "quota_name": "Number of Buckets", "quota_type": "obj-buckets", "endpoint_type": + "E1", "s3_endpoint": "us-iad-1.linodeobjects.com", "description": "Current number + of buckets per account, per endpoint", "quota_limit": 1000, "resource_metric": + "bucket", "has_usage": true}, {"quota_id": "obj-bytes-us-east-1.linodeobjects.com", + "quota_name": "Total Capacity", "quota_type": "obj-bytes", "endpoint_type": + "E0", "s3_endpoint": "us-east-1.linodeobjects.com", "description": "Current + total capacity per account, per endpoint", "quota_limit": 5497558138880, "resource_metric": + "byte", "has_usage": true}, {"quota_id": "obj-objects-us-east-1.linodeobjects.com", + "quota_name": "Number of Objects", "quota_type": "obj-objects", "endpoint_type": + "E0", "s3_endpoint": "us-east-1.linodeobjects.com", "description": "Current + number of objects per account, per endpoint", "quota_limit": 50000000, "resource_metric": + "object", "has_usage": true}, {"quota_id": "obj-buckets-us-east-1.linodeobjects.com", + "quota_name": "Number of Buckets", "quota_type": "obj-buckets", "endpoint_type": + "E0", "s3_endpoint": "us-east-1.linodeobjects.com", "description": "Current number of buckets per account, per endpoint", "quota_limit": 1000, "resource_metric": - "bucket", "has_usage": true}], "page": 1, "pages": 1, "results": 75}' + "bucket", "has_usage": true}, {"quota_id": "obj-bytes-us-lax-1.linodeobjects.com", + "quota_name": "Total Capacity", "quota_type": "obj-bytes", "endpoint_type": + "E1", "s3_endpoint": "us-lax-1.linodeobjects.com", "description": "Current total + capacity per account, per endpoint", "quota_limit": 109951162777600, "resource_metric": + "byte", "has_usage": true}, {"quota_id": "obj-objects-us-lax-1.linodeobjects.com", + "quota_name": "Number of Objects", "quota_type": "obj-objects", "endpoint_type": + "E1", "s3_endpoint": "us-lax-1.linodeobjects.com", "description": "Current number + of objects per account, per endpoint", "quota_limit": 100000000, "resource_metric": + "object", "has_usage": true}, {"quota_id": "obj-buckets-us-lax-1.linodeobjects.com", + "quota_name": "Number of Buckets", "quota_type": "obj-buckets", "endpoint_type": + "E1", "s3_endpoint": "us-lax-1.linodeobjects.com", "description": "Current number + of buckets per account, per endpoint", "quota_limit": 1000, "resource_metric": + "bucket", "has_usage": true}, {"quota_id": "obj-bytes-us-sea-1.linodeobjects.com", + "quota_name": "Total Capacity", "quota_type": "obj-bytes", "endpoint_type": + "E1", "s3_endpoint": "us-sea-1.linodeobjects.com", "description": "Current total + capacity per account, per endpoint", "quota_limit": 109951162777600, "resource_metric": + "byte", "has_usage": true}, {"quota_id": "obj-objects-us-sea-1.linodeobjects.com", + "quota_name": "Number of Objects", "quota_type": "obj-objects", "endpoint_type": + "E1", "s3_endpoint": "us-sea-1.linodeobjects.com", "description": "Current number + of objects per account, per endpoint", "quota_limit": 100000000, "resource_metric": + "object", "has_usage": true}, {"quota_id": "obj-buckets-us-sea-1.linodeobjects.com", + "quota_name": "Number of Buckets", "quota_type": "obj-buckets", "endpoint_type": + "E1", "s3_endpoint": "us-sea-1.linodeobjects.com", "description": "Current number + of buckets per account, per endpoint", "quota_limit": 1000, "resource_metric": + "bucket", "has_usage": true}], "page": 1, "pages": 2, "results": 103}' + headers: + Access-Control-Allow-Credentials: + - "true" + Access-Control-Allow-Headers: + - Authorization, Origin, X-Requested-With, Content-Type, Accept, X-Filter + Access-Control-Allow-Methods: + - HEAD, GET, OPTIONS, POST, PUT, DELETE + Access-Control-Allow-Origin: + - '*' + Access-Control-Expose-Headers: + - X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Status + Akamai-Internal-Account: + - '*' + Cache-Control: + - max-age=0, no-cache, no-store + Connection: + - keep-alive + Content-Security-Policy: + - default-src 'none' + Content-Type: + - application/json + Expires: + - Thu, 30 Apr 2026 20:20:07 GMT + Pragma: + - no-cache + Strict-Transport-Security: + - max-age=31536000 + Vary: + - Authorization, X-Filter + - Authorization, X-Filter + - Accept-Encoding + X-Accepted-Oauth-Scopes: + - object_storage:read_only + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - DENY + - DENY + X-Oauth-Scopes: + - '*' + X-Ratelimit-Limit: + - "1840" + X-Xss-Protection: + - 1; mode=block + status: 200 OK + code: 200 + duration: "" +- request: + body: "" + form: {} + headers: + Accept: + - application/json + Content-Type: + - application/json + User-Agent: + - linodego/dev https://github.com/linode/linodego + url: https://api.linode.com/v4beta/object-storage/quotas?page=2 + method: GET + response: + body: '{"data": [{"quota_id": "obj-bytes-us-ord-1.linodeobjects.com", "quota_name": + "Total Capacity", "quota_type": "obj-bytes", "endpoint_type": "E1", "s3_endpoint": + "us-ord-1.linodeobjects.com", "description": "Current total capacity per account, + per endpoint", "quota_limit": 109951162777600, "resource_metric": "byte", "has_usage": + true}, {"quota_id": "obj-objects-us-ord-1.linodeobjects.com", "quota_name": + "Number of Objects", "quota_type": "obj-objects", "endpoint_type": "E1", "s3_endpoint": + "us-ord-1.linodeobjects.com", "description": "Current number of objects per + account, per endpoint", "quota_limit": 100000000, "resource_metric": "object", + "has_usage": true}, {"quota_id": "obj-buckets-us-ord-1.linodeobjects.com", "quota_name": + "Number of Buckets", "quota_type": "obj-buckets", "endpoint_type": "E1", "s3_endpoint": + "us-ord-1.linodeobjects.com", "description": "Current number of buckets per + account, per endpoint", "quota_limit": 1000, "resource_metric": "bucket", "has_usage": + true}], "page": 2, "pages": 2, "results": 103}' headers: Access-Control-Allow-Credentials: - "true" @@ -337,7 +524,7 @@ interactions: Content-Type: - application/json Expires: - - Mon, 23 Feb 2026 20:13:34 GMT + - Thu, 30 Apr 2026 20:20:07 GMT Pragma: - no-cache Strict-Transport-Security: diff --git a/test/integration/fixtures/TestTag_Create.yaml b/test/integration/fixtures/TestTag_Create.yaml index 0e1459ccf..06d4852cd 100644 --- a/test/integration/fixtures/TestTag_Create.yaml +++ b/test/integration/fixtures/TestTag_Create.yaml @@ -14,265 +14,449 @@ interactions: url: https://api.linode.com/v4beta/regions?page=1 method: GET response: - body: '{"data": [{"id": "ap-west", "label": "Mumbai, IN", "country": "in", "capabilities": - ["Linodes", "Backups", "NodeBalancers", "Block Storage", "GPU Linodes", "Kubernetes", - "Cloud Firewall", "Vlans", "Block Storage Migrations", "Managed Databases", - "Metadata"], "status": "ok", "resolvers": {"ipv4": "172.105.34.5, 172.105.35.5, - 172.105.36.5, 172.105.37.5, 172.105.38.5, 172.105.39.5, 172.105.40.5, 172.105.41.5, - 172.105.42.5, 172.105.43.5", "ipv6": "1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678"}, "placement_group_limits": - {"maximum_pgs_per_customer": 100, "maximum_linodes_per_pg": 5}, "site_type": - "core"}, {"id": "ca-central", "label": "Toronto, CA", "country": "ca", "capabilities": - ["Linodes", "Backups", "NodeBalancers", "Block Storage", "Kubernetes", "Cloud - Firewall", "Vlans", "Block Storage Migrations", "Managed Databases", "Metadata"], - "status": "ok", "resolvers": {"ipv4": "172.105.0.5, 172.105.3.5, 172.105.4.5, - 172.105.5.5, 172.105.6.5, 172.105.7.5, 172.105.8.5, 172.105.9.5, 172.105.10.5, - 172.105.11.5", "ipv6": "1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678"}, "placement_group_limits": - {"maximum_pgs_per_customer": 100, "maximum_linodes_per_pg": 5}, "site_type": - "core"}, {"id": "ap-southeast", "label": "Sydney, AU", "country": "au", "capabilities": - ["Linodes", "Backups", "NodeBalancers", "Block Storage", "Kubernetes", "Cloud - Firewall", "Vlans", "Block Storage Migrations", "Managed Databases", "Metadata"], - "status": "ok", "resolvers": {"ipv4": "172.105.166.5, 172.105.169.5, 172.105.168.5, - 172.105.172.5, 172.105.162.5, 172.105.170.5, 172.105.167.5, 172.105.171.5, 172.105.181.5, - 172.105.161.5", "ipv6": "1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678"}, "placement_group_limits": - {"maximum_pgs_per_customer": 100, "maximum_linodes_per_pg": 5}, "site_type": - "core"}, {"id": "us-iad", "label": "Washington, DC", "country": "us", "capabilities": - ["Linodes", "Backups", "NodeBalancers", "Block Storage", "Object Storage", "Kubernetes", - "Cloud Firewall", "Vlans", "VPCs", "Metadata", "Premium Plans", "Placement Group"], - "status": "ok", "resolvers": {"ipv4": "139.144.192.62, 139.144.192.60, 139.144.192.61, - 139.144.192.53, 139.144.192.54, 139.144.192.67, 139.144.192.69, 139.144.192.66, - 139.144.192.52, 139.144.192.68", "ipv6": "1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678"}, "placement_group_limits": - {"maximum_pgs_per_customer": 100, "maximum_linodes_per_pg": 5}, "site_type": - "core"}, {"id": "us-ord", "label": "Chicago, IL", "country": "us", "capabilities": - ["Linodes", "Backups", "NodeBalancers", "Block Storage", "Object Storage", "GPU - Linodes", "Kubernetes", "Cloud Firewall", "Vlans", "VPCs", "Managed Databases", - "Metadata", "Premium Plans", "Placement Group"], "status": "ok", "resolvers": - {"ipv4": "172.232.0.17, 172.232.0.16, 172.232.0.21, 172.232.0.13, 172.232.0.22, - 172.232.0.9, 172.232.0.19, 172.232.0.20, 172.232.0.15, 172.232.0.18", "ipv6": - "1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678, - 1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": - 100, "maximum_linodes_per_pg": 5}, "site_type": "core"}, {"id": "fr-par", "label": - "Paris, FR", "country": "fr", "capabilities": ["Linodes", "Backups", "NodeBalancers", - "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Cloud Firewall", - "Vlans", "VPCs", "Managed Databases", "Metadata", "Premium Plans"], "status": - "ok", "resolvers": {"ipv4": "172.232.32.21, 172.232.32.23, 172.232.32.17, 172.232.32.18, - 172.232.32.16, 172.232.32.22, 172.232.32.20, 172.232.32.14, 172.232.32.11, 172.232.32.12", - "ipv6": "1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678, - 1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": - 100, "maximum_linodes_per_pg": 5}, "site_type": "core"}, {"id": "us-sea", "label": - "Seattle, WA", "country": "us", "capabilities": ["Linodes", "Backups", "NodeBalancers", + body: '{"data": [{"id": "au-mel", "label": "Melbourne, AU", "country": "au", "capabilities": + ["Linodes", "Block Storage Encryption", "LA Disk Encryption", "Disk Encryption", + "Backups", "NodeBalancers", "Block Storage", "Object Storage", "Kubernetes", + "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", + "Premium Plans", "Placement Group", "StackScripts", "Maintenance Policy", "Linode + Interfaces"], "monitors": {"alerts": ["Managed Databases", "NodeBalancers"], + "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": + {"ipv4": "172.236.32.23,172.236.32.35,172.236.32.30,172.236.32.28,172.236.32.32,172.236.32.33,172.236.32.27,172.236.32.37,172.236.32.29,172.236.32.34", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "us-lax", + "label": "Los Angeles, CA", "country": "us", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes + Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", + "Metadata", "Premium Plans", "Placement Group", "StackScripts", "NETINT Quadra + T1U", "Maintenance Policy", "Linode Interfaces", "ACLP Logs Datacenter LKE-E"], + "monitors": {"alerts": ["Managed Databases", "NodeBalancers"], "metrics": ["Managed + Databases", "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "172.233.128.45,172.233.128.38,172.233.128.53,172.233.128.37,172.233.128.34,172.233.128.36,172.233.128.33,172.233.128.39,172.233.128.43,172.233.128.44", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "nz-akl-1", + "label": "Auckland, NZ", "country": "nz", "capabilities": ["Linodes", "Disk + Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", "Maintenance + Policy"], "monitors": {"alerts": [], "metrics": []}, "status": "ok", "resolvers": + {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": + 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": + "us-den-1", "label": "Denver, CO", "country": "us", "capabilities": ["Linodes", + "Disk Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", + "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": + "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": + 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": + "de-ham-1", "label": "Hamburg, DE", "country": "de", "capabilities": ["Linodes", + "Disk Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", + "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": + "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": + 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": + "za-jnb-1", "label": "Johannesburg, ZA", "country": "za", "capabilities": ["Linodes", + "Disk Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", + "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": + "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": + 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": + "my-kul-1", "label": "Kuala Lumpur, MY", "country": "my", "capabilities": ["Linodes", + "Disk Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", + "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": + "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": + 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": + "co-bog-1", "label": "Bogot\u00e1, CO", "country": "co", "capabilities": ["Linodes", + "Disk Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", + "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": + "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": + 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": + "mx-qro-1", "label": "Quer\u00e9taro, MX", "country": "mx", "capabilities": + ["Linodes", "Disk Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed + Plans", "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": + "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": + 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": + "us-hou-1", "label": "Houston, TX", "country": "us", "capabilities": ["Linodes", + "Disk Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", + "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": + "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": + 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": + "cl-scl-1", "label": "Santiago, CL", "country": "cl", "capabilities": ["Linodes", + "Disk Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", + "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": + "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": + 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": + "gb-lon", "label": "London 2, UK", "country": "gb", "capabilities": ["Linodes", + "Block Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", + "NodeBalancers", "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", + "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", + "Managed Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", + "NETINT Quadra T1U", "Maintenance Policy", "Linode Interfaces", "ACLP Logs Datacenter + LKE-E"], "monitors": {"alerts": ["Managed Databases", "NodeBalancers"], "metrics": + ["Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": + "172.236.0.46,172.236.0.50,172.236.0.47,172.236.0.53,172.236.0.52,172.236.0.45,172.236.0.49,172.236.0.51,172.236.0.54,172.236.0.48", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "id-cgk", + "label": "Jakarta, ID", "country": "id", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes + Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", + "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "172.232.224.23,172.232.224.32,172.232.224.26,172.232.224.27,172.232.224.21,172.232.224.24,172.232.224.22,172.232.224.20,172.232.224.31,172.232.224.28", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "in-bom-2", + "label": "Mumbai 2, IN", "country": "in", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "GPU Linodes", "Kubernetes", "Kubernetes Enterprise", "Cloud + Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", + "Premium Plans", "Placement Group", "StackScripts", "Maintenance Policy", "Linode + Interfaces", "ACLP Logs Datacenter LKE-E"], "monitors": {"alerts": ["Managed + Databases", "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "172.236.171.41,172.236.171.42,172.236.171.25,172.236.171.44,172.236.171.26,172.236.171.45,172.236.171.24,172.236.171.43,172.236.171.27,172.236.171.28", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "de-fra-2", + "label": "Frankfurt 2, DE", "country": "de", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes + Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", + "Metadata", "Premium Plans", "Placement Group", "StackScripts", "NETINT Quadra + T1U", "Maintenance Policy", "Linode Interfaces", "ACLP Logs Datacenter LKE-E"], + "monitors": {"alerts": ["Managed Databases", "NodeBalancers"], "metrics": ["Managed + Databases", "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "172.236.203.9,172.236.203.16,172.236.203.19,172.236.203.15,172.236.203.17,172.236.203.11,172.236.203.18,172.236.203.14,172.236.203.13,172.236.203.12", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "sg-sin-2", + "label": "Singapore 2, SG", "country": "sg", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes + Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", + "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance + Policy", "Linode Interfaces", "ACLP Logs Datacenter LKE-E"], "monitors": {"alerts": + ["Managed Databases", "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "172.236.129.8,172.236.129.42,172.236.129.41,172.236.129.19,172.236.129.46,172.236.129.23,172.236.129.48,172.236.129.20,172.236.129.21,172.236.129.47", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "jp-tyo-3", + "label": "Tokyo 3, JP", "country": "jp", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes + Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", + "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance + Policy", "Linode Interfaces", "ACLP Logs Datacenter LKE-E"], "monitors": {"alerts": + ["Managed Databases", "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "172.237.4.15,172.237.4.19,172.237.4.17,172.237.4.21,172.237.4.16,172.237.4.18,172.237.4.23,172.237.4.24,172.237.4.20,172.237.4.14", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "de-ber-1", + "label": "Berlin, DE", "country": "de", "capabilities": ["Linodes", "Disk Encryption", + "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", "Maintenance Policy"], + "monitors": {"alerts": [], "metrics": []}, "status": "ok", "resolvers": {"ipv4": + "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": + 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": + "no-osl-1", "label": "Oslo, NO", "country": "no", "capabilities": ["Linodes", + "Block Storage Encryption", "Disk Encryption", "Backups", "NodeBalancers", "Block + Storage", "Object Storage", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", + "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", "Premium + Plans", "Placement Group", "StackScripts", "Maintenance Policy", "Linode Interfaces", + "ACLP Logs Datacenter LKE-E"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "172.238.140.33,172.238.140.25,172.238.140.30,172.238.140.31,172.238.140.26,172.238.140.28,172.238.140.34,172.238.140.32,172.238.140.27,172.238.140.29", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "us-iad-2", + "label": "Washington 2, DC", "country": "us", "capabilities": ["Linodes", "Block + Storage Encryption", "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", + "Object Storage", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", + "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", "Premium Plans", + "Placement Group", "StackScripts", "Maintenance Policy", "Linode Interfaces"], + "monitors": {"alerts": ["Managed Databases", "NodeBalancers"], "metrics": ["Managed + Databases", "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "172.239.142.102,172.239.142.89,172.239.142.92,172.239.142.87,172.239.142.88,172.239.142.103,172.239.142.91,172.239.142.90,172.239.142.86,172.239.142.100", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "fr-par-2", + "label": "Paris 2, FR", "country": "fr", "capabilities": ["Linodes", "Block + Storage Encryption", "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", + "GPU Linodes", "Kubernetes", "Kubernetes Enterprise", "Cloud Firewall", "Vlans", + "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", "Premium Plans", + "Placement Group", "StackScripts", "Maintenance Policy", "Linode Interfaces", + "ACLP Logs Datacenter LKE-E"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "172.239.11.24,172.239.11.22,172.239.11.17,172.239.11.20,172.239.11.23,172.239.11.19,172.239.11.21,172.239.11.15,172.239.11.16,172.239.11.18", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "us-rno-1", + "label": "Reno, NV", "country": "us", "capabilities": ["Linodes", "Disk Encryption", + "Backups", "NodeBalancers", "GPU Linodes", "Metadata", "Premium Plans", "Placement + Group", "StackScripts", "Maintenance Policy"], "monitors": {"alerts": ["NodeBalancers"], + "metrics": ["NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "", "ipv6": + ""}, "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "co-bog-2", + "label": "Bogot\u00e1 2, CO", "country": "co", "capabilities": ["Linodes", "Disk + Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", "Maintenance + Policy"], "monitors": {"alerts": [], "metrics": []}, "status": "ok", "resolvers": + {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": + 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": + "fr-mrs-2", "label": "Marseille 2, FR", "country": "fr", "capabilities": ["Linodes", + "Disk Encryption", "Cloud Firewall", "Vlans", "Metadata", "Distributed Plans", + "Maintenance Policy"], "monitors": {"alerts": [], "metrics": []}, "status": + "ok", "resolvers": {"ipv4": "173.223.100.53,173.223.101.53", "ipv6": "1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": 0, "maximum_linodes_per_pg": + 0, "maximum_linodes_per_flexible_pg": 0}, "site_type": "distributed"}, {"id": + "us-mia", "label": "Miami, FL", "country": "us", "capabilities": ["Linodes", + "Block Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", + "NodeBalancers", "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", + "Kubernetes Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", + "Managed Databases", "Metadata", "Premium Plans", "Placement Group", "StackScripts", + "NETINT Quadra T1U", "Maintenance Policy", "Linode Interfaces"], "monitors": + {"alerts": ["Managed Databases", "NodeBalancers"], "metrics": ["Managed Databases", + "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "172.233.160.34,172.233.160.27,172.233.160.30,172.233.160.29,172.233.160.32,172.233.160.28,172.233.160.33,172.233.160.26,172.233.160.25,172.233.160.31", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "ap-west", + "label": "Mumbai, IN", "country": "in", "capabilities": ["Linodes", "Block Storage + Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "GPU Linodes", "Kubernetes", "Cloud Firewall", "Vlans", "Block + Storage Migrations", "Managed Databases", "Metadata", "Placement Group", "StackScripts", + "Maintenance Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed + Databases", "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "172.105.34.5,172.105.35.5,172.105.36.5,172.105.37.5,172.105.38.5,172.105.39.5,172.105.40.5,172.105.41.5,172.105.42.5,172.105.43.5", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "ca-central", + "label": "Toronto, CA", "country": "ca", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "GPU Linodes", "Kubernetes", "Cloud Firewall", "Vlans", "Block + Storage Migrations", "Managed Databases", "Metadata", "Placement Group", "StackScripts", + "Maintenance Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed + Databases", "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "172.105.0.5,172.105.3.5,172.105.4.5,172.105.5.5,172.105.6.5,172.105.7.5,172.105.8.5,172.105.9.5,172.105.10.5,172.105.11.5", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "ap-southeast", + "label": "Sydney, AU", "country": "au", "capabilities": ["Linodes", "Block Storage + Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", + "Managed Databases", "Metadata", "Placement Group", "StackScripts", "Maintenance + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "172.105.166.5,172.105.169.5,172.105.168.5,172.105.172.5,172.105.162.5,172.105.170.5,172.105.167.5,172.105.171.5,172.105.181.5,172.105.161.5", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "us-iad", + "label": "Washington, DC", "country": "us", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "Kubernetes", "Kubernetes Enterprise", "Cloud + Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", + "Premium Plans", "Placement Group", "StackScripts", "Maintenance Policy", "Linode + Interfaces", "ACLP Logs Datacenter LKE-E"], "monitors": {"alerts": ["Managed + Databases", "NodeBalancers"], "metrics": ["Linodes", "Managed Databases", "NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "139.144.192.62,139.144.192.60,139.144.192.61,139.144.192.53,139.144.192.54,139.144.192.67,139.144.192.69,139.144.192.66,139.144.192.52,139.144.192.68", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "us-ord", + "label": "Chicago, IL", "country": "us", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes + Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", + "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance + Policy", "Linode Interfaces", "ACLP Logs Datacenter LKE-E"], "monitors": {"alerts": + ["Managed Databases", "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "172.232.0.17,172.232.0.16,172.232.0.21,172.232.0.13,172.232.0.22,172.232.0.9,172.232.0.19,172.232.0.20,172.232.0.15,172.232.0.18", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "fr-par", + "label": "Paris, FR", "country": "fr", "capabilities": ["Linodes", "Block Storage + Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes + Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", + "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "172.232.32.21,172.232.32.23,172.232.32.17,172.232.32.18,172.232.32.16,172.232.32.22,172.232.32.20,172.232.32.14,172.232.32.11,172.232.32.12", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "us-sea", + "label": "Seattle, WA", "country": "us", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes + Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", + "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance + Policy", "Linode Interfaces", "ACLP Logs Datacenter LKE-E"], "monitors": {"alerts": + ["Managed Databases", "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "172.232.160.19,172.232.160.21,172.232.160.17,172.232.160.15,172.232.160.18,172.232.160.8,172.232.160.12,172.232.160.11,172.232.160.14,172.232.160.16", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "br-gru", + "label": "Sao Paulo, BR", "country": "br", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "Kubernetes", "Kubernetes Enterprise", "Cloud + Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", "Metadata", + "Premium Plans", "Placement Group", "StackScripts", "Maintenance Policy", "Linode + Interfaces"], "monitors": {"alerts": ["Managed Databases", "NodeBalancers"], + "metrics": ["Managed Databases", "NodeBalancers"]}, "status": "ok", "resolvers": + {"ipv4": "172.233.0.4,172.233.0.9,172.233.0.7,172.233.0.12,172.233.0.5,172.233.0.13,172.233.0.10,172.233.0.6,172.233.0.8,172.233.0.11", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "nl-ams", + "label": "Amsterdam, NL", "country": "nl", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes + Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", + "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "172.233.33.36,172.233.33.38,172.233.33.35,172.233.33.39,172.233.33.34,172.233.33.33,172.233.33.31,172.233.33.30,172.233.33.37,172.233.33.32", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "se-sto", + "label": "Stockholm, SE", "country": "se", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes + Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", + "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "172.232.128.24,172.232.128.26,172.232.128.20,172.232.128.22,172.232.128.25,172.232.128.19,172.232.128.23,172.232.128.18,172.232.128.21,172.232.128.27", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "es-mad", + "label": "Madrid, ES", "country": "es", "capabilities": ["Linodes", "Block Storage + Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes + Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", + "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "172.233.111.6,172.233.111.17,172.233.111.21,172.233.111.25,172.233.111.19,172.233.111.12,172.233.111.26,172.233.111.16,172.233.111.18,172.233.111.9", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "in-maa", + "label": "Chennai, IN", "country": "in", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes + Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", + "Metadata", "Premium Plans", "Placement Group", "StackScripts", "NETINT Quadra + T1U", "Maintenance Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed + Databases", "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "172.232.96.17,172.232.96.26,172.232.96.19,172.232.96.20,172.232.96.25,172.232.96.21,172.232.96.18,172.232.96.22,172.232.96.23,172.232.96.24", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "jp-osa", + "label": "Osaka, JP", "country": "jp", "capabilities": ["Linodes", "Block Storage + Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes + Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", + "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "172.233.64.44,172.233.64.43,172.233.64.37,172.233.64.40,172.233.64.46,172.233.64.41,172.233.64.39,172.233.64.42,172.233.64.45,172.233.64.38", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "it-mil", + "label": "Milan, IT", "country": "it", "capabilities": ["Linodes", "Block Storage + Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Kubernetes + Enterprise", "Cloud Firewall", "Vlans", "VPCs", "VPC Dual Stack", "Managed Databases", + "Metadata", "Premium Plans", "Placement Group", "StackScripts", "Maintenance + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "172.232.192.19,172.232.192.18,172.232.192.16,172.232.192.20,172.232.192.24,172.232.192.21,172.232.192.22,172.232.192.17,172.232.192.15,172.232.192.23", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "us-central", + "label": "Dallas, TX", "country": "us", "capabilities": ["Linodes", "Block Storage + Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", + "Managed Databases", "Metadata", "Placement Group", "StackScripts", "Maintenance + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "72.14.179.5,72.14.188.5,173.255.199.5,66.228.53.5,96.126.122.5,96.126.124.5,96.126.127.5,198.58.107.5,198.58.111.5,23.239.24.5", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "ap-northeast", + "label": "Tokyo 2, JP", "country": "jp", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", + "Managed Databases", "Metadata", "Placement Group", "StackScripts", "Maintenance + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "139.162.66.5,139.162.67.5,139.162.68.5,139.162.69.5,139.162.70.5,139.162.71.5,139.162.72.5,139.162.73.5,139.162.74.5,139.162.75.5", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "eu-central", + "label": "Frankfurt, DE", "country": "de", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Cloud Firewall", - "Vlans", "VPCs", "Metadata", "Premium Plans"], "status": "ok", "resolvers": - {"ipv4": "172.232.160.19, 172.232.160.21, 172.232.160.17, 172.232.160.15, 172.232.160.18, - 172.232.160.8, 172.232.160.12, 172.232.160.11, 172.232.160.14, 172.232.160.16", - "ipv6": "1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678, - 1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": - 100, "maximum_linodes_per_pg": 5}, "site_type": "core"}, {"id": "br-gru", "label": - "Sao Paulo, BR", "country": "br", "capabilities": ["Linodes", "Backups", "NodeBalancers", - "Block Storage", "Object Storage", "Kubernetes", "Cloud Firewall", "Vlans", - "VPCs", "Metadata", "Premium Plans"], "status": "ok", "resolvers": {"ipv4": - "172.233.0.4, 172.233.0.9, 172.233.0.7, 172.233.0.12, 172.233.0.5, 172.233.0.13, - 172.233.0.10, 172.233.0.6, 172.233.0.8, 172.233.0.11", "ipv6": "1234::5678, - 1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": 100, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "nl-ams", "label": "Amsterdam, NL", "country": - "nl", "capabilities": ["Linodes", "Backups", "NodeBalancers", "Block Storage", - "Object Storage", "Kubernetes", "Cloud Firewall", "Vlans", "VPCs", "Metadata", - "Premium Plans"], "status": "ok", "resolvers": {"ipv4": "172.233.33.36, 172.233.33.38, - 172.233.33.35, 172.233.33.39, 172.233.33.34, 172.233.33.33, 172.233.33.31, 172.233.33.30, - 172.233.33.37, 172.233.33.32", "ipv6": "1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678"}, "placement_group_limits": - {"maximum_pgs_per_customer": 100, "maximum_linodes_per_pg": 5}, "site_type": - "core"}, {"id": "se-sto", "label": "Stockholm, SE", "country": "se", "capabilities": - ["Linodes", "Backups", "NodeBalancers", "Block Storage", "Object Storage", "Kubernetes", - "Cloud Firewall", "Vlans", "VPCs", "Metadata", "Premium Plans", "Placement Group"], - "status": "ok", "resolvers": {"ipv4": "172.232.128.24, 172.232.128.26, 172.232.128.20, - 172.232.128.22, 172.232.128.25, 172.232.128.19, 172.232.128.23, 172.232.128.18, - 172.232.128.21, 172.232.128.27", "ipv6": "1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678"}, "placement_group_limits": - {"maximum_pgs_per_customer": 100, "maximum_linodes_per_pg": 5}, "site_type": - "core"}, {"id": "es-mad", "label": "Madrid, ES", "country": "es", "capabilities": - ["Linodes", "Backups", "NodeBalancers", "Block Storage", "Object Storage", "Kubernetes", - "Cloud Firewall", "Vlans", "VPCs", "Metadata", "Premium Plans"], "status": "ok", - "resolvers": {"ipv4": "172.233.111.6, 172.233.111.17, 172.233.111.21, 172.233.111.25, - 172.233.111.19, 172.233.111.12, 172.233.111.26, 172.233.111.16, 172.233.111.18, - 172.233.111.9", "ipv6": "1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678"}, "placement_group_limits": - {"maximum_pgs_per_customer": 100, "maximum_linodes_per_pg": 5}, "site_type": - "core"}, {"id": "in-maa", "label": "Chennai, IN", "country": "in", "capabilities": - ["Linodes", "Backups", "NodeBalancers", "Block Storage", "Object Storage", "Kubernetes", - "Cloud Firewall", "Vlans", "VPCs", "Metadata", "Premium Plans"], "status": "ok", - "resolvers": {"ipv4": "172.232.96.17, 172.232.96.26, 172.232.96.19, 172.232.96.20, - 172.232.96.25, 172.232.96.21, 172.232.96.18, 172.232.96.22, 172.232.96.23, 172.232.96.24", - "ipv6": "1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678, - 1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": - 100, "maximum_linodes_per_pg": 5}, "site_type": "core"}, {"id": "jp-osa", "label": - "Osaka, JP", "country": "jp", "capabilities": ["Linodes", "Backups", "NodeBalancers", + "Vlans", "Block Storage Migrations", "Managed Databases", "Metadata", "Placement + Group", "StackScripts", "Maintenance Policy", "Linode Interfaces"], "monitors": + {"alerts": ["Managed Databases", "NodeBalancers"], "metrics": ["Managed Databases", + "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "139.162.130.5,139.162.131.5,139.162.132.5,139.162.133.5,139.162.134.5,139.162.135.5,139.162.136.5,139.162.137.5,139.162.138.5,139.162.139.5", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "ap-south", + "label": "Singapore, SG", "country": "sg", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Cloud Firewall", - "Vlans", "VPCs", "Metadata", "Premium Plans"], "status": "ok", "resolvers": - {"ipv4": "172.233.64.44, 172.233.64.43, 172.233.64.37, 172.233.64.40, 172.233.64.46, - 172.233.64.41, 172.233.64.39, 172.233.64.42, 172.233.64.45, 172.233.64.38", - "ipv6": "1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678, - 1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": - 100, "maximum_linodes_per_pg": 5}, "site_type": "core"}, {"id": "it-mil", "label": - "Milan, IT", "country": "it", "capabilities": ["Linodes", "Backups", "NodeBalancers", - "Block Storage", "Object Storage", "Kubernetes", "Cloud Firewall", "Vlans", - "VPCs", "Metadata", "Premium Plans"], "status": "ok", "resolvers": {"ipv4": - "172.232.192.19, 172.232.192.18, 172.232.192.16, 172.232.192.20, 172.232.192.24, - 172.232.192.21, 172.232.192.22, 172.232.192.17, 172.232.192.15, 172.232.192.23", - "ipv6": "1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678, - 1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": - 100, "maximum_linodes_per_pg": 5}, "site_type": "core"}, {"id": "us-mia", "label": - "Miami, FL", "country": "us", "capabilities": ["Linodes", "Backups", "NodeBalancers", - "Block Storage", "Object Storage", "Kubernetes", "Cloud Firewall", "Vlans", - "VPCs", "Metadata", "Premium Plans", "Placement Group"], "status": "ok", "resolvers": - {"ipv4": "172.233.160.34, 172.233.160.27, 172.233.160.30, 172.233.160.29, 172.233.160.32, - 172.233.160.28, 172.233.160.33, 172.233.160.26, 172.233.160.25, 172.233.160.31", - "ipv6": "1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678, - 1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": - 100, "maximum_linodes_per_pg": 5}, "site_type": "core"}, {"id": "id-cgk", "label": - "Jakarta, ID", "country": "id", "capabilities": ["Linodes", "Backups", "NodeBalancers", - "Block Storage", "Object Storage", "Kubernetes", "Cloud Firewall", "Vlans", - "VPCs", "Metadata", "Premium Plans"], "status": "ok", "resolvers": {"ipv4": - "172.232.224.23, 172.232.224.32, 172.232.224.26, 172.232.224.27, 172.232.224.21, - 172.232.224.24, 172.232.224.22, 172.232.224.20, 172.232.224.31, 172.232.224.28", - "ipv6": "1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678, - 1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": - 100, "maximum_linodes_per_pg": 5}, "site_type": "core"}, {"id": "us-lax", "label": - "Los Angeles, CA", "country": "us", "capabilities": ["Linodes", "Backups", "NodeBalancers", - "Block Storage", "Object Storage", "Kubernetes", "Cloud Firewall", "Vlans", - "VPCs", "Metadata", "Premium Plans"], "status": "ok", "resolvers": {"ipv4": - "172.233.128.45, 172.233.128.38, 172.233.128.53, 172.233.128.37, 172.233.128.34, - 172.233.128.36, 172.233.128.33, 172.233.128.39, 172.233.128.43, 172.233.128.44", - "ipv6": "1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678, - 1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": - 100, "maximum_linodes_per_pg": 5}, "site_type": "core"}, {"id": "gb-lon", "label": - "London 2, UK", "country": "gb", "capabilities": ["Linodes", "Backups", "NodeBalancers", - "Block Storage", "Kubernetes", "Cloud Firewall", "Vlans", "VPCs", "Metadata", - "Premium Plans"], "status": "ok", "resolvers": {"ipv4": "172.236.0.46, 172.236.0.50, - 172.236.0.47, 172.236.0.53, 172.236.0.52, 172.236.0.45, 172.236.0.49, 172.236.0.51, - 172.236.0.54, 172.236.0.48", "ipv6": "1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678"}, "placement_group_limits": - {"maximum_pgs_per_customer": 100, "maximum_linodes_per_pg": 5}, "site_type": - "core"}, {"id": "au-mel", "label": "Melbourne, AU", "country": "au", "capabilities": - ["Linodes", "Backups", "NodeBalancers", "Block Storage", "Kubernetes", "Cloud - Firewall", "Vlans", "VPCs", "Metadata", "Premium Plans"], "status": "ok", "resolvers": - {"ipv4": "172.236.32.23, 172.236.32.35, 172.236.32.30, 172.236.32.28, 172.236.32.32, - 172.236.32.33, 172.236.32.27, 172.236.32.37, 172.236.32.29, 172.236.32.34", - "ipv6": "1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678, - 1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": - 100, "maximum_linodes_per_pg": 5}, "site_type": "core"}, {"id": "us-central", - "label": "Dallas, TX", "country": "us", "capabilities": ["Linodes", "Backups", - "NodeBalancers", "Block Storage", "Kubernetes", "Cloud Firewall", "Vlans", "Block - Storage Migrations", "Managed Databases", "Metadata", "Placement Group"], "status": - "ok", "resolvers": {"ipv4": "72.14.179.5, 72.14.188.5, 173.255.199.5, 66.228.53.5, - 96.126.122.5, 96.126.124.5, 96.126.127.5, 198.58.107.5, 198.58.111.5, 23.239.24.5", - "ipv6": "1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678"}, "placement_group_limits": - {"maximum_pgs_per_customer": 100, "maximum_linodes_per_pg": 5}, "site_type": - "core"}, {"id": "us-west", "label": "Fremont, CA", "country": "us", "capabilities": - ["Linodes", "Backups", "NodeBalancers", "Block Storage", "Kubernetes", "Cloud - Firewall", "Vlans", "Block Storage Migrations", "Managed Databases", "Metadata", - "Placement Group"], "status": "ok", "resolvers": {"ipv4": "173.230.145.5, 173.230.147.5, - 173.230.155.5, 173.255.212.5, 173.255.219.5, 173.255.241.5, 173.255.243.5, 173.255.244.5, - 74.207.241.5, 74.207.242.5", "ipv6": "1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678, - 1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": 100, - "maximum_linodes_per_pg": 5}, "site_type": "core"}, {"id": "us-southeast", "label": - "Atlanta, GA", "country": "us", "capabilities": ["Linodes", "Backups", "NodeBalancers", + "Vlans", "Block Storage Migrations", "Metadata", "Placement Group", "StackScripts", + "Maintenance Policy", "Linode Interfaces"], "monitors": {"alerts": ["NodeBalancers"], + "metrics": ["NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "139.162.11.5,139.162.13.5,139.162.14.5,139.162.15.5,139.162.16.5,139.162.21.5,139.162.27.5,103.3.60.18,103.3.60.19,103.3.60.20", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "eu-west", + "label": "London, UK", "country": "gb", "capabilities": ["Linodes", "Block Storage + Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", + "Block Storage", "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", + "Metadata", "Placement Group", "StackScripts", "Maintenance Policy", "Linode + Interfaces"], "monitors": {"alerts": ["NodeBalancers"], "metrics": ["NodeBalancers"]}, + "status": "ok", "resolvers": {"ipv4": "178.79.182.5, 176.58.107.5, 176.58.116.5, + 176.58.121.5, 151.236.220.5, 212.71.252.5, 212.71.253.5, 109.74.192.20, 109.74.193.20, + 109.74.194.20", "ipv6": "1234::5678, 1234::5678, 1234::5678, 1234::5678, + 1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "us-east", + "label": "Newark, NJ", "country": "us", "capabilities": ["Linodes", "Block Storage + Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", "Managed Databases", "Metadata", "Placement - Group"], "status": "ok", "resolvers": {"ipv4": "74.207.231.5, 173.230.128.5, - 173.230.129.5, 173.230.136.5, 173.230.140.5, 66.228.59.5, 66.228.62.5, 50.116.35.5, - 50.116.41.5, 23.239.18.5", "ipv6": "1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678, - 1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": 100, - "maximum_linodes_per_pg": 5}, "site_type": "core"}, {"id": "us-east", "label": - "Newark, NJ", "country": "us", "capabilities": ["Linodes", "Backups", "NodeBalancers", + Group", "StackScripts", "Maintenance Policy", "Linode Interfaces"], "monitors": + {"alerts": ["Managed Databases", "NodeBalancers"], "metrics": ["Managed Databases", + "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "66.228.42.5,96.126.106.5,50.116.53.5,50.116.58.5,50.116.61.5,50.116.62.5,66.175.211.5,97.107.133.4,173.255.225.5,66.228.35.5", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "us-southeast", + "label": "Atlanta, GA", "country": "us", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", "Managed Databases", "Metadata", "Placement - Group"], "status": "ok", "resolvers": {"ipv4": "66.228.42.5, 96.126.106.5, 50.116.53.5, - 50.116.58.5, 50.116.61.5, 50.116.62.5, 66.175.211.5, 97.107.133.4, 207.192.69.4, - 207.192.69.5", "ipv6": "1234::5678, 1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678"}, - "placement_group_limits": {"maximum_pgs_per_customer": 100, "maximum_linodes_per_pg": - 5}, "site_type": "core"}, {"id": "eu-west", "label": "London, UK", "country": - "gb", "capabilities": ["Linodes", "Backups", "NodeBalancers", "Block Storage", - "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", "Managed - Databases", "Metadata", "Placement Group"], "status": "ok", "resolvers": {"ipv4": - "178.79.182.5, 176.58.107.5, 176.58.116.5, 176.58.121.5, 151.236.220.5, 212.71.252.5, - 212.71.253.5, 109.74.192.20, 109.74.193.20, 109.74.194.20", "ipv6": "1234::5678, - 1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": - 100, "maximum_linodes_per_pg": 5}, "site_type": "core"}, {"id": "ap-south", - "label": "Singapore, SG", "country": "sg", "capabilities": ["Linodes", "Backups", - "NodeBalancers", "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", - "Cloud Firewall", "Vlans", "Block Storage Migrations", "Managed Databases", - "Metadata", "Placement Group"], "status": "ok", "resolvers": {"ipv4": "139.162.11.5, - 139.162.13.5, 139.162.14.5, 139.162.15.5, 139.162.16.5, 139.162.21.5, 139.162.27.5, - 103.3.60.18, 103.3.60.19, 103.3.60.20", "ipv6": "1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": - 100, "maximum_linodes_per_pg": 5}, "site_type": "core"}, {"id": "eu-central", - "label": "Frankfurt, DE", "country": "de", "capabilities": ["Linodes", "Backups", - "NodeBalancers", "Block Storage", "Object Storage", "GPU Linodes", "Kubernetes", - "Cloud Firewall", "Vlans", "Block Storage Migrations", "Managed Databases", - "Metadata"], "status": "ok", "resolvers": {"ipv4": "139.162.130.5, 139.162.131.5, - 139.162.132.5, 139.162.133.5, 139.162.134.5, 139.162.135.5, 139.162.136.5, 139.162.137.5, - 139.162.138.5, 139.162.139.5", "ipv6": "1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678, - 1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": 100, - "maximum_linodes_per_pg": 5}, "site_type": "core"}, {"id": "ap-northeast", "label": - "Tokyo, JP", "country": "jp", "capabilities": ["Linodes", "Backups", "NodeBalancers", + Group", "StackScripts", "Maintenance Policy", "Linode Interfaces"], "monitors": + {"alerts": ["Managed Databases", "NodeBalancers"], "metrics": ["Managed Databases", + "NodeBalancers"]}, "status": "ok", "resolvers": {"ipv4": "74.207.231.5,173.230.128.5,173.230.129.5,173.230.136.5,173.230.140.5,66.228.59.5,66.228.62.5,50.116.35.5,50.116.41.5,23.239.18.5", + "ipv6": "1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678,1234::5678"}, + "placement_group_limits": {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": + 5, "maximum_linodes_per_flexible_pg": 5}, "site_type": "core"}, {"id": "us-west", + "label": "Fremont, CA", "country": "us", "capabilities": ["Linodes", "Block + Storage Encryption", "LA Disk Encryption", "Disk Encryption", "Backups", "NodeBalancers", "Block Storage", "Kubernetes", "Cloud Firewall", "Vlans", "Block Storage Migrations", - "Managed Databases", "Metadata"], "status": "ok", "resolvers": {"ipv4": "139.162.66.5, - 139.162.67.5, 139.162.68.5, 139.162.69.5, 139.162.70.5, 139.162.71.5, 139.162.72.5, - 139.162.73.5, 139.162.74.5, 139.162.75.5", "ipv6": "1234::5678, 1234::5678, - 1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678, - 1234::5678, 1234::5678"}, "placement_group_limits": {"maximum_pgs_per_customer": - 100, "maximum_linodes_per_pg": 5}, "site_type": "core"}], "page": 1, "pages": - 1, "results": 27}' + "Managed Databases", "Metadata", "Placement Group", "StackScripts", "Maintenance + Policy", "Linode Interfaces"], "monitors": {"alerts": ["Managed Databases", + "NodeBalancers"], "metrics": ["Managed Databases", "NodeBalancers"]}, "status": + "ok", "resolvers": {"ipv4": "173.230.145.5, 173.230.147.5, 173.230.155.5, 173.255.212.5, + 173.255.219.5, 173.255.241.5, 173.255.243.5, 173.255.244.5, 74.207.241.5, 74.207.242.5", + "ipv6": "1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678, + 1234::5678, 1234::5678, 1234::5678, 1234::5678, 1234::5678"}, "placement_group_limits": + {"maximum_pgs_per_customer": null, "maximum_linodes_per_pg": 5, "maximum_linodes_per_flexible_pg": + 5}, "site_type": "core"}], "page": 1, "pages": 1, "results": 47}' headers: Access-Control-Allow-Credentials: - "true" @@ -295,7 +479,7 @@ interactions: Content-Type: - application/json Expires: - - Thu, 11 Jul 2024 18:29:07 GMT + - Wed, 06 May 2026 02:21:18 GMT Pragma: - no-cache Strict-Transport-Security: @@ -314,14 +498,14 @@ interactions: X-Oauth-Scopes: - '*' X-Ratelimit-Limit: - - "400" + - "1840" X-Xss-Protection: - 1; mode=block status: 200 OK code: 200 duration: "" - request: - body: '{"region":"ap-west","type":"g6-nanode-1","label":"go-ins-test-tag","tags":["go-tag-test"]}' + body: '{"region":"au-mel","type":"g6-nanode-1","label":"go-ins-test-tag","tags":["go-tag-test"]}' form: {} headers: Accept: @@ -333,16 +517,20 @@ interactions: url: https://api.linode.com/v4beta/linode/instances method: POST response: - body: '{"id": 61338609, "label": "go-ins-test-tag", "group": "", "status": "provisioning", + body: '{"id": 97190737, "label": "go-ins-test-tag", "group": "", "status": "provisioning", "created": "2018-01-02T03:04:05", "updated": "2018-01-02T03:04:05", "type": - "g6-nanode-1", "ipv4": ["172.105.33.33"], "ipv6": "1234::5678/128", - "image": null, "region": "ap-west", "specs": {"disk": 25600, "memory": 1024, - "vcpus": 1, "gpus": 0, "transfer": 1000}, "alerts": {"cpu": 90, "network_in": - 10, "network_out": 10, "transfer_quota": 80, "io": 10000}, "backups": {"enabled": - true, "available": false, "schedule": {"day": null, "window": null}, "last_successful": + "g6-nanode-1", "ipv4": ["172.237.224.9"], "ipv6": "1234::5678/128", + "image": null, "region": "au-mel", "site_type": "core", "specs": {"disk": 25600, + "memory": 1024, "vcpus": 1, "gpus": 0, "transfer": 1000, "accelerated_devices": + 0}, "alerts": {"cpu": 90, "network_in": 10, "network_out": 10, "transfer_quota": + 80, "io": 10000, "system_alerts": [], "user_alerts": []}, "backups": {"enabled": + false, "available": false, "schedule": {"day": null, "window": null}, "last_successful": null}, "hypervisor": "kvm", "watchdog_enabled": true, "tags": ["go-tag-test"], - "host_uuid": "7c02d8248cd598c0fbe8286e88e0299137474f35", "has_user_data": false, - "placement_group": null, "lke_cluster_id": null}' + "host_uuid": "2048da2cf8f9a3f121e2eadb96aa0a5137cbebef", "has_user_data": false, + "placement_group": null, "disk_encryption": "enabled", "lke_cluster_id": null, + "capabilities": ["Block Storage Encryption", "SMTP Enabled", "Maintenance Policy"], + "interface_generation": "legacy_config", "maintenance_policy": "linode/migrate", + "locks": []}' headers: Access-Control-Allow-Credentials: - "true" @@ -360,20 +548,19 @@ interactions: - max-age=0, no-cache, no-store Connection: - keep-alive - Content-Length: - - "781" Content-Security-Policy: - default-src 'none' Content-Type: - application/json Expires: - - Thu, 11 Jul 2024 18:29:07 GMT + - Wed, 06 May 2026 02:21:19 GMT Pragma: - no-cache Strict-Transport-Security: - max-age=31536000 Vary: - Authorization, X-Filter + - Accept-Encoding X-Accepted-Oauth-Scopes: - linodes:read_write X-Content-Type-Options: @@ -384,14 +571,14 @@ interactions: X-Oauth-Scopes: - '*' X-Ratelimit-Limit: - - "10" + - "20" X-Xss-Protection: - 1; mode=block status: 200 OK code: 200 duration: "" - request: - body: '{"label":"go-ins-test-tag","alerts":{"cpu":90,"io":10000,"network_in":10,"network_out":10,"transfer_quota":80},"watchdog_enabled":true,"tags":["go-tag-test","go-tag-test-bar"],"group":""}' + body: '{"label":"go-ins-test-tag","alerts":{"cpu":90,"io":10000,"network_in":10,"network_out":10,"transfer_quota":80},"watchdog_enabled":true,"tags":["go-tag-test","go-tag-test-bar"],"maintenance_policy":"linode/migrate"}' form: {} headers: Accept: @@ -400,19 +587,23 @@ interactions: - application/json User-Agent: - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/linode/instances/61338609 + url: https://api.linode.com/v4beta/linode/instances/97190737 method: PUT response: - body: '{"id": 61338609, "label": "go-ins-test-tag", "group": "", "status": "provisioning", + body: '{"id": 97190737, "label": "go-ins-test-tag", "group": "", "status": "provisioning", "created": "2018-01-02T03:04:05", "updated": "2018-01-02T03:04:05", "type": - "g6-nanode-1", "ipv4": ["172.105.33.33"], "ipv6": "1234::5678/128", - "image": null, "region": "ap-west", "specs": {"disk": 25600, "memory": 1024, - "vcpus": 1, "gpus": 0, "transfer": 1000}, "alerts": {"cpu": 90, "network_in": - 10, "network_out": 10, "transfer_quota": 80, "io": 10000}, "backups": {"enabled": - true, "available": false, "schedule": {"day": "Scheduling", "window": "Scheduling"}, - "last_successful": null}, "hypervisor": "kvm", "watchdog_enabled": true, "tags": - ["go-tag-test", "go-tag-test-bar"], "host_uuid": "7c02d8248cd598c0fbe8286e88e0299137474f35", - "has_user_data": false, "placement_group": null, "lke_cluster_id": null}' + "g6-nanode-1", "ipv4": ["172.237.224.9"], "ipv6": "1234::5678/128", + "image": null, "region": "au-mel", "site_type": "core", "specs": {"disk": 25600, + "memory": 1024, "vcpus": 1, "gpus": 0, "transfer": 1000, "accelerated_devices": + 0}, "alerts": {"cpu": 90, "network_in": 10, "network_out": 10, "transfer_quota": + 80, "io": 10000, "system_alerts": [], "user_alerts": []}, "backups": {"enabled": + false, "available": false, "schedule": {"day": null, "window": null}, "last_successful": + null}, "hypervisor": "kvm", "watchdog_enabled": true, "tags": ["go-tag-test", + "go-tag-test-bar"], "host_uuid": "2048da2cf8f9a3f121e2eadb96aa0a5137cbebef", + "has_user_data": false, "placement_group": null, "disk_encryption": "enabled", + "lke_cluster_id": null, "capabilities": ["Block Storage Encryption", "SMTP Enabled", + "Maintenance Policy"], "interface_generation": "legacy_config", "maintenance_policy": + "linode/migrate", "locks": []}' headers: Access-Control-Allow-Credentials: - "true" @@ -430,20 +621,19 @@ interactions: - max-age=0, no-cache, no-store Connection: - keep-alive - Content-Length: - - "816" Content-Security-Policy: - default-src 'none' Content-Type: - application/json Expires: - - Thu, 11 Jul 2024 18:29:07 GMT + - Wed, 06 May 2026 02:21:20 GMT Pragma: - no-cache Strict-Transport-Security: - max-age=31536000 Vary: - Authorization, X-Filter + - Accept-Encoding X-Accepted-Oauth-Scopes: - linodes:read_write X-Content-Type-Options: @@ -454,14 +644,14 @@ interactions: X-Oauth-Scopes: - '*' X-Ratelimit-Limit: - - "400" + - "1840" X-Xss-Protection: - 1; mode=block status: 200 OK code: 200 duration: "" - request: - body: '{"label":"go-tag-test-foo","linodes":[61338609]}' + body: '{"label":"go-tag-test-foo","linodes":[97190737]}' form: {} headers: Accept: @@ -498,7 +688,7 @@ interactions: Content-Type: - application/json Expires: - - Thu, 11 Jul 2024 18:29:07 GMT + - Wed, 06 May 2026 02:21:21 GMT Pragma: - no-cache Strict-Transport-Security: @@ -515,7 +705,7 @@ interactions: X-Oauth-Scopes: - '*' X-Ratelimit-Limit: - - "400" + - "1840" X-Xss-Protection: - 1; mode=block status: 200 OK @@ -534,11 +724,19 @@ interactions: url: https://api.linode.com/v4beta/tags?page=1 method: GET response: - body: '{"data": [{"label": "1720017781112637000-tag"}, {"label": "1720034737644008000-tag"}, - {"label": "1720036462525806000-tag"}, {"label": "1720187490628487000-tag"}, - {"label": "1720191694198091000-tag"}, {"label": "1720193251044123000-tag"}, - {"label": "go-tag-test"}, {"label": "go-tag-test-bar"}, {"label": "go-tag-test-foo"}], - "page": 1, "pages": 1, "results": 9}' + body: '{"data": [{"label": "bar"}, {"label": "cool"}, {"label": "cooler"}, {"label": + "foo"}, {"label": "go-tag-test"}, {"label": "go-tag-test-bar"}, {"label": "go-tag-test-foo"}, + {"label": "linuke-keep"}, {"label": "test"}, {"label": "test1"}, {"label": "test2"}, + {"label": "test3"}, {"label": "test4"}, {"label": "test5"}, {"label": "test6"}, + {"label": "test=true"}, {"label": "testing"}, {"label": "tf_test"}, {"label": + "tf_test-2820816664991140163"}, {"label": "tf_test-2820816664991140163-0"}, + {"label": "tf_test-2820816664991140163-1"}, {"label": "tf_test-2820816664991140163-2"}, + {"label": "tf_test-7201639259805312086"}, {"label": "tf_test-7201639259805312086-0"}, + {"label": "tf_test-7201639259805312086-1"}, {"label": "tf_test-7201639259805312086-2"}, + {"label": "tf_test-8869206596896669974"}, {"label": "tf_test-8869206596896669974-0"}, + {"label": "tf_test-8869206596896669974-1"}, {"label": "tf_test-8869206596896669974-2"}, + {"label": "tf_test_2"}, {"label": "tf_test_updated"}], "page": 1, "pages": 1, + "results": 32}' headers: Access-Control-Allow-Credentials: - "true" @@ -556,14 +754,12 @@ interactions: - max-age=0, no-cache, no-store Connection: - keep-alive - Content-Length: - - "361" Content-Security-Policy: - default-src 'none' Content-Type: - application/json Expires: - - Thu, 11 Jul 2024 18:29:08 GMT + - Wed, 06 May 2026 02:21:22 GMT Pragma: - no-cache Strict-Transport-Security: @@ -571,6 +767,7 @@ interactions: Vary: - Authorization, X-Filter - Authorization, X-Filter + - Accept-Encoding X-Accepted-Oauth-Scopes: - account:read_only X-Content-Type-Options: @@ -581,7 +778,7 @@ interactions: X-Oauth-Scopes: - '*' X-Ratelimit-Limit: - - "400" + - "1840" X-Xss-Protection: - 1; mode=block status: 200 OK @@ -601,16 +798,20 @@ interactions: method: GET response: body: '{"page": 1, "pages": 1, "results": 1, "data": [{"type": "linode", "data": - {"id": 61338609, "label": "go-ins-test-tag", "group": "", "status": "provisioning", + {"id": 97190737, "label": "go-ins-test-tag", "group": "", "status": "provisioning", "created": "2018-01-02T03:04:05", "updated": "2018-01-02T03:04:05", "type": - "g6-nanode-1", "ipv4": ["172.105.33.33"], "ipv6": "1234::5678/128", - "image": null, "region": "ap-west", "specs": {"disk": 25600, "memory": 1024, - "vcpus": 1, "gpus": 0, "transfer": 1000}, "alerts": {"cpu": 90, "network_in": - 10, "network_out": 10, "transfer_quota": 80, "io": 10000}, "backups": {"enabled": - true, "available": false, "schedule": {"day": "Scheduling", "window": "Scheduling"}, - "last_successful": null}, "hypervisor": "kvm", "watchdog_enabled": true, "tags": - ["go-tag-test", "go-tag-test-bar", "go-tag-test-foo"], "host_uuid": "7c02d8248cd598c0fbe8286e88e0299137474f35", - "has_user_data": false, "placement_group": null, "lke_cluster_id": null}}]}' + "g6-nanode-1", "ipv4": ["172.237.224.9"], "ipv6": "1234::5678/128", + "image": null, "region": "au-mel", "site_type": "core", "specs": {"disk": 25600, + "memory": 1024, "vcpus": 1, "gpus": 0, "transfer": 1000, "accelerated_devices": + 0}, "alerts": {"cpu": 90, "network_in": 10, "network_out": 10, "transfer_quota": + 80, "io": 10000, "system_alerts": [], "user_alerts": []}, "backups": {"enabled": + false, "available": false, "schedule": {"day": null, "window": null}, "last_successful": + null}, "hypervisor": "kvm", "watchdog_enabled": true, "tags": ["go-tag-test", + "go-tag-test-bar", "go-tag-test-foo"], "host_uuid": "2048da2cf8f9a3f121e2eadb96aa0a5137cbebef", + "has_user_data": false, "placement_group": null, "disk_encryption": "enabled", + "lke_cluster_id": null, "capabilities": ["Block Storage Encryption", "SMTP Enabled", + "Maintenance Policy"], "interface_generation": "legacy_config", "maintenance_policy": + "linode/migrate", "locks": []}}]}' headers: Access-Control-Allow-Credentials: - "true" @@ -633,7 +834,7 @@ interactions: Content-Type: - application/json Expires: - - Thu, 11 Jul 2024 18:29:08 GMT + - Wed, 06 May 2026 02:21:23 GMT Pragma: - no-cache Strict-Transport-Security: @@ -652,7 +853,7 @@ interactions: X-Oauth-Scopes: - '*' X-Ratelimit-Limit: - - "400" + - "1840" X-Xss-Protection: - 1; mode=block status: 200 OK @@ -696,7 +897,7 @@ interactions: Content-Type: - application/json Expires: - - Thu, 11 Jul 2024 18:29:08 GMT + - Wed, 06 May 2026 02:21:23 GMT Pragma: - no-cache Strict-Transport-Security: @@ -713,7 +914,7 @@ interactions: X-Oauth-Scopes: - '*' X-Ratelimit-Limit: - - "400" + - "1840" X-Xss-Protection: - 1; mode=block status: 200 OK @@ -757,7 +958,7 @@ interactions: Content-Type: - application/json Expires: - - Thu, 11 Jul 2024 18:29:08 GMT + - Wed, 06 May 2026 02:21:23 GMT Pragma: - no-cache Strict-Transport-Security: @@ -774,7 +975,7 @@ interactions: X-Oauth-Scopes: - '*' X-Ratelimit-Limit: - - "400" + - "1840" X-Xss-Protection: - 1; mode=block status: 200 OK @@ -818,7 +1019,7 @@ interactions: Content-Type: - application/json Expires: - - Thu, 11 Jul 2024 18:29:08 GMT + - Wed, 06 May 2026 02:21:24 GMT Pragma: - no-cache Strict-Transport-Security: @@ -835,7 +1036,7 @@ interactions: X-Oauth-Scopes: - '*' X-Ratelimit-Limit: - - "400" + - "1840" X-Xss-Protection: - 1; mode=block status: 200 OK @@ -851,7 +1052,7 @@ interactions: - application/json User-Agent: - linodego/dev https://github.com/linode/linodego - url: https://api.linode.com/v4beta/linode/instances/61338609 + url: https://api.linode.com/v4beta/linode/instances/97190737 method: DELETE response: body: '{}' @@ -879,7 +1080,7 @@ interactions: Content-Type: - application/json Expires: - - Thu, 11 Jul 2024 18:29:09 GMT + - Wed, 06 May 2026 02:21:24 GMT Pragma: - no-cache Strict-Transport-Security: @@ -896,7 +1097,7 @@ interactions: X-Oauth-Scopes: - '*' X-Ratelimit-Limit: - - "400" + - "1840" X-Xss-Protection: - 1; mode=block status: 200 OK diff --git a/test/integration/iam_io_ready_test.go b/test/integration/iam_io_ready_test.go index 2b06675ac..220de4a97 100644 --- a/test/integration/iam_io_ready_test.go +++ b/test/integration/iam_io_ready_test.go @@ -165,7 +165,7 @@ func TestIAM_GetIOReadyForUpdatedVolume(t *testing.T) { updateOpts := linodego.VolumeUpdateOptions{ Label: labelUpdated, - Tags: &tagsUpdated, + Tags: tagsUpdated, } volume, err := client.UpdateVolume(context.Background(), volume.ID, updateOpts) require.NoErrorf(t, err, "Error updating volume: %v", err) diff --git a/test/integration/image_sharegroups_test.go b/test/integration/image_sharegroups_test.go index 11dfb78eb..0dd4f9f30 100644 --- a/test/integration/image_sharegroups_test.go +++ b/test/integration/image_sharegroups_test.go @@ -14,7 +14,7 @@ func TestImageSharing_Suite(t *testing.T) { client, instance, teardown, err := setupInstance( t, "fixtures/TestImageSharing_Suite", true, func(client *linodego.Client, options *linodego.InstanceCreateOptions) { - options.Region = getRegionsWithCaps(t, client, []string{"Linodes"})[0] + options.Region = getRegionsWithCaps(t, client, []linodego.RegionCapability{linodego.CapabilityDBAAS})[0] options.Image = "linode/alpine3.22" }) if err != nil { diff --git a/test/integration/images_test.go b/test/integration/images_test.go index 8abb13c75..567048283 100644 --- a/test/integration/images_test.go +++ b/test/integration/images_test.go @@ -7,6 +7,7 @@ import ( "testing" "github.com/dnaeon/go-vcr/recorder" + "github.com/linode/linodego" . "github.com/linode/linodego" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -110,12 +111,12 @@ func TestImage_CreateUpload(t *testing.T) { defer teardown() image, uploadURL, err := client.CreateImageUpload(context.Background(), ImageCreateUploadOptions{ - Region: getRegionsWithCaps(t, client, []string{"Metadata"})[0], + Region: getRegionsWithCaps(t, client, []linodego.RegionCapability{linodego.CapabilityMetadata})[0], Label: "linodego-image-create-upload", Description: "An image that does stuff.", CloudInit: true, - Tags: &[]string{"foo", "bar"}, + Tags: []string{"foo", "bar"}, }) if err != nil { t.Errorf("Failed to create image upload: %v", err) @@ -139,7 +140,7 @@ func TestImage_CloudInit(t *testing.T) { client, instance, teardown, err := setupInstance( t, "fixtures/TestImage_CloudInit", true, func(client *Client, options *InstanceCreateOptions) { - options.Region = getRegionsWithCaps(t, client, []string{"Metadata"})[0] + options.Region = getRegionsWithCaps(t, client, []linodego.RegionCapability{linodego.CapabilityMetadata})[0] }) if err != nil { t.Fatal(err) @@ -159,7 +160,7 @@ func TestImage_CloudInit(t *testing.T) { DiskID: instanceDisks[0].ID, Label: "linodego-test-cloud-init", CloudInit: true, - Tags: &[]string{"test1", "test2"}, + Tags: []string{"test1", "test2"}, }) if err != nil { t.Errorf("Failed to create image: %v", err) @@ -180,7 +181,7 @@ func TestImage_Replicate(t *testing.T) { client, teardown := createTestClient(t, "fixtures/TestImage_Replicate") defer teardown() - availableRegions := getRegionsWithCapsAndSiteType(t, client, []string{"Object Storage"}, "core") + availableRegions := getRegionsWithCapsAndSiteType(t, client, []linodego.RegionCapability{linodego.CapabilityObjectStorage}, "core") image, uploadURL, err := client.CreateImageUpload(context.Background(), ImageCreateUploadOptions{ Region: availableRegions[1], diff --git a/test/integration/instance_config_test.go b/test/integration/instance_config_test.go index 918ce153a..0e4068cdf 100644 --- a/test/integration/instance_config_test.go +++ b/test/integration/instance_config_test.go @@ -5,6 +5,7 @@ import ( "reflect" "testing" + "github.com/linode/linodego" . "github.com/linode/linodego" "github.com/stretchr/testify/require" ) @@ -68,7 +69,10 @@ func setupInstanceWithVPCAndNATOneToOne(t *testing.T, fixturesYaml string) ( t, fixturesYaml, func(client *Client, opts *InstanceCreateOptions) { - opts.Region = getRegionsWithCaps(t, client, []string{"Linodes", "VPCs"})[0] + opts.Region = getRegionsWithCaps(t, client, []linodego.RegionCapability{ + linodego.CapabilityLinodes, + linodego.CapabilityVPCs, + })[0] }, ) if err != nil { @@ -160,7 +164,8 @@ func setupInstanceWithDualStackVPCAndNAT11(t *testing.T, fixturesYaml string) ( // TODO: Revert once rolled out to all DCs. // NOTE: There is currently no VPC Dual Stack region capability // so this needs to be hardcoded. - // opts.Region = getRegionsWithCaps(t, client, []string{"Linodes", "VPCs"})[0] + // opts.Region = getRegionsWithCaps(t, client, []linodego.RegionCapability{linodego.CapabilityLinodes, + // linodego.CapabilityVPCs})[0] opts.Region = "no-osl-1" }, ) @@ -212,7 +217,10 @@ func setupInstanceWith3Interfaces(t *testing.T, fixturesYaml string) ( t, fixturesYaml, func(client *Client, opts *InstanceCreateOptions) { - opts.Region = getRegionsWithCaps(t, client, []string{"Linodes", "VPCs"})[0] + opts.Region = getRegionsWithCaps(t, client, []linodego.RegionCapability{ + linodego.CapabilityLinodes, + linodego.CapabilityVPCs, + })[0] }, ) if err != nil { @@ -304,7 +312,10 @@ func TestInstance_ConfigInterfaces_AppendDelete(t *testing.T) { "fixtures/TestInstance_ConfigInterfaces_AppendDelete", func(client *Client, opts *InstanceCreateOptions) { // Ensure we're in a region that supports VLANs - opts.Region = getRegionsWithCaps(t, client, []string{"vlans", "VPCs"})[0] + opts.Region = getRegionsWithCaps(t, client, []linodego.RegionCapability{ + linodego.CapabilityVlans, + linodego.CapabilityVPCs, + })[0] }, ) defer teardown() @@ -454,7 +465,10 @@ func TestInstance_ConfigInterfaces_Update(t *testing.T) { "fixtures/TestInstance_ConfigInterfaces_Update", func(client *Client, opts *InstanceCreateOptions) { // Ensure we're in a region that supports VLANs - opts.Region = getRegionsWithCaps(t, client, []string{"vlans", "VPCs"})[0] + opts.Region = getRegionsWithCaps(t, client, []linodego.RegionCapability{ + linodego.CapabilityVlans, + linodego.CapabilityVPCs, + })[0] }, ) defer teardown() @@ -528,7 +542,10 @@ func TestInstance_ConfigInterface_Update(t *testing.T) { "fixtures/TestInstance_ConfigInterface_Update", func(client *Client, opts *InstanceCreateOptions) { // Ensure we're in a region that supports VLANs - opts.Region = getRegionsWithCaps(t, client, []string{"vlans", "VPCs"})[0] + opts.Region = getRegionsWithCaps(t, client, []linodego.RegionCapability{ + linodego.CapabilityVlans, + linodego.CapabilityVPCs, + })[0] }, ) defer teardown() @@ -577,7 +594,7 @@ func TestInstance_ConfigInterface_Update(t *testing.T) { NAT1To1: &NAT1To1Any, } newIPRanges := make([]string, 0) - updateOpts.IPRanges = &newIPRanges + updateOpts.IPRanges = newIPRanges updatedIntfc, err = client.UpdateInstanceConfigInterface( context.Background(), diff --git a/test/integration/instance_interfaces_test.go b/test/integration/instance_interfaces_test.go index fc63b7cb9..a5d100b23 100644 --- a/test/integration/instance_interfaces_test.go +++ b/test/integration/instance_interfaces_test.go @@ -21,7 +21,7 @@ func createInstanceWithLinodeInterfaces( createOpts := linodego.InstanceCreateOptions{ Label: "go-test-intf-" + randLabel(), RootPass: randPassword(), - Region: getRegionsWithCaps(t, client, []string{linodego.CapabilityLinodeInterfaces})[0], + Region: getRegionsWithCaps(t, client, []linodego.RegionCapability{linodego.CapabilityLinodeInterfaces})[0], Type: "g6-nanode-1", Image: "linode/debian12", Booted: linodego.Pointer(false), @@ -80,7 +80,7 @@ func TestInstance_CreateWithLinodeInterfaces( client, fixtureTeardown := createTestClient(t, "fixtures/TestInstance_CreateWithLinodeInterfaces") t.Cleanup(fixtureTeardown) - testRegion := getRegionsWithCaps(t, client, []string{linodego.CapabilityVPCs, linodego.CapabilityLinodeInterfaces})[0] + testRegion := getRegionsWithCaps(t, client, []linodego.RegionCapability{linodego.CapabilityVPCs, linodego.CapabilityLinodeInterfaces})[0] _, vpcSubnet, vpcTeardown, err := createVPCWithSubnet( t, client, @@ -102,7 +102,7 @@ func TestInstance_CreateWithLinodeInterfaces( FirewallID: linodego.Pointer(firewallID), Public: &linodego.PublicInterfaceCreateOptions{ IPv4: &linodego.PublicInterfaceIPv4CreateOptions{ - Addresses: &[]linodego.PublicInterfaceIPv4AddressCreateOptions{ + Addresses: []linodego.PublicInterfaceIPv4AddressCreateOptions{ { Address: linodego.Pointer("auto"), Primary: linodego.Pointer(true), @@ -117,7 +117,7 @@ func TestInstance_CreateWithLinodeInterfaces( VPC: &linodego.VPCInterfaceCreateOptions{ SubnetID: vpcSubnet.ID, IPv4: &linodego.VPCInterfaceIPv4CreateOptions{ - Addresses: &[]linodego.VPCInterfaceIPv4AddressCreateOptions{ + Addresses: []linodego.VPCInterfaceIPv4AddressCreateOptions{ { Address: linodego.Pointer("auto"), Primary: linodego.Pointer(true), diff --git a/test/integration/instances_test.go b/test/integration/instances_test.go index 8711e8193..c525b4779 100644 --- a/test/integration/instances_test.go +++ b/test/integration/instances_test.go @@ -121,11 +121,6 @@ func TestInstance_GetMonthlyTransfer(t *testing.T) { if err != nil { t.Errorf("Error getting monthly instance transfer, expected struct, got error %v", err) } - - _, err = client.GetInstanceTransferMonthlyV2(context.Background(), instance.ID, testYear, testMonth) - if err != nil { - t.Errorf("Error getting monthly instance transfer, expected struct, got error %v", err) - } } func TestInstance_ResetPassword(t *testing.T) { @@ -255,7 +250,7 @@ func TestInstance_MigrateToPG(t *testing.T) { clientTeardown() }() - regions := getRegionsWithCaps(t, client, []string{"Placement Group"}) + regions := getRegionsWithCaps(t, client, []linodego.RegionCapability{linodego.CapabilityPlacementGroup}) pgOutboundCreateOpts := linodego.PlacementGroupCreateOptions{ Label: "linodego-test-" + getUniqueText(), @@ -373,7 +368,7 @@ func TestInstance_Disks_List_WithEncryption(t *testing.T) { "fixtures/TestInstance_Disks_List_WithEncryption", true, func(c *linodego.Client, ico *linodego.InstanceCreateOptions) { - ico.Region = getRegionsWithCaps(t, c, []string{"Disk Encryption"})[0] + ico.Region = getRegionsWithCaps(t, c, []linodego.RegionCapability{linodego.CapabilityDiskEncryption})[0] }, ) defer teardown() @@ -693,7 +688,7 @@ func TestInstance_Rebuild(t *testing.T) { t, "fixtures/TestInstance_Rebuild", true, func(client *linodego.Client, options *linodego.InstanceCreateOptions) { - options.Region = getRegionsWithCaps(t, client, []string{"Metadata"})[0] + options.Region = getRegionsWithCaps(t, client, []linodego.RegionCapability{linodego.CapabilityMetadata})[0] }, ) defer teardown() @@ -731,7 +726,7 @@ func TestInstance_RebuildWithEncryption(t *testing.T) { "fixtures/TestInstance_RebuildWithEncryption", true, func(client *linodego.Client, options *linodego.InstanceCreateOptions) { - options.Region = getRegionsWithCaps(t, client, []string{"Disk Encryption"})[0] + options.Region = getRegionsWithCaps(t, client, []linodego.RegionCapability{linodego.CapabilityDiskEncryption})[0] options.DiskEncryption = linodego.InstanceDiskEncryptionEnabled }, ) @@ -768,7 +763,7 @@ func TestInstance_Clone(t *testing.T) { client, instance, teardownOriginalLinode, err := setupInstance( t, "fixtures/TestInstance_Clone", true, func(client *linodego.Client, options *linodego.InstanceCreateOptions) { - targetRegion = getRegionsWithCaps(t, client, []string{"Metadata"})[0] + targetRegion = getRegionsWithCaps(t, client, []linodego.RegionCapability{linodego.CapabilityMetadata})[0] options.Region = targetRegion }) @@ -864,7 +859,7 @@ func TestInstance_withMetadata(t *testing.T) { options.Metadata = &linodego.InstanceMetadataOptions{ UserData: base64.StdEncoding.EncodeToString([]byte("reallycoolmetadata")), } - options.Region = getRegionsWithCaps(t, client, []string{"Metadata"})[0] + options.Region = getRegionsWithCaps(t, client, []linodego.RegionCapability{linodego.CapabilityMetadata})[0] }) if err != nil { t.Fatal(err) @@ -897,7 +892,10 @@ func TestInstance_withBlockStorageEncryption(t *testing.T) { client, clientTeardown := createTestClient(t, "fixtures/TestInstance_withBlockStorageEncryption") inst, err := createInstance(t, client, true, func(client *linodego.Client, options *linodego.InstanceCreateOptions) { - options.Region = getRegionsWithCaps(t, client, []string{"Linodes", "Block Storage Encryption"})[0] + options.Region = getRegionsWithCaps(t, client, []linodego.RegionCapability{ + linodego.CapabilityLinodes, + linodego.CapabilityBlockStorageEncryption, + })[0] options.Label = "go-inst-test-create-bde" }) require.NoError(t, err) @@ -965,7 +963,7 @@ func createInstance(t *testing.T, client *linodego.Client, enableCloudFirewall b createOpts := linodego.InstanceCreateOptions{ Label: "go-test-ins-" + randLabel(), RootPass: randPassword(), - Region: getRegionsWithCaps(t, client, []string{"linodes"})[0], + Region: getRegionsWithCaps(t, client, []linodego.RegionCapability{linodego.CapabilityLinodes})[0], Type: "g6-nanode-1", Image: "linode/debian12", Booted: linodego.Pointer(false), @@ -1017,8 +1015,11 @@ func createInstanceWithoutDisks( t.Helper() createOpts := linodego.InstanceCreateOptions{ - Label: "go-test-ins-wo-disk-" + randLabel(), - Region: getRegionsWithCaps(t, client, []string{"Linodes", "Maintenance Policy"})[0], + Label: "go-test-ins-wo-disk-" + randLabel(), + Region: getRegionsWithCaps(t, client, []linodego.RegionCapability{ + linodego.CapabilityLinodes, + linodego.CapabilityMaintenancePolicy, + })[0], Type: "g6-nanode-1", Booted: linodego.Pointer(false), } @@ -1077,7 +1078,7 @@ func TestInstance_MaintenancePolicy(t *testing.T) { region := getRegionsWithCapsAndSiteType( t, client, - []string{"Linodes", "Maintenance Policy"}, + []linodego.RegionCapability{linodego.CapabilityLinodes, linodego.CapabilityMaintenancePolicy}, "core", )[0] @@ -1159,7 +1160,7 @@ func TestExpectedErrorIfFieldsAuthorizedUsersAuthorizedKeysRootPassAreNotSet(t * region := getRegionsWithCapsAndSiteType( t, client, - []string{linodego.CapabilityLinodes, linodego.CapabilityMaintenancePolicy}, + []linodego.RegionCapability{linodego.CapabilityLinodes, linodego.CapabilityMaintenancePolicy}, "core", )[0] _, err := client.CreateInstance(context.Background(), @@ -1184,7 +1185,7 @@ func TestCreateLinodeWithKernelAndBootSizeThenAddDiskAndRebuild(t *testing.T) { region := getRegionsWithCapsAndSiteType( t, client, - []string{linodego.CapabilityLinodes, linodego.CapabilityMaintenancePolicy}, + []linodego.RegionCapability{linodego.CapabilityLinodes, linodego.CapabilityMaintenancePolicy}, "core", )[0] instance, err := client.CreateInstance(context.Background(), diff --git a/test/integration/integration_suite_test.go b/test/integration/integration_suite_test.go index 3ca0cb8a2..404694b81 100644 --- a/test/integration/integration_suite_test.go +++ b/test/integration/integration_suite_test.go @@ -194,7 +194,7 @@ Parameters: Returns: - string values representing the IDs of regions that have a given set of capabilities. */ -func getRegionsWithCaps(t *testing.T, client *linodego.Client, capabilities []string) []string { +func getRegionsWithCaps(t *testing.T, client *linodego.Client, capabilities []linodego.RegionCapability) []string { result := make([]string, 0) regions, err := client.ListRegions(context.Background(), nil) @@ -215,7 +215,7 @@ func getRegionsWithCaps(t *testing.T, client *linodego.Client, capabilities []st // getRegionWithCapsAndPlans resolves a list of regions that meet the given capabilities // and has availability for all the provided plans. -func getRegionsWithCapsAndPlans(t *testing.T, client *linodego.Client, capabilities, plans []string) []string { +func getRegionsWithCapsAndPlans(t *testing.T, client *linodego.Client, capabilities []linodego.RegionCapability, plans []string) []string { regionsWithCaps := getRegionsWithCaps(t, client, capabilities) regionsAvailabilities, err := client.ListRegionsAvailability(context.Background(), nil) @@ -255,7 +255,7 @@ func getRegionsWithCapsAndPlans(t *testing.T, client *linodego.Client, capabilit } // getRegionsWithCapsAndSiteType returns a list of regions that meet the given capabilities and site type -func getRegionsWithCapsAndSiteType(t *testing.T, client *linodego.Client, capabilities []string, siteType string) []string { +func getRegionsWithCapsAndSiteType(t *testing.T, client *linodego.Client, capabilities []linodego.RegionCapability, siteType string) []string { result := make([]string, 0) regions, err := client.ListRegions(context.Background(), nil) @@ -274,7 +274,7 @@ func getRegionsWithCapsAndSiteType(t *testing.T, client *linodego.Client, capabi return result } -func regionHasCaps(r linodego.Region, capabilities []string) bool { +func regionHasCaps(r linodego.Region, capabilities []linodego.RegionCapability) bool { capsMap := make(map[string]bool) for _, c := range r.Capabilities { @@ -282,7 +282,7 @@ func regionHasCaps(r linodego.Region, capabilities []string) bool { } for _, c := range capabilities { - if _, ok := capsMap[strings.ToUpper(c)]; !ok { + if _, ok := capsMap[strings.ToUpper(string(c))]; !ok { return false } } diff --git a/test/integration/lke_clusters_acl_test.go b/test/integration/lke_clusters_acl_test.go index 56cc254fd..dd99ca762 100644 --- a/test/integration/lke_clusters_acl_test.go +++ b/test/integration/lke_clusters_acl_test.go @@ -20,8 +20,8 @@ func TestLKECluster_withACL(t *testing.T) { ACL: &linodego.LKEClusterControlPlaneACLOptions{ Enabled: &valueTrue, Addresses: &linodego.LKEClusterControlPlaneACLAddressesOptions{ - IPv4: &[]string{"10.0.0.1/32"}, - IPv6: &[]string{"1234::5678"}, + IPv4: []string{"10.0.0.1/32"}, + IPv6: []string{"1234::5678"}, }, }, } @@ -48,8 +48,8 @@ func TestLKECluster_withACL(t *testing.T) { ACL: linodego.LKEClusterControlPlaneACLOptions{ Enabled: &valueTrue, Addresses: &linodego.LKEClusterControlPlaneACLAddressesOptions{ - IPv4: &[]string{"10.0.0.2/32"}, - IPv6: &[]string{}, + IPv4: []string{"10.0.0.2/32"}, + IPv6: []string{}, }, RevisionID: testRevisionID, }, diff --git a/test/integration/lke_clusters_test.go b/test/integration/lke_clusters_test.go index 6d52bdc23..f351221cb 100644 --- a/test/integration/lke_clusters_test.go +++ b/test/integration/lke_clusters_test.go @@ -128,7 +128,6 @@ func TestLKECluster_Enterprise_BYOVPC_smoke(t *testing.T) { func TestLKECluster_Update(t *testing.T) { client, cluster, teardown, err := setupLKECluster(t, []clusterModifier{func(createOpts *linodego.LKEClusterCreateOptions) { createOpts.Label = "go-lke-test-update" - createOpts.K8sVersion = "1.31" }}, "fixtures/TestLKECluster_Update") defer teardown() if err != nil { @@ -137,12 +136,10 @@ func TestLKECluster_Update(t *testing.T) { updatedTags := []string{"test=true"} updatedLabel := cluster.Label + "-updated" - updatedK8sVersion := "1.32" updatedCluster, err := client.UpdateLKECluster(context.Background(), cluster.ID, linodego.LKEClusterUpdateOptions{ - Tags: &updatedTags, - Label: updatedLabel, - K8sVersion: updatedK8sVersion, + Tags: updatedTags, + Label: updatedLabel, }) if err != nil { t.Fatalf("failed to update LKE Cluster (%d): %s", cluster.ID, err) @@ -152,10 +149,6 @@ func TestLKECluster_Update(t *testing.T) { t.Errorf("expected label to be updated to %q; got %q", updatedLabel, updatedCluster.Label) } - if updatedCluster.K8sVersion != updatedK8sVersion { - t.Errorf("expected k8s version to be updated to %q; got %q", updatedK8sVersion, updatedCluster.K8sVersion) - } - if !reflect.DeepEqual(updatedTags, updatedCluster.Tags) { t.Errorf("expected tags to be updated to %#v; got %#v", updatedTags, updatedCluster.Tags) } @@ -441,7 +434,10 @@ func setupLKECluster(t *testing.T, clusterModifiers []clusterModifier, fixturesY } if createOpts.Region == "" { - createOpts.Region = getRegionsWithCaps(t, client, []string{"Kubernetes", "LA Disk Encryption"})[0] + createOpts.Region = getRegionsWithCaps(t, client, []linodego.RegionCapability{ + linodego.CapabilityLKE, + linodego.CapabilityLADiskEncryption, + })[0] } if createOpts.K8sVersion == "" { diff --git a/test/integration/lke_node_pools_test.go b/test/integration/lke_node_pools_test.go index bea95820b..0349c4b46 100644 --- a/test/integration/lke_node_pools_test.go +++ b/test/integration/lke_node_pools_test.go @@ -207,8 +207,8 @@ func TestLKENodePool_Update(t *testing.T) { } updatedTags := []string{} updated, err := client.UpdateLKENodePool(context.TODO(), lkeCluster.ID, nodePool.ID, linodego.LKENodePoolUpdateOptions{ - Count: 2, // downsize - Tags: &updatedTags, // remove all tags + Count: 2, // downsize + Tags: updatedTags, // remove all tags Autoscaler: &updatedAutoscaler, }) if err != nil { @@ -237,9 +237,9 @@ func TestLKENodePool_Update(t *testing.T) { }} updated, err = client.UpdateLKENodePool(context.TODO(), lkeCluster.ID, nodePool.ID, linodego.LKENodePoolUpdateOptions{ Count: 3, // upsize - Tags: &updatedTags, // repopulate tags + Tags: updatedTags, // repopulate tags Labels: &updatedLabels, // set a label - Taints: &updatedTaints, // set a taint + Taints: updatedTaints, // set a taint }) if err != nil { t.Fatal(err) diff --git a/test/integration/main_test.go b/test/integration/main_test.go index 6f497ff13..979f34da5 100644 --- a/test/integration/main_test.go +++ b/test/integration/main_test.go @@ -82,7 +82,7 @@ func getDefaultFirewallRuleSet(publicIPv4 string) linodego.FirewallRuleSet { Action: "ACCEPT", Ports: "22", Protocol: "TCP", - Addresses: linodego.NetworkAddresses{IPv4: &[]string{publicIPv4}}, + Addresses: linodego.NetworkAddresses{IPv4: []string{publicIPv4}}, } return linodego.FirewallRuleSet{ diff --git a/test/integration/maintenance_test.go b/test/integration/maintenance_test.go index 8ce207aad..b8d22650c 100644 --- a/test/integration/maintenance_test.go +++ b/test/integration/maintenance_test.go @@ -2,10 +2,8 @@ package integration import ( "context" - "encoding/json" "testing" - "github.com/linode/linodego" "github.com/stretchr/testify/require" ) @@ -13,21 +11,7 @@ func TestMaintenancePolicies_List(t *testing.T) { client, fixtureTeardown := createTestClient(t, "fixtures/TestMaintenancePolicies_List") defer fixtureTeardown() - resp, err := client.R(context.Background()).Get("maintenance/policies") - require.NoError(t, err) - - var result map[string]any - err = json.Unmarshal(resp.Body(), &result) - require.NoError(t, err) - - dataRaw, ok := result["data"] - require.True(t, ok, "Expected 'data' key in response") - - dataJSON, err := json.Marshal(dataRaw) - require.NoError(t, err) - - var policies []linodego.MaintenancePolicy - err = json.Unmarshal(dataJSON, &policies) + policies, err := client.ListMaintenancePolicies(context.Background(), nil) require.NoError(t, err) if len(policies) == 0 { diff --git a/test/integration/monitor_alert_definitions_test.go b/test/integration/monitor_alert_definitions_test.go index 566fc4f6f..f8f243658 100644 --- a/test/integration/monitor_alert_definitions_test.go +++ b/test/integration/monitor_alert_definitions_test.go @@ -113,7 +113,6 @@ func TestMonitorAlertDefinition_smoke(t *testing.T) { assert.Equal(t, createOpts.Label, createdAlert.Label) assert.Equal(t, createOpts.Severity, createdAlert.Severity) assert.Equal(t, *createOpts.Description, createdAlert.Description) - assert.ElementsMatch(t, createOpts.EntityIDs, createdAlert.EntityIDs) // assert.Equal(t, fetchedChannel.Label, createdAlert.AlertChannels[0].Label) // More thorough assertions on the created alert's nested fields diff --git a/test/integration/mysql_test.go b/test/integration/mysql_test.go index a873563e2..d277f577c 100644 --- a/test/integration/mysql_test.go +++ b/test/integration/mysql_test.go @@ -55,7 +55,7 @@ func TestDatabase_MySQL_Suite(t *testing.T) { updatedLabel := database.Label + "-updated" opts := linodego.MySQLUpdateOptions{ - AllowList: &allowList, + AllowList: allowList, Label: updatedLabel, Updates: &updatedWindow, } @@ -161,7 +161,7 @@ func createMySQLDatabase(t *testing.T, client *linodego.Client, createOpts := linodego.MySQLCreateOptions{ Label: "go-mysql-test-def" + randLabel(), - Region: getRegionsWithCaps(t, client, []string{"Managed Databases"})[0], + Region: getRegionsWithCaps(t, client, []linodego.RegionCapability{linodego.CapabilityDBAAS})[0], Type: "g6-nanode-1", Engine: "mysql/8", ClusterSize: 3, diff --git a/test/integration/network_ips_test.go b/test/integration/network_ips_test.go index fef3d2f4b..b96308d09 100644 --- a/test/integration/network_ips_test.go +++ b/test/integration/network_ips_test.go @@ -97,7 +97,7 @@ func TestIPAddresses_List_smoke(t *testing.T) { } rdns := fmt.Sprintf("%s.nip.io", ip.Address) - _, err = client.UpdateIPAddressV2(context.Background(), ip.Address, IPAddressUpdateOptionsV2{ + _, err = client.UpdateIPAddress(context.Background(), ip.Address, IPAddressUpdateOptions{ RDNS: linodego.Pointer(linodego.Pointer(rdns)), }) if err != nil { @@ -191,18 +191,18 @@ func TestIPAddress_Update(t *testing.T) { originalRDNS := i.IPv4.Public[0].RDNS // Update RDNS to nip.io - updateOpts := IPAddressUpdateOptionsV2{ + updateOpts := IPAddressUpdateOptions{ RDNS: linodego.Pointer(linodego.Pointer(fmt.Sprintf("%s.nip.io", i.IPv4.Public[0].Address))), } - ip, err := client.UpdateIPAddressV2(context.Background(), address, updateOpts) + ip, err := client.UpdateIPAddress(context.Background(), address, updateOpts) require.NoError(t, err) // Update RDNS to default - updateOpts = IPAddressUpdateOptionsV2{ + updateOpts = IPAddressUpdateOptions{ RDNS: linodego.Pointer[*string](nil), } - ip, err = client.UpdateIPAddressV2(context.Background(), ip.Address, updateOpts) + ip, err = client.UpdateIPAddress(context.Background(), ip.Address, updateOpts) require.NoError(t, err) require.NotNil(t, ip) @@ -219,10 +219,10 @@ func TestIPAddress_Update(t *testing.T) { // Scenario 1: Convert ephemeral IP to reserved IP ephemeralIP := instance.IPv4[0].String() - updateOpts = IPAddressUpdateOptionsV2{ + updateOpts = IPAddressUpdateOptions{ Reserved: &reservedTrue, } - updatedIP, err := client.UpdateIPAddressV2(context.Background(), ephemeralIP, updateOpts) + updatedIP, err := client.UpdateIPAddress(context.Background(), ephemeralIP, updateOpts) if err != nil { t.Fatalf("Failed to convert ephemeral IP to reserved: %v", err) } @@ -238,10 +238,10 @@ func TestIPAddress_Update(t *testing.T) { } defer client.DeleteReservedIPAddress(context.Background(), reservedIP) - updateOpts = IPAddressUpdateOptionsV2{ + updateOpts = IPAddressUpdateOptions{ Reserved: &reservedTrue, } - updatedIP, err = client.UpdateIPAddressV2(context.Background(), reservedIP, updateOpts) + updatedIP, err = client.UpdateIPAddress(context.Background(), reservedIP, updateOpts) if err != nil { t.Fatalf("Failed to update reserved IP: %v", err) } @@ -252,10 +252,10 @@ func TestIPAddress_Update(t *testing.T) { // Scenario 3: Convert reserved to ephemeral ephemeralIP = instance.IPv4[0].String() - updateOpts = IPAddressUpdateOptionsV2{ + updateOpts = IPAddressUpdateOptions{ Reserved: &reservedFalse, } - updatedIP, err = client.UpdateIPAddressV2(context.Background(), ephemeralIP, updateOpts) + updatedIP, err = client.UpdateIPAddress(context.Background(), ephemeralIP, updateOpts) if err != nil { t.Fatalf("Failed to update ephemeral IP: %v", err) } @@ -285,10 +285,10 @@ func TestIPAddress_Update(t *testing.T) { t.Fatalf("Failed to assign reserved IP: %v", err) } - updateOpts = IPAddressUpdateOptionsV2{ + updateOpts = IPAddressUpdateOptions{ Reserved: &reservedFalse, } - updatedIP, err = client.UpdateIPAddressV2(context.Background(), reservedIP, updateOpts) + updatedIP, err = client.UpdateIPAddress(context.Background(), reservedIP, updateOpts) if err != nil { t.Fatalf("Failed to convert assigned reserved IP to ephemeral: %v", err) } @@ -303,11 +303,11 @@ func TestIPAddress_Update(t *testing.T) { t.Fatalf("Failed to create reserved IP: %v", unassignedResIpErr) } - updateOpts = IPAddressUpdateOptionsV2{ + updateOpts = IPAddressUpdateOptions{ Reserved: &reservedTrue, RDNS: linodego.Pointer(linodego.Pointer("sample rdns")), } - _, err = client.UpdateIPAddressV2(context.Background(), unassignedResIP, updateOpts) + _, err = client.UpdateIPAddress(context.Background(), unassignedResIP, updateOpts) if err == nil { t.Fatalf("Expected error when setting RDNS for unassigned reserved IP, but got none") } @@ -321,10 +321,10 @@ func TestIPAddress_Update(t *testing.T) { t.Fatalf("Failed to create reserved IP: %v", err) } - updateOpts = IPAddressUpdateOptionsV2{ + updateOpts = IPAddressUpdateOptions{ Reserved: &reservedTrue, } - updatedIP, err = client.UpdateIPAddressV2(context.Background(), reservedIP, updateOpts) + updatedIP, err = client.UpdateIPAddress(context.Background(), reservedIP, updateOpts) if err != nil { t.Fatalf("Failed to update unassigned reserved IP: %v", err) } @@ -341,10 +341,10 @@ func TestIPAddress_Update(t *testing.T) { t.Fatalf("Failed to create reserved IP: %v", err) } - updateOpts = IPAddressUpdateOptionsV2{ + updateOpts = IPAddressUpdateOptions{ Reserved: &reservedFalse, } - _, err = client.UpdateIPAddressV2(context.Background(), reservedIP, updateOpts) + _, err = client.UpdateIPAddress(context.Background(), reservedIP, updateOpts) if err != nil { t.Fatalf("Failed to convert unassigned reserved IP to unassigned: %v", err) } @@ -359,11 +359,11 @@ func TestIPAddress_Update(t *testing.T) { invalidResIp := "123.72.121.76" - updateOpts = IPAddressUpdateOptionsV2{ + updateOpts = IPAddressUpdateOptions{ Reserved: &reservedFalse, } - updatedIP, err = client.UpdateIPAddressV2(context.Background(), invalidResIp, updateOpts) + updatedIP, err = client.UpdateIPAddress(context.Background(), invalidResIp, updateOpts) if err == nil { t.Fatalf("Expected error indicating the IP address is invalid, got nil") } diff --git a/test/integration/nodebalancer_configs_test.go b/test/integration/nodebalancer_configs_test.go index 6fc19203e..f318371da 100644 --- a/test/integration/nodebalancer_configs_test.go +++ b/test/integration/nodebalancer_configs_test.go @@ -256,7 +256,10 @@ func setupNodeBalancerWithVPCAndInstance( t, fixturesYaml, func(client *linodego.Client, options *linodego.VPCCreateOptions) { - options.Region = getRegionsWithCaps(t, client, []string{"Linodes", "VPCs"})[1] + options.Region = getRegionsWithCaps(t, client, []linodego.RegionCapability{ + linodego.CapabilityLinodes, + linodego.CapabilityVPCs, + })[1] }, ) if err != nil { @@ -269,7 +272,10 @@ func setupNodeBalancerWithVPCAndInstance( client, true, func(client *linodego.Client, opts *linodego.InstanceCreateOptions) { - opts.Region = getRegionsWithCaps(t, client, []string{"Linodes", "VPCs"})[1] + opts.Region = getRegionsWithCaps(t, client, []linodego.RegionCapability{ + linodego.CapabilityLinodes, + linodego.CapabilityVPCs, + })[1] opts.Image = "linode/ubuntu22.04" opts.RootPass = "0o37Klm56P4ssw0rd" diff --git a/test/integration/nodebalancers_test.go b/test/integration/nodebalancers_test.go index 5d909a26a..e566c039f 100644 --- a/test/integration/nodebalancers_test.go +++ b/test/integration/nodebalancers_test.go @@ -201,7 +201,7 @@ func setupNodeBalancer(t *testing.T, fixturesYaml string, nbModifiers []nbModifi client, fixtureTeardown := createTestClient(t, fixturesYaml) createOpts := linodego.NodeBalancerCreateOptions{ Label: &label, - Region: getRegionsWithCaps(t, client, []string{"NodeBalancers"})[0], + Region: getRegionsWithCaps(t, client, []linodego.RegionCapability{linodego.CapabilityNodeBalancers})[0], ClientConnThrottle: &clientConnThrottle, FirewallID: GetFirewallID(), } diff --git a/test/integration/object_storage_bucket_certs_test.go b/test/integration/object_storage_bucket_certs_test.go index 20a0ca295..b31f968ec 100644 --- a/test/integration/object_storage_bucket_certs_test.go +++ b/test/integration/object_storage_bucket_certs_test.go @@ -133,19 +133,6 @@ func TestObjectStorageBucketCert_smoke(t *testing.T) { t.Fatalf("failed to upload bucket cert: %s", err) } - err = client.DeleteObjectStorageBucketCert(context.TODO(), bucket.Region, bucket.Label) - if err != nil { - t.Fatalf("failed to upload bucket cert: %s", err) - } - - _, err = client.UploadObjectStorageBucketCertV2(context.TODO(), bucket.Region, bucket.Label, linodego.ObjectStorageBucketCertUploadOptions{ - Certificate: testCertifcate, - PrivateKey: testPrivateKey, - }) - if err != nil { - t.Fatalf("failed to upload bucket cert: %s", err) - } - defer func() { if err := client.DeleteObjectStorageBucketCert(context.TODO(), bucket.Region, bucket.Label); err != nil { t.Errorf("failed to delete bucket cert: %s", err) @@ -157,16 +144,7 @@ func TestObjectStorageBucketCert_smoke(t *testing.T) { t.Fatalf("failed to get bucket cert: %s", err) } - if !cert.SSL { - t.Fatalf("expected cert.SSL to be true; got false") - } - - certv2, err := client.GetObjectStorageBucketCertV2(context.TODO(), bucket.Region, bucket.Label) - if err != nil { - t.Fatalf("failed to get bucket cert: %s", err) - } - - if certv2 == nil || !*certv2.SSL { + if cert == nil || !*cert.SSL { t.Fatalf("expected cert.SSL to be true; got false") } } diff --git a/test/integration/object_storage_buckets_test.go b/test/integration/object_storage_buckets_test.go index 9476cde52..defd1011a 100644 --- a/test/integration/object_storage_buckets_test.go +++ b/test/integration/object_storage_buckets_test.go @@ -12,11 +12,6 @@ import ( var objectStorageBucketTestLabel = "go-bucket-test-def" var testObjectStorageBucketCreateOpts = ObjectStorageBucketCreateOptions{ - Cluster: "us-east-1", - Label: objectStorageBucketTestLabel, -} - -var testRegionalObjectStorageBucketCreateOpts = ObjectStorageBucketCreateOptions{ Region: "us-east", Label: objectStorageBucketTestLabel, } @@ -35,51 +30,11 @@ func TestObjectStorageBucket_Create_smoke(t *testing.T) { // when comparing fixtures to random value Label will differ, compare the known prefix if bucket.Label != expected.Label || - bucket.Cluster != expected.Cluster { - t.Errorf("Object Storage Bucket did not match CreateOptions") - } - - assertDateSet(t, bucket.Created) -} - -func TestObjectStorageBucket_Regional(t *testing.T) { - client, teardown := createTestClient(t, "fixtures/TestObjectStorageBucket_Regional") - regions := getRegionsWithCaps(t, client, []string{"Object Storage"}) - if len(regions) < 1 { - t.Fatal("Can't get region with Object Storage capability") - } - region := regions[0] - - client, bucket, teardown, err := setupObjectStorageBucket(t, - []objectStorageBucketModifier{ - func(opts *ObjectStorageBucketCreateOptions) { - opts.Cluster = "" - opts.Region = region - }, - }, - "fixtures/TestObjectStorageBucket_Regional", - client, teardown, nil, - ) - defer teardown() - - if err != nil { - t.Errorf("Error creating Object Storage Bucket, got error %v", err) - } - - expected := testObjectStorageBucketCreateOpts - - // when comparing fixtures to random value Label will differ, compare the known prefix - if bucket.Label != expected.Label || - bucket.Region != region { + bucket.Region != expected.Region { t.Errorf("Object Storage Bucket did not match CreateOptions") } assertDateSet(t, bucket.Created) - - bucket, err = client.GetObjectStorageBucket(context.Background(), region, expected.Label) - if err != nil { - t.Errorf("Error getting Object Storage Bucket, %v", err) - } } func TestObjectStorageBucket_GetMissing(t *testing.T) { @@ -114,7 +69,7 @@ func TestObjectStorageBucket_GetFound(t *testing.T) { t.Error(err) } - i, err := client.GetObjectStorageBucket(context.Background(), bucket.Cluster, bucket.Label) + i, err := client.GetObjectStorageBucket(context.Background(), bucket.Region, bucket.Label) if err != nil { t.Errorf("Error getting ObjectStorageBucket, expected struct, got %v and error %v", i, err) } @@ -125,7 +80,7 @@ func TestObjectStorageBucket_GetFound(t *testing.T) { // when comparing fixtures to random value Label will differ, compare the known prefix if bucket.Label != expected.Label || - bucket.Cluster != expected.Cluster { + bucket.Region != expected.Region { t.Errorf("Object Storage Bucket did not match CreateOptions") } } @@ -157,24 +112,6 @@ func TestObjectStorageBuckets_List_smoke(t *testing.T) { } } -func TestObjectStorageBucketsInCluster_List(t *testing.T) { - client, bucket, teardown, err := setupObjectStorageBucket(t, - nil, - "fixtures/TestObjectStorageBucketsInCluster_List", nil, nil, nil) - defer teardown() - - i, err := client.ListObjectStorageBucketsInCluster(context.Background(), nil, bucket.Cluster) - if err != nil { - t.Errorf("Error listing ObjectStorageBucketsInCluster, expected struct, got error %v", err) - } - if len(i) == 0 { - t.Errorf("Expected a list of ObjectStorageBucketsInCluster, but got none %v", i) - } else if i[0].Label == "" || - i[0].Cluster == "" { - t.Errorf("Listed Object Storage Bucket in Cluster did not have attributes %v", i) - } -} - func TestObjectStorageBucket_Access_Get(t *testing.T) { corsEnabled := false @@ -200,21 +137,12 @@ func TestObjectStorageBucket_Access_Get(t *testing.T) { t.Errorf("Error getting ObjectStorageBucket access, got error %s", err) } - newBucketv2, err := client.GetObjectStorageBucketAccessV2(context.Background(), bucket.Region, bucket.Label) - if err != nil { - t.Errorf("Error getting ObjectStorageBucket access, got error %s", err) - } - - if newBucket.CorsEnabled != corsEnabled { - t.Errorf("ObjectStorageBucket access CORS does not match update, expected %t, got %t", corsEnabled, newBucket.CorsEnabled) - } - - if newBucketv2.CorsEnabled == nil { + if newBucket.CorsEnabled == nil { t.Errorf("ObjectStorageBucket access CORS does not match update, expected %t, got nil", corsEnabled) } - if newBucketv2.CorsEnabled != nil && *newBucketv2.CorsEnabled != corsEnabled { - t.Errorf("ObjectStorageBucket access CORS does not match update, expected %t, got %t", corsEnabled, *newBucketv2.CorsEnabled) + if newBucket.CorsEnabled != nil && *newBucket.CorsEnabled != corsEnabled { + t.Errorf("ObjectStorageBucket access CORS does not match update, expected %t, got %t", corsEnabled, *newBucket.CorsEnabled) } if newBucket.ACL != createOpts.ACL { @@ -222,10 +150,40 @@ func TestObjectStorageBucket_Access_Get(t *testing.T) { createOpts.ACL, newBucket.ACL) } - if newBucketv2.ACL != createOpts.ACL { - t.Errorf("ObjectStorageBucket access ACL does not match update, expected %s, got %s", - createOpts.ACL, - newBucketv2.ACL) +} + +func TestObjectStorageBucket_Access_Modify(t *testing.T) { + endpointType := linodego.ObjectStorageEndpointE1 + client, bucket, teardown, err := setupObjectStorageBucket(t, + nil, + "fixtures/TestObjectStorageBucket_Access_Modify", + nil, nil, &endpointType, + ) + defer teardown() + + corsEnabled := false + + opts := ObjectStorageBucketModifyAccessOptions{ + ACL: ACLPrivate, + CorsEnabled: &corsEnabled, + } + + err = client.ModifyObjectStorageBucketAccess(context.Background(), bucket.Region, bucket.Label, opts) + if err != nil { + t.Errorf("Error modifying ObjectStorageBucket access, got error %s", err) + } + + newBucket, err := client.GetObjectStorageBucketAccess(context.Background(), bucket.Region, bucket.Label) + if err != nil { + t.Errorf("Error getting ObjectStorageBucket access, got error %s", err) + } + + if *newBucket.CorsEnabled != corsEnabled { + t.Errorf("ObjectStorageBucket access CORS does not match modification, expected %t, got %t", corsEnabled, *newBucket.CorsEnabled) + } + + if newBucket.ACL != opts.ACL { + t.Errorf("ObjectStorageBucket access ACL does not match modification, expected %s, got %s", opts.ACL, newBucket.ACL) } } @@ -255,8 +213,8 @@ func TestObjectStorageBucket_Access_Update(t *testing.T) { t.Errorf("Error getting ObjectStorageBucket access, got error %s", err) } - if newBucket.CorsEnabled != corsEnabled { - t.Errorf("ObjectStorageBucket access CORS does not match update, expected %t, got %t", corsEnabled, newBucket.CorsEnabled) + if *newBucket.CorsEnabled != corsEnabled { + t.Errorf("ObjectStorageBucket access CORS does not match update, expected %t, got %t", corsEnabled, *newBucket.CorsEnabled) } if newBucket.ACL != opts.ACL { @@ -287,7 +245,7 @@ func setupObjectStorageBucket( client, teardown = createTestClient(t, fixturesYaml) } - createOpts := testRegionalObjectStorageBucketCreateOpts + createOpts := testObjectStorageBucketCreateOpts if endpointType != nil { endpoints, err := client.ListObjectStorageEndpoints(context.Background(), nil) @@ -313,7 +271,7 @@ func setupObjectStorageBucket( } newTeardown := func() { - if err := client.DeleteObjectStorageBucket(context.Background(), bucket.Cluster, bucket.Label); err != nil { + if err := client.DeleteObjectStorageBucket(context.Background(), bucket.Region, bucket.Label); err != nil { if t != nil { t.Errorf("Error deleting test Bucket: %s", err) } diff --git a/test/integration/object_storage_clusters_test.go b/test/integration/object_storage_clusters_test.go deleted file mode 100644 index 20e8f92a7..000000000 --- a/test/integration/object_storage_clusters_test.go +++ /dev/null @@ -1,19 +0,0 @@ -package integration - -import ( - "context" - "testing" -) - -func TestObjectStorageClusters_List(t *testing.T) { - client, teardown := createTestClient(t, "fixtures/TestObjectStorageClusters_List") - defer teardown() - - objectStorageClusters, err := client.ListObjectStorageClusters(context.Background(), nil) - if err != nil { - t.Errorf("Error listing objectStorageClusters, expected struct - error %v", err) - } - if len(objectStorageClusters) == 0 { - t.Errorf("Expected a list of objectStorageClusters - %v", objectStorageClusters) - } -} diff --git a/test/integration/object_storage_keys_test.go b/test/integration/object_storage_keys_test.go index 069272683..7ce548d89 100644 --- a/test/integration/object_storage_keys_test.go +++ b/test/integration/object_storage_keys_test.go @@ -114,15 +114,13 @@ func TestObjectStorageKeys_Limited(t *testing.T) { defer teardown() createOpts := testBasicObjectStorageKeyCreateOpts - createOpts.BucketAccess = &[]ObjectStorageKeyBucketAccess{ + createOpts.BucketAccess = []ObjectStorageKeyBucketAccess{ { - Cluster: "us-east-1", Region: "us-east", BucketName: bucket.Label, Permissions: "read_only", }, { - Cluster: "us-east-1", Region: "us-east", BucketName: bucket.Label, Permissions: "read_write", @@ -134,11 +132,11 @@ func TestObjectStorageKeys_Limited(t *testing.T) { if err != nil { t.Error(err) } - if !objectStorageKey.Limited || !cmp.Equal(objectStorageKey.BucketAccess, createOpts.BucketAccess) { + if !objectStorageKey.Limited || !cmp.Equal(*objectStorageKey.BucketAccess, createOpts.BucketAccess) { t.Errorf( "objectStorageKey returned (%v) does not match objectStorageKey creation request (%v)", *objectStorageKey.BucketAccess, - *createOpts.BucketAccess, + createOpts.BucketAccess, ) } } @@ -147,7 +145,7 @@ func TestObjectStorageKeys_Limited_NoAccess(t *testing.T) { t.Skip("skipping test due to unexpected API behavior with limited object storage keys") createOpts := testBasicObjectStorageKeyCreateOpts - createOpts.BucketAccess = &[]ObjectStorageKeyBucketAccess{} + createOpts.BucketAccess = []ObjectStorageKeyBucketAccess{} _, objectStorageKey, teardown, err := setupObjectStorageKey(t, createOpts, "fixtures/TestObjectStorageKeys_Limited_NoAccess", nil, nil) defer teardown() @@ -162,7 +160,7 @@ func TestObjectStorageKeys_Limited_NoAccess(t *testing.T) { func TestObjectStorageKeys_Regional_Limited(t *testing.T) { client, teardown := createTestClient(t, "fixtures/TestObjectStorageKeys_Regional_Limited") - regions := getRegionsWithCaps(t, client, []string{"Object Storage"}) + regions := getRegionsWithCaps(t, client, []linodego.RegionCapability{linodego.CapabilityObjectStorage}) if len(regions) < 1 { t.Fatal("Can't get region with Object Storage capability") } @@ -170,8 +168,8 @@ func TestObjectStorageKeys_Regional_Limited(t *testing.T) { client, bucket, teardown, err := setupObjectStorageBucket(t, []objectStorageBucketModifier{ func(createOpts *ObjectStorageBucketCreateOptions) { - createOpts.Cluster = "" createOpts.Region = region + createOpts.Label += "go-test-def-regional" }, }, "fixtures/TestObjectStorageKeys_Regional_Limited", client, teardown, nil) @@ -180,7 +178,7 @@ func TestObjectStorageKeys_Regional_Limited(t *testing.T) { } createOpts := testBasicObjectStorageKeyCreateOpts - createOpts.BucketAccess = &[]ObjectStorageKeyBucketAccess{ + createOpts.BucketAccess = []ObjectStorageKeyBucketAccess{ { Region: region, BucketName: bucket.Label, diff --git a/test/integration/object_storage_object_test.go b/test/integration/object_storage_object_test.go index 14166b734..60a606a93 100644 --- a/test/integration/object_storage_object_test.go +++ b/test/integration/object_storage_object_test.go @@ -14,7 +14,7 @@ var objectStorageObjectURLExpirySeconds = 360 func putObjectStorageObject(t *testing.T, client *linodego.Client, bucket *linodego.ObjectStorageBucket, name, content string) { t.Helper() - url, err := client.CreateObjectStorageObjectURL(context.TODO(), bucket.Cluster, bucket.Label, linodego.ObjectStorageObjectURLCreateOptions{ + url, err := client.CreateObjectStorageObjectURL(context.TODO(), bucket.Region, bucket.Label, linodego.ObjectStorageObjectURLCreateOptions{ Name: name, Method: http.MethodPut, ContentType: "text/plain", @@ -48,7 +48,7 @@ func putObjectStorageObject(t *testing.T, client *linodego.Client, bucket *linod func deleteObjectStorageObject(t *testing.T, client *linodego.Client, bucket *linodego.ObjectStorageBucket, name string) { t.Helper() - url, err := client.CreateObjectStorageObjectURL(context.TODO(), bucket.Cluster, bucket.Label, linodego.ObjectStorageObjectURLCreateOptions{ + url, err := client.CreateObjectStorageObjectURL(context.TODO(), bucket.Region, bucket.Label, linodego.ObjectStorageObjectURLCreateOptions{ Name: name, Method: http.MethodDelete, ExpiresIn: &objectStorageObjectURLExpirySeconds, @@ -87,33 +87,20 @@ func TestObjectStorageObject_Smoke(t *testing.T) { putObjectStorageObject(t, client, bucket, object, "testing123") defer deleteObjectStorageObject(t, client, bucket, object) - config, err := client.GetObjectStorageObjectACLConfig(context.TODO(), bucket.Cluster, bucket.Label, object) + config, err := client.GetObjectStorageObjectACLConfig(context.TODO(), bucket.Region, bucket.Label, object) if err != nil { t.Errorf("failed to get ACL config: %s", err) } - if config.ACL != "private" { - t.Errorf("expected ACL to be private; got %s", config.ACL) - } - - if config.ACLXML == "" { - t.Error("expected ACL XML to be included") - } - - configv2, err := client.GetObjectStorageObjectACLConfigV2(context.TODO(), bucket.Cluster, bucket.Label, object) - if err != nil { - t.Errorf("failed to get ACL config: %s", err) - } - - if configv2.ACL == nil { + if config.ACL == nil { t.Errorf("expected ACL to be private; got nil") } - if configv2.ACL != nil && *configv2.ACL != "private" { - t.Errorf("expected ACL to be private; got %s", *configv2.ACL) + if config.ACL != nil && *config.ACL != "private" { + t.Errorf("expected ACL to be private; got %s", *config.ACL) } - content, err := client.ListObjectStorageBucketContents(context.TODO(), bucket.Cluster, bucket.Label, nil) + content, err := client.ListObjectStorageBucketContents(context.TODO(), bucket.Region, bucket.Label, nil) if err != nil { t.Errorf("failed to get bucket contents: %s", err) } @@ -123,44 +110,28 @@ func TestObjectStorageObject_Smoke(t *testing.T) { } updateOpts := linodego.ObjectStorageObjectACLConfigUpdateOptions{ACL: "public-read", Name: object} - if _, err = client.UpdateObjectStorageObjectACLConfig(context.TODO(), bucket.Cluster, bucket.Label, updateOpts); err != nil { + if _, err = client.UpdateObjectStorageObjectACLConfig(context.TODO(), bucket.Region, bucket.Label, updateOpts); err != nil { t.Errorf("failed to update ACL config: %s", err) } - if _, err = client.UpdateObjectStorageObjectACLConfigV2(context.TODO(), bucket.Cluster, bucket.Label, updateOpts); err != nil { - t.Errorf("failed to update ACL config: %s", err) - } - - config, err = client.GetObjectStorageObjectACLConfig(context.TODO(), bucket.Cluster, bucket.Label, object) - if err != nil { - t.Errorf("failed to get updated ACL config: %s", err) - } - - if config.ACL != updateOpts.ACL { - t.Errorf("expected ACL config to be %s; got %s", updateOpts.ACL, config.ACL) - } - if config.ACLXML == "" { - t.Error("expected ACL XML to be included") - } - - configv2, err = client.GetObjectStorageObjectACLConfigV2(context.TODO(), bucket.Cluster, bucket.Label, object) + config, err = client.GetObjectStorageObjectACLConfig(context.TODO(), bucket.Region, bucket.Label, object) if err != nil { t.Errorf("failed to get ACL config: %s", err) } - if configv2.ACL == nil { + if config.ACL == nil { t.Errorf("expected ACL config to be %s; got nil", updateOpts.ACL) } - if configv2.ACL != nil && *configv2.ACL != updateOpts.ACL { + if config.ACL != nil && *config.ACL != updateOpts.ACL { t.Errorf("expected ACL config to be %s; got nil", updateOpts.ACL) } - if configv2.ACLXML == nil { + if config.ACLXML == nil { t.Error("expected ACL XML to be included") } - if configv2.ACLXML != nil && *configv2.ACLXML == "" { + if config.ACLXML != nil && *config.ACLXML == "" { t.Error("expected ACL XML to be included") } } diff --git a/test/integration/object_storage_quota_test.go b/test/integration/object_storage_quota_test.go index bd1e9d512..a8ad8c410 100644 --- a/test/integration/object_storage_quota_test.go +++ b/test/integration/object_storage_quota_test.go @@ -16,15 +16,23 @@ func TestObjectStorageQuotas_Get(t *testing.T) { quota, err := client.GetObjectStorageQuota(context.Background(), targetQuotaID) assert.NoError(t, err) - assert.Equal(t, targetQuotaID, quota.QuotaID) - assert.NotEmpty(t, quota.QuotaName) - assert.NotEmpty(t, quota.EndpointType) - assert.NotEmpty(t, quota.S3Endpoint) - assert.NotEmpty(t, quota.Description) - assert.Greater(t, quota.QuotaLimit, 0) - assert.NotEmpty(t, quota.ResourceMetric) - assert.NotEmpty(t, quota.QuotaType) - assert.True(t, quota.HasUsage) + expected := linodego.ObjectStorageQuota{ + QuotaID: "obj-objects-us-ord-1.linodeobjects.com", + QuotaName: "Number of Objects", + EndpointType: "E1", + S3Endpoint: "us-ord-1.linodeobjects.com", + Description: "Current number of objects per account, per endpoint", + QuotaLimit: 100000000, + ResourceMetric: "object", + } + + assert.Equal(t, expected.QuotaID, quota.QuotaID) + assert.Equal(t, expected.QuotaName, quota.QuotaName) + assert.Equal(t, expected.EndpointType, quota.EndpointType) + assert.Equal(t, expected.S3Endpoint, quota.S3Endpoint) + assert.Equal(t, expected.Description, quota.Description) + assert.Equal(t, expected.QuotaLimit, quota.QuotaLimit) + assert.Equal(t, expected.ResourceMetric, quota.ResourceMetric) } func TestObjectStorageQuotas_List(t *testing.T) { @@ -45,15 +53,23 @@ func TestObjectStorageQuotas_List(t *testing.T) { } if assert.NotNil(t, foundQuota, "Expected quota_id %q not found", targetQuotaID) { - assert.Equal(t, targetQuotaID, foundQuota.QuotaID) - assert.NotEmpty(t, foundQuota.QuotaName) - assert.NotEmpty(t, foundQuota.EndpointType) - assert.NotEmpty(t, foundQuota.S3Endpoint) - assert.NotEmpty(t, foundQuota.Description) - assert.Greater(t, foundQuota.QuotaLimit, 0) - assert.NotEmpty(t, foundQuota.ResourceMetric) - assert.NotEmpty(t, foundQuota.QuotaType) - assert.True(t, foundQuota.HasUsage) + expected := linodego.ObjectStorageQuota{ + QuotaID: "obj-buckets-us-mia-1.linodeobjects.com", + QuotaName: "Number of Buckets", + EndpointType: "E1", + S3Endpoint: "us-mia-1.linodeobjects.com", + Description: "Current number of buckets per account, per endpoint", + QuotaLimit: 1000, + ResourceMetric: "bucket", + } + + assert.Equal(t, expected.QuotaID, foundQuota.QuotaID) + assert.Equal(t, expected.QuotaName, foundQuota.QuotaName) + assert.Equal(t, expected.EndpointType, foundQuota.EndpointType) + assert.Equal(t, expected.S3Endpoint, foundQuota.S3Endpoint) + assert.Equal(t, expected.Description, foundQuota.Description) + assert.Equal(t, expected.QuotaLimit, foundQuota.QuotaLimit) + assert.Equal(t, expected.ResourceMetric, foundQuota.ResourceMetric) } } diff --git a/test/integration/placement_group_test.go b/test/integration/placement_group_test.go index a6f4c7e42..cf4325ffc 100644 --- a/test/integration/placement_group_test.go +++ b/test/integration/placement_group_test.go @@ -121,7 +121,7 @@ func createPlacementGroup( t.Helper() createOpts := linodego.PlacementGroupCreateOptions{ Label: "linodego-test-" + getUniqueText(), - Region: getRegionsWithCaps(t, client, []string{"Placement Group"})[0], + Region: getRegionsWithCaps(t, client, []linodego.RegionCapability{linodego.CapabilityPlacementGroup})[0], PlacementGroupType: linodego.PlacementGroupTypeAntiAffinityLocal, PlacementGroupPolicy: linodego.PlacementGroupPolicyFlexible, } diff --git a/test/integration/postgres_test.go b/test/integration/postgres_test.go index 150e09e65..9684d3373 100644 --- a/test/integration/postgres_test.go +++ b/test/integration/postgres_test.go @@ -55,7 +55,7 @@ func TestDatabase_Postgres_Suite(t *testing.T) { updatedLabel := database.Label + "-updated" opts := linodego.PostgresUpdateOptions{ - AllowList: &allowList, + AllowList: allowList, Label: updatedLabel, Updates: &updatedWindow, } @@ -165,7 +165,7 @@ func createPostgresDatabase(t *testing.T, client *linodego.Client, createOpts := linodego.PostgresCreateOptions{ Label: "go-postgres-testing-def" + randLabel(), - Region: getRegionsWithCaps(t, client, []string{"Managed Databases"})[0], + Region: getRegionsWithCaps(t, client, []linodego.RegionCapability{linodego.CapabilityDBAAS})[0], Type: "g6-nanode-1", Engine: "postgresql/14", ClusterSize: 3, diff --git a/test/integration/tags_test.go b/test/integration/tags_test.go index b2dc748a2..5313ed424 100644 --- a/test/integration/tags_test.go +++ b/test/integration/tags_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/linode/linodego" . "github.com/linode/linodego" ) @@ -19,11 +20,8 @@ func TestTag_Create_create_smoke(t *testing.T) { } updateOpts := instance.GetUpdateOptions() - if updateOpts.Tags == nil { - updateOpts.Tags = new([]string) - } - newTags := append(*updateOpts.Tags, "go-tag-test-bar") - updateOpts.Tags = &newTags + newTags := append(updateOpts.Tags, "go-tag-test-bar") + updateOpts.Tags = newTags updateOpts.Backups = nil instance, err = client.UpdateInstance(context.Background(), instance.ID, updateOpts) if err != nil { @@ -95,7 +93,7 @@ func setupTaggedInstance(t *testing.T, fixturesYaml string) (*Client, *Instance, client, fixtureTeardown := createTestClient(t, fixturesYaml) createOpts := InstanceCreateOptions{ Label: "go-ins-test-tag", - Region: getRegionsWithCaps(t, client, []string{"Linodes"})[0], + Region: getRegionsWithCaps(t, client, []linodego.RegionCapability{linodego.CapabilityLinodes})[0], Type: "g6-nanode-1", Tags: []string{"go-tag-test"}, } diff --git a/test/integration/vlans_test.go b/test/integration/vlans_test.go index 64bcced77..a861d5d7c 100644 --- a/test/integration/vlans_test.go +++ b/test/integration/vlans_test.go @@ -96,7 +96,7 @@ func createVLANInstance(t *testing.T, client *linodego.Client, instanceName, vla opts.Booted = &trueBool opts.Label = instanceName - opts.Region = getRegionsWithCaps(t, client, []string{"Vlans"})[0] + opts.Region = getRegionsWithCaps(t, client, []linodego.RegionCapability{linodego.CapabilityVlans})[0] }) if err != nil { return nil, nil, err diff --git a/test/integration/volumes_test.go b/test/integration/volumes_test.go index f076e0906..85a218714 100644 --- a/test/integration/volumes_test.go +++ b/test/integration/volumes_test.go @@ -16,7 +16,7 @@ func TestVolume_Create_smoke(t *testing.T) { createOpts := linodego.VolumeCreateOptions{ Label: "go-vol-test-create", - Region: getRegionsWithCaps(t, client, []string{"Linodes"})[0], + Region: getRegionsWithCaps(t, client, []linodego.RegionCapability{linodego.CapabilityLinodes})[0], } volume, err := client.CreateVolume(context.Background(), createOpts) if err != nil { @@ -41,8 +41,11 @@ func TestVolume_Create_withEncryption(t *testing.T) { defer teardown() createOpts := linodego.VolumeCreateOptions{ - Label: "go-vol-test-create-encryption", - Region: getRegionsWithCaps(t, client, []string{"Linodes", "Block Storage Encryption"})[0], + Label: "go-vol-test-create-encryption", + Region: getRegionsWithCaps(t, client, []linodego.RegionCapability{ + linodego.CapabilityLinodes, + linodego.CapabilityBlockStorageEncryption, + })[0], Encryption: "enabled", } volume, err := client.CreateVolume(context.Background(), createOpts) @@ -120,8 +123,11 @@ func TestVolume_Get_withEncryption(t *testing.T) { defer teardown() createOpts := linodego.VolumeCreateOptions{ - Label: "go-vol-test-get-encryption", - Region: getRegionsWithCaps(t, client, []string{"Linodes", "Block Storage Encryption"})[0], + Label: "go-vol-test-get-encryption", + Region: getRegionsWithCaps(t, client, []linodego.RegionCapability{ + linodego.CapabilityLinodes, + linodego.CapabilityBlockStorageEncryption, + })[0], Encryption: "enabled", } volume, err := client.CreateVolume(context.Background(), createOpts) @@ -257,7 +263,7 @@ func setupVolume(t *testing.T, fixturesYaml string) (*linodego.Client, *linodego client, fixtureTeardown := createTestClient(t, fixturesYaml) createOpts := linodego.VolumeCreateOptions{ Label: "go-vol-test-def", - Region: getRegionsWithCaps(t, client, []string{"Linodes"})[0], + Region: getRegionsWithCaps(t, client, []linodego.RegionCapability{linodego.CapabilityLinodes})[0], } volume, err := client.CreateVolume(context.Background(), createOpts) if err != nil { @@ -283,7 +289,7 @@ func createVolume( t.Helper() createOpts := linodego.VolumeCreateOptions{ Label: "go-vol-test" + randLabel(), - Region: getRegionsWithCaps(t, client, []string{"Linodes"})[0], + Region: getRegionsWithCaps(t, client, []linodego.RegionCapability{linodego.CapabilityLinodes})[0], } for _, mod := range vModifier { diff --git a/test/integration/vpc_subnet_test.go b/test/integration/vpc_subnet_test.go index ad40704ad..ba8b2c0d2 100644 --- a/test/integration/vpc_subnet_test.go +++ b/test/integration/vpc_subnet_test.go @@ -82,8 +82,11 @@ func createVPCWithSubnet(t *testing.T, client *linodego.Client, vpcModifier ...v ) { t.Helper() createOpts := linodego.VPCCreateOptions{ - Label: "go-test-vpc-" + getUniqueText(), - Region: getRegionsWithCaps(t, client, []string{"Linodes", "VPCs"})[0], + Label: "go-test-vpc-" + getUniqueText(), + Region: getRegionsWithCaps(t, client, []linodego.RegionCapability{ + linodego.CapabilityLinodes, + linodego.CapabilityVPCs, + })[0], Subnets: []VPCSubnetCreateOptions{ { Label: "linodego-vpc-test-" + getUniqueText(), @@ -117,8 +120,11 @@ func createVPCWithDualStackSubnet(t *testing.T, client *linodego.Client, vpcModi ) { t.Helper() createOpts := linodego.VPCCreateOptions{ - Label: "go-test-vpc-" + getUniqueText(), - Region: getRegionsWithCaps(t, client, []string{"Linodes", "VPCs"})[0], + Label: "go-test-vpc-" + getUniqueText(), + Region: getRegionsWithCaps(t, client, []linodego.RegionCapability{ + linodego.CapabilityLinodes, + linodego.CapabilityVPCs, + })[0], IPv6: []VPCCreateOptionsIPv6{ { Range: linodego.Pointer("/52"), diff --git a/test/integration/vpc_test.go b/test/integration/vpc_test.go index 0e4509004..3f75fd0c8 100644 --- a/test/integration/vpc_test.go +++ b/test/integration/vpc_test.go @@ -36,7 +36,7 @@ func createVPC(t *testing.T, client *linodego.Client, vpcModifier ...vpcModifier t.Helper() createOpts := linodego.VPCCreateOptions{ Label: "go-test-vpc-" + getUniqueText(), - Region: getRegionsWithCaps(t, client, []string{"VPCs"})[0], + Region: getRegionsWithCaps(t, client, []linodego.RegionCapability{CapabilityVPCs})[0], } for _, mod := range vpcModifier { @@ -60,7 +60,7 @@ func createVPC_invalid_label(t *testing.T, client *linodego.Client) error { t.Helper() createOpts := linodego.VPCCreateOptions{ Label: "gotest_vpc_invalid_label" + getUniqueText(), - Region: getRegionsWithCaps(t, client, []string{"VPCs"})[0], + Region: getRegionsWithCaps(t, client, []linodego.RegionCapability{CapabilityVPCs})[0], } _, err := client.CreateVPC(context.Background(), createOpts) diff --git a/test/integration/waitfor_test.go b/test/integration/waitfor_test.go index 244b220f6..df388e52e 100644 --- a/test/integration/waitfor_test.go +++ b/test/integration/waitfor_test.go @@ -18,7 +18,7 @@ func TestEventPoller_InstancePower(t *testing.T) { } instance, err := client.CreateInstance(context.Background(), linodego.InstanceCreateOptions{ - Region: getRegionsWithCaps(t, client, []string{"Linodes"})[0], + Region: getRegionsWithCaps(t, client, []linodego.RegionCapability{linodego.CapabilityLinodes})[0], Type: "g6-nanode-1", Image: "linode/ubuntu22.04", RootPass: randPassword(), @@ -102,7 +102,7 @@ func TestWaitForResourceFree(t *testing.T) { // Create a booted instance instance, err := client.CreateInstance(context.Background(), linodego.InstanceCreateOptions{ - Region: getRegionsWithCaps(t, client, []string{"Linodes"})[0], + Region: getRegionsWithCaps(t, client, []linodego.RegionCapability{linodego.CapabilityLinodes})[0], Type: "g6-nanode-1", Image: "linode/ubuntu22.04", RootPass: randPassword(), @@ -145,7 +145,7 @@ func TestEventPoller_Secondary(t *testing.T) { } instance, err := client.CreateInstance(context.Background(), linodego.InstanceCreateOptions{ - Region: getRegionsWithCaps(t, client, []string{"Linodes"})[0], + Region: getRegionsWithCaps(t, client, []linodego.RegionCapability{linodego.CapabilityLinodes})[0], Type: "g6-nanode-1", Label: "go-ins-poll-test", Booted: linodego.Pointer(false), diff --git a/test/unit/firewall_rules_test.go b/test/unit/firewall_rules_test.go index 2e04f9f77..ded63bf89 100644 --- a/test/unit/firewall_rules_test.go +++ b/test/unit/firewall_rules_test.go @@ -34,8 +34,8 @@ func TestFirewallRule_Get(t *testing.T) { assert.Equal(t, "An example firewall rule description.", firewallRule.Inbound[0].Description) assert.Equal(t, "22-24, 80, 443", firewallRule.Inbound[0].Ports) assert.Equal(t, linodego.NetworkProtocol("TCP"), firewallRule.Inbound[0].Protocol) - assert.ElementsMatch(t, []string{"192.0.2.0/24", "198.51.100.2/32"}, *firewallRule.Inbound[0].Addresses.IPv4) - assert.ElementsMatch(t, []string{"2001:DB8::/128"}, *firewallRule.Inbound[0].Addresses.IPv6) + assert.ElementsMatch(t, []string{"192.0.2.0/24", "198.51.100.2/32"}, firewallRule.Inbound[0].Addresses.IPv4) + assert.ElementsMatch(t, []string{"2001:DB8::/128"}, firewallRule.Inbound[0].Addresses.IPv6) assert.Equal(t, "DROP", firewallRule.OutboundPolicy) assert.Equal(t, 1, len(firewallRule.Outbound)) @@ -44,8 +44,8 @@ func TestFirewallRule_Get(t *testing.T) { assert.Equal(t, "An example firewall rule description.", firewallRule.Outbound[0].Description) assert.Equal(t, "22-24, 80, 443", firewallRule.Outbound[0].Ports) assert.Equal(t, linodego.NetworkProtocol("TCP"), firewallRule.Outbound[0].Protocol) - assert.ElementsMatch(t, []string{"192.0.2.0/24", "198.51.100.2/32"}, *firewallRule.Outbound[0].Addresses.IPv4) - assert.ElementsMatch(t, []string{"2001:DB8::/128"}, *firewallRule.Outbound[0].Addresses.IPv6) + assert.ElementsMatch(t, []string{"192.0.2.0/24", "198.51.100.2/32"}, firewallRule.Outbound[0].Addresses.IPv4) + assert.ElementsMatch(t, []string{"2001:DB8::/128"}, firewallRule.Outbound[0].Addresses.IPv6) } func TestFirewallRule_MarshalJSON(t *testing.T) { @@ -61,7 +61,7 @@ func TestFirewallRule_MarshalJSON(t *testing.T) { Ports: "443", Protocol: linodego.NetworkProtocol("TCP"), Addresses: linodego.NetworkAddresses{ - IPv4: &ipv4, + IPv4: ipv4, }, } data, err = json.Marshal(ruleWithoutRuleset) @@ -95,8 +95,8 @@ func TestFirewallRule_Update(t *testing.T) { Ports: "22-24, 80, 443", Protocol: "TCP", Addresses: linodego.NetworkAddresses{ - IPv4: &[]string{"192.0.2.0/24", "198.51.100.2/32"}, - IPv6: &[]string{"2001:DB8::/128"}, + IPv4: []string{"192.0.2.0/24", "198.51.100.2/32"}, + IPv6: []string{"2001:DB8::/128"}, }, }, }, @@ -109,8 +109,8 @@ func TestFirewallRule_Update(t *testing.T) { Ports: "22-24, 80, 443", Protocol: "TCP", Addresses: linodego.NetworkAddresses{ - IPv4: &[]string{"192.0.2.0/24", "198.51.100.2/32"}, - IPv6: &[]string{"2001:DB8::/128"}, + IPv4: []string{"192.0.2.0/24", "198.51.100.2/32"}, + IPv6: []string{"2001:DB8::/128"}, }, }, }, @@ -131,8 +131,8 @@ func TestFirewallRule_Update(t *testing.T) { assert.Equal(t, "An example firewall rule description.", firewallRule.Inbound[0].Description) assert.Equal(t, "22-24, 80, 443", firewallRule.Inbound[0].Ports) assert.Equal(t, linodego.NetworkProtocol("TCP"), firewallRule.Inbound[0].Protocol) - assert.ElementsMatch(t, []string{"192.0.2.0/24", "198.51.100.2/32"}, *firewallRule.Inbound[0].Addresses.IPv4) - assert.ElementsMatch(t, []string{"2001:DB8::/128"}, *firewallRule.Inbound[0].Addresses.IPv6) + assert.ElementsMatch(t, []string{"192.0.2.0/24", "198.51.100.2/32"}, firewallRule.Inbound[0].Addresses.IPv4) + assert.ElementsMatch(t, []string{"2001:DB8::/128"}, firewallRule.Inbound[0].Addresses.IPv6) assert.Equal(t, "DROP", firewallRule.OutboundPolicy) assert.Equal(t, 1, len(firewallRule.Outbound)) @@ -141,8 +141,8 @@ func TestFirewallRule_Update(t *testing.T) { assert.Equal(t, "An example firewall rule description.", firewallRule.Outbound[0].Description) assert.Equal(t, "22-24, 80, 443", firewallRule.Outbound[0].Ports) assert.Equal(t, linodego.NetworkProtocol("TCP"), firewallRule.Outbound[0].Protocol) - assert.ElementsMatch(t, []string{"192.0.2.0/24", "198.51.100.2/32"}, *firewallRule.Outbound[0].Addresses.IPv4) - assert.ElementsMatch(t, []string{"2001:DB8::/128"}, *firewallRule.Outbound[0].Addresses.IPv6) + assert.ElementsMatch(t, []string{"192.0.2.0/24", "198.51.100.2/32"}, firewallRule.Outbound[0].Addresses.IPv4) + assert.ElementsMatch(t, []string{"2001:DB8::/128"}, firewallRule.Outbound[0].Addresses.IPv6) } func TestFirewallRule_GetExpansion(t *testing.T) { @@ -160,8 +160,8 @@ func TestFirewallRule_GetExpansion(t *testing.T) { Ports: "22", Protocol: linodego.NetworkProtocol("TCP"), Addresses: linodego.NetworkAddresses{ - IPv4: &inboundIPv4, - IPv6: &inboundIPv6, + IPv4: inboundIPv4, + IPv6: inboundIPv6, }, }, }, @@ -174,8 +174,8 @@ func TestFirewallRule_GetExpansion(t *testing.T) { Ports: "22", Protocol: linodego.NetworkProtocol("TCP"), Addresses: linodego.NetworkAddresses{ - IPv4: &outboundIPv4, - IPv6: &outboundIPv6, + IPv4: outboundIPv4, + IPv6: outboundIPv6, }, }, }, @@ -204,10 +204,10 @@ func TestFirewallRule_GetExpansion(t *testing.T) { assert.Equal(t, "22", firewallRuleSet.Inbound[0].Ports) assert.Equal(t, linodego.NetworkProtocol("TCP"), firewallRuleSet.Inbound[0].Protocol) if assert.NotNil(t, firewallRuleSet.Inbound[0].Addresses.IPv4) { - assert.ElementsMatch(t, []string{"pl::vpcs:1234"}, *firewallRuleSet.Inbound[0].Addresses.IPv4) + assert.ElementsMatch(t, []string{"pl::vpcs:1234"}, firewallRuleSet.Inbound[0].Addresses.IPv4) } if assert.NotNil(t, firewallRuleSet.Inbound[0].Addresses.IPv6) { - assert.ElementsMatch(t, []string{"pl::vpcs:"}, *firewallRuleSet.Inbound[0].Addresses.IPv6) + assert.ElementsMatch(t, []string{"pl::vpcs:"}, firewallRuleSet.Inbound[0].Addresses.IPv6) } } @@ -220,10 +220,10 @@ func TestFirewallRule_GetExpansion(t *testing.T) { assert.Equal(t, "22", firewallRuleSet.Outbound[0].Ports) assert.Equal(t, linodego.NetworkProtocol("TCP"), firewallRuleSet.Outbound[0].Protocol) if assert.NotNil(t, firewallRuleSet.Outbound[0].Addresses.IPv4) { - assert.ElementsMatch(t, []string{"pl::vpcs:1234"}, *firewallRuleSet.Outbound[0].Addresses.IPv4) + assert.ElementsMatch(t, []string{"pl::vpcs:1234"}, firewallRuleSet.Outbound[0].Addresses.IPv4) } if assert.NotNil(t, firewallRuleSet.Outbound[0].Addresses.IPv6) { - assert.ElementsMatch(t, []string{"pl::vpcs:"}, *firewallRuleSet.Outbound[0].Addresses.IPv6) + assert.ElementsMatch(t, []string{"pl::vpcs:"}, firewallRuleSet.Outbound[0].Addresses.IPv6) } } diff --git a/test/unit/firewall_rulesets_test.go b/test/unit/firewall_rulesets_test.go index 0d6992bad..5c069f900 100644 --- a/test/unit/firewall_rulesets_test.go +++ b/test/unit/firewall_rulesets_test.go @@ -65,10 +65,10 @@ func TestFirewallRuleSets_List(t *testing.T) { rule := rs.Rules[0] assert.Equal(t, "ACCEPT", rule.Action) if assert.NotNil(t, rule.Addresses.IPv4) { - assert.Equal(t, []string{"pl::vpcs:primary"}, *rule.Addresses.IPv4) + assert.Equal(t, []string{"pl::vpcs:primary"}, rule.Addresses.IPv4) } if assert.NotNil(t, rule.Addresses.IPv6) { - assert.Equal(t, []string{"pl::vpcs:primary"}, *rule.Addresses.IPv6) + assert.Equal(t, []string{"pl::vpcs:primary"}, rule.Addresses.IPv6) } if assert.NotNil(t, rs.Created) { @@ -132,7 +132,7 @@ func TestFirewallRuleSets_Create(t *testing.T) { { Action: "ACCEPT", Addresses: linodego.NetworkAddresses{ - IPv4: &[]string{"pl::vpcs:primary"}, + IPv4: []string{"pl::vpcs:primary"}, }, Label: "ingress", Protocol: linodego.NetworkProtocol("TCP"), @@ -181,7 +181,7 @@ func TestFirewallRuleSets_Update(t *testing.T) { { Action: "ACCEPT", Addresses: linodego.NetworkAddresses{ - IPv6: &[]string{"pl::system:obj-storage"}, + IPv6: []string{"pl::system:obj-storage"}, }, Label: "egress", Protocol: linodego.NetworkProtocol("UDP"), @@ -192,7 +192,7 @@ func TestFirewallRuleSets_Update(t *testing.T) { req := linodego.RuleSetUpdateOptions{ Label: &label, Description: &description, - Rules: &rules, + Rules: rules, } response := map[string]any{ diff --git a/test/unit/firewalls_test.go b/test/unit/firewalls_test.go index f2161d65e..e312334f4 100644 --- a/test/unit/firewalls_test.go +++ b/test/unit/firewalls_test.go @@ -48,8 +48,8 @@ func TestFirewall_List(t *testing.T) { assert.Equal(t, "ACCEPT", outboundRule.Action) assert.Equal(t, linodego.NetworkProtocol("TCP"), outboundRule.Protocol) assert.Equal(t, "22-24, 80, 443", outboundRule.Ports) - assert.ElementsMatch(t, []string{"192.0.2.0/24", "198.51.100.2/32"}, *outboundRule.Addresses.IPv4) - assert.ElementsMatch(t, []string{"2001:DB8::/128"}, *outboundRule.Addresses.IPv6) + assert.ElementsMatch(t, []string{"192.0.2.0/24", "198.51.100.2/32"}, outboundRule.Addresses.IPv4) + assert.ElementsMatch(t, []string{"2001:DB8::/128"}, outboundRule.Addresses.IPv6) assert.ElementsMatch(t, []string{"example tag", "another example"}, firewall.Tags) @@ -74,8 +74,8 @@ func TestFirewall_Create(t *testing.T) { { Action: "ACCEPT", Addresses: linodego.NetworkAddresses{ - IPv4: &[]string{"192.0.2.0/24", "198.51.100.2/32"}, - IPv6: &[]string{"2001:DB8::/128"}, + IPv4: []string{"192.0.2.0/24", "198.51.100.2/32"}, + IPv6: []string{"2001:DB8::/128"}, }, Description: "An example firewall rule description.", Label: "firewallrule123", @@ -87,8 +87,8 @@ func TestFirewall_Create(t *testing.T) { { Action: "ACCEPT", Addresses: linodego.NetworkAddresses{ - IPv4: &[]string{"192.0.2.0/24", "198.51.100.2/32"}, - IPv6: &[]string{"2001:DB8::/128"}, + IPv4: []string{"192.0.2.0/24", "198.51.100.2/32"}, + IPv6: []string{"2001:DB8::/128"}, }, Description: "An example firewall rule description.", Label: "firewallrule123", @@ -127,8 +127,8 @@ func TestFirewall_Create(t *testing.T) { assert.Equal(t, "An example firewall rule description.", inboundRule.Description) assert.Equal(t, "22-24, 80, 443", inboundRule.Ports) assert.Equal(t, linodego.NetworkProtocol("TCP"), inboundRule.Protocol) - assert.ElementsMatch(t, []string{"192.0.2.0/24", "198.51.100.2/32"}, *inboundRule.Addresses.IPv4) - assert.ElementsMatch(t, []string{"2001:DB8::/128"}, *inboundRule.Addresses.IPv6) + assert.ElementsMatch(t, []string{"192.0.2.0/24", "198.51.100.2/32"}, inboundRule.Addresses.IPv4) + assert.ElementsMatch(t, []string{"2001:DB8::/128"}, inboundRule.Addresses.IPv6) assert.Len(t, firewall.Rules.Outbound, 1) outboundRule := firewall.Rules.Outbound[0] @@ -137,8 +137,8 @@ func TestFirewall_Create(t *testing.T) { assert.Equal(t, "An example firewall rule description.", outboundRule.Description) assert.Equal(t, "22-24, 80, 443", outboundRule.Ports) assert.Equal(t, linodego.NetworkProtocol("TCP"), outboundRule.Protocol) - assert.ElementsMatch(t, []string{"192.0.2.0/24", "198.51.100.2/32"}, *outboundRule.Addresses.IPv4) - assert.ElementsMatch(t, []string{"2001:DB8::/128"}, *outboundRule.Addresses.IPv6) + assert.ElementsMatch(t, []string{"192.0.2.0/24", "198.51.100.2/32"}, outboundRule.Addresses.IPv4) + assert.ElementsMatch(t, []string{"2001:DB8::/128"}, outboundRule.Addresses.IPv6) assert.Len(t, firewall.Entities, 1) entity := firewall.Entities[0] @@ -188,8 +188,8 @@ func TestFirewall_Get(t *testing.T) { assert.Equal(t, "An example firewall rule description.", inboundRule.Description) assert.Equal(t, "22-24, 80, 443", inboundRule.Ports) assert.Equal(t, linodego.NetworkProtocol("TCP"), inboundRule.Protocol) - assert.ElementsMatch(t, []string{"192.0.2.0/24", "198.51.100.2/32"}, *inboundRule.Addresses.IPv4) - assert.ElementsMatch(t, []string{"2001:DB8::/128"}, *inboundRule.Addresses.IPv6) + assert.ElementsMatch(t, []string{"192.0.2.0/24", "198.51.100.2/32"}, inboundRule.Addresses.IPv4) + assert.ElementsMatch(t, []string{"2001:DB8::/128"}, inboundRule.Addresses.IPv6) assert.Len(t, firewall.Rules.Outbound, 1) outboundRule := firewall.Rules.Outbound[0] @@ -198,8 +198,8 @@ func TestFirewall_Get(t *testing.T) { assert.Equal(t, "An example firewall rule description.", outboundRule.Description) assert.Equal(t, "22-24, 80, 443", outboundRule.Ports) assert.Equal(t, linodego.NetworkProtocol("TCP"), outboundRule.Protocol) - assert.ElementsMatch(t, []string{"192.0.2.0/24", "198.51.100.2/32"}, *outboundRule.Addresses.IPv4) - assert.ElementsMatch(t, []string{"2001:DB8::/128"}, *outboundRule.Addresses.IPv6) + assert.ElementsMatch(t, []string{"192.0.2.0/24", "198.51.100.2/32"}, outboundRule.Addresses.IPv4) + assert.ElementsMatch(t, []string{"2001:DB8::/128"}, outboundRule.Addresses.IPv6) } func TestFirewall_Update(t *testing.T) { @@ -216,7 +216,7 @@ func TestFirewall_Update(t *testing.T) { requestData := linodego.FirewallUpdateOptions{ Label: "firewall123", Status: "enabled", - Tags: &[]string{"updated tag", "another updated tag"}, + Tags: []string{"updated tag", "another updated tag"}, } firewall, err := base.Client.UpdateFirewall(context.Background(), firewallID, requestData) @@ -242,8 +242,8 @@ func TestFirewall_Update(t *testing.T) { assert.Equal(t, "An example firewall rule description.", inboundRule.Description) assert.Equal(t, "22-24, 80, 443", inboundRule.Ports) assert.Equal(t, linodego.NetworkProtocol("TCP"), inboundRule.Protocol) - assert.ElementsMatch(t, []string{"192.0.2.0/24", "198.51.100.2/32"}, *inboundRule.Addresses.IPv4) - assert.ElementsMatch(t, []string{"2001:DB8::/128"}, *inboundRule.Addresses.IPv6) + assert.ElementsMatch(t, []string{"192.0.2.0/24", "198.51.100.2/32"}, inboundRule.Addresses.IPv4) + assert.ElementsMatch(t, []string{"2001:DB8::/128"}, inboundRule.Addresses.IPv6) assert.Len(t, firewall.Rules.Outbound, 1) outboundRule := firewall.Rules.Outbound[0] @@ -252,8 +252,8 @@ func TestFirewall_Update(t *testing.T) { assert.Equal(t, "An example firewall rule description.", outboundRule.Description) assert.Equal(t, "22-24, 80, 443", outboundRule.Ports) assert.Equal(t, linodego.NetworkProtocol("TCP"), outboundRule.Protocol) - assert.ElementsMatch(t, []string{"192.0.2.0/24", "198.51.100.2/32"}, *outboundRule.Addresses.IPv4) - assert.ElementsMatch(t, []string{"2001:DB8::/128"}, *outboundRule.Addresses.IPv6) + assert.ElementsMatch(t, []string{"192.0.2.0/24", "198.51.100.2/32"}, outboundRule.Addresses.IPv4) + assert.ElementsMatch(t, []string{"2001:DB8::/128"}, outboundRule.Addresses.IPv6) } func TestFirewall_Delete(t *testing.T) { diff --git a/test/unit/fixtures/lke_cluster_pool_create.json b/test/unit/fixtures/lke_cluster_pool_create.json deleted file mode 100644 index 7f2f34602..000000000 --- a/test/unit/fixtures/lke_cluster_pool_create.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "id": 3, - "type": "g6-standard-2", - "count": 3 -} - \ No newline at end of file diff --git a/test/unit/fixtures/lke_cluster_pool_get.json b/test/unit/fixtures/lke_cluster_pool_get.json deleted file mode 100644 index 55c6ead91..000000000 --- a/test/unit/fixtures/lke_cluster_pool_get.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "id": 1, - "type": "pool-1", - "count": 3, - "autoscaler": {"enabled": true, "min": 1, "max": 5} -} - \ No newline at end of file diff --git a/test/unit/fixtures/lke_cluster_pool_list.json b/test/unit/fixtures/lke_cluster_pool_list.json deleted file mode 100644 index c70ee4b6e..000000000 --- a/test/unit/fixtures/lke_cluster_pool_list.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "data": [ - { - "id": 1, - "type": "pool-1", - "count": 3, - "autoscaler": {"enabled": true, "min": 1, "max": 5} - }, - { - "id": 2, - "type": "pool-2", - "count": 2, - "autoscaler": {"enabled": false} - } - ], - "pages": 1, - "results": 2 -} - \ No newline at end of file diff --git a/test/unit/fixtures/lke_cluster_pool_update.json b/test/unit/fixtures/lke_cluster_pool_update.json deleted file mode 100644 index 235943ef0..000000000 --- a/test/unit/fixtures/lke_cluster_pool_update.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "id": 1, - "type": "pool-1", - "count": 5 -} - \ No newline at end of file diff --git a/test/unit/fixtures/object_storage_cluster_get.json b/test/unit/fixtures/object_storage_cluster_get.json deleted file mode 100644 index 3f932e613..000000000 --- a/test/unit/fixtures/object_storage_cluster_get.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "id": "my-cluster-id", - "domain": "example.com", - "status": "active", - "region": "us-east-1", - "static_site_domain": "static.example.com" -} diff --git a/test/unit/fixtures/object_storage_cluster_list.json b/test/unit/fixtures/object_storage_cluster_list.json deleted file mode 100644 index 714737876..000000000 --- a/test/unit/fixtures/object_storage_cluster_list.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "data": [ - { - "id": "my-cluster-id", - "domain": "example.com", - "status": "active", - "region": "us-east-1", - "static_site_domain": "static.example.com" - } - ], - "page": 1, - "pages": 1, - "results": 1 -} - \ No newline at end of file diff --git a/test/unit/images_test.go b/test/unit/images_test.go index dc9aa9ba7..4c1ccb894 100644 --- a/test/unit/images_test.go +++ b/test/unit/images_test.go @@ -178,7 +178,7 @@ func TestImage_Create(t *testing.T) { Label: "Debian 11", Description: "Example image description.", CloudInit: true, - Tags: &[]string{"repair-image", "fix-1"}, + Tags: []string{"repair-image", "fix-1"}, } base.MockPost("images", fixtureData) @@ -220,7 +220,7 @@ func TestImage_Update(t *testing.T) { requestData := linodego.ImageUpdateOptions{ Label: "Debian 11", Description: &desc, - Tags: &[]string{"repair-image", "fix-1"}, + Tags: []string{"repair-image", "fix-1"}, } imageID := "123" @@ -265,12 +265,20 @@ func TestImage_Upload(t *testing.T) { Label: "Debian 11", Description: "Example image description.", CloudInit: true, - Tags: &[]string{"repair-image", "fix-1"}, + Tags: []string{"repair-image", "fix-1"}, Image: strings.NewReader("mock image data"), } base.MockPost("images/upload", fixtureData) + // Mock the PUT request to the upload URL returned in the fixture. + // UploadImageToURL uses http.DefaultTransport, so we need to + // activate httpmock on the default transport as well. + httpmock.Activate() + defer httpmock.DeactivateAndReset() + httpmock.RegisterResponder("PUT", "https://example.com/upload-endpoint", + httpmock.NewStringResponder(200, "{}")) + image, err := base.Client.UploadImage(context.Background(), requestData) assert.NoError(t, err) diff --git a/test/unit/instance_config_interfaces_test.go b/test/unit/instance_config_interfaces_test.go index c78f4e9a8..3a70384ae 100644 --- a/test/unit/instance_config_interfaces_test.go +++ b/test/unit/instance_config_interfaces_test.go @@ -114,7 +114,7 @@ func TestInstanceConfigInterface_Update(t *testing.T) { IPv4: &linodego.VPCIPv4{ NAT1To1: &nat1to1, }, - IPRanges: &ipRanges, + IPRanges: ipRanges, } base.MockPut("linode/instances/123/configs/456/interfaces/1", fixtureData) diff --git a/test/unit/instance_ip_test.go b/test/unit/instance_ip_test.go index 27b046035..6e035ff7f 100644 --- a/test/unit/instance_ip_test.go +++ b/test/unit/instance_ip_test.go @@ -82,8 +82,8 @@ func TestInstanceIPAddress_Update(t *testing.T) { defer base.TearDown(t) rdns := "custom.reverse.dns" - updateOpts := linodego.IPAddressUpdateOptions{ - RDNS: &rdns, + updateOpts := linodego.InstanceIPAddressUpdateOptions{ + RDNS: linodego.DoublePointer(rdns), } base.MockPut("linode/instances/123/ips/192.0.2.1", fixtureData) diff --git a/test/unit/instance_test.go b/test/unit/instance_test.go index 26eebc2e5..3975a6d02 100644 --- a/test/unit/instance_test.go +++ b/test/unit/instance_test.go @@ -3,7 +3,6 @@ package unit import ( "context" "fmt" - "strconv" "testing" "github.com/jarcoal/httpmock" @@ -114,9 +113,6 @@ func TestInstance_ResetPassword(t *testing.T) { } func TestInstance_Get_MonthlyTransfer(t *testing.T) { - if strconv.IntSize < 64 { - t.Skip("V1 monthly transfer doesn't work on 32 or lower bits system") - } fixtureData, err := fixtures.GetFixture("instance_monthly_transfer_get") assert.NoError(t, err) @@ -129,24 +125,6 @@ func TestInstance_Get_MonthlyTransfer(t *testing.T) { stats, err := base.Client.GetInstanceTransferMonthly(context.Background(), 12345, 2024, 11) assert.NoError(t, err) - assert.Equal(t, 30471077120, stats.BytesIn) - assert.Equal(t, 22956600198, stats.BytesOut) - assert.Equal(t, 53427677318, stats.BytesTotal) -} - -func TestInstance_Get_MonthlyTransferV2(t *testing.T) { - fixtureData, err := fixtures.GetFixture("instance_monthly_transfer_get") - assert.NoError(t, err) - - var base ClientBaseCase - base.SetUp(t) - defer base.TearDown(t) - - base.MockGet("linode/instances/12345/transfer/2024/11", fixtureData) - - stats, err := base.Client.GetInstanceTransferMonthlyV2(context.Background(), 12345, 2024, 11) - assert.NoError(t, err) - assert.Equal(t, uint64(30471077120), stats.BytesIn) assert.Equal(t, uint64(22956600198), stats.BytesOut) assert.Equal(t, uint64(53427677318), stats.BytesTotal) diff --git a/test/unit/interface_test.go b/test/unit/interface_test.go index fc407ff25..7a2f61b2e 100644 --- a/test/unit/interface_test.go +++ b/test/unit/interface_test.go @@ -158,7 +158,7 @@ func TestInterface_CreatePublic(t *testing.T) { opts := linodego.LinodeInterfaceCreateOptions{ Public: &linodego.PublicInterfaceCreateOptions{ IPv4: &linodego.PublicInterfaceIPv4CreateOptions{ - Addresses: &[]linodego.PublicInterfaceIPv4AddressCreateOptions{ + Addresses: []linodego.PublicInterfaceIPv4AddressCreateOptions{ { Address: linodego.Pointer("auto"), Primary: linodego.Pointer(true), @@ -227,13 +227,13 @@ func TestInterface_UpdateVPC(t *testing.T) { }, VPC: &linodego.VPCInterfaceUpdateOptions{ IPv4: &linodego.VPCInterfaceIPv4CreateOptions{ - Addresses: &[]linodego.VPCInterfaceIPv4AddressCreateOptions{ + Addresses: []linodego.VPCInterfaceIPv4AddressCreateOptions{ { Address: linodego.Pointer("192.168.23.4"), Primary: linodego.Pointer(true), }, }, - Ranges: &[]linodego.VPCInterfaceIPv4RangeCreateOptions{ + Ranges: []linodego.VPCInterfaceIPv4RangeCreateOptions{ { Range: "192.168.23.16/28", }, @@ -243,12 +243,12 @@ func TestInterface_UpdateVPC(t *testing.T) { }, }, IPv6: &linodego.VPCInterfaceIPv6CreateOptions{ - SLAAC: &[]linodego.VPCInterfaceIPv6SLAACCreateOptions{ + SLAAC: []linodego.VPCInterfaceIPv6SLAACCreateOptions{ { Range: "1235::/64", }, }, - Ranges: &[]linodego.VPCInterfaceIPv6RangeCreateOptions{ + Ranges: []linodego.VPCInterfaceIPv6RangeCreateOptions{ { Range: "4322::/64", }, diff --git a/test/unit/lke_cluster_control_plane_acl_test.go b/test/unit/lke_cluster_control_plane_acl_test.go index 06442ae29..934c64462 100644 --- a/test/unit/lke_cluster_control_plane_acl_test.go +++ b/test/unit/lke_cluster_control_plane_acl_test.go @@ -43,8 +43,8 @@ func TestLKEClusterControlPlaneACL_Update(t *testing.T) { Enabled: BoolToPtr(true), RevisionID: "rev-abc123", Addresses: &linodego.LKEClusterControlPlaneACLAddressesOptions{ - IPv4: &[]string{"10.0.0.1/32"}, - IPv6: &[]string{"2001:db8::/64"}, + IPv4: []string{"10.0.0.1/32"}, + IPv6: []string{"2001:db8::/64"}, }, }, } diff --git a/test/unit/lke_cluster_pool_test.go b/test/unit/lke_cluster_pool_test.go deleted file mode 100644 index c89cb81de..000000000 --- a/test/unit/lke_cluster_pool_test.go +++ /dev/null @@ -1,105 +0,0 @@ -package unit - -import ( - "context" - "testing" - - "github.com/linode/linodego" - "github.com/stretchr/testify/assert" -) - -func TestLKEClusterPool_List(t *testing.T) { - fixtureData, err := fixtures.GetFixture("lke_cluster_pool_list") - assert.NoError(t, err) - - var base ClientBaseCase - base.SetUp(t) - defer base.TearDown(t) - - base.MockGet("lke/clusters/123/pools", fixtureData) - - pools, err := base.Client.ListLKEClusterPools(context.Background(), 123, nil) - assert.NoError(t, err) - assert.Len(t, pools, 2) - - assert.Equal(t, 1, pools[0].ID) - assert.Equal(t, "pool-1", pools[0].Type) -} - -func TestLKEClusterPool_Get(t *testing.T) { - fixtureData, err := fixtures.GetFixture("lke_cluster_pool_get") - assert.NoError(t, err) - - var base ClientBaseCase - base.SetUp(t) - defer base.TearDown(t) - - base.MockGet("lke/clusters/123/pools/1", fixtureData) - - pool, err := base.Client.GetLKEClusterPool(context.Background(), 123, 1) - assert.NoError(t, err) - assert.Equal(t, 1, pool.ID) - assert.Equal(t, "pool-1", pool.Type) -} - -func TestLKEClusterPool_Create(t *testing.T) { - fixtureData, err := fixtures.GetFixture("lke_cluster_pool_create") - assert.NoError(t, err) - - var base ClientBaseCase - base.SetUp(t) - defer base.TearDown(t) - - createOptions := linodego.LKEClusterPoolCreateOptions{ - Type: "g6-standard-2", - Count: 3, - } - - base.MockPost("lke/clusters/123/pools", fixtureData) - - pool, err := base.Client.CreateLKEClusterPool(context.Background(), 123, createOptions) - assert.NoError(t, err) - assert.Equal(t, "g6-standard-2", pool.Type) - assert.Equal(t, 3, pool.Count) -} - -func TestLKEClusterPool_Update(t *testing.T) { - fixtureData, err := fixtures.GetFixture("lke_cluster_pool_update") - assert.NoError(t, err) - - var base ClientBaseCase - base.SetUp(t) - defer base.TearDown(t) - - updateOptions := linodego.LKEClusterPoolUpdateOptions{ - Count: 5, - } - - base.MockPut("lke/clusters/123/pools/1", fixtureData) - - pool, err := base.Client.UpdateLKEClusterPool(context.Background(), 123, 1, updateOptions) - assert.NoError(t, err) - assert.Equal(t, 5, pool.Count) -} - -func TestLKEClusterPool_Delete(t *testing.T) { - var base ClientBaseCase - base.SetUp(t) - defer base.TearDown(t) - - base.MockDelete("lke/clusters/123/pools/1", nil) - - err := base.Client.DeleteLKEClusterPool(context.Background(), 123, 1) - assert.NoError(t, err) -} - -func TestLKEClusterPool_DeleteNode(t *testing.T) { - var base ClientBaseCase - base.SetUp(t) - defer base.TearDown(t) - - base.MockDelete("lke/clusters/123/nodes/abc123", nil) - - err := base.Client.DeleteLKEClusterPoolNode(context.Background(), 123, "abc123") - assert.NoError(t, err) -} diff --git a/test/unit/lke_clusters_test.go b/test/unit/lke_clusters_test.go index 0dfad0d51..0a1a3fd21 100644 --- a/test/unit/lke_clusters_test.go +++ b/test/unit/lke_clusters_test.go @@ -131,7 +131,7 @@ func TestLKECluster_Update(t *testing.T) { updateOptions := linodego.LKEClusterUpdateOptions{ Label: "updated-cluster", - Tags: &[]string{"new-tag"}, + Tags: []string{"new-tag"}, ControlPlane: &linodego.LKEClusterControlPlaneOptions{ AuditLogsEnabled: linodego.Pointer(true), }, diff --git a/test/unit/lke_node_pools_test.go b/test/unit/lke_node_pools_test.go index c01b63670..f4b3a2572 100644 --- a/test/unit/lke_node_pools_test.go +++ b/test/unit/lke_node_pools_test.go @@ -125,7 +125,7 @@ func TestLKENodePool_Update(t *testing.T) { updateOptions := linodego.LKENodePoolUpdateOptions{ Count: 5, - Tags: &[]string{"updated-tag"}, + Tags: []string{"updated-tag"}, Labels: Ptr(linodego.LKENodePoolLabels{"env": "prod"}), Autoscaler: &linodego.LKENodePoolAutoscaler{ Enabled: true, diff --git a/test/unit/monitor_alert_definitions_test.go b/test/unit/monitor_alert_definitions_test.go index c8e742db8..1d8960418 100644 --- a/test/unit/monitor_alert_definitions_test.go +++ b/test/unit/monitor_alert_definitions_test.go @@ -22,10 +22,6 @@ const ( "description": "A test alert for dbaas service", "scope": "entity", "regions": [], - "entity_ids": [ - "12345" - ], - "has_more_resources": false, "alert_channels": [ { "id": 10000, @@ -84,10 +80,6 @@ const ( "status": "enabled", "scope": "entity", "regions": [], - "entity_ids": [ - "12345" - ], - "has_more_resources": true, "alert_channels": [ { "id": 10000, @@ -253,8 +245,6 @@ func TestCreateMonitorAlertDefinition(t *testing.T) { assert.Equal(t, "/monitor/services/dbaas/alert-definitions/123/entities", alert.Entities.URL) assert.Equal(t, 0, alert.Entities.Count) assert.False(t, alert.Entities.HasMoreResources) - assert.Equal(t, []string{"12345"}, alert.EntityIDs) - assert.False(t, alert.HasMoreResources) assert.NotNil(t, alert.AlertChannels) assert.NotNil(t, alert.RuleCriteria) assert.NotNil(t, alert.RuleCriteria.Rules) @@ -311,8 +301,6 @@ func TestGetMonitorAlertDefinition(t *testing.T) { assert.Equal(t, "/monitor/services/dbaas/alert-definitions/123/entities", alert.Entities.URL) assert.Equal(t, 0, alert.Entities.Count) assert.False(t, alert.Entities.HasMoreResources) - assert.Equal(t, []string{"12345"}, alert.EntityIDs) - assert.False(t, alert.HasMoreResources) assert.NotNil(t, alert.AlertChannels) assert.NotNil(t, alert.RuleCriteria) assert.NotNil(t, alert.RuleCriteria.Rules) @@ -336,8 +324,6 @@ func TestListMonitorAlertDefinitions(t *testing.T) { assert.Equal(t, "/monitor/services/dbaas/alert-definitions/123/entities", alerts[0].Entities.URL) assert.Equal(t, 2, alerts[0].Entities.Count) assert.True(t, alerts[0].Entities.HasMoreResources) - assert.Equal(t, []string{"12345"}, alerts[0].EntityIDs) - assert.True(t, alerts[0].HasMoreResources) assert.NotNil(t, alerts[0].AlertChannels) assert.NotNil(t, alerts[0].RuleCriteria) assert.NotNil(t, alerts[0].RuleCriteria.Rules) @@ -372,7 +358,6 @@ func TestUpdateMonitorAlertDefinition(t *testing.T) { assert.Equal(t, "/monitor/services/dbaas/alert-definitions/123/entities", alert.Entities.URL) assert.Equal(t, 2, alert.Entities.Count) assert.True(t, alert.Entities.HasMoreResources) - assert.True(t, alert.HasMoreResources) } func TestUpdateMonitorAlertDefinition_LabelOnly(t *testing.T) { diff --git a/test/unit/network_ips_test.go b/test/unit/network_ips_test.go index 11042d4bd..8f5229a6e 100644 --- a/test/unit/network_ips_test.go +++ b/test/unit/network_ips_test.go @@ -8,7 +8,7 @@ import ( "github.com/stretchr/testify/assert" ) -func TestIPUpdateAddressV2(t *testing.T) { +func TestIPUpdateAddress(t *testing.T) { var base ClientBaseCase base.SetUp(t) defer base.TearDown(t) @@ -21,7 +21,7 @@ func TestIPUpdateAddressV2(t *testing.T) { Reserved: true, }) - updatedIP, err := base.Client.UpdateIPAddressV2(context.Background(), ip, linodego.IPAddressUpdateOptionsV2{ + updatedIP, err := base.Client.UpdateIPAddress(context.Background(), ip, linodego.IPAddressUpdateOptions{ Reserved: linodego.Pointer(true), }) assert.NoError(t, err, "Expected no error when updating IP address") diff --git a/test/unit/nodebalancer_test.go b/test/unit/nodebalancer_test.go index e78f7f2fb..9702fb901 100644 --- a/test/unit/nodebalancer_test.go +++ b/test/unit/nodebalancer_test.go @@ -130,7 +130,7 @@ func TestNodeBalancer_Update(t *testing.T) { label := "Updated NodeBalancer" updateOpts := linodego.NodeBalancerUpdateOptions{ Label: &label, - Tags: &[]string{"updated", "production"}, + Tags: []string{"updated", "production"}, } nodebalancer, err := base.Client.UpdateNodeBalancer(context.Background(), 123, updateOpts) assert.NoError(t, err) diff --git a/test/unit/object_storage_bucket_cert_test.go b/test/unit/object_storage_bucket_cert_test.go index 137bed11f..83104747d 100644 --- a/test/unit/object_storage_bucket_cert_test.go +++ b/test/unit/object_storage_bucket_cert_test.go @@ -16,62 +16,19 @@ func TestObjectStorageBucketCert_Get(t *testing.T) { base.SetUp(t) defer base.TearDown(t) - clusterID := "us-east-1" + regionID := "us-east" bucketName := "my-bucket" - base.MockGet("object-storage/buckets/"+clusterID+"/"+bucketName+"/ssl", fixtureData) + base.MockGet("object-storage/buckets/"+regionID+"/"+bucketName+"/ssl", fixtureData) - cert, err := base.Client.GetObjectStorageBucketCert(context.Background(), clusterID, bucketName) - assert.NoError(t, err) - assert.NotNil(t, cert) - assert.True(t, cert.SSL) -} - -func TestObjectStorageBucketCert_Upload(t *testing.T) { - fixtureData, err := fixtures.GetFixture("object_storage_bucket_cert") - assert.NoError(t, err) - - var base ClientBaseCase - base.SetUp(t) - defer base.TearDown(t) - - clusterID := "us-east-1" - bucketName := "my-bucket" - - uploadOpts := linodego.ObjectStorageBucketCertUploadOptions{ - Certificate: "mock-cert", - PrivateKey: "mock-key", - } - - base.MockPost("object-storage/buckets/"+clusterID+"/"+bucketName+"/ssl", fixtureData) - - uploadedCert, err := base.Client.UploadObjectStorageBucketCert(context.Background(), clusterID, bucketName, uploadOpts) - assert.NoError(t, err) - assert.NotNil(t, uploadedCert) - assert.True(t, uploadedCert.SSL) -} - -func TestObjectStorageBucketCertV2_Get(t *testing.T) { - fixtureData, err := fixtures.GetFixture("object_storage_bucket_cert") - assert.NoError(t, err) - - var base ClientBaseCase - base.SetUp(t) - defer base.TearDown(t) - - clusterID := "us-east-1" - bucketName := "my-bucket" - - base.MockGet("object-storage/buckets/"+clusterID+"/"+bucketName+"/ssl", fixtureData) - - cert, err := base.Client.GetObjectStorageBucketCertV2(context.Background(), clusterID, bucketName) + cert, err := base.Client.GetObjectStorageBucketCert(context.Background(), regionID, bucketName) assert.NoError(t, err) assert.NotNil(t, cert) assert.NotNil(t, cert.SSL) assert.True(t, *cert.SSL) } -func TestObjectStorageBucketCertV2_Upload(t *testing.T) { +func TestObjectStorageBucketCert_Upload(t *testing.T) { fixtureData, err := fixtures.GetFixture("object_storage_bucket_cert") assert.NoError(t, err) @@ -79,7 +36,7 @@ func TestObjectStorageBucketCertV2_Upload(t *testing.T) { base.SetUp(t) defer base.TearDown(t) - clusterID := "us-east-1" + regionID := "us-east" bucketName := "my-bucket" uploadOpts := linodego.ObjectStorageBucketCertUploadOptions{ @@ -87,9 +44,9 @@ func TestObjectStorageBucketCertV2_Upload(t *testing.T) { PrivateKey: "mock-key", } - base.MockPost("object-storage/buckets/"+clusterID+"/"+bucketName+"/ssl", fixtureData) + base.MockPost("object-storage/buckets/"+regionID+"/"+bucketName+"/ssl", fixtureData) - uploadedCert, err := base.Client.UploadObjectStorageBucketCertV2(context.Background(), clusterID, bucketName, uploadOpts) + uploadedCert, err := base.Client.UploadObjectStorageBucketCert(context.Background(), regionID, bucketName, uploadOpts) assert.NoError(t, err) assert.NotNil(t, uploadedCert) assert.NotNil(t, uploadedCert.SSL) @@ -101,11 +58,11 @@ func TestObjectStorageBucketCert_Delete(t *testing.T) { base.SetUp(t) defer base.TearDown(t) - clusterID := "us-east-1" + regionID := "us-east" bucketName := "my-bucket" - base.MockDelete("object-storage/buckets/"+clusterID+"/"+bucketName+"/ssl", nil) + base.MockDelete("object-storage/buckets/"+regionID+"/"+bucketName+"/ssl", nil) - err := base.Client.DeleteObjectStorageBucketCert(context.Background(), clusterID, bucketName) + err := base.Client.DeleteObjectStorageBucketCert(context.Background(), regionID, bucketName) assert.NoError(t, err) } diff --git a/test/unit/object_storage_bucket_test.go b/test/unit/object_storage_bucket_test.go index 9e807d312..9737fbe8d 100644 --- a/test/unit/object_storage_bucket_test.go +++ b/test/unit/object_storage_bucket_test.go @@ -39,10 +39,10 @@ func TestObjectStorageBucket_ListInCluster(t *testing.T) { base.SetUp(t) defer base.TearDown(t) - clusterID := "us-east-1" - base.MockGet("object-storage/buckets/"+clusterID, fixtureData) + regionID := "us-east" + base.MockGet("object-storage/buckets/"+regionID, fixtureData) - buckets, err := base.Client.ListObjectStorageBucketsInCluster(context.Background(), nil, clusterID) + buckets, err := base.Client.ListObjectStorageBucketsInRegion(context.Background(), nil, regionID) assert.NoError(t, err) assert.NotEmpty(t, buckets) } @@ -55,12 +55,12 @@ func TestObjectStorageBucket_Get(t *testing.T) { base.SetUp(t) defer base.TearDown(t) - clusterID := "us-east-1" + regionID := "us-east" bucketLabel := "my-bucket" - base.MockGet("object-storage/buckets/"+clusterID+"/"+bucketLabel, fixtureData) + base.MockGet("object-storage/buckets/"+regionID+"/"+bucketLabel, fixtureData) - bucket, err := base.Client.GetObjectStorageBucket(context.Background(), clusterID, bucketLabel) + bucket, err := base.Client.GetObjectStorageBucket(context.Background(), regionID, bucketLabel) assert.NoError(t, err) assert.NotNil(t, bucket) assert.Equal(t, bucketLabel, bucket.Label) @@ -92,12 +92,12 @@ func TestObjectStorageBucket_Delete(t *testing.T) { base.SetUp(t) defer base.TearDown(t) - clusterID := "us-east-1" + regionID := "us-east" bucketLabel := "my-bucket" - base.MockDelete("object-storage/buckets/"+clusterID+"/"+bucketLabel, nil) + base.MockDelete("object-storage/buckets/"+regionID+"/"+bucketLabel, nil) - err := base.Client.DeleteObjectStorageBucket(context.Background(), clusterID, bucketLabel) + err := base.Client.DeleteObjectStorageBucket(context.Background(), regionID, bucketLabel) assert.NoError(t, err) } @@ -109,32 +109,50 @@ func TestObjectStorageBucket_GetAccess(t *testing.T) { base.SetUp(t) defer base.TearDown(t) - clusterID := "us-east-1" + regionID := "us-east" bucketLabel := "my-bucket" - base.MockGet("object-storage/buckets/"+clusterID+"/"+bucketLabel+"/access", fixtureData) + base.MockGet("object-storage/buckets/"+regionID+"/"+bucketLabel+"/access", fixtureData) - access, err := base.Client.GetObjectStorageBucketAccess(context.Background(), clusterID, bucketLabel) + access, err := base.Client.GetObjectStorageBucketAccess(context.Background(), regionID, bucketLabel) assert.NoError(t, err) assert.NotNil(t, access) assert.Equal(t, linodego.ACLPublicRead, access.ACL) } +func TestObjectStorageBucket_ModifyAccess(t *testing.T) { + var base ClientBaseCase + base.SetUp(t) + defer base.TearDown(t) + + regionID := "us-east" + bucketLabel := "my-bucket" + + modifyOpts := linodego.ObjectStorageBucketModifyAccessOptions{ + ACL: linodego.ACLPrivate, + } + + base.MockPost("object-storage/buckets/"+regionID+"/"+bucketLabel+"/access", nil) + + err := base.Client.ModifyObjectStorageBucketAccess(context.Background(), regionID, bucketLabel, modifyOpts) + assert.NoError(t, err) +} + func TestObjectStorageBucket_UpdateAccess(t *testing.T) { var base ClientBaseCase base.SetUp(t) defer base.TearDown(t) - clusterID := "us-east-1" + regionID := "us-east" bucketLabel := "my-bucket" updateOpts := linodego.ObjectStorageBucketUpdateAccessOptions{ ACL: linodego.ACLPrivate, } - base.MockPost("object-storage/buckets/"+clusterID+"/"+bucketLabel+"/access", nil) + base.MockPut("object-storage/buckets/"+regionID+"/"+bucketLabel+"/access", nil) - err := base.Client.UpdateObjectStorageBucketAccess(context.Background(), clusterID, bucketLabel, updateOpts) + err := base.Client.UpdateObjectStorageBucketAccess(context.Background(), regionID, bucketLabel, updateOpts) assert.NoError(t, err) } @@ -146,12 +164,12 @@ func TestObjectStorageBucket_ListContents(t *testing.T) { base.SetUp(t) defer base.TearDown(t) - clusterID := "us-east-1" + regionID := "us-east" bucketLabel := "my-bucket" - base.MockGet("object-storage/buckets/"+clusterID+"/"+bucketLabel+"/object-list", fixtureData) + base.MockGet("object-storage/buckets/"+regionID+"/"+bucketLabel+"/object-list", fixtureData) - contents, err := base.Client.ListObjectStorageBucketContents(context.Background(), clusterID, bucketLabel, nil) + contents, err := base.Client.ListObjectStorageBucketContents(context.Background(), regionID, bucketLabel, nil) assert.NoError(t, err) assert.NotNil(t, contents) assert.True(t, contents.IsTruncated) diff --git a/test/unit/object_storage_cluster_test.go b/test/unit/object_storage_cluster_test.go deleted file mode 100644 index 25aaf549d..000000000 --- a/test/unit/object_storage_cluster_test.go +++ /dev/null @@ -1,50 +0,0 @@ -package unit - -import ( - "context" - "testing" - - "github.com/stretchr/testify/assert" -) - -func TestObjectStorageCluster_List(t *testing.T) { - fixtureData, err := fixtures.GetFixture("object_storage_cluster_list") - assert.NoError(t, err) - - var base ClientBaseCase - base.SetUp(t) - defer base.TearDown(t) - - base.MockGet("object-storage/clusters", fixtureData) - - clusters, err := base.Client.ListObjectStorageClusters(context.Background(), nil) - assert.NoError(t, err) - assert.Len(t, clusters, 1) - - assert.Equal(t, "us-east-1", clusters[0].Region) - assert.Equal(t, "active", clusters[0].Status) - assert.Equal(t, "my-cluster-id", clusters[0].ID) - assert.Equal(t, "example.com", clusters[0].Domain) - assert.Equal(t, "static.example.com", clusters[0].StaticSiteDomain) -} - -func TestObjectStorageCluster_Get(t *testing.T) { - fixtureData, err := fixtures.GetFixture("object_storage_cluster_get") - assert.NoError(t, err) - - var base ClientBaseCase - base.SetUp(t) - defer base.TearDown(t) - - base.MockGet("object-storage/clusters/my-cluster-id", fixtureData) - - cluster, err := base.Client.GetObjectStorageCluster(context.Background(), "my-cluster-id") - assert.NoError(t, err) - assert.NotNil(t, cluster) - - assert.Equal(t, "us-east-1", cluster.Region) - assert.Equal(t, "active", cluster.Status) - assert.Equal(t, "my-cluster-id", cluster.ID) - assert.Equal(t, "example.com", cluster.Domain) - assert.Equal(t, "static.example.com", cluster.StaticSiteDomain) -} diff --git a/test/unit/object_storage_object_test.go b/test/unit/object_storage_object_test.go index 35da889ee..5c202d32b 100644 --- a/test/unit/object_storage_object_test.go +++ b/test/unit/object_storage_object_test.go @@ -31,7 +31,7 @@ func TestObjectStorageObjectURL_Create(t *testing.T) { assert.True(t, urlResponse.Exists) } -func TestObjectStorageObjectACLConfigV2_Get(t *testing.T) { +func TestObjectStorageObjectACLConfig_Get(t *testing.T) { fixtureData, err := fixtures.GetFixture("object_storage_object_acl_get") assert.NoError(t, err) @@ -41,13 +41,13 @@ func TestObjectStorageObjectACLConfigV2_Get(t *testing.T) { base.MockGet("object-storage/buckets/my-bucket/test-label/object-acl?name=test-object", fixtureData) - aclConfig, err := base.Client.GetObjectStorageObjectACLConfigV2(context.Background(), "my-bucket", "test-label", "test-object") + aclConfig, err := base.Client.GetObjectStorageObjectACLConfig(context.Background(), "my-bucket", "test-label", "test-object") assert.NoError(t, err) assert.NotNil(t, aclConfig.ACL) assert.Equal(t, "public-read", *aclConfig.ACL) } -func TestObjectStorageObjectACLConfigV2_Update(t *testing.T) { +func TestObjectStorageObjectACLConfig_Update(t *testing.T) { fixtureData, err := fixtures.GetFixture("object_storage_object_acl_update") assert.NoError(t, err) @@ -62,7 +62,7 @@ func TestObjectStorageObjectACLConfigV2_Update(t *testing.T) { base.MockPut("object-storage/buckets/my-bucket/test-label/object-acl", fixtureData) - updatedACLConfig, err := base.Client.UpdateObjectStorageObjectACLConfigV2(context.Background(), "my-bucket", "test-label", updateOptions) + updatedACLConfig, err := base.Client.UpdateObjectStorageObjectACLConfig(context.Background(), "my-bucket", "test-label", updateOptions) assert.NoError(t, err) assert.NotNil(t, updatedACLConfig.ACL) assert.Equal(t, "private", *updatedACLConfig.ACL) diff --git a/test/unit/region_test.go b/test/unit/region_test.go index b902eb888..e24a66163 100644 --- a/test/unit/region_test.go +++ b/test/unit/region_test.go @@ -46,7 +46,7 @@ func TestListRegions(t *testing.T) { assert.Greater(t, region.PlacementGroupLimits.MaximumPGsPerCustomer, 0, "Expected MaximumPGsPerCustomer to be greater than 0") assert.Greater(t, region.PlacementGroupLimits.MaximumLinodesPerPG, 0, "Expected MaximumLinodesPerPG to be greater than 0") } - assert.Contains(t, region.Capabilities, linodego.CapabilityLinodes, "Expected region to support Linodes") + assert.Contains(t, region.Capabilities, string(linodego.CapabilityLinodes), "Expected region to support Linodes") // Test monitors field assert.NotNil(t, region.Monitors.Alerts, "Expected monitors alerts to be initialized") assert.NotNil(t, region.Monitors.Metrics, "Expected monitors metrics to be initialized") @@ -82,7 +82,7 @@ func TestGetRegion(t *testing.T) { assert.Greater(t, region.PlacementGroupLimits.MaximumPGsPerCustomer, 0, "Expected MaximumPGsPerCustomer to be greater than 0") assert.Greater(t, region.PlacementGroupLimits.MaximumLinodesPerPG, 0, "Expected MaximumLinodesPerPG to be greater than 0") } - assert.Contains(t, region.Capabilities, linodego.CapabilityLinodes, "Expected region to support Linodes") + assert.Contains(t, region.Capabilities, string(linodego.CapabilityLinodes), "Expected region to support Linodes") // Test monitors field assert.NotNil(t, region.Monitors.Alerts, "Expected monitors alerts to be initialized") assert.NotNil(t, region.Monitors.Metrics, "Expected monitors metrics to be initialized") diff --git a/test/unit/volume_test.go b/test/unit/volume_test.go index 24d5f5b0a..a882bd18d 100644 --- a/test/unit/volume_test.go +++ b/test/unit/volume_test.go @@ -103,7 +103,7 @@ func TestUpdateVolume(t *testing.T) { opts := linodego.VolumeUpdateOptions{ Label: "updated-volume", - Tags: &[]string{"updated"}, + Tags: []string{"updated"}, } updatedVolume, err := base.Client.UpdateVolume(context.Background(), volumeID, opts) diff --git a/volumes.go b/volumes.go index 2fc8fc802..cd83e696c 100644 --- a/volumes.go +++ b/volumes.go @@ -45,29 +45,29 @@ type Volume struct { // VolumeCreateOptions fields are those accepted by CreateVolume type VolumeCreateOptions struct { - Label string `json:"label,omitempty"` - Region string `json:"region,omitempty"` - LinodeID int `json:"linode_id,omitempty"` - ConfigID int `json:"config_id,omitempty"` + Label string `json:"label,omitzero"` + Region string `json:"region,omitzero"` + LinodeID int `json:"linode_id,omitzero"` + ConfigID int `json:"config_id,omitzero"` // The Volume's size, in GiB. Minimum size is 10GiB, maximum size is 10240GiB. A "0" value will result in the default size. - Size int `json:"size,omitempty"` + Size int `json:"size,omitzero"` // An array of tags applied to this object. Tags are for organizational purposes only. Tags []string `json:"tags"` - PersistAcrossBoots *bool `json:"persist_across_boots,omitempty"` - Encryption string `json:"encryption,omitempty"` + PersistAcrossBoots *bool `json:"persist_across_boots,omitzero"` + Encryption string `json:"encryption,omitzero"` } // VolumeUpdateOptions fields are those accepted by UpdateVolume type VolumeUpdateOptions struct { - Label string `json:"label,omitempty"` - Tags *[]string `json:"tags,omitempty"` + Label string `json:"label,omitzero"` + Tags []string `json:"tags,omitzero"` } // VolumeAttachOptions fields are those accepted by AttachVolume type VolumeAttachOptions struct { LinodeID int `json:"linode_id"` - ConfigID int `json:"config_id,omitempty"` - PersistAcrossBoots *bool `json:"persist_across_boots,omitempty"` + ConfigID int `json:"config_id,omitzero"` + PersistAcrossBoots *bool `json:"persist_across_boots,omitzero"` } // UnmarshalJSON implements the json.Unmarshaler interface @@ -96,7 +96,7 @@ func (v *Volume) UnmarshalJSON(b []byte) error { // GetUpdateOptions converts a Volume to VolumeUpdateOptions for use in UpdateVolume func (v Volume) GetUpdateOptions() (updateOpts VolumeUpdateOptions) { updateOpts.Label = v.Label - updateOpts.Tags = &v.Tags + updateOpts.Tags = v.Tags return updateOpts } diff --git a/vpc.go b/vpc.go index 6b26f6bc2..1c839bcda 100644 --- a/vpc.go +++ b/vpc.go @@ -30,26 +30,26 @@ type VPCIPv6Range struct { type VPCCreateOptions struct { Label string `json:"label"` - Description string `json:"description,omitempty"` + Description string `json:"description,omitzero"` Region string `json:"region"` // NOTE: IPv6 VPCs may not currently be available to all users. - IPv6 []VPCCreateOptionsIPv6 `json:"ipv6,omitempty"` + IPv6 []VPCCreateOptionsIPv6 `json:"ipv6,omitzero"` - Subnets []VPCSubnetCreateOptions `json:"subnets,omitempty"` + Subnets []VPCSubnetCreateOptions `json:"subnets,omitzero"` } // VPCCreateOptionsIPv6 represents a single IPv6 range assigned to a VPC // which is specified during a VPC's creation. // NOTE: IPv6 VPCs may not currently be available to all users. type VPCCreateOptionsIPv6 struct { - Range *string `json:"range,omitempty"` - AllocationClass *string `json:"allocation_class,omitempty"` + Range *string `json:"range,omitzero"` + AllocationClass *string `json:"allocation_class,omitzero"` } type VPCUpdateOptions struct { - Label string `json:"label,omitempty"` - Description string `json:"description,omitempty"` + Label string `json:"label,omitzero"` + Description string `json:"description,omitzero"` } func (v VPC) GetCreateOptions() VPCCreateOptions { diff --git a/vpc_subnet.go b/vpc_subnet.go index e44b61326..a3cddc4d6 100644 --- a/vpc_subnet.go +++ b/vpc_subnet.go @@ -62,14 +62,14 @@ type VPCSubnetCreateOptions struct { IPv4 string `json:"ipv4"` // NOTE: IPv6 VPCs may not currently be available to all users. - IPv6 []VPCSubnetCreateOptionsIPv6 `json:"ipv6,omitempty"` + IPv6 []VPCSubnetCreateOptionsIPv6 `json:"ipv6,omitzero"` } // VPCSubnetCreateOptionsIPv6 represents a single IPv6 range assigned to a VPC // which is specified during a VPC subnet's creation. // NOTE: IPv6 VPCs may not currently be available to all users. type VPCSubnetCreateOptionsIPv6 struct { - Range *string `json:"range,omitempty"` + Range *string `json:"range,omitzero"` } type VPCSubnetUpdateOptions struct {