github.com/verrazzano/verrazzano@v1.7.1/tests/e2e/upgrade/pre-upgrade/keycloak/keycloak_test.go (about)

     1  // Copyright (c) 2022, Oracle and/or its affiliates.
     2  // Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl.
     3  
     4  package keycloak
     5  
     6  import (
     7  	"fmt"
     8  	dump "github.com/verrazzano/verrazzano/tests/e2e/pkg/test/clusterdump"
     9  	"k8s.io/apimachinery/pkg/api/errors"
    10  	"os"
    11  	"os/exec"
    12  	"path"
    13  	"time"
    14  
    15  	. "github.com/onsi/ginkgo/v2"
    16  	. "github.com/onsi/gomega"
    17  	"github.com/verrazzano/verrazzano/tests/e2e/pkg"
    18  	"github.com/verrazzano/verrazzano/tests/e2e/pkg/test/framework"
    19  	"github.com/verrazzano/verrazzano/tests/e2e/pkg/test/framework/metrics"
    20  	v1 "k8s.io/api/core/v1"
    21  )
    22  
    23  var waitTimeout = 10 * time.Minute
    24  var pollingInterval = 20 * time.Second
    25  
    26  var kubeConfig = os.Getenv("KUBECONFIG")
    27  var testKeycloakMasterUserID = ""
    28  var testKeycloakVerrazzanoUserID = ""
    29  
    30  var t = framework.NewTestFramework("keycloak")
    31  
    32  var beforeSuite = t.BeforeSuiteFunc(func() {
    33  	start := time.Now()
    34  	beforeSuitePassed = true
    35  
    36  	isManagedClusterProfile := pkg.IsManagedClusterProfile()
    37  	if isManagedClusterProfile {
    38  		Skip("Skipping test suite since this is a managed cluster profile")
    39  	}
    40  
    41  	exists, err := pkg.DoesNamespaceExist(pkg.TestKeycloakNamespace)
    42  	if err != nil {
    43  		Fail(err.Error())
    44  	}
    45  
    46  	if exists {
    47  		t.Logs.Info("Delete namespace")
    48  		// Delete namespace, if already exists, so that test can be executed cleanly
    49  		Eventually(func() error {
    50  			return pkg.DeleteNamespace(pkg.TestKeycloakNamespace)
    51  		}, waitTimeout, pollingInterval).Should(BeNil())
    52  
    53  		t.Logs.Info("Wait for namespace finalizer to be removed")
    54  		Eventually(func() bool {
    55  			return pkg.CheckNamespaceFinalizerRemoved(pkg.TestKeycloakNamespace)
    56  		}, waitTimeout, pollingInterval).Should(BeTrue())
    57  
    58  		t.Logs.Info("Wait for namespace deletion")
    59  		Eventually(func() bool {
    60  			_, err := pkg.GetNamespace(pkg.TestKeycloakNamespace)
    61  			return err != nil && errors.IsNotFound(err)
    62  		}, waitTimeout, pollingInterval).Should(BeTrue())
    63  	}
    64  
    65  	Eventually(func() (*v1.Namespace, error) {
    66  		nsLabels := map[string]string{}
    67  		return pkg.CreateNamespace(pkg.TestKeycloakNamespace, nsLabels)
    68  	}, waitTimeout, pollingInterval).ShouldNot(BeNil())
    69  
    70  	metrics.Emit(t.Metrics.With("before_suite_elapsed_time", time.Since(start).Milliseconds()))
    71  })
    72  
    73  var _ = BeforeSuite(beforeSuite)
    74  
    75  var failed = false
    76  var beforeSuitePassed = false
    77  
    78  var _ = t.AfterEach(func() {
    79  	failed = failed || framework.VzCurrentGinkgoTestDescription().Failed()
    80  })
    81  
    82  var afterSuite = t.AfterSuiteFunc(func() {
    83  	start := time.Now()
    84  	if failed || !beforeSuitePassed {
    85  		dump.ExecuteBugReport()
    86  	}
    87  	createConfigMap()
    88  	metrics.Emit(t.Metrics.With("after_suite_elapsed_time", time.Since(start).Milliseconds()))
    89  })
    90  
    91  var _ = AfterSuite(afterSuite)
    92  
    93  var _ = t.Describe("Create users in Keycloak", Label("f:platform-lcm.install"), func() {
    94  	t.It("Creating user in master realm", func() {
    95  		Eventually(verifyCreateUserMaster, waitTimeout, pollingInterval).Should(Not(BeNil()))
    96  	})
    97  	t.It("Creating user in verrazzano-system realm", func() {
    98  		Eventually(verifyCreateUserVz, waitTimeout, pollingInterval).Should(Not(BeNil()))
    99  	})
   100  })
   101  
   102  // Creating a configmap to store the newly created keycloak user ids to be verified in the keycloak post-upgrade later
   103  func createConfigMap() {
   104  	if testKeycloakMasterUserID != "" && testKeycloakVerrazzanoUserID != "" {
   105  		kubeConfigOption := fmt.Sprintf("--kubeconfig=%s", kubeConfig)
   106  		keyValue1 := fmt.Sprintf("--from-literal=%s=%s", pkg.TestKeycloakMasterUserIDKey, testKeycloakMasterUserID)
   107  		keyValue2 := fmt.Sprintf("--from-literal=%s=%s", pkg.TestKeycloakVerrazzanoUserIDKey, testKeycloakVerrazzanoUserID)
   108  		cmd := exec.Command("kubectl", kubeConfigOption, "-n", pkg.TestKeycloakNamespace,
   109  			"create", "configmap", pkg.TestKeycloakConfigMap, keyValue1, keyValue2)
   110  		t.Logs.Info(fmt.Sprintf("kubectl command to create configmap %s: %s", pkg.TestKeycloakConfigMap, cmd.String()))
   111  		_, err := cmd.Output()
   112  		if err != nil {
   113  			t.Fail(fmt.Sprintf("Error creating configmap %s: %s\n", pkg.TestKeycloakConfigMap, err))
   114  		}
   115  	}
   116  }
   117  
   118  func verifyCreateUserMaster() (string, error) {
   119  	userID, err := verifyCreateUser("master")
   120  	testKeycloakMasterUserID = userID
   121  	return userID, err
   122  }
   123  
   124  func verifyCreateUserVz() (string, error) {
   125  	userID, err := verifyCreateUser("verrazzano-system")
   126  	testKeycloakVerrazzanoUserID = userID
   127  	return userID, err
   128  }
   129  
   130  func verifyCreateUser(realm string) (string, error) {
   131  	kc, err := pkg.NewKeycloakAdminRESTClient()
   132  	if err != nil {
   133  		t.Logs.Error(fmt.Printf("Failed to create Keycloak REST client: %v\n", err))
   134  		return "", err
   135  	}
   136  
   137  	salt := time.Now().Format("20060102150405.000000000")
   138  	userName := fmt.Sprintf("test-user-%s", salt)
   139  	firstName := fmt.Sprintf("test-first-%s", salt)
   140  	lastName := fmt.Sprintf("test-last-%s", salt)
   141  	validPassword := fmt.Sprintf("test-password-12-!@-AB-%s", salt)
   142  	userURL, err := kc.CreateUser(realm, userName, firstName, lastName, validPassword)
   143  	if err != nil {
   144  		t.Logs.Error(fmt.Printf("Failed to create user %s/%s: %v\n", realm, userName, err))
   145  		return "", err
   146  	}
   147  	userID := path.Base(userURL)
   148  	return userID, err
   149  }