package org.ovirt.engine.ui.uicommonweb.models.gluster; import java.util.ArrayList; import java.util.List; import org.ovirt.engine.core.common.businessentities.gluster.BrickProfileDetails; import org.ovirt.engine.core.common.businessentities.gluster.FopStats; import org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeProfileInfo; import org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeProfileStats; import org.ovirt.engine.core.common.businessentities.gluster.StatsInfo; import org.ovirt.engine.core.common.utils.Pair; import org.ovirt.engine.core.common.utils.SizeConverter; import org.ovirt.engine.core.common.utils.SizeConverter.SizeUnit; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.compat.StringFormat; 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.models.Model; import org.ovirt.engine.ui.uicompat.ConstantsManager; import org.ovirt.engine.ui.uicompat.PropertyChangedEventArgs; import org.ovirt.engine.ui.uicompat.UIMessages; import com.google.gwt.i18n.client.NumberFormat; public class VolumeProfileStatisticsModel extends Model { private ListModel cumulativeStatistics; private ListModel<BrickProfileDetails> bricks; private String profileRunTime; private String bytesRead; private String bytesWritten; private ListModel nfsServerProfileStats; private ListModel<GlusterVolumeProfileStats> nfsServers; private String nfsProfileRunTime; private String nfsBytesRead; private String nfsBytesWritten; private Guid clusterId; private Guid volumeId; private String volumeName; private String profileExportUrl; private GlusterVolumeProfileInfo profileInfo; private boolean successfulProfileStatsFetch; public ListModel getCumulativeStatistics() { return cumulativeStatistics; } public void setCumulativeStatistics(ListModel cumulativeStatistics) { this.cumulativeStatistics = cumulativeStatistics; } public ListModel<BrickProfileDetails> getBricks() { return bricks; } public void setBricks(ListModel<BrickProfileDetails> bricks) { this.bricks = bricks; } public String getProfileRunTime() { return profileRunTime; } public void setProfileRunTime(String profileRunTime) { this.profileRunTime = profileRunTime; } public String getBytesRead() { return bytesRead; } public void setBytesRead(String bytesRead) { this.bytesRead = bytesRead; } public String getBytesWritten() { return bytesWritten; } public void setBytesWritten(String bytesWritten) { this.bytesWritten = bytesWritten; } public ListModel getNfsServerProfileStats() { return nfsServerProfileStats; } public void setNfsServerProfileStats(ListModel nfsServerProfileStats) { this.nfsServerProfileStats = nfsServerProfileStats; } public ListModel<GlusterVolumeProfileStats> getNfsServers() { return nfsServers; } public void setNfsServers(ListModel<GlusterVolumeProfileStats> nfsServers) { this.nfsServers = nfsServers; } public String getNfsProfileRunTime() { return nfsProfileRunTime; } public void setNfsProfileRunTime(String nfsProfileRunTime) { this.nfsProfileRunTime = nfsProfileRunTime; } public String getNfsBytesRead() { return nfsBytesRead; } public void setNfsBytesRead(String nfsBytesRead) { this.nfsBytesRead = nfsBytesRead; } public String getNfsBytesWritten() { return nfsBytesWritten; } public void setNfsBytesWritten(String nfsBytesWritten) { this.nfsBytesWritten = nfsBytesWritten; } public GlusterVolumeProfileInfo getProfileInfo() { return profileInfo; } public void setProfileInfo(GlusterVolumeProfileInfo profileInfo) { this.profileInfo = profileInfo; } public boolean isSuccessfulProfileStatsFetch() { return successfulProfileStatsFetch; } public void setSuccessfulProfileStatsFetch(boolean successfulProfileStatsFetch) { this.successfulProfileStatsFetch = successfulProfileStatsFetch; onPropertyChanged(new PropertyChangedEventArgs("statusOfFetchingProfileStats"));//$NON-NLS-1$ } public VolumeProfileStatisticsModel(Guid clusterId, Guid volumeId, String volumeName) { this.clusterId = clusterId; this.volumeId = volumeId; this.volumeName = volumeName; setProfileInfo(new GlusterVolumeProfileInfo()); setCumulativeStatistics(new ListModel()); setNfsServerProfileStats(new ListModel()); setBricks(new ListModel<BrickProfileDetails>()); setNfsServers(new ListModel<GlusterVolumeProfileStats>()); final UIMessages messages = ConstantsManager.getInstance().getMessages(); getBricks().getSelectedItemChangedEvent().addListener((ev, sender, args) -> onBrickSelectionChange(messages)); getNfsServers().getSelectedItemChangedEvent().addListener((ev, sender, args) -> onNfsServerSelectionChange(messages)); setProfileRunTime("");//$NON-NLS-1$ setNfsProfileRunTime("");//$NON-NLS-1$ setBytesRead("");//$NON-NLS-1$ setNfsBytesRead("");//$NON-NLS-1$ setBytesWritten("");//$NON-NLS-1$ setNfsBytesWritten("");//$NON-NLS-1$ } private void onNfsServerSelectionChange(UIMessages messages) { if(getNfsServers().getSelectedItem() == null) { return; } int index = getProfileInfo().getNfsProfileDetails().indexOf(getNfsServers().getSelectedItem()); if(index < 0) { return; } List<GlusterVolumeProfileStats> nfsProfileStats = getProfileInfo().getNfsProfileDetails(); StatsInfo selectedNfsServerCummulativeProfile = nfsProfileStats.get(index).getProfileStats().get(0); StatsInfo selectedNfsServerIntervalProfile = nfsProfileStats.get(index).getProfileStats().get(1); populateCummulativeStatistics(selectedNfsServerCummulativeProfile.getFopStats(), getNfsServerProfileStats()); nfsProfileRunTime = formatRunTime(messages, selectedNfsServerCummulativeProfile.getDurationFormatted(), selectedNfsServerIntervalProfile.getDurationFormatted()); onPropertyChanged(new PropertyChangedEventArgs("nfsProfileRunTimeChanged"));//$NON-NLS-1$ nfsBytesRead = formatDataRead(messages, selectedNfsServerCummulativeProfile.getTotalRead(), selectedNfsServerIntervalProfile.getTotalRead()); onPropertyChanged(new PropertyChangedEventArgs("nfsProfileDataRead"));//$NON-NLS-1$ nfsBytesWritten = formatDataWritten(messages, selectedNfsServerCummulativeProfile.getTotalWrite(), selectedNfsServerIntervalProfile.getTotalWrite()); onPropertyChanged(new PropertyChangedEventArgs("nfsProfileDataWritten"));//$NON-NLS-1$ } private void onBrickSelectionChange(UIMessages messages) { if(getBricks().getSelectedItem() == null) { return; } int index = getProfileInfo().getBrickProfileDetails().indexOf(getBricks().getSelectedItem()); if(index < 0) { return; } List<BrickProfileDetails> profileStats = getProfileInfo().getBrickProfileDetails(); StatsInfo selectedBrickProfileCummulativeStats = profileStats.get(index).getProfileStats().get(0); StatsInfo selectedBrickProfileIntervalStats = profileStats.get(index).getProfileStats().get(1); populateCummulativeStatistics(selectedBrickProfileCummulativeStats.getFopStats(), getCumulativeStatistics()); profileRunTime = formatRunTime(messages, selectedBrickProfileCummulativeStats.getDurationFormatted(), selectedBrickProfileIntervalStats.getDurationFormatted()); onPropertyChanged(new PropertyChangedEventArgs("brickProfileRunTimeChanged"));//$NON-NLS-1$ bytesRead = formatDataRead(messages, selectedBrickProfileCummulativeStats.getTotalRead(), selectedBrickProfileIntervalStats.getTotalRead()); onPropertyChanged(new PropertyChangedEventArgs("brickProfileDataRead"));//$NON-NLS-1$ bytesWritten = formatDataWritten(messages, selectedBrickProfileCummulativeStats.getTotalWrite(), selectedBrickProfileIntervalStats.getTotalWrite()); onPropertyChanged(new PropertyChangedEventArgs("brickProfileDataWritten"));//$NON-NLS-1$ } public void queryBackend(final boolean isBrickSelected) { startProgress(ConstantsManager.getInstance().getConstants().fetchingDataMessage()); AsyncDataProvider.getInstance().getGlusterVolumeProfilingStatistics(new AsyncQuery<>(returnValue -> { stopProgress(); GlusterVolumeProfileInfo profileInfoEntity =returnValue.getReturnValue(); if((profileInfoEntity == null) || !returnValue.getSucceeded()) { setSuccessfulProfileStatsFetch(false); if(!isBrickSelected) { showNfsProfileStats(profileInfoEntity); } else { showProfileStats(profileInfoEntity); } } else { GlusterVolumeProfileInfo aggregatedProfileInfo = new GlusterVolumeProfileInfo(); aggregatedProfileInfo.setBrickProfileDetails((profileInfoEntity.getBrickProfileDetails() != null) ? profileInfoEntity.getBrickProfileDetails() : getProfileInfo().getBrickProfileDetails()); aggregatedProfileInfo.setNfsProfileDetails((profileInfoEntity.getNfsProfileDetails() != null) ? profileInfoEntity.getNfsProfileDetails() : getProfileInfo().getNfsProfileDetails()); setProfileExportUrl(formProfileUrl(clusterId.toString(), volumeId.toString(), isBrickSelected)); setProfileInfo(aggregatedProfileInfo); setSuccessfulProfileStatsFetch(true); setTitle(ConstantsManager.getInstance().getMessages().volumeProfilingStatsTitle(volumeName)); if(!isBrickSelected) { showNfsProfileStats(profileInfoEntity); } else { showProfileStats(profileInfoEntity); } } }), clusterId, volumeId, !isBrickSelected); } public void showProfileStats(GlusterVolumeProfileInfo entity) { if (entity != null) { final List<BrickProfileDetails> brickProfileDetails = entity.getBrickProfileDetails(); getBricks().setItems(brickProfileDetails); if(brickProfileDetails.size() > 0) { getBricks().setSelectedItem(brickProfileDetails.get(0)); } } } private void populateCummulativeStatistics(List<FopStats> fopStats, ListModel profileStats) { List<EntityModel<FopStats>> fopStatsEntities = new ArrayList<>(); for(int i = 0;i < fopStats.size();i++) { EntityModel<FopStats> fopStatEntity = new EntityModel<>(fopStats.get(i)); fopStatsEntities.add(fopStatEntity); } profileStats.setItems(fopStatsEntities); } public void showNfsProfileStats(GlusterVolumeProfileInfo entity) { if(entity != null) { List<GlusterVolumeProfileStats> nfsProfileDetails = entity.getNfsProfileDetails(); getNfsServers().setItems(nfsProfileDetails); if(nfsProfileDetails.size() > 0) { getNfsServers().setSelectedItem(nfsProfileDetails.get(0)); } } } private String formatRunTime(UIMessages messages, Pair<Integer, String> runTimeConverted, Pair<Integer, String> intervalRunTimeConverted) { return messages.glusterVolumeCurrentProfileRunTime(intervalRunTimeConverted.getFirst(), intervalRunTimeConverted.getSecond(), runTimeConverted.getFirst(), runTimeConverted.getSecond()); } private String formatDataRead(UIMessages messages, long totalBytesRead, long bytesReadInCurrentInterval) { Pair<SizeUnit, Double> dataReadInCurrentInterval = SizeConverter.autoConvert(bytesReadInCurrentInterval, SizeUnit.BYTES); Pair<SizeUnit, Double> dataRead = SizeConverter.autoConvert(totalBytesRead, SizeUnit.BYTES); return messages.bytesReadInCurrentProfileInterval(formatSize(dataReadInCurrentInterval.getSecond()), dataReadInCurrentInterval.getFirst().name(), formatSize(dataRead.getSecond()), dataRead.getFirst().toString()); } private String formatDataWritten(UIMessages messages, long totalBytesWritten, long bytesWrittenInCurrentInterval) { Pair<SizeUnit, Double> dataWrittenInCurrentInterval = SizeConverter.autoConvert(bytesWrittenInCurrentInterval, SizeUnit.BYTES); Pair<SizeUnit, Double> dataWritten = SizeConverter.autoConvert(totalBytesWritten, SizeUnit.BYTES); return messages.bytesWrittenInCurrentProfileInterval(formatSize(dataWrittenInCurrentInterval.getSecond()), dataWrittenInCurrentInterval.getFirst().toString(), formatSize(dataWritten.getSecond()), dataWritten.getFirst().toString()); } private String formProfileUrl(String clusterId, String volumeId, boolean isBrickProfileSelected) { String apiMatrixParam = !isBrickProfileSelected ? ";nfsStatistics=true" : "";//$NON-NLS-1$//$NON-NLS-2$ return StringFormat.format("/ovirt-engine/api/clusters/%s/glustervolumes/%s/profilestatistics%s?accept=application/json", clusterId, volumeId, apiMatrixParam);//$NON-NLS-1$ } public String getProfileExportUrl() { return profileExportUrl; } public void setProfileExportUrl(String profileExportUrl) { this.profileExportUrl = profileExportUrl; } public String formatSize(double size) { return NumberFormat.getFormat("#.##").format(size);//$NON-NLS-1$ } }