package org.ovirt.engine.ui.common.view.popup.numa; import java.util.ArrayList; import java.util.List; import java.util.Set; import org.ovirt.engine.core.common.businessentities.VDS; import org.ovirt.engine.core.common.businessentities.VM; import org.ovirt.engine.core.common.businessentities.VdsNumaNode; import org.ovirt.engine.core.common.businessentities.VmNumaNode; import org.ovirt.engine.ui.common.CommonApplicationConstants; import org.ovirt.engine.ui.common.CommonApplicationMessages; import org.ovirt.engine.ui.common.CommonApplicationResources; import org.ovirt.engine.ui.common.gin.AssetProvider; import org.ovirt.engine.ui.common.idhandler.ElementIdHandler; import org.ovirt.engine.ui.common.presenter.popup.numa.NumaSupportPopupPresenterWidget; import org.ovirt.engine.ui.common.system.ClientStorage; import org.ovirt.engine.ui.common.view.popup.AbstractModelBoundPopupView; import org.ovirt.engine.ui.common.widget.dialog.SimpleDialogPanel; import org.ovirt.engine.ui.uicommonweb.models.hosts.numa.NumaSupportModel; import org.ovirt.engine.ui.uicommonweb.models.hosts.numa.VNodeModel; import com.google.gwt.core.client.GWT; import com.google.gwt.event.shared.EventBus; import com.google.gwt.resources.client.CssResource; import com.google.gwt.safehtml.shared.OnlyToBeUsedInGeneratedCodeStringBlessedAsSafeHtml; import com.google.gwt.safehtml.shared.SafeHtml; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.user.client.ui.AbstractImagePrototype; import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.HTML; import com.google.gwt.user.client.ui.IsWidget; import com.google.gwt.user.client.ui.SplitLayoutPanel; import com.google.inject.Inject; import com.google.inject.Provider; import com.gwtplatform.mvp.client.View; public class NumaSupportPopupView extends AbstractModelBoundPopupView<NumaSupportModel> implements NumaSupportPopupPresenterWidget.ViewDef { interface ViewUiBinder extends UiBinder<SimpleDialogPanel, NumaSupportPopupView> { ViewUiBinder uiBinder = GWT.create(ViewUiBinder.class); } interface ViewIdHandler extends ElementIdHandler<NumaSupportPopupView> { ViewIdHandler idHandler = GWT.create(ViewIdHandler.class); } interface Style extends CssResource { String hostSummaryNumaTitle(); } static final String DELIMITER = ", "; //$NON-NLS-1$ private static final int SPLITTER_THICKNESS = 1; @Inject Provider<CpuSummaryPanel> cpuSummaryPanelProvider; @Inject Provider<MemorySummaryPanel> memorySummaryPanelProvider; @Inject Provider<SocketPanel> socketPanelProvider; @Inject Provider<NumaPanel> numaPanelProvider; @Inject Provider<AssignedVNumaNodesPanel> assignedVNumaPanelProvider; @Inject Provider<HostSummaryContentPanel> hostSummaryContentProvider; private static final CommonApplicationResources resources = AssetProvider.getResources(); private static final CommonApplicationConstants constants = AssetProvider.getConstants(); private static final CommonApplicationMessages messages = AssetProvider.getMessages(); @UiField FlowPanel groupPanel; @UiField FlowPanel hostSummaryPanel; @UiField FlowPanel unassignedvNumaNodesContainer; @UiField FlowPanel socketListPanel; @UiField(provided = true) SplitLayoutPanel horizontalSplitLayoutPanel; @UiField Style style; final VNumaTitleTemplate vNumaTitleTemplate; final NumaTitleTemplate numaTitleTemplate; @Inject public NumaSupportPopupView(EventBus eventBus, ClientStorage clientStorage, VNumaTitleTemplate vNumaTitleTemplate, NumaTitleTemplate numaTitleTemplate) { super(eventBus); this.numaTitleTemplate = numaTitleTemplate; this.vNumaTitleTemplate = vNumaTitleTemplate; horizontalSplitLayoutPanel = new SplitLayoutPanel(SPLITTER_THICKNESS); initWidget(ViewUiBinder.uiBinder.createAndBindUi(this)); ViewIdHandler.idHandler.generateAndSetIds(this); horizontalSplitLayoutPanel.setWidgetToggleDisplayAllowed(unassignedvNumaNodesContainer, true); } @Override public void edit(NumaSupportModel object) { } @Override public NumaSupportModel flush() { return null; } @Override public void cleanup() { // TODO clean up stuff if needed } @Override public void setUnassignedGroupPanel(View view) { unassignedvNumaNodesContainer.insert(view, 1); } @Override public IsWidget getHostSummaryTitle(int totalCpus, int usedCpuPercentage, int totalMemory, int usedMemory, int totalNumaNodes, int totalVNumaNodes) { FlowPanel summaryPanel = new FlowPanel(); CpuSummaryPanel cpuSummaryPanel = this.cpuSummaryPanelProvider.get(); cpuSummaryPanel.setName(constants.numaSummaryTotals()); cpuSummaryPanel.setCpus(totalCpus, usedCpuPercentage); summaryPanel.add(cpuSummaryPanel); MemorySummaryPanel memorySummaryPanel = this.memorySummaryPanelProvider.get(); memorySummaryPanel.setMemoryStats(totalMemory, usedMemory); summaryPanel.add(memorySummaryPanel); summaryPanel.add(new HTML(numaTitleTemplate.title(totalNumaNodes, style.hostSummaryNumaTitle()))); String myImageHtml = AbstractImagePrototype.create(resources.vNumaTitleIcon()).getHTML(); SafeHtml mySafeImageHtml = new OnlyToBeUsedInGeneratedCodeStringBlessedAsSafeHtml(myImageHtml); summaryPanel.add(new HTML(vNumaTitleTemplate.title(totalVNumaNodes, mySafeImageHtml, style.hostSummaryNumaTitle()))); return summaryPanel; } @Override public IsWidget getHostSummaryContent(VDS selectedItem, NumaSupportModel supportModel) { HostSummaryContentPanel contentPanel = hostSummaryContentProvider.get(); List<VM> vmsWithVNuma = supportModel.getVmsWithvNumaNodeList(); List<VNodeModel> numaNodes = new ArrayList<>(); for (VM vm: vmsWithVNuma) { for(VmNumaNode vmNumaNode: vm.getvNumaNodeList()) { numaNodes.add(new VNodeModel(vm, vmNumaNode)); } } contentPanel.setModel(supportModel.getNumaNodeList(), numaNodes); return contentPanel; } @Override public void setHostSummaryPanel(IsWidget widget) { this.hostSummaryPanel.add(widget); } @Override public void addVNumaInfoPanel(Set<VdsNumaNode> numaNodes, int socketIndex, NumaSupportModel supportModel) { SocketPanel socketPanel = socketPanelProvider.get(); socketPanel.setHeaderText(messages.numaSocketNumber(socketIndex)); for (VdsNumaNode numaNode: numaNodes) { NumaPanel numaPanel = numaPanelProvider.get(); numaPanel.getCpuSummaryPanel().setName(messages.numaNode(numaNode.getIndex())); numaPanel.getCpuSummaryPanel().setCpus(numaNode.getCpuIds().size(), numaNode.getNumaNodeStatistics().getCpuUsagePercent()); numaPanel.getMemorySummaryPanel().setMemoryStats(numaNode.getMemTotal(), numaNode.getMemTotal() - numaNode.getNumaNodeStatistics().getMemFree()); socketPanel.addWidget(numaPanel); AssignedVNumaNodesPanel assignedPanel = assignedVNumaPanelProvider.get(); assignedPanel.setNodes(supportModel.getVNumaNodeByNodeIndx(numaNode.getIndex()), numaNode.getIndex(), supportModel.getNumaNodeList()); socketPanel.addWidget(assignedPanel); } this.socketListPanel.add(socketPanel); } @Override public void displayVmDetails(VNodeModel vNodeModel) { } @Override public void clear() { this.socketListPanel.clear(); this.hostSummaryPanel.clear(); } }