sigs.k8s.io/cluster-api@v1.7.1/cmd/clusterctl/client/alpha/rollout_restarter_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 "time" 23 24 . "github.com/onsi/gomega" 25 corev1 "k8s.io/api/core/v1" 26 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" 27 "sigs.k8s.io/controller-runtime/pkg/client" 28 29 clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" 30 "sigs.k8s.io/cluster-api/cmd/clusterctl/internal/test" 31 controlplanev1 "sigs.k8s.io/cluster-api/controlplane/kubeadm/api/v1beta1" 32 ) 33 34 func Test_ObjectRestarter(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 wantRollout bool 44 }{ 45 { 46 name: "machinedeployment should have rolloutAfter", 47 fields: fields{ 48 objs: []client.Object{ 49 &clusterv1.MachineDeployment{ 50 TypeMeta: metav1.TypeMeta{ 51 Kind: "MachineDeployment", 52 APIVersion: "cluster.x-k8s.io/v1beta1", 53 }, 54 ObjectMeta: metav1.ObjectMeta{ 55 Namespace: "default", 56 Name: "md-1", 57 }, 58 }, 59 }, 60 ref: corev1.ObjectReference{ 61 Kind: MachineDeployment, 62 Name: "md-1", 63 Namespace: "default", 64 }, 65 }, 66 wantErr: false, 67 wantRollout: true, 68 }, 69 { 70 name: "paused machinedeployment should not have rolloutAfter", 71 fields: fields{ 72 objs: []client.Object{ 73 &clusterv1.MachineDeployment{ 74 TypeMeta: metav1.TypeMeta{ 75 Kind: "MachineDeployment", 76 APIVersion: "cluster.x-k8s.io/v1beta1", 77 }, 78 ObjectMeta: metav1.ObjectMeta{ 79 Namespace: "default", 80 Name: "md-1", 81 }, 82 Spec: clusterv1.MachineDeploymentSpec{ 83 Paused: true, 84 }, 85 }, 86 }, 87 ref: corev1.ObjectReference{ 88 Kind: MachineDeployment, 89 Name: "md-1", 90 Namespace: "default", 91 }, 92 }, 93 wantErr: true, 94 wantRollout: false, 95 }, 96 { 97 name: "machinedeployment with spec.rolloutAfter should not be updatable", 98 fields: fields{ 99 objs: []client.Object{ 100 &clusterv1.MachineDeployment{ 101 TypeMeta: metav1.TypeMeta{ 102 Kind: "MachineDeployment", 103 APIVersion: "cluster.x-k8s.io/v1beta1", 104 }, 105 ObjectMeta: metav1.ObjectMeta{ 106 Namespace: "default", 107 Name: "md-1", 108 }, 109 Spec: clusterv1.MachineDeploymentSpec{ 110 RolloutAfter: &metav1.Time{Time: time.Now().Local().Add(time.Hour)}, 111 }, 112 }, 113 }, 114 ref: corev1.ObjectReference{ 115 Kind: MachineDeployment, 116 Name: "md-1", 117 Namespace: "default", 118 }, 119 }, 120 wantErr: true, 121 wantRollout: false, 122 }, 123 { 124 name: "kubeadmcontrolplane should have rolloutAfter", 125 fields: fields{ 126 objs: []client.Object{ 127 &controlplanev1.KubeadmControlPlane{ 128 TypeMeta: metav1.TypeMeta{ 129 Kind: "KubeadmControlPlane", 130 APIVersion: "controlplane.cluster.x-k8s.io/v1beta1", 131 }, 132 ObjectMeta: metav1.ObjectMeta{ 133 Namespace: "default", 134 Name: "kcp", 135 }, 136 }, 137 }, 138 ref: corev1.ObjectReference{ 139 Kind: KubeadmControlPlane, 140 Name: "kcp", 141 Namespace: "default", 142 }, 143 }, 144 wantErr: false, 145 wantRollout: true, 146 }, 147 { 148 name: "paused kubeadmcontrolplane should not have rolloutAfter", 149 fields: fields{ 150 objs: []client.Object{ 151 &controlplanev1.KubeadmControlPlane{ 152 TypeMeta: metav1.TypeMeta{ 153 Kind: "KubeadmControlPlane", 154 APIVersion: "controlplane.cluster.x-k8s.io/v1beta1", 155 }, 156 ObjectMeta: metav1.ObjectMeta{ 157 Namespace: "default", 158 Name: "kcp", 159 Annotations: map[string]string{ 160 clusterv1.PausedAnnotation: "true", 161 }, 162 }, 163 }, 164 }, 165 ref: corev1.ObjectReference{ 166 Kind: KubeadmControlPlane, 167 Name: "kcp", 168 Namespace: "default", 169 }, 170 }, 171 wantErr: true, 172 wantRollout: false, 173 }, 174 { 175 name: "kubeadmcontrolplane with spec.rolloutAfter should not be updatable", 176 fields: fields{ 177 objs: []client.Object{ 178 &controlplanev1.KubeadmControlPlane{ 179 TypeMeta: metav1.TypeMeta{ 180 Kind: "KubeadmControlPlane", 181 APIVersion: "controlplane.cluster.x-k8s.io/v1beta1", 182 }, 183 ObjectMeta: metav1.ObjectMeta{ 184 Namespace: "default", 185 Name: "kcp", 186 }, 187 Spec: controlplanev1.KubeadmControlPlaneSpec{ 188 RolloutAfter: &metav1.Time{Time: time.Now().Local().Add(time.Hour)}, 189 }, 190 }, 191 }, 192 ref: corev1.ObjectReference{ 193 Kind: KubeadmControlPlane, 194 Name: "kcp", 195 Namespace: "default", 196 }, 197 }, 198 wantErr: true, 199 wantRollout: false, 200 }, 201 } 202 for _, tt := range tests { 203 t.Run(tt.name, func(t *testing.T) { 204 g := NewWithT(t) 205 r := newRolloutClient() 206 proxy := test.NewFakeProxy().WithObjs(tt.fields.objs...) 207 err := r.ObjectRestarter(context.Background(), proxy, tt.fields.ref) 208 if tt.wantErr { 209 g.Expect(err).To(HaveOccurred()) 210 return 211 } 212 g.Expect(err).ToNot(HaveOccurred()) 213 for _, obj := range tt.fields.objs { 214 cl, err := proxy.NewClient(context.Background()) 215 g.Expect(err).ToNot(HaveOccurred()) 216 key := client.ObjectKeyFromObject(obj) 217 switch obj.(type) { 218 case *clusterv1.MachineDeployment: 219 md := &clusterv1.MachineDeployment{} 220 err = cl.Get(context.TODO(), key, md) 221 g.Expect(err).ToNot(HaveOccurred()) 222 if tt.wantRollout { 223 g.Expect(md.Spec.RolloutAfter).NotTo(BeNil()) 224 } else { 225 g.Expect(md.Spec.RolloutAfter).To(BeNil()) 226 } 227 case *controlplanev1.KubeadmControlPlane: 228 kcp := &controlplanev1.KubeadmControlPlane{} 229 err = cl.Get(context.TODO(), key, kcp) 230 g.Expect(err).ToNot(HaveOccurred()) 231 if tt.wantRollout { 232 g.Expect(kcp.Spec.RolloutAfter).NotTo(BeNil()) 233 } else { 234 g.Expect(kcp.Spec.RolloutAfter).To(BeNil()) 235 } 236 } 237 } 238 }) 239 } 240 }