package org.ovirt.engine.ui.webadmin.section.main.view.popup;
import org.gwtbootstrap3.client.ui.Alert;
import org.gwtbootstrap3.client.ui.Row;
import org.gwtbootstrap3.client.ui.constants.AlertType;
import org.ovirt.engine.core.common.businessentities.KVMVmProviderProperties;
import org.ovirt.engine.core.common.businessentities.Provider;
import org.ovirt.engine.core.common.businessentities.StoragePool;
import org.ovirt.engine.core.common.businessentities.VDS;
import org.ovirt.engine.core.common.businessentities.VM;
import org.ovirt.engine.core.common.businessentities.VmwareVmProviderProperties;
import org.ovirt.engine.core.common.businessentities.XENVmProviderProperties;
import org.ovirt.engine.ui.common.CommonApplicationTemplates;
import org.ovirt.engine.ui.common.editor.UiCommonEditorDriver;
import org.ovirt.engine.ui.common.idhandler.WithElementId;
import org.ovirt.engine.ui.common.view.popup.AbstractModelBoundPopupView;
import org.ovirt.engine.ui.common.widget.Align;
import org.ovirt.engine.ui.common.widget.EntityModelWidgetWithInfo;
import org.ovirt.engine.ui.common.widget.UiCommandButton;
import org.ovirt.engine.ui.common.widget.VerticalSplitTable;
import org.ovirt.engine.ui.common.widget.dialog.SimpleDialogPanel;
import org.ovirt.engine.ui.common.widget.editor.EntityModelCellTable;
import org.ovirt.engine.ui.common.widget.editor.ListModelListBoxEditor;
import org.ovirt.engine.ui.common.widget.editor.generic.EntityModelCheckBoxEditor;
import org.ovirt.engine.ui.common.widget.editor.generic.StringEntityModelLabelEditor;
import org.ovirt.engine.ui.common.widget.editor.generic.StringEntityModelPasswordBoxEditor;
import org.ovirt.engine.ui.common.widget.editor.generic.StringEntityModelTextBoxEditor;
import org.ovirt.engine.ui.common.widget.editor.generic.StringEntityModelTextBoxOnlyEditor;
import org.ovirt.engine.ui.common.widget.label.EnableableFormLabel;
import org.ovirt.engine.ui.common.widget.renderer.EnumRenderer;
import org.ovirt.engine.ui.common.widget.renderer.NameRenderer;
import org.ovirt.engine.ui.common.widget.renderer.NullSafeRenderer;
import org.ovirt.engine.ui.common.widget.table.column.AbstractTextColumn;
import org.ovirt.engine.ui.uicommonweb.models.EntityModel;
import org.ovirt.engine.ui.uicommonweb.models.ListModel;
import org.ovirt.engine.ui.uicommonweb.models.vms.ImportSource;
import org.ovirt.engine.ui.uicommonweb.models.vms.ImportVmsModel;
import org.ovirt.engine.ui.uicompat.ConstantsManager;
import org.ovirt.engine.ui.webadmin.ApplicationConstants;
import org.ovirt.engine.ui.webadmin.gin.AssetProvider;
import org.ovirt.engine.ui.webadmin.section.main.presenter.popup.ImportVmsPopupPresenterWidget;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.shared.EventBus;
import com.google.gwt.safehtml.shared.SafeHtmlUtils;
import com.google.gwt.text.shared.AbstractRenderer;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.HasEnabled;
import com.google.inject.Inject;
public class ImportVmsPopupView extends AbstractModelBoundPopupView<ImportVmsModel> implements ImportVmsPopupPresenterWidget.ViewDef {
interface Driver extends UiCommonEditorDriver<ImportVmsModel, ImportVmsPopupView> { }
private final Driver driver = GWT.create(Driver.class);
interface ViewUiBinder extends UiBinder<SimpleDialogPanel, ImportVmsPopupView> {
ViewUiBinder uiBinder = GWT.create(ViewUiBinder.class);
}
@UiField(provided = true)
@Path("dataCenters.selectedItem")
@WithElementId
ListModelListBoxEditor<StoragePool> dataCentersEditor;
@UiField(provided = true)
@Path("importSources.selectedItem")
@WithElementId
ListModelListBoxEditor<ImportSource> importSourcesEditor;
@UiField(provided = true)
@Path("proxyHosts.selectedItem")
@WithElementId
ListModelListBoxEditor<VDS> proxyHostsEditor;
@UiField(provided = true)
VerticalSplitTable<ListModel<EntityModel<VM>>, EntityModel<VM>> vmsTable;
@Ignore
EntityModelCellTable<ListModel<EntityModel<VM>>> externalVms;
@Ignore
EntityModelCellTable<ListModel<EntityModel<VM>>> importedVms;
@UiField
@Ignore
FlowPanel exportPanel;
@UiField
UiCommandButton loadVmsFromExportDomainButton;
@UiField
UiCommandButton loadVmsFromVmwareButton;
@UiField
UiCommandButton loadOvaButton;
@UiField
UiCommandButton loadXenButton;
@UiField
UiCommandButton loadKvmButton;
@UiField(provided = true)
@Path("kvmProviders.selectedItem")
@WithElementId
ListModelListBoxEditor<Provider<KVMVmProviderProperties>> kvmProvidersEditor;
@UiField(provided = true)
@Path("xenProviders.selectedItem")
@WithElementId
ListModelListBoxEditor<Provider<XENVmProviderProperties>> xenProvidersEditor;
@UiField(provided = true)
@Path("vmwareProviders.selectedItem")
@WithElementId
ListModelListBoxEditor<Provider<VmwareVmProviderProperties>> vmwareProvidersEditor;
@Path("vmwareDatacenter.entity")
@WithElementId("vmwareDatacenter")
StringEntityModelTextBoxOnlyEditor vmwareDatacenterEditor;
@UiField(provided = true)
@Ignore
public EntityModelWidgetWithInfo vmwareDatacenterEditorWithInfo;
@UiField
@Path("esx.entity")
@WithElementId("esx")
StringEntityModelTextBoxEditor esxEditor;
@UiField
@Path("vCenter.entity")
@WithElementId("vCenter")
StringEntityModelTextBoxEditor vCenterEditor;
@UiField
@Path("vmwareCluster.entity")
@WithElementId("vmwareClusterEditor")
StringEntityModelTextBoxEditor vmwareClusterEditor;
@UiField(provided = true)
@Path("verify.entity")
@WithElementId("verify")
EntityModelCheckBoxEditor verifyEditor;
@UiField
@Path("username.entity")
@WithElementId("username")
StringEntityModelTextBoxEditor usernameEditor;
@UiField
@Path("password.entity")
@WithElementId("password")
StringEntityModelPasswordBoxEditor passwordEditor;
@UiField
@Ignore
FlowPanel vmwarePanel;
@UiField(provided = true)
@Path("hosts.selectedItem")
@WithElementId("hosts")
ListModelListBoxEditor<VDS> hostsEditor;
@UiField
@Path("ovaPath.entity")
@WithElementId("ovaPath")
StringEntityModelTextBoxEditor ovaPathEditor;
@Path("xenUri.entity")
@WithElementId("xenUri")
StringEntityModelTextBoxOnlyEditor xenUriEditor;
@UiField(provided = true)
@Ignore
public EntityModelWidgetWithInfo xenUriWithInfo;
@UiField(provided = true)
@Path("xenProxyHosts.selectedItem")
@WithElementId
ListModelListBoxEditor<VDS> xenProxyHostsEditor;
@Path("kvmUri.entity")
@WithElementId("kvmUri")
StringEntityModelTextBoxOnlyEditor kvmUriEditor;
@UiField(provided = true)
@Ignore
public EntityModelWidgetWithInfo kvmUriWithInfo;
@UiField(provided = true)
@Path("kvmRequiresAuthentication.entity")
@WithElementId("kvmRequiresAuthentication")
EntityModelCheckBoxEditor kvmRequiresAuthenticationEditor;
@UiField
@Path("kvmUsername.entity")
@WithElementId("kvmUsername")
StringEntityModelTextBoxEditor kvmUsernameEditor;
@UiField
@Path("kvmPassword.entity")
@WithElementId("kvmPassword")
StringEntityModelPasswordBoxEditor kvmPasswordEditor;
@UiField(provided = true)
@Path("kvmProxyHosts.selectedItem")
@WithElementId
ListModelListBoxEditor<VDS> kvmProxyHostsEditor;
@UiField
@Ignore
FlowPanel ovaPanel;
@UiField
@Ignore
FlowPanel xenPanel;
@UiField
@Ignore
FlowPanel kvmPanel;
@UiField
@Ignore
Row errorRow;
@UiField
@Ignore
Alert errorMessage;
@UiField
@Path("exportPath")
StringEntityModelLabelEditor exportDomainPath;
@UiField
@Path("exportName")
StringEntityModelLabelEditor exportDomainName;
@UiField
@Path("exportDescription")
StringEntityModelLabelEditor exportDomainDescription;
private static final ApplicationConstants constants = AssetProvider.getConstants();
private static final CommonApplicationTemplates templates = AssetProvider.getTemplates();
@Inject
public ImportVmsPopupView(EventBus eventBus) {
super(eventBus);
// Initialize Editors
verifyEditor = new EntityModelCheckBoxEditor(Align.RIGHT);
dataCentersEditor = new ListModelListBoxEditor<>(new NameRenderer<StoragePool>());
importSourcesEditor = new ListModelListBoxEditor<>(new NullSafeRenderer<ImportSource>() {
@Override
protected String renderNullSafe(ImportSource is) {
return new EnumRenderer<ImportSource>().render(is);
}
});
proxyHostsEditor = new ListModelListBoxEditor<>(new AbstractRenderer<VDS>() {
@Override
public String render(VDS object) {
return object != null ? object.getName() :
ConstantsManager.getInstance().getConstants().anyHostInDataCenter();
}
});
hostsEditor = new ListModelListBoxEditor<>(new NameRenderer<VDS>());
xenProxyHostsEditor = new ListModelListBoxEditor<>(new AbstractRenderer<VDS>() {
@Override
public String render(VDS object) {
return object != null ? object.getName() :
ConstantsManager.getInstance().getConstants().anyHostInDataCenter();
}
});
kvmProxyHostsEditor = new ListModelListBoxEditor<>(new AbstractRenderer<VDS>() {
@Override
public String render(VDS object) {
return object != null ? object.getName() :
ConstantsManager.getInstance().getConstants().anyHostInDataCenter();
}
});
vmwareProvidersEditor = new ListModelListBoxEditor<>(new AbstractRenderer<Provider<VmwareVmProviderProperties>>() {
@Override
public String render(Provider<VmwareVmProviderProperties> provider) {
return provider == null ? constants.customExternalProvider() : provider.getName();
}
});
kvmProvidersEditor = new ListModelListBoxEditor<>(new AbstractRenderer<Provider<KVMVmProviderProperties>>() {
@Override
public String render(Provider<KVMVmProviderProperties> provider) {
return provider == null ? constants.customExternalProvider() : provider.getName();
}
});
xenProvidersEditor = new ListModelListBoxEditor<>(new AbstractRenderer<Provider<XENVmProviderProperties>>() {
@Override
public String render(Provider<XENVmProviderProperties> provider) {
return provider == null ? constants.customExternalProvider() : provider.getName();
}
});
vmwareDatacenterEditor = new StringEntityModelTextBoxOnlyEditor();
EnableableFormLabel label = new EnableableFormLabel();
label.setText(constants.vmwareDataCenter());
vmwareDatacenterEditorWithInfo = new EntityModelWidgetWithInfo(label, vmwareDatacenterEditor);
vmwareDatacenterEditorWithInfo.setExplanation(templates.italicText(constants.dataCenterInfo()));
xenUriEditor = new StringEntityModelTextBoxOnlyEditor();
EnableableFormLabel xenUriLabel = new EnableableFormLabel();
xenUriLabel.setText(constants.xenUri());
xenUriWithInfo = new EntityModelWidgetWithInfo(xenUriLabel, xenUriEditor);
xenUriWithInfo.setExplanation(SafeHtmlUtils.fromString(constants.xenUriInfo()));
kvmUriEditor = new StringEntityModelTextBoxOnlyEditor();
EnableableFormLabel kvmUriLabel = new EnableableFormLabel();
kvmUriLabel.setText(constants.kvmUri());
kvmUriWithInfo = new EntityModelWidgetWithInfo(kvmUriLabel, kvmUriEditor);
kvmUriWithInfo.setExplanation(SafeHtmlUtils.fromString(constants.kvmUriInfo()));
kvmRequiresAuthenticationEditor = new EntityModelCheckBoxEditor(Align.RIGHT);
externalVms = new EntityModelCellTable<>(true, false, true);
importedVms = new EntityModelCellTable<>(true, false, true);
vmsTable =
new VerticalSplitTable<>(externalVms,
importedVms,
constants.externalVms(),
constants.importedVms());
initWidget(ViewUiBinder.uiBinder.createAndBindUi(this));
initEntityModelCellTables();
driver.initialize(this);
}
void initEntityModelCellTables() {
externalVms.addColumn(new AbstractTextColumn<EntityModel<VM>>() {
@Override
public String getValue(EntityModel<VM> externalVmModel) {
return externalVmModel.getEntity().getName();
}
}, constants.name());
importedVms.addColumn(new AbstractTextColumn<EntityModel<VM>>() {
@Override
public String getValue(EntityModel<VM> externalVmModel) {
return externalVmModel.getEntity().getName();
}
}, constants.name());
}
@Override
public void edit(final ImportVmsModel model) {
vmsTable.edit(
model.getExternalVmModels(),
model.getImportedVmModels(),
model.getAddImportCommand(),
model.getCancelImportCommand());
driver.edit(model);
model.getProblemDescription().getEntityChangedEvent().addListener((ev, object, args) -> updateErrorAndWarning(model));
updateErrorAndWarning(model);
updatePanelsVisibility(model);
model.getImportSources().getSelectedItemChangedEvent().addListener((ev, sender, args) -> updatePanelsVisibility(model));
loadVmsFromExportDomainButton.addClickHandler(event -> model.loadVmsFromExportDomain());
loadVmsFromVmwareButton.addClickHandler(event -> model.loadVmsFromVmware());
loadOvaButton.addClickHandler(event -> model.loadVmFromOva());
loadXenButton.addClickHandler(event -> model.loadVmsFromXen());
loadKvmButton.addClickHandler(event -> model.loadVmsFromKvm());
}
private void updateErrorAndWarning(ImportVmsModel model) {
errorRow.setVisible(false);
String message = model.getProblemDescription().getEntity();
if (message == null) {
return;
}
if (model.getProblemDescription().getIsValid()) {
errorMessage.setType(AlertType.WARNING);
} else {
errorMessage.setType(AlertType.DANGER);
}
errorMessage.setText(message);
errorRow.setVisible(true);
}
private void updatePanelsVisibility(ImportVmsModel model) {
exportPanel.setVisible(model.getImportSources().getSelectedItem() == ImportSource.EXPORT_DOMAIN);
vmwarePanel.setVisible(model.getImportSources().getSelectedItem() == ImportSource.VMWARE);
vmwareProvidersEditor.setVisible(model.getImportSources().getSelectedItem() == ImportSource.VMWARE);
ovaPanel.setVisible(model.getImportSources().getSelectedItem() == ImportSource.OVA);
xenPanel.setVisible(model.getImportSources().getSelectedItem() == ImportSource.XEN);
xenProvidersEditor.setVisible(model.getImportSources().getSelectedItem() == ImportSource.XEN);
kvmPanel.setVisible(model.getImportSources().getSelectedItem() == ImportSource.KVM);
kvmProvidersEditor.setVisible(model.getImportSources().getSelectedItem() == ImportSource.KVM);
}
@Override
public ImportVmsModel flush() {
return driver.flush();
}
@Override
public void cleanup() {
driver.cleanup();
}
@Override
public HasEnabled getLoadVmsFromExportDomainButton() {
return loadVmsFromExportDomainButton;
}
@Override
public HasEnabled getLoadVmsFromVmwareButton() {
return loadVmsFromVmwareButton;
}
@Override
public HasEnabled getLoadOvaButton() {
return loadOvaButton;
}
@Override
public HasEnabled getLoadXenButton() {
return loadXenButton;
}
@Override
public HasEnabled getLoadKvmButton() {
return loadKvmButton;
}
}