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  })