github.com/redhat-appstudio/e2e-tests@v0.0.0-20240520140907-9709f6f59323/tests/remote-secret/service-account-auth.go (about)

     1  package remotesecret
     2  
     3  import (
     4  	"fmt"
     5  	"time"
     6  
     7  	"github.com/devfile/library/v2/pkg/util"
     8  	. "github.com/onsi/ginkgo/v2"
     9  	. "github.com/onsi/gomega"
    10  	"github.com/redhat-appstudio/e2e-tests/pkg/framework"
    11  	"github.com/redhat-appstudio/e2e-tests/pkg/utils"
    12  	"github.com/redhat-appstudio/remote-secret/api/v1beta1"
    13  	v1 "k8s.io/api/core/v1"
    14  	"k8s.io/apimachinery/pkg/api/meta"
    15  )
    16  
    17  /*
    18   * Component: remote secret
    19   * Description: SVPI-558 - Test all the options of the authz of remote secret target deployment
    20   * Test case: Authentication using Service Account
    21   */
    22  
    23  var _ = framework.RemoteSecretSuiteDescribe(Label("remote-secret", "service-account-auth"), func() {
    24  
    25  	defer GinkgoRecover()
    26  
    27  	var fw *framework.Framework
    28  	var err error
    29  	var namespace string
    30  	var remoteSecret *v1beta1.RemoteSecret
    31  	targetNamespace1 := fmt.Sprintf("spi-test-target1-%s", util.GenerateRandomString(4))
    32  	targetNamespace2 := fmt.Sprintf("spi-test-target2-%s", util.GenerateRandomString(4))
    33  	remoteSecretName := "test-remote-secret"
    34  	targetSecretName1 := ""
    35  	targetSecretName2 := ""
    36  	serviceAccountName := fmt.Sprintf("deployment-enabler-%s", util.GenerateRandomString(4))
    37  	roleName := fmt.Sprintf("deployment-enabler-%s", util.GenerateRandomString(4))
    38  	roleBindingName := fmt.Sprintf("deployment-enabler-%s", util.GenerateRandomString(4))
    39  	AfterEach(framework.ReportFailure(&fw))
    40  
    41  	Describe("SVPI-558 - Authentication using Service Account", Ordered, func() {
    42  		BeforeAll(func() {
    43  			// Initialize the tests controllers
    44  			fw, err = framework.NewFramework(utils.GetGeneratedNamespace("rs-demos"))
    45  			Expect(err).NotTo(HaveOccurred())
    46  			namespace = fw.UserNamespace
    47  			Expect(namespace).NotTo(BeEmpty())
    48  
    49  			_, err = fw.AsKubeAdmin.CommonController.CreateTestNamespace(targetNamespace1)
    50  			Expect(err).NotTo(HaveOccurred(), "Error when creating %s namespace: %v", targetNamespace1, err)
    51  
    52  			_, err = fw.AsKubeAdmin.CommonController.CreateTestNamespace(targetNamespace2)
    53  			Expect(err).NotTo(HaveOccurred(), "Error when creating %s namespace: %v", targetNamespace2, err)
    54  		})
    55  
    56  		AfterAll(func() {
    57  			if !CurrentSpecReport().Failed() {
    58  				Expect(fw.SandboxController.DeleteUserSignup(fw.UserName)).To(BeTrue())
    59  				Expect(fw.AsKubeAdmin.CommonController.DeleteNamespace(targetNamespace1)).To(Succeed())
    60  				Expect(fw.AsKubeAdmin.CommonController.DeleteNamespace(targetNamespace2)).To(Succeed())
    61  			}
    62  		})
    63  
    64  		It("creates RemoteSecret with previously created namespaces as targets", func() {
    65  			targets := []v1beta1.RemoteSecretTarget{{Namespace: targetNamespace1}, {Namespace: targetNamespace2}}
    66  			remoteSecret, err = fw.AsKubeDeveloper.RemoteSecretController.CreateRemoteSecret(remoteSecretName, namespace, targets, v1.SecretTypeOpaque, map[string]string{})
    67  			Expect(err).NotTo(HaveOccurred())
    68  
    69  			Eventually(func() bool {
    70  				remoteSecret, err = fw.AsKubeDeveloper.RemoteSecretController.GetRemoteSecret(remoteSecretName, namespace)
    71  				Expect(err).NotTo(HaveOccurred())
    72  
    73  				return meta.IsStatusConditionFalse(remoteSecret.Status.Conditions, "DataObtained")
    74  			}, 5*time.Minute, 5*time.Second).Should(BeTrue(), fmt.Sprintf("RemoteSecret %s/%s is not waiting for data", namespace, remoteSecretName))
    75  		})
    76  
    77  		It("creates service account", func() {
    78  			labels := map[string]string{"appstudio.redhat.com/remotesecret-auth-sa": "true"}
    79  			_, err := fw.AsKubeAdmin.CommonController.CreateServiceAccount(serviceAccountName, namespace, nil, labels)
    80  			Expect(err).NotTo(HaveOccurred())
    81  		})
    82  
    83  		It("creates role for target 1", func() {
    84  			_, err := fw.AsKubeAdmin.CommonController.CreateRole(roleName, targetNamespace1, map[string][]string{
    85  				"apiGroupsList": {""},
    86  				"roleResources": {"secrets", "serviceaccounts"},
    87  				"roleVerbs":     {"create", "get", "list", "update", "delete"},
    88  			})
    89  			Expect(err).NotTo(HaveOccurred())
    90  
    91  			_, err = fw.AsKubeAdmin.CommonController.GetRole(roleName, targetNamespace1)
    92  			Expect(err).NotTo(HaveOccurred())
    93  		})
    94  
    95  		It("creates role for target 2", func() {
    96  			_, err := fw.AsKubeAdmin.CommonController.CreateRole(roleName, targetNamespace2, map[string][]string{
    97  				"apiGroupsList": {""},
    98  				"roleResources": {"secrets", "serviceaccounts"},
    99  				"roleVerbs":     {"create", "get", "list", "update", "delete"},
   100  			})
   101  			Expect(err).NotTo(HaveOccurred())
   102  
   103  			_, err = fw.AsKubeAdmin.CommonController.GetRole(roleName, targetNamespace2)
   104  			Expect(err).NotTo(HaveOccurred())
   105  		})
   106  
   107  		It("creates role binding for target 1", func() {
   108  			_, err := fw.AsKubeAdmin.CommonController.CreateRoleBinding(
   109  				roleBindingName, targetNamespace1,
   110  				"ServiceAccount", serviceAccountName, namespace,
   111  				"Role", roleName, "rbac.authorization.k8s.io",
   112  			)
   113  			Expect(err).NotTo(HaveOccurred())
   114  		})
   115  
   116  		It("creates role binding for target 2", func() {
   117  			_, err := fw.AsKubeAdmin.CommonController.CreateRoleBinding(
   118  				roleBindingName, targetNamespace2,
   119  				"ServiceAccount", serviceAccountName, namespace,
   120  				"Role", roleName, "rbac.authorization.k8s.io",
   121  			)
   122  			Expect(err).NotTo(HaveOccurred())
   123  		})
   124  
   125  		It("creates upload secret", func() {
   126  			data := map[string]string{"a": "b", "c": "d"}
   127  
   128  			_, err = fw.AsKubeAdmin.RemoteSecretController.CreateUploadSecret(remoteSecret.Name, namespace, remoteSecret.Name, v1.SecretTypeOpaque, data)
   129  			Expect(err).NotTo(HaveOccurred())
   130  		})
   131  
   132  		It("checks if remote secret was deployed", func() {
   133  			Eventually(func() bool {
   134  				remoteSecret, err = fw.AsKubeDeveloper.RemoteSecretController.GetRemoteSecret(remoteSecretName, namespace)
   135  				Expect(err).NotTo(HaveOccurred())
   136  
   137  				return meta.IsStatusConditionTrue(remoteSecret.Status.Conditions, "Deployed")
   138  			}, 5*time.Minute, 5*time.Second).Should(BeTrue(), fmt.Sprintf("RemoteSecret %s/%s is not in deployed phase", namespace, remoteSecretName))
   139  		})
   140  
   141  		It("checks targets in RemoteSecret status", func() {
   142  			remoteSecret, err = fw.AsKubeDeveloper.RemoteSecretController.GetRemoteSecret(remoteSecret.Name, namespace)
   143  			Expect(err).NotTo(HaveOccurred())
   144  
   145  			targets := remoteSecret.Status.Targets
   146  			Expect(targets).To(HaveLen(2))
   147  
   148  			// get targetSecretName1
   149  			targetSecretName1 = fw.AsKubeDeveloper.RemoteSecretController.GetTargetSecretName(targets, targetNamespace1)
   150  			Expect(targetSecretName1).ToNot(BeEmpty())
   151  
   152  			// get targetSecretName12
   153  			targetSecretName2 = fw.AsKubeDeveloper.RemoteSecretController.GetTargetSecretName(targets, targetNamespace2)
   154  			Expect(targetSecretName2).ToNot(BeEmpty())
   155  		})
   156  
   157  		It("checks if secret was created in target namespaces", func() {
   158  			_, err = fw.AsKubeAdmin.CommonController.GetSecret(targetNamespace1, targetSecretName1)
   159  			Expect(err).NotTo(HaveOccurred())
   160  
   161  			_, err = fw.AsKubeAdmin.CommonController.GetSecret(targetNamespace2, targetSecretName2)
   162  			Expect(err).NotTo(HaveOccurred())
   163  		})
   164  	})
   165  })