sigs.k8s.io/cluster-api@v1.7.1/cmd/clusterctl/client/alpha/rollout_resumer_test.go (about) 1 /* 2 Copyright 2020 The Kubernetes Authors. 3 4 Licensed under the Apache License, Version 2.0 (the "License"); 5 you may not use this file except in compliance with the License. 6 You may obtain a copy of the License at 7 8 http://www.apache.org/licenses/LICENSE-2.0 9 10 Unless required by applicable law or agreed to in writing, software 11 distributed under the License is distributed on an "AS IS" BASIS, 12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 See the License for the specific language governing permissions and 14 limitations under the License. 15 */ 16 17 package alpha 18 19 import ( 20 "context" 21 "testing" 22 23 . "github.com/onsi/gomega" 24 corev1 "k8s.io/api/core/v1" 25 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" 26 "sigs.k8s.io/controller-runtime/pkg/client" 27 28 clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" 29 "sigs.k8s.io/cluster-api/cmd/clusterctl/internal/test" 30 controlplanev1 "sigs.k8s.io/cluster-api/controlplane/kubeadm/api/v1beta1" 31 "sigs.k8s.io/cluster-api/util/annotations" 32 ) 33 34 func Test_ObjectResumer(t *testing.T) { 35 type fields struct { 36 objs []client.Object 37 ref corev1.ObjectReference 38 } 39 tests := []struct { 40 name string 41 fields fields 42 wantErr bool 43 wantPaused bool 44 }{ 45 { 46 name: "paused machinedeployment should be unpaused", 47 fields: fields{ 48 objs: []client.Object{ 49 &clusterv1.MachineDeployment{ 50 TypeMeta: metav1.TypeMeta{ 51 Kind: "MachineDeployment", 52 }, 53 ObjectMeta: metav1.ObjectMeta{ 54 Namespace: "default", 55 Name: "md-1", 56 }, 57 Spec: clusterv1.MachineDeploymentSpec{ 58 Paused: true, 59 }, 60 }, 61 }, 62 ref: corev1.ObjectReference{ 63 Kind: MachineDeployment, 64 Name: "md-1", 65 Namespace: "default", 66 }, 67 }, 68 wantErr: false, 69 wantPaused: false, 70 }, 71 { 72 name: "unpausing an already unpaused machinedeployment should return error", 73 fields: fields{ 74 objs: []client.Object{ 75 &clusterv1.MachineDeployment{ 76 TypeMeta: metav1.TypeMeta{ 77 Kind: "MachineDeployment", 78 }, 79 ObjectMeta: metav1.ObjectMeta{ 80 Namespace: "default", 81 Name: "md-1", 82 }, 83 Spec: clusterv1.MachineDeploymentSpec{ 84 Paused: false, 85 }, 86 }, 87 }, 88 ref: corev1.ObjectReference{ 89 Kind: MachineDeployment, 90 Name: "md-1", 91 Namespace: "default", 92 }, 93 }, 94 wantErr: true, 95 wantPaused: false, 96 }, 97 { 98 name: "paused kubeadmcontrolplane should be unpaused", 99 fields: fields{ 100 objs: []client.Object{ 101 &controlplanev1.KubeadmControlPlane{ 102 TypeMeta: metav1.TypeMeta{ 103 Kind: "KubeadmControlPlane", 104 }, 105 ObjectMeta: metav1.ObjectMeta{ 106 Namespace: "default", 107 Name: "kcp", 108 Annotations: map[string]string{ 109 clusterv1.PausedAnnotation: "true", 110 }, 111 }, 112 }, 113 }, 114 ref: corev1.ObjectReference{ 115 Kind: KubeadmControlPlane, 116 Name: "kcp", 117 Namespace: "default", 118 }, 119 }, 120 wantErr: false, 121 wantPaused: false, 122 }, 123 { 124 name: "unpausing an already unpaused kubeadmcontrolplane should return error", 125 fields: fields{ 126 objs: []client.Object{ 127 &controlplanev1.KubeadmControlPlane{ 128 TypeMeta: metav1.TypeMeta{ 129 Kind: "KubeadmControlPlane", 130 }, 131 ObjectMeta: metav1.ObjectMeta{ 132 Namespace: "default", 133 Name: "kcp", 134 }, 135 }, 136 }, 137 ref: corev1.ObjectReference{ 138 Kind: KubeadmControlPlane, 139 Name: "kcp", 140 Namespace: "default", 141 }, 142 }, 143 wantErr: true, 144 wantPaused: false, 145 }, 146 } 147 for _, tt := range tests { 148 t.Run(tt.name, func(t *testing.T) { 149 g := NewWithT(t) 150 r := newRolloutClient() 151 proxy := test.NewFakeProxy().WithObjs(tt.fields.objs...) 152 err := r.ObjectResumer(context.Background(), proxy, tt.fields.ref) 153 if tt.wantErr { 154 g.Expect(err).To(HaveOccurred()) 155 return 156 } 157 g.Expect(err).ToNot(HaveOccurred()) 158 for _, obj := range tt.fields.objs { 159 cl, err := proxy.NewClient(context.Background()) 160 g.Expect(err).ToNot(HaveOccurred()) 161 key := client.ObjectKeyFromObject(obj) 162 switch obj.(type) { 163 case *clusterv1.MachineDeployment: 164 md := &clusterv1.MachineDeployment{} 165 err = cl.Get(context.TODO(), key, md) 166 g.Expect(err).ToNot(HaveOccurred()) 167 g.Expect(md.Spec.Paused).To(Equal(tt.wantPaused)) 168 case *controlplanev1.KubeadmControlPlane: 169 kcp := &controlplanev1.KubeadmControlPlane{} 170 err = cl.Get(context.TODO(), key, kcp) 171 g.Expect(err).ToNot(HaveOccurred()) 172 g.Expect(annotations.HasPaused(kcp.GetObjectMeta())).To(Equal(tt.wantPaused)) 173 } 174 } 175 }) 176 } 177 }