Liron Ar has uploaded a new change for review. Change subject: core: handle 'source' domains when adding a vm from template ......................................................................
core: handle 'source' domains when adding a vm from template When adding a vm from template we need to make sure to choose an Active domain on which the template disks stored on for the operation- 1. If there's no such domain, a CDA message should be displayed. 2. If the source disk is stored on few domains, the engine will attempt to select the same domain as the target domain for possibly faster copy. 3. For better user experience, at first we inspect if all the source disks have a copy on Active domain, later on the destination domains are being verified and then the source domains will be selected as explained in (2). Change-Id: I8d02cfded41a3588dc944d9dfcd5a3eec88c45ab Bug-Url: https://bugzilla.redhat.com/show_bug.cgi?id=1037439 Signed-off-by: Liron Aravot <[email protected]> --- M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmFromTemplateCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateCloneOfTemplateCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImagesHandler.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/DiskImagesValidator.java M backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/validator/DiskImagesValidatorTest.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 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 11 files changed, 217 insertions(+), 8 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/11/27111/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmCommand.java index 6e0904a..3dd57eb 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmCommand.java @@ -99,8 +99,9 @@ protected Guid imageTypeId; protected ImageType imageType; private Guid vmInterfacesSourceId; - private VmTemplate vmDisksSource; + protected VmTemplate vmDisksSource; private Guid vmDevicesSourceId; + private List<StorageDomain> poolDomains; private Map<Guid, Guid> srcDiskIdToTargetDiskIdMapping = new HashMap<>(); private Map<Guid, Guid> srcVmNicIdToTargetVmNicIdMapping = new HashMap<>(); @@ -418,9 +419,12 @@ return failCanDoAction(VdcBllMessages.ACTION_TYPE_FAILED_CLUSTER_UNDEFINED_ARCHITECTURE); } - if (!buildAndCheckDestStorageDomains()) { + if (verifySourceDomains() && buildAndCheckDestStorageDomains()) { + chooseDisksSourceDomains(); + } else { return false; } + // otherwise.. storageToDisksMap = ImagesHandler.buildStorageToDiskMap(getImagesToCheckDestinationStorageDomains(), @@ -575,6 +579,12 @@ return retValue && validateIsImagesOnDomains(); } + protected boolean verifySourceDomains() { + return true; + } + + protected void chooseDisksSourceDomains() {} + protected Collection<DiskImage> getImagesToCheckDestinationStorageDomains() { return vmDisksSource.getDiskTemplateMap().values(); } @@ -613,9 +623,16 @@ return true; } + protected List<StorageDomain> getPoolDomains() { + if (poolDomains == null) { + poolDomains = getStorageDomainDAO().getAllForStoragePool(vmDisksSource.getStoragePoolId()); + } + return poolDomains; + } + protected void fillImagesMapBasedOnTemplate() { ImagesHandler.fillImagesMapBasedOnTemplate(vmDisksSource, - getStorageDomainDAO().getAllForStoragePool(vmDisksSource.getStoragePoolId()), + getPoolDomains(), diskInfoDestinationMap, destStorages, false); } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmFromTemplateCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmFromTemplateCommand.java index 46f3234..6151536 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmFromTemplateCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmFromTemplateCommand.java @@ -1,26 +1,36 @@ package org.ovirt.engine.core.bll; +import java.util.EnumSet; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.Set; import org.ovirt.engine.core.bll.job.ExecutionHandler; +import org.ovirt.engine.core.bll.validator.DiskImagesValidator; +import org.ovirt.engine.core.common.AuditLogType; import org.ovirt.engine.core.common.action.AddVmFromTemplateParameters; import org.ovirt.engine.core.common.action.CreateCloneOfTemplateParameters; import org.ovirt.engine.core.common.action.VdcActionType; import org.ovirt.engine.core.common.action.VdcReturnValueBase; import org.ovirt.engine.core.common.businessentities.DiskImage; import org.ovirt.engine.core.common.businessentities.DiskImageBase; +import org.ovirt.engine.core.common.businessentities.Entities; +import org.ovirt.engine.core.common.businessentities.StorageDomain; +import org.ovirt.engine.core.common.businessentities.StorageDomainStatus; import org.ovirt.engine.core.common.businessentities.VMStatus; import org.ovirt.engine.core.common.errors.VdcBLLException; import org.ovirt.engine.core.common.errors.VdcBllErrors; import org.ovirt.engine.core.common.errors.VdcBllMessages; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.dal.dbbroker.DbFacade; -import org.ovirt.engine.core.common.AuditLogType; import org.ovirt.engine.core.dal.dbbroker.auditloghandling.AuditLogDirector; import org.ovirt.engine.core.dal.dbbroker.auditloghandling.AuditLogableBase; @LockIdNameAttribute(isReleaseAtEndOfExecute = false) public class AddVmFromTemplateCommand<T extends AddVmFromTemplateParameters> extends AddVmCommand<T> { + private Map<Guid, Guid> diskInfoSourceMap; + private Map<Guid, Set<Guid>> validDisksDomains; public AddVmFromTemplateCommand(T parameters) { super(parameters); @@ -100,8 +110,8 @@ DiskImageBase diskInfo = getParameters().getDiskInfoDestinationMap().get(disk.getId()); CreateCloneOfTemplateParameters params = new CreateCloneOfTemplateParameters(disk.getImageId(), getParameters().getVmStaticData().getId(), diskInfo); - params.setStorageDomainId(disk.getStorageIds().get(0)); - params.setDestStorageDomainId(diskInfoDestinationMap.get(disk.getId()).getStorageIds().get(0)); + params.setStorageDomainId(diskInfoSourceMap.get(disk.getId())); + params.setDestStorageDomainId(retrieveDestinationDomainForDisk(disk.getId())); params.setDiskAlias(diskInfoDestinationMap.get(disk.getId()).getDiskAlias()); params.setVmSnapshotId(getVmSnapshotId()); params.setParentCommand(VdcActionType.AddVmFromTemplate); @@ -145,6 +155,43 @@ } @Override + protected boolean verifySourceDomains() { + Map<Guid, StorageDomain> poolDomainsMap = Entities.businessEntitiesById(getPoolDomains()); + EnumSet<StorageDomainStatus> validDomainStatuses = EnumSet.of(StorageDomainStatus.Active); + validDisksDomains = + ImagesHandler.findDomainsInApplicableStatusForDisks(getImagesToCheckDestinationStorageDomains(), + poolDomainsMap, + validDomainStatuses); + return validate(new DiskImagesValidator(getImagesToCheckDestinationStorageDomains()).diskImagesOnAnyApplicableDomains( + validDisksDomains, poolDomainsMap, + VdcBllMessages.ACTION_TYPE_FAILED_NO_VALID_DOMAINS_STATUS_FOR_TEMPLATE_DISKS, validDomainStatuses)); + + } + + @Override + protected void chooseDisksSourceDomains() { + diskInfoSourceMap = new HashMap<>(); + for (DiskImage disk : getImagesToCheckDestinationStorageDomains()) { + Guid diskId = disk.getId(); + Set<Guid> validDomainsForDisk = validDisksDomains.get(diskId); + Guid destinationDomain = retrieveDestinationDomainForDisk(diskId); + + // if the destination domain is one of the valid source domains, we can + // choose the same domain as the source domain for + // possibly faster operation, otherwise we'll choose random valid domain as the source. + if (validDomainsForDisk.contains(destinationDomain)) { + diskInfoSourceMap.put(diskId, destinationDomain); + } else { + diskInfoSourceMap.put(diskId, validDomainsForDisk.iterator().next()); + } + } + } + + private Guid retrieveDestinationDomainForDisk(Guid id) { + return diskInfoDestinationMap.get(id).getStorageIds().get(0); + } + + @Override protected boolean isVirtioScsiEnabled() { return getParameters().isVirtioScsiEnabled() != null ? super.isVirtioScsiEnabled() : isVirtioScsiControllerAttached(getVmTemplateId()); diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateCloneOfTemplateCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateCloneOfTemplateCommand.java index fd55aca..0da85a2 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateCloneOfTemplateCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateCloneOfTemplateCommand.java @@ -53,7 +53,7 @@ Guid taskId = persistAsyncTaskPlaceHolder(VdcActionType.AddVmFromTemplate); try { vdsReturnValue = runVdsCommand(VDSCommandType.CopyImage, - new CopyImageVDSCommandParameters(storagePoolID, getDiskImage().getStorageIds().get(0), + new CopyImageVDSCommandParameters(storagePoolID, getParameters().getStorageDomainId(), getVmTemplateId(), getDiskImage().getId(), getImage().getImageId(), mNewCreatedDiskImage.getId(), getDestinationImageId(), "", getDestinationStorageDomainId(), CopyVolumeType.LeafVol, diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImagesHandler.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImagesHandler.java index 3602335..db2f0fe 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImagesHandler.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImagesHandler.java @@ -27,6 +27,7 @@ import org.ovirt.engine.core.common.businessentities.LunDisk; import org.ovirt.engine.core.common.businessentities.StorageDomain; import org.ovirt.engine.core.common.businessentities.StorageDomainStatic; +import org.ovirt.engine.core.common.businessentities.StorageDomainStatus; import org.ovirt.engine.core.common.businessentities.StorageServerConnections; import org.ovirt.engine.core.common.businessentities.StorageType; import org.ovirt.engine.core.common.businessentities.VM; @@ -461,6 +462,24 @@ return result; } + + public static Map<Guid, Set<Guid>> findDomainsInApplicableStatusForDisks(Iterable<DiskImage> diskImages, + Map<Guid, StorageDomain> storageDomains, + Set<StorageDomainStatus> applicableStatuses) { + Map<Guid, Set<Guid>> disksApplicableDomainsMap = new HashMap<>(); + for (DiskImage diskImage : diskImages) { + Set<Guid> diskApplicableDomain = new HashSet<>(); + for (Guid storageDomainID : diskImage.getStorageIds()) { + StorageDomain domain = storageDomains.get(storageDomainID); + if (applicableStatuses.contains(domain.getStatus())) { + diskApplicableDomain.add(domain.getId()); + } + } + disksApplicableDomainsMap.put(diskImage.getId(), diskApplicableDomain); + } + return disksApplicableDomainsMap; + } + /** * Sum and return the size of the given disks and their snapshots * Note: This method assumes that the given {@diskImages} are already loaded with their snapshots. diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/DiskImagesValidator.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/DiskImagesValidator.java index e94769f..132f398 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/DiskImagesValidator.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/DiskImagesValidator.java @@ -3,12 +3,16 @@ import java.util.ArrayList; import java.util.LinkedList; import java.util.List; +import java.util.Map; +import java.util.Set; import org.apache.commons.lang.StringUtils; import org.ovirt.engine.core.bll.ValidationResult; import org.ovirt.engine.core.common.businessentities.DiskImage; import org.ovirt.engine.core.common.businessentities.ImageStatus; import org.ovirt.engine.core.common.businessentities.Snapshot; +import org.ovirt.engine.core.common.businessentities.StorageDomain; +import org.ovirt.engine.core.common.businessentities.StorageDomainStatus; import org.ovirt.engine.core.common.businessentities.VM; import org.ovirt.engine.core.common.businessentities.VmDevice; import org.ovirt.engine.core.common.errors.VdcBllMessages; @@ -182,6 +186,50 @@ return ValidationResult.VALID; } + /** + * Checks that each of the disks has at least one domain in valid status in the given map + * @param validDomainsForDisk Map containing valid domains for each disk + * @param storageDomains Map containing the storage domain objects + * @param message Validation message to use in case of error + * @param applicableStatuses Applicable domain statuses to use as replacement in the given message + * @return A {@link ValidationResult} with the validation information. + */ + public ValidationResult diskImagesOnAnyApplicableDomains(Map<Guid, Set<Guid>> validDomainsForDisk, + Map<Guid, StorageDomain> storageDomains, + VdcBllMessages message, + Set<StorageDomainStatus> applicableStatuses) { + + StringBuilder disksInfo = new StringBuilder(); + for (DiskImage diskImage : diskImages) { + Set<Guid> applicableDomains = validDomainsForDisk.get(diskImage.getId()); + if (!applicableDomains.isEmpty()) { + continue; + } + + List<String> nonApplicableStorageInfo = new LinkedList<>(); + for (Guid id : diskImage.getStorageIds()) { + StorageDomain domain = storageDomains.get(id); + nonApplicableStorageInfo.add(String.format("%s - %s", domain.getName(), domain.getStatus() + .toString())); + } + + disksInfo.append(String.format("%s (%s) %n", + diskImage.getDiskAlias(), + StringUtils.join(nonApplicableStorageInfo, " / "))); + } + + ValidationResult result = ValidationResult.VALID; + + if (disksInfo.length() > 0) { + result = new ValidationResult(message, + String.format("$disksInfo %s", + disksInfo.toString()), + String.format("$applicableStatus %s", StringUtils.join(applicableStatuses, ","))); + } + + return result; + } + private DbFacade getDbFacade() { return DbFacade.getInstance(); } diff --git a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/validator/DiskImagesValidatorTest.java b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/validator/DiskImagesValidatorTest.java index df7051e..06e76df 100644 --- a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/validator/DiskImagesValidatorTest.java +++ b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/validator/DiskImagesValidatorTest.java @@ -18,7 +18,11 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; +import java.util.EnumSet; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.Set; import org.junit.Before; import org.junit.ClassRule; @@ -30,6 +34,8 @@ import org.ovirt.engine.core.common.businessentities.DiskImage; import org.ovirt.engine.core.common.businessentities.ImageStatus; import org.ovirt.engine.core.common.businessentities.Snapshot; +import org.ovirt.engine.core.common.businessentities.StorageDomain; +import org.ovirt.engine.core.common.businessentities.StorageDomainStatus; import org.ovirt.engine.core.common.businessentities.VM; import org.ovirt.engine.core.common.businessentities.VmDevice; import org.ovirt.engine.core.common.businessentities.VmDeviceId; @@ -83,7 +89,9 @@ disk.setDiskAlias(RandomUtils.instance().nextString(10)); disk.setActive(true); disk.setImageStatus(ImageStatus.OK); - + ArrayList<Guid> storageDomainIds = new ArrayList<>(); + storageDomainIds.add(Guid.newGuid()); + disk.setStorageIds(storageDomainIds); return disk; } @@ -280,6 +288,61 @@ verify(snapshotDao, never()).get(createdDevices.get(0).getSnapshotId()); } + private Map<Guid, Set<Guid>> createDiskValidDomainsMap(DiskImage... diskImages) { + Map<Guid, Set<Guid>> toReturn = new HashMap<>(); + for (DiskImage diskImage : diskImages) { + toReturn.put(diskImage.getId(), Collections.singleton(diskImage.getStorageIds().get(0))); + } + + return toReturn; + } + + private Map<Guid, StorageDomain> createStorageDomainsMap(DiskImage... diskImages) { + Map<Guid, StorageDomain> toReturn = new HashMap<>(); + for (DiskImage diskImage : diskImages) { + Guid id = diskImage.getStorageIds().get(0); + StorageDomain domain = new StorageDomain(); + domain.setId(id); + domain.setStatus(StorageDomainStatus.Active); + toReturn.put(id, domain); + } + + return toReturn; + } + + @Test + public void diskImagesOnAnyApplicableDomainsValidDomains() { + Map<Guid, Set<Guid>> validDomainsForDisk = createDiskValidDomainsMap(disk1, disk2); + Map<Guid, StorageDomain> storageDomainMap = createStorageDomainsMap(disk1, disk2); + assertThat(validator.diskImagesOnAnyApplicableDomains(validDomainsForDisk, + storageDomainMap, + VdcBllMessages.ACTION_TYPE_FAILED_NO_VALID_DOMAINS_STATUS_FOR_TEMPLATE_DISKS, + EnumSet.of(StorageDomainStatus.Active)), isValid()); + } + + @Test + public void diskImagesOnAnyApplicableDomainsNoValidDomainsForAllDisks() { + Map<Guid, Set<Guid>> validDomainsForDisk = new HashMap<>(); + validDomainsForDisk.put(disk1.getId(), Collections.<Guid>emptySet()); + validDomainsForDisk.put(disk2.getId(), Collections.<Guid>emptySet()); + Map<Guid, StorageDomain> storageDomainMap = createStorageDomainsMap(disk1, disk2); + assertThat(validator.diskImagesOnAnyApplicableDomains(validDomainsForDisk, + storageDomainMap, + VdcBllMessages.ACTION_TYPE_FAILED_NO_VALID_DOMAINS_STATUS_FOR_TEMPLATE_DISKS, + EnumSet.of(StorageDomainStatus.Active)), failsWith(VdcBllMessages.ACTION_TYPE_FAILED_NO_VALID_DOMAINS_STATUS_FOR_TEMPLATE_DISKS)); + } + + @Test + public void diskImagesOnAnyApplicableDomainsNoValidDomainsForOneDisk() { + Map<Guid, Set<Guid>> validDomainsForDisk = createDiskValidDomainsMap(disk1); + validDomainsForDisk.put(disk2.getId(), Collections.<Guid>emptySet()); + Map<Guid, StorageDomain> storageDomainMap = createStorageDomainsMap(disk1, disk2); + assertThat(validator.diskImagesOnAnyApplicableDomains(validDomainsForDisk, + storageDomainMap, + VdcBllMessages.ACTION_TYPE_FAILED_NO_VALID_DOMAINS_STATUS_FOR_TEMPLATE_DISKS, + EnumSet.of(StorageDomainStatus.Active)), failsWith(VdcBllMessages.ACTION_TYPE_FAILED_NO_VALID_DOMAINS_STATUS_FOR_TEMPLATE_DISKS)); + } + private VmDevice createVmDeviceForDisk(DiskImage disk) { VmDevice device = new VmDevice(); device.setId(new VmDeviceId(null, disk.getId())); 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 fd8eb74..4b6173e 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 @@ -636,6 +636,7 @@ ACTION_TYPE_FAILED_DISK_IS_BEING_MIGRATED(ErrorType.CONFLICT), ACTION_TYPE_FAILED_DESTINATION_AND_SOURCE_STORAGE_SUB_TYPES_DIFFERENT(ErrorType.CONFLICT), ACTION_TYPE_FAILED_TEMPLATE_IS_BEING_EXPORTED(ErrorType.CONFLICT), + ACTION_TYPE_FAILED_NO_VALID_DOMAINS_STATUS_FOR_TEMPLATE_DISKS(ErrorType.CONFLICT), ACTION_TYPE_FAILED_VM_IS_BEING_MIGRATED(ErrorType.CONFLICT), ACTION_TYPE_FAILED_VM_IS_BEING_IMPORTED(ErrorType.CONFLICT), ACTION_TYPE_FAILED_TEMPLATE_IS_BEING_REMOVED(ErrorType.CONFLICT), 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 4614749..99b0510 100644 --- a/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties +++ b/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties @@ -645,6 +645,9 @@ ACTION_TYPE_FAILED_DISK_IS_BEING_MIGRATED=Cannot ${action} ${type}. Disk ${DiskName} is being moved or copied. ACTION_TYPE_FAILED_DESTINATION_AND_SOURCE_STORAGE_SUB_TYPES_DIFFERENT=Cannot ${action} ${type}. Source and target domains must both be either file domains or block domains. ACTION_TYPE_FAILED_TEMPLATE_IS_BEING_EXPORTED=Cannot ${action} ${type}. Template ${TemplateName} is being exported. +ACTION_TYPE_FAILED_NO_VALID_DOMAINS_STATUS_FOR_TEMPLATE_DISKS=Cannot ${action} ${type}. Can't find Domain(s) in ${applicableStatus} status for some of the Template disks.\n\ +Please make sure that there is at least one Storage Domain in applicable status for each one of the disks :\n\ +${disksInfo}. ACTION_TYPE_FAILED_VM_IS_BEING_IMPORTED=Cannot ${action} ${type}. VM ${VmName} is being imported. ACTION_TYPE_FAILED_VM_IS_BEING_MIGRATED=Cannot ${action} ${type}. VM ${VmName} is being migrated. ACTION_TYPE_FAILED_TEMPLATE_IS_BEING_REMOVED=Cannot ${action} ${type}. Template ${TemplateName} is being removed. 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 4865b85..f11e863 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 @@ -1768,6 +1768,11 @@ @DefaultStringValue("Cannot ${action} ${type}. Template ${TemplateName} is being exported.") String ACTION_TYPE_FAILED_TEMPLATE_IS_BEING_EXPORTED(); + @DefaultStringValue("Cannot ${action} ${type}. Can't find Domain(s) in ${applicableStatus} status for some of the Template disks.\n" + + "Please make sure that there is at least one Storage Domain in applicable status for each one of the disks :\n" + + "${disksInfo}") + String ACTION_TYPE_FAILED_NO_VALID_DOMAINS_STATUS_FOR_TEMPLATE_DISKS(); + @DefaultStringValue("Cannot ${action} ${type}. VM ${VmName} is being imported.") String ACTION_TYPE_FAILED_VM_IS_BEING_IMPORTED(); 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 e6ddb1b..59488d5 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 @@ -624,6 +624,9 @@ ACTION_TYPE_FAILED_DISK_IS_BEING_MIGRATED=Cannot ${action} ${type}. Disk ${DiskName} is being moved or copied. ACTION_TYPE_FAILED_DESTINATION_AND_SOURCE_STORAGE_SUB_TYPES_DIFFERENT=Cannot ${action} ${type}. Source and target domains must both be either file domains or block domains. ACTION_TYPE_FAILED_TEMPLATE_IS_BEING_EXPORTED=Cannot ${action} ${type}. Template ${TemplateName} is being exported. +ACTION_TYPE_FAILED_NO_VALID_DOMAINS_STATUS_FOR_TEMPLATE_DISKS=Cannot ${action} ${type}. Can't find Domain(s) in ${applicableStatus} status for some of the Template disks.\n\ +Please make sure that there is at least one Storage Domain in applicable status for each one of the disks :\n\ +${disksInfo} ACTION_TYPE_FAILED_VM_IS_BEING_IMPORTED=Cannot ${action} ${type}. VM ${VmName} is being imported. ACTION_TYPE_FAILED_VM_IS_BEING_MIGRATED=Cannot ${action} ${type}. VM ${VmName} is being migrated. ACTION_TYPE_FAILED_TEMPLATE_IS_BEING_REMOVED=Cannot ${action} ${type}. Template ${TemplateName} is being removed. 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 8cdb6f3..f8c7d04 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 @@ -645,6 +645,9 @@ ACTION_TYPE_FAILED_DISK_IS_BEING_MIGRATED=Cannot ${action} ${type}. Disk ${DiskName} is being moved or copied. ACTION_TYPE_FAILED_DESTINATION_AND_SOURCE_STORAGE_SUB_TYPES_DIFFERENT=Cannot ${action} ${type}. Source and target domains must both be either file domains or block domains. ACTION_TYPE_FAILED_TEMPLATE_IS_BEING_EXPORTED=Cannot ${action} ${type}. Template ${TemplateName} is being exported. +ACTION_TYPE_FAILED_NO_VALID_DOMAINS_STATUS_FOR_TEMPLATE_DISKS=Cannot ${action} ${type}. Can't find Domain(s) in ${applicableStatus} status for some of the Template disks.\n\ +Please make sure that there is at least one Storage Domain in applicable status for each one of the disks :\n\ +${disksInfo} ACTION_TYPE_FAILED_VM_IS_BEING_IMPORTED=Cannot ${action} ${type}. VM ${VmName} is being imported. ACTION_TYPE_FAILED_VM_IS_BEING_MIGRATED=Cannot ${action} ${type}. VM ${VmName} is being migrated. ACTION_TYPE_FAILED_TEMPLATE_IS_BEING_REMOVED=Cannot ${action} ${type}. Template ${TemplateName} is being removed. -- To view, visit http://gerrit.ovirt.org/27111 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I8d02cfded41a3588dc944d9dfcd5a3eec88c45ab Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: ovirt-engine-3.4 Gerrit-Owner: Liron Ar <[email protected]> _______________________________________________ Engine-patches mailing list [email protected] http://lists.ovirt.org/mailman/listinfo/engine-patches
