func()

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
}