Merge "Avoid 500 on /project with no project configs"

This commit is contained in:
Zuul
2025-04-14 22:39:15 +00:00
committed by Gerrit Code Review
2 changed files with 33 additions and 1 deletions

View File

@@ -987,6 +987,33 @@ class TestWeb(BaseTestWeb):
}] }]
}, data) }, data)
def test_web_project_get_no_config(self):
# can we fetch project details for projects with no project stanza
self.commitConfigUpdate(
'common-config',
'layouts/empty-check.yaml')
self.scheds.execute(lambda app: app.sched.reconfigure(app.config))
self.waitUntilSettled()
layout_scheduler = self.scheds.first.sched.local_layout_state.get(
'tenant-one')
for _ in iterate_timeout(10, "local layout of zuul-web to be updated"):
layout_web = self.web.web.local_layout_state.get('tenant-one')
if layout_web == layout_scheduler:
break
data = self.get_url(
'api/tenant/tenant-one/project/org/project1').json()
self.assertEqual(
{
'canonical_name': 'review.example.com/org/project1',
'configs': [],
'metadata': {},
'connection_name': 'gerrit',
'name': 'org/project1'
},
data)
def test_web_keys(self): def test_web_keys(self):
with open(os.path.join(FIXTURE_DIR, 'public.pem'), 'rb') as f: with open(os.path.join(FIXTURE_DIR, 'public.pem'), 'rb') as f:
public_pem = f.read() public_pem = f.read()

View File

@@ -1918,7 +1918,12 @@ class ZuulWebAPI(object):
result = project.toDict() result = project.toDict()
result['configs'] = [] result['configs'] = []
md = tenant.layout.getProjectMetadata(project.canonical_name).toDict() result['metadata'] = {}
md = tenant.layout.getProjectMetadata(project.canonical_name)
if md is None:
# No actual configuration of the project in this tenant
return result
md = md.toDict()
md['merge_mode'] = model.get_merge_mode_name(md['merge_mode']) md['merge_mode'] = model.get_merge_mode_name(md['merge_mode'])
result['metadata'] = md result['metadata'] = md
configs = tenant.layout.getAllProjectConfigs(project.canonical_name) configs = tenant.layout.getAllProjectConfigs(project.canonical_name)