forked from rpms/libblockdev
		
	New version
- Do not report volume name for FW RAID container device (vpodzime) - Search for just "UUID" in mdadm --examine output (vpodzime) - Use 'mdadm --examine --export' to get MD RAID level (vpodzime)
This commit is contained in:
		
							parent
							
								
									bf9216eb2f
								
							
						
					
					
						commit
						420d803e2d
					
				| @ -1,6 +1,6 @@ | |||||||
| Name:        libblockdev | Name:        libblockdev | ||||||
| Version:     1.9 | Version:     1.9 | ||||||
| Release:     3%{?dist} | Release:     4%{?dist} | ||||||
| Summary:     A library for low-level manipulation with block devices | Summary:     A library for low-level manipulation with block devices | ||||||
| License:     LGPLv2+ | License:     LGPLv2+ | ||||||
| URL:         https://github.com/rhinstaller/libblockdev | URL:         https://github.com/rhinstaller/libblockdev | ||||||
| @ -9,6 +9,9 @@ Source0:     https://github.com/rhinstaller/libblockdev/archive/%{name}-%{versio | |||||||
| Patch0: cast_numbers.patch | Patch0: cast_numbers.patch | ||||||
| Patch1: dbus_job_creation_timeout.patch | Patch1: dbus_job_creation_timeout.patch | ||||||
| Patch2: mdadm_raid_level_quirk.patch | Patch2: mdadm_raid_level_quirk.patch | ||||||
|  | Patch3: mdadm_examine_export.patch | ||||||
|  | Patch4: mdadm_examine_uuid.patch | ||||||
|  | Patch5: mdadm_fw_raid_device.patch | ||||||
| 
 | 
 | ||||||
| BuildRequires: glib2-devel | BuildRequires: glib2-devel | ||||||
| BuildRequires: gobject-introspection-devel | BuildRequires: gobject-introspection-devel | ||||||
| @ -382,6 +385,9 @@ A meta-package that pulls all the libblockdev plugins as dependencies. | |||||||
| %patch0 -p1 | %patch0 -p1 | ||||||
| %patch1 -p1 | %patch1 -p1 | ||||||
| %patch2 -p1 | %patch2 -p1 | ||||||
|  | %patch3 -p1 | ||||||
|  | %patch4 -p1 | ||||||
|  | %patch5 -p1 | ||||||
| 
 | 
 | ||||||
| %build | %build | ||||||
| %configure | %configure | ||||||
| @ -579,6 +585,14 @@ find %{buildroot} -type f -name "*.la" | xargs %{__rm} | |||||||
| %files plugins-all | %files plugins-all | ||||||
| 
 | 
 | ||||||
| %changelog | %changelog | ||||||
|  | * Tue Oct  4 2016 Vratislav Podzimek <vpodzime@redhat.com> - 1.9-4 | ||||||
|  | - Do not report volume name for FW RAID container device (vpodzime) | ||||||
|  |   Related: rhbz#1379865 | ||||||
|  | - Search for just "UUID" in mdadm --examine output (vpodzime) | ||||||
|  |   Related: rhbz#1379865 | ||||||
|  | - Use 'mdadm --examine --export' to get MD RAID level (vpodzime) | ||||||
|  |   Related: rhbz#1379865 | ||||||
|  | 
 | ||||||
| * Mon Oct  3 2016 Vratislav Podzimek <vpodzime@redhat.com> - 1.9-3 | * Mon Oct  3 2016 Vratislav Podzimek <vpodzime@redhat.com> - 1.9-3 | ||||||
| - Try to search for "RAID Level" in mdadm's output (vpodzime) | - Try to search for "RAID Level" in mdadm's output (vpodzime) | ||||||
|   Resolves: rhbz#1379865 |   Resolves: rhbz#1379865 | ||||||
|  | |||||||
							
								
								
									
										92
									
								
								mdadm_examine_export.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										92
									
								
								mdadm_examine_export.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,92 @@ | |||||||
|  | From 0773e654b2eb446518692535bb349f8abcd17af0 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: Vratislav Podzimek <vpodzime@redhat.com> | ||||||
|  | Date: Tue, 4 Oct 2016 19:08:06 +0200 | ||||||
|  | Subject: [PATCH 1/3] Use 'mdadm --examine --export' to get MD RAID level | ||||||
|  | 
 | ||||||
|  | It may not be reported properly in the 'mdadm --examine' output (e.g. for IMSM | ||||||
|  | FW RAID). | ||||||
|  | 
 | ||||||
|  | Related: rhbz#1379865 | ||||||
|  | 
 | ||||||
|  | (cherry-picked from commit 075c21c6a474674c1370472b2cf74f93dff28c38) | ||||||
|  | 
 | ||||||
|  | Signed-off-by: Vratislav Podzimek <vpodzime@redhat.com> | ||||||
|  | ---
 | ||||||
|  |  src/plugins/mdraid.c              | 20 ++++++++++++++++++++ | ||||||
|  |  tests/md_test.py                  |  2 +- | ||||||
|  |  tests/mdadm_fw_RAID_examine/mdadm | 10 ++++++++++ | ||||||
|  |  3 files changed, 31 insertions(+), 1 deletion(-) | ||||||
|  | 
 | ||||||
|  | diff --git a/src/plugins/mdraid.c b/src/plugins/mdraid.c
 | ||||||
|  | index 723b756..7e6b2da 100644
 | ||||||
|  | --- a/src/plugins/mdraid.c
 | ||||||
|  | +++ b/src/plugins/mdraid.c
 | ||||||
|  | @@ -798,6 +798,26 @@ BDMDExamineData* bd_md_examine (gchar *device, GError **error) {
 | ||||||
|  |          g_free (orig_data); | ||||||
|  |      } | ||||||
|  |   | ||||||
|  | +    argv[2] = "--export";
 | ||||||
|  | +    success = bd_utils_exec_and_capture_output (argv, &output, error);
 | ||||||
|  | +    if (!success)
 | ||||||
|  | +        /* error is already populated */
 | ||||||
|  | +        return FALSE;
 | ||||||
|  | +
 | ||||||
|  | +    /* try to get a better information about RAID level because it may be
 | ||||||
|  | +       misleading in the output without --export */
 | ||||||
|  | +    output_fields = g_strsplit (output, "\n", 0);
 | ||||||
|  | +    g_free (output);
 | ||||||
|  | +    output = NULL;
 | ||||||
|  | +    for (i=0; (i < g_strv_length (output_fields) - 1); i++)
 | ||||||
|  | +        if (g_str_has_prefix (output_fields[i], "MD_LEVEL=")) {
 | ||||||
|  | +            value = strchr (output_fields[i], '=');
 | ||||||
|  | +            value++;
 | ||||||
|  | +            g_free (ret->level);
 | ||||||
|  | +            ret->level = g_strdup (value);
 | ||||||
|  | +        }
 | ||||||
|  | +    g_strfreev (output_fields);
 | ||||||
|  | +
 | ||||||
|  |      argv[2] = "--brief"; | ||||||
|  |      success = bd_utils_exec_and_capture_output (argv, &output, error); | ||||||
|  |      if (!success) | ||||||
|  | diff --git a/tests/md_test.py b/tests/md_test.py
 | ||||||
|  | index df90582..4b4d898 100644
 | ||||||
|  | --- a/tests/md_test.py
 | ||||||
|  | +++ b/tests/md_test.py
 | ||||||
|  | @@ -410,7 +410,7 @@ class FakeMDADMutilTest(unittest.TestCase):
 | ||||||
|  |          with fake_utils("tests/mdadm_fw_RAID_examine"): | ||||||
|  |              ex_data = BlockDev.md_examine("fake_dev") | ||||||
|  |   | ||||||
|  | -        self.assertEqual(ex_data.level, "0")
 | ||||||
|  | +        self.assertEqual(ex_data.level, "container")
 | ||||||
|  |          self.assertEqual(ex_data.num_devices, 1) | ||||||
|  |   | ||||||
|  |      def test_no_metadata_examine(self): | ||||||
|  | diff --git a/tests/mdadm_fw_RAID_examine/mdadm b/tests/mdadm_fw_RAID_examine/mdadm
 | ||||||
|  | index c939860..6fe7f64 100755
 | ||||||
|  | --- a/tests/mdadm_fw_RAID_examine/mdadm
 | ||||||
|  | +++ b/tests/mdadm_fw_RAID_examine/mdadm
 | ||||||
|  | @@ -3,11 +3,21 @@
 | ||||||
|  |  echo "$@"|grep -- "--brief" &>/dev/null | ||||||
|  |  is_brief=$? | ||||||
|  |   | ||||||
|  | +echo "$@"|grep -- "--export" &>/dev/null
 | ||||||
|  | +is_export=$?
 | ||||||
|  | +
 | ||||||
|  |  if [ $is_brief -eq 0 ]; then | ||||||
|  |      cat <<EOF | ||||||
|  |  ARRAY metadata=imsm UUID=b42756a2:37e43e47:674bd1dd:6e822145 | ||||||
|  |  ARRAY /dev/md/Volume0 container=b42756a2:37e43e47:674bd1dd:6e822145 member=0 UUID=8f0b5240:06168ed1:bbafeaf5:2a7b04fc | ||||||
|  |  EOF | ||||||
|  | +elif [ $is_export -eq 0 ]; then
 | ||||||
|  | +    cat <<EOF
 | ||||||
|  | +MD_METADATA=imsm
 | ||||||
|  | +MD_LEVEL=container
 | ||||||
|  | +MD_UUID=b42756a2:37e43e47:674bd1dd:6e822145
 | ||||||
|  | +MD_DEVICES=2
 | ||||||
|  | +EOF
 | ||||||
|  |  else | ||||||
|  |      cat <<EOF | ||||||
|  |  /dev/sda: | ||||||
|  | -- 
 | ||||||
|  | 2.7.4 | ||||||
|  | 
 | ||||||
							
								
								
									
										59
									
								
								mdadm_examine_uuid.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										59
									
								
								mdadm_examine_uuid.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,59 @@ | |||||||
|  | From 15d5cb5679d69bb016edd8659362bb4c23b3573d Mon Sep 17 00:00:00 2001 | ||||||
|  | From: Vratislav Podzimek <vpodzime@redhat.com> | ||||||
|  | Date: Tue, 4 Oct 2016 21:12:06 +0200 | ||||||
|  | Subject: [PATCH 2/3] Search for just "UUID" in mdadm --examine output | ||||||
|  | 
 | ||||||
|  | IMSM raid arrays don't have the "Array UUID" key reported, it's just "UUID". And | ||||||
|  | as a bonus, the volume UUID is reported as well as the container's UUID (we care | ||||||
|  | about), both using just "UUID". | ||||||
|  | 
 | ||||||
|  | Related: rhbz#1379865 | ||||||
|  | 
 | ||||||
|  | (cherry-picked from commit 0fb4e778b8a30200ed6e4272e9427d109f993eb2) | ||||||
|  | 
 | ||||||
|  | Signed-off-by: Vratislav Podzimek <vpodzime@redhat.com> | ||||||
|  | ---
 | ||||||
|  |  src/plugins/mdraid.c | 7 ++++++- | ||||||
|  |  tests/md_test.py     | 1 + | ||||||
|  |  2 files changed, 7 insertions(+), 1 deletion(-) | ||||||
|  | 
 | ||||||
|  | diff --git a/src/plugins/mdraid.c b/src/plugins/mdraid.c
 | ||||||
|  | index 7e6b2da..5bfbfb8 100644
 | ||||||
|  | --- a/src/plugins/mdraid.c
 | ||||||
|  | +++ b/src/plugins/mdraid.c
 | ||||||
|  | @@ -164,7 +164,9 @@ static GHashTable* parse_mdadm_vars (gchar *str, gchar *item_sep, gchar *key_val
 | ||||||
|  |          key_val = g_strsplit (*item_p, key_val_sep, 2); | ||||||
|  |          if (g_strv_length (key_val) == 2) { | ||||||
|  |              /* we only want to process valid lines (with the separator) */ | ||||||
|  | -            g_hash_table_insert (table, g_strstrip (key_val[0]), g_strstrip (key_val[1]));
 | ||||||
|  | +            /* only use the first value for the given key */
 | ||||||
|  | +            if (!g_hash_table_contains (table, g_strstrip (key_val[0])))
 | ||||||
|  | +                g_hash_table_insert (table, g_strstrip (key_val[0]), g_strstrip (key_val[1]));
 | ||||||
|  |              (*num_items)++; | ||||||
|  |          } else | ||||||
|  |              /* invalid line, just free key_val */ | ||||||
|  | @@ -211,6 +213,9 @@ static BDMDExamineData* get_examine_data_from_table (GHashTable *table, gboolean
 | ||||||
|  |          data->size = 0; | ||||||
|  |   | ||||||
|  |      data->uuid = g_strdup ((gchar*) g_hash_table_lookup (table, "Array UUID")); | ||||||
|  | +    if (!data->uuid)
 | ||||||
|  | +        /* also try just "UUID" which may be reported e.g for IMSM FW RAID */
 | ||||||
|  | +        data->uuid = g_strdup ((gchar*) g_hash_table_lookup (table, "UUID"));
 | ||||||
|  |   | ||||||
|  |      value = (gchar*) g_hash_table_lookup (table, "Update Time"); | ||||||
|  |      if (value) { | ||||||
|  | diff --git a/tests/md_test.py b/tests/md_test.py
 | ||||||
|  | index 4b4d898..2fab378 100644
 | ||||||
|  | --- a/tests/md_test.py
 | ||||||
|  | +++ b/tests/md_test.py
 | ||||||
|  | @@ -412,6 +412,7 @@ class FakeMDADMutilTest(unittest.TestCase):
 | ||||||
|  |   | ||||||
|  |          self.assertEqual(ex_data.level, "container") | ||||||
|  |          self.assertEqual(ex_data.num_devices, 1) | ||||||
|  | +        self.assertEqual(ex_data.uuid, "b42756a2-37e4-3e47-674b-d1dd6e822145")
 | ||||||
|  |   | ||||||
|  |      def test_no_metadata_examine(self): | ||||||
|  |          """Verify that md_examine works as expected with no metadata spec""" | ||||||
|  | -- 
 | ||||||
|  | 2.7.4 | ||||||
|  | 
 | ||||||
							
								
								
									
										112
									
								
								mdadm_fw_raid_device.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										112
									
								
								mdadm_fw_raid_device.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,112 @@ | |||||||
|  | From 8123db9319a26c59996d4c42e84100ebe5822b82 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: Vratislav Podzimek <vpodzime@redhat.com> | ||||||
|  | Date: Tue, 4 Oct 2016 21:19:22 +0200 | ||||||
|  | Subject: [PATCH 3/3] Do not report volume name for FW RAID container device | ||||||
|  | 
 | ||||||
|  | This may be confusing for tools/libraries using our API because they need info | ||||||
|  | about the immediate descendant device which is the container. | ||||||
|  | 
 | ||||||
|  | Related: rhbz#1379865 | ||||||
|  | 
 | ||||||
|  | (cherry-picked from commit ad6eb3d47c57171cea7abbae0f5d0c1f5ee2c357) | ||||||
|  | 
 | ||||||
|  | Signed-off-by: Vratislav Podzimek <vpodzime@redhat.com> | ||||||
|  | ---
 | ||||||
|  |  src/plugins/mdraid.c              | 13 ++++++++----- | ||||||
|  |  tests/md_test.py                  | 12 ++---------- | ||||||
|  |  tests/mdadm_fw_raid_examine/mdadm | 18 ------------------ | ||||||
|  |  3 files changed, 10 insertions(+), 33 deletions(-) | ||||||
|  |  delete mode 100755 tests/mdadm_fw_raid_examine/mdadm | ||||||
|  | 
 | ||||||
|  | diff --git a/src/plugins/mdraid.c b/src/plugins/mdraid.c
 | ||||||
|  | index 5bfbfb8..9cb0cc7 100644
 | ||||||
|  | --- a/src/plugins/mdraid.c
 | ||||||
|  | +++ b/src/plugins/mdraid.c
 | ||||||
|  | @@ -768,7 +768,7 @@ BDMDExamineData* bd_md_examine (gchar *device, GError **error) {
 | ||||||
|  |      gchar **output_fields = NULL; | ||||||
|  |      gchar *orig_data = NULL; | ||||||
|  |      guint i = 0; | ||||||
|  | -    gboolean found_dev_name = FALSE;
 | ||||||
|  | +    gboolean found_array_line = FALSE;
 | ||||||
|  |   | ||||||
|  |      success = bd_utils_exec_and_capture_output (argv, &output, error); | ||||||
|  |      if (!success) | ||||||
|  | @@ -831,13 +831,16 @@ BDMDExamineData* bd_md_examine (gchar *device, GError **error) {
 | ||||||
|  |   | ||||||
|  |      /* try to find the "ARRAY /dev/md/something" pair in the output */ | ||||||
|  |      output_fields = g_strsplit_set (output, " \n", 0); | ||||||
|  | -    for (i=0; !found_dev_name && (i < g_strv_length (output_fields) - 1); i++)
 | ||||||
|  | -        if (g_strcmp0 (output_fields[i], "ARRAY") == 0)
 | ||||||
|  | +    for (i=0; !found_array_line && (i < g_strv_length (output_fields) - 1); i++)
 | ||||||
|  | +        if (g_strcmp0 (output_fields[i], "ARRAY") == 0) {
 | ||||||
|  | +            found_array_line = TRUE;
 | ||||||
|  |              if (g_str_has_prefix (output_fields[i+1], "/dev/md/")) { | ||||||
|  |                  ret->device = g_strdup (output_fields[i+1]); | ||||||
|  | -                found_dev_name = TRUE;
 | ||||||
|  | +            } else {
 | ||||||
|  | +                ret->device = NULL;
 | ||||||
|  |              } | ||||||
|  | -    if (!found_dev_name)
 | ||||||
|  | +        }
 | ||||||
|  | +    if (!found_array_line)
 | ||||||
|  |          ret->device = NULL; | ||||||
|  |      g_strfreev (output_fields); | ||||||
|  |   | ||||||
|  | diff --git a/tests/md_test.py b/tests/md_test.py
 | ||||||
|  | index 2fab378..d7e007a 100644
 | ||||||
|  | --- a/tests/md_test.py
 | ||||||
|  | +++ b/tests/md_test.py
 | ||||||
|  | @@ -395,17 +395,8 @@ class MDTestNameNodeBijection(MDTestCase):
 | ||||||
|  |   | ||||||
|  |  class FakeMDADMutilTest(unittest.TestCase): | ||||||
|  |      # no setUp nor tearDown needed, we are gonna use fake utils | ||||||
|  | -
 | ||||||
|  | -    def test_fw_raid_examine(self):
 | ||||||
|  | -        """Verify that md_examine works as expected on FW RAID data"""
 | ||||||
|  | -
 | ||||||
|  | -        with fake_utils("tests/mdadm_fw_raid_examine"):
 | ||||||
|  | -            ex_data = BlockDev.md_examine("fake_dev")
 | ||||||
|  | -
 | ||||||
|  | -        self.assertEqual(ex_data.device, "/dev/md/Volume0")
 | ||||||
|  | -
 | ||||||
|  |      def test_fw_raid_uppercase_examine(self): | ||||||
|  | -        """Verify that md_examine works with output using "RAID" instead of "Raid" """
 | ||||||
|  | +        """Verify that md_examine works with output using "RAID" instead of "Raid" and other quirks """
 | ||||||
|  |   | ||||||
|  |          with fake_utils("tests/mdadm_fw_RAID_examine"): | ||||||
|  |              ex_data = BlockDev.md_examine("fake_dev") | ||||||
|  | @@ -413,6 +404,7 @@ class FakeMDADMutilTest(unittest.TestCase):
 | ||||||
|  |          self.assertEqual(ex_data.level, "container") | ||||||
|  |          self.assertEqual(ex_data.num_devices, 1) | ||||||
|  |          self.assertEqual(ex_data.uuid, "b42756a2-37e4-3e47-674b-d1dd6e822145") | ||||||
|  | +        self.assertEqual(ex_data.device, None)
 | ||||||
|  |   | ||||||
|  |      def test_no_metadata_examine(self): | ||||||
|  |          """Verify that md_examine works as expected with no metadata spec""" | ||||||
|  | diff --git a/tests/mdadm_fw_raid_examine/mdadm b/tests/mdadm_fw_raid_examine/mdadm
 | ||||||
|  | deleted file mode 100755 | ||||||
|  | index 54ec4ed..0000000
 | ||||||
|  | --- a/tests/mdadm_fw_raid_examine/mdadm
 | ||||||
|  | +++ /dev/null
 | ||||||
|  | @@ -1,18 +0,0 @@
 | ||||||
|  | -#!/bin/bash
 | ||||||
|  | -
 | ||||||
|  | -echo "$@"|grep -- "--brief" &>/dev/null
 | ||||||
|  | -is_brief=$?
 | ||||||
|  | -
 | ||||||
|  | -if [ $is_brief -eq 0 ]; then
 | ||||||
|  | -    cat <<EOF
 | ||||||
|  | -ARRAY metadata=imsm UUID=e0fb362e:9865d1c0:cdb0f5e3:27c9a085
 | ||||||
|  | -ARRAY /dev/md/Volume0 container=e0fb362e:9865d1c0:cdb0f5e3:27c9a085 member=0 UUID=1d1335e9:79d4be6a:e16b7fa7:fe8c41f6
 | ||||||
|  | -EOF
 | ||||||
|  | -else
 | ||||||
|  | -    cat <<EOF
 | ||||||
|  | -MD_METADATA=imsm
 | ||||||
|  | -MD_LEVEL=container
 | ||||||
|  | -MD_UUID=e0fb362e:9865d1c0:cdb0f5e3:27c9a085
 | ||||||
|  | -MD_DEVICES=2
 | ||||||
|  | -EOF
 | ||||||
|  | -fi
 | ||||||
|  | -- 
 | ||||||
|  | 2.7.4 | ||||||
|  | 
 | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user