From f8da9ab2877bbb57b29dc8385a97be540ba232c6 Mon Sep 17 00:00:00 2001 From: "Lubomir I. Ivanov" Date: Thu, 22 Dec 2022 16:51:21 +0200 Subject: [PATCH] kubeadm: return stored FakedServerVersion when dry-running If we are dry-running, do not attempt to fetch the /version resource and just return the stored FakeServerVersion, which is done when constructing the dry-run client in upgrade/common.go#getClient(). The problem here is that during upgrade dry-run client reactors are backed by a dynamic client via NewClientBackedDryRunGetterFromKubeconfig() and for GetActions there seems to be no analog to Discovery().Serverversion() resource for a dynamic client(?). --- .../app/phases/upgrade/versiongetter.go | 23 ++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/cmd/kubeadm/app/phases/upgrade/versiongetter.go b/cmd/kubeadm/app/phases/upgrade/versiongetter.go index 234351f3b91..12bebe5166b 100644 --- a/cmd/kubeadm/app/phases/upgrade/versiongetter.go +++ b/cmd/kubeadm/app/phases/upgrade/versiongetter.go @@ -24,6 +24,8 @@ import ( v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" versionutil "k8s.io/apimachinery/pkg/util/version" + pkgversion "k8s.io/apimachinery/pkg/version" + fakediscovery "k8s.io/client-go/discovery/fake" clientset "k8s.io/client-go/kubernetes" "k8s.io/component-base/version" @@ -57,9 +59,24 @@ func NewKubeVersionGetter(client clientset.Interface) VersionGetter { // ClusterVersion gets API server version func (g *KubeVersionGetter) ClusterVersion() (string, *versionutil.Version, error) { - clusterVersionInfo, err := g.client.Discovery().ServerVersion() - if err != nil { - return "", nil, errors.Wrap(err, "Couldn't fetch cluster version from the API Server") + var ( + clusterVersionInfo *pkgversion.Info + err error + ) + // If we are dry-running, do not attempt to fetch the /version resource and just return + // the stored FakeServerVersion, which is done when constructing the dry-run client in + // common.go#getClient() + // The problem here is that during upgrade dry-run client reactors are backed by a dynamic client + // via NewClientBackedDryRunGetterFromKubeconfig() and for GetActions there seems to be no analog to + // Discovery().Serverversion() resource for a dynamic client(?). + fakeclientDiscovery, ok := g.client.Discovery().(*fakediscovery.FakeDiscovery) + if ok { + clusterVersionInfo = fakeclientDiscovery.FakedServerVersion + } else { + clusterVersionInfo, err = g.client.Discovery().ServerVersion() + if err != nil { + return "", nil, errors.Wrap(err, "Couldn't fetch cluster version from the API Server") + } } clusterVersion, err := versionutil.ParseSemantic(clusterVersionInfo.String())