container_images/cleanerupper/main.go (193 lines of code) (raw):

// Copyright 2022 Google Inc. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package main import ( "context" "flag" "fmt" "log" "strings" "time" osconfigV1alpha "cloud.google.com/go/osconfig/apiv1alpha" osconfig "cloud.google.com/go/osconfig/apiv1beta" "github.com/GoogleCloudPlatform/cloud-image-tests/cleanerupper" daisyCompute "github.com/GoogleCloudPlatform/compute-daisy/compute" "google.golang.org/api/option" ) var ( projects = flag.String("projects", "", "comma delineated list of projects to clean") dryRun = flag.Bool("dry_run", true, "only print out actions, don't delete any resources") oauthPath = flag.String("oauth", "", "oauth file to use to authenticate") duration = flag.Duration("duration", 24*time.Hour, "cleanup all resources with a lifetime greater than this") instances = flag.Bool("instances", false, "clean instances") disks = flag.Bool("disks", false, "clean disks") images = flag.Bool("images", false, "clean images") machineImages = flag.Bool("machine_images", false, "clean machine images") loadBalancers = flag.Bool("load_balancers", false, "clean load balancer resources") networks = flag.Bool("networks", false, "clean networks") snapshots = flag.Bool("snapshots", false, "clean snapshots") guestPolicies = flag.Bool("guest_policies", false, "clean guest policies") osPolicyAssignments = flag.Bool("ospolicy_assignments", false, "clean ospolicy assignments") now = time.Now() ) func shouldDelete(name string, labels map[string]string, t string, s int64) bool { var c time.Time var err error switch { case t != "": c, err = time.Parse(time.RFC3339, t) if err != nil { fmt.Printf("Error parsing create time %q: %v\n", t, err) return false } case s != 0: c = time.Unix(s, 0) default: return false } return c.Add(*duration).Before(now) } func main() { flag.Parse() ctx := context.Background() cutoff := now.Add(time.Duration(-1) * *duration) policy := cleanerupper.AgePolicy(cutoff) ps := strings.Split(*projects, ",") if len(ps) == 0 { log.Fatal("Need to provide at least 1 project") } if *dryRun { fmt.Println("-dry_run flag used, no actual action will be taken") } var clients, stagingClients cleanerupper.Clients var err error clients.Daisy, err = daisyCompute.NewClient(ctx, option.WithCredentialsFile(*oauthPath)) if err != nil { log.Fatal(err) } stagingClients.Daisy = clients.Daisy clients.OSConfig, err = osconfig.NewClient(ctx, option.WithCredentialsFile(*oauthPath)) if err != nil { log.Fatal(err) } stagingClients.OSConfig, err = osconfig.NewClient(ctx, option.WithCredentialsFile(*oauthPath), option.WithEndpoint("staging-osconfig.sandbox.googleapis.com:443")) if err != nil { log.Fatal(err) } clients.OSConfigZonal, err = osconfigV1alpha.NewOsConfigZonalClient(ctx, option.WithCredentialsFile(*oauthPath)) if err != nil { log.Fatal(err) } stagingClients.OSConfigZonal, err = osconfigV1alpha.NewOsConfigZonalClient(ctx, option.WithCredentialsFile(*oauthPath), option.WithEndpoint("staging-osconfig.sandbox.googleapis.com:443")) if err != nil { log.Fatal(err) } for _, p := range ps { fmt.Println("Cleaning project", p) // We do all of this sequentially so as not to DOS the API. if *instances { fmt.Println("Cleaning instances") insts, errs := cleanerupper.CleanInstances(clients, p, policy, *dryRun) for _, i := range insts { fmt.Printf(" - %s\n", i) } for _, e := range errs { fmt.Println(e) } } if *disks { fmt.Println("Cleaning disks") cleaned, errs := cleanerupper.CleanDisks(clients, p, policy, *dryRun) for _, c := range cleaned { fmt.Printf(" - %s\n", c) } for _, e := range errs { fmt.Println(e) } } if *loadBalancers { fmt.Println("Cleaning Load Balancer Resources") cleaned, errs := cleanerupper.CleanLoadBalancerResources(clients, p, policy, *dryRun) for _, c := range cleaned { fmt.Printf(" - %s\n", c) } for _, e := range errs { fmt.Println(e) } } if *networks { fmt.Println("Cleaning networks") cleaned, errs := cleanerupper.CleanNetworks(clients, p, policy, *dryRun) for _, c := range cleaned { fmt.Printf(" - %s\n", c) } for _, e := range errs { fmt.Println(e) } } if *images { fmt.Println("Cleaning images") cleaned, errs := cleanerupper.CleanImages(clients, p, policy, *dryRun) for _, c := range cleaned { fmt.Printf(" - %s\n", c) } for _, e := range errs { fmt.Println(e) } } if *machineImages { fmt.Println("Cleaning machine images") cleaned, errs := cleanerupper.CleanMachineImages(clients, p, policy, *dryRun) for _, c := range cleaned { fmt.Printf(" - %s\n", c) } for _, e := range errs { fmt.Println(e) } } if *snapshots { fmt.Println("Cleaning snapshots") cleaned, errs := cleanerupper.CleanSnapshots(clients, p, policy, *dryRun) for _, c := range cleaned { fmt.Printf(" - %s\n", c) } for _, e := range errs { fmt.Println(e) } } if *guestPolicies { fmt.Println("Cleaning guest policies") cleaned, errs := cleanerupper.CleanGuestPolicies(ctx, clients, p, policy, *dryRun) for _, c := range cleaned { fmt.Printf(" - %s\n", c) } for _, e := range errs { fmt.Println(e) } fmt.Println("Cleaning staging guest policies") cleaned, errs = cleanerupper.CleanGuestPolicies(ctx, stagingClients, p, policy, *dryRun) for _, c := range cleaned { fmt.Printf(" - %s\n", c) } for _, e := range errs { fmt.Println(e) } } if *osPolicyAssignments { fmt.Println("Cleaning os policy assignments") cleaned, errs := cleanerupper.CleanOSPolicyAssignments(ctx, clients, p, policy, *dryRun) for _, c := range cleaned { fmt.Printf(" - %s\n", c) } for _, e := range errs { fmt.Println(e) } fmt.Println("Cleaning staing os policy assignments") cleaned, errs = cleanerupper.CleanOSPolicyAssignments(ctx, stagingClients, p, policy, *dryRun) for _, c := range cleaned { fmt.Printf(" - %s\n", c) } for _, e := range errs { fmt.Println(e) } } fmt.Println() } }