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/apimachinery/pkg/util/sets"
26 "k8s.io/klog/v2"
27 kubeproxyconfig "k8s.io/kube-proxy/config/v1alpha1"
28 kubeletconfig "k8s.io/kubelet/config/v1beta1"
29
30 kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm"
31 kubeadmscheme "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/scheme"
32 kubeadmapiv1 "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1beta4"
33 "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/validation"
34 "k8s.io/kubernetes/cmd/kubeadm/app/componentconfigs"
35 kubeadmutil "k8s.io/kubernetes/cmd/kubeadm/app/util"
36 "k8s.io/kubernetes/cmd/kubeadm/app/util/config/strict"
37 )
38
39 var componentCfgGV = sets.New(kubeproxyconfig.GroupName, kubeletconfig.GroupName)
40
41
42
43 func documentMapToUpgradeConfiguration(gvkmap kubeadmapi.DocumentMap, allowDeprecated bool) (*kubeadmapi.UpgradeConfiguration, error) {
44 var internalcfg *kubeadmapi.UpgradeConfiguration
45
46 for gvk, bytes := range gvkmap {
47
48 if err := validateSupportedVersion(gvk.GroupVersion(), allowDeprecated, true); err != nil {
49 return nil, err
50 }
51
52
53 if err := strict.VerifyUnmarshalStrict([]*runtime.Scheme{kubeadmscheme.Scheme}, gvk, bytes); err != nil {
54 klog.Warning(err.Error())
55 }
56
57 if kubeadmutil.GroupVersionKindsHasInitConfiguration(gvk) || kubeadmutil.GroupVersionKindsHasClusterConfiguration(gvk) {
58 klog.Warningf("[config] WARNING: YAML document with GroupVersionKind %v is deprecated for upgrade, please use config file with kind of UpgradeConfiguration instead \n", gvk)
59 continue
60 }
61
62 if kubeadmutil.GroupVersionKindsHasUpgradeConfiguration(gvk) {
63
64 internalcfg = &kubeadmapi.UpgradeConfiguration{}
65
66
67 if err := runtime.DecodeInto(kubeadmscheme.Codecs.UniversalDecoder(), bytes, internalcfg); err != nil {
68 return nil, err
69 }
70 continue
71 }
72
73
74 if !componentconfigs.Scheme.IsGroupRegistered(gvk.Group) {
75 klog.Warningf("[config] WARNING: Ignored YAML document with GroupVersionKind %v\n", gvk)
76 }
77 }
78
79
80 if internalcfg == nil {
81 extinitcfg := &kubeadmapiv1.UpgradeConfiguration{}
82 kubeadmscheme.Scheme.Default(extinitcfg)
83
84 internalcfg = &kubeadmapi.UpgradeConfiguration{}
85 if err := kubeadmscheme.Scheme.Convert(extinitcfg, internalcfg, nil); err != nil {
86 return nil, err
87 }
88 }
89
90
91 if err := validation.ValidateUpgradeConfiguration(internalcfg).ToAggregate(); err != nil {
92 return nil, err
93 }
94
95 return internalcfg, nil
96 }
97
98
99
100
101
102 func DocMapToUpgradeConfiguration(gvkmap kubeadmapi.DocumentMap) (*kubeadmapi.UpgradeConfiguration, error) {
103 return documentMapToUpgradeConfiguration(gvkmap, false)
104 }
105
106
107 func LoadUpgradeConfigurationFromFile(cfgPath string, _ LoadOrDefaultConfigurationOptions) (*kubeadmapi.UpgradeConfiguration, error) {
108 var err error
109 var upgradeCfg *kubeadmapi.UpgradeConfiguration
110
111
112 configBytes, err := os.ReadFile(cfgPath)
113 if err != nil {
114 return nil, errors.Wrapf(err, "unable to load config from file %q", cfgPath)
115 }
116
117
118 docmap, err := kubeadmutil.SplitYAMLDocuments(configBytes)
119 if err != nil {
120 return nil, err
121 }
122
123
124
125
126 if isKubeadmConfigPresent(docmap) {
127 if upgradeCfg, err = DocMapToUpgradeConfiguration(docmap); err != nil {
128 return nil, err
129 }
130 }
131
132
133 for gvk := range docmap {
134 if componentCfgGV.Has(gvk.Group) {
135 klog.Warningf("[config] WARNING: YAML document with Component Configs %v is deprecated for upgrade and will be ignored \n", gvk.Group)
136 continue
137 }
138 }
139
140 return upgradeCfg, nil
141 }
142
143
144
145
146
147
148 func LoadOrDefaultUpgradeConfiguration(cfgPath string, defaultversionedcfg *kubeadmapiv1.UpgradeConfiguration, opts LoadOrDefaultConfigurationOptions) (*kubeadmapi.UpgradeConfiguration, error) {
149 var (
150 config *kubeadmapi.UpgradeConfiguration
151 err error
152 )
153 if cfgPath != "" {
154
155 config, err = LoadUpgradeConfigurationFromFile(cfgPath, opts)
156 } else {
157 config, err = DefaultedUpgradeConfiguration(defaultversionedcfg, opts)
158 }
159 if err == nil {
160 prepareStaticVariables(config)
161 }
162 return config, err
163 }
164
165
166 func DefaultedUpgradeConfiguration(defaultversionedcfg *kubeadmapiv1.UpgradeConfiguration, _ LoadOrDefaultConfigurationOptions) (*kubeadmapi.UpgradeConfiguration, error) {
167 internalcfg := &kubeadmapi.UpgradeConfiguration{}
168
169
170
171 kubeadmscheme.Scheme.Default(defaultversionedcfg)
172 if err := kubeadmscheme.Scheme.Convert(defaultversionedcfg, internalcfg, nil); err != nil {
173 return nil, err
174 }
175
176
177 if err := validation.ValidateUpgradeConfiguration(internalcfg).ToAggregate(); err != nil {
178 return nil, err
179 }
180
181 return internalcfg, nil
182 }
183
View as plain text