package org.ovirt.engine.ui.uicommonweb.models.templates;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.ovirt.engine.core.common.VdcActionUtils;
import org.ovirt.engine.core.common.action.MoveOrCopyParameters;
import org.ovirt.engine.core.common.action.UpdateVmTemplateParameters;
import org.ovirt.engine.core.common.action.VdcActionParametersBase;
import org.ovirt.engine.core.common.action.VdcActionType;
import org.ovirt.engine.core.common.action.VdcReturnValueBase;
import org.ovirt.engine.core.common.action.VmTemplateManagementParameters;
import org.ovirt.engine.core.common.businessentities.DisplayType;
import org.ovirt.engine.core.common.businessentities.StoragePool;
import org.ovirt.engine.core.common.businessentities.VM;
import org.ovirt.engine.core.common.businessentities.VmTemplate;
import org.ovirt.engine.core.common.businessentities.VmTemplateStatus;
import org.ovirt.engine.core.common.businessentities.VmType;
import org.ovirt.engine.core.common.businessentities.VmWatchdog;
import org.ovirt.engine.core.common.businessentities.VmWatchdogType;
import org.ovirt.engine.core.common.interfaces.SearchType;
import org.ovirt.engine.core.common.mode.ApplicationMode;
import org.ovirt.engine.core.common.queries.SearchParameters;
import org.ovirt.engine.core.common.queries.VdcQueryType;
import org.ovirt.engine.core.compat.Guid;
import org.ovirt.engine.core.searchbackend.SearchObjects;
import org.ovirt.engine.ui.frontend.Frontend;
import org.ovirt.engine.ui.uicommonweb.Cloner;
import org.ovirt.engine.ui.uicommonweb.IconUtils;
import org.ovirt.engine.ui.uicommonweb.UICommand;
import org.ovirt.engine.ui.uicommonweb.builders.BuilderExecutor;
import org.ovirt.engine.ui.uicommonweb.builders.template.VersionNameUnitToVmBaseBuilder;
import org.ovirt.engine.ui.uicommonweb.builders.vm.FullUnitToVmBaseBuilder;
import org.ovirt.engine.ui.uicommonweb.builders.vm.UnitToGraphicsDeviceParamsBuilder;
import org.ovirt.engine.ui.uicommonweb.dataprovider.AsyncDataProvider;
import org.ovirt.engine.ui.uicommonweb.help.HelpTag;
import org.ovirt.engine.ui.uicommonweb.models.ConfirmationModel;
import org.ovirt.engine.ui.uicommonweb.models.HasEntity;
import org.ovirt.engine.ui.uicommonweb.models.ISupportSystemTreeContext;
import org.ovirt.engine.ui.uicommonweb.models.SystemTreeItemModel;
import org.ovirt.engine.ui.uicommonweb.models.TabName;
import org.ovirt.engine.ui.uicommonweb.models.configure.PermissionListModel;
import org.ovirt.engine.ui.uicommonweb.models.vms.ExportVmModel;
import org.ovirt.engine.ui.uicommonweb.models.vms.IconCache;
import org.ovirt.engine.ui.uicommonweb.models.vms.NewVmFromTemplateModelBehavior;
import org.ovirt.engine.ui.uicommonweb.models.vms.TemplateVmModelBehavior;
import org.ovirt.engine.ui.uicommonweb.models.vms.UnitVmModel;
import org.ovirt.engine.ui.uicommonweb.models.vms.VmBasedWidgetSwitchModeCommand;
import org.ovirt.engine.ui.uicommonweb.models.vms.VmModelBehaviorBase;
import org.ovirt.engine.ui.uicommonweb.place.WebAdminApplicationPlaces;
import org.ovirt.engine.ui.uicompat.ConstantsManager;
import org.ovirt.engine.ui.uicompat.PropertyChangedEventArgs;
import com.google.inject.Inject;
public class TemplateListModel extends VmBaseListModel<Void, VmTemplate> implements ISupportSystemTreeContext {
private UICommand privateEditCommand;
@Override
public UICommand getEditCommand() {
return privateEditCommand;
}
private void setEditCommand(UICommand value) {
privateEditCommand = value;
}
private UICommand privateRemoveCommand;
public UICommand getRemoveCommand() {
return privateRemoveCommand;
}
private void setRemoveCommand(UICommand value) {
privateRemoveCommand = value;
}
private UICommand privateExportCommand;
public UICommand getExportCommand() {
return privateExportCommand;
}
private void setExportCommand(UICommand value) {
privateExportCommand = value;
}
private UICommand privateCreateVmfromTemplateCommand;
public UICommand getCreateVmFromTemplateCommand() {
return privateCreateVmfromTemplateCommand;
}
private void setCreateVmFromTemplateCommand(UICommand value) {
privateCreateVmfromTemplateCommand = value;
}
private SystemTreeItemModel systemTreeSelectedItem;
@Override
public SystemTreeItemModel getSystemTreeSelectedItem() {
return systemTreeSelectedItem;
}
@Override
public void setSystemTreeSelectedItem(SystemTreeItemModel value) {
if (systemTreeSelectedItem != value) {
systemTreeSelectedItem = value;
}
}
@Inject
public TemplateListModel(final TemplateGeneralModel templateGeneralModel,
final TemplateVmListModel templateVmListModel, final TemplateInterfaceListModel templateInterfaceListModel,
final TemplateStorageListModel templateStorageListModel,
final TemplateDiskListModel templateDiskListModel, final TemplateEventListModel templateEventListModel,
final PermissionListModel<VmTemplate> permissionListModel) {
this(templateGeneralModel, templateVmListModel, templateInterfaceListModel, templateStorageListModel,
templateDiskListModel, templateEventListModel, permissionListModel, 3);
}
public TemplateListModel(final TemplateGeneralModel templateGeneralModel,
final TemplateVmListModel templateVmListModel, final TemplateInterfaceListModel templateInterfaceListModel,
final TemplateStorageListModel templateStorageListModel,
final TemplateDiskListModel templateDiskListModel, final TemplateEventListModel templateEventListModel,
final PermissionListModel<VmTemplate> permissionListModel, int customPosition) {
List<HasEntity<VmTemplate>> list = new ArrayList<>();
setDetailList(list, templateGeneralModel, templateVmListModel, templateInterfaceListModel,
templateStorageListModel);
addCustomModelsDetailModelList(list, customPosition, templateDiskListModel, templateEventListModel, permissionListModel);
setDetailModels(list);
setTitle(ConstantsManager.getInstance().getConstants().templatesTitle());
setApplicationPlace(WebAdminApplicationPlaces.templateMainTabPlace);
setDefaultSearchString("Template:"); //$NON-NLS-1$
setSearchString(getDefaultSearchString());
setSearchObjects(new String[] { SearchObjects.TEMPLATE_OBJ_NAME, SearchObjects.TEMPLATE_PLU_OBJ_NAME });
setAvailableInModes(ApplicationMode.VirtOnly);
setEditCommand(new UICommand("Edit", this)); //$NON-NLS-1$
setRemoveCommand(new UICommand("Remove", this)); //$NON-NLS-1$
setExportCommand(new UICommand("Export", this)); //$NON-NLS-1$
setCreateVmFromTemplateCommand(new UICommand("CreateVM", this)); //$NON-NLS-1$
updateActionsAvailability();
getSearchNextPageCommand().setIsAvailable(true);
getSearchPreviousPageCommand().setIsAvailable(true);
}
private void setDetailList(final List<HasEntity<VmTemplate>> list, final TemplateGeneralModel templateGeneralModel,
final TemplateVmListModel templateVmListModel, final TemplateInterfaceListModel templateInterfaceListModel,
final TemplateStorageListModel templateStorageListModel) {
list.add(templateGeneralModel);
list.add(templateVmListModel);
list.add(templateInterfaceListModel);
list.add(templateStorageListModel);
}
@Override
protected void setupExportModel(ExportVmModel model) {
super.setupExportModel(model);
model.setTitle(ConstantsManager.getInstance().getConstants().exportTemplateTitle());
model.setHelpTag(HelpTag.export_template);
model.setHashName("export_template"); //$NON-NLS-1$
model.getCollapseSnapshots().setIsAvailable(false);
}
@Override
protected String thereIsNoExportDomainBackupEntityAttachExportDomainToVmsDcMsg() {
return ConstantsManager.getInstance()
.getConstants()
.thereIsNoExportDomainToExportTheTemplateIntoMsg();
}
@Override
protected String entityResideOnSeveralDCsMakeSureTheExportedVMResideOnSameDcMsg() {
return ConstantsManager.getInstance()
.getConstants()
.templatesResideOnSeveralDcsMakeSureExportedTemplatesResideOnSameDcMsg();
}
@Override
protected VdcQueryType getEntityExportDomain() {
return VdcQueryType.GetTemplatesFromExportDomain;
}
@Override
protected Guid extractStoragePoolIdNullSafe(VmTemplate entity) {
return entity.getStoragePoolId();
}
@Override
protected boolean entitiesSelectedOnDifferentDataCenters() {
List<VmTemplate> templates = getSelectedItems();
Map<Guid, ArrayList<VmTemplate>> t = new HashMap<>();
for (VmTemplate a : templates) {
if (!a.getId().equals(Guid.Empty)) {
if (!t.containsKey(a.getStoragePoolId())) {
t.put(a.getStoragePoolId(), new ArrayList<VmTemplate>());
}
ArrayList<VmTemplate> list = t.get(a.getStoragePoolId());
list.add(a);
}
}
return t.size() > 1 ? true : false;
}
@Override
protected String composeEntityOnStorage(String entities) {
return ConstantsManager.getInstance()
.getMessages()
.templatesAlreadyExistonTargetExportDomain(entities);
}
@Override
protected boolean entititesEqualsNullSafe(VmTemplate e1, VmTemplate e2) {
return e1.getId().equals(e2.getId());
}
@Override
protected Iterable<VmTemplate> asIterableReturnValue(Object returnValue) {
return ((Map<VmTemplate, ?>) returnValue).keySet();
}
private void onExport() {
ExportVmModel model = (ExportVmModel) getWindow();
if (model.getProgress() != null) {
return;
}
if (!model.validate()) {
return;
}
model.startProgress();
getTemplatesNotPresentOnExportDomain();
}
private void getTemplatesNotPresentOnExportDomain() {
ExportVmModel model = (ExportVmModel) getWindow();
Guid storageDomainId = model.getStorage().getSelectedItem().getId();
AsyncDataProvider.getInstance().getDataCentersByStorageDomain(new AsyncQuery<>(
storagePools -> {
StoragePool storagePool = storagePools.size() > 0 ? storagePools.get(0) : null;
postGetTemplatesNotPresentOnExportDomain(storagePool);
}), storageDomainId);
}
private void postGetTemplatesNotPresentOnExportDomain(StoragePool storagePool) {
ExportVmModel model = (ExportVmModel) getWindow();
Guid storageDomainId = model.getStorage().getSelectedItem().getId();
if (storagePool != null) {
AsyncDataProvider.getInstance().getAllTemplatesFromExportDomain(new AsyncQuery<>(
templatesDiskSet -> {
ArrayList<String> verTempMissingBase = new ArrayList<>();
// check if relevant templates are already there
for (Object selectedItem : getSelectedItems()) {
VmTemplate template = (VmTemplate) selectedItem;
// only relevant for template versions
if (!template.isBaseTemplate()) {
boolean hasMatch = false;
for (VmTemplate a : templatesDiskSet.keySet()) {
if (template.getBaseTemplateId().equals(a.getId())) {
hasMatch = true;
break;
}
}
if (!template.getBaseTemplateId().equals(Guid.Empty) && !hasMatch) {
verTempMissingBase.add(template.getName());
}
}
}
postExportGetMissingTemplates(verTempMissingBase);
}),
storagePool.getId(),
storageDomainId);
}
}
private void postExportGetMissingTemplates(ArrayList<String> missingTemplatesFromVms) {
ExportVmModel model = (ExportVmModel) getWindow();
if (!missingTemplatesFromVms.isEmpty()) {
model.stopProgress();
ConfirmationModel confirmModel = new ConfirmationModel();
setConfirmWindow(confirmModel);
confirmModel.setTitle(ConstantsManager.getInstance()
.getConstants()
.baseTemplatesNotFoundOnExportDomainTitle());
confirmModel.setHelpTag(HelpTag.base_template_not_found_on_export_domain);
confirmModel.setHashName("base_template_not_found_on_export_domain"); //$NON-NLS-1$
confirmModel.setMessage(ConstantsManager.getInstance()
.getConstants()
.theFollowingTemplatesAreMissingOnTargetExportDomainForTemplateVersionsMsg());
confirmModel.setItems(missingTemplatesFromVms);
UICommand tempVar = UICommand.createDefaultOkUiCommand("OnExportNoTemplates", this); //$NON-NLS-1$
confirmModel.getCommands().add(tempVar);
UICommand tempVar2 = UICommand.createCancelUiCommand("CancelConfirmation", this); //$NON-NLS-1$
confirmModel.getCommands().add(tempVar2);
}
else {
doExport();
}
}
private void doExport() {
ExportVmModel model = (ExportVmModel) getWindow();
ArrayList<VdcActionParametersBase> list = new ArrayList<>();
for (Object item : getSelectedItems()) {
VmTemplate a = (VmTemplate) item;
if (a.getId().equals(Guid.Empty)) {
continue;
}
MoveOrCopyParameters tempVar =
new MoveOrCopyParameters(a.getId(),
model.getStorage().getSelectedItem().getId());
tempVar.setForceOverride(model.getForceOverride().getEntity());
list.add(tempVar);
}
model.startProgress();
Frontend.getInstance().runMultipleAction(VdcActionType.ExportVmTemplate, list,
result -> {
ExportVmModel localModel = (ExportVmModel) result.getState();
localModel.stopProgress();
cancel();
}, model);
}
protected void addCustomModelsDetailModelList(final List<HasEntity<VmTemplate>> list, int customPosition,
final TemplateDiskListModel templateDiskListModel, final TemplateEventListModel templateEventListModel,
final PermissionListModel<VmTemplate> permissionListModel) {
templateDiskListModel.setSystemTreeContext(this);
list.add(customPosition, templateDiskListModel);
list.add(templateEventListModel);
list.add(permissionListModel);
}
@Override
public boolean isSearchStringMatch(String searchString) {
return searchString.trim().toLowerCase().startsWith("template"); //$NON-NLS-1$
}
@Override
protected void syncSearch() {
SearchParameters tempVar = new SearchParameters(applySortOptions(getSearchString()), SearchType.VmTemplate, isCaseSensitiveSearch());
tempVar.setMaxCount(getSearchPageSize());
super.syncSearch(VdcQueryType.Search, tempVar);
}
@Override
public boolean supportsServerSideSorting() {
return true;
}
@Override
public void setItems(Collection value) {
genVersionToBaseTemplate(value);
super.setItems(value);
}
private Map<Guid, String> templateIdToBaseTemplateName;
private void genVersionToBaseTemplate(Iterable<VmTemplate> items) {
if (items == null) {
templateIdToBaseTemplateName = null;
return;
}
Map<Guid, VmTemplate> templateIdToTemplate = new HashMap<>();
for (VmTemplate template : items) {
templateIdToTemplate.put(template.getId(), template);
}
templateIdToBaseTemplateName = new HashMap<>();
for (VmTemplate template : items) {
VmTemplate baseTemplate = templateIdToTemplate.get(template.getBaseTemplateId());
templateIdToBaseTemplateName.put(template.getId(),
baseTemplate != null ? baseTemplate.getName() : ""); //$NON-NLS-1$
}
}
public String resolveBaseTemplateNameForTemplate(Guid templateId) {
if (templateIdToBaseTemplateName == null) {
return ""; //$NON-NLS-1$
}
return templateIdToBaseTemplateName.get(templateId);
}
private void edit() {
VmTemplate template = getSelectedItem();
if (getWindow() != null) {
return;
}
// populating VMInit
AsyncDataProvider.getInstance().getTemplateById(new AsyncQuery<>(result -> vmInitLoaded(result)), template.getId());
}
private void vmInitLoaded(VmTemplate template) {
UnitVmModel model = createModel(createBehavior(template));
model.setIsAdvancedModeLocalStorageKey(getEditTemplateAdvancedModelKey());
setWindow(model);
model.setTitle(ConstantsManager.getInstance().getConstants().editTemplateTitle());
model.setHelpTag(HelpTag.edit_template);
model.setHashName("edit_template"); //$NON-NLS-1$
model.getVmType().setSelectedItem(template.getVmType());
model.setCustomPropertiesKeysList(AsyncDataProvider.getInstance().getCustomPropertiesList());
model.initialize(this.getSystemTreeSelectedItem());
VmBasedWidgetSwitchModeCommand switchModeCommand = new VmBasedWidgetSwitchModeCommand();
switchModeCommand.init(model);
model.getCommands().add(switchModeCommand);
UICommand onSaveCommand = UICommand.createDefaultOkUiCommand("OnSave", this); //$NON-NLS-1$
model.getCommands().add(onSaveCommand);
UICommand cancelCommand = UICommand.createCancelUiCommand("Cancel", this); //$NON-NLS-1$
model.getCommands().add(cancelCommand);
model.getIsHighlyAvailable().setEntity(template.isAutoStartup());
if (template.getDefaultDisplayType() == DisplayType.none) {
model.getIsHeadlessModeEnabled().setEntity(true);
}
}
protected String getEditTemplateAdvancedModelKey() {
return "wa_template_dialog"; //$NON-NLS-1$
}
private UnitVmModel createModel(VmModelBehaviorBase behavior) {
if (behavior.isBlankTemplateBehavior()) {
return new BlankTemplateModel(behavior, this);
}
return new UnitVmModel(behavior, this);
}
protected VmModelBehaviorBase createBehavior(VmTemplate template) {
if (!template.isBlank()) {
return new TemplateVmModelBehavior(template);
}
return new ExistingBlankTemplateModelBehavior(template);
}
private void remove() {
if (getWindow() != null) {
return;
}
ConfirmationModel model = new ConfirmationModel();
setWindow(model);
model.setTitle(ConstantsManager.getInstance().getConstants().removeTemplatesTitle());
model.setHelpTag(HelpTag.remove_template);
model.setHashName("remove_template"); //$NON-NLS-1$
ArrayList<String> items = new ArrayList<>();
List<VmTemplate> templates = getSelectedItems();
for (VmTemplate template : templates) {
if (!template.getId().equals(Guid.Empty)) {
items.add(template.getName() + getTemplateVersionNameAndNumber(template));
}
}
model.setItems(items);
UICommand tempVar = UICommand.createDefaultOkUiCommand("OnRemove", this); //$NON-NLS-1$
model.getCommands().add(tempVar);
UICommand tempVar2 = UICommand.createCancelUiCommand("Cancel", this); //$NON-NLS-1$
model.getCommands().add(tempVar2);
}
private void onRemove() {
ConfirmationModel model = (ConfirmationModel) getWindow();
if (model.getProgress() != null) {
return;
}
ArrayList<VdcActionParametersBase> list = new ArrayList<>();
for (Object item : getSelectedItems()) {
VmTemplate a = (VmTemplate) item;
list.add(new VmTemplateManagementParameters(a.getId()));
}
model.startProgress();
Frontend.getInstance().runMultipleAction(VdcActionType.RemoveVmTemplate, list,
result -> {
ConfirmationModel localModel = (ConfirmationModel) result.getState();
localModel.stopProgress();
cancel();
}, model);
}
/**
* In case the template is not base, return template's version name and version number in the format:
* " (Version: version-name (version-number))"
*/
private String getTemplateVersionNameAndNumber(VmTemplate template) {
if (template.isBaseTemplate()) {
return ""; //$NON-NLS-1$
}
return ConstantsManager.getInstance().getMessages().templateVersionNameAndNumber(template.getTemplateVersionName() != null ? template.getTemplateVersionName() : "", //$NON-NLS-1$
template.getTemplateVersionNumber());
};
private void onSave() {
final UnitVmModel model = (UnitVmModel) getWindow();
if (!model.validate()) {
return;
}
final String name = model.getName().getEntity();
boolean isBaseTemplate = false;
if (model.getBehavior().isExistingTemplateBehavior()) {
isBaseTemplate = ((TemplateVmModelBehavior) model.getBehavior()).getVmTemplate().isBaseTemplate();
} else if (model.getBehavior().isBlankTemplateBehavior()) {
isBaseTemplate = true;
}
if (isBaseTemplate) {
AsyncDataProvider.getInstance().isTemplateNameUnique(new AsyncQuery<>(
isNameUnique -> {
if (model.getBehavior().isExistingTemplateBehavior()) {
selectedItem = ((TemplateVmModelBehavior) model.getBehavior()).getVmTemplate();
} else {
selectedItem = ((ExistingBlankTemplateModelBehavior) model.getBehavior()).getVmTemplate();
}
if (!isNameUnique && name.compareToIgnoreCase(selectedItem.getName()) != 0) {
model.getName()
.getInvalidityReasons()
.add(ConstantsManager.getInstance()
.getConstants()
.nameMustBeUniqueInvalidReason());
model.getName().setIsValid(false);
model.setValidTab(TabName.GENERAL_TAB, false);
model.fireValidationCompleteEvent();
return;
}
String selectedCpu = model.getCustomCpu().getSelectedItem();
if (selectedCpu != null && !selectedCpu.isEmpty() && !model.getCustomCpu().getItems().contains(selectedCpu)) {
ConfirmationModel confirmModel = new ConfirmationModel();
confirmModel.setTitle(ConstantsManager.getInstance().getConstants().vmUnsupportedCpuTitle());
confirmModel.setMessage(ConstantsManager.getInstance().getConstants().vmUnsupportedCpuMessage());
confirmModel.setHelpTag(HelpTag.edit_unsupported_cpu);
confirmModel.setHashName("edit_unsupported_cpu"); //$NON-NLS-1$
confirmModel.getCommands().add(new UICommand("postNameUniqueCheck", TemplateListModel.this) //$NON-NLS-1$
.setTitle(ConstantsManager.getInstance().getConstants().ok())
.setIsDefault(true));
confirmModel.getCommands()
.add(UICommand.createCancelUiCommand("CancelConfirmation", TemplateListModel.this)); //$NON-NLS-1$
setConfirmWindow(confirmModel);
} else {
postNameUniqueCheck();
}
}), name, model.getSelectedDataCenter() == null ? null : model.getSelectedDataCenter().getId());
} else {
postNameUniqueCheck();
}
}
private void createVMFromTemplate() {
VmTemplate template = getSelectedItem();
final List<UICommand> commands = new ArrayList<>();
commands.add(UICommand.createDefaultOkUiCommand("OnSaveVm", this)); //$NON-NLS-1$
commands.add(UICommand.createCancelUiCommand("Cancel", this)); //$NON-NLS-1$
AsyncDataProvider.getInstance().getTemplateById(new AsyncQuery<>(withVmInit -> setupNewVmModel(new UnitVmModel(new NewVmFromTemplateModelBehavior(withVmInit), TemplateListModel.this),
withVmInit.getVmType(), getSystemTreeSelectedItem(), commands)), template.getId());
}
private void onSaveVm() {
UnitVmModel model = (UnitVmModel) getWindow();
String name = model.getName().getEntity();
setcurrentVm(new VM());
validateVm(model, name);
}
public void postNameUniqueCheck() {
final UnitVmModel model = (UnitVmModel) getWindow();
if (model.getProgress() != null) {
return;
}
VmTemplate selectedItem;
if (model.getBehavior().isExistingTemplateBehavior()) {
selectedItem = ((TemplateVmModelBehavior) model.getBehavior()).getVmTemplate();
} else {
selectedItem = ((ExistingBlankTemplateModelBehavior) model.getBehavior()).getVmTemplate();
}
final VmTemplate template = (VmTemplate) Cloner.clone(selectedItem);
final String iconForParameters = IconCache.getInstance().getIcon(selectedItem.getLargeIconId()).equals(
model.getIcon().getEntity().getIcon())
? null
: IconUtils.filterPredefinedIcons(model.getIcon().getEntity().getIcon());
// Save changes.
buildTemplateOnSave(model, template);
template.setCreatedByUserId(selectedItem.getCreatedByUserId());
model.startProgress();
template.setVmInit(model.getVmInitModel().buildCloudInitParameters(model));
UpdateVmTemplateParameters parameters = new UpdateVmTemplateParameters(template);
parameters.setVmLargeIcon(iconForParameters);
parameters.setConsoleEnabled(model.getIsConsoleDeviceEnabled().getEntity());
setVmWatchdogToParams(model, parameters);
BuilderExecutor.build(model, parameters, new UnitToGraphicsDeviceParamsBuilder());
parameters.setSoundDeviceEnabled(model.getIsSoundcardEnabled().getEntity());
setVmRngDeviceToParams(model, parameters);
parameters.setBalloonEnabled(balloonEnabled(model));
parameters.setVirtioScsiEnabled(model.getIsVirtioScsiEnabled().getEntity());
if (model.getIsHeadlessModeEnabled().getEntity()) {
parameters.getVmTemplateData().setDefaultDisplayType(DisplayType.none);
}
Frontend.getInstance().runAction(VdcActionType.UpdateVmTemplate, parameters,
result -> {
TemplateListModel localModel = (TemplateListModel) result.getState();
localModel.postUpdateVmTemplate(result.getReturnValue());
}, this);
}
@SuppressWarnings("unchecked")
protected static void buildTemplateOnSave(UnitVmModel model, VmTemplate template) {
BuilderExecutor.build(model, template,
new FullUnitToVmBaseBuilder<VmTemplate>(),
new VersionNameUnitToVmBaseBuilder());
}
private void setVmWatchdogToParams(final UnitVmModel model, UpdateVmTemplateParameters updateVmParams) {
VmWatchdogType wdModel = model.getWatchdogModel().getSelectedItem();
updateVmParams.setUpdateWatchdog(true);
if(wdModel != null) {
VmWatchdog vmWatchdog = new VmWatchdog();
vmWatchdog.setAction(model.getWatchdogAction().getSelectedItem());
vmWatchdog.setModel(wdModel);
updateVmParams.setWatchdog(vmWatchdog);
}
}
private void setVmRngDeviceToParams(UnitVmModel model, UpdateVmTemplateParameters parameters) {
parameters.setUpdateRngDevice(true);
parameters.setRngDevice(model.getIsRngEnabled().getEntity() ? model.generateRngDevice() : null);
}
public void postUpdateVmTemplate(VdcReturnValueBase returnValue) {
UnitVmModel model = (UnitVmModel) getWindow();
model.stopProgress();
if (returnValue != null && returnValue.getSucceeded()) {
cancel();
}
}
@Override
protected void cancel() {
cancelConfirmation();
setWindow(null);
updateActionsAvailability();
}
private void cancelConfirmation() {
setConfirmWindow(null);
}
@Override
protected void onSelectedItemChanged() {
super.onSelectedItemChanged();
updateActionsAvailability();
}
@Override
protected void selectedItemsChanged() {
super.selectedItemsChanged();
updateActionsAvailability();
}
@Override
protected void selectedItemPropertyChanged(Object sender, PropertyChangedEventArgs e) {
super.selectedItemPropertyChanged(sender, e);
if (e.propertyName.equals("status")) { //$NON-NLS-1$
updateActionsAvailability();
}
}
private boolean selectedItemsContainBlankTemplate() {
if (getSelectedItems() != null) {
List<VmTemplate> templates = getSelectedItems();
for (VmTemplate template : templates) {
if (template != null && template.getId().equals(Guid.Empty)) {
return true;
}
}
}
return false;
}
@Override
protected void updateActionsAvailability() {
VmTemplate item = getSelectedItem();
ArrayList items =
(getSelectedItems() != null) ? (ArrayList) getSelectedItems()
: new ArrayList();
boolean blankSelected = isBlankTemplateSelected();
getEditCommand().setIsExecutionAllowed(items.size() == 1 && item != null
&& item.getStatus() != VmTemplateStatus.Locked);
getRemoveCommand().setIsExecutionAllowed(items.size() > 0
&& VdcActionUtils.canExecute(items, VmTemplate.class, VdcActionType.RemoveVmTemplate));
if (getRemoveCommand().getIsExecutionAllowed() && blankSelected) {
getRemoveCommand().getExecuteProhibitionReasons().add(ConstantsManager.getInstance()
.getConstants()
.blankTemplateCannotBeRemoved());
getRemoveCommand().setIsExecutionAllowed(false);
}
getExportCommand().setIsExecutionAllowed(items.size() > 0
&& VdcActionUtils.canExecute(items, VmTemplate.class, VdcActionType.ExportVmTemplate));
if (getExportCommand().getIsExecutionAllowed() && blankSelected) {
getExportCommand().getExecuteProhibitionReasons().add(ConstantsManager.getInstance()
.getConstants()
.blankTemplateCannotBeExported());
getExportCommand().setIsExecutionAllowed(false);
}
getCreateVmFromTemplateCommand().setIsExecutionAllowed(items.size() == 1 && item != null
&& item.getStatus() != VmTemplateStatus.Locked);
}
/**
* Returns true if at least one of the selected items is the blank template
*/
protected boolean isBlankTemplateSelected() {
if (isBlankTemplate(getSelectedItem())) {
return true;
}
if (getSelectedItems() == null) {
return false;
}
for (Object selectedItem : getSelectedItems()) {
if (isBlankTemplate(selectedItem)) {
return true;
}
}
return false;
}
private boolean isBlankTemplate(Object selectedItem) {
return selectedItem != null &&
selectedItem instanceof VmTemplate &&
Guid.Empty.equals(((VmTemplate) selectedItem).getId());
}
@Override
public void executeCommand(UICommand command) {
super.executeCommand(command);
if (command == getEditCommand()) {
edit();
}
else if (command == getRemoveCommand()) {
remove();
}
else if (command == getExportCommand()) {
export();
}
else if (command == getCreateVmFromTemplateCommand()) {
createVMFromTemplate();
}
else if ("Cancel".equals(command.getName())) { //$NON-NLS-1$
cancel();
}
else if ("OnExport".equals(command.getName())) { //$NON-NLS-1$
onExport();
}
else if ("OnSave".equals(command.getName())) { //$NON-NLS-1$
onSave();
}
else if ("OnSaveVm".equals(command.getName())) { //$NON-NLS-1$
onSaveVm();
}
else if ("postNameUniqueCheck".equals(command.getName())) { //$NON-NLS-1$
postNameUniqueCheck();
setConfirmWindow(null);
}
else if ("OnRemove".equals(command.getName())) { //$NON-NLS-1$
onRemove();
}
else if ("OnExportNoTemplates".equals(command.getName())) { //$NON-NLS-1$
doExport();
}
else if ("CancelConfirmation".equals(command.getName())) { //$NON-NLS-1$
cancelConfirmation();
}
}
@Override
protected String getListName() {
return "TemplateListModel"; //$NON-NLS-1$
}
@Override
protected String extractNameFromEntity(VmTemplate entity) {
return entity.getName();
}
@Override
protected void sendWarningForNonExportableDisks(VmTemplate entity) {
// no op
}
@Override
protected void setupNewVmModel(UnitVmModel model,
VmType vmType,
SystemTreeItemModel systemTreeItemModel,
List<UICommand> uiCommands) {
super.setupNewVmModel(model, vmType, systemTreeItemModel, uiCommands);
model.getProvisioning().setEntity(vmType == VmType.Server);
}
}