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.

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);
-- 
1.7.7.6

_______________________________________________
networkmanager-list mailing list
networkmanager-list@gnome.org
http://mail.gnome.org/mailman/listinfo/networkmanager-list

Reply via email to