[Libvirt-cim] [PATCH 2 of 2] Add XML parsing tester for use when working on Xen PV and KVM support

Dan Smith danms at us.ibm.com
Fri Jan 4 17:02:47 UTC 2008


# HG changeset patch
# User Dan Smith <danms at us.ibm.com>
# Date 1199469758 28800
# Node ID c835f70d0865e04aff102b25286b9928691e39ab
# Parent  56f9f42e5b66ec661f60dee4b4c8cc3424790ff9
Add XML parsing tester for use when working on Xen PV and KVM support

This simply takes a domain argument, gets the XML from libvirt, parses
it in the same way the providers will, and prints the domain information
in a structured way.  This can be used to test the previous patch, by
validating the FV-specific data items, such as emulator and the HVM loader
path.

Signed-off-by: Dan Smith <danms at us.ibm.com>

diff -r 56f9f42e5b66 -r c835f70d0865 libxkutil/Makefile.am
--- a/libxkutil/Makefile.am	Fri Jan 04 10:02:31 2008 -0800
+++ b/libxkutil/Makefile.am	Fri Jan 04 10:02:38 2008 -0800
@@ -12,3 +12,9 @@ AM_LDFLAGS = -lvirt -luuid
 
 libxkutil_la_SOURCES = cs_util_instance.c misc_util.c device_parsing.c \
                        xmlgen.c
+
+noinst_PROGRAMS = xml_parse_test
+
+xml_parse_test_SOURCES = xml_parse_test.c
+#xml_parse_test_HEADERS = device_parsing.h
+xml_parse_test_LDADD = -lvirt -lxkutil
diff -r 56f9f42e5b66 -r c835f70d0865 libxkutil/xml_parse_test.c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libxkutil/xml_parse_test.c	Fri Jan 04 10:02:38 2008 -0800
@@ -0,0 +1,172 @@
+#include <stdio.h>
+
+#include <libvirt/libvirt.h>
+
+#include "device_parsing.h"
+
+static void print_value(FILE *d, const char *name, const char *val)
+{
+        fprintf(d, "%-15s: %s\n", name, val);
+}
+
+static void print_u64(FILE *d, const char *name, uint64_t val)
+{
+        fprintf(d, "%-15s: %lu\n", name, val);
+}
+
+static void print_os(struct domain *dom,
+                     FILE *d)
+{
+
+        if (dom->type == DOMAIN_XENPV) {
+                print_value(d, "Domain Type", "Xen PV");
+                print_value(d, "Type", dom->os_info.pv.type);
+                print_value(d, "Kernel", dom->os_info.pv.kernel);
+                print_value(d, "Ramdisk", dom->os_info.pv.initrd);
+                print_value(d, "Args", dom->os_info.pv.cmdline);
+        } else if (dom->type == DOMAIN_XENFV) {
+                print_value(d, "Domain Type", "Xen FV");
+                print_value(d, "Type", dom->os_info.fv.type);
+                print_value(d, "Loader", dom->os_info.fv.loader);
+                print_value(d, "Boot", dom->os_info.fv.boot);
+        } else {
+                fprintf(d, "[ Unknown domain type %i ]\n", dom->type);
+        }
+}
+
+static void print_dominfo(struct domain *dominfo,
+                          FILE *d)
+{
+        print_value(d, "Name", dominfo->name);
+        print_value(d, "UUID", dominfo->uuid);
+        print_value(d, "Bootloader", dominfo->bootloader);
+        print_value(d, "  args", dominfo->bootloader_args);
+
+        fprintf(d, "Actions:       : P:%i R:%i C:%i\n",
+                dominfo->on_poweroff,
+                dominfo->on_reboot,
+                dominfo->on_crash);
+
+        print_os(dominfo, d);
+}
+
+static void print_dev_mem(struct virt_device *dev,
+                          FILE *d)
+{
+        print_u64(d, "Memory", dev->dev.mem.size);
+        print_u64(d, "Maximum", dev->dev.mem.maxsize);
+}
+static void print_dev_net(struct virt_device *dev,
+                          FILE *d)
+{
+        print_value(d, "Type", dev->dev.net.type);
+        print_value(d, "MAC", dev->dev.net.mac);
+}
+
+static void print_dev_disk(struct virt_device *dev,
+                           FILE *d)
+{
+        print_value(d, "Type", dev->dev.disk.type);
+        print_value(d, "Device", dev->dev.disk.device);
+        print_value(d, "Driver", dev->dev.disk.driver);
+        print_value(d, "Source", dev->dev.disk.source);
+        print_value(d, "Virt Device", dev->dev.disk.virtual_dev);
+}
+
+static void print_dev_vcpu(struct virt_device *dev,
+                           FILE *d)
+{
+        print_value(d, "Virtual CPU", "Present");
+}
+
+static void print_dev_emu(struct virt_device *dev,
+                          FILE *d)
+{
+        print_value(d, "Emulator", dev->dev.emu.path);
+}
+
+static void print_dev_graphics(struct virt_device *dev,
+                               FILE *d)
+{
+        print_value(d, "Graphics Type", dev->dev.graphics.type);
+        print_value(d, "Graphics Port", dev->dev.graphics.port);
+}
+
+static void print_devices(struct domain *dominfo,
+                          FILE *d)
+{
+        int i;
+
+        fprintf(d, "\n-- Memory (%i) --\n", dominfo->dev_mem_ct);
+        for (i = 0; i < dominfo->dev_mem_ct; i++)
+                print_dev_mem(&dominfo->dev_mem[i], d);
+
+        fprintf(d, "\n-- Network (%i) --\n", dominfo->dev_net_ct);
+        for (i = 0; i < dominfo->dev_net_ct; i++)
+                print_dev_net(&dominfo->dev_net[i], d);
+
+        fprintf(d, "\n-- Disk (%i) --\n", dominfo->dev_disk_ct);
+        for (i = 0; i < dominfo->dev_disk_ct; i++)
+                print_dev_disk(&dominfo->dev_disk[i], d);
+
+        fprintf(d, "\n-- VCPU (%i) -- \n", dominfo->dev_vcpu_ct);
+        for (i = 0; i < dominfo->dev_vcpu_ct; i++)
+                print_dev_vcpu(&dominfo->dev_vcpu[i], d);
+
+        if (dominfo->type != DOMAIN_XENPV) {
+                fprintf(d, "\n-- Emulator --\n");
+                print_dev_emu(dominfo->dev_emu, d);
+        }
+
+        if (dominfo->dev_graphics) {
+                fprintf(d, "\n-- Graphics --\n");
+                print_dev_graphics(dominfo->dev_graphics, d);
+        }
+}
+
+int main(int argc, char **argv)
+{
+        virConnectPtr conn;
+        virDomainPtr dom;
+        struct domain *dominfo;
+
+        if (argc != 2) {
+                printf("Usage: %s domain\n", argv[0]);
+                return 1;
+        }
+
+        conn = virConnectOpen("xen:///");
+        if (conn == NULL) {
+                printf("Unable to connect to libvirt\n");
+                return 2;
+        }
+
+        dom = virDomainLookupByName(conn, argv[1]);
+        if (dom == NULL) {
+                printf("Unable to lookup domain `%s'\n", argv[1]);
+                return 3;
+        }
+
+        if (get_dominfo(dom, &dominfo) == 0) {
+                printf("Failed to parse domain info\n");
+                return 4;
+        }
+
+        printf("Parsed domain info\n");
+
+        print_dominfo(dominfo, stdout);
+        print_devices(dominfo, stdout);
+
+        return 0;
+}
+
+
+/*
+ * Local Variables:
+ * mode: C
+ * c-set-style: "K&R"
+ * tab-width: 8
+ * c-basic-offset: 8
+ * indent-tabs-mode: nil
+ * End:
+ */




More information about the Libvirt-cim mailing list