diff --git a/manifests/ate-install/generated/ate.dev_actortemplates.yaml b/manifests/ate-install/generated/ate.dev_actortemplates.yaml index 0c8af4b08..0bebc1473 100644 --- a/manifests/ate-install/generated/ate.dev_actortemplates.yaml +++ b/manifests/ate-install/generated/ate.dev_actortemplates.yaml @@ -428,6 +428,11 @@ spec: rule: '!has(self.containers) || self.containers.all(c, !has(c.volumeMounts) || c.volumeMounts.filter(vm, has(self.volumes) && self.volumes.exists(v, v.name == vm.name && has(v.durableDir))).size() <= 1)' + - message: All volumes defined in spec.volumes must be mounted by at least + one container + rule: '!has(self.volumes) || self.volumes.all(v, has(self.containers) + && self.containers.exists(c, has(c.volumeMounts) && c.volumeMounts.exists(vm, + vm.name == v.name)))' - message: DurableDir volumes are not supported when sandboxClass is 'microvm' rule: '!has(self.sandboxClass) || self.sandboxClass != ''microvm'' || !has(self.volumes) || !self.volumes.exists(v, has(v.durableDir))' diff --git a/pkg/api/v1alpha1/actortemplate_types.go b/pkg/api/v1alpha1/actortemplate_types.go index eefb824b0..c6933c104 100644 --- a/pkg/api/v1alpha1/actortemplate_types.go +++ b/pkg/api/v1alpha1/actortemplate_types.go @@ -296,6 +296,7 @@ type SnapshotsConfig struct { // // +kubebuilder:validation:XValidation:rule="!has(self.volumes) || self.volumes.filter(v, has(v.durableDir)).size() <= 1",message="At most one DurableDir-typed volume is supported per ActorTemplate" // +kubebuilder:validation:XValidation:rule="!has(self.containers) || self.containers.all(c, !has(c.volumeMounts) || c.volumeMounts.filter(vm, has(self.volumes) && self.volumes.exists(v, v.name == vm.name && has(v.durableDir))).size() <= 1)",message="A container may mount at most one DurableDir-typed volume" +// +kubebuilder:validation:XValidation:rule="!has(self.volumes) || self.volumes.all(v, has(self.containers) && self.containers.exists(c, has(c.volumeMounts) && c.volumeMounts.exists(vm, vm.name == v.name)))",message="All volumes defined in spec.volumes must be mounted by at least one container" // +kubebuilder:validation:XValidation:rule="!has(self.sandboxClass) || self.sandboxClass != 'microvm' || !has(self.volumes) || !self.volumes.exists(v, has(v.durableDir))",message="DurableDir volumes are not supported when sandboxClass is 'microvm'" // +kubebuilder:validation:XValidation:rule="!has(self.sandboxClass) || self.sandboxClass != 'microvm' || !has(self.volumes) || !self.volumes.exists(v, has(v.externalVolumeTemplate))",message="ExternalVolumes are not supported when sandboxClass is 'microvm'" type ActorTemplateSpec struct { diff --git a/pkg/api/v1alpha1/actortemplate_validation_test.go b/pkg/api/v1alpha1/actortemplate_validation_test.go index 6066ea948..89ccbc923 100644 --- a/pkg/api/v1alpha1/actortemplate_validation_test.go +++ b/pkg/api/v1alpha1/actortemplate_validation_test.go @@ -1069,6 +1069,44 @@ func TestActorTemplateValidation(t *testing.T) { at.Spec.SandboxClass = SandboxClassMicroVM }, wantErr: false, + }, { + name: "Volumes: volume without volumeMount is invalid", + mutate: func(at *ActorTemplate) { + at.Spec.Volumes = []Volume{ + {Name: "vol1", VolumeSource: VolumeSource{DurableDir: &DurableDirVolumeSource{}}}, + } + }, + wantErr: true, + errMsg: "All volumes defined in spec.volumes must be mounted by at least one container", + }, { + name: "Volumes: multiple volumes with one unmounted is invalid", + mutate: func(at *ActorTemplate) { + at.Spec.Volumes = []Volume{ + { + Name: "vol1", + VolumeSource: VolumeSource{ + ExternalVolumeTemplate: &ExternalVolumeTemplate{ + Capacity: resource.MustParse("10Gi"), + StorageClassName: "standard", + }, + }, + }, + { + Name: "vol2", + VolumeSource: VolumeSource{ + ExternalVolumeTemplate: &ExternalVolumeTemplate{ + Capacity: resource.MustParse("20Gi"), + StorageClassName: "pd-ssd", + }, + }, + }, + } + at.Spec.Containers[0].VolumeMounts = []VolumeMount{ + {Name: "vol1", MountPath: "/mnt/vol1"}, + } + }, + wantErr: true, + errMsg: "All volumes defined in spec.volumes must be mounted by at least one container", }} for _, tt := range tests {