mirror of
https://github.com/morgan9e/systemd
synced 2026-04-14 08:25:20 +09:00
Merge pull request #20877 from yuwata/network-test-mode
network: do not update state files when running in test mode
This commit is contained in:
7
.github/workflows/unit_tests.sh
vendored
7
.github/workflows/unit_tests.sh
vendored
@@ -6,7 +6,6 @@ ADDITIONAL_DEPS=(
|
||||
clang
|
||||
expect
|
||||
fdisk
|
||||
iproute2
|
||||
jekyll
|
||||
lcov
|
||||
libfdisk-dev
|
||||
@@ -20,7 +19,6 @@ ADDITIONAL_DEPS=(
|
||||
perl
|
||||
python3-libevdev
|
||||
python3-pyparsing
|
||||
util-linux
|
||||
zstd
|
||||
)
|
||||
|
||||
@@ -55,8 +53,7 @@ for phase in "${PHASES[@]}"; do
|
||||
fi
|
||||
meson --werror -Dtests=unsafe -Dslow-tests=true -Dfuzz-tests=true "${MESON_ARGS[@]}" build
|
||||
ninja -C build -v
|
||||
# Some of the unsafe tests irreparably break the host's network connectivity, so run them in a namespace
|
||||
unshare -n bash -c 'ip link set dev lo up; meson test -C build --print-errorlogs'
|
||||
meson test -C build --print-errorlogs
|
||||
if [[ "$phase" = "RUN_GCC" ]]; then
|
||||
ninja -C build coverage
|
||||
fi
|
||||
@@ -88,7 +85,7 @@ for phase in "${PHASES[@]}"; do
|
||||
# during debugging, wonderful), so let's at least keep a workaround
|
||||
# here to make the builds stable for the time being.
|
||||
(set +x; while :; do echo -ne "\n[WATCHDOG] $(date)\n"; sleep 30; done) &
|
||||
unshare -n bash -c 'ip link set dev lo up; meson test --timeout-multiplier=3 -C build --print-errorlogs'
|
||||
meson test --timeout-multiplier=3 -C build --print-errorlogs
|
||||
;;
|
||||
CLEANUP)
|
||||
info "Cleanup phase"
|
||||
|
||||
@@ -19,7 +19,7 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
|
||||
assert_se(fwrite(data, size, 1, f) == 1);
|
||||
|
||||
fflush(f);
|
||||
assert_se(manager_new(&manager) >= 0);
|
||||
assert_se(manager_new(&manager, /* test_mode = */ true) >= 0);
|
||||
(void) netdev_load_one(manager, netdev_config);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -22,7 +22,7 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
|
||||
assert_se(fwrite(data, size, 1, f) == 1);
|
||||
|
||||
fflush(f);
|
||||
assert_se(manager_new(&manager) >= 0);
|
||||
assert_se(manager_new(&manager, /* test_mode = */ true) >= 0);
|
||||
(void) network_load_one(manager, &manager->networks, network_config);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -982,7 +982,9 @@ static Link *link_drop(Link *link) {
|
||||
|
||||
link_drop_from_master(link);
|
||||
|
||||
(void) unlink(link->state_file);
|
||||
if (link->state_file)
|
||||
(void) unlink(link->state_file);
|
||||
|
||||
link_clean(link);
|
||||
|
||||
STRV_FOREACH(n, link->alternative_names)
|
||||
@@ -1390,6 +1392,12 @@ static int link_initialized_and_synced(Link *link) {
|
||||
assert(link->ifname);
|
||||
assert(link->manager);
|
||||
|
||||
if (link->manager->test_mode) {
|
||||
log_link_debug(link, "Running in test mode, refusing to enter initialized state.");
|
||||
link_set_state(link, LINK_STATE_UNMANAGED);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* We may get called either from the asynchronous netlink callback,
|
||||
* or directly from link_check_initialized() if running in a container. */
|
||||
if (!IN_SET(link->state, LINK_STATE_PENDING, LINK_STATE_INITIALIZED))
|
||||
@@ -2358,14 +2366,17 @@ static int link_new(Manager *manager, sd_netlink_message *message, Link **ret) {
|
||||
return log_debug_errno(r, "rtnl: failed to exit IFLA_LINKINFO container: %m");
|
||||
}
|
||||
|
||||
if (asprintf(&state_file, "/run/systemd/netif/links/%d", ifindex) < 0)
|
||||
return log_oom_debug();
|
||||
if (!manager->test_mode) {
|
||||
/* Do not update state files when running in test mode. */
|
||||
if (asprintf(&state_file, "/run/systemd/netif/links/%d", ifindex) < 0)
|
||||
return log_oom_debug();
|
||||
|
||||
if (asprintf(&lease_file, "/run/systemd/netif/leases/%d", ifindex) < 0)
|
||||
return log_oom_debug();
|
||||
if (asprintf(&lease_file, "/run/systemd/netif/leases/%d", ifindex) < 0)
|
||||
return log_oom_debug();
|
||||
|
||||
if (asprintf(&lldp_file, "/run/systemd/netif/lldp/%d", ifindex) < 0)
|
||||
return log_oom_debug();
|
||||
if (asprintf(&lldp_file, "/run/systemd/netif/lldp/%d", ifindex) < 0)
|
||||
return log_oom_debug();
|
||||
}
|
||||
|
||||
link = new(Link, 1);
|
||||
if (!link)
|
||||
|
||||
@@ -114,7 +114,9 @@ int link_lldp_save(Link *link) {
|
||||
int n = 0, r, i;
|
||||
|
||||
assert(link);
|
||||
assert(link->lldp_file);
|
||||
|
||||
if (isempty(link->lldp_file))
|
||||
return 0; /* Do not update state file when running in test mode. */
|
||||
|
||||
if (!link->lldp_rx) {
|
||||
(void) unlink(link->lldp_file);
|
||||
|
||||
@@ -382,7 +382,7 @@ static int signal_restart_callback(sd_event_source *s, const struct signalfd_sig
|
||||
return sd_event_exit(sd_event_source_get_event(s), 0);
|
||||
}
|
||||
|
||||
int manager_setup(Manager *m, bool test_mode) {
|
||||
int manager_setup(Manager *m) {
|
||||
int r;
|
||||
|
||||
assert(m);
|
||||
@@ -414,7 +414,7 @@ int manager_setup(Manager *m, bool test_mode) {
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
if (test_mode)
|
||||
if (m->test_mode)
|
||||
return 0;
|
||||
|
||||
r = manager_connect_bus(m);
|
||||
@@ -444,7 +444,7 @@ int manager_setup(Manager *m, bool test_mode) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
int manager_new(Manager **ret) {
|
||||
int manager_new(Manager **ret, bool test_mode) {
|
||||
_cleanup_(manager_freep) Manager *m = NULL;
|
||||
|
||||
m = new(Manager, 1);
|
||||
@@ -452,6 +452,7 @@ int manager_new(Manager **ret) {
|
||||
return -ENOMEM;
|
||||
|
||||
*m = (Manager) {
|
||||
.test_mode = test_mode,
|
||||
.speed_meter_interval_usec = SPEED_METER_DEFAULT_TIME_INTERVAL,
|
||||
.online_state = _LINK_ONLINE_STATE_INVALID,
|
||||
.manage_foreign_routes = true,
|
||||
|
||||
@@ -28,6 +28,7 @@ struct Manager {
|
||||
Hashmap *polkit_registry;
|
||||
int ethtool_fd;
|
||||
|
||||
bool test_mode;
|
||||
bool enumerating;
|
||||
bool dirty;
|
||||
bool restarting;
|
||||
@@ -96,10 +97,10 @@ struct Manager {
|
||||
OrderedSet *request_queue;
|
||||
};
|
||||
|
||||
int manager_new(Manager **ret);
|
||||
int manager_new(Manager **ret, bool test_mode);
|
||||
Manager* manager_free(Manager *m);
|
||||
|
||||
int manager_setup(Manager *m, bool test_mode);
|
||||
int manager_setup(Manager *m);
|
||||
int manager_start(Manager *m);
|
||||
|
||||
int manager_load_config(Manager *m);
|
||||
|
||||
@@ -119,7 +119,9 @@ int manager_save(Manager *m) {
|
||||
int r;
|
||||
|
||||
assert(m);
|
||||
assert(m->state_file);
|
||||
|
||||
if (isempty(m->state_file))
|
||||
return 0; /* Do not update state file when running in test mode. */
|
||||
|
||||
HASHMAP_FOREACH(link, m->links_by_index) {
|
||||
const struct in_addr *addresses;
|
||||
@@ -423,10 +425,11 @@ int link_save(Link *link) {
|
||||
int r;
|
||||
|
||||
assert(link);
|
||||
assert(link->state_file);
|
||||
assert(link->lease_file);
|
||||
assert(link->manager);
|
||||
|
||||
if (isempty(link->state_file))
|
||||
return 0; /* Do not update state files when running in test mode. */
|
||||
|
||||
if (link->state == LINK_STATE_LINGER)
|
||||
return 0;
|
||||
|
||||
|
||||
@@ -73,11 +73,11 @@ static int run(int argc, char *argv[]) {
|
||||
|
||||
assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGTERM, SIGINT, -1) >= 0);
|
||||
|
||||
r = manager_new(&m);
|
||||
r = manager_new(&m, /* test_mode = */ false);
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Could not create manager: %m");
|
||||
|
||||
r = manager_setup(m, /* test_mode = */ false);
|
||||
r = manager_setup(m);
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Could not setup manager: %m");
|
||||
|
||||
|
||||
@@ -269,8 +269,8 @@ int main(void) {
|
||||
test_address_equality();
|
||||
test_dhcp_hostname_shorten_overlong();
|
||||
|
||||
assert_se(manager_new(&manager) >= 0);
|
||||
assert_se(manager_setup(manager, /* test_mode = */ true) >= 0);
|
||||
assert_se(manager_new(&manager, /* test_mode = */ true) >= 0);
|
||||
assert_se(manager_setup(manager) >= 0);
|
||||
|
||||
test_route_tables(manager);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user