Skip to content

Commit a0ed163

Browse files
feat(sweepers): allow sweepers to be scoped to the default project id only
1 parent 7ebbf97 commit a0ed163

File tree

29 files changed

+775
-268
lines changed

29 files changed

+775
-268
lines changed

api/account/v3/sweepers/sweepers.go

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,12 @@ import (
88
"github.com/scaleway/scaleway-sdk-go/scw"
99
)
1010

11-
func SweepProjects(scwClient *scw.Client) error {
11+
func SweepProjects(scwClient *scw.Client, projectScoped bool) error {
1212
accountAPI := account.NewProjectAPI(scwClient)
13+
defaultProjectID, exists := scwClient.GetDefaultProjectID()
14+
if projectScoped && (!exists || (defaultProjectID == "")) {
15+
return fmt.Errorf("failed to get the default project id for a project scoped sweep")
16+
}
1317

1418
req := &account.ProjectAPIListProjectsRequest{}
1519
listProjects, err := accountAPI.ListProjects(req, scw.WithAllPages())
@@ -18,7 +22,7 @@ func SweepProjects(scwClient *scw.Client) error {
1822
}
1923
for _, project := range listProjects.Projects {
2024
// Do not delete default project
21-
if project.ID == req.OrganizationID || !testhelpers.IsTestResource(project.Name) {
25+
if project.ID == req.OrganizationID || !testhelpers.IsTestResource(project.Name) || (projectScoped && (project.ID != defaultProjectID)) {
2226
continue
2327
}
2428
err = accountAPI.DeleteProject(&account.ProjectAPIDeleteProjectRequest{
@@ -31,8 +35,8 @@ func SweepProjects(scwClient *scw.Client) error {
3135
return nil
3236
}
3337

34-
func SweepAll(scwClient *scw.Client) error {
35-
if err := SweepProjects(scwClient); err != nil {
38+
func SweepAll(scwClient *scw.Client, projectScoped bool) error {
39+
if err := SweepProjects(scwClient, projectScoped); err != nil {
3640
return err
3741
}
3842
return nil

api/applesilicon/v1alpha1/sweepers/sweepers.go

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,17 @@ import (
77
"github.com/scaleway/scaleway-sdk-go/scw"
88
)
99

10-
func SweepServer(scwClient *scw.Client, zone scw.Zone) error {
10+
func SweepServer(scwClient *scw.Client, zone scw.Zone, projectScoped bool) error {
1111
asAPI := applesilicon.NewAPI(scwClient)
12-
13-
listServers, err := asAPI.ListServers(&applesilicon.ListServersRequest{Zone: zone}, scw.WithAllPages())
12+
defaultProjectID, exists := scwClient.GetDefaultProjectID()
13+
var projectID *string = nil
14+
if projectScoped && (!exists || (defaultProjectID == "")) {
15+
return fmt.Errorf("failed to get the default project id for a project scoped sweep")
16+
}
17+
if projectScoped {
18+
projectID = &defaultProjectID
19+
}
20+
listServers, err := asAPI.ListServers(&applesilicon.ListServersRequest{Zone: zone, ProjectID: projectID}, scw.WithAllPages())
1421
if err != nil {
1522
return fmt.Errorf("error listing apple silicon servers in (%s) in sweeper: %s", zone, err)
1623
}
@@ -28,9 +35,9 @@ func SweepServer(scwClient *scw.Client, zone scw.Zone) error {
2835
return nil
2936
}
3037

31-
func SweepAllLocalities(scwClient *scw.Client) error {
38+
func SweepAllLocalities(scwClient *scw.Client, projectScoped bool) error {
3239
for _, zone := range (&applesilicon.API{}).Zones() {
33-
err := SweepServer(scwClient, zone)
40+
err := SweepServer(scwClient, zone, projectScoped)
3441
if err != nil {
3542
return err
3643
}

api/baremetal/v1/sweepers/sweepers.go

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,18 @@ import (
77
"github.com/scaleway/scaleway-sdk-go/scw"
88
)
99

10-
func SweepServers(scwClient *scw.Client, zone scw.Zone) error {
10+
func SweepServers(scwClient *scw.Client, zone scw.Zone, projectScoped bool) error {
1111
baremetalAPI := baremetal.NewAPI(scwClient)
12+
defaultProjectID, exists := scwClient.GetDefaultProjectID()
13+
var projectID *string = nil
14+
if projectScoped && (!exists || (defaultProjectID == "")) {
15+
return fmt.Errorf("failed to get the default project id for a project scoped sweep")
16+
}
17+
if projectScoped {
18+
projectID = &defaultProjectID
19+
}
1220

13-
listServers, err := baremetalAPI.ListServers(&baremetal.ListServersRequest{Zone: zone}, scw.WithAllPages())
21+
listServers, err := baremetalAPI.ListServers(&baremetal.ListServersRequest{Zone: zone, ProjectID: projectID}, scw.WithAllPages())
1422
if err != nil {
1523
return err
1624
}
@@ -28,9 +36,9 @@ func SweepServers(scwClient *scw.Client, zone scw.Zone) error {
2836
return nil
2937
}
3038

31-
func SweepAllLocalities(scwClient *scw.Client) error {
39+
func SweepAllLocalities(scwClient *scw.Client, projectScoped bool) error {
3240
for _, zone := range (&baremetal.API{}).Zones() {
33-
err := SweepServers(scwClient, zone)
41+
err := SweepServers(scwClient, zone, projectScoped)
3442
if err != nil {
3543
return err
3644
}

api/block/v1alpha1/sweepers/sweepers.go

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,21 @@ import (
77
"github.com/scaleway/scaleway-sdk-go/scw"
88
)
99

10-
func SweepVolumes(scwClient *scw.Client, zone scw.Zone) error {
10+
func SweepVolumes(scwClient *scw.Client, zone scw.Zone, projectScoped bool) error {
1111
blockAPI := block.NewAPI(scwClient)
12+
defaultProjectID, exists := scwClient.GetDefaultProjectID()
13+
var projectID *string = nil
14+
if projectScoped && (!exists || (defaultProjectID == "")) {
15+
return fmt.Errorf("failed to get the default project id for a project scoped sweep")
16+
}
17+
if projectScoped {
18+
projectID = &defaultProjectID
19+
}
1220

1321
listVolumes, err := blockAPI.ListVolumes(
1422
&block.ListVolumesRequest{
15-
Zone: zone,
23+
Zone: zone,
24+
ProjectID: projectID,
1625
}, scw.WithAllPages())
1726
if err != nil {
1827
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 {
3140
return nil
3241
}
3342

34-
func SweepSnapshots(scwClient *scw.Client, zone scw.Zone) error {
43+
func SweepSnapshots(scwClient *scw.Client, zone scw.Zone, projectScoped bool) error {
3544
blockAPI := block.NewAPI(scwClient)
45+
defaultProjectID, exists := scwClient.GetDefaultProjectID()
46+
var projectID *string = nil
47+
if projectScoped && (!exists || (defaultProjectID == "")) {
48+
return fmt.Errorf("failed to get the default project id for a project scoped sweep")
49+
}
50+
if projectScoped {
51+
projectID = &defaultProjectID
52+
}
3653

3754
listSnapshots, err := blockAPI.ListSnapshots(
3855
&block.ListSnapshotsRequest{
39-
Zone: zone,
56+
Zone: zone,
57+
ProjectID: projectID,
4058
}, scw.WithAllPages())
4159
if err != nil {
4260
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 {
5573
return nil
5674
}
5775

58-
func SweepAllLocalities(scwClient *scw.Client) error {
76+
func SweepAllLocalities(scwClient *scw.Client, projectScoped bool) error {
5977
for _, zone := range (&block.API{}).Zones() {
60-
err := SweepVolumes(scwClient, zone)
78+
err := SweepVolumes(scwClient, zone, projectScoped)
6179
if err != nil {
6280
return err
6381
}
64-
err = SweepSnapshots(scwClient, zone)
82+
err = SweepSnapshots(scwClient, zone, projectScoped)
6583
if err != nil {
6684
return err
6785
}

api/cockpit/v1/sweepers/sweepers.go

Lines changed: 109 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -9,22 +9,17 @@ import (
99
"github.com/scaleway/scaleway-sdk-go/scw"
1010
)
1111

12-
func SweepToken(scwClient *scw.Client) error {
12+
func SweepToken(scwClient *scw.Client, projectScoped bool) error {
1313
accountAPI := accountSDK.NewProjectAPI(scwClient)
1414
cockpitAPI := cockpit.NewRegionalAPI(scwClient)
1515

16-
listProjects, err := accountAPI.ListProjects(&accountSDK.ProjectAPIListProjectsRequest{}, scw.WithAllPages())
17-
if err != nil {
18-
return fmt.Errorf("failed to list projects: %w", err)
16+
defaultProjectID, exists := scwClient.GetDefaultProjectID()
17+
if projectScoped && (!exists || (defaultProjectID == "")) {
18+
return fmt.Errorf("failed to get the default project id for a project scoped sweep")
1919
}
20-
21-
for _, project := range listProjects.Projects {
22-
if !strings.HasPrefix(project.Name, "tf_tests") {
23-
continue
24-
}
25-
20+
if projectScoped {
2621
listTokens, err := cockpitAPI.ListTokens(&cockpit.RegionalAPIListTokensRequest{
27-
ProjectID: project.ID,
22+
ProjectID: defaultProjectID,
2823
}, scw.WithAllPages())
2924
if err != nil {
3025
return fmt.Errorf("failed to list tokens: %w", err)
@@ -38,91 +33,164 @@ func SweepToken(scwClient *scw.Client) error {
3833
return fmt.Errorf("failed to delete token: %w", err)
3934
}
4035
}
36+
} else {
37+
listProjects, err := accountAPI.ListProjects(&accountSDK.ProjectAPIListProjectsRequest{}, scw.WithAllPages())
38+
if err != nil {
39+
return fmt.Errorf("failed to list projects: %w", err)
40+
}
41+
42+
for _, project := range listProjects.Projects {
43+
if !strings.HasPrefix(project.Name, "tf_tests") {
44+
continue
45+
}
46+
47+
listTokens, err := cockpitAPI.ListTokens(&cockpit.RegionalAPIListTokensRequest{
48+
ProjectID: project.ID,
49+
}, scw.WithAllPages())
50+
if err != nil {
51+
return fmt.Errorf("failed to list tokens: %w", err)
52+
}
53+
54+
for _, token := range listTokens.Tokens {
55+
err = cockpitAPI.DeleteToken(&cockpit.RegionalAPIDeleteTokenRequest{
56+
TokenID: token.ID,
57+
})
58+
if err != nil {
59+
return fmt.Errorf("failed to delete token: %w", err)
60+
}
61+
}
62+
}
4163
}
4264

4365
return nil
4466
}
4567

46-
func SweepGrafanaUser(scwClient *scw.Client) error {
68+
func SweepGrafanaUser(scwClient *scw.Client, projectScoped bool) error {
4769
accountAPI := accountSDK.NewProjectAPI(scwClient)
4870
cockpitAPI := cockpit.NewGlobalAPI(scwClient)
4971

50-
listProjects, err := accountAPI.ListProjects(&accountSDK.ProjectAPIListProjectsRequest{}, scw.WithAllPages())
51-
if err != nil {
52-
return fmt.Errorf("failed to list projects: %w", err)
72+
defaultProjectID, exists := scwClient.GetDefaultProjectID()
73+
if projectScoped && (!exists || (defaultProjectID == "")) {
74+
return fmt.Errorf("failed to get the default project id for a project scoped sweep")
5375
}
54-
55-
for _, project := range listProjects.Projects {
56-
if !strings.HasPrefix(project.Name, "tf_tests") {
57-
continue
58-
}
59-
76+
if projectScoped {
6077
listGrafanaUsers, err := cockpitAPI.ListGrafanaUsers(&cockpit.GlobalAPIListGrafanaUsersRequest{
61-
ProjectID: project.ID,
78+
ProjectID: defaultProjectID,
6279
}, scw.WithAllPages())
6380
if err != nil {
6481
return fmt.Errorf("failed to list grafana users: %w", err)
6582
}
6683

6784
for _, grafanaUser := range listGrafanaUsers.GrafanaUsers {
6885
err = cockpitAPI.DeleteGrafanaUser(&cockpit.GlobalAPIDeleteGrafanaUserRequest{
69-
ProjectID: project.ID,
86+
ProjectID: defaultProjectID,
7087
GrafanaUserID: grafanaUser.ID,
7188
})
7289
if err != nil {
7390
return fmt.Errorf("failed to delete grafana user: %w", err)
7491
}
7592
}
93+
} else {
94+
listProjects, err := accountAPI.ListProjects(&accountSDK.ProjectAPIListProjectsRequest{}, scw.WithAllPages())
95+
if err != nil {
96+
return fmt.Errorf("failed to list projects: %w", err)
97+
}
98+
99+
for _, project := range listProjects.Projects {
100+
if !strings.HasPrefix(project.Name, "tf_tests") {
101+
continue
102+
}
103+
104+
listGrafanaUsers, err := cockpitAPI.ListGrafanaUsers(&cockpit.GlobalAPIListGrafanaUsersRequest{
105+
ProjectID: project.ID,
106+
}, scw.WithAllPages())
107+
if err != nil {
108+
return fmt.Errorf("failed to list grafana users: %w", err)
109+
}
110+
111+
for _, grafanaUser := range listGrafanaUsers.GrafanaUsers {
112+
err = cockpitAPI.DeleteGrafanaUser(&cockpit.GlobalAPIDeleteGrafanaUserRequest{
113+
ProjectID: project.ID,
114+
GrafanaUserID: grafanaUser.ID,
115+
})
116+
if err != nil {
117+
return fmt.Errorf("failed to delete grafana user: %w", err)
118+
}
119+
}
120+
}
76121
}
77122

78123
return nil
79124
}
80125

81-
func SweepSource(scwClient *scw.Client, region scw.Region) error {
126+
func SweepSource(scwClient *scw.Client, region scw.Region, projectScoped bool) error {
82127
accountAPI := accountSDK.NewProjectAPI(scwClient)
83128
cockpitAPI := cockpit.NewRegionalAPI(scwClient)
84-
85-
listProjects, err := accountAPI.ListProjects(&accountSDK.ProjectAPIListProjectsRequest{}, scw.WithAllPages())
86-
if err != nil {
87-
return fmt.Errorf("failed to list projects: %w", err)
129+
defaultProjectID, exists := scwClient.GetDefaultProjectID()
130+
if projectScoped && (!exists || (defaultProjectID == "")) {
131+
return fmt.Errorf("failed to get the default project id for a project scoped sweep")
88132
}
89-
90-
for _, project := range listProjects.Projects {
91-
if !strings.HasPrefix(project.Name, "tf_tests") {
92-
continue
93-
}
94-
133+
if projectScoped {
95134
listDatasources, err := cockpitAPI.ListDataSources(&cockpit.RegionalAPIListDataSourcesRequest{
96-
ProjectID: project.ID,
135+
ProjectID: defaultProjectID,
97136
Region: region,
98137
}, scw.WithAllPages())
99138
if err != nil {
100139
return fmt.Errorf("failed to list sources: %w", err)
101140
}
102141

103-
for _, datsource := range listDatasources.DataSources {
142+
for _, datasource := range listDatasources.DataSources {
104143
err = cockpitAPI.DeleteDataSource(&cockpit.RegionalAPIDeleteDataSourceRequest{
105-
DataSourceID: datsource.ID,
144+
DataSourceID: datasource.ID,
106145
Region: region,
107146
})
108147
if err != nil {
109148
return fmt.Errorf("failed to delete cockpit source: %w", err)
110149
}
111150
}
151+
} else {
152+
listProjects, err := accountAPI.ListProjects(&accountSDK.ProjectAPIListProjectsRequest{}, scw.WithAllPages())
153+
if err != nil {
154+
return fmt.Errorf("failed to list projects: %w", err)
155+
}
156+
157+
for _, project := range listProjects.Projects {
158+
if !strings.HasPrefix(project.Name, "tf_tests") {
159+
continue
160+
}
161+
162+
listDatasources, err := cockpitAPI.ListDataSources(&cockpit.RegionalAPIListDataSourcesRequest{
163+
ProjectID: project.ID,
164+
Region: region,
165+
}, scw.WithAllPages())
166+
if err != nil {
167+
return fmt.Errorf("failed to list sources: %w", err)
168+
}
169+
170+
for _, datsource := range listDatasources.DataSources {
171+
err = cockpitAPI.DeleteDataSource(&cockpit.RegionalAPIDeleteDataSourceRequest{
172+
DataSourceID: datsource.ID,
173+
Region: region,
174+
})
175+
if err != nil {
176+
return fmt.Errorf("failed to delete cockpit source: %w", err)
177+
}
178+
}
179+
}
112180
}
113181

114182
return nil
115183
}
116184

117-
func SweepAllLocalities(scwClient *scw.Client) error {
118-
if err := SweepToken(scwClient); err != nil {
185+
func SweepAllLocalities(scwClient *scw.Client, projectScoped bool) error {
186+
if err := SweepToken(scwClient, projectScoped); err != nil {
119187
return err
120188
}
121-
if err := SweepGrafanaUser(scwClient); err != nil {
189+
if err := SweepGrafanaUser(scwClient, projectScoped); err != nil {
122190
return err
123191
}
124192
for _, region := range (&cockpit.RegionalAPI{}).Regions() {
125-
if err := SweepSource(scwClient, region); err != nil {
193+
if err := SweepSource(scwClient, region, projectScoped); err != nil {
126194
return err
127195
}
128196
}

0 commit comments

Comments
 (0)