@@ -34,6 +34,7 @@ import (
3434 "k8s.io/apimachinery/pkg/runtime"
3535 "k8s.io/apimachinery/pkg/runtime/serializer"
3636 "k8s.io/apimachinery/pkg/util/intstr"
37+ "k8s.io/apimachinery/pkg/util/sets"
3738 "k8s.io/utils/ptr"
3839 "sigs.k8s.io/controller-runtime/pkg/client"
3940
@@ -1149,24 +1150,30 @@ var _ = Describe("Machines", func() {
11491150 Expect (err ).To (HaveOccurred ())
11501151 })
11511152
1152- It ("should return generate machine classes with core and extended resources in the nodeTemplate" , func () {
1153+ It ("should return generate machine classes with core, extended and virtual resources in the nodeTemplate" , func () {
11531154 ephemeralStorageQuant := resource .MustParse ("30Gi" )
11541155 dongleName := corev1 .ResourceName ("resources.com/dongle" )
11551156 dongleQuant := resource .MustParse ("4" )
1157+ virtualResourceName := corev1 .ResourceName ("subdomain.domain.com/virtual-resource-name" )
1158+ virtualResourceQuant := resource .MustParse ("1024" )
11561159 customResources := corev1.ResourceList {
11571160 corev1 .ResourceEphemeralStorage : ephemeralStorageQuant ,
11581161 dongleName : dongleQuant ,
11591162 }
1163+ customVirtualResources := corev1.ResourceList {
1164+ virtualResourceName : virtualResourceQuant ,
1165+ }
1166+
11601167 w .Spec .Pools [0 ].ProviderConfig = & runtime.RawExtension {
11611168 Raw : encode (& api.WorkerConfig {
11621169 NodeTemplate : & extensionsv1alpha1.NodeTemplate {
1163- Capacity : customResources ,
1170+ Capacity : customResources ,
1171+ VirtualCapacity : customVirtualResources ,
11641172 },
11651173 }),
11661174 }
1167-
1168- expectedCapacity := w .Spec .Pools [0 ].NodeTemplate .Capacity .DeepCopy ()
1169- maps .Copy (expectedCapacity , customResources )
1175+ expectedNodeTemplateCapacity := w .Spec .Pools [0 ].NodeTemplate .Capacity .DeepCopy ()
1176+ maps .Copy (expectedNodeTemplateCapacity , customResources )
11701177
11711178 wd , err := NewWorkerDelegate (c , decoder , scheme , chartApplier , "" , w , cluster )
11721179 Expect (err ).NotTo (HaveOccurred ())
@@ -1178,12 +1185,123 @@ var _ = Describe("Machines", func() {
11781185 for _ , mClz := range mClasses {
11791186 className := mClz ["name" ].(string )
11801187 if strings .Contains (className , namePool1 ) {
1188+ GinkgoWriter .Printf ("Machine class name: %q\n " , className )
11811189 nt := mClz ["nodeTemplate" ].(machinev1alpha1.NodeTemplate )
1182- Expect (nt .Capacity ).To (Equal (expectedCapacity ))
1190+ Expect (nt .Capacity ).To (Equal (expectedNodeTemplateCapacity ))
1191+ Expect (nt .VirtualCapacity ).To (Equal (customVirtualResources ))
11831192 }
11841193 }
11851194 })
11861195 })
1196+ It ("should generate machine classes with same name even when virtualCapacity is newly added or changed" , Label ("machineClass" , "virtualCapacity" ), func () {
1197+ capacityResources := corev1.ResourceList {
1198+ corev1 .ResourceCPU : resource .MustParse ("1" ),
1199+ corev1 .ResourceMemory : resource .MustParse ("1Gi" ),
1200+ corev1 .ResourceEphemeralStorage : resource .MustParse ("10Gi" ),
1201+ }
1202+ w1 := w .DeepCopy ()
1203+ w1 .Spec .Pools [0 ].NodeAgentSecretName = ptr .To ("dummy" ) // To Ensure that WorkerPoolHashV2 is used
1204+
1205+ // First, we specify a ProviderConfig with Capacity and no VirtualCapacity.
1206+ w1 .Spec .Pools [0 ].ProviderConfig = & runtime.RawExtension {
1207+ Raw : encode (& api.WorkerConfig {
1208+ NodeTemplate : & extensionsv1alpha1.NodeTemplate {
1209+ Capacity : capacityResources ,
1210+ },
1211+ }),
1212+ }
1213+ expectedNodeTemplateCapacity := w .Spec .Pools [0 ].NodeTemplate .Capacity .DeepCopy ()
1214+ maps .Copy (expectedNodeTemplateCapacity , capacityResources )
1215+
1216+ wd1 , err := NewWorkerDelegate (c , decoder , scheme , chartApplier , "" , w1 , cluster )
1217+ Expect (err ).NotTo (HaveOccurred ())
1218+ expectedUserDataSecretRefRead ()
1219+ _ , err = wd1 .GenerateMachineDeployments (ctx )
1220+ Expect (err ).NotTo (HaveOccurred ())
1221+ workerDelegate1 := wd1 .(* WorkerDelegate )
1222+ mClasses1 := workerDelegate1 .GetMachineClasses ()
1223+ classNames1 := sets .New [string ]() // holds machine classes names generated with Capacity and no VirtualCapacity
1224+ for _ , mClz := range mClasses1 {
1225+ className := mClz ["name" ].(string )
1226+ if strings .Contains (className , namePool1 ) {
1227+ nt := mClz ["nodeTemplate" ].(machinev1alpha1.NodeTemplate )
1228+ GinkgoWriter .Printf ("WithOnlyCapacity: MachineClassName:%q,Capacity:%v\n " , className , nt .Capacity )
1229+ classNames1 .Insert (className )
1230+ Expect (nt .Capacity ).To (Equal (expectedNodeTemplateCapacity ))
1231+ }
1232+ }
1233+
1234+ GinkgoWriter .Println ("Regenerate MachineClasses with new VirtualCapacity" )
1235+ virtualResourceName := corev1 .ResourceName ("subdomain.domain.com/virtual-resource-name" )
1236+ virtualResourceQuant1 := resource .MustParse ("1024" )
1237+ virtualCapacityResources1 := corev1.ResourceList {
1238+ virtualResourceName : virtualResourceQuant1 ,
1239+ }
1240+ w2 := w .DeepCopy ()
1241+ w2 .Spec .Pools [0 ].NodeAgentSecretName = ptr .To ("dummy" ) // To Ensure that WorkerPoolHashV2 is used
1242+ w2 .Spec .Pools [0 ].ProviderConfig = & runtime.RawExtension {
1243+ Raw : encode (& api.WorkerConfig {
1244+ NodeTemplate : & extensionsv1alpha1.NodeTemplate {
1245+ Capacity : capacityResources ,
1246+ VirtualCapacity : virtualCapacityResources1 , // We now additionally set the VirtualCapacity
1247+ },
1248+ }),
1249+ }
1250+ wd2 , err := NewWorkerDelegate (c , decoder , scheme , chartApplier , "" , w2 , cluster )
1251+ Expect (err ).NotTo (HaveOccurred ())
1252+ _ , err = wd2 .GenerateMachineDeployments (ctx )
1253+ Expect (err ).NotTo (HaveOccurred ())
1254+ workerDelegate2 := wd2 .(* WorkerDelegate )
1255+ mClasses2 := workerDelegate2 .GetMachineClasses ()
1256+ classNames2 := sets .New [string ]() // holds machine classes names generated with both Capacity and new VirtualCapacity.
1257+ for _ , mClz := range mClasses2 {
1258+ className := mClz ["name" ].(string )
1259+ if strings .Contains (className , namePool1 ) {
1260+ nt := mClz ["nodeTemplate" ].(machinev1alpha1.NodeTemplate )
1261+ GinkgoWriter .Printf ("WithAdditionOfVirtualCapacity: MachineClassName:%q,Capacity:%v,VirtualCapacity:%v\n " , className , nt .Capacity , nt .VirtualCapacity )
1262+ Expect (nt .Capacity ).To (Equal (expectedNodeTemplateCapacity ))
1263+ Expect (nt .VirtualCapacity ).To (Equal (virtualCapacityResources1 ))
1264+ classNames2 .Insert (className )
1265+ }
1266+ }
1267+ Expect (classNames1 ).To (Equal (classNames2 ))
1268+
1269+ GinkgoWriter .Println ("Regenerate MachineClasses with change in VirtualCapacity" )
1270+ virtualResourceQuant2 := resource .MustParse ("2048" )
1271+ virtualCapacityResources2 := corev1.ResourceList {
1272+ virtualResourceName : virtualResourceQuant2 ,
1273+ }
1274+ w3 := w .DeepCopy ()
1275+ w3 .Spec .Pools [0 ].NodeAgentSecretName = ptr .To ("dummy" ) // To Ensure that WorkerPoolHashV2 is used
1276+ w3 .Spec .Pools [0 ].ProviderConfig = & runtime.RawExtension {
1277+ Raw : encode (& api.WorkerConfig {
1278+ NodeTemplate : & extensionsv1alpha1.NodeTemplate {
1279+ Capacity : capacityResources ,
1280+ VirtualCapacity : virtualCapacityResources2 , // We now change the VirtualCapacity
1281+ },
1282+ }),
1283+ }
1284+ wd3 , err := NewWorkerDelegate (c , decoder , scheme , chartApplier , "" , w3 , cluster )
1285+ Expect (err ).NotTo (HaveOccurred ())
1286+ _ , err = wd3 .GenerateMachineDeployments (ctx )
1287+ Expect (err ).NotTo (HaveOccurred ())
1288+ workerDelegate3 := wd3 .(* WorkerDelegate )
1289+ mClasses3 := workerDelegate3 .GetMachineClasses ()
1290+ classNames3 := sets .New [string ]() // holds machine classes names generated with both Capacity and VirtualCapacity changed
1291+ for _ , mClz := range mClasses3 {
1292+ className := mClz ["name" ].(string )
1293+ if strings .Contains (className , namePool1 ) {
1294+ nt := mClz ["nodeTemplate" ].(machinev1alpha1.NodeTemplate )
1295+ GinkgoWriter .Printf ("WithChangeOfVirtualCapacity: MachineClassName:%q,Capacity:%v,VirtualCapacity:%v\n " , className , nt .Capacity , nt .VirtualCapacity )
1296+ Expect (nt .Capacity ).To (Equal (expectedNodeTemplateCapacity ))
1297+ Expect (nt .VirtualCapacity ).To (Equal (virtualCapacityResources2 ))
1298+ classNames3 .Insert (className )
1299+ }
1300+ }
1301+ // classNames with change in VirtualCapacity should be unchanged
1302+ Expect (classNames3 ).To (Equal (classNames2 ))
1303+ Expect (classNames3 ).To (Equal (classNames1 ))
1304+ })
11871305
11881306 It ("should fail because the version is invalid" , func () {
11891307 clusterWithoutImages .Shoot .Spec .Kubernetes .Version = "invalid"
@@ -1441,7 +1559,7 @@ var _ = Describe("Machines", func() {
14411559 })
14421560
14431561 It ("should return the expected hash data for Rolling update strategy" , func () {
1444- Expect (ComputeAdditionalHashDataV2 (pool )).To (Equal ([]string {
1562+ Expect (ComputeAdditionalHashDataV2 (pool , & workerConfig )).To (Equal ([]string {
14451563 "true" ,
14461564 "10Gi" ,
14471565 "type1" ,
0 commit comments