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 }