1
16
17 package config
18
19 import (
20 "os"
21
22 "github.com/pkg/errors"
23
24 "k8s.io/apimachinery/pkg/runtime"
25 "k8s.io/klog/v2"
26
27 kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm"
28 kubeadmscheme "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/scheme"
29 kubeadmapiv1 "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1beta3"
30 "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/validation"
31 "k8s.io/kubernetes/cmd/kubeadm/app/constants"
32 kubeadmutil "k8s.io/kubernetes/cmd/kubeadm/app/util"
33 "k8s.io/kubernetes/cmd/kubeadm/app/util/config/strict"
34 )
35
36
37 func SetJoinDynamicDefaults(cfg *kubeadmapi.JoinConfiguration, skipCRIDetect bool) error {
38 addControlPlaneTaint := false
39 if cfg.ControlPlane != nil {
40 addControlPlaneTaint = true
41 }
42 if err := SetNodeRegistrationDynamicDefaults(&cfg.NodeRegistration, addControlPlaneTaint, skipCRIDetect); err != nil {
43 return err
44 }
45
46 return SetJoinControlPlaneDefaults(cfg.ControlPlane)
47 }
48
49
50 func SetJoinControlPlaneDefaults(cfg *kubeadmapi.JoinControlPlane) error {
51 if cfg != nil {
52 if err := SetAPIEndpointDynamicDefaults(&cfg.LocalAPIEndpoint); err != nil {
53 return err
54 }
55 }
56 return nil
57 }
58
59
60
61
62
63
64 func LoadOrDefaultJoinConfiguration(cfgPath string, defaultversionedcfg *kubeadmapiv1.JoinConfiguration, opts LoadOrDefaultConfigurationOptions) (*kubeadmapi.JoinConfiguration, error) {
65 var (
66 config *kubeadmapi.JoinConfiguration
67 err error
68 )
69 if cfgPath != "" {
70
71 config, err = LoadJoinConfigurationFromFile(cfgPath, opts)
72 } else {
73 config, err = DefaultedJoinConfiguration(defaultversionedcfg, opts)
74 }
75 if err == nil {
76 prepareStaticVariables(config)
77 }
78 return config, err
79 }
80
81
82 func LoadJoinConfigurationFromFile(cfgPath string, opts LoadOrDefaultConfigurationOptions) (*kubeadmapi.JoinConfiguration, error) {
83 klog.V(1).Infof("loading configuration from %q", cfgPath)
84
85 b, err := os.ReadFile(cfgPath)
86 if err != nil {
87 return nil, errors.Wrapf(err, "unable to read config from %q ", cfgPath)
88 }
89
90 gvkmap, err := kubeadmutil.SplitYAMLDocuments(b)
91 if err != nil {
92 return nil, err
93 }
94
95 return documentMapToJoinConfiguration(gvkmap, false, false, false, opts.SkipCRIDetect)
96 }
97
98
99
100 func documentMapToJoinConfiguration(gvkmap kubeadmapi.DocumentMap, allowDeprecated, allowExperimental, strictErrors, skipCRIDetect bool) (*kubeadmapi.JoinConfiguration, error) {
101 joinBytes := []byte{}
102 for gvk, bytes := range gvkmap {
103
104 if gvk.Kind != constants.JoinConfigurationKind {
105 continue
106 }
107
108
109 if err := validateSupportedVersion(gvk.GroupVersion(), allowDeprecated, allowExperimental); err != nil {
110 return nil, err
111 }
112
113
114 if err := strict.VerifyUnmarshalStrict([]*runtime.Scheme{kubeadmscheme.Scheme}, gvk, bytes); err != nil {
115 if !strictErrors {
116 klog.Warning(err.Error())
117 } else {
118 return nil, err
119 }
120 }
121
122 joinBytes = bytes
123 }
124
125 if len(joinBytes) == 0 {
126 return nil, errors.Errorf("no %s found in the supplied config", constants.JoinConfigurationKind)
127 }
128
129 internalcfg := &kubeadmapi.JoinConfiguration{}
130 if err := runtime.DecodeInto(kubeadmscheme.Codecs.UniversalDecoder(), joinBytes, internalcfg); err != nil {
131 return nil, err
132 }
133
134
135 if err := SetJoinDynamicDefaults(internalcfg, skipCRIDetect); err != nil {
136 return nil, err
137 }
138
139 if err := validation.ValidateJoinConfiguration(internalcfg).ToAggregate(); err != nil {
140 return nil, err
141 }
142
143 return internalcfg, nil
144 }
145
146
147 func DefaultedJoinConfiguration(defaultversionedcfg *kubeadmapiv1.JoinConfiguration, opts LoadOrDefaultConfigurationOptions) (*kubeadmapi.JoinConfiguration, error) {
148 internalcfg := &kubeadmapi.JoinConfiguration{}
149
150
151
152 kubeadmscheme.Scheme.Default(defaultversionedcfg)
153 if err := kubeadmscheme.Scheme.Convert(defaultversionedcfg, internalcfg, nil); err != nil {
154 return nil, err
155 }
156
157
158 if err := SetJoinDynamicDefaults(internalcfg, opts.SkipCRIDetect); err != nil {
159 return nil, err
160 }
161
162 if err := validation.ValidateJoinConfiguration(internalcfg).ToAggregate(); err != nil {
163 return nil, err
164 }
165
166 return internalcfg, nil
167 }
168
View as plain text