pull/227/head
Thorsten Klein 5 years ago
parent 73efb98b32
commit 433ff16467
  1. 3
      .gitignore
  2. 6
      pkg/cluster/cluster.go
  3. 69
      pkg/cluster/clusterName.go
  4. 2
      pkg/runtimes/docker/container.go
  5. 1
      pkg/runtimes/docker/network.go
  6. 39
      pkg/runtimes/docker/util.go
  7. 7
      pkg/types/types.go
  8. 0
      pkg/util/randomString.go

3
.gitignore vendored

@ -16,4 +16,5 @@ _dist/
*.out
# Editors
.vscode/
.vscode/
.local/

@ -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
}

@ -0,0 +1,69 @@
/*
Copyright © 2019 Thorsten Klein <iwilltry42@gmail.com>
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
}

@ -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
}

@ -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=<clusterName>?
// (2) get filtered list of networks
networkList, err := docker.NetworkList(ctx, types.NetworkListOptions{

@ -0,0 +1,39 @@
/*
Copyright © 2019 Thorsten Klein <iwilltry42@gmail.com>
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
}

@ -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
// <DefaultObjectNamePrefix[3]>-<ClusterName>-<TypeSuffix[5-10]>-<Counter[1-3]>
// ... 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
}

Loading…
Cancel
Save