@@ -18,6 +18,7 @@ import (
1818 "fmt"
1919 "strings"
2020
21+ dwv1 "github.com/devfile/api/v2/pkg/apis/workspaces/v1alpha1"
2122 dwv2 "github.com/devfile/api/v2/pkg/apis/workspaces/v1alpha2"
2223 authv1 "k8s.io/api/authorization/v1"
2324 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -168,3 +169,64 @@ func getKubeLikeComponent(component *dwv2.Component) (*dwv2.K8sLikeComponent, er
168169 }
169170 return nil , fmt .Errorf ("component does not specify kubernetes or openshift fields" )
170171}
172+
173+ func (h * WebhookHandler ) validateKubernetesObjectPermissionsOnCreate_v1alpha1 (ctx context.Context , req admission.Request , wksp * dwv1.DevWorkspace ) error {
174+ kubeComponents := getKubeComponentsFromWorkspace_v1alpha1 (wksp )
175+ for componentName , component := range kubeComponents {
176+ if component .Uri != "" {
177+ return fmt .Errorf ("kubenetes components specified via URI are unsupported" )
178+ }
179+ if component .Inlined == "" {
180+ return fmt .Errorf ("kubernetes component does not define inlined content" )
181+ }
182+ if err := h .validatePermissionsOnObject (ctx , req , componentName , component .Inlined ); err != nil {
183+ return err
184+ }
185+ }
186+ return nil
187+ }
188+
189+ func (h * WebhookHandler ) validateKubernetesObjectPermissionsOnUpdate_v1alpha1 (ctx context.Context , req admission.Request , newWksp , oldWksp * dwv1.DevWorkspace ) error {
190+ newKubeComponents := getKubeComponentsFromWorkspace_v1alpha1 (newWksp )
191+ oldKubeComponents := getKubeComponentsFromWorkspace_v1alpha1 (oldWksp )
192+
193+ for componentName , newComponent := range newKubeComponents {
194+ if newComponent .Uri != "" {
195+ return fmt .Errorf ("kubenetes components specified via URI are unsupported" )
196+ }
197+ if newComponent .Inlined == "" {
198+ return fmt .Errorf ("kubernetes component does not define inlined content" )
199+ }
200+
201+ oldComponent , ok := oldKubeComponents [componentName ]
202+ if ! ok || oldComponent .Inlined != newComponent .Inlined {
203+ // Review new components
204+ if err := h .validatePermissionsOnObject (ctx , req , componentName , newComponent .Inlined ); err != nil {
205+ return err
206+ }
207+ }
208+ }
209+ return nil
210+ }
211+
212+ func getKubeComponentsFromWorkspace_v1alpha1 (wksp * dwv1.DevWorkspace ) map [string ]dwv1.K8sLikeComponent {
213+ kubeComponents := map [string ]dwv1.K8sLikeComponent {}
214+ for _ , component := range wksp .Spec .Template .Components {
215+ kubeComponent , err := getKubeLikeComponent_v1alpha1 (& component )
216+ if err != nil {
217+ continue
218+ }
219+ kubeComponents [kubeComponent .Name ] = * kubeComponent
220+ }
221+ return kubeComponents
222+ }
223+
224+ func getKubeLikeComponent_v1alpha1 (component * dwv1.Component ) (* dwv1.K8sLikeComponent , error ) {
225+ if component .Kubernetes != nil {
226+ return & component .Kubernetes .K8sLikeComponent , nil
227+ }
228+ if component .Openshift != nil {
229+ return & component .Openshift .K8sLikeComponent , nil
230+ }
231+ return nil , fmt .Errorf ("component does not specify kubernetes or openshift fields" )
232+ }
0 commit comments