diff --git a/cmd/kops/validate_cluster.go b/cmd/kops/validate_cluster.go index feca3f97c4..7960684587 100644 --- a/cmd/kops/validate_cluster.go +++ b/cmd/kops/validate_cluster.go @@ -66,11 +66,13 @@ type ValidateClusterOptions struct { output string wait time.Duration count int + interval time.Duration kubeconfig string } func (o *ValidateClusterOptions) InitDefaults() { o.output = OutputTable + o.interval = 10 * time.Second } func NewCmdValidateCluster(f *util.Factory, out io.Writer) *cobra.Command { @@ -105,6 +107,7 @@ func NewCmdValidateCluster(f *util.Factory, out io.Writer) *cobra.Command { }) cmd.Flags().DurationVar(&options.wait, "wait", options.wait, "Amount of time to wait for the cluster to become ready") cmd.Flags().IntVar(&options.count, "count", options.count, "Number of consecutive successful validations required") + cmd.Flags().DurationVar(&options.interval, "interval", options.interval, "Time in duration to wait between validation attempts") cmd.Flags().StringVar(&options.kubeconfig, "kubeconfig", "", "Path to the kubeconfig file") return cmd @@ -164,7 +167,6 @@ func RunValidateCluster(ctx context.Context, f *util.Factory, out io.Writer, opt } timeout := time.Now().Add(options.wait) - pollInterval := 10 * time.Second validator, err := validation.NewClusterValidator(cluster, cloud, list, config.Host, k8sClient) if err != nil { @@ -182,7 +184,7 @@ func RunValidateCluster(ctx context.Context, f *util.Factory, out io.Writer, opt consecutive = 0 if options.wait > 0 { klog.Warningf("(will retry): unexpected error during validation: %v", err) - time.Sleep(pollInterval) + time.Sleep(options.interval) continue } else { return nil, fmt.Errorf("unexpected error during validation: %v", err) @@ -219,7 +221,7 @@ func RunValidateCluster(ctx context.Context, f *util.Factory, out io.Writer, opt if consecutive < options.count { klog.Infof("(will retry): cluster passed validation %d consecutive times", consecutive) if options.wait > 0 { - time.Sleep(pollInterval) + time.Sleep(options.interval) continue } else { return nil, fmt.Errorf("cluster passed validation %d consecutive times", consecutive) @@ -231,7 +233,7 @@ func RunValidateCluster(ctx context.Context, f *util.Factory, out io.Writer, opt if options.wait > 0 { klog.Warningf("(will retry): cluster not yet healthy") consecutive = 0 - time.Sleep(pollInterval) + time.Sleep(options.interval) continue } else { return nil, fmt.Errorf("cluster not yet healthy") diff --git a/docs/cli/kops_validate_cluster.md b/docs/cli/kops_validate_cluster.md index 993b6103ad..0a62e5263f 100644 --- a/docs/cli/kops_validate_cluster.md +++ b/docs/cli/kops_validate_cluster.md @@ -31,6 +31,7 @@ kops validate cluster [CLUSTER] [flags] ``` --count int Number of consecutive successful validations required -h, --help help for cluster + --interval duration Time in duration to wait between validation attempts (default 10s) --kubeconfig string Path to the kubeconfig file -o, --output string Output format. One of json|yaml|table. (default "table") --wait duration Amount of time to wait for the cluster to become ready diff --git a/tests/e2e/kubetest2-kops/deployer/deployer.go b/tests/e2e/kubetest2-kops/deployer/deployer.go index 7980963ba5..67a929bb8f 100644 --- a/tests/e2e/kubetest2-kops/deployer/deployer.go +++ b/tests/e2e/kubetest2-kops/deployer/deployer.go @@ -65,7 +65,9 @@ type deployer struct { ControlPlaneIGOverrides []string `flag:"control-plane-instance-group-overrides" desc:"overrides for the control plane instance groups"` NodeIGOverrides []string `flag:"node-instance-group-overrides" desc:"overrides for the node instance groups"` - ValidationWait time.Duration `flag:"validation-wait" desc:"time to wait for newly created cluster to pass validation"` + ValidationWait time.Duration `flag:"validation-wait" desc:"time to wait for newly created cluster to pass validation"` + ValidationCount int `flag:"validation-count" desc:"how many times should a validation pass"` + ValidationInterval time.Duration `flag:"validation-interval" desc:"time in duration to wait between validation attempts"` TemplatePath string `flag:"template-path" desc:"The path to the manifest template used for cluster creation"` @@ -109,13 +111,15 @@ func (d *deployer) Provider() string { // New implements deployer.New for kops func New(opts types.Options) (types.Deployer, *pflag.FlagSet) { - // create a deployer object and set fields that are not flag controlled + // create a deployer object and set fields that are not flag controlled, and default values d := &deployer{ commonOptions: opts, BuildOptions: &builder.BuildOptions{ BuildKubernetes: false, }, boskosHeartbeatClose: make(chan struct{}), + ValidationCount: 10, + ValidationInterval: 10 * time.Second, } dir, err := defaultArtifactsDir() diff --git a/tests/e2e/kubetest2-kops/deployer/dumplogs.go b/tests/e2e/kubetest2-kops/deployer/dumplogs.go index 66b8ee7488..01e093f3de 100644 --- a/tests/e2e/kubetest2-kops/deployer/dumplogs.go +++ b/tests/e2e/kubetest2-kops/deployer/dumplogs.go @@ -163,7 +163,10 @@ func (d *deployer) dumpClusterInfo() error { "leases", "persistentvolumeclaims", "poddisruptionbudgets", + "podmonitors", + "statefulsets", "serviceaccounts", + "servicemonitors", "rolebindings", "roles", } @@ -199,6 +202,11 @@ func (d *deployer) dumpClusterInfo() error { } } } + // cleanup zero byte files + cmd = exec.Command("find", d.ArtifactsDir, "-size", "0", "-print", "-delete", "-o") + if err := cmd.Run(); err != nil { + dumpErr = errors.Join(dumpErr, err) + } return dumpErr } diff --git a/tests/e2e/kubetest2-kops/deployer/up.go b/tests/e2e/kubetest2-kops/deployer/up.go index bc824b1b89..843705ba7b 100644 --- a/tests/e2e/kubetest2-kops/deployer/up.go +++ b/tests/e2e/kubetest2-kops/deployer/up.go @@ -21,6 +21,7 @@ import ( "fmt" osexec "os/exec" "path" + "strconv" "strings" "time" @@ -290,7 +291,8 @@ func (d *deployer) IsUp() (bool, error) { args := []string{ d.KopsBinaryPath, "validate", "cluster", "--name", d.ClusterName, - "--count", "10", + "--count", strconv.Itoa(d.ValidationCount), + "--interval", d.ValidationInterval.String(), "--wait", wait.String(), } klog.Info(strings.Join(args, " "))