package org.ovirt.engine.core.bll.profiles;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
import org.ovirt.engine.core.bll.ValidationResult;
import org.ovirt.engine.core.bll.validator.storage.StorageDomainValidator;
import org.ovirt.engine.core.common.businessentities.StorageDomain;
import org.ovirt.engine.core.common.businessentities.VM;
import org.ovirt.engine.core.common.businessentities.VmTemplate;
import org.ovirt.engine.core.common.businessentities.profiles.DiskProfile;
import org.ovirt.engine.core.common.businessentities.storage.DiskImage;
import org.ovirt.engine.core.common.errors.EngineMessage;
import org.ovirt.engine.core.compat.Guid;
import org.ovirt.engine.core.dao.profiles.DiskProfileDao;
import org.ovirt.engine.core.utils.ReplacementUtils;
public class DiskProfileValidator extends ProfileValidator<DiskProfile> {
private StorageDomain storageDomain;
public DiskProfileValidator(DiskProfile profile) {
super(profile);
}
public DiskProfileValidator(Guid profileId) {
super(profileId);
}
@Override
public ValidationResult parentEntityExists() {
return new StorageDomainValidator(getStorageDomain()).isDomainExist();
}
@Override
public ValidationResult parentEntityNotChanged() {
if (Objects.equals(getProfile().getStorageDomainId(), getProfileFromDb().getStorageDomainId())) {
return ValidationResult.VALID;
}
return new ValidationResult(EngineMessage.ACTION_TYPE_FAILED_CANNOT_CHANGE_PROFILE);
}
protected StorageDomain getStorageDomain() {
if (storageDomain == null) {
storageDomain = getStorageDomain(getProfile().getStorageDomainId());
}
return storageDomain;
}
protected StorageDomain getStorageDomain(Guid sdGuid) {
if (sdGuid != null) {
return getDbFacade().getStorageDomainDao().get(sdGuid);
}
return null;
}
public ValidationResult isParentEntityValid(Guid storageDomainId) {
if (storageDomainId == null) {
return new ValidationResult(EngineMessage.ACTION_TYPE_DISK_PROFILE_STORAGE_DOMAIN_NOT_PROVIDED);
}
Guid id = getProfile().getId();
if (id == null) {
return new ValidationResult(EngineMessage.ACTION_TYPE_DISK_PROFILE_EMPTY);
}
DiskProfile fetchedDiskProfile = getProfileDao().get(id);
if (fetchedDiskProfile == null) {
return new ValidationResult(EngineMessage.ACTION_TYPE_FAILED_DISK_PROFILE_NOT_FOUND);
}
if (!storageDomainId.equals(fetchedDiskProfile.getStorageDomainId())) {
String diskProfileName = fetchedDiskProfile.getName();
StorageDomain targetStorageDomain = getStorageDomain(storageDomainId);
String targetStorageDomainName = targetStorageDomain != null ? getStorageDomain(storageDomainId).getName() : "Unknown";
return new ValidationResult(EngineMessage.ACTION_TYPE_DISK_PROFILE_NOT_MATCH_STORAGE_DOMAIN,
String.format("$diskProfile %s", diskProfileName),
String.format("$diskProfileId %s", fetchedDiskProfile.getId().toString()),
String.format("$storageDomain %s", targetStorageDomainName));
}
return ValidationResult.VALID;
}
@Override
public ValidationResult isLastProfileInParentEntity() {
if (getProfileDao().getAllForStorageDomain(getProfile().getStorageDomainId()).size() == 1) {
return new ValidationResult(EngineMessage.ACTION_TYPE_CANNOT_REMOVE_LAST_DISK_PROFILE_IN_STORAGE_DOMAIN);
}
return ValidationResult.VALID;
}
@Override
public ValidationResult profileNotUsed() {
ValidationResult validationResult = super.profileNotUsed();
if (!validationResult.isValid()) {
return validationResult;
}
return validateUnattachedDisks();
}
private ValidationResult validateUnattachedDisks() {
List<DiskImage> entities = getDbFacade().getDiskImageDao().getAllForDiskProfiles(Collections.singletonList(getProfile().getId()));
if (entities.isEmpty()) {
return ValidationResult.VALID;
}
List<Object> nameList = new ArrayList<>();
for (DiskImage diskImage : entities) {
nameList.add(diskImage.getDiskAlias());
}
Collection<String> replacements = ReplacementUtils.replaceWith("ENTITIES_USING_PROFILE", nameList);
replacements.add(EngineMessage.VAR__ENTITIES__DISKS.name());
return new ValidationResult(EngineMessage.ACTION_TYPE_FAILED_PROFILE_IN_USE, replacements);
}
@Override
protected DiskProfileDao getProfileDao() {
return getDbFacade().getDiskProfileDao();
}
@Override
protected List<DiskProfile> getProfilesByParentEntity() {
return getDbFacade().getDiskProfileDao().getAllForStorageDomain(getStorageDomain().getId());
}
@Override
protected List<VmTemplate> getTemplatesUsingProfile() {
return getDbFacade().getVmTemplateDao().getAllForDiskProfile(getProfile().getId());
}
@Override
protected List<VM> getVmsUsingProfile() {
return getDbFacade().getVmDao().getAllForDiskProfiles(Collections.singletonList(getProfile().getId()));
}
}