@@ -27,6 +27,7 @@ import (
27
27
"k8s.io/apimachinery/pkg/util/validation/field"
28
28
"k8s.io/utils/ptr"
29
29
ctrl "sigs.k8s.io/controller-runtime"
30
+ "sigs.k8s.io/controller-runtime/pkg/client"
30
31
logf "sigs.k8s.io/controller-runtime/pkg/log"
31
32
"sigs.k8s.io/controller-runtime/pkg/webhook"
32
33
"sigs.k8s.io/controller-runtime/pkg/webhook/admission"
@@ -46,6 +47,7 @@ var rayclusterlog = logf.Log.WithName("raycluster-resource")
46
47
func SetupRayClusterWebhookWithManager (mgr ctrl.Manager , cfg * config.KubeRayConfiguration ) error {
47
48
rayClusterWebhookInstance := & rayClusterWebhook {
48
49
Config : cfg ,
50
+ Client : mgr .GetClient (),
49
51
}
50
52
return ctrl .NewWebhookManagedBy (mgr ).
51
53
For (& rayv1.RayCluster {}).
@@ -56,9 +58,12 @@ func SetupRayClusterWebhookWithManager(mgr ctrl.Manager, cfg *config.KubeRayConf
56
58
57
59
// +kubebuilder:webhook:path=/mutate-ray-io-v1-raycluster,mutating=true,failurePolicy=fail,sideEffects=None,groups=ray.io,resources=rayclusters,verbs=create,versions=v1,name=mraycluster.ray.openshift.ai,admissionReviewVersions=v1
58
60
// +kubebuilder:webhook:path=/validate-ray-io-v1-raycluster,mutating=false,failurePolicy=fail,sideEffects=None,groups=ray.io,resources=rayclusters,verbs=create;update,versions=v1,name=vraycluster.ray.openshift.ai,admissionReviewVersions=v1
61
+ // +kubebuilder:rbac:groups="",resources=namespaces,verbs=get;list;watch
62
+
59
63
60
64
type rayClusterWebhook struct {
61
65
Config * config.KubeRayConfiguration
66
+ Client client.Client
62
67
}
63
68
64
69
var _ webhook.CustomDefaulter = & rayClusterWebhook {}
@@ -123,6 +128,32 @@ func (w *rayClusterWebhook) Default(ctx context.Context, obj runtime.Object) err
123
128
}
124
129
}
125
130
131
+ hasSecurityLabels , err := namespaceHasSecurityLabels (ctx , w .Client , rayCluster .Namespace )
132
+ if err != nil {
133
+ rayclusterlog .Error (err , "Failed to check namespace resource labels" )
134
+ return err
135
+ }
136
+ if hasSecurityLabels {
137
+ secureContext := corev1.SecurityContext {
138
+ AllowPrivilegeEscalation : ptr .To (false ),
139
+ Capabilities : & corev1.Capabilities {
140
+ Drop : []corev1.Capability {"ALL" },
141
+ },
142
+ SeccompProfile : & corev1.SeccompProfile {
143
+ Type : "RuntimeDefault" ,
144
+ },
145
+ }
146
+ // Set the security context for the head container and worker containers
147
+ for i := range rayCluster .Spec .HeadGroupSpec .Template .Spec .Containers {
148
+ rayCluster .Spec .HeadGroupSpec .Template .Spec .Containers [i ].SecurityContext = & secureContext
149
+ }
150
+ for i := range rayCluster .Spec .WorkerGroupSpecs {
151
+ for j := range rayCluster .Spec .WorkerGroupSpecs [i ].Template .Spec .Containers {
152
+ rayCluster .Spec .WorkerGroupSpecs [i ].Template .Spec .Containers [j ].SecurityContext = & secureContext
153
+ }
154
+ }
155
+ }
156
+
126
157
return nil
127
158
}
128
159
0 commit comments