Skip to content

Commit b84b069

Browse files
committed
Create SA for backup jobs
A new SA is created for the backup jobs to limit the permission to just what is necessary. Signed-off-by: Ales Raszka <[email protected]>
1 parent 24f510e commit b84b069

File tree

8 files changed

+108
-44
lines changed

8 files changed

+108
-44
lines changed

controllers/backupcronjob/backupcronjob_controller.go

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -149,8 +149,9 @@ func (r *BackupCronJobReconciler) SetupWithManager(mgr ctrl.Manager) error {
149149
Complete(r)
150150
}
151151

152-
// +kubebuilder:rbac:groups="",resources=secrets,verbs=get;list;create;update;patch;delete
153152
// +kubebuilder:rbac:groups="",resources=persistentvolumeclaims,verbs=get;list
153+
// +kubebuilder:rbac:groups="",resources=secrets,verbs=get;list;create;update;patch;delete
154+
// +kubebuilder:rbac:groups="",resources=serviceaccounts;,verbs=get;list;create;update;patch;delete
154155
// +kubebuilder:rbac:groups=batch,resources=jobs,verbs=get;list;create;update;patch;delete
155156
// +kubebuilder:rbac:groups=controller.devfile.io,resources=devworkspaceoperatorconfigs,verbs=get;list;update;patch;watch
156157
// +kubebuilder:rbac:groups=workspace.devfile.io,resources=devworkspaces,verbs=get;list
@@ -270,6 +271,12 @@ func (r *BackupCronJobReconciler) executeBackupSync(ctx context.Context, dwOpera
270271
dwID := dw.Status.DevWorkspaceId
271272
log.Info("Found DevWorkspace", "namespace", dw.Namespace, "devworkspace", dw.Name, "id", dwID)
272273

274+
err = r.ensureJobRunnerRBAC(ctx, &dw)
275+
if err != nil {
276+
log.Error(err, "Failed to ensure Job runner RBAC for DevWorkspace", "id", dwID)
277+
continue
278+
}
279+
273280
if err := r.createBackupJob(&dw, ctx, dwOperatorConfig, registyAuthSecret, logger); err != nil {
274281
log.Error(err, "Failed to create backup Job for DevWorkspace", "id", dwID)
275282
continue
@@ -384,7 +391,8 @@ func (r *BackupCronJobReconciler) createBackupJob(
384391
Spec: batchv1.JobSpec{
385392
Template: corev1.PodTemplateSpec{
386393
Spec: corev1.PodSpec{
387-
RestartPolicy: corev1.RestartPolicyNever,
394+
ServiceAccountName: JobRunnerSAName,
395+
RestartPolicy: corev1.RestartPolicyNever,
388396
SecurityContext: &corev1.PodSecurityContext{
389397
FSGroup: ptrInt64(0),
390398
},

controllers/backupcronjob/rbac.go

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
//
2+
// Copyright (c) 2019-2025 Red Hat, Inc.
3+
// Licensed under the Apache License, Version 2.0 (the "License");
4+
// you may not use this file except in compliance with the License.
5+
// You may obtain a copy of the License at
6+
//
7+
// http://www.apache.org/licenses/LICENSE-2.0
8+
//
9+
// Unless required by applicable law or agreed to in writing, software
10+
// distributed under the License is distributed on an "AS IS" BASIS,
11+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
// See the License for the specific language governing permissions and
13+
// limitations under the License.
14+
//
15+
16+
package controllers
17+
18+
import (
19+
"context"
20+
"fmt"
21+
22+
dw "github.com/devfile/api/v2/pkg/apis/workspaces/v1alpha2"
23+
"github.com/devfile/devworkspace-operator/pkg/constants"
24+
corev1 "k8s.io/api/core/v1"
25+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
26+
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
27+
)
28+
29+
const (
30+
JobRunnerSAName = "devworkspace-job-runner"
31+
)
32+
33+
func (r *BackupCronJobReconciler) ensureJobRunnerRBAC(ctx context.Context, workspace *dw.DevWorkspace) error {
34+
const (
35+
roleName = "devworkspace-job-runner-role"
36+
rbName = "devworkspace-job-runner-rolebinding"
37+
)
38+
39+
sa := &corev1.ServiceAccount{
40+
ObjectMeta: metav1.ObjectMeta{Name: JobRunnerSAName, Namespace: workspace.Namespace, Labels: map[string]string{
41+
constants.DevWorkspaceIDLabel: workspace.Status.DevWorkspaceId,
42+
constants.DevWorkspaceWatchSecretLabel: "true",
43+
}},
44+
}
45+
46+
// Create or update ServiceAccount
47+
if err := controllerutil.SetControllerReference(workspace, sa, r.Scheme); err != nil {
48+
return err
49+
}
50+
if _, err := controllerutil.CreateOrUpdate(ctx, r.Client, sa, func() error { return nil }); err != nil {
51+
return fmt.Errorf("ensuring ServiceAccount: %w", err)
52+
}
53+
54+
return nil
55+
56+
}

deploy/bundle/manifests/devworkspace-operator.clusterserviceversion.yaml

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

deploy/deployment/kubernetes/combined.yaml

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

deploy/deployment/kubernetes/objects/devworkspace-controller-role.ClusterRole.yaml

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

deploy/deployment/openshift/combined.yaml

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

deploy/deployment/openshift/objects/devworkspace-controller-role.ClusterRole.yaml

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

deploy/templates/components/rbac/role.yaml

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ rules:
2020
resources:
2121
- configmaps
2222
- pods
23-
- serviceaccounts
2423
- services
2524
verbs:
2625
- '*'
@@ -45,12 +44,6 @@ rules:
4544
- pods/exec
4645
verbs:
4746
- create
48-
- apiGroups:
49-
- ""
50-
resources:
51-
- secrets
52-
verbs:
53-
- '*'
5447
- apiGroups:
5548
- ""
5649
resourceNames:
@@ -62,6 +55,13 @@ rules:
6255
- delete
6356
- get
6457
- patch
58+
- apiGroups:
59+
- ""
60+
resources:
61+
- secrets
62+
- serviceaccounts
63+
verbs:
64+
- '*'
6565
- apiGroups:
6666
- admissionregistration.k8s.io
6767
resources:

0 commit comments

Comments
 (0)