From ea00e28452d49a34053d7b4e2ec69ca3cecb61ef Mon Sep 17 00:00:00 2001 From: Masahito Muroi Date: Tue, 21 Jan 2025 09:57:40 +0900 Subject: [PATCH] Add ServersViewBuilderTestV296 unit test class This new class is an unit test class for the server view builder v2.96, which reproduces the bug #2095364. The bug is the list server API and the list server details API returns 500 Internal Server Error if request_spec object is missing by any reason. Related-Bug: #2095364 Change-Id: I80d06ea335dd6fb311c4b9c9a79dbaa46ebe695f Signed-off-by: Wesley Hershberger (cherry picked from commit 466156c3d51153b5c2565f5e13d8508dcc2fbf85) (cherry picked from commit 706642bde33a13834ed7095f87df718f0da0500f) --- .../api/openstack/compute/test_servers.py | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/nova/tests/unit/api/openstack/compute/test_servers.py b/nova/tests/unit/api/openstack/compute/test_servers.py index ede2f9f9de8e..e5bb52495aff 100644 --- a/nova/tests/unit/api/openstack/compute/test_servers.py +++ b/nova/tests/unit/api/openstack/compute/test_servers.py @@ -8320,6 +8320,61 @@ class ServersViewBuilderTestV269(_ServersViewBuilderTest): self.assertThat(output, matchers.DictMatches(expected)) +class ServersViewBuilderTestV296(_ServersViewBuilderTest): + """Server ViewBuilder test for microversion 2.96 + + The test targets of this class is regression test for bugs + related to this microversion. + """ + microversion = '2.96' + + def setUp(self): + super(ServersViewBuilderTestV296, self).setUp() + self.view_builder = views.servers.ViewBuilder() + self.ctxt = context.RequestContext('fake', self.project_id) + + def req(self, url, use_admin_context=False): + return fakes.HTTPRequest.blank( + url, + use_admin_context=use_admin_context, + version=self.microversion) + + def create_instance(self, instance_id, uuid, display_name): + db_inst = fakes.stub_instance( + id=instance_id, + image_ref="5", + uuid=uuid, + display_name=display_name, + include_fake_metadata=False, + availability_zone='nova', + launched_at=None, + terminated_at=None, + task_state=None, + vm_state=vm_states.ACTIVE, + power_state=1) + + return fake_instance.fake_instance_obj( + self.request.context, + expected_attrs=instance_obj.INSTANCE_DEFAULT_FIELDS, + **db_inst) + + @mock.patch('nova.objects.RequestSpec.get_by_instance_uuids') + def test_list_view_with_missing_request_specs(self, m_rs): + + self.instances = [ + self.instance, + self.create_instance(2, uuids.fake1, 'fake-server') + ] + # Return only first instance's request spec + m_rs.return_value = [objects.RequestSpec( + instance_uuid=self.instance.uuid, + availability_zone=self.instance.availability_zone)] + + req = self.req('/%s/servers' % self.project_id) + self.assertRaises(KeyError, self.view_builder.index, + req, self.instances, False) + + class ServersActionsJsonTestV239(test.NoDBTestCase): def setUp(self):