From 93f72e672a60eddb8a5e9e09c05e68643b2deebd Mon Sep 17 00:00:00 2001 From: Andy Zhou Date: Wed, 8 May 2019 11:17:17 -0700 Subject: [PATCH] Make sure the culster name is valid before creating it. MAke sure the cluster name is a RFC 1123 compliant host name, since the cluster name is used as base for expanding into a auto generated host names for k3s nodes. --- cli/commands.go | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) 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") {