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  }