| From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 |
| From: "Eduardo Lima (Etrunko)" <etrunko@redhat.com> |
| Date: Thu, 13 Jul 2017 18:02:49 -0300 |
| Subject: [PATCH] vm: Introduce ovirt_vm_get_host() |
| |
| With initial support for hosts implemented, this new function can be |
| used to retrieve the host the virtual machine belongs to. |
| |
| Signed-off-by: Eduardo Lima (Etrunko) <etrunko@redhat.com> |
| |
| govirt/govirt.sym | 2 ++ |
| govirt/ovirt-vm.c | 92 ++++++++++++++++++++++++++++++++++++++++++++++- |
| govirt/ovirt-vm.h | 1 + |
| 3 files changed, 94 insertions(+), 1 deletion(-) |
| |
| diff --git a/govirt/govirt.sym b/govirt/govirt.sym |
| index b22af76..039c88b 100644 |
| |
| |
| @@ -133,6 +133,8 @@ GOVIRT_0.3.2 { |
| ovirt_host_get_type; |
| ovirt_host_get_vms; |
| ovirt_host_new; |
| + |
| + ovirt_vm_get_host; |
| } GOVIRT_0.3.1; |
| |
| GOVIRT_0.3.4 { |
| diff --git a/govirt/ovirt-vm.c b/govirt/ovirt-vm.c |
| index 806b5f3..6016c77 100644 |
| |
| |
| @@ -42,6 +42,8 @@ struct _OvirtVmPrivate { |
| |
| OvirtVmState state; |
| OvirtVmDisplay *display; |
| + gchar *host_href; |
| + gchar *host_id; |
| } ; |
| G_DEFINE_TYPE(OvirtVm, ovirt_vm, OVIRT_TYPE_RESOURCE); |
| |
| @@ -56,9 +58,28 @@ enum OvirtResponseStatus { |
| enum { |
| PROP_0, |
| PROP_STATE, |
| - PROP_DISPLAY |
| + PROP_DISPLAY, |
| + PROP_HOST_HREF, |
| + PROP_HOST_ID, |
| }; |
| |
| +static char *ensure_href_from_id(const char *id, |
| + const char *path) |
| +{ |
| + if (id == NULL) |
| + return NULL; |
| + |
| + return g_strdup_printf("%s/%s", path, id); |
| +} |
| + |
| +static const char *get_host_href(OvirtVm *vm) |
| +{ |
| + if (vm->priv->host_href == NULL) |
| + vm->priv->host_href = ensure_href_from_id(vm->priv->host_id, "/ovirt-engine/api/hosts"); |
| + |
| + return vm->priv->host_href; |
| +} |
| + |
| static void ovirt_vm_get_property(GObject *object, |
| guint prop_id, |
| GValue *value, |
| @@ -73,6 +94,12 @@ static void ovirt_vm_get_property(GObject *object, |
| case PROP_DISPLAY: |
| g_value_set_object(value, vm->priv->display); |
| break; |
| + case PROP_HOST_HREF: |
| + g_value_set_string(value, get_host_href(vm)); |
| + break; |
| + case PROP_HOST_ID: |
| + g_value_set_string(value, vm->priv->host_id); |
| + break; |
| default: |
| G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); |
| } |
| @@ -94,6 +121,14 @@ static void ovirt_vm_set_property(GObject *object, |
| g_object_unref(vm->priv->display); |
| vm->priv->display = g_value_dup_object(value); |
| break; |
| + case PROP_HOST_HREF: |
| + g_free(vm->priv->host_href); |
| + vm->priv->host_href = g_value_dup_string(value); |
| + break; |
| + case PROP_HOST_ID: |
| + g_free(vm->priv->host_id); |
| + vm->priv->host_id = g_value_dup_string(value); |
| + break; |
| default: |
| G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); |
| } |
| @@ -106,6 +141,8 @@ static void ovirt_vm_dispose(GObject *object) |
| |
| g_clear_object(&vm->priv->cdroms); |
| g_clear_object(&vm->priv->display); |
| + g_clear_pointer(&vm->priv->host_href, g_free); |
| + g_clear_pointer(&vm->priv->host_id, g_free); |
| |
| G_OBJECT_CLASS(ovirt_vm_parent_class)->dispose(object); |
| } |
| @@ -117,11 +154,28 @@ static gboolean ovirt_vm_init_from_xml(OvirtResource *resource, |
| { |
| gboolean parsed_ok; |
| OvirtResourceClass *parent_class; |
| + OvirtXmlElement vm_elements[] = { |
| + { .prop_name = "host-href", |
| + .type = G_TYPE_STRING, |
| + .xml_path = "host", |
| + .xml_attr = "href", |
| + }, |
| + { .prop_name = "host-id", |
| + .type = G_TYPE_STRING, |
| + .xml_path = "host", |
| + .xml_attr = "id", |
| + }, |
| + { NULL, }, |
| + }; |
| |
| parsed_ok = ovirt_vm_refresh_from_xml(OVIRT_VM(resource), node); |
| if (!parsed_ok) { |
| return FALSE; |
| } |
| + |
| + if (!ovirt_rest_xml_node_parse(node, G_OBJECT(resource), vm_elements)) |
| + return FALSE; |
| + |
| parent_class = OVIRT_RESOURCE_CLASS(ovirt_vm_parent_class); |
| |
| return parent_class->init_from_xml(resource, node, error); |
| @@ -156,6 +210,22 @@ static void ovirt_vm_class_init(OvirtVmClass *klass) |
| OVIRT_TYPE_VM_DISPLAY, |
| G_PARAM_READWRITE | |
| G_PARAM_STATIC_STRINGS)); |
| + g_object_class_install_property(object_class, |
| + PROP_HOST_HREF, |
| + g_param_spec_string("host-href", |
| + "Host href", |
| + "Host href for the Virtual Machine", |
| + NULL, |
| + G_PARAM_READWRITE | |
| + G_PARAM_STATIC_STRINGS)); |
| + g_object_class_install_property(object_class, |
| + PROP_HOST_ID, |
| + g_param_spec_string("host-id", |
| + "Host Id", |
| + "Host Id for the Virtual Machine", |
| + NULL, |
| + G_PARAM_READWRITE | |
| + G_PARAM_STATIC_STRINGS)); |
| } |
| |
| static void ovirt_vm_init(G_GNUC_UNUSED OvirtVm *vm) |
| @@ -342,3 +412,23 @@ OvirtCollection *ovirt_vm_get_cdroms(OvirtVm *vm) |
| |
| return vm->priv->cdroms; |
| } |
| + |
| + |
| +/** |
| + * ovirt_vm_get_host: |
| + * @vm: a #OvirtVm |
| + * |
| + * Gets a #OvirtHost representing the host the virtual machine belongs to. |
| + * This method does not initiate any network activity, the remote host must be |
| + * then be fetched using ovirt_resource_refresh() or |
| + * ovirt_resource_refresh_async(). |
| + * |
| + * Return value: (transfer full): a #OvirtHost representing host the @vm |
| + * belongs to. |
| + */ |
| +OvirtHost *ovirt_vm_get_host(OvirtVm *vm) |
| +{ |
| + g_return_val_if_fail(OVIRT_IS_VM(vm), NULL); |
| + g_return_val_if_fail(vm->priv->host_id != NULL, NULL); |
| + return ovirt_host_new_from_id(vm->priv->host_id, get_host_href(vm)); |
| +} |
| diff --git a/govirt/ovirt-vm.h b/govirt/ovirt-vm.h |
| index 1e6c7ad..e230ebb 100644 |
| |
| |
| @@ -120,6 +120,7 @@ gboolean ovirt_vm_refresh_finish(OvirtVm *vm, |
| GError **err); |
| |
| OvirtCollection *ovirt_vm_get_cdroms(OvirtVm *vm); |
| +OvirtHost *ovirt_vm_get_host(OvirtVm *vm); |
| |
| G_END_DECLS |
| |