11package main
22
33import (
4+ "context"
45 "encoding/json"
56 "errors"
67 "fmt"
8+ "log/slog"
79 "os"
810 "strconv"
911 "time"
@@ -18,6 +20,7 @@ const (
1820 envSecretKey = "SCW_SECRET_KEY"
1921 envProjectID = "SCW_DEFAULT_PROJECT_ID"
2022 envZone = "SCW_ZONE"
23+ envLogLevel = "LOG_LEVEL"
2124
2225 // envDeleteAfter name of env variable to deleter older images.
2326 envDeleteAfter = "SCW_DELETE_AFTER_DAYS"
@@ -26,8 +29,28 @@ const (
2629 defaultDaysDeleteAfter = int (90 )
2730)
2831
32+ var logger * slog.Logger
33+
2934func main () {
30- fmt .Println ("cleaning instances snapshots..." )
35+ // Initialize structured logger
36+ logLevel := slog .LevelInfo
37+ if lvl := os .Getenv (envLogLevel ); lvl != "" {
38+ switch lvl {
39+ case "DEBUG" :
40+ logLevel = slog .LevelDebug
41+ case "WARN" :
42+ logLevel = slog .LevelWarn
43+ case "ERROR" :
44+ logLevel = slog .LevelError
45+ }
46+ }
47+
48+ h := slog .NewJSONHandler (os .Stdout , & slog.HandlerOptions {Level : logLevel })
49+ logger = slog .New (h )
50+ slog .SetDefault (logger )
51+
52+ ctx := context .Background ()
53+ logger .InfoContext (ctx , "starting instances snapshots cleaner" )
3154
3255 // Create a Scaleway client with credentials from environment variables.
3356 client , err := scw .NewClient (
@@ -42,6 +65,7 @@ func main() {
4265 scw .WithDefaultRegion (scw .RegionFrPar ),
4366 )
4467 if err != nil {
68+ logger .ErrorContext (ctx , "failed to create scaleway client" , "error" , err )
4569 panic (err )
4670 }
4771
@@ -55,35 +79,41 @@ func main() {
5579 if deleteAfterDaysVar != "" {
5680 deleteAfterDays , err = strconv .Atoi (deleteAfterDaysVar )
5781 if err != nil {
82+ logger .ErrorContext (ctx , "failed to parse delete after days" , "value" , deleteAfterDaysVar , "error" , err )
5883 panic (err )
5984 }
6085 }
6186
62- if err := cleanSnapshots (deleteAfterDays , instanceAPI ); err != nil {
87+ logger .InfoContext (ctx , "cleaning snapshots" , "delete_after_days" , deleteAfterDays )
88+
89+ if err := cleanSnapshotsWithLogging (ctx , deleteAfterDays , instanceAPI ); err != nil {
6390 var precondErr * scw.PreconditionFailedError
6491
6592 if errors .As (err , & precondErr ) {
66- fmt . Println ( " \n Extracted Error Details:" )
67- fmt . Println ( "Precondition: " , precondErr .Precondition )
68- fmt . Println ( "Help Message: " , precondErr .HelpMessage )
93+ logger . ErrorContext ( ctx , "scaleway precondition failed" ,
94+ "precondition " , precondErr .Precondition ,
95+ "help_message " , precondErr .HelpMessage )
6996
7097 // Decode RawBody (if available)
7198 if len (precondErr .RawBody ) > 0 {
7299 var parsedBody map [string ]interface {}
73100 if json .Unmarshal (precondErr .RawBody , & parsedBody ) == nil {
74- fmt . Println ( "RawBody (Decoded): " , parsedBody )
101+ logger . ErrorContext ( ctx , "scaleway error raw body" , "body " , parsedBody )
75102 } else {
76- fmt . Println ( "RawBody (Raw): " , string (precondErr .RawBody ))
103+ logger . ErrorContext ( ctx , "scaleway error raw body" , "body " , string (precondErr .RawBody ))
77104 }
78105 }
79106 }
107+ logger .ErrorContext (ctx , "failed to clean snapshots" , "error" , err )
80108 panic (err )
81109 }
110+
111+ logger .InfoContext (ctx , "successfully cleaned snapshots" )
82112}
83113
84- // cleanSnapshots when called will clean snapshots in the project (if specified)
114+ // cleanSnapshotsWithLogging when called will clean snapshots in the project (if specified)
85115// that are older than the number of days.
86- func cleanSnapshots ( days int , instanceAPI * instance.API ) error {
116+ func cleanSnapshotsWithLogging ( ctx context. Context , days int , instanceAPI * instance.API ) error {
87117 // Get the list of all snapshots
88118 snapshotsList , err := instanceAPI .ListSnapshots (& instance.ListSnapshotsRequest {
89119 Zone : scw .Zone (os .Getenv (envZone )),
@@ -102,7 +132,10 @@ func cleanSnapshots(days int, instanceAPI *instance.API) error {
102132 for _ , snapshot := range snapshotsList .Snapshots {
103133 // Check if snapshot is in ready state and if it's older than the number of days definied.
104134 if snapshot .State == instance .SnapshotStateAvailable && (currentTime .Sub (* snapshot .CreationDate ).Hours ()/ hoursPerDay ) > float64 (days ) {
105- fmt .Printf ("\n Deleting snapshot <%s>:%s created at: %s\n " , snapshot .ID , snapshot .Name , snapshot .CreationDate .Format (time .RFC3339 ))
135+ logger .InfoContext (ctx , "deleting snapshot" ,
136+ "id" , snapshot .ID ,
137+ "name" , snapshot .Name ,
138+ "created_at" , snapshot .CreationDate .Format (time .RFC3339 ))
106139
107140 // Delete snapshot found.
108141 err := instanceAPI .DeleteSnapshot (& instance.DeleteSnapshotRequest {
0 commit comments