package org.ovirt.engine.ui.webadmin.section.main.view.popup.host;
import java.util.Comparator;
import org.gwtbootstrap3.client.ui.Button;
import org.gwtbootstrap3.client.ui.Column;
import org.gwtbootstrap3.client.ui.Container;
import org.gwtbootstrap3.client.ui.Row;
import org.gwtbootstrap3.client.ui.constants.ColumnSize;
import org.ovirt.engine.core.common.action.VdsOperationActionParameters.AuthenticationMethod;
import org.ovirt.engine.core.common.businessentities.Cluster;
import org.ovirt.engine.core.common.businessentities.ExternalEntityBase;
import org.ovirt.engine.core.common.businessentities.ExternalHostGroup;
import org.ovirt.engine.core.common.businessentities.HostedEngineDeployConfiguration;
import org.ovirt.engine.core.common.businessentities.OpenstackNetworkProviderProperties;
import org.ovirt.engine.core.common.businessentities.Provider;
import org.ovirt.engine.core.common.businessentities.VDS;
import org.ovirt.engine.core.common.mode.ApplicationMode;
import org.ovirt.engine.ui.common.CommonApplicationMessages;
import org.ovirt.engine.ui.common.editor.UiCommonEditorDriver;
import org.ovirt.engine.ui.common.idhandler.ElementIdHandler;
import org.ovirt.engine.ui.common.idhandler.WithElementId;
import org.ovirt.engine.ui.common.view.popup.AbstractTabbedModelBoundPopupView;
import org.ovirt.engine.ui.common.widget.Align;
import org.ovirt.engine.ui.common.widget.VisibilityRenderer;
import org.ovirt.engine.ui.common.widget.dialog.AdvancedParametersExpander;
import org.ovirt.engine.ui.common.widget.dialog.InfoIcon;
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.GroupedListModelListBox;
import org.ovirt.engine.ui.common.widget.editor.GroupedListModelListBoxEditor;
import org.ovirt.engine.ui.common.widget.editor.ListModelListBoxEditor;
import org.ovirt.engine.ui.common.widget.editor.ListModelMultipleSelectListBoxEditor;
import org.ovirt.engine.ui.common.widget.editor.ListModelTypeAheadListBoxEditor;
import org.ovirt.engine.ui.common.widget.editor.generic.EntityModelCheckBoxEditor;
import org.ovirt.engine.ui.common.widget.editor.generic.EntityModelRadioButtonEditor;
import org.ovirt.engine.ui.common.widget.editor.generic.IntegerEntityModelTextBoxEditor;
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.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.uicommonweb.UICommand;
import org.ovirt.engine.ui.uicommonweb.models.ApplicationModeHelper;
import org.ovirt.engine.ui.uicommonweb.models.EntityModel;
import org.ovirt.engine.ui.uicommonweb.models.TabName;
import org.ovirt.engine.ui.uicommonweb.models.hosts.HostModel;
import org.ovirt.engine.ui.uicompat.ConstantsManager;
import org.ovirt.engine.ui.uicompat.EventArgs;
import org.ovirt.engine.ui.uicompat.IEventListener;
import org.ovirt.engine.ui.webadmin.ApplicationConstants;
import org.ovirt.engine.ui.webadmin.ApplicationResources;
import org.ovirt.engine.ui.webadmin.ApplicationTemplates;
import org.ovirt.engine.ui.webadmin.gin.AssetProvider;
import org.ovirt.engine.ui.webadmin.section.main.presenter.popup.host.HostPopupPresenterWidget;
import org.ovirt.engine.ui.webadmin.widget.host.FenceAgentsEditor;
import org.ovirt.engine.ui.webadmin.widget.host.HostProxySourceEditor;
import org.ovirt.engine.ui.webadmin.widget.provider.HostNetworkProviderWidget;
import com.google.gwt.core.client.GWT;
import com.google.gwt.core.client.Scheduler;
import com.google.gwt.dom.client.Element;
import com.google.gwt.dom.client.Style.TextDecoration;
import com.google.gwt.dom.client.Style.Visibility;
import com.google.gwt.event.dom.client.HasClickHandlers;
import com.google.gwt.event.shared.EventBus;
import com.google.gwt.resources.client.CssResource;
import com.google.gwt.safehtml.shared.SafeHtmlUtils;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.user.client.ui.Anchor;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.RadioButton;
import com.google.gwt.user.client.ui.SimplePanel;
import com.google.inject.Inject;
public class HostPopupView extends AbstractTabbedModelBoundPopupView<HostModel> implements HostPopupPresenterWidget.ViewDef {
interface Driver extends UiCommonEditorDriver<HostModel, HostPopupView> {
}
interface ViewUiBinder extends UiBinder<SimpleDialogPanel, HostPopupView> {
ViewUiBinder uiBinder = GWT.create(ViewUiBinder.class);
}
interface ViewIdHandler extends ElementIdHandler<HostPopupView> {
ViewIdHandler idHandler = GWT.create(ViewIdHandler.class);
}
@UiField
DialogTabPanel tabPanel;
@UiField
Style style;
@UiField
@WithElementId
DialogTab generalTab;
@UiField
@WithElementId
DialogTab powerManagementTab;
@UiField(provided = true)
@Path(value = "cluster.selectedItem")
@WithElementId("cluster")
GroupedListModelListBoxEditor<Cluster> clusterEditor;
@UiField
@Path(value = "name.entity")
@WithElementId("name")
StringEntityModelTextBoxEditor nameEditor;
@UiField
@Path(value = "userName.entity")
@WithElementId("userName")
StringEntityModelTextBoxEditor userNameEditor;
@UiField
@Path(value = "fetchSshFingerprint.entity")
@WithElementId("fetchSshFingerprint")
StringEntityModelTextBoxEditor fetchSshFingerprint;
@UiField
@Ignore
@WithElementId("fetchResult")
Label fetchResult;
@UiField
@Path(value = "comment.entity")
@WithElementId("comment")
StringEntityModelTextBoxEditor commentEditor;
@UiField
@Path(value = "providerSearchFilter.entity")
@WithElementId("providerSearchFilter")
StringEntityModelTextBoxEditor providerSearchFilterEditor;
@UiField(provided = true)
@Path(value = "externalHostName.selectedItem")
@WithElementId("externalHostName")
ListModelListBoxEditor<VDS> externalHostNameEditor;
@UiField(provided = true)
@Path(value = "providers.selectedItem")
@WithElementId("providers")
ListModelListBoxEditor<Provider<OpenstackNetworkProviderProperties>> providersEditor;
@UiField
Row searchProviderRow;
@UiField
FlowPanel discoveredHostPanel;
@UiField(provided = true)
@Path(value = "externalDiscoveredHosts.selectedItem")
@WithElementId("externalDiscoveredHosts")
ListModelTypeAheadListBoxEditor<ExternalEntityBase> externalDiscoveredHostsEditor;
@UiField(provided = true)
@Path(value = "externalHostGroups.selectedItem")
@WithElementId("externalHostGroups")
ListModelTypeAheadListBoxEditor<ExternalEntityBase> externalHostGroupsEditor;
@UiField(provided = true)
@Path(value = "externalComputeResource.selectedItem")
@WithElementId("externalComputeResource")
ListModelTypeAheadListBoxEditor<ExternalEntityBase> externalComputeResourceEditor;
@UiField
@Path(value = "host.entity")
@WithElementId("host")
StringEntityModelTextBoxEditor hostAddressEditor;
@UiField
@Path(value = "authSshPort.entity")
@WithElementId("authSshPort")
IntegerEntityModelTextBoxEditor authSshPortEditor;
@UiField
@Path(value = "userPassword.entity")
@WithElementId("userPassword")
StringEntityModelPasswordBoxEditor passwordEditor;
@UiField(provided = true)
@Path(value = "publicKey.entity")
@WithElementId("publicKey")
StringEntityModelTextAreaLabelEditor publicKeyEditor;
@UiField(provided = true)
@Path(value = "overrideIpTables.entity")
@WithElementId("overrideIpTables")
EntityModelCheckBoxEditor overrideIpTablesEditor;
@UiField(provided = true)
@Path(value = "isPm.entity")
@WithElementId("isPm")
EntityModelCheckBoxEditor pmEnabledEditor;
@Path(value = "fenceAgentListModel")
@UiField(provided = true)
final FenceAgentsEditor fenceAgentsEditor;
@Path(value = "pmProxyPreferencesList")
@UiField(provided = true)
HostProxySourceEditor proxySourceEditor;
@UiField
@Ignore
AdvancedParametersExpander pmExpander;
@UiField
@Ignore
FlowPanel pmExpanderContent;
@UiField(provided = true)
@Path(value = "externalHostProviderEnabled.entity")
@WithElementId("externalHostProviderEnabled")
EntityModelCheckBoxEditor externalHostProviderEnabledEditor;
@UiField(provided = true)
@Path(value = "disableAutomaticPowerManagement.entity")
@WithElementId("disableAutomaticPowerManagementEditor")
EntityModelCheckBoxEditor disableAutomaticPowerManagementEditor;
@UiField(provided = true)
@Path(value = "pmKdumpDetection.entity")
@WithElementId("pmKdumpDetection")
EntityModelCheckBoxEditor pmKdumpDetectionEditor;
@UiField
@Ignore
SimplePanel fetchPanel;
@UiField
Image updateHostsButton;
@UiField
@Ignore
DialogTab spmTab;
@UiField
@Ignore
DialogTab consoleTab;
@UiField
@Ignore
DialogTab networkProviderTab;
@UiField
@Ignore
Container spmContainer;
@UiField
@Ignore
DialogTab hostedEngineTab;
@UiField
@Path(value = "hostedEngineWarning.entity")
Label hostedEngineWarningLabel;
@UiField(provided=true)
@Path(value = "hostedEngineHostModel.selectedItem")
ListModelListBoxEditor<HostedEngineDeployConfiguration.Action> hostedEngineDeployActionsEditor;
@UiField
@Path(value = "pkSection.entity")
@WithElementId("pkSection")
Row pkSection;
@UiField
@Path(value = "passwordSection.entity")
@WithElementId("passwordSection")
Row passwordSection;
@UiField
@Path(value = "provisionedHostSection.entity")
@WithElementId
Column provisionedHostSection;
@UiField
@Path(value = "discoveredHostSection.entity")
@WithElementId
Column discoveredHostSection;
@UiField(provided = true)
@Ignore
@WithElementId("rbPublicKey")
public RadioButton rbPublicKey;
@UiField
@Ignore
public Label rbPublicKeyLabel;
@UiField(provided = true)
@Ignore
@WithElementId("rbPassword")
public RadioButton rbPassword;
@UiField
@Ignore
public Label rbPasswordLabel;
@UiField(provided = true)
@Ignore
@WithElementId
public EntityModelRadioButtonEditor rbProvisionedHost;
@UiField(provided = true)
@Ignore
@WithElementId
public EntityModelRadioButtonEditor rbDiscoveredHost;
@UiField
@Ignore
Label authLabel;
@UiField
@Ignore
Label rootPasswordLabel;
@UiField
@Ignore
Label fingerprintLabel;
@UiField(provided = true)
@Ignore
InfoIcon consoleAddressInfoIcon;
@UiField(provided = true)
@Ignore
InfoIcon discoveredHostInfoIcon;
@UiField(provided = true)
@Ignore
InfoIcon provisionedHostInfoIcon;
@UiField
@Path(value = "consoleAddress.entity")
@WithElementId
StringEntityModelTextBoxEditor consoleAddress;
@UiField
@Path(value = "providerSearchFilterLabel.entity")
EnableableFormLabel providerSearchFilterLabel;
@UiField(provided = true)
@Path(value = "consoleAddressEnabled.entity")
EntityModelCheckBoxEditor consoleAddressEnabled;
@UiField(provided = true)
InfoIcon providerSearchInfoIcon;
@UiField
@Ignore
HostNetworkProviderWidget networkProviderWidget;
@UiField
@Ignore
AdvancedParametersExpander expander;
@UiField
@Ignore
Column expanderContent;
@UiField
@Ignore
DialogTab kernelTab;
@UiField
@Path("currentKernelCmdLine.entity")
Label currentKernelCmdLine;
@UiField(provided = true)
@Path("kernelCmdlineIommu.entity")
EntityModelCheckBoxEditor kernelCmdlineIommu;
@UiField
InfoIcon kernelCmdlineIommuInfoIcon;
@UiField(provided = true)
@Path("kernelCmdlineKvmNested.entity")
EntityModelCheckBoxEditor kernelCmdlineKvmNested;
@UiField
InfoIcon kernelCmdlineKvmNestedInfoIcon;
@UiField(provided = true)
@Path("kernelCmdlineUnsafeInterrupts.entity")
EntityModelCheckBoxEditor kernelCmdlineUnsafeInterrupts;
@UiField
InfoIcon kernelCmdlineUnsafeInterruptsInfoIcon;
@UiField(provided = true)
@Path("kernelCmdlinePciRealloc.entity")
EntityModelCheckBoxEditor kernelCmdlinePciRealloc;
@UiField
InfoIcon kernelCmdlinePciReallocInfoIcon;
@UiField
@Path("kernelCmdline.entity")
StringEntityModelLabelEditor kernelCmdlineText;
@UiField
InfoIcon kernelCmdlineInfoIcon;
@UiField
@Ignore
Button kernelCmdlineResetButton;
@UiField(provided = true)
@Path(value = "labelList.selectedItems")
@WithElementId("labelList")
public ListModelMultipleSelectListBoxEditor<org.ovirt.engine.core.common.businessentities.Label> labelEditor;
private final Driver driver = GWT.create(Driver.class);
private static final ApplicationTemplates templates = AssetProvider.getTemplates();
private static final ApplicationResources resources = AssetProvider.getResources();
private static final ApplicationConstants constants = AssetProvider.getConstants();
private static final CommonApplicationMessages messages = AssetProvider.getMessages();
@Inject
public HostPopupView(EventBus eventBus, FenceAgentsEditor fenceAgentEditor,
HostProxySourceEditor proxySourceEditor) {
super(eventBus);
this.fenceAgentsEditor = fenceAgentEditor;
this.proxySourceEditor = proxySourceEditor;
initEditors();
initInfoIcon();
initWidget(ViewUiBinder.uiBinder.createAndBindUi(this));
hideEditorLabels();
initExpander();
ViewIdHandler.idHandler.generateAndSetIds(this);
localize();
addStyles();
driver.initialize(this);
applyModeCustomizations();
}
private void hideEditorLabels() {
providersEditor.hideLabel();
passwordEditor.hideLabel();
publicKeyEditor.hideLabel();
consoleAddress.hideLabel();
kernelCmdlineText.hideLabel();
}
private void initInfoIcon() {
consoleAddressInfoIcon =
new InfoIcon(templates.italicText(constants.enableConsoleAddressOverrideHelpMessage()));
providerSearchInfoIcon =
new InfoIcon(templates.italicText(constants.providerSearchInfo()));
provisionedHostInfoIcon =
new InfoIcon(templates.italicText(constants.provisionedHostInfo()));
discoveredHostInfoIcon =
new InfoIcon(templates.italicText(constants.discoveredHostInfoIcon()));
}
private void addStyles() {
providerSearchFilterEditor.addContentWidgetContainerStyleName(style.searchFilter());
providerSearchFilterEditor.hideLabel();
}
private void initEditors() {
publicKeyEditor = new StringEntityModelTextAreaLabelEditor();
// List boxes
clusterEditor = new GroupedListModelListBoxEditor<>(new GroupedListModelListBox<Cluster>(new NameRenderer<Cluster>()) {
@Override
public String getModelLabel(Cluster model) {
return model.getName();
}
@Override
public String getGroupLabel(Cluster model) {
return messages.hostDataCenter(model.getStoragePoolName());
}
public Comparator<Cluster> getComparator() {
return new DataCenterClusterComparator();
}
/**
* Comparator that sorts on data center name first, and then cluster name. Ignoring case.
*/
final class DataCenterClusterComparator implements Comparator<Cluster> {
@Override
public int compare(Cluster cluster1, Cluster cluster2) {
if (cluster1.getStoragePoolName() != null && cluster2.getStoragePoolName() == null) {
return -1;
} else if (cluster2.getStoragePoolName() != null && cluster1.getStoragePoolName() == null) {
return 1;
} else if (cluster1.getStoragePoolName() == null && cluster2.getStoragePoolName() == null) {
return 0;
}
if (cluster1.getStoragePoolName().equals(cluster2.getStoragePoolName())) {
return cluster1.getName().compareToIgnoreCase(cluster2.getName());
} else {
return cluster1.getStoragePoolName().compareToIgnoreCase(cluster2.getStoragePoolName());
}
}
}
});
externalHostNameEditor = new ListModelListBoxEditor<>(new NameRenderer<VDS>());
providersEditor = new ListModelListBoxEditor<>(new NameRenderer<Provider<OpenstackNetworkProviderProperties>>());
externalDiscoveredHostsEditor = getListModelTypeAheadListBoxEditor();
externalHostGroupsEditor = getListModelTypeAheadListBoxEditor();
externalComputeResourceEditor = getListModelTypeAheadListBoxEditor();
labelEditor = new ListModelMultipleSelectListBoxEditor<>(new NameRenderer<org.ovirt.engine.core.common.businessentities.Label>(),
new VisibilityRenderer.SimpleVisibilityRenderer());
// Check boxes
pmEnabledEditor = new EntityModelCheckBoxEditor(Align.RIGHT);
pmEnabledEditor.setUsePatternFly(true);
pmKdumpDetectionEditor = new EntityModelCheckBoxEditor(Align.RIGHT);
pmKdumpDetectionEditor.setUsePatternFly(true);
disableAutomaticPowerManagementEditor = new EntityModelCheckBoxEditor(Align.RIGHT);
disableAutomaticPowerManagementEditor.setUsePatternFly(true);
externalHostProviderEnabledEditor = new EntityModelCheckBoxEditor(Align.RIGHT);
overrideIpTablesEditor = new EntityModelCheckBoxEditor(Align.RIGHT);
rbPassword = new RadioButton("1"); //$NON-NLS-1$
rbPublicKey = new RadioButton("1"); //$NON-NLS-1$
rbDiscoveredHost = new EntityModelRadioButtonEditor("2"); //$NON-NLS-1$
rbProvisionedHost = new EntityModelRadioButtonEditor("2"); //$NON-NLS-1$
kernelCmdlineIommu = new EntityModelCheckBoxEditor(Align.RIGHT);
kernelCmdlineKvmNested = new EntityModelCheckBoxEditor(Align.RIGHT);
kernelCmdlineUnsafeInterrupts = new EntityModelCheckBoxEditor(Align.RIGHT);
kernelCmdlinePciRealloc = new EntityModelCheckBoxEditor(Align.RIGHT);
consoleAddressEnabled = new EntityModelCheckBoxEditor(Align.RIGHT);
hostedEngineDeployActionsEditor = new ListModelListBoxEditor<>(new EnumRenderer<HostedEngineDeployConfiguration.Action>());
}
private ListModelTypeAheadListBoxEditor<ExternalEntityBase> getListModelTypeAheadListBoxEditor() {
return new ListModelTypeAheadListBoxEditor<>(
new ListModelTypeAheadListBoxEditor.NullSafeSuggestBoxRenderer<ExternalEntityBase>() {
@Override
public String getReplacementStringNullSafe(ExternalEntityBase data) {
return data.getName();
}
@Override
public String getDisplayStringNullSafe(ExternalEntityBase data) {
return typeAheadNameDescriptionTemplateNullSafe(
data.getName(),
data.getDescription()
);
}
});
}
private String typeAheadNameDescriptionTemplateNullSafe(String name, String description) {
return templates.typeAheadNameDescription(
name != null ? name : constants.empty(),
description != null ? description : constants.empty())
.asString();
}
void localize() {
// General tab
generalTab.setLabel(constants.hostPopupGeneralTabLabel());
clusterEditor.setLabel(constants.hostPopupClusterLabel());
nameEditor.setLabel(constants.hostPopupNameLabel());
userNameEditor.setLabel(constants.hostPopupUsernameLabel());
commentEditor.setLabel(constants.commentLabel());
labelEditor.setLabel(constants.affinityLabels());
hostAddressEditor.setLabel(constants.hostPopupHostAddressLabel());
authSshPortEditor.setLabel(constants.hostPopupPortLabel());
authLabel.setText(constants.hostPopupAuthLabel());
rootPasswordLabel.setText(constants.hostPopupAuthLabelForExternalHost());
rbPasswordLabel.setText(constants.hostPopupPasswordLabel());
rbPublicKeyLabel.setText(constants.hostPopupPublicKeyLabel());
fingerprintLabel.setText(constants.hostPopupHostFingerprintLabel());
overrideIpTablesEditor.setLabel(constants.hostPopupOverrideIpTablesLabel());
externalHostProviderEnabledEditor.setLabel(constants.hostPopupEnableExternalHostProvider());
externalHostNameEditor.setLabel(constants.hostPopupExternalHostName());
publicKeyEditor.setTitle(constants.publicKeyUsage());
// Power Management tab
powerManagementTab.setLabel(constants.hostPopupPowerManagementTabLabel());
pmEnabledEditor.setLabel(constants.hostPopupPmEnabledLabel());
// Auto PM
disableAutomaticPowerManagementEditor.setLabel(constants.hostPopupPmDisableAutoPM());
pmKdumpDetectionEditor.setLabel(constants.hostPopupPmKdumpDetection());
// SPM tab
spmTab.setLabel(constants.spmTestButtonLabel());
consoleTab.setLabel(constants.consoleButtonLabel());
// Network Provider Tab
networkProviderTab.setLabel(constants.networkProviderButtonLabel());
externalDiscoveredHostsEditor.setLabel(constants.discoveredHostsLabel());
externalHostGroupsEditor.setLabel(constants.hostGroupsLabel());
externalComputeResourceEditor.setLabel(constants.computeResourceLabel());
// Info icons
kernelCmdlineUnsafeInterruptsInfoIcon.setText(
SafeHtmlUtils.fromString(constants.kernelCmdlineUnsafeInterruptsInfoIcon()));
kernelCmdlineIommuInfoIcon.setText(SafeHtmlUtils.fromString(constants.kernelCmdlineIommuInfoIcon()));
kernelCmdlineKvmNestedInfoIcon.setText(SafeHtmlUtils.fromString(constants.kernelCmdlineKvmNestedInfoIcon()));
kernelCmdlinePciReallocInfoIcon.setText(SafeHtmlUtils.fromString(constants.kernelCmdlinePciReallocInfoIcon()));
kernelCmdlineInfoIcon.setText(SafeHtmlUtils.fromString(constants.kernelCmdlineInfoIcon()));
}
private void applyModeCustomizations() {
if (ApplicationModeHelper.getUiMode() == ApplicationMode.GlusterOnly) {
spmTab.setVisible(false);
powerManagementTab.setVisible(false);
consoleTab.setVisible(false);
networkProviderTab.setVisible(false);
}
}
@Override
public void edit(final HostModel object) {
driver.edit(object);
setTabIndexes(0);
object.getFetchResult().getEntityChangedEvent().addListener((ev, sender, args) -> {
String fetchResultText = object.getFetchResult().getEntity();
if (ConstantsManager.getInstance().getConstants().errorLoadingFingerprint().equals(fetchResultText)) {
fetchResult.addStyleName(style.fetchResultErrorLabel());
} else {
fetchResult.removeStyleName(style.fetchResultErrorLabel());
}
fetchResult.setText(fetchResultText);
});
object.getPkSection().getPropertyChangedEvent().addListener((ev, sender, args) -> {
if ("IsAvailable".equals(args.propertyName)) { //$NON-NLS-1$
setPkPasswordSectionVisiblity(false);
}
});
object.getProviders().getSelectedItemChangedEvent().addListener((ev, sender, args) -> object.updateHosts());
object.getExternalHostProviderEnabled().getEntityChangedEvent().addListener((ev, sender, args) -> {
boolean showForemanProviders = object.getExternalHostProviderEnabled().getEntity();
boolean doProvisioning = object.externalProvisionEnabled();
providersEditor.setVisible(showForemanProviders);
// showing or hiding radio buttons
provisionedHostSection.setVisible(showForemanProviders && doProvisioning);
discoveredHostSection.setVisible(showForemanProviders && doProvisioning);
// disabling ip and name textbox when using provisioned hosts
hostAddressEditor.setEnabled(!(showForemanProviders && doProvisioning));
if (showForemanProviders && doProvisioning) {
object.updateHosts();
object.getIsDiscoveredHosts().setEntity(true);
} else {
if (doProvisioning) {
object.cleanHostParametersFields();
}
hideProviderWidgets(object);
object.getIsDiscoveredHosts().setEntity(null);
}
});
object.getIsDiscoveredHosts().getEntityChangedEvent().addListener((ev, sender, args) -> {
if (object.getIsDiscoveredHosts().getEntity() != null) {
if (object.getIsDiscoveredHosts().getEntity()) {
rbDiscoveredHost.asRadioButton().setValue(true);
showDiscoveredHostsWidgets(true);
} else if (!object.getIsDiscoveredHosts().getEntity()) {
rbProvisionedHost.asRadioButton().setValue(true);
showProvisionedHostsWidgets(true);
}
}
});
nameEditor.asValueBox().addKeyDownHandler(event -> Scheduler.get().scheduleDeferred(() -> {
if (object.getExternalHostProviderEnabled().getEntity() &&
Boolean.TRUE.equals(object.getIsDiscoveredHosts().getEntity())) {
ExternalHostGroup dhg =
(ExternalHostGroup) object.getExternalHostGroups().getSelectedItem();
if (dhg != null) {
String base = nameEditor.asEditor().getSubEditor().getValue();
if (base == null) {
base = constants.empty();
}
String generatedHostName = base + "." + //$NON-NLS-1$
(dhg.getDomainName() != null ? dhg.getDomainName() : constants.empty());
object.getHost().setEntity(generatedHostName);
}
}
}));
rbPassword.setValue(true);
rbPassword.setFocus(true);
displayPassPkWindow(true);
fetchSshFingerprint.hideLabel();
object.setAuthenticationMethod(AuthenticationMethod.Password);
rbPassword.addFocusHandler(event -> {
object.setAuthenticationMethod(AuthenticationMethod.Password);
displayPassPkWindow(true);
});
rbPublicKey.addFocusHandler(event -> {
object.setAuthenticationMethod(AuthenticationMethod.PublicKey);
displayPassPkWindow(false);
});
updateHostsButton.setResource(resources.searchButtonImage());
// Create SPM related controls.
IEventListener<EventArgs> spmListener = (ev, sender, args) -> createSpmControls(object);
object.getSpmPriority().getItemsChangedEvent().addListener(spmListener);
object.getSpmPriority().getSelectedItemChangedEvent().addListener(spmListener);
createSpmControls(object);
initExternalHostProviderWidgets(object.showExternalProviderPanel());
// TODO: remove setIsChangeable when configured ssh username is enabled
userNameEditor.setEnabled(false);
networkProviderTab.setVisible(object.showNetworkProviderTab());
networkProviderWidget.edit(object.getNetworkProviderModel());
this.fenceAgentsEditor.edit(object.getFenceAgentListModel());
this.proxySourceEditor.edit(object.getPmProxyPreferencesList());
addTextAndLinkAlert(fetchPanel, constants.fetchingHostFingerprint(), object.getSSHFingerPrint());
providerSearchFilterLabel.setText(constants.hostPopupProviderSearchFilter());
nameEditor.setFocus(true);
hostedEngineTab.setVisible(object.getIsHeSystem() && object.getIsNew());
object.getHostedEngineWarning().getPropertyChangedEvent().addListener((ev, sender, args) -> {
EntityModel entity = (EntityModel) sender;
if ("IsAvailable".equals(args.propertyName)) { //$NON-NLS-1$
hostedEngineWarningLabel.setVisible(entity.getIsAvailable());
}
});
}
private void showDiscoveredHostsWidgets(boolean enabled) {
usualFormToDiscover(enabled);
showExternalDiscoveredHost(enabled);
setHostProviderVisibility(!enabled);
}
private void showProvisionedHostsWidgets(boolean enabled) {
usualFormToDiscover(!enabled);
showExternalDiscoveredHost(!enabled);
setHostProviderVisibility(enabled);
}
private void hideProviderWidgets(final HostModel object) {
rbProvisionedHost.asRadioButton().setValue(false);
rbDiscoveredHost.asRadioButton().setValue(false);
usualFormToDiscover(false);
showExternalDiscoveredHost(false);
setHostProviderVisibility(false);
}
private void initExternalHostProviderWidgets(boolean isAvailable) {
// When the widgets should be enabled, only the "enable/disable" one should appear.
// All the rest shouldn't be visible
externalHostProviderEnabledEditor.setVisible(isAvailable);
provisionedHostSection.setVisible(false);
discoveredHostSection.setVisible(false);
providersEditor.setVisible(false);
showExternalDiscoveredHost(false);
setHostProviderVisibility(false);
}
private void displayPassPkWindow(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);
}
}
private void initExpander() {
expander.initWithContent(expanderContent.getElement());
pmExpander.initWithContent(pmExpanderContent.getElement());
}
private void showExternalDiscoveredHost(boolean enabled) {
discoveredHostPanel.setVisible(enabled);
}
private void usualFormToDiscover(boolean isDiscovered) {
if (isDiscovered) {
authLabel.setVisible(false);
rootPasswordLabel.setVisible(true);
} else {
rootPasswordLabel.setVisible(false);
authLabel.setVisible(true);
displayPassPkWindow(true);
}
rbPublicKey.setVisible(!isDiscovered);
rbPublicKeyLabel.setVisible(!isDiscovered);
rbPassword.setVisible(!isDiscovered);
rbPasswordLabel.setVisible(!isDiscovered);
publicKeyEditor.setVisible(!isDiscovered);
authSshPortEditor.setVisible(!isDiscovered);
userNameEditor.setVisible(!isDiscovered);
}
private void createSpmControls(final HostModel object) {
Row labelRow = (Row) spmContainer.getWidget(0);
spmContainer.clear();
spmContainer.add(labelRow);
Iterable<?> items = object.getSpmPriority().getItems();
if (items == null) {
return;
}
// Recreate SPM related controls.
for (Object item : items) {
@SuppressWarnings("unchecked")
final EntityModel<Integer> model = (EntityModel<Integer>) item;
RadioButton rb = new RadioButton("spm"); // $//$NON-NLS-1$
rb.setText(model.getTitle());
Element labelElement = (Element)rb.getElement().getChild(1);
labelElement.addClassName(style.patternFlyRadio());
rb.setValue(object.getSpmPriority().getSelectedItem() == model);
rb.addValueChangeHandler(e -> object.getSpmPriority().setSelectedItem(model));
Row row = new Row();
Column column = new Column(ColumnSize.LG_12, rb);
row.add(column);
spmContainer.add(row);
}
}
@Override
public HostModel flush() {
networkProviderWidget.flush();
fenceAgentsEditor.flush();
proxySourceEditor.flush();
return driver.flush();
}
@Override
public void cleanup() {
driver.cleanup();
}
@Override
public void focusInput() {
nameEditor.setFocus(true);
}
@Override
public HasClickHandlers getUpdateHostsButton() {
return updateHostsButton;
}
@Override
public void showPowerManagement() {
getTabPanel().switchTab(powerManagementTab);
}
/**
* Create a widget containing text and a link that triggers the execution of a command.
*
* @param view
* the view where the alert should be added
* @param text
* the text content of the alert
* @param command
* the command that should be executed when the link is clicked
*/
private void addTextAndLinkAlert(SimplePanel view, final String text, final UICommand command) {
// Find the open and close positions of the link within the message:
final int openIndex = text.indexOf("<a>"); //$NON-NLS-1$
final int closeIndex = text.indexOf("</a>"); //$NON-NLS-1$
if (openIndex == -1 || closeIndex == -1 || closeIndex < openIndex) {
return;
}
// Extract the text before, inside and after the tags:
final String beforeText = text.substring(0, openIndex);
final String betweenText = text.substring(openIndex + 3, closeIndex);
final String afterText = text.substring(closeIndex + 4);
// Create a flow panel containing the text and the link:
final FlowPanel alertPanel = new FlowPanel();
// Create the label for the text before the tag:
final Label beforeLabel = new Label(beforeText);
beforeLabel.getElement().getStyle().setProperty("display", "inline"); //$NON-NLS-1$ //$NON-NLS-2$
alertPanel.add(beforeLabel);
// Create the anchor:
final Anchor betweenAnchor = new Anchor(betweenText);
betweenAnchor.getElement().getStyle().setProperty("display", "inline"); //$NON-NLS-1$ //$NON-NLS-2$
betweenAnchor.getElement().getStyle().setTextDecoration(TextDecoration.UNDERLINE);
alertPanel.add(betweenAnchor);
// Add a listener to the anchor so that the command is executed when
// it is clicked:
betweenAnchor.addClickHandler(event -> command.execute());
// Create the label for the text after the tag:
final Label afterLabel = new Label(afterText);
afterLabel.getElement().getStyle().setProperty("display", "inline"); //$NON-NLS-1$ //$NON-NLS-2$
alertPanel.add(afterLabel);
// Add the alert to the view:
view.add(alertPanel);
}
interface Style extends CssResource {
String searchFilter();
String fetchResultErrorLabel();
String topElement();
String patternFlyRadio();
}
public void setPkPasswordSectionVisiblity(boolean visible) {
pkSection.setVisible(visible);
passwordSection.setVisible(visible);
}
@Override
public int setTabIndexes(int nextTabIndex) {
// ==General Tab==
clusterEditor.setTabIndex(nextTabIndex++);
externalHostProviderEnabledEditor.setTabIndex(nextTabIndex++);
providersEditor.setTabIndex(nextTabIndex++);
rbProvisionedHost.setTabIndex(nextTabIndex++);
rbDiscoveredHost.setTabIndex(nextTabIndex++);
externalDiscoveredHostsEditor.setTabIndex(nextTabIndex++);
externalHostGroupsEditor.setTabIndex(nextTabIndex++);
externalComputeResourceEditor.setTabIndex(nextTabIndex++);
nameEditor.setTabIndex(nextTabIndex++);
commentEditor.setTabIndex(nextTabIndex++);
hostAddressEditor.setTabIndex(nextTabIndex++);
authSshPortEditor.setTabIndex(nextTabIndex++);
userNameEditor.setTabIndex(nextTabIndex++);
rbPassword.setTabIndex(nextTabIndex++);
passwordEditor.setTabIndex(nextTabIndex++);
return nextTabIndex;
}
@Override
public void setHostProviderVisibility(boolean visible) {
searchProviderRow.setVisible(visible);
}
@Override
protected void populateTabMap() {
getTabNameMapping().put(TabName.GENERAL_TAB, this.generalTab.getTabListItem());
getTabNameMapping().put(TabName.POWER_MANAGEMENT_TAB, this.powerManagementTab.getTabListItem());
getTabNameMapping().put(TabName.NETWORK_PROVIDER_TAB, this.networkProviderTab.getTabListItem());
getTabNameMapping().put(TabName.CONSOLE_TAB, this.consoleTab.getTabListItem());
getTabNameMapping().put(TabName.SPM_TAB, this.spmTab.getTabListItem());
getTabNameMapping().put(TabName.KERNEL_TAB, this.kernelTab.getTabListItem());
}
@Override
public DialogTabPanel getTabPanel() {
return tabPanel;
}
@Override
public HasClickHandlers getKernelCmdlineResetButton() {
return kernelCmdlineResetButton;
}
}