Skip to content

Commit 26692a0

Browse files
author
Joshua Reed
committed
Basic fd controller test runs now.
1 parent f4c7a10 commit 26692a0

11 files changed

+150
-23
lines changed

controllers/cloudstackaffinitygroup_controller.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ limitations under the License.
1717
package controllers
1818

1919
import (
20+
"github.com/onsi/ginkgo/v2"
2021
"context"
2122

2223
ctrl "sigs.k8s.io/controller-runtime"
@@ -54,6 +55,7 @@ func NewCSAGReconciliationRunner() *CloudStackAGReconciliationRunner {
5455
}
5556

5657
func (reconciler *CloudStackAffinityGroupReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
58+
defer ginkgo.GinkgoRecover()
5759
return NewCSAGReconciliationRunner().
5860
UsingBaseReconciler(reconciler.ReconcilerBase).
5961
ForRequest(req).
@@ -62,6 +64,7 @@ func (reconciler *CloudStackAffinityGroupReconciler) Reconcile(ctx context.Conte
6264
}
6365

6466
func (r *CloudStackAGReconciliationRunner) Reconcile() (ctrl.Result, error) {
67+
defer ginkgo.GinkgoRecover()
6568
controllerutil.AddFinalizer(r.ReconciliationSubject, infrav1.AffinityGroupFinalizer)
6669
affinityGroup := &cloud.AffinityGroup{Name: r.ReconciliationSubject.Spec.Name, Type: r.ReconciliationSubject.Spec.Type}
6770
if err := r.CSUser.GetOrCreateAffinityGroup(affinityGroup); err != nil {

controllers/cloudstackcluster_controller.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ limitations under the License.
1717
package controllers
1818

1919
import (
20+
"github.com/onsi/ginkgo/v2"
2021
"context"
2122
"fmt"
2223
"reflect"
@@ -76,6 +77,7 @@ func NewCSClusterReconciliationRunner() *CloudStackClusterReconciliationRunner {
7677

7778
// Reconcile is the method k8s will call upon a reconciliation request.
7879
func (reconciler *CloudStackClusterReconciler) Reconcile(ctx context.Context, req ctrl.Request) (retRes ctrl.Result, retErr error) {
80+
defer ginkgo.GinkgoRecover()
7981
return NewCSClusterReconciliationRunner().
8082
UsingBaseReconciler(reconciler.ReconcilerBase).
8183
ForRequest(req).
@@ -85,6 +87,7 @@ func (reconciler *CloudStackClusterReconciler) Reconcile(ctx context.Context, re
8587

8688
// Reconcile actually reconciles the CloudStackCluster.
8789
func (r *CloudStackClusterReconciliationRunner) Reconcile() (res ctrl.Result, reterr error) {
90+
defer ginkgo.GinkgoRecover()
8891
return r.RunReconciliationStages(
8992
r.RequeueIfMissingBaseCRs,
9093
r.CreateFailureDomains(r.ReconciliationSubject.Spec.FailureDomains),

controllers/cloudstackcluster_controller_test.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,9 @@ import (
2828
var _ = Describe("CloudStackClusterReconciler", func() {
2929
Context("With k8s like test environment.", func() {
3030
BeforeEach(func() {
31-
SetupTestEnvironment() // Must happen before setting up managers/reconcilers.
32-
Ω(ClusterReconciler.SetupWithManager(k8sManager)).Should(Succeed()) // Register CloudStack ClusterReconciler.
31+
SetupTestEnvironment() // Must happen before setting up managers/reconcilers.
32+
Ω(ClusterReconciler.SetupWithManager(k8sManager)).Should(Succeed()) // Register CloudStack ClusterReconciler.
33+
Ω(FailureDomainReconciler.SetupWithManager(k8sManager)).Should(Succeed()) // Register CloudStack ClusterReconciler.
3334
})
3435

3536
It("Should create a CloudStackFailureDomain.", func() {

controllers/cloudstackfailuredomain_controller.go

Lines changed: 46 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -19,35 +19,67 @@ package controllers
1919
import (
2020
"context"
2121

22-
"k8s.io/apimachinery/pkg/runtime"
22+
"github.com/onsi/ginkgo/v2"
23+
2324
ctrl "sigs.k8s.io/controller-runtime"
24-
"sigs.k8s.io/controller-runtime/pkg/client"
25-
"sigs.k8s.io/controller-runtime/pkg/log"
2625

27-
infrastructurev1beta2 "sigs.k8s.io/cluster-api-provider-cloudstack/api/v1beta2"
26+
infrav1 "sigs.k8s.io/cluster-api-provider-cloudstack/api/v1beta2"
27+
csCtrlrUtils "sigs.k8s.io/cluster-api-provider-cloudstack/controllers/utils"
2828
)
2929

30-
// CloudStackFailureDomainReconciler reconciles a CloudStackFailureDomain object
30+
// CloudStackFailureDomainReconciler is the k8s controller manager's interface to reconcile a CloudStackFailureDomain.
31+
// This is primarily to adapt to k8s.
3132
type CloudStackFailureDomainReconciler struct {
32-
client.Client
33-
Scheme *runtime.Scheme
33+
csCtrlrUtils.ReconcilerBase
3434
}
3535

3636
//+kubebuilder:rbac:groups=infrastructure.cluster.x-k8s.io,resources=cloudstackfailuredomains,verbs=get;list;watch;create;update;patch;delete
3737
//+kubebuilder:rbac:groups=infrastructure.cluster.x-k8s.io,resources=cloudstackfailuredomains/status,verbs=get;update;patch
3838
//+kubebuilder:rbac:groups=infrastructure.cluster.x-k8s.io,resources=cloudstackfailuredomains/finalizers,verbs=update
3939

40-
func (r *CloudStackFailureDomainReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
41-
_ = log.FromContext(ctx)
40+
// CloudStackFailureDomainReconciliationRunner is a ReconciliationRunner with extensions specific to CloudStackFailureDomains.
41+
// The runner does the actual reconciliation.
42+
type CloudStackFailureDomainReconciliationRunner struct {
43+
csCtrlrUtils.ReconciliationRunner
44+
ReconciliationSubject *infrav1.CloudStackFailureDomain
45+
}
46+
47+
// Initialize a new CloudStackFailureDomain reconciliation runner with concrete types and initialized member fields.
48+
func NewCSFailureDomainReconciliationRunner() *CloudStackFailureDomainReconciliationRunner {
49+
// Set concrete type and init pointers.
50+
r := &CloudStackFailureDomainReconciliationRunner{ReconciliationSubject: &infrav1.CloudStackFailureDomain{}}
51+
// Setup the base runner. Initializes pointers and links reconciliation methods.
52+
r.ReconciliationRunner = csCtrlrUtils.NewRunner(r, r.ReconciliationSubject)
53+
54+
return r
55+
}
4256

43-
// TODO(user): your logic here
57+
// Reconcile is the method k8s will call upon a reconciliation request.
58+
func (reconciler *CloudStackFailureDomainReconciler) Reconcile(ctx context.Context, req ctrl.Request) (retRes ctrl.Result, retErr error) {
59+
defer ginkgo.GinkgoRecover()
60+
return NewCSFailureDomainReconciliationRunner().
61+
UsingBaseReconciler(reconciler.ReconcilerBase).
62+
ForRequest(req).
63+
WithRequestCtx(ctx).
64+
RunBaseReconciliationStages()
65+
}
66+
67+
// Reconcile on the ReconciliationRunner actually attempts to modify or create the reconciliation subject.
68+
func (r *CloudStackFailureDomainReconciliationRunner) Reconcile() (retRes ctrl.Result, retErr error) {
69+
defer ginkgo.GinkgoRecover()
70+
r.Log.Info("blah2")
71+
r.ReconciliationSubject.Status.Ready = true
72+
return ctrl.Result{}, nil
73+
}
4474

75+
// ReconcileDelete on the ReconciliationRunner actually attempts to delete the reconciliation subject.
76+
func (r *CloudStackFailureDomainReconciliationRunner) ReconcileDelete() (retRes ctrl.Result, retErr error) {
77+
r.Log.Info("blah3")
4578
return ctrl.Result{}, nil
4679
}
4780

4881
// SetupWithManager sets up the controller with the Manager.
49-
func (r *CloudStackFailureDomainReconciler) SetupWithManager(mgr ctrl.Manager) error {
50-
return ctrl.NewControllerManagedBy(mgr).
51-
For(&infrastructurev1beta2.CloudStackFailureDomain{}).
52-
Complete(r)
82+
func (reconciler *CloudStackFailureDomainReconciler) SetupWithManager(mgr ctrl.Manager) error {
83+
_, err := ctrl.NewControllerManagedBy(mgr).For(&infrav1.CloudStackFailureDomain{}).Build(reconciler)
84+
return err
5385
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
/*
2+
Copyright 2022 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 controllers_test
18+
19+
import (
20+
. "github.com/onsi/ginkgo/v2"
21+
. "github.com/onsi/gomega"
22+
infrav1 "sigs.k8s.io/cluster-api-provider-cloudstack/api/v1beta2"
23+
dummies "sigs.k8s.io/cluster-api-provider-cloudstack/test/dummies/v1beta2"
24+
"sigs.k8s.io/controller-runtime/pkg/client"
25+
)
26+
27+
var _ = Describe("CloudStackFailureDomainReconciler", func() {
28+
Context("With k8s like test environment.", func() {
29+
BeforeEach(func() {
30+
dummies.SetDummyVars()
31+
SetupTestEnvironment() // Must happen before setting up managers/reconcilers.
32+
Ω(FailureDomainReconciler.SetupWithManager(k8sManager)).Should(Succeed()) // Register CloudStack FailureDomainReconciler.
33+
})
34+
35+
It("Should set failure domain Status.Ready to true.", func() {
36+
Ω(k8sClient.Create(ctx, dummies.CSFailureDomain1))
37+
38+
tempfd := &infrav1.CloudStackFailureDomain{}
39+
Eventually(func() bool {
40+
key := client.ObjectKeyFromObject(dummies.CSFailureDomain1)
41+
if err := k8sClient.Get(ctx, key, tempfd); err == nil {
42+
return tempfd.Status.Ready
43+
}
44+
return false
45+
}, timeout).Should(BeTrue())
46+
})
47+
})
48+
})

controllers/cloudstackisolatednetwork_controller.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ limitations under the License.
1717
package controllers
1818

1919
import (
20+
"github.com/onsi/ginkgo/v2"
2021
"context"
2122
"strings"
2223

@@ -57,6 +58,7 @@ func NewCSIsoNetReconciliationRunner() *CloudStackIsoNetReconciliationRunner {
5758
}
5859

5960
func (reconciler *CloudStackIsoNetReconciler) Reconcile(ctx context.Context, req ctrl.Request) (res ctrl.Result, retErr error) {
61+
defer ginkgo.GinkgoRecover()
6062
return NewCSIsoNetReconciliationRunner().
6163
UsingBaseReconciler(reconciler.ReconcilerBase).
6264
ForRequest(req).
@@ -65,6 +67,7 @@ func (reconciler *CloudStackIsoNetReconciler) Reconcile(ctx context.Context, req
6567
}
6668

6769
func (r *CloudStackIsoNetReconciliationRunner) Reconcile() (retRes ctrl.Result, retErr error) {
70+
defer ginkgo.GinkgoRecover()
6871
if res, err := r.RequeueIfMissingBaseCRs(); r.ShouldReturn(res, err) {
6972
return res, err
7073
}

controllers/cloudstackmachine_controller.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ limitations under the License.
1717
package controllers
1818

1919
import (
20+
"github.com/onsi/ginkgo/v2"
2021
"context"
2122
"fmt"
2223
"math/rand"
@@ -81,6 +82,7 @@ func NewCSMachineReconciliationRunner() *CloudStackMachineReconciliationRunner {
8182
// Reconcile is part of the main kubernetes reconciliation loop which aims to
8283
// move the current state of the cluster closer to the desired state.
8384
func (reconciler *CloudStackMachineReconciler) Reconcile(ctx context.Context, req ctrl.Request) (res ctrl.Result, retErr error) {
85+
defer ginkgo.GinkgoRecover()
8486
return NewCSMachineReconciliationRunner().
8587
UsingBaseReconciler(reconciler.ReconcilerBase).
8688
ForRequest(req).
@@ -89,6 +91,7 @@ func (reconciler *CloudStackMachineReconciler) Reconcile(ctx context.Context, re
8991
}
9092

9193
func (r *CloudStackMachineReconciliationRunner) Reconcile() (retRes ctrl.Result, reterr error) {
94+
defer ginkgo.GinkgoRecover()
9295
return r.RunReconciliationStages(
9396
r.GetZonesAndRequeueIfMissing(r.Zones),
9497
r.GetParent(r.ReconciliationSubject, r.CAPIMachine),

controllers/cloudstackmachinestatechecker_controller.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ limitations under the License.
1717
package controllers
1818

1919
import (
20+
"github.com/onsi/ginkgo/v2"
2021
"context"
2122
"strings"
2223
"time"
@@ -59,6 +60,7 @@ func NewCSMachineStateCheckerReconciliationRunner() *CloudStackMachineStateCheck
5960
}
6061

6162
func (r *CloudStackMachineStateCheckerReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
63+
defer ginkgo.GinkgoRecover()
6264
return NewCSMachineStateCheckerReconciliationRunner().
6365
UsingBaseReconciler(r.ReconcilerBase).
6466
ForRequest(req).
@@ -67,6 +69,7 @@ func (r *CloudStackMachineStateCheckerReconciler) Reconcile(ctx context.Context,
6769
}
6870

6971
func (r *CloudStackMachineStateCheckerReconciliationRunner) Reconcile() (ctrl.Result, error) {
72+
defer ginkgo.GinkgoRecover()
7073
if res, err := r.GetParent(r.ReconciliationSubject, r.CSMachine)(); r.ShouldReturn(res, err) {
7174
return res, err
7275
}

controllers/cloudstackzone_controller.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ limitations under the License.
1717
package controllers
1818

1919
import (
20+
"github.com/onsi/ginkgo/v2"
2021
"context"
2122

2223
ctrl "sigs.k8s.io/controller-runtime"
@@ -57,6 +58,7 @@ func NewCSZoneReconciliationRunner() *CloudStackZoneReconciliationRunner {
5758

5859
// Reconciler Reconcile adapts the runner to the runner to what k8s expects.
5960
func (reconciler *CloudStackZoneReconciler) Reconcile(ctx context.Context, req ctrl.Request) (res ctrl.Result, retErr error) {
61+
defer ginkgo.GinkgoRecover()
6062
return NewCSZoneReconciliationRunner().
6163
UsingBaseReconciler(reconciler.ReconcilerBase).
6264
ForRequest(req).
@@ -73,6 +75,7 @@ func (reconciler *CloudStackZoneReconciler) SetupWithManager(mgr ctrl.Manager) e
7375

7476
// Reconcile attempts to move the state of CRs to the requested state.
7577
func (r *CloudStackZoneReconciliationRunner) Reconcile() (retRes ctrl.Result, reterr error) {
78+
defer ginkgo.GinkgoRecover()
7679
// Prevent premature deletion.
7780
controllerutil.AddFinalizer(r.ReconciliationSubject, infrav1.ZoneFinalizer)
7881

controllers/controllers_suite_test.go

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -119,11 +119,12 @@ var (
119119
mockCSAPIClient *cloudstack.CloudStackClient
120120

121121
// Reconcilers
122-
MachineReconciler *csReconcilers.CloudStackMachineReconciler
123-
ClusterReconciler *csReconcilers.CloudStackClusterReconciler
124-
ZoneReconciler *csReconcilers.CloudStackZoneReconciler
125-
IsoNetReconciler *csReconcilers.CloudStackIsoNetReconciler
126-
AffinityGReconciler *csReconcilers.CloudStackAffinityGroupReconciler
122+
MachineReconciler *csReconcilers.CloudStackMachineReconciler
123+
ClusterReconciler *csReconcilers.CloudStackClusterReconciler
124+
FailureDomainReconciler *csReconcilers.CloudStackFailureDomainReconciler
125+
ZoneReconciler *csReconcilers.CloudStackZoneReconciler
126+
IsoNetReconciler *csReconcilers.CloudStackIsoNetReconciler
127+
AffinityGReconciler *csReconcilers.CloudStackAffinityGroupReconciler
127128
)
128129

129130
var projectDir = os.Getenv("PROJECT_DIR")
@@ -192,8 +193,10 @@ func SetupTestEnvironment() {
192193
ClusterReconciler = &csReconcilers.CloudStackClusterReconciler{ReconcilerBase: base}
193194
MachineReconciler = &csReconcilers.CloudStackMachineReconciler{ReconcilerBase: base}
194195
ZoneReconciler = &csReconcilers.CloudStackZoneReconciler{ReconcilerBase: base}
196+
FailureDomainReconciler = &csReconcilers.CloudStackFailureDomainReconciler{ReconcilerBase: base}
195197
IsoNetReconciler = &csReconcilers.CloudStackIsoNetReconciler{ReconcilerBase: base}
196198
AffinityGReconciler = &csReconcilers.CloudStackAffinityGroupReconciler{ReconcilerBase: base}
199+
197200
ctx, cancel = context.WithCancel(context.TODO())
198201

199202
// Setup mock clients.
@@ -206,6 +209,7 @@ func SetupTestEnvironment() {
206209
IsoNetReconciler.CSClient = mockCloudClient
207210
MachineReconciler.CSClient = mockCloudClient
208211
AffinityGReconciler.CSClient = mockCloudClient
212+
FailureDomainReconciler.CSClient = mockCloudClient
209213

210214
setupClusterCRDs()
211215

@@ -245,6 +249,7 @@ func setupFakeTestClient() {
245249
ClusterReconciler = &csReconcilers.CloudStackClusterReconciler{ReconcilerBase: base}
246250
MachineReconciler = &csReconcilers.CloudStackMachineReconciler{ReconcilerBase: base}
247251
ZoneReconciler = &csReconcilers.CloudStackZoneReconciler{ReconcilerBase: base}
252+
FailureDomainReconciler = &csReconcilers.CloudStackFailureDomainReconciler{ReconcilerBase: base}
248253
IsoNetReconciler = &csReconcilers.CloudStackIsoNetReconciler{ReconcilerBase: base}
249254
AffinityGReconciler = &csReconcilers.CloudStackAffinityGroupReconciler{ReconcilerBase: base}
250255

@@ -253,6 +258,7 @@ func setupFakeTestClient() {
253258
ZoneReconciler.CSClient = mockCloudClient
254259
IsoNetReconciler.CSClient = mockCloudClient
255260
MachineReconciler.CSClient = mockCloudClient
261+
FailureDomainReconciler.CSClient = mockCloudClient
256262
AffinityGReconciler.CSClient = mockCloudClient
257263

258264
DeferCleanup(func() {

0 commit comments

Comments
 (0)