Skip to content

Commit 51bf143

Browse files
committed
Move firewall check to preflight check
Signed-off-by: Zhiwei Liang <zhiwei.liang@zliang.me>
1 parent 7e9a239 commit 51bf143

File tree

4 files changed

+25
-35
lines changed

4 files changed

+25
-35
lines changed

cloud/services/loadbalancers.go

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -160,12 +160,7 @@ func EnsureNodeBalancer(ctx context.Context, clusterScope *scope.ClusterScope, l
160160
if clusterScope.LinodeCluster.Spec.Network.NodeBalancerFirewallID != nil {
161161
firewallID := *clusterScope.LinodeCluster.Spec.Network.NodeBalancerFirewallID
162162
logger.Info("Using direct NodeBalancerFirewallID", "firewallID", firewallID)
163-
firewall, err := clusterScope.LinodeClient.GetFirewall(ctx, firewallID)
164-
if err != nil {
165-
logger.Error(err, "Failed to fetch Linode Firewall from the Linode API")
166-
return nil, err
167-
}
168-
createConfig.FirewallID = firewall.ID
163+
createConfig.FirewallID = firewallID
169164
} else if clusterScope.LinodeCluster.Spec.NodeBalancerFirewallRef != nil {
170165
// Only use NodeBalancerFirewallRef if no direct ID is provided
171166
firewallID, err := getFirewallID(ctx, clusterScope, logger)

cloud/services/loadbalancers_test.go

Lines changed: 0 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -228,9 +228,6 @@ func TestEnsureNodeBalancer(t *testing.T) {
228228
},
229229
},
230230
expects: func(mockClient *mock.MockLinodeClient, mockK8sClient *mock.MockK8sClient) {
231-
mockClient.EXPECT().GetFirewall(gomock.Any(), 5678).Return(&linodego.Firewall{
232-
ID: 5678,
233-
}, nil)
234231
mockClient.EXPECT().CreateNodeBalancer(gomock.Any(), linodego.NodeBalancerCreateOptions{
235232
Label: util.Pointer("test-cluster"),
236233
Region: "us-east",
@@ -269,26 +266,6 @@ func TestEnsureNodeBalancer(t *testing.T) {
269266
},
270267
expectedError: fmt.Errorf("Failed to fetch LinodeFirewall"),
271268
},
272-
{
273-
name: "Error - Direct FirewallID not found",
274-
clusterScope: &scope.ClusterScope{
275-
LinodeCluster: &infrav1alpha2.LinodeCluster{
276-
ObjectMeta: metav1.ObjectMeta{
277-
Name: "test-cluster",
278-
UID: "test-uid",
279-
},
280-
Spec: infrav1alpha2.LinodeClusterSpec{
281-
Network: infrav1alpha2.NetworkSpec{
282-
NodeBalancerFirewallID: util.Pointer(9999),
283-
},
284-
},
285-
},
286-
},
287-
expects: func(mockClient *mock.MockLinodeClient, mockK8sClient *mock.MockK8sClient) {
288-
mockClient.EXPECT().GetFirewall(gomock.Any(), 9999).Return(nil, fmt.Errorf("Firewall not found"))
289-
},
290-
expectedError: fmt.Errorf("Firewall not found"),
291-
},
292269
{
293270
name: "Success - Create NodeBalancer in VPC",
294271
clusterScope: &scope.ClusterScope{

internal/controller/linodecluster_controller.go

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -228,10 +228,14 @@ func (r *LinodeClusterReconciler) performPreflightChecks(ctx context.Context, lo
228228
}
229229
}
230230

231-
if clusterScope.LinodeCluster.Spec.NodeBalancerFirewallRef != nil {
231+
// Check firewall configuration - either direct ID or reference
232232
if !reconciler.ConditionTrue(clusterScope.LinodeCluster.GetCondition(ConditionPreflightLinodeNBFirewallReady)) {
233-
res, err := r.reconcilePreflightLinodeFirewallCheck(ctx, logger, clusterScope)
234-
if err != nil || !res.IsZero() {
233+
if clusterScope.LinodeCluster.Spec.Network.NodeBalancerFirewallID != nil {
234+
if res, err := r.reconcilePreflightFirewallID(ctx, logger, clusterScope); err != nil || !res.IsZero() {
235+
return res, err
236+
}
237+
} else if clusterScope.LinodeCluster.Spec.NodeBalancerFirewallRef != nil {
238+
if res, err := r.reconcilePreflightFirewallRef(ctx, logger, clusterScope); err != nil || !res.IsZero() {
235239
return res, err
236240
}
237241
}
@@ -240,9 +244,7 @@ func (r *LinodeClusterReconciler) performPreflightChecks(ctx context.Context, lo
240244
return ctrl.Result{}, nil
241245
}
242246

243-
func (r *LinodeClusterReconciler) reconcilePreflightLinodeFirewallCheck(ctx context.Context, logger logr.Logger, clusterScope *scope.ClusterScope) (ctrl.Result, error) {
244-
// If NodeBalancerFirewallID is directly specified, check if it exists
245-
if clusterScope.LinodeCluster.Spec.Network.NodeBalancerFirewallID != nil {
247+
func (r *LinodeClusterReconciler) reconcilePreflightFirewallID(ctx context.Context, logger logr.Logger, clusterScope *scope.ClusterScope) (ctrl.Result, error) {
246248
firewallID := *clusterScope.LinodeCluster.Spec.Network.NodeBalancerFirewallID
247249
logger.Info("Verifying direct NodeBalancerFirewallID", "firewallID", firewallID)
248250
_, err := clusterScope.LinodeClient.GetFirewall(ctx, firewallID)
@@ -264,6 +266,7 @@ func (r *LinodeClusterReconciler) reconcilePreflightLinodeFirewallCheck(ctx cont
264266
return ctrl.Result{}, nil
265267
}
266268

269+
func (r *LinodeClusterReconciler) reconcilePreflightFirewallRef(ctx context.Context, logger logr.Logger, clusterScope *scope.ClusterScope) (ctrl.Result, error) {
267270
name := clusterScope.LinodeCluster.Spec.NodeBalancerFirewallRef.Name
268271
namespace := clusterScope.LinodeCluster.Spec.NodeBalancerFirewallRef.Namespace
269272
if namespace == "" {

internal/controller/linodecluster_controller_test.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,21 @@ var _ = Describe("cluster-lifecycle", Ordered, Label("cluster", "cluster-lifecyc
184184
Expect(linodeCluster.GetCondition(ConditionPreflightLinodeNBFirewallReady).Status).To(Equal(metav1.ConditionFalse))
185185
}),
186186
),
187+
Path(
188+
Call("direct firewall ID not found", func(ctx context.Context, mck Mock) {
189+
cScope.LinodeClient = mck.LinodeClient
190+
cScope.LinodeCluster.Spec.NodeBalancerFirewallRef = nil
191+
cScope.LinodeCluster.Spec.Network.NodeBalancerFirewallID = util.Pointer(9999)
192+
mck.LinodeClient.EXPECT().GetFirewall(gomock.Any(), 9999).Return(nil, errors.New("firewall not found"))
193+
}),
194+
Result("preflight sets condition false", func(ctx context.Context, mck Mock) {
195+
reconciler.Client = k8sClient
196+
res, err := reconciler.reconcile(ctx, cScope, mck.Logger())
197+
Expect(err).NotTo(HaveOccurred())
198+
Expect(res.RequeueAfter).To(Equal(rec.DefaultClusterControllerReconcileDelay))
199+
Expect(linodeCluster.GetCondition(ConditionPreflightLinodeNBFirewallReady).Status).To(Equal(metav1.ConditionFalse))
200+
}),
201+
),
187202
Path(
188203
Call("cluster is not created because there was an error creating nb", func(ctx context.Context, mck Mock) {
189204
cScope.LinodeClient = mck.LinodeClient

0 commit comments

Comments
 (0)