diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d3f422049..ef4652ec5 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -24,6 +24,11 @@ jobs: - name: Run tidy run: make tidy + - name: Run formatter + run: | + go install mvdan.cc/gofumpt@86bffd62437a3c437c0b84d5d5ab244824e762fc + gofumpt -l -w . + - name: Fail if changes run: git diff-index --exit-code HEAD diff --git a/.github/workflows/labeler.yml b/.github/workflows/labeler.yml index 444c69ffd..8a9bcadd2 100644 --- a/.github/workflows/labeler.yml +++ b/.github/workflows/labeler.yml @@ -21,7 +21,7 @@ jobs: uses: actions/checkout@v4 - name: Run Labeler - uses: crazy-max/ghaction-github-labeler@b54af0c25861143e7c8813d7cbbf46d2c341680c + uses: crazy-max/ghaction-github-labeler@31674a3852a9074f2086abcf1c53839d466a47e7 with: github-token: ${{ secrets.GITHUB_TOKEN }} yaml-file: .github/labels.yml diff --git a/go.mod b/go.mod index f9896a9b8..01a07dd56 100644 --- a/go.mod +++ b/go.mod @@ -6,8 +6,8 @@ require ( github.com/google/go-querystring v1.1.0 github.com/jarcoal/httpmock v1.3.1 golang.org/x/net v0.34.0 - golang.org/x/oauth2 v0.25.0 - golang.org/x/text v0.21.0 + golang.org/x/oauth2 v0.26.0 + golang.org/x/text v0.22.0 gopkg.in/ini.v1 v1.66.6 ) diff --git a/go.sum b/go.sum index 31f1a7f77..f4ea8623a 100644 --- a/go.sum +++ b/go.sum @@ -17,10 +17,10 @@ github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOf github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= golang.org/x/net v0.34.0 h1:Mb7Mrk043xzHgnRM88suvJFwzVrRfHEHJEl5/71CKw0= golang.org/x/net v0.34.0/go.mod h1:di0qlW3YNM5oh6GqDGQr92MyTozJPmybPK4Ev/Gm31k= -golang.org/x/oauth2 v0.25.0 h1:CY4y7XT9v0cRI9oupztF8AgiIu99L/ksR/Xp/6jrZ70= -golang.org/x/oauth2 v0.25.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= -golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= -golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= +golang.org/x/oauth2 v0.26.0 h1:afQXWNNaeC4nvZ0Ed9XvCCzXM6UHJG7iCg0W4fPqSBE= +golang.org/x/oauth2 v0.26.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= +golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM= +golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY= golang.org/x/time v0.6.0 h1:eTDhh4ZXt5Qf0augr54TN6suAUudPcawVZeIAPU7D4U= golang.org/x/time v0.6.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/go.work.sum b/go.work.sum index 16ac0ab7f..41cd998b8 100644 --- a/go.work.sum +++ b/go.work.sum @@ -54,6 +54,7 @@ golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/mod v0.22.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= golang.org/x/net v0.27.0/go.mod h1:dDi0PyhWNoiUOrAS8uXv/vnScO4wnHQO4mj9fn/RytE= +golang.org/x/net v0.32.0/go.mod h1:CwU0IoeOlnQQWJ6ioyFrfRuomB8GKF6KbYXZVyeXNfs= golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4= golang.org/x/oauth2 v0.24.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= @@ -64,13 +65,16 @@ golang.org/x/sync v0.9.0 h1:fEo0HyrW1GIgZdpbhCRO0PkJajUS5H9IFUztCgEo2jQ= golang.org/x/sync v0.9.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2 h1:IRJeR9r1pYWsHKTRe/IInb7lYvbBVIqOgsX/u0mbOWY= golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE= +golang.org/x/telemetry v0.0.0-20240521205824-bda55230c457/go.mod h1:pRgIJT+bRLFKnoM1ldnzKoxTIn14Yxz928LQRYYgIN0= golang.org/x/term v0.24.0/go.mod h1:lOBK/LVxemqiMij05LGJ0tzNr8xlmwBRJ81PX6wVLH8= golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= golang.org/x/tools v0.29.0/go.mod h1:KMQVMRsVxU6nHCFXrBPhDB8XncLNLM0lIy/F14RP588= golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk= golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= diff --git a/k8s/go.mod b/k8s/go.mod index 058030f53..6da7d4ddc 100644 --- a/k8s/go.mod +++ b/k8s/go.mod @@ -30,10 +30,10 @@ require ( github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/spf13/pflag v1.0.5 // indirect golang.org/x/net v0.34.0 // indirect - golang.org/x/oauth2 v0.25.0 // indirect + golang.org/x/oauth2 v0.26.0 // indirect golang.org/x/sys v0.29.0 // indirect golang.org/x/term v0.28.0 // indirect - golang.org/x/text v0.21.0 // indirect + golang.org/x/text v0.22.0 // indirect golang.org/x/time v0.6.0 // indirect google.golang.org/protobuf v1.33.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect diff --git a/k8s/go.sum b/k8s/go.sum index 139933f36..f79b94203 100644 --- a/k8s/go.sum +++ b/k8s/go.sum @@ -93,8 +93,8 @@ golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.34.0 h1:Mb7Mrk043xzHgnRM88suvJFwzVrRfHEHJEl5/71CKw0= golang.org/x/net v0.34.0/go.mod h1:di0qlW3YNM5oh6GqDGQr92MyTozJPmybPK4Ev/Gm31k= -golang.org/x/oauth2 v0.25.0 h1:CY4y7XT9v0cRI9oupztF8AgiIu99L/ksR/Xp/6jrZ70= -golang.org/x/oauth2 v0.25.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= +golang.org/x/oauth2 v0.26.0 h1:afQXWNNaeC4nvZ0Ed9XvCCzXM6UHJG7iCg0W4fPqSBE= +golang.org/x/oauth2 v0.26.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -107,8 +107,8 @@ golang.org/x/term v0.28.0 h1:/Ts8HFuMR2E6IP/jlo7QVLZHggjKQbhu/7H0LJFr3Gg= golang.org/x/term v0.28.0/go.mod h1:Sw/lC2IAUZ92udQNf3WodGtn4k/XoLyZoh8v/8uiwek= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= -golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= +golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM= +golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY= golang.org/x/time v0.6.0 h1:eTDhh4ZXt5Qf0augr54TN6suAUudPcawVZeIAPU7D4U= golang.org/x/time v0.6.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= diff --git a/lke_clusters.go b/lke_clusters.go index 59f4a7c41..5fe77670e 100644 --- a/lke_clusters.go +++ b/lke_clusters.go @@ -3,6 +3,7 @@ package linodego import ( "context" "encoding/json" + "fmt" "time" "github.com/linode/linodego/internal/parseabletime" @@ -31,6 +32,9 @@ type LKECluster struct { // NOTE: Tier may not currently be available to all users and can only be used with v4beta. Tier string `json:"tier"` + + // NOTE: APLEnabled is currently in beta and may only function with API version v4beta. + APLEnabled bool `json:"apl_enabled"` } // LKEClusterCreateOptions fields are those accepted by CreateLKECluster @@ -44,6 +48,9 @@ type LKEClusterCreateOptions struct { // NOTE: Tier may not currently be available to all users and can only be used with v4beta. Tier string `json:"tier,omitempty"` + + // NOTE: APLEnabled is currently in beta and may only function with API version v4beta. + APLEnabled bool `json:"apl_enabled,omitempty"` } // LKEClusterUpdateOptions fields are those accepted by UpdateLKECluster @@ -246,3 +253,31 @@ func (c *Client) DeleteLKEClusterServiceToken(ctx context.Context, clusterID int e := formatAPIPath("lke/clusters/%d/servicetoken", clusterID) return doDELETERequest(ctx, c, e) } + +// GetLKEClusterAPLConsoleURL gets the URL of this cluster's APL installation if this cluster is APL-enabled. +func (c *Client) GetLKEClusterAPLConsoleURL(ctx context.Context, clusterID int) (string, error) { + cluster, err := c.GetLKECluster(ctx, clusterID) + if err != nil { + return "", err + } + + if cluster.APLEnabled { + return fmt.Sprintf("https://console.lke%d.akamai-apl.net", cluster.ID), nil + } + + return "", nil +} + +// GetLKEClusterAPLHealthCheckURL gets the URL of this cluster's APL health check endpoint if this cluster is APL-enabled. +func (c *Client) GetLKEClusterAPLHealthCheckURL(ctx context.Context, clusterID int) (string, error) { + cluster, err := c.GetLKECluster(ctx, clusterID) + if err != nil { + return "", err + } + + if cluster.APLEnabled { + return fmt.Sprintf("https://auth.lke%d.akamai-apl.net/ready", cluster.ID), nil + } + + return "", nil +} diff --git a/nodebalancer.go b/nodebalancer.go index d209ff011..2687fd663 100644 --- a/nodebalancer.go +++ b/nodebalancer.go @@ -44,6 +44,12 @@ type NodeBalancerTransfer struct { In *float64 `json:"in"` } +type NodeBalancerVPCConfig struct { + IPv4Range string `json:"ipv4_range"` + IPv6Range string `json:"ipv6_range,omitempty"` + SubnetID int `json:"subnet_id"` +} + // NodeBalancerCreateOptions are the options permitted for CreateNodeBalancer type NodeBalancerCreateOptions struct { Label *string `json:"label,omitempty"` @@ -52,6 +58,7 @@ type NodeBalancerCreateOptions struct { Configs []*NodeBalancerConfigCreateOptions `json:"configs,omitempty"` Tags []string `json:"tags"` FirewallID int `json:"firewall_id,omitempty"` + VPCs []*NodeBalancerVPCConfig `json:"vpcs,omitempty"` } // NodeBalancerUpdateOptions are the options permitted for UpdateNodeBalancer diff --git a/nodebalancer_config_nodes.go b/nodebalancer_config_nodes.go index 200b3fa9e..4a344fcce 100644 --- a/nodebalancer_config_nodes.go +++ b/nodebalancer_config_nodes.go @@ -35,10 +35,11 @@ var ( // NodeBalancerNodeCreateOptions fields are those accepted by CreateNodeBalancerNode type NodeBalancerNodeCreateOptions struct { - Address string `json:"address"` - Label string `json:"label"` - Weight int `json:"weight,omitempty"` - Mode NodeMode `json:"mode,omitempty"` + Address string `json:"address"` + Label string `json:"label"` + Weight int `json:"weight,omitempty"` + Mode NodeMode `json:"mode,omitempty"` + SubnetID int `json:"subnet_id,omitempty"` } // NodeBalancerNodeUpdateOptions fields are those accepted by UpdateNodeBalancerNode diff --git a/test/go.mod b/test/go.mod index f554665f7..dc977a0a3 100644 --- a/test/go.mod +++ b/test/go.mod @@ -9,7 +9,7 @@ require ( github.com/stretchr/testify v1.10.0 golang.org/x/exp v0.0.0-20241217172543-b2144cdd0a67 golang.org/x/net v0.34.0 - golang.org/x/oauth2 v0.25.0 + golang.org/x/oauth2 v0.26.0 k8s.io/client-go v0.29.4 ) @@ -39,7 +39,7 @@ require ( github.com/stretchr/objx v0.5.2 // indirect golang.org/x/sys v0.29.0 // indirect golang.org/x/term v0.28.0 // indirect - golang.org/x/text v0.21.0 // indirect + golang.org/x/text v0.22.0 // indirect golang.org/x/time v0.6.0 // indirect google.golang.org/protobuf v1.33.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect diff --git a/test/go.sum b/test/go.sum index 73a6687c8..6fad28022 100644 --- a/test/go.sum +++ b/test/go.sum @@ -102,8 +102,8 @@ golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.34.0 h1:Mb7Mrk043xzHgnRM88suvJFwzVrRfHEHJEl5/71CKw0= golang.org/x/net v0.34.0/go.mod h1:di0qlW3YNM5oh6GqDGQr92MyTozJPmybPK4Ev/Gm31k= -golang.org/x/oauth2 v0.25.0 h1:CY4y7XT9v0cRI9oupztF8AgiIu99L/ksR/Xp/6jrZ70= -golang.org/x/oauth2 v0.25.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= +golang.org/x/oauth2 v0.26.0 h1:afQXWNNaeC4nvZ0Ed9XvCCzXM6UHJG7iCg0W4fPqSBE= +golang.org/x/oauth2 v0.26.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -116,8 +116,8 @@ golang.org/x/term v0.28.0 h1:/Ts8HFuMR2E6IP/jlo7QVLZHggjKQbhu/7H0LJFr3Gg= golang.org/x/term v0.28.0/go.mod h1:Sw/lC2IAUZ92udQNf3WodGtn4k/XoLyZoh8v/8uiwek= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= -golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= +golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM= +golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY= golang.org/x/time v0.6.0 h1:eTDhh4ZXt5Qf0augr54TN6suAUudPcawVZeIAPU7D4U= golang.org/x/time v0.6.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= diff --git a/test/integration/fixtures/TestLKECluster_APLEnabled.yaml b/test/integration/fixtures/TestLKECluster_APLEnabled.yaml new file mode 100644 index 000000000..a88cbf8c9 --- /dev/null +++ b/test/integration/fixtures/TestLKECluster_APLEnabled.yaml @@ -0,0 +1,621 @@ +--- +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", + "Kubernetes Enterprise", "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", "Kubernetes Enterprise", "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", "Kubernetes Enterprise", "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", "Kubernetes Enterprise", "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", + "Kubernetes Enterprise", "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", + "Kubernetes Enterprise", "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", + "Kubernetes Enterprise", "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", + "Kubernetes Enterprise", "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", + "Kubernetes Enterprise", "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", "Kubernetes Enterprise", "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", + "Kubernetes Enterprise", "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", + "Kubernetes Enterprise", "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", + "Kubernetes Enterprise", "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", + "Kubernetes Enterprise", "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", "Object Storage", "Kubernetes", + "Kubernetes Enterprise", "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", "Object Storage", "Kubernetes", + "Kubernetes Enterprise", "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", "Object Storage", "GPU Linodes", + "Kubernetes", "Kubernetes Enterprise", "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, 29 Jan 2025 20:36:24 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: + - 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: + - "1600" + X-Xss-Protection: + - 1; mode=block + status: 200 OK + code: 200 + duration: "" +- request: + body: '{"node_pools":[{"count":3,"type":"g6-dedicated-4","disks":null,"tags":["test"],"labels":null,"taints":null}],"label":"go-lke-test-apl-enabled","region":"ap-west","k8s_version":"1.31","tags":["testing"],"apl_enabled":true}' + 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/clusters + method: POST + response: + body: '{"id": 329857, "status": "ready", "created": "2018-01-02T03:04:05", "updated": + "2018-01-02T03:04:05", "label": "go-lke-test-apl-enabled", "region": "ap-west", + "k8s_version": "1.31", "tier": "standard", "control_plane": {"high_availability": + true}, "apl_enabled": true, "tags": ["testing"]}' + 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: + - "289" + Content-Security-Policy: + - default-src 'none' + Content-Type: + - application/json + Expires: + - Wed, 29 Jan 2025 20:36:37 GMT + Pragma: + - no-cache + Strict-Transport-Security: + - max-age=31536000 + Vary: + - Authorization, X-Filter + X-Accepted-Oauth-Scopes: + - lke:read_write + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - 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: + - "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/lke/clusters/329857 + method: GET + response: + body: '{"id": 329857, "status": "ready", "created": "2018-01-02T03:04:05", "updated": + "2018-01-02T03:04:05", "label": "go-lke-test-apl-enabled", "region": "ap-west", + "k8s_version": "1.31", "tier": "standard", "control_plane": {"high_availability": + true}, "apl_enabled": true, "tags": ["testing"]}' + 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: + - "289" + Content-Security-Policy: + - default-src 'none' + Content-Type: + - application/json + Expires: + - Wed, 29 Jan 2025 20:36:37 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: + - 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: + - "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/lke/clusters/329857 + method: GET + response: + body: '{"id": 329857, "status": "ready", "created": "2018-01-02T03:04:05", "updated": + "2018-01-02T03:04:05", "label": "go-lke-test-apl-enabled", "region": "ap-west", + "k8s_version": "1.31", "tier": "standard", "control_plane": {"high_availability": + true}, "apl_enabled": true, "tags": ["testing"]}' + 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: + - "289" + Content-Security-Policy: + - default-src 'none' + Content-Type: + - application/json + Expires: + - Wed, 29 Jan 2025 20:36:37 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: + - 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: + - "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/lke/clusters/329857 + 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, 29 Jan 2025 20:36:42 GMT + Pragma: + - no-cache + Strict-Transport-Security: + - max-age=31536000 + Vary: + - Authorization, X-Filter + X-Accepted-Oauth-Scopes: + - lke:read_write + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - 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: + - "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 c7c62d065..139f14f75 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: - - Wed, 08 Jan 2025 06:03:18 GMT + - Thu, 30 Jan 2025 19:34:04 GMT Pragma: - no-cache Strict-Transport-Security: @@ -78,10 +78,50 @@ interactions: url: https://api.linode.com/v4beta/object-storage/buckets?page=1 method: GET response: - body: '{"data": [{"hostname": "go-bucket-test-def.us-east-1.linodeobjects.com", + 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", "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}' + "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}' headers: Access-Control-Allow-Credentials: - "true" @@ -99,14 +139,12 @@ 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: - - Wed, 08 Jan 2025 06:03:20 GMT + - Thu, 30 Jan 2025 19:34:09 GMT Pragma: - no-cache Strict-Transport-Security: @@ -114,6 +152,7 @@ interactions: Vary: - Authorization, X-Filter - Authorization, X-Filter + - Accept-Encoding X-Accepted-Oauth-Scopes: - object_storage:read_only X-Content-Type-Options: @@ -168,7 +207,7 @@ interactions: Content-Type: - application/json Expires: - - Wed, 08 Jan 2025 06:03:26 GMT + - Thu, 30 Jan 2025 19:34:13 GMT Pragma: - no-cache Strict-Transport-Security: diff --git a/test/integration/lke_clusters_test.go b/test/integration/lke_clusters_test.go index 1e7cdbb74..24d8ca935 100644 --- a/test/integration/lke_clusters_test.go +++ b/test/integration/lke_clusters_test.go @@ -2,6 +2,7 @@ package integration import ( "context" + "fmt" "net/url" "reflect" "testing" @@ -330,3 +331,38 @@ func setupLKECluster(t *testing.T, clusterModifiers []clusterModifier, fixturesY } return client, lkeCluster, teardown, err } + +func TestLKECluster_APLEnabled_smoke(t *testing.T) { + client, lkeCluster, teardown, err := setupLKECluster(t, []clusterModifier{ + func(createOpts *linodego.LKEClusterCreateOptions) { + createOpts.Label = "go-lke-test-apl-enabled" + }, + func(createOpts *linodego.LKEClusterCreateOptions) { + createOpts.APLEnabled = true + }, + func(createOpts *linodego.LKEClusterCreateOptions) { + // NOTE: g6-dedicated-4 is the minimum APL-compatible Linode type + createOpts.NodePools = []linodego.LKENodePoolCreateOptions{{Count: 3, Type: "g6-dedicated-4", Tags: []string{"test"}}} + }, + }, + "fixtures/TestLKECluster_APLEnabled") + defer teardown() + + expectedConsoleURL := fmt.Sprintf("https://console.lke%d.akamai-apl.net", lkeCluster.ID) + consoleURL, err := client.GetLKEClusterAPLConsoleURL(context.Background(), lkeCluster.ID) + if err != nil { + t.Errorf("Error getting LKE APL console URL, expected string, got %v and error %v", consoleURL, err) + } + if consoleURL != expectedConsoleURL { + t.Errorf("Expected an APL console URL %v, but got a different one %v", expectedConsoleURL, consoleURL) + } + + expectedHealthCheckURL := fmt.Sprintf("https://auth.lke%d.akamai-apl.net/ready", lkeCluster.ID) + healthCheckURL, err := client.GetLKEClusterAPLHealthCheckURL(context.Background(), lkeCluster.ID) + if err != nil { + t.Errorf("Error getting LKE APL health check URL, expected string, got %v and error %v", healthCheckURL, err) + } + if healthCheckURL != expectedHealthCheckURL { + t.Errorf("Expected an APL health check URL %v, but got a different one %v", expectedHealthCheckURL, healthCheckURL) + } +} diff --git a/test/integration/object_storage_buckets_test.go b/test/integration/object_storage_buckets_test.go index 6bdcef9f0..05934ac86 100644 --- a/test/integration/object_storage_buckets_test.go +++ b/test/integration/object_storage_buckets_test.go @@ -137,15 +137,24 @@ func TestObjectStorageBuckets_List_smoke(t *testing.T) { "fixtures/TestObjectStorageBuckets_List", nil, nil, nil) defer teardown() - i, err := client.ListObjectStorageBuckets(context.Background(), nil) if err != nil { - t.Errorf("Error listing ObjectStorageBuckets, expected struct, got error %v", err) + t.Fatalf("Failed to set up test: %v", err) } - if len(i) == 0 { - t.Errorf("Expected a list of ObjectStorageBuckets, but got none %v", i) - } else if i[0].Label == "" || - i[0].Cluster == "" { - t.Errorf("Listed Object Storage Bucket did not have attribuets %v", i) + + buckets, err := client.ListObjectStorageBuckets(context.Background(), nil) + if err != nil { + t.Fatalf("Error listing Object Storage Buckets: %v", err) + } + + if len(buckets) == 0 { + t.Fatalf("Expected at least one Object Storage Bucket, but got none.") + } + + for index, bucket := range buckets { + if bucket.Label == "" { + t.Errorf("Bucket at index %d is missing attributes: Label=%q, Full Bucket Data: %+v", + index, bucket.Label, bucket) + } } } @@ -163,7 +172,7 @@ func TestObjectStorageBucketsInCluster_List(t *testing.T) { 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 attribuets %v", i) + t.Errorf("Listed Object Storage Bucket in Cluster did not have attributes %v", i) } } diff --git a/test/unit/domain_test.go b/test/unit/domain_test.go index ec35361e9..f39f9dac8 100644 --- a/test/unit/domain_test.go +++ b/test/unit/domain_test.go @@ -3,9 +3,10 @@ package unit import ( "context" "fmt" - "github.com/jarcoal/httpmock" "testing" + "github.com/jarcoal/httpmock" + "github.com/linode/linodego" "github.com/stretchr/testify/assert" ) diff --git a/test/unit/domainrecord_test.go b/test/unit/domainrecord_test.go index 5739dcbab..86063cfac 100644 --- a/test/unit/domainrecord_test.go +++ b/test/unit/domainrecord_test.go @@ -3,11 +3,12 @@ package unit import ( "context" "fmt" + "testing" + "time" + "github.com/jarcoal/httpmock" "github.com/linode/linodego" "github.com/stretchr/testify/assert" - "testing" - "time" ) func TestDomainRecord_List(t *testing.T) { diff --git a/test/unit/longview_subscriptions_test.go b/test/unit/longview_subscriptions_test.go index 84f305218..bbdf2d1b9 100644 --- a/test/unit/longview_subscriptions_test.go +++ b/test/unit/longview_subscriptions_test.go @@ -4,8 +4,8 @@ import ( "context" "testing" - "github.com/stretchr/testify/assert" "github.com/linode/linodego" + "github.com/stretchr/testify/assert" ) func TestListLongviewSubscriptions(t *testing.T) { diff --git a/test/unit/longview_test.go b/test/unit/longview_test.go index 5e8bd8315..75f51b7d9 100644 --- a/test/unit/longview_test.go +++ b/test/unit/longview_test.go @@ -5,8 +5,8 @@ import ( "testing" "time" - "github.com/stretchr/testify/assert" "github.com/linode/linodego" + "github.com/stretchr/testify/assert" ) func TestListLongviewClients(t *testing.T) { diff --git a/test/unit/mysql_test.go b/test/unit/mysql_test.go index 844de0544..913800d90 100644 --- a/test/unit/mysql_test.go +++ b/test/unit/mysql_test.go @@ -2,9 +2,10 @@ package unit import ( "context" - "github.com/jarcoal/httpmock" "testing" + "github.com/jarcoal/httpmock" + "github.com/linode/linodego" "github.com/stretchr/testify/assert" ) diff --git a/test/unit/postgres_test.go b/test/unit/postgres_test.go index 011c45af5..6fdda8ce5 100644 --- a/test/unit/postgres_test.go +++ b/test/unit/postgres_test.go @@ -2,10 +2,11 @@ package unit import ( "context" + "testing" + "github.com/jarcoal/httpmock" "github.com/linode/linodego" "github.com/stretchr/testify/assert" - "testing" ) func TestListDatabasePostgreSQL_List(t *testing.T) { diff --git a/test/unit/stackscripts_test.go b/test/unit/stackscripts_test.go index b6202350b..e2be45b8e 100644 --- a/test/unit/stackscripts_test.go +++ b/test/unit/stackscripts_test.go @@ -5,34 +5,34 @@ import ( "fmt" "testing" - "github.com/stretchr/testify/assert" "github.com/linode/linodego" + "github.com/stretchr/testify/assert" "golang.org/x/exp/slices" ) func TestListStackscripts(t *testing.T) { - // Mock the API response to match the expected structure for a paginated response - fixtureData, err := fixtures.GetFixture("stackscripts_list") - assert.NoError(t, err) + // Mock the API response to match the expected structure for a paginated response + fixtureData, err := fixtures.GetFixture("stackscripts_list") + assert.NoError(t, err) - var base ClientBaseCase - base.SetUp(t) - defer base.TearDown(t) + var base ClientBaseCase + base.SetUp(t) + defer base.TearDown(t) - // Mock the request with a correct paginated structure - base.MockGet("linode/stackscripts", fixtureData) + // Mock the request with a correct paginated structure + base.MockGet("linode/stackscripts", fixtureData) - stackscripts, err := base.Client.ListStackscripts(context.Background(), &linodego.ListOptions{}) - assert.NoError(t, err) + stackscripts, err := base.Client.ListStackscripts(context.Background(), &linodego.ListOptions{}) + assert.NoError(t, err) - assert.NotEmpty(t, stackscripts, "Expected non-empty stackscripts list") + assert.NotEmpty(t, stackscripts, "Expected non-empty stackscripts list") - // Check if a specific stackscript exists using slices.ContainsFunc - exists := slices.ContainsFunc(stackscripts, func(stackscript linodego.Stackscript) bool { - return stackscript.Label == "Test Stackscript" - }) + // Check if a specific stackscript exists using slices.ContainsFunc + exists := slices.ContainsFunc(stackscripts, func(stackscript linodego.Stackscript) bool { + return stackscript.Label == "Test Stackscript" + }) - assert.True(t, exists, "Expected stackscripts list to contain 'Test Stackscript'") + assert.True(t, exists, "Expected stackscripts list to contain 'Test Stackscript'") } func TestCreateStackscript(t *testing.T) { diff --git a/test/unit/tag_test.go b/test/unit/tag_test.go index 3cfaef762..d06cc9e25 100644 --- a/test/unit/tag_test.go +++ b/test/unit/tag_test.go @@ -34,7 +34,6 @@ func TestListTags(t *testing.T) { assert.True(t, exists, "Expected tag list to contain 'example-tag'") } - func TestCreateTag(t *testing.T) { // Load the fixture data for tag creation fixtureData, err := fixtures.GetFixture("tag_create") @@ -57,7 +56,6 @@ func TestCreateTag(t *testing.T) { assert.Equal(t, "new-tag", tag.Label, "Expected created tag label to match input") } - func TestDeleteTag(t *testing.T) { var base ClientBaseCase base.SetUp(t) @@ -98,7 +96,6 @@ func TestListTaggedObjects(t *testing.T) { } } - func TestSortedObjects(t *testing.T) { // Load the fixture data for tagged objects fixtureData, err := fixtures.GetFixture("tagged_objects_list") diff --git a/test/unit/types_test.go b/test/unit/types_test.go index 25e1623cf..b986560da 100644 --- a/test/unit/types_test.go +++ b/test/unit/types_test.go @@ -3,11 +3,11 @@ package unit import ( "context" "fmt" - "github.com/linode/linodego" - "github.com/stretchr/testify/assert" "testing" - "golang.org/x/exp/slices" + "github.com/linode/linodego" + "github.com/stretchr/testify/assert" + "golang.org/x/exp/slices" ) func TestLinodeTypes_List(t *testing.T) { diff --git a/test/unit/vlan_test.go b/test/unit/vlan_test.go index 8fcfd680e..a0ce07032 100644 --- a/test/unit/vlan_test.go +++ b/test/unit/vlan_test.go @@ -3,10 +3,11 @@ package unit import ( "context" "fmt" + "testing" + "github.com/linode/linodego" "github.com/stretchr/testify/assert" - "golang.org/x/exp/slices" - "testing" + "golang.org/x/exp/slices" ) func TestVLAN_List(t *testing.T) { diff --git a/test/unit/volume_test.go b/test/unit/volume_test.go index 74fda3441..2b1641f8e 100644 --- a/test/unit/volume_test.go +++ b/test/unit/volume_test.go @@ -5,8 +5,8 @@ import ( "fmt" "testing" - "github.com/stretchr/testify/assert" "github.com/linode/linodego" + "github.com/stretchr/testify/assert" ) func TestListVolumes(t *testing.T) { @@ -128,30 +128,30 @@ func TestDeleteVolume(t *testing.T) { } func TestAttachVolume(t *testing.T) { - // Mock the API response for attaching a volume - fixtureData, err := fixtures.GetFixture("volume_attach") - assert.NoError(t, err) - - var base ClientBaseCase - base.SetUp(t) - defer base.TearDown(t) - - volumeID := 123 - base.MockPost(fmt.Sprintf("volumes/%d/attach", volumeID), fixtureData) - - // Use direct pointer assignment for PersistAcrossBoots - persistAcrossBoots := true - opts := &linodego.VolumeAttachOptions{ - LinodeID: 456, - PersistAcrossBoots: &persistAcrossBoots, - } - - attachedVolume, err := base.Client.AttachVolume(context.Background(), volumeID, opts) - assert.NoError(t, err, "Expected no error when attaching volume") - - // Verify the attached volume's LinodeID and filesystem path - assert.Equal(t, 456, *attachedVolume.LinodeID, "Expected LinodeID to match input") - assert.Equal(t, "/dev/disk/by-id/volume-123", attachedVolume.FilesystemPath, "Expected filesystem path to match fixture") + // Mock the API response for attaching a volume + fixtureData, err := fixtures.GetFixture("volume_attach") + assert.NoError(t, err) + + var base ClientBaseCase + base.SetUp(t) + defer base.TearDown(t) + + volumeID := 123 + base.MockPost(fmt.Sprintf("volumes/%d/attach", volumeID), fixtureData) + + // Use direct pointer assignment for PersistAcrossBoots + persistAcrossBoots := true + opts := &linodego.VolumeAttachOptions{ + LinodeID: 456, + PersistAcrossBoots: &persistAcrossBoots, + } + + attachedVolume, err := base.Client.AttachVolume(context.Background(), volumeID, opts) + assert.NoError(t, err, "Expected no error when attaching volume") + + // Verify the attached volume's LinodeID and filesystem path + assert.Equal(t, 456, *attachedVolume.LinodeID, "Expected LinodeID to match input") + assert.Equal(t, "/dev/disk/by-id/volume-123", attachedVolume.FilesystemPath, "Expected filesystem path to match fixture") } func TestDetachVolume(t *testing.T) { diff --git a/test/unit/volume_types_test.go b/test/unit/volume_types_test.go index 13240d6f9..da2b88b1c 100644 --- a/test/unit/volume_types_test.go +++ b/test/unit/volume_types_test.go @@ -4,8 +4,8 @@ import ( "context" "testing" - "github.com/stretchr/testify/assert" "github.com/linode/linodego" + "github.com/stretchr/testify/assert" ) func TestListVolumeTypes(t *testing.T) {