From e59a86757a102b254937fa10b94ecd8bb5a4f825 Mon Sep 17 00:00:00 2001 From: Dorian Maliszewski Date: Mon, 6 Oct 2025 14:42:08 +0200 Subject: [PATCH] feat(sweepers): allow sweepers to be scoped to the default project id only --- api/account/v3/sweepers/sweepers.go | 12 +- .../v1alpha1/sweepers/sweepers.go | 17 +- api/baremetal/v1/sweepers/sweepers.go | 16 +- api/block/v1alpha1/sweepers/sweepers.go | 32 +++- api/cockpit/v1/sweepers/sweepers.go | 159 +++++++++++++----- api/container/v1beta1/sweepers/sweepers.go | 53 ++++-- api/flexibleip/v1alpha1/sweepers/sweepers.go | 16 +- api/function/v1beta1/sweepers/sweepers.go | 115 ++++++++++--- api/inference/v1/sweepers/sweepers.go | 17 +- api/inference/v1beta1/sweepers/sweepers.go | 18 +- api/instance/v1/sweepers/sweepers.go | 110 +++++++++--- api/iot/v1/sweepers/sweepers.go | 16 +- api/ipam/v1/sweepers/sweepers.go | 16 +- api/jobs/v1alpha1/sweepers/sweepers.go | 17 +- api/k8s/v1/sweepers/sweepers.go | 17 +- api/lb/v1/sweepers/sweepers.go | 33 +++- api/mnq/v1beta1/sweepers/sweepers.go | 145 +++++++++++----- api/mongodb/v1/sweepers/sweepers.go | 17 +- api/mongodb/v1alpha1/sweepers/sweepers.go | 17 +- api/rdb/v1/sweepers/sweepers.go | 17 +- api/redis/v1/sweepers/sweepers.go | 17 +- api/registry/v1/sweepers/sweepers.go | 16 +- api/secret/v1beta1/sweepers/sweepers.go | 17 +- .../v1alpha1/sweepers/sweepers.go | 17 +- api/tem/v1alpha1/sweepers/sweepers.go | 12 +- api/vpc/v2/sweepers/sweepers.go | 50 ++++-- api/vpcgw/v1/sweepers/sweepers.go | 63 +++++-- api/webhosting/v1/sweepers/sweepers.go | 16 +- cmd/sdk-sweeper/main.go | 4 +- 29 files changed, 803 insertions(+), 269 deletions(-) diff --git a/api/account/v3/sweepers/sweepers.go b/api/account/v3/sweepers/sweepers.go index 65ef64e33..070fa9156 100644 --- a/api/account/v3/sweepers/sweepers.go +++ b/api/account/v3/sweepers/sweepers.go @@ -8,8 +8,12 @@ import ( "github.com/scaleway/scaleway-sdk-go/scw" ) -func SweepProjects(scwClient *scw.Client) error { +func SweepProjects(scwClient *scw.Client, projectScoped bool) error { accountAPI := account.NewProjectAPI(scwClient) + defaultProjectID, exists := scwClient.GetDefaultProjectID() + if projectScoped && (!exists || (defaultProjectID == "")) { + return fmt.Errorf("failed to get the default project id for a project scoped sweep") + } req := &account.ProjectAPIListProjectsRequest{} listProjects, err := accountAPI.ListProjects(req, scw.WithAllPages()) @@ -18,7 +22,7 @@ func SweepProjects(scwClient *scw.Client) error { } for _, project := range listProjects.Projects { // Do not delete default project - if project.ID == req.OrganizationID || !testhelpers.IsTestResource(project.Name) { + if project.ID == req.OrganizationID || !testhelpers.IsTestResource(project.Name) || (projectScoped && (project.ID != defaultProjectID)) { continue } err = accountAPI.DeleteProject(&account.ProjectAPIDeleteProjectRequest{ @@ -31,8 +35,8 @@ func SweepProjects(scwClient *scw.Client) error { return nil } -func SweepAll(scwClient *scw.Client) error { - if err := SweepProjects(scwClient); err != nil { +func SweepAll(scwClient *scw.Client, projectScoped bool) error { + if err := SweepProjects(scwClient, projectScoped); err != nil { return err } return nil diff --git a/api/applesilicon/v1alpha1/sweepers/sweepers.go b/api/applesilicon/v1alpha1/sweepers/sweepers.go index 02894bf23..3954219f5 100644 --- a/api/applesilicon/v1alpha1/sweepers/sweepers.go +++ b/api/applesilicon/v1alpha1/sweepers/sweepers.go @@ -7,10 +7,17 @@ import ( "github.com/scaleway/scaleway-sdk-go/scw" ) -func SweepServer(scwClient *scw.Client, zone scw.Zone) error { +func SweepServer(scwClient *scw.Client, zone scw.Zone, projectScoped bool) error { asAPI := applesilicon.NewAPI(scwClient) - - listServers, err := asAPI.ListServers(&applesilicon.ListServersRequest{Zone: zone}, scw.WithAllPages()) + defaultProjectID, exists := scwClient.GetDefaultProjectID() + var projectID *string = nil + if projectScoped && (!exists || (defaultProjectID == "")) { + return fmt.Errorf("failed to get the default project id for a project scoped sweep") + } + if projectScoped { + projectID = &defaultProjectID + } + listServers, err := asAPI.ListServers(&applesilicon.ListServersRequest{Zone: zone, ProjectID: projectID}, scw.WithAllPages()) if err != nil { return fmt.Errorf("error listing apple silicon servers in (%s) in sweeper: %s", zone, err) } @@ -28,9 +35,9 @@ func SweepServer(scwClient *scw.Client, zone scw.Zone) error { return nil } -func SweepAllLocalities(scwClient *scw.Client) error { +func SweepAllLocalities(scwClient *scw.Client, projectScoped bool) error { for _, zone := range (&applesilicon.API{}).Zones() { - err := SweepServer(scwClient, zone) + err := SweepServer(scwClient, zone, projectScoped) if err != nil { return err } diff --git a/api/baremetal/v1/sweepers/sweepers.go b/api/baremetal/v1/sweepers/sweepers.go index aa6cd0acd..a72ffca38 100644 --- a/api/baremetal/v1/sweepers/sweepers.go +++ b/api/baremetal/v1/sweepers/sweepers.go @@ -7,10 +7,18 @@ import ( "github.com/scaleway/scaleway-sdk-go/scw" ) -func SweepServers(scwClient *scw.Client, zone scw.Zone) error { +func SweepServers(scwClient *scw.Client, zone scw.Zone, projectScoped bool) error { baremetalAPI := baremetal.NewAPI(scwClient) + defaultProjectID, exists := scwClient.GetDefaultProjectID() + var projectID *string = nil + if projectScoped && (!exists || (defaultProjectID == "")) { + return fmt.Errorf("failed to get the default project id for a project scoped sweep") + } + if projectScoped { + projectID = &defaultProjectID + } - listServers, err := baremetalAPI.ListServers(&baremetal.ListServersRequest{Zone: zone}, scw.WithAllPages()) + listServers, err := baremetalAPI.ListServers(&baremetal.ListServersRequest{Zone: zone, ProjectID: projectID}, scw.WithAllPages()) if err != nil { return err } @@ -28,9 +36,9 @@ func SweepServers(scwClient *scw.Client, zone scw.Zone) error { return nil } -func SweepAllLocalities(scwClient *scw.Client) error { +func SweepAllLocalities(scwClient *scw.Client, projectScoped bool) error { for _, zone := range (&baremetal.API{}).Zones() { - err := SweepServers(scwClient, zone) + err := SweepServers(scwClient, zone, projectScoped) if err != nil { return err } diff --git a/api/block/v1alpha1/sweepers/sweepers.go b/api/block/v1alpha1/sweepers/sweepers.go index 6df1c8da6..220524580 100644 --- a/api/block/v1alpha1/sweepers/sweepers.go +++ b/api/block/v1alpha1/sweepers/sweepers.go @@ -7,12 +7,21 @@ import ( "github.com/scaleway/scaleway-sdk-go/scw" ) -func SweepVolumes(scwClient *scw.Client, zone scw.Zone) error { +func SweepVolumes(scwClient *scw.Client, zone scw.Zone, projectScoped bool) error { blockAPI := block.NewAPI(scwClient) + defaultProjectID, exists := scwClient.GetDefaultProjectID() + var projectID *string = nil + if projectScoped && (!exists || (defaultProjectID == "")) { + return fmt.Errorf("failed to get the default project id for a project scoped sweep") + } + if projectScoped { + projectID = &defaultProjectID + } listVolumes, err := blockAPI.ListVolumes( &block.ListVolumesRequest{ - Zone: zone, + Zone: zone, + ProjectID: projectID, }, scw.WithAllPages()) if err != nil { return fmt.Errorf("error listing volume in (%s) in sweeper: %s", zone, err) @@ -31,12 +40,21 @@ func SweepVolumes(scwClient *scw.Client, zone scw.Zone) error { return nil } -func SweepSnapshots(scwClient *scw.Client, zone scw.Zone) error { +func SweepSnapshots(scwClient *scw.Client, zone scw.Zone, projectScoped bool) error { blockAPI := block.NewAPI(scwClient) + defaultProjectID, exists := scwClient.GetDefaultProjectID() + var projectID *string = nil + if projectScoped && (!exists || (defaultProjectID == "")) { + return fmt.Errorf("failed to get the default project id for a project scoped sweep") + } + if projectScoped { + projectID = &defaultProjectID + } listSnapshots, err := blockAPI.ListSnapshots( &block.ListSnapshotsRequest{ - Zone: zone, + Zone: zone, + ProjectID: projectID, }, scw.WithAllPages()) if err != nil { return fmt.Errorf("error listing snapshot in (%s) in sweeper: %s", zone, err) @@ -55,13 +73,13 @@ func SweepSnapshots(scwClient *scw.Client, zone scw.Zone) error { return nil } -func SweepAllLocalities(scwClient *scw.Client) error { +func SweepAllLocalities(scwClient *scw.Client, projectScoped bool) error { for _, zone := range (&block.API{}).Zones() { - err := SweepVolumes(scwClient, zone) + err := SweepVolumes(scwClient, zone, projectScoped) if err != nil { return err } - err = SweepSnapshots(scwClient, zone) + err = SweepSnapshots(scwClient, zone, projectScoped) if err != nil { return err } diff --git a/api/cockpit/v1/sweepers/sweepers.go b/api/cockpit/v1/sweepers/sweepers.go index 4a401332d..4bb8538f2 100644 --- a/api/cockpit/v1/sweepers/sweepers.go +++ b/api/cockpit/v1/sweepers/sweepers.go @@ -9,22 +9,18 @@ import ( "github.com/scaleway/scaleway-sdk-go/scw" ) -func SweepToken(scwClient *scw.Client) error { +func SweepToken(scwClient *scw.Client, region scw.Region, projectScoped bool) error { accountAPI := accountSDK.NewProjectAPI(scwClient) cockpitAPI := cockpit.NewRegionalAPI(scwClient) - listProjects, err := accountAPI.ListProjects(&accountSDK.ProjectAPIListProjectsRequest{}, scw.WithAllPages()) - if err != nil { - return fmt.Errorf("failed to list projects: %w", err) + defaultProjectID, exists := scwClient.GetDefaultProjectID() + if projectScoped && (!exists || (defaultProjectID == "")) { + return fmt.Errorf("failed to get the default project id for a project scoped sweep") } - - for _, project := range listProjects.Projects { - if !strings.HasPrefix(project.Name, "tf_tests") { - continue - } - + if projectScoped { listTokens, err := cockpitAPI.ListTokens(&cockpit.RegionalAPIListTokensRequest{ - ProjectID: project.ID, + ProjectID: defaultProjectID, + Region: region, }, scw.WithAllPages()) if err != nil { return fmt.Errorf("failed to list tokens: %w", err) @@ -38,27 +34,50 @@ func SweepToken(scwClient *scw.Client) error { return fmt.Errorf("failed to delete token: %w", err) } } + } else { + listProjects, err := accountAPI.ListProjects(&accountSDK.ProjectAPIListProjectsRequest{}, scw.WithAllPages()) + if err != nil { + return fmt.Errorf("failed to list projects: %w", err) + } + + for _, project := range listProjects.Projects { + if !strings.HasPrefix(project.Name, "tf_tests") { + continue + } + + listTokens, err := cockpitAPI.ListTokens(&cockpit.RegionalAPIListTokensRequest{ + ProjectID: project.ID, + Region: region, + }, scw.WithAllPages()) + if err != nil { + return fmt.Errorf("failed to list tokens: %w", err) + } + + for _, token := range listTokens.Tokens { + err = cockpitAPI.DeleteToken(&cockpit.RegionalAPIDeleteTokenRequest{ + TokenID: token.ID, + }) + if err != nil { + return fmt.Errorf("failed to delete token: %w", err) + } + } + } } return nil } -func SweepGrafanaUser(scwClient *scw.Client) error { +func SweepGrafanaUser(scwClient *scw.Client, projectScoped bool) error { accountAPI := accountSDK.NewProjectAPI(scwClient) cockpitAPI := cockpit.NewGlobalAPI(scwClient) - listProjects, err := accountAPI.ListProjects(&accountSDK.ProjectAPIListProjectsRequest{}, scw.WithAllPages()) - if err != nil { - return fmt.Errorf("failed to list projects: %w", err) + defaultProjectID, exists := scwClient.GetDefaultProjectID() + if projectScoped && (!exists || (defaultProjectID == "")) { + return fmt.Errorf("failed to get the default project id for a project scoped sweep") } - - for _, project := range listProjects.Projects { - if !strings.HasPrefix(project.Name, "tf_tests") { - continue - } - + if projectScoped { listGrafanaUsers, err := cockpitAPI.ListGrafanaUsers(&cockpit.GlobalAPIListGrafanaUsersRequest{ - ProjectID: project.ID, + ProjectID: defaultProjectID, }, scw.WithAllPages()) if err != nil { return fmt.Errorf("failed to list grafana users: %w", err) @@ -66,63 +85,119 @@ func SweepGrafanaUser(scwClient *scw.Client) error { for _, grafanaUser := range listGrafanaUsers.GrafanaUsers { err = cockpitAPI.DeleteGrafanaUser(&cockpit.GlobalAPIDeleteGrafanaUserRequest{ - ProjectID: project.ID, + ProjectID: defaultProjectID, GrafanaUserID: grafanaUser.ID, }) if err != nil { return fmt.Errorf("failed to delete grafana user: %w", err) } } + } else { + listProjects, err := accountAPI.ListProjects(&accountSDK.ProjectAPIListProjectsRequest{}, scw.WithAllPages()) + if err != nil { + return fmt.Errorf("failed to list projects: %w", err) + } + + for _, project := range listProjects.Projects { + if !strings.HasPrefix(project.Name, "tf_tests") { + continue + } + + listGrafanaUsers, err := cockpitAPI.ListGrafanaUsers(&cockpit.GlobalAPIListGrafanaUsersRequest{ + ProjectID: project.ID, + }, scw.WithAllPages()) + if err != nil { + return fmt.Errorf("failed to list grafana users: %w", err) + } + + for _, grafanaUser := range listGrafanaUsers.GrafanaUsers { + err = cockpitAPI.DeleteGrafanaUser(&cockpit.GlobalAPIDeleteGrafanaUserRequest{ + ProjectID: project.ID, + GrafanaUserID: grafanaUser.ID, + }) + if err != nil { + return fmt.Errorf("failed to delete grafana user: %w", err) + } + } + } } return nil } -func SweepSource(scwClient *scw.Client, region scw.Region) error { +func SweepSource(scwClient *scw.Client, region scw.Region, projectScoped bool) error { accountAPI := accountSDK.NewProjectAPI(scwClient) cockpitAPI := cockpit.NewRegionalAPI(scwClient) - - listProjects, err := accountAPI.ListProjects(&accountSDK.ProjectAPIListProjectsRequest{}, scw.WithAllPages()) - if err != nil { - return fmt.Errorf("failed to list projects: %w", err) + defaultProjectID, exists := scwClient.GetDefaultProjectID() + if projectScoped && (!exists || (defaultProjectID == "")) { + return fmt.Errorf("failed to get the default project id for a project scoped sweep") } - - for _, project := range listProjects.Projects { - if !strings.HasPrefix(project.Name, "tf_tests") { - continue - } - + if projectScoped { listDatasources, err := cockpitAPI.ListDataSources(&cockpit.RegionalAPIListDataSourcesRequest{ - ProjectID: project.ID, + ProjectID: defaultProjectID, Region: region, }, scw.WithAllPages()) if err != nil { return fmt.Errorf("failed to list sources: %w", err) } - for _, datsource := range listDatasources.DataSources { + for _, datasource := range listDatasources.DataSources { + if datasource.Origin == cockpit.DataSourceOriginScaleway { + continue + } err = cockpitAPI.DeleteDataSource(&cockpit.RegionalAPIDeleteDataSourceRequest{ - DataSourceID: datsource.ID, + DataSourceID: datasource.ID, Region: region, }) if err != nil { return fmt.Errorf("failed to delete cockpit source: %w", err) } } + } else { + listProjects, err := accountAPI.ListProjects(&accountSDK.ProjectAPIListProjectsRequest{}, scw.WithAllPages()) + if err != nil { + return fmt.Errorf("failed to list projects: %w", err) + } + + for _, project := range listProjects.Projects { + if !strings.HasPrefix(project.Name, "tf_tests") { + continue + } + + listDatasources, err := cockpitAPI.ListDataSources(&cockpit.RegionalAPIListDataSourcesRequest{ + ProjectID: project.ID, + Region: region, + }, scw.WithAllPages()) + if err != nil { + return fmt.Errorf("failed to list sources: %w", err) + } + + for _, datsource := range listDatasources.DataSources { + err = cockpitAPI.DeleteDataSource(&cockpit.RegionalAPIDeleteDataSourceRequest{ + DataSourceID: datsource.ID, + Region: region, + }) + if err != nil { + return fmt.Errorf("failed to delete cockpit source: %w", err) + } + } + } } return nil } -func SweepAllLocalities(scwClient *scw.Client) error { - if err := SweepToken(scwClient); err != nil { - return err +func SweepAllLocalities(scwClient *scw.Client, projectScoped bool) error { + for _, region := range (&cockpit.RegionalAPI{}).Regions() { + if err := SweepToken(scwClient, region, projectScoped); err != nil { + return err + } } - if err := SweepGrafanaUser(scwClient); err != nil { + if err := SweepGrafanaUser(scwClient, projectScoped); err != nil { return err } for _, region := range (&cockpit.RegionalAPI{}).Regions() { - if err := SweepSource(scwClient, region); err != nil { + if err := SweepSource(scwClient, region, projectScoped); err != nil { return err } } diff --git a/api/container/v1beta1/sweepers/sweepers.go b/api/container/v1beta1/sweepers/sweepers.go index 136e1b900..7284b05f4 100644 --- a/api/container/v1beta1/sweepers/sweepers.go +++ b/api/container/v1beta1/sweepers/sweepers.go @@ -8,13 +8,22 @@ import ( "github.com/scaleway/scaleway-sdk-go/scw" ) -func SweepTrigger(scwClient *scw.Client, region scw.Region) error { +func SweepTrigger(scwClient *scw.Client, region scw.Region, projectScoped bool) error { containerAPI := container.NewAPI(scwClient) - logger.Warningf("sweeper: destroying the container triggers in (%s)", region) + + defaultProjectID, exists := scwClient.GetDefaultProjectID() + var projectID *string = nil + if projectScoped && (!exists || (defaultProjectID == "")) { + return fmt.Errorf("failed to get the default project id for a project scoped sweep") + } + if projectScoped { + projectID = &defaultProjectID + } listTriggers, err := containerAPI.ListTriggers( &container.ListTriggersRequest{ - Region: region, + Region: region, + ProjectID: projectID, }, scw.WithAllPages()) if err != nil { return fmt.Errorf("error listing trigger in (%s) in sweeper: %s", region, err) @@ -33,12 +42,23 @@ func SweepTrigger(scwClient *scw.Client, region scw.Region) error { return nil } -func SweepContainer(scwClient *scw.Client, region scw.Region) error { +func SweepContainer(scwClient *scw.Client, region scw.Region, projectScoped bool) error { containerAPI := container.NewAPI(scwClient) logger.Warningf("sweeper: destroying the container in (%s)", region) + + defaultProjectID, exists := scwClient.GetDefaultProjectID() + var projectID *string = nil + if projectScoped && (!exists || (defaultProjectID == "")) { + return fmt.Errorf("failed to get the default project id for a project scoped sweep") + } + if projectScoped { + projectID = &defaultProjectID + } + listNamespaces, err := containerAPI.ListContainers( &container.ListContainersRequest{ - Region: region, + Region: region, + ProjectID: projectID, }, scw.WithAllPages()) if err != nil { return fmt.Errorf("error listing containers in (%s) in sweeper: %s", region, err) @@ -57,12 +77,23 @@ func SweepContainer(scwClient *scw.Client, region scw.Region) error { return nil } -func SweepNamespace(scwClient *scw.Client, region scw.Region) error { +func SweepNamespace(scwClient *scw.Client, region scw.Region, projectScoped bool) error { containerAPI := container.NewAPI(scwClient) logger.Warningf("sweeper: destroying the container namespaces in (%s)", region) + + defaultProjectID, exists := scwClient.GetDefaultProjectID() + var projectID *string = nil + if projectScoped && (!exists || (defaultProjectID == "")) { + return fmt.Errorf("failed to get the default project id for a project scoped sweep") + } + if projectScoped { + projectID = &defaultProjectID + } + listNamespaces, err := containerAPI.ListNamespaces( &container.ListNamespacesRequest{ - Region: region, + Region: region, + ProjectID: projectID, }, scw.WithAllPages()) if err != nil { return fmt.Errorf("error listing namespaces in (%s) in sweeper: %s", region, err) @@ -81,17 +112,17 @@ func SweepNamespace(scwClient *scw.Client, region scw.Region) error { return nil } -func SweepAllLocalities(scwClient *scw.Client) error { +func SweepAllLocalities(scwClient *scw.Client, projectScoped bool) error { for _, region := range (&container.API{}).Regions() { - err := SweepTrigger(scwClient, region) + err := SweepTrigger(scwClient, region, projectScoped) if err != nil { return err } - err = SweepContainer(scwClient, region) + err = SweepContainer(scwClient, region, projectScoped) if err != nil { return err } - err = SweepNamespace(scwClient, region) + err = SweepNamespace(scwClient, region, projectScoped) if err != nil { return err } diff --git a/api/flexibleip/v1alpha1/sweepers/sweepers.go b/api/flexibleip/v1alpha1/sweepers/sweepers.go index 54f972526..48d854fd7 100644 --- a/api/flexibleip/v1alpha1/sweepers/sweepers.go +++ b/api/flexibleip/v1alpha1/sweepers/sweepers.go @@ -8,10 +8,18 @@ import ( "github.com/scaleway/scaleway-sdk-go/scw" ) -func SweepFlexibleIP(scwClient *scw.Client, zone scw.Zone) error { +func SweepFlexibleIP(scwClient *scw.Client, zone scw.Zone, projectScoped bool) error { fipAPI := flexibleip.NewAPI(scwClient) + defaultProjectID, exists := scwClient.GetDefaultProjectID() + var projectID *string = nil + if projectScoped && (!exists || (defaultProjectID == "")) { + return fmt.Errorf("failed to get the default project id for a project scoped sweep") + } + if projectScoped { + projectID = &defaultProjectID + } - listIPs, err := fipAPI.ListFlexibleIPs(&flexibleip.ListFlexibleIPsRequest{Zone: zone}, scw.WithAllPages()) + listIPs, err := fipAPI.ListFlexibleIPs(&flexibleip.ListFlexibleIPsRequest{Zone: zone, ProjectID: projectID}, scw.WithAllPages()) if err != nil { logger.Warningf("error listing ips in (%s) in sweeper: %s", zone, err) return nil @@ -30,9 +38,9 @@ func SweepFlexibleIP(scwClient *scw.Client, zone scw.Zone) error { return nil } -func SweepAllLocalities(scwClient *scw.Client) error { +func SweepAllLocalities(scwClient *scw.Client, projectScoped bool) error { for _, zone := range (&flexibleip.API{}).Zones() { - err := SweepFlexibleIP(scwClient, zone) + err := SweepFlexibleIP(scwClient, zone, projectScoped) if err != nil { return err } diff --git a/api/function/v1beta1/sweepers/sweepers.go b/api/function/v1beta1/sweepers/sweepers.go index 5ccf1e70b..d13e4aebc 100644 --- a/api/function/v1beta1/sweepers/sweepers.go +++ b/api/function/v1beta1/sweepers/sweepers.go @@ -8,12 +8,22 @@ import ( "github.com/scaleway/scaleway-sdk-go/scw" ) -func SweepTriggers(scwClient *scw.Client, region scw.Region) error { +func SweepTriggers(scwClient *scw.Client, region scw.Region, projectScoped bool) error { functionAPI := functionSDK.NewAPI(scwClient) logger.Warningf("sweeper: destroying the function triggers in (%s)", region) + + defaultProjectID, exists := scwClient.GetDefaultProjectID() + var projectID *string = nil + if projectScoped && (!exists || (defaultProjectID == "")) { + return fmt.Errorf("failed to get the default project id for a project scoped sweep") + } + if projectScoped { + projectID = &defaultProjectID + } listTriggers, err := functionAPI.ListTriggers( &functionSDK.ListTriggersRequest{ - Region: region, + Region: region, + ProjectID: projectID, }, scw.WithAllPages()) if err != nil { return fmt.Errorf("error listing trigger in (%s) in sweeper: %s", region, err) @@ -32,12 +42,21 @@ func SweepTriggers(scwClient *scw.Client, region scw.Region) error { return nil } -func SweepNamespaces(scwClient *scw.Client, region scw.Region) error { +func SweepNamespaces(scwClient *scw.Client, region scw.Region, projectScoped bool) error { functionAPI := functionSDK.NewAPI(scwClient) logger.Debugf("sweeper: destroying the function namespaces in (%s)", region) + defaultProjectID, exists := scwClient.GetDefaultProjectID() + var projectID *string = nil + if projectScoped && (!exists || (defaultProjectID == "")) { + return fmt.Errorf("failed to get the default project id for a project scoped sweep") + } + if projectScoped { + projectID = &defaultProjectID + } listNamespaces, err := functionAPI.ListNamespaces( &functionSDK.ListNamespacesRequest{ - Region: region, + Region: region, + ProjectID: projectID, }, scw.WithAllPages()) if err != nil { return fmt.Errorf("error listing namespaces in (%s) in sweeper: %s", region, err) @@ -58,12 +77,21 @@ func SweepNamespaces(scwClient *scw.Client, region scw.Region) error { return nil } -func SweepFunctions(scwClient *scw.Client, region scw.Region) error { +func SweepFunctions(scwClient *scw.Client, region scw.Region, projectScoped bool) error { functionAPI := functionSDK.NewAPI(scwClient) - logger.Warningf("sweeper: destroying the function in (%s)", region) + logger.Debugf("sweeper: destroying the function in (%s)", region) + defaultProjectID, exists := scwClient.GetDefaultProjectID() + var projectID *string = nil + if projectScoped && (!exists || (defaultProjectID == "")) { + return fmt.Errorf("failed to get the default project id for a project scoped sweep") + } + if projectScoped { + projectID = &defaultProjectID + } listFunctions, err := functionAPI.ListFunctions( &functionSDK.ListFunctionsRequest{ - Region: region, + Region: region, + ProjectID: projectID, }, scw.WithAllPages()) if err != nil { return fmt.Errorf("error listing functions in (%s) in sweeper: %s", region, err) @@ -82,45 +110,80 @@ func SweepFunctions(scwClient *scw.Client, region scw.Region) error { return nil } -func SweepCrons(scwClient *scw.Client, region scw.Region) error { +func SweepCrons(scwClient *scw.Client, region scw.Region, projectScoped bool) error { functionAPI := functionSDK.NewAPI(scwClient) logger.Warningf("sweeper: destroying the function cron in (%s)", region) - listCron, err := functionAPI.ListCrons( - &functionSDK.ListCronsRequest{ - Region: region, - }, scw.WithAllPages()) - if err != nil { - return fmt.Errorf("error listing cron in (%s) in sweeper: %s", region, err) + defaultProjectID, exists := scwClient.GetDefaultProjectID() + if projectScoped && (!exists || (defaultProjectID == "")) { + return fmt.Errorf("failed to get the default project id for a project scoped sweep") } - - for _, cron := range listCron.Crons { - _, err := functionAPI.DeleteCron(&functionSDK.DeleteCronRequest{ - CronID: cron.ID, - Region: region, - }) + if projectScoped { + listFunctions, err := functionAPI.ListFunctions( + &functionSDK.ListFunctionsRequest{ + Region: region, + ProjectID: &defaultProjectID, + }, scw.WithAllPages()) if err != nil { - return fmt.Errorf("error deleting cron in sweeper: %s", err) + return fmt.Errorf("error listing functions in (%s) in sweeper: %s", region, err) + } + for _, function := range listFunctions.Functions { + listCron, err := functionAPI.ListCrons( + &functionSDK.ListCronsRequest{ + Region: region, + FunctionID: function.ID, + }, scw.WithAllPages()) + if err != nil { + return fmt.Errorf("error listing cron in (%s) in sweeper: %s", region, err) + } + + for _, cron := range listCron.Crons { + _, err := functionAPI.DeleteCron(&functionSDK.DeleteCronRequest{ + CronID: cron.ID, + Region: region, + }) + if err != nil { + return fmt.Errorf("error deleting cron in sweeper: %s", err) + } + } + } + } else { + listCron, err := functionAPI.ListCrons( + &functionSDK.ListCronsRequest{ + Region: region, + }, scw.WithAllPages()) + if err != nil { + return fmt.Errorf("error listing cron in (%s) in sweeper: %s", region, err) + } + + for _, cron := range listCron.Crons { + _, err := functionAPI.DeleteCron(&functionSDK.DeleteCronRequest{ + CronID: cron.ID, + Region: region, + }) + if err != nil { + return fmt.Errorf("error deleting cron in sweeper: %s", err) + } } } return nil } -func SweepAllLocalities(scwClient *scw.Client) error { +func SweepAllLocalities(scwClient *scw.Client, projectScoped bool) error { for _, region := range (&functionSDK.API{}).Regions() { - err := SweepTriggers(scwClient, region) + err := SweepTriggers(scwClient, region, projectScoped) if err != nil { return err } - err = SweepNamespaces(scwClient, region) + err = SweepNamespaces(scwClient, region, projectScoped) if err != nil { return err } - err = SweepFunctions(scwClient, region) + err = SweepFunctions(scwClient, region, projectScoped) if err != nil { return err } - err = SweepCrons(scwClient, region) + err = SweepCrons(scwClient, region, projectScoped) if err != nil { return err } diff --git a/api/inference/v1/sweepers/sweepers.go b/api/inference/v1/sweepers/sweepers.go index 56fc62a89..4744f1153 100644 --- a/api/inference/v1/sweepers/sweepers.go +++ b/api/inference/v1/sweepers/sweepers.go @@ -8,12 +8,21 @@ import ( "github.com/scaleway/scaleway-sdk-go/scw" ) -func SweepDeployment(scwClient *scw.Client, region scw.Region) error { +func SweepDeployment(scwClient *scw.Client, region scw.Region, projectScoped bool) error { inferenceAPI := inference.NewAPI(scwClient) logger.Warningf("sweeper: destroying the inference deployments in (%s)", region) + defaultProjectID, exists := scwClient.GetDefaultProjectID() + var projectID *string = nil + if projectScoped && (!exists || (defaultProjectID == "")) { + return fmt.Errorf("failed to get the default project id for a project scoped sweep") + } + if projectScoped { + projectID = &defaultProjectID + } listDeployments, err := inferenceAPI.ListDeployments( &inference.ListDeploymentsRequest{ - Region: region, + Region: region, + ProjectID: projectID, }, scw.WithAllPages()) if err != nil { return fmt.Errorf("error listing deployment in (%s) in sweeper: %s", region, err) @@ -32,9 +41,9 @@ func SweepDeployment(scwClient *scw.Client, region scw.Region) error { return nil } -func SweepAllLocalities(scwClient *scw.Client) error { +func SweepAllLocalities(scwClient *scw.Client, projectScoped bool) error { for _, locality := range (&inference.API{}).Regions() { - err := SweepDeployment(scwClient, locality) + err := SweepDeployment(scwClient, locality, projectScoped) if err != nil { return err } diff --git a/api/inference/v1beta1/sweepers/sweepers.go b/api/inference/v1beta1/sweepers/sweepers.go index 100ee2775..09cb91682 100644 --- a/api/inference/v1beta1/sweepers/sweepers.go +++ b/api/inference/v1beta1/sweepers/sweepers.go @@ -8,12 +8,22 @@ import ( "github.com/scaleway/scaleway-sdk-go/scw" ) -func SweepDeployment(scwClient *scw.Client, region scw.Region) error { +func SweepDeployment(scwClient *scw.Client, region scw.Region, projectScoped bool) error { inferenceAPI := inference.NewAPI(scwClient) logger.Warningf("sweeper: destroying the inference deployments in (%s)", region) + + defaultProjectID, exists := scwClient.GetDefaultProjectID() + var projectID *string = nil + if projectScoped && (!exists || (defaultProjectID == "")) { + return fmt.Errorf("failed to get the default project id for a project scoped sweep") + } + if projectScoped { + projectID = &defaultProjectID + } listDeployments, err := inferenceAPI.ListDeployments( &inference.ListDeploymentsRequest{ - Region: region, + Region: region, + ProjectID: projectID, }, scw.WithAllPages()) if err != nil { return fmt.Errorf("error listing deployment in (%s) in sweeper: %s", region, err) @@ -32,9 +42,9 @@ func SweepDeployment(scwClient *scw.Client, region scw.Region) error { return nil } -func SweepAllLocalities(scwClient *scw.Client) error { +func SweepAllLocalities(scwClient *scw.Client, projectScoped bool) error { for _, locality := range (&inference.API{}).Regions() { - err := SweepDeployment(scwClient, locality) + err := SweepDeployment(scwClient, locality, projectScoped) if err != nil { return err } diff --git a/api/instance/v1/sweepers/sweepers.go b/api/instance/v1/sweepers/sweepers.go index 97ddffe9c..884d6f10e 100644 --- a/api/instance/v1/sweepers/sweepers.go +++ b/api/instance/v1/sweepers/sweepers.go @@ -8,12 +8,21 @@ import ( "github.com/scaleway/scaleway-sdk-go/scw" ) -func SweepVolumes(scwClient *scw.Client, zone scw.Zone) error { +func SweepVolumes(scwClient *scw.Client, zone scw.Zone, projectScoped bool) error { instanceAPI := instance.NewAPI(scwClient) logger.Warningf("sweeper: destroying the volumes in (%s)", zone) + defaultProjectID, exists := scwClient.GetDefaultProjectID() + var projectID *string = nil + if projectScoped && (!exists || (defaultProjectID == "")) { + return fmt.Errorf("failed to get the default project id for a project scoped sweep") + } + if projectScoped { + projectID = &defaultProjectID + } listVolumesResponse, err := instanceAPI.ListVolumes(&instance.ListVolumesRequest{ - Zone: zone, + Zone: zone, + Project: projectID, }, scw.WithAllPages()) if err != nil { return fmt.Errorf("error listing volumes in sweeper: %s", err) @@ -33,12 +42,21 @@ func SweepVolumes(scwClient *scw.Client, zone scw.Zone) error { return nil } -func SweepSnapshots(scwClient *scw.Client, zone scw.Zone) error { +func SweepSnapshots(scwClient *scw.Client, zone scw.Zone, projectScoped bool) error { api := instance.NewAPI(scwClient) logger.Warningf("sweeper: destroying instance snapshots in (%+v)", zone) + defaultProjectID, exists := scwClient.GetDefaultProjectID() + var projectID *string = nil + if projectScoped && (!exists || (defaultProjectID == "")) { + return fmt.Errorf("failed to get the default project id for a project scoped sweep") + } + if projectScoped { + projectID = &defaultProjectID + } listSnapshotsResponse, err := api.ListSnapshots(&instance.ListSnapshotsRequest{ - Zone: zone, + Zone: zone, + Project: projectID, }, scw.WithAllPages()) if err != nil { return fmt.Errorf("error listing instance snapshots in sweeper: %w", err) @@ -57,10 +75,18 @@ func SweepSnapshots(scwClient *scw.Client, zone scw.Zone) error { return nil } -func SweepServers(scwClient *scw.Client, zone scw.Zone) error { +func SweepServers(scwClient *scw.Client, zone scw.Zone, projectScoped bool) error { instanceAPI := instance.NewAPI(scwClient) logger.Warningf("sweeper: destroying the instance server in (%s)", zone) - listServers, err := instanceAPI.ListServers(&instance.ListServersRequest{Zone: zone}, scw.WithAllPages()) + defaultProjectID, exists := scwClient.GetDefaultProjectID() + var projectID *string = nil + if projectScoped && (!exists || (defaultProjectID == "")) { + return fmt.Errorf("failed to get the default project id for a project scoped sweep") + } + if projectScoped { + projectID = &defaultProjectID + } + listServers, err := instanceAPI.ListServers(&instance.ListServersRequest{Zone: zone, Project: projectID}, scw.WithAllPages()) if err != nil { logger.Warningf("error listing servers in (%s) in sweeper: %s", zone, err) return nil @@ -92,12 +118,21 @@ func SweepServers(scwClient *scw.Client, zone scw.Zone) error { return nil } -func SweepSecurityGroups(scwClient *scw.Client, zone scw.Zone) error { +func SweepSecurityGroups(scwClient *scw.Client, zone scw.Zone, projectScoped bool) error { instanceAPI := instance.NewAPI(scwClient) logger.Warningf("sweeper: destroying the security groups in (%s)", zone) + defaultProjectID, exists := scwClient.GetDefaultProjectID() + var projectID *string = nil + if projectScoped && (!exists || (defaultProjectID == "")) { + return fmt.Errorf("failed to get the default project id for a project scoped sweep") + } + if projectScoped { + projectID = &defaultProjectID + } listResp, err := instanceAPI.ListSecurityGroups(&instance.ListSecurityGroupsRequest{ - Zone: zone, + Zone: zone, + Project: projectID, }, scw.WithAllPages()) if err != nil { logger.Warningf("error listing security groups in sweeper: %s", err) @@ -121,11 +156,20 @@ func SweepSecurityGroups(scwClient *scw.Client, zone scw.Zone) error { return nil } -func SweepPlacementGroup(scwClient *scw.Client, zone scw.Zone) error { +func SweepPlacementGroup(scwClient *scw.Client, zone scw.Zone, projectScoped bool) error { instanceAPI := instance.NewAPI(scwClient) logger.Warningf("sweeper: destroying the instance placement group in (%s)", zone) + defaultProjectID, exists := scwClient.GetDefaultProjectID() + var projectID *string = nil + if projectScoped && (!exists || (defaultProjectID == "")) { + return fmt.Errorf("failed to get the default project id for a project scoped sweep") + } + if projectScoped { + projectID = &defaultProjectID + } listPlacementGroups, err := instanceAPI.ListPlacementGroups(&instance.ListPlacementGroupsRequest{ - Zone: zone, + Zone: zone, + Project: projectID, }, scw.WithAllPages()) if err != nil { logger.Warningf("error listing placement groups in (%s) in sweeper: %s", zone, err) @@ -145,10 +189,19 @@ func SweepPlacementGroup(scwClient *scw.Client, zone scw.Zone) error { return nil } -func SweepIP(scwClient *scw.Client, zone scw.Zone) error { +func SweepIP(scwClient *scw.Client, zone scw.Zone, projectScoped bool) error { instanceAPI := instance.NewAPI(scwClient) + logger.Warningf("sweeper: destroying instance ips in (%+v)", zone) + defaultProjectID, exists := scwClient.GetDefaultProjectID() + var projectID *string = nil + if projectScoped && (!exists || (defaultProjectID == "")) { + return fmt.Errorf("failed to get the default project id for a project scoped sweep") + } + if projectScoped { + projectID = &defaultProjectID + } - listIPs, err := instanceAPI.ListIPs(&instance.ListIPsRequest{Zone: zone}, scw.WithAllPages()) + listIPs, err := instanceAPI.ListIPs(&instance.ListIPsRequest{Zone: zone, Project: projectID}, scw.WithAllPages()) if err != nil { logger.Warningf("error listing ips in (%s) in sweeper: %s", zone, err) return nil @@ -167,13 +220,22 @@ func SweepIP(scwClient *scw.Client, zone scw.Zone) error { return nil } -func SweepImages(scwClient *scw.Client, zone scw.Zone) error { +func SweepImages(scwClient *scw.Client, zone scw.Zone, projectScoped bool) error { api := instance.NewAPI(scwClient) - logger.Debugf("sweeper: destroying instance images in (%+v)", zone) + logger.Warningf("sweeper: destroying instance images in (%+v)", zone) + defaultProjectID, exists := scwClient.GetDefaultProjectID() + var projectID *string = nil + if projectScoped && (!exists || (defaultProjectID == "")) { + return fmt.Errorf("failed to get the default project id for a project scoped sweep") + } + if projectScoped { + projectID = &defaultProjectID + } listImagesResponse, err := api.ListImages(&instance.ListImagesRequest{ - Zone: zone, - Public: scw.BoolPtr(false), + Zone: zone, + Public: scw.BoolPtr(false), + Project: projectID, }, scw.WithAllPages()) if err != nil { return fmt.Errorf("error listing instance images in sweeper: %w", err) @@ -192,33 +254,33 @@ func SweepImages(scwClient *scw.Client, zone scw.Zone) error { return nil } -func SweepAllLocalities(scwClient *scw.Client) error { +func SweepAllLocalities(scwClient *scw.Client, projectScoped bool) error { for _, zone := range (&instance.API{}).Zones() { - err := SweepVolumes(scwClient, zone) + err := SweepVolumes(scwClient, zone, projectScoped) if err != nil { return err } - err = SweepSnapshots(scwClient, zone) + err = SweepSnapshots(scwClient, zone, projectScoped) if err != nil { return err } - err = SweepServers(scwClient, zone) + err = SweepServers(scwClient, zone, projectScoped) if err != nil { return err } - err = SweepSecurityGroups(scwClient, zone) + err = SweepSecurityGroups(scwClient, zone, projectScoped) if err != nil { return err } - err = SweepPlacementGroup(scwClient, zone) + err = SweepPlacementGroup(scwClient, zone, projectScoped) if err != nil { return err } - err = SweepIP(scwClient, zone) + err = SweepIP(scwClient, zone, projectScoped) if err != nil { return err } - err = SweepImages(scwClient, zone) + err = SweepImages(scwClient, zone, projectScoped) if err != nil { return err } diff --git a/api/iot/v1/sweepers/sweepers.go b/api/iot/v1/sweepers/sweepers.go index 20a360b03..9ff3808af 100644 --- a/api/iot/v1/sweepers/sweepers.go +++ b/api/iot/v1/sweepers/sweepers.go @@ -8,10 +8,18 @@ import ( "github.com/scaleway/scaleway-sdk-go/scw" ) -func SweepHub(scwClient *scw.Client, region scw.Region) error { +func SweepHub(scwClient *scw.Client, region scw.Region, projectScoped bool) error { iotAPI := iot.NewAPI(scwClient) logger.Warningf("sweeper: destroying the iot hub in (%s)", region) - listHubs, err := iotAPI.ListHubs(&iot.ListHubsRequest{Region: region}, scw.WithAllPages()) + defaultProjectID, exists := scwClient.GetDefaultProjectID() + var projectID *string = nil + if projectScoped && (!exists || (defaultProjectID == "")) { + return fmt.Errorf("failed to get the default project id for a project scoped sweep") + } + if projectScoped { + projectID = &defaultProjectID + } + listHubs, err := iotAPI.ListHubs(&iot.ListHubsRequest{Region: region, ProjectID: projectID}, scw.WithAllPages()) if err != nil { return fmt.Errorf("error listing hubs in (%s) in sweeper: %s", region, err) } @@ -31,9 +39,9 @@ func SweepHub(scwClient *scw.Client, region scw.Region) error { return nil } -func SweepAllLocalities(scwClient *scw.Client) error { +func SweepAllLocalities(scwClient *scw.Client, projectScoped bool) error { for _, region := range (&iot.API{}).Regions() { - err := SweepHub(scwClient, region) + err := SweepHub(scwClient, region, projectScoped) if err != nil { return err } diff --git a/api/ipam/v1/sweepers/sweepers.go b/api/ipam/v1/sweepers/sweepers.go index f396db4b2..e05bf2a49 100644 --- a/api/ipam/v1/sweepers/sweepers.go +++ b/api/ipam/v1/sweepers/sweepers.go @@ -8,12 +8,20 @@ import ( "github.com/scaleway/scaleway-sdk-go/scw" ) -func SweepIP(scwClient *scw.Client, region scw.Region) error { +func SweepIP(scwClient *scw.Client, region scw.Region, projectScoped bool) error { ipamAPI := ipam.NewAPI(scwClient) logger.Warningf("sweeper: deleting the IPs in (%s)", region) + defaultProjectID, exists := scwClient.GetDefaultProjectID() + var projectID *string = nil + if projectScoped && (!exists || (defaultProjectID == "")) { + return fmt.Errorf("failed to get the default project id for a project scoped sweep") + } + if projectScoped { + projectID = &defaultProjectID + } - listIPs, err := ipamAPI.ListIPs(&ipam.ListIPsRequest{Region: region}, scw.WithAllPages()) + listIPs, err := ipamAPI.ListIPs(&ipam.ListIPsRequest{Region: region, ProjectID: projectID}, scw.WithAllPages()) if err != nil { return fmt.Errorf("error listing ips in (%s) in sweeper: %s", region, err) } @@ -31,9 +39,9 @@ func SweepIP(scwClient *scw.Client, region scw.Region) error { return nil } -func SweepAllLocalities(scwClient *scw.Client) error { +func SweepAllLocalities(scwClient *scw.Client, projectScoped bool) error { for _, region := range (&ipam.API{}).Regions() { - err := SweepIP(scwClient, region) + err := SweepIP(scwClient, region, projectScoped) if err != nil { return err } diff --git a/api/jobs/v1alpha1/sweepers/sweepers.go b/api/jobs/v1alpha1/sweepers/sweepers.go index 34a734daf..0950de8ed 100644 --- a/api/jobs/v1alpha1/sweepers/sweepers.go +++ b/api/jobs/v1alpha1/sweepers/sweepers.go @@ -8,12 +8,21 @@ import ( "github.com/scaleway/scaleway-sdk-go/scw" ) -func SweepJobDefinition(scwClient *scw.Client, region scw.Region) error { +func SweepJobDefinition(scwClient *scw.Client, region scw.Region, projectScoped bool) error { jobsAPI := jobs.NewAPI(scwClient) logger.Warningf("sweeper: destroying the jobs definitions in (%s)", region) + defaultProjectID, exists := scwClient.GetDefaultProjectID() + var projectID *string = nil + if projectScoped && (!exists || (defaultProjectID == "")) { + return fmt.Errorf("failed to get the default project id for a project scoped sweep") + } + if projectScoped { + projectID = &defaultProjectID + } listJobDefinitions, err := jobsAPI.ListJobDefinitions( &jobs.ListJobDefinitionsRequest{ - Region: region, + Region: region, + ProjectID: projectID, }, scw.WithAllPages()) if err != nil { return fmt.Errorf("error listing definition in (%s) in sweeper: %s", region, err) @@ -32,9 +41,9 @@ func SweepJobDefinition(scwClient *scw.Client, region scw.Region) error { return nil } -func SweepAllLocalities(scwClient *scw.Client) error { +func SweepAllLocalities(scwClient *scw.Client, projectScoped bool) error { for _, region := range (&jobs.API{}).Regions() { - err := SweepJobDefinition(scwClient, region) + err := SweepJobDefinition(scwClient, region, projectScoped) if err != nil { return err } diff --git a/api/k8s/v1/sweepers/sweepers.go b/api/k8s/v1/sweepers/sweepers.go index 69fcdca92..d447ceec0 100644 --- a/api/k8s/v1/sweepers/sweepers.go +++ b/api/k8s/v1/sweepers/sweepers.go @@ -8,11 +8,18 @@ import ( "github.com/scaleway/scaleway-sdk-go/scw" ) -func SweepCluster(scwClient *scw.Client, region scw.Region) error { +func SweepCluster(scwClient *scw.Client, region scw.Region, projectScoped bool) error { k8sAPI := k8s.NewAPI(scwClient) - logger.Warningf("sweeper: destroying the k8s cluster in (%s)", region) - listClusters, err := k8sAPI.ListClusters(&k8s.ListClustersRequest{Region: region}, scw.WithAllPages()) + defaultProjectID, exists := scwClient.GetDefaultProjectID() + var projectID *string = nil + if projectScoped && (!exists || (defaultProjectID == "")) { + return fmt.Errorf("failed to get the default project id for a project scoped sweep") + } + if projectScoped { + projectID = &defaultProjectID + } + listClusters, err := k8sAPI.ListClusters(&k8s.ListClustersRequest{Region: region, ProjectID: projectID}, scw.WithAllPages()) if err != nil { return fmt.Errorf("error listing clusters in (%s) in sweeper: %s", region, err) } @@ -49,9 +56,9 @@ func SweepCluster(scwClient *scw.Client, region scw.Region) error { return nil } -func SweepAllLocalities(scwClient *scw.Client) error { +func SweepAllLocalities(scwClient *scw.Client, projectScoped bool) error { for _, region := range (&k8s.API{}).Regions() { - err := SweepCluster(scwClient, region) + err := SweepCluster(scwClient, region, projectScoped) if err != nil { return err } diff --git a/api/lb/v1/sweepers/sweepers.go b/api/lb/v1/sweepers/sweepers.go index 1070782ca..3c93d569e 100644 --- a/api/lb/v1/sweepers/sweepers.go +++ b/api/lb/v1/sweepers/sweepers.go @@ -8,12 +8,21 @@ import ( "github.com/scaleway/scaleway-sdk-go/scw" ) -func SweepLB(scwClient *scw.Client, zone scw.Zone) error { +func SweepLB(scwClient *scw.Client, zone scw.Zone, projectScoped bool) error { lbAPI := lb.NewZonedAPI(scwClient) logger.Warningf("sweeper: destroying the lbs in (%s)", zone) + defaultProjectID, exists := scwClient.GetDefaultProjectID() + var projectID *string = nil + if projectScoped && (!exists || (defaultProjectID == "")) { + return fmt.Errorf("failed to get the default project id for a project scoped sweep") + } + if projectScoped { + projectID = &defaultProjectID + } listLBs, err := lbAPI.ListLBs(&lb.ZonedAPIListLBsRequest{ - Zone: zone, + Zone: zone, + ProjectID: projectID, }, scw.WithAllPages()) if err != nil { return fmt.Errorf("error listing lbs in (%s) in sweeper: %s", zone, err) @@ -40,11 +49,19 @@ func SweepLB(scwClient *scw.Client, zone scw.Zone) error { return nil } -func SweepIP(scwClient *scw.Client, zone scw.Zone) error { +func SweepIP(scwClient *scw.Client, zone scw.Zone, projectScoped bool) error { lbAPI := lb.NewZonedAPI(scwClient) - logger.Warningf("sweeper: destroying the lb ips in zone (%s)", zone) - listIPs, err := lbAPI.ListIPs(&lb.ZonedAPIListIPsRequest{Zone: zone}, scw.WithAllPages()) + + defaultProjectID, exists := scwClient.GetDefaultProjectID() + var projectID *string = nil + if projectScoped && (!exists || (defaultProjectID == "")) { + return fmt.Errorf("failed to get the default project id for a project scoped sweep") + } + if projectScoped { + projectID = &defaultProjectID + } + listIPs, err := lbAPI.ListIPs(&lb.ZonedAPIListIPsRequest{Zone: zone, ProjectID: projectID}, scw.WithAllPages()) if err != nil { return fmt.Errorf("error listing lb ips in (%s) in sweeper: %s", zone, err) } @@ -64,13 +81,13 @@ func SweepIP(scwClient *scw.Client, zone scw.Zone) error { return nil } -func SweepAllLocalities(scwClient *scw.Client) error { +func SweepAllLocalities(scwClient *scw.Client, projectScoped bool) error { for _, zone := range (&lb.ZonedAPI{}).Zones() { - err := SweepLB(scwClient, zone) + err := SweepLB(scwClient, zone, projectScoped) if err != nil { return err } - err = SweepIP(scwClient, zone) + err = SweepIP(scwClient, zone, projectScoped) if err != nil { return err } diff --git a/api/mnq/v1beta1/sweepers/sweepers.go b/api/mnq/v1beta1/sweepers/sweepers.go index 1934456d5..2f663e619 100644 --- a/api/mnq/v1beta1/sweepers/sweepers.go +++ b/api/mnq/v1beta1/sweepers/sweepers.go @@ -10,7 +10,7 @@ import ( "github.com/scaleway/scaleway-sdk-go/scw" ) -func SweepSQSCredentials(scwClient *scw.Client, region scw.Region) error { +func SweepSQSCredentials(scwClient *scw.Client, region scw.Region, projectScoped bool) error { mnqAPI := mnq.NewSqsAPI(scwClient) projectID, _ := scwClient.GetDefaultProjectID() logger.Warningf("sweeper: destroying the mnq sqs credentials in (%s)", region) @@ -44,38 +44,70 @@ func SweepSQSCredentials(scwClient *scw.Client, region scw.Region) error { return nil } -func SweepSQS(scwClient *scw.Client, region scw.Region) error { +func SweepSQS(scwClient *scw.Client, region scw.Region, projectScoped bool) error { accountAPI := accountSDK.NewProjectAPI(scwClient) mnqAPI := mnq.NewSqsAPI(scwClient) logger.Warningf("sweeper: destroying the mnq sqss in (%s)", region) - - listProjects, err := accountAPI.ListProjects(&accountSDK.ProjectAPIListProjectsRequest{}, scw.WithAllPages()) - if err != nil { - return fmt.Errorf("failed to list projects: %w", err) + defaultProjectID, exists := scwClient.GetDefaultProjectID() + if projectScoped && (!exists || (defaultProjectID == "")) { + return fmt.Errorf("failed to get the default project id for a project scoped sweep") } - for _, project := range listProjects.Projects { - if !strings.HasPrefix(project.Name, "tf_tests") { - continue + if projectScoped && exists && defaultProjectID != "" { + sqsInfo, err := mnqAPI.GetSqsInfo(&mnq.SqsAPIGetSqsInfoRequest{Region: region, ProjectID: defaultProjectID}) + if err != nil { + return fmt.Errorf("error getting sqs info in sweeper: %s", err) } - - _, err := mnqAPI.DeactivateSqs(&mnq.SqsAPIDeactivateSqsRequest{ + if sqsInfo.Status == mnq.SqsInfoStatusDisabled { + logger.Infof("sqs is disabled, skipping") + return nil + } + _, err = mnqAPI.DeactivateSqs(&mnq.SqsAPIDeactivateSqsRequest{ Region: region, - ProjectID: project.ID, + ProjectID: defaultProjectID, }) if err != nil { return err } + } else { + listProjects, err := accountAPI.ListProjects(&accountSDK.ProjectAPIListProjectsRequest{}, scw.WithAllPages()) + if err != nil { + return fmt.Errorf("failed to list projects: %w", err) + } + for _, project := range listProjects.Projects { + if !strings.HasPrefix(project.Name, "tf_tests") { + continue + } + + _, err := mnqAPI.DeactivateSqs(&mnq.SqsAPIDeactivateSqsRequest{ + Region: region, + ProjectID: project.ID, + }) + if err != nil { + return err + } + } } return nil } -func SweepSNSCredentials(scwClient *scw.Client, region scw.Region) error { +func SweepSNSCredentials(scwClient *scw.Client, region scw.Region, projectScoped bool) error { mnqAPI := mnq.NewSnsAPI(scwClient) - projectID, _ := scwClient.GetDefaultProjectID() logger.Warningf("sweeper: destroying the mnq sns credentials in (%s)", region) - snsInfo, err := mnqAPI.GetSnsInfo(&mnq.SnsAPIGetSnsInfoRequest{Region: region}) + defaultProjectID, exists := scwClient.GetDefaultProjectID() + var projectID *string = nil + if projectScoped && (!exists || (defaultProjectID == "")) { + return fmt.Errorf("failed to get the default project id for a project scoped sweep") + } + if projectScoped && exists && defaultProjectID != "" { + projectID = &defaultProjectID + } + infoProjectID := "" + if projectID != nil { + infoProjectID = *projectID + } + snsInfo, err := mnqAPI.GetSnsInfo(&mnq.SnsAPIGetSnsInfoRequest{Region: region, ProjectID: infoProjectID}) if err != nil { return fmt.Errorf("error getting sns info in sweeper: %s", err) } @@ -86,7 +118,7 @@ func SweepSNSCredentials(scwClient *scw.Client, region scw.Region) error { listSnsCredentials, err := mnqAPI.ListSnsCredentials( &mnq.SnsAPIListSnsCredentialsRequest{ Region: region, - ProjectID: scw.StringPtr(projectID), + ProjectID: projectID, }, scw.WithAllPages()) if err != nil { return fmt.Errorf("error listing sns credentials in (%s) in sweeper: %s", region, err) @@ -105,40 +137,71 @@ func SweepSNSCredentials(scwClient *scw.Client, region scw.Region) error { return nil } -func SweepSNS(scwClient *scw.Client, region scw.Region) error { +func SweepSNS(scwClient *scw.Client, region scw.Region, projectScoped bool) error { accountAPI := accountSDK.NewProjectAPI(scwClient) mnqAPI := mnq.NewSnsAPI(scwClient) logger.Warningf("sweeper: destroying the mnq sns in (%s)", region) - - listProjects, err := accountAPI.ListProjects(&accountSDK.ProjectAPIListProjectsRequest{}, scw.WithAllPages()) - if err != nil { - return fmt.Errorf("failed to list projects: %w", err) + defaultProjectID, exists := scwClient.GetDefaultProjectID() + if projectScoped && (!exists || (defaultProjectID == "")) { + return fmt.Errorf("failed to get the default project id for a project scoped sweep") } - for _, project := range listProjects.Projects { - if !strings.HasPrefix(project.Name, "tf_tests") { - continue + if projectScoped && exists && defaultProjectID != "" { + snsInfo, err := mnqAPI.GetSnsInfo(&mnq.SnsAPIGetSnsInfoRequest{Region: region, ProjectID: defaultProjectID}) + if err != nil { + return fmt.Errorf("error getting sns info in sweeper: %s", err) } - - _, err := mnqAPI.DeactivateSns(&mnq.SnsAPIDeactivateSnsRequest{ + if snsInfo.Status == mnq.SnsInfoStatusDisabled { + logger.Infof("sns is disabled, skipping") + return nil + } + _, err = mnqAPI.DeactivateSns(&mnq.SnsAPIDeactivateSnsRequest{ Region: region, - ProjectID: project.ID, + ProjectID: defaultProjectID, }) if err != nil { logger.Debugf("sweeper: error (%s)", err) return err } + } else { + listProjects, err := accountAPI.ListProjects(&accountSDK.ProjectAPIListProjectsRequest{}, scw.WithAllPages()) + if err != nil { + return fmt.Errorf("failed to list projects: %w", err) + } + for _, project := range listProjects.Projects { + if !strings.HasPrefix(project.Name, "tf_tests") { + continue + } + + _, err := mnqAPI.DeactivateSns(&mnq.SnsAPIDeactivateSnsRequest{ + Region: region, + ProjectID: project.ID, + }) + if err != nil { + logger.Debugf("sweeper: error (%s)", err) + return err + } + } } return nil } -func SweepNatsAccount(scwClient *scw.Client, region scw.Region) error { +func SweepNatsAccount(scwClient *scw.Client, region scw.Region, projectScoped bool) error { mnqAPI := mnq.NewNatsAPI(scwClient) logger.Warningf("sweeper: destroying the mnq nats accounts in (%s)", region) + defaultProjectID, exists := scwClient.GetDefaultProjectID() + var projectID *string = nil + if projectScoped && (!exists || (defaultProjectID == "")) { + return fmt.Errorf("failed to get the default project id for a project scoped sweep") + } + if projectScoped && exists && defaultProjectID != "" { + projectID = &defaultProjectID + } listNatsAccounts, err := mnqAPI.ListNatsAccounts( &mnq.NatsAPIListNatsAccountsRequest{ - Region: region, + Region: region, + ProjectID: projectID, }, scw.WithAllPages()) if err != nil { return fmt.Errorf("error listing nats account in (%s) in sweeper: %s", region, err) @@ -159,14 +222,14 @@ func SweepNatsAccount(scwClient *scw.Client, region scw.Region) error { return nil } -func SweepAllSNS(scwClient *scw.Client) error { +func SweepAllSNS(scwClient *scw.Client, projectScoped bool) error { for _, region := range (&mnq.SnsAPI{}).Regions() { - err := SweepSNSCredentials(scwClient, region) + err := SweepSNSCredentials(scwClient, region, projectScoped) if err != nil { return err } - err = SweepSNS(scwClient, region) + err = SweepSNS(scwClient, region, projectScoped) if err != nil { return err } @@ -175,13 +238,13 @@ func SweepAllSNS(scwClient *scw.Client) error { return nil } -func SweepAllSQS(scwClient *scw.Client) error { +func SweepAllSQS(scwClient *scw.Client, projectScoped bool) error { for _, region := range (&mnq.SqsAPI{}).Regions() { - err := SweepSQSCredentials(scwClient, region) + err := SweepSQSCredentials(scwClient, region, projectScoped) if err != nil { return err } - err = SweepSQS(scwClient, region) + err = SweepSQS(scwClient, region, projectScoped) if err != nil { return err } @@ -190,9 +253,9 @@ func SweepAllSQS(scwClient *scw.Client) error { return nil } -func SweepAllNats(scwClient *scw.Client) error { +func SweepAllNats(scwClient *scw.Client, projectScoped bool) error { for _, region := range (&mnq.NatsAPI{}).Regions() { - err := SweepNatsAccount(scwClient, region) + err := SweepNatsAccount(scwClient, region, projectScoped) if err != nil { return err } @@ -200,18 +263,18 @@ func SweepAllNats(scwClient *scw.Client) error { return nil } -func SweepAllLocalities(scwClient *scw.Client) error { - err := SweepAllSNS(scwClient) +func SweepAllLocalities(scwClient *scw.Client, projectScoped bool) error { + err := SweepAllSNS(scwClient, projectScoped) if err != nil { return err } - err = SweepAllSQS(scwClient) + err = SweepAllSQS(scwClient, projectScoped) if err != nil { return err } - err = SweepAllNats(scwClient) + err = SweepAllNats(scwClient, projectScoped) if err != nil { return err } diff --git a/api/mongodb/v1/sweepers/sweepers.go b/api/mongodb/v1/sweepers/sweepers.go index 60935306c..f7334386f 100644 --- a/api/mongodb/v1/sweepers/sweepers.go +++ b/api/mongodb/v1/sweepers/sweepers.go @@ -8,11 +8,20 @@ import ( "github.com/scaleway/scaleway-sdk-go/scw" ) -func SweepInstances(scwClient *scw.Client, region scw.Region) error { +func SweepInstances(scwClient *scw.Client, region scw.Region, projectScoped bool) error { mongodbAPI := mongodb.NewAPI(scwClient) logger.Warningf("sweeper: destroying the mongodb instance in (%s)", region) + defaultProjectID, exists := scwClient.GetDefaultProjectID() + var projectID *string = nil + if projectScoped && (!exists || (defaultProjectID == "")) { + return fmt.Errorf("failed to get the default project id for a project scoped sweep") + } + if projectScoped { + projectID = &defaultProjectID + } listInstance, err := mongodbAPI.ListInstances(&mongodb.ListInstancesRequest{ - Region: region, + Region: region, + ProjectID: projectID, }) if err != nil { return fmt.Errorf("error listing mongodb instance in (%s) in sweeper: %w", region, err) @@ -31,9 +40,9 @@ func SweepInstances(scwClient *scw.Client, region scw.Region) error { return nil } -func SweepAllLocalities(scwClient *scw.Client) error { +func SweepAllLocalities(scwClient *scw.Client, projectScoped bool) error { for _, region := range (&mongodb.API{}).Regions() { - err := SweepInstances(scwClient, region) + err := SweepInstances(scwClient, region, projectScoped) if err != nil { return err } diff --git a/api/mongodb/v1alpha1/sweepers/sweepers.go b/api/mongodb/v1alpha1/sweepers/sweepers.go index 60935306c..f7334386f 100644 --- a/api/mongodb/v1alpha1/sweepers/sweepers.go +++ b/api/mongodb/v1alpha1/sweepers/sweepers.go @@ -8,11 +8,20 @@ import ( "github.com/scaleway/scaleway-sdk-go/scw" ) -func SweepInstances(scwClient *scw.Client, region scw.Region) error { +func SweepInstances(scwClient *scw.Client, region scw.Region, projectScoped bool) error { mongodbAPI := mongodb.NewAPI(scwClient) logger.Warningf("sweeper: destroying the mongodb instance in (%s)", region) + defaultProjectID, exists := scwClient.GetDefaultProjectID() + var projectID *string = nil + if projectScoped && (!exists || (defaultProjectID == "")) { + return fmt.Errorf("failed to get the default project id for a project scoped sweep") + } + if projectScoped { + projectID = &defaultProjectID + } listInstance, err := mongodbAPI.ListInstances(&mongodb.ListInstancesRequest{ - Region: region, + Region: region, + ProjectID: projectID, }) if err != nil { return fmt.Errorf("error listing mongodb instance in (%s) in sweeper: %w", region, err) @@ -31,9 +40,9 @@ func SweepInstances(scwClient *scw.Client, region scw.Region) error { return nil } -func SweepAllLocalities(scwClient *scw.Client) error { +func SweepAllLocalities(scwClient *scw.Client, projectScoped bool) error { for _, region := range (&mongodb.API{}).Regions() { - err := SweepInstances(scwClient, region) + err := SweepInstances(scwClient, region, projectScoped) if err != nil { return err } diff --git a/api/rdb/v1/sweepers/sweepers.go b/api/rdb/v1/sweepers/sweepers.go index be54a9852..265c656d2 100644 --- a/api/rdb/v1/sweepers/sweepers.go +++ b/api/rdb/v1/sweepers/sweepers.go @@ -8,11 +8,20 @@ import ( "github.com/scaleway/scaleway-sdk-go/scw" ) -func SweepInstance(scwClient *scw.Client, region scw.Region) error { +func SweepInstance(scwClient *scw.Client, region scw.Region, projectScoped bool) error { rdbAPI := rdb.NewAPI(scwClient) logger.Warningf("sweeper: destroying the rdb instance in (%s)", region) + defaultProjectID, exists := scwClient.GetDefaultProjectID() + var projectID *string = nil + if projectScoped && (!exists || (defaultProjectID == "")) { + return fmt.Errorf("failed to get the default project id for a project scoped sweep") + } + if projectScoped { + projectID = &defaultProjectID + } listInstances, err := rdbAPI.ListInstances(&rdb.ListInstancesRequest{ - Region: region, + Region: region, + ProjectID: projectID, }, scw.WithAllPages()) if err != nil { return fmt.Errorf("error listing rdb instances in (%s) in sweeper: %s", region, err) @@ -31,9 +40,9 @@ func SweepInstance(scwClient *scw.Client, region scw.Region) error { return nil } -func SweepAllLocalities(scwClient *scw.Client) error { +func SweepAllLocalities(scwClient *scw.Client, projectScoped bool) error { for _, region := range (&rdb.API{}).Regions() { - err := SweepInstance(scwClient, region) + err := SweepInstance(scwClient, region, projectScoped) if err != nil { return err } diff --git a/api/redis/v1/sweepers/sweepers.go b/api/redis/v1/sweepers/sweepers.go index a910ec1b2..0f6e90344 100644 --- a/api/redis/v1/sweepers/sweepers.go +++ b/api/redis/v1/sweepers/sweepers.go @@ -8,11 +8,20 @@ import ( "github.com/scaleway/scaleway-sdk-go/scw" ) -func SweepCluster(scwClient *scw.Client, zone scw.Zone) error { +func SweepCluster(scwClient *scw.Client, zone scw.Zone, projectScoped bool) error { redisAPI := redis.NewAPI(scwClient) logger.Warningf("sweeper: destroying the redis cluster in (%s)", zone) + defaultProjectID, exists := scwClient.GetDefaultProjectID() + var projectID *string = nil + if projectScoped && (!exists || (defaultProjectID == "")) { + return fmt.Errorf("failed to get the default project id for a project scoped sweep") + } + if projectScoped { + projectID = &defaultProjectID + } listClusters, err := redisAPI.ListClusters(&redis.ListClustersRequest{ - Zone: zone, + Zone: zone, + ProjectID: projectID, }, scw.WithAllPages()) if err != nil { return fmt.Errorf("error listing redis clusters in (%s) in sweeper: %w", zone, err) @@ -31,9 +40,9 @@ func SweepCluster(scwClient *scw.Client, zone scw.Zone) error { return nil } -func SweepAllLocalities(scwClient *scw.Client) error { +func SweepAllLocalities(scwClient *scw.Client, projectScoped bool) error { for _, zone := range (&redis.API{}).Zones() { - err := SweepCluster(scwClient, zone) + err := SweepCluster(scwClient, zone, projectScoped) if err != nil { return err } diff --git a/api/registry/v1/sweepers/sweepers.go b/api/registry/v1/sweepers/sweepers.go index 9e0b33e1f..16fa6873d 100644 --- a/api/registry/v1/sweepers/sweepers.go +++ b/api/registry/v1/sweepers/sweepers.go @@ -8,11 +8,19 @@ import ( "github.com/scaleway/scaleway-sdk-go/scw" ) -func SweepNamespace(scwClient *scw.Client, region scw.Region) error { +func SweepNamespace(scwClient *scw.Client, region scw.Region, projectScoped bool) error { registryAPI := registry.NewAPI(scwClient) logger.Warningf("sweeper: destroying the registry namespaces in (%s)", region) + defaultProjectID, exists := scwClient.GetDefaultProjectID() + var projectID *string = nil + if projectScoped && (!exists || (defaultProjectID == "")) { + return fmt.Errorf("failed to get the default project id for a project scoped sweep") + } + if projectScoped { + projectID = &defaultProjectID + } listNamespaces, err := registryAPI.ListNamespaces( - ®istry.ListNamespacesRequest{Region: region}, scw.WithAllPages()) + ®istry.ListNamespacesRequest{Region: region, ProjectID: projectID}, scw.WithAllPages()) if err != nil { return fmt.Errorf("error listing namespaces in (%s) in sweeper: %s", region, err) } @@ -30,9 +38,9 @@ func SweepNamespace(scwClient *scw.Client, region scw.Region) error { return nil } -func SweepAllLocalities(scwClient *scw.Client) error { +func SweepAllLocalities(scwClient *scw.Client, projectScoped bool) error { for _, region := range (®istry.API{}).Regions() { - err := SweepNamespace(scwClient, region) + err := SweepNamespace(scwClient, region, projectScoped) if err != nil { return err } diff --git a/api/secret/v1beta1/sweepers/sweepers.go b/api/secret/v1beta1/sweepers/sweepers.go index b28863213..839b268df 100644 --- a/api/secret/v1beta1/sweepers/sweepers.go +++ b/api/secret/v1beta1/sweepers/sweepers.go @@ -8,12 +8,21 @@ import ( "github.com/scaleway/scaleway-sdk-go/scw" ) -func SweepSecret(scwClient *scw.Client, region scw.Region) error { +func SweepSecret(scwClient *scw.Client, region scw.Region, projectScoped bool) error { secretAPI := secretSDK.NewAPI(scwClient) logger.Warningf("sweeper: deleting the secrets in (%s)", region) - listSecrets, err := secretAPI.ListSecrets(&secretSDK.ListSecretsRequest{Region: region}, scw.WithAllPages()) + defaultProjectID, exists := scwClient.GetDefaultProjectID() + var projectID *string = nil + if projectScoped && (!exists || (defaultProjectID == "")) { + return fmt.Errorf("failed to get the default project id for a project scoped sweep") + } + if projectScoped { + projectID = &defaultProjectID + } + + listSecrets, err := secretAPI.ListSecrets(&secretSDK.ListSecretsRequest{Region: region, ProjectID: projectID}, scw.WithAllPages()) if err != nil { return fmt.Errorf("error listing secrets in (%s) in sweeper: %s", region, err) } @@ -31,9 +40,9 @@ func SweepSecret(scwClient *scw.Client, region scw.Region) error { return nil } -func SweepAllLocalities(scwClient *scw.Client) error { +func SweepAllLocalities(scwClient *scw.Client, projectScoped bool) error { for _, region := range (&secretSDK.API{}).Regions() { - err := SweepSecret(scwClient, region) + err := SweepSecret(scwClient, region, projectScoped) if err != nil { return err } diff --git a/api/serverless_sqldb/v1alpha1/sweepers/sweepers.go b/api/serverless_sqldb/v1alpha1/sweepers/sweepers.go index 500df957a..538217245 100644 --- a/api/serverless_sqldb/v1alpha1/sweepers/sweepers.go +++ b/api/serverless_sqldb/v1alpha1/sweepers/sweepers.go @@ -8,12 +8,21 @@ import ( "github.com/scaleway/scaleway-sdk-go/scw" ) -func SweepDatabase(scwClient *scw.Client, region scw.Region) error { +func SweepDatabase(scwClient *scw.Client, region scw.Region, projectScoped bool) error { sdbAPI := sdbSDK.NewAPI(scwClient) logger.Warningf("sweeper: destroying the serverless sql database in (%s)", region) + defaultProjectID, exists := scwClient.GetDefaultProjectID() + projectID := "" + if projectScoped && (!exists || (defaultProjectID == "")) { + return fmt.Errorf("failed to get the default project id for a project scoped sweep") + } + if projectScoped { + projectID = defaultProjectID + } listServerlessSQLDBDatabases, err := sdbAPI.ListDatabases( &sdbSDK.ListDatabasesRequest{ - Region: region, + Region: region, + ProjectID: projectID, }, scw.WithAllPages()) if err != nil { return fmt.Errorf("error listing database in (%s) in sweeper: %s", region, err) @@ -32,9 +41,9 @@ func SweepDatabase(scwClient *scw.Client, region scw.Region) error { return nil } -func SweepAllLocalities(scwClient *scw.Client) error { +func SweepAllLocalities(scwClient *scw.Client, projectScoped bool) error { for _, region := range (&sdbSDK.API{}).Regions() { - err := SweepDatabase(scwClient, region) + err := SweepDatabase(scwClient, region, projectScoped) if err != nil { return err } diff --git a/api/tem/v1alpha1/sweepers/sweepers.go b/api/tem/v1alpha1/sweepers/sweepers.go index a21e31c29..d982bdcf5 100644 --- a/api/tem/v1alpha1/sweepers/sweepers.go +++ b/api/tem/v1alpha1/sweepers/sweepers.go @@ -8,11 +8,19 @@ import ( "github.com/scaleway/scaleway-sdk-go/scw" ) -func SweepDomain(scwClient *scw.Client, region scw.Region, skippedDomain string) error { +func SweepDomain(scwClient *scw.Client, region scw.Region, skippedDomain string, projectScoped bool) error { temAPI := temSDK.NewAPI(scwClient) logger.Warningf("sweeper: revoking the tem domains in (%s)", region) + defaultProjectID, exists := scwClient.GetDefaultProjectID() + var projectID *string = nil + if projectScoped && (!exists || (defaultProjectID == "")) { + return fmt.Errorf("failed to get the default project id for a project scoped sweep") + } + if projectScoped { + projectID = &defaultProjectID + } - listDomains, err := temAPI.ListDomains(&temSDK.ListDomainsRequest{Region: region}, scw.WithAllPages()) + listDomains, err := temAPI.ListDomains(&temSDK.ListDomainsRequest{Region: region, ProjectID: projectID}, scw.WithAllPages()) if err != nil { return fmt.Errorf("error listing domains in (%s) in sweeper: %s", region, err) } diff --git a/api/vpc/v2/sweepers/sweepers.go b/api/vpc/v2/sweepers/sweepers.go index 04f0ccda4..1da037005 100644 --- a/api/vpc/v2/sweepers/sweepers.go +++ b/api/vpc/v2/sweepers/sweepers.go @@ -8,19 +8,34 @@ import ( "github.com/scaleway/scaleway-sdk-go/scw" ) -func SweepVPC(scwClient *scw.Client, region scw.Region) error { +func SweepVPC(scwClient *scw.Client, region scw.Region, projectScoped bool) error { vpcAPI := vpcSDK.NewAPI(scwClient) + logger.Warningf("sweeper: destroying the vpcs in (%s)", region) - listVPCs, err := vpcAPI.ListVPCs(&vpcSDK.ListVPCsRequest{Region: region}, scw.WithAllPages()) + defaultProjectID, exists := scwClient.GetDefaultProjectID() + var projectID *string = nil + if projectScoped && (!exists || (defaultProjectID == "")) { + return fmt.Errorf("failed to get the default project id for a project scoped sweep") + } + if projectScoped { + projectID = &defaultProjectID + } + + listVPCs, err := vpcAPI.ListVPCs(&vpcSDK.ListVPCsRequest{Region: region, ProjectID: projectID}, scw.WithAllPages()) if err != nil { return fmt.Errorf("error listing secrets in (%s) in sweeper: %s", region, err) } for _, v := range listVPCs.Vpcs { + // Only custom routes are still there after delete all pvn in a vpc + err := SweepRoute(scwClient, v.Region, scw.StringPtr(v.ID)) + if err != nil { + return err + } if v.IsDefault { continue } - err := vpcAPI.DeleteVPC(&vpcSDK.DeleteVPCRequest{ + err = vpcAPI.DeleteVPC(&vpcSDK.DeleteVPCRequest{ VpcID: v.ID, Region: region, }) @@ -32,13 +47,22 @@ func SweepVPC(scwClient *scw.Client, region scw.Region) error { return nil } -func SweepPrivateNetwork(scwClient *scw.Client, region scw.Region) error { +func SweepPrivateNetwork(scwClient *scw.Client, region scw.Region, projectScoped bool) error { vpcAPI := vpcSDK.NewAPI(scwClient) - logger.Debugf("sweeper: destroying the private network in (%s)", region) + logger.Warningf("sweeper: destroying private networks in (%s)", region) + defaultProjectID, exists := scwClient.GetDefaultProjectID() + var projectID *string = nil + if projectScoped && (!exists || (defaultProjectID == "")) { + return fmt.Errorf("failed to get the default project id for a project scoped sweep") + } + if projectScoped { + projectID = &defaultProjectID + } listPNResponse, err := vpcAPI.ListPrivateNetworks(&vpcSDK.ListPrivateNetworksRequest{ - Region: region, + Region: region, + ProjectID: projectID, }, scw.WithAllPages()) if err != nil { return fmt.Errorf("error listing private network in sweeper: %s", err) @@ -57,7 +81,7 @@ func SweepPrivateNetwork(scwClient *scw.Client, region scw.Region) error { return nil } -func SweepRoute(scwClient *scw.Client, region scw.Region) error { +func SweepRoute(scwClient *scw.Client, region scw.Region, vpcId *string) error { vpcAPI := vpcSDK.NewAPI(scwClient) vpcRouteAPI := vpcSDK.NewRoutesWithNexthopAPI(scwClient) @@ -65,6 +89,7 @@ func SweepRoute(scwClient *scw.Client, region scw.Region) error { listRoutesResponse, err := vpcRouteAPI.ListRoutesWithNexthop(&vpcSDK.RoutesWithNexthopAPIListRoutesWithNexthopRequest{ Region: region, + VpcID: vpcId, }, scw.WithAllPages()) if err != nil { return fmt.Errorf("error listing route in sweeper: %s", err) @@ -87,19 +112,14 @@ func SweepRoute(scwClient *scw.Client, region scw.Region) error { return nil } -func SweepAllLocalities(scwClient *scw.Client) error { +func SweepAllLocalities(scwClient *scw.Client, projectScoped bool) error { for _, region := range (&vpcSDK.API{}).Regions() { - err := SweepVPC(scwClient, region) - if err != nil { - return err - } - - err = SweepPrivateNetwork(scwClient, region) + err := SweepPrivateNetwork(scwClient, region, projectScoped) if err != nil { return err } - err = SweepRoute(scwClient, region) + err = SweepVPC(scwClient, region, projectScoped) if err != nil { return err } diff --git a/api/vpcgw/v1/sweepers/sweepers.go b/api/vpcgw/v1/sweepers/sweepers.go index 470943a33..6a88b84c7 100644 --- a/api/vpcgw/v1/sweepers/sweepers.go +++ b/api/vpcgw/v1/sweepers/sweepers.go @@ -7,18 +7,32 @@ import ( "github.com/scaleway/scaleway-sdk-go/scw" ) -func SweepVPCPublicGateway(scwClient *scw.Client, zone scw.Zone) error { +func SweepVPCPublicGateway(scwClient *scw.Client, zone scw.Zone, projectScoped bool) error { api := vpcgwSDK.NewAPI(scwClient) + defaultProjectID, exists := scwClient.GetDefaultProjectID() + var projectID *string = nil + if projectScoped && (!exists || (defaultProjectID == "")) { + return fmt.Errorf("failed to get the default project id for a project scoped sweep") + } + if projectScoped { + projectID = &defaultProjectID + } listGatewayResponse, err := api.ListGateways(&vpcgwSDK.ListGatewaysRequest{ //nolint:staticcheck - Zone: zone, + Zone: zone, + ProjectID: projectID, }, scw.WithAllPages()) if err != nil { return fmt.Errorf("error listing public gateway in sweeper: %w", err) } for _, gateway := range listGatewayResponse.Gateways { - err := api.DeleteGateway(&vpcgwSDK.DeleteGatewayRequest{ //nolint:staticcheck + // Gateway Networks should be deleted before + err := SweepGatewayNetworks(scwClient, zone, scw.StringPtr(gateway.ID)) + if err != nil { + return err + } + err = api.DeleteGateway(&vpcgwSDK.DeleteGatewayRequest{ //nolint:staticcheck Zone: zone, GatewayID: gateway.ID, }) @@ -29,11 +43,12 @@ func SweepVPCPublicGateway(scwClient *scw.Client, zone scw.Zone) error { return nil } -func SweepGatewayNetworks(scwClient *scw.Client, zone scw.Zone) error { +func SweepGatewayNetworks(scwClient *scw.Client, zone scw.Zone, gatewayId *string) error { api := vpcgwSDK.NewAPI(scwClient) listPNResponse, err := api.ListGatewayNetworks(&vpcgwSDK.ListGatewayNetworksRequest{ //nolint:staticcheck - Zone: zone, + Zone: zone, + GatewayID: gatewayId, }, scw.WithAllPages()) if err != nil { return fmt.Errorf("error listing gateway network in sweeper: %s", err) @@ -53,11 +68,20 @@ func SweepGatewayNetworks(scwClient *scw.Client, zone scw.Zone) error { return nil } -func SweepVPCPublicGatewayIP(scwClient *scw.Client, zone scw.Zone) error { +func SweepVPCPublicGatewayIP(scwClient *scw.Client, zone scw.Zone, projectScoped bool) error { api := vpcgwSDK.NewAPI(scwClient) + defaultProjectID, exists := scwClient.GetDefaultProjectID() + var projectID *string = nil + if projectScoped && (!exists || (defaultProjectID == "")) { + return fmt.Errorf("failed to get the default project id for a project scoped sweep") + } + if projectScoped { + projectID = &defaultProjectID + } listIPResponse, err := api.ListIPs(&vpcgwSDK.ListIPsRequest{ //nolint:staticcheck - Zone: zone, + Zone: zone, + ProjectID: projectID, }, scw.WithAllPages()) if err != nil { return fmt.Errorf("error listing public gateway ip in sweeper: %s", err) @@ -75,11 +99,20 @@ func SweepVPCPublicGatewayIP(scwClient *scw.Client, zone scw.Zone) error { return nil } -func SweepVPCPublicGatewayDHCP(scwClient *scw.Client, zone scw.Zone) error { +func SweepVPCPublicGatewayDHCP(scwClient *scw.Client, zone scw.Zone, projectScoped bool) error { api := vpcgwSDK.NewAPI(scwClient) + defaultProjectID, exists := scwClient.GetDefaultProjectID() + var projectID *string = nil + if projectScoped && (!exists || (defaultProjectID == "")) { + return fmt.Errorf("failed to get the default project id for a project scoped sweep") + } + if projectScoped { + projectID = &defaultProjectID + } listDHCPsResponse, err := api.ListDHCPs(&vpcgwSDK.ListDHCPsRequest{ //nolint:staticcheck - Zone: zone, + Zone: zone, + ProjectID: projectID, }, scw.WithAllPages()) if err != nil { return fmt.Errorf("error listing public gateway dhcps in sweeper: %w", err) @@ -98,21 +131,17 @@ func SweepVPCPublicGatewayDHCP(scwClient *scw.Client, zone scw.Zone) error { return nil } -func SweepAllLocalities(scwClient *scw.Client) error { +func SweepAllLocalities(scwClient *scw.Client, projectScoped bool) error { for _, zone := range (&vpcgwSDK.API{}).Zones() { - err := SweepVPCPublicGateway(scwClient, zone) - if err != nil { - return err - } - err = SweepGatewayNetworks(scwClient, zone) + err := SweepVPCPublicGateway(scwClient, zone, projectScoped) if err != nil { return err } - err = SweepVPCPublicGatewayIP(scwClient, zone) + err = SweepVPCPublicGatewayIP(scwClient, zone, projectScoped) if err != nil { return err } - err = SweepVPCPublicGatewayDHCP(scwClient, zone) + err = SweepVPCPublicGatewayDHCP(scwClient, zone, projectScoped) if err != nil { return err } diff --git a/api/webhosting/v1/sweepers/sweepers.go b/api/webhosting/v1/sweepers/sweepers.go index a3ec65b4d..438b28bf7 100644 --- a/api/webhosting/v1/sweepers/sweepers.go +++ b/api/webhosting/v1/sweepers/sweepers.go @@ -7,10 +7,18 @@ import ( "github.com/scaleway/scaleway-sdk-go/scw" ) -func SweepWebHosting(scwClient *scw.Client, region scw.Region) error { +func SweepWebHosting(scwClient *scw.Client, region scw.Region, projectScoped bool) error { webHostingAPI := webhostingSDK.NewHostingAPI(scwClient) + defaultProjectID, exists := scwClient.GetDefaultProjectID() + var projectID *string = nil + if projectScoped && (!exists || (defaultProjectID == "")) { + return fmt.Errorf("failed to get the default project id for a project scoped sweep") + } + if projectScoped { + projectID = &defaultProjectID + } - listHostings, err := webHostingAPI.ListHostings(&webhostingSDK.HostingAPIListHostingsRequest{Region: region}, scw.WithAllPages()) + listHostings, err := webHostingAPI.ListHostings(&webhostingSDK.HostingAPIListHostingsRequest{Region: region, ProjectID: projectID}, scw.WithAllPages()) if err != nil { return fmt.Errorf("error listing hostings in (%s) in sweeper: %s", region, err) } @@ -28,9 +36,9 @@ func SweepWebHosting(scwClient *scw.Client, region scw.Region) error { return nil } -func SweepAllLocalities(scwClient *scw.Client) error { +func SweepAllLocalities(scwClient *scw.Client, projectScoped bool) error { for _, region := range (&webhostingSDK.HostingAPI{}).Regions() { - err := SweepWebHosting(scwClient, region) + err := SweepWebHosting(scwClient, region, projectScoped) if err != nil { return err } diff --git a/cmd/sdk-sweeper/main.go b/cmd/sdk-sweeper/main.go index a241d18fb..a5b2f9f74 100644 --- a/cmd/sdk-sweeper/main.go +++ b/cmd/sdk-sweeper/main.go @@ -45,12 +45,12 @@ func mainNoExit() int { errs := []error(nil) - err = containerSweeper.SweepAllLocalities(client) + err = containerSweeper.SweepAllLocalities(client, false) if err != nil { errs = append(errs, fmt.Errorf("error sweeping container: %w", err)) } - err = instanceSweeper.SweepAllLocalities(client) + err = instanceSweeper.SweepAllLocalities(client, false) if err != nil { errs = append(errs, fmt.Errorf("error sweeping instance: %w", err)) }