package org.ovirt.engine.ui.uicommonweb.models.storage; import java.util.ArrayList; import java.util.LinkedHashSet; import java.util.List; import java.util.Set; import org.ovirt.engine.core.common.action.VdcActionType; import org.ovirt.engine.core.common.businessentities.StorageServerConnections; import org.ovirt.engine.core.common.businessentities.gluster.GlusterBrickEntity; import org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeEntity; import org.ovirt.engine.core.common.businessentities.storage.StorageType; import org.ovirt.engine.core.common.constants.StorageConstants; import org.ovirt.engine.ui.uicommonweb.dataprovider.AsyncDataProvider; import org.ovirt.engine.ui.uicommonweb.models.EntityModel; import org.ovirt.engine.ui.uicommonweb.models.ListModel; import org.ovirt.engine.ui.uicommonweb.validation.AsciiNameValidation; import org.ovirt.engine.ui.uicommonweb.validation.IValidation; import org.ovirt.engine.ui.uicommonweb.validation.LengthValidation; import org.ovirt.engine.ui.uicommonweb.validation.NotEmptyValidation; import org.ovirt.engine.ui.uicompat.ConstantsManager; import org.ovirt.engine.ui.uicompat.external.StringUtils; @SuppressWarnings("unused") public class GlusterStorageModel extends PosixStorageModel { private EntityModel<Boolean> linkGlusterVolume; private ListModel<GlusterVolumeEntity> glusterVolumes; public String getConfigurationMessage() { return ConstantsManager.getInstance().getConstants().glusterDomainConfigurationMessage(); } public GlusterStorageModel() { setLinkGlusterVolume(new EntityModel<Boolean>(false)); setGlusterVolumes(new ListModel<GlusterVolumeEntity>()); getVfsType().setTitle(""); //$NON-NLS-1$ getVfsType().setEntity("glusterfs"); //$NON-NLS-1$ getVfsType().setIsChangeable(false); AsyncDataProvider.getInstance().getGlusterVolumesForStorageDomain(new AsyncQuery<>(glusterVolumes -> { getGlusterVolumes().setItems(glusterVolumes); getGlusterVolumes().setSelectedItem(null); })); getGlusterVolumes().getSelectedItemChangedEvent().addListener((ev, sender, args) -> volumeSelectedItemChanged()); getLinkGlusterVolume().getEntityChangedEvent().addListener((ev, sender, args) -> volumeSelectedItemChanged()); } private void volumeSelectedItemChanged() { GlusterVolumeEntity volume = getGlusterVolumes().getSelectedItem(); Boolean useLinkGlusterVolume = getLinkGlusterVolume().getEntity(); String mountOptions = ""; //$NON-NLS-1$ if (volume == null || !useLinkGlusterVolume) { return; } Set<String> addressSet = new LinkedHashSet<>(); for (GlusterBrickEntity brick : volume.getBricks()) { addressSet.add(brick.getNetworkId() != null && !brick.getNetworkAddress().isEmpty() ? brick.getNetworkAddress() : brick.getServerName()); } List<String> addressList = new ArrayList<>(); addressList.addAll(addressSet); if (addressList.size() >= 1) { // the first server is already used to mount volume addressList.remove(0); } if (addressList.size() > 0) { mountOptions = StorageConstants.GLUSTER_BACKUP_SERVERS_MNT_OPTION + "=" + StringUtils.join(addressList, ":"); //$NON-NLS-1$ //$NON-NLS-2$ } getMountOptions().setEntity(mountOptions); } @Override public StorageType getType() { return StorageType.GLUSTERFS; } @Override public VdcActionType getAddStorageDomainVdcAction() { return VdcActionType.AddGlusterFsStorageDomain; } @Override public void setVfsChangeability(boolean isVfsChangeable) { getVfsType().setIsChangeable(false); } public EntityModel<Boolean> getLinkGlusterVolume() { return linkGlusterVolume; } public void setLinkGlusterVolume(EntityModel<Boolean> linkGlusterVolume) { this.linkGlusterVolume = linkGlusterVolume; } public ListModel<GlusterVolumeEntity> getGlusterVolumes() { return glusterVolumes; } public void setGlusterVolumes(ListModel<GlusterVolumeEntity> glusterVolumes) { this.glusterVolumes = glusterVolumes; } @Override public boolean validate() { getGlusterVolumes().validateSelectedItem(new IValidation[] { new NotEmptyValidation(), new LengthValidation(128)}); getVfsType().validateEntity( new IValidation[] { new NotEmptyValidation(), new AsciiNameValidation() } ); if (getLinkGlusterVolume().getEntity()) { return getGlusterVolumes().getIsValid() && getVfsType().getIsValid(); } else { return super.validate(); } } @Override protected void prepareConnectionForEditing(StorageServerConnections connection) { super.prepareConnectionForEditing(connection); getLinkGlusterVolume().setEntity(connection.getGlusterVolumeId() != null); } }