From 2fba7c8aded09759fa7a2ae92d78cc7f6a16b829 Mon Sep 17 00:00:00 2001 From: "Lubomir I. Ivanov" Date: Tue, 15 Feb 2022 17:32:13 +0200 Subject: [PATCH] test/e2e_kubeadm: fix matching UnversionedKubeletConfigMap defaults The kubeadm defaults in features.go differ between versions. e2e_kubeadm tests cannot import the kubeadm features.go, or easily detect the versioned of the kubeadm binary used to create the cluster. Check for the existence of both versioned and unversioned objects independent of the value of the FG. Once the FG goes GA only the unversioned objects should be checked. Without this change kubeadm e2e skew tests will fail where kubeadm is at 1.24 (has the FG defaulted to true), the FG is not explicitly set by the user and the k8s version is at 1.23. --- test/e2e_kubeadm/kubelet_config_test.go | 83 ++++++++++++++----------- 1 file changed, 46 insertions(+), 37 deletions(-) diff --git a/test/e2e_kubeadm/kubelet_config_test.go b/test/e2e_kubeadm/kubelet_config_test.go index c966764f777..09f6de02cb6 100644 --- a/test/e2e_kubeadm/kubelet_config_test.go +++ b/test/e2e_kubeadm/kubelet_config_test.go @@ -17,10 +17,11 @@ limitations under the License. package kubeadm import ( + "context" "fmt" - authv1 "k8s.io/api/authorization/v1" rbacv1 "k8s.io/api/rbac/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/util/version" "k8s.io/kubernetes/test/e2e/framework" @@ -37,12 +38,12 @@ var ( kubeletConfigRoleName string kubeletConfigRoleBindingName string - kubeletConfigConfigMapResource = &authv1.ResourceAttributes{ - Namespace: kubeSystemNamespace, - Name: "", - Resource: "configmaps", - Verb: "get", - } + // TODO: remove these versioned strings and related logic once the UnversionedKubeletConfigMap + // feature gate goes GA: + // https://github.com/kubernetes/kubeadm/issues/1582 + kubeletConfigConfigMapNameVersioned string + kubeletConfigRoleNameVersioned string + kubeletConfigRoleBindingNameVersioned string ) // Define container for all the test specification aimed at verifying @@ -79,46 +80,54 @@ var _ = Describe("kubelet-config ConfigMap", func() { framework.Failf("error reading kubernetesVersion from %s ConfigMap: %v", kubeadmConfigName, err) } - // Extract the value of the UnversionedKubeletConfigMap feature gate if its present. - // TODO: remove this after the UnversionedKubeletConfigMap feature gate goes GA: - // https://github.com/kubernetes/kubeadm/issues/1582 - UnversionedKubeletConfigMap := true - if _, ok := m["featureGates"]; ok { - if featureGates, ok := m["featureGates"].(map[interface{}]interface{}); ok { - if val, ok := featureGates["UnversionedKubeletConfigMap"]; ok { - if valBool, ok := val.(bool); ok { - UnversionedKubeletConfigMap = valBool - } else { - framework.Failf("unable to cast the value of feature gate UnversionedKubeletConfigMap to bool") - } - } - } else { - framework.Failf("unable to cast the featureGates field in the %s ConfigMap", kubeadmConfigName) - } - } - - // Computes all the names derived from the kubernetesVersion kubeletConfigConfigMapName = "kubelet-config" kubeletConfigRoleName = "kubeadm:kubelet-config" - // TODO: remove this after the UnversionedKubeletConfigMap feature gate goes GA: - // https://github.com/kubernetes/kubeadm/issues/1582 - if !UnversionedKubeletConfigMap { - kubeletConfigConfigMapName = fmt.Sprintf("kubelet-config-%d.%d", k8sVersion.Major(), k8sVersion.Minor()) - kubeletConfigRoleName = fmt.Sprintf("kubeadm:kubelet-config-%d.%d", k8sVersion.Major(), k8sVersion.Minor()) - } kubeletConfigRoleBindingName = kubeletConfigRoleName - kubeletConfigConfigMapResource.Name = kubeletConfigConfigMapName + + kubeletConfigConfigMapNameVersioned = fmt.Sprintf("kubelet-config-%d.%d", k8sVersion.Major(), k8sVersion.Minor()) + kubeletConfigRoleNameVersioned = fmt.Sprintf("kubeadm:kubelet-config-%d.%d", k8sVersion.Major(), k8sVersion.Minor()) + kubeletConfigRoleBindingNameVersioned = kubeletConfigRoleNameVersioned }) ginkgo.It("should exist and be properly configured", func() { - cm := GetConfigMap(f.ClientSet, kubeSystemNamespace, kubeletConfigConfigMapName) - + // TODO: switch to GetConfigMap once UnversionedKubeletConfigMap feature gate goes GA: + // https://github.com/kubernetes/kubeadm/issues/1582 + cm, err := f.ClientSet.CoreV1(). + ConfigMaps(kubeSystemNamespace). + Get(context.TODO(), kubeletConfigConfigMapName, metav1.GetOptions{}) + if err != nil { + cm, err = f.ClientSet.CoreV1(). + ConfigMaps(kubeSystemNamespace). + Get(context.TODO(), kubeletConfigConfigMapNameVersioned, metav1.GetOptions{}) + framework.ExpectNoError(err, "error getting ConfigMap %q or %q from namespace %q", + kubeletConfigConfigMapName, kubeletConfigConfigMapNameVersioned, kubeSystemNamespace) + } gomega.Expect(cm.Data).To(gomega.HaveKey(kubeletConfigConfigMapKey)) }) ginkgo.It("should have related Role and RoleBinding", func() { - ExpectRole(f.ClientSet, kubeSystemNamespace, kubeletConfigRoleName) - ExpectRoleBinding(f.ClientSet, kubeSystemNamespace, kubeletConfigRoleBindingName) + // TODO: switch to ExpectRole(Binding) once UnversionedKubeletConfigMap feature gate goes GA: + // https://github.com/kubernetes/kubeadm/issues/1582 + _, err := f.ClientSet.RbacV1(). + Roles(kubeSystemNamespace). + Get(context.TODO(), kubeletConfigRoleName, metav1.GetOptions{}) + if err != nil { + _, err = f.ClientSet.RbacV1(). + Roles(kubeSystemNamespace). + Get(context.TODO(), kubeletConfigRoleNameVersioned, metav1.GetOptions{}) + framework.ExpectNoError(err, "error getting Role %q or %q from namespace %q", + kubeletConfigRoleName, kubeletConfigRoleNameVersioned, kubeSystemNamespace) + } + _, err = f.ClientSet.RbacV1(). + Roles(kubeSystemNamespace). + Get(context.TODO(), kubeletConfigRoleBindingName, metav1.GetOptions{}) + if err != nil { + _, err = f.ClientSet.RbacV1(). + Roles(kubeSystemNamespace). + Get(context.TODO(), kubeletConfigRoleBindingNameVersioned, metav1.GetOptions{}) + framework.ExpectNoError(err, "error getting RoleBinding %q or %q from namespace %q", + kubeletConfigRoleBindingName, kubeletConfigRoleBindingNameVersioned, kubeSystemNamespace) + } }) ginkgo.It("should be accessible for bootstrap tokens", func() {