---
.gitignore | 1 +
Makefile.am | 2 +-
configure.ac | 12 ++-
examples/Makefile.am | 21 ++++
examples/virtxml.c | 317 ++++++++++++++++++++++++++++++++++++++++++++++++++
5 files changed, 351 insertions(+), 2 deletions(-)
create mode 100644 examples/Makefile.am
create mode 100644 examples/virtxml.c
diff --git a/.gitignore b/.gitignore
index b7ba45a..d570af8 100644
--- a/.gitignore
+++ b/.gitignore
@@ -15,6 +15,7 @@ Makefile.in
/config.log
/config.status
/configure
+/examples/virtxml
/libtool
/libvirt-designer-1.0.pc
/libvirt-designer.spec
diff --git a/Makefile.am b/Makefile.am
index b0f68c0..ab06626 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -1,5 +1,5 @@
-SUBDIRS = libvirt-designer
+SUBDIRS = libvirt-designer examples
ACLOCAL_AMFLAGS = -I m4
diff --git a/configure.ac b/configure.ac
index 795990f..bdee845 100644
--- a/configure.ac
+++ b/configure.ac
@@ -13,6 +13,7 @@ AM_SILENT_RULES([yes])
LIBOSINFO_REQUIRED=0.0.5
LIBVIRT_GCONFIG_REQUIRED=0.0.9
GOBJECT_INTROSPECTION_REQUIRED=0.10.8
+LIBVIRT_REQUIRED=0.9.0
LIBVIRT_DESIGNER_MAJOR_VERSION=`echo $VERSION | awk -F. '{print $1}'`
LIBVIRT_DESIGNER_MINOR_VERSION=`echo $VERSION | awk -F. '{print $2}'`
@@ -30,6 +31,12 @@ AC_SUBST([LIBVIRT_DESIGNER_VERSION_NUMBER])
AC_PROG_CC
AM_PROG_CC_C_O
+AC_CHECK_FUNCS([strchr])
+AC_CHECK_FUNCS([strrchr])
+AC_CHECK_FUNCS([uname])
+AC_PROG_CXX
+AC_PROG_RANLIB
+AC_TYPE_SIZE_T
AC_LIBTOOL_WIN32_DLL
AC_PROG_LIBTOOL
@@ -40,6 +47,7 @@ LIBVIRT_DESIGNER_COMPILE_WARNINGS
PKG_CHECK_MODULES(LIBOSINFO, libosinfo-1.0 >= $LIBOSINFO_REQUIRED)
PKG_CHECK_MODULES(LIBVIRT_GCONFIG, libvirt-gconfig-1.0 >= $LIBVIRT_GCONFIG_REQUIRED)
+PKG_CHECK_MODULES(LIBVIRT, libvirt >= $LIBVIRT_REQUIRED)
LIBVIRT_DESIGNER_GETTEXT
LIBVIRT_DESIGNER_GTK_MISC
@@ -51,7 +59,8 @@ LIBVIRT_DESIGNER_INTROSPECTION
AC_OUTPUT(Makefile
libvirt-designer/Makefile
libvirt-designer.spec
- libvirt-designer-1.0.pc)
+ libvirt-designer-1.0.pc
+ examples/Makefile)
AC_MSG_NOTICE([])
AC_MSG_NOTICE([Configuration summary])
@@ -62,4 +71,5 @@ AC_MSG_NOTICE([ Libraries:])
AC_MSG_NOTICE([])
AC_MSG_NOTICE([ LIBOSINFO: $LIBOSINFO_CFLAGS $LIBOSINFO_LIBS])
AC_MSG_NOTICE([ LIBVIRT_GCONFIG: $LIBVIRT_GCONFIG_CFLAGS $LIBVIRT_GCONFIG_LIBS])
+AC_MSG_NOTICE([ LIBVIRT: $LIBVIRT_CFLAGS $LIBVIRT_LIBS])
AC_MSG_NOTICE([])
diff --git a/examples/Makefile.am b/examples/Makefile.am
new file mode 100644
index 0000000..afbb3ce
--- /dev/null
+++ b/examples/Makefile.am
@@ -0,0 +1,21 @@
+INCLUDES = \
+ -I$(top_builddir)/libvirt-designer \
+ -I$(top_srcdir)
+
+virtxml_LDADD = \
+ $(top_builddir)/libvirt-designer/libvirt-designer-1.0.la
+
+virtxml_CFLAGS = \
+ $(COVERAGE_CFLAGS) \
+ $(LIBOSINFO_CFLAGS) \
+ $(LIBVIRT_GCONFIG_CFLAGS) \
+ $(WARN_CFLAGS2) \
+ $(LIBVIRT_CFLAGS) \
+ $(NULL)
+
+virtxml_LDFLAGS = \
+ $(LIBOSINFO_LIBS) \
+ $(LIBVIRT_GCONFIG_LIBS) \
+ $(LIBVIRT_LIBS)
+
+bin_PROGRAMS = virtxml
diff --git a/examples/virtxml.c b/examples/virtxml.c
new file mode 100644
index 0000000..20e3f3c
--- /dev/null
+++ b/examples/virtxml.c
@@ -0,0 +1,317 @@
+/*
+ * virtxml.c: produce an domain XML
+ *
+ * Copyright (C) 2012 Red Hat, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; If not, see
+ * <
http://www.gnu.org/licenses/>.
+ *
+ * Author: Michal Privoznik <mprivozn(a)redhat.com>
+ */
+
+#include <config.h>
+#include <libvirt-designer/libvirt-designer.h>
+#include <libvirt/libvirt.h>
+#include <libvirt/virterror.h>
+
+#include <stdio.h>
+#include <getopt.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
+GList *disk_str_list = NULL;
+
+#define print_error(...) \
+ print_error_impl(__FUNCTION__, __LINE__, __VA_ARGS__)
+
+static void
+print_error_impl(const char *funcname,
+ size_t linenr,
+ const char *fmt, ...)
+{
+ va_list args;
+
+ fprintf(stderr, "Error in %s:%zu ", funcname, linenr);
+ va_start(args, fmt);
+ vfprintf(stderr, fmt, args);
+ va_end(args);
+ fprintf(stderr,"\n");
+}
+
+static OsinfoDb *
+get_default_osinfo_db(void)
+{
+ GError *err = NULL;
+ OsinfoLoader *loader = NULL;
+ OsinfoDb *ret = NULL;
+
+ loader = osinfo_loader_new();
+ osinfo_loader_process_default_path(loader, &err);
+ if (err) {
+ print_error("Unable to load default libosinfo DB: %s",
err->message);
+ goto cleanup;
+ }
+
+ ret = osinfo_loader_get_db(loader);
+ g_object_ref(ret);
+
+cleanup:
+ g_object_unref(loader);
+ return ret;
+}
+
+static gint
+entity_compare(gconstpointer a, gconstpointer b)
+{
+ const gchar *id_a = osinfo_entity_get_param_value(OSINFO_ENTITY(a),
+ OSINFO_ENTITY_PROP_ID);
+ const gchar *id_b = osinfo_entity_get_param_value(OSINFO_ENTITY(b),
+ OSINFO_ENTITY_PROP_ID);
+ return g_strcmp0(id_a, id_b);
+}
+
+static gboolean
+print_oses(const gchar *option_name,
+ const gchar *value,
+ gpointer data,
+ GError **error)
+{
+ OsinfoDb *db = get_default_osinfo_db();
+ OsinfoOsList *list;
+ GList *oses = NULL;
+ GList *os_iter;
+ int ret = EXIT_FAILURE;
+
+ if (!db)
+ goto cleanup;
+
+ printf(" Operating System ID\n"
+ "-----------------------\n");
+
+ list = osinfo_db_get_os_list(db);
+ if (!list)
+ goto cleanup;
+ oses = osinfo_list_get_elements(OSINFO_LIST(list));
+ oses = g_list_sort(oses, entity_compare);
+ for (os_iter = oses; os_iter; os_iter = os_iter->next) {
+ OsinfoOs *os = OSINFO_OS(os_iter->data);
+ const char *id = osinfo_entity_get_param_value(OSINFO_ENTITY(os),
+ OSINFO_ENTITY_PROP_ID);
+
+ printf("%s\n", id);
+ }
+
+ ret = EXIT_SUCCESS;
+
+cleanup:
+ if (list)
+ g_object_unref(list);
+ if (db)
+ g_object_unref(db);
+
+ exit(ret);
+ return TRUE;
+}
+
+static gboolean
+print_platforms(const gchar *option_name,
+ const gchar *value,
+ gpointer data,
+ GError **error)
+{
+ OsinfoDb *db = get_default_osinfo_db();
+ OsinfoPlatformList *list;
+ GList *platforms = NULL;
+ GList *platform_iter;
+ int ret = EXIT_FAILURE;
+
+ if (!db)
+ goto cleanup;
+
+ printf(" Platform ID\n"
+ "---------------\n");
+
+ list = osinfo_db_get_platform_list(db);
+ if (!list)
+ goto cleanup;
+ platforms = osinfo_list_get_elements(OSINFO_LIST(list));
+ platforms = g_list_sort(platforms, entity_compare);
+ for (platform_iter = platforms; platform_iter; platform_iter =
platform_iter->next) {
+ OsinfoPlatform *platform = OSINFO_PLATFORM(platform_iter->data);
+ const char *id = osinfo_entity_get_param_value(OSINFO_ENTITY(platform),
+ OSINFO_ENTITY_PROP_ID);
+
+ printf("%s\n", id);
+ }
+
+ ret = EXIT_SUCCESS;
+
+cleanup:
+ if (list)
+ g_object_unref(list);
+ if (db)
+ g_object_unref(db);
+
+ exit(ret);
+ return TRUE;
+}
+
+static void
+add_disk(gpointer data,
+ gpointer user_data)
+{
+ GVirDesignerDomain *domain = (GVirDesignerDomain *) user_data;
+ char *path = (char *) data;
+ char *format = NULL;
+ struct stat buf;
+ GError *error = NULL;
+
+ format = strchr(path, ',');
+ if (format) {
+ *format = '\0';
+ format++;
+ }
+
+ if (!path || !strlen(path)) {
+ print_error("No path provided");
+ exit(EXIT_FAILURE);
+ }
+
+ if (!stat(path, &buf) &&
+ !S_ISREG(buf.st_mode)) {
+ gvir_designer_domain_add_disk_device(domain, path, &error);
+ } else {
+ gvir_designer_domain_add_disk_file(domain, path, format, &error);
+ }
+
+ if (error) {
+ print_error("%s", error->message);
+ exit(EXIT_FAILURE);
+ }
+}
+
+static gboolean
+add_disk_str(const gchar *option_name,
+ const gchar *value,
+ gpointer data,
+ GError **error)
+{
+ disk_str_list = g_list_append(disk_str_list, g_strdup(value));
+ return TRUE;
+}
+
+#define CHECK_ERROR \
+ if (error) { \
+ print_error("%s", error->message); \
+ goto cleanup; \
+ }
+
+int
+main(int argc, char *argv[])
+{
+ int ret = EXIT_FAILURE;
+ GError *error = NULL;
+ OsinfoOs *os = NULL;
+ OsinfoPlatform *platform = NULL;
+ GVirConfigCapabilities *caps = NULL;
+ GVirConfigDomain *config = NULL;
+ GVirDesignerDomain *domain = NULL;
+ virConnectPtr conn = NULL;
+ char *caps_str = NULL;
+ gchar *xml = NULL;
+ static char *os_str = NULL;
+ static char *platform_str = NULL;
+ static char *arch_str = NULL;
+ static char *connect_uri = NULL;
+ GOptionContext *context;
+
+ static GOptionEntry entries[] =
+ {
+ {"connect", 'c', 0, G_OPTION_ARG_STRING, &connect_uri,
+ "libvirt connection URI used for querying capabilities",
"URI"},
+ {"list-os", 0, G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK,
print_oses,
+ "list IDs of known OSes", NULL},
+ {"list-platform", 0, G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK,
print_platforms,
+ "list IDs of known hypervisors", NULL},
+ {"os", 'o', 0, G_OPTION_ARG_STRING, &os_str,
+ "set domain OS", "OS"},
+ {"platform", 'p', 0, G_OPTION_ARG_STRING, &platform_str,
+ "set hypervisor under which domain will be running",
"PLATFORM"},
+ {"architecture", 'a', 0, G_OPTION_ARG_STRING, &arch_str,
+ "set domain architecture", "ARCH"},
+ {"disk", 'd', 0, G_OPTION_ARG_CALLBACK, add_disk_str,
+ "add disk to domain with PATH being source and FORMAT its format",
"PATH[,FORMAT]"},
+ {NULL}
+ };
+
+ if (!gvir_designer_init_check(&argc, &argv, NULL))
+ return EXIT_FAILURE;
+
+ context = g_option_context_new ("- test tree model performance");
+ g_option_context_add_main_entries (context, entries, GETTEXT_PACKAGE);
+ if (!g_option_context_parse(context, &argc, &argv, &error)) {
+ g_print ("option parsing failed: %s\n", error->message);
+ return EXIT_FAILURE;
+ }
+ if (!os_str) {
+ print_error("Operating system was not specified");
+ return EXIT_FAILURE;
+ }
+ if (!platform_str) {
+ print_error("Platform was not specified");
+ return EXIT_FAILURE;
+ }
+
+ conn = virConnectOpenAuth(connect_uri, virConnectAuthPtrDefault, VIR_CONNECT_RO);
+ if (!conn) {
+ print_error("Unable to connect to libvirt");
+ return EXIT_FAILURE;
+ }
+
+ if ((caps_str = virConnectGetCapabilities(conn)) == NULL) {
+ print_error("failed to get capabilities");
+ goto cleanup;
+ }
+
+ os = osinfo_os_new(os_str);
+ platform = osinfo_platform_new(platform_str);
+ caps = gvir_config_capabilities_new_from_xml(caps_str, NULL);
+
+ domain = gvir_designer_domain_new(os, platform, caps);
+
+ gvir_designer_domain_setup_machine(domain, &error);
+ CHECK_ERROR;
+
+ if (arch_str) {
+ gvir_designer_domain_setup_container_full(domain, arch_str, &error);
+ CHECK_ERROR;
+ }
+
+ g_list_foreach(disk_str_list, add_disk, domain);
+
+ config = gvir_designer_domain_get_config(domain);
+ xml = gvir_config_object_to_xml(GVIR_CONFIG_OBJECT(config));
+
+ g_printf("%s\n", xml);
+
+ ret = EXIT_SUCCESS;
+
+cleanup:
+ virConnectClose(conn);
+ return ret;
+}
--
1.7.8.6