Blame SOURCES/0003-fix-collect-error-messages-during-disconnect.patch

dc8925
From 0e3ce2489f92cc037936866a1d6d7901fb14d440 Mon Sep 17 00:00:00 2001
dc8925
From: Link Dupont <link@sub-pop.net>
dc8925
Date: Mon, 14 Feb 2022 15:15:54 -0500
dc8925
Subject: [PATCH] fix: collect error messages during disconnect
dc8925
dc8925
If an error occurs during disconnect, the error is collected and
dc8925
reported at the end of the operation instead of aborting the operation
dc8925
part-way through.
dc8925
dc8925
Fixes: ESSNTL-2281
dc8925
---
dc8925
 main.go | 42 +++++++++++++++++++++++++++++++++---------
dc8925
 1 file changed, 33 insertions(+), 9 deletions(-)
dc8925
dc8925
diff --git a/main.go b/main.go
dc8925
index 0e6cc07..db5a34d 100644
dc8925
--- a/main.go
dc8925
+++ b/main.go
dc8925
@@ -6,6 +6,7 @@ import (
dc8925
 	"fmt"
dc8925
 	"os"
dc8925
 	"strings"
dc8925
+	"text/tabwriter"
dc8925
 	"time"
dc8925
 
dc8925
 	"git.sr.ht/~spc/go-log"
dc8925
@@ -18,6 +19,7 @@ import (
dc8925
 
dc8925
 const successPrefix = "\033[32m●\033[0m"
dc8925
 const failPrefix = "\033[31m●\033[0m"
dc8925
+const errorPrefix = "\033[31m!\033[0m"
dc8925
 
dc8925
 func main() {
dc8925
 	app := cli.NewApp()
dc8925
@@ -169,6 +171,7 @@ func main() {
dc8925
 			UsageText:   fmt.Sprintf("%v disconnect", app.Name),
dc8925
 			Description: fmt.Sprintf("The disconnect command disconnects the system from Red Hat Subscription Management, Red Hat Insights and %v and deactivates the %v daemon. %v will no longer be able to interact with the system.", Provider, BrandName, Provider),
dc8925
 			Action: func(c *cli.Context) error {
dc8925
+				errorMessages := make(map[string]error)
dc8925
 				hostname, err := os.Hostname()
dc8925
 				if err != nil {
dc8925
 					return cli.Exit(err, 1)
dc8925
@@ -180,29 +183,50 @@ func main() {
dc8925
 				s.Suffix = fmt.Sprintf(" Deactivating the %v daemon", BrandName)
dc8925
 				s.Start()
dc8925
 				if err := deactivate(); err != nil {
dc8925
-					return cli.Exit(err, 1)
dc8925
+					errorMessages[BrandName] = fmt.Errorf("cannot deactivate daemon: %w", err)
dc8925
+					s.Stop()
dc8925
+					fmt.Printf(errorPrefix+" Cannot deactivate the %v daemon\n", BrandName)
dc8925
+				} else {
dc8925
+					s.Stop()
dc8925
+					fmt.Printf(failPrefix+" Deactivated the %v daemon\n", BrandName)
dc8925
 				}
dc8925
-				s.Stop()
dc8925
-				fmt.Printf(failPrefix+" Deactivated the %v daemon\n", BrandName)
dc8925
 
dc8925
 				s.Suffix = " Disconnecting from Red Hat Insights..."
dc8925
 				s.Start()
dc8925
 				if err := unregisterInsights(); err != nil {
dc8925
-					return cli.Exit(err, 1)
dc8925
+					errorMessages["insights"] = fmt.Errorf("cannot disconnect from Red Hat Insights: %w", err)
dc8925
+					s.Stop()
dc8925
+					fmt.Printf(errorPrefix + " Cannot disconnect from Red Hat Insights\n")
dc8925
+				} else {
dc8925
+					s.Stop()
dc8925
+					fmt.Print(failPrefix + " Disconnected from Red Hat Insights\n")
dc8925
 				}
dc8925
-				s.Stop()
dc8925
-				fmt.Print(failPrefix + " Disconnected from Red Hat Insights\n")
dc8925
 
dc8925
 				s.Suffix = " Disconnecting from Red Hat Subscription Management..."
dc8925
 				s.Start()
dc8925
 				if err := unregister(); err != nil {
dc8925
-					return cli.Exit(err, 1)
dc8925
+					errorMessages["rhsm"] = fmt.Errorf("cannot disconnect from Red Hat Subscription Management: %w", err)
dc8925
+					s.Stop()
dc8925
+					fmt.Printf(errorPrefix + " Cannot disconnect from Red Hat Subscription Management\n")
dc8925
+				} else {
dc8925
+					s.Stop()
dc8925
+					fmt.Printf(failPrefix + " Disconnected from Red Hat Subscription Management\n")
dc8925
 				}
dc8925
-				s.Stop()
dc8925
-				fmt.Printf(failPrefix + " Disconnected from Red Hat Subscription Management\n")
dc8925
 
dc8925
 				fmt.Printf("\nManage your Red Hat connector systems: https://red.ht/connector\n")
dc8925
 
dc8925
+				if len(errorMessages) > 0 {
dc8925
+					fmt.Println()
dc8925
+					fmt.Printf("The following errors were encountered during disconnect:\n\n")
dc8925
+					w := tabwriter.NewWriter(os.Stdout, 0, 0, 2, ' ', 0)
dc8925
+					fmt.Fprintln(w, "STEP\tERROR\t")
dc8925
+					for svc, err := range errorMessages {
dc8925
+						fmt.Fprintf(w, "%v\t%v\n", svc, err)
dc8925
+					}
dc8925
+					w.Flush()
dc8925
+					return cli.Exit("", 1)
dc8925
+				}
dc8925
+
dc8925
 				return nil
dc8925
 			},
dc8925
 		},