Re: [PATCHv2] bonding: Writer support



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]