github.com/jenkins-x/jx/v2@v2.1.155/pkg/vault/create/create_integration_test.go (about) 1 // +build integration 2 3 package create 4 5 import ( 6 "fmt" 7 "io/ioutil" 8 "os" 9 "path" 10 "strings" 11 "testing" 12 13 "github.com/jenkins-x/jx/v2/pkg/kube/cluster" 14 15 "github.com/Pallinder/go-randomdata" 16 "k8s.io/apimachinery/pkg/util/errors" 17 18 "github.com/jenkins-x/jx/v2/pkg/cloud/gke" 19 "github.com/jenkins-x/jx/v2/pkg/util" 20 21 "github.com/jenkins-x/jx-logging/pkg/log" 22 "github.com/jenkins-x/jx/v2/pkg/cloud" 23 "github.com/jenkins-x/jx/v2/pkg/cmd/clients" 24 "github.com/jenkins-x/jx/v2/pkg/kube" 25 "github.com/jenkins-x/jx/v2/pkg/versionstream" 26 "k8s.io/client-go/kubernetes" 27 28 vaultoperatorclient "github.com/banzaicloud/bank-vaults/operator/pkg/client/clientset/versioned" 29 "github.com/jenkins-x/jx/v2/pkg/cmd/testhelpers" 30 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" 31 32 . "github.com/onsi/ginkgo" 33 . "github.com/onsi/gomega" 34 ) 35 36 var ( 37 originalJxHome string 38 tempJxHome string 39 originalKubeCfg string 40 tempKubeCfg string 41 devNamespace string 42 factory clients.Factory 43 kubeClient kubernetes.Interface 44 vaultOperatorClient vaultoperatorclient.Interface 45 gcloud gke.GCloud 46 err error 47 48 vaultCreatorUnderTest defaultVaultCreator 49 50 randomSuffix string 51 testNamespace string 52 testBucketName string 53 ) 54 55 func TestVaultCreation(t *testing.T) { 56 RegisterFailHandler(Fail) 57 RunSpecs(t, "Create Vault Test Suite") 58 } 59 60 var _ = BeforeSuite(func() { 61 By("Silencing logger") 62 log.SetOutput(ioutil.Discard) 63 64 By("Setting up a temporary JX_HOME") 65 originalJxHome, tempJxHome, err = testhelpers.CreateTestJxHomeDir() 66 Expect(err).Should(BeNil()) 67 68 By("Creating a temporary KUBECONFIG") 69 originalKubeCfg, tempKubeCfg, err = testhelpers.CreateTestKubeConfigDir() 70 Expect(err).Should(BeNil()) 71 72 By("Creating the clients factory") 73 factory = clients.NewFactory() 74 75 By("Creating a Kube client") 76 var ns string 77 kubeClient, ns, err = factory.CreateKubeClient() 78 Expect(err).Should(BeNil()) 79 80 By("Retrieving the dev namespace") 81 devNamespace, _, err = kube.GetDevNamespace(kubeClient, ns) 82 Expect(err).Should(BeNil()) 83 84 By("Creating a Vault operator client") 85 vaultOperatorClient, err = factory.CreateVaultOperatorClient() 86 Expect(err).Should(BeNil()) 87 88 By("Creating a gcloud client") 89 gcloud = gke.GCloud{} 90 91 By("Creating VaultCreator under test") 92 vaultCreatorUnderTest = defaultVaultCreator{} 93 }) 94 95 var _ = AfterSuite(func() { 96 By("Deleting temporary JX_HOME") 97 err := testhelpers.CleanupTestJxHomeDir(originalJxHome, tempJxHome) 98 Expect(err).Should(BeNil()) 99 100 By("Deleting a temporary KUBECONFIG") 101 err = testhelpers.CleanupTestKubeConfigDir(originalKubeCfg, tempKubeCfg) 102 Expect(err).Should(BeNil()) 103 104 }) 105 106 var _ = Describe("Vault create/update", func() { 107 BeforeEach(func() { 108 randomSuffix = strings.ToLower(randomdata.SillyName()) 109 testNamespace = "vault-creation-test-" + randomSuffix 110 testBucketName = "create-integration-test-vault-bucket-" + randomSuffix 111 }) 112 113 AfterEach(func() { 114 By("Deleting a test namespace") 115 _ = kubeClient.CoreV1().Namespaces().Delete(testNamespace, &metav1.DeleteOptions{}) 116 }) 117 118 Describe("#createAuthServiceAccount", func() { 119 It("should successfully create service account", func() { 120 vaultName := "my-vault" 121 sa, err := vaultCreatorUnderTest.createAuthServiceAccount(kubeClient, vaultName, "test-sa", testNamespace) 122 Expect(err).Should(BeNil()) 123 Expect(sa).Should(Equal("test-sa")) 124 }) 125 }) 126 127 Describe("#dockerImages", func() { 128 It("should return docker images with versions", func() { 129 versionsDir := path.Join("test_data", "jenkins-x-versions") 130 Expect(versionsDir).Should(BeADirectory()) 131 132 resolver := versionstream.VersionResolver{ 133 VersionsDir: versionsDir, 134 } 135 imageMap, err := vaultCreatorUnderTest.dockerImages(resolver) 136 Expect(err).Should(BeNil()) 137 138 Expect(imageMap).Should(HaveKeyWithValue("banzaicloud/bank-vaults", "banzaicloud/bank-vaults:0.5.3")) 139 Expect(imageMap).Should(HaveKeyWithValue("vault", "vault:1.2.3")) 140 }) 141 142 It("should return images unresolved if versions are missing", func() { 143 emptyDir, err := ioutil.TempDir("", "jx-create-integration-test") 144 Expect(err).Should(BeNil()) 145 defer func() { 146 _ = os.RemoveAll(emptyDir) 147 }() 148 149 resolver := versionstream.VersionResolver{ 150 VersionsDir: emptyDir, 151 } 152 imageMap, err := vaultCreatorUnderTest.dockerImages(resolver) 153 Expect(imageMap).Should(HaveKeyWithValue("banzaicloud/bank-vaults", "banzaicloud/bank-vaults")) 154 Expect(imageMap).Should(HaveKeyWithValue("vault", "vault")) 155 }) 156 }) 157 158 Describe("#CreateOrUpdateVault", func() { 159 var ( 160 projectID string 161 clusterName string 162 zone string 163 resolver versionstream.VersionResolver 164 ) 165 166 BeforeEach(func() { 167 data, err := kube.ReadInstallValues(kubeClient, devNamespace) 168 Expect(err).Should(BeNil()) 169 170 projectID = data[kube.ProjectID] 171 Expect(projectID).ShouldNot(BeEmpty()) 172 173 clusterName = data[kube.ClusterName] 174 Expect(clusterName).ShouldNot(BeEmpty()) 175 176 zone = data[kube.Zone] 177 Expect(zone).ShouldNot(BeEmpty()) 178 179 versionsDir := path.Join("test_data", "jenkins-x-versions") 180 Expect(versionsDir).Should(BeADirectory()) 181 resolver = versionstream.VersionResolver{ 182 VersionsDir: versionsDir, 183 } 184 }) 185 186 AfterEach(func() { 187 err = gcloud.DeleteBucket(testBucketName) 188 if err != nil { 189 _, _ = fmt.Fprintf(GinkgoWriter, "%s", err.Error()) 190 } 191 }) 192 193 It("fails to install vault with insufficient parameters", func() { 194 testParam := VaultCreationParam{} 195 err = vaultCreatorUnderTest.CreateOrUpdateVault(testParam) 196 Expect(err).ShouldNot(BeNil()) 197 198 aggregate, ok := err.(errors.Aggregate) 199 Expect(ok).Should(BeTrue()) 200 Expect(len(aggregate.Errors())).Should(Equal(5)) 201 202 var errorMessages []string 203 for _, validationError := range aggregate.Errors() { 204 errorMessages = append(errorMessages, validationError.Error()) 205 } 206 Expect(errorMessages).Should(ContainElement("the Vault name needs to be provided")) 207 Expect(errorMessages).Should(ContainElement("the namespace to create the Vault instance into needs to be provided")) 208 Expect(errorMessages).Should(ContainElement("a kube client needs to be provided")) 209 Expect(errorMessages).Should(ContainElement("a vault operator client needs to be provided")) 210 Expect(errorMessages).Should(ContainElement("a kube/cloud provider needs be provided")) 211 }) 212 213 It("successfully installs vault", func() { 214 if cluster.IsInCluster() { 215 Skip("only runs locally since it needs to create cloud resources") 216 } 217 218 fileHandles := util.IOFileHandles{} 219 220 gkeParam := &GKEParam{ 221 ProjectID: projectID, 222 Zone: zone, 223 BucketName: testBucketName, 224 } 225 226 testParam := VaultCreationParam{ 227 VaultName: "acme-vault", 228 Namespace: testNamespace, 229 ClusterName: clusterName, 230 ServiceAccountName: "test-sa", 231 KubeProvider: cloud.GKE, 232 KubeClient: kubeClient, 233 VaultOperatorClient: vaultOperatorClient, 234 CreateCloudResources: true, 235 VersionResolver: resolver, 236 FileHandles: fileHandles, 237 GKE: gkeParam, 238 } 239 240 err = vaultCreatorUnderTest.CreateOrUpdateVault(testParam) 241 Expect(err).Should(BeNil()) 242 243 pod, err := kubeClient.CoreV1().Pods(testNamespace).Get("acme-vault-0", metav1.GetOptions{}) 244 Expect(pod).ShouldNot(BeNil()) 245 246 By("re-running CreateOrUpdateVault is successful as well") 247 err = vaultCreatorUnderTest.CreateOrUpdateVault(testParam) 248 Expect(err).Should(BeNil()) 249 }) 250 }) 251 })