From: Ivan Kruglov Date: Thu, 17 Oct 2024 11:56:25 +0000 (+0200) Subject: machine: use AcquireMetadata in io.systemd.MachineImage.List method X-Git-Tag: v257-rc1~170^2~1 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=9de215219c8783e3239af27baf62275730ab51a8;p=thirdparty%2Fsystemd.git machine: use AcquireMetadata in io.systemd.MachineImage.List method --- diff --git a/src/machine/machined-varlink.c b/src/machine/machined-varlink.c index 88db2cf632c..2c2eb2d918d 100644 --- a/src/machine/machined-varlink.c +++ b/src/machine/machined-varlink.c @@ -598,16 +598,18 @@ static int vl_method_terminate(sd_varlink *link, sd_json_variant *parameters, sd return lookup_machine_and_call_method(link, parameters, flags, userdata, vl_method_terminate_internal); } -static int list_image_one_and_maybe_read_metadata(sd_varlink *link, Image *image, bool more, bool read_metadata) { +static int list_image_one_and_maybe_read_metadata(sd_varlink *link, Image *image, bool more, AcquireMetadata am) { int r; assert(link); assert(image); - if (read_metadata && !image->metadata_valid) { + if (should_acquire_metadata(am) && !image->metadata_valid) { r = image_read_metadata(image, &image_policy_container); - if (r < 0) + if (r < 0 && am != ACQUIRE_METADATA_GRACEFUL) return log_debug_errno(r, "Failed to read image metadata: %m"); + if (r < 0) + log_debug_errno(r, "Failed to read image metadata (graceful mode), ignoring: %m"); } _cleanup_(sd_json_variant_unrefp) sd_json_variant *v = NULL; @@ -628,7 +630,7 @@ static int list_image_one_and_maybe_read_metadata(sd_varlink *link, Image *image if (r < 0) return r; - if (image->metadata_valid) { + if (should_acquire_metadata(am) && image->metadata_valid) { r = sd_json_variant_merge_objectbo( &v, JSON_BUILD_PAIR_STRING_NON_EMPTY("hostname", image->hostname), @@ -648,13 +650,13 @@ static int list_image_one_and_maybe_read_metadata(sd_varlink *link, Image *image static int vl_method_list_images(sd_varlink *link, sd_json_variant *parameters, sd_varlink_method_flags_t flags, void *userdata) { struct params { const char *image_name; - bool acquire_metadata; - } p = {}; + AcquireMetadata acquire_metadata; + } p = { .acquire_metadata = ACQUIRE_METADATA_NO }; int r; static const sd_json_dispatch_field dispatch_table[] = { - { "name", SD_JSON_VARIANT_STRING, sd_json_dispatch_const_string, offsetof(struct params, image_name), 0 }, - { "acquireMetadata", SD_JSON_VARIANT_BOOLEAN, sd_json_dispatch_stdbool, offsetof(struct params, acquire_metadata), 0 }, + { "name", SD_JSON_VARIANT_STRING, sd_json_dispatch_const_string, offsetof(struct params, image_name), 0 }, + { "acquireMetadata", SD_JSON_VARIANT_STRING, json_dispatch_acquire_metadata, offsetof(struct params, acquire_metadata), 0 }, VARLINK_DISPATCH_POLKIT_FIELD, {} }; diff --git a/src/shared/varlink-io.systemd.MachineImage.c b/src/shared/varlink-io.systemd.MachineImage.c index d417af80274..5d3b3fd32f2 100644 --- a/src/shared/varlink-io.systemd.MachineImage.c +++ b/src/shared/varlink-io.systemd.MachineImage.c @@ -5,13 +5,22 @@ #include "bus-polkit.h" #include "varlink-io.systemd.MachineImage.h" +static SD_VARLINK_DEFINE_ENUM_TYPE( + AcquireMetadata, + SD_VARLINK_FIELD_COMMENT("Do not include metadata in the output"), + SD_VARLINK_DEFINE_ENUM_VALUE(no), + SD_VARLINK_FIELD_COMMENT("Include metadata in the output"), + SD_VARLINK_DEFINE_ENUM_VALUE(yes), + SD_VARLINK_FIELD_COMMENT("Include metadata in the output, but gracefully eat up errors"), + SD_VARLINK_DEFINE_ENUM_VALUE(graceful)); + static SD_VARLINK_DEFINE_METHOD_FULL( List, SD_VARLINK_SUPPORTS_MORE, SD_VARLINK_FIELD_COMMENT("If non-null the name of a image to report details on."), SD_VARLINK_DEFINE_INPUT(name, SD_VARLINK_STRING, SD_VARLINK_NULLABLE), SD_VARLINK_FIELD_COMMENT("If true the output will include image metadata fields such as 'machineInfo' and 'OSRelease'."), - SD_VARLINK_DEFINE_INPUT(acquireMetadata, SD_VARLINK_BOOL, SD_VARLINK_NULLABLE), + SD_VARLINK_DEFINE_INPUT_BY_TYPE(acquireMetadata, AcquireMetadata, SD_VARLINK_NULLABLE), VARLINK_DEFINE_POLKIT_INPUT, SD_VARLINK_FIELD_COMMENT("Name of the image"), SD_VARLINK_DEFINE_OUTPUT(name, SD_VARLINK_STRING, 0), @@ -61,6 +70,8 @@ static SD_VARLINK_DEFINE_ERROR(NoSuchImage); SD_VARLINK_DEFINE_INTERFACE( io_systemd_MachineImage, "io.systemd.MachineImage", + SD_VARLINK_SYMBOL_COMMENT("A enum field allowing to gracefully get metadata"), + &vl_type_AcquireMetadata, SD_VARLINK_SYMBOL_COMMENT("List images"), &vl_method_List, SD_VARLINK_SYMBOL_COMMENT("Update image allowing to rename or toggle read-only flag"), diff --git a/test/units/TEST-13-NSPAWN.machined.sh b/test/units/TEST-13-NSPAWN.machined.sh index da62b465ea2..f9ba8ea6567 100755 --- a/test/units/TEST-13-NSPAWN.machined.sh +++ b/test/units/TEST-13-NSPAWN.machined.sh @@ -306,7 +306,7 @@ varlinkctl call /run/systemd/machine/io.systemd.Machine io.systemd.Machine.Unreg varlinkctl --more call /run/systemd/machine/io.systemd.MachineImage io.systemd.MachineImage.List '{}' | grep 'long-running' varlinkctl --more call /run/systemd/machine/io.systemd.MachineImage io.systemd.MachineImage.List '{}' | grep '.host' varlinkctl call /run/systemd/machine/io.systemd.MachineImage io.systemd.MachineImage.List '{"name":"long-running"}' -varlinkctl call /run/systemd/machine/io.systemd.MachineImage io.systemd.MachineImage.List '{"name":"long-running", "acquireMetadata": true}' | grep 'OSRelease' +varlinkctl call /run/systemd/machine/io.systemd.MachineImage io.systemd.MachineImage.List '{"name":"long-running", "acquireMetadata": "yes"}' | grep 'OSRelease' # test io.systemd.MachineImage.Update varlinkctl call /run/systemd/machine/io.systemd.MachineImage io.systemd.MachineImage.Update '{"name":"long-running", "newName": "long-running-renamed", "readOnly": true}'