diff --git a/nova_dpm/tests/unit/virt/dpm/test_vm.py b/nova_dpm/tests/unit/virt/dpm/test_vm.py index 4a511a2..31db692 100755 --- a/nova_dpm/tests/unit/virt/dpm/test_vm.py +++ b/nova_dpm/tests/unit/virt/dpm/test_vm.py @@ -45,6 +45,14 @@ def fake_session(): 'maximum-memory': 512, 'ifl-processors': 3 }) + cpc1.partitions.add({ + 'name': 'OpenStack-foo-cccccccc-cccc-cccc-cccc-cccccccccccc', + 'description': 'OpenStack CPCSubset=foo', + 'initial-memory': 1, + 'status': 'paused', + 'maximum-memory': 512, + 'ifl-processors': 3 + }) cpc1.partitions.add({ 'name': 'OpenStack-foo-6511ee0f-0d64-4392-aaaa-bbbbbbbbbbbb', 'description': 'OpenStack CPCSubset=foo', @@ -283,6 +291,14 @@ class VmPartitionInstanceTestCase(TestCase): 'object-uri') + '/hbas/1', self.partition_inst.get_boot_hba_uri()) + def test_power_on_vm_when_paused(self): + instance = instance_obj.Instance() + instance.uuid = 'cccccccc-cccc-cccc-cccc-cccccccccccc' + partition_inst = vm.PartitionInstance(instance, self.cpc) + partition_inst.power_on_vm() + self.assertEqual( + 'active', partition_inst.get_partition().get_property('status')) + def test_destroy_stopped_partition(self): instance = instance_obj.Instance() instance.save = mock.Mock() @@ -340,6 +356,12 @@ class PartitionInstanceInfoTestCase(TestCase): def test_state(self): self.assertEqual(power_state.RUNNING, self.instance_partition.state) + def test_paused_partition_state(self): + instance = instance_obj.Instance() + instance.uuid = 'cccccccc-cccc-cccc-cccc-cccccccccccc' + instance_partition = vm.PartitionInstanceInfo(instance, self.cpc) + self.assertEqual(power_state.SHUTDOWN, instance_partition.state) + def test_mem(self): self.assertEqual(1, self.instance_partition.mem) diff --git a/nova_dpm/virt/dpm/vm.py b/nova_dpm/virt/dpm/vm.py index f3a04ef..1468b9a 100644 --- a/nova_dpm/virt/dpm/vm.py +++ b/nova_dpm/virt/dpm/vm.py @@ -38,12 +38,22 @@ CONF = conf.CONF OPENSTACK_PREFIX = 'OpenStack' CPCSUBSET_PREFIX = 'CPCSubset=' +STARTED_STATUSES = ( + utils.PartitionState.RUNNING, + utils.PartitionState.DEGRADED, + utils.PartitionState.RESERVATION_ERROR) +STOPPED_STATUSES = ( + utils.PartitionState.STOPPED, + utils.PartitionState.TERMINATED, + utils.PartitionState.PAUSED) + DPM_TO_NOVA_STATE = { utils.PartitionState.RUNNING: power_state.RUNNING, utils.PartitionState.STOPPED: power_state.SHUTDOWN, utils.PartitionState.UNKNOWN: power_state.NOSTATE, - utils.PartitionState.PAUSED: power_state.PAUSED, + # operation to get out of the "paused" status is "stop" + utils.PartitionState.PAUSED: power_state.SHUTDOWN, utils.PartitionState.STARTING: power_state.PAUSED } @@ -324,10 +334,29 @@ class PartitionInstance(object): def power_on_vm(self): LOG.debug('Partition power on triggered') - self.partition.start(True) - # TODO(preethipy): The below method to be removed once the bug - # on DPM(701894) is fixed to return correct status on API return - self._loop_status_update(5, 'Active') + + self._ensure_status_transitioned() + + if self.partition.get_property( + 'status') == utils.PartitionState.PAUSED: + self.partition.stop(True) + self.partition.wait_for_status( + status=utils.PartitionState.STOPPED, status_timeout=60) + + if self.partition.get_property('status') not in STARTED_STATUSES: + self.partition.start(True) + self.partition.wait_for_status( + status=STARTED_STATUSES, status_timeout=60) + + def _ensure_status_transitioned(self): + partition_state = self.partition.get_property('status') + + if partition_state == utils.PartitionState.STARTING: + self.partition.wait_for_status( + status=STARTED_STATUSES, status_timeout=60) + elif partition_state == utils.PartitionState.SHUTTING_DOWN: + self.partition.wait_for_status( + status=STOPPED_STATUSES, status_timeout=60) def power_off_vm(self): LOG.debug('Partition power off triggered')