From 8a4e0e814a63a5cfd5a2190bed8872b1febe1476 Mon Sep 17 00:00:00 2001 From: Mark Janssen Date: Mon, 16 Oct 2017 21:55:46 +0000 Subject: [PATCH] Fix `kubeadm upgrade plan` for offline operation --- cmd/kubeadm/app/phases/upgrade/compute.go | 54 ++++++++++--------- .../app/phases/upgrade/versiongetter.go | 4 +- 2 files changed, 30 insertions(+), 28 deletions(-) diff --git a/cmd/kubeadm/app/phases/upgrade/compute.go b/cmd/kubeadm/app/phases/upgrade/compute.go index 2b78af9f69..aeb2cad71a 100644 --- a/cmd/kubeadm/app/phases/upgrade/compute.go +++ b/cmd/kubeadm/app/phases/upgrade/compute.go @@ -62,7 +62,7 @@ type ClusterState struct { // GetAvailableUpgrades fetches all versions from the specified VersionGetter and computes which // kinds of upgrades can be performed func GetAvailableUpgrades(versionGetterImpl VersionGetter, experimentalUpgradesAllowed, rcUpgradesAllowed bool) ([]Upgrade, error) { - fmt.Println("[upgrade] Fetching available versions to upgrade to:") + fmt.Println("[upgrade] Fetching available versions to upgrade to") // Collect the upgrades kubeadm can do in this list upgrades := []Upgrade{} @@ -82,7 +82,9 @@ func GetAvailableUpgrades(versionGetterImpl VersionGetter, experimentalUpgradesA // Get and output the current latest stable version stableVersionStr, stableVersion, err := versionGetterImpl.VersionFromCILabel("stable", "stable version") if err != nil { - return nil, err + fmt.Printf("[upgrade/versions] WARNING: %v\n", err) + fmt.Println("[upgrade/versions] WARNING: Falling back to current kubeadm version as latest stable version") + stableVersionStr, stableVersion = kubeadmVersionStr, kubeadmVersion } // Get the kubelet versions in the cluster @@ -115,34 +117,34 @@ func GetAvailableUpgrades(versionGetterImpl VersionGetter, experimentalUpgradesA // Get and output the latest patch version for the cluster branch patchVersionStr, patchVersion, err := versionGetterImpl.VersionFromCILabel(versionLabel, description) if err != nil { - return nil, err - } + fmt.Printf("[upgrade/versions] WARNING: %v\n", err) + } else { + // Check if a minor version upgrade is possible when a patch release exists + // It's only possible if the latest patch version is higher than the current patch version + // If that's the case, they must be on different branches => a newer minor version can be upgraded to + canDoMinorUpgrade = minorUpgradePossibleWithPatchRelease(stableVersion, patchVersion) - // Check if a minor version upgrade is possible when a patch release exists - // It's only possible if the latest patch version is higher than the current patch version - // If that's the case, they must be on different branches => a newer minor version can be upgraded to - canDoMinorUpgrade = minorUpgradePossibleWithPatchRelease(stableVersion, patchVersion) + // If the cluster version is lower than the newest patch version, we should inform about the possible upgrade + if patchUpgradePossible(clusterVersion, patchVersion) { - // If the cluster version is lower than the newest patch version, we should inform about the possible upgrade - if patchUpgradePossible(clusterVersion, patchVersion) { + // The kubeadm version has to be upgraded to the latest patch version + newKubeadmVer := patchVersionStr + if kubeadmVersion.AtLeast(patchVersion) { + // In this case, the kubeadm CLI version is new enough. Don't display an update suggestion for kubeadm by making .NewKubeadmVersion equal .CurrentKubeadmVersion + newKubeadmVer = kubeadmVersionStr + } - // The kubeadm version has to be upgraded to the latest patch version - newKubeadmVer := patchVersionStr - if kubeadmVersion.AtLeast(patchVersion) { - // In this case, the kubeadm CLI version is new enough. Don't display an update suggestion for kubeadm by making .NewKubeadmVersion equal .CurrentKubeadmVersion - newKubeadmVer = kubeadmVersionStr + upgrades = append(upgrades, Upgrade{ + Description: description, + Before: beforeState, + After: ClusterState{ + KubeVersion: patchVersionStr, + DNSVersion: dns.GetKubeDNSVersion(patchVersion), + KubeadmVersion: newKubeadmVer, + // KubeletVersions is unset here as it is not used anywhere in .After + }, + }) } - - upgrades = append(upgrades, Upgrade{ - Description: description, - Before: beforeState, - After: ClusterState{ - KubeVersion: patchVersionStr, - DNSVersion: dns.GetKubeDNSVersion(patchVersion), - KubeadmVersion: newKubeadmVer, - // KubeletVersions is unset here as it is not used anywhere in .After - }, - }) } } diff --git a/cmd/kubeadm/app/phases/upgrade/versiongetter.go b/cmd/kubeadm/app/phases/upgrade/versiongetter.go index e0289176c5..13c65294e5 100644 --- a/cmd/kubeadm/app/phases/upgrade/versiongetter.go +++ b/cmd/kubeadm/app/phases/upgrade/versiongetter.go @@ -86,7 +86,7 @@ func (g *KubeVersionGetter) KubeadmVersion() (string, *versionutil.Version, erro func (g *KubeVersionGetter) VersionFromCILabel(ciVersionLabel, description string) (string, *versionutil.Version, error) { versionStr, err := kubeadmutil.KubernetesReleaseVersion(ciVersionLabel) if err != nil { - return "", nil, fmt.Errorf("Couldn't fetch latest %s version from the internet: %v", description, err) + return "", nil, fmt.Errorf("Couldn't fetch latest %s from the internet: %v", description, err) } if description != "" { @@ -95,7 +95,7 @@ func (g *KubeVersionGetter) VersionFromCILabel(ciVersionLabel, description strin ver, err := versionutil.ParseSemantic(versionStr) if err != nil { - return "", nil, fmt.Errorf("Couldn't parse latest %s version: %v", description, err) + return "", nil, fmt.Errorf("Couldn't parse latest %s: %v", description, err) } return versionStr, ver, nil }