package org.ovirt.engine.ui.uicommonweb.models.vms;
import org.ovirt.engine.core.common.action.CloneVmParameters;
import org.ovirt.engine.core.common.action.VdcActionType;
import org.ovirt.engine.core.common.businessentities.VM;
import org.ovirt.engine.core.common.businessentities.storage.DiskStorageType;
import org.ovirt.engine.ui.frontend.Frontend;
import org.ovirt.engine.ui.uicommonweb.dataprovider.AsyncDataProvider;
import org.ovirt.engine.ui.uicommonweb.models.EntityModel;
import org.ovirt.engine.ui.uicommonweb.models.Model;
import org.ovirt.engine.ui.uicommonweb.validation.I18NNameValidation;
import org.ovirt.engine.ui.uicommonweb.validation.IValidation;
import org.ovirt.engine.ui.uicommonweb.validation.LengthValidation;
import org.ovirt.engine.ui.uicommonweb.validation.NotEmptyValidation;
import org.ovirt.engine.ui.uicompat.ConstantsManager;
import org.ovirt.engine.ui.uicompat.UIConstants;
public class CloneVmModel extends Model {
private VM vm;
private EntityModel<String> cloneName;
private UIConstants uiConstants;
public CloneVmModel(VM vm, UIConstants uiConstants) {
this.vm = vm;
this.uiConstants = uiConstants;
cloneName = new EntityModel<>();
}
@Override
public void initialize() {
AsyncDataProvider.getInstance().getVmDiskList(new AsyncQuery<>(disks -> {
if (disks.stream().anyMatch(d -> d.getDiskStorageType() == DiskStorageType.LUN)) {
setMessage(ConstantsManager.getInstance().getConstants().cloneVmLunsWontBeCloned());
}
}), vm.getId());
}
public EntityModel<String> getCloneName() {
return cloneName;
}
public void setCloneName(EntityModel<String> cloneName) {
this.cloneName = cloneName;
}
public VM getVm() {
return vm;
}
public void onClone(final Model targetModel, final boolean makeCreatorExplicitOwner) {
if (!validate()) {
return;
}
startProgress();
AsyncDataProvider.getInstance().isVmNameUnique(new AsyncQuery<>(returnValue -> {
if (returnValue) {
postCloneVmNameUnique(targetModel, makeCreatorExplicitOwner);
} else {
stopProgress();
getCloneName()
.getInvalidityReasons()
.add(uiConstants.nameMustBeUniqueInvalidReason());
getCloneName().setIsValid(false);
}
}), getCloneName().getEntity(), getVm() == null ? null : getVm().getStoragePoolId());
}
private void postCloneVmNameUnique(final Model targetModel, boolean makeCreatorExplicitOwner) {
CloneVmParameters params = new CloneVmParameters(
getVm(),
getCloneName().getEntity());
params.setMakeCreatorExplicitOwner(makeCreatorExplicitOwner);
Frontend.getInstance().runAction(VdcActionType.CloneVm, params,
result -> {
stopProgress();
targetModel.setWindow(null);
}, this);
}
public boolean validate() {
getCloneName().validateEntity(
new IValidation[]{
new NotEmptyValidation(),
new LengthValidation(AsyncDataProvider.getInstance().getMaxVmNameLength()),
new I18NNameValidation()
});
return getCloneName().getIsValid();
}
}