package org.ovirt.engine.core.bll.storage.disk;
import java.util.HashSet;
import java.util.Set;
import javax.inject.Inject;
import org.ovirt.engine.core.bll.QueriesCommandBase;
import org.ovirt.engine.core.bll.VmHandler;
import org.ovirt.engine.core.bll.storage.disk.image.ImagesHandler;
import org.ovirt.engine.core.common.businessentities.VM;
import org.ovirt.engine.core.common.businessentities.storage.Disk;
import org.ovirt.engine.core.common.queries.IdQueryParameters;
import org.ovirt.engine.core.dao.VmDao;
public class GetNextAvailableDiskAliasNameByVMIdQuery<P extends IdQueryParameters> extends QueriesCommandBase<P> {
@Inject
private VmDao vmDao;
@Inject
private VmHandler vmHandler;
public GetNextAvailableDiskAliasNameByVMIdQuery(P parameters) {
super(parameters);
}
@Override
protected void executeQueryCommand() {
String suggestedDiskName = null;
if (getParameters().getId() == null) {
getQueryReturnValue().setReturnValue(suggestedDiskName);
} else {
VM vm = vmDao.get(getParameters().getId(), getUserID(), getParameters().isFiltered());
if (vm != null) {
updateDisksFromDb(vm);
suggestedDiskName = getSuggestedDiskName(vm);
}
getQueryReturnValue().setReturnValue(suggestedDiskName);
}
}
protected void updateDisksFromDb(VM vm) {
vmHandler.updateDisksFromDb(vm);
}
private String getSuggestedDiskName(VM vm) {
Set<String> aliases = createDiskAliasesList(vm);
String suggestedDiskName;
int i = 0;
do {
i++;
suggestedDiskName = ImagesHandler.getDefaultDiskAlias(vm.getName(), Integer.toString(i));
} while (aliases.contains(suggestedDiskName));
return suggestedDiskName;
}
private Set<String> createDiskAliasesList(VM vm) {
Set<String> diskAliases = new HashSet<>(vm.getDiskMap().size());
for (Disk disk : vm.getDiskMap().values()) {
diskAliases.add(disk.getDiskAlias());
}
return diskAliases;
}
}