github.com/redhat-appstudio/e2e-tests@v0.0.0-20230619105049-9a422b2094d7/pkg/utils/common/secret.go (about)

     1  package common
     2  
     3  import (
     4  	"context"
     5  	"encoding/base64"
     6  	"errors"
     7  	"time"
     8  
     9  	. "github.com/redhat-appstudio/e2e-tests/pkg/constants"
    10  	"github.com/redhat-appstudio/e2e-tests/pkg/utils"
    11  	corev1 "k8s.io/api/core/v1"
    12  	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    13  	"k8s.io/apimachinery/pkg/util/wait"
    14  )
    15  
    16  // Creates a new secret in a specified namespace
    17  func (s *SuiteController) CreateSecret(ns string, secret *corev1.Secret) (*corev1.Secret, error) {
    18  	return s.KubeInterface().CoreV1().Secrets(ns).Create(context.TODO(), secret, metav1.CreateOptions{})
    19  }
    20  
    21  // Check if a secret exists, return secret and error
    22  func (s *SuiteController) GetSecret(ns string, name string) (*corev1.Secret, error) {
    23  	return s.KubeInterface().CoreV1().Secrets(ns).Get(context.TODO(), name, metav1.GetOptions{})
    24  }
    25  
    26  // Deleted a secret in a specified namespace
    27  func (s *SuiteController) DeleteSecret(ns string, name string) error {
    28  	return s.KubeInterface().CoreV1().Secrets(ns).Delete(context.TODO(), name, metav1.DeleteOptions{})
    29  }
    30  
    31  // Links a secret to a specified serviceaccount, if argument addImagePullSecrets is true secret will be added also to ImagePullSecrets of SA.
    32  func (s *SuiteController) LinkSecretToServiceAccount(ns, secret, serviceaccount string, addImagePullSecrets bool) error {
    33  	timeout := 20 * time.Second
    34  	return wait.PollImmediate(time.Second, timeout, func() (bool, error) {
    35  		serviceAccountObject, err := s.KubeInterface().CoreV1().ServiceAccounts(ns).Get(context.TODO(), serviceaccount, metav1.GetOptions{})
    36  		if err != nil {
    37  			return false, err
    38  		}
    39  		for _, credentialSecret := range serviceAccountObject.Secrets {
    40  			if credentialSecret.Name == secret {
    41  				// The secret is present in the service account, no updates needed
    42  				return true, nil
    43  			}
    44  		}
    45  		serviceAccountObject.Secrets = append(serviceAccountObject.Secrets, corev1.ObjectReference{Name: secret})
    46  		if addImagePullSecrets {
    47  			serviceAccountObject.ImagePullSecrets = append(serviceAccountObject.ImagePullSecrets, corev1.LocalObjectReference{Name: secret})
    48  		}
    49  		_, err = s.KubeInterface().CoreV1().ServiceAccounts(ns).Update(context.TODO(), serviceAccountObject, metav1.UpdateOptions{})
    50  		if err != nil {
    51  			return false, nil
    52  		}
    53  		return true, nil
    54  	})
    55  }
    56  
    57  // UnlinkSecretFromServiceAcocount unlinks secret from service account
    58  func (s *SuiteController) UnlinkSecretFromServiceAccount(namespace, secretName, serviceAccount string, rmImagePullSecrets bool) error {
    59  	serviceAccountObject, err := s.KubeInterface().CoreV1().ServiceAccounts(namespace).Get(context.TODO(), serviceAccount, metav1.GetOptions{})
    60  	if err != nil {
    61  		return err
    62  	}
    63  
    64  	for index, secret := range serviceAccountObject.Secrets {
    65  		if secret.Name == secretName {
    66  			serviceAccountObject.Secrets = append(serviceAccountObject.Secrets[:index], serviceAccountObject.Secrets[index+1:]...)
    67  			break
    68  		}
    69  	}
    70  
    71  	if rmImagePullSecrets {
    72  		for index, secret := range serviceAccountObject.ImagePullSecrets {
    73  			if secret.Name == secretName {
    74  				serviceAccountObject.ImagePullSecrets = append(serviceAccountObject.ImagePullSecrets[:index], serviceAccountObject.ImagePullSecrets[index+1:]...)
    75  				break
    76  			}
    77  		}
    78  	}
    79  	_, err = s.KubeInterface().CoreV1().ServiceAccounts(namespace).Update(context.TODO(), serviceAccountObject, metav1.UpdateOptions{})
    80  	if err != nil {
    81  		return err
    82  	}
    83  
    84  	return nil
    85  }
    86  
    87  // CreateRegistryAuthSecret create a docker registry secret in a given ns
    88  func (s *SuiteController) CreateRegistryAuthSecret(secretName, namespace, secretStringData string) (*corev1.Secret, error) {
    89  	rawDecodedTextStringData, err := base64.StdEncoding.DecodeString(secretStringData)
    90  	if err != nil {
    91  		return nil, err
    92  	}
    93  
    94  	secret := &corev1.Secret{
    95  		ObjectMeta: metav1.ObjectMeta{
    96  			Name:      secretName,
    97  			Namespace: namespace,
    98  		},
    99  		Type:       corev1.SecretTypeDockerConfigJson,
   100  		StringData: map[string]string{corev1.DockerConfigJsonKey: string(rawDecodedTextStringData)},
   101  	}
   102  	er := s.KubeRest().Create(context.TODO(), secret)
   103  	if er != nil {
   104  		return nil, er
   105  	}
   106  	return secret, nil
   107  }
   108  
   109  // AddRegistryAuthSecretToSA adds registry auth secret to service account
   110  func (s *SuiteController) AddRegistryAuthSecretToSA(registryAuth, namespace string) error {
   111  	quayToken := utils.GetEnv(registryAuth, "")
   112  	if quayToken == "" {
   113  		return errors.New("Failed to get registry auth secret")
   114  	}
   115  
   116  	_, err := s.CreateRegistryAuthSecret(RegistryAuthSecretName, namespace, quayToken)
   117  	if err != nil {
   118  		return err
   119  	}
   120  
   121  	err = s.LinkSecretToServiceAccount(namespace, RegistryAuthSecretName, DefaultPipelineServiceAccount, true)
   122  	if err != nil {
   123  		return err
   124  	}
   125  
   126  	return nil
   127  }