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  }