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 <tg...@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); _______________________________________________ networkmanager-list mailing list networkmanager-list@gnome.org http://mail.gnome.org/mailman/listinfo/networkmanager-list