static void test_block_device (void) { int fd; char tmpfile[] = "/tmp/speedtestXXXXXX"; CLEANUP_FREE char **devices = NULL; char *r; const char *argv[4]; int t = max_time_override > 0 ? max_time_override : TEST_BLOCK_DEVICE_TIME; char tbuf[64]; int64_t bytes_written, bytes_read; if (!block_device_write && !block_device_read) return; snprintf (tbuf, sizeof tbuf, "%d", t); g = guestfs_create (); if (!g) error (EXIT_FAILURE, errno, "guestfs_create"); /* Create a fully allocated backing file. Note we are not testing * the speed of allocation on the host. */ fd = mkstemp (tmpfile); if (fd == -1) error (EXIT_FAILURE, errno, "mkstemp: %s", tmpfile); close (fd); if (guestfs_disk_create (g, tmpfile, "raw", INT64_C (1024*1024*1024), GUESTFS_DISK_CREATE_PREALLOCATION, "full", -1) == -1) exit (EXIT_FAILURE); if (guestfs_add_drive (g, tmpfile) == -1) exit (EXIT_FAILURE); if (guestfs_launch (g) == -1) exit (EXIT_FAILURE); devices = guestfs_list_devices (g); if (devices == NULL) exit (EXIT_FAILURE); if (devices[0] == NULL) { fprintf (stderr, "%s: expected guestfs_list_devices to return at least 1 device\n", guestfs_int_program_name); exit (EXIT_FAILURE); } if (block_device_write) { /* Test write speed. */ argv[0] = devices[0]; argv[1] = "w"; argv[2] = tbuf; argv[3] = NULL; r = guestfs_debug (g, "device_speed", (char **) argv); if (r == NULL) exit (EXIT_FAILURE); if (sscanf (r, "%" SCNi64, &bytes_written) != 1) { fprintf (stderr, "%s: could not parse device_speed output\n", guestfs_int_program_name); exit (EXIT_FAILURE); } print_rate ("block device writes:", bytes_written / t); } if (block_device_read) { /* Test read speed. */ argv[0] = devices[0]; argv[1] = "r"; argv[2] = tbuf; argv[3] = NULL; r = guestfs_debug (g, "device_speed", (char **) argv); if (r == NULL) exit (EXIT_FAILURE); if (sscanf (r, "%" SCNi64, &bytes_read) != 1) { fprintf (stderr, "%s: could not parse device_speed output\n", guestfs_int_program_name); exit (EXIT_FAILURE); } print_rate ("block device reads:", bytes_read / t); } if (guestfs_shutdown (g) == -1) exit (EXIT_FAILURE); guestfs_close (g); /* Remove temporary file. */ unlink (tmpfile); }
int main (int argc, char *argv[]) { guestfs_h *g; virConnectPtr conn; virDomainPtr dom; virErrorPtr err; int r; char *backend; char *cwd; FILE *fp; char libvirt_uri[1024]; cwd = xgetcwd (); /* Create the guestfs handle. */ g = guestfs_create (); if (g == NULL) { fprintf (stderr, "failed to create handle\n"); exit (EXIT_FAILURE); } backend = guestfs_get_backend (g); if (STREQ (backend, "uml")) { printf ("%s: test skipped because UML backend does not support qcow2\n", argv[0]); free (backend); exit (77); } free (backend); /* Create the libvirt XML and test images in the current * directory. */ fp = fopen ("test-add-libvirt-dom.xml", "w"); if (fp == NULL) { perror ("test-add-libvirt-dom.xml"); exit (EXIT_FAILURE); } make_test_xml (fp, cwd); fclose (fp); if (guestfs_disk_create (g, "test-add-libvirt-dom-1.img", "raw", 1024*1024, -1) == -1) exit (EXIT_FAILURE); if (guestfs_disk_create (g, "test-add-libvirt-dom-2.img", "raw", 1024*1024, -1) == -1) exit (EXIT_FAILURE); if (guestfs_disk_create (g, "test-add-libvirt-dom-3.img", "qcow2", 1024*1024, -1) == -1) exit (EXIT_FAILURE); /* Create the libvirt connection. */ snprintf (libvirt_uri, sizeof libvirt_uri, "test://%s/test-add-libvirt-dom.xml", cwd); conn = virConnectOpenReadOnly (libvirt_uri); if (!conn) { err = virGetLastError (); fprintf (stderr, "%s: could not connect to libvirt (code %d, domain %d): %s\n", argv[0], err->code, err->domain, err->message); exit (EXIT_FAILURE); } dom = virDomainLookupByName (conn, "guest"); if (!dom) { err = virGetLastError (); fprintf (stderr, "%s: no libvirt domain called '%s': %s\n", argv[0], "guest", err->message); exit (EXIT_FAILURE); } r = guestfs_add_libvirt_dom (g, dom, GUESTFS_ADD_LIBVIRT_DOM_READONLY, 1, -1); if (r == -1) exit (EXIT_FAILURE); if (r != 3) { fprintf (stderr, "%s: incorrect number of disks added (%d, expected 3)\n", argv[0], r); exit (EXIT_FAILURE); } guestfs_close (g); virDomainFree (dom); virConnectClose (conn); free (cwd); unlink ("test-add-libvirt-dom.xml"); unlink ("test-add-libvirt-dom-1.img"); unlink ("test-add-libvirt-dom-2.img"); unlink ("test-add-libvirt-dom-3.img"); exit (EXIT_SUCCESS); }