Skip to content

Commit ebe599d

Browse files
authored
Create missing image and layer directory codebase resources (#1946)
Signed-off-by: tdruez <[email protected]>
1 parent aff08bf commit ebe599d

File tree

8 files changed

+529
-7
lines changed

8 files changed

+529
-7
lines changed

.github/workflows/sca-integration-cyclonedx-gomod.yml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ on:
1313
schedule:
1414
# Run once a week (every 7 days) at 00:00 UTC on Sunday
1515
- cron: "0 0 * * 0"
16-
pull_request:
1716

1817
permissions:
1918
contents: read

scanpipe/pipes/docker.py

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -169,8 +169,24 @@ def get_layer_tag(image_id, layer_id, layer_index, id_length=6):
169169
return f"img-{short_image_id}-layer-{layer_index:02}-{short_layer_id}"
170170

171171

172-
def create_codebase_resources(project, image):
173-
"""Create the CodebaseResource for an `image` in a `project`."""
172+
def create_codebase_resources(project, image: Image) -> None:
173+
"""
174+
Create codebase resources for the provided image and its layers.
175+
176+
Creates a codebase resource for the extracted image root directory and each
177+
extracted layer directory, ensuring the structure is properly indexed for tree
178+
rendering.
179+
180+
Args:
181+
project: The project instance.
182+
image: The image object with the extracted_location attribute.
183+
184+
"""
185+
pipes.make_codebase_resource(
186+
project=project,
187+
location=str(project.codebase_path / Path(image.extracted_location).name),
188+
)
189+
174190
for layer_index, layer in enumerate(image.layers, start=1):
175191
layer_tag = get_layer_tag(image.image_id, layer.layer_id, layer_index)
176192

@@ -182,6 +198,17 @@ def create_codebase_resources(project, image):
182198
tag=layer_tag,
183199
)
184200

201+
layer_data = layer.to_dict()
202+
layer_data.pop("extracted_location", None)
203+
layer_data.pop("archive_location", None)
204+
pipes.make_codebase_resource(
205+
project=project,
206+
location=str(layer.extracted_location),
207+
tag=layer_tag,
208+
# Store the layer data in the extra_data for display in the UI
209+
extra_data={"layer": layer_data},
210+
)
211+
185212

186213
def create_system_package(project, purl, package, layer, layer_tag):
187214
"""Create system package and related resources."""

scanpipe/tests/data/docker/alpine_3_15_4_scan_codebase.json

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1574,6 +1574,94 @@
15741574
],
15751575
"dependencies": [],
15761576
"files": [
1577+
{
1578+
"path": "alpine_3_15_4.tar.gz-extract",
1579+
"type": "directory",
1580+
"name": "alpine_3_15_4.tar.gz-extract",
1581+
"status": "scanned",
1582+
"for_packages": [],
1583+
"tag": "",
1584+
"extension": ".tar.gz-extract",
1585+
"programming_language": "",
1586+
"detected_license_expression": "",
1587+
"detected_license_expression_spdx": "",
1588+
"license_detections": [],
1589+
"license_clues": [],
1590+
"percentage_of_license_text": null,
1591+
"copyrights": [],
1592+
"holders": [],
1593+
"authors": [],
1594+
"package_data": [],
1595+
"emails": [],
1596+
"urls": [],
1597+
"md5": "",
1598+
"sha1": "",
1599+
"sha256": "",
1600+
"sha512": "",
1601+
"sha1_git": "",
1602+
"is_binary": false,
1603+
"is_text": false,
1604+
"is_archive": false,
1605+
"is_media": false,
1606+
"is_legal": false,
1607+
"is_manifest": false,
1608+
"is_readme": false,
1609+
"is_top_level": false,
1610+
"is_key_file": false,
1611+
"extra_data": {}
1612+
},
1613+
{
1614+
"path": "alpine_3_15_4.tar.gz-extract/40e48c8ef2450e6a9e8d50b846a58ede43f1b01dd351d2bdd7dca14c5c033f20",
1615+
"type": "directory",
1616+
"name": "40e48c8ef2450e6a9e8d50b846a58ede43f1b01dd351d2bdd7dca14c5c033f20",
1617+
"status": "scanned",
1618+
"for_packages": [],
1619+
"tag": "img-06c7c4-layer-01-40e48c",
1620+
"extension": "",
1621+
"programming_language": "",
1622+
"detected_license_expression": "",
1623+
"detected_license_expression_spdx": "",
1624+
"license_detections": [],
1625+
"license_clues": [],
1626+
"percentage_of_license_text": null,
1627+
"copyrights": [],
1628+
"holders": [],
1629+
"authors": [],
1630+
"package_data": [],
1631+
"emails": [],
1632+
"urls": [],
1633+
"md5": "",
1634+
"sha1": "",
1635+
"sha256": "",
1636+
"sha512": "",
1637+
"sha1_git": "",
1638+
"is_binary": false,
1639+
"is_text": false,
1640+
"is_archive": false,
1641+
"is_media": false,
1642+
"is_legal": false,
1643+
"is_manifest": false,
1644+
"is_readme": false,
1645+
"is_top_level": false,
1646+
"is_key_file": false,
1647+
"extra_data": {
1648+
"layer": {
1649+
"os": null,
1650+
"author": null,
1651+
"labels": [],
1652+
"sha256": "40e48c8ef2450e6a9e8d50b846a58ede43f1b01dd351d2bdd7dca14c5c033f20",
1653+
"comment": null,
1654+
"created": "2022-04-05T00:19:59.790636867Z",
1655+
"variant": null,
1656+
"layer_id": "40e48c8ef2450e6a9e8d50b846a58ede43f1b01dd351d2bdd7dca14c5c033f20",
1657+
"created_by": "/bin/sh -c #(nop) ADD file:5d673d25da3a14ce1f6cf66e4c7fd4f4b85a3759a9d93efb3fd9ff852b5b56e4 in / ",
1658+
"os_version": null,
1659+
"architecture": null,
1660+
"docker_version": null,
1661+
"is_empty_layer": false
1662+
}
1663+
}
1664+
},
15771665
{
15781666
"path": "alpine_3_15_4.tar.gz-extract/40e48c8ef2450e6a9e8d50b846a58ede43f1b01dd351d2bdd7dca14c5c033f20/bin",
15791667
"type": "directory",

scanpipe/tests/data/docker/centos_scan_codebase.json

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191354,6 +191354,94 @@
191354191354
],
191355191355
"dependencies": [],
191356191356
"files": [
191357+
{
191358+
"path": "centos.tar.gz-extract",
191359+
"type": "directory",
191360+
"name": "centos.tar.gz-extract",
191361+
"status": "scanned",
191362+
"for_packages": [],
191363+
"tag": "",
191364+
"extension": ".tar.gz-extract",
191365+
"programming_language": "",
191366+
"detected_license_expression": "",
191367+
"detected_license_expression_spdx": "",
191368+
"license_detections": [],
191369+
"license_clues": [],
191370+
"percentage_of_license_text": null,
191371+
"copyrights": [],
191372+
"holders": [],
191373+
"authors": [],
191374+
"package_data": [],
191375+
"emails": [],
191376+
"urls": [],
191377+
"md5": "",
191378+
"sha1": "",
191379+
"sha256": "",
191380+
"sha512": "",
191381+
"sha1_git": "",
191382+
"is_binary": false,
191383+
"is_text": false,
191384+
"is_archive": false,
191385+
"is_media": false,
191386+
"is_legal": false,
191387+
"is_manifest": false,
191388+
"is_readme": false,
191389+
"is_top_level": false,
191390+
"is_key_file": false,
191391+
"extra_data": {}
191392+
},
191393+
{
191394+
"path": "centos.tar.gz-extract/a10cf747c363a52be048f884c084a25e03280d54a7ac02e17dbd8c5ad160e9bd",
191395+
"type": "directory",
191396+
"name": "a10cf747c363a52be048f884c084a25e03280d54a7ac02e17dbd8c5ad160e9bd",
191397+
"status": "scanned",
191398+
"for_packages": [],
191399+
"tag": "img-c967b7-layer-01-a10cf7",
191400+
"extension": "",
191401+
"programming_language": "",
191402+
"detected_license_expression": "",
191403+
"detected_license_expression_spdx": "",
191404+
"license_detections": [],
191405+
"license_clues": [],
191406+
"percentage_of_license_text": null,
191407+
"copyrights": [],
191408+
"holders": [],
191409+
"authors": [],
191410+
"package_data": [],
191411+
"emails": [],
191412+
"urls": [],
191413+
"md5": "",
191414+
"sha1": "",
191415+
"sha256": "",
191416+
"sha512": "",
191417+
"sha1_git": "",
191418+
"is_binary": false,
191419+
"is_text": false,
191420+
"is_archive": false,
191421+
"is_media": false,
191422+
"is_legal": false,
191423+
"is_manifest": false,
191424+
"is_readme": false,
191425+
"is_top_level": false,
191426+
"is_key_file": false,
191427+
"extra_data": {
191428+
"layer": {
191429+
"os": null,
191430+
"author": null,
191431+
"labels": [],
191432+
"sha256": "a10cf747c363a52be048f884c084a25e03280d54a7ac02e17dbd8c5ad160e9bd",
191433+
"comment": null,
191434+
"created": null,
191435+
"variant": null,
191436+
"layer_id": "a10cf747c363a52be048f884c084a25e03280d54a7ac02e17dbd8c5ad160e9bd",
191437+
"created_by": null,
191438+
"os_version": null,
191439+
"architecture": null,
191440+
"docker_version": null,
191441+
"is_empty_layer": false
191442+
}
191443+
}
191444+
},
191357191445
{
191358191446
"path": "centos.tar.gz-extract/a10cf747c363a52be048f884c084a25e03280d54a7ac02e17dbd8c5ad160e9bd/etc",
191359191447
"type": "directory",

scanpipe/tests/data/docker/debian_scan_codebase.json

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -439,6 +439,94 @@
439439
],
440440
"dependencies": [],
441441
"files": [
442+
{
443+
"path": "debian.tar.gz-extract",
444+
"type": "directory",
445+
"name": "debian.tar.gz-extract",
446+
"status": "scanned",
447+
"for_packages": [],
448+
"tag": "",
449+
"extension": ".tar.gz-extract",
450+
"programming_language": "",
451+
"detected_license_expression": "",
452+
"detected_license_expression_spdx": "",
453+
"license_detections": [],
454+
"license_clues": [],
455+
"percentage_of_license_text": null,
456+
"copyrights": [],
457+
"holders": [],
458+
"authors": [],
459+
"package_data": [],
460+
"emails": [],
461+
"urls": [],
462+
"md5": "",
463+
"sha1": "",
464+
"sha256": "",
465+
"sha512": "",
466+
"sha1_git": "",
467+
"is_binary": false,
468+
"is_text": false,
469+
"is_archive": false,
470+
"is_media": false,
471+
"is_legal": false,
472+
"is_manifest": false,
473+
"is_readme": false,
474+
"is_top_level": false,
475+
"is_key_file": false,
476+
"extra_data": {}
477+
},
478+
{
479+
"path": "debian.tar.gz-extract/8a63761caf6d45e65b8e6cdc2e0c03c55625fd142ec3356b80a9ea4a34b11b66",
480+
"type": "directory",
481+
"name": "8a63761caf6d45e65b8e6cdc2e0c03c55625fd142ec3356b80a9ea4a34b11b66",
482+
"status": "scanned",
483+
"for_packages": [],
484+
"tag": "img-c19c05-layer-01-8a6376",
485+
"extension": "",
486+
"programming_language": "",
487+
"detected_license_expression": "",
488+
"detected_license_expression_spdx": "",
489+
"license_detections": [],
490+
"license_clues": [],
491+
"percentage_of_license_text": null,
492+
"copyrights": [],
493+
"holders": [],
494+
"authors": [],
495+
"package_data": [],
496+
"emails": [],
497+
"urls": [],
498+
"md5": "",
499+
"sha1": "",
500+
"sha256": "",
501+
"sha512": "",
502+
"sha1_git": "",
503+
"is_binary": false,
504+
"is_text": false,
505+
"is_archive": false,
506+
"is_media": false,
507+
"is_legal": false,
508+
"is_manifest": false,
509+
"is_readme": false,
510+
"is_top_level": false,
511+
"is_key_file": false,
512+
"extra_data": {
513+
"layer": {
514+
"os": null,
515+
"author": null,
516+
"labels": [],
517+
"sha256": "8a63761caf6d45e65b8e6cdc2e0c03c55625fd142ec3356b80a9ea4a34b11b66",
518+
"comment": null,
519+
"created": "2022-04-29T23:21:15.290486282Z",
520+
"variant": null,
521+
"layer_id": "8a63761caf6d45e65b8e6cdc2e0c03c55625fd142ec3356b80a9ea4a34b11b66",
522+
"created_by": "/bin/sh -c #(nop) ADD file:37744639836b248c88f6e126619829290b45c233309538310e8fffb82e98eaf8 in / ",
523+
"os_version": null,
524+
"architecture": null,
525+
"docker_version": null,
526+
"is_empty_layer": false
527+
}
528+
}
529+
},
442530
{
443531
"path": "debian.tar.gz-extract/8a63761caf6d45e65b8e6cdc2e0c03c55625fd142ec3356b80a9ea4a34b11b66/etc",
444532
"type": "directory",

0 commit comments

Comments
 (0)