Skip to content

Commit 9efcb2e

Browse files
authored
Handle A and AAAA records TTL properly in dnscache (#187)
1 parent 1180c63 commit 9efcb2e

20 files changed

+517
-264
lines changed

.github/workflows/build.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ jobs:
3737
credentials_json: '${{ secrets.GCP_SA_KEY }}'
3838

3939
- name: Set up Cloud SDK
40-
uses: google-github-actions/setup-gcloud@v0
40+
uses: google-github-actions/setup-gcloud@v2
4141

4242
- name: Set up Go 1.25
4343
uses: actions/setup-go@v5

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,8 @@ vet:
6666

6767
# Generate code
6868
generate: controller-gen mockgen manifests
69-
go generate ./...
7069
$(CONTROLLER_GEN) object paths="./..."
70+
go generate ./...
7171

7272
.PHONY: controller-gen
7373
controller-gen: $(CONTROLLER_GEN)

api/v1/clusterwidenetworkpolicy_types.go

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -153,11 +153,18 @@ type FQDNSelector struct {
153153

154154
// IPSet stores set name association to IP addresses
155155
type IPSet struct {
156-
FQDN string `json:"fqdn,omitempty"`
157-
SetName string `json:"setName,omitempty"`
158-
IPs []string `json:"ips,omitempty"`
156+
// FQDN which this IP set is for.
157+
FQDN string `json:"fqdn,omitempty"`
158+
// A hash value merely used for reference.
159+
SetName string `json:"setName,omitempty"`
160+
// Deprecated: use `IPExpirationTimes` instead.
161+
IPs []string `json:"ips,omitempty"`
162+
// Deprecated: use `IPExpirationTimes` instead.
159163
ExpirationTime metav1.Time `json:"expirationTime,omitempty"`
160-
Version IPVersion `json:"version,omitempty"`
164+
// Maps IP addresses to their expiration times.
165+
IPExpirationTimes map[string]metav1.Time `json:"ipExpirationTimes,omitempty"`
166+
// Whether this is a IPv4 or a IPv6 set.
167+
Version IPVersion `json:"version,omitempty"`
161168
}
162169

163170
func (l *ClusterwideNetworkPolicyList) GetFQDNs() []FQDNSelector {

api/v1/zz_generated.deepcopy.go

Lines changed: 8 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

config/crd/bases/metal-stack.io_clusterwidenetworkpolicies.yaml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -244,17 +244,28 @@ spec:
244244
description: IPSet stores set name association to IP addresses
245245
properties:
246246
expirationTime:
247+
description: 'Deprecated: use `IPExpirationTimes` instead.'
247248
format: date-time
248249
type: string
249250
fqdn:
251+
description: FQDN which this IP set is for.
250252
type: string
253+
ipExpirationTimes:
254+
additionalProperties:
255+
format: date-time
256+
type: string
257+
description: Maps IP addresses to their expiration times.
258+
type: object
251259
ips:
260+
description: 'Deprecated: use `IPExpirationTimes` instead.'
252261
items:
253262
type: string
254263
type: array
255264
setName:
265+
description: ' A hash value merely used for reference.'
256266
type: string
257267
version:
268+
description: Whether this is a IPv4 or a IPv6 set.
258269
type: string
259270
type: object
260271
type: array

controllers/clusterwidenetworkpolicy_controller.go

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,12 @@ import (
1818
"k8s.io/client-go/tools/record"
1919

2020
ctrl "sigs.k8s.io/controller-runtime"
21+
"sigs.k8s.io/controller-runtime/pkg/builder"
2122
"sigs.k8s.io/controller-runtime/pkg/client"
2223
"sigs.k8s.io/controller-runtime/pkg/event"
2324
"sigs.k8s.io/controller-runtime/pkg/handler"
2425
"sigs.k8s.io/controller-runtime/pkg/manager"
26+
"sigs.k8s.io/controller-runtime/pkg/predicate"
2527
"sigs.k8s.io/controller-runtime/pkg/source"
2628

2729
firewallv2 "github.com/metal-stack/firewall-controller-manager/api/v2"
@@ -38,6 +40,7 @@ type ClusterwideNetworkPolicyReconciler struct {
3840
SeedNamespace string
3941

4042
Log logr.Logger
43+
Ctx context.Context
4144
Recorder record.EventRecorder
4245

4346
Interval time.Duration
@@ -57,7 +60,7 @@ func (r *ClusterwideNetworkPolicyReconciler) SetupWithManager(mgr ctrl.Manager)
5760
}
5861

5962
return ctrl.NewControllerManagedBy(mgr).
60-
For(&firewallv1.ClusterwideNetworkPolicy{}).
63+
For(&firewallv1.ClusterwideNetworkPolicy{}, builder.WithPredicates(predicate.GenerationChangedPredicate{})).
6164
Watches(&corev1.Service{}, &handler.EnqueueRequestForObject{}).
6265
WatchesRawSource(&source.Channel{Source: scheduleChan}, &handler.EnqueueRequestForObject{}).
6366
Complete(r)
@@ -104,7 +107,7 @@ func (r *ClusterwideNetworkPolicyReconciler) Reconcile(ctx context.Context, _ ct
104107
cwnps.Items = validCwnps
105108

106109
nftablesFirewall := nftables.NewFirewall(f, &cwnps, &services, r.DnsProxy, r.Log, r.Recorder)
107-
if err := r.manageDNSProxy(ctx, f, cwnps, nftablesFirewall); err != nil {
110+
if err := r.manageDNSProxy(f, cwnps, nftablesFirewall); err != nil {
108111
return ctrl.Result{}, err
109112
}
110113
updated, err := nftablesFirewall.Reconcile()
@@ -127,7 +130,7 @@ func (r *ClusterwideNetworkPolicyReconciler) Reconcile(ctx context.Context, _ ct
127130
// manageDNSProxy start DNS proxy if toFQDN rules are present
128131
// if rules were deleted it will stop running DNS proxy
129132
func (r *ClusterwideNetworkPolicyReconciler) manageDNSProxy(
130-
ctx context.Context, f *firewallv2.Firewall, cwnps firewallv1.ClusterwideNetworkPolicyList, nftablesFirewall *nftables.Firewall,
133+
f *firewallv2.Firewall, cwnps firewallv1.ClusterwideNetworkPolicyList, nftablesFirewall *nftables.Firewall,
131134
) (err error) {
132135
// Skipping is needed for testing
133136
if r.SkipDNS {
@@ -142,10 +145,10 @@ func (r *ClusterwideNetworkPolicyReconciler) manageDNSProxy(
142145

143146
if enableDNS && r.DnsProxy == nil {
144147
r.Log.Info("DNS Proxy is initialized")
145-
if r.DnsProxy, err = dns.NewDNSProxy(f.Spec.DNSServerAddress, f.Spec.DNSPort, ctrl.Log.WithName("DNS proxy")); err != nil {
148+
if r.DnsProxy, err = dns.NewDNSProxy(r.Ctx, f.Spec.DNSServerAddress, f.Spec.DNSPort, r.ShootClient, ctrl.Log.WithName("DNS proxy")); err != nil {
146149
return fmt.Errorf("failed to init DNS proxy: %w", err)
147150
}
148-
go r.DnsProxy.Run(ctx)
151+
go r.DnsProxy.Run()
149152
} else if !enableDNS && r.DnsProxy != nil {
150153
r.Log.Info("DNS Proxy is stopped")
151154
r.DnsProxy.Stop()
@@ -217,7 +220,6 @@ func (r *ClusterwideNetworkPolicyReconciler) allowedCWNPs(ctx context.Context, c
217220
}
218221

219222
for _, cwnp := range cwnps {
220-
cwnp := cwnp
221223
oke, err := r.validateCWNPEgressTargetPrefix(cwnp, egressSet)
222224
if err != nil {
223225
return nil, err

controllers/firewall_controller.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ type FirewallReconciler struct {
3939

4040
Recorder record.EventRecorder
4141
Log logr.Logger
42+
Ctx context.Context
4243
Scheme *runtime.Scheme
4344

4445
Updater *updater.Updater

main.go

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,13 @@ func main() {
9191
return
9292
}
9393

94-
jsonHandler := slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{})
94+
var sll slog.Level
95+
err := sll.UnmarshalText([]byte(logLevel))
96+
if err != nil {
97+
setupLog.Error(err, "failed to unmarshal log level")
98+
os.Exit(1)
99+
}
100+
jsonHandler := slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{Level: sll})
95101
l := slog.New(jsonHandler)
96102

97103
ctrl.SetLogger(logr.FromSlogHandler(jsonHandler))
@@ -105,7 +111,6 @@ func main() {
105111

106112
// FIXME validation and controller start should be refactored into own func which returns error
107113
// instead Fatalw or Error and panic here.
108-
var err error
109114
if firewallName == "" {
110115
firewallName, err = os.Hostname()
111116
if err != nil {
@@ -263,6 +268,7 @@ func main() {
263268
SeedClient: seedMgr.GetClient(),
264269
ShootClient: shootMgr.GetClient(),
265270
Log: ctrl.Log.WithName("controllers").WithName("ClusterwideNetworkPolicy"),
271+
Ctx: ctx,
266272
Recorder: shootMgr.GetEventRecorderFor("FirewallController"),
267273
FirewallName: firewallName,
268274
SeedNamespace: seedNamespace,

0 commit comments

Comments
 (0)