Skip to content

Commit d3c73e2

Browse files
committed
custom securityContext
1 parent 181a39d commit d3c73e2

File tree

8 files changed

+127
-13
lines changed

8 files changed

+127
-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.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,7 @@ func (b *DatabaseBuilder) GetResourceBuilders(restConfig *rest.Config) []Resourc
211211
optionalBuilders,
212212
&DatabaseStatefulSetBuilder{
213213
Database: b.Unwrap(),
214+
Storage: b.Storage,
214215
RestConfig: restConfig,
215216

216217
Name: b.Name,

internal/resources/database_statefulset.go

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import (
2222

2323
type DatabaseStatefulSetBuilder struct {
2424
*api.Database
25+
Storage *api.Storage
2526
RestConfig *rest.Config
2627

2728
Name string
@@ -395,12 +396,22 @@ func (b *DatabaseStatefulSetBuilder) buildEncryptionVolumes() []corev1.Volume {
395396
return []corev1.Volume{encryptionKeySecret, encryptionKeyConfig}
396397
}
397398

399+
func (b *DatabaseStatefulSetBuilder) buildSecurityContext() *corev1.SecurityContext {
400+
if b.Spec.SecurityContext != nil {
401+
return mergeSecurityContextWithDefaults(b.Spec.SecurityContext)
402+
} else {
403+
return mergeSecurityContextWithDefaults(b.Storage.Spec.SecurityContext)
404+
}
405+
406+
}
407+
398408
func (b *DatabaseStatefulSetBuilder) buildContainer() corev1.Container {
399409
command, args := b.buildContainerArgs()
400410
imagePullPolicy := corev1.PullIfNotPresent
401411
if b.Spec.Image.PullPolicyName != nil {
402412
imagePullPolicy = *b.Spec.Image.PullPolicyName
403413
}
414+
404415
container := corev1.Container{
405416
Name: "ydb-dynamic",
406417
Image: b.Spec.Image.Name,
@@ -409,13 +420,8 @@ func (b *DatabaseStatefulSetBuilder) buildContainer() corev1.Container {
409420
Args: args,
410421
Env: b.buildEnv(),
411422

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-
},
423+
VolumeMounts: b.buildVolumeMounts(),
424+
SecurityContext: b.buildSecurityContext(),
419425
}
420426

421427
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)