Skip to content

Commit 7c25bd1

Browse files
committed
custom securityContext
1 parent 181a39d commit 7c25bd1

File tree

7 files changed

+119
-13
lines changed

7 files changed

+119
-13
lines changed

api/v1alpha1/database_types.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,8 @@ type DatabaseNodeSpec struct {
168168
// (Optional) Additional custom resource annotations that are added to all resources
169169
// +optional
170170
AdditionalAnnotations map[string]string `json:"additionalAnnotations,omitempty"`
171+
172+
SecurityContext *corev1.SecurityContext `json:"securityContext,omitempty"`
171173
}
172174

173175
type DatabaseResources struct {

api/v1alpha1/storage_types.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,8 @@ type StorageNodeSpec struct {
165165
// (Optional) Additional custom resource annotations that are added to all resources
166166
// +optional
167167
AdditionalAnnotations map[string]string `json:"additionalAnnotations,omitempty"`
168+
169+
SecurityContext *corev1.SecurityContext `json:"securityContext,omitempty"`
168170
}
169171

170172
type StorageInitJobSpec struct {

api/v1alpha1/zz_generated.deepcopy.go

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

internal/resources/database_statefulset.go

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -401,6 +401,7 @@ func (b *DatabaseStatefulSetBuilder) buildContainer() corev1.Container {
401401
if b.Spec.Image.PullPolicyName != nil {
402402
imagePullPolicy = *b.Spec.Image.PullPolicyName
403403
}
404+
404405
container := corev1.Container{
405406
Name: "ydb-dynamic",
406407
Image: b.Spec.Image.Name,
@@ -409,13 +410,8 @@ func (b *DatabaseStatefulSetBuilder) buildContainer() corev1.Container {
409410
Args: args,
410411
Env: b.buildEnv(),
411412

412-
VolumeMounts: b.buildVolumeMounts(),
413-
SecurityContext: &corev1.SecurityContext{
414-
Privileged: ptr.Bool(false),
415-
Capabilities: &corev1.Capabilities{
416-
Add: []corev1.Capability{"SYS_RAWIO"},
417-
},
418-
},
413+
VolumeMounts: b.buildVolumeMounts(),
414+
SecurityContext: mergeSecurityContextWithDefaults(b.Spec.SecurityContext),
419415
}
420416

421417
if value, ok := b.ObjectMeta.Annotations[api.AnnotationDisableLivenessProbe]; !ok || value != api.AnnotationValueTrue {
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package resources
2+
3+
import (
4+
corev1 "k8s.io/api/core/v1"
5+
6+
"github.com/ydb-platform/ydb-kubernetes-operator/internal/ptr"
7+
)
8+
9+
func contains(s []corev1.Capability, v corev1.Capability) bool {
10+
for _, vs := range s {
11+
if vs == v {
12+
return true
13+
}
14+
}
15+
return false
16+
}
17+
18+
func mergeSecurityContextWithDefaults(context *corev1.SecurityContext) *corev1.SecurityContext {
19+
var result *corev1.SecurityContext
20+
21+
if context != nil {
22+
result = context.DeepCopy()
23+
} else {
24+
result = &corev1.SecurityContext{}
25+
}
26+
27+
// set defaults
28+
29+
if result.Privileged == nil {
30+
result.Privileged = ptr.Bool(false)
31+
}
32+
33+
if result.Capabilities == nil {
34+
result.Capabilities = &corev1.Capabilities{
35+
Add: []corev1.Capability{},
36+
}
37+
}
38+
39+
for _, defaultCapability := range []corev1.Capability{"SYS_RAWIO"} {
40+
if !contains(result.Capabilities.Add, defaultCapability) {
41+
result.Capabilities.Add = append(result.Capabilities.Add, defaultCapability)
42+
}
43+
}
44+
45+
return result
46+
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package resources
2+
3+
import (
4+
"testing"
5+
6+
corev1 "k8s.io/api/core/v1"
7+
8+
"github.com/ydb-platform/ydb-kubernetes-operator/internal/ptr"
9+
10+
. "github.com/onsi/ginkgo/v2"
11+
. "github.com/onsi/gomega"
12+
)
13+
14+
func TestSecurityContextMerge(t *testing.T) {
15+
RegisterFailHandler(Fail)
16+
RunSpecs(t, "SecurityContext builder")
17+
}
18+
19+
var _ = Describe("SecurityContext builder", func() {
20+
It("no securityContext passed", func() {
21+
Expect(mergeSecurityContextWithDefaults(nil)).Should(BeEquivalentTo(&corev1.SecurityContext{
22+
Privileged: ptr.Bool(false),
23+
Capabilities: &corev1.Capabilities{
24+
Add: []corev1.Capability{"SYS_RAWIO"},
25+
},
26+
}))
27+
})
28+
It("securityContext with Capabilities passed", func() {
29+
ctx := &corev1.SecurityContext{
30+
Privileged: ptr.Bool(false),
31+
Capabilities: &corev1.Capabilities{
32+
Add: []corev1.Capability{"SYS_PTRACE"},
33+
},
34+
}
35+
Expect(mergeSecurityContextWithDefaults(ctx)).Should(BeEquivalentTo(&corev1.SecurityContext{
36+
Privileged: ptr.Bool(false),
37+
Capabilities: &corev1.Capabilities{
38+
Add: []corev1.Capability{"SYS_PTRACE", "SYS_RAWIO"},
39+
},
40+
}))
41+
})
42+
It("securityContext without Capabilities passed", func() {
43+
ctx := &corev1.SecurityContext{
44+
Privileged: ptr.Bool(true),
45+
RunAsUser: ptr.Int64(10),
46+
}
47+
Expect(mergeSecurityContextWithDefaults(ctx)).Should(BeEquivalentTo(&corev1.SecurityContext{
48+
Privileged: ptr.Bool(true),
49+
RunAsUser: ptr.Int64(10),
50+
Capabilities: &corev1.Capabilities{
51+
Add: []corev1.Capability{"SYS_RAWIO"},
52+
},
53+
}))
54+
})
55+
})

internal/resources/storage_statefulset.go

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -360,12 +360,7 @@ func (b *StorageStatefulSetBuilder) buildContainer() corev1.Container { // todo
360360
Command: command,
361361
Args: args,
362362

363-
SecurityContext: &corev1.SecurityContext{
364-
Privileged: ptr.Bool(false),
365-
Capabilities: &corev1.Capabilities{
366-
Add: []corev1.Capability{"SYS_RAWIO"},
367-
},
368-
},
363+
SecurityContext: mergeSecurityContextWithDefaults(b.Spec.SecurityContext),
369364

370365
Ports: []corev1.ContainerPort{{
371366
Name: "grpc", ContainerPort: api.GRPCPort,

0 commit comments

Comments
 (0)