core: implement AutomountContext/Runtime for io.systemd.Unit.List + tests
This commit is contained in:
@@ -64,6 +64,7 @@ libcore_sources = files(
|
||||
'unit-serialize.c',
|
||||
'unit.c',
|
||||
'varlink.c',
|
||||
'varlink-automount.c',
|
||||
'varlink-cgroup.c',
|
||||
'varlink-common.c',
|
||||
'varlink-dynamic-user.c',
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
/* SPDX-License-Identifier: LGPL-2.1-or-later */
|
||||
|
||||
#include "sd-json.h"
|
||||
|
||||
#include "automount.h"
|
||||
#include "json-util.h"
|
||||
#include "varlink-automount.h"
|
||||
|
||||
int automount_context_build_json(sd_json_variant **ret, const char *name, void *userdata) {
|
||||
Automount *a = ASSERT_PTR(AUTOMOUNT(userdata));
|
||||
return sd_json_buildo(
|
||||
ASSERT_PTR(ret),
|
||||
JSON_BUILD_PAIR_STRING_NON_EMPTY("Where", a->where),
|
||||
JSON_BUILD_PAIR_STRING_NON_EMPTY("ExtraOptions", a->extra_options),
|
||||
SD_JSON_BUILD_PAIR_UNSIGNED("DirectoryMode", a->directory_mode),
|
||||
JSON_BUILD_PAIR_FINITE_USEC("TimeoutIdleUSec", a->timeout_idle_usec));
|
||||
}
|
||||
|
||||
int automount_runtime_build_json(sd_json_variant **ret, const char *name, void *userdata) {
|
||||
Automount *a = ASSERT_PTR(AUTOMOUNT(userdata));
|
||||
return sd_json_buildo(ASSERT_PTR(ret), JSON_BUILD_PAIR_ENUM("Result", automount_result_to_string(a->result)));
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
/* SPDX-License-Identifier: LGPL-2.1-or-later */
|
||||
#pragma once
|
||||
|
||||
#include "core-forward.h"
|
||||
|
||||
int automount_context_build_json(sd_json_variant **ret, const char *name, void *userdata);
|
||||
int automount_runtime_build_json(sd_json_variant **ret, const char *name, void *userdata);
|
||||
+15
-11
@@ -18,6 +18,7 @@
|
||||
#include "set.h"
|
||||
#include "strv.h"
|
||||
#include "unit.h"
|
||||
#include "varlink-automount.h"
|
||||
#include "varlink-cgroup.h"
|
||||
#include "varlink-execute.h"
|
||||
#include "varlink-kill.h"
|
||||
@@ -113,6 +114,11 @@ static int unit_context_build_json(sd_json_variant **ret, const char *name, void
|
||||
* If it make sense to place a property into a config/unit file it belongs to Context.
|
||||
* Otherwise it's a 'Runtime'. */
|
||||
|
||||
/* TODO missing callbacks */
|
||||
static const sd_json_build_callback_t unit_type_callbacks[_UNIT_TYPE_MAX] = {
|
||||
[UNIT_AUTOMOUNT] = automount_context_build_json,
|
||||
};
|
||||
|
||||
return sd_json_buildo(
|
||||
ASSERT_PTR(ret),
|
||||
SD_JSON_BUILD_PAIR_STRING("Type", unit_type_to_string(u->type)),
|
||||
@@ -191,16 +197,8 @@ static int unit_context_build_json(sd_json_variant **ret, const char *name, void
|
||||
|
||||
JSON_BUILD_PAIR_CALLBACK_NON_NULL("CGroup", unit_cgroup_context_build_json, u),
|
||||
JSON_BUILD_PAIR_CALLBACK_NON_NULL("Exec", unit_exec_context_build_json, u),
|
||||
JSON_BUILD_PAIR_CALLBACK_NON_NULL("Kill", unit_kill_context_build_json, unit_get_kill_context(u)));
|
||||
|
||||
// TODO follow up PRs:
|
||||
// Mount/Automount context
|
||||
// Path context
|
||||
// Scope context
|
||||
// Swap context
|
||||
// Timer context
|
||||
// Service context
|
||||
// Socket context
|
||||
JSON_BUILD_PAIR_CALLBACK_NON_NULL("Kill", unit_kill_context_build_json, unit_get_kill_context(u)),
|
||||
JSON_BUILD_PAIR_CALLBACK_NON_NULL(unit_type_to_capitalized_string(u->type), unit_type_callbacks[u->type], u));
|
||||
}
|
||||
|
||||
static int can_clean_build_json(sd_json_variant **ret, const char *name, void *userdata) {
|
||||
@@ -280,6 +278,11 @@ static int unit_runtime_build_json(sd_json_variant **ret, const char *name, void
|
||||
Unit *u = ASSERT_PTR(userdata);
|
||||
Unit *f = unit_following(u);
|
||||
|
||||
/* TODO missing callbacks */
|
||||
static const sd_json_build_callback_t unit_type_callbacks[_UNIT_TYPE_MAX] = {
|
||||
[UNIT_AUTOMOUNT] = automount_runtime_build_json,
|
||||
};
|
||||
|
||||
return sd_json_buildo(
|
||||
ASSERT_PTR(ret),
|
||||
JSON_BUILD_PAIR_STRING_NON_EMPTY("Following", f ? f->id : NULL),
|
||||
@@ -309,7 +312,8 @@ static int unit_runtime_build_json(sd_json_variant **ret, const char *name, void
|
||||
SD_JSON_BUILD_PAIR_CONDITION(!sd_id128_is_null(u->invocation_id), "InvocationID", SD_JSON_BUILD_UUID(u->invocation_id)),
|
||||
JSON_BUILD_PAIR_CALLBACK_NON_NULL("Markers", markers_build_json, &u->markers),
|
||||
JSON_BUILD_PAIR_CALLBACK_NON_NULL("ActivationDetails", activation_details_build_json, u->activation_details),
|
||||
JSON_BUILD_PAIR_CALLBACK_NON_NULL("CGroup", unit_cgroup_runtime_build_json, u));
|
||||
JSON_BUILD_PAIR_CALLBACK_NON_NULL("CGroup", unit_cgroup_runtime_build_json, u),
|
||||
JSON_BUILD_PAIR_CALLBACK_NON_NULL(unit_type_to_capitalized_string(u->type), unit_type_callbacks[u->type], u));
|
||||
}
|
||||
|
||||
static int list_unit_one(sd_varlink *link, Unit *unit) {
|
||||
|
||||
@@ -928,6 +928,19 @@ static SD_VARLINK_DEFINE_STRUCT_TYPE(
|
||||
SD_VARLINK_FIELD_COMMENT("https://www.freedesktop.org/software/systemd/man/"PROJECT_VERSION_STR"/systemd.kill.html#WatchdogSignal="),
|
||||
SD_VARLINK_DEFINE_FIELD(WatchdogSignal, SD_VARLINK_STRING, SD_VARLINK_NULLABLE));
|
||||
|
||||
/* AutomountContext
|
||||
* https://www.freedesktop.org/software/systemd/man/latest/systemd.automount.html */
|
||||
static SD_VARLINK_DEFINE_STRUCT_TYPE(
|
||||
AutomountContext,
|
||||
SD_VARLINK_FIELD_COMMENT("https://www.freedesktop.org/software/systemd/man/"PROJECT_VERSION_STR"/systemd.automount.html#Where="),
|
||||
SD_VARLINK_DEFINE_FIELD(Where, SD_VARLINK_STRING, SD_VARLINK_NULLABLE),
|
||||
SD_VARLINK_FIELD_COMMENT("https://www.freedesktop.org/software/systemd/man/"PROJECT_VERSION_STR"/systemd.automount.html#ExtraOptions="),
|
||||
SD_VARLINK_DEFINE_FIELD(ExtraOptions, SD_VARLINK_STRING, SD_VARLINK_NULLABLE),
|
||||
SD_VARLINK_FIELD_COMMENT("https://www.freedesktop.org/software/systemd/man/"PROJECT_VERSION_STR"/systemd.automount.html#DirectoryMode="),
|
||||
SD_VARLINK_DEFINE_FIELD(DirectoryMode, SD_VARLINK_INT, SD_VARLINK_NULLABLE),
|
||||
SD_VARLINK_FIELD_COMMENT("https://www.freedesktop.org/software/systemd/man/"PROJECT_VERSION_STR"/systemd.automount.html#TimeoutIdleSec="),
|
||||
SD_VARLINK_DEFINE_FIELD(TimeoutIdleUSec, SD_VARLINK_INT, SD_VARLINK_NULLABLE));
|
||||
|
||||
/* UnitContext */
|
||||
static SD_VARLINK_DEFINE_STRUCT_TYPE(
|
||||
Condition,
|
||||
@@ -1087,8 +1100,9 @@ static SD_VARLINK_DEFINE_STRUCT_TYPE(
|
||||
SD_VARLINK_FIELD_COMMENT("The exec context of the unit"),
|
||||
SD_VARLINK_DEFINE_FIELD_BY_TYPE(Exec, ExecContext, SD_VARLINK_NULLABLE),
|
||||
SD_VARLINK_FIELD_COMMENT("The kill context of the unit"),
|
||||
SD_VARLINK_DEFINE_FIELD_BY_TYPE(Kill, KillContext, SD_VARLINK_NULLABLE));
|
||||
|
||||
SD_VARLINK_DEFINE_FIELD_BY_TYPE(Kill, KillContext, SD_VARLINK_NULLABLE),
|
||||
SD_VARLINK_FIELD_COMMENT("The automount context of the unit"),
|
||||
SD_VARLINK_DEFINE_FIELD_BY_TYPE(Automount, AutomountContext, SD_VARLINK_NULLABLE));
|
||||
|
||||
static SD_VARLINK_DEFINE_STRUCT_TYPE(
|
||||
ActivationDetails,
|
||||
@@ -1162,6 +1176,19 @@ static SD_VARLINK_DEFINE_STRUCT_TYPE(
|
||||
SD_VARLINK_FIELD_COMMENT("The number of processes of this unit killed by systemd-oomd"),
|
||||
SD_VARLINK_DEFINE_FIELD(ManagedOOMKills, SD_VARLINK_INT, SD_VARLINK_NULLABLE));
|
||||
|
||||
SD_VARLINK_DEFINE_ENUM_TYPE(
|
||||
AutomountResult,
|
||||
SD_VARLINK_DEFINE_ENUM_VALUE(success),
|
||||
SD_VARLINK_DEFINE_ENUM_VALUE(resources),
|
||||
SD_VARLINK_DEFINE_ENUM_VALUE(start_limit_hit),
|
||||
SD_VARLINK_DEFINE_ENUM_VALUE(mount_start_limit_hit),
|
||||
SD_VARLINK_DEFINE_ENUM_VALUE(unmounted));
|
||||
|
||||
static SD_VARLINK_DEFINE_STRUCT_TYPE(
|
||||
AutomountRuntime,
|
||||
SD_VARLINK_FIELD_COMMENT("Result of automount operation"),
|
||||
SD_VARLINK_DEFINE_FIELD_BY_TYPE(Result, AutomountResult, 0));
|
||||
|
||||
static SD_VARLINK_DEFINE_STRUCT_TYPE(
|
||||
UnitRuntime,
|
||||
SD_VARLINK_FIELD_COMMENT("If not empty, the field contains the name of another unit that this unit follows in state"),
|
||||
@@ -1219,7 +1246,9 @@ static SD_VARLINK_DEFINE_STRUCT_TYPE(
|
||||
SD_VARLINK_FIELD_COMMENT("Provides details about why a unit was activated"),
|
||||
SD_VARLINK_DEFINE_FIELD_BY_TYPE(ActivationDetails, ActivationDetails, SD_VARLINK_ARRAY|SD_VARLINK_NULLABLE),
|
||||
SD_VARLINK_FIELD_COMMENT("The cgroup runtime of the unit"),
|
||||
SD_VARLINK_DEFINE_FIELD_BY_TYPE(CGroup, CGroupRuntime, SD_VARLINK_NULLABLE));
|
||||
SD_VARLINK_DEFINE_FIELD_BY_TYPE(CGroup, CGroupRuntime, SD_VARLINK_NULLABLE),
|
||||
SD_VARLINK_FIELD_COMMENT("The automount runtime of the unit"),
|
||||
SD_VARLINK_DEFINE_FIELD_BY_TYPE(Automount, AutomountRuntime, SD_VARLINK_NULLABLE));
|
||||
|
||||
static SD_VARLINK_DEFINE_METHOD_FULL(
|
||||
List,
|
||||
@@ -1350,6 +1379,9 @@ SD_VARLINK_DEFINE_INTERFACE(
|
||||
/* other contexts */
|
||||
&vl_type_KillMode,
|
||||
&vl_type_KillContext,
|
||||
&vl_type_AutomountContext,
|
||||
&vl_type_AutomountResult,
|
||||
&vl_type_AutomountRuntime,
|
||||
|
||||
/* UnitContext enums */
|
||||
&vl_type_CollectMode,
|
||||
|
||||
@@ -28,5 +28,6 @@ extern const sd_varlink_symbol vl_type_IOSchedulingClass;
|
||||
extern const sd_varlink_symbol vl_type_NUMAPolicy;
|
||||
extern const sd_varlink_symbol vl_type_MountPropagationFlag;
|
||||
extern const sd_varlink_symbol vl_type_KillMode;
|
||||
extern const sd_varlink_symbol vl_type_AutomountResult;
|
||||
extern const sd_varlink_symbol vl_type_CollectMode;
|
||||
extern const sd_varlink_symbol vl_type_JobMode;
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
/* SPDX-License-Identifier: LGPL-2.1-or-later */
|
||||
|
||||
#include "automount.h"
|
||||
#include "cgroup.h"
|
||||
#include "ioprio-util.h"
|
||||
#include "kill.h"
|
||||
@@ -51,6 +52,9 @@ TEST(unit_enums_idl) {
|
||||
TEST_IDL_ENUM(CGroupPressureWatch, cgroup_pressure_watch, vl_type_CGroupPressureWatch);
|
||||
TEST_IDL_ENUM(CGroupController, cgroup_controller, vl_type_CGroupController);
|
||||
|
||||
/* AutomountRuntime enums */
|
||||
TEST_IDL_ENUM(AutomountResult, automount_result, vl_type_AutomountResult);
|
||||
|
||||
/* UnitContext enums */
|
||||
TEST_IDL_ENUM(CollectMode, collect_mode, vl_type_CollectMode);
|
||||
TEST_IDL_ENUM(EmergencyAction, emergency_action, vl_type_EmergencyAction);
|
||||
|
||||
@@ -232,6 +232,11 @@ invocation_id="$(systemctl show -P InvocationID systemd-journald.service)"
|
||||
varlinkctl call /run/systemd/io.systemd.Manager io.systemd.Unit.List "{\"invocationID\": \"$invocation_id\"}"
|
||||
# test for KillContext
|
||||
varlinkctl call /run/systemd/io.systemd.Manager io.systemd.Unit.List '{"pid": {"pid": 0}}' | jq -e '.context.Kill'
|
||||
# test for AutomountContext/Runtime
|
||||
automount_id=$(varlinkctl call --collect /run/systemd/io.systemd.Manager io.systemd.Unit.List '{}' | jq -r '.[] | select(.context.Type == "automount" and .runtime.LoadState == "loaded") .context.ID' | grep -v null | tail -n 1)
|
||||
test -n "$automount_id"
|
||||
varlinkctl call /run/systemd/io.systemd.Manager io.systemd.Unit.List "{\"name\": \"$automount_id\"}" | jq -e '.context.Automount'
|
||||
varlinkctl call /run/systemd/io.systemd.Manager io.systemd.Unit.List "{\"name\": \"$automount_id\"}" | jq -e '.runtime.Automount'
|
||||
|
||||
# test io.systemd.Metrics
|
||||
varlinkctl info /run/systemd/report/io.systemd.Manager
|
||||
|
||||
Reference in New Issue
Block a user