summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--govirt/govirt.sym1
-rw-r--r--govirt/ovirt-vm.c74
-rw-r--r--govirt/ovirt-vm.h1
3 files changed, 76 insertions, 0 deletions
diff --git a/govirt/govirt.sym b/govirt/govirt.sym
index 58a4f8d..66f334a 100644
--- a/govirt/govirt.sym
+++ b/govirt/govirt.sym
@@ -137,5 +137,6 @@ GOVIRT_0.4.0 {
ovirt_host_new;
ovirt_vm_get_host;
+ ovirt_vm_get_cluster;
} GOVIRT_0.3.4;
# .... define new API here using predicted next version number ....
diff --git a/govirt/ovirt-vm.c b/govirt/ovirt-vm.c
index 6016c77..70b6f3a 100644
--- a/govirt/ovirt-vm.c
+++ b/govirt/ovirt-vm.c
@@ -44,6 +44,8 @@ struct _OvirtVmPrivate {
OvirtVmDisplay *display;
gchar *host_href;
gchar *host_id;
+ gchar *cluster_href;
+ gchar *cluster_id;
} ;
G_DEFINE_TYPE(OvirtVm, ovirt_vm, OVIRT_TYPE_RESOURCE);
@@ -61,6 +63,8 @@ enum {
PROP_DISPLAY,
PROP_HOST_HREF,
PROP_HOST_ID,
+ PROP_CLUSTER_HREF,
+ PROP_CLUSTER_ID,
};
static char *ensure_href_from_id(const char *id,
@@ -80,6 +84,14 @@ static const char *get_host_href(OvirtVm *vm)
return vm->priv->host_href;
}
+static const char *get_cluster_href(OvirtVm *vm)
+{
+ if (vm->priv->cluster_href == NULL)
+ vm->priv->cluster_href = ensure_href_from_id(vm->priv->cluster_id, "/ovirt-engine/api/clusters");
+
+ return vm->priv->cluster_href;
+}
+
static void ovirt_vm_get_property(GObject *object,
guint prop_id,
GValue *value,
@@ -100,6 +112,12 @@ static void ovirt_vm_get_property(GObject *object,
case PROP_HOST_ID:
g_value_set_string(value, vm->priv->host_id);
break;
+ case PROP_CLUSTER_HREF:
+ g_value_set_string(value, get_cluster_href(vm));
+ break;
+ case PROP_CLUSTER_ID:
+ g_value_set_string(value, vm->priv->cluster_id);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
}
@@ -129,6 +147,14 @@ static void ovirt_vm_set_property(GObject *object,
g_free(vm->priv->host_id);
vm->priv->host_id = g_value_dup_string(value);
break;
+ case PROP_CLUSTER_HREF:
+ g_free(vm->priv->cluster_href);
+ vm->priv->cluster_href = g_value_dup_string(value);
+ break;
+ case PROP_CLUSTER_ID:
+ g_free(vm->priv->cluster_id);
+ vm->priv->cluster_id = g_value_dup_string(value);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
}
@@ -143,6 +169,8 @@ static void ovirt_vm_dispose(GObject *object)
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_clear_pointer(&vm->priv->cluster_href, g_free);
+ g_clear_pointer(&vm->priv->cluster_id, g_free);
G_OBJECT_CLASS(ovirt_vm_parent_class)->dispose(object);
}
@@ -165,6 +193,16 @@ static gboolean ovirt_vm_init_from_xml(OvirtResource *resource,
.xml_path = "host",
.xml_attr = "id",
},
+ { .prop_name = "cluster-href",
+ .type = G_TYPE_STRING,
+ .xml_path = "cluster",
+ .xml_attr = "href",
+ },
+ { .prop_name = "cluster-id",
+ .type = G_TYPE_STRING,
+ .xml_path = "cluster",
+ .xml_attr = "id",
+ },
{ NULL, },
};
@@ -226,6 +264,22 @@ static void ovirt_vm_class_init(OvirtVmClass *klass)
NULL,
G_PARAM_READWRITE |
G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property(object_class,
+ PROP_CLUSTER_HREF,
+ g_param_spec_string("cluster-href",
+ "Cluster href",
+ "Cluster href for the Virtual Machine",
+ NULL,
+ G_PARAM_READWRITE |
+ G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property(object_class,
+ PROP_CLUSTER_ID,
+ g_param_spec_string("cluster-id",
+ "Cluster Id",
+ "Cluster Id for the Virtual Machine",
+ NULL,
+ G_PARAM_READWRITE |
+ G_PARAM_STATIC_STRINGS));
}
static void ovirt_vm_init(G_GNUC_UNUSED OvirtVm *vm)
@@ -432,3 +486,23 @@ OvirtHost *ovirt_vm_get_host(OvirtVm *vm)
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));
}
+
+
+/**
+ * ovirt_vm_get_cluster:
+ * @vm: a #OvirtVm
+ *
+ * Gets a #OvirtCluster representing the cluster 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 #OvirtCluster representing cluster the @vm
+ * belongs to.
+ */
+OvirtCluster *ovirt_vm_get_cluster(OvirtVm *vm)
+{
+ g_return_val_if_fail(OVIRT_IS_VM(vm), NULL);
+ g_return_val_if_fail(vm->priv->cluster_id != NULL, NULL);
+ return ovirt_cluster_new_from_id(vm->priv->cluster_id, get_cluster_href(vm));
+}
diff --git a/govirt/ovirt-vm.h b/govirt/ovirt-vm.h
index e230ebb..bef4289 100644
--- a/govirt/ovirt-vm.h
+++ b/govirt/ovirt-vm.h
@@ -121,6 +121,7 @@ gboolean ovirt_vm_refresh_finish(OvirtVm *vm,
OvirtCollection *ovirt_vm_get_cdroms(OvirtVm *vm);
OvirtHost *ovirt_vm_get_host(OvirtVm *vm);
+OvirtCluster *ovirt_vm_get_cluster(OvirtVm *vm);
G_END_DECLS