From d0f52805ae6c7d33a741805ee25d973175b841d0 Mon Sep 17 00:00:00 2001 From: tdruez <489057+tdruez@users.noreply.github.com> Date: Tue, 31 Dec 2024 15:55:27 +0100 Subject: [PATCH] Load the LAYERS sheet data in load_inventory_from_xlsx #1490 (#1491) Signed-off-by: tdruez --- scanpipe/pipes/input.py | 5 ++++- .../outputs/docker_ghcr.io_kyverno_sbom.xlsx | Bin 0 -> 29398 bytes .../docker_ghcr.io_kyverno_sbom_expected.json | 16 ++++++++++++++++ scanpipe/tests/pipes/test_input.py | 11 +++++++++++ 4 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 scanpipe/tests/data/outputs/docker_ghcr.io_kyverno_sbom.xlsx create mode 100644 scanpipe/tests/data/outputs/docker_ghcr.io_kyverno_sbom_expected.json diff --git a/scanpipe/pipes/input.py b/scanpipe/pipes/input.py index f57e7eafd..0ca8c0cb2 100644 --- a/scanpipe/pipes/input.py +++ b/scanpipe/pipes/input.py @@ -19,7 +19,6 @@ # # ScanCode.io is a free software code scanning tool from nexB Inc. and others. # Visit https://github.com/aboutcode-org/scancode.io for support and download. - import shutil from pathlib import Path @@ -199,3 +198,7 @@ def load_inventory_from_xlsx(project, input_location): cleaned_data = clean_xlsx_data_to_model_data(model_class, row_data) if cleaned_data: object_maker_func(project, cleaned_data) + + if "LAYERS" in workbook: + layers_data = get_worksheet_data(worksheet=workbook["LAYERS"]) + project.update_extra_data({"layers": layers_data}) diff --git a/scanpipe/tests/data/outputs/docker_ghcr.io_kyverno_sbom.xlsx b/scanpipe/tests/data/outputs/docker_ghcr.io_kyverno_sbom.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..e6414efd6251a1d328713f794c14be9b8e3979a0 GIT binary patch literal 29398 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 literal 0 HcmV?d00001 diff --git a/scanpipe/tests/data/outputs/docker_ghcr.io_kyverno_sbom_expected.json b/scanpipe/tests/data/outputs/docker_ghcr.io_kyverno_sbom_expected.json new file mode 100644 index 000000000..de21973a3 --- /dev/null +++ b/scanpipe/tests/data/outputs/docker_ghcr.io_kyverno_sbom_expected.json @@ -0,0 +1,16 @@ +{ + "layers": [ + { + "size": "5886464", + "author": null, + "comment": null, + "created": "2021-11-12T17:19:44.795237917Z", + "image_id": "12ebda3111cec73a788b0e802a00de04ebf5e9765043925dd396c2d03a7c1e66", + "layer_id": "1a058d5342cc722ad5439cacae4b2b4eedde51d8fe8800fcf28444302355c16d", + "layer_tag": "img-12ebda-layer-01-1a058d", + "created_by": "/bin/sh -c #(nop) ADD file:762c899ec0505d1a32930ee804c5b008825f41611161be104076cba33b7e5b2b in / ", + "xlsx_errors": null, + "archive_location": "ghcr_io_kyverno_sbom.tar-extract/1a058d5342cc722ad5439cacae4b2b4eedde51d8fe8800fcf28444302355c16d.tar" + } + ] +} \ No newline at end of file diff --git a/scanpipe/tests/pipes/test_input.py b/scanpipe/tests/pipes/test_input.py index d81f92e24..55f8ebddf 100644 --- a/scanpipe/tests/pipes/test_input.py +++ b/scanpipe/tests/pipes/test_input.py @@ -118,6 +118,17 @@ def test_scanpipe_pipes_input_load_inventory_from_xlsx(self): self.assertEqual(8, project1.discovereddependencies.count()) self.assertEqual(0, project1.codebaserelations.count()) + def test_scanpipe_pipes_input_load_inventory_from_xlsx_layers_sheet(self): + project1 = Project.objects.create(name="Analysis") + input_location = self.data / "outputs" / "docker_ghcr.io_kyverno_sbom.xlsx" + input.load_inventory_from_xlsx(project1, input_location) + project1.refresh_from_db() + expected_location = ( + self.data / "outputs" / "docker_ghcr.io_kyverno_sbom_expected.json" + ) + expected = json.loads(expected_location.read_text()) + self.assertEqual(expected, project1.extra_data) + def test_scanpipe_pipes_input_load_inventory_from_project_xlsx_output(self): fixtures = self.data / "asgiref" / "asgiref-3.3.0_fixtures.json" call_command("loaddata", fixtures, **{"verbosity": 0})