diff --git a/cli/commands.go b/cli/commands.go index c342a6011..5e8c76026 100644 --- a/cli/commands.go +++ b/cli/commands.go @@ -24,6 +24,37 @@ import ( ) const defaultRegistry = "docker.io" +const clusterNameMaxSize int = 35 + +// Make sure a cluster name is also a valid host name according to RFC 1123. +// We further restrict the length of the cluster name to shorter than 'clusterNameMaxSize' +// so that we can construct the host names based on the cluster name, and still stay +// within the 64 characters limit. +func checkClusterName(name string) error { + if len(name) > clusterNameMaxSize { + return fmt.Errorf("cluster name is too long") + } + + if name[0] == '-' || name[len(name) - 1] == '-' { + return fmt.Errorf("cluster name can not start or end with - (dash)") + } + + + for _ , c := range name { + switch { + case '0' <= c && c <= '9': + case 'a' <= c && c <= 'z': + case 'A' <= c && c <= 'Z': + case c == '-': + break; + default: + return fmt.Errorf("cluster name contains charaters other than 'Aa-Zz', '0-9' or '-'") + + } + } + + return nil +} // CheckTools checks if the docker API server is responding func CheckTools(c *cli.Context) error { @@ -45,6 +76,10 @@ func CheckTools(c *cli.Context) error { // CreateCluster creates a new single-node cluster container and initializes the cluster directory func CreateCluster(c *cli.Context) error { + if err := checkClusterName(c.String("name")); err != nil { + return err; + } + // define image image := c.String("image") if c.IsSet("version") { diff --git a/main.go b/main.go index b6d3b5eb7..c6e12460f 100644 --- a/main.go +++ b/main.go @@ -12,6 +12,7 @@ import ( // defaultK3sImage specifies the default image being used for server and workers const defaultK3sImage = "docker.io/rancher/k3s" +const defaultK3sClusterName string = "k3s-default" // main represents the CLI application func main() { @@ -52,7 +53,7 @@ func main() { Flags: []cli.Flag{ cli.StringFlag{ Name: "name, n", - Value: "k3s-default", + Value: defaultK3sClusterName, Usage: "Set a name for the cluster", }, cli.StringFlag{ @@ -107,7 +108,7 @@ func main() { Flags: []cli.Flag{ cli.StringFlag{ Name: "name, n", - Value: "k3s-default", + Value: defaultK3sClusterName, Usage: "name of the cluster", }, cli.BoolFlag{ @@ -124,7 +125,7 @@ func main() { Flags: []cli.Flag{ cli.StringFlag{ Name: "name, n", - Value: "k3s-default", + Value: defaultK3sClusterName, Usage: "Name of the cluster", }, cli.BoolFlag{ @@ -141,7 +142,7 @@ func main() { Flags: []cli.Flag{ cli.StringFlag{ Name: "name, n", - Value: "k3s-default", + Value: defaultK3sClusterName, Usage: "Name of the cluster", }, cli.BoolFlag{ @@ -171,7 +172,7 @@ func main() { Flags: []cli.Flag{ cli.StringFlag{ Name: "name, n", - Value: "k3s-default", + Value: defaultK3sClusterName, Usage: "Name of the cluster", }, cli.BoolFlag{