Merge "Add functional recreate test for bug 1823370"

This commit is contained in:
Zuul 2019-08-20 18:06:07 +00:00 committed by Gerrit Code Review
commit 4e9d224479
1 changed files with 90 additions and 0 deletions

View File

@ -0,0 +1,90 @@
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
from nova.scheduler import weights
from nova.tests.functional import integrated_helpers
# Prefer host1 over host2 over host3
WEIGHT_MAP = {'host1': 100, 'host2': 50, 'host3': 25}
class HostNameWeigher(weights.BaseHostWeigher):
def _weigh_object(self, host_state, weight_properties):
return WEIGHT_MAP.get(host_state.host, 0)
class MultiCellEvacuateTestCase(integrated_helpers._IntegratedTestBase,
integrated_helpers.InstanceHelperMixin):
"""Recreate test for bug 1823370 which was introduced in Pike.
When evacuating a server, the request to the scheduler should be restricted
to the cell in which the instance is already running since cross-cell
evacuate is not supported, at least not yet. This test creates two cells
with two compute hosts in one cell and another compute host in the other
cell. A server is created in the cell with two hosts and then evacuated
which should land it on the other host in that cell, not the other cell
with only one host. The scheduling behavior is controlled via the custom
HostNameWeigher.
"""
# Set variables used in the parent class.
NUMBER_OF_CELLS = 2
REQUIRES_LOCKING = False
ADMIN_API = True
USE_NEUTRON = True
_image_ref_parameter = 'imageRef'
_flavor_ref_parameter = 'flavorRef'
api_major_version = 'v2.1'
microversion = '2.11' # Need at least 2.11 for the force-down API
def setUp(self):
# Register our custom weigher for predictable scheduling results.
self.flags(weight_classes=[__name__ + '.HostNameWeigher'],
group='filter_scheduler')
super(MultiCellEvacuateTestCase, self).setUp()
def _setup_compute_service(self):
"""Start three compute services, two in cell1 and one in cell2.
host1: cell1 (highest weight)
host2: cell2 (medium weight)
host3: cell1 (lowest weight)
"""
host_to_cell = {'host1': 'cell1', 'host2': 'cell2', 'host3': 'cell1'}
for host, cell in host_to_cell.items():
svc = self.start_service('compute', host=host, cell=cell)
# Set an attribute so we can access this service later.
setattr(self, host, svc)
def test_evacuate_multi_cell(self):
# Create a server which should land on host1 since it has the highest
# weight.
server = self._build_server(self.api.get_flavors()[0]['id'])
server = self.api.post_server({'server': server})
server = self._wait_for_state_change(self.api, server, 'ACTIVE')
self.assertEqual('host1', server['OS-EXT-SRV-ATTR:host'])
# Disable the host on which the server is now running.
self.host1.stop()
self.api.force_down_service('host1', 'nova-compute', forced_down=True)
# Now evacuate the server which should send it to host3 since it is
# in the same cell as host1, even though host2 in cell2 is weighed
# higher than host3.
req = {'evacuate': {'onSharedStorage': False}}
self.api.post_server_action(server['id'], req)
self._wait_for_migration_status(server, ['done'])
server = self._wait_for_state_change(self.api, server, 'ACTIVE')
# FIXME(mriedem): This is bug 1823370 where conductor does not restrict
# the RequestSpec to the origin cell before calling the scheduler to
# pick a new host so the host (host2) in the other cell (cell2) is
# incorrectly picked.
self.assertEqual('host2', server['OS-EXT-SRV-ATTR:host'])