package cmds import ( "errors" "time" "github.com/sirupsen/logrus" "github.com/spf13/cobra" "k8s.io/apimachinery/pkg/api/resource" "github.com/rancher/k3k/pkg/apis/k3k.io/v1beta1" ) func createFlags(cmd *cobra.Command, cfg *CreateConfig) { cmd.Flags().IntVar(&cfg.servers, "servers", 1, "number of servers") cmd.Flags().IntVar(&cfg.agents, "agents", 0, "number of agents") cmd.Flags().StringVar(&cfg.token, "token", "", "token of the cluster") cmd.Flags().StringVar(&cfg.clusterCIDR, "cluster-cidr", "", "cluster CIDR") cmd.Flags().StringVar(&cfg.serviceCIDR, "service-cidr", "", "service CIDR") cmd.Flags().BoolVar(&cfg.mirrorHostNodes, "mirror-host-nodes", false, "Mirror Host Cluster Nodes") cmd.Flags().StringVar(&cfg.persistenceType, "persistence-type", string(v1beta1.DynamicPersistenceMode), "persistence mode for the nodes (dynamic, ephemeral)") cmd.Flags().StringVar(&cfg.storageClassName, "storage-class-name", "", "storage class name for dynamic persistence type") cmd.Flags().StringVar(&cfg.storageRequestSize, "storage-request-size", "", "storage size for dynamic persistence type") cmd.Flags().StringSliceVar(&cfg.serverArgs, "server-args", []string{}, "servers extra arguments") cmd.Flags().StringSliceVar(&cfg.agentArgs, "agent-args", []string{}, "agents extra arguments") cmd.Flags().StringSliceVar(&cfg.serverEnvs, "server-envs", []string{}, "servers extra Envs") cmd.Flags().StringSliceVar(&cfg.agentEnvs, "agent-envs", []string{}, "agents extra Envs") cmd.Flags().StringSliceVar(&cfg.tlsSANs, "tls-sans", []string{}, "additional Subject Alternative Names for the cluster server TLS certificate") cmd.Flags().StringArrayVar(&cfg.labels, "labels", []string{}, "Labels to add to the cluster object (e.g. key=value)") cmd.Flags().StringArrayVar(&cfg.annotations, "annotations", []string{}, "Annotations to add to the cluster object (e.g. key=value)") cmd.Flags().StringVar(&cfg.version, "version", "", "k3s version") cmd.Flags().StringVar(&cfg.mode, "mode", "shared", "k3k mode type (shared, virtual, hcp)") cmd.Flags().StringVar(&cfg.kubeconfigServerHost, "kubeconfig-server", "", "override the kubeconfig server host") cmd.Flags().StringVar(&cfg.policy, "policy", "", "The policy to create the cluster in") cmd.Flags().StringVar(&cfg.customCertsPath, "custom-certs", "", "The path for custom certificate directory") cmd.Flags().DurationVar(&cfg.timeout, "timeout", 3*time.Minute, "The timeout for waiting for the cluster to become ready (e.g., 10s, 5m, 1h).") mustRegisterFlagCompletion(cmd, "mode", completeClusterMode) mustRegisterFlagCompletion(cmd, "persistence-type", completePersistenceMode) mustRegisterFlagCompletion(cmd, "policy", completePolicyNames) if err := cmd.MarkFlagDirname("custom-certs"); err != nil { logrus.Fatal(err) } } var validPersistenceModes = map[v1beta1.PersistenceMode]struct{}{ v1beta1.EphemeralPersistenceMode: {}, v1beta1.DynamicPersistenceMode: {}, } var validClusterModes = map[v1beta1.ClusterMode]struct{}{ v1beta1.VirtualClusterMode: {}, v1beta1.SharedClusterMode: {}, v1beta1.HCPClusterMode: {}, } func validateCreateConfig(cfg *CreateConfig) error { if cfg.servers <= 0 { return errors.New("invalid number of servers: must be 1 or more") } if cfg.persistenceType != "" { persistenceMode := v1beta1.PersistenceMode(cfg.persistenceType) if _, found := validPersistenceModes[persistenceMode]; !found { return errors.New(`persistence-type should be one of "dynamic" or "ephemeral"`) } } if cfg.storageRequestSize != "" { if _, err := resource.ParseQuantity(cfg.storageRequestSize); err != nil { return errors.New(`invalid storage size, should be a valid resource quantity e.g "10Gi"`) } } if cfg.mode != "" { clusterMode := v1beta1.ClusterMode(cfg.mode) if _, found := validClusterModes[clusterMode]; !found { return errors.New(`mode should be one of "shared", "virtual" or "hcp"`) } } return nil }