Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 8 additions & 4 deletions api/account/v3/sweepers/sweepers.go
Original file line number Diff line number Diff line change
Expand Up @@ -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())
Expand All @@ -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{
Expand All @@ -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
Expand Down
17 changes: 12 additions & 5 deletions api/applesilicon/v1alpha1/sweepers/sweepers.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}
Expand All @@ -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
}
Expand Down
16 changes: 12 additions & 4 deletions api/baremetal/v1/sweepers/sweepers.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
Expand All @@ -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
}
Expand Down
32 changes: 25 additions & 7 deletions api/block/v1alpha1/sweepers/sweepers.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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)
Expand All @@ -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
}
Expand Down
159 changes: 117 additions & 42 deletions api/cockpit/v1/sweepers/sweepers.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -38,91 +34,170 @@ 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)
}

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
}
}
Expand Down
Loading