@@ -933,6 +933,32 @@ func Reconcile(
933
933
// it doesn't exist
934
934
return ctrl.Result {}, err
935
935
}
936
+ } else if exists && helmStatus .Info .Status == release .StatusPendingRollback {
937
+ historyAction := action .NewHistory (cfg )
938
+ history , err := historyAction .Run (releaseName )
939
+ if err != nil {
940
+ return ctrl.Result {}, err
941
+ }
942
+ if len (history ) > 0 {
943
+ // find the last deployed revision
944
+ // and rollback to it
945
+ // sort history by revision number descending using raw go
946
+ sort .Slice (history , func (i , j int ) bool {
947
+ return history [i ].Version > history [j ].Version
948
+ })
949
+ for _ , historyItem := range history {
950
+ if historyItem .Info .Status == release .StatusDeployed {
951
+ rollbackStatus := action .NewRollback (cfg )
952
+ rollbackStatus .Version = historyItem .Version
953
+ err = rollbackStatus .Run (releaseName )
954
+ if err != nil {
955
+ // it doesn't exist
956
+ return ctrl.Result {}, err
957
+ }
958
+ break
959
+ }
960
+ }
961
+ }
936
962
}
937
963
log .Debugf ("Release %s exists=%v" , releaseName , exists )
938
964
clientSet , err := utils .GetClientKubeWithConf (r .Config )
@@ -969,35 +995,38 @@ func Reconcile(
969
995
Status : "True" ,
970
996
LastTransitionTime : v1.Time {},
971
997
})
972
- c , err := GetConfig (hlf , clientSet , releaseName , req .Namespace )
973
- if err != nil {
974
- return ctrl.Result {}, err
975
- }
976
- inrec , err := json .Marshal (c )
977
- if err != nil {
978
- return ctrl.Result {}, err
979
- }
980
- var inInterface map [string ]interface {}
981
- err = json .Unmarshal (inrec , & inInterface )
982
- if err != nil {
983
- return ctrl.Result {}, err
984
- }
985
- cmd := action .NewUpgrade (cfg )
986
- cmd .Timeout = r .Timeout
987
- cmd .Wait = r .Wait
988
- cmd .MaxHistory = r .MaxHistory
989
- settings := cli .New ()
990
- chartPath , err := cmd .LocateChart (r .ChartPath , settings )
991
- ch , err := loader .Load (chartPath )
992
- if err != nil {
993
- return ctrl.Result {}, err
994
- }
995
- release , err := cmd .Run (releaseName , ch , inInterface )
996
- if err != nil {
997
- setConditionStatus (hlf , hlfv1alpha1 .FailedStatus , false , err , false )
998
- return r .updateCRStatusOrFailReconcile (ctx , r .Log , hlf )
998
+ if helmStatus .Info .Status != release .StatusPendingUpgrade {
999
+ c , err := GetConfig (hlf , clientSet , releaseName , req .Namespace )
1000
+ if err != nil {
1001
+ return ctrl.Result {}, err
1002
+ }
1003
+ inrec , err := json .Marshal (c )
1004
+ if err != nil {
1005
+ return ctrl.Result {}, err
1006
+ }
1007
+ var inInterface map [string ]interface {}
1008
+ err = json .Unmarshal (inrec , & inInterface )
1009
+ if err != nil {
1010
+ return ctrl.Result {}, err
1011
+ }
1012
+ cmd := action .NewUpgrade (cfg )
1013
+ cmd .Timeout = r .Timeout
1014
+ cmd .Wait = r .Wait
1015
+ cmd .MaxHistory = r .MaxHistory
1016
+
1017
+ settings := cli .New ()
1018
+ chartPath , err := cmd .LocateChart (r .ChartPath , settings )
1019
+ ch , err := loader .Load (chartPath )
1020
+ if err != nil {
1021
+ return ctrl.Result {}, err
1022
+ }
1023
+ release , err := cmd .Run (releaseName , ch , inInterface )
1024
+ if err != nil {
1025
+ setConditionStatus (hlf , hlfv1alpha1 .FailedStatus , false , err , false )
1026
+ return r .updateCRStatusOrFailReconcile (ctx , r .Log , hlf )
1027
+ }
1028
+ log .Debugf ("Chart upgraded %s" , release .Name )
999
1029
}
1000
- log .Debugf ("Chart upgraded %s" , release .Name )
1001
1030
if ! reflect .DeepEqual (fca .Status , hlf .Status ) {
1002
1031
if err := r .Status ().Update (ctx , fca ); err != nil {
1003
1032
log .Debugf ("Error updating the status: %v" , err )
0 commit comments