11package cluster
22
33import (
4+ "context"
5+ "encoding/json"
46 "fmt"
57 "strings"
68
79 "github.com/cybertec-postgresql/cybertec-pg-operator/pkg/spec"
810 "github.com/cybertec-postgresql/cybertec-pg-operator/pkg/util"
911 v1 "k8s.io/api/core/v1"
12+ metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
13+ "k8s.io/apimachinery/pkg/types"
1014)
1115
1216// VersionMap Map of version numbers
@@ -19,6 +23,11 @@ var VersionMap = map[string]int{
1923 "18" : 180000 ,
2024}
2125
26+ const (
27+ majorVersionUpgradeSuccessAnnotation = "last-major-upgrade-success"
28+ majorVersionUpgradeFailureAnnotation = "last-major-upgrade-failure"
29+ )
30+
2231// IsBiggerPostgresVersion Compare two Postgres version numbers
2332func IsBiggerPostgresVersion (old string , new string ) bool {
2433 oldN := VersionMap [old ]
@@ -55,6 +64,47 @@ func (c *Cluster) isUpgradeAllowedForTeam(owningTeam string) bool {
5564 return util .SliceContains (allowedTeams , owningTeam )
5665}
5766
67+ func (c * Cluster ) annotatePostgresResource (isSuccess bool ) error {
68+ annotations := make (map [string ]string )
69+ currentTime := metav1 .Now ().Format ("2006-01-02T15:04:05Z" )
70+ if isSuccess {
71+ annotations [majorVersionUpgradeSuccessAnnotation ] = currentTime
72+ } else {
73+ annotations [majorVersionUpgradeFailureAnnotation ] = currentTime
74+ }
75+ patchData , err := metaAnnotationsPatch (annotations )
76+ if err != nil {
77+ c .logger .Errorf ("could not form patch for %s postgresql resource: %v" , c .Name , err )
78+ return err
79+ }
80+ _ , err = c .KubeClient .Postgresqls (c .Namespace ).Patch (context .Background (), c .Name , types .MergePatchType , patchData , metav1.PatchOptions {})
81+ if err != nil {
82+ c .logger .Errorf ("failed to patch annotations to postgresql resource: %v" , err )
83+ return err
84+ }
85+ return nil
86+ }
87+
88+ func (c * Cluster ) removeFailuresAnnotation () error {
89+ annotationToRemove := []map [string ]string {
90+ {
91+ "op" : "remove" ,
92+ "path" : fmt .Sprintf ("/metadata/annotations/%s" , majorVersionUpgradeFailureAnnotation ),
93+ },
94+ }
95+ removePatch , err := json .Marshal (annotationToRemove )
96+ if err != nil {
97+ c .logger .Errorf ("could not form removal patch for %s postgresql resource: %v" , c .Name , err )
98+ return err
99+ }
100+ _ , err = c .KubeClient .Postgresqls (c .Namespace ).Patch (context .Background (), c .Name , types .JSONPatchType , removePatch , metav1.PatchOptions {})
101+ if err != nil {
102+ c .logger .Errorf ("failed to remove annotations from postgresql resource: %v" , err )
103+ return err
104+ }
105+ return nil
106+ }
107+
58108/*
59109Execute upgrade when mode is set to manual or full or when the owning team is allowed for upgrade (and mode is "off").
60110
0 commit comments