diff --git a/plugins/storage/sharedfs/storagevm/src/main/java/org/apache/cloudstack/storage/sharedfs/lifecycle/StorageVmSharedFSLifeCycle.java b/plugins/storage/sharedfs/storagevm/src/main/java/org/apache/cloudstack/storage/sharedfs/lifecycle/StorageVmSharedFSLifeCycle.java index 31159e7d3d95..ed26963cf819 100644 --- a/plugins/storage/sharedfs/storagevm/src/main/java/org/apache/cloudstack/storage/sharedfs/lifecycle/StorageVmSharedFSLifeCycle.java +++ b/plugins/storage/sharedfs/storagevm/src/main/java/org/apache/cloudstack/storage/sharedfs/lifecycle/StorageVmSharedFSLifeCycle.java @@ -140,13 +140,18 @@ private String getStorageVmConfig(final String fileSystem, final String hypervis return fsVmConfig; } - private String getStorageVmName(String fileShareName) { + private String getStorageVmPrefix(String fileShareName) { String prefix = String.format("%s-%s", SharedFSVmNamePrefix, fileShareName); - String suffix = Long.toHexString(System.currentTimeMillis()); - if (!NetUtils.verifyDomainNameLabel(prefix, true)) { prefix = prefix.replaceAll("[^a-zA-Z0-9-]", ""); } + return prefix; + } + + private String getStorageVmName(String fileShareName) { + String prefix = getStorageVmPrefix(fileShareName); + String suffix = Long.toHexString(System.currentTimeMillis()); + int nameLength = prefix.length() + suffix.length() + SharedFSVmNamePrefix.length(); if (nameLength > 63) { int prefixLength = prefix.length() - (nameLength - 63); @@ -236,8 +241,18 @@ public Pair deploySharedFS(SharedFS sharedFS, Long networkId, Long d Account owner = accountMgr.getActiveAccountById(sharedFS.getAccountId()); UserVm vm = deploySharedFSVM(sharedFS.getDataCenterId(), owner, List.of(networkId), sharedFS.getName(), sharedFS.getServiceOfferingId(), diskOfferingId, sharedFS.getFsType(), size, minIops, maxIops); - List volumes = volumeDao.findByInstanceAndType(vm.getId(), Volume.Type.DATADISK); - return new Pair<>(volumes.get(0).getId(), vm.getId()); + List volumes = volumeDao.findByInstance(vm.getId()); + VolumeVO dataVol = null; + for (VolumeVO vol : volumes) { + String volumeName = vol.getName(); + String updatedVolumeName = SharedFSVmNamePrefix + "-" + volumeName; + vol.setName(updatedVolumeName); + volumeDao.update(vol.getId(), vol); + if (vol.getVolumeType() == Volume.Type.DATADISK) { + dataVol = vol; + } + } + return new Pair<>(dataVol.getId(), vm.getId()); } @Override diff --git a/plugins/storage/sharedfs/storagevm/src/test/java/org/apache/cloudstack/storage/sharedfs/lifecycle/StorageVmSharedFSLifeCycleTest.java b/plugins/storage/sharedfs/storagevm/src/test/java/org/apache/cloudstack/storage/sharedfs/lifecycle/StorageVmSharedFSLifeCycleTest.java index 4393b0565f89..2cc909ce0d7a 100644 --- a/plugins/storage/sharedfs/storagevm/src/test/java/org/apache/cloudstack/storage/sharedfs/lifecycle/StorageVmSharedFSLifeCycleTest.java +++ b/plugins/storage/sharedfs/storagevm/src/test/java/org/apache/cloudstack/storage/sharedfs/lifecycle/StorageVmSharedFSLifeCycleTest.java @@ -260,9 +260,14 @@ public void testDeploySharedFS() throws ResourceUnavailableException, Insufficie anyMap(), isNull(), isNull(), isNull(), isNull(), anyBoolean(), anyString(), isNull())).thenReturn(vm); - VolumeVO volume = mock(VolumeVO.class); - when(volume.getId()).thenReturn(s_volumeId); - when(volumeDao.findByInstanceAndType(s_vmId, Volume.Type.DATADISK)).thenReturn(List.of(volume)); + VolumeVO rootVol = mock(VolumeVO.class); + when(rootVol.getVolumeType()).thenReturn(Volume.Type.ROOT); + when(rootVol.getName()).thenReturn("ROOT-1"); + VolumeVO dataVol = mock(VolumeVO.class); + when(dataVol.getId()).thenReturn(s_volumeId); + when(dataVol.getName()).thenReturn("DATA-1"); + when(dataVol.getVolumeType()).thenReturn(Volume.Type.DATADISK); + when(volumeDao.findByInstance(s_vmId)).thenReturn(List.of(rootVol, dataVol)); Pair result = lifeCycle.deploySharedFS(sharedFS, s_networkId, s_diskOfferingId, s_size, s_minIops, s_maxIops); Assert.assertEquals(Optional.ofNullable(result.first()), Optional.ofNullable(s_volumeId)); diff --git a/ui/src/components/view/InfoCard.vue b/ui/src/components/view/InfoCard.vue index 65c4d3ac0f5e..9053299cce17 100644 --- a/ui/src/components/view/InfoCard.vue +++ b/ui/src/components/view/InfoCard.vue @@ -33,6 +33,9 @@ + + + @@ -870,6 +873,7 @@ import UploadResourceIcon from '@/components/view/UploadResourceIcon' import eventBus from '@/config/eventBus' import ResourceIcon from '@/components/view/ResourceIcon' import ResourceLabel from '@/components/widgets/ResourceLabel' +import { FileTextOutlined } from '@ant-design/icons-vue' export default { name: 'InfoCard', @@ -881,7 +885,8 @@ export default { TooltipButton, UploadResourceIcon, ResourceIcon, - ResourceLabel + ResourceLabel, + FileTextOutlined }, props: { resource: { diff --git a/ui/src/components/view/ListView.vue b/ui/src/components/view/ListView.vue index 3d41e01bb1c5..eca99dc03469 100644 --- a/ui/src/components/view/ListView.vue +++ b/ui/src/components/view/ListView.vue @@ -44,6 +44,9 @@ + + + @@ -591,6 +594,7 @@ import { createPathBasedOnVmType } from '@/utils/plugins' import { validateLinks } from '@/utils/links' import cronstrue from 'cronstrue/i18n' import moment from 'moment-timezone' +import { FileTextOutlined } from '@ant-design/icons-vue' export default { name: 'ListView', @@ -601,7 +605,8 @@ export default { CopyLabel, TooltipButton, ResourceIcon, - ResourceLabel + ResourceLabel, + FileTextOutlined }, props: { columns: {