diff --git a/frontend/public/components/storage/__tests__/shared.spec.ts b/frontend/public/components/storage/__tests__/shared.spec.ts new file mode 100644 index 00000000000..14295e7a3cc --- /dev/null +++ b/frontend/public/components/storage/__tests__/shared.spec.ts @@ -0,0 +1,86 @@ +import { + getAccessModeForProvisioner, + getProvisionerModeMapping, + getVolumeModeForProvisioner, +} from '../shared'; + +describe('storage shared helpers', () => { + describe('getAccessModeForProvisioner', () => { + it('includes ReadWriteOncePod for Cinder CSI Filesystem', () => { + expect(getAccessModeForProvisioner('cinder.csi.openstack.org', false, 'Filesystem')).toEqual([ + 'ReadWriteOnce', + 'ReadWriteOncePod', + ]); + }); + + it('includes ReadWriteOncePod for Cinder CSI Block', () => { + expect(getAccessModeForProvisioner('cinder.csi.openstack.org', false, 'Block')).toEqual([ + 'ReadWriteOnce', + 'ReadWriteOncePod', + ]); + }); + + it('includes ReadWriteOncePod for in-tree Cinder without duplicates', () => { + expect(getAccessModeForProvisioner('kubernetes.io/cinder', false, 'Filesystem')).toEqual([ + 'ReadWriteOnce', + 'ReadWriteOncePod', + ]); + }); + + it('does not enable RWOP for Manila CSI', () => { + expect(getAccessModeForProvisioner('manila.csi.openstack.org')).toEqual([ + 'ReadWriteOnce', + 'ReadWriteMany', + 'ReadOnlyMany', + ]); + }); + + it('filters ReadOnlyMany when ignoreReadOnly is true', () => { + expect(getAccessModeForProvisioner('manila.csi.openstack.org', true, 'Filesystem')).toEqual([ + 'ReadWriteOnce', + 'ReadWriteMany', + ]); + }); + + it('falls back to all access modes for unknown provisioners', () => { + expect(getAccessModeForProvisioner('unknown.provisioner.example')).toEqual([ + 'ReadWriteOnce', + 'ReadWriteMany', + 'ReadOnlyMany', + 'ReadWriteOncePod', + ]); + }); + + it('does not offer RWX or ROX for Cinder CSI', () => { + const modes = getAccessModeForProvisioner('cinder.csi.openstack.org'); + expect(modes).toEqual(['ReadWriteOnce', 'ReadWriteOncePod']); + expect(modes).not.toContain('ReadWriteMany'); + expect(modes).not.toContain('ReadOnlyMany'); + }); + }); + + describe('getProvisionerModeMapping', () => { + it('returns Filesystem and Block mappings for Cinder CSI including RWOP', () => { + expect(getProvisionerModeMapping('cinder.csi.openstack.org')).toEqual({ + Filesystem: ['ReadWriteOnce', 'ReadWriteOncePod'], + Block: ['ReadWriteOnce', 'ReadWriteOncePod'], + }); + }); + + it('does not duplicate ReadWriteOncePod for in-tree Cinder', () => { + expect(getProvisionerModeMapping('kubernetes.io/cinder')).toEqual({ + Filesystem: ['ReadWriteOnce', 'ReadWriteOncePod'], + Block: ['ReadWriteOnce', 'ReadWriteOncePod'], + }); + }); + }); + + describe('getVolumeModeForProvisioner', () => { + it('allows Filesystem and Block for Cinder CSI with ReadWriteOncePod', () => { + expect(getVolumeModeForProvisioner('cinder.csi.openstack.org', 'ReadWriteOncePod')).toEqual([ + 'Filesystem', + 'Block', + ]); + }); + }); +}); diff --git a/frontend/public/components/storage/shared.ts b/frontend/public/components/storage/shared.ts index 64c8ee42ace..1f2fcaa4e92 100644 --- a/frontend/public/components/storage/shared.ts +++ b/frontend/public/components/storage/shared.ts @@ -48,8 +48,8 @@ export const provisionerAccessModeMapping: ProvisionerAccessModeMapping = Object Block: ['ReadWriteOnce', 'ReadWriteMany', 'ReadOnlyMany', 'ReadWriteOncePod'], }, 'kubernetes.io/cinder': { - Filesystem: ['ReadWriteOnce', 'ReadWriteOncePod', 'ReadWriteOncePod'], - Block: ['ReadWriteOnce', 'ReadWriteOncePod', 'ReadWriteOncePod'], + Filesystem: ['ReadWriteOnce', 'ReadWriteOncePod'], + Block: ['ReadWriteOnce', 'ReadWriteOncePod'], }, 'kubernetes.io/azure-file': { Filesystem: ['ReadWriteOnce', 'ReadWriteMany', 'ReadOnlyMany', 'ReadWriteOncePod'], @@ -101,8 +101,8 @@ export const provisionerAccessModeMapping: ProvisionerAccessModeMapping = Object Block: ['ReadWriteOnce'], }, 'cinder.csi.openstack.org': { - Filesystem: ['ReadWriteOnce'], - Block: ['ReadWriteOnce'], + Filesystem: ['ReadWriteOnce', 'ReadWriteOncePod'], + Block: ['ReadWriteOnce', 'ReadWriteOncePod'], }, 'pd.csi.storage.gke.io': { Filesystem: ['ReadWriteOnce', 'ReadWriteOncePod'],