Skip to content

Commit

Permalink
reduce duplication and fix typos in ulimit name for nofile
Browse files Browse the repository at this point in the history
  • Loading branch information
dan-ash committed Apr 19, 2023
1 parent 124212e commit abcb08c
Show file tree
Hide file tree
Showing 5 changed files with 59 additions and 48 deletions.
26 changes: 3 additions & 23 deletions cmd/cluster/clusterCreate.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ import (
"inet.af/netaddr"
"sigs.k8s.io/yaml"

"github.com/k3d-io/k3d/v5/cmd/util"
cliutil "github.com/k3d-io/k3d/v5/cmd/util"
cliconfig "github.com/k3d-io/k3d/v5/cmd/util/config"
k3dCluster "github.com/k3d-io/k3d/v5/pkg/client"
Expand Down Expand Up @@ -251,7 +252,7 @@ func NewCmdClusterCreate() *cobra.Command {
cmd.Flags().StringArrayP("runtime-label", "", nil, "Add label to container runtime (Format: `KEY[=VALUE][@NODEFILTER[;NODEFILTER...]]`\n - Example: `k3d cluster create --agents 2 --runtime-label \"my.label@agent:0,1\" --runtime-label \"other.label=somevalue@server:0\"`")
_ = ppViper.BindPFlag("cli.runtime-labels", cmd.Flags().Lookup("runtime-label"))

cmd.Flags().StringArrayP("runtime-ulimit", "", nil, "Add ulimit to container runtime (Format: `NAME[=SOFT]:[HARD]`\n - Example: `k3d cluster create --agents 2 --runtime-ulimit \"nofiles=1024:1024\" --runtime-ulimit \"noproc=1024:1024\"`")
cmd.Flags().StringArrayP("runtime-ulimit", "", nil, "Add ulimit to container runtime (Format: `NAME[=SOFT]:[HARD]`\n - Example: `k3d cluster create --agents 2 --runtime-ulimit \"nofile=1024:1024\" --runtime-ulimit \"noproc=1024:1024\"`")
_ = ppViper.BindPFlag("cli.runtime-ulimits", cmd.Flags().Lookup("runtime-ulimit"))

cmd.Flags().String("registry-create", "", "Create a k3d-managed registry and connect it to the cluster (Format: `NAME[:HOST][:HOSTPORT]`\n - Example: `k3d cluster create --registry-create mycluster-registry:0.0.0.0:5432`")
Expand Down Expand Up @@ -519,28 +520,7 @@ func applyCLIOverrides(cfg conf.SimpleConfig) (conf.SimpleConfig, error) {
l.Log().Tracef("RuntimeLabelFilterMap: %+v", runtimeLabelFilterMap)

for _, ulimit := range ppViper.GetStringSlice("cli.runtime-ulimits") {
ulimitSplitted := strings.Split(ulimit, "=")
if len(ulimitSplitted) != 2 {
l.Log().Fatalf("unknown runtime-ulimit format format: %s, use format \"ulimit=soft:hard\"", ulimit)
}
cliutil.ValidateRuntimeUlimitKey(ulimitSplitted[0])
softHardSplitted := strings.Split(ulimitSplitted[1], ":")
if len(softHardSplitted) != 2 {
l.Log().Fatalf("unknown runtime-ulimit format format: %s, use format \"ulimit=soft:hard\"", ulimit)
}
soft, err := strconv.Atoi(softHardSplitted[0])
if err != nil {
l.Log().Fatalf("unknown runtime-ulimit format format: soft %s has to be int", ulimitSplitted[0])
}
hard, err := strconv.Atoi(softHardSplitted[1])
if err != nil {
l.Log().Fatalf("unknown runtime-ulimit format format: hard %s has to be int", ulimitSplitted[1])
}
cfg.Options.Runtime.Ulimits = append(cfg.Options.Runtime.Ulimits, conf.Ulimit{
Name: ulimitSplitted[0],
Soft: int64(soft),
Hard: int64(hard),
})
cfg.Options.Runtime.Ulimits = append(cfg.Options.Runtime.Ulimits, *util.ParseRuntimeUlimit[conf.Ulimit](ulimit))
}

// --env
Expand Down
24 changes: 1 addition & 23 deletions cmd/node/nodeCreate.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@ package node

import (
"fmt"
"strconv"
"strings"
"time"

Expand Down Expand Up @@ -170,28 +169,7 @@ func parseCreateNodeCmd(cmd *cobra.Command, args []string) ([]*k3d.Node, string)

runtimeUlimits := make([]*dockerunits.Ulimit, len(runtimeUlimitsFlag))
for index, ulimit := range runtimeUlimitsFlag {
ulimitSplitted := strings.Split(ulimit, "=")
if len(ulimitSplitted) != 2 {
l.Log().Fatalf("unknown runtime-ulimit format format: %s, use format \"ulimit=soft:hard\"", ulimit)
}
cliutil.ValidateRuntimeUlimitKey(ulimitSplitted[0])
softHardSplitted := strings.Split(ulimitSplitted[1], ":")
if len(softHardSplitted) != 2 {
l.Log().Fatalf("unknown runtime-ulimit format format: %s, use format \"ulimit=soft:hard\"", ulimit)
}
soft, err := strconv.Atoi(softHardSplitted[0])
if err != nil {
l.Log().Fatalf("unknown runtime-ulimit format format: soft %s has to be int", ulimitSplitted[0])
}
hard, err := strconv.Atoi(softHardSplitted[1])
if err != nil {
l.Log().Fatalf("unknown runtime-ulimit format format: hard %s has to be int", ulimitSplitted[1])
}
runtimeUlimits[index] = &dockerunits.Ulimit{
Name: ulimitSplitted[0],
Soft: int64(soft),
Hard: int64(hard),
}
runtimeUlimits[index] = util.ParseRuntimeUlimit[dockerunits.Ulimit](ulimit)
}
// --k3s-node-label
k3sNodeLabelsFlag, err := cmd.Flags().GetStringSlice("k3s-node-label")
Expand Down
53 changes: 53 additions & 0 deletions cmd/util/runtimeUlimits.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,23 @@ THE SOFTWARE.
package util

import (
"strconv"
"strings"

dockerunits "github.com/docker/go-units"

"github.com/k3d-io/k3d/v5/pkg/config/v1alpha5"
l "github.com/k3d-io/k3d/v5/pkg/logger"
)

type UlimitTypes interface {
dockerunits.Ulimit | v1alpha5.Ulimit
}

type Ulimit[T UlimitTypes] struct {
Values T
}

// ValidateRuntimeUlimitKey validates a given ulimit key is valid
func ValidateRuntimeUlimitKey(ulimitKey string) {
ulimitsKeys := map[string]bool{
Expand Down Expand Up @@ -55,3 +67,44 @@ func ValidateRuntimeUlimitKey(ulimitKey string) {
l.Log().Fatalf("runtime ulimit \"%s\" is not valid, allowed keys are: %s", ulimitKey, strings.Join(keysList, ", "))
}
}

func ParseRuntimeUlimit[T UlimitTypes](ulimit string) *T {
var parsedUlimit any
var tmpUlimit Ulimit[T]
ulimitSplitted := strings.Split(ulimit, "=")
if len(ulimitSplitted) != 2 {
l.Log().Fatalf("unknown runtime-ulimit format format: %s, use format \"ulimit=soft:hard\"", ulimit)
}
ValidateRuntimeUlimitKey(ulimitSplitted[0])
softHardSplitted := strings.Split(ulimitSplitted[1], ":")
if len(softHardSplitted) != 2 {
l.Log().Fatalf("unknown runtime-ulimit format format: %s, use format \"ulimit=soft:hard\"", ulimit)
}
soft, err := strconv.Atoi(softHardSplitted[0])
if err != nil {
l.Log().Fatalf("unknown runtime-ulimit format format: soft %s has to be int", ulimitSplitted[0])
}
hard, err := strconv.Atoi(softHardSplitted[1])
if err != nil {
l.Log().Fatalf("unknown runtime-ulimit format format: hard %s has to be int", ulimitSplitted[1])
}

switch any(tmpUlimit.Values).(type) {
case dockerunits.Ulimit:
parsedUlimit = &dockerunits.Ulimit{
Name: ulimitSplitted[0],
Soft: int64(soft),
Hard: int64(hard),
}
case v1alpha5.Ulimit:
parsedUlimit = &v1alpha5.Ulimit{
Name: ulimitSplitted[0],
Soft: int64(soft),
Hard: int64(hard),
}
default:
l.Log().Fatalf("Wrong Type")
}

return parsedUlimit.(*T)
}
2 changes: 1 addition & 1 deletion pkg/config/config_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ func TestReadSimpleConfig(t *testing.T) {
},
},
Ulimits: []conf.Ulimit{{
Name: "nofiles",
Name: "nofile",
Soft: 1024,
Hard: 1024,
}},
Expand Down
2 changes: 1 addition & 1 deletion pkg/config/test_assets/config_test_simple.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,6 @@ options:
- server:0
- loadbalancer
ulimits:
- name: nofiles
- name: nofile
soft: 1024
hard: 1024

0 comments on commit abcb08c

Please sign in to comment.