[Libosinfo] [libosinfo PATCH v2] os: Add kernel-url-argument API

Fabiano Fidêncio fidencio at redhat.com
Fri May 3 15:53:24 UTC 2019


Tree based installations will require a kernel-url-argument to be
assed. Let's provide an API to the apps to get this info from OsinfoOS.

https://gitlab.com/libosinfo/osinfo-db/issues/28

Signed-off-by: Fabiano Fidêncio <fidencio at redhat.com>
---
 osinfo/libosinfo.syms                         |  2 +
 osinfo/osinfo_loader.c                        |  1 +
 osinfo/osinfo_os.c                            | 67 +++++++++++++++++++
 osinfo/osinfo_os.h                            |  3 +
 .../libosinfo.org/test-os-kernel-url-arg1.xml | 13 ++++
 .../libosinfo.org/test-os-kernel-url-arg2.xml | 12 ++++
 .../libosinfo.org/test-os-kernel-url-arg3.xml | 14 ++++
 tests/test-os.c                               | 36 ++++++++++
 8 files changed, 148 insertions(+)
 create mode 100644 tests/dbdata/os/libosinfo.org/test-os-kernel-url-arg1.xml
 create mode 100644 tests/dbdata/os/libosinfo.org/test-os-kernel-url-arg2.xml
 create mode 100644 tests/dbdata/os/libosinfo.org/test-os-kernel-url-arg3.xml

diff --git a/osinfo/libosinfo.syms b/osinfo/libosinfo.syms
index 853acf5..f8b56a7 100644
--- a/osinfo/libosinfo.syms
+++ b/osinfo/libosinfo.syms
@@ -577,6 +577,8 @@ LIBOSINFO_1.5.0 {
 	osinfo_install_config_get_installation_url;
 	osinfo_install_config_set_installation_url;
 
+	osinfo_os_get_kernel_url_argument;
+
 	osinfo_product_get_short_id_list;
 
 	osinfo_tree_get_os;
diff --git a/osinfo/osinfo_loader.c b/osinfo/osinfo_loader.c
index 522162f..7735357 100644
--- a/osinfo/osinfo_loader.c
+++ b/osinfo/osinfo_loader.c
@@ -1563,6 +1563,7 @@ static void osinfo_loader_os(OsinfoLoader *loader,
         { OSINFO_OS_PROP_FAMILY, G_TYPE_STRING },
         { OSINFO_OS_PROP_DISTRO, G_TYPE_STRING },
         { OSINFO_OS_PROP_RELEASE_STATUS, G_TYPE_STRING },
+        { OSINFO_OS_PROP_KERNEL_URL_ARGUMENT, G_TYPE_STRING },
         { NULL, G_TYPE_INVALID }
     };
 
diff --git a/osinfo/osinfo_os.c b/osinfo/osinfo_os.c
index e458a45..08faf4f 100644
--- a/osinfo/osinfo_os.c
+++ b/osinfo/osinfo_os.c
@@ -75,6 +75,7 @@ enum {
 
     PROP_FAMILY,
     PROP_DISTRO,
+    PROP_KERNEL_URL_ARGUMENT,
 };
 
 static void osinfo_os_finalize(GObject *object);
@@ -99,6 +100,11 @@ osinfo_os_get_property(GObject    *object,
                                 osinfo_entity_get_param_value(entity,
                                                                "distro"));
             break;
+        case PROP_KERNEL_URL_ARGUMENT:
+            g_value_set_string(value,
+                               osinfo_entity_get_param_value(entity,
+                                                             OSINFO_OS_PROP_KERNEL_URL_ARGUMENT));
+            break;
         default:
             /* We don't have any other property... */
             G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec);
@@ -172,6 +178,22 @@ osinfo_os_class_init(OsinfoOsClass *klass)
     g_object_class_install_property(g_klass,
                                     PROP_DISTRO,
                                     pspec);
+
+    /**
+     * OsinfoOs:kernel-url-argument:
+     *
+     * The argument to be passed to kernel command line when performing a
+     * tree based installation of this OS.
+     */
+    pspec = g_param_spec_string("kernel-url-argument",
+                                "KernelURLArgument",
+                                _("Kernel URL Argument"),
+                                NULL /* default value */,
+                                G_PARAM_READABLE |
+                                G_PARAM_STATIC_STRINGS);
+    g_object_class_install_property(g_klass,
+                                    PROP_KERNEL_URL_ARGUMENT,
+                                    pspec);
 }
 
 static void
@@ -1142,3 +1164,48 @@ void osinfo_os_add_device_driver(OsinfoOs *os, OsinfoDeviceDriver *driver)
     osinfo_list_add(OSINFO_LIST(os->priv->device_drivers),
                     OSINFO_ENTITY(driver));
 }
+
+struct GetKernelURLArgumentData {
+    const gchar *kernel_url_arg;
+};
+
+static void get_kernel_url_argument_cb(OsinfoProduct *product, gpointer user_data)
+{
+    OsinfoOs *os = OSINFO_OS(product);
+    struct GetKernelURLArgumentData *foreach_data = user_data;
+
+    g_return_if_fail(OSINFO_IS_OS(os));
+
+    if (foreach_data->kernel_url_arg != NULL)
+        return;
+
+    foreach_data->kernel_url_arg =
+            osinfo_entity_get_param_value(OSINFO_ENTITY(os),
+                                          OSINFO_OS_PROP_KERNEL_URL_ARGUMENT);
+}
+
+/**
+ * osinfo_os_get_kernel_url_argument:
+ * @os: an operating system
+ *
+ * Gets the argument expected to be passed to the kernel command line when
+ * performing a tree based installation.
+ *
+ * Returns: (transfer none): the kernel url argument, if present. Otherwise,
+ * NULL.
+ */
+const gchar *osinfo_os_get_kernel_url_argument(OsinfoOs *os)
+{
+    struct GetKernelURLArgumentData foreach_data = {
+        .kernel_url_arg = NULL
+    };
+    g_return_val_if_fail(OSINFO_IS_OS(os), NULL);
+
+    osinfo_product_foreach_related(OSINFO_PRODUCT(os),
+                                   OSINFO_PRODUCT_FOREACH_FLAG_DERIVES_FROM |
+                                   OSINFO_PRODUCT_FOREACH_FLAG_CLONES,
+                                   get_kernel_url_argument_cb,
+                                   &foreach_data);
+
+    return foreach_data.kernel_url_arg;
+}
diff --git a/osinfo/osinfo_os.h b/osinfo/osinfo_os.h
index 7c10475..6207a53 100644
--- a/osinfo/osinfo_os.h
+++ b/osinfo/osinfo_os.h
@@ -62,6 +62,7 @@ typedef struct _OsinfoOsPrivate OsinfoOsPrivate;
 #define OSINFO_OS_PROP_FAMILY                 "family"
 #define OSINFO_OS_PROP_DISTRO                 "distro"
 #define OSINFO_OS_PROP_RELEASE_STATUS         "release-status"
+#define OSINFO_OS_PROP_KERNEL_URL_ARGUMENT    "kernel-url-argument"
 
 /* object */
 struct _OsinfoOs
@@ -142,4 +143,6 @@ void osinfo_os_add_install_script(OsinfoOs *os, OsinfoInstallScript *script);
 OsinfoDeviceDriverList *osinfo_os_get_device_drivers(OsinfoOs *os);
 void osinfo_os_add_device_driver(OsinfoOs *os, OsinfoDeviceDriver *driver);
 
+const gchar *osinfo_os_get_kernel_url_argument(OsinfoOs *os);
+
 #endif /* __OSINFO_OS_H__ */
diff --git a/tests/dbdata/os/libosinfo.org/test-os-kernel-url-arg1.xml b/tests/dbdata/os/libosinfo.org/test-os-kernel-url-arg1.xml
new file mode 100644
index 0000000..f3ea3ae
--- /dev/null
+++ b/tests/dbdata/os/libosinfo.org/test-os-kernel-url-arg1.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<libosinfo version="0.0.1">
+  <os id="http://libosinfo.org/test/os/kernel-url-arg1">
+    <short-id>kernel-url-arg1</short-id>
+    <name>Kernel URL Arg 1</name>
+    <version>unknown</version>
+    <vendor>libosinfo.org</vendor>
+    <family>test</family>
+    <release-status>prerelease</release-status>
+
+    <kernel-url-argument>install</kernel-url-argument>
+  </os>
+</libosinfo>
diff --git a/tests/dbdata/os/libosinfo.org/test-os-kernel-url-arg2.xml b/tests/dbdata/os/libosinfo.org/test-os-kernel-url-arg2.xml
new file mode 100644
index 0000000..d97c2d8
--- /dev/null
+++ b/tests/dbdata/os/libosinfo.org/test-os-kernel-url-arg2.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<libosinfo version="0.0.1">
+  <os id="http://libosinfo.org/test/os/kernel-url-arg2">
+    <short-id>kernel-url-arg2</short-id>
+    <name>Kernel URL Arg 2</name>
+    <version>unknown</version>
+    <vendor>libosinfo.org</vendor>
+    <family>test</family>
+    <release-status>prerelease</release-status>
+    <derives-from id="http://libosinfo.org/test/os/kernel-url-arg1"/>
+  </os>
+</libosinfo>
diff --git a/tests/dbdata/os/libosinfo.org/test-os-kernel-url-arg3.xml b/tests/dbdata/os/libosinfo.org/test-os-kernel-url-arg3.xml
new file mode 100644
index 0000000..932eb77
--- /dev/null
+++ b/tests/dbdata/os/libosinfo.org/test-os-kernel-url-arg3.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<libosinfo version="0.0.1">
+  <os id="http://libosinfo.org/test/os/kernel-url-arg3">
+    <short-id>kernel-url-arg3</short-id>
+    <name>Kernel URL Arg 3</name>
+    <version>unknown</version>
+    <vendor>libosinfo.org</vendor>
+    <family>test</family>
+    <release-status>prerelease</release-status>
+    <derives-from id="http://libosinfo.org/test/os/kernel-url-arg2"/>
+
+    <kernel-url-argument>new.install</kernel-url-argument>
+  </os>
+</libosinfo>
diff --git a/tests/test-os.c b/tests/test-os.c
index fe7c2d6..84d838e 100644
--- a/tests/test-os.c
+++ b/tests/test-os.c
@@ -651,6 +651,41 @@ test_multiple_short_ids(void)
     g_object_unref(db);
 }
 
+static void
+test_kernel_url_arg(void)
+{
+    OsinfoLoader *loader;
+    OsinfoDb *db;
+    OsinfoOs *os;
+    GError *error = NULL;
+    const char *str;
+
+    loader = osinfo_loader_new();
+    osinfo_loader_process_path(loader, SRCDIR "/tests/dbdata", &error);
+    g_assert_no_error(error);
+    db = osinfo_loader_get_db(loader);
+
+    g_debug("Testing http://libosinfo.org/test/os/kernel-url-arg1\n");
+    os = osinfo_db_get_os(db, "http://libosinfo.org/test/os/kernel-url-arg1");
+    g_assert_nonnull(os);
+    str = osinfo_os_get_kernel_url_argument(os);
+    g_assert_cmpstr(str, ==, "install");
+
+    g_debug("Testing http://libosinfo.org/test/os/kernel-url-arg2\n");
+    os = osinfo_db_get_os(db, "http://libosinfo.org/test/os/kernel-url-arg2");
+    g_assert_nonnull(os);
+    str = osinfo_os_get_kernel_url_argument(os);
+    g_assert_cmpstr(str, ==, "install");
+
+    g_debug("Testing http://libosinfo.org/test/os/kernel-url-arg3\n");
+    os = osinfo_db_get_os(db, "http://libosinfo.org/test/os/kernel-url-arg3");
+    g_assert_nonnull(os);
+    str = osinfo_os_get_kernel_url_argument(os);
+    g_assert_cmpstr(str, ==, "new.install");
+
+    g_object_unref(loader);
+}
+
 int
 main(int argc, char *argv[])
 {
@@ -670,6 +705,7 @@ main(int argc, char *argv[])
     g_test_add_func("/os/resources/inheritance", test_resources_inheritance);
     g_test_add_func("/os/find_install_script", test_find_install_script);
     g_test_add_func("/os/mulitple_short_ids", test_multiple_short_ids);
+    g_test_add_func("/os/kernel_url_arg", test_kernel_url_arg);
 
     /* Upfront so we don't confuse valgrind */
     osinfo_platform_get_type();
-- 
2.21.0




More information about the Libosinfo mailing list