Add scenario test of lease expiration

The reserved host for blazar users are released when the lease expires,
and host aggregate that created for Blazar is deleted.
Check the instance created during the expiration has been removed
by release of host.

Change-Id: Ied3c766a1d7d839eb4301b494e4b35c75151f242
Partial-bug: #1694181
This commit is contained in:
Maho Koshiya 2017-07-01 08:11:28 +09:00
parent fda0899ea9
commit adeb401abc
2 changed files with 97 additions and 17 deletions

View File

@ -72,7 +72,7 @@ class ResourceReservationScenarioTest(manager.ScenarioTest):
def check_lease_end():
try:
lease = self.reservation_client.get_lease(lease_id)
lease = self.reservation_client.get_lease(lease_id)['lease']
if lease:
events = lease['events']
return len(filter(lambda evt:

View File

@ -111,6 +111,28 @@ class TestHostReservationScenario(rrs.ResourceReservationScenarioTest):
return body
def get_expiration_lease_body(self, lease_name, host_name):
current_time = datetime.datetime.utcnow()
end_time = current_time + datetime.timedelta(seconds=90)
body = {
'start_date': current_time.strftime('%Y-%m-%d %H:%M'),
'end_date': end_time.strftime('%Y-%m-%d %H:%M'),
'name': lease_name,
'events': [],
}
body['reservations'] = [
{
'hypervisor_properties': ('["==", "$hypervisor_hostname", "'
'%s"]' % host_name),
'max': 1,
'min': 1,
'resource_type': 'physical:host',
'resource_properties': ''
}
]
return body
def fetch_aggregate_by_name(self, name):
aggregates = self.aggr_client.list_aggregates()['aggregates']
try:
@ -121,24 +143,34 @@ class TestHostReservationScenario(rrs.ResourceReservationScenarioTest):
raise exceptions.NotFound(err_msg)
return aggr
def wait_until_aggregated(self, aggregate_name, host_name):
for i in xrange(self.MAX_RETRY):
try:
aggr = self.fetch_aggregate_by_name(aggregate_name)
self.assertTrue(host_name in aggr['hosts'])
return
except Exception:
pass
time.sleep(self.WAIT_TIME)
err_msg = ("hostname %s doesn't exist in aggregate %s."
% (host_name, aggregate_name))
raise exceptions.NotFound(err_msg)
def _add_host_once(self):
host = self.fetch_one_compute_host()
hosts = self.reservation_client.list_host()['hosts']
try:
next(iter(filter(
lambda h: h['hypervisor_hostname'] == host['host'], hosts)))
except StopIteration:
self.reservation_client.create_host({'name': host['host']})
return host
@decorators.attr(type='smoke')
def test_host_reservation(self):
def wait_until_aggregated(aggregate_name, host_name):
for i in xrange(self.MAX_RETRY):
try:
aggr = self.fetch_aggregate_by_name(aggregate_name)
self.assertTrue(host_name in aggr['hosts'])
return
except Exception:
pass
time.sleep(self.WAIT_TIME)
err_msg = ("hostname %s doesn't exist in aggregate %s."
% (host_name, aggregate_name))
raise exceptions.NotFound(err_msg)
host = self.fetch_one_compute_host()
self.reservation_client.create_host({'name': host['host']})
# Create the host if it doesn't exists
host = self._add_host_once()
# check the host is in freepool
freepool = self.fetch_aggregate_by_name('freepool')
@ -161,7 +193,7 @@ class TestHostReservationScenario(rrs.ResourceReservationScenarioTest):
# check host added to the reservation
reservation_id = next(iter(lease['reservations']))['id']
wait_until_aggregated(reservation_id, host['host'])
self.wait_until_aggregated(reservation_id, host['host'])
# create an instance with reservation id
create_kwargs = {
@ -192,3 +224,51 @@ class TestHostReservationScenario(rrs.ResourceReservationScenarioTest):
waiters.wait_for_server_status(self.os_admin.servers_client,
server['id'], 'ERROR',
raise_on_error=False)
@decorators.attr(type='smoke')
def test_lease_expiration(self):
# create the host if it doesn't exist
host = self._add_host_once()
# create new lease and start reservation immediately
body = self.get_expiration_lease_body('scenario-2-expiration',
host['host'])
lease = self.reservation_client.create_lease(body)['lease']
lease_id = lease['id']
# check host added to the reservation
reservation_id = next(iter(lease['reservations']))['id']
self.wait_until_aggregated(reservation_id, host['host'])
create_kwargs = {
'scheduler_hints': {
'reservation': reservation_id,
},
'image_id': CONF.compute.image_ref,
'flavor': CONF.compute.flavor_ref,
}
server = self.create_server(clients=self.os_admin,
**create_kwargs)
# wait for lease end
self.wait_for_lease_end(lease_id)
# check if the lease has been correctly terminated and
# the instance is removed
self.assertRaises(exceptions.NotFound,
self.os_admin.servers_client.show_server,
server['id'])
# check that the host aggregate was deleted
self.assertRaises(exceptions.NotFound,
self.fetch_aggregate_by_name, reservation_id)
# check that the host is back in the freepool
freepool = self.fetch_aggregate_by_name('freepool')
self.assertTrue(host['host'] in freepool['hosts'])
# check the reservation status
lease = self.reservation_client.get_lease(lease_id)['lease']
self.assertTrue('deleted' in
next(iter(lease['reservations']))['status'])