Skip to content

Commit 3c98792

Browse files
committed
Merge branch 'main' into firewall-health-check
2 parents fe0994c + 45d0600 commit 3c98792

File tree

15 files changed

+246
-336
lines changed

15 files changed

+246
-336
lines changed

.github/workflows/docker.yaml

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -31,16 +31,16 @@ jobs:
3131
- name: Checkout
3232
uses: actions/checkout@v4
3333

34-
- name: Set up Go 1.23
34+
- name: Set up Go 1.24
3535
uses: actions/setup-go@v5
3636
with:
37-
go-version: '1.23'
37+
go-version: '1.24'
3838
cache: false
3939

4040
- name: Lint
41-
uses: golangci/golangci-lint-action@v6
41+
uses: golangci/golangci-lint-action@v7
4242
with:
43-
args: --build-tags integration -p bugs -p unused --timeout=10m
43+
args: --build-tags integration --timeout=10m
4444

4545
- name: Make tag
4646
run: |
@@ -63,10 +63,10 @@ jobs:
6363
- name: Checkout
6464
uses: actions/checkout@v4
6565

66-
- name: Set up Go 1.23
66+
- name: Set up Go 1.24
6767
uses: actions/setup-go@v5
6868
with:
69-
go-version: '1.23'
69+
go-version: '1.24'
7070

7171
- name: Test
7272
run: |

Dockerfile

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
11
# Build the firewall-controller-manager binary
2-
FROM golang:1.23 as builder
2+
FROM golang:1.24 AS builder
33

44
WORKDIR /work
55
COPY . .
66
RUN make
77

8-
FROM alpine:3.20
9-
COPY --from=builder /work/bin/firewall-controller-manager .
10-
USER 65534
8+
FROM gcr.io/distroless/static-debian12:nonroot
9+
COPY --from=builder /work/bin/firewall-controller-manager /firewall-controller-manager
1110
ENTRYPOINT ["/firewall-controller-manager"]

Dockerfile.dev

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
FROM alpine:3.19
1+
FROM alpine:3.21
22
COPY bin/firewall-controller-manager /firewall-controller-manager
33
USER 65534
44
ENTRYPOINT ["/firewall-controller-manager"]

api/v2/helper/seed_access.go

Lines changed: 40 additions & 121 deletions
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,17 @@ import (
44
"context"
55
"fmt"
66

7-
"github.com/Masterminds/semver/v3"
87
v2 "github.com/metal-stack/firewall-controller-manager/api/v2"
98
controllerclient "sigs.k8s.io/controller-runtime/pkg/client"
109

1110
corev1 "k8s.io/api/core/v1"
1211
rbacv1 "k8s.io/api/rbac/v1"
1312
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
14-
"k8s.io/client-go/discovery"
1513
"k8s.io/client-go/rest"
1614
configlatest "k8s.io/client-go/tools/clientcmd/api/latest"
1715
configv1 "k8s.io/client-go/tools/clientcmd/api/v1"
1816

1917
"k8s.io/apimachinery/pkg/runtime"
20-
"sigs.k8s.io/controller-runtime/pkg/client"
2118
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
2219
)
2320

@@ -58,11 +55,6 @@ func ensureSeedRBAC(ctx context.Context, seedConfig *rest.Config, deploy *v2.Fir
5855
}
5956
)
6057

61-
k8sVersion, err := determineK8sVersion(seedConfig)
62-
if err != nil {
63-
return fmt.Errorf("unable to determine seed k8s version: %w", err)
64-
}
65-
6658
seed, err := controllerclient.New(seedConfig, controllerclient.Options{
6759
Scheme: scheme,
6860
})
@@ -80,24 +72,22 @@ func ensureSeedRBAC(ctx context.Context, seedConfig *rest.Config, deploy *v2.Fir
8072
return fmt.Errorf("error ensuring service account: %w", err)
8173
}
8274

83-
if versionGreaterOrEqual124(k8sVersion) {
84-
serviceAccountSecret := &corev1.Secret{
85-
ObjectMeta: metav1.ObjectMeta{
86-
Name: name,
87-
Namespace: deploy.Namespace,
88-
},
89-
}
75+
serviceAccountSecret := &corev1.Secret{
76+
ObjectMeta: metav1.ObjectMeta{
77+
Name: name,
78+
Namespace: deploy.Namespace,
79+
},
80+
}
9081

91-
_, err := controllerutil.CreateOrUpdate(ctx, seed, serviceAccountSecret, func() error {
92-
serviceAccountSecret.Annotations = map[string]string{
93-
"kubernetes.io/service-account.name": serviceAccount.Name,
94-
}
95-
serviceAccountSecret.Type = corev1.SecretTypeServiceAccountToken
96-
return nil
97-
})
98-
if err != nil {
99-
return fmt.Errorf("error ensuring service account token secret: %w", err)
82+
_, err = controllerutil.CreateOrUpdate(ctx, seed, serviceAccountSecret, func() error {
83+
serviceAccountSecret.Annotations = map[string]string{
84+
"kubernetes.io/service-account.name": serviceAccount.Name,
10085
}
86+
serviceAccountSecret.Type = corev1.SecretTypeServiceAccountToken
87+
return nil
88+
})
89+
if err != nil {
90+
return fmt.Errorf("error ensuring service account token secret: %w", err)
10191
}
10292

10393
var shootAccessSecretNames []string
@@ -176,11 +166,6 @@ func ensureShootRBAC(ctx context.Context, shootConfig *rest.Config, shootNamespa
176166
}
177167
)
178168

179-
k8sVersion, err := determineK8sVersion(shootConfig)
180-
if err != nil {
181-
return fmt.Errorf("unable to determine shoot k8s version: %w", err)
182-
}
183-
184169
shoot, err := controllerclient.New(shootConfig, controllerclient.Options{
185170
Scheme: scheme,
186171
})
@@ -195,24 +180,22 @@ func ensureShootRBAC(ctx context.Context, shootConfig *rest.Config, shootNamespa
195180
return fmt.Errorf("error ensuring service account: %w", err)
196181
}
197182

198-
if versionGreaterOrEqual124(k8sVersion) {
199-
serviceAccountSecret := &corev1.Secret{
200-
ObjectMeta: metav1.ObjectMeta{
201-
Name: name,
202-
Namespace: shootNamespace,
203-
},
204-
}
183+
serviceAccountSecret := &corev1.Secret{
184+
ObjectMeta: metav1.ObjectMeta{
185+
Name: name,
186+
Namespace: shootNamespace,
187+
},
188+
}
205189

206-
_, err := controllerutil.CreateOrUpdate(ctx, shoot, serviceAccountSecret, func() error {
207-
serviceAccountSecret.Annotations = map[string]string{
208-
"kubernetes.io/service-account.name": serviceAccount.Name,
209-
}
210-
serviceAccountSecret.Type = corev1.SecretTypeServiceAccountToken
211-
return nil
212-
})
213-
if err != nil {
214-
return fmt.Errorf("error ensuring service account token secret: %w", err)
190+
_, err = controllerutil.CreateOrUpdate(ctx, shoot, serviceAccountSecret, func() error {
191+
serviceAccountSecret.Annotations = map[string]string{
192+
"kubernetes.io/service-account.name": serviceAccount.Name,
215193
}
194+
serviceAccountSecret.Type = corev1.SecretTypeServiceAccountToken
195+
return nil
196+
})
197+
if err != nil {
198+
return fmt.Errorf("error ensuring service account token secret: %w", err)
216199
}
217200

218201
_, err = controllerutil.CreateOrUpdate(ctx, shoot, clusterRole, func() error {
@@ -271,34 +254,6 @@ func ensureShootRBAC(ctx context.Context, shootConfig *rest.Config, shootNamespa
271254
return nil
272255
}
273256

274-
func determineK8sVersion(config *rest.Config) (*semver.Version, error) {
275-
discoveryClient, err := discovery.NewDiscoveryClientForConfig(config)
276-
if err != nil {
277-
return nil, fmt.Errorf("unable to create discovery client: %w", err)
278-
}
279-
280-
version, err := discoveryClient.ServerVersion()
281-
if err != nil {
282-
return nil, fmt.Errorf("unable to discover server version: %w", err)
283-
}
284-
285-
k8sVersion, err := semver.NewVersion(version.GitVersion)
286-
if err != nil {
287-
return nil, fmt.Errorf("unable to parse kubernetes version version: %w", err)
288-
}
289-
290-
return k8sVersion, nil
291-
}
292-
293-
func versionGreaterOrEqual124(v *semver.Version) bool {
294-
constraint, err := semver.NewConstraint(">=v1.24.0")
295-
if err != nil {
296-
return false
297-
}
298-
299-
return constraint.Check(v)
300-
}
301-
302257
type AccessConfig struct {
303258
Ctx context.Context
304259
Config *rest.Config
@@ -344,62 +299,26 @@ func GetAccessKubeconfig(c *AccessConfig) ([]byte, error) {
344299
return nil, err
345300
}
346301

347-
k8sVersion, err := determineK8sVersion(c.Config)
348-
if err != nil {
349-
return nil, fmt.Errorf("unable to determine k8s version: %w", err)
350-
}
351-
352302
cl, err := controllerclient.New(c.Config, controllerclient.Options{
353303
Scheme: scheme,
354304
})
355305
if err != nil {
356306
return nil, fmt.Errorf("unable to create client: %w", err)
357307
}
358308

359-
if versionGreaterOrEqual124(k8sVersion) {
360-
saSecret := &corev1.Secret{
361-
ObjectMeta: metav1.ObjectMeta{
362-
Name: name,
363-
Namespace: c.Namespace,
364-
},
365-
}
366-
err := cl.Get(c.Ctx, client.ObjectKeyFromObject(saSecret), saSecret, &client.GetOptions{})
367-
if err != nil {
368-
return nil, err
369-
}
370-
371-
token = string(saSecret.Data["token"])
372-
ca = saSecret.Data["ca.crt"]
373-
} else {
374-
sa := &corev1.ServiceAccount{
375-
ObjectMeta: metav1.ObjectMeta{
376-
Name: name,
377-
Namespace: c.Namespace,
378-
},
379-
}
380-
err := cl.Get(c.Ctx, client.ObjectKeyFromObject(sa), sa, &client.GetOptions{})
381-
if err != nil {
382-
return nil, err
383-
}
384-
385-
if len(sa.Secrets) == 0 {
386-
return nil, fmt.Errorf("service account %q contains no valid token secret", sa.Name)
387-
}
388-
389-
saSecret := &corev1.Secret{
390-
ObjectMeta: metav1.ObjectMeta{
391-
Name: sa.Secrets[0].Name,
392-
Namespace: c.Namespace,
393-
},
394-
}
395-
err = cl.Get(c.Ctx, client.ObjectKeyFromObject(saSecret), saSecret, &client.GetOptions{})
396-
if err != nil {
397-
return nil, err
398-
}
399-
400-
token = string(saSecret.Data["token"])
401-
ca = saSecret.Data["ca.crt"]
309+
saSecret := &corev1.Secret{
310+
ObjectMeta: metav1.ObjectMeta{
311+
Name: name,
312+
Namespace: c.Namespace,
313+
},
402314
}
315+
err = cl.Get(c.Ctx, controllerclient.ObjectKeyFromObject(saSecret), saSecret, &controllerclient.GetOptions{})
316+
if err != nil {
317+
return nil, err
318+
}
319+
320+
token = string(saSecret.Data["token"])
321+
ca = saSecret.Data["ca.crt"]
403322

404323
if token == "" {
405324
return nil, fmt.Errorf("no token was created")

api/v2/helper/shoot_access.go

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ import (
1313
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1414
"k8s.io/apimachinery/pkg/runtime"
1515
"k8s.io/client-go/rest"
16-
"sigs.k8s.io/controller-runtime/pkg/client"
1716
controllerclient "sigs.k8s.io/controller-runtime/pkg/client"
1817

1918
"k8s.io/client-go/tools/clientcmd"
@@ -22,7 +21,7 @@ import (
2221
)
2322

2423
type ShootAccessHelper struct {
25-
seed client.Client
24+
seed controllerclient.Client
2625
access *v2.ShootAccess
2726
tokenPath string
2827

@@ -31,7 +30,7 @@ type ShootAccessHelper struct {
3130

3231
// NewShootAccessHelper provides shoot access functions based on shoot access secrets,
3332
// i.e. Gardener's generic kubeconfig and token secret.
34-
func NewShootAccessHelper(seed client.Client, access *v2.ShootAccess) *ShootAccessHelper {
33+
func NewShootAccessHelper(seed controllerclient.Client, access *v2.ShootAccess) *ShootAccessHelper {
3534
return &ShootAccessHelper{
3635
seed: seed,
3736
access: access,
@@ -90,7 +89,7 @@ func (s *ShootAccessHelper) Config(ctx context.Context) (*configv1.Config, error
9089
},
9190
}
9291

93-
err := s.seed.Get(ctx, client.ObjectKeyFromObject(kubeconfigTemplate), kubeconfigTemplate)
92+
err := s.seed.Get(ctx, controllerclient.ObjectKeyFromObject(kubeconfigTemplate), kubeconfigTemplate)
9493
if err != nil {
9594
return nil, fmt.Errorf("unable to read generic kubeconfig secret: %w", err)
9695
}
@@ -152,7 +151,7 @@ func (s *ShootAccessHelper) RESTConfig(ctx context.Context) (*rest.Config, error
152151
return restConfig, nil
153152
}
154153

155-
func (s *ShootAccessHelper) Client(ctx context.Context) (client.Client, error) {
154+
func (s *ShootAccessHelper) Client(ctx context.Context) (controllerclient.Client, error) {
156155
var (
157156
config *rest.Config
158157
err error
@@ -185,7 +184,7 @@ func (s *ShootAccessHelper) readTokenSecret(ctx context.Context) (string, error)
185184
},
186185
}
187186

188-
err := s.seed.Get(ctx, client.ObjectKeyFromObject(tokenSecret), tokenSecret)
187+
err := s.seed.Get(ctx, controllerclient.ObjectKeyFromObject(tokenSecret), tokenSecret)
189188
if err != nil {
190189
return "", fmt.Errorf("unable to read token secret: %w", err)
191190
}

api/v2/types_utils.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ const (
4040
ConditionUnknown ConditionStatus = "Unknown"
4141
)
4242

43-
type Conditions []Condition
43+
type Conditions []Condition // nolint:recvcheck
4444

4545
// NewCondition creates a new condition.
4646
func NewCondition(t ConditionType, status ConditionStatus, reason, message string) Condition {

controllers/firewall/status.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -161,10 +161,10 @@ func SetFirewallStatusFromMonitor(fw *v2.Firewall, mon *v2.FirewallMonitor) {
161161
cond := v2.NewCondition(v2.FirewallControllerConnected, v2.ConditionFalse, "NotConnected", "Controller has not yet connected to shoot.")
162162
fw.Status.Conditions.Set(cond)
163163
} else if time.Since(connection.Updated.Time) > 5*time.Minute {
164-
cond := v2.NewCondition(v2.FirewallControllerConnected, v2.ConditionFalse, "StoppedReconciling", fmt.Sprintf("Controller has stopped reconciling since %s to shoot.", connection.Updated.Time.String()))
164+
cond := v2.NewCondition(v2.FirewallControllerConnected, v2.ConditionFalse, "StoppedReconciling", fmt.Sprintf("Controller has stopped reconciling since %s to shoot.", connection.Updated.String()))
165165
fw.Status.Conditions.Set(cond)
166166
} else {
167-
cond := v2.NewCondition(v2.FirewallControllerConnected, v2.ConditionTrue, "Connected", fmt.Sprintf("Controller reconciled shoot at %s.", connection.Updated.Time.String()))
167+
cond := v2.NewCondition(v2.FirewallControllerConnected, v2.ConditionTrue, "Connected", fmt.Sprintf("Controller reconciled shoot at %s.", connection.Updated.String()))
168168
fw.Status.Conditions.Set(cond)
169169
}
170170

@@ -173,10 +173,10 @@ func SetFirewallStatusFromMonitor(fw *v2.Firewall, mon *v2.FirewallMonitor) {
173173
cond := v2.NewCondition(v2.FirewallControllerSeedConnected, v2.ConditionFalse, "NotConnected", "Controller has not yet connected to seed.")
174174
fw.Status.Conditions.Set(cond)
175175
} else if time.Since(connection.SeedUpdated.Time) > 5*time.Minute {
176-
cond := v2.NewCondition(v2.FirewallControllerSeedConnected, v2.ConditionFalse, "StoppedReconciling", fmt.Sprintf("Controller has stopped reconciling since %s to seed.", connection.SeedUpdated.Time.String()))
176+
cond := v2.NewCondition(v2.FirewallControllerSeedConnected, v2.ConditionFalse, "StoppedReconciling", fmt.Sprintf("Controller has stopped reconciling since %s to seed.", connection.SeedUpdated.String()))
177177
fw.Status.Conditions.Set(cond)
178178
} else {
179-
cond := v2.NewCondition(v2.FirewallControllerSeedConnected, v2.ConditionTrue, "Connected", fmt.Sprintf("Controller reconciled firewall at %s.", connection.SeedUpdated.Time.String()))
179+
cond := v2.NewCondition(v2.FirewallControllerSeedConnected, v2.ConditionTrue, "Connected", fmt.Sprintf("Controller reconciled firewall at %s.", connection.SeedUpdated.String()))
180180
fw.Status.Conditions.Set(cond)
181181
}
182182

controllers/generic_controller.go

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -161,8 +161,6 @@ func (g GenericController[O]) Reconcile(ctx context.Context, req ctrl.Request) (
161161
if statusErr != nil {
162162
log.Error(statusErr, "status could not be updated")
163163
}
164-
165-
return
166164
}()
167165
}
168166

0 commit comments

Comments
 (0)