Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
77 changes: 26 additions & 51 deletions .zuul.yaml
Original file line number Diff line number Diff line change
@@ -1,34 +1,6 @@
# See https://docs.openstack.org/infra/manual/drivers.html#naming-with-zuul-v3
# for job naming conventions.

- job:
name: nova-dsvm-multinode-base
parent: legacy-dsvm-base-multinode
description: |
Base job for multinode nova devstack/tempest jobs.
Will setup firewall rules on all the nodes allowing them to talk to
each other.
timeout: 10800
required-projects:
- openstack/devstack-gate
- openstack/nova
- openstack/tempest
irrelevant-files: &dsvm-irrelevant-files
- ^api-.*$
- ^(test-|)requirements.txt$
- ^.*\.rst$
- ^.git.*$
- ^doc/.*$
- ^nova/hacking/.*$
- ^nova/locale/.*$
- ^nova/policies/.*$
- ^nova/tests/.*$
- ^nova/test.py$
- ^releasenotes/.*$
- ^setup.cfg$
- ^tools/.*$
- ^tox.ini$

- job:
name: nova-tox-functional-py38
parent: openstack-tox-functional-py38
Expand Down Expand Up @@ -95,7 +67,21 @@
description: |
Run tempest live migration tests against local qcow2 ephemeral storage
and shared LVM/iSCSI cinder volumes.
irrelevant-files: *dsvm-irrelevant-files
irrelevant-files: &dsvm-irrelevant-files
- ^api-.*$
- ^(test-|)requirements.txt$
- ^.*\.rst$
- ^.git.*$
- ^doc/.*$
- ^nova/hacking/.*$
- ^nova/locale/.*$
- ^nova/policies/.*$
- ^nova/tests/.*$
- ^nova/test.py$
- ^releasenotes/.*$
- ^setup.cfg$
- ^tools/.*$
- ^tox.ini$
vars:
tox_envlist: all
tempest_test_regex: (^tempest\.api\.compute\.admin\.(test_live_migration|test_migration))
Expand Down Expand Up @@ -189,24 +175,11 @@
parent: devstack-tempest
description: |
Run tempest compute API tests using LVM image backend. This only runs
against nova/virt/libvirt/* changes.
# Copy irrelevant-files from nova-dsvm-multinode-base and then exclude
# anything that is not in nova/virt/libvirt/* or nova/privsep/*.
irrelevant-files:
- ^(?!.zuul.yaml)(?!nova/virt/libvirt/)(?!nova/privsep/).*$
- ^api-.*$
- ^(test-|)requirements.txt$
- ^.*\.rst$
- ^.git.*$
- ^doc/.*$
- ^nova/hacking/.*$
- ^nova/locale/.*$
- ^nova/tests/.*$
- ^nova/test.py$
- ^releasenotes/.*$
- ^setup.cfg$
- ^tools/.*$
- ^tox.ini$
against nova/virt/libvirt/*, nova/privsep/* and .zuul.yaml changes.
files:
- ^nova/virt/libvirt/.*$
- ^nova/privsep/.*$
- .zuul.yaml
vars:
# We use the "all" environment for tempest_test_regex and
# tempest_black_regex.
Expand Down Expand Up @@ -528,11 +501,12 @@
- nova-ceph-multistore:
irrelevant-files: *dsvm-irrelevant-files
- neutron-tempest-linuxbridge:
irrelevant-files:
files:
# NOTE(mriedem): This job has its own irrelevant-files section
# so that we only run it on changes to networking and libvirt/vif
# code; we don't need to run this on all changes.
- ^(?!nova/network/.*)(?!nova/virt/libvirt/vif.py).*$
- ^nova/network/.*$
- nova/virt/libvirt/vif.py
- nova-live-migration
- nova-lvm
- nova-multi-cell
Expand Down Expand Up @@ -582,11 +556,12 @@
- nova-ceph-multistore:
irrelevant-files: *dsvm-irrelevant-files
- neutron-tempest-linuxbridge:
irrelevant-files:
files:
# NOTE(mriedem): This job has its own irrelevant-files section
# so that we only run it on changes to networking and libvirt/vif
# code; we don't need to run this on all changes.
- ^(?!nova/network/.*)(?!nova/virt/libvirt/vif.py).*$
- ^nova/network/.*$
- nova/virt/libvirt/vif.py
- tempest-integrated-compute:
irrelevant-files: *policies-irrelevant-files
- nova-grenade-multinode:
Expand Down
6 changes: 3 additions & 3 deletions nova/compute/manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -6488,9 +6488,9 @@ def _shelve_offload_instance(self, context, instance, clean_shutdown,

instance.power_state = current_power_state
# NOTE(mriedem): The vm_state has to be set before updating the
# resource tracker, see vm_states.ALLOW_RESOURCE_REMOVAL. The host/node
# values cannot be nulled out until after updating the resource tracker
# though.
# resource tracker, see vm_states.allow_resource_removal(). The
# host/node values cannot be nulled out until after updating the
# resource tracker though.
instance.vm_state = vm_states.SHELVED_OFFLOADED
instance.task_state = None
instance.save(expected_task_state=[task_states.SHELVING,
Expand Down
7 changes: 5 additions & 2 deletions nova/compute/resource_tracker.py
Original file line number Diff line number Diff line change
Expand Up @@ -1465,7 +1465,8 @@ def _update_usage_from_instance(self, context, instance, nodename,
# NOTE(sfinucan): Both brand new instances as well as instances that
# are being unshelved will have is_new_instance == True
is_removed_instance = not is_new_instance and (is_removed or
instance['vm_state'] in vm_states.ALLOW_RESOURCE_REMOVAL)
vm_states.allow_resource_removal(
vm_state=instance['vm_state'], task_state=instance.task_state))

if is_new_instance:
self.tracked_instances.add(uuid)
Expand Down Expand Up @@ -1524,7 +1525,9 @@ def _update_usage_from_instances(self, context, instances, nodename):

instance_by_uuid = {}
for instance in instances:
if instance.vm_state not in vm_states.ALLOW_RESOURCE_REMOVAL:
if not vm_states.allow_resource_removal(
vm_state=instance['vm_state'],
task_state=instance.task_state):
self._update_usage_from_instance(context, instance, nodename)
instance_by_uuid[instance.uuid] = instance
return instance_by_uuid
Expand Down
3 changes: 2 additions & 1 deletion nova/compute/stats.py
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,8 @@ def update_stats_for_instance(self, instance, is_removed=False):
(vm_state, task_state, os_type, project_id) = \
self._extract_state_from_instance(instance)

if is_removed or vm_state in vm_states.ALLOW_RESOURCE_REMOVAL:
if is_removed or vm_states.allow_resource_removal(
vm_state=vm_state, task_state=task_state):
self._decrement("num_instances")
self.states.pop(uuid)
else:
Expand Down
11 changes: 9 additions & 2 deletions nova/compute/vm_states.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
See http://wiki.openstack.org/VMState
"""

from nova.compute import task_states
from nova.objects import fields


Expand Down Expand Up @@ -74,5 +75,11 @@
# states we allow to trigger crash dump
ALLOW_TRIGGER_CRASH_DUMP = [ACTIVE, PAUSED, RESCUED, RESIZED, ERROR]

# states we allow resources to be freed in
ALLOW_RESOURCE_REMOVAL = [DELETED, SHELVED_OFFLOADED]

def allow_resource_removal(vm_state, task_state=None):
"""(vm_state, task_state) combinations we allow resources to be freed in"""

return (
vm_state == DELETED or
vm_state == SHELVED_OFFLOADED and task_state != task_states.SPAWNING
)
5 changes: 2 additions & 3 deletions nova/tests/functional/regressions/test_bug_2025480.py
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,5 @@ def fake_spawn(*args, **kwargs):

node = compute_node.ComputeNode.get_by_nodename(
context.get_admin_context(), 'compute1')
# This is the bug, the instance should have resources claimed
# self.assertEqual(1, node.vcpus_used)
self.assertEqual(0, node.vcpus_used)
# After the fix, the instance should have resources claimed
self.assertEqual(1, node.vcpus_used)
16 changes: 16 additions & 0 deletions nova/tests/unit/compute/test_stats.py
Original file line number Diff line number Diff line change
Expand Up @@ -208,6 +208,22 @@ def test_update_stats_for_instance_offloaded(self):
self.assertEqual(0, self.stats.num_os_type("Linux"))
self.assertEqual(0, self.stats["num_vm_" + vm_states.BUILDING])

def test_update_stats_for_instance_being_unshelved(self):
instance = self._create_instance()
self.stats.update_stats_for_instance(instance)
self.assertEqual(1, self.stats.num_instances_for_project("1234"))

instance["vm_state"] = vm_states.SHELVED_OFFLOADED
instance["task_state"] = task_states.SPAWNING
self.stats.update_stats_for_instance(instance)

self.assertEqual(1, self.stats.num_instances)
self.assertEqual(1, self.stats.num_instances_for_project(1234))
self.assertEqual(1, self.stats["num_os_type_Linux"])
self.assertEqual(1, self.stats["num_vm_%s" %
vm_states.SHELVED_OFFLOADED])
self.assertEqual(1, self.stats["num_task_%s" % task_states.SPAWNING])

def test_io_workload(self):
vms = [vm_states.ACTIVE, vm_states.BUILDING, vm_states.PAUSED]
tasks = [task_states.RESIZE_MIGRATING, task_states.REBUILDING,
Expand Down
Loading