summaryrefslogtreecommitdiffstats
path: root/daemon/lvm.c
diff options
context:
space:
mode:
authorRichard Jones <rjones@redhat.com>2009-04-10 18:25:07 +0100
committerRichard Jones <rjones@redhat.com>2009-04-11 17:04:35 +0100
commitb4d2a01828e5de85e5eee3631f7fe3925a0312ca (patch)
tree6f77ecceccd53a84afce4cecf0fe199ba7707752 /daemon/lvm.c
parent99f68f259f92eee884c6c7396f61b9c16e2bf354 (diff)
downloadlibguestfs-b4d2a01828e5de85e5eee3631f7fe3925a0312ca.tar.gz
libguestfs-b4d2a01828e5de85e5eee3631f7fe3925a0312ca.tar.xz
libguestfs-b4d2a01828e5de85e5eee3631f7fe3925a0312ca.zip
Added test suite.
Diffstat (limited to 'daemon/lvm.c')
-rw-r--r--daemon/lvm.c131
1 files changed, 131 insertions, 0 deletions
diff --git a/daemon/lvm.c b/daemon/lvm.c
index 7f31c84e..55b41f02 100644
--- a/daemon/lvm.c
+++ b/daemon/lvm.c
@@ -169,3 +169,134 @@ do_lvs_full (void)
{
return parse_command_line_lvs ();
}
+
+int
+do_pvcreate (const char *device)
+{
+ char *err;
+ int r;
+
+ r = command (NULL, &err,
+ "/sbin/lvm", "pvcreate", device, NULL);
+ if (r == -1) {
+ reply_with_error ("%s", err);
+ free (err);
+ return -1;
+ }
+
+ free (err);
+ return 0;
+}
+
+int
+do_vgcreate (const char *volgroup, char * const* const physvols)
+{
+ char *err;
+ int r, argc, i;
+ const char **argv;
+
+ argc = count_strings (physvols) + 3;
+ argv = malloc (sizeof (char *) * (argc + 1));
+ argv[0] = "/sbin/lvm";
+ argv[1] = "vgcreate";
+ argv[2] = volgroup;
+ for (i = 3; i <= argc; ++i)
+ argv[i] = physvols[i-3];
+
+ r = commandv (NULL, &err, argv);
+ if (r == -1) {
+ reply_with_error ("%s", err);
+ free (err);
+ return -1;
+ }
+
+ free (err);
+ return 0;
+}
+
+int
+do_lvcreate (const char *logvol, const char *volgroup, int mbytes)
+{
+ char *err;
+ int r;
+ char size[64];
+
+ snprintf (size, sizeof size, "%d", mbytes);
+
+ r = command (NULL, &err,
+ "/sbin/lvm", "lvcreate",
+ "-L", size, "-n", logvol, volgroup, NULL);
+ if (r == -1) {
+ reply_with_error ("%s", err);
+ free (err);
+ return -1;
+ }
+
+ free (err);
+ return 0;
+}
+
+/* Super-dangerous command used for testing. It removes all
+ * LVs, VGs and PVs permanently.
+ */
+int
+do_lvm_remove_all (void)
+{
+ char **xs;
+ int i, r;
+ char *err;
+
+ /* Remove LVs. */
+ xs = do_lvs ();
+ if (xs == NULL)
+ return -1;
+
+ for (i = 0; xs[i] != NULL; ++i) {
+ r = command (NULL, &err, "/sbin/lvm", "lvremove", "-f", xs[i], NULL);
+ if (r == -1) {
+ reply_with_error ("lvremove: %s: %s", xs[i], err);
+ free (err);
+ free_strings (xs);
+ return -1;
+ }
+ free (err);
+ }
+ free_strings (xs);
+
+ /* Remove VGs. */
+ xs = do_vgs ();
+ if (xs == NULL)
+ return -1;
+
+ for (i = 0; xs[i] != NULL; ++i) {
+ r = command (NULL, &err, "/sbin/lvm", "vgremove", "-f", xs[i], NULL);
+ if (r == -1) {
+ reply_with_error ("vgremove: %s: %s", xs[i], err);
+ free (err);
+ free_strings (xs);
+ return -1;
+ }
+ free (err);
+ }
+ free_strings (xs);
+
+ /* Remove PVs. */
+ xs = do_pvs ();
+ if (xs == NULL)
+ return -1;
+
+ for (i = 0; xs[i] != NULL; ++i) {
+ r = command (NULL, &err, "/sbin/lvm", "pvremove", "-f", xs[i], NULL);
+ if (r == -1) {
+ reply_with_error ("pvremove: %s: %s", xs[i], err);
+ free (err);
+ free_strings (xs);
+ return -1;
+ }
+ free (err);
+ }
+ free_strings (xs);
+
+ /* There, that was easy, sorry about your data. */
+ return 0;
+}