# HG changeset patch
# User Heidi Eckhart <heidieck(a)linux.vnet.ibm.com>
# Date 1204541457 -3600
# Node ID 7a93b0ab4de3663e75f43176cce67b70e2064fd7
# Parent 27e78288c82426835126eaa07dba1e425c756f3f
ComputerSystem: enhance enum functionality for use in assocs
Signed-off-by: Heidi Eckhart <heidieck(a)linux.vnet.ibm.com>
diff -r 27e78288c824 -r 7a93b0ab4de3 src/Virt_ComputerSystem.c
--- a/src/Virt_ComputerSystem.c Mon Mar 03 11:34:52 2008 +0100
+++ b/src/Virt_ComputerSystem.c Mon Mar 03 11:50:57 2008 +0100
@@ -302,184 +302,168 @@ static int set_other_id_info(const CMPIB
}
/* Populate an instance with information from a domain */
-static int instance_from_dom(const CMPIBroker *broker,
- virDomainPtr dom,
- const char *prefix,
- CMPIInstance *instance)
-{
+static CMPIStatus set_properties(const CMPIBroker *broker,
+ virDomainPtr dom,
+ const char *prefix,
+ CMPIInstance *instance)
+{
+ CMPIStatus s = {CMPI_RC_ERR_FAILED, NULL};
char *uuid = NULL;
- int ret = 1;
if (!set_name_from_dom(dom, instance)) {
/* Print trace error */
- return 0;
+ goto out;
}
if (!set_uuid_from_dom(dom, instance, &uuid)) {
/* Print trace error */
- ret = 0;
goto out;
}
if (!set_capdesc_from_dom(dom, instance)) {
/* Print trace error */
- ret = 0;
goto out;
}
if (!set_state_from_dom(broker, dom, instance)) {
/* Print trace error */
- ret = 0;
goto out;
}
if (!set_creation_class(instance)) {
/* Print trace error */
- ret = 0;
goto out;
}
if (!set_other_id_info(broker, uuid, prefix, instance)) {
/* Print trace error */
- ret = 0;
goto out;
}
/* More attributes here, of course */
+ cu_statusf(broker, &s,
+ CMPI_RC_OK,
+ "");
+
out:
free(uuid);
- return ret;
-}
-
-/* Given a hypervisor connection and a domain name, return an instance */
-CMPIInstance *instance_from_name(const CMPIBroker *broker,
- virConnectPtr conn,
- const char *name,
- const CMPIObjectPath *op)
-{
- virDomainPtr dom;
- CMPIInstance *instance;
-
- dom = virDomainLookupByName(conn, name);
- if (dom == NULL)
- return NULL;
-
- instance = get_typed_instance(broker,
- pfx_from_conn(conn),
- "ComputerSystem",
- NAMESPACE(op));
- if (instance == NULL)
- goto out;
-
- if (!instance_from_dom(broker,
- dom,
- pfx_from_conn(conn),
- instance))
- instance = NULL;
-
- out:
- virDomainFree(dom);
-
- return instance;
-}
-
-/* Enumerate domains on the given connection, return results */
-int enum_domains(const CMPIBroker *broker,
- virConnectPtr conn,
- const char *ns,
- struct inst_list *instlist)
-{
+ return s;
+}
+
+static CMPIStatus instance_from_dom(const CMPIBroker *broker,
+ const CMPIObjectPath *reference,
+ virConnectPtr conn,
+ virDomainPtr domain,
+ CMPIInstance **_inst)
+{
+ CMPIStatus s = {CMPI_RC_OK, NULL};
+ CMPIInstance *inst = NULL;
+
+ inst = get_typed_instance(broker,
+ pfx_from_conn(conn),
+ "ComputerSystem",
+ NAMESPACE(reference));
+ if (inst == NULL) {
+ cu_statusf(broker, &s,
+ CMPI_RC_ERR_FAILED,
+ "Unable to init ComputerSystem instance");
+ goto out;
+ }
+
+ s = set_properties(broker,
+ domain,
+ pfx_from_conn(conn),
+ inst);
+ if (s.rc != CMPI_RC_OK)
+ goto out;
+
+ *_inst = inst;
+
+ out:
+ return s;
+}
+
+CMPIStatus enum_domains(const CMPIBroker *broker,
+ const CMPIObjectPath *reference,
+ struct inst_list *instlist)
+{
+ CMPIStatus s = {CMPI_RC_OK, NULL};
virDomainPtr *list = NULL;
+ virConnectPtr conn = NULL;
int count;
int i;
+ conn = connect_by_classname(broker, CLASSNAME(reference), &s);
+ if (conn == NULL)
+ goto out;
+
count = get_domain_list(conn, &list);
- if (count <= 0)
- goto out;
+ if (count <= 0) {
+ cu_statusf(broker, &s,
+ CMPI_RC_ERR_FAILED,
+ "Failed to get domain list");
+ goto out;
+ }
for (i = 0; i < count; i++) {
- CMPIInstance *inst;
-
- inst = get_typed_instance(broker,
- pfx_from_conn(conn),
- "ComputerSystem",
- ns);
- if (inst == NULL)
+ CMPIInstance *inst = NULL;
+
+ s = instance_from_dom(broker,
+ reference,
+ conn,
+ list[i],
+ &inst);
+ if (s.rc != CMPI_RC_OK)
goto end;
- if (instance_from_dom(broker,
- list[i],
- pfx_from_conn(conn),
- inst))
- inst_list_add(instlist, inst);
-
- end:
+ inst_list_add(instlist, inst);
+
+ end:
virDomainFree(list[i]);
}
- out:
+
+ out:
+ virConnectClose(conn);
free(list);
- return 1;
+ return s;
}
static CMPIStatus return_enum_domains(const CMPIObjectPath *reference,
const CMPIResult *results,
- int names_only)
+ bool names_only)
{
struct inst_list list;
- CMPIStatus s;
- virConnectPtr conn = NULL;
- int ret;
-
- conn = connect_by_classname(_BROKER, CLASSNAME(reference), &s);
- if (conn == NULL)
- return s;
+ CMPIStatus s = {CMPI_RC_OK, NULL};
inst_list_init(&list);
- ret = enum_domains(_BROKER, conn, NAMESPACE(reference), &list);
- if (!ret) {
- cu_statusf(_BROKER, &s,
- CMPI_RC_ERR_FAILED,
- "Failed to get domain list");
- goto out;
- }
+
+ s = enum_domains(_BROKER, reference, &list);
+ if (s.rc != CMPI_RC_OK)
+ goto out;
if (names_only)
cu_return_instance_names(results, &list);
else
cu_return_instances(results, &list);
- cu_statusf(_BROKER, &s,
- CMPI_RC_OK,
- "");
out:
inst_list_free(&list);
- virConnectClose(conn);
-
- return s;
-}
-
-CMPIStatus get_domain(const CMPIBroker *broker,
- const CMPIObjectPath *reference,
- CMPIInstance **inst)
-{
- CMPIInstance *_inst;
+ return s;
+}
+
+CMPIStatus get_domain_by_name(const CMPIBroker *broker,
+ const CMPIObjectPath *reference,
+ const char *name,
+ CMPIInstance **_inst)
+{
+ CMPIInstance *inst = NULL;
CMPIStatus s = {CMPI_RC_OK, NULL};
virConnectPtr conn = NULL;
- const char *name;
-
- if (!provider_is_responsible(broker, reference, &s))
- return s;
-
- if (cu_get_str_path(reference, "Name", &name) != CMPI_RC_OK) {
- cu_statusf(broker, &s,
- CMPI_RC_ERR_FAILED,
- "No domain name specified");
- return s;
- }
+ virDomainPtr dom;
conn = connect_by_classname(broker, CLASSNAME(reference), &s);
if (conn == NULL) {
@@ -489,35 +473,59 @@ CMPIStatus get_domain(const CMPIBroker *
return s;
}
- _inst = instance_from_name(broker, conn, name, reference);
- if (_inst == NULL) {
+ dom = virDomainLookupByName(conn, name);
+ if (dom == NULL) {
cu_statusf(broker, &s,
CMPI_RC_ERR_NOT_FOUND,
- "No such instance (%s)", name);
- goto out;
- }
-
- s = cu_validate_ref(broker, reference, _inst);
-
- out:
+ "No such instance (%s).",
+ name);
+ goto out;
+ }
+
+ s = instance_from_dom(broker,
+ reference,
+ conn,
+ dom,
+ &inst);
+ if (s.rc != CMPI_RC_OK)
+ goto out;
+
+ *_inst = inst;
+
+ out:
+ virDomainFree(dom);
virConnectClose(conn);
- *inst = _inst;
-
- return s;
-}
-
-static CMPIStatus return_domain(const CMPIObjectPath *reference,
- const CMPIResult *results)
-{
- CMPIStatus s = {CMPI_RC_OK, NULL};
- CMPIInstance *inst;
-
- s = get_domain(_BROKER, reference, &inst);
+
+ return s;
+}
+
+CMPIStatus get_domain_by_ref(const CMPIBroker *broker,
+ const CMPIObjectPath *reference,
+ CMPIInstance **_inst)
+{
+ CMPIStatus s = {CMPI_RC_OK, NULL};
+ CMPIInstance *inst = NULL;
+ const char *name = NULL;
+
+ if (cu_get_str_path(reference, "Name", &name) != CMPI_RC_OK) {
+ cu_statusf(broker, &s,
+ CMPI_RC_ERR_FAILED,
+ "No domain name specified");
+ goto out;
+ }
+
+ s = get_domain_by_name(broker, reference, name, &inst);
if (s.rc != CMPI_RC_OK)
- return s;
-
- CMReturnInstance(results, inst);
-
+ goto out;
+
+ s = cu_validate_ref(broker, reference, inst);
+ if (s.rc != CMPI_RC_OK)
+ goto out;
+
+ *_inst = inst;
+
+ out:
+
return s;
}
@@ -526,7 +534,7 @@ static CMPIStatus EnumInstanceNames(CMPI
const CMPIResult *results,
const CMPIObjectPath *reference)
{
- return return_enum_domains(reference, results, 1);
+ return return_enum_domains(reference, results, true);
}
static CMPIStatus EnumInstances(CMPIInstanceMI *self,
@@ -536,7 +544,7 @@ static CMPIStatus EnumInstances(CMPIInst
const char **properties)
{
- return return_enum_domains(reference, results, 0);
+ return return_enum_domains(reference, results, false);
}
static CMPIStatus GetInstance(CMPIInstanceMI *self,
@@ -545,7 +553,17 @@ static CMPIStatus GetInstance(CMPIInstan
const CMPIObjectPath *reference,
const char **properties)
{
- return return_domain(reference, results);
+ CMPIStatus s = {CMPI_RC_OK, NULL};
+ CMPIInstance *inst;
+
+ s = get_domain_by_ref(_BROKER, reference, &inst);
+ if (s.rc != CMPI_RC_OK)
+ goto out;
+
+ CMReturnInstance(results, inst);
+
+ out:
+ return s;
}
DEFAULT_CI();
diff -r 27e78288c824 -r 7a93b0ab4de3 src/Virt_ComputerSystem.h
--- a/src/Virt_ComputerSystem.h Mon Mar 03 11:34:52 2008 +0100
+++ b/src/Virt_ComputerSystem.h Mon Mar 03 11:50:57 2008 +0100
@@ -24,33 +24,16 @@
#include "misc_util.h"
/**
- * Return an instance of a Virt_ComputerSystem, based on a name
- *
- * @param broker A pointer to the current broker
- * @param conn The libvirt connection to use
- * @param name The name of the desired domain instance
- * @param ns The namespace to use
- * @returns The instance or NULL on failure
- */
-CMPIInstance *instance_from_name(const CMPIBroker *broker,
- virConnectPtr conn,
- const char *name,
- const CMPIObjectPath *ns);
-
-
-/**
* Get a list of domain instances
*
* @param broker A pointer to the current broker
- * @param conn The libvirt connection to use
- * @param op The namespace to use
+ * @param reference The object path containing namespace and prefix info
* @param instlist A pointer to an initialized inst_list to populate
- * @returns nonzero on success
+ * @returns CMPIStatus
*/
-int enum_domains(const CMPIBroker *broker,
- virConnectPtr conn,
- const char *ns,
- struct inst_list *instlist);
+CMPIStatus enum_domains(const CMPIBroker *broker,
+ const CMPIObjectPath *reference,
+ struct inst_list *instlist);
/**
* Get domain instance specified by the client given domain
@@ -58,13 +41,26 @@ int enum_domains(const CMPIBroker *broke
*
* @param broker A pointer to the current broker
* @param ref The client given object path
- * @param inst In case of success the pointer to the instance
+ * @param _inst In case of success the pointer to the instance
* @returns CMPIStatus
*/
-CMPIStatus get_domain(const CMPIBroker *broker,
- const CMPIObjectPath *reference,
- CMPIInstance **inst);
+CMPIStatus get_domain_by_ref(const CMPIBroker *broker,
+ const CMPIObjectPath *reference,
+ CMPIInstance **_inst);
+/**
+ * Get domain instance specified by the domain name
+ *
+ * @param broker A pointer to the current broker
+ * @param ref The object path containing namespace and prefix info
+ * @param name The domain name
+ * @param _inst In case of success the pointer to the instance
+ * @returns CMPIStatus
+ */
+CMPIStatus get_domain_by_name(const CMPIBroker *broker,
+ const CMPIObjectPath *reference,
+ const char *name,
+ CMPIInstance **_inst);
#endif