]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
machine: use AcquireMetadata in io.systemd.MachineImage.List method
authorIvan Kruglov <mail@ikruglov.com>
Thu, 17 Oct 2024 11:56:25 +0000 (13:56 +0200)
committerIvan Kruglov <mail@ikruglov.com>
Mon, 21 Oct 2024 15:42:37 +0000 (17:42 +0200)
src/machine/machined-varlink.c
src/shared/varlink-io.systemd.MachineImage.c
test/units/TEST-13-NSPAWN.machined.sh

index 88db2cf632caa020874f367fce1d734c10ea6663..2c2eb2d918d1fbf399fbf6ea45a17e942da45c2d 100644 (file)
@@ -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,
                 {}
         };
index d417af802748f621710e68f395177a94a441132e..5d3b3fd32f252ae24e5aa0fbdfefb6da95f8b583 100644 (file)
@@ -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"),
index da62b465ea2350d49df0528fb291402d02ffc657..f9ba8ea6567ab93cf9971d8b27081c058b02e1cb 100755 (executable)
@@ -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}'