# Delete twice because vms in the error state may need that.
openstack server list -f value -c ID | xargs -r openstack server delete --wait
openstack server list -f value -c ID | xargs -r openstack server delete --wait
since="$( date '+%Y-%m-%d %H:%M:%S' )"
openstack server create --flavor "$flavor" --image "$image" --nic net-id="$net" vm0 --wait >/dev/null
openstack server shelve vm0
sleep 10
openstack server create --flavor "$flavor" --image "$image" --nic net-id="$net" vm1 --wait >/dev/null
openstack server shelve vm1
sleep 10
openstack server unshelve vm0
sleep 15
openstack server unshelve vm1
while [ $( openstack server list -f value -c Name -c Status | egrep -w 'vm[01]' | egrep -cw ACTIVE ) != 2 ]
do
sleep 1
done
until="$( date '+%Y-%m-%d %H:%M:%S' )"
# This way we only catch resource tracking errors during unshelve of vm0.
# The same resource tracking error may happen during unshelve of vm1,
# but we would need to start one more vm to catch that...
cpuset0="$( sudo virsh dumpxml $( openstack server show vm0 -f value -c OS-EXT-SRV-ATTR:instance_name ) | xmlstarlet sel -t -v '//vcpupin/@cpuset' )"
cpuset1="$( sudo virsh dumpxml $( openstack server show vm1 -f value -c OS-EXT-SRV-ATTR:instance_name ) | xmlstarlet sel -t -v '//vcpupin/@cpuset' )"
if [ "$cpuset0" = "$cpuset1" ]
then
exit_msg=fail
exit_code=1
else
exit_msg=pass
exit_code=0
fi
Btw for the ease of reproduction:
I usually changed some periodic job intervals to make the bug more frequent:
/etc/nova/ nova-cpu. conf resources_ interval = 60
[DEFAULT]
update_
And here's my final bug reproducer script (beware, it deletes all servers):
#! /bin/bash
flavor= "cirros256- pinned" cirros- 0.5.2-x86_ 64-disk"
image="
net="private"
source ~/src/os/ openstack/ devstack/ openrc admin admin >/dev/null
# Delete twice because vms in the error state may need that.
openstack server list -f value -c ID | xargs -r openstack server delete --wait
openstack server list -f value -c ID | xargs -r openstack server delete --wait
since="$( date '+%Y-%m-%d %H:%M:%S' )"
openstack server create --flavor "$flavor" --image "$image" --nic net-id="$net" vm0 --wait >/dev/null
openstack server shelve vm0
sleep 10
openstack server create --flavor "$flavor" --image "$image" --nic net-id="$net" vm1 --wait >/dev/null
openstack server shelve vm1
sleep 10
openstack server unshelve vm0
sleep 15
openstack server unshelve vm1
while [ $( openstack server list -f value -c Name -c Status | egrep -w 'vm[01]' | egrep -cw ACTIVE ) != 2 ]
do
sleep 1
done
until="$( date '+%Y-%m-%d %H:%M:%S' )"
# This way we only catch resource tracking errors during unshelve of vm0. SRV-ATTR: instance_ name ) | xmlstarlet sel -t -v '//vcpupin/@cpuset' )" SRV-ATTR: instance_ name ) | xmlstarlet sel -t -v '//vcpupin/@cpuset' )"
# The same resource tracking error may happen during unshelve of vm1,
# but we would need to start one more vm to catch that...
cpuset0="$( sudo virsh dumpxml $( openstack server show vm0 -f value -c OS-EXT-
cpuset1="$( sudo virsh dumpxml $( openstack server show vm1 -f value -c OS-EXT-
if [ "$cpuset0" = "$cpuset1" ]
then
exit_msg=fail
exit_code=1
else
exit_msg=pass
exit_code=0
fi
#echo -S "'$since'" -U "'$until'"
#echo '>>>'
#sudo journalctl -u devstack@n-cpu -S "$since" -U "$until" | egrep 'ERROR|AAA'
#echo '<<<'
echo >&2 "$exit_msg"
exit $exit_code