mirror of https://github.com/dapr/cli.git
add --dev flag for k8s init and uninstall
Signed-off-by: Mukundan Sundararajan <65565396+mukundansundar@users.noreply.github.com>
This commit is contained in:
parent
31b9ea27ae
commit
83ee33fd9a
|
|
@ -33,6 +33,7 @@ var (
|
||||||
wait bool
|
wait bool
|
||||||
timeout uint
|
timeout uint
|
||||||
slimMode bool
|
slimMode bool
|
||||||
|
devMode bool
|
||||||
runtimeVersion string
|
runtimeVersion string
|
||||||
dashboardVersion string
|
dashboardVersion string
|
||||||
allNamespaces bool
|
allNamespaces bool
|
||||||
|
|
@ -127,6 +128,7 @@ dapr init --runtime-path <path-to-install-directory>
|
||||||
DashboardVersion: dashboardVersion,
|
DashboardVersion: dashboardVersion,
|
||||||
EnableMTLS: enableMTLS,
|
EnableMTLS: enableMTLS,
|
||||||
EnableHA: enableHA,
|
EnableHA: enableHA,
|
||||||
|
EnableDev: devMode,
|
||||||
Args: values,
|
Args: values,
|
||||||
Wait: wait,
|
Wait: wait,
|
||||||
Timeout: timeout,
|
Timeout: timeout,
|
||||||
|
|
@ -202,6 +204,7 @@ func init() {
|
||||||
defaultContainerRuntime := string(utils.DOCKER)
|
defaultContainerRuntime := string(utils.DOCKER)
|
||||||
|
|
||||||
InitCmd.Flags().BoolVarP(&kubernetesMode, "kubernetes", "k", false, "Deploy Dapr to a Kubernetes cluster")
|
InitCmd.Flags().BoolVarP(&kubernetesMode, "kubernetes", "k", false, "Deploy Dapr to a Kubernetes cluster")
|
||||||
|
InitCmd.Flags().BoolVarP(&devMode, "dev", "", false, "Use Dev mode. Deploy Redis, Zipkin alson in the Kubernetes cluster")
|
||||||
InitCmd.Flags().BoolVarP(&wait, "wait", "", false, "Wait for Kubernetes initialization to complete")
|
InitCmd.Flags().BoolVarP(&wait, "wait", "", false, "Wait for Kubernetes initialization to complete")
|
||||||
InitCmd.Flags().UintVarP(&timeout, "timeout", "", 300, "The wait timeout for the Kubernetes installation")
|
InitCmd.Flags().UintVarP(&timeout, "timeout", "", 300, "The wait timeout for the Kubernetes installation")
|
||||||
InitCmd.Flags().BoolVarP(&slimMode, "slim", "s", false, "Exclude placement service, Redis and Zipkin containers from self-hosted installation")
|
InitCmd.Flags().BoolVarP(&slimMode, "slim", "s", false, "Exclude placement service, Redis and Zipkin containers from self-hosted installation")
|
||||||
|
|
|
||||||
|
|
@ -30,6 +30,7 @@ import (
|
||||||
var (
|
var (
|
||||||
uninstallNamespace string
|
uninstallNamespace string
|
||||||
uninstallKubernetes bool
|
uninstallKubernetes bool
|
||||||
|
uninstallDev bool
|
||||||
uninstallAll bool
|
uninstallAll bool
|
||||||
uninstallContainerRuntime string
|
uninstallContainerRuntime string
|
||||||
)
|
)
|
||||||
|
|
@ -66,7 +67,7 @@ dapr uninstall --runtime-path <path-to-install-directory>
|
||||||
}
|
}
|
||||||
|
|
||||||
print.InfoStatusEvent(os.Stdout, "Removing Dapr from your cluster...")
|
print.InfoStatusEvent(os.Stdout, "Removing Dapr from your cluster...")
|
||||||
err = kubernetes.Uninstall(uninstallNamespace, uninstallAll, timeout)
|
err = kubernetes.Uninstall(uninstallNamespace, uninstallAll, uninstallDev, timeout)
|
||||||
} else {
|
} else {
|
||||||
if !utils.IsValidContainerRuntime(uninstallContainerRuntime) {
|
if !utils.IsValidContainerRuntime(uninstallContainerRuntime) {
|
||||||
print.FailureStatusEvent(os.Stdout, "Invalid container runtime. Supported values are docker and podman.")
|
print.FailureStatusEvent(os.Stdout, "Invalid container runtime. Supported values are docker and podman.")
|
||||||
|
|
@ -87,6 +88,7 @@ dapr uninstall --runtime-path <path-to-install-directory>
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
UninstallCmd.Flags().BoolVarP(&uninstallKubernetes, "kubernetes", "k", false, "Uninstall Dapr from a Kubernetes cluster")
|
UninstallCmd.Flags().BoolVarP(&uninstallKubernetes, "kubernetes", "k", false, "Uninstall Dapr from a Kubernetes cluster")
|
||||||
|
UninstallCmd.Flags().BoolVarP(&uninstallDev, "dev", "", false, "Uninstall Dapr Redis and Zipking installations from Kubernetes cluster")
|
||||||
UninstallCmd.Flags().UintVarP(&timeout, "timeout", "", 300, "The timeout for the Kubernetes uninstall")
|
UninstallCmd.Flags().UintVarP(&timeout, "timeout", "", 300, "The timeout for the Kubernetes uninstall")
|
||||||
UninstallCmd.Flags().BoolVar(&uninstallAll, "all", false, "Remove .dapr directory, Redis, Placement and Zipkin containers on local machine, and CRDs on a Kubernetes cluster")
|
UninstallCmd.Flags().BoolVar(&uninstallAll, "all", false, "Remove .dapr directory, Redis, Placement and Zipkin containers on local machine, and CRDs on a Kubernetes cluster")
|
||||||
UninstallCmd.Flags().String("network", "", "The Docker network from which to remove the Dapr runtime")
|
UninstallCmd.Flags().String("network", "", "The Docker network from which to remove the Dapr runtime")
|
||||||
|
|
|
||||||
|
|
@ -36,10 +36,18 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
daprReleaseName = "dapr"
|
daprReleaseName = "dapr"
|
||||||
dashboardReleaseName = "dapr-dashboard"
|
dashboardReleaseName = "dapr-dashboard"
|
||||||
daprHelmRepo = "https://dapr.github.io/helm-charts"
|
thirdPartyDevNamespace = "default"
|
||||||
latestVersion = "latest"
|
zipkinChartName = "zipkin"
|
||||||
|
redisChartName = "redis"
|
||||||
|
zipkinReleaseName = "dapr-dev-zipkin"
|
||||||
|
redisReleaseName = "dapr-dev-redis"
|
||||||
|
redisVersion = "6.2"
|
||||||
|
bitnamiHelmRepo = "https://charts.bitnami.com/bitnami"
|
||||||
|
daprHelmRepo = "https://dapr.github.io/helm-charts"
|
||||||
|
zipkinHelmRepo = "https://openzipkin.github.io/zipkin"
|
||||||
|
latestVersion = "latest"
|
||||||
)
|
)
|
||||||
|
|
||||||
type InitConfiguration struct {
|
type InitConfiguration struct {
|
||||||
|
|
@ -48,6 +56,7 @@ type InitConfiguration struct {
|
||||||
Namespace string
|
Namespace string
|
||||||
EnableMTLS bool
|
EnableMTLS bool
|
||||||
EnableHA bool
|
EnableHA bool
|
||||||
|
EnableDev bool
|
||||||
Args []string
|
Args []string
|
||||||
Wait bool
|
Wait bool
|
||||||
Timeout uint
|
Timeout uint
|
||||||
|
|
@ -60,7 +69,8 @@ type InitConfiguration struct {
|
||||||
|
|
||||||
// Init deploys the Dapr operator using the supplied runtime version.
|
// Init deploys the Dapr operator using the supplied runtime version.
|
||||||
func Init(config InitConfiguration) error {
|
func Init(config InitConfiguration) error {
|
||||||
err := installWithConsole(daprReleaseName, config.Version, "Dapr control plane", config)
|
helmRepoDapr := utils.GetEnv("DAPR_HELM_REPO_URL", daprHelmRepo)
|
||||||
|
err := installWithConsole(daprReleaseName, config.Version, helmRepoDapr, "Dapr control plane", config)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -75,19 +85,53 @@ func Init(config InitConfiguration) error {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
err = installWithConsole(dashboardReleaseName, config.DashboardVersion, "Dapr dashboard", config)
|
err = installWithConsole(dashboardReleaseName, config.DashboardVersion, helmRepoDapr, "Dapr dashboard", config)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if config.EnableDev {
|
||||||
|
redisChartVals := []string{
|
||||||
|
"image.tag=" + redisVersion,
|
||||||
|
}
|
||||||
|
|
||||||
|
err = installThirdPartyWithConsole(redisReleaseName, redisChartName, latestVersion, bitnamiHelmRepo, "Dapr Redis", redisChartVals, config)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
err = installThirdPartyWithConsole(zipkinReleaseName, zipkinChartName, latestVersion, zipkinHelmRepo, "Dapr Zipkin", []string{}, config)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
err = initDevConfigs()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func installWithConsole(releaseName string, releaseVersion string, prettyName string, config InitConfiguration) error {
|
func installThirdPartyWithConsole(releaseName, chartName, releaseVersion, helmRepo string, prettyName string, chartValues []string, config InitConfiguration) error {
|
||||||
installSpinning := print.Spinner(os.Stdout, "Deploying the "+prettyName+" with "+releaseVersion+" version to your cluster...")
|
installSpinning := print.Spinner(os.Stdout, "Deploying the "+prettyName+" with "+releaseVersion+" version to your cluster...")
|
||||||
defer installSpinning(print.Failure)
|
defer installSpinning(print.Failure)
|
||||||
|
|
||||||
err := install(releaseName, releaseVersion, config)
|
// releaseVersion of chart will always be latest version.
|
||||||
|
err := installThirdParty(releaseName, chartName, latestVersion, helmRepo, chartValues, config)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
installSpinning(print.Success)
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func installWithConsole(releaseName, releaseVersion, helmRepo string, prettyName string, config InitConfiguration) error {
|
||||||
|
installSpinning := print.Spinner(os.Stdout, "Deploying the "+prettyName+" with "+releaseVersion+" version to your cluster...")
|
||||||
|
defer installSpinning(print.Failure)
|
||||||
|
|
||||||
|
err := install(releaseName, releaseVersion, helmRepo, config)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -156,9 +200,9 @@ func locateChartFile(dirPath string) (string, error) {
|
||||||
return filepath.Join(dirPath, files[0].Name()), nil
|
return filepath.Join(dirPath, files[0].Name()), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func daprChart(version string, releaseName string, config *helm.Configuration) (*chart.Chart, error) {
|
func getHelmChart(version, releaseName, helmRepo string, config *helm.Configuration) (*chart.Chart, error) {
|
||||||
pull := helm.NewPullWithOpts(helm.WithConfig(config))
|
pull := helm.NewPullWithOpts(helm.WithConfig(config))
|
||||||
pull.RepoURL = utils.GetEnv("DAPR_HELM_REPO_URL", daprHelmRepo)
|
pull.RepoURL = helmRepo
|
||||||
pull.Username = utils.GetEnv("DAPR_HELM_REPO_USERNAME", "")
|
pull.Username = utils.GetEnv("DAPR_HELM_REPO_USERNAME", "")
|
||||||
pull.Password = utils.GetEnv("DAPR_HELM_REPO_PASSWORD", "")
|
pull.Password = utils.GetEnv("DAPR_HELM_REPO_PASSWORD", "")
|
||||||
|
|
||||||
|
|
@ -188,7 +232,7 @@ func daprChart(version string, releaseName string, config *helm.Configuration) (
|
||||||
return loader.Load(chartPath)
|
return loader.Load(chartPath)
|
||||||
}
|
}
|
||||||
|
|
||||||
func chartValues(config InitConfiguration, version string) (map[string]interface{}, error) {
|
func daprChartValues(config InitConfiguration, version string) (map[string]interface{}, error) {
|
||||||
chartVals := map[string]interface{}{}
|
chartVals := map[string]interface{}{}
|
||||||
err := utils.ValidateImageVariant(config.ImageVariant)
|
err := utils.ValidateImageVariant(config.ImageVariant)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
@ -227,7 +271,7 @@ func chartValues(config InitConfiguration, version string) (map[string]interface
|
||||||
return chartVals, nil
|
return chartVals, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func install(releaseName string, releaseVersion string, config InitConfiguration) error {
|
func install(releaseName, releaseVersion, helmRepo string, config InitConfiguration) error {
|
||||||
err := createNamespace(config.Namespace)
|
err := createNamespace(config.Namespace)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
|
@ -238,7 +282,7 @@ func install(releaseName string, releaseVersion string, config InitConfiguration
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
daprChart, err := daprChart(releaseVersion, releaseName, helmConf)
|
daprChart, err := getHelmChart(releaseVersion, releaseName, helmRepo, helmConf)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -261,7 +305,7 @@ func install(releaseName string, releaseVersion string, config InitConfiguration
|
||||||
installClient.Wait = config.Wait
|
installClient.Wait = config.Wait
|
||||||
installClient.Timeout = time.Duration(config.Timeout) * time.Second
|
installClient.Timeout = time.Duration(config.Timeout) * time.Second
|
||||||
|
|
||||||
values, err := chartValues(config, version)
|
values, err := daprChartValues(config, version)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -273,6 +317,38 @@ func install(releaseName string, releaseVersion string, config InitConfiguration
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func installThirdParty(releaseName, chartName, releaseVersion, helmRepo string, chartVals []string, config InitConfiguration) error {
|
||||||
|
helmConf, err := helmConfig(thirdPartyDevNamespace)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
helmChart, err := getHelmChart(releaseVersion, chartName, helmRepo, helmConf)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
installClient := helm.NewInstall(helmConf)
|
||||||
|
installClient.ReleaseName = releaseName
|
||||||
|
installClient.Namespace = thirdPartyDevNamespace
|
||||||
|
installClient.Wait = config.Wait
|
||||||
|
installClient.Timeout = time.Duration(config.Timeout) * time.Second
|
||||||
|
|
||||||
|
values := map[string]interface{}{}
|
||||||
|
|
||||||
|
for _, val := range chartVals {
|
||||||
|
if err = strvals.ParseInto(val, values); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if _, err = installClient.Run(helmChart, values); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func debugLogf(format string, v ...interface{}) {
|
func debugLogf(format string, v ...interface{}) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -290,3 +366,78 @@ func confirmExist(cfg *helm.Configuration, releaseName string) (bool, error) {
|
||||||
|
|
||||||
return true, nil
|
return true, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func checkAndOverWriteFile(filePath string, b []byte) error {
|
||||||
|
_, err := os.Stat(filePath)
|
||||||
|
if os.IsNotExist(err) {
|
||||||
|
// #nosec G306
|
||||||
|
if err = os.WriteFile(filePath, b, 0o644); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func initDevConfigs() error {
|
||||||
|
redisStatestore := `
|
||||||
|
apiVersion: dapr.io/v1alpha1
|
||||||
|
kind: Component
|
||||||
|
metadata:
|
||||||
|
name: daprdevstatestore
|
||||||
|
spec:
|
||||||
|
type: state.redis
|
||||||
|
version: v1
|
||||||
|
metadata:
|
||||||
|
# These settings will work out of the box if you use helm install
|
||||||
|
# bitnami/redis. If you have your own setup, replace
|
||||||
|
# redis-master:6379 with your own Redis master address, and the
|
||||||
|
# Redis password with your own Secret's name. For more information,
|
||||||
|
# see https://docs.dapr.io/operations/components/component-secrets .
|
||||||
|
- name: redisHost
|
||||||
|
value: dapr-dev-redis-master:6379
|
||||||
|
- name: redisPassword
|
||||||
|
secretKeyRef:
|
||||||
|
name: dapr-dev-redis
|
||||||
|
key: redis-password
|
||||||
|
auth:
|
||||||
|
secretStore: kubernetes
|
||||||
|
`
|
||||||
|
|
||||||
|
zipkinConfig := `
|
||||||
|
apiVersion: dapr.io/v1alpha1
|
||||||
|
kind: Configuration
|
||||||
|
metadata:
|
||||||
|
name: daprdevzipkinconfig
|
||||||
|
spec:
|
||||||
|
tracing:
|
||||||
|
samplingRate: "1"
|
||||||
|
zipkin:
|
||||||
|
endpointAddress: "http://dapr-dev-zipkin.default.svc.cluster.local:9411/api/v2/spans"
|
||||||
|
`
|
||||||
|
tempDirPath, err := createTempDir()
|
||||||
|
defer os.RemoveAll(tempDirPath)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
redisPath := filepath.Join(tempDirPath, "redis-statestore.yaml")
|
||||||
|
err = checkAndOverWriteFile(redisPath, []byte(redisStatestore))
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
_, err = utils.RunCmdAndWait("kubectl", "apply", "-f", redisPath)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
zipkinPath := filepath.Join(tempDirPath, "zipkin-config.yaml")
|
||||||
|
err = checkAndOverWriteFile(zipkinPath, []byte(zipkinConfig))
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
_, err = utils.RunCmdAndWait("kubectl", "apply", "-f", zipkinPath)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -112,7 +112,8 @@ func renewCertificate(rootCert, issuerCert, issuerKey []byte, timeout uint, imag
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
daprChart, err := daprChart(daprVersion, "dapr", helmConf)
|
helmRepo := utils.GetEnv("DAPR_HELM_REPO_URL", daprHelmRepo)
|
||||||
|
daprChart, err := getHelmChart(daprVersion, "dapr", helmRepo, helmConf)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -24,7 +24,7 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
// Uninstall removes Dapr from a Kubernetes cluster.
|
// Uninstall removes Dapr from a Kubernetes cluster.
|
||||||
func Uninstall(namespace string, uninstallAll bool, timeout uint) error {
|
func Uninstall(namespace string, uninstallAll bool, uninstallDev bool, timeout uint) error {
|
||||||
config, err := helmConfig(namespace)
|
config, err := helmConfig(namespace)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
|
@ -48,6 +48,11 @@ func Uninstall(namespace string, uninstallAll bool, timeout uint) error {
|
||||||
// Deleting Dashboard here is for versions >= 1.11.
|
// Deleting Dashboard here is for versions >= 1.11.
|
||||||
uninstallClient.Run(dashboardReleaseName)
|
uninstallClient.Run(dashboardReleaseName)
|
||||||
|
|
||||||
|
if uninstallDev {
|
||||||
|
// uninstall dapr-dev-zipkin and dapr-dev-redis as best effort.
|
||||||
|
uninstallThirdParty()
|
||||||
|
}
|
||||||
|
|
||||||
_, err = uninstallClient.Run(daprReleaseName)
|
_, err = uninstallClient.Run(daprReleaseName)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
@ -65,3 +70,14 @@ func Uninstall(namespace string, uninstallAll bool, timeout uint) error {
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func uninstallThirdParty() {
|
||||||
|
print.InfoStatusEvent(os.Stdout, "Removing dapr-dev-redis and dapr-dev-zipkin from the cluster...")
|
||||||
|
// Uninstall dapr-dev-redis and dapr-dev-zipkin from k8s as best effort.
|
||||||
|
config, _ := helmConfig(thirdPartyDevNamespace)
|
||||||
|
|
||||||
|
uninstallClient := helm.NewUninstall(config)
|
||||||
|
|
||||||
|
uninstallClient.Run(redisReleaseName)
|
||||||
|
uninstallClient.Run(zipkinReleaseName)
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -57,6 +57,7 @@ type UpgradeConfig struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func Upgrade(conf UpgradeConfig) error {
|
func Upgrade(conf UpgradeConfig) error {
|
||||||
|
helmRepo := utils.GetEnv("DAPR_HELM_REPO_URL", daprHelmRepo)
|
||||||
status, err := GetDaprResourcesStatus()
|
status, err := GetDaprResourcesStatus()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
|
@ -75,7 +76,7 @@ func Upgrade(conf UpgradeConfig) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
controlPlaneChart, err := daprChart(conf.RuntimeVersion, "dapr", helmConf)
|
controlPlaneChart, err := getHelmChart(conf.RuntimeVersion, "dapr", helmRepo, helmConf)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -109,7 +110,7 @@ func Upgrade(conf UpgradeConfig) error {
|
||||||
|
|
||||||
var dashboardChart *chart.Chart
|
var dashboardChart *chart.Chart
|
||||||
if conf.DashboardVersion != "" {
|
if conf.DashboardVersion != "" {
|
||||||
dashboardChart, err = daprChart(conf.DashboardVersion, dashboardReleaseName, helmConf)
|
dashboardChart, err = getHelmChart(conf.DashboardVersion, dashboardReleaseName, helmRepo, helmConf)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -176,7 +177,7 @@ func Upgrade(conf UpgradeConfig) error {
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// We need to install Dashboard since it does not exist yet.
|
// We need to install Dashboard since it does not exist yet.
|
||||||
err = install(dashboardReleaseName, conf.DashboardVersion, InitConfiguration{
|
err = install(dashboardReleaseName, conf.DashboardVersion, helmRepo, InitConfiguration{
|
||||||
DashboardVersion: conf.DashboardVersion,
|
DashboardVersion: conf.DashboardVersion,
|
||||||
Namespace: upgradeClient.Namespace,
|
Namespace: upgradeClient.Namespace,
|
||||||
Wait: upgradeClient.Wait,
|
Wait: upgradeClient.Wait,
|
||||||
|
|
|
||||||
|
|
@ -48,6 +48,10 @@ const (
|
||||||
|
|
||||||
numHAPods = 13
|
numHAPods = 13
|
||||||
numNonHAPods = 5
|
numNonHAPods = 5
|
||||||
|
|
||||||
|
thirdPartyDevNamespace = "default"
|
||||||
|
devRedisReleaseName = "dapr-dev-redis"
|
||||||
|
devZipkinReleaseName = "dapr-dev-zipkin"
|
||||||
)
|
)
|
||||||
|
|
||||||
type VersionDetails struct {
|
type VersionDetails struct {
|
||||||
|
|
@ -61,6 +65,7 @@ type VersionDetails struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
type TestOptions struct {
|
type TestOptions struct {
|
||||||
|
DevEnabled bool
|
||||||
HAEnabled bool
|
HAEnabled bool
|
||||||
MTLSEnabled bool
|
MTLSEnabled bool
|
||||||
ApplyComponentChanges bool
|
ApplyComponentChanges bool
|
||||||
|
|
@ -189,7 +194,7 @@ func GetTestsOnInstall(details VersionDetails, opts TestOptions) []TestCase {
|
||||||
|
|
||||||
func GetTestsOnUninstall(details VersionDetails, opts TestOptions) []TestCase {
|
func GetTestsOnUninstall(details VersionDetails, opts TestOptions) []TestCase {
|
||||||
return []TestCase{
|
return []TestCase{
|
||||||
{"uninstall " + details.RuntimeVersion, uninstallTest(opts.UninstallAll)}, // waits for pod deletion.
|
{"uninstall " + details.RuntimeVersion, uninstallTest(opts.UninstallAll, opts.DevEnabled)}, // waits for pod deletion.
|
||||||
{"cluster not exist", kubernetesTestOnUninstall()},
|
{"cluster not exist", kubernetesTestOnUninstall()},
|
||||||
{"crds exist on uninstall " + details.RuntimeVersion, CRDTest(details, opts)},
|
{"crds exist on uninstall " + details.RuntimeVersion, CRDTest(details, opts)},
|
||||||
{"clusterroles not exist " + details.RuntimeVersion, ClusterRolesTest(details, opts)},
|
{"clusterroles not exist " + details.RuntimeVersion, ClusterRolesTest(details, opts)},
|
||||||
|
|
@ -747,6 +752,10 @@ func installTest(details VersionDetails, opts TestOptions) func(t *testing.T) {
|
||||||
"-n", DaprTestNamespace,
|
"-n", DaprTestNamespace,
|
||||||
"--log-as-json",
|
"--log-as-json",
|
||||||
}
|
}
|
||||||
|
if opts.DevEnabled {
|
||||||
|
t.Log("install dev mode")
|
||||||
|
args = append(args, "--dev")
|
||||||
|
}
|
||||||
if !details.UseDaprLatestVersion {
|
if !details.UseDaprLatestVersion {
|
||||||
// TODO: Pass dashboard-version also when charts are released.
|
// TODO: Pass dashboard-version also when charts are released.
|
||||||
args = append(args, "--runtime-version", details.RuntimeVersion)
|
args = append(args, "--runtime-version", details.RuntimeVersion)
|
||||||
|
|
@ -776,10 +785,13 @@ func installTest(details VersionDetails, opts TestOptions) func(t *testing.T) {
|
||||||
require.NoError(t, err, "init failed")
|
require.NoError(t, err, "init failed")
|
||||||
|
|
||||||
validatePodsOnInstallUpgrade(t, details)
|
validatePodsOnInstallUpgrade(t, details)
|
||||||
|
if opts.DevEnabled {
|
||||||
|
validateThirdpartyPodsOnInit(t)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func uninstallTest(all bool) func(t *testing.T) {
|
func uninstallTest(all bool, devEnabled bool) func(t *testing.T) {
|
||||||
return func(t *testing.T) {
|
return func(t *testing.T) {
|
||||||
output, err := EnsureUninstall(all)
|
output, err := EnsureUninstall(all)
|
||||||
t.Log(output)
|
t.Log(output)
|
||||||
|
|
@ -792,11 +804,23 @@ func uninstallTest(all bool) func(t *testing.T) {
|
||||||
go waitPodDeletion(t, done, podsDeleted)
|
go waitPodDeletion(t, done, podsDeleted)
|
||||||
select {
|
select {
|
||||||
case <-podsDeleted:
|
case <-podsDeleted:
|
||||||
t.Log("pods were deleted as expected on uninstall")
|
t.Log("dapr pods were deleted as expected on uninstall")
|
||||||
return
|
|
||||||
case <-time.After(2 * time.Minute):
|
case <-time.After(2 * time.Minute):
|
||||||
done <- struct{}{}
|
done <- struct{}{}
|
||||||
t.Error("timeout verifying pods were deleted as expectedx")
|
t.Error("timeout verifying pods were deleted as expected")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if devEnabled {
|
||||||
|
t.Log("waiting for dapr dev pods to be deleted")
|
||||||
|
go waitPodDeletionDev(t, done, podsDeleted)
|
||||||
|
select {
|
||||||
|
case <-podsDeleted:
|
||||||
|
t.Log("dapr dev pods were deleted as expected on uninstall dev")
|
||||||
|
return
|
||||||
|
case <-time.After(2 * time.Minute):
|
||||||
|
done <- struct{}{}
|
||||||
|
t.Error("timeout verifying pods were deleted as expected")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -943,6 +967,41 @@ func httpEndpointOutputCheck(t *testing.T, output string) {
|
||||||
assert.Contains(t, output, "httpendpoint")
|
assert.Contains(t, output, "httpendpoint")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func validateThirdpartyPodsOnInit(t *testing.T) {
|
||||||
|
ctx := context.Background()
|
||||||
|
ctxt, cancel := context.WithTimeout(ctx, 10*time.Second)
|
||||||
|
defer cancel()
|
||||||
|
k8sClient, err := getClient()
|
||||||
|
require.NoError(t, err)
|
||||||
|
list, err := k8sClient.CoreV1().Pods(thirdPartyDevNamespace).List(ctxt, v1.ListOptions{
|
||||||
|
Limit: 100,
|
||||||
|
})
|
||||||
|
require.NoError(t, err)
|
||||||
|
notFound := map[string]struct{}{
|
||||||
|
devRedisReleaseName: {},
|
||||||
|
devZipkinReleaseName: {},
|
||||||
|
}
|
||||||
|
prefixes := map[string]string{
|
||||||
|
devRedisReleaseName: "dapr-dev-redis-master-",
|
||||||
|
devZipkinReleaseName: "dapr-dev-zipkin-",
|
||||||
|
}
|
||||||
|
for _, pod := range list.Items {
|
||||||
|
t.Log(pod.ObjectMeta.Name)
|
||||||
|
for component, prefix := range prefixes {
|
||||||
|
if pod.Status.Phase != core_v1.PodRunning {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if !pod.Status.ContainerStatuses[0].Ready {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if strings.HasPrefix(pod.ObjectMeta.Name, prefix) {
|
||||||
|
delete(notFound, component)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
assert.Empty(t, notFound)
|
||||||
|
}
|
||||||
|
|
||||||
func validatePodsOnInstallUpgrade(t *testing.T, details VersionDetails) {
|
func validatePodsOnInstallUpgrade(t *testing.T, details VersionDetails) {
|
||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
ctxt, cancel := context.WithTimeout(ctx, 10*time.Second)
|
ctxt, cancel := context.WithTimeout(ctx, 10*time.Second)
|
||||||
|
|
@ -1010,6 +1069,52 @@ func validatePodsOnInstallUpgrade(t *testing.T, details VersionDetails) {
|
||||||
assert.Empty(t, notFound)
|
assert.Empty(t, notFound)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func waitPodDeletionDev(t *testing.T, done, podsDeleted chan struct{}) {
|
||||||
|
for {
|
||||||
|
select {
|
||||||
|
case <-done: // if timeout was reached.
|
||||||
|
return
|
||||||
|
default:
|
||||||
|
break
|
||||||
|
}
|
||||||
|
ctx := context.Background()
|
||||||
|
ctxt, cancel := context.WithTimeout(ctx, 10*time.Second)
|
||||||
|
defer cancel()
|
||||||
|
k8sClient, err := getClient()
|
||||||
|
require.NoError(t, err, "error getting k8s client for pods check")
|
||||||
|
list, err := k8sClient.CoreV1().Pods(thirdPartyDevNamespace).List(ctxt, v1.ListOptions{
|
||||||
|
Limit: 100,
|
||||||
|
})
|
||||||
|
require.NoError(t, err)
|
||||||
|
found := map[string]struct{}{
|
||||||
|
devRedisReleaseName: {},
|
||||||
|
devZipkinReleaseName: {},
|
||||||
|
}
|
||||||
|
prefixes := map[string]string{
|
||||||
|
devRedisReleaseName: "dapr-dev-redis-master-",
|
||||||
|
devZipkinReleaseName: "dapr-dev-zipkin-",
|
||||||
|
}
|
||||||
|
for _, pod := range list.Items {
|
||||||
|
t.Log(pod.ObjectMeta.Name)
|
||||||
|
for component, prefix := range prefixes {
|
||||||
|
if pod.Status.Phase != core_v1.PodRunning {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if !pod.Status.ContainerStatuses[0].Ready {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if strings.HasPrefix(pod.ObjectMeta.Name, prefix) {
|
||||||
|
delete(found, component)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if len(found) == 2 {
|
||||||
|
podsDeleted <- struct{}{}
|
||||||
|
}
|
||||||
|
time.Sleep(15 * time.Second)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func waitPodDeletion(t *testing.T, done, podsDeleted chan struct{}) {
|
func waitPodDeletion(t *testing.T, done, podsDeleted chan struct{}) {
|
||||||
for {
|
for {
|
||||||
select {
|
select {
|
||||||
|
|
|
||||||
|
|
@ -118,6 +118,39 @@ func TestKubernetesHAModeMTLSDisabled(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestKubernetesDev(t *testing.T) {
|
||||||
|
// ensure clean env for test
|
||||||
|
ensureCleanEnv(t, false)
|
||||||
|
|
||||||
|
// setup tests
|
||||||
|
tests := []common.TestCase{}
|
||||||
|
tests = append(tests, common.GetTestsOnInstall(currentVersionDetails, common.TestOptions{
|
||||||
|
DevEnabled: true,
|
||||||
|
HAEnabled: false,
|
||||||
|
MTLSEnabled: true,
|
||||||
|
ApplyComponentChanges: true,
|
||||||
|
CheckResourceExists: map[common.Resource]bool{
|
||||||
|
common.CustomResourceDefs: true,
|
||||||
|
common.ClusterRoles: true,
|
||||||
|
common.ClusterRoleBindings: true,
|
||||||
|
},
|
||||||
|
})...)
|
||||||
|
|
||||||
|
tests = append(tests, common.GetTestsOnUninstall(currentVersionDetails, common.TestOptions{
|
||||||
|
DevEnabled: true,
|
||||||
|
CheckResourceExists: map[common.Resource]bool{
|
||||||
|
common.CustomResourceDefs: true,
|
||||||
|
common.ClusterRoles: false,
|
||||||
|
common.ClusterRoleBindings: false,
|
||||||
|
},
|
||||||
|
})...)
|
||||||
|
|
||||||
|
// execute tests
|
||||||
|
for _, tc := range tests {
|
||||||
|
t.Run(tc.Name, tc.Callable)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestKubernetesNonHAModeMTLSEnabled(t *testing.T) {
|
func TestKubernetesNonHAModeMTLSEnabled(t *testing.T) {
|
||||||
// ensure clean env for test
|
// ensure clean env for test
|
||||||
ensureCleanEnv(t, false)
|
ensureCleanEnv(t, false)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue