Daniel Erez has uploaded a new change for review. Change subject: core,restapi: DirectLUN disk - validate LUN visibilty ......................................................................
core,restapi: DirectLUN disk - validate LUN visibilty Validate LUN visibility on DirectLUN disk creation: * core - Added a validation method to DiskValidator that verifies visibility of a LUN by querying GetDeviceList. - Execute the validation on AddDiskCommand only when a host is specified in parameters. - Added relevant AppError messages. * REST-API - When optional 'host' element is specified within the 'lun_storage' element, pass it to the parameters object. - Updated rsdl yaml accordingly. Change-Id: I339c999ebdfa69b8e2cbe4f55f8fe12e455810e4 Bug-Url: https://bugzilla.redhat.com/1123754 Buf-Url: https://bugzilla.redhat.com/1096217 Signed-off-by: Daniel Erez <[email protected]> --- M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddDiskCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/DiskValidator.java M backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/AddDiskToVmCommandTest.java M backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/validator/DiskValidatorTest.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VmDiskOperationParameterBase.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllMessages.java M backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties M backend/manager/modules/restapi/interface/definition/src/main/resources/rsdl_metadata.yaml M backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendDisksResource.java M backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendVmDisksResource.java M frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/AppErrors.java M frontend/webadmin/modules/userportal-gwtp/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties M frontend/webadmin/modules/webadmin/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties 13 files changed, 169 insertions(+), 0 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/24/31924/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddDiskCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddDiskCommand.java index 86c41d3..6c7dc35 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddDiskCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddDiskCommand.java @@ -79,6 +79,7 @@ public AddDiskCommand(T parameters, CommandContext commandContext) { super(parameters, commandContext); + setVdsId(parameters.getVdsId()); } @@ -167,6 +168,10 @@ return false; } + if (getVds() != null && !validate(diskValidator.isLunDiskVisible(lun, getVds()))) { + return false; + } + return true; } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/DiskValidator.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/DiskValidator.java index ce10244..ce35bb3 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/DiskValidator.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/DiskValidator.java @@ -2,19 +2,28 @@ import java.util.List; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections.Predicate; +import org.ovirt.engine.core.bll.Backend; import org.ovirt.engine.core.bll.ValidationResult; import org.ovirt.engine.core.bll.utils.VmDeviceUtils; import org.ovirt.engine.core.common.FeatureSupported; import org.ovirt.engine.core.common.businessentities.Disk; import org.ovirt.engine.core.common.businessentities.Disk.DiskStorageType; import org.ovirt.engine.core.common.businessentities.DiskInterface; +import org.ovirt.engine.core.common.businessentities.LUNs; +import org.ovirt.engine.core.common.businessentities.StorageType; +import org.ovirt.engine.core.common.businessentities.VDS; import org.ovirt.engine.core.common.businessentities.VM; import org.ovirt.engine.core.common.businessentities.VMStatus; import org.ovirt.engine.core.common.businessentities.VmDevice; import org.ovirt.engine.core.common.errors.VdcBllMessages; +import org.ovirt.engine.core.common.interfaces.VDSBrokerFrontend; import org.ovirt.engine.core.common.osinfo.OsRepository; import org.ovirt.engine.core.common.utils.Pair; import org.ovirt.engine.core.common.utils.SimpleDependecyInjector; +import org.ovirt.engine.core.common.vdscommands.GetDeviceListVDSCommandParameters; +import org.ovirt.engine.core.common.vdscommands.VDSCommandType; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.dal.dbbroker.DbFacade; import org.ovirt.engine.core.dao.VmDAO; @@ -137,6 +146,40 @@ return ValidationResult.VALID; } + /** + * Determines whether the specified LUN is visible to the specified host. + * + * @param lun the LUN to examine. + * @param vds the host to query from. + * + * @return whether the specified lun is visible. + */ + public ValidationResult isLunDiskVisible(final LUNs lun, VDS vds) { + List<LUNs> luns = executeGetDeviceList(vds.getId(), lun.getLunType()); + + // Search LUN in the device list + boolean lunExists = CollectionUtils.exists(luns, new Predicate() { + @Override + public boolean evaluate(Object o) { + return ((LUNs) o).getId().equals(lun.getId()); + } + }); + + return lunExists ? ValidationResult.VALID : + new ValidationResult(VdcBllMessages.ACTION_TYPE_FAILED_DISK_LUN_INVALID); + } + + @SuppressWarnings("unchecked") + public List<LUNs> executeGetDeviceList(Guid vdsId, StorageType storageType) { + GetDeviceListVDSCommandParameters parameters = + new GetDeviceListVDSCommandParameters(vdsId, storageType); + return (List<LUNs>) getVdsBroker().RunVdsCommand(VDSCommandType.GetDeviceList, parameters).getReturnValue(); + } + + protected VDSBrokerFrontend getVdsBroker() { + return Backend.getInstance().getResourceManager(); + } + private static OsRepository getOsRepository() { return SimpleDependecyInjector.getInstance().get(OsRepository.class); } diff --git a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/AddDiskToVmCommandTest.java b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/AddDiskToVmCommandTest.java index 3a04198..2e7a1c7 100644 --- a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/AddDiskToVmCommandTest.java +++ b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/AddDiskToVmCommandTest.java @@ -15,6 +15,7 @@ import java.util.Arrays; import java.util.Collections; import java.util.HashMap; +import java.util.List; import java.util.Map; import org.junit.ClassRule; @@ -40,6 +41,7 @@ import org.ovirt.engine.core.common.businessentities.StoragePoolStatus; import org.ovirt.engine.core.common.businessentities.StorageServerConnections; import org.ovirt.engine.core.common.businessentities.StorageType; +import org.ovirt.engine.core.common.businessentities.VDS; import org.ovirt.engine.core.common.businessentities.VM; import org.ovirt.engine.core.common.businessentities.VMStatus; import org.ovirt.engine.core.common.businessentities.VolumeFormat; @@ -54,6 +56,7 @@ import org.ovirt.engine.core.dao.StorageDomainDAO; import org.ovirt.engine.core.dao.StoragePoolDAO; import org.ovirt.engine.core.dao.StoragePoolIsoMapDAO; +import org.ovirt.engine.core.dao.VdsDAO; import org.ovirt.engine.core.dao.VmDAO; import org.ovirt.engine.core.dao.network.VmNicDao; import org.ovirt.engine.core.utils.MockConfigRule; @@ -91,6 +94,9 @@ @Mock private StoragePoolDAO storagePoolDAO; + + @Mock + private VdsDAO vdsDAO; @Mock private OsRepository osRepository; @@ -448,6 +454,14 @@ doReturn(MAX_PCI_SLOTS).when(osRepository).getMaxPciDevices(anyInt(), any(Version.class)); } + private VDS mockVds() { + Guid vdsId = Guid.newGuid(); + VDS vds = new VDS(); + vds.setId(vdsId); + when(vdsDAO.get(vdsId)).thenReturn(vds); + return vds; + } + /** * Mock a {@link StoragePool}. * @@ -656,6 +670,51 @@ } @Test + public void testLunDiskValid() { + VDS vds = mockVds(); + LunDisk disk = createISCSILunDisk(); + disk.setDiskInterface(DiskInterface.VirtIO); + + AddDiskParameters parameters = createParameters(); + parameters.setDiskInfo(disk); + parameters.setVdsId(vds.getId()); + initializeCommand(Guid.newGuid(), parameters); + command.setVds(vds); + + mockVm(); + mockMaxPciSlots(); + mockInterfaceList(); + + List<LUNs> luns = Collections.singletonList(disk.getLun()); + DiskValidator diskValidator = spyDiskValidator(disk); + doReturn(luns).when(diskValidator).executeGetDeviceList(any(Guid.class), any(StorageType.class)); + CanDoActionTestUtils.runAndAssertCanDoActionSuccess(command); + } + + @Test + public void testLunDiskInvalid() { + VDS vds = mockVds(); + LunDisk disk = createISCSILunDisk(); + disk.setDiskInterface(DiskInterface.VirtIO); + + AddDiskParameters parameters = createParameters(); + parameters.setDiskInfo(disk); + parameters.setVdsId(vds.getId()); + initializeCommand(Guid.newGuid(), parameters); + command.setVds(vds); + + mockVm(); + mockMaxPciSlots(); + mockInterfaceList(); + + List<LUNs> luns = Collections.emptyList(); + DiskValidator diskValidator = spyDiskValidator(disk); + doReturn(luns).when(diskValidator).executeGetDeviceList(any(Guid.class), any(StorageType.class)); + CanDoActionTestUtils.runAndAssertCanDoActionFailure(command, + VdcBllMessages.ACTION_TYPE_FAILED_DISK_LUN_INVALID); + } + + @Test public void testAddingIDELunExceedsSlotLimit() { mockInterfaceList(); LunDisk disk = createISCSILunDisk(); diff --git a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/validator/DiskValidatorTest.java b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/validator/DiskValidatorTest.java index e9c918a..f26cd6c 100644 --- a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/validator/DiskValidatorTest.java +++ b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/validator/DiskValidatorTest.java @@ -3,6 +3,7 @@ import static org.hamcrest.CoreMatchers.both; import static org.hamcrest.CoreMatchers.hasItem; import static org.junit.Assert.assertThat; +import static org.mockito.Matchers.any; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.when; @@ -11,6 +12,7 @@ import static org.ovirt.engine.core.bll.validator.ValidationResultMatchers.replacements; import java.util.ArrayList; +import java.util.Collections; import java.util.LinkedList; import java.util.List; @@ -22,8 +24,11 @@ import org.ovirt.engine.core.common.businessentities.Disk; import org.ovirt.engine.core.common.businessentities.DiskImage; import org.ovirt.engine.core.common.businessentities.DiskInterface; +import org.ovirt.engine.core.common.businessentities.LUNs; import org.ovirt.engine.core.common.businessentities.LunDisk; import org.ovirt.engine.core.common.businessentities.ScsiGenericIO; +import org.ovirt.engine.core.common.businessentities.StorageType; +import org.ovirt.engine.core.common.businessentities.VDS; import org.ovirt.engine.core.common.businessentities.VM; import org.ovirt.engine.core.common.businessentities.VMStatus; import org.ovirt.engine.core.common.businessentities.VmDevice; @@ -55,6 +60,10 @@ private static LunDisk createLunDisk() { LunDisk disk = new LunDisk(); + LUNs lun = new LUNs(); + lun.setLUN_id("lun_id"); + lun.setLunType(StorageType.ISCSI); + disk.setLun(lun); return disk; } @@ -64,6 +73,13 @@ vm.setId(Guid.newGuid()); vm.setVmOs(1); return vm; + } + + private VDS createVds() { + Guid vdsId = Guid.newGuid(); + VDS vds = new VDS(); + vds.setId(vdsId); + return vds; } private void initializeOsRepository (int osId, DiskInterface diskInterface) { @@ -199,4 +215,26 @@ lunDisk.setDiskInterface(DiskInterface.IDE); assertThat(lunValidator.isReadOnlyPropertyCompatibleWithInterface(), isValid()); } + + public void lunDiskValid() { + VDS vds = createVds(); + setupForLun(); + + List<LUNs> luns = Collections.singletonList(lunDisk.getLun()); + doReturn(luns).when(lunValidator).executeGetDeviceList(any(Guid.class), any(StorageType.class)); + + assertThat(lunValidator.isLunDiskVisible(lunDisk.getLun(), vds), isValid()); + } + + @Test + public void lunDiskInvalid() { + VDS vds = createVds(); + setupForLun(); + + List<LUNs> luns = Collections.emptyList(); + doReturn(luns).when(lunValidator).executeGetDeviceList(any(Guid.class), any(StorageType.class)); + + assertThat(lunValidator.isLunDiskVisible(lunDisk.getLun(), vds), + failsWith(VdcBllMessages.ACTION_TYPE_FAILED_DISK_LUN_INVALID)); + } } diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VmDiskOperationParameterBase.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VmDiskOperationParameterBase.java index c6d5f20..9a5bdff 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VmDiskOperationParameterBase.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VmDiskOperationParameterBase.java @@ -12,6 +12,7 @@ @Valid private Disk diskInfo; private Guid snapshotId; + private Guid vdsId; public VmDiskOperationParameterBase() { } @@ -36,4 +37,12 @@ public void setSnapshotId(Guid snapshotId) { this.snapshotId = snapshotId; } + + public Guid getVdsId() { + return vdsId; + } + + public void setVdsId(Guid vdsId) { + this.vdsId = vdsId; + } } diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllMessages.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllMessages.java index 40c727b..ba3d76f 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllMessages.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllMessages.java @@ -202,6 +202,7 @@ ACTION_TYPE_FAILED_DISK_LUN_IS_ALREADY_IN_USE(ErrorType.CONFLICT), ACTION_TYPE_FAILED_DISK_LUN_HAS_NO_VALID_TYPE(ErrorType.CONFLICT), ACTION_TYPE_FAILED_DISK_LUN_ISCSI_MISSING_CONNECTION_PARAMS(ErrorType.CONFLICT), + ACTION_TYPE_FAILED_DISK_LUN_INVALID(ErrorType.BAD_PARAMETERS), ACTION_TYPE_FAILED_UNSUPPORTED_DISK_STORAGE_TYPE(ErrorType.BAD_PARAMETERS), ACTION_TYPE_FAILED_STORAGE_DOMAIN_UNAVAILABLE(ErrorType.BAD_PARAMETERS), ACTION_TYPE_FAILED_STORAGE_DOMAIN_TYPE_UNSUPPORTED(ErrorType.BAD_PARAMETERS), diff --git a/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties b/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties index 4ef90d7..6c96af4 100644 --- a/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties +++ b/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties @@ -215,6 +215,7 @@ ACTION_TYPE_FAILED_DISK_LUN_IS_ALREADY_IN_USE=Cannot ${action} ${type}. The provided lun is used by another disk. ACTION_TYPE_FAILED_DISK_LUN_HAS_NO_VALID_TYPE=Cannot ${action} ${type}. The provided lun has no valid lun type. ACTION_TYPE_FAILED_DISK_LUN_ISCSI_MISSING_CONNECTION_PARAMS=Cannot ${action} ${type}. The provided lun is missing at least one connection parameter (address/port/iqn). +ACTION_TYPE_FAILED_DISK_LUN_INVALID=Cannot ${action} ${type}. The provided LUN is not visible by the specified host, please check storage server connectivity. ACTION_TYPE_FAILED_MIGRATION_IN_PROGRESS=Cannot ${action} ${type}. VM migration is in progress ACTION_TYPE_FAILED_MIGRATION_TO_SAME_HOST=Cannot ${action} ${type}. source and destination is the same. ACTION_TYPE_FAILED_INVALID_CUSTOM_PROPERTIES_INVALID_SYNTAX=Cannot ${action} ${type} if custom properties are in invalid format. Please check the input. diff --git a/backend/manager/modules/restapi/interface/definition/src/main/resources/rsdl_metadata.yaml b/backend/manager/modules/restapi/interface/definition/src/main/resources/rsdl_metadata.yaml index 9a07e14..1f653d6 100644 --- a/backend/manager/modules/restapi/interface/definition/src/main/resources/rsdl_metadata.yaml +++ b/backend/manager/modules/restapi/interface/definition/src/main/resources/rsdl_metadata.yaml @@ -707,6 +707,7 @@ disk.wipe_after_delete: xs:boolean disk.quota.id: xs:string disk.sgio: xs:string + disk.lun_storage.host: xs:string description: add a new direct lun disk to the virtual machine, this operation does not require size but needs lun connection details - mandatoryArguments: {disk.id: 'xs:string'} optionalArguments: @@ -1203,6 +1204,7 @@ disk.wipe_after_delete: xs:boolean disk.quota.id: xs:string disk.sgio: xs:string + disk.lun_storage.host: xs:string description: add a new lun disk to the system, this operation does not require size but requires lun connection details urlparams: {} headers: diff --git a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendDisksResource.java b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendDisksResource.java index c362a14..309d099 100644 --- a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendDisksResource.java +++ b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendDisksResource.java @@ -43,6 +43,9 @@ params.setStorageDomainId(storageDomainId); } } + if (disk.isSetLunStorage() && disk.getLunStorage().isSetHost()) { + params.setVdsId(getHostId(disk.getLunStorage().getHost())); + } return performCreate(VdcActionType.AddDisk, params, new QueryIdResolver<Guid>(VdcQueryType.GetDiskByDiskId, IdQueryParameters.class)); } diff --git a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendVmDisksResource.java b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendVmDisksResource.java index 1ad93fc..18d53ba 100644 --- a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendVmDisksResource.java +++ b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendVmDisksResource.java @@ -150,6 +150,9 @@ if (disk.isSetActive()) { parameters.setPlugDiskToVm(disk.isActive()); } + if (disk.isSetLunStorage() && disk.getLunStorage().isSetHost()) { + parameters.setVdsId(getHostId(disk.getLunStorage().getHost())); + } return parameters; } diff --git a/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/AppErrors.java b/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/AppErrors.java index a20e541..c415473 100644 --- a/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/AppErrors.java +++ b/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/AppErrors.java @@ -583,6 +583,9 @@ @DefaultStringValue("Cannot ${action} ${type}. The provided lun is missing at least one connection parameter (address/port/iqn).") String ACTION_TYPE_FAILED_DISK_LUN_ISCSI_MISSING_CONNECTION_PARAMS(); + @DefaultStringValue("Cannot ${action} ${type}. The provided LUN is not visible by the specified host, please check storage server connectivity.") + String ACTION_TYPE_FAILED_DISK_LUN_INVALID(); + @DefaultStringValue("Cannot ${action} ${type}. source and destination is the same.") String ACTION_TYPE_FAILED_MIGRATION_TO_SAME_HOST(); diff --git a/frontend/webadmin/modules/userportal-gwtp/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties b/frontend/webadmin/modules/userportal-gwtp/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties index f592fd7..a88a9d2 100644 --- a/frontend/webadmin/modules/userportal-gwtp/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties +++ b/frontend/webadmin/modules/userportal-gwtp/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties @@ -208,6 +208,7 @@ ACTION_TYPE_FAILED_DISK_LUN_IS_ALREADY_IN_USE=Cannot ${action} ${type}. The provided lun is used by another disk. ACTION_TYPE_FAILED_DISK_LUN_HAS_NO_VALID_TYPE=Cannot ${action} ${type}. The provided lun has no valid lun type. ACTION_TYPE_FAILED_DISK_LUN_ISCSI_MISSING_CONNECTION_PARAMS=Cannot ${action} ${type}. The provided lun is missing at least one connection parameter (address/port/iqn). +ACTION_TYPE_FAILED_DISK_LUN_INVALID=Cannot ${action} ${type}. The provided LUN is not visible by the specified host, please check storage server connectivity. ACTION_TYPE_FAILED_MIGRATION_IN_PROGRESS=Cannot ${action} ${type}. VM migration is in progress ACTION_TYPE_FAILED_MIGRATION_TO_SAME_HOST=Cannot ${action} ${type}. source and destination is the same. ACTION_TYPE_FAILED_INVALID_CUSTOM_PROPERTIES_INVALID_SYNTAX=Cannot ${action} ${type} if custom properties are in invalid format. Please check the input. diff --git a/frontend/webadmin/modules/webadmin/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties b/frontend/webadmin/modules/webadmin/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties index bace5c8..f9cf400 100644 --- a/frontend/webadmin/modules/webadmin/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties +++ b/frontend/webadmin/modules/webadmin/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties @@ -212,6 +212,7 @@ ACTION_TYPE_FAILED_OVF_CONFIGURATION_NOT_SUPPORTED=Cannot ${action} ${type}. The OVF configuration could not be parsed. ACTION_TYPE_FAILED_DISK_LUN_HAS_NO_VALID_TYPE=Cannot ${action} ${type}. The provided lun has no valid lun type. ACTION_TYPE_FAILED_DISK_LUN_ISCSI_MISSING_CONNECTION_PARAMS=Cannot ${action} ${type}. The provided lun is missing at least one connection parameter (address/port/iqn). +ACTION_TYPE_FAILED_DISK_LUN_INVALID=Cannot ${action} ${type}. The provided LUN is not visible by the specified host, please check storage server connectivity. ACTION_TYPE_FAILED_DISK_LUN_IS_ALREADY_IN_USE=Cannot ${action} ${type}. The provided lun is used by another disk. ACTION_TYPE_FAILED_MIGRATION_IN_PROGRESS=Cannot ${action} ${type}. VM migration is in progress ACTION_TYPE_FAILED_MIGRATION_TO_SAME_HOST=Cannot ${action} ${type}. source and destination is the same. -- To view, visit http://gerrit.ovirt.org/31924 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I339c999ebdfa69b8e2cbe4f55f8fe12e455810e4 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: ovirt-engine-3.5 Gerrit-Owner: Daniel Erez <[email protected]> _______________________________________________ Engine-patches mailing list [email protected] http://lists.ovirt.org/mailman/listinfo/engine-patches
