package main import ( "context" "fmt" "io" "os" "strings" "cloud.google.com/go/storage" "google.golang.org/api/iterator" ) var buckets = []string{ // select project_id from banners "ret-edge-nw6y96roiq14yk81p58g2", "ret-edge-2rvkbyt0pspbaunh79jv2", "ret-edge-v4hsjv7qedilr89s9wx5q", "ret-edge-m8yzq5ckmrg0xbywbx5pn", "ret-edge-tf31hknvuc8chx7ii96rw", "ret-edge-0p3gmoszouh9lrghf6nj5", "ret-edge-f94mtrmimvlypgpcxp0nw", "ret-edge-782vn2w9xibt9ycx4643f", "ret-edge-mb17p8vt99u3bthmfbkug", "ret-edge-3u27t1ttkk4ngtkmk842b", "ret-edge-qlc2lkjpbdh01ndmowrj2", "ret-edge-b79we3ikmc7j9mihuwst2", "ret-edge-kijwfr92bmik7lyifh9kw", "ret-edge-q40buawbn75r8em5rs8yt", } type gcsFileModifier = func(ctx context.Context, obj *storage.ObjectHandle, file, filename string) func main() { //os.Setenv("GOOGLE_APPLICATION_CREDENTIALS", "") may not be needed // TODO use these gcsFileModifier function in order: 1) replaceExternalSecretAPIVersion 2) deleteOldExternalSecret var apply gcsFileModifier = deleteInvalidKustomization filter := "fluxcfg" ctx := context.Background() // Determine storage options cl, err := storage.NewClient(ctx) if err != nil { fmt.Println("failed to create gcs storage client", err) os.Exit(1) } for _, b := range buckets { fmt.Println("processing bucket:", b) bucket := cl.Bucket(b) it := bucket.Objects(ctx, nil) for { attrs, err := it.Next() if err == iterator.Done { break } if err != nil { fmt.Println("failed to list file in gcs bucket", b, err) panic(err) } if strings.Contains(attrs.Name, filter) { //nolint: nestif obj := bucket.Object(attrs.Name) rdr, err := obj.NewReader(ctx) if err != nil { fmt.Println("failed to create reader for file in chariot folder", attrs.Name, err) os.Exit(1) } data, err := io.ReadAll(rdr) if err != nil || rdr.Close() != nil { fmt.Println("failed to read file in chariot folder", attrs.Name, err) os.Exit(1) } apply(ctx, obj, attrs.Name, string(data)) } } } } // deleteOldExternalSecret delete old external secrets i.e. external-secrets.io/v1alpha1 func deleteOldExternalSecret(ctx context.Context, obj *storage.ObjectHandle, filename, fileData string) { //nolint if strings.Contains(fileData, "{\"kind\":\"ExternalSecret\"") && strings.Contains(fileData, "\"apiVersion\":\"external-secrets.io/v1alpha1\"") { printFile(filename, fileData) //if err := obj.Delete(ctx); err != nil { // fmt.Println("deleteOldExternalSecret: failed to delete", filename, err) // os.Exit(1) //} } } // deleteInvalidKustomization delete invalid Kustomization func deleteInvalidKustomization(ctx context.Context, obj *storage.ObjectHandle, filename, fileData string) { //nolint if strings.Contains(fileData, "{\"kind\":\"Kustomization\"") && strings.Contains(fileData, "\"apiVersion\":\"v1beta2\"") { printFile(filename, fileData) if err := obj.Delete(ctx); err != nil { fmt.Println("deleteInvalidKustomization: failed to delete", filename, err) os.Exit(1) } } } // removeClusterStatus delete Cluster status field func removeClusterStatus(ctx context.Context, obj *storage.ObjectHandle, filename, fileData string) { //nolint if strings.Contains(fileData, "{\"kind\":\"Cluster\"") { printFile(filename, fileData) newYaml := strings.ReplaceAll(fileData, ",\"status\":{\"ready\":false,\"message\":\"\"}", "") wc := obj.NewWriter(ctx) _, err := wc.Write([]byte(newYaml)) if err != nil { fmt.Println("removeClusterStatus: failed to write to", filename, err) os.Exit(1) } if err := wc.Close(); err != nil { fmt.Println("removeClusterStatus: failed to close", filename, err) os.Exit(1) } } } // printFile keep track of modified files just in case, customize this to your liking func printFile(filename, fileData string) { fmt.Println(filename, "------------------------------------------") fmt.Println(fileData) fmt.Println("------------------------------------------") }