diff --git a/python/drydock_provisioner/control/bootaction.py b/python/drydock_provisioner/control/bootaction.py index d4ee7339..72aa434a 100644 --- a/python/drydock_provisioner/control/bootaction.py +++ b/python/drydock_provisioner/control/bootaction.py @@ -23,8 +23,8 @@ import ulid2 import falcon from drydock_provisioner.objects.fields import ActionResult +from drydock_provisioner.objects.fields import BootactionAssetType import drydock_provisioner.objects as objects - from .base import StatefulResource logger = logging.getLogger('drydock') @@ -261,7 +261,9 @@ class BootactionUtils(object): tarbytes = io.BytesIO() tarball = tarfile.open( mode='w:gz', fileobj=tarbytes, format=tarfile.GNU_FORMAT) - asset_list = asset_list or [] + asset_list = [ + a for a in asset_list if a.type != BootactionAssetType.PackageList + ] for a in asset_list: fileobj = io.BytesIO(a.rendered_bytes) tarasset = tarfile.TarInfo(name=a.path) diff --git a/python/drydock_provisioner/orchestrator/orchestrator.py b/python/drydock_provisioner/orchestrator/orchestrator.py index e28ed154..6ea9f66d 100644 --- a/python/drydock_provisioner/orchestrator/orchestrator.py +++ b/python/drydock_provisioner/orchestrator/orchestrator.py @@ -627,10 +627,14 @@ class Orchestrator(object): for ba in site_design.bootactions: if nodename in ba.target_nodes: + # NOTE(sh8121att) the ulid generation below + # is throw away data as these assets are only used to + # get a full list of packages to deploy assets = ba.render_assets( nodename, site_design, ulid2.generate_binary_ulid(), + ulid2.generate_binary_ulid(), task.design_ref, type_filter=hd_fields.BootactionAssetType.PackageList) for a in assets: diff --git a/python/tests/unit/test_bootaction_asset_render.py b/python/tests/unit/test_bootaction_asset_render.py index eb378f5a..036f0f2d 100644 --- a/python/tests/unit/test_bootaction_asset_render.py +++ b/python/tests/unit/test_bootaction_asset_render.py @@ -17,6 +17,8 @@ import ulid2 import os from drydock_provisioner.statemgmt.state import DrydockState +from drydock_provisioner.objects import Task +from drydock_provisioner.objects import fields as hd_fields class TestBootactionRenderAction(object): @@ -78,7 +80,8 @@ class TestBootactionRenderAction(object): action_key, design_ref) assert action_key.hex() in assets[2].rendered_bytes.decode('utf-8') - assert ulid2.ulid_to_base32(action_id) in assets[2].rendered_bytes.decode('utf-8') + assert ulid2.ulid_to_base32( + action_id) in assets[2].rendered_bytes.decode('utf-8') def test_bootaction_network_context(self, input_files, deckhand_orchestrator, setup): @@ -131,3 +134,18 @@ class TestBootactionRenderAction(object): node_ctx = ba.asset_list[0]._get_node_context('compute01', design_data) assert node_ctx['domain'] == node_domain + + def test_bootaction_pkg_list(self, input_files, deckhand_orchestrator, + setup): + """Test that a list of packages to be installed on a ndoe can be compiled from boot actions.""" + input_file = input_files.join("deckhand_fullsite.yaml") + + design_ref = "file://%s" % str(input_file) + + test_task = Task( + action=hd_fields.OrchestratorAction.Noop, design_ref=design_ref) + + pkg_list = deckhand_orchestrator.find_node_package_lists( + 'compute01', test_task) + + assert len(pkg_list) == 2 diff --git a/python/tests/yaml_samples/deckhand_fullsite.yaml b/python/tests/yaml_samples/deckhand_fullsite.yaml index e259a462..a8f6b065 100644 --- a/python/tests/yaml_samples/deckhand_fullsite.yaml +++ b/python/tests/yaml_samples/deckhand_fullsite.yaml @@ -548,6 +548,10 @@ data: data_pipeline: - utf8_decode - template + - type: pkg_list + data: + 2ping: '3.2.1-1' + '0xffff': null --- schema: 'drydock/BootAction/v1' metadata: