in internal/components/setup/kind.go [157:255]
func KindSetup(e2eConfig *config.E2EConfig) error {
kindConfigPath = e2eConfig.Setup.GetFile()
kubeConfigPath = e2eConfig.Setup.GetKubeconfig()
if kindConfigPath == "" && kubeConfigPath == "" {
return fmt.Errorf("no kind config file and kubeconfig file was provided")
}
if kindConfigPath != "" && kubeConfigPath != "" {
return fmt.Errorf("the kind config file and kubeconfig file cannot be provided at the same time")
}
steps := e2eConfig.Setup.Steps
// if no steps was provided, then no need to create the cluster.
if steps == nil {
logger.Log.Info("no steps is provided")
return nil
}
// export env file
if e2eConfig.Setup.InitSystemEnvironment != "" {
profilePath := util.ResolveAbs(e2eConfig.Setup.InitSystemEnvironment)
util.ExportEnvVars(profilePath)
}
// if there is an existing cluster, don't create a new kind cluster here.
if kubeConfigPath == "" {
if err := createKindCluster(kindConfigPath, e2eConfig); err != nil {
return err
}
} else {
// export the kubeconfig path for command line
err := os.Setenv("KUBECONFIG", kubeConfigPath)
if err != nil {
return fmt.Errorf("could not export kubeconfig file path, %v", err)
}
logger.Log.Infof("export KUBECONFIG=%s", kubeConfigPath)
}
// import images
if len(e2eConfig.Setup.Kind.ImportImages) > 0 {
images := make([]string, 0, len(e2eConfig.Setup.Kind.ImportImages))
for _, image := range e2eConfig.Setup.Kind.ImportImages {
images = append(images, os.ExpandEnv(image))
}
// pull images if this image not exist
if err := pullImages(context.Background(), images); err != nil {
return err
}
for _, image := range images {
args := []string{"load", "docker-image", image}
logger.Log.Infof("import docker images: %s", image)
if err := kind.Run(kindcmd.NewLogger(), kindcmd.StandardIOStreams(), args); err != nil {
return err
}
}
}
cluster, err := util.ConnectToK8sCluster(kubeConfigPath)
if err != nil {
logger.Log.Errorf("connect to k8s cluster failed according to config file: %s", kubeConfigPath)
return err
}
listener := NewKindContainerListener(context.Background(), cluster)
defer listener.Stop()
err = listener.Listen(func(pod *v1.Pod) {
if err = exposePerContainerLog(cluster, pod, e2eConfig.Setup.GetTimeout()); err != nil {
logger.Log.Warnf("export kubernetes pod log failure: %v", err)
}
})
if err != nil {
logger.Log.Warnf("listen kubernetes pod event failure: %v", err)
}
// run steps
err = RunStepsAndWait(e2eConfig.Setup.Steps, e2eConfig.Setup.GetTimeout(), cluster)
if err != nil {
logger.Log.Errorf("execute steps error: %v", err)
return err
}
// expose logs
if err = exposeLogs(cluster, listener, e2eConfig.Setup.GetTimeout()); err != nil {
logger.Log.Errorf("export logs error: %v", err)
return err
}
// expose ports
err = exposeKindService(e2eConfig.Setup.Kind.ExposePorts, e2eConfig.Setup.GetTimeout(), cluster)
if err != nil {
logger.Log.Errorf("export ports error: %v", err)
return err
}
return nil
}