package org.ovirt.engine.ui.webadmin.widget.host; import java.util.ArrayList; import java.util.List; import java.util.Objects; import org.ovirt.engine.core.common.businessentities.VDS; import org.ovirt.engine.core.common.businessentities.network.Bond; import org.ovirt.engine.core.common.businessentities.network.BondMode; import org.ovirt.engine.core.common.businessentities.network.InterfaceStatus; import org.ovirt.engine.core.common.queries.ConfigurationValues; import org.ovirt.engine.ui.common.widget.dialog.TooltippedIcon; import org.ovirt.engine.ui.uicommonweb.dataprovider.AsyncDataProvider; import org.ovirt.engine.ui.uicommonweb.models.hosts.HostInterface; import org.ovirt.engine.ui.uicommonweb.models.hosts.HostInterfaceLineModel; import org.ovirt.engine.ui.uicompat.external.StringUtils; import org.ovirt.engine.ui.webadmin.ApplicationConstants; import org.ovirt.engine.ui.webadmin.ApplicationMessages; import org.ovirt.engine.ui.webadmin.ApplicationResources; import org.ovirt.engine.ui.webadmin.ApplicationTemplates; import org.ovirt.engine.ui.webadmin.gin.AssetProvider; import com.google.gwt.dom.client.Style; import com.google.gwt.dom.client.Style.BorderStyle; import com.google.gwt.dom.client.Style.Unit; import com.google.gwt.resources.client.ImageResource; import com.google.gwt.safehtml.shared.SafeHtml; import com.google.gwt.safehtml.shared.SafeHtmlBuilder; import com.google.gwt.user.client.ui.Label; public class BondPanel extends HostInterfaceHorizontalPanel { private static final ApplicationResources resources = AssetProvider.getResources(); private static final ApplicationTemplates templates = AssetProvider.getTemplates(); private static final ApplicationConstants constants = AssetProvider.getConstants(); private static final ApplicationMessages messages = AssetProvider.getMessages(); private static final String INVALID_AD_PARTNER_MAC = "00:00:00:00:00:00";//$NON-NLS-1$ public BondPanel(HostInterfaceLineModel lineModel, VDS vds) { super(); clear(); Style style = getElement().getStyle(); style.setBorderColor("white"); //$NON-NLS-1$ style.setBorderWidth(1, Unit.PX); style.setBorderStyle(BorderStyle.SOLID); if (lineModel.getIsBonded()) { Bond bond = (Bond) lineModel.getInterface(); TooltippedIcon bondIcon = createBondIcon(lineModel); add(bondIcon); boolean isAdPartnerMacValid = isAdPartnerMacValid(bond, vds); setCellWidth(bondIcon, isAdPartnerMacValid ? "20%" : "15%"); //$NON-NLS-1$ //$NON-NLS-2$ addAdPartnerMacIfNeeded(bond, vds, isAdPartnerMacValid); // Bond name add(new InterfaceLabel(lineModel.getInterface())); } else { add(new Label("")); //$NON-NLS-1$ } } private TooltippedIcon createBondIcon(HostInterfaceLineModel lineModel) { InterfaceStatus interfaceStatus = lineModel.getInterface().getStatistics().getStatus(); ImageResource image = InterfaceStatus.UP.equals(interfaceStatus) ? resources.splitUpImage() : resources.splitDownImage(); SafeHtml bondPropertiesMessage = createBondTooltipMessage(lineModel, interfaceStatus); SafeHtml bondMessage = templates.italicWordWrapMaxWidthWithBoldTitle(constants.bondProperties(), bondPropertiesMessage); TooltippedIcon bondIcon = new TooltippedIcon(bondMessage, image, image); return bondIcon; } private SafeHtml createBondTooltipMessage(HostInterfaceLineModel lineModel, InterfaceStatus interfaceStatus) { Bond bond = (Bond) lineModel.getInterface(); StringBuilder bondProperties = new StringBuilder(messages.bondStatus(interfaceStatus.toString())); boolean isBond4 = BondMode.BOND4.equals(BondMode.parseBondMode(bond.getBondOptions())); if (InterfaceStatus.UP.equals(interfaceStatus) && isBond4) { bondProperties.append("\n").append(createActiveBondTooltipMessage(bond, lineModel));//$NON-NLS-1$ } if ((bond.getActiveSlave() != null) && (bond.getActiveSlave().length() > 0)) { bondProperties.append("\n").append(messages.bondActiveSlave(bond.getActiveSlave()));//$NON-NLS-1$ } return new SafeHtmlBuilder().appendEscapedLines(bondProperties.toString()).toSafeHtml(); } private String createActiveBondTooltipMessage(Bond bond, HostInterfaceLineModel lineModel) { List<String> bondProperties = new ArrayList<>(); String adPartnerMac = Objects.toString(bond.getAdPartnerMac(), ""); bondProperties.add(messages.bondAdPartnerMac(adPartnerMac)); String adAggregatorId = Objects.toString(bond.getAdAggregatorId(), ""); bondProperties.add(messages.bondAdAggregatorId(adAggregatorId)); for (HostInterface nic : lineModel.getInterfaces()) { String nicName = nic.getName(); String nicAggregatorId = Objects.toString(nic.getInterface().getAdAggregatorId(), ""); bondProperties.add(messages.bondSlaveAdAggregatorId(nicName, nicAggregatorId)); } return StringUtils.join(bondProperties, "\n");//$NON-NLS-1$ } private void addAdPartnerMacIfNeeded(Bond bond, VDS vds, boolean isAdPartnerMacValid) { if (!isAdPartnerMacValid) { ImageResource noPartnerMacImage = resources.alertImage(); String noPartnerMacMessage = constants.bondInMode4HasNoPartnerMac(); TooltippedIcon bondInMode4HasNoPartnerMacIcon = new TooltippedIcon( templates.italicWordWrapMaxWidth(noPartnerMacMessage), noPartnerMacImage, noPartnerMacImage); add(bondInMode4HasNoPartnerMacIcon); setCellWidth(bondInMode4HasNoPartnerMacIcon, "5%"); //$NON-NLS-1$ } } private boolean isAdPartnerMacValid(Bond bond, VDS vds){ String partnerMac = bond.getAdPartnerMac(); boolean isAdPartnerMacEmpty = partnerMac == null || partnerMac.isEmpty() || partnerMac.equals(INVALID_AD_PARTNER_MAC); boolean isIfcUp = InterfaceStatus.UP.equals(bond.getStatistics().getStatus()); boolean isBond4 = BondMode.BOND4.equals(BondMode.parseBondMode(bond.getBondOptions())); boolean isAdPartnerSupportedForCluster = (Boolean)AsyncDataProvider.getInstance().getConfigValuePreConverted( ConfigurationValues.AdPartnerMacSupported, vds.getClusterCompatibilityVersion().getValue()); return !isAdPartnerMacEmpty || !isIfcUp || !isBond4 || !isAdPartnerSupportedForCluster; } }