Re: [PATCHv2] bonding: Writer support
- From: Dan Williams <dcbw redhat com>
- To: Thomas Graf <tgraf redhat com>
- Cc: networkmanager-list gnome org
- Subject: Re: [PATCHv2] bonding: Writer support
- Date: Thu, 01 Mar 2012 17:37:53 -0600
On Fri, 2012-02-24 at 15:31 +0100, Thomas Graf wrote:
> For bonding-master:
> TYPE=bond
> BONDING_MASTER=yes
> DEVICE=<NAME>
> BONDING_OPTS="..."
>
> For bonding-slaves:
> MASTER=<NAME>
>
> v2: Resolved test failures after feedback from Jirka.
Pushed, thanks.
Dan
> Signed-off-by: Thomas Graf <tgraf redhat com>
> ---
> .../plugins/ifcfg-rh/tests/test-ifcfg-rh.c | 280 +++++++++++++++++++-
> src/settings/plugins/ifcfg-rh/writer.c | 61 +++++
> 2 files changed, 339 insertions(+), 2 deletions(-)
>
> diff --git a/src/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh.c b/src/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh.c
> index 348e192..c385702 100644
> --- a/src/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh.c
> +++ b/src/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh.c
> @@ -11914,6 +11914,145 @@ test_read_bond_main (void)
> g_object_unref (connection);
> }
>
> +static void
> +test_write_bond_main (void)
> +{
> + NMConnection *connection;
> + NMConnection *reread;
> + NMSettingConnection *s_con;
> + NMSettingBond *s_bond;
> + NMSettingIP4Config *s_ip4;
> + NMSettingIP6Config *s_ip6;
> + NMSettingWired *s_wired;
> + char *uuid;
> + const guint32 ip1 = htonl (0x01010103);
> + const guint32 gw = htonl (0x01010101);
> + const guint32 prefix = 24;
> + NMIP4Address *addr;
> + gboolean success;
> + GError *error = NULL;
> + char *testfile = NULL;
> + char *unmanaged = NULL;
> + char *keyfile = NULL;
> + char *routefile = NULL;
> + char *route6file = NULL;
> + gboolean ignore_error = FALSE;
> +
> + connection = nm_connection_new ();
> + ASSERT (connection != NULL,
> + "bond-main-write", "failed to allocate new connection");
> +
> + /* Connection setting */
> + s_con = (NMSettingConnection *) nm_setting_connection_new ();
> + ASSERT (s_con != NULL,
> + "bond-main-write", "failed to allocate new %s setting",
> + NM_SETTING_CONNECTION_SETTING_NAME);
> + nm_connection_add_setting (connection, NM_SETTING (s_con));
> +
> + uuid = nm_utils_uuid_generate ();
> + g_object_set (s_con,
> + NM_SETTING_CONNECTION_ID, "Test Write Bond Main",
> + NM_SETTING_CONNECTION_UUID, uuid,
> + NM_SETTING_CONNECTION_AUTOCONNECT, TRUE,
> + NM_SETTING_CONNECTION_TYPE, NM_SETTING_BOND_SETTING_NAME,
> + NULL);
> + g_free (uuid);
> +
> + /* Wired setting */
> + s_wired = (NMSettingWired *) nm_setting_wired_new ();
> + ASSERT (s_wired != NULL,
> + "bond-main-write", "failed to allocate new %s setting",
> + NM_SETTING_WIRED_SETTING_NAME);
> + nm_connection_add_setting (connection, NM_SETTING (s_wired));
> +
> + /* bond setting */
> + s_bond = (NMSettingBond *) nm_setting_bond_new ();
> + ASSERT (s_bond != NULL,
> + "bond-main-write", "failed to allocate new %s setting",
> + NM_SETTING_BOND_SETTING_NAME);
> + nm_connection_add_setting (connection, NM_SETTING (s_bond));
> +
> + g_object_set (s_bond,
> + NM_SETTING_BOND_INTERFACE_NAME, "bond0",
> + NULL);
> +
> + /* IP4 setting */
> + s_ip4 = (NMSettingIP4Config *) nm_setting_ip4_config_new ();
> + ASSERT (s_ip4 != NULL,
> + "bond-main-write", "failed to allocate new %s setting",
> + NM_SETTING_IP4_CONFIG_SETTING_NAME);
> + nm_connection_add_setting (connection, NM_SETTING (s_ip4));
> +
> + g_object_set (s_ip4,
> + NM_SETTING_IP4_CONFIG_METHOD, NM_SETTING_IP4_CONFIG_METHOD_MANUAL,
> + NM_SETTING_IP4_CONFIG_MAY_FAIL, TRUE,
> + NULL);
> +
> + addr = nm_ip4_address_new ();
> + nm_ip4_address_set_address (addr, ip1);
> + nm_ip4_address_set_prefix (addr, prefix);
> + nm_ip4_address_set_gateway (addr, gw);
> + nm_setting_ip4_config_add_address (s_ip4, addr);
> + nm_ip4_address_unref (addr);
> +
> + /* IP6 setting */
> + s_ip6 = (NMSettingIP6Config *) nm_setting_ip6_config_new ();
> + ASSERT (s_ip6 != NULL,
> + "bond-main-write", "failed to allocate new %s setting",
> + NM_SETTING_IP6_CONFIG_SETTING_NAME);
> + nm_connection_add_setting (connection, NM_SETTING (s_ip6));
> +
> + g_object_set (s_ip6,
> + NM_SETTING_IP6_CONFIG_METHOD, NM_SETTING_IP6_CONFIG_METHOD_IGNORE,
> + NULL);
> +
> + ASSERT (nm_connection_verify (connection, &error) == TRUE,
> + "bond-main-write", "failed to verify connection: %s",
> + (error && error->message) ? error->message : "(unknown)");
> +
> + /* Save the ifcfg */
> + success = writer_new_connection (connection,
> + TEST_SCRATCH_DIR "/network-scripts/",
> + &testfile,
> + &error);
> + ASSERT (success == TRUE,
> + "bond-main-write", "failed to write connection to disk: %s",
> + (error && error->message) ? error->message : "(unknown)");
> +
> + ASSERT (testfile != NULL,
> + "bond-main-write", "didn't get ifcfg file path back after writing connection");
> +
> + /* re-read the connection for comparison */
> + reread = connection_from_file (testfile,
> + NULL,
> + TYPE_BOND,
> + NULL,
> + &unmanaged,
> + &keyfile,
> + &routefile,
> + &route6file,
> + &error,
> + &ignore_error);
> + unlink (testfile);
> +
> + ASSERT (reread != NULL,
> + "bond-main-write-reread", "failed to read %s: %s", testfile, error->message);
> +
> + ASSERT (nm_connection_verify (reread, &error),
> + "bond-main-write-reread-verify", "failed to verify %s: %s", testfile, error->message);
> +
> + ASSERT (nm_connection_compare (connection, reread, NM_SETTING_COMPARE_FLAG_EXACT) == TRUE,
> + "bond-main-write", "written and re-read connection weren't the same.");
> +
> + g_free (testfile);
> + g_free (unmanaged);
> + g_free (keyfile);
> + g_free (routefile);
> + g_free (route6file);
> + g_object_unref (connection);
> + g_object_unref (reread);
> +}
> +
> #define TEST_IFCFG_BOND_SLAVE TEST_IFCFG_DIR"/network-scripts/ifcfg-test-bond-slave"
>
> static void
> @@ -11964,6 +12103,139 @@ test_read_bond_slave (void)
> g_object_unref (connection);
> }
>
> +static void
> +test_write_bond_slave (void)
> +{
> + NMConnection *connection;
> + NMConnection *reread;
> + NMSettingConnection *s_con;
> + NMSettingWired *s_wired;
> + NMSettingIP4Config *s_ip4;
> + NMSettingIP6Config *s_ip6;
> + static unsigned char tmpmac[] = { 0x31, 0x33, 0x33, 0x37, 0xbe, 0xcd };
> + GByteArray *mac;
> + guint32 mtu = 1492;
> + char *uuid;
> + gboolean success;
> + GError *error = NULL;
> + char *testfile = NULL;
> + char *unmanaged = NULL;
> + char *keyfile = NULL;
> + char *routefile = NULL;
> + char *route6file = NULL;
> + gboolean ignore_error = FALSE;
> +
> + connection = nm_connection_new ();
> + ASSERT (connection != NULL,
> + "bond-slave-write", "failed to allocate new connection");
> +
> + /* Connection setting */
> + s_con = (NMSettingConnection *) nm_setting_connection_new ();
> + ASSERT (s_con != NULL,
> + "bond-slave-write", "failed to allocate new %s setting",
> + NM_SETTING_CONNECTION_SETTING_NAME);
> + nm_connection_add_setting (connection, NM_SETTING (s_con));
> +
> + uuid = nm_utils_uuid_generate ();
> + g_object_set (s_con,
> + NM_SETTING_CONNECTION_ID, "Test Write Bond Slave",
> + NM_SETTING_CONNECTION_UUID, uuid,
> + NM_SETTING_CONNECTION_AUTOCONNECT, TRUE,
> + NM_SETTING_CONNECTION_TYPE, NM_SETTING_WIRED_SETTING_NAME,
> + NM_SETTING_CONNECTION_MASTER, "bond0",
> + NM_SETTING_CONNECTION_SLAVE_TYPE, NM_SETTING_BOND_SETTING_NAME,
> + NULL);
> + g_free (uuid);
> +
> + /* Wired setting */
> + s_wired = (NMSettingWired *) nm_setting_wired_new ();
> + ASSERT (s_wired != NULL,
> + "bond-main-write", "failed to allocate new %s setting",
> + NM_SETTING_WIRED_SETTING_NAME);
> + nm_connection_add_setting (connection, NM_SETTING (s_wired));
> +
> + mac = g_byte_array_sized_new (sizeof (tmpmac));
> + g_byte_array_append (mac, &tmpmac[0], sizeof (tmpmac));
> +
> + g_object_set (s_wired,
> + NM_SETTING_WIRED_MAC_ADDRESS, mac,
> + NM_SETTING_WIRED_MTU, mtu,
> + NULL);
> + g_byte_array_free (mac, TRUE);
> +
> + /* IP4 setting */
> + s_ip4 = (NMSettingIP4Config *) nm_setting_ip4_config_new ();
> + ASSERT (s_ip4 != NULL,
> + "bond-slave-write", "failed to allocate new %s setting",
> + NM_SETTING_IP4_CONFIG_SETTING_NAME);
> + nm_connection_add_setting (connection, NM_SETTING (s_ip4));
> +
> + g_object_set (s_ip4,
> + NM_SETTING_IP4_CONFIG_METHOD, NM_SETTING_IP4_CONFIG_METHOD_DISABLED,
> + NULL);
> +
> + /* IP6 setting */
> + s_ip6 = (NMSettingIP6Config *) nm_setting_ip6_config_new ();
> + ASSERT (s_ip6 != NULL,
> + "bond-slave-write", "failed to allocate new %s setting",
> + NM_SETTING_IP6_CONFIG_SETTING_NAME);
> + nm_connection_add_setting (connection, NM_SETTING (s_ip6));
> +
> + g_object_set (s_ip6,
> + NM_SETTING_IP6_CONFIG_METHOD, NM_SETTING_IP6_CONFIG_METHOD_IGNORE,
> + NM_SETTING_IP6_CONFIG_MAY_FAIL, TRUE,
> + NULL);
> +
> + ASSERT (nm_connection_verify (connection, &error) == TRUE,
> + "bond-slave-write", "failed to verify connection: %s",
> + (error && error->message) ? error->message : "(unknown)");
> +
> + /* Save the ifcfg */
> + success = writer_new_connection (connection,
> + TEST_SCRATCH_DIR "/network-scripts/",
> + &testfile,
> + &error);
> + ASSERT (success == TRUE,
> + "bond-slave-write", "failed to write connection to disk: %s",
> + (error && error->message) ? error->message : "(unknown)");
> +
> + ASSERT (testfile != NULL,
> + "bond-slave-write", "didn't get ifcfg file path back after writing connection");
> +
> + /* re-read the connection for comparison */
> + reread = connection_from_file (testfile,
> + NULL,
> + TYPE_ETHERNET,
> + NULL,
> + &unmanaged,
> + &keyfile,
> + &routefile,
> + &route6file,
> + &error,
> + &ignore_error);
> + unlink (testfile);
> +
> + ASSERT (reread != NULL,
> + "bond-slave-write-reread", "failed to read %s: %s", testfile, error->message);
> +
> + ASSERT (nm_connection_verify (reread, &error),
> + "bond-slave-write-reread-verify", "failed to verify %s: %s", testfile, error->message);
> +
> + ASSERT (nm_connection_compare (connection, reread, NM_SETTING_COMPARE_FLAG_EXACT) == TRUE,
> + "bond-slave-write", "written and re-read connection weren't the same.");
> +
> + if (route6file)
> + unlink (route6file);
> +
> + g_free (testfile);
> + g_free (unmanaged);
> + g_free (keyfile);
> + g_free (routefile);
> + g_free (route6file);
> + g_object_unref (connection);
> + g_object_unref (reread);
> +}
> +
> #define TEST_IFCFG_INFINIBAND TEST_IFCFG_DIR"/network-scripts/ifcfg-test-infiniband"
>
> static void
> @@ -12344,6 +12616,12 @@ int main (int argc, char **argv)
> test_read_ibft_malformed ("ibft-bad-dns1-read", TEST_IFCFG_DIR "/iscsiadm-test-bad-dns1");
> test_read_ibft_malformed ("ibft-bad-dns2-read", TEST_IFCFG_DIR "/iscsiadm-test-bad-dns2");
>
> + /* bonding */
> + test_read_bond_main ();
> + test_read_bond_slave ();
> + test_write_bond_main ();
> + test_write_bond_slave ();
> +
> /* Stuff we expect to fail for now */
> test_write_wired_pppoe ();
> test_write_vpn ();
> @@ -12353,8 +12631,6 @@ int main (int argc, char **argv)
> test_read_bridge_component ();
> test_read_vlan_interface ();
> test_write_vlan ();
> - test_read_bond_main ();
> - test_read_bond_slave ();
>
> base = g_path_get_basename (argv[0]);
> fprintf (stdout, "%s: SUCCESS\n", base);
> diff --git a/src/settings/plugins/ifcfg-rh/writer.c b/src/settings/plugins/ifcfg-rh/writer.c
> index 56be08a..e6835d1 100644
> --- a/src/settings/plugins/ifcfg-rh/writer.c
> +++ b/src/settings/plugins/ifcfg-rh/writer.c
> @@ -1213,11 +1213,63 @@ write_vlan_setting (NMConnection *connection, shvarFile *ifcfg, GError **error)
> return TRUE;
> }
>
> +static gboolean
> +write_bonding_setting (NMConnection *connection, shvarFile *ifcfg, GError **error)
> +{
> + NMSettingBond *s_bond;
> + const char *iface;
> + guint32 i, num_opts;
> +
> + s_bond = nm_connection_get_setting_bond (connection);
> + if (!s_bond) {
> + g_set_error (error, IFCFG_PLUGIN_ERROR, 0,
> + "Missing '%s' setting", NM_SETTING_BOND_SETTING_NAME);
> + return FALSE;
> + }
> +
> + iface = nm_setting_bond_get_interface_name (s_bond);
> + if (!iface) {
> + g_set_error (error, IFCFG_PLUGIN_ERROR, 0, "Missing interface name");
> + return FALSE;
> + }
> +
> + svSetValue (ifcfg, "DEVICE", iface, FALSE);
> + svSetValue (ifcfg, "BONDING_OPTS", NULL, FALSE);
> +
> + num_opts = nm_setting_bond_get_num_options (s_bond);
> + if (num_opts > 0) {
> + GString *str = g_string_sized_new (64);
> +
> + for (i = 0; i < nm_setting_bond_get_num_options (s_bond); i++) {
> + const char *key, *value;
> +
> + if (!nm_setting_bond_get_option (s_bond, i, &key, &value))
> + continue;
> +
> + if (str->len)
> + g_string_append_c (str, ' ');
> +
> + g_string_append_printf (str, "%s=%s", key, value);
> + }
> +
> + if (str->len)
> + svSetValue (ifcfg, "BONDING_OPTS", str->str, FALSE);
> +
> + g_string_free (str, TRUE);
> + }
> +
> + svSetValue (ifcfg, "TYPE", TYPE_BOND, FALSE);
> + svSetValue (ifcfg, "BONDING_MASTER", "yes", FALSE);
> +
> + return TRUE;
> +}
> +
> static void
> write_connection_setting (NMSettingConnection *s_con, shvarFile *ifcfg)
> {
> guint32 n, i;
> GString *str;
> + const char *master;
>
> svSetValue (ifcfg, "NAME", nm_setting_connection_get_id (s_con), FALSE);
> svSetValue (ifcfg, "UUID", nm_setting_connection_get_uuid (s_con), FALSE);
> @@ -1248,6 +1300,12 @@ write_connection_setting (NMSettingConnection *s_con, shvarFile *ifcfg)
> }
>
> svSetValue (ifcfg, "ZONE", nm_setting_connection_get_zone(s_con), FALSE);
> +
> + master = nm_setting_connection_get_master (s_con);
> + if (master) {
> + if (nm_setting_connection_is_slave_type (s_con, NM_SETTING_BOND_SETTING_NAME))
> + svSetValue (ifcfg, "MASTER", master, FALSE);
> + }
> }
>
> static gboolean
> @@ -1928,6 +1986,9 @@ write_connection (NMConnection *connection,
> } else if (!strcmp (type, NM_SETTING_INFINIBAND_SETTING_NAME)) {
> if (!write_infiniband_setting (connection, ifcfg, error))
> goto out;
> + } else if (!strcmp (type, NM_SETTING_BOND_SETTING_NAME)) {
> + if (!write_bonding_setting (connection, ifcfg, error))
> + goto out;
> } else {
> g_set_error (error, IFCFG_PLUGIN_ERROR, 0,
> "Can't write connection type '%s'", type);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]