@@ -40,6 +40,7 @@ import (
40
40
"k8s.io/utils/ptr"
41
41
clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1"
42
42
expv1 "sigs.k8s.io/cluster-api/exp/api/v1beta1"
43
+ "sigs.k8s.io/cluster-api/util/conditions"
43
44
"sigs.k8s.io/controller-runtime/pkg/client"
44
45
"sigs.k8s.io/controller-runtime/pkg/client/fake"
45
46
@@ -1577,6 +1578,179 @@ func TestMachinePoolScope_applyAzureMachinePoolMachines(t *testing.T) {
1577
1578
}
1578
1579
}
1579
1580
1581
+ func TestMachinePoolScope_setProvisioningStateAndConditions (t * testing.T ) {
1582
+ scheme := runtime .NewScheme ()
1583
+ _ = clusterv1 .AddToScheme (scheme )
1584
+ _ = infrav1exp .AddToScheme (scheme )
1585
+
1586
+ tests := []struct {
1587
+ Name string
1588
+ Setup func (mp * expv1.MachinePool , amp * infrav1exp.AzureMachinePool , cb * fake.ClientBuilder )
1589
+ Verify func (g * WithT , amp * infrav1exp.AzureMachinePool , c client.Client )
1590
+ ProvisioningState infrav1.ProvisioningState
1591
+ }{
1592
+ {
1593
+ Name : "if provisioning state is set to Succeeded and replicas match, MachinePool is ready and conditions match" ,
1594
+ Setup : func (mp * expv1.MachinePool , amp * infrav1exp.AzureMachinePool , cb * fake.ClientBuilder ) {
1595
+ mp .Spec .Replicas = ptr.To [int32 ](1 )
1596
+ amp .Status .Replicas = 1
1597
+ },
1598
+ Verify : func (g * WithT , amp * infrav1exp.AzureMachinePool , c client.Client ) {
1599
+ g .Expect (amp .Status .Ready ).To (BeTrue ())
1600
+ g .Expect (conditions .Get (amp , infrav1 .ScaleSetRunningCondition ).Status ).To (Equal (corev1 .ConditionTrue ))
1601
+ g .Expect (conditions .Get (amp , infrav1 .ScaleSetModelUpdatedCondition ).Status ).To (Equal (corev1 .ConditionTrue ))
1602
+ g .Expect (conditions .Get (amp , infrav1 .ScaleSetDesiredReplicasCondition ).Status ).To (Equal (corev1 .ConditionTrue ))
1603
+ },
1604
+ ProvisioningState : infrav1 .Succeeded ,
1605
+ },
1606
+ {
1607
+ Name : "if provisioning state is set to Succeeded and replicas are higher on AzureMachinePool, MachinePool is ready and ScalingDown" ,
1608
+ Setup : func (mp * expv1.MachinePool , amp * infrav1exp.AzureMachinePool , cb * fake.ClientBuilder ) {
1609
+ mp .Spec .Replicas = ptr.To [int32 ](1 )
1610
+ amp .Status .Replicas = 2
1611
+ },
1612
+ Verify : func (g * WithT , amp * infrav1exp.AzureMachinePool , c client.Client ) {
1613
+ g .Expect (amp .Status .Ready ).To (BeTrue ())
1614
+ condition := conditions .Get (amp , infrav1 .ScaleSetDesiredReplicasCondition )
1615
+ g .Expect (condition .Status ).To (Equal (corev1 .ConditionFalse ))
1616
+ g .Expect (condition .Reason ).To (Equal (infrav1 .ScaleSetScaleDownReason ))
1617
+ },
1618
+ ProvisioningState : infrav1 .Succeeded ,
1619
+ },
1620
+ {
1621
+ Name : "if provisioning state is set to Succeeded and replicas are lower on AzureMachinePool, MachinePool is ready and ScalingUp" ,
1622
+ Setup : func (mp * expv1.MachinePool , amp * infrav1exp.AzureMachinePool , cb * fake.ClientBuilder ) {
1623
+ mp .Spec .Replicas = ptr.To [int32 ](2 )
1624
+ amp .Status .Replicas = 1
1625
+ },
1626
+ Verify : func (g * WithT , amp * infrav1exp.AzureMachinePool , c client.Client ) {
1627
+ g .Expect (amp .Status .Ready ).To (BeTrue ())
1628
+ condition := conditions .Get (amp , infrav1 .ScaleSetDesiredReplicasCondition )
1629
+ g .Expect (condition .Status ).To (Equal (corev1 .ConditionFalse ))
1630
+ g .Expect (condition .Reason ).To (Equal (infrav1 .ScaleSetScaleUpReason ))
1631
+ },
1632
+ ProvisioningState : infrav1 .Succeeded ,
1633
+ },
1634
+ {
1635
+ Name : "if provisioning state is set to Updating, MachinePool is ready and scale set model is set to OutOfDate" ,
1636
+ Setup : func (mp * expv1.MachinePool , amp * infrav1exp.AzureMachinePool , cb * fake.ClientBuilder ) {},
1637
+ Verify : func (g * WithT , amp * infrav1exp.AzureMachinePool , c client.Client ) {
1638
+ g .Expect (amp .Status .Ready ).To (BeTrue ())
1639
+ condition := conditions .Get (amp , infrav1 .ScaleSetModelUpdatedCondition )
1640
+ g .Expect (condition .Status ).To (Equal (corev1 .ConditionFalse ))
1641
+ g .Expect (condition .Reason ).To (Equal (infrav1 .ScaleSetModelOutOfDateReason ))
1642
+ },
1643
+ ProvisioningState : infrav1 .Updating ,
1644
+ },
1645
+ {
1646
+ Name : "if provisioning state is set to Creating, MachinePool is NotReady and scale set running condition is set to Creating" ,
1647
+ Setup : func (mp * expv1.MachinePool , amp * infrav1exp.AzureMachinePool , cb * fake.ClientBuilder ) {},
1648
+ Verify : func (g * WithT , amp * infrav1exp.AzureMachinePool , c client.Client ) {
1649
+ g .Expect (amp .Status .Ready ).To (BeFalse ())
1650
+ condition := conditions .Get (amp , infrav1 .ScaleSetRunningCondition )
1651
+ g .Expect (condition .Status ).To (Equal (corev1 .ConditionFalse ))
1652
+ g .Expect (condition .Reason ).To (Equal (infrav1 .ScaleSetCreatingReason ))
1653
+ },
1654
+ ProvisioningState : infrav1 .Creating ,
1655
+ },
1656
+ {
1657
+ Name : "if provisioning state is set to Deleting, MachinePool is NotReady and scale set running condition is set to Deleting" ,
1658
+ Setup : func (mp * expv1.MachinePool , amp * infrav1exp.AzureMachinePool , cb * fake.ClientBuilder ) {},
1659
+ Verify : func (g * WithT , amp * infrav1exp.AzureMachinePool , c client.Client ) {
1660
+ g .Expect (amp .Status .Ready ).To (BeFalse ())
1661
+ condition := conditions .Get (amp , infrav1 .ScaleSetRunningCondition )
1662
+ g .Expect (condition .Status ).To (Equal (corev1 .ConditionFalse ))
1663
+ g .Expect (condition .Reason ).To (Equal (infrav1 .ScaleSetDeletingReason ))
1664
+ },
1665
+ ProvisioningState : infrav1 .Deleting ,
1666
+ },
1667
+ {
1668
+ Name : "if provisioning state is set to Failed, MachinePool ready state is not adjusted, and scale set running condition is set to Failed" ,
1669
+ Setup : func (mp * expv1.MachinePool , amp * infrav1exp.AzureMachinePool , cb * fake.ClientBuilder ) {},
1670
+ Verify : func (g * WithT , amp * infrav1exp.AzureMachinePool , c client.Client ) {
1671
+ condition := conditions .Get (amp , infrav1 .ScaleSetRunningCondition )
1672
+ g .Expect (condition .Status ).To (Equal (corev1 .ConditionFalse ))
1673
+ g .Expect (condition .Reason ).To (Equal (infrav1 .ScaleSetProvisionFailedReason ))
1674
+ },
1675
+ ProvisioningState : infrav1 .Failed ,
1676
+ },
1677
+ {
1678
+ Name : "if provisioning state is set to something not explicitly handled, MachinePool ready state is not adjusted, and scale set running condition is set to the ProvisioningState" ,
1679
+ Setup : func (mp * expv1.MachinePool , amp * infrav1exp.AzureMachinePool , cb * fake.ClientBuilder ) {},
1680
+ Verify : func (g * WithT , amp * infrav1exp.AzureMachinePool , c client.Client ) {
1681
+ condition := conditions .Get (amp , infrav1 .ScaleSetRunningCondition )
1682
+ g .Expect (condition .Status ).To (Equal (corev1 .ConditionFalse ))
1683
+ g .Expect (condition .Reason ).To (Equal (string (infrav1 .Migrating )))
1684
+ },
1685
+ ProvisioningState : infrav1 .Migrating ,
1686
+ },
1687
+ }
1688
+ for _ , tt := range tests {
1689
+ t .Run (tt .Name , func (t * testing.T ) {
1690
+ var (
1691
+ g = NewWithT (t )
1692
+ mockCtrl = gomock .NewController (t )
1693
+ cb = fake .NewClientBuilder ().WithScheme (scheme )
1694
+ cluster = & clusterv1.Cluster {
1695
+ ObjectMeta : metav1.ObjectMeta {
1696
+ Name : "cluster1" ,
1697
+ Namespace : "default" ,
1698
+ },
1699
+ Spec : clusterv1.ClusterSpec {
1700
+ InfrastructureRef : & corev1.ObjectReference {
1701
+ Name : "azCluster1" ,
1702
+ },
1703
+ },
1704
+ Status : clusterv1.ClusterStatus {
1705
+ InfrastructureReady : true ,
1706
+ },
1707
+ }
1708
+ mp = & expv1.MachinePool {
1709
+ ObjectMeta : metav1.ObjectMeta {
1710
+ Name : "mp1" ,
1711
+ Namespace : "default" ,
1712
+ OwnerReferences : []metav1.OwnerReference {
1713
+ {
1714
+ Name : "cluster1" ,
1715
+ Kind : "Cluster" ,
1716
+ APIVersion : clusterv1 .GroupVersion .String (),
1717
+ },
1718
+ },
1719
+ },
1720
+ }
1721
+ amp = & infrav1exp.AzureMachinePool {
1722
+ ObjectMeta : metav1.ObjectMeta {
1723
+ Name : "amp1" ,
1724
+ Namespace : "default" ,
1725
+ OwnerReferences : []metav1.OwnerReference {
1726
+ {
1727
+ Name : "mp1" ,
1728
+ Kind : "MachinePool" ,
1729
+ APIVersion : expv1 .GroupVersion .String (),
1730
+ },
1731
+ },
1732
+ },
1733
+ }
1734
+ vmssState = & azure.VMSS {}
1735
+ )
1736
+ defer mockCtrl .Finish ()
1737
+
1738
+ tt .Setup (mp , amp , cb .WithObjects (amp , cluster ))
1739
+ s := & MachinePoolScope {
1740
+ client : cb .Build (),
1741
+ ClusterScoper : & ClusterScope {
1742
+ Cluster : cluster ,
1743
+ },
1744
+ MachinePool : mp ,
1745
+ AzureMachinePool : amp ,
1746
+ vmssState : vmssState ,
1747
+ }
1748
+ s .setProvisioningStateAndConditions (tt .ProvisioningState )
1749
+ tt .Verify (g , s .AzureMachinePool , s .client )
1750
+ })
1751
+ }
1752
+ }
1753
+
1580
1754
func TestBootstrapDataChanges (t * testing.T ) {
1581
1755
ctx , cancel := context .WithCancel (context .Background ())
1582
1756
defer cancel ()
0 commit comments