[Merge] ~slyon/network-manager:netplan-integration into network-manager:ubuntu/master

Danilo Egea Gondolfo mp+423735 at code.launchpad.net
Fri May 12 09:12:58 UTC 2023



Diff comments:

> diff --git a/debian/patches/netplan/0002-netplan-make-use-of-libnetplan-for-YAML-backend.patch b/debian/patches/netplan/0002-netplan-make-use-of-libnetplan-for-YAML-backend.patch
> new file mode 100644
> index 0000000..1d959f2
> --- /dev/null
> +++ b/debian/patches/netplan/0002-netplan-make-use-of-libnetplan-for-YAML-backend.patch
> @@ -0,0 +1,525 @@
> +From aaa791cb61b24a9416db18f2290f711bc9a8f26e Mon Sep 17 00:00:00 2001
> +From: Lukas Märdian <lukas.maerdian at canonical.com>
> +Date: Tue, 2 Feb 2021 15:52:05 +0100
> +Subject: [PATCH 2/2] netplan: make use of libnetplan for YAML backend
> +
> +Origin: https://github.com/slyon/NetworkManager/tree/netplan-nm-1.42
> +Forwarded: no, https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/556
> +Last-Update: 2023-05-11
> +
> +This patch modifies NetworkManager's nms-keyfile-plugin in a way to
> +write YAML connections (according to the netplan spec) to
> +/etc/netplan/*.yaml instead of NM's native keyfile connection profiles
> +in /etc/NetworkManager/system-connections/*.nmconnection.
> +
> +Whenever a connection profile is to be written (add/modify) the keyfile,
> +generated internally by NM, is passed into libnetplan's
> +"netplan_parser_load_keyfile()" API, validated via
> +"netplan_state_import_parser_results()" and converted to a netplan YAML
> +config by calling libnetplan's "netplan_netdef_write_yaml()" API. The
> +internal keyfile is thrown away afterwards.
> +
> +Whenever a connection profile is to be deleted the netplan-/netdef-id is
> +extracted from the ephemeral keyfile in /run/NetworkManager/system-connections
> +via "netplan_get_id_from_nm_filepath()" and the corresponding YAML is
> +updated/deleted by calling "netplan_delete_connection()".
> +
> +Each time the YAML data was modified, NetworkManager calls
> +"netplan generate" to produce new ephemeral keyfile connections in
> +/run/NetworkManager/system-connections for NM to read-back. This way the
> +netplan generator can be used as intended (no need for duplicated
> +keyfile export functionality) and the nms-keyfile-writer can be re-used
> +without any patching needed.
> +
> +V2:
> ++ ported to NetworkManager 1.36.6 (Ubuntu Jammy LTS/Core 22.04)
> ++ test-keyfile-settings.c: clear netplan YAML config from previous runs
> ++ nms-keyfile-writer.c: avoid double-free of `path` on exit, caused by gs_free
> +
> +V3:
> ++ ported to NM 1.40.6 (Ubuntu Lunar), using new libnetplan API (v0.106)
> ++ ignore .nm-generated connections (LP: #1998207)
> +
> +V4:
> ++ encapsulated all Netplan code in "#if WITH_NETPLAN" as provided by the
> +  buildsystems via config.h (see previous commit)
> ++ nms-keyfile-writer.c: increase buffer size to account for ".nmconnection"
> +  suffix in netplan_netdef_get_output_filename()
> +
> +Co-authored-by: Alfonso Sanchez-Beato <alfonso.sanchez-beato at canonical.com>
> +Co-authored-by: Danilo Egea Gondolfo <danilo.egea.gondolfo at canonical.com>
> +---
> + .../plugins/keyfile/nms-keyfile-plugin.c      |  34 ++++
> + .../plugins/keyfile/nms-keyfile-utils.c       |  18 ++
> + .../plugins/keyfile/nms-keyfile-utils.h       |   4 +
> + .../plugins/keyfile/nms-keyfile-writer.c      | 173 ++++++++++++++++++
> + .../keyfile/tests/test-keyfile-settings.c     |  61 +++++-
> + 5 files changed, 286 insertions(+), 4 deletions(-)
> +
> +diff --git a/src/core/settings/plugins/keyfile/nms-keyfile-plugin.c b/src/core/settings/plugins/keyfile/nms-keyfile-plugin.c
> +index 1d7de8d24b..4b986dc0c8 100644
> +--- a/src/core/settings/plugins/keyfile/nms-keyfile-plugin.c
> ++++ b/src/core/settings/plugins/keyfile/nms-keyfile-plugin.c
> +@@ -12,6 +12,9 @@
> + #include <unistd.h>
> + #include <sys/types.h>
> + #include <sys/time.h>
> ++#if WITH_NETPLAN
> ++#include <netplan/util.h>
> ++#endif
> + 
> + #include "libnm-std-aux/c-list-util.h"
> + #include "libnm-glib-aux/nm-c-list.h"
> +@@ -309,6 +312,12 @@ _load_file(NMSKeyfilePlugin     *self,
> +     gs_free char                 *full_filename    = NULL;
> +     struct stat                   st;
> + 
> ++    #if WITH_NETPLAN
> ++    // Handle all netplan generated connections via STORAGE_TYPE_ETC, as they live in /etc/netplan
> ++    if (g_str_has_prefix(filename, "netplan-"))
> ++        storage_type = NMS_KEYFILE_STORAGE_TYPE_ETC;
> ++    #endif
> ++
> +     if (_ignore_filename(storage_type, filename)) {
> +         gs_free char *nmmeta                    = NULL;
> +         gs_free char *loaded_path               = NULL;
> +@@ -584,6 +593,9 @@ reload_connections(NMSettingsPlugin                      *plugin,
> +         NM_SETT_UTIL_STORAGES_INIT(storages_new, nms_keyfile_storage_destroy);
> +     int i;
> + 
> ++    #if WITH_NETPLAN
> ++    generate_netplan(NULL);
> ++    #endif
> +     _load_dir(self, NMS_KEYFILE_STORAGE_TYPE_RUN, priv->dirname_run, &storages_new);
> +     if (priv->dirname_etc)
> +         _load_dir(self, NMS_KEYFILE_STORAGE_TYPE_ETC, priv->dirname_etc, &storages_new);
> +@@ -1008,6 +1020,15 @@ delete_connection(NMSettingsPlugin *plugin, NMSettingsStorage *storage_x, GError
> +     previous_filename = nms_keyfile_storage_get_filename(storage);
> +     uuid              = nms_keyfile_storage_get_uuid(storage);
> + 
> ++    #if WITH_NETPLAN
> ++    nm_auto_unref_keyfile GKeyFile *key_file = NULL;
> ++    key_file = g_key_file_new ();
> ++    if (!g_key_file_load_from_file (key_file, previous_filename, G_KEY_FILE_NONE, error))
> ++        return FALSE;
> ++    g_autofree gchar* ssid = NULL;
> ++    ssid = g_key_file_get_string(key_file, "wifi", "ssid", NULL);
> ++    #endif
> ++
> +     if (!NM_IN_SET(storage->storage_type,
> +                    NMS_KEYFILE_STORAGE_TYPE_ETC,
> +                    NMS_KEYFILE_STORAGE_TYPE_RUN)) {
> +@@ -1033,6 +1054,19 @@ delete_connection(NMSettingsPlugin *plugin, NMSettingsStorage *storage_x, GError
> +     } else
> +         operation_message = "deleted from disk";
> + 
> ++    #if WITH_NETPLAN
> ++    g_autofree gchar *netplan_id = NULL;
> ++    ssize_t           netplan_id_size = 0;
> ++
> ++    netplan_id = g_malloc0(strlen(previous_filename));
> ++    netplan_id_size = netplan_get_id_from_nm_filepath(previous_filename, ssid, netplan_id, strlen(previous_filename) - 1);
> ++    if (netplan_id_size > 0) {
> ++        _LOGI ("deleting netplan connection: %s", netplan_id);
> ++        netplan_delete_connection(netplan_id, NULL);
> ++        generate_netplan(NULL);
> ++    }
> ++    #endif
> ++
> +     _LOGT("commit: deleted \"%s\", %s %s (%s%s%s%s)",
> +           previous_filename,
> +           storage->is_meta_data ? "meta-data" : "profile",
> +diff --git a/src/core/settings/plugins/keyfile/nms-keyfile-utils.c b/src/core/settings/plugins/keyfile/nms-keyfile-utils.c
> +index 7c0e329e2d..a91ee6997a 100644
> +--- a/src/core/settings/plugins/keyfile/nms-keyfile-utils.c
> ++++ b/src/core/settings/plugins/keyfile/nms-keyfile-utils.c
> +@@ -399,3 +399,21 @@ nms_keyfile_utils_check_file_permissions(NMSKeyfileFiletype filetype,
> +     NM_SET_OUT(out_st, st);
> +     return TRUE;
> + }
> ++
> ++#if WITH_NETPLAN
> ++gboolean
> ++generate_netplan(const char* rootdir)
> ++{
> ++    /* TODO: call the io.netplan.Netplan.Generate() DBus method directly, after
> ++     * finding a way to pass the --root-dir parameter via DBus, to make it work
> ++     * inside NM's unit-tests where netplan needs to read & generate outside of
> ++     * /etc/netplan and /run/{systemd,NetworkManager} */
> ++    const gchar *argv[] = { "netplan", "generate", NULL , NULL, NULL };
> ++    if (rootdir) {
> ++        argv[2] = "--root-dir";
> ++        argv[3] = rootdir;
> ++    }
> ++    return g_spawn_sync(NULL, (gchar**)argv, NULL, G_SPAWN_SEARCH_PATH,
> ++                        NULL, NULL, NULL, NULL, NULL, NULL);
> ++}
> ++#endif
> +diff --git a/src/core/settings/plugins/keyfile/nms-keyfile-utils.h b/src/core/settings/plugins/keyfile/nms-keyfile-utils.h
> +index 0fd83bdf35..9ed25d9cfd 100644
> +--- a/src/core/settings/plugins/keyfile/nms-keyfile-utils.h
> ++++ b/src/core/settings/plugins/keyfile/nms-keyfile-utils.h
> +@@ -68,4 +68,8 @@ gboolean nms_keyfile_utils_check_file_permissions(NMSKeyfileFiletype filetype,
> +                                                   struct stat       *out_st,
> +                                                   GError           **error);
> + 
> ++#if WITH_NETPLAN
> ++gboolean generate_netplan(const char* rootdir);
> ++#endif
> ++
> + #endif /* __NMS_KEYFILE_UTILS_H__ */
> +diff --git a/src/core/settings/plugins/keyfile/nms-keyfile-writer.c b/src/core/settings/plugins/keyfile/nms-keyfile-writer.c
> +index ad6f277ce3..e5015ab74b 100644
> +--- a/src/core/settings/plugins/keyfile/nms-keyfile-writer.c
> ++++ b/src/core/settings/plugins/keyfile/nms-keyfile-writer.c
> +@@ -12,6 +12,14 @@
> + #include <sys/stat.h>
> + #include <unistd.h>
> + 
> ++#if WITH_NETPLAN
> ++#include <net/if.h>
> ++#include <netplan/parse.h>
> ++#include <netplan/parse-nm.h>
> ++#include <netplan/util.h>
> ++#include <netplan/netplan.h>
> ++#endif
> ++
> + #include "libnm-core-intern/nm-keyfile-internal.h"
> + 
> + #include "nms-keyfile-utils.h"
> +@@ -201,6 +209,9 @@ _internal_write_connection(NMConnection                   *connection,
> +                            char                          **out_path,
> +                            NMConnection                  **out_reread,
> +                            gboolean                       *out_reread_same,
> ++                           #if WITH_NETPLAN
> ++                           const char                     *rootdir,
> ++                           #endif
> +                            GError                        **error)
> + {
> +     nm_auto_unref_keyfile GKeyFile *kf_file        = NULL;
> +@@ -409,11 +420,161 @@ _internal_write_connection(NMConnection                   *connection,
> +     if (existing_path && !existing_path_read_only && !nm_streq(path, existing_path))
> +         unlink(existing_path);
> + 
> ++    #if WITH_NETPLAN
> ++    NetplanParser *npp      = NULL;
> ++    NetplanState  *np_state = NULL;
> ++
> ++    /* NETPLAN: write only non-temporary files to /etc/netplan/... */
> ++    if (!is_volatile && !is_nm_generated && !is_external &&
> ++        strstr(keyfile_dir, "/etc/NetworkManager/system-connections")) {
> ++        g_autofree gchar *ssid = g_key_file_get_string(kf_file, "wifi", "ssid", NULL);
> ++        g_autofree gchar *escaped_ssid = ssid ?
> ++                                         g_uri_escape_string(ssid, NULL, TRUE) : NULL;
> ++        g_autofree gchar *netplan_id = NULL;
> ++        ssize_t netplan_id_size = 0;
> ++        NetplanNetDefinition *netdef = NULL;
> ++        NetplanStateIterator state_iter;
> ++        const gchar* kf_path = path;
> ++
> ++        if (existing_path && strstr(existing_path, "system-connections/netplan-")) {
> ++            netplan_id = g_malloc0(strlen(existing_path));
> ++            netplan_id_size = netplan_get_id_from_nm_filepath(existing_path, ssid, netplan_id, strlen(existing_path) - 1);
> ++            if (netplan_id_size <= 0) {
> ++                g_free(netplan_id);
> ++                netplan_id = NULL;
> ++            }
> ++        }
> ++
> ++        if (netplan_id && existing_path) {
> ++            GFile* from = g_file_new_for_path(path);
> ++            GFile* to = g_file_new_for_path(existing_path);
> ++            g_file_copy(from, to, G_FILE_COPY_OVERWRITE, NULL, NULL, NULL, NULL);
> ++            kf_path = existing_path;
> ++        }
> ++
> ++        // push keyfile into libnetplan for parsing (using existing_path, if available,
> ++        // to be able to extract the original netdef_id and override existing settings)
> ++        npp = netplan_parser_new();
> ++
> ++        if (!netplan_parser_load_keyfile(npp, kf_path, &local_err)) {
> ++            g_set_error (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_FAILED,
> ++                         "netplan: YAML translation failed: %s", local_err->message);
> ++            goto netplan_parser_error;
> ++        }
> ++
> ++        np_state = netplan_state_new();
> ++        if (!netplan_state_import_parser_results(np_state, npp, &local_err)) {
> ++            g_set_error (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_FAILED,
> ++                         "netplan: YAML validation failed: %s", local_err->message);
> ++            goto netplan_error;
> ++        }
> ++
> ++        netplan_state_iterator_init(np_state, &state_iter);
> ++        /* At this point we have a single netdef in the netplan state */
> ++        netdef = netplan_state_iterator_next(&state_iter);
> ++
> ++        if (!netdef) {
> ++            g_set_error (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_FAILED,
> ++                         "netplan: Netplan state has no network definitions");
> ++            goto netplan_error;
> ++        }
> ++
> ++        if (!netplan_netdef_write_yaml(np_state, netdef, rootdir, &local_err)) {
> ++            g_set_error (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_FAILED,
> ++                         "netplan: Failed to generate YAML: %s", local_err->message);
> ++            goto netplan_error;
> ++        }
> ++
> ++        /* Delete same connection-profile provided by legacy netplan plugin.
> ++         * TODO: drop legacy connection handling after 24.04 LTS */
> ++        g_autofree gchar* legacy_path = NULL;
> ++        legacy_path = g_strdup_printf("/etc/netplan/NM-%s.yaml", nm_connection_get_uuid (connection));
> ++        if (g_file_test(legacy_path, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_REGULAR)) {
> ++            g_debug("Deleting legacy netplan connection: %s", legacy_path);
> ++            unlink(legacy_path);
> ++        }
> ++
> ++        /* Clear original keyfile in /etc/NetworkManager/system-connections/,
> ++         * we've written the /etc/netplan/*.yaml file instead. */
> ++        unlink(path);
> ++        if (!generate_netplan(rootdir)) {
> ++            g_set_error (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_FAILED,
> ++                         "netplan generate failed");
> ++            goto netplan_error;
> ++        }
> ++
> ++        // Calculating the maximum space needed to store the new keyfile path
> ++        ssize_t path_size = strlen(path) + strlen(nm_connection_get_uuid(connection)) + IF_NAMESIZE + 1;
> ++        if (escaped_ssid)
> ++            path_size += strlen(escaped_ssid);
> ++        path_size += 50; // give some extra buffer, e.g. when going from  ConName to ConName.nmconnection
> ++
> ++        g_free(path);
> ++        path = g_malloc0(path_size);
> ++        path_size = netplan_netdef_get_output_filename(netdef, ssid, path, path_size);
> ++
> ++        if (path_size <= 0) {
> ++            g_set_error (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_FAILED,
> ++                         "netplan: couldn't determine the keyfile path");
> ++            goto netplan_error;
> ++        }
> ++
> ++        if (rootdir) {
> ++            char* final_path = g_build_path(G_DIR_SEPARATOR_S, rootdir, path, NULL);
> ++            g_free(path);
> ++            path = final_path;
> ++        }
> ++
> ++        netplan_state_clear(&np_state);
> ++        netplan_parser_clear(&npp);
> ++
> ++        /* re-read again: this time the connection profile newly generated by netplan in /run/... */
> ++        if (   out_reread

Most of the code inside this if statement is from NM itself and not the netplan patch. As it's inside the #if #endif we are removing it when netplan is disabled. I think we get into this code when a connection is modified, I'm not completely sure about the side effects of removing it. Maybe it's not a blocker since we want the patch enabled, but we definitely should fix it.

> ++            || out_reread_same) {
> ++            gs_free_error GError *reread_error = NULL;
> ++
> ++            //XXX: why does the _from_keyfile function behave differently?
> ++            //reread = nms_keyfile_reader_from_keyfile (kf_file, path, NULL, profile_dir, FALSE, &reread_error);
> ++            reread = nms_keyfile_reader_from_file (path, profile_dir, NULL, NULL, NULL, NULL, NULL, NULL, &reread_error);
> ++
> ++            if (   !reread
> ++                || !nm_connection_normalize (reread, NULL, NULL, &reread_error)) {
> ++                nm_log_err (LOGD_SETTINGS, "BUG: the profile cannot be stored in keyfile format without becoming unusable: %s", reread_error->message);
> ++                g_set_error (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_FAILED,
> ++                             "keyfile writer produces an invalid connection: %s",
> ++                             reread_error->message);
> ++                nm_assert_not_reached ();
> ++                return FALSE;
> ++            }
> ++
> ++            if (out_reread_same) {
> ++                reread_same = !!nm_connection_compare (reread, connection, NM_SETTING_COMPARE_FLAG_EXACT);
> ++
> ++                nm_assert (reread_same == nm_connection_compare (connection, reread, NM_SETTING_COMPARE_FLAG_EXACT));
> ++                nm_assert (reread_same == ({
> ++                                                gs_unref_hashtable GHashTable *_settings = NULL;
> ++
> ++                                                (   nm_connection_diff (reread, connection, NM_SETTING_COMPARE_FLAG_EXACT, &_settings)
> ++                                                 && !_settings);
> ++                                           }));
> ++            }
> ++        }
> ++    }
> ++    #endif
> ++
> +     NM_SET_OUT(out_reread, g_steal_pointer(&reread));
> +     NM_SET_OUT(out_reread_same, reread_same);
> +     NM_SET_OUT(out_path, g_steal_pointer(&path));
> + 
> +     return TRUE;
> ++
> ++#if WITH_NETPLAN
> ++netplan_error:
> ++    netplan_state_clear(&np_state);
> ++netplan_parser_error:
> ++    netplan_parser_clear(&npp);
> ++    return FALSE;
> ++#endif
> + }
> + 
> + gboolean
> +@@ -454,6 +615,9 @@ nms_keyfile_writer_connection(NMConnection                   *connection,
> +                                       out_path,
> +                                       out_reread,
> +                                       out_reread_same,
> ++                                      #if WITH_NETPLAN
> ++                                      NULL,
> ++                                      #endif
> +                                       error);
> + }
> + 
> +@@ -467,6 +631,12 @@ nms_keyfile_writer_test_connection(NMConnection  *connection,
> +                                    gboolean      *out_reread_same,
> +                                    GError       **error)
> + {
> ++    #if WITH_NETPLAN
> ++    gchar *rootdir = g_strdup(keyfile_dir);
> ++    if (g_str_has_suffix (keyfile_dir, "/run/NetworkManager/system-connections")) {
> ++        rootdir[strlen(rootdir)-38] = '\0'; /* 38 = strlen("/run/NetworkManager/...") */
> ++    }
> ++    #endif
> +     return _internal_write_connection(connection,
> +                                       FALSE,
> +                                       FALSE,
> +@@ -486,5 +656,8 @@ nms_keyfile_writer_test_connection(NMConnection  *connection,
> +                                       out_path,
> +                                       out_reread,
> +                                       out_reread_same,
> ++                                      #if WITH_NETPLAN
> ++                                      rootdir,
> ++                                      #endif
> +                                       error);
> + }
> +diff --git a/src/core/settings/plugins/keyfile/tests/test-keyfile-settings.c b/src/core/settings/plugins/keyfile/tests/test-keyfile-settings.c
> +index 83019babb1..eb59a91eab 100644
> +--- a/src/core/settings/plugins/keyfile/tests/test-keyfile-settings.c
> ++++ b/src/core/settings/plugins/keyfile/tests/test-keyfile-settings.c
> +@@ -24,8 +24,15 @@
> + 
> + #include "nm-test-utils-core.h"
> + 
> ++#if WITH_NETPLAN
> ++#define TEST_KEYFILES_DIR_OLD   NM_BUILD_SRCDIR"/src/core/settings/plugins/keyfile/tests/keyfiles"
> ++#define TEST_SCRATCH_DIR_OLD    NM_BUILD_BUILDDIR"/src/core/settings/plugins/keyfile/tests/keyfiles"
> ++#define TEST_KEYFILES_DIR       TEST_KEYFILES_DIR_OLD"/run/NetworkManager/system-connections"
> ++#define TEST_SCRATCH_DIR        TEST_SCRATCH_DIR_OLD"/run/NetworkManager/system-connections"
> ++#else
> + #define TEST_KEYFILES_DIR NM_BUILD_SRCDIR "/src/core/settings/plugins/keyfile/tests/keyfiles"
> + #define TEST_SCRATCH_DIR  NM_BUILD_BUILDDIR "/src/core/settings/plugins/keyfile/tests/keyfiles"
> ++#endif
> + 
> + /*****************************************************************************/
> + 
> +@@ -113,6 +120,11 @@ assert_reread_and_unlink(NMConnection *connection,
> + static void
> + assert_reread_same(NMConnection *connection, NMConnection *reread)
> + {
> ++    #if WITH_NETPLAN
> ++    // Netplan does some normalization already, so compare normalized connections
> ++    nm_connection_normalize (connection, NULL, NULL, NULL);
> ++    nm_connection_normalize (reread, NULL, NULL, NULL);
> ++    #endif
> +     nmtst_assert_connection_verifies_without_normalization(reread);
> +     nmtst_assert_connection_equals(connection, TRUE, reread, FALSE);
> + }
> +@@ -789,6 +801,10 @@ test_write_wireless_connection(void)
> +                  bssid,
> +                  NM_SETTING_WIRELESS_SSID,
> +                  ssid,
> ++                 #if WITH_NETPLAN
> ++                 //XXX: netplan uses explicit "infrastructure" mode
> ++                 NM_SETTING_WIRELESS_MODE, NM_SETTING_WIRELESS_MODE_INFRA,
> ++                 #endif
> +                  NM_SETTING_WIRED_MTU,
> +                  1000,
> +                  NULL);
> +@@ -870,7 +886,12 @@ test_write_string_ssid(void)
> +     nm_connection_add_setting(connection, NM_SETTING(s_wireless));
> + 
> +     ssid = g_bytes_new(tmpssid, sizeof(tmpssid));
> +-    g_object_set(s_wireless, NM_SETTING_WIRELESS_SSID, ssid, NULL);
> ++    g_object_set(s_wireless, NM_SETTING_WIRELESS_SSID, ssid,
> ++                 #if WITH_NETPLAN
> ++                 //XXX: netplan uses explicit "infrastructure" mode
> ++                 NM_SETTING_WIRELESS_MODE, NM_SETTING_WIRELESS_MODE_INFRA,
> ++                 #endif
> ++                 NULL);
> +     g_bytes_unref(ssid);
> + 
> +     /* IP4 setting */
> +@@ -953,7 +974,12 @@ test_write_intlist_ssid(void)
> +     nm_connection_add_setting(connection, NM_SETTING(s_wifi));
> + 
> +     ssid = g_bytes_new(tmpssid, sizeof(tmpssid));
> +-    g_object_set(s_wifi, NM_SETTING_WIRELESS_SSID, ssid, NULL);
> ++    g_object_set(s_wifi, NM_SETTING_WIRELESS_SSID, ssid,
> ++                 #if WITH_NETPLAN
> ++                 //XXX: netplan uses explicit "infrastructure" mode
> ++                 NM_SETTING_WIRELESS_MODE, NM_SETTING_WIRELESS_MODE_INFRA,
> ++                 #endif
> ++                 NULL);
> +     g_bytes_unref(ssid);
> + 
> +     /* IP4 setting */
> +@@ -1053,7 +1079,12 @@ test_write_intlike_ssid(void)
> +     nm_connection_add_setting(connection, NM_SETTING(s_wifi));
> + 
> +     ssid = g_bytes_new(tmpssid, sizeof(tmpssid));
> +-    g_object_set(s_wifi, NM_SETTING_WIRELESS_SSID, ssid, NULL);
> ++    g_object_set(s_wifi, NM_SETTING_WIRELESS_SSID, ssid,
> ++                 #if WITH_NETPLAN
> ++                 //XXX: netplan uses explicit "infrastructure" mode
> ++                 NM_SETTING_WIRELESS_MODE, NM_SETTING_WIRELESS_MODE_INFRA,
> ++                 #endif
> ++                 NULL);
> +     g_bytes_unref(ssid);
> + 
> +     /* IP4 setting */
> +@@ -1115,7 +1146,12 @@ test_write_intlike_ssid_2(void)
> +     nm_connection_add_setting(connection, NM_SETTING(s_wifi));
> + 
> +     ssid = g_bytes_new(tmpssid, sizeof(tmpssid));
> +-    g_object_set(s_wifi, NM_SETTING_WIRELESS_SSID, ssid, NULL);
> ++    g_object_set(s_wifi, NM_SETTING_WIRELESS_SSID, ssid,
> ++                 #if WITH_NETPLAN
> ++                 //XXX: netplan uses explicit "infrastructure" mode
> ++                 NM_SETTING_WIRELESS_MODE, NM_SETTING_WIRELESS_MODE_INFRA,
> ++                 #endif
> ++                 NULL);
> +     g_bytes_unref(ssid);
> + 
> +     /* IP4 setting */
> +@@ -2845,12 +2881,29 @@ main(int argc, char **argv)
> + 
> +     nmtst_init_assert_logging(&argc, &argv, "INFO", "DEFAULT");
> + 
> ++    #if WITH_NETPLAN
> ++    if (g_mkdir_with_parents(TEST_SCRATCH_DIR_OLD, 0755) != 0) {
> ++        errsv = errno;
> ++        g_error("failure to create test directory \"%s\": %s",
> ++                TEST_SCRATCH_DIR_OLD,
> ++                nm_strerror_native(errsv));
> ++    }
> ++    // Prepare netplan test directories
> ++    g_mkdir_with_parents (TEST_SCRATCH_DIR_OLD"/etc/netplan", 0755);
> ++    g_mkdir_with_parents (TEST_SCRATCH_DIR_OLD"/run/NetworkManager", 0755);
> ++    // link "keyfiles/" to "run/NetworkManager/system-connections"
> ++    const gchar *args[] = { "/bin/ln", "-s", TEST_KEYFILES_DIR_OLD, TEST_KEYFILES_DIR, NULL };
> ++    g_spawn_sync(NULL, (gchar**)args, NULL, G_SPAWN_DEFAULT, NULL, NULL, NULL, NULL, NULL, NULL);
> ++    // clear netplan YAML config from previous runs
> ++    g_spawn_command_line_sync("/bin/sh -c 'rm -f " TEST_KEYFILES_DIR_OLD "/etc/netplan/*.yaml'", NULL, NULL, NULL, NULL);
> ++    #else
> +     if (g_mkdir_with_parents(TEST_SCRATCH_DIR, 0755) != 0) {
> +         errsv = errno;
> +         g_error("failure to create test directory \"%s\": %s",
> +                 TEST_SCRATCH_DIR,
> +                 nm_strerror_native(errsv));
> +     }
> ++    #endif
> + 
> +     /* The tests */
> +     g_test_add_func("/keyfile/test_read_valid_wired_connection", test_read_valid_wired_connection);
> +-- 
> +2.39.2
> +


-- 
https://code.launchpad.net/~slyon/network-manager/+git/network-manager/+merge/423735
Your team Network-manager is requested to review the proposed merge of ~slyon/network-manager:netplan-integration into network-manager:ubuntu/master.




More information about the Ubuntu-reviews mailing list