github.com/jenkins-x/jx/v2@v2.1.155/pkg/kube/secrets.go (about)

     1  package kube
     2  
     3  import (
     4  	"fmt"
     5  	"sort"
     6  
     7  	"github.com/jenkins-x/jx-logging/pkg/log"
     8  	"github.com/jenkins-x/jx/v2/pkg/util"
     9  	"github.com/pkg/errors"
    10  	v1 "k8s.io/api/core/v1"
    11  	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    12  	"k8s.io/client-go/kubernetes"
    13  )
    14  
    15  // GetSecrets returns a map of the Secrets along with a sorted list of names
    16  func GetSecrets(kubeClient kubernetes.Interface, ns string) (map[string]*v1.Secret, []string, error) {
    17  	m := map[string]*v1.Secret{}
    18  
    19  	names := []string{}
    20  	resourceList, err := kubeClient.CoreV1().Secrets(ns).List(metav1.ListOptions{})
    21  	if err != nil {
    22  		return m, names, err
    23  	}
    24  	for _, resource := range resourceList.Items {
    25  		n := resource.Name
    26  		copy := resource
    27  		m[n] = &copy
    28  		if n != "" {
    29  			names = append(names, n)
    30  		}
    31  	}
    32  	sort.Strings(names)
    33  	return m, names, nil
    34  }
    35  
    36  // DefaultModifySecret default implementation of a function to modify
    37  func DefaultModifySecret(kubeClient kubernetes.Interface, ns string, name string, fn func(env *v1.Secret) error, defaultSecret *v1.Secret) (*v1.Secret, error) {
    38  	secretInterface := kubeClient.CoreV1().Secrets(ns)
    39  
    40  	create := false
    41  	secret, err := secretInterface.Get(name, metav1.GetOptions{})
    42  	if err != nil {
    43  		create = true
    44  		initialSecret := v1.Secret{
    45  			ObjectMeta: metav1.ObjectMeta{
    46  				Name:        name,
    47  				Labels:      map[string]string{},
    48  				Annotations: map[string]string{},
    49  			},
    50  			Data: map[string][]byte{},
    51  		}
    52  		if defaultSecret != nil {
    53  			initialSecret = *defaultSecret
    54  		}
    55  		secret = &initialSecret
    56  	}
    57  	err = fn(secret)
    58  	if err != nil {
    59  		return secret, err
    60  	}
    61  	if create {
    62  		log.Logger().Debugf("Creating Secret %s in namespace %s", util.ColorInfo(name), util.ColorInfo(ns))
    63  		_, err = secretInterface.Create(secret)
    64  		if err != nil {
    65  			return secret, errors.Wrapf(err, "Failed to create Secret %s in namespace %s", name, ns)
    66  		}
    67  		return secret, err
    68  	}
    69  	log.Logger().Infof("Updating Secret %s in namespace %s", util.ColorInfo(name), util.ColorInfo(ns))
    70  	_, err = secretInterface.Update(secret)
    71  	if err != nil {
    72  		return secret, errors.Wrapf(err, "Failed to update Secret %s in namespace %s", name, ns)
    73  	}
    74  	return secret, nil
    75  }
    76  
    77  // ValidateSecret checks a given secret and key exists in the provided namespace
    78  func ValidateSecret(kubeClient kubernetes.Interface, secretName, key, ns string) error {
    79  	secret, err := kubeClient.CoreV1().Secrets(ns).Get(secretName, metav1.GetOptions{})
    80  	if err != nil {
    81  		return errors.Wrapf(err, "could not find the Secret %s in the namespace: %s", secretName, ns)
    82  	}
    83  	if secret.Data == nil || len(secret.Data[key]) == 0 {
    84  		return fmt.Errorf("the Secret %s in the namespace: %s does not have a key: %s", secretName, ns, key)
    85  	}
    86  	log.Logger().Debugf("valid: there is a Secret: %s in namespace: %s\n", util.ColorInfo(secretName), util.ColorInfo(ns))
    87  	return nil
    88  }