package org.ovirt.engine.ui.webadmin.section.main.view.popup.host; import org.ovirt.engine.core.common.action.VdsOperationActionParameters.AuthenticationMethod; import org.ovirt.engine.core.common.businessentities.HostedEngineDeployConfiguration; import org.ovirt.engine.core.common.businessentities.VDSStatus; import org.ovirt.engine.core.common.mode.ApplicationMode; import org.ovirt.engine.core.compat.RpmVersion; import org.ovirt.engine.core.compat.Version; 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.dialog.SimpleDialogPanel; import org.ovirt.engine.ui.common.widget.dialog.tab.DialogTab; import org.ovirt.engine.ui.common.widget.dialog.tab.DialogTabPanel; 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.StringEntityModelTextAreaLabelEditor; import org.ovirt.engine.ui.common.widget.editor.generic.StringEntityModelTextBoxEditor; import org.ovirt.engine.ui.common.widget.renderer.NullSafeRenderer; import org.ovirt.engine.ui.uicommonweb.models.ApplicationModeHelper; import org.ovirt.engine.ui.uicommonweb.models.hosts.InstallModel; 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.host.HostInstallPopupPresenterWidget; import org.ovirt.engine.ui.webadmin.widget.provider.HostNetworkProviderWidget; import com.google.gwt.core.client.GWT; import com.google.gwt.dom.client.Style.Visibility; import com.google.gwt.event.shared.EventBus; import com.google.gwt.resources.client.CssResource; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.RadioButton; import com.google.inject.Inject; /** * This is the dialog used to re-install a host. * <p/> * Take into account that it can be used both for a normal host an also for an bare metal hypervisor. In the first case * it will ask for the root password and in the second it will as for the location of the ISO image of the hypervisor. */ public class HostInstallPopupView extends AbstractModelBoundPopupView<InstallModel> implements HostInstallPopupPresenterWidget.ViewDef { interface Driver extends UiCommonEditorDriver<InstallModel, HostInstallPopupView> { } interface ViewUiBinder extends UiBinder<SimpleDialogPanel, HostInstallPopupView> { ViewUiBinder uiBinder = GWT.create(ViewUiBinder.class); } @UiField Style style; @UiField @Path(value = "userPassword.entity") StringEntityModelPasswordBoxEditor passwordEditor; @UiField @Path(value = "hostVersion.entity") StringEntityModelLabelEditor hostVersionEditor; @UiField(provided = true) @Path(value = "OVirtISO.selectedItem") ListModelListBoxEditor<RpmVersion> isoEditor; @UiField(provided = true) @Path(value = "overrideIpTables.entity") @WithElementId("overrideIpTables") EntityModelCheckBoxEditor overrideIpTablesEditor; @UiField(provided = true) @Path(value = "activateHostAfterInstall.entity") @WithElementId("activateHostAfterInstall") EntityModelCheckBoxEditor activateHostAfterInstallEditor; @UiField @Ignore Label authLabel; @UiField(provided = true) @Ignore @WithElementId("rbPublicKey") public RadioButton rbPublicKey; @UiField(provided = true) @Ignore @WithElementId("rbPassword") public RadioButton rbPassword; @UiField @Path(value = "userName.entity") @WithElementId("userName") StringEntityModelTextBoxEditor userNameEditor; @UiField(provided = true) @Path(value = "publicKey.entity") @WithElementId("publicKey") StringEntityModelTextAreaLabelEditor publicKeyEditor; @UiField @Ignore @WithElementId("networkProviderWidget") HostNetworkProviderWidget networkProviderWidget; @UiField @Ignore Label hostedEngineWarningLabel; @UiField @Path(value = "hostedEngineHostModel.selectedItem") ListModelListBoxEditor<HostedEngineDeployConfiguration.Action> hostedEngineDeployActionsEditor; @UiField @Ignore DialogTabPanel tabPanel; @UiField @Ignore DialogTab hostPopupGeneralTab; @UiField @Ignore DialogTab networkProviderTab; @UiField @Ignore DialogTab hostedEngineTab; private final Driver driver = GWT.create(Driver.class); private static final ApplicationConstants constants = AssetProvider.getConstants(); @Inject public HostInstallPopupView(EventBus eventBus) { super(eventBus); initEditors(); initWidget(ViewUiBinder.uiBinder.createAndBindUi(this)); hideLabels(); localize(); addStyles(); driver.initialize(this); applyModeCustomizations(); } private void hideLabels() { passwordEditor.hideLabel(); publicKeyEditor.hideLabel(); } private void applyModeCustomizations() { if (ApplicationModeHelper.getUiMode() == ApplicationMode.GlusterOnly) { networkProviderTab.setVisible(false); } } void initEditors() { isoEditor = new ListModelListBoxEditor<>(new NullSafeRenderer<RpmVersion>() { @Override public String renderNullSafe(RpmVersion version) { // Format string to contain major.minor version only. return version.getRpmName(); } }); rbPassword = new RadioButton("1"); //$NON-NLS-1$ rbPublicKey = new RadioButton("1"); //$NON-NLS-1$ publicKeyEditor = new StringEntityModelTextAreaLabelEditor(); activateHostAfterInstallEditor = new EntityModelCheckBoxEditor(Align.RIGHT); overrideIpTablesEditor = new EntityModelCheckBoxEditor(Align.RIGHT); } void localize() { hostVersionEditor.setLabel(constants.hostInstallHostVersionLabel()); isoEditor.setLabel(constants.hostInstallIsoLabel()); overrideIpTablesEditor.setLabel(constants.hostInstallOverrideIpTablesLabel()); activateHostAfterInstallEditor.setLabel(constants.activateHostAfterInstallLabel()); authLabel.setText(constants.hostPopupAuthLabel()); userNameEditor.setLabel(constants.hostPopupUsernameLabel()); publicKeyEditor.setTitle(constants.publicKeyUsage()); } @Override public void edit(final InstallModel model) { driver.edit(model); model.getPropertyChangedEvent().addListener((ev, sender, args) -> { InstallModel installModel = (InstallModel) sender; if ("ValidationFailed".equals(args.propertyName)) { //$NON-NLS-1$ if (installModel.getValidationFailed().getEntity() != null && installModel.getValidationFailed().getEntity()) { tabPanel.switchTab(hostPopupGeneralTab); } } }); boolean installedFailed = model.getVds().getStatus() == VDSStatus.InstallFailed; model.setAuthenticationMethod(installedFailed ? AuthenticationMethod.Password: AuthenticationMethod.PublicKey); displayPasswordField(installedFailed); rbPassword.setValue(installedFailed); rbPublicKey.setValue(!installedFailed); rbPassword.addValueChangeHandler(event -> { model.setAuthenticationMethod(AuthenticationMethod.Password); displayPasswordField(true); }); rbPublicKey.addValueChangeHandler(event -> { model.setAuthenticationMethod(AuthenticationMethod.PublicKey); displayPasswordField(false); }); // TODO: remove setIsChangeable when configured ssh username is enabled userNameEditor.setEnabled(false); networkProviderWidget.edit(model.getNetworkProviderModel()); if (model.getVds().isOvirtVintageNode()) { networkProviderTab.setVisible(false); } hostedEngineWarningLabel.setVisible(model.getVds().getClusterCompatibilityVersion().less(Version.v4_0)); } private void displayPasswordField(boolean isPasswordVisible) { if (isPasswordVisible) { passwordEditor.getElement().getStyle().setVisibility(Visibility.VISIBLE); publicKeyEditor.getElement().getStyle().setVisibility(Visibility.HIDDEN); } else { passwordEditor.getElement().getStyle().setVisibility(Visibility.HIDDEN); publicKeyEditor.getElement().getStyle().setVisibility(Visibility.VISIBLE); } } @Override public InstallModel flush() { networkProviderWidget.flush(); return driver.flush(); } @Override public void cleanup() { networkProviderWidget.cleanup(); driver.cleanup(); } @Override public void focusInput() { // We are trusting the model to decide which of the two alternatives of // the dialog (for a normal host or for a bare metal hypervisor): if (passwordEditor.isAccessible()) { passwordEditor.setFocus(true); } if (isoEditor.isAccessible()) { isoEditor.setFocus(true); } } interface Style extends CssResource { String pkStyle(); } private void addStyles() { publicKeyEditor.setCustomStyle(style.pkStyle()); } }