diff --git a/cmd/create/createCluster.go b/cmd/create/createCluster.go index 9348b6c0..8a45eb98 100644 --- a/cmd/create/createCluster.go +++ b/cmd/create/createCluster.go @@ -22,6 +22,8 @@ THE SOFTWARE. package create import ( + "fmt" + "github.com/spf13/cobra" cliutil "github.com/rancher/k3d/cmd/util" @@ -130,15 +132,25 @@ func parseCreateClusterCmd(cmd *cobra.Command, args []string) (runtimes.Runtime, } volumeFilterMap := make(map[string]string, 1) for _, volumeFlag := range volumeFlags { + log.Debugf("Parsing vol flag %+v", volumeFlag) volume, filter, err := cliutil.SplitFilterFromFlag(volumeFlag) if err != nil { log.Fatalln(err) } + log.Debugf("Parsed vol flag %+v + filter %+v", volume, filter) if err := cliutil.ValidateVolumeMount(volume); err != nil { log.Fatalln(err) } - volumeFilterMap[volume] = filter + + // create new entry or append filter to existing entry + if _, exists := volumeFilterMap[volume]; exists { + volumeFilterMap[volume] = fmt.Sprintf("%s;%s", volumeFilterMap[volume], filter) + } else { + volumeFilterMap[volume] = filter + } + log.Debugf("volFilterMap %+v", volumeFilterMap) } + log.Debugf("volumeFIlterMap: %+v", volumeFilterMap) /* generate cluster */ cluster := &k3d.Cluster{ diff --git a/cmd/util/util.go b/cmd/util/util.go index 3efa3896..15bc4c03 100644 --- a/cmd/util/util.go +++ b/cmd/util/util.go @@ -96,7 +96,7 @@ func FilterNodes(nodes []*k3d.Node, filterString string) ([]*k3d.Node, error) { } } - filteredNodes := make([]*k3d.Node, 1) + filteredNodes := []*k3d.Node{} set := make(map[*k3d.Node]struct{}) // range over all instances of group[subset] specs @@ -124,7 +124,7 @@ func FilterNodes(nodes []*k3d.Node, filterString string) ([]*k3d.Node, error) { return nodes, nil } - /* */ + /* Choose the group of nodes to operate on */ groupNodes := []*k3d.Node{} if submatches["group"] == string(k3d.MasterRole) { groupNodes = masterNodes @@ -140,6 +140,9 @@ func FilterNodes(nodes []*k3d.Node, filterString string) ([]*k3d.Node, error) { if err != nil { return nil, fmt.Errorf("Failed to convert subset number to integer in '%s'", filter) } + if num < 0 || num >= len(groupNodes) { + return nil, fmt.Errorf("Index out of range: index '%d' < 0 or > number of available nodes in filter '%s'", num, filter) + } if _, exists := set[groupNodes[num]]; !exists { filteredNodes = append(filteredNodes, groupNodes[num]) } @@ -168,9 +171,10 @@ func FilterNodes(nodes []*k3d.Node, filterString string) ([]*k3d.Node, error) { if err != nil { return nil, fmt.Errorf("Failed to convert subset range start to integer in '%s'", filter) } - if start < 0 { - return nil, fmt.Errorf("Invalid subset range: start < 0 in '%s'", filter) + if start < 0 || start >= len(groupNodes) { + return nil, fmt.Errorf("Invalid subset range: start < 0 or > number of available nodes in '%s'", filter) } + } if split[1] != "" { @@ -178,8 +182,8 @@ func FilterNodes(nodes []*k3d.Node, filterString string) ([]*k3d.Node, error) { if err != nil { return nil, fmt.Errorf("Failed to convert subset range start to integer in '%s'", filter) } - if end < start { - return nil, fmt.Errorf("Invalid subset range: end < start in '%s'", filter) + if end < start || end >= len(groupNodes) { + return nil, fmt.Errorf("Invalid subset range: end < start or > number of available nodes in '%s'", filter) } } @@ -194,7 +198,11 @@ func FilterNodes(nodes []*k3d.Node, filterString string) ([]*k3d.Node, error) { /* * '*' = all nodes */ - return groupNodes, nil + for _, node := range groupNodes { + if _, exists := set[node]; !exists { + filteredNodes = append(filteredNodes, node) + } + } /* invalid/unknown subset */ } else { diff --git a/pkg/cluster/cluster.go b/pkg/cluster/cluster.go index 31a52d04..b5460d11 100644 --- a/pkg/cluster/cluster.go +++ b/pkg/cluster/cluster.go @@ -97,7 +97,7 @@ func CreateCluster(cluster *k3d.Cluster, runtime k3drt.Runtime) error { // create node log.Infof("Creating node '%s'", node.Name) - if err := CreateNode(&node, runtime); err != nil { + if err := CreateNode(node, runtime); err != nil { log.Errorln("Failed to create node") return err } @@ -114,7 +114,7 @@ func DeleteCluster(cluster *k3d.Cluster, runtime k3drt.Runtime) error { failed := 0 for _, node := range cluster.Nodes { - if err := runtime.DeleteNode(&node); err != nil { + if err := runtime.DeleteNode(node); err != nil { log.Warningf("Failed to delete node '%s': Try to delete it manually", node.Name) failed++ continue @@ -143,7 +143,7 @@ func GetClusters(runtime k3drt.Runtime) ([]*k3d.Cluster, error) { clusterExists := false for _, cluster := range clusters { if node.Labels["k3d.cluster"] == cluster.Name { // TODO: handle case, where this label doesn't exist - cluster.Nodes = append(cluster.Nodes, *node) + cluster.Nodes = append(cluster.Nodes, node) clusterExists = true break } @@ -152,7 +152,7 @@ func GetClusters(runtime k3drt.Runtime) ([]*k3d.Cluster, error) { if !clusterExists { clusters = append(clusters, &k3d.Cluster{ Name: node.Labels["k3d.cluster"], - Nodes: []k3d.Node{*node}, + Nodes: []*k3d.Node{node}, }) } } @@ -173,7 +173,7 @@ func GetCluster(cluster *k3d.Cluster, runtime k3drt.Runtime) (*k3d.Cluster, erro // append nodes for _, node := range nodes { - cluster.Nodes = append(cluster.Nodes, *node) + cluster.Nodes = append(cluster.Nodes, node) } return cluster, nil