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

Reply via email to