Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 16 additions & 9 deletions exp/topology/desiredstate/upgrade_plan.go
Original file line number Diff line number Diff line change
Expand Up @@ -373,23 +373,30 @@ func GetUpgradePlanFromClusterClassVersions(clusterClassVersions []string) func(
return nil, nil, nil
}

// Pick all the known kubernetes versions starting from control plane version (excluded) to desired version.
// Pick all the candidate kubernetes versions starting from control plane version (excluded) to desired version.
upgradePlan := []string{}
start := false
end := false
for _, v := range clusterClassVersions {
semV, err := semver.ParseTolerant(v)
if err != nil {
return nil, nil, errors.Wrapf(err, "failed to parse version %s", v)
}
if (start && !end) || (!start && semV.Minor > currentControlPlaneSemVer.Minor) {
upgradePlan = append(upgradePlan, v)
// Ignore all candidate version older or equal to the current control plane version;
// also ignoring same versions but with different build tags, because those version will never
// end up in the computed upgrade plan (it starts from the next minor).
if version.Compare(semV, currentControlPlaneSemVer) <= 0 {
continue
}
if semV.String() == currentControlPlaneSemVer.String() || version.Compare(currentControlPlaneSemVer, semV, version.WithBuildTags()) < 0 {
start = true
// Safeguard to stop collecting candidate version when we are past desired version.
// Note This should never happen because web hook enforcing that the desired version is in the list of versions.
if version.Compare(semV, desiredSemVer, version.WithBuildTags()) == 1 {
break
}
if semV.String() == desiredSemVer.String() || version.Compare(desiredSemVer, semV, version.WithBuildTags()) < 0 {
end = true

upgradePlan = append(upgradePlan, v)

// Stop collecting candidate version when we arrive at the desired version.
if semV.String() == desiredSemVer.String() {
break
}
}

Expand Down
15 changes: 15 additions & 0 deletions exp/topology/desiredstate/upgrade_plan_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1090,6 +1090,21 @@ func TestGetUpgradePlanFromClusterClassVersions(t *testing.T) {
wantWorkersUpgradePlan: nil,
wantErr: false,
},
{
name: "version with not sortable build tags",
clusterClassVersions: []string{
"v1.31.0+a", "v1.31.0+b", "v1.31.0+c", // this is the same minor of currentControlPlaneVersion, everything should be ignored.
"v1.31.1+a",
"v1.32.0+a", "v1.32.0+b", "v1.32.0+c",
"v1.33.0+b",
"v1.33.1+a", "v1.33.1+b", "v1.33.1+c", // desiredVersion ends with +b, +c should be ignored.
},
desiredVersion: "v1.33.1+b",
currentControlPlaneVersion: "v1.31.0+b",
wantControlPlaneUpgradePlan: []string{"v1.32.0+c", "v1.33.1+b"},
wantWorkersUpgradePlan: nil,
wantErr: false,
},

// Kubernetes versions in CC is set when clusters already exists

Expand Down
Loading