@@ -812,6 +812,184 @@ func TestAWSMachinePoolReconciler(t *testing.T) {
812
812
g .Eventually (recorder .Events ).Should (Receive (ContainSubstring ("DeletionInProgress" )))
813
813
})
814
814
})
815
+ t .Run ("Lifecycle Hooks" , func (t * testing.T ) {
816
+ t .Run ("New lifecycle hook is added" , func (t * testing.T ) {
817
+ g := NewWithT (t )
818
+ setup (t , g )
819
+ defer teardown (t , g )
820
+
821
+ newLifecycleHook := expinfrav1.AWSLifecycleHook {
822
+ Name : "new-hook" ,
823
+ LifecycleTransition : "autoscaling:EC2_INSTANCE_LAUNCHING" ,
824
+ }
825
+ ms .AWSMachinePool .Spec .AWSLifecycleHooks = append (ms .AWSMachinePool .Spec .AWSLifecycleHooks , newLifecycleHook )
826
+
827
+ reconSvc .EXPECT ().ReconcileLaunchTemplate (gomock .Any (), gomock .Any (), gomock .Any (), gomock .Any ()).Return (nil )
828
+ asgSvc .EXPECT ().DescribeLifecycleHooks (ms .Name ()).Return (nil , nil )
829
+ asgSvc .EXPECT ().DescribeLifecycleHook (ms .Name (), & newLifecycleHook ).Return (nil , nil )
830
+ asgSvc .EXPECT ().CreateLifecycleHook (ms .Name (), & newLifecycleHook ).Return (nil )
831
+ reconSvc .EXPECT ().ReconcileTags (gomock .Any (), gomock .Any ()).Return (nil )
832
+ asgSvc .EXPECT ().GetASGByName (gomock .Any ()).DoAndReturn (func (scope * scope.MachinePoolScope ) (* expinfrav1.AutoScalingGroup , error ) {
833
+ g .Expect (scope .Name ()).To (Equal ("test" ))
834
+
835
+ // No difference to `AWSMachinePool.spec`
836
+ return & expinfrav1.AutoScalingGroup {
837
+ Name : scope .Name (),
838
+ Subnets : []string {
839
+ "subnet-1" ,
840
+ },
841
+ MinSize : awsMachinePool .Spec .MinSize ,
842
+ MaxSize : awsMachinePool .Spec .MaxSize ,
843
+ MixedInstancesPolicy : awsMachinePool .Spec .MixedInstancesPolicy .DeepCopy (),
844
+ }, nil
845
+ })
846
+ asgSvc .EXPECT ().DescribeLifecycleHooks (gomock .Any ()).Return (nil , nil ).AnyTimes ()
847
+ asgSvc .EXPECT ().SubnetIDs (gomock .Any ()).Return ([]string {"subnet-1" }, nil ) // no change
848
+ // No changes, so there must not be an ASG update!
849
+ asgSvc .EXPECT ().UpdateASG (gomock .Any ()).Times (0 )
850
+
851
+ err := reconciler .reconcileNormal (context .Background (), ms , cs , cs )
852
+ g .Expect (err ).To (Succeed ())
853
+ })
854
+ t .Run ("Lifecycle hook to remove" , func (t * testing.T ) {
855
+ g := NewWithT (t )
856
+ setup (t , g )
857
+ defer teardown (t , g )
858
+
859
+ reconSvc .EXPECT ().ReconcileLaunchTemplate (gomock .Any (), gomock .Any (), gomock .Any (), gomock .Any ()).Return (nil )
860
+ asgSvc .EXPECT ().DescribeLifecycleHooks (ms .Name ()).Return ([]* expinfrav1.AWSLifecycleHook {
861
+ {
862
+ Name : "hook-to-remove" ,
863
+ LifecycleTransition : "autoscaling:EC2_INSTANCE_LAUNCHING" ,
864
+ },
865
+ }, nil )
866
+ asgSvc .EXPECT ().DeleteLifecycleHook (ms .Name (), & expinfrav1.AWSLifecycleHook {
867
+ Name : "hook-to-remove" ,
868
+ LifecycleTransition : "autoscaling:EC2_INSTANCE_LAUNCHING" ,
869
+ }).Return (nil )
870
+ reconSvc .EXPECT ().ReconcileTags (gomock .Any (), gomock .Any ()).Return (nil )
871
+ asgSvc .EXPECT ().GetASGByName (gomock .Any ()).DoAndReturn (func (scope * scope.MachinePoolScope ) (* expinfrav1.AutoScalingGroup , error ) {
872
+ g .Expect (scope .Name ()).To (Equal ("test" ))
873
+
874
+ // No difference to `AWSMachinePool.spec`
875
+ return & expinfrav1.AutoScalingGroup {
876
+ Name : scope .Name (),
877
+ Subnets : []string {
878
+ "subnet-1" ,
879
+ },
880
+ MinSize : awsMachinePool .Spec .MinSize ,
881
+ MaxSize : awsMachinePool .Spec .MaxSize ,
882
+ MixedInstancesPolicy : awsMachinePool .Spec .MixedInstancesPolicy .DeepCopy (),
883
+ }, nil
884
+ })
885
+ asgSvc .EXPECT ().DescribeLifecycleHooks (gomock .Any ()).Return (nil , nil ).AnyTimes ()
886
+ asgSvc .EXPECT ().SubnetIDs (gomock .Any ()).Return ([]string {"subnet-1" }, nil ) // no change
887
+ // No changes, so there must not be an ASG update!
888
+ asgSvc .EXPECT ().UpdateASG (gomock .Any ()).Times (0 )
889
+
890
+ err := reconciler .reconcileNormal (context .Background (), ms , cs , cs )
891
+ g .Expect (err ).To (Succeed ())
892
+ })
893
+ t .Run ("One to add, one to remove" , func (t * testing.T ) {
894
+ g := NewWithT (t )
895
+ setup (t , g )
896
+ defer teardown (t , g )
897
+ newLifecycleHook := expinfrav1.AWSLifecycleHook {
898
+ Name : "new-hook" ,
899
+ LifecycleTransition : "autoscaling:EC2_INSTANCE_LAUNCHING" ,
900
+ }
901
+ ms .AWSMachinePool .Spec .AWSLifecycleHooks = append (ms .AWSMachinePool .Spec .AWSLifecycleHooks , newLifecycleHook )
902
+
903
+ reconSvc .EXPECT ().ReconcileLaunchTemplate (gomock .Any (), gomock .Any (), gomock .Any (), gomock .Any ()).Return (nil )
904
+ asgSvc .EXPECT ().DescribeLifecycleHook (ms .Name (), & newLifecycleHook ).Return (nil , nil )
905
+ asgSvc .EXPECT ().CreateLifecycleHook (ms .Name (), & newLifecycleHook ).Return (nil )
906
+ asgSvc .EXPECT ().DescribeLifecycleHooks (ms .Name ()).Return ([]* expinfrav1.AWSLifecycleHook {
907
+ {
908
+ Name : "new-hook" ,
909
+ LifecycleTransition : "autoscaling:EC2_INSTANCE_LAUNCHING" ,
910
+ },
911
+ {
912
+ Name : "hook-to-remove" ,
913
+ LifecycleTransition : "autoscaling:EC2_INSTANCE_LAUNCHING" ,
914
+ },
915
+ }, nil )
916
+ asgSvc .EXPECT ().DeleteLifecycleHook (ms .Name (), & expinfrav1.AWSLifecycleHook {
917
+ Name : "hook-to-remove" ,
918
+ LifecycleTransition : "autoscaling:EC2_INSTANCE_LAUNCHING" ,
919
+ }).Return (nil )
920
+ reconSvc .EXPECT ().ReconcileTags (gomock .Any (), gomock .Any ()).Return (nil )
921
+ asgSvc .EXPECT ().GetASGByName (gomock .Any ()).DoAndReturn (func (scope * scope.MachinePoolScope ) (* expinfrav1.AutoScalingGroup , error ) {
922
+ g .Expect (scope .Name ()).To (Equal ("test" ))
923
+
924
+ // No difference to `AWSMachinePool.spec`
925
+ return & expinfrav1.AutoScalingGroup {
926
+ Name : scope .Name (),
927
+ Subnets : []string {
928
+ "subnet-1" ,
929
+ },
930
+ MinSize : awsMachinePool .Spec .MinSize ,
931
+ MaxSize : awsMachinePool .Spec .MaxSize ,
932
+ MixedInstancesPolicy : awsMachinePool .Spec .MixedInstancesPolicy .DeepCopy (),
933
+ }, nil
934
+ })
935
+ asgSvc .EXPECT ().DescribeLifecycleHooks (gomock .Any ()).Return (nil , nil ).AnyTimes ()
936
+ asgSvc .EXPECT ().SubnetIDs (gomock .Any ()).Return ([]string {"subnet-1" }, nil ) // no change
937
+ // No changes, so there must not be an ASG update!
938
+ asgSvc .EXPECT ().UpdateASG (gomock .Any ()).Times (0 )
939
+
940
+ err := reconciler .reconcileNormal (context .Background (), ms , cs , cs )
941
+ g .Expect (err ).To (Succeed ())
942
+ })
943
+ t .Run ("Update hook" , func (t * testing.T ) {
944
+ g := NewWithT (t )
945
+ setup (t , g )
946
+ defer teardown (t , g )
947
+ updateLifecycleHook := expinfrav1.AWSLifecycleHook {
948
+ Name : "hook-to-update" ,
949
+ LifecycleTransition : "autoscaling:EC2_INSTANCE_TERMINATING" ,
950
+ }
951
+ ms .AWSMachinePool .Spec .AWSLifecycleHooks = append (ms .AWSMachinePool .Spec .AWSLifecycleHooks , updateLifecycleHook )
952
+
953
+ reconSvc .EXPECT ().ReconcileLaunchTemplate (gomock .Any (), gomock .Any (), gomock .Any (), gomock .Any ()).Return (nil )
954
+ asgSvc .EXPECT ().DescribeLifecycleHook (ms .Name (), & updateLifecycleHook ).Return (& expinfrav1.AWSLifecycleHook {
955
+ Name : "hook-to-update" ,
956
+ LifecycleTransition : "autoscaling:EC2_INSTANCE_LAUNCHING" ,
957
+ }, nil )
958
+ asgSvc .EXPECT ().LifecycleHookNeedsUpdate (& expinfrav1.AWSLifecycleHook {
959
+ Name : "hook-to-update" ,
960
+ LifecycleTransition : "autoscaling:EC2_INSTANCE_LAUNCHING" ,
961
+ }, & updateLifecycleHook ).Return (true )
962
+ asgSvc .EXPECT ().UpdateLifecycleHook (ms .Name (), & updateLifecycleHook ).Return (nil )
963
+ asgSvc .EXPECT ().DescribeLifecycleHooks (ms .Name ()).Return ([]* expinfrav1.AWSLifecycleHook {
964
+ {
965
+ Name : "hook-to-update" ,
966
+ LifecycleTransition : "autoscaling:EC2_INSTANCE_LAUNCHING" ,
967
+ },
968
+ }, nil )
969
+ reconSvc .EXPECT ().ReconcileTags (gomock .Any (), gomock .Any ()).Return (nil )
970
+ asgSvc .EXPECT ().GetASGByName (gomock .Any ()).DoAndReturn (func (scope * scope.MachinePoolScope ) (* expinfrav1.AutoScalingGroup , error ) {
971
+ g .Expect (scope .Name ()).To (Equal ("test" ))
972
+
973
+ // No difference to `AWSMachinePool.spec`
974
+ return & expinfrav1.AutoScalingGroup {
975
+ Name : scope .Name (),
976
+ Subnets : []string {
977
+ "subnet-1" ,
978
+ },
979
+ MinSize : awsMachinePool .Spec .MinSize ,
980
+ MaxSize : awsMachinePool .Spec .MaxSize ,
981
+ MixedInstancesPolicy : awsMachinePool .Spec .MixedInstancesPolicy .DeepCopy (),
982
+ }, nil
983
+ })
984
+ asgSvc .EXPECT ().DescribeLifecycleHooks (gomock .Any ()).Return (nil , nil ).AnyTimes ()
985
+ asgSvc .EXPECT ().SubnetIDs (gomock .Any ()).Return ([]string {"subnet-1" }, nil ) // no change
986
+ // No changes, so there must not be an ASG update!
987
+ asgSvc .EXPECT ().UpdateASG (gomock .Any ()).Times (0 )
988
+
989
+ err := reconciler .reconcileNormal (context .Background (), ms , cs , cs )
990
+ g .Expect (err ).To (Succeed ())
991
+ })
992
+ })
815
993
}
816
994
817
995
// TODO: This was taken from awsmachine_controller_test, i think it should be moved to elsewhere in both locations like test/helpers.
0 commit comments