Skip to content

Commit e59a867

Browse files
feat(sweepers): allow sweepers to be scoped to the default project id only
1 parent 6d62825 commit e59a867

File tree

29 files changed

+803
-269
lines changed

29 files changed

+803
-269
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: 117 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -9,22 +9,18 @@ import (
99
"github.com/scaleway/scaleway-sdk-go/scw"
1010
)
1111

12-
func SweepToken(scwClient *scw.Client) error {
12+
func SweepToken(scwClient *scw.Client, region scw.Region, 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,
23+
Region: region,
2824
}, scw.WithAllPages())
2925
if err != nil {
3026
return fmt.Errorf("failed to list tokens: %w", err)
@@ -38,91 +34,170 @@ func SweepToken(scwClient *scw.Client) error {
3834
return fmt.Errorf("failed to delete token: %w", err)
3935
}
4036
}
37+
} else {
38+
listProjects, err := accountAPI.ListProjects(&accountSDK.ProjectAPIListProjectsRequest{}, scw.WithAllPages())
39+
if err != nil {
40+
return fmt.Errorf("failed to list projects: %w", err)
41+
}
42+
43+
for _, project := range listProjects.Projects {
44+
if !strings.HasPrefix(project.Name, "tf_tests") {
45+
continue
46+
}
47+
48+
listTokens, err := cockpitAPI.ListTokens(&cockpit.RegionalAPIListTokensRequest{
49+
ProjectID: project.ID,
50+
Region: region,
51+
}, scw.WithAllPages())
52+
if err != nil {
53+
return fmt.Errorf("failed to list tokens: %w", err)
54+
}
55+
56+
for _, token := range listTokens.Tokens {
57+
err = cockpitAPI.DeleteToken(&cockpit.RegionalAPIDeleteTokenRequest{
58+
TokenID: token.ID,
59+
})
60+
if err != nil {
61+
return fmt.Errorf("failed to delete token: %w", err)
62+
}
63+
}
64+
}
4165
}
4266

4367
return nil
4468
}
4569

46-
func SweepGrafanaUser(scwClient *scw.Client) error {
70+
func SweepGrafanaUser(scwClient *scw.Client, projectScoped bool) error {
4771
accountAPI := accountSDK.NewProjectAPI(scwClient)
4872
cockpitAPI := cockpit.NewGlobalAPI(scwClient)
4973

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

6786
for _, grafanaUser := range listGrafanaUsers.GrafanaUsers {
6887
err = cockpitAPI.DeleteGrafanaUser(&cockpit.GlobalAPIDeleteGrafanaUserRequest{
69-
ProjectID: project.ID,
88+
ProjectID: defaultProjectID,
7089
GrafanaUserID: grafanaUser.ID,
7190
})
7291
if err != nil {
7392
return fmt.Errorf("failed to delete grafana user: %w", err)
7493
}
7594
}
95+
} else {
96+
listProjects, err := accountAPI.ListProjects(&accountSDK.ProjectAPIListProjectsRequest{}, scw.WithAllPages())
97+
if err != nil {
98+
return fmt.Errorf("failed to list projects: %w", err)
99+
}
100+
101+
for _, project := range listProjects.Projects {
102+
if !strings.HasPrefix(project.Name, "tf_tests") {
103+
continue
104+
}
105+
106+
listGrafanaUsers, err := cockpitAPI.ListGrafanaUsers(&cockpit.GlobalAPIListGrafanaUsersRequest{
107+
ProjectID: project.ID,
108+
}, scw.WithAllPages())
109+
if err != nil {
110+
return fmt.Errorf("failed to list grafana users: %w", err)
111+
}
112+
113+
for _, grafanaUser := range listGrafanaUsers.GrafanaUsers {
114+
err = cockpitAPI.DeleteGrafanaUser(&cockpit.GlobalAPIDeleteGrafanaUserRequest{
115+
ProjectID: project.ID,
116+
GrafanaUserID: grafanaUser.ID,
117+
})
118+
if err != nil {
119+
return fmt.Errorf("failed to delete grafana user: %w", err)
120+
}
121+
}
122+
}
76123
}
77124

78125
return nil
79126
}
80127

81-
func SweepSource(scwClient *scw.Client, region scw.Region) error {
128+
func SweepSource(scwClient *scw.Client, region scw.Region, projectScoped bool) error {
82129
accountAPI := accountSDK.NewProjectAPI(scwClient)
83130
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)
131+
defaultProjectID, exists := scwClient.GetDefaultProjectID()
132+
if projectScoped && (!exists || (defaultProjectID == "")) {
133+
return fmt.Errorf("failed to get the default project id for a project scoped sweep")
88134
}
89-
90-
for _, project := range listProjects.Projects {
91-
if !strings.HasPrefix(project.Name, "tf_tests") {
92-
continue
93-
}
94-
135+
if projectScoped {
95136
listDatasources, err := cockpitAPI.ListDataSources(&cockpit.RegionalAPIListDataSourcesRequest{
96-
ProjectID: project.ID,
137+
ProjectID: defaultProjectID,
97138
Region: region,
98139
}, scw.WithAllPages())
99140
if err != nil {
100141
return fmt.Errorf("failed to list sources: %w", err)
101142
}
102143

103-
for _, datsource := range listDatasources.DataSources {
144+
for _, datasource := range listDatasources.DataSources {
145+
if datasource.Origin == cockpit.DataSourceOriginScaleway {
146+
continue
147+
}
104148
err = cockpitAPI.DeleteDataSource(&cockpit.RegionalAPIDeleteDataSourceRequest{
105-
DataSourceID: datsource.ID,
149+
DataSourceID: datasource.ID,
106150
Region: region,
107151
})
108152
if err != nil {
109153
return fmt.Errorf("failed to delete cockpit source: %w", err)
110154
}
111155
}
156+
} else {
157+
listProjects, err := accountAPI.ListProjects(&accountSDK.ProjectAPIListProjectsRequest{}, scw.WithAllPages())
158+
if err != nil {
159+
return fmt.Errorf("failed to list projects: %w", err)
160+
}
161+
162+
for _, project := range listProjects.Projects {
163+
if !strings.HasPrefix(project.Name, "tf_tests") {
164+
continue
165+
}
166+
167+
listDatasources, err := cockpitAPI.ListDataSources(&cockpit.RegionalAPIListDataSourcesRequest{
168+
ProjectID: project.ID,
169+
Region: region,
170+
}, scw.WithAllPages())
171+
if err != nil {
172+
return fmt.Errorf("failed to list sources: %w", err)
173+
}
174+
175+
for _, datsource := range listDatasources.DataSources {
176+
err = cockpitAPI.DeleteDataSource(&cockpit.RegionalAPIDeleteDataSourceRequest{
177+
DataSourceID: datsource.ID,
178+
Region: region,
179+
})
180+
if err != nil {
181+
return fmt.Errorf("failed to delete cockpit source: %w", err)
182+
}
183+
}
184+
}
112185
}
113186

114187
return nil
115188
}
116189

117-
func SweepAllLocalities(scwClient *scw.Client) error {
118-
if err := SweepToken(scwClient); err != nil {
119-
return err
190+
func SweepAllLocalities(scwClient *scw.Client, projectScoped bool) error {
191+
for _, region := range (&cockpit.RegionalAPI{}).Regions() {
192+
if err := SweepToken(scwClient, region, projectScoped); err != nil {
193+
return err
194+
}
120195
}
121-
if err := SweepGrafanaUser(scwClient); err != nil {
196+
if err := SweepGrafanaUser(scwClient, projectScoped); err != nil {
122197
return err
123198
}
124199
for _, region := range (&cockpit.RegionalAPI{}).Regions() {
125-
if err := SweepSource(scwClient, region); err != nil {
200+
if err := SweepSource(scwClient, region, projectScoped); err != nil {
126201
return err
127202
}
128203
}

0 commit comments

Comments
 (0)