@@ -3,6 +3,9 @@ package main
33import (
44 "fmt"
55 "os"
6+ "time"
7+
8+ "github.com/sirupsen/logrus"
69
710 "github.com/olekukonko/tablewriter"
811
@@ -21,6 +24,7 @@ var cleanupCmd = &cobra.Command{
2124 Short : "delete aws resources for an rhmi cluster" ,
2225 Args : cobra .MinimumNArgs (1 ),
2326 Run : func (cmd * cobra.Command , args []string ) {
27+ //pre-req checks
2428 clusterId := args [0 ]
2529 region , err := cmd .Flags ().GetString ("region" )
2630 if err != nil {
@@ -34,7 +38,19 @@ var cleanupCmd = &cobra.Command{
3438 if err != nil {
3539 exitError (fmt .Sprintf ("failed to get dry run from flag: %+v" , err ), exitCodeErrUnknown )
3640 }
37-
41+ watch , err := cmd .Flags ().GetBool ("watch" )
42+ if err != nil {
43+ exitError (fmt .Sprintf ("failed to get watch from flag: %+v" , err ), exitCodeErrUnknown )
44+ }
45+ types , err := cmd .Flags ().GetStringSlice ("types" )
46+ if err != nil {
47+ exitError (fmt .Sprintf ("failed to get types from flag: %+v" , err ), exitCodeErrUnknown )
48+ }
49+ //ensure the output format is supported
50+ if outputFormat != "table" {
51+ exitError (fmt .Sprintf ("output format %s not supported, use table" , outputFormat ), exitCodeErrKnown )
52+ }
53+ //setup aws session
3854 awsKeyID := os .Getenv ("AWS_ACCESS_KEY_ID" )
3955 if awsKeyID == "" {
4056 exitError ("AWS_ACCESS_KEY_ID env var must be defined" , exitCodeErrKnown )
@@ -47,19 +63,53 @@ var cleanupCmd = &cobra.Command{
4763 Region : aws .String (region ),
4864 Credentials : credentials .NewStaticCredentials (awsKeyID , awsSecretKey , "" ),
4965 }))
50- clusterService := awsclusterservice .NewDefaultClient (awsSession , logger )
51- report , err := clusterService .DeleteResourcesForCluster (clusterId , map [string ]string {}, dryRun )
52- if err != nil {
53- exitError (fmt .Sprintf ("failed to cleanup resources for cluster, clusterId=%s: %+v" , clusterId , err ), exitCodeErrUnknown )
66+ clusterService := buildAWSClientFromTypes (awsSession , types , logger )
67+ //this could probably leverage channels
68+ var currentReport * clusterservice.Report
69+ for {
70+ newReport , err := clusterService .DeleteResourcesForCluster (clusterId , map [string ]string {}, dryRun )
71+ if err != nil {
72+ exitError (fmt .Sprintf ("failed to cleanup resources for cluster, clusterId=%s: %+v" , clusterId , err ), exitCodeErrUnknown )
73+ }
74+ if currentReport == nil {
75+ currentReport = newReport
76+ }
77+ currentReport .MergeForward (newReport )
78+ printReportTable (currentReport )
79+ if ! watch {
80+ break
81+ }
82+ logger .Debug ("watch is enabled, waiting 10 seconds before re-invoking" )
83+ time .Sleep (time .Second * 10 )
5484 }
55- // we only support table here...
56- if outputFormat != "table" {
57- exitError (fmt .Sprintf ("output format %s not supported, use table" , outputFormat ), exitCodeErrKnown )
58- }
59- printReportTable (report )
6085 },
6186}
6287
88+ func buildAWSClientFromTypes (awsSession * session.Session , types []string , logger * logrus.Entry ) * awsclusterservice.Client {
89+ if types == nil || len (types ) == 0 {
90+ return awsclusterservice .NewDefaultClient (awsSession , logger )
91+ }
92+ client := & awsclusterservice.Client {
93+ Logger : logger ,
94+ ResourceManagers : make ([]awsclusterservice.ClusterResourceManager , 0 ),
95+ }
96+ for _ , t := range types {
97+ switch t {
98+ case "rds:instance" :
99+ client .ResourceManagers = append (client .ResourceManagers , awsclusterservice .NewDefaultRDSInstanceManager (awsSession , logger ))
100+ case "rds:snapshot" :
101+ client .ResourceManagers = append (client .ResourceManagers , awsclusterservice .NewDefaultRDSSnapshotManager (awsSession , logger ))
102+ case "s3" :
103+ client .ResourceManagers = append (client .ResourceManagers , awsclusterservice .NewDefaultS3Engine (awsSession , logger ))
104+ case "elasticache:replicationgroup" :
105+ client .ResourceManagers = append (client .ResourceManagers , awsclusterservice .NewDefaultElastiCacheEngine (awsSession , logger ))
106+ default :
107+ logger .Debugf ("could not find resource manager for specified type %s" , t )
108+ }
109+ }
110+ return client
111+ }
112+
63113func printReportTable (report * clusterservice.Report ) {
64114 table := tablewriter .NewWriter (os .Stdout )
65115 table .SetHeader ([]string {"ID" , "Name" , "Action" , "Status" })
@@ -74,4 +124,6 @@ func init() {
74124 cleanupCmd .Flags ().StringP ("output" , "o" , "table" , "set output format" )
75125 cleanupCmd .Flags ().StringP ("region" , "r" , "eu-west-1" , "region to delete resources in" )
76126 cleanupCmd .Flags ().BoolP ("dry-run" , "d" , true , "skip performing actions" )
127+ cleanupCmd .Flags ().BoolP ("watch" , "w" , false , "poll actions being performed indefinitely" )
128+ cleanupCmd .Flags ().StringSliceP ("types" , "t" , []string {}, "resource types to cleanup" )
77129}
0 commit comments