changeset 1217:b43db0f054d2

Remove Storage.getCount() and replace with prepared query. Reviewed-by: omajid Review-thread: http://icedtea.classpath.org/pipermail/thermostat/2013-August/007762.html PR1509
author Severin Gehwolf <sgehwolf@redhat.com>
date Fri, 02 Aug 2013 17:49:01 +0200
parents 91e56d2ba874
children e2034aa58edf
files distribution/config/thermostat-roles.properties host-cpu/common/src/main/java/com/redhat/thermostat/host/cpu/common/CpuStatDAO.java host-cpu/common/src/main/java/com/redhat/thermostat/host/cpu/common/internal/CpuStatDAOImpl.java host-cpu/common/src/test/java/com/redhat/thermostat/host/cpu/common/internal/CpuStatDAOTest.java host-memory/common/src/main/java/com/redhat/thermostat/host/memory/common/MemoryStatDAO.java host-memory/common/src/main/java/com/redhat/thermostat/host/memory/common/internal/MemoryStatDAOImpl.java host-memory/common/src/test/java/com/redhat/thermostat/host/memory/common/internal/MemoryStatDAOTest.java storage/core/src/main/java/com/redhat/thermostat/storage/core/QueuedStorage.java storage/core/src/main/java/com/redhat/thermostat/storage/core/Storage.java storage/core/src/main/java/com/redhat/thermostat/storage/internal/dao/AgentInfoDAOImpl.java storage/core/src/main/java/com/redhat/thermostat/storage/internal/dao/DAOImplStatementDescriptorRegistration.java storage/core/src/main/java/com/redhat/thermostat/storage/internal/dao/HostInfoDAOImpl.java storage/core/src/main/java/com/redhat/thermostat/storage/internal/dao/VmInfoDAOImpl.java storage/core/src/test/java/com/redhat/thermostat/storage/core/QueuedStorageTest.java storage/core/src/test/java/com/redhat/thermostat/storage/internal/dao/AgentInfoDAOTest.java storage/core/src/test/java/com/redhat/thermostat/storage/internal/dao/DAOImplStatementDescriptorRegistrationTest.java storage/core/src/test/java/com/redhat/thermostat/storage/internal/dao/HostInfoDAOTest.java storage/core/src/test/java/com/redhat/thermostat/storage/internal/dao/VmInfoDAOTest.java storage/mongo/src/main/java/com/redhat/thermostat/storage/mongodb/internal/MongoStorage.java storage/mongo/src/test/java/com/redhat/thermostat/storage/mongodb/internal/MongoStorageTest.java web/client/src/main/java/com/redhat/thermostat/web/client/internal/WebStorage.java web/client/src/test/java/com/redhat/thermostat/web/client/internal/WebStorageTest.java web/server/src/main/java/com/redhat/thermostat/web/server/WebStorageEndPoint.java web/server/src/main/java/com/redhat/thermostat/web/server/auth/Roles.java web/server/src/test/java/com/redhat/thermostat/web/server/KnownDescriptorRegistryTest.java web/server/src/test/java/com/redhat/thermostat/web/server/WebStorageEndpointTest.java
diffstat 26 files changed, 131 insertions(+), 243 deletions(-) [+]
line wrap: on
line diff
--- a/distribution/config/thermostat-roles.properties	Wed Aug 14 17:48:13 2013 +0200
+++ b/distribution/config/thermostat-roles.properties	Fri Aug 02 17:49:01 2013 +0200
@@ -39,8 +39,7 @@
 # "thermostat-client" role.
 #thermostat-client = thermostat-realm, thermostat-login, thermostat-query, \
 #                    thermostat-cmdc-generate, thermostat-load-file, \
-#                    thermostat-get-count, thermostat-register-category, \
-#                    thermostat-prepare-statement
+#                    thermostat-register-category, thermostat-prepare-statement
 #
 # Example recursive role definition that grants all command channel privileges.
 # You may uncomment the following lines and assign your client users this
--- a/host-cpu/common/src/main/java/com/redhat/thermostat/host/cpu/common/CpuStatDAO.java	Wed Aug 14 17:48:13 2013 +0200
+++ b/host-cpu/common/src/main/java/com/redhat/thermostat/host/cpu/common/CpuStatDAO.java	Fri Aug 02 17:49:01 2013 +0200
@@ -40,13 +40,12 @@
 
 import com.redhat.thermostat.annotations.Service;
 import com.redhat.thermostat.host.cpu.common.model.CpuStat;
-import com.redhat.thermostat.storage.core.Countable;
 import com.redhat.thermostat.storage.core.HostRef;
 import com.redhat.thermostat.storage.core.Category;
 import com.redhat.thermostat.storage.core.Key;
 
 @Service
-public interface CpuStatDAO extends Countable {
+public interface CpuStatDAO {
 
     static Key<List<Double>> cpuLoadKey = new Key<>("perProcessorUsage", false);
 
--- a/host-cpu/common/src/main/java/com/redhat/thermostat/host/cpu/common/internal/CpuStatDAOImpl.java	Wed Aug 14 17:48:13 2013 +0200
+++ b/host-cpu/common/src/main/java/com/redhat/thermostat/host/cpu/common/internal/CpuStatDAOImpl.java	Fri Aug 02 17:49:01 2013 +0200
@@ -68,10 +68,5 @@
         add.setPojo(stat);
         add.apply();
     }
-
-    @Override
-    public long getCount() {
-        return storage.getCount(cpuStatCategory);
-    }
 }
 
--- a/host-cpu/common/src/test/java/com/redhat/thermostat/host/cpu/common/internal/CpuStatDAOTest.java	Wed Aug 14 17:48:13 2013 +0200
+++ b/host-cpu/common/src/test/java/com/redhat/thermostat/host/cpu/common/internal/CpuStatDAOTest.java	Fri Aug 02 17:49:01 2013 +0200
@@ -163,14 +163,5 @@
         verify(add).setPojo(stat);
         verify(add).apply();
     }
-
-    @Test
-    public void testGetCount() {
-        Storage storage = mock(Storage.class);
-        when(storage.getCount(any(Category.class))).thenReturn(5L);
-        CpuStatDAO dao = new CpuStatDAOImpl(storage);
-        Long count = dao.getCount();
-        assertEquals((Long) 5L, count);
-    }
 }
 
--- a/host-memory/common/src/main/java/com/redhat/thermostat/host/memory/common/MemoryStatDAO.java	Wed Aug 14 17:48:13 2013 +0200
+++ b/host-memory/common/src/main/java/com/redhat/thermostat/host/memory/common/MemoryStatDAO.java	Fri Aug 02 17:49:01 2013 +0200
@@ -40,13 +40,12 @@
 
 import com.redhat.thermostat.annotations.Service;
 import com.redhat.thermostat.host.memory.common.model.MemoryStat;
-import com.redhat.thermostat.storage.core.Countable;
+import com.redhat.thermostat.storage.core.Category;
 import com.redhat.thermostat.storage.core.HostRef;
-import com.redhat.thermostat.storage.core.Category;
 import com.redhat.thermostat.storage.core.Key;
 
 @Service
-public interface MemoryStatDAO extends Countable {
+public interface MemoryStatDAO {
 
     static Key<Long> memoryTotalKey = new Key<>("total", false);
     static Key<Long> memoryFreeKey = new Key<>("free", false);
--- a/host-memory/common/src/main/java/com/redhat/thermostat/host/memory/common/internal/MemoryStatDAOImpl.java	Wed Aug 14 17:48:13 2013 +0200
+++ b/host-memory/common/src/main/java/com/redhat/thermostat/host/memory/common/internal/MemoryStatDAOImpl.java	Fri Aug 02 17:49:01 2013 +0200
@@ -69,9 +69,5 @@
         add.apply();
     }
 
-    @Override
-    public long getCount() {
-        return storage.getCount(memoryStatCategory);
-    }
 }
 
--- a/host-memory/common/src/test/java/com/redhat/thermostat/host/memory/common/internal/MemoryStatDAOTest.java	Wed Aug 14 17:48:13 2013 +0200
+++ b/host-memory/common/src/test/java/com/redhat/thermostat/host/memory/common/internal/MemoryStatDAOTest.java	Fri Aug 02 17:49:01 2013 +0200
@@ -149,15 +149,6 @@
         verify(add).setPojo(stat);
         verify(add).apply();
     }
-
-    @Test
-    public void testGetCount() {
-        Storage storage = mock(Storage.class);
-        when(storage.getCount(any(Category.class))).thenReturn(5L);
-        MemoryStatDAO dao = new MemoryStatDAOImpl(storage);
-        Long count = dao.getCount();
-        assertEquals((Long) 5L, count);
-    }
     
 }
 
--- a/storage/core/src/main/java/com/redhat/thermostat/storage/core/QueuedStorage.java	Wed Aug 14 17:48:13 2013 +0200
+++ b/storage/core/src/main/java/com/redhat/thermostat/storage/core/QueuedStorage.java	Fri Aug 02 17:49:01 2013 +0200
@@ -189,12 +189,6 @@
 
     }
 
-    @SuppressWarnings("rawtypes") 
-    @Override
-    public long getCount(Category category) {
-        return delegate.getCount(category);
-    }
-
     @Override
     public void saveFile(final String filename, final InputStream data) {
 
--- a/storage/core/src/main/java/com/redhat/thermostat/storage/core/Storage.java	Wed Aug 14 17:48:13 2013 +0200
+++ b/storage/core/src/main/java/com/redhat/thermostat/storage/core/Storage.java	Fri Aug 02 17:49:01 2013 +0200
@@ -88,8 +88,6 @@
      */
     void purge(String agentId);
 
-    long getCount(Category<?> category);
-
     void saveFile(String filename, InputStream data);
 
     InputStream loadFile(String filename);
--- a/storage/core/src/main/java/com/redhat/thermostat/storage/internal/dao/AgentInfoDAOImpl.java	Wed Aug 14 17:48:13 2013 +0200
+++ b/storage/core/src/main/java/com/redhat/thermostat/storage/internal/dao/AgentInfoDAOImpl.java	Fri Aug 02 17:49:01 2013 +0200
@@ -82,24 +82,22 @@
 
     @Override
     public long getCount() {
-        return storage.getCount(CATEGORY);
+        long count = 0L;
+        Cursor<AgentInformation> agentCursor = getCursorForAllAgentInformation();
+        if (agentCursor == null) {
+            return count;
+        }
+        while (agentCursor.hasNext()) {
+            count++;
+            agentCursor.next();
+        }
+        return count;
     }
 
     @Override
     public List<AgentInformation> getAllAgentInformation() {
-        StatementDescriptor<AgentInformation> desc = new StatementDescriptor<>(CATEGORY, QUERY_ALL_AGENTS);
-        PreparedStatement<AgentInformation> prepared = null;
-        Cursor<AgentInformation> agentCursor = null;
-        try {
-            prepared = storage.prepareStatement(desc);
-            agentCursor = prepared.executeQuery();
-        } catch (DescriptorParsingException e) {
-            // should not happen, but if it *does* happen, at least log it
-            logger.log(Level.SEVERE, "Preparing query '" + desc + "' failed!", e);
-            return Collections.emptyList();
-        } catch (StatementExecutionException e) {
-            // should not happen, but if it *does* happen, at least log it
-            logger.log(Level.SEVERE, "Executing query '" + desc + "' failed!", e);
+        Cursor<AgentInformation> agentCursor = getCursorForAllAgentInformation();
+        if (agentCursor == null) {
             return Collections.emptyList();
         }
         List<AgentInformation> results = new ArrayList<>();
@@ -110,6 +108,24 @@
         }
         return results;
     }
+    
+    private Cursor<AgentInformation> getCursorForAllAgentInformation() {
+        StatementDescriptor<AgentInformation> desc = new StatementDescriptor<>(CATEGORY, QUERY_ALL_AGENTS);
+        PreparedStatement<AgentInformation> prepared = null;
+        try {
+            prepared = storage.prepareStatement(desc);
+            return prepared.executeQuery();
+        } catch (DescriptorParsingException e) {
+            // should not happen, but if it *does* happen, at least log it
+            logger.log(Level.SEVERE, "Preparing query '" + desc + "' failed!", e);
+            return null;
+        } catch (StatementExecutionException e) {
+            // should not happen, but if it *does* happen, at least log it
+            logger.log(Level.SEVERE, "Executing query '" + desc + "' failed!", e);
+            return null;
+        }
+        
+    }
 
     @Override
     public List<AgentInformation> getAliveAgents() {
--- a/storage/core/src/main/java/com/redhat/thermostat/storage/internal/dao/DAOImplStatementDescriptorRegistration.java	Wed Aug 14 17:48:13 2013 +0200
+++ b/storage/core/src/main/java/com/redhat/thermostat/storage/internal/dao/DAOImplStatementDescriptorRegistration.java	Fri Aug 02 17:49:01 2013 +0200
@@ -62,6 +62,7 @@
         daoDescs.add(HostInfoDAOImpl.QUERY_HOST_INFO);
         daoDescs.add(HostInfoDAOImpl.QUERY_ALL_HOSTS);
         daoDescs.add(NetworkInterfaceInfoDAOImpl.QUERY_NETWORK_INFO);
+        daoDescs.add(VmInfoDAOImpl.QUERY_ALL_VMS_FOR_HOST);
         daoDescs.add(VmInfoDAOImpl.QUERY_ALL_VMS);
         daoDescs.add(VmInfoDAOImpl.QUERY_VM_INFO);
         return daoDescs;
--- a/storage/core/src/main/java/com/redhat/thermostat/storage/internal/dao/HostInfoDAOImpl.java	Wed Aug 14 17:48:13 2013 +0200
+++ b/storage/core/src/main/java/com/redhat/thermostat/storage/internal/dao/HostInfoDAOImpl.java	Fri Aug 02 17:49:01 2013 +0200
@@ -115,22 +115,10 @@
 
     @Override
     public Collection<HostRef> getHosts() {
-        StatementDescriptor<HostInfo> desc = new StatementDescriptor<>(hostInfoCategory, QUERY_ALL_HOSTS);
-        PreparedStatement<HostInfo> prepared;
-        Cursor<HostInfo> cursor;
-        try {
-            prepared = storage.prepareStatement(desc);
-            cursor = prepared.executeQuery();
-        } catch (DescriptorParsingException e) {
-            // should not happen, but if it *does* happen, at least log it
-            logger.log(Level.SEVERE, "Preparing query '" + desc + "' failed!", e);
-            return Collections.emptyList();
-        } catch (StatementExecutionException e) {
-            // should not happen, but if it *does* happen, at least log it
-            logger.log(Level.SEVERE, "Executing query '" + desc + "' failed!", e);
+        Cursor<HostInfo> cursor = getAllHostInfoCursor();
+        if (cursor == null) {
             return Collections.emptyList();
         }
-        
         List<HostRef> result = new ArrayList<>();
         while (cursor.hasNext()) {
             HostInfo hostInfo = cursor.next();
@@ -155,16 +143,41 @@
         return hosts;
     }
 
-
     private HostRef toHostRef(HostInfo hostInfo) {
         String agentId = hostInfo.getAgentId();
         String hostName = hostInfo.getHostname();
         return new HostRef(agentId, hostName);
     }
+    
+    private Cursor<HostInfo> getAllHostInfoCursor() {
+        StatementDescriptor<HostInfo> desc = new StatementDescriptor<>(hostInfoCategory, QUERY_ALL_HOSTS);
+        PreparedStatement<HostInfo> prepared;
+        try {
+            prepared = storage.prepareStatement(desc);
+            return prepared.executeQuery();
+        } catch (DescriptorParsingException e) {
+            // should not happen, but if it *does* happen, at least log it
+            logger.log(Level.SEVERE, "Preparing query '" + desc + "' failed!", e);
+            return null;
+        } catch (StatementExecutionException e) {
+            // should not happen, but if it *does* happen, at least log it
+            logger.log(Level.SEVERE, "Executing query '" + desc + "' failed!", e);
+            return null;
+        }
+    }
 
     @Override
     public long getCount() {
-        return storage.getCount(hostInfoCategory);
+        long count = 0;
+        Cursor<HostInfo> hostInfoCursor = getAllHostInfoCursor();
+        if (hostInfoCursor == null) {
+            return count;
+        }
+        while (hostInfoCursor.hasNext()) {
+            count++;
+            hostInfoCursor.next();
+        }
+        return count;
     }
     
 }
--- a/storage/core/src/main/java/com/redhat/thermostat/storage/internal/dao/VmInfoDAOImpl.java	Wed Aug 14 17:48:13 2013 +0200
+++ b/storage/core/src/main/java/com/redhat/thermostat/storage/internal/dao/VmInfoDAOImpl.java	Fri Aug 02 17:49:01 2013 +0200
@@ -68,9 +68,10 @@
             + vmInfoCategory.getName() + " WHERE '" 
             + Key.AGENT_ID.getName() + "' = ?s AND '"
             + Key.VM_ID.getName() + "' = ?s LIMIT 1";
-    static final String QUERY_ALL_VMS = "QUERY " 
+    static final String QUERY_ALL_VMS_FOR_HOST = "QUERY " 
             + vmInfoCategory.getName() + " WHERE '" 
             + Key.AGENT_ID.getName() + "' = ?s";
+    static final String QUERY_ALL_VMS = "QUERY " + vmInfoCategory.getName();
     
     private final Storage storage;
     private final ExpressionFactory factory;
@@ -114,7 +115,7 @@
 
     @Override
     public Collection<VmRef> getVMs(HostRef host) {
-        StatementDescriptor<VmInfo> desc = new StatementDescriptor<>(vmInfoCategory, QUERY_ALL_VMS);
+        StatementDescriptor<VmInfo> desc = new StatementDescriptor<>(vmInfoCategory, QUERY_ALL_VMS_FOR_HOST);
         PreparedStatement<VmInfo> stmt;
         Cursor<VmInfo> cursor;
         try {
@@ -155,7 +156,27 @@
 
     @Override
     public long getCount() {
-        return storage.getCount(vmInfoCategory);
+        long count = 0;
+        StatementDescriptor<VmInfo> desc = new StatementDescriptor<>(vmInfoCategory, QUERY_ALL_VMS);
+        PreparedStatement<VmInfo> stmt;
+        Cursor<VmInfo> cursor;
+        try {
+            stmt = storage.prepareStatement(desc);
+            cursor = stmt.executeQuery();
+        } catch (DescriptorParsingException e) {
+            // should not happen, but if it *does* happen, at least log it
+            logger.log(Level.SEVERE, "Preparing query '" + desc + "' failed!", e);
+            return count;
+        } catch (StatementExecutionException e) {
+            // should not happen, but if it *does* happen, at least log it
+            logger.log(Level.SEVERE, "Executing query '" + desc + "' failed!", e);
+            return count;
+        }
+        while (cursor.hasNext()) {
+            count++;
+            cursor.next();
+        }
+        return count;
     }
 
     @Override
--- a/storage/core/src/test/java/com/redhat/thermostat/storage/core/QueuedStorageTest.java	Wed Aug 14 17:48:13 2013 +0200
+++ b/storage/core/src/test/java/com/redhat/thermostat/storage/core/QueuedStorageTest.java	Fri Aug 02 17:49:01 2013 +0200
@@ -217,7 +217,6 @@
         when(delegateStorage.createAdd(any(Category.class))).thenReturn(delegateAdd);
         when(delegateStorage.createReplace(any(Category.class))).thenReturn(delegateReplace);
         when(delegateStorage.createRemove()).thenReturn(remove);
-        when(delegateStorage.getCount(any(Category.class))).thenReturn(42l);
         expectedFile = mock(InputStream.class);
         when(delegateStorage.loadFile(anyString())).thenReturn(expectedFile);
         when(delegateStorage.getAgentId()).thenReturn("huzzah");
@@ -295,17 +294,6 @@
     }
 
     @Test
-    public void testGetCount() {
-        Category<?> category = mock(Category.class);
-
-        long result = queuedStorage.getCount(category);
-        assertEquals(42, result);
-
-        assertNull(executor.getTask());
-        assertNull(fileExecutor.getTask());
-    }
-
-    @Test
     public void testSaveFile() {
         InputStream stream = mock(InputStream.class);
 
@@ -460,12 +448,6 @@
         }
 
         @Override
-        public long getCount(Category<?> category) {
-            // not implemented
-            throw new AssertionError();
-        }
-
-        @Override
         public void saveFile(String filename, InputStream data) {
             // not implemented
             throw new AssertionError();
--- a/storage/core/src/test/java/com/redhat/thermostat/storage/internal/dao/AgentInfoDAOTest.java	Wed Aug 14 17:48:13 2013 +0200
+++ b/storage/core/src/test/java/com/redhat/thermostat/storage/internal/dao/AgentInfoDAOTest.java	Fri Aug 02 17:49:01 2013 +0200
@@ -153,6 +153,31 @@
         assertEquals(expected, result);
     }
     
+    /*
+     * getCount() with two AgentInformation records.
+     */
+    @Test
+    public void testGetCount()
+            throws DescriptorParsingException, StatementExecutionException {
+        AgentInformation agent2 = new AgentInformation();
+        
+        @SuppressWarnings("unchecked")
+        Cursor<AgentInformation> agentCursor = (Cursor<AgentInformation>) mock(Cursor.class);
+        when(agentCursor.hasNext()).thenReturn(true).thenReturn(true).thenReturn(false);
+        when(agentCursor.next()).thenReturn(agent1).thenReturn(agent2).thenReturn(null);
+
+        Storage storage = mock(Storage.class);
+        @SuppressWarnings("unchecked")
+        PreparedStatement<AgentInformation> stmt = (PreparedStatement<AgentInformation>) mock(PreparedStatement.class);
+        when(storage.prepareStatement(anyDescriptor())).thenReturn(stmt);
+        when(stmt.executeQuery()).thenReturn(agentCursor);
+        AgentInfoDAOImpl dao = new AgentInfoDAOImpl(storage);
+
+        long count = dao.getCount();
+
+        assertEquals(2, count);
+    }
+    
     @SuppressWarnings("unchecked")
     private StatementDescriptor<AgentInformation> anyDescriptor() {
         return (StatementDescriptor<AgentInformation>) any(StatementDescriptor.class);
--- a/storage/core/src/test/java/com/redhat/thermostat/storage/internal/dao/DAOImplStatementDescriptorRegistrationTest.java	Wed Aug 14 17:48:13 2013 +0200
+++ b/storage/core/src/test/java/com/redhat/thermostat/storage/internal/dao/DAOImplStatementDescriptorRegistrationTest.java	Fri Aug 02 17:49:01 2013 +0200
@@ -62,7 +62,7 @@
     public void registersAllQueries() {
         DAOImplStatementDescriptorRegistration reg = new DAOImplStatementDescriptorRegistration();
         Set<String> descriptors = reg.getStatementDescriptors();
-        assertEquals(9, descriptors.size());
+        assertEquals(10, descriptors.size());
         assertFalse(descriptors.contains(null));
     }
     
@@ -80,7 +80,7 @@
             registrations.add(r);
         }
         assertEquals(1, registrations.size());
-        assertEquals(9, registrations.get(0).getStatementDescriptors().size());
+        assertEquals(10, registrations.get(0).getStatementDescriptors().size());
     }
     
     @Test
--- a/storage/core/src/test/java/com/redhat/thermostat/storage/internal/dao/HostInfoDAOTest.java	Wed Aug 14 17:48:13 2013 +0200
+++ b/storage/core/src/test/java/com/redhat/thermostat/storage/internal/dao/HostInfoDAOTest.java	Fri Aug 02 17:49:01 2013 +0200
@@ -224,14 +224,13 @@
     }
 
     @Test
-    public void testGetCount() {
-        Storage storage = mock(Storage.class);
-        when(storage.getCount(any(Category.class))).thenReturn(5L);
-        AgentInfoDAO agentInfoDao = mock(AgentInfoDAO.class);
+    public void testGetCount() throws Exception {
+        Storage storage = setupStorageForSingleHost();
+        AgentInfoDAO agentInfo = mock(AgentInfoDAO.class);
 
-        HostInfoDAO dao = new HostInfoDAOImpl(storage, agentInfoDao);
-        Long count = dao.getCount();
-        assertEquals((Long) 5L, count);
+        HostInfoDAO hostsDAO = new HostInfoDAOImpl(storage, agentInfo);
+
+        assertEquals(1, hostsDAO.getCount());
     }
     
     @Test
--- a/storage/core/src/test/java/com/redhat/thermostat/storage/internal/dao/VmInfoDAOTest.java	Wed Aug 14 17:48:13 2013 +0200
+++ b/storage/core/src/test/java/com/redhat/thermostat/storage/internal/dao/VmInfoDAOTest.java	Fri Aug 02 17:49:01 2013 +0200
@@ -116,7 +116,9 @@
         String expectedVmInfo = "QUERY vm-info WHERE 'agentId' = ?s AND 'vmId' = ?s LIMIT 1";
         assertEquals(expectedVmInfo, VmInfoDAOImpl.QUERY_VM_INFO);
         String expectedVmInfoAll = "QUERY vm-info WHERE 'agentId' = ?s";
-        assertEquals(expectedVmInfoAll, VmInfoDAOImpl.QUERY_ALL_VMS);
+        assertEquals(expectedVmInfoAll, VmInfoDAOImpl.QUERY_ALL_VMS_FOR_HOST);
+        String expectedAllVms = "QUERY vm-info";
+        assertEquals(expectedAllVms, VmInfoDAOImpl.QUERY_ALL_VMS);
     }
 
     @Test
@@ -285,12 +287,10 @@
     }
 
     @Test
-    public void testGetCount() {
-        Storage storage = mock(Storage.class);
-        when(storage.getCount(any(Category.class))).thenReturn(5L);
+    public void testGetCount() throws Exception {
+        Storage storage = setupStorageForMultiVM();
         VmInfoDAO dao = new VmInfoDAOImpl(storage);
-        Long count = dao.getCount();
-        assertEquals((Long) 5L, count);
+        assertEquals(2, dao.getCount());
     }
 
     @Test
--- a/storage/mongo/src/main/java/com/redhat/thermostat/storage/mongodb/internal/MongoStorage.java	Wed Aug 14 17:48:13 2013 +0200
+++ b/storage/mongo/src/main/java/com/redhat/thermostat/storage/mongodb/internal/MongoStorage.java	Fri Aug 02 17:49:01 2013 +0200
@@ -326,16 +326,6 @@
         return dbCursor;
     }
 
-
-    @Override
-    public long getCount(Category<?> category) {
-        DBCollection coll = getCachedCollection(category);
-        if (coll != null) {
-            return coll.getCount();
-        }
-        return 0L;
-    }
-
     @Override
     public void saveFile(String filename, InputStream data) {
         GridFS gridFS = new GridFS(db);
--- a/storage/mongo/src/test/java/com/redhat/thermostat/storage/mongodb/internal/MongoStorageTest.java	Wed Aug 14 17:48:13 2013 +0200
+++ b/storage/mongo/src/test/java/com/redhat/thermostat/storage/mongodb/internal/MongoStorageTest.java	Fri Aug 02 17:49:01 2013 +0200
@@ -306,28 +306,6 @@
         verifyDefaultCursor(cursor);
     }
 
-    @Test
-    public void verifyGetCount() throws Exception {
-        MongoStorage storage = makeStorage();
-        long count = storage.getCount(testCategory);
-        assertEquals(2, count);
-    }
-
-    @Test
-    public void verifyGetCountForEmptyCategory() throws Exception {
-        MongoStorage storage = makeStorage();
-        long count = storage.getCount(emptyTestCategory);
-        assertEquals(0, count);
-    }
-
-    @Test
-    public void verifyGetCountForNonexistentCategory() throws Exception {
-        MongoStorage storage = makeStorage();
-        setDbFieldInStorage(storage);
-        long count = storage.getCount(new Category("NonExistent", TestClass.class));
-        assertEquals(0, count);
-    }
-
     private void verifyDefaultCursor(Cursor<TestClass> cursor) {
         assertTrue(cursor.hasNext());
         TestClass obj1 = cursor.next();
--- a/web/client/src/main/java/com/redhat/thermostat/web/client/internal/WebStorage.java	Wed Aug 14 17:48:13 2013 +0200
+++ b/web/client/src/main/java/com/redhat/thermostat/web/client/internal/WebStorage.java	Fri Aug 02 17:49:01 2013 +0200
@@ -596,17 +596,6 @@
     }
 
     @Override
-    public long getCount(Category<?> category) throws StorageException {
-        NameValuePair categoryParam = new BasicNameValuePair("category", gson.toJson(categoryIds.get(category)));
-        List<NameValuePair> formparams = Arrays.asList(categoryParam);
-        try (CloseableHttpEntity entity = post(endpoint + "/get-count", formparams)) {
-            Reader reader = getContentAsReader(entity);
-            long result = gson.fromJson(reader, Long.class);
-            return result;
-        }
-    }
-
-    @Override
     public InputStream loadFile(String name) throws StorageException {
         NameValuePair fileParam = new BasicNameValuePair("file", name);
         List<NameValuePair> formparams = Arrays.asList(fileParam);
--- a/web/client/src/test/java/com/redhat/thermostat/web/client/internal/WebStorageTest.java	Wed Aug 14 17:48:13 2013 +0200
+++ b/web/client/src/test/java/com/redhat/thermostat/web/client/internal/WebStorageTest.java	Fri Aug 02 17:49:01 2013 +0200
@@ -537,21 +537,6 @@
     }
 
     @Test
-    public void testGetCount() throws UnsupportedEncodingException, IOException {
-
-        prepareServer(new Gson().toJson(12345));
-        long result = storage.getCount(category);
-
-        StringReader reader = new StringReader(requestBody);
-        BufferedReader bufRead = new BufferedReader(reader);
-        String line = URLDecoder.decode(bufRead.readLine(), "UTF-8");
-        String[] parts = line.split("=");
-        assertEquals("category", parts[0]);
-        assertEquals("42", parts[1]);
-        assertEquals(12345, result);
-    }
-
-    @Test
     public void testSaveFile() {
         String data = "Hello World";
         ByteArrayInputStream in = new ByteArrayInputStream(data.getBytes());
--- a/web/server/src/main/java/com/redhat/thermostat/web/server/WebStorageEndPoint.java	Wed Aug 14 17:48:13 2013 +0200
+++ b/web/server/src/main/java/com/redhat/thermostat/web/server/WebStorageEndPoint.java	Fri Aug 02 17:49:01 2013 +0200
@@ -233,8 +233,6 @@
             removePojo(req, resp);
         } else if (cmd.equals("update-pojo")) {
             updatePojo(req, resp);
-        } else if (cmd.equals("get-count")) {
-            getCount(req, resp);
         } else if (cmd.equals("save-file")) {
             saveFile(req, resp);
         } else if (cmd.equals("load-file")) {
@@ -438,26 +436,6 @@
         
     }
 
-    @WebStoragePathHandler( path = "get-count" )
-    private void getCount(HttpServletRequest req, HttpServletResponse resp) {
-        if (! isAuthorized(req, resp, Roles.GET_COUNT)) {
-            return;
-        }
-        try {
-            String categoryParam = req.getParameter("category");
-            int categoryId = gson.fromJson(categoryParam, Integer.class);
-            Category<?> category = getCategoryFromId(categoryId);
-            long result = storage.getCount(category);
-            resp.setStatus(HttpServletResponse.SC_OK);
-            resp.setContentType(RESPONSE_JSON_CONTENT_TYPE);
-            gson.toJson(result, resp.getWriter());
-            resp.flushBuffer();
-        } catch (IOException ex) {
-            ex.printStackTrace();
-            resp.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
-        }
-    }
-
     @WebStoragePathHandler( path = "register-category" )
     private synchronized void registerCategory(HttpServletRequest req, HttpServletResponse resp) throws IOException {
         if (! isAuthorized(req, resp, Roles.REGISTER_CATEGORY)) {
--- a/web/server/src/main/java/com/redhat/thermostat/web/server/auth/Roles.java	Wed Aug 14 17:48:13 2013 +0200
+++ b/web/server/src/main/java/com/redhat/thermostat/web/server/auth/Roles.java	Fri Aug 02 17:49:01 2013 +0200
@@ -70,7 +70,6 @@
     final String DELETE = "thermostat-remove";
     final String PREPARE_STATEMENT = "thermostat-prepare-statement";
     final String READ = "thermostat-query";
-    final String GET_COUNT = "thermostat-get-count";
     final String LOAD_FILE = "thermostat-load-file";
     final String SAVE_FILE = "thermostat-save-file";
     final String PURGE = "thermostat-purge";
@@ -81,7 +80,7 @@
     final String ACCESS_REALM = "thermostat-realm";
     
     final String[] ALL_ROLES = { APPEND, REPLACE, UPDATE, DELETE, READ,
-            GET_COUNT, LOAD_FILE, SAVE_FILE, PURGE, REGISTER_CATEGORY,
+            LOAD_FILE, SAVE_FILE, PURGE, REGISTER_CATEGORY,
             CMD_CHANNEL_GENERATE, CMD_CHANNEL_VERIFY, LOGIN, ACCESS_REALM,
             PREPARE_STATEMENT, GRANT_AGENTS_READ_ALL, GRANT_HOSTS_READ_ALL,
             GRANT_VMS_READ_BY_USERNAME_ALL, GRANT_VMS_READ_BY_VM_ID_ALL,
@@ -95,7 +94,7 @@
     
     final String[] CLIENT_ROLES = {
             ACCESS_REALM, LOGIN, CMD_CHANNEL_GENERATE, LOAD_FILE,
-            GET_COUNT, READ, REGISTER_CATEGORY, PREPARE_STATEMENT
+            READ, REGISTER_CATEGORY, PREPARE_STATEMENT
     };
     
 }
--- a/web/server/src/test/java/com/redhat/thermostat/web/server/KnownDescriptorRegistryTest.java	Wed Aug 14 17:48:13 2013 +0200
+++ b/web/server/src/test/java/com/redhat/thermostat/web/server/KnownDescriptorRegistryTest.java	Fri Aug 02 17:49:01 2013 +0200
@@ -81,7 +81,7 @@
         // storage-core registers 9 queries; this module has
         // only storage-core as maven dep which registers queries.
         // see DAOImplStatementDescriptorRegistration
-        assertEquals(9, trustedDescs.size());
+        assertEquals(10, trustedDescs.size());
     }
     
     @Test
--- a/web/server/src/test/java/com/redhat/thermostat/web/server/WebStorageEndpointTest.java	Wed Aug 14 17:48:13 2013 +0200
+++ b/web/server/src/test/java/com/redhat/thermostat/web/server/WebStorageEndpointTest.java	Fri Aug 02 17:49:01 2013 +0200
@@ -242,7 +242,7 @@
         // authorization checks
         final String[] authPaths = new String[] {
                 "prepare-statement", "query-execute", "put-pojo", "register-category", "remove-pojo",
-                "update-pojo", "get-count", "save-file", "load-file",
+                "update-pojo", "save-file", "load-file",
                 "purge", "ping", "generate-token", "verify-token"
         };
         Map<String, Boolean> checkedAutPaths = new HashMap<>();
@@ -962,56 +962,6 @@
         doUnauthorizedTest("update-pojo", failMsg);
     }
 
-
-    @Test
-    public void authorizedGetCount() throws Exception {
-        String[] roleNames = new String[] {
-                Roles.GET_COUNT,
-                Roles.REGISTER_CATEGORY,
-                Roles.ACCESS_REALM
-        };
-        String testuser = "testuser";
-        String password = "testpassword";
-        final LoginService loginService = new TestLoginService(testuser, password, roleNames); 
-        port = FreePortFinder.findFreePort(new TryPort() {
-            
-            @Override
-            public void tryPort(int port) throws Exception {
-                startServer(port, loginService);
-            }
-        });
-        registerCategory(testuser, password);
-        
-        when(mockStorage.getCount(category)).thenReturn(12345L);
-        String endpoint = getEndpoint();
-
-        URL url = new URL(endpoint + "/get-count");
-        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
-        conn.setRequestMethod("POST");
-        sendAuthentication(conn, testuser, password);
-        conn.setDoOutput(true);
-        conn.setDoInput(true);
-        conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
-        Gson gson = new Gson();
-        OutputStreamWriter out = new OutputStreamWriter(conn.getOutputStream());
-        out.write("category=" + categoryId);
-        out.flush();
-
-        InputStream in = conn.getInputStream();
-        Reader reader = new InputStreamReader(in);
-        long result = gson.fromJson(reader, Long.class);
-        assertEquals(200, conn.getResponseCode());
-        assertEquals(12345, result);
-        verify(mockStorage).getCount(category);
-        
-    }
-    
-    @Test
-    public void unauthorizedGetCount() throws Exception {
-        String failMsg = "thermostat-get-count role missing, expected Forbidden!";
-        doUnauthorizedTest("get-count", failMsg);
-    }
-
     @Test
     public void authorizedSaveFile() throws Exception {
         String[] roleNames = new String[] {