Moti Asayag has uploaded a new change for review. Change subject: engine: Add query for reporting system errata stats ......................................................................
engine: Add query for reporting system errata stats The query reports a statistics for the system errata categorized by the errata type. Change-Id: Idaf39c5f1db9796babc97c22aad9754564f2d729 Bug-Url: https://bugzilla.redhat.com/1157377 Signed-off-by: Moti Asayag <masa...@redhat.com> --- A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/GetErrataStatisticsForSystemQuery.java A backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/GetErrataStatisticsForSystemQueryTest.java A backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/ErrataStatistics.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/VdcQueryType.java M frontend/webadmin/modules/gwt-common/src/main/resources/org/ovirt/engine/core/Common.gwt.xml 5 files changed, 283 insertions(+), 0 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/29/39329/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/GetErrataStatisticsForSystemQuery.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/GetErrataStatisticsForSystemQuery.java new file mode 100644 index 0000000..9ccacc9 --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/GetErrataStatisticsForSystemQuery.java @@ -0,0 +1,48 @@ +package org.ovirt.engine.core.bll; + +import java.util.List; + +import javax.inject.Inject; + +import org.ovirt.engine.core.bll.host.provider.HostProviderProxy; +import org.ovirt.engine.core.bll.host.provider.foreman.SystemProviderFinder; +import org.ovirt.engine.core.common.businessentities.ErrataStatistics; +import org.ovirt.engine.core.common.businessentities.Erratum; +import org.ovirt.engine.core.common.errors.VdcBllMessages; +import org.ovirt.engine.core.common.queries.VdcQueryParametersBase; + +public class GetErrataStatisticsForSystemQuery<P extends VdcQueryParametersBase> extends QueriesCommandBase<P> { + + @Inject + private SystemProviderFinder systemProviderFinder; + + public GetErrataStatisticsForSystemQuery(P parameters) { + super(parameters); + } + + /** + * For the sake of test + */ + GetErrataStatisticsForSystemQuery(P parameters, SystemProviderFinder systemProviderFinder) { + super(parameters); + this.systemProviderFinder = systemProviderFinder; + } + + @Override + protected void executeQueryCommand() { + HostProviderProxy proxy = systemProviderFinder.findSystemProvider(); + if (proxy == null) { + getQueryReturnValue().setSucceeded(false); + getQueryReturnValue().setExceptionString(VdcBllMessages.NO_HOST_PROVIDER_FOR_SYSTEM.name()); + } else { + List<Erratum> errata = proxy.getErrataForHost(systemProviderFinder.getSystemHostName()); + ErrataStatistics stats = new ErrataStatistics(); + + for (Erratum erratum : errata) { + stats.addStatistics(erratum); + } + + setReturnValue(stats); + } + } +} diff --git a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/GetErrataStatisticsForSystemQueryTest.java b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/GetErrataStatisticsForSystemQueryTest.java new file mode 100644 index 0000000..ac73e1c --- /dev/null +++ b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/GetErrataStatisticsForSystemQueryTest.java @@ -0,0 +1,113 @@ +package org.ovirt.engine.core.bll; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNull; +import static org.mockito.Matchers.any; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.mock; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.runners.MockitoJUnitRunner; +import org.ovirt.engine.core.bll.host.provider.HostProviderProxy; +import org.ovirt.engine.core.bll.host.provider.foreman.SystemProviderFinder; +import org.ovirt.engine.core.common.businessentities.ErrataStatistics; +import org.ovirt.engine.core.common.businessentities.ErrataStatistics.TypedErrataStatistics; +import org.ovirt.engine.core.common.businessentities.Erratum; +import org.ovirt.engine.core.common.businessentities.Erratum.ErrataSeverity; +import org.ovirt.engine.core.common.businessentities.Erratum.ErrataType; +import org.ovirt.engine.core.common.errors.VdcBllMessages; +import org.ovirt.engine.core.common.queries.VdcQueryParametersBase; + +@RunWith(MockitoJUnitRunner.class) +public class GetErrataStatisticsForSystemQueryTest { + + @Mock + private SystemProviderFinder systemProviderFinder; + + private GetErrataStatisticsForSystemQuery<?> query; + + @Test + public void noHostProviderAssociatedWithTheSystem() { + doReturn(null).when(systemProviderFinder).findSystemProvider(); + + query = + new GetErrataStatisticsForSystemQuery<VdcQueryParametersBase>(mock(VdcQueryParametersBase.class), + systemProviderFinder); + query.executeQueryCommand(); + + assertFalse(query.getQueryReturnValue().getSucceeded()); + assertNull(query.getQueryReturnValue().getReturnValue()); + assertEquals(VdcBllMessages.NO_HOST_PROVIDER_FOR_SYSTEM.name(), query.getQueryReturnValue() + .getExceptionString()); + } + + @Test + public void noAvailableSystemErrata() { + HostProviderProxy mockedProxy = mock(HostProviderProxy.class); + doReturn(mockedProxy).when(systemProviderFinder).findSystemProvider(); + doReturn(Collections.emptyList()).when(mockedProxy).getErrataForHost(any(String.class)); + + query = + new GetErrataStatisticsForSystemQuery<VdcQueryParametersBase>(mock(VdcQueryParametersBase.class), + systemProviderFinder); + query.executeQueryCommand(); + + ErrataStatistics returnValue = (ErrataStatistics) query.getQueryReturnValue().getReturnValue(); + for (ErrataType type : ErrataType.values()) { + assertEquals(0, returnValue.getTypedStatistics().getByType(type).getTotal()); + } + } + + @Test + public void availableSystemErrata() { + HostProviderProxy mockedProxy = mock(HostProviderProxy.class); + doReturn(mockedProxy).when(systemProviderFinder).findSystemProvider(); + doReturn(expectedErrata()).when(mockedProxy).getErrataForHost(any(String.class)); + + query = + new GetErrataStatisticsForSystemQuery<VdcQueryParametersBase>(mock(VdcQueryParametersBase.class), + systemProviderFinder); + query.executeQueryCommand(); + + ErrataStatistics returnValue = (ErrataStatistics) query.getQueryReturnValue().getReturnValue(); + TypedErrataStatistics<ErrataType> typedStatistics = returnValue.getTypedStatistics(); + assertEquals(11, returnValue.getTotal()); + assertEquals(5, typedStatistics.getByType(ErrataType.BUGFIX).getTotal()); + assertEquals(4, typedStatistics.getByType(ErrataType.ENHANCEMENT).getTotal()); + assertEquals(2, typedStatistics.getByType(ErrataType.SECURITY).getTotal()); + assertEquals(0, typedStatistics.getByType(ErrataType.SECURITY).getCounter(ErrataSeverity.MODERATE)); + } + + private List<Erratum> expectedErrata() { + List<Erratum> errata = new ArrayList<>(); + errata.addAll(createErrata(ErrataType.BUGFIX, ErrataSeverity.MODERATE, 2)); + errata.addAll(createErrata(ErrataType.BUGFIX, ErrataSeverity.IMPORTANT, 3)); + errata.addAll(createErrata(ErrataType.ENHANCEMENT, ErrataSeverity.MODERATE, 4)); + errata.addAll(createErrata(ErrataType.SECURITY, ErrataSeverity.CRITICAL, 2)); + return errata; + } + + private List<Erratum> createErrata(ErrataType type, ErrataSeverity severity, int total) { + List<Erratum> errata = new ArrayList<>(); + + for (int i = 0; i < total; i++) { + errata.add(createErratum(type, severity)); + } + + return errata; + } + + private Erratum createErratum(ErrataType type, ErrataSeverity severity) { + Erratum erratum = new Erratum(); + erratum.setType(type); + erratum.setSeverity(severity); + return erratum; + } +} diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/ErrataStatistics.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/ErrataStatistics.java new file mode 100644 index 0000000..d427363 --- /dev/null +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/ErrataStatistics.java @@ -0,0 +1,120 @@ +package org.ovirt.engine.core.common.businessentities; + +import java.util.EnumSet; +import java.util.HashMap; +import java.util.Map; + +import org.ovirt.engine.core.common.businessentities.Erratum.ErrataSeverity; +import org.ovirt.engine.core.common.businessentities.Erratum.ErrataType; + +public class ErrataStatistics { + + private TypedErrataStatistics<ErrataType> errataStatistics; + + public ErrataStatistics() { + this.errataStatistics = new TypedErrataStatistics<>(ErrataType.class); + } + + public TypedErrataStatistics<ErrataType> getTypedStatistics() { + return errataStatistics; + } + + public void addStatistics(Erratum erratum) { + EnumCounter<ErrataSeverity> counterByType = errataStatistics.getByType(erratum.getType()); + counterByType.incrementCounter(erratum.getSeverity()); + } + + public int getTotal() { + int total = 0; + + for (ErrataType type : ErrataType.values()) { + total += errataStatistics.getByType(type).getTotal(); + } + + return total; + } + + /** + * The class represents a statistics between the errata type {@see ErrataType} to the statistics of its severity. + * + * @param <E> + * The errata type + */ + public class TypedErrataStatistics<E extends Enum<E>> { + private Map<E, EnumCounter<ErrataSeverity>> statisticsBySeverity; + private Class<E> enumClass; + + public TypedErrataStatistics(Class<E> enumClass) { + this.enumClass = enumClass; + initStatistics(); + } + + private void initStatistics() { + statisticsBySeverity = new HashMap<>(); + for (E e : EnumSet.allOf(enumClass)) { + statisticsBySeverity.put(e, new EnumCounter<ErrataSeverity>(ErrataSeverity.class)); + } + } + + public EnumCounter<ErrataSeverity> getByType(E type) { + return statisticsBySeverity.get(type); + } + } + + /** + * A generic class which represents a mapping between the enum type to its counter + * + * @param <E> + * The type of the enum + */ + public class EnumCounter<E extends Enum<E>> { + private Map<E, Integer> counterByType; + private Class<E> enumClass; + + public EnumCounter(Class<E> enumClass) { + this.enumClass = enumClass; + initCounters(); + } + + private void initCounters() { + counterByType = new HashMap<>(); + for (E e : EnumSet.allOf(enumClass)) { + counterByType.put(e, 0); + } + } + + /** + * Returns the counter of a specific enum constant + * + * @param type + * the specific enum constant + */ + public int getCounter(E type) { + return counterByType.get(type); + } + + /** + * Returns the total count of all enum constants + */ + public int getTotal() { + int total = 0; + + for (E e : EnumSet.allOf(enumClass)) { + total += counterByType.get(e); + } + + return total; + } + + /** + * Increases the count of a specific enum constant by 1 + * + * @param type + * the enum constant to increment + */ + public void incrementCounter(E type) { + int counter = counterByType.get(type); + counterByType.put(type, counter + 1); + } + } +} diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/VdcQueryType.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/VdcQueryType.java index 0e70f2d..cffe5e1 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/VdcQueryType.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/VdcQueryType.java @@ -62,6 +62,7 @@ GetErratumByIdForHost, GetErrataForSystem, GetErratumByIdForSystem, + GetErrataStatisticsForSystem, // VdsStatic Queries GetVdsStaticByName, diff --git a/frontend/webadmin/modules/gwt-common/src/main/resources/org/ovirt/engine/core/Common.gwt.xml b/frontend/webadmin/modules/gwt-common/src/main/resources/org/ovirt/engine/core/Common.gwt.xml index 26dfb12..662807e 100644 --- a/frontend/webadmin/modules/gwt-common/src/main/resources/org/ovirt/engine/core/Common.gwt.xml +++ b/frontend/webadmin/modules/gwt-common/src/main/resources/org/ovirt/engine/core/Common.gwt.xml @@ -390,6 +390,7 @@ <include name="common/businessentities/ExternalDiscoveredHost.java"/> <include name="common/businessentities/ExternalComputeResource.java"/> <include name="common/businessentities/Erratum.java"/> + <include name="common/businessentities/ErrataStatistics.java"/> </source> <super-source path="ui/uioverrides" /> -- To view, visit https://gerrit.ovirt.org/39329 To unsubscribe, visit https://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Idaf39c5f1db9796babc97c22aad9754564f2d729 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Moti Asayag <masa...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches