Skip to content

Commit f58abed

Browse files
committed
✨ Add ControlPlane upgrade testCase
1 parent 88b84d7 commit f58abed

File tree

3 files changed

+77
-7
lines changed

3 files changed

+77
-7
lines changed

virtualcluster/pkg/controller/controllers/clusterversion_controller_test.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ var defaultClusterVersion = &v1alpha1.ClusterVersionSpec{
9595
},
9696
},
9797
UpdateStrategy: appsv1.StatefulSetUpdateStrategy{
98-
Type: appsv1.OnDeleteStatefulSetStrategyType,
98+
Type: appsv1.RollingUpdateStatefulSetStrategyType,
9999
},
100100
Template: corev1.PodTemplateSpec{
101101
ObjectMeta: metav1.ObjectMeta{
@@ -247,7 +247,7 @@ var defaultClusterVersion = &v1alpha1.ClusterVersionSpec{
247247
},
248248
},
249249
UpdateStrategy: appsv1.StatefulSetUpdateStrategy{
250-
Type: appsv1.OnDeleteStatefulSetStrategyType,
250+
Type: appsv1.RollingUpdateStatefulSetStrategyType,
251251
},
252252
Template: corev1.PodTemplateSpec{
253253
ObjectMeta: metav1.ObjectMeta{
@@ -302,6 +302,7 @@ var defaultClusterVersion = &v1alpha1.ClusterVersionSpec{
302302
{
303303
ContainerPort: 6443,
304304
Name: "api",
305+
Protocol: corev1.ProtocolTCP, // Must be explicit in 1.19
305306
},
306307
},
307308
LivenessProbe: &corev1.Probe{
@@ -453,7 +454,7 @@ var defaultClusterVersion = &v1alpha1.ClusterVersionSpec{
453454
},
454455
},
455456
UpdateStrategy: appsv1.StatefulSetUpdateStrategy{
456-
Type: appsv1.OnDeleteStatefulSetStrategyType,
457+
Type: appsv1.RollingUpdateStatefulSetStrategyType,
457458
},
458459
Template: corev1.PodTemplateSpec{
459460
ObjectMeta: metav1.ObjectMeta{

virtualcluster/pkg/controller/controllers/suite_test.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ import (
3434
"sigs.k8s.io/controller-runtime/pkg/log/zap"
3535

3636
"sigs.k8s.io/cluster-api-provider-nested/virtualcluster/pkg/apis"
37+
"sigs.k8s.io/cluster-api-provider-nested/virtualcluster/pkg/syncer/util/featuregate"
3738
// +kubebuilder:scaffold:imports
3839
)
3940

@@ -72,6 +73,8 @@ var _ = BeforeSuite(func() {
7273
err = apis.AddToScheme(scheme.Scheme)
7374
Expect(err).NotTo(HaveOccurred())
7475

76+
Expect(featuregate.DefaultFeatureGate.Set(featuregate.VirtualClusterApplyUpdate, true)).NotTo(HaveOccurred())
77+
7578
// +kubebuilder:scaffold:scheme
7679

7780
mgr, err := ctrl.NewManager(cfg, ctrl.Options{

virtualcluster/pkg/controller/controllers/virtualcluster_controller_test.go

Lines changed: 70 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,10 @@ package controllers
1818

1919
import (
2020
"context"
21+
"time"
2122

2223
. "github.com/onsi/ginkgo"
2324
. "github.com/onsi/gomega"
24-
2525
appsv1 "k8s.io/api/apps/v1"
2626
corev1 "k8s.io/api/core/v1"
2727
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -32,6 +32,7 @@ import (
3232

3333
tenancyv1alpha1 "sigs.k8s.io/cluster-api-provider-nested/virtualcluster/pkg/apis/tenancy/v1alpha1"
3434
"sigs.k8s.io/cluster-api-provider-nested/virtualcluster/pkg/controller/secret"
35+
"sigs.k8s.io/cluster-api-provider-nested/virtualcluster/pkg/syncer/constants"
3536
)
3637

3738
func getClusterObjectKey(instance *tenancyv1alpha1.VirtualCluster, name string) client.ObjectKey {
@@ -41,11 +42,14 @@ func getClusterObjectKey(instance *tenancyv1alpha1.VirtualCluster, name string)
4142
var _ = Describe("VirtualCluster Controller", func() {
4243

4344
Context("Reconcile VirtualCluster Cluster", func() {
45+
var cvInstance *tenancyv1alpha1.ClusterVersion
46+
var instance *tenancyv1alpha1.VirtualCluster
47+
4448
It("Should create resources successfully", func() {
4549
ctx := context.TODO()
4650
Expect(cli).ShouldNot(BeNil())
4751

48-
cvInstance := createClusterVersion()
52+
cvInstance = createClusterVersion()
4953
Expect(cli.Create(ctx, cvInstance)).Should(Succeed())
5054

5155
By("Fetching ClusterVersion")
@@ -55,7 +59,7 @@ var _ = Describe("VirtualCluster Controller", func() {
5559
return !apierrors.IsNotFound(err)
5660
}, timeout, interval).Should(BeTrue())
5761

58-
instance := &tenancyv1alpha1.VirtualCluster{
62+
instance = &tenancyv1alpha1.VirtualCluster{
5963
ObjectMeta: metav1.ObjectMeta{
6064
GenerateName: "virtualcluster-sample",
6165
Namespace: "default",
@@ -161,9 +165,71 @@ var _ = Describe("VirtualCluster Controller", func() {
161165
By("Faking controller-manager STS Status Updates")
162166
err = cli.Status().Update(ctx, cmSts)
163167
Expect(err).To(BeNil())
168+
})
169+
It("Should upgrade resources successfully", func() {
170+
ctx := context.TODO()
171+
Expect(cli).ShouldNot(BeNil())
172+
173+
objectKey := client.ObjectKeyFromObject(instance)
174+
175+
By("Checking cluster phase")
176+
Eventually(func() bool {
177+
err := cli.Get(ctx, objectKey, instance)
178+
return err == nil && instance.Status.Phase == tenancyv1alpha1.ClusterRunning
179+
}, time.Minute*5, interval).Should(BeTrue())
180+
181+
By("Updating ClusterVersion")
182+
cvInstance.Spec.ETCD.StatefulSet.Spec.Template.Spec.Containers[0].Args = append([]string{"-debug"}, cvInstance.Spec.ETCD.StatefulSet.Spec.Template.Spec.Containers[0].Args...)
183+
cvInstance.Spec.APIServer.StatefulSet.Spec.Template.Spec.Containers[0].Args = append([]string{"-v=7"}, cvInstance.Spec.APIServer.StatefulSet.Spec.Template.Spec.Containers[0].Args...)
184+
if cvInstance.Spec.APIServer.Service.Labels == nil {
185+
cvInstance.Spec.APIServer.Service.Labels = map[string]string{}
186+
}
187+
cvInstance.Spec.APIServer.Service.Labels["test-label"] = "test"
188+
cvInstance.Spec.ControllerManager.StatefulSet.Spec.Template.Spec.Containers[0].Args = append([]string{"-v=7"}, cvInstance.Spec.ControllerManager.StatefulSet.Spec.Template.Spec.Containers[0].Args...)
189+
cvInstance.ObjectMeta.ManagedFields = nil
190+
forceTrue := true
191+
Expect(cli.Patch(ctx, cvInstance, client.Apply, &client.PatchOptions{Force: &forceTrue, FieldManager: "test"})).Should(Succeed())
192+
193+
By("Enable upgrade for cluster")
194+
instance.Labels[constants.LabelVCReadyForUpgrade] = "true"
195+
instance.ObjectMeta.ManagedFields = nil
196+
Expect(cli.Patch(ctx, instance, client.Apply, &client.PatchOptions{Force: &forceTrue, FieldManager: "test"})).Should(Succeed())
197+
198+
By("APIServer Service upgraded")
199+
Eventually(func() bool {
200+
svcObjectKey := getClusterObjectKey(instance, "apiserver-svc")
201+
svc := &corev1.Service{}
202+
err := cli.Get(ctx, svcObjectKey, svc)
203+
return !apierrors.IsNotFound(err) && svc.Labels["test-label"] == "test"
204+
}, time.Minute*2, interval).Should(BeTrue())
164205

206+
etcdSts := &appsv1.StatefulSet{}
207+
By("Control Plane etcd StatefulSet upgraded")
208+
Eventually(func() bool {
209+
stsObjectKey := getClusterObjectKey(instance, "etcd")
210+
err := cli.Get(ctx, stsObjectKey, etcdSts)
211+
return !apierrors.IsNotFound(err) && etcdSts.Spec.Template.Spec.Containers[0].Args[0] == "-debug"
212+
}, time.Minute*2, interval).Should(BeTrue())
213+
214+
apiserverSts := &appsv1.StatefulSet{}
215+
By("Control Plane apiserver StatefulSet upgraded")
216+
Eventually(func() bool {
217+
stsObjectKey := getClusterObjectKey(instance, "apiserver")
218+
err := cli.Get(ctx, stsObjectKey, apiserverSts)
219+
return !apierrors.IsNotFound(err) && apiserverSts.Spec.Template.Spec.Containers[0].Args[0] == "-v=7"
220+
}, time.Minute*2, interval).Should(BeTrue())
221+
222+
cmSts := &appsv1.StatefulSet{}
223+
By("Control Plane controller-manager StatefulSet upgraded")
224+
Eventually(func() bool {
225+
stsObjectKey := getClusterObjectKey(instance, "controller-manager")
226+
err := cli.Get(ctx, stsObjectKey, cmSts)
227+
return !apierrors.IsNotFound(err) && cmSts.Spec.Template.Spec.Containers[0].Args[0] == "-v=7"
228+
}, time.Minute*2, interval).Should(BeTrue())
229+
})
230+
It("Should delete cluster", func() {
165231
By("Deleting VirtualCluster")
166-
Expect(cli.Delete(ctx, instance)).To(BeNil())
232+
Expect(cli.Delete(context.TODO(), instance)).To(BeNil())
167233
})
168234
})
169235
})

0 commit comments

Comments
 (0)