GitHub user sudhansu7 opened a pull request: https://github.com/apache/cloudstack/pull/1516
CLOUDSTACK-9366: Capacity of one zone-wide primary storage ignored Disable and Remove Host operation disables the primary storage capacity. Steps to replicate: Base Condition: There exists a host and storage pool with same id Steps: 1. Find a host and storage pool having same id 2. Disable the host 3. verify that the CPU(1) and MEMORY(0) capacity in op_host_capacity for above host is disabled 4. verify that the STORAGE(3) capacity in op_host_capacity for storage pool with id same as above host is also disabled RCA: 'host_id' column in 'op_host_capacity' table used for storing both storage pool id (for STORAGE capacity) and host id (MEMORY and CPU). While removing a HOST we also disable the capacity associated with host. Ideally while disabling capacity we should only disable MEMORY and CPU capacity, but we are not doing so. Code Path: ResourceManagerImpl.doDeleteHost() -> ResourceManagerImpl.resourceStateTransitTo() -> CapacityDaoImpl.updateCapacityState(null, null, null, host.getId(), capacityState.toString()) updateCapacityState is updating disabling all entries which matches the host_id. This will also disable a entry having storage pool id same as that of host id. Changes: introduced new capacityType parameter in updateCapacityState method and necessary changes to add capacity_type clause in sql also fixed incorrect sql builder logic (unused code path for which it is never surfaced ) Added marvin test to check host and storagepool capacity when host is disabled Test Result: ``` mysql> select ohc.host_id, ohc.`capacity_state`, case capacity_type when 0 then 'MEMORY' when 1 then 'CPU' ELSE 'STORAGE' END as 'capacity_type' , total_capacity, case capacity_type when 0 then 'HOST' when 1 then 'HOST' ELSE 'STORAGE POOL' END as 'HOST/STORAGE POOL' from op_host_capacity ohc where host_id=3; +---------+----------------+---------------+----------------+-------------------+ | host_id | capacity_state | capacity_type | total_capacity | HOST/STORAGE POOL | +---------+----------------+---------------+----------------+-------------------+ | 3 | Enabled | MEMORY | 8589934592 | HOST | | 3 | Enabled | CPU | 32000 | HOST | | 3 | Enabled | STORAGE | 2199023255552 | STORAGE POOL | +---------+----------------+---------------+----------------+-------------------+ 9 rows in set (0.00 sec) Disable Host 3 from UI. mysql> select ohc.host_id, ohc.`capacity_state`, case capacity_type when 0 then 'MEMORY' when 1 then 'CPU' ELSE 'STORAGE' END as 'capacity_type' , total_capacity, case capacity_type when 0 then 'HOST' when 1 then 'HOST' ELSE 'STORAGE POOL' END as 'HOST/STORAGE POOL' from op_host_capacity ohc where host_id=3; +---------+----------------+---------------+----------------+-------------------+ | host_id | capacity_state | capacity_type | total_capacity | HOST/STORAGE POOL | +---------+----------------+---------------+----------------+-------------------+ | 3 | Disabled | MEMORY | 8589934592 | HOST | | 3 | Disabled | CPU | 32000 | HOST | | 3 | Disabled | STORAGE | 2199023255552 | STORAGE POOL | +---------+----------------+---------------+----------------+-------------------+ After Fix: mysql> select ohc.host_id, ohc.`capacity_state`, case capacity_type when 0 then 'MEMORY' when 1 then 'CPU' ELSE 'STORAGE' END as 'capacity_type' , total_capacity, case capacity_type when 0 then 'HOST' when 1 then 'HOST' ELSE 'STORAGE POOL' END as 'HOST/STORAGE POOL' from op_host_capacity ohc where host_id=3; +---------+----------------+---------------+----------------+-------------------+ | host_id | capacity_state | capacity_type | total_capacity | HOST/STORAGE POOL | +---------+----------------+---------------+----------------+-------------------+ | 3 | Enabled | MEMORY | 8589934592 | HOST | | 3 | Enabled | CPU | 32000 | HOST | | 3 | Enabled | STORAGE | 2199023255552 | STORAGE POOL | +---------+----------------+---------------+----------------+-------------------+ 3 rows in set (0.01 sec) Disable Host 3 from UI. mysql> select ohc.host_id, ohc.`capacity_state`, case capacity_type when 0 then 'MEMORY' when 1 then 'CPU' ELSE 'STORAGE' END as 'capacity_type' , total_capacity, case capacity_type when 0 then 'HOST' when 1 then 'HOST' ELSE 'STORAGE POOL' END as 'HOST/STORAGE POOL' from op_host_capacity ohc where host_id=3; +---------+----------------+---------------+----------------+-------------------+ | host_id | capacity_state | capacity_type | total_capacity | HOST/STORAGE POOL | +---------+----------------+---------------+----------------+-------------------+ | 3 | Disabled | MEMORY | 8589934592 | HOST | | 3 | Disabled | CPU | 32000 | HOST | | 3 | Enabled | STORAGE | 2199023255552 | STORAGE POOL | +---------+----------------+---------------+----------------+-------------------+ 3 rows in set (0.00 sec) Sudhansus-MAC:cloudstack sudhansu$ nosetests-2.7 --with-marvin --marvin-config=setup/dev/advanced.cfg test/integration/component/maint/test_capacity_host_delete.py ==== Marvin Init Started ==== === Marvin Parse Config Successful === === Marvin Setting TestData Successful=== ==== Log Folder Path: /tmp//MarvinLogs//Apr_22_2016_22_42_27_X4VBWD. All logs will be available here ==== === Marvin Init Logging Successful=== ==== Marvin Init Successful ==== ===final results are now copied to: /tmp//MarvinLogs/test_capacity_host_delete_9RHSNB=== Sudhansus-MAC:cloudstack sudhansu$ cat /tmp//MarvinLogs/test_capacity_host_delete_9RHSNB/results.txt test_01_op_host_capacity_disable_host (integration.component.maint.test_capacity_host_delete.TestHosts) ... === TestName: test_01_op_host_capacity_disable_host | Status : SUCCESS === ok ---------------------------------------------------------------------- Ran 1 test in 0.168s OK ``` You can merge this pull request into a Git repository by running: $ git pull https://github.com/sudhansu7/cloudstack CLOUDSTACK-9366 Alternatively you can review and apply these changes as the patch at: https://github.com/apache/cloudstack/pull/1516.patch To close this pull request, make a commit to your master/trunk branch with (at least) the following in the commit message: This closes #1516 ---- commit ebeb26a351dc95f2bef877fe469a05952821b97a Author: Sudhansu <sudhansu.s...@accelerite.com> Date: 2016-04-22T10:06:51Z CLOUDSTACK-9366: Capacity of one zone-wide primary storage ignored introduced new capacityType parameter in updateCapacityState method and necessary changes to add capacity_type clause in sql also fixed incorrect sql builder logic (unused code path for which it is never surfaced ) Added marvin test to check host and storagepool capacity when host is disabled ---- --- If your project is set up for it, you can reply to this email and have your reply appear on GitHub as well. If your project does not have this feature enabled and wishes so, or if the feature is enabled but not working, please contact infrastructure at infrastruct...@apache.org or file a JIRA ticket with INFRA. ---