package org.ovirt.engine.ui.webadmin.section.main.view.tab;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import org.ovirt.engine.core.common.businessentities.GraphicsInfo;
import org.ovirt.engine.core.common.businessentities.GraphicsType;
import org.ovirt.engine.core.common.businessentities.VM;
import org.ovirt.engine.core.common.businessentities.VMStatus;
import org.ovirt.engine.core.searchbackend.VmConditionFieldAutoCompleter;
import org.ovirt.engine.ui.common.idhandler.ElementIdHandler;
import org.ovirt.engine.ui.common.uicommon.model.MainModelProvider;
import org.ovirt.engine.ui.common.widget.action.ActionButtonDefinition;
import org.ovirt.engine.ui.common.widget.action.CommandLocation;
import org.ovirt.engine.ui.common.widget.action.DropdownActionButton;
import org.ovirt.engine.ui.common.widget.action.UiCommandButtonDefinition;
import org.ovirt.engine.ui.common.widget.table.cell.Cell;
import org.ovirt.engine.ui.common.widget.table.cell.StatusCompositeCell;
import org.ovirt.engine.ui.common.widget.table.column.AbstractColumn;
import org.ovirt.engine.ui.common.widget.table.column.AbstractEnumColumn;
import org.ovirt.engine.ui.common.widget.table.column.AbstractTextColumn;
import org.ovirt.engine.ui.uicommonweb.UICommand;
import org.ovirt.engine.ui.uicommonweb.models.vms.UnitVmModel;
import org.ovirt.engine.ui.uicommonweb.models.vms.VmListModel;
import org.ovirt.engine.ui.webadmin.ApplicationConstants;
import org.ovirt.engine.ui.webadmin.ApplicationResources;
import org.ovirt.engine.ui.webadmin.gin.AssetProvider;
import org.ovirt.engine.ui.webadmin.section.main.presenter.tab.MainTabVirtualMachinePresenter;
import org.ovirt.engine.ui.webadmin.section.main.view.AbstractMainTabWithDetailsTableView;
import org.ovirt.engine.ui.webadmin.widget.action.WebAdminButtonDefinition;
import org.ovirt.engine.ui.webadmin.widget.action.WebAdminImageButtonDefinition;
import org.ovirt.engine.ui.webadmin.widget.table.column.AbstractUptimeColumn;
import org.ovirt.engine.ui.webadmin.widget.table.column.ColumnResizeTableLineChartProgressBar;
import org.ovirt.engine.ui.webadmin.widget.table.column.CommentColumn;
import org.ovirt.engine.ui.webadmin.widget.table.column.ImportProgressColumn;
import org.ovirt.engine.ui.webadmin.widget.table.column.MigrationProgressColumn;
import org.ovirt.engine.ui.webadmin.widget.table.column.ReasonColumn;
import org.ovirt.engine.ui.webadmin.widget.table.column.VmStatusColumn;
import org.ovirt.engine.ui.webadmin.widget.table.column.VmTypeColumn;
import com.google.gwt.cell.client.HasCell;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.shared.EventBus;
import com.google.gwt.safehtml.shared.SafeHtml;
import com.google.gwt.safehtml.shared.SafeHtmlUtils;
import com.google.inject.Inject;
public class MainTabVirtualMachineView extends AbstractMainTabWithDetailsTableView<VM, VmListModel<Void>> implements MainTabVirtualMachinePresenter.ViewDef {
private final EventBus eventBus;
interface ViewIdHandler extends ElementIdHandler<MainTabVirtualMachineView> {
ViewIdHandler idHandler = GWT.create(ViewIdHandler.class);
}
private static final ApplicationResources resources = AssetProvider.getResources();
private static final ApplicationConstants constants = AssetProvider.getConstants();
@Inject
public MainTabVirtualMachineView(MainModelProvider<VM, VmListModel<Void>> modelProvider, EventBus eventBus) {
super(modelProvider);
this.eventBus = eventBus;
ViewIdHandler.idHandler.generateAndSetIds(this);
initTable();
initWidget(getTable());
}
void initTable() {
getTable().enableColumnResizing();
VmStatusColumn<VM> statusIconColumn = new VmStatusColumn<>();
statusIconColumn.setContextMenuTitle(constants.statusIconVm());
statusIconColumn.makeSortable(VmConditionFieldAutoCompleter.STATUS);
getTable().addColumn(statusIconColumn, constants.empty(), "35px"); //$NON-NLS-1$
VmTypeColumn typeColumn = new VmTypeColumn();
typeColumn.setContextMenuTitle(constants.typeVm());
typeColumn.makeSortable(VmConditionFieldAutoCompleter.TYPE);
getTable().addColumn(typeColumn, constants.empty(), "60px"); //$NON-NLS-1$
AbstractTextColumn<VM> nameColumn = new AbstractTextColumn<VM>() {
@Override
public String getValue(VM object) {
return object.getName();
}
};
nameColumn.makeSortable(VmConditionFieldAutoCompleter.NAME);
getTable().addColumn(nameColumn, constants.nameVm(), "120px"); //$NON-NLS-1$
CommentColumn<VM> commentColumn = new CommentColumn<>();
getTable().addColumnWithHtmlHeader(commentColumn,
SafeHtmlUtils.fromSafeConstant(constants.commentLabel()),
"75px"); //$NON-NLS-1$
AbstractTextColumn<VM> hostColumn = new AbstractTextColumn<VM>() {
@Override
public String getValue(VM object) {
return object.getRunOnVdsName();
}
};
hostColumn.makeSortable(VmConditionFieldAutoCompleter.HOST);
getTable().addColumn(hostColumn, constants.hostVm(), "120px"); //$NON-NLS-1$
AbstractTextColumn<VM> ipColumn = new AbstractTextColumn<VM>() {
@Override
public String getValue(VM object) {
return object.getIp();
}
};
ipColumn.makeSortable(VmConditionFieldAutoCompleter.IP);
getTable().addColumn(ipColumn, constants.ipVm(), "120px"); //$NON-NLS-1$
AbstractTextColumn<VM> fqdnColumn = new AbstractTextColumn<VM>() {
@Override
public String getValue(VM object) {
return object.getFqdn();
}
};
fqdnColumn.makeSortable(VmConditionFieldAutoCompleter.FQDN);
getTable().addColumn(fqdnColumn, constants.fqdn(), "120px"); //$NON-NLS-1$
AbstractTextColumn<VM> clusterColumn = new AbstractTextColumn<VM>() {
@Override
public String getValue(VM object) {
return object.getClusterName();
}
};
clusterColumn.makeSortable(VmConditionFieldAutoCompleter.CLUSTER);
getTable().addColumn(clusterColumn, constants.clusterVm(), "120px"); //$NON-NLS-1$
AbstractTextColumn<VM> dcColumn = new AbstractTextColumn<VM>() {
@Override
public String getValue(VM object) {
return object.getStoragePoolName();
}
};
dcColumn.makeSortable(VmConditionFieldAutoCompleter.DATACENTER);
getTable().addColumn(dcColumn, constants.dcVm(), "120px"); //$NON-NLS-1$
getTable().addColumn(new ColumnResizeTableLineChartProgressBar<VM>(
getTable(),
VmConditionFieldAutoCompleter.MEM_USAGE) {
@Override
protected List<Integer> getProgressValues(VM object) {
return object.getMemoryUsageHistory();
}
}, constants.memoryVm(), "80px"); //$NON-NLS-1$
getTable().addColumn(new ColumnResizeTableLineChartProgressBar<VM>(
getTable(),
VmConditionFieldAutoCompleter.CPU_USAGE) {
@Override
protected List<Integer> getProgressValues(VM object) {
return object.getCpuUsageHistory();
}
}, constants.cpuVm(), "80px"); //$NON-NLS-1$
getTable().addColumn(new ColumnResizeTableLineChartProgressBar<VM>(
getTable(),
VmConditionFieldAutoCompleter.NETWORK_USAGE) {
@Override
protected List<Integer> getProgressValues(VM object) {
return object.getNetworkUsageHistory();
}
}, constants.networkVm(), "80px"); //$NON-NLS-1$
AbstractTextColumn<VM> graphicsColumn = new AbstractEnumColumn<VM, UnitVmModel.GraphicsTypes>() {
@Override
protected UnitVmModel.GraphicsTypes getRawValue(VM vm) {
if ((vm.getStatus() == VMStatus.Down) || (vm.getStatus() == VMStatus.ImageLocked)) {
return UnitVmModel.GraphicsTypes.NONE;
}
Map<GraphicsType, GraphicsInfo> graphicsInfos = vm.getGraphicsInfos();
return UnitVmModel.GraphicsTypes.fromGraphicsTypes(graphicsInfos.keySet());
}
};
getTable().addColumn(graphicsColumn, constants.graphicsVm(), "70px"); //$NON-NLS-1$
AbstractTextColumn<VM> statusColumn = new AbstractEnumColumn<VM, VMStatus>() {
@Override
public VMStatus getRawValue(VM object) {
return object.getStatus();
}
@Override
public String getValue(VM vm) {
if (vm.getStatus() == VMStatus.MigratingFrom) {
// will be rendered by progress column
return null;
}
if (vm.getBackgroundOperationDescription() != null) {
// will be rendered by progress column
return null;
}
return super.getValue(vm);
}
};
MigrationProgressColumn migrationProgressColumn = new MigrationProgressColumn();
ImportProgressColumn importProgressColumn = new ImportProgressColumn();
ReasonColumn<VM> reasonColumn = new ReasonColumn<VM>() {
@Override
protected String getReason(VM value) {
return value.getStopReason();
}
};
List<HasCell<VM, ?>> list = new ArrayList<>();
list.add(statusColumn);
list.add(reasonColumn);
list.add(migrationProgressColumn);
list.add(importProgressColumn);
Cell<VM> compositeCell = new StatusCompositeCell<>(list);
AbstractColumn<VM, VM> statusTextColumn = new AbstractColumn<VM, VM>(compositeCell) {
@Override
public VM getValue(VM object) {
return object;
}
@Override
public SafeHtml getTooltip(VM value) {
String stopReason = value.getStopReason();
if (stopReason != null && !stopReason.trim().isEmpty()) {
return SafeHtmlUtils.fromString(stopReason);
}
return null;
}
};
statusTextColumn.makeSortable(VmConditionFieldAutoCompleter.STATUS);
getTable().addColumn(statusTextColumn, constants.statusVm(), "120px"); //$NON-NLS-1$
AbstractTextColumn<VM> uptimeColumn = new AbstractUptimeColumn<VM>() {
@Override
public Double getRawValue(VM object) {
return object.getRoundedElapsedTime();
}
};
uptimeColumn.makeSortable(VmConditionFieldAutoCompleter.UPTIME);
getTable().addColumn(uptimeColumn, constants.uptimeVm(), "100px"); //$NON-NLS-1$
AbstractTextColumn<VM> descriptionColumn = new AbstractTextColumn<VM>() {
@Override
public String getValue(VM object) {
return object.getDescription();
}
};
descriptionColumn.makeSortable(VmConditionFieldAutoCompleter.DESCRIPTION);
getTable().addColumn(descriptionColumn, constants.description(), "150px"); //$NON-NLS-1$
getTable().addActionButton(new WebAdminButtonDefinition<VM>(constants.newVm()) {
@Override
protected UICommand resolveCommand() {
return getMainModel().getNewVmCommand();
}
});
getTable().addActionButton(new WebAdminButtonDefinition<VM>(constants.restoreVm()) {
@Override
protected UICommand resolveCommand() {
return getMainModel().getImportVmCommand();
}
});
getTable().addActionButton(new WebAdminButtonDefinition<VM>(constants.editVm()) {
@Override
protected UICommand resolveCommand() {
return getMainModel().getEditCommand();
}
});
getTable().addActionButton(new WebAdminButtonDefinition<VM>(constants.removeVm()) {
@Override
protected UICommand resolveCommand() {
return getMainModel().getRemoveCommand();
}
});
getTable().addActionButton(new WebAdminButtonDefinition<VM>(constants.cloneVm()) {
@Override
protected UICommand resolveCommand() {
return getMainModel().getCloneVmCommand();
}
});
// TODO: separator
getTable().addActionButton(new WebAdminButtonDefinition<VM>(constants.runOnceVm()) {
@Override
protected UICommand resolveCommand() {
return getMainModel().getRunOnceCommand();
}
});
getTable().addActionButton(new WebAdminImageButtonDefinition<VM>(constants.runVm(),
resources.runVmImage(), resources.runVmDisabledImage()) {
@Override
protected UICommand resolveCommand() {
return getMainModel().getRunCommand();
}
@Override
public SafeHtml getTooltip() {
return SafeHtmlUtils.fromSafeConstant(constants.runVm());
}
});
getTable().addActionButton(new WebAdminImageButtonDefinition<VM>(constants.suspendVm(),
resources.suspendVmImage(), resources.suspendVmDisabledImage()) {
@Override
protected UICommand resolveCommand() {
return getMainModel().getPauseCommand();
}
@Override
public SafeHtml getTooltip() {
return SafeHtmlUtils.fromSafeConstant(constants.suspendVm());
}
});
getTable().addActionButton(new WebAdminImageButtonDefinition<VM>(constants.shutDownVm(),
resources.stopVmImage(), resources.stopVmDisabledImage()) {
@Override
protected UICommand resolveCommand() {
return getMainModel().getShutdownCommand();
}
@Override
public SafeHtml getTooltip() {
return SafeHtmlUtils.fromSafeConstant(constants.shutDownVm());
}
});
getTable().addActionButton(new WebAdminButtonDefinition<VM>(constants.powerOffVm(), CommandLocation.OnlyFromContext) {
@Override
protected UICommand resolveCommand() {
return getMainModel().getStopCommand();
}
@Override
public SafeHtml getTooltip() {
return SafeHtmlUtils.fromSafeConstant(constants.powerOffVm());
}
});
getTable().addActionButton(new WebAdminImageButtonDefinition<VM>(constants.rebootVm(),
resources.rebootImage(), resources.rebootDisabledImage()) {
@Override
protected UICommand resolveCommand() {
return getMainModel().getRebootCommand();
}
@Override
public SafeHtml getTooltip() {
return SafeHtmlUtils.fromSafeConstant(constants.rebootVm());
}
});
List<ActionButtonDefinition<VM>> consoleOptionsSubActions = new LinkedList<>();
consoleOptionsSubActions.add(new UiCommandButtonDefinition<VM>(eventBus, constants.consoleOptions()) {
@Override
protected UICommand resolveCommand() {
return getMainModel().getEditConsoleCommand();
}
});
// TODO: separator
getTable().addActionButton(new WebAdminImageButtonDefinition<VM>(constants.consoleVm(),
resources.consoleImage(), resources.consoleDisabledImage()) {
@Override
protected UICommand resolveCommand() {
return getMainModel().getConsoleConnectCommand();
}
@Override
public SafeHtml getTooltip() {
return SafeHtmlUtils.fromSafeConstant(constants.consoleVm());
}
}, new DropdownActionButton<>(consoleOptionsSubActions, () -> getMainModel().getSelectedItems()));
// TODO: separator
getTable().addActionButton(new WebAdminButtonDefinition<VM>(constants.consoleOptions(),
CommandLocation.OnlyFromContext) { //$NON-NLS-1$
@Override
protected UICommand resolveCommand() {
return getMainModel().getEditConsoleCommand();
}
});
// TODO: separator
getTable().addActionButton(new WebAdminButtonDefinition<VM>(constants.migrateVm()) {
@Override
protected UICommand resolveCommand() {
return getMainModel().getMigrateCommand();
}
});
// TODO: separator
getTable().addActionButton(new WebAdminButtonDefinition<VM>(constants.cancelMigrationVm()) {
@Override
protected UICommand resolveCommand() {
return getMainModel().getCancelMigrateCommand();
}
});
getTable().addActionButton(new WebAdminButtonDefinition<VM>(constants.cancelConvertVm()) {
@Override
protected UICommand resolveCommand() {
return getMainModel().getCancelConvertCommand();
}
});
// TODO: separator
getTable().addActionButton(new WebAdminButtonDefinition<VM>(constants.makeTemplateVm()) {
@Override
protected UICommand resolveCommand() {
return getMainModel().getNewTemplateCommand();
}
});
// TODO: separator
getTable().addActionButton(new WebAdminButtonDefinition<VM>(constants.exportVm()) {
@Override
protected UICommand resolveCommand() {
return getMainModel().getExportCommand();
}
});
getTable().addActionButton(new WebAdminButtonDefinition<VM>(constants.createSnapshotVM()) {
@Override
protected UICommand resolveCommand() {
return getMainModel().getCreateSnapshotCommand();
}
});
getTable().addActionButton(new WebAdminButtonDefinition<VM>(constants.changeCdVm()) {
@Override
protected UICommand resolveCommand() {
return getMainModel().getChangeCdCommand();
}
});
getTable().addActionButton(new WebAdminButtonDefinition<VM>(constants.assignTagsVm()) {
@Override
protected UICommand resolveCommand() {
return getMainModel().getAssignTagsCommand();
}
});
getTable().addActionButton(new WebAdminImageButtonDefinition<VM>(constants.guideMeVm(),
resources.guideSmallImage(), resources.guideSmallDisabledImage(), true) {
@Override
protected UICommand resolveCommand() {
return getMainModel().getGuideCommand();
}
});
}
}