github.com/kubernetes-sigs/blobfuse-csi-driver@v0.5.0/test/e2e/suite_test.go (about)

     1  /*
     2  Copyright 2019 The Kubernetes Authors.
     3  
     4  Licensed under the Apache License, Version 2.0 (the "License");
     5  you may not use this file except in compliance with the License.
     6  You may obtain a copy of the License at
     7  
     8      http://www.apache.org/licenses/LICENSE-2.0
     9  
    10  Unless required by applicable law or agreed to in writing, software
    11  distributed under the License is distributed on an "AS IS" BASIS,
    12  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13  See the License for the specific language governing permissions and
    14  limitations under the License.
    15  */
    16  
    17  package e2e
    18  
    19  import (
    20  	"context"
    21  	"fmt"
    22  	"log"
    23  	"os"
    24  	"os/exec"
    25  	"path"
    26  	"path/filepath"
    27  	"strings"
    28  	"testing"
    29  
    30  	"github.com/onsi/ginkgo"
    31  	"github.com/onsi/ginkgo/reporters"
    32  	"github.com/onsi/gomega"
    33  	"github.com/pborman/uuid"
    34  	"k8s.io/kubernetes/test/e2e/framework"
    35  	"sigs.k8s.io/blobfuse-csi-driver/pkg/blobfuse"
    36  	"sigs.k8s.io/blobfuse-csi-driver/test/utils/azure"
    37  	"sigs.k8s.io/blobfuse-csi-driver/test/utils/credentials"
    38  	"sigs.k8s.io/blobfuse-csi-driver/test/utils/testutil"
    39  )
    40  
    41  const (
    42  	kubeconfigEnvVar = "KUBECONFIG"
    43  	reportDirEnv     = "ARTIFACTS"
    44  	defaultReportDir = "/workspace/_artifacts"
    45  )
    46  
    47  var blobfuseDriver *blobfuse.Driver
    48  
    49  type testCmd struct {
    50  	command  string
    51  	args     []string
    52  	startLog string
    53  	endLog   string
    54  }
    55  
    56  var _ = ginkgo.BeforeSuite(func() {
    57  	// k8s.io/kubernetes/test/e2e/framework requires env KUBECONFIG to be set
    58  	// it does not fall back to defaults
    59  	if os.Getenv(kubeconfigEnvVar) == "" {
    60  		kubeconfig := filepath.Join(os.Getenv("HOME"), ".kube", "config")
    61  		os.Setenv(kubeconfigEnvVar, kubeconfig)
    62  	}
    63  	framework.HandleFlags()
    64  	framework.AfterReadingAllFlags(&framework.TestContext)
    65  
    66  	if testutil.IsRunningInProw() {
    67  		creds, err := credentials.CreateAzureCredentialFile(false)
    68  		gomega.Expect(err).NotTo(gomega.HaveOccurred())
    69  		azureClient, err := azure.GetClient(creds.Cloud, creds.SubscriptionID, creds.AADClientID, creds.TenantID, creds.AADClientSecret)
    70  		gomega.Expect(err).NotTo(gomega.HaveOccurred())
    71  		_, err = azureClient.EnsureResourceGroup(context.Background(), creds.ResourceGroup, creds.Location, nil)
    72  		gomega.Expect(err).NotTo(gomega.HaveOccurred())
    73  
    74  		// Need to login to ACR using SP credential if we are running in Prow so we can push test images.
    75  		// If running locally, user should run 'docker login' before running E2E tests
    76  		registry := os.Getenv("REGISTRY")
    77  		gomega.Expect(registry).NotTo(gomega.Equal(""))
    78  
    79  		log.Println("Attempting docker login with Azure service principal")
    80  		cmd := exec.Command("docker", "login", fmt.Sprintf("--username=%s", creds.AADClientID), fmt.Sprintf("--password=%s", creds.AADClientSecret), registry)
    81  		err = cmd.Run()
    82  		gomega.Expect(err).NotTo(gomega.HaveOccurred())
    83  		log.Println("docker login is successful")
    84  
    85  		// Install Blobfuse CSI Driver on cluster from project root
    86  		e2eBootstrap := testCmd{
    87  			command:  "make",
    88  			args:     []string{"e2e-bootstrap"},
    89  			startLog: "Installing Blobfuse CSI Driver...",
    90  			endLog:   "Blobfuse CSI Driver installed",
    91  		}
    92  		execTestCmd([]testCmd{e2eBootstrap})
    93  
    94  	}
    95  	nodeid := os.Getenv("nodeid")
    96  	kubeconfig := os.Getenv(kubeconfigEnvVar)
    97  	blobfuseDriver = blobfuse.NewDriver(nodeid)
    98  	go func() {
    99  		os.Setenv("AZURE_CREDENTIAL_FILE", credentials.TempAzureCredentialFilePath)
   100  		blobfuseDriver.Run(fmt.Sprintf("unix:///tmp/csi-%s.sock", uuid.NewUUID().String()), kubeconfig)
   101  	}()
   102  })
   103  
   104  var _ = ginkgo.AfterSuite(func() {
   105  	if testutil.IsRunningInProw() {
   106  		blobfuseLog := testCmd{
   107  			command:  "bash",
   108  			args:     []string{"test/utils/blobfuse_log.sh"},
   109  			startLog: "===================blobfuse log===================",
   110  			endLog:   "==================================================",
   111  		}
   112  		e2eTeardown := testCmd{
   113  			command:  "make",
   114  			args:     []string{"e2e-teardown"},
   115  			startLog: "Uninstalling Blobfuse CSI Driver...",
   116  			endLog:   "Blobfuse CSI Driver uninstalled",
   117  		}
   118  		execTestCmd([]testCmd{blobfuseLog, e2eTeardown})
   119  
   120  		// install/uninstall CSI Driver deployment scripts test
   121  		installDriver := testCmd{
   122  			command:  "bash",
   123  			args:     []string{"deploy/install-driver.sh", "master", "local"},
   124  			startLog: "===================install CSI Driver deployment scripts test===================",
   125  			endLog:   "===================================================",
   126  		}
   127  		uninstallDriver := testCmd{
   128  			command:  "bash",
   129  			args:     []string{"deploy/uninstall-driver.sh", "master", "local"},
   130  			startLog: "===================uninstall CSI Driver deployment scripts test===================",
   131  			endLog:   "===================================================",
   132  		}
   133  		execTestCmd([]testCmd{installDriver, uninstallDriver})
   134  
   135  		err := credentials.DeleteAzureCredentialFile()
   136  		gomega.Expect(err).NotTo(gomega.HaveOccurred())
   137  	}
   138  })
   139  
   140  func TestE2E(t *testing.T) {
   141  	gomega.RegisterFailHandler(ginkgo.Fail)
   142  	reportDir := os.Getenv(reportDirEnv)
   143  	if reportDir == "" {
   144  		reportDir = defaultReportDir
   145  	}
   146  	r := []ginkgo.Reporter{reporters.NewJUnitReporter(path.Join(reportDir, "junit_01.xml"))}
   147  	ginkgo.RunSpecsWithDefaultAndCustomReporters(t, "Blobfuse CSI Driver End-to-End Tests", r)
   148  }
   149  
   150  func execTestCmd(cmds []testCmd) {
   151  	err := os.Chdir("../..")
   152  	gomega.Expect(err).NotTo(gomega.HaveOccurred())
   153  	defer func() {
   154  		err := os.Chdir("test/e2e")
   155  		gomega.Expect(err).NotTo(gomega.HaveOccurred())
   156  	}()
   157  
   158  	projectRoot, err := os.Getwd()
   159  	gomega.Expect(err).NotTo(gomega.HaveOccurred())
   160  	gomega.Expect(strings.HasSuffix(projectRoot, "blobfuse-csi-driver")).To(gomega.Equal(true))
   161  
   162  	for _, cmd := range cmds {
   163  		log.Println(cmd.startLog)
   164  		cmdSh := exec.Command(cmd.command, cmd.args...)
   165  		cmdSh.Dir = projectRoot
   166  		cmdSh.Stdout = os.Stdout
   167  		cmdSh.Stderr = os.Stderr
   168  		err = cmdSh.Run()
   169  		gomega.Expect(err).NotTo(gomega.HaveOccurred())
   170  		log.Println(cmd.endLog)
   171  	}
   172  }