github.com/jenkins-x/jx/v2@v2.1.155/pkg/kube/releases.go (about) 1 package kube 2 3 import ( 4 "sort" 5 "strings" 6 7 "github.com/blang/semver" 8 v1 "github.com/jenkins-x/jx-api/pkg/apis/jenkins.io/v1" 9 "github.com/jenkins-x/jx-api/pkg/client/clientset/versioned" 10 "github.com/pkg/errors" 11 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" 12 ) 13 14 // GetOrCreateRelease creates or updates the given release resource 15 func GetOrCreateRelease(jxClient versioned.Interface, ns string, release *v1.Release) (*v1.Release, error) { 16 releaseInterface := jxClient.JenkinsV1().Releases(ns) 17 name := release.Name 18 old, err := releaseInterface.Get(name, metav1.GetOptions{}) 19 if err == nil { 20 old.Spec = release.Spec 21 answer, err := releaseInterface.PatchUpdate(old) 22 if err != nil { 23 return answer, errors.Wrapf(err, "Failed to update Release %s in namespace %s", name, ns) 24 } 25 return answer, nil 26 } 27 answer, err := releaseInterface.Create(release) 28 if err != nil { 29 return answer, errors.Wrapf(err, "Failed to create Release %s in namespace %s", name, ns) 30 } 31 return answer, nil 32 } 33 34 type ReleaseOrder []v1.Release 35 36 func (a ReleaseOrder) Len() int { return len(a) } 37 func (a ReleaseOrder) Swap(i, j int) { a[i], a[j] = a[j], a[i] } 38 func (a ReleaseOrder) Less(i, j int) bool { 39 r1 := a[i] 40 r2 := a[j] 41 42 n1 := r1.Spec.Name 43 n2 := r2.Spec.Name 44 if n1 != n2 { 45 return n1 < n2 46 } 47 48 // lets return newest releases first 49 v1 := r1.Spec.Version 50 v2 := r2.Spec.Version 51 52 if v1 == "" || v2 == "" { 53 return v1 > v2 54 } 55 56 sv1, err1 := semver.Parse(v1) 57 sv2, err2 := semver.Parse(v2) 58 59 if err1 != nil && err2 != nil { 60 return v1 > v2 61 } 62 if err1 != nil && err2 == nil { 63 return false 64 } 65 if err1 == nil && err2 != nil { 66 return true 67 } 68 return sv1.Compare(sv2) > 0 69 } 70 71 // SortReleases sorts the releases in name order then latest version first 72 func SortReleases(releases []v1.Release) { 73 sort.Sort(ReleaseOrder(releases)) 74 } 75 76 // GetOrderedReleases returns the releases sorted in newest release first 77 func GetOrderedReleases(jxClient versioned.Interface, ns string, filter string) ([]v1.Release, error) { 78 releaseInterface := jxClient.JenkinsV1().Releases(ns) 79 answer := []v1.Release{} 80 list, err := releaseInterface.List(metav1.ListOptions{}) 81 if err != nil { 82 return answer, err 83 } 84 for _, release := range list.Items { 85 if filter == "" || strings.Index(release.Name, filter) >= 0 { 86 answer = append(answer, release) 87 } 88 } 89 SortReleases(answer) 90 return answer, nil 91 }