Files
k3k/cli/cmds/cluster_create_flags.go
T

85 lines
3.9 KiB
Go

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
}