
kubeadm's current implementation of component config support is "kind" centric. This has its downsides. Namely: - Kind names and numbers can change between config versions. Newer kinds can be ignored. Therefore, detection of a version change is considerably harder. - A component config can have only one kind that is managed by kubeadm. Thus a more appropriate way to identify component configs is required. Probably the best solution identified so far is a config group. A group name is unlikely to change between versions, while the kind names and structure can. Tracking component configs by group name allows us to: - Spot more easily config version changes and manage alternate versions. - Support more than one kind in a config group/version. - Abstract component configs by hiding their exact structure. Hence, this change rips off the old kind based support for component configs and replaces it with a group name based one. This also has the following extra benefits: - More tests were added. - kubeadm now errors out if an unsupported version of a known component group is used. Signed-off-by: Rostislav M. Georgiev <rostislavg@vmware.com>
161 lines
4.7 KiB
Go
161 lines
4.7 KiB
Go
/*
|
|
Copyright 2018 The Kubernetes Authors.
|
|
|
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
you may not use this file except in compliance with the License.
|
|
You may obtain a copy of the License at
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
See the License for the specific language governing permissions and
|
|
limitations under the License.
|
|
*/
|
|
|
|
package strict
|
|
|
|
import (
|
|
"io/ioutil"
|
|
"path/filepath"
|
|
"testing"
|
|
|
|
"k8s.io/apimachinery/pkg/runtime/schema"
|
|
kubeproxyconfigv1alpha1 "k8s.io/kube-proxy/config/v1alpha1"
|
|
kubeletconfigv1beta1 "k8s.io/kubelet/config/v1beta1"
|
|
kubeadmapiv1beta2 "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1beta2"
|
|
"k8s.io/kubernetes/cmd/kubeadm/app/constants"
|
|
)
|
|
|
|
func TestVerifyUnmarshalStrict(t *testing.T) {
|
|
const (
|
|
pathTestData = "testdata/"
|
|
)
|
|
|
|
var testFiles = []struct {
|
|
fileName string
|
|
kind string
|
|
groupVersion schema.GroupVersion
|
|
expectedError bool
|
|
}{
|
|
// tests with file errors
|
|
{
|
|
fileName: "invalid_duplicate_field_clustercfg.yaml",
|
|
kind: constants.InitConfigurationKind,
|
|
groupVersion: kubeadmapiv1beta2.SchemeGroupVersion,
|
|
expectedError: true,
|
|
},
|
|
{
|
|
fileName: "invalid_duplicate_field_joincfg.yaml",
|
|
kind: constants.JoinConfigurationKind,
|
|
groupVersion: kubeadmapiv1beta2.SchemeGroupVersion,
|
|
expectedError: true,
|
|
},
|
|
{
|
|
fileName: "invalid_duplicate_field_kubeletcfg.yaml",
|
|
kind: "KubeletConfiguration",
|
|
groupVersion: kubeletconfigv1beta1.SchemeGroupVersion,
|
|
expectedError: true,
|
|
},
|
|
{
|
|
fileName: "invalid_duplicate_field_kubeproxycfg.yaml",
|
|
kind: "KubeProxyConfiguration",
|
|
groupVersion: kubeproxyconfigv1alpha1.SchemeGroupVersion,
|
|
expectedError: true,
|
|
},
|
|
{
|
|
fileName: "invalid_unknown_field_clustercfg.yaml",
|
|
kind: constants.ClusterConfigurationKind,
|
|
groupVersion: kubeadmapiv1beta2.SchemeGroupVersion,
|
|
expectedError: true,
|
|
},
|
|
{
|
|
fileName: "invalid_unknown_field_initcfg.yaml",
|
|
kind: constants.InitConfigurationKind,
|
|
groupVersion: kubeadmapiv1beta2.SchemeGroupVersion,
|
|
expectedError: true,
|
|
},
|
|
{
|
|
fileName: "invalid_unknown_field_joincfg.yaml",
|
|
kind: constants.JoinConfigurationKind,
|
|
groupVersion: kubeadmapiv1beta2.SchemeGroupVersion,
|
|
expectedError: true,
|
|
},
|
|
{
|
|
fileName: "invalid_unknown_field_kubeletcfg.yaml",
|
|
kind: "KubeletConfiguration",
|
|
groupVersion: kubeletconfigv1beta1.SchemeGroupVersion,
|
|
expectedError: true,
|
|
},
|
|
{
|
|
fileName: "invalid_unknown_field_kubeproxycfg.yaml",
|
|
kind: "KubeProxyConfiguration",
|
|
groupVersion: kubeproxyconfigv1alpha1.SchemeGroupVersion,
|
|
expectedError: true,
|
|
},
|
|
// test unknown groupVersion and kind
|
|
{
|
|
fileName: "valid_clustercfg.yaml",
|
|
kind: constants.ClusterConfigurationKind,
|
|
groupVersion: schema.GroupVersion{Group: "someGroup", Version: "v1"},
|
|
expectedError: true,
|
|
},
|
|
{
|
|
fileName: "valid_clustercfg.yaml",
|
|
kind: "SomeUnknownKind",
|
|
groupVersion: kubeadmapiv1beta2.SchemeGroupVersion,
|
|
expectedError: true,
|
|
},
|
|
// valid tests
|
|
{
|
|
fileName: "valid_clustercfg.yaml",
|
|
kind: constants.ClusterConfigurationKind,
|
|
groupVersion: kubeadmapiv1beta2.SchemeGroupVersion,
|
|
expectedError: false,
|
|
},
|
|
{
|
|
fileName: "valid_initcfg.yaml",
|
|
kind: constants.InitConfigurationKind,
|
|
groupVersion: kubeadmapiv1beta2.SchemeGroupVersion,
|
|
expectedError: false,
|
|
},
|
|
{
|
|
fileName: "valid_joincfg.yaml",
|
|
kind: constants.JoinConfigurationKind,
|
|
groupVersion: kubeadmapiv1beta2.SchemeGroupVersion,
|
|
expectedError: false,
|
|
},
|
|
{
|
|
fileName: "valid_kubeletcfg.yaml",
|
|
kind: "KubeletConfiguration",
|
|
groupVersion: kubeletconfigv1beta1.SchemeGroupVersion,
|
|
expectedError: false,
|
|
},
|
|
{
|
|
fileName: "valid_kubeproxycfg.yaml",
|
|
kind: "KubeProxyConfiguration",
|
|
groupVersion: kubeproxyconfigv1alpha1.SchemeGroupVersion,
|
|
expectedError: false,
|
|
},
|
|
}
|
|
|
|
for _, test := range testFiles {
|
|
t.Run(test.fileName, func(t *testing.T) {
|
|
bytes, err := ioutil.ReadFile(filepath.Join(pathTestData, test.fileName))
|
|
if err != nil {
|
|
t.Fatalf("couldn't read test data: %v", err)
|
|
}
|
|
gvk := schema.GroupVersionKind{
|
|
Group: test.groupVersion.Group,
|
|
Version: test.groupVersion.Version,
|
|
Kind: test.kind,
|
|
}
|
|
err = VerifyUnmarshalStrict(bytes, gvk)
|
|
if (err != nil) != test.expectedError {
|
|
t.Errorf("expected error %v, got %v, error: %v", err != nil, test.expectedError, err)
|
|
}
|
|
})
|
|
}
|
|
}
|