From ad548554dce66175ab63730cd35eb58e66c7f997 Mon Sep 17 00:00:00 2001 From: Daniel Hu Date: Wed, 29 Dec 2021 13:02:06 +0800 Subject: [PATCH] fix: #49 #93 - argocdapp installation failed & logs improved Signed-off-by: Daniel Hu --- cmd/devstream/install.go | 8 ++++---- internal/pkg/argocdapp/argocdapp.go | 8 ++++++-- internal/pkg/argocdapp/install.go | 2 +- internal/pkg/planmanager/plan.go | 12 +++++++----- internal/pkg/planmanager/result.go | 4 ++-- internal/pkg/statemanager/state.go | 6 +++--- 6 files changed, 23 insertions(+), 17 deletions(-) diff --git a/cmd/devstream/install.go b/cmd/devstream/install.go index aa99f6288..9e17effa5 100644 --- a/cmd/devstream/install.go +++ b/cmd/devstream/install.go @@ -42,16 +42,16 @@ func installCMDFunc(cmd *cobra.Command, args []string) { return } - errs := p.Execute() - if len(errs) == 0 { + errsMap := p.Execute() + if len(errsMap) == 0 { log.Println("=== all plugins' Install/Uninstall/Reinstall process are succeeded ===") log.Println("=== END ===") return } log.Println("=== some errors occurred during plugins Install/Uninstall/Reinstall process ===") - for _, err := range errs { - log.Println(err) + for k, err := range errsMap { + log.Printf("%s -> %s", k, err) } log.Println("=== END ===") } diff --git a/internal/pkg/argocdapp/argocdapp.go b/internal/pkg/argocdapp/argocdapp.go index d052fcb2c..7f0a72272 100644 --- a/internal/pkg/argocdapp/argocdapp.go +++ b/internal/pkg/argocdapp/argocdapp.go @@ -20,11 +20,15 @@ type Action string func kubectlAction(action Action, filename string) error { cmd := exec.Command("kubectl", string(action), "-f", filename) - stdout, err := cmd.Output() + cOut, err := cmd.CombinedOutput() if err != nil { + // TODO(Daniel Hu): Handle the Error below: + // Error from server (NotFound): error when deleting "./app.yaml": applications.argoproj.io "hello" not found + log.Printf("failed to exec: < %s >", cmd.String()) + log.Printf("exec logs: < %s >. got error: %s", string(cOut), err) return err } - log.Println(strings.TrimSuffix(string(stdout), "\n")) + log.Println(strings.TrimSuffix(string(cOut), "\n")) return nil } diff --git a/internal/pkg/argocdapp/install.go b/internal/pkg/argocdapp/install.go index ec672527f..4493c9e15 100644 --- a/internal/pkg/argocdapp/install.go +++ b/internal/pkg/argocdapp/install.go @@ -18,7 +18,7 @@ func Install(options *map[string]interface{}) (bool, error) { return false, err } - err = kubectlAction(ActionDelete, file) + err = kubectlAction(ActionApply, file) if err != nil { return false, err } diff --git a/internal/pkg/planmanager/plan.go b/internal/pkg/planmanager/plan.go index 472d4628a..743e63898 100644 --- a/internal/pkg/planmanager/plan.go +++ b/internal/pkg/planmanager/plan.go @@ -1,6 +1,7 @@ package planmanager import ( + "fmt" "log" "time" @@ -50,8 +51,8 @@ func NewPlan(smgr statemanager.Manager, cfg *configloader.Config) *Plan { // Execute will execute all changes included in the Plan and record results. // All errors will be return. -func (p *Plan) Execute() []error { - errors := make([]error, 0) +func (p *Plan) Execute() map[string]error { + errorsMap := make(map[string]error) log.Printf("changes count: %d", len(p.Changes)) for i, c := range p.Changes { log.Printf("processing progress: %d/%d", i+1, len(p.Changes)) @@ -60,7 +61,8 @@ func (p *Plan) Execute() []error { // It involves dependency management. succeeded, err := c.Action(c.Tool) if err != nil { - errors = append(errors, err) + key := fmt.Sprintf("%s-%s", c.Tool.Name, c.ActionName) + errorsMap[key] = err } c.Result = &ChangeResult{ @@ -71,8 +73,8 @@ func (p *Plan) Execute() []error { err = p.handleResult(c) if err != nil { - errors = append(errors, err) + errorsMap["handle-result"] = err } } - return errors + return errorsMap } diff --git a/internal/pkg/planmanager/result.go b/internal/pkg/planmanager/result.go index 61e6cd52f..1db733151 100644 --- a/internal/pkg/planmanager/result.go +++ b/internal/pkg/planmanager/result.go @@ -31,11 +31,11 @@ func (p *Plan) handleResult(change *Change) error { // uninstall failed if change.ActionName == statemanager.ActionUninstall && !change.Result.Succeeded { state.Status = statemanager.StatusInstalled - log.Printf("=== plugin %s process failed ===", change.Tool.Name) + log.Printf("=== plugin %s uninstall failed ===", change.Tool.Name) // install or reinstall failed } else if !change.Result.Succeeded { state.Status = statemanager.StatusFailed - log.Printf("=== plugin %s process failed ===", change.Tool.Name) + log.Printf("=== plugin %s (re)install failed ===", change.Tool.Name) // install or reinstall succeeded } else { log.Printf("=== plugin %s process done ===", change.Tool.Name) diff --git a/internal/pkg/statemanager/state.go b/internal/pkg/statemanager/state.go index 8d7127b0d..d512dddb8 100644 --- a/internal/pkg/statemanager/state.go +++ b/internal/pkg/statemanager/state.go @@ -15,9 +15,9 @@ const ( StatusUninstalled ComponentStatus = "uninstalled" // We use StatusInstalled when a plugin is installed but we don't know its status is "running" or "failed". // For example: We try to uninstall a plugin but failed for some reason. - StatusInstalled ComponentStatus = "installed" - StatusRunning ComponentStatus = "running" - StatusFailed ComponentStatus = "failed" + StatusInstalled ComponentStatus = "installed" + StatusRunning ComponentStatus = "running" + StatusFailed ComponentStatus = "failed" ) const (