From 5f376fdd3d19ff0191f99f33371efe1f561a3f90 Mon Sep 17 00:00:00 2001 From: David VIEJO Date: Thu, 25 Jan 2024 08:56:01 +0100 Subject: [PATCH] update Signed-off-by: David VIEJO --- controllers/ca/ca_controller.go | 85 +++++++++++++++-------- controllers/ordnode/ordnode_controller.go | 30 +++++++- controllers/peer/peer_controller.go | 38 ++++++++-- 3 files changed, 119 insertions(+), 34 deletions(-) diff --git a/controllers/ca/ca_controller.go b/controllers/ca/ca_controller.go index 2c90e72a..3ee12e5b 100644 --- a/controllers/ca/ca_controller.go +++ b/controllers/ca/ca_controller.go @@ -933,6 +933,32 @@ func Reconcile( // it doesn't exist return ctrl.Result{}, err } + } else if exists && helmStatus.Info.Status == release.StatusPendingRollback { + historyAction := action.NewHistory(cfg) + history, err := historyAction.Run(releaseName) + if err != nil { + return ctrl.Result{}, err + } + if len(history) > 0 { + // find the last deployed revision + // and rollback to it + // sort history by revision number descending using raw go + sort.Slice(history, func(i, j int) bool { + return history[i].Version > history[j].Version + }) + for _, historyItem := range history { + if historyItem.Info.Status == release.StatusDeployed { + rollbackStatus := action.NewRollback(cfg) + rollbackStatus.Version = historyItem.Version + err = rollbackStatus.Run(releaseName) + if err != nil { + // it doesn't exist + return ctrl.Result{}, err + } + break + } + } + } } log.Debugf("Release %s exists=%v", releaseName, exists) clientSet, err := utils.GetClientKubeWithConf(r.Config) @@ -969,35 +995,38 @@ func Reconcile( Status: "True", LastTransitionTime: v1.Time{}, }) - c, err := GetConfig(hlf, clientSet, releaseName, req.Namespace) - if err != nil { - return ctrl.Result{}, err - } - inrec, err := json.Marshal(c) - if err != nil { - return ctrl.Result{}, err - } - var inInterface map[string]interface{} - err = json.Unmarshal(inrec, &inInterface) - if err != nil { - return ctrl.Result{}, err - } - cmd := action.NewUpgrade(cfg) - cmd.Timeout = r.Timeout - cmd.Wait = r.Wait - cmd.MaxHistory = r.MaxHistory - settings := cli.New() - chartPath, err := cmd.LocateChart(r.ChartPath, settings) - ch, err := loader.Load(chartPath) - if err != nil { - return ctrl.Result{}, err - } - release, err := cmd.Run(releaseName, ch, inInterface) - if err != nil { - setConditionStatus(hlf, hlfv1alpha1.FailedStatus, false, err, false) - return r.updateCRStatusOrFailReconcile(ctx, r.Log, hlf) + if helmStatus.Info.Status != release.StatusPendingUpgrade { + c, err := GetConfig(hlf, clientSet, releaseName, req.Namespace) + if err != nil { + return ctrl.Result{}, err + } + inrec, err := json.Marshal(c) + if err != nil { + return ctrl.Result{}, err + } + var inInterface map[string]interface{} + err = json.Unmarshal(inrec, &inInterface) + if err != nil { + return ctrl.Result{}, err + } + cmd := action.NewUpgrade(cfg) + cmd.Timeout = r.Timeout + cmd.Wait = r.Wait + cmd.MaxHistory = r.MaxHistory + + settings := cli.New() + chartPath, err := cmd.LocateChart(r.ChartPath, settings) + ch, err := loader.Load(chartPath) + if err != nil { + return ctrl.Result{}, err + } + release, err := cmd.Run(releaseName, ch, inInterface) + if err != nil { + setConditionStatus(hlf, hlfv1alpha1.FailedStatus, false, err, false) + return r.updateCRStatusOrFailReconcile(ctx, r.Log, hlf) + } + log.Debugf("Chart upgraded %s", release.Name) } - log.Debugf("Chart upgraded %s", release.Name) if !reflect.DeepEqual(fca.Status, hlf.Status) { if err := r.Status().Update(ctx, fca); err != nil { log.Debugf("Error updating the status: %v", err) diff --git a/controllers/ordnode/ordnode_controller.go b/controllers/ordnode/ordnode_controller.go index 529558e6..495ae058 100644 --- a/controllers/ordnode/ordnode_controller.go +++ b/controllers/ordnode/ordnode_controller.go @@ -11,6 +11,7 @@ import ( "helm.sh/helm/v3/pkg/release" "os" "reflect" + "sort" "strings" "time" @@ -162,6 +163,32 @@ func (r *FabricOrdererNodeReconciler) Reconcile(ctx context.Context, req ctrl.Re // it doesn't exist return ctrl.Result{}, err } + } else if exists && helmStatus.Info.Status == release.StatusPendingRollback { + historyAction := action.NewHistory(cfg) + history, err := historyAction.Run(releaseName) + if err != nil { + return ctrl.Result{}, err + } + if len(history) > 0 { + // find the last deployed revision + // and rollback to it + // sort history by revision number descending using raw go + sort.Slice(history, func(i, j int) bool { + return history[i].Version > history[j].Version + }) + for _, historyItem := range history { + if historyItem.Info.Status == release.StatusDeployed { + rollbackStatus := action.NewRollback(cfg) + rollbackStatus.Version = historyItem.Version + err = rollbackStatus.Run(releaseName) + if err != nil { + // it doesn't exist + return ctrl.Result{}, err + } + break + } + } + } } log.Printf("Release %s exists=%v", releaseName, exists) clientSet, err := utils.GetClientKubeWithConf(r.Config) @@ -216,7 +243,7 @@ func (r *FabricOrdererNodeReconciler) Reconcile(ctx context.Context, req ctrl.Re lastTimeCertsRenewed = &newTime log.Infof("Certs updated, last time updated: %v", lastTimeCertsRenewed) requeueAfter = time.Minute * 1 - } else { + } else if helmStatus.Info.Status != release.StatusPendingUpgrade { c, err := getConfig(fabricOrdererNode, clientSet, releaseName, req.Namespace, false) if err != nil { return ctrl.Result{}, err @@ -478,6 +505,7 @@ func (r *FabricOrdererNodeReconciler) upgradeChart( cmd.Wait = r.Wait cmd.Timeout = r.Timeout cmd.MaxHistory = r.MaxHistory + release, err := cmd.Run(releaseName, ch, inInterface) if err != nil { return err diff --git a/controllers/peer/peer_controller.go b/controllers/peer/peer_controller.go index c687fc48..1b6bfbdf 100644 --- a/controllers/peer/peer_controller.go +++ b/controllers/peer/peer_controller.go @@ -11,6 +11,7 @@ import ( "helm.sh/helm/v3/pkg/release" "os" "reflect" + "sort" "strings" "time" @@ -378,6 +379,32 @@ func (r *FabricPeerReconciler) Reconcile(ctx context.Context, req ctrl.Request) // it doesn't exist return ctrl.Result{}, err } + } else if exists && helmStatus.Info.Status == release.StatusPendingRollback { + historyAction := action.NewHistory(cfg) + history, err := historyAction.Run(releaseName) + if err != nil { + return ctrl.Result{}, err + } + if len(history) > 0 { + // find the last deployed revision + // and rollback to it + // sort history by revision number descending using raw go + sort.Slice(history, func(i, j int) bool { + return history[i].Version > history[j].Version + }) + for _, historyItem := range history { + if historyItem.Info.Status == release.StatusDeployed { + rollbackStatus := action.NewRollback(cfg) + rollbackStatus.Version = historyItem.Version + err = rollbackStatus.Run(releaseName) + if err != nil { + // it doesn't exist + return ctrl.Result{}, err + } + break + } + } + } } log.Debugf("Release %s exists=%v", releaseName, exists) clientSet, err := utils.GetClientKubeWithConf(r.Config) @@ -449,11 +476,12 @@ func (r *FabricPeerReconciler) Reconcile(ctx context.Context, req ctrl.Request) r.setConditionStatus(ctx, fabricPeer, hlfv1alpha1.FailedStatus, false, err, false) return r.updateCRStatusOrFailReconcile(ctx, r.Log, fabricPeer) } - - err = r.upgradeChart(cfg, err, ns, releaseName, c) - if err != nil { - r.setConditionStatus(ctx, fabricPeer, hlfv1alpha1.FailedStatus, false, err, false) - return r.updateCRStatusOrFailReconcile(ctx, r.Log, fabricPeer) + if helmStatus.Info.Status != release.StatusPendingUpgrade { + err = r.upgradeChart(cfg, err, ns, releaseName, c) + if err != nil { + r.setConditionStatus(ctx, fabricPeer, hlfv1alpha1.FailedStatus, false, err, false) + return r.updateCRStatusOrFailReconcile(ctx, r.Log, fabricPeer) + } } requeueAfter = time.Minute * 10 }