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

Reply via email to