...
1
16
17 package util
18
19 import (
20 "fmt"
21 "sort"
22 "strings"
23
24 "github.com/pkg/errors"
25
26 "k8s.io/apimachinery/pkg/util/sets"
27 "k8s.io/klog/v2"
28 kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm"
29 )
30
31
32
33
34
35
36 func ArgumentsToCommand(base []kubeadmapi.Arg, overrides []kubeadmapi.Arg) []string {
37 var command []string
38
39 args := make([]kubeadmapi.Arg, len(overrides))
40 copy(args, overrides)
41
42
43 overrideArgs := sets.New[string]()
44 for _, arg := range overrides {
45 overrideArgs.Insert(arg.Name)
46 }
47
48 for _, arg := range base {
49 if !overrideArgs.Has(arg.Name) {
50 args = append(args, arg)
51 }
52 }
53
54 sort.Slice(args, func(i, j int) bool {
55 if args[i].Name == args[j].Name {
56 return args[i].Value < args[j].Value
57 }
58 return args[i].Name < args[j].Name
59 })
60
61 for _, arg := range args {
62 command = append(command, fmt.Sprintf("--%s=%s", arg.Name, arg.Value))
63 }
64
65 return command
66 }
67
68
69 func ArgumentsFromCommand(command []string) []kubeadmapi.Arg {
70 args := []kubeadmapi.Arg{}
71 for i, arg := range command {
72 key, val, err := parseArgument(arg)
73
74
75
76 if err != nil {
77 if i != 0 {
78 klog.Warningf("[kubeadm] WARNING: The component argument %q could not be parsed correctly. The argument must be of the form %q. Skipping...\n", arg, "--")
79 }
80 continue
81 }
82
83 args = append(args, kubeadmapi.Arg{Name: key, Value: val})
84 }
85
86 sort.Slice(args, func(i, j int) bool {
87 if args[i].Name == args[j].Name {
88 return args[i].Value < args[j].Value
89 }
90 return args[i].Name < args[j].Name
91 })
92 return args
93 }
94
95
96 func parseArgument(arg string) (string, string, error) {
97 if !strings.HasPrefix(arg, "--") {
98 return "", "", errors.New("the argument should start with '--'")
99 }
100 if !strings.Contains(arg, "=") {
101 return "", "", errors.New("the argument should have a '=' between the flag and the value")
102 }
103
104 arg = strings.TrimPrefix(arg, "--")
105
106 keyvalSlice := strings.SplitN(arg, "=", 2)
107
108
109 if len(keyvalSlice) != 2 {
110 return "", "", errors.New("the argument must have both a key and a value")
111 }
112 if len(keyvalSlice[0]) == 0 {
113 return "", "", errors.New("the argument must have a key")
114 }
115
116 return keyvalSlice[0], keyvalSlice[1], nil
117 }
118
View as plain text