func KindSetup()

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
}