@@ -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,11 @@ 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
59
62
60
63
type rayClusterWebhook struct {
61
64
Config * config.KubeRayConfiguration
65
+ Client client.Client
62
66
}
63
67
64
68
var _ webhook.CustomDefaulter = & rayClusterWebhook {}
@@ -123,6 +127,32 @@ func (w *rayClusterWebhook) Default(ctx context.Context, obj runtime.Object) err
123
127
}
124
128
}
125
129
130
+ hasSecurityLabels , err := namespaceHasSecurityLabels (ctx , w .Client , rayCluster .Namespace )
131
+ if err != nil {
132
+ rayclusterlog .Error (err , "Failed to check namespace resource labels" )
133
+ return err
134
+ }
135
+ if hasSecurityLabels {
136
+ secureContext := corev1.SecurityContext {
137
+ AllowPrivilegeEscalation : ptr .To (false ),
138
+ Capabilities : & corev1.Capabilities {
139
+ Drop : []corev1.Capability {"ALL" },
140
+ },
141
+ SeccompProfile : & corev1.SeccompProfile {
142
+ Type : "RuntimeDefault" ,
143
+ },
144
+ }
145
+ // Set the security context for the head container and worker containers
146
+ for i := range rayCluster .Spec .HeadGroupSpec .Template .Spec .Containers {
147
+ rayCluster .Spec .HeadGroupSpec .Template .Spec .Containers [i ].SecurityContext = & secureContext
148
+ }
149
+ for i := range rayCluster .Spec .WorkerGroupSpecs {
150
+ for j := range rayCluster .Spec .WorkerGroupSpecs [i ].Template .Spec .Containers {
151
+ rayCluster .Spec .WorkerGroupSpecs [i ].Template .Spec .Containers [j ].SecurityContext = & secureContext
152
+ }
153
+ }
154
+ }
155
+
126
156
return nil
127
157
}
128
158
0 commit comments