From ab6f78b33bc1fdfacf30a725c80c42d8a0029f3a Mon Sep 17 00:00:00 2001 From: Takashi NATSUME Date: Mon, 2 Apr 2018 11:55:53 +0900 Subject: [PATCH] Fix the request context in ServiceFixture Multiple cells are not considered in ServiceFixture. So all compute nodes are registered to only one cell (cell1) database regardless of their cells. So change the ServiceFixture to use a request context for the cell where the service runs. Closes-Bug: #1759792 Change-Id: I6e940518c6ec27c02c714db6c124eb88c72214ab (cherry picked from commit 6a06fd28c285786767c0af93149c32aa61846ff9) --- nova/test.py | 3 ++- nova/tests/fixtures.py | 12 +++++++++--- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/nova/test.py b/nova/test.py index 031618a71d43..5895f60944d0 100644 --- a/nova/test.py +++ b/nova/test.py @@ -409,6 +409,7 @@ class TestCase(testtools.TestCase): CONF.set_override(k, v, group) def start_service(self, name, host=None, **kwargs): + cell = None if name == 'compute' and self.USES_DB: # NOTE(danms): We need to create the HostMapping first, because # otherwise we'll fail to update the scheduler while running @@ -424,7 +425,7 @@ class TestCase(testtools.TestCase): # Make sure that CONF.host is relevant to the right hostname self.useFixture(nova_fixtures.ConfPatcher(host=host)) svc = self.useFixture( - nova_fixtures.ServiceFixture(name, host, **kwargs)) + nova_fixtures.ServiceFixture(name, host, cell=cell, **kwargs)) return svc.service diff --git a/nova/tests/fixtures.py b/nova/tests/fixtures.py index 0871e077e482..dd66530d4ef3 100644 --- a/nova/tests/fixtures.py +++ b/nova/tests/fixtures.py @@ -65,7 +65,7 @@ SESSION_CONFIGURED = False class ServiceFixture(fixtures.Fixture): """Run a service as a test fixture.""" - def __init__(self, name, host=None, **kwargs): + def __init__(self, name, host=None, cell=None, **kwargs): name = name # If not otherwise specified, the host will default to the # name of the service. Some things like aggregates care that @@ -73,12 +73,18 @@ class ServiceFixture(fixtures.Fixture): host = host or name kwargs.setdefault('host', host) kwargs.setdefault('binary', 'nova-%s' % name) + self.cell = cell self.kwargs = kwargs def setUp(self): super(ServiceFixture, self).setUp() - self.service = service.Service.create(**self.kwargs) - self.service.start() + self.ctxt = context.get_admin_context() + if self.cell: + context.set_target_cell(self.ctxt, self.cell) + with mock.patch('nova.context.get_admin_context', + return_value=self.ctxt): + self.service = service.Service.create(**self.kwargs) + self.service.start() self.addCleanup(self.service.kill)