diff --git a/cmd/create/createCluster.go b/cmd/create/createCluster.go index 4cab5fb6..9348b6c0 100644 --- a/cmd/create/createCluster.go +++ b/cmd/create/createCluster.go @@ -148,7 +148,7 @@ func parseCreateClusterCmd(cmd *cobra.Command, args []string) (runtimes.Runtime, } // generate list of nodes - cluster.Nodes = []k3d.Node{} + cluster.Nodes = []*k3d.Node{} // -> master nodes for i := 0; i < masterCount; i++ { @@ -164,8 +164,7 @@ func parseCreateClusterCmd(cmd *cobra.Command, args []string) (runtimes.Runtime, } // append node to list - cluster.Nodes = append(cluster.Nodes, node) - cluster.MasterNodes = append(cluster.MasterNodes, &node) + cluster.Nodes = append(cluster.Nodes, &node) } // -> worker nodes @@ -175,14 +174,13 @@ func parseCreateClusterCmd(cmd *cobra.Command, args []string) (runtimes.Runtime, Image: image, } - cluster.Nodes = append(cluster.Nodes, node) - cluster.WorkerNodes = append(cluster.WorkerNodes, &node) + cluster.Nodes = append(cluster.Nodes, &node) } // append volumes // TODO: for volume, filter := range volumeFilterMap { - nodes, err := cliutil.FilterNodes(&cluster.Nodes, filter) + nodes, err := cliutil.FilterNodes(cluster.Nodes, filter) if err != nil { log.Fatalln(err) } diff --git a/cmd/util/util.go b/cmd/util/util.go index c889a9c2..00ebadf6 100644 --- a/cmd/util/util.go +++ b/cmd/util/util.go @@ -75,15 +75,29 @@ func SplitFilterFromFlag(flag string) (string, string, error) { } // FilterNodes takes a string filter to return a filtered list of nodes -func FilterNodes(nodes *[]k3d.Node, filterString string) ([]*k3d.Node, error) { +func FilterNodes(nodes []*k3d.Node, filterString string) ([]*k3d.Node, error) { // filterString is a semicolon-separated list of node filters filters := strings.Split(filterString, ";") if len(filters) == 0 { - return nil, fmt.Errorf("No filter specified") + log.Warnln("No filter specified") + return nodes, nil } + // map roles to subsets + masterNodes := []*k3d.Node{} + workerNodes := []*k3d.Node{} + for _, node := range nodes { + if node.Role == k3d.MasterRole { + masterNodes = append(masterNodes, node) + } else if node.Role == k3d.WorkerRole { + workerNodes = append(workerNodes, node) + } + } + + filteredNodes := make([]k3d.Node, 1) + // range over all instances of group[subset] specs for _, filter := range filters { @@ -105,11 +119,18 @@ func FilterNodes(nodes *[]k3d.Node, filterString string) ([]*k3d.Node, error) { // if one of the filters is 'all', we only return this and drop all others if submatches["group"] == "all" { // TODO: only log if really more than one is specified - log.Warnf("Node Specifier 'all' set, but more were specified in '%s'", filterString) + log.Warnf("Node filter 'all' set, but more were specified in '%s'", filterString) return nodes, nil } /* */ + groupNodes := []*k3d.Node{} + if submatches["group"] == string(k3d.MasterRole) { + groupNodes = masterNodes + } else if submatches["group"] == string(k3d.WorkerRole) { + groupNodes = workerNodes + } + subset := []int{} if submatches["subsetList"] != "" { @@ -117,8 +138,9 @@ func FilterNodes(nodes *[]k3d.Node, filterString string) ([]*k3d.Node, error) { if index != "" { num, err := strconv.Atoi(index) if err != nil { - return rolesMap, fmt.Errorf("Failed to convert subset number to integer in '%s'", filter) + return nil, fmt.Errorf("Failed to convert subset number to integer in '%s'", filter) } + filteredNodes = append(filteredNodes, *groupNodes[num]) subset = append(subset, num) } } @@ -131,30 +153,31 @@ func FilterNodes(nodes *[]k3d.Node, filterString string) ([]*k3d.Node, error) { split := strings.Split(submatches["subsetRange"], ":") if len(split) != 2 { - return rolesMap, fmt.Errorf("Failed to parse subset range in '%s'", filter) + return nil, fmt.Errorf("Failed to parse subset range in '%s'", filter) } start := 0 - end := numNodes - 1 + end := len(groupNodes) - 1 + var err error if split[0] != "" { start, err = strconv.Atoi(split[0]) if err != nil { - return rolesMap, fmt.Errorf("Failed to convert subset range start to integer in '%s'", filter) + return nil, fmt.Errorf("Failed to convert subset range start to integer in '%s'", filter) } if start < 0 { - return rolesMap, fmt.Errorf("Invalid subset range: start < 0 in '%s'", filter) + return nil, fmt.Errorf("Invalid subset range: start < 0 in '%s'", filter) } } if split[1] != "" { end, err = strconv.Atoi(split[1]) if err != nil { - return rolesMap, fmt.Errorf("Failed to convert subset range start to integer in '%s'", filter) + return nil, fmt.Errorf("Failed to convert subset range start to integer in '%s'", filter) } if end < start { - return rolesMap, fmt.Errorf("Invalid subset range: end < start in '%s'", filter) + return nil, fmt.Errorf("Invalid subset range: end < start in '%s'", filter) } } @@ -166,15 +189,11 @@ func FilterNodes(nodes *[]k3d.Node, filterString string) ([]*k3d.Node, error) { /* * '*' = all nodes */ - for i := 0; i < numNodes; i++ { - subset = append(subset, i) - } + return groupNodes, nil } else { - return rolesMap, fmt.Errorf("Failed to parse node specifiers: unknown subset in '%s'", filter) + return nil, fmt.Errorf("Failed to parse node specifiers: unknown subset in '%s'", filter) } - rolesMap[submatches["group"]] = append(rolesMap[submatches["group"]], subset...) - } log.Debugf("ROLESMAP: %+v", rolesMap) diff --git a/pkg/types/types.go b/pkg/types/types.go index 69c612b6..f2dec645 100644 --- a/pkg/types/types.go +++ b/pkg/types/types.go @@ -71,12 +71,10 @@ var DefaultNodeEnv = []string{ // Cluster describes a k3d cluster type Cluster struct { - Name string `yaml:"name" json:"name,omitempty"` - Network string `yaml:"network" json:"network,omitempty"` - Secret string `yaml:"cluster_secret" json:"clusterSecret,omitempty"` - Nodes []Node `yaml:"nodes" json:"nodes,omitempty"` - MasterNodes []*Node - WorkerNodes []*Node + Name string `yaml:"name" json:"name,omitempty"` + Network string `yaml:"network" json:"network,omitempty"` + Secret string `yaml:"cluster_secret" json:"clusterSecret,omitempty"` + Nodes []*Node `yaml:"nodes" json:"nodes,omitempty"` } // Node describes a k3d node