Skip to content

Commit 37a0577

Browse files
authored
feat: add support for sweepers (scaleway#2374)
1 parent 105bb4e commit 37a0577

File tree

29 files changed

+2135
-0
lines changed

29 files changed

+2135
-0
lines changed
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package sweepers
2+
3+
import (
4+
"fmt"
5+
6+
"github.com/scaleway/scaleway-sdk-go/api/account/v3"
7+
"github.com/scaleway/scaleway-sdk-go/internal/testhelpers"
8+
"github.com/scaleway/scaleway-sdk-go/scw"
9+
)
10+
11+
func SweepProjects(scwClient *scw.Client) error {
12+
accountAPI := account.NewProjectAPI(scwClient)
13+
14+
req := &account.ProjectAPIListProjectsRequest{}
15+
listProjects, err := accountAPI.ListProjects(req, scw.WithAllPages())
16+
if err != nil {
17+
return fmt.Errorf("failed to list projects: %w", err)
18+
}
19+
for _, project := range listProjects.Projects {
20+
// Do not delete default project
21+
if project.ID == req.OrganizationID || !testhelpers.IsTestResource(project.Name) {
22+
continue
23+
}
24+
err = accountAPI.DeleteProject(&account.ProjectAPIDeleteProjectRequest{
25+
ProjectID: project.ID,
26+
})
27+
if err != nil {
28+
return fmt.Errorf("failed to delete project: %w", err)
29+
}
30+
}
31+
return nil
32+
}
33+
34+
func SweepAll(scwClient *scw.Client) error {
35+
if err := SweepProjects(scwClient); err != nil {
36+
return err
37+
}
38+
return nil
39+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package sweepers
2+
3+
import (
4+
"fmt"
5+
6+
applesilicon "github.com/scaleway/scaleway-sdk-go/api/applesilicon/v1alpha1"
7+
"github.com/scaleway/scaleway-sdk-go/scw"
8+
)
9+
10+
func SweepServer(scwClient *scw.Client, zone scw.Zone) error {
11+
asAPI := applesilicon.NewAPI(scwClient)
12+
13+
listServers, err := asAPI.ListServers(&applesilicon.ListServersRequest{Zone: zone}, scw.WithAllPages())
14+
if err != nil {
15+
return fmt.Errorf("error listing apple silicon servers in (%s) in sweeper: %s", zone, err)
16+
}
17+
18+
for _, server := range listServers.Servers {
19+
errDelete := asAPI.DeleteServer(&applesilicon.DeleteServerRequest{
20+
ServerID: server.ID,
21+
Zone: zone,
22+
})
23+
if errDelete != nil {
24+
return fmt.Errorf("error deleting apple silicon server in sweeper: %s", err)
25+
}
26+
}
27+
28+
return nil
29+
}
30+
31+
func SweepAllLocalities(scwClient *scw.Client) error {
32+
for _, zone := range (&applesilicon.API{}).Zones() {
33+
err := SweepServer(scwClient, zone)
34+
if err != nil {
35+
return err
36+
}
37+
}
38+
39+
return nil
40+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package sweepers
2+
3+
import (
4+
"fmt"
5+
6+
"github.com/scaleway/scaleway-sdk-go/api/baremetal/v1"
7+
"github.com/scaleway/scaleway-sdk-go/scw"
8+
)
9+
10+
func SweepServers(scwClient *scw.Client, zone scw.Zone) error {
11+
baremetalAPI := baremetal.NewAPI(scwClient)
12+
13+
listServers, err := baremetalAPI.ListServers(&baremetal.ListServersRequest{Zone: zone}, scw.WithAllPages())
14+
if err != nil {
15+
return err
16+
}
17+
18+
for _, server := range listServers.Servers {
19+
_, err := baremetalAPI.DeleteServer(&baremetal.DeleteServerRequest{
20+
Zone: zone,
21+
ServerID: server.ID,
22+
})
23+
if err != nil {
24+
return fmt.Errorf("error deleting server in sweeper: %s", err)
25+
}
26+
}
27+
28+
return nil
29+
}
30+
31+
func SweepAllLocalities(scwClient *scw.Client) error {
32+
for _, zone := range (&baremetal.API{}).Zones() {
33+
err := SweepServers(scwClient, zone)
34+
if err != nil {
35+
return err
36+
}
37+
}
38+
39+
return nil
40+
}
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
package sweepers
2+
3+
import (
4+
"fmt"
5+
6+
block "github.com/scaleway/scaleway-sdk-go/api/block/v1alpha1"
7+
"github.com/scaleway/scaleway-sdk-go/scw"
8+
)
9+
10+
func SweepVolumes(scwClient *scw.Client, zone scw.Zone) error {
11+
blockAPI := block.NewAPI(scwClient)
12+
13+
listVolumes, err := blockAPI.ListVolumes(
14+
&block.ListVolumesRequest{
15+
Zone: zone,
16+
}, scw.WithAllPages())
17+
if err != nil {
18+
return fmt.Errorf("error listing volume in (%s) in sweeper: %s", zone, err)
19+
}
20+
21+
for _, volume := range listVolumes.Volumes {
22+
err := blockAPI.DeleteVolume(&block.DeleteVolumeRequest{
23+
VolumeID: volume.ID,
24+
Zone: zone,
25+
})
26+
if err != nil {
27+
return fmt.Errorf("error deleting volume in sweeper: %s", err)
28+
}
29+
}
30+
31+
return nil
32+
}
33+
34+
func SweepSnapshots(scwClient *scw.Client, zone scw.Zone) error {
35+
blockAPI := block.NewAPI(scwClient)
36+
37+
listSnapshots, err := blockAPI.ListSnapshots(
38+
&block.ListSnapshotsRequest{
39+
Zone: zone,
40+
}, scw.WithAllPages())
41+
if err != nil {
42+
return fmt.Errorf("error listing snapshot in (%s) in sweeper: %s", zone, err)
43+
}
44+
45+
for _, snapshot := range listSnapshots.Snapshots {
46+
err := blockAPI.DeleteSnapshot(&block.DeleteSnapshotRequest{
47+
SnapshotID: snapshot.ID,
48+
Zone: zone,
49+
})
50+
if err != nil {
51+
return fmt.Errorf("error deleting snapshot in sweeper: %s", err)
52+
}
53+
}
54+
55+
return nil
56+
}
57+
58+
func SweepAllLocalities(scwClient *scw.Client) error {
59+
for _, zone := range (&block.API{}).Zones() {
60+
err := SweepVolumes(scwClient, zone)
61+
if err != nil {
62+
return err
63+
}
64+
err = SweepSnapshots(scwClient, zone)
65+
if err != nil {
66+
return err
67+
}
68+
}
69+
70+
return nil
71+
}
Lines changed: 131 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,131 @@
1+
package sweepers
2+
3+
import (
4+
"fmt"
5+
"strings"
6+
7+
accountSDK "github.com/scaleway/scaleway-sdk-go/api/account/v3"
8+
"github.com/scaleway/scaleway-sdk-go/api/cockpit/v1"
9+
"github.com/scaleway/scaleway-sdk-go/scw"
10+
)
11+
12+
func SweepToken(scwClient *scw.Client) error {
13+
accountAPI := accountSDK.NewProjectAPI(scwClient)
14+
cockpitAPI := cockpit.NewRegionalAPI(scwClient)
15+
16+
listProjects, err := accountAPI.ListProjects(&accountSDK.ProjectAPIListProjectsRequest{}, scw.WithAllPages())
17+
if err != nil {
18+
return fmt.Errorf("failed to list projects: %w", err)
19+
}
20+
21+
for _, project := range listProjects.Projects {
22+
if !strings.HasPrefix(project.Name, "tf_tests") {
23+
continue
24+
}
25+
26+
listTokens, err := cockpitAPI.ListTokens(&cockpit.RegionalAPIListTokensRequest{
27+
ProjectID: project.ID,
28+
}, scw.WithAllPages())
29+
if err != nil {
30+
return fmt.Errorf("failed to list tokens: %w", err)
31+
}
32+
33+
for _, token := range listTokens.Tokens {
34+
err = cockpitAPI.DeleteToken(&cockpit.RegionalAPIDeleteTokenRequest{
35+
TokenID: token.ID,
36+
})
37+
if err != nil {
38+
return fmt.Errorf("failed to delete token: %w", err)
39+
}
40+
}
41+
}
42+
43+
return nil
44+
}
45+
46+
func SweepGrafanaUser(scwClient *scw.Client) error {
47+
accountAPI := accountSDK.NewProjectAPI(scwClient)
48+
cockpitAPI := cockpit.NewGlobalAPI(scwClient)
49+
50+
listProjects, err := accountAPI.ListProjects(&accountSDK.ProjectAPIListProjectsRequest{}, scw.WithAllPages())
51+
if err != nil {
52+
return fmt.Errorf("failed to list projects: %w", err)
53+
}
54+
55+
for _, project := range listProjects.Projects {
56+
if !strings.HasPrefix(project.Name, "tf_tests") {
57+
continue
58+
}
59+
60+
listGrafanaUsers, err := cockpitAPI.ListGrafanaUsers(&cockpit.GlobalAPIListGrafanaUsersRequest{
61+
ProjectID: project.ID,
62+
}, scw.WithAllPages())
63+
if err != nil {
64+
return fmt.Errorf("failed to list grafana users: %w", err)
65+
}
66+
67+
for _, grafanaUser := range listGrafanaUsers.GrafanaUsers {
68+
err = cockpitAPI.DeleteGrafanaUser(&cockpit.GlobalAPIDeleteGrafanaUserRequest{
69+
ProjectID: project.ID,
70+
GrafanaUserID: grafanaUser.ID,
71+
})
72+
if err != nil {
73+
return fmt.Errorf("failed to delete grafana user: %w", err)
74+
}
75+
}
76+
}
77+
78+
return nil
79+
}
80+
81+
func SweepSource(scwClient *scw.Client, region scw.Region) error {
82+
accountAPI := accountSDK.NewProjectAPI(scwClient)
83+
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)
88+
}
89+
90+
for _, project := range listProjects.Projects {
91+
if !strings.HasPrefix(project.Name, "tf_tests") {
92+
continue
93+
}
94+
95+
listDatasources, err := cockpitAPI.ListDataSources(&cockpit.RegionalAPIListDataSourcesRequest{
96+
ProjectID: project.ID,
97+
Region: region,
98+
}, scw.WithAllPages())
99+
if err != nil {
100+
return fmt.Errorf("failed to list sources: %w", err)
101+
}
102+
103+
for _, datsource := range listDatasources.DataSources {
104+
err = cockpitAPI.DeleteDataSource(&cockpit.RegionalAPIDeleteDataSourceRequest{
105+
DataSourceID: datsource.ID,
106+
Region: region,
107+
})
108+
if err != nil {
109+
return fmt.Errorf("failed to delete cockpit source: %w", err)
110+
}
111+
}
112+
}
113+
114+
return nil
115+
}
116+
117+
func SweepAllLocalities(scwClient *scw.Client) error {
118+
if err := SweepToken(scwClient); err != nil {
119+
return err
120+
}
121+
if err := SweepGrafanaUser(scwClient); err != nil {
122+
return err
123+
}
124+
for _, region := range (&cockpit.RegionalAPI{}).Regions() {
125+
if err := SweepSource(scwClient, region); err != nil {
126+
return err
127+
}
128+
}
129+
130+
return nil
131+
}

0 commit comments

Comments
 (0)