Merge ~twom/launchpad:oci-show-cancelled-builds-correctly into launchpad:master

Proposed by Tom Wardill
Status: Merged
Approved by: Tom Wardill
Approved revision: 1377be46fd645b65e6f1e72ad6e83ad2c722f4be
Merge reported by: Otto Co-Pilot
Merged at revision: not available
Proposed branch: ~twom/launchpad:oci-show-cancelled-builds-correctly
Merge into: launchpad:master
Diff against target: 110 lines (+80/-1)
2 files modified
lib/lp/oci/browser/tests/test_ocirecipe.py (+78/-0)
lib/lp/oci/model/ocirecipe.py (+2/-1)
Reviewer Review Type Date Requested Status
Colin Watson (community) Approve
Review via email: mp+407035@code.launchpad.net

Commit message

Show cancelled builds as failed in the buildset

To post a comment you must log in.
Revision history for this message
Colin Watson (cjwatson) :
review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
diff --git a/lib/lp/oci/browser/tests/test_ocirecipe.py b/lib/lp/oci/browser/tests/test_ocirecipe.py
index 913b849..408c032 100644
--- a/lib/lp/oci/browser/tests/test_ocirecipe.py
+++ b/lib/lp/oci/browser/tests/test_ocirecipe.py
@@ -1364,6 +1364,84 @@ class TestOCIRecipeView(BaseTestOCIRecipeView):
1364 "This OCI recipe contains Public information",1364 "This OCI recipe contains Public information",
1365 extract_text(privacy_tag))1365 extract_text(privacy_tag))
13661366
1367 def test_index_cancelled_build(self):
1368 oci_project = self.factory.makeOCIProject(
1369 pillar=self.distroseries.distribution)
1370 oci_project_display = oci_project.display_name
1371 [ref] = self.factory.makeGitRefs(
1372 owner=self.person, target=self.person, name="recipe-repository",
1373 paths=["refs/heads/v1.0-20.04"])
1374 recipe = self.makeRecipe(
1375 processor_names=["amd64", "386"],
1376 build_file="Dockerfile", git_ref=ref,
1377 oci_project=oci_project, registrant=self.person, owner=self.person)
1378 build_request = recipe.requestBuilds(self.person)
1379 builds = recipe.requestBuildsFromJob(self.person, build_request)
1380 job = removeSecurityProxy(build_request).job
1381 removeSecurityProxy(job).builds = builds
1382
1383 for build in builds:
1384 removeSecurityProxy(build).updateStatus(
1385 BuildStatus.BUILDING, builder=None,
1386 date_started=build.date_created)
1387 removeSecurityProxy(build).updateStatus(
1388 BuildStatus.CANCELLED, builder=None,
1389 date_finished=build.date_started + timedelta(minutes=30))
1390
1391 # We also need to account for builds that don't have a build_request
1392 build = self.makeBuild(
1393 recipe=recipe, status=BuildStatus.FULLYBUILT,
1394 duration=timedelta(minutes=30))
1395
1396 browser = self.getViewBrowser(build_request.recipe)
1397 login_person(self.person)
1398 self.assertTextMatchesExpressionIgnoreWhitespace("""\
1399 .*
1400 OCI recipe information
1401 Owner: Test Person
1402 OCI project: %s
1403 Source: ~test-person/\\+git/recipe-repository:v1.0-20.04
1404 Build file path: Dockerfile
1405 Build context directory: %s
1406 Build schedule: Built on request
1407 Official recipe:
1408 No
1409 Latest builds
1410 Build status
1411 Upload status
1412 When requested
1413 When complete
1414 There were build failures.
1415 No registry upload requested.
1416 a moment ago
1417 in 29 minutes
1418 amd64
1419 Cancelled build
1420 386
1421 Cancelled build
1422 amd64
1423 in 29 minutes
1424 386
1425 in 29 minutes
1426 All builds were built successfully.
1427 No registry upload requested.
1428 1 hour ago
1429 30 minutes ago
1430 386
1431 Successfully built
1432 386
1433 30 minutes ago
1434 Recipe push rules
1435 This OCI recipe has no push rules defined yet.
1436 """ % (oci_project_display, recipe.build_path),
1437 extract_text(find_main_content(browser.contents)))
1438
1439 # Check portlet on side menu.
1440 privacy_tag = find_tag_by_id(browser.contents, "privacy")
1441 self.assertTextMatchesExpressionIgnoreWhitespace(
1442 "This OCI recipe contains Public information",
1443 extract_text(privacy_tag))
1444
1367 def test_index_for_private_recipe_shows_banner(self):1445 def test_index_for_private_recipe_shows_banner(self):
1368 recipe = self.factory.makeOCIRecipe(1446 recipe = self.factory.makeOCIRecipe(
1369 registrant=self.person, owner=self.person,1447 registrant=self.person, owner=self.person,
diff --git a/lib/lp/oci/model/ocirecipe.py b/lib/lp/oci/model/ocirecipe.py
index adab5b9..5e491a7 100644
--- a/lib/lp/oci/model/ocirecipe.py
+++ b/lib/lp/oci/model/ocirecipe.py
@@ -972,6 +972,7 @@ class OCIRecipeSet:
972 building = collect_builds(BuildStatus.BUILDING,972 building = collect_builds(BuildStatus.BUILDING,
973 BuildStatus.UPLOADING)973 BuildStatus.UPLOADING)
974 successful = collect_builds(BuildStatus.FULLYBUILT)974 successful = collect_builds(BuildStatus.FULLYBUILT)
975 cancelled = collect_builds(BuildStatus.CANCELLED)
975976
976 # Note: the BuildStatus DBItems are used here to summarize the977 # Note: the BuildStatus DBItems are used here to summarize the
977 # status of a set of builds:s978 # status of a set of builds:s
@@ -987,7 +988,7 @@ class OCIRecipeSet:
987 'status': BuildSetStatus.NEEDSBUILD,988 'status': BuildSetStatus.NEEDSBUILD,
988 'builds': needsbuild,989 'builds': needsbuild,
989 }990 }
990 elif len(failed) != 0:991 elif len(failed) != 0 or len(cancelled) != 0:
991 return {992 return {
992 'status': BuildSetStatus.FAILEDTOBUILD,993 'status': BuildSetStatus.FAILEDTOBUILD,
993 'builds': failed,994 'builds': failed,

Subscribers

People subscribed via source and target branches

to status/vote changes: