Skip to content

Commit be9d90c

Browse files
committed
Make sure that during gcpfirewalls cr creation, sync errors are not returned in Shadow run (when l7LB still reconciles the FWs).
Also fix dryRun flag to properly mean "testing" flow (the logic of the flag usage has not been changed)
1 parent 15537b9 commit be9d90c

File tree

15 files changed

+457
-46
lines changed

15 files changed

+457
-46
lines changed

cloudbuild.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ options:
44
substitution_option: ALLOW_LOOSE
55
machineType: E2_HIGHCPU_8
66
steps:
7-
- name: gcr.io/k8s-staging-test-infra/gcb-docker-gcloud:v20230206-8160eea68e
7+
- name: gcr.io/k8s-staging-test-infra/gcb-docker-gcloud:v20250513-9264efb079
88
id: push-images
99
entrypoint: bash
1010
env:
@@ -20,7 +20,7 @@ steps:
2020
# Build and push every image except e2e-test
2121
make all-push ALL_ARCH="amd64 arm64" \
2222
CONTAINER_BINARIES="glbc 404-server 404-server-with-metrics echo fuzzer"
23-
- name: gcr.io/k8s-staging-test-infra/gcb-docker-gcloud:v20230206-8160eea68e
23+
- name: gcr.io/k8s-staging-test-infra/gcb-docker-gcloud:v20250513-9264efb079
2424
id: push-e2e-test-image
2525
entrypoint: bash
2626
env:

cmd/e2e-test/logging_test.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -170,9 +170,11 @@ func TestLogging(t *testing.T) {
170170
gclb, err = fuzz.GCLBForVIP(context.Background(), Framework.Cloud, params)
171171
if err != nil {
172172
t.Logf("Failed to GCP resources for LB with IP = %q: %v", vip, err)
173+
err = fmt.Errorf("failed to GCP resources for LB with IP = %q: %v", vip, err)
173174
return false, nil
174175
}
175-
if err := verifyLogging(t, gclb, s.Namespace, svcName, tc.transition); err != nil {
176+
if err = verifyLogging(t, gclb, s.Namespace, svcName, tc.transition); err != nil {
177+
err = fmt.Errorf("failed to verify logging for LB with IP = %q: %v", vip, err)
176178
return false, nil
177179
}
178180
return true, nil

pkg/address/manager.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,7 @@ func (m *Manager) ensureAddressReservation() (string, IPAddressType, error) {
213213
return addr.Address, IPAddrManaged, nil
214214
}
215215

216-
m.frLogger.V(2).Info("Address reserve error", "err", reserveErr)
216+
m.frLogger.V(2).Info("Unable to reserve address (could be expected). Checking for conflict", "err", reserveErr)
217217

218218
if utils.IsNetworkTierMismatchGCEError(reserveErr) {
219219
receivedNetworkTier := cloud.NetworkTierPremium

pkg/firewalls/controller.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ func NewFirewallController(
106106
sourceRanges := lbSourceRanges(logger, flags.F.OverrideHealthCheckSourceCIDRs)
107107
logger.Info("Using source ranges", "ranges", sourceRanges)
108108
if enableCR {
109-
firewallCRPool := NewFirewallCRPool(ctx.FirewallClient, ctx.Cloud, ctx.ClusterNamer, sourceRanges, portRanges, disableFWEnforcement, logger)
109+
firewallCRPool := NewFirewallCRPool(ctx.FirewallClient, ctx.Cloud, ctx.ClusterNamer, sourceRanges, portRanges, !disableFWEnforcement, logger)
110110
compositeFirewallPool.pools = append(compositeFirewallPool.pools, firewallCRPool)
111111
}
112112
if !disableFWEnforcement {

pkg/firewalls/firewalls_l7_cr.go

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,10 @@ type FirewallCR struct {
4141
// all the port ranges to open with each call to Sync()
4242
nodePortRanges []string
4343
firewallClient firewallclient.Interface
44-
dryRun bool
44+
// If set to true, CRs are marked as "disabled" and errors are not
45+
// propagated. Firewalls should be still created/updated by l7LB, not the
46+
// Platform Firewall
47+
dryRun bool
4548

4649
logger klog.Logger
4750
}
@@ -81,17 +84,17 @@ func (fr *FirewallCR) Sync(nodeNames, additionalPorts, additionalRanges []string
8184
ranges.Insert(additionalRanges...)
8285

8386
fr.logger.V(3).Info("Firewall CR is enabled.")
84-
expectedFirewallCR, err := NewFirewallCR(name, ports.List(), ranges.UnsortedList(), []string{}, fr.dryRun)
87+
expectedFirewallCR, err := NewFirewallCR(name, ports.List(), ranges.UnsortedList(), []string{}, !fr.dryRun)
8588
if err != nil {
8689
return err
8790
}
88-
return ensureFirewallCR(fr.firewallClient, expectedFirewallCR, fr.logger)
91+
return ensureFirewallCR(fr.firewallClient, expectedFirewallCR, fr.logger, fr.dryRun)
8992
}
9093

9194
// ensureFirewallCR creates/updates the firewall CR
9295
// On CR update, it will read the conditions to see if there are errors updated by PFW controller.
9396
// If the Spec was updated by others, it will reconcile the Spec.
94-
func ensureFirewallCR(client firewallclient.Interface, expectedFWCR *gcpfirewallv1.GCPFirewall, logger klog.Logger) error {
97+
func ensureFirewallCR(client firewallclient.Interface, expectedFWCR *gcpfirewallv1.GCPFirewall, logger klog.Logger, dryRun bool) error {
9598
fw := client.NetworkingV1().GCPFirewalls()
9699
currentFWCR, err := fw.Get(context.Background(), expectedFWCR.Name, metav1.GetOptions{})
97100
logger.V(3).Info("ensureFirewallCR Get CR", "currentFirewallCR", fmt.Sprintf("%+v", currentFWCR), "err", err)
@@ -103,6 +106,10 @@ func ensureFirewallCR(client firewallclient.Interface, expectedFWCR *gcpfirewall
103106
}
104107
return err
105108
}
109+
if currentFWCR.DeletionTimestamp != nil {
110+
logger.V(3).Info("ensureFirewallCR: The CR contains DeletionTimestamp. Skipping Ensure", "currentFirewallDeletionTimestamp", fmt.Sprintf("%+v", currentFWCR.DeletionTimestamp))
111+
return nil
112+
}
106113
if !reflect.DeepEqual(currentFWCR.Spec, expectedFWCR.Spec) {
107114
// Update the current firewall CR
108115
logger.V(3).Info("ensureFirewallCR Update CR", "currentFirewallCR", fmt.Sprintf("%+v", currentFWCR.Spec), "expectedFirewallCR", fmt.Sprintf("%+v", expectedFWCR.Spec))
@@ -116,7 +123,11 @@ func ensureFirewallCR(client firewallclient.Interface, expectedFWCR *gcpfirewall
116123
con.Reason == string(gcpfirewallv1.FirewallRuleReasonSyncError) {
117124
// Use recorder to emit the cmd in Sync()
118125
logger.V(3).Info("ensureFirewallCR: Could not enforce Firewall CR", "currentFirewallCRName", currentFWCR.Name, "reason", con.Reason)
119-
return fmt.Errorf(con.Reason)
126+
if dryRun {
127+
return nil
128+
} else {
129+
return fmt.Errorf(con.Reason)
130+
}
120131
}
121132
}
122133
return nil
@@ -169,6 +180,15 @@ func NewFirewallCR(name string, ports, srcRanges, dstRanges []string, enforced b
169180
}
170181
protocolPorts = append(protocolPorts, protocolPort)
171182
}
183+
184+
// TCP:all is the default if the ports' list is empty.
185+
if len(protocolPorts) == 0 {
186+
protocolPort := gcpfirewallv1.ProtocolPort{
187+
Protocol: gcpfirewallv1.ProtocolTCP,
188+
}
189+
protocolPorts = append(protocolPorts, protocolPort)
190+
}
191+
172192
firewallCR.Spec.Ports = protocolPorts
173193

174194
var src_cidrs, dst_cidrs []gcpfirewallv1.CIDR

pkg/firewalls/firewalls_test.go

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -131,13 +131,30 @@ func TestFirewallPoolSyncSrcRanges(t *testing.T) {
131131
func TestFirewallPoolSyncPorts(t *testing.T) {
132132
fwp := NewFakeFirewallsProvider(false, false)
133133
fwClient := firewallclient.NewSimpleClientset()
134-
fp := NewFirewallPool(fwp, defaultNamer, srcRanges, portRanges(), klog.TODO())
135-
fcrp := NewFirewallCRPool(fwClient, fwp, defaultNamer, srcRanges, portRanges(), true, klog.TODO())
136134
nodes := []string{"node-a", "node-b", "node-c"}
135+
emptyPortRanges := make([]string, 0)
136+
137+
// Verify empty ports' list
138+
fp := NewFirewallPool(fwp, defaultNamer, srcRanges, emptyPortRanges, klog.TODO())
139+
fcrp := NewFirewallCRPool(fwClient, fwp, defaultNamer, srcRanges, emptyPortRanges, true, klog.TODO())
137140

138141
if err := fp.Sync(nodes, nil, nil, true); err != nil {
139142
t.Fatal(err)
140143
}
144+
verifyFirewallRule(fwp, ruleName, nodes, srcRanges, emptyPortRanges, t)
145+
146+
if err := fcrp.Sync(nodes, nil, nil, true); err != nil {
147+
t.Fatal(err)
148+
}
149+
verifyFirewallCR(fwClient, ruleName, srcRanges, emptyPortRanges, true, t)
150+
151+
// Verify a preset ports' list
152+
fp = NewFirewallPool(fwp, defaultNamer, srcRanges, portRanges(), klog.TODO())
153+
fcrp = NewFirewallCRPool(fwClient, fwp, defaultNamer, srcRanges, portRanges(), true, klog.TODO())
154+
155+
if err := fp.Sync(nodes, nil, nil, true); err != nil {
156+
t.Errorf("unexpected err when syncing firewall, err: %v", err)
157+
}
141158
verifyFirewallRule(fwp, ruleName, nodes, srcRanges, portRanges(), t)
142159

143160
if err := fcrp.Sync(nodes, nil, nil, true); err != nil {
@@ -399,14 +416,20 @@ func verifyFirewallCR(firewallclient *firewallclient.Clientset, ruleName string,
399416
ports := sets.NewString(expectedPorts...)
400417
srcranges := sets.NewString(sourceRanges...)
401418

419+
// Empty ports' list would mean that all protocols are permitted
420+
// (not only TCP)
421+
if len(actualFW.Spec.Ports) == 0 {
422+
t.Errorf("Empty list of allowed protocols is not permited")
423+
}
424+
402425
actualPorts := sets.NewString()
403426
for _, protocolports := range actualFW.Spec.Ports {
404427
if protocolports.Protocol != "TCP" {
405428
t.Errorf("Protocol isn't TCP")
406429
}
407430
if protocolports.EndPort != nil {
408431
actualPorts.Insert(fmt.Sprintf("%d-%d", *protocolports.StartPort, *protocolports.EndPort))
409-
} else {
432+
} else if protocolports.StartPort != nil {
410433
actualPorts.Insert(fmt.Sprintf("%d", *protocolports.StartPort))
411434
}
412435

pkg/forwardingrules/optimized/compare_test.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"testing"
55

66
"github.com/google/go-cmp/cmp"
7+
"github.com/google/go-cmp/cmp/cmpopts"
78
"k8s.io/ingress-gce/pkg/composite"
89
"k8s.io/ingress-gce/pkg/forwardingrules"
910
"k8s.io/ingress-gce/pkg/forwardingrules/optimized"
@@ -198,7 +199,11 @@ func TestCompare(t *testing.T) {
198199
t.Fatalf("optimized.Compare() error = %v", err)
199200
}
200201

201-
if diff := cmp.Diff(ops, tC.wantCalls); diff != "" {
202+
// We execute those in parallel so we don't care about the order at each stage
203+
sortFROpt := cmpopts.SortSlices(func(a, b *composite.ForwardingRule) bool { return a.Name < b.Name })
204+
sortDeletesOpt := cmpopts.SortSlices(func(a, b string) bool { return a < b })
205+
206+
if diff := cmp.Diff(ops, tC.wantCalls, sortFROpt, sortDeletesOpt); diff != "" {
202207
t.Errorf("want != got, (-want, +got):\n%s", diff)
203208
}
204209
})

pkg/forwardingrules/optimized/fetch_test.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,9 @@ func TestFetch(t *testing.T) {
8989
}
9090

9191
ignoreOpts := cmpopts.IgnoreFields(composite.ForwardingRule{}, "Version", "SelfLink", "Region")
92-
if diff := cmp.Diff(tC.want, got, ignoreOpts); diff != "" {
92+
sortOpt := cmpopts.SortSlices(func(a, b *composite.ForwardingRule) bool { return a.Name < b.Name })
93+
94+
if diff := cmp.Diff(tC.want, got, ignoreOpts, sortOpt); diff != "" {
9395
t.Errorf("Fetch(%q) returned diff (-want +got):\n%s", tC.link, diff)
9496
}
9597
})

pkg/neg/controller.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,7 +205,9 @@ func NewController(
205205
podInformer.GetIndexer(),
206206
cloud,
207207
manager,
208+
zoneGetter,
208209
enableDualStackNEG,
210+
flags.F.EnableMultiSubnetCluster && !flags.F.EnableMultiSubnetClusterPhase1,
209211
logger,
210212
)
211213
} else {

pkg/neg/readiness/poller_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ func (p *testPatcher) Eval(t *testing.T, pod string, negKey, bsKey *meta.Key) {
6868
}
6969

7070
func newFakePoller() (*poller, error) {
71-
reflector, err := newTestReadinessReflector(negtypes.NewTestContext())
71+
reflector, err := newTestReadinessReflector(negtypes.NewTestContext(), false)
7272
if err != nil {
7373
return nil, fmt.Errorf("failed to initialize reflector: %s", err)
7474
}

0 commit comments

Comments
 (0)