Skip to content

Commit 2396a0b

Browse files
committed
custom securityContext
1 parent 181a39d commit 2396a0b

File tree

7 files changed

+116
-13
lines changed

7 files changed

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

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)