diff --git a/.gitignore b/.gitignore index a35b5300..a74cc4a6 100644 --- a/.gitignore +++ b/.gitignore @@ -16,4 +16,5 @@ _dist/ *.out # Editors -.vscode/ \ No newline at end of file +.vscode/ +.local/ \ No newline at end of file diff --git a/pkg/cluster/cluster.go b/pkg/cluster/cluster.go index 33d0083b..842784fe 100644 --- a/pkg/cluster/cluster.go +++ b/pkg/cluster/cluster.go @@ -21,11 +21,13 @@ THE SOFTWARE. */ package cluster -import "github.com/rancher/k3d/pkg/types" +import ( + "github.com/rancher/k3d/pkg/types" +) // CreateCluster creates a new cluster consisting of // - some containerized k3s nodes // - a docker network -func CreateCluster(clusterSpec *types.Cluster) error { +func CreateCluster(cluster *types.Cluster) error { return nil } diff --git a/pkg/cluster/clusterName.go b/pkg/cluster/clusterName.go new file mode 100644 index 00000000..cc82f059 --- /dev/null +++ b/pkg/cluster/clusterName.go @@ -0,0 +1,69 @@ +/* +Copyright © 2019 Thorsten Klein + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +*/ +package cluster + +import ( + "fmt" + + "github.com/rancher/k3d/pkg/types" +) + +// CheckClusterName ensures that a cluster name is also a valid host name according to RFC 1123. +// We further restrict the length of the cluster name to maximum '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 err := ValidateHostname(name); err != nil { + return fmt.Errorf("Invalid cluster name. %+v", ValidateHostname(name)) + } + if len(name) > types.DefaultClusterNameMaxLength { + return fmt.Errorf("Cluster name must be <= %d characters, but has %d", types.DefaultClusterNameMaxLength, len(name)) + } + return nil +} + +// ValidateHostname ensures that a cluster name is also a valid host name according to RFC 1123. +func ValidateHostname(name string) error { + + if len(name) == 0 { + return fmt.Errorf("No name provided") + } + + if name[0] == '-' || name[len(name)-1] == '-' { + return fmt.Errorf("Hostname '%s' must not start or end with '-' (dash)", name) + } + + 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("Hostname '%s' contains characters other than 'Aa-Zz', '0-9' or '-'", name) + + } + } + + return nil +} diff --git a/pkg/runtimes/docker/container.go b/pkg/runtimes/docker/container.go index 37d817df..5e344490 100644 --- a/pkg/runtimes/docker/container.go +++ b/pkg/runtimes/docker/container.go @@ -32,7 +32,7 @@ import ( // createContainer creates a new docker container // @return containerID, error -func createContainer(ID string) (string, error) { +func createContainer(types.Container) (string, error) { return "", nil } diff --git a/pkg/runtimes/docker/network.go b/pkg/runtimes/docker/network.go index 170d04a3..c85b809c 100644 --- a/pkg/runtimes/docker/network.go +++ b/pkg/runtimes/docker/network.go @@ -48,7 +48,6 @@ func CreateNetworkIfNotExist(clusterName string) (string, error) { // (1) configure list filters args := GetDefaultObjectLabelsFilter(clusterName) args.Add("name", networkName) - // TODO: filter for label: cluster=? // (2) get filtered list of networks networkList, err := docker.NetworkList(ctx, types.NetworkListOptions{ diff --git a/pkg/runtimes/docker/util.go b/pkg/runtimes/docker/util.go new file mode 100644 index 00000000..9f9dd4f6 --- /dev/null +++ b/pkg/runtimes/docker/util.go @@ -0,0 +1,39 @@ +/* +Copyright © 2019 Thorsten Klein + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +*/ +package docker + +import ( + "fmt" + + "github.com/docker/docker/api/types/filters" + k3d "github.com/rancher/k3d/pkg/types" +) + +// GetDefaultObjectLabelsFilter returns docker type filters created from k3d labels +func GetDefaultObjectLabelsFilter(clusterName string) filters.Args { + filters := filters.NewArgs() + for key, value := range k3d.DefaultObjectLabels { + filters.Add("label", fmt.Sprintf("%s=%s", key, value)) + } + filters.Add("label", fmt.Sprintf("cluster=%s", clusterName)) + return filters +} diff --git a/pkg/types/types.go b/pkg/types/types.go index 5e162152..bb787fcb 100644 --- a/pkg/types/types.go +++ b/pkg/types/types.go @@ -26,6 +26,12 @@ import "fmt" // DefaultClusterName specifies the default name used for newly created clusters const DefaultClusterName = "k3s-default" +// DefaultClusterNameMaxLength specifies the maximal length of a passed in cluster name +// This restriction allows us to construct an name consisting of +// --- +// ... and still stay within the 64 character limit (e.g. of docker) +const DefaultClusterNameMaxLength = 32 + // DefaultK3sImageRepo specifies the default image repository for the used k3s image const DefaultK3sImageRepo = "docker.io/rancher/k3s" @@ -41,6 +47,7 @@ var DefaultObjectLabels = map[string]string{ type Cluster struct { Name string Network string + Secret string Nodes []Node } diff --git a/pkg/util/util.go b/pkg/util/randomString.go similarity index 100% rename from pkg/util/util.go rename to pkg/util/randomString.go