in commands/cleanup.go [59:151]
func (c CleanupCommand) Execute() int {
const (
allPassedReportFileName = "Onboard Terraform - cleanup_all_passed_report.md"
partialPassedReportFileName = "Onboard Terraform - cleanup_partial_passed_report.md"
)
logrus.Infof("cleaning up resources...")
wd, err := os.Getwd()
if err != nil {
logrus.Error(fmt.Sprintf("failed to get working directory: %+v", err))
return 1
}
if c.workingDir != "" {
wd, err = filepath.Abs(c.workingDir)
if err != nil {
logrus.Error(fmt.Sprintf("working directory is invalid: %+v", err))
return 1
}
}
terraform, err := tf.NewTerraform(wd, c.verbose)
if err != nil {
logrus.Fatalf("creating terraform executable: %+v", err)
}
state, err := terraform.Show()
if err != nil {
logrus.Fatalf("failed to get terraform state: %+v", err)
}
passReport := tf.NewPassReportFromState(state)
idAddressMap := tf.NewIdAddressFromState(state)
reportDir := fmt.Sprintf("armstrong_cleanup_reports_%s", time.Now().Format(time.DateTime))
reportDir = strings.ReplaceAll(reportDir, ":", "-")
reportDir = strings.ReplaceAll(reportDir, " ", "_")
reportDir = path.Join(wd, reportDir)
err = os.Mkdir(reportDir, 0755)
if err != nil {
logrus.Fatalf("failed to create report directory: %+v", err)
}
logrus.Infof("running terraform init...")
_ = terraform.Init()
logrus.Infof("running terraform destroy...")
destroyErr := terraform.Destroy()
errorReport := types.ErrorReport{}
if destroyErr != nil {
logrus.Errorf("failed to destroy resources: %+v", destroyErr)
logs, err := trace.NewRequestTraceParser(trace.TextParser).ParseFromFile(path.Join(wd, "log.txt"))
if err != nil {
logrus.Errorf("failed to parse log.txt: %+v", err)
}
errorReport = tf.NewCleanupErrorReport(destroyErr, logs)
for i := range errorReport.Errors {
if address, ok := idAddressMap[errorReport.Errors[i].Id]; ok {
errorReport.Errors[i].Label = address
}
}
storeCleanupErrorReport(errorReport, reportDir)
resources := make([]types.Resource, 0)
if state, err := terraform.Show(); err == nil && state != nil && state.Values != nil && state.Values.RootModule != nil && state.Values.RootModule.Resources != nil {
for _, passRes := range passReport.Resources {
isDeleted := true
for _, res := range state.Values.RootModule.Resources {
if passRes.Address == res.Address {
isDeleted = false
break
}
}
if isDeleted {
resources = append(resources, passRes)
}
}
}
passReport.Resources = resources
storeCleanupReport(passReport, reportDir, partialPassedReportFileName)
} else {
logrus.Infof("all resources are cleaned up")
storeCleanupReport(passReport, reportDir, allPassedReportFileName)
}
logrus.Infof("---------------- Summary ----------------")
logrus.Infof("%d resources passed the cleanup tests.", len(passReport.Resources))
if len(errorReport.Errors) != 0 {
logrus.Infof("%d errors when cleanup the testing resources.", len(errorReport.Errors))
}
return 0
}