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  }