package org.ovirt.engine.ui.uicommon.models.storage;
import java.util.Collections;
import org.ovirt.engine.core.compat.*;
import org.ovirt.engine.ui.uicompat.*;
import org.ovirt.engine.core.common.businessentities.*;
import org.ovirt.engine.core.common.vdscommands.*;
import org.ovirt.engine.core.common.queries.*;
import org.ovirt.engine.core.common.action.*;
import org.ovirt.engine.ui.frontend.*;
import org.ovirt.engine.ui.uicommon.*;
import org.ovirt.engine.ui.uicommon.models.*;
import org.ovirt.engine.core.common.*;
import org.ovirt.engine.ui.uicommon.models.vms.*;
import org.ovirt.engine.ui.uicompat.*;
import org.ovirt.engine.core.common.queries.*;
import org.ovirt.engine.core.common.businessentities.*;
import org.ovirt.engine.ui.uicommon.*;
import org.ovirt.engine.ui.uicommon.models.*;
@SuppressWarnings("unused")
public class VmBackupModel extends ManageBackupModel implements ITaskTarget
{
public VM getSelectedItem()
{
return (VM)super.getSelectedItem();
}
public void setSelectedItem(VM value)
{
super.setSelectedItem(value);
}
private VmAppListModel privateAppListModel;
public VmAppListModel getAppListModel()
{
return privateAppListModel;
}
private void setAppListModel(VmAppListModel value)
{
privateAppListModel = value;
}
public VmBackupModel()
{
setTitle("VM Import");
setAppListModel(new VmAppListModel());
}
@Override
protected void OnSelectedItemChanged()
{
super.OnSelectedItemChanged();
getAppListModel().setEntity(getSelectedItem());
}
@Override
protected void remove()
{
super.remove();
if (getWindow() != null)
{
return;
}
ConfirmationModel model = new ConfirmationModel();
setWindow(model);
model.setTitle("Remove Backed up VM(s)");
model.setHashName("remove_backed_up_vm");
model.setMessage("VM(s)");
java.util.ArrayList<String> items = new java.util.ArrayList<String>();
for (Object item : getSelectedItems())
{
VM vm = (VM)item;
items.add(vm.getvm_name());
}
model.setItems(items);
model.setNote("Note: The deleted items might still appear on the sub-tab, since the remove operation might be long. Use the Refresh button, to get the updated status.");
UICommand tempVar = new UICommand("OnRemove", this);
tempVar.setTitle("OK");
tempVar.setIsDefault(true);
model.getCommands().add(tempVar);
UICommand tempVar2 = new UICommand("Cancel", this);
tempVar2.setTitle("Cancel");
tempVar2.setIsCancel(true);
model.getCommands().add(tempVar2);
}
public void OnRemove()
{
ConfirmationModel model = (ConfirmationModel)getWindow();
if (model.getProgress() != null)
{
return;
}
storage_pool pool = DataProvider.GetFirstStoragePoolByStorageDomain(getEntity().getid());
java.util.ArrayList<VdcActionParametersBase> list = new java.util.ArrayList<VdcActionParametersBase>();
for (Object item : getSelectedItems())
{
VM vm = (VM)item;
list.add(new RemoveVmFromImportExportParamenters(vm, getEntity().getid(), pool.getId()));
}
model.StartProgress(null);
Frontend.RunMultipleAction(VdcActionType.RemoveVmFromImportExport, list,
new IFrontendMultipleActionAsyncCallback() {
@Override
public void Executed(FrontendMultipleActionAsyncResult result) {
ConfirmationModel localModel = (ConfirmationModel)result.getState();
localModel.StopProgress();
Cancel();
OnEntityChanged();
}
}, model);
}
@Override
protected void Restore()
{
super.Restore();
if (getWindow() != null)
{
return;
}
ImportVmModel model = new ImportVmModel();
setWindow(model);
model.setTitle("Import Virtual Machine(s)");
model.setHashName("import_virtual_machine");
java.util.ArrayList<VDSGroup> clusters = DataProvider.GetClusterListByStorageDomain(getEntity().getid());
model.getCluster().setItems(clusters);
model.getCluster().setSelectedItem(Linq.FirstOrDefault(clusters));
model.setSourceStorage(getEntity().getStorageStaticData());
model.setStoragePool(DataProvider.GetFirstStoragePoolByStorageDomain(getEntity().getStorageStaticData().getId()));
model.setItems(getSelectedItems());
model.CollapseSnapshots_EntityChanged();
if (((java.util.List)model.getDestinationStorage().getItems()).size() == 0)
{
model.getDestinationStorage().setIsChangable(false);
model.getDestinationStorage().getChangeProhibitionReasons().add("Cannot import Virtual Machine.");
model.setMessage("There is no target Data Storage Domain that contains all the Templates which the selected VMs are based on." + "\r\n" + "Suggested solutions:" + "\r\n" + "1. Preserving Template-Based structure:" + "\r\n" + " a. Make sure the relevant Templates (on which the VMs are based) exist on the relevant Data-Center." + "\r\n" + " b. Import the VMs one by one" + "\r\n" + "2. Using non-Template-Based structure (less optimal storage-wise):" + "\r\n" + " a. Export the VMs again using the Collapse Snapshots option" + "\r\n" + " b. Import the VMs.");
UICommand tempVar = new UICommand("Cancel", this);
tempVar.setTitle("Close");
tempVar.setIsDefault(true);
tempVar.setIsCancel(true);
model.getCommands().add(tempVar);
}
else
{
UICommand tempVar2 = new UICommand("OnRestore", this);
tempVar2.setTitle("OK");
tempVar2.setIsDefault(true);
model.getCommands().add(tempVar2);
UICommand tempVar3 = new UICommand("Cancel", this);
tempVar3.setTitle("Cancel");
tempVar3.setIsCancel(true);
model.getCommands().add(tempVar3);
}
}
public void OnRestore()
{
ImportVmModel model = (ImportVmModel)getWindow();
if (model.getProgress() != null)
{
return;
}
if (!model.Validate())
{
return;
}
java.util.ArrayList<VdcActionParametersBase> parameters = new java.util.ArrayList<VdcActionParametersBase>();
for (Object item : getSelectedItems())
{
VM vm = (VM)item;
boolean collapseSnapshots = (Boolean)model.getCollapseSnapshots().getEntity();
//If no collapse snapshots specified drop problematic VMs.
if (!collapseSnapshots && model.getProblematicItems() != null)
{
if (Linq.FirstOrDefault(model.getProblematicItems(), new Linq.VmPredicate(vm.getvm_guid())) != null)
{
continue;
}
}
VDSGroup cluster = (VDSGroup)model.getCluster().getSelectedItem();
storage_domains destinationStorage = (storage_domains)model.getDestinationStorage().getSelectedItem();
java.util.HashMap<String, DiskImageBase> disks = new java.util.HashMap<String, DiskImageBase>();
for (java.util.Map.Entry<String, DiskImage> a : vm.getDiskMap().entrySet())
{
DiskImage disk = a.getValue();
//Assign a right volume format for each disk.
disk.setvolume_format(DataProvider.GetDiskVolumeFormat(disk.getvolume_type(), destinationStorage.getstorage_type()));
disks.put(a.getKey(), a.getValue());
}
ImportVmParameters tempVar = new ImportVmParameters(vm, model.getSourceStorage().getId(), destinationStorage.getid(), model.getStoragePool().getId(), cluster.getID());
tempVar.setForceOverride(true);
tempVar.setCopyCollapse(collapseSnapshots);
tempVar.setDiskInfoList(disks);
ImportVmParameters parameter = tempVar;
parameters.add(parameter);
}
model.StartProgress(null);
Frontend.RunMultipleAction(VdcActionType.ImportVm, parameters,
new IFrontendMultipleActionAsyncCallback() {
@Override
public void Executed(FrontendMultipleActionAsyncResult result) {
VmBackupModel vmBackupModel = (VmBackupModel)result.getState();
vmBackupModel.getWindow().StopProgress();
vmBackupModel.Cancel();
java.util.ArrayList<VdcReturnValueBase> retVals = (java.util.ArrayList<VdcReturnValueBase>)result.getReturnValue();
if (retVals != null && vmBackupModel.getSelectedItems().size() > retVals.size())
{
ConfirmationModel confirmModel = new ConfirmationModel();
vmBackupModel.setConfirmWindow(confirmModel);
confirmModel.setTitle("Import Virtual Machine(s)");
confirmModel.setHashName("import_virtual_machine");
String importedVms = "";
int i = 0;
for (Object item : vmBackupModel.getSelectedItems())
{
VM vm = (VM)item;
if (Linq.FindVdcReturnValueByDescription(retVals, vm.getvm_name()) == null)
{
importedVms += vm.getvm_name() + (++i != vmBackupModel.getSelectedItems().size() ? ", " : "");
}
}
StringHelper.trimEnd(importedVms.trim(), ',');
confirmModel.setMessage(StringFormat.format("Import process has begun for VM(s): %1$s.\nYou can check import status in the 'Events' tab of the specific destination storage domain, or in the main 'Events' tab", importedVms));
UICommand tempVar2 = new UICommand("CancelConfirm", vmBackupModel);
tempVar2.setTitle("Close");
tempVar2.setIsDefault(true);
tempVar2.setIsCancel(true);
confirmModel.getCommands().add(tempVar2);
}
}
}, this);
}
@Override
protected void EntityPropertyChanged(Object sender, PropertyChangedEventArgs e)
{
super.EntityPropertyChanged(sender, e);
if (e.PropertyName.equals("storage_domain_shared_status"))
{
getSearchCommand().Execute();
}
}
@Override
protected void SyncSearch()
{
super.SyncSearch();
if (getEntity() == null || getEntity().getstorage_domain_type() != StorageDomainType.ImportExport || getEntity().getstorage_domain_shared_status() != StorageDomainSharedStatus.Active)
{
setItems(null);
setIsRefreshing(false);
}
else
{
setIsRefreshing(true);
Task.Create(this, 1).Run();
}
}
@Override
protected void AsyncSearch()
{
super.AsyncSearch();
SyncSearch();
}
@Override
public void ExecuteCommand(UICommand command)
{
super.ExecuteCommand(command);
if (StringHelper.stringsEqual(command.getName(), "OnRemove"))
{
OnRemove();
}
else if (StringHelper.stringsEqual(command.getName(), "OnRestore"))
{
OnRestore();
}
}
private VdcQueryReturnValue returnValue;
private Guid storageDomainId = Guid.Empty;
public void run(TaskContext context)
{
if (getEntity() != null)
{
switch ((Integer)context.getState())
{
case 1:
storageDomainId = getEntity().getid();
storage_pool pool = DataProvider.GetFirstStoragePoolByStorageDomain(storageDomainId);
GetAllFromExportDomainQueryParamenters tempVar = new GetAllFromExportDomainQueryParamenters(pool.getId(), storageDomainId);
tempVar.setGetAll(true);
returnValue = Frontend.RunQuery(VdcQueryType.GetVmsFromExportDomain, tempVar);
context.InvokeUIThread(this, 2);
break;
case 2:
if (storageDomainId.equals(getEntity().getid()))
{
if (returnValue != null && returnValue.getSucceeded())
{
setItems((java.util.ArrayList<VM>)returnValue.getReturnValue());
}
else
{
setItems(null);
}
setIsRefreshing(false);
}
returnValue = null;
storageDomainId = Guid.Empty;
break;
}
}
}
}