diff --git a/pkg/providers/scaleway/instances.go b/pkg/providers/scaleway/instances.go index 3a5191d3..b4aa809b 100644 --- a/pkg/providers/scaleway/instances.go +++ b/pkg/providers/scaleway/instances.go @@ -26,47 +26,38 @@ func (d *instanceProvider) GetResource(ctx context.Context) (*schema.Resources, req := &instance.ListServersRequest{ Zone: zone, } - var totalResults uint32 - for { - resp, err := d.instanceAPI.ListServers(req) - if err != nil { - return nil, err - } - - for _, server := range resp.Servers { - totalResults++ + resp, err := d.instanceAPI.ListServers(req, scw.WithAllPages(), scw.WithContext(ctx)) + if err != nil { + return nil, err + } - var ip4, ip6, privateIP4 string - if server.PublicIP != nil && server.PublicIP.Address != nil { - ip4 = server.PublicIP.Address.String() - } - if server.IPv6 != nil && server.IPv6.Address != nil { - ip6 = server.IPv6.Address.String() - } - if server.PrivateIP != nil { - privateIP4 = *server.PrivateIP - } - if privateIP4 != "" { - list.Append(&schema.Resource{ - Provider: providerName, - ID: d.id, - PrivateIpv4: privateIP4, - Service: d.name(), - }) - } + for _, server := range resp.Servers { + var ip4, ip6, privateIP4 string + if server.PublicIP != nil && server.PublicIP.Address != nil { + ip4 = server.PublicIP.Address.String() + } + if server.IPv6 != nil && server.IPv6.Address != nil { + ip6 = server.IPv6.Address.String() + } + if server.PrivateIP != nil { + privateIP4 = *server.PrivateIP + } + if privateIP4 != "" { list.Append(&schema.Resource{ - Provider: providerName, - ID: d.id, - PublicIPv4: ip4, - PublicIPv6: ip6, - Public: true, - Service: d.name(), + Provider: providerName, + ID: d.id, + PrivateIpv4: privateIP4, + Service: d.name(), }) } - if resp.TotalCount == totalResults { - break - } - *req.Page = *req.Page + 1 + list.Append(&schema.Resource{ + Provider: providerName, + ID: d.id, + PublicIPv4: ip4, + PublicIPv6: ip6, + Public: true, + Service: d.name(), + }) } } return list, nil diff --git a/pkg/providers/scaleway/instances_test.go b/pkg/providers/scaleway/instances_test.go new file mode 100644 index 00000000..cfb461ac --- /dev/null +++ b/pkg/providers/scaleway/instances_test.go @@ -0,0 +1,38 @@ +package scaleway + +import ( + "context" + "net/http" + "net/http/httptest" + "testing" + + "github.com/scaleway/scaleway-sdk-go/api/instance/v1" + "github.com/scaleway/scaleway-sdk-go/scw" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestInstancesSecondPage(t *testing.T) { + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "application/json") + if r.URL.Query().Get("page") == "2" { + _, _ = w.Write([]byte(`{"servers":[{"id":"b","public_ip":{"address":"51.15.0.2"}}],"total_count":2}`)) + return + } + _, _ = w.Write([]byte(`{"servers":[{"id":"a","public_ip":{"address":"51.15.0.1"}}],"total_count":2}`)) + })) + t.Cleanup(server.Close) + + client, err := scw.NewClient(scw.WithAuth("SCWXXXXXXXXXXXXXXXXX", "00000000-0000-0000-0000-000000000000"), scw.WithAPIURL(server.URL), scw.WithHTTPClient(server.Client())) + require.NoError(t, err) + + require.NotPanics(t, func() { + list, err := (&instanceProvider{id: "test", instanceAPI: instance.NewAPI(client)}).GetResource(context.Background()) + require.NoError(t, err) + var ips []string + for _, r := range list.Items { + ips = append(ips, r.PublicIPv4) + } + assert.ElementsMatch(t, []string{"51.15.0.1", "51.15.0.2"}, ips) + }) +}