@@ -22,9 +22,15 @@ import (
2222
2323 "github.com/blang/semver/v4"
2424 . "github.com/onsi/gomega"
25+ "github.com/pkg/errors"
26+ utilfeature "k8s.io/component-base/featuregate/testing"
2527
2628 clusterv1 "sigs.k8s.io/cluster-api/api/core/v1beta2"
29+ runtimehooksv1 "sigs.k8s.io/cluster-api/api/runtime/hooks/v1alpha1"
30+ runtimecatalog "sigs.k8s.io/cluster-api/exp/runtime/catalog"
2731 "sigs.k8s.io/cluster-api/exp/topology/scope"
32+ "sigs.k8s.io/cluster-api/feature"
33+ fakeruntimeclient "sigs.k8s.io/cluster-api/internal/runtime/client/fake"
2834 "sigs.k8s.io/cluster-api/util/test/builder"
2935)
3036
@@ -1131,3 +1137,110 @@ func TestGetUpgradePlanFromClusterClassVersions(t *testing.T) {
11311137 })
11321138 }
11331139}
1140+
1141+ func TestGetUpgradePlanFromExtension (t * testing.T ) {
1142+ g := NewWithT (t )
1143+ ctx := t .Context ()
1144+
1145+ // Enable RuntimeSDK feature flag
1146+ utilfeature .SetFeatureGateDuringTest (t , feature .Gates , feature .RuntimeSDK , true )
1147+
1148+ // Create a test cluster
1149+ cluster := builder .Cluster ("test-namespace" , "test-cluster" ).Build ()
1150+
1151+ // Create catalog and register runtime hooks
1152+ catalog := runtimecatalog .New ()
1153+ _ = runtimehooksv1 .AddToCatalog (catalog )
1154+
1155+ // Create fake runtime client
1156+ extensionResponse := & runtimehooksv1.GenerateUpgradePlanResponse {
1157+ CommonResponse : runtimehooksv1.CommonResponse {
1158+ Status : runtimehooksv1 .ResponseStatusSuccess ,
1159+ },
1160+ ControlPlaneUpgrades : []runtimehooksv1.UpgradeStep {
1161+ {Version : "v1.32.0" },
1162+ {Version : "v1.33.0" },
1163+ },
1164+ WorkersUpgrades : []runtimehooksv1.UpgradeStep {
1165+ {Version : "v1.33.0" },
1166+ },
1167+ }
1168+ fakeRuntimeClient := fakeruntimeclient .NewRuntimeClientBuilder ().
1169+ WithCatalog (catalog ).
1170+ WithCallExtensionResponses (map [string ]runtimehooksv1.ResponseObject {
1171+ "test-extension" : extensionResponse ,
1172+ }).
1173+ Build ()
1174+
1175+ // Call GetUpgradePlanFromExtension
1176+ f := GetUpgradePlanFromExtension (fakeRuntimeClient , cluster , "test-extension" )
1177+ controlPlaneUpgradePlan , workersUpgradePlan , err := f (ctx , "v1.33.0" , "v1.31.0" , "v1.31.0" )
1178+
1179+ g .Expect (err ).ToNot (HaveOccurred ())
1180+ g .Expect (controlPlaneUpgradePlan ).To (Equal ([]string {"v1.32.0" , "v1.33.0" }))
1181+ g .Expect (workersUpgradePlan ).To (Equal ([]string {"v1.33.0" }))
1182+ }
1183+
1184+ func TestGetUpgradePlanFromExtension_Errors (t * testing.T ) {
1185+ tests := []struct {
1186+ name string
1187+ enableRuntimeSDK bool
1188+ extensionError error
1189+ desiredVersion string
1190+ currentControlPlaneVersion string
1191+ currentMinWorkersVersion string
1192+ wantErrMessage string
1193+ }{
1194+ {
1195+ name : "fails when RuntimeSDK feature flag is disabled" ,
1196+ enableRuntimeSDK : false ,
1197+ desiredVersion : "v1.33.0" ,
1198+ currentControlPlaneVersion : "v1.31.0" ,
1199+ currentMinWorkersVersion : "v1.31.0" ,
1200+ wantErrMessage : "can not use GenerateUpgradePlan extension \" test-extension\" if RuntimeSDK feature flag is disabled" ,
1201+ },
1202+ {
1203+ name : "fails when extension call returns error" ,
1204+ enableRuntimeSDK : true ,
1205+ desiredVersion : "v1.33.0" ,
1206+ currentControlPlaneVersion : "v1.31.0" ,
1207+ currentMinWorkersVersion : "v1.31.0" ,
1208+ extensionError : errors .New ("extension call error" ),
1209+ wantErrMessage : "failed to get upgrade plan from extension: extension call error" ,
1210+ },
1211+ }
1212+
1213+ for _ , tt := range tests {
1214+ t .Run (tt .name , func (t * testing.T ) {
1215+ g := NewWithT (t )
1216+ ctx := t .Context ()
1217+
1218+ // Enable/disable RuntimeSDK feature flag
1219+ utilfeature .SetFeatureGateDuringTest (t , feature .Gates , feature .RuntimeSDK , tt .enableRuntimeSDK )
1220+
1221+ // Create a test cluster
1222+ cluster := builder .Cluster ("test-namespace" , "test-cluster" ).Build ()
1223+
1224+ // Create catalog and register runtime hooks
1225+ catalog := runtimecatalog .New ()
1226+ _ = runtimehooksv1 .AddToCatalog (catalog )
1227+
1228+ // Create fake runtime client
1229+ fakeRuntimeClientBuilder := fakeruntimeclient .NewRuntimeClientBuilder ().
1230+ WithCatalog (catalog )
1231+ if tt .extensionError != nil {
1232+ fakeRuntimeClientBuilder .WithCallExtensionValidations (func (_ string , _ runtimehooksv1.RequestObject ) error {
1233+ return tt .extensionError
1234+ })
1235+ }
1236+ fakeRuntimeClient := fakeRuntimeClientBuilder .Build ()
1237+
1238+ // Call GetUpgradePlanFromExtension
1239+ f := GetUpgradePlanFromExtension (fakeRuntimeClient , cluster , "test-extension" )
1240+ _ , _ , err := f (ctx , tt .desiredVersion , tt .currentControlPlaneVersion , tt .currentMinWorkersVersion )
1241+
1242+ g .Expect (err ).To (HaveOccurred ())
1243+ g .Expect (err .Error ()).To (Equal (tt .wantErrMessage ))
1244+ })
1245+ }
1246+ }
0 commit comments