[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-cim] Combined patch for Xen_HostedComputerSystem association



Attached is a combined patch that supports cross-namespace association for Xen_HostedComputerSystem. It includes Raj's filtering and my hacks for smash integration. Xen_ComputerSystem was also modified to only instrument root/cimv2. E.g. calling EnumInstanceNames on Xen_CS in namespace smash will return 0 instances.

To use this patch, Xen_HCS and Xen_CS mof files must be imported to 'smash' namespace as well as root/cimv2. I have tested the patch quite thoroughly and ensured the correct namespace is set in object paths returned by provider.

So what do you think? If this approach is acceptable, I will convert all effected associations (and their endpoints if appropriate) to use this mechanism.

Jim
diff -r 8e52de626fb5 src/Xen_ComputerSystem.c
--- a/src/Xen_ComputerSystem.c  Tue Jun 27 17:39:16 2006 -0600
+++ b/src/Xen_ComputerSystem.c  Fri Jul 14 17:19:52 2006 -0600
@@ -25,6 +25,7 @@
 #include "cmpift.h"
 #include "cmpimacs.h"
 
+#define HOST_INSTRUMENTATION_NS "smash"
 
 // ----------------------------------------------------------------------------
 // COMMON GLOBAL VARIABLES
@@ -90,7 +91,7 @@ static CMPIStatus EnumInstanceNames(
                CMPIObjectPath * reference)     /* [in] Contains target 
namespace and classname. */
 {
    CMPIStatus status = {CMPI_RC_OK, NULL};     /* Return status of CIM 
operations. */
-   _RESOURCES * resources;                     /* Handle to the list of system 
resources. */
+   _RESOURCES * resources = NULL;                      /* Handle to the list 
of system resources. */
    _RESOURCE * resource;                       /* Handle to each system 
resource. */
    char * namespace = CMGetCharPtr(CMGetNameSpace(reference, NULL)); /* Target 
namespace. */
    int found = 0;                              /* Found any instances? */
@@ -100,6 +101,11 @@ static CMPIStatus EnumInstanceNames(
    _SBLIM_TRACE(2, ("--- context=\"%s\"", CMGetCharPtr(CDToString(_BROKER, 
context, NULL))));
    _SBLIM_TRACE(2, ("--- reference=\"%s\"", CMGetCharPtr(CDToString(_BROKER, 
reference, NULL))));
    _SBLIM_TRACE(2, ("--- namespace=\"%s\"", namespace));
+
+   if (strcmp(namespace, HOST_INSTRUMENTATION_NS) == 0) {
+      _SBLIM_TRACE(1,("--- \"%s\" is not a valid namespace for System 
Virtualization Profile", namespace));
+      goto exit;
+   }
 
    /* Get a handle to the list of system resources. */
    if (!Xen_ComputerSystem_getResources(&resources)) {
@@ -147,9 +153,10 @@ static CMPIStatus EnumInstanceNames(
    }
 
    _SBLIM_TRACE(2,("--- %d object paths found", found));
+
+exit:
    CMReturnDone(results);
 
-exit:
    /* Free the list of system resources. */
    if (!Xen_ComputerSystem_freeResources(resources)) {
       _SBLIM_TRACE(1,("--- _freeResources() failed"));
@@ -171,7 +178,7 @@ static CMPIStatus EnumInstances(
                const char ** properties)       /* [in] List of desired 
properties (NULL=all). */
 {
    CMPIStatus status = {CMPI_RC_OK, NULL};     /* Return status of CIM 
operations. */
-   _RESOURCES * resources;                     /* Handle to the list of system 
resources. */
+   _RESOURCES * resources = NULL;                      /* Handle to the list 
of system resources. */
    _RESOURCE * resource;                       /* Handle to each system 
resource. */
    char * namespace = CMGetCharPtr(CMGetNameSpace(reference, NULL)); /* Target 
namespace. */
    int found = 0;                              /* Found any resource 
instances? */
@@ -181,6 +188,11 @@ static CMPIStatus EnumInstances(
    _SBLIM_TRACE(2, ("--- context=\"%s\"", CMGetCharPtr(CDToString(_BROKER, 
context, NULL))));
    _SBLIM_TRACE(2, ("--- reference=\"%s\"", CMGetCharPtr(CDToString(_BROKER, 
reference, NULL))));
    _SBLIM_TRACE(2, ("--- namespace=\"%s\"", namespace));
+
+   if (strcmp(namespace, HOST_INSTRUMENTATION_NS) == 0) {
+      _SBLIM_TRACE(2,("--- \"%s\" is not a valid namespace for System 
Virtualization Profile", namespace));
+      goto exit;
+   }
 
    /* Get a handle to the list of system resources. */
    if (!Xen_ComputerSystem_getResources(&resources)) {
@@ -228,9 +240,10 @@ static CMPIStatus EnumInstances(
    }
 
    _SBLIM_TRACE(2,("--- %d instances found", found));
+
+exit:
    CMReturnDone(results);
 
-exit:
    /* Free the list of system resources. */
    if (!Xen_ComputerSystem_freeResources(resources)) {
       _SBLIM_TRACE(1,("--- _freeResources() failed"));
@@ -252,7 +265,7 @@ static CMPIStatus GetInstance(
                const char ** properties)               /* [in] List of desired 
properties (NULL=all). */
 {
    CMPIStatus status = {CMPI_RC_OK, NULL};     /* Return status of CIM 
operations. */
-   _RESOURCES * resources;                     /* Handle to the list of system 
resources. */
+   _RESOURCES * resources = NULL;                      /* Handle to the list 
of system resources. */
    _RESOURCE * resource;                       /* Handle to the system 
resource. */
    char * namespace = CMGetCharPtr(CMGetNameSpace(reference, NULL)); /* Target 
namespace. */
    int found = 0;                              /* Found the target instance? */
@@ -262,6 +275,11 @@ static CMPIStatus GetInstance(
    _SBLIM_TRACE(2, ("--- context=\"%s\"", CMGetCharPtr(CDToString(_BROKER, 
context, NULL))));
    _SBLIM_TRACE(2, ("--- reference=\"%s\"", CMGetCharPtr(CDToString(_BROKER, 
reference, NULL))));
    _SBLIM_TRACE(2, ("--- namespace=\"%s\"", namespace));
+
+   if (strcmp(namespace, HOST_INSTRUMENTATION_NS) == 0) {
+      _SBLIM_TRACE(2,("--- \"%s\" is not a valid namespace for System 
Virtualization Profile", namespace));
+      goto exit;
+   }
 
    /* Get a handle to the list of system resources. */
    if (!Xen_ComputerSystem_getResources(&resources)) {
@@ -313,9 +331,10 @@ static CMPIStatus GetInstance(
    CMReturnInstance(results, instance);
 
    _SBLIM_TRACE(2,("--- instance found"));
+
+exit:
    CMReturnDone(results);
 
-exit:
    /* Free the list of system resources. */
    if (!Xen_ComputerSystem_freeResources(resources)) {
       _SBLIM_TRACE(1,("--- _freeResources() failed"));
@@ -337,7 +356,7 @@ static CMPIStatus SetInstance(
                CMPIInstance * newinstance)     /* [in] Contains the new 
instance data. */
 {
    CMPIStatus status = {CMPI_RC_OK, NULL};     /* Return status of CIM 
operations. */
-   _RESOURCES * resources;                     /* Handle to the list of system 
resources. */
+   _RESOURCES * resources = NULL;                      /* Handle to the list 
of system resources. */
    _RESOURCE * resource;                       /* Handle to the system 
resource. */
    char * namespace = CMGetCharPtr(CMGetNameSpace(reference, NULL)); /* Target 
namespace. */
    int found = 0;                              /* Found the target instance? */
@@ -349,6 +368,11 @@ static CMPIStatus SetInstance(
    _SBLIM_TRACE(2, ("--- newinstance=\"%s\"", CMGetCharPtr(CDToString(_BROKER, 
newinstance, NULL))));
    _SBLIM_TRACE(2, ("--- namespace=\"%s\"", namespace));
 
+   if (strcmp(namespace, HOST_INSTRUMENTATION_NS) == 0) {
+      _SBLIM_TRACE(2,("--- \"%s\" is not a valid namespace for System 
Virtualization Profile", namespace));
+      goto exit;
+   }
+ 
    /* Get a handle to the list of system resources. */
    if (!Xen_ComputerSystem_getResources(&resources)) {
       _SBLIM_TRACE(1,("--- _getResources() failed"));
@@ -409,7 +433,7 @@ static CMPIStatus CreateInstance(
                CMPIInstance * newinstance)     /* [in] Contains the new 
instance data. */
 {
    CMPIStatus status = {CMPI_RC_OK, NULL};     /* Return status of CIM 
operations. */
-   _RESOURCES * resources;                     /* Handle to the list of system 
resources. */
+   _RESOURCES * resources = NULL;                      /* Handle to the list 
of system resources. */
    _RESOURCE * resource;                       /* Handle to the system 
resource. */
    char * namespace = CMGetCharPtr(CMGetNameSpace(reference, NULL)); /* Target 
namespace. */
    int found = 0;                              /* Found the target instance? */
@@ -420,6 +444,11 @@ static CMPIStatus CreateInstance(
    _SBLIM_TRACE(2, ("--- reference=\"%s\"", CMGetCharPtr(CDToString(_BROKER, 
reference, NULL))));
    _SBLIM_TRACE(2, ("--- newinstance=\"%s\"", CMGetCharPtr(CDToString(_BROKER, 
newinstance, NULL))));
    _SBLIM_TRACE(2, ("--- namespace=\"%s\"", namespace));
+
+   if (strcmp(namespace, HOST_INSTRUMENTATION_NS) == 0) {
+      _SBLIM_TRACE(2,("--- \"%s\" is not a valid namespace for System 
Virtualization Profile", namespace));
+      goto exit;
+   }
 
    /* WORKAROUND FOR PEGASUS BUG?! reference does not contain object path, 
only namespace & classname. */
    reference = CMGetObjectPath(newinstance, NULL);
@@ -487,7 +516,7 @@ static CMPIStatus DeleteInstance(
                CMPIObjectPath * reference)     /* [in] Contains the target 
namespace, classname and object path. */
 {
    CMPIStatus status = {CMPI_RC_OK, NULL};     /* Return status of CIM 
operations. */
-   _RESOURCES * resources;                     /* Handle to the list of system 
resources. */
+   _RESOURCES * resources = NULL;                      /* Handle to the list 
of system resources. */
    _RESOURCE * resource;               /* Handle to the system resource. */
    char * namespace = CMGetCharPtr(CMGetNameSpace(reference, NULL)); /* Target 
namespace. */
    int found = 0;                              /* Found the target instance? */
@@ -497,6 +526,11 @@ static CMPIStatus DeleteInstance(
    _SBLIM_TRACE(2, ("--- context=\"%s\"", CMGetCharPtr(CDToString(_BROKER, 
context, NULL))));
    _SBLIM_TRACE(2, ("--- reference=\"%s\"", CMGetCharPtr(CDToString(_BROKER, 
reference, NULL))));
    _SBLIM_TRACE(2, ("--- namespace=\"%s\"", namespace));
+
+   if (strcmp(namespace, HOST_INSTRUMENTATION_NS) == 0) {
+      _SBLIM_TRACE(2,("--- \"%s\" is not a valid namespace for System 
Virtualization Profile", namespace));
+      goto exit;
+   }
 
    /* Get a handle to the list of system resources. */
    if (!Xen_ComputerSystem_getResources(&resources)) {
@@ -569,6 +603,12 @@ static CMPIStatus ExecQuery(
    _SBLIM_TRACE(2, ("--- language=\"%s\"", language));
    _SBLIM_TRACE(2, ("--- query=\"%s\"", query));
    _SBLIM_TRACE(2, ("--- namespace=\"%s\"", namespace));
+
+   if (strcmp(namespace, HOST_INSTRUMENTATION_NS) == 0) {
+      _SBLIM_TRACE(1,("--- \"%s\" is not a valid namespace for System 
Virtualization Profile", namespace));
+      CMSetStatusWithChars(_BROKER, &status, CMPI_RC_ERR_INVALID_NAMESPACE, 
"Invalid namespace specified for System Virtualization Profile");
+      goto exit;
+   }
 
    /* EXECQUERY() IS NOT YET SUPPORTED FOR THIS CLASS */
    CMSetStatusWithChars(_BROKER, &status, CMPI_RC_ERR_NOT_SUPPORTED, NULL);
diff -r 8e52de626fb5 src/Xen_HostedComputerSystem.c
--- a/src/Xen_HostedComputerSystem.c    Tue Jun 27 17:39:16 2006 -0600
+++ b/src/Xen_HostedComputerSystem.c    Fri Jul 14 17:19:52 2006 -0600
@@ -54,6 +54,8 @@ static char * _RHSCLASSNAME = "CIM_Compu
 static char * _RHSCLASSNAME = "CIM_ComputerSystem";
 static char * _LHSPROPERTYNAME = "Dependent"; 
 static char * _RHSPROPERTYNAME = "Antecedent";
+static char * _LHSNAMESPACE = "root/cimv2";
+static char * _RHSNAMESPACE = "smash";
 
 // ----------------------------------------------------------------------------
 // AssociationCleanup()
@@ -90,9 +92,9 @@ static CMPIStatus AssociatorNames(
                const char * resultRole)
 {
    CMPIStatus status = { CMPI_RC_OK, NULL };    /* Return status of CIM 
operations. */
-   char *namespace = CMGetCharPtr(CMGetNameSpace(reference, NULL)); /* Target 
namespace. */
    char *sourceclass = CMGetCharPtr(CMGetClassName(reference, &status)); /* 
Class of the source reference object */
    char *targetclass;                          /* Class of the target 
object(s). */
+   char *targetnamespace;
 
    _SBLIM_ENTER("AssociatorNames");
    _SBLIM_TRACE(2, ("--- self=\"%s\"", self->ft->miName));
@@ -102,12 +104,25 @@ static CMPIStatus AssociatorNames(
    _SBLIM_TRACE(2, ("--- resultClass=\"%s\"", resultClass));
    _SBLIM_TRACE(2, ("--- role=\"%s\"", role));
    _SBLIM_TRACE(2, ("--- resultRole=\"%s\"", resultRole));
-   _SBLIM_TRACE(2, ("--- namespace=\"%s\"", namespace));
    _SBLIM_TRACE(2, ("--- sourceclass=\"%s\"", sourceclass));
 
+   /* Determine the target class and namespace from the source class. */
+   if (CMClassPathIsA(_BROKER, reference, _LHSCLASSNAME, NULL)) {
+      targetclass = _RHSCLASSNAME;
+      targetnamespace = _RHSNAMESPACE;
+   } else if (CMClassPathIsA(_BROKER, reference, _RHSCLASSNAME, NULL)) {
+      targetclass = _LHSCLASSNAME;
+      targetnamespace = _LHSNAMESPACE;
+   } else {
+      _SBLIM_TRACE(2, ("--- Unrecognized source class. Ignoring request."));
+      goto exit;
+   } 
+   _SBLIM_TRACE(2, ("--- targetclass=\"%s\"", targetclass));
+   _SBLIM_TRACE(2, ("--- targetnamespace=\"%s\"", targetnamespace));
+ 
    /* Check that the requested association class, if any, is supported. */
    if (assocClass != NULL) {
-      CMPIObjectPath * assoc = CMNewObjectPath(_BROKER, namespace, 
_ASSOCCLASS, NULL);
+      CMPIObjectPath * assoc = CMNewObjectPath(_BROKER, targetnamespace, 
_ASSOCCLASS, NULL);
       if (!CMClassPathIsA(_BROKER, assoc, assocClass, NULL)) {
          _SBLIM_TRACE(2, ("--- Unrecognized association class. Ignoring 
request."));
          goto exit;
@@ -115,26 +130,14 @@ static CMPIStatus AssociatorNames(
    }
 
    /* Check that the reference matches the required role, if any. */
+   /* TODO: Not sure about this check.  IIRC 'role' is a property name. */
    if ((role != NULL) && strcmp(role, sourceclass) != 0) {
       _SBLIM_TRACE(2, ("--- Reference does not match required role. Ignoring 
request."));
       goto exit;
    }
 
-   /* Determine the target class from the source class. */
-   /* This used to be done with strcmp, we will now do it with CMClassPAthIsA*/
-   
-   if (CMClassPathIsA(_BROKER, reference, _LHSCLASSNAME, NULL)) {
-      targetclass = _RHSCLASSNAME;
-   } else if (CMClassPathIsA(_BROKER, reference, _RHSCLASSNAME, NULL)) {
-      targetclass = _LHSCLASSNAME;
-   } else {
-      _SBLIM_TRACE(2, ("--- Unrecognized source class. Ignoring request."));
-      goto exit;
-   } 
-   _SBLIM_TRACE(2, ("--- targetclass=\"%s\"", targetclass));
-
    /* Create an object path for the result class. */
-   CMPIObjectPath * objectpath = CMNewObjectPath(_BROKER, namespace, 
targetclass, &status);
+   CMPIObjectPath * objectpath = CMNewObjectPath(_BROKER, targetnamespace, 
targetclass, &status);
    if ((status.rc != CMPI_RC_OK) || CMIsNullObject(objectpath)) {
       _SBLIM_TRACE(1,("--- CMNewObjectPath() failed - %s", 
CMGetCharPtr(status.msg)));
       CMSetStatusWithChars(_BROKER, &status, CMPI_RC_ERROR, "Cannot create new 
CMPIObjectPath");
@@ -149,19 +152,21 @@ static CMPIStatus AssociatorNames(
       goto exit;
    }
 
-   /* Return all object paths that do not match the sourceClass and 
resultClass, if specified. 
-      If the target class is CIM_ComputerSystem, the CIMOM will return both 
Xen_ComputerSystem and the 
-      Host Provider. We need to return only the Host Provider.
-      This will also work, if the source class is the Host Provider's class. 
In that case, the only value returned 
-      will be the Xen_ComputerSystem.
-   */
+   /* Return all object paths that match resultClass, if specified. */
    while (CMHasNext(objectpaths, NULL)) {
       CMPIData data = CMGetNext(objectpaths, NULL);
       char *class = CMGetCharPtr(CMGetClassName(data.value.ref, NULL));
-      if (!(strcmp(class,sourceclass) == 0) && ((resultClass == NULL) || 
(strcmp(class,resultClass) == 0))) {
+      
+      _SBLIM_TRACE(2, ("--- returning object path = \"%s\"", 
CMGetCharPtr(CDToString(_BROKER, data.value.ref, NULL))));
+
+      /* Ignore possible instances of source class. */
+      if (strcmp(class,sourceclass) &&
+          (resultClass == NULL || CMClassPathIsA(_BROKER, data.value.ref, 
resultClass, NULL))) {
+         _SBLIM_TRACE(2, ("--- returning object path = \"%s\"", 
CMGetCharPtr(CDToString(_BROKER, data.value.ref, NULL))));
          CMReturnObjectPath(results, data.value.ref);
       }
    }
+
    CMReturnDone(results);
 exit:
    _SBLIM_RETURNSTATUS(status);
@@ -183,9 +188,9 @@ static CMPIStatus Associators(
                char ** properties)             /* [in] List of desired 
properties (NULL=all). */
 {
    CMPIStatus status = { CMPI_RC_OK, NULL };    /* Return status of CIM 
operations. */
-   char *namespace = CMGetCharPtr(CMGetNameSpace(reference, NULL)); /* Target 
namespace. */
    char *sourceclass = CMGetCharPtr(CMGetClassName(reference, &status)); /* 
Class of the source reference object */
    char *targetclass;                           /* Class of the target 
object(s). */
+   char *targetnamespace;
 
    _SBLIM_ENTER("Associators");
    _SBLIM_TRACE(2, ("--- self=\"%s\"", self->ft->miName));
@@ -195,12 +200,25 @@ static CMPIStatus Associators(
    _SBLIM_TRACE(2, ("--- resultClass=\"%s\"", resultClass));
    _SBLIM_TRACE(2, ("--- role=\"%s\"", role));
    _SBLIM_TRACE(2, ("--- resultRole=\"%s\"", resultRole));
-   _SBLIM_TRACE(2, ("--- namespace=\"%s\"", namespace));
    _SBLIM_TRACE(2, ("--- sourceclass=\"%s\"", sourceclass));
+
+   /* Determine the target class from the source class. */
+   if (CMClassPathIsA(_BROKER, reference, _LHSCLASSNAME, NULL)) {
+      targetclass = _RHSCLASSNAME;
+      targetnamespace = _RHSNAMESPACE;
+   } else if (CMClassPathIsA(_BROKER, reference, _RHSCLASSNAME, NULL)) {
+      targetclass = _LHSCLASSNAME;
+      targetnamespace = _LHSNAMESPACE;
+   } else {
+      _SBLIM_TRACE(2, ("--- Unrecognized source class. Ignoring request."));
+      goto exit;
+   } 
+   _SBLIM_TRACE(2, ("--- targetclass=\"%s\"", targetclass));
+   _SBLIM_TRACE(2, ("--- targetnamespace=\"%s\"", targetnamespace));
 
    /* Check that the requested association class, if any, is supported. */
    if (assocClass != NULL) {
-      CMPIObjectPath * assoc = CMNewObjectPath(_BROKER, namespace, 
_ASSOCCLASS, NULL);
+      CMPIObjectPath * assoc = CMNewObjectPath(_BROKER, targetnamespace, 
_ASSOCCLASS, NULL);
       if (!CMClassPathIsA(_BROKER, assoc, assocClass, NULL)) {
          _SBLIM_TRACE(2, ("--- Unrecognized association class. Ignoring 
request."));
          goto exit;
@@ -212,22 +230,9 @@ static CMPIStatus Associators(
       _SBLIM_TRACE(2, ("--- Reference does not match required role. Ignoring 
request."));
       goto exit;
    }
-   CMSetStatusWithChars(_BROKER, &status, CMPI_RC_ERR_NOT_SUPPORTED, NULL);
-
-   /* Determine the target class from the source class. */
-   /* This used to be done with strcmp, we will now do it with CMClassPAthIsA*/
-      if (CMClassPathIsA(_BROKER, reference, _LHSCLASSNAME, NULL)) {
-      targetclass = _RHSCLASSNAME;
-   } else if (CMClassPathIsA(_BROKER, reference, _RHSCLASSNAME, NULL)) {
-      targetclass = _LHSCLASSNAME;
-   } else {
-      _SBLIM_TRACE(2, ("--- Unrecognized source class. Ignoring request."));
-      goto exit;
-   } 
-   _SBLIM_TRACE(2, ("--- targetclass=\"%s\"", targetclass));
 
    /* Create an object path for the result class. */
-   CMPIObjectPath * objectpath = CMNewObjectPath(_BROKER, namespace, 
targetclass, &status);
+   CMPIObjectPath * objectpath = CMNewObjectPath(_BROKER, targetnamespace, 
targetclass, &status);
    if ((status.rc != CMPI_RC_OK) || CMIsNullObject(objectpath)) {
       _SBLIM_TRACE(1,("--- CMNewObjectPath() failed - %s", 
CMGetCharPtr(status.msg)));
       CMSetStatusWithChars(_BROKER, &status, CMPI_RC_ERROR, "Cannot create new 
CMPIObjectPath");
@@ -242,17 +247,23 @@ static CMPIStatus Associators(
       goto exit;
    }
 
-   /* Return all instances that exactly match the target class and 
resultClass, if specified. */
+   /* Return all instances that match the resultClass, if specified. */
    while (CMHasNext(instances, NULL)) {
       CMPIData data = CMGetNext(instances, NULL);
-      char *class = 
CMGetCharPtr(CMGetClassName(CMGetObjectPath(data.value.inst,NULL), NULL));
-      if (!(strcmp(class,targetclass) == 0) && ((resultClass == NULL) || 
(strcmp(class,resultClass) == 0))) {
-// BUG - returning data causes crash !?!
-_SBLIM_TRACE(2, ("--- data.value.inst=\"%s\"", 
CMGetCharPtr(CDToString(_BROKER, data.value.inst, NULL))));
+      CMPIObjectPath *op = CMGetObjectPath(data.value.inst,NULL);
+      char *class = CMGetCharPtr(CMGetClassName(op, NULL));
+
+      _SBLIM_TRACE(2, ("--- got inst with object path = \"%s\"", 
CMGetCharPtr(CDToString(_BROKER, op, NULL))));
+
+      /* Ignore possible instances of source class. */
+      if (strcmp(class,sourceclass) &&
+          (resultClass == NULL || CMClassPathIsA(_BROKER, op, resultClass, 
NULL))) {
+         _SBLIM_TRACE(2, ("--- data.value.inst=\"%s\"", 
CMGetCharPtr(CDToString(_BROKER, data.value.inst, NULL))));
+         
          CMReturnInstance(results, data.value.inst);
       }
    }
-
+   
    CMReturnDone(results);
 
 exit:
@@ -268,27 +279,48 @@ static CMPIStatus ReferenceNames(
                CMPIContext * context,          /* [in] Additional context 
info, if any. */
                CMPIResult * results,           /* [out] Results of this 
operation. */
                CMPIObjectPath * reference,     /* [in] Contains the source 
namespace, classname and object path. */
-               const char *assocClass, 
+               const char *resultClass, 
                const char *role)
 {
    CMPIStatus status = { CMPI_RC_OK, NULL };    /* Return status of CIM 
operations. */
-   char *namespace = CMGetCharPtr(CMGetNameSpace(reference, NULL)); /* Target 
namespace. */
    char *sourceclass = CMGetCharPtr(CMGetClassName(reference, &status)); /* 
Class of the source reference object */
    char *targetclass;                           /* Class of the target 
object(s). */
+   char *targetnamespace;
 
    _SBLIM_ENTER("ReferenceNames");
    _SBLIM_TRACE(2, ("--- self=\"%s\"", self->ft->miName));
    _SBLIM_TRACE(2, ("--- context=\"%s\"", CMGetCharPtr(CDToString(_BROKER, 
context, NULL))));
    _SBLIM_TRACE(2, ("--- reference=\"%s\"", CMGetCharPtr(CDToString(_BROKER, 
reference, NULL))));
-   _SBLIM_TRACE(2, ("--- assocClass=\"%s\"", assocClass));
+   _SBLIM_TRACE(2, ("--- resultClass=\"%s\"", resultClass));
    _SBLIM_TRACE(2, ("--- role=\"%s\"", role));
-   _SBLIM_TRACE(2, ("--- namespace=\"%s\"", namespace));
    _SBLIM_TRACE(2, ("--- sourceclass=\"%s\"", sourceclass));
 
-   /* Check that the requested association class, if any, is supported. */
-   if (assocClass != NULL) {
-      CMPIObjectPath * assoc = CMNewObjectPath(_BROKER, namespace, 
_ASSOCCLASS, NULL);
-      if (!CMClassPathIsA(_BROKER, assoc, assocClass, NULL)) {
+   /* Need to have object paths for objects on both sides of the returned
+    * association names.  We are given one in the reference parameter.  Need to
+    * fetch the others from cimom.
+    */
+   if (CMClassPathIsA(_BROKER, reference, _LHSCLASSNAME, NULL)) {
+      targetclass = _RHSCLASSNAME;
+      targetnamespace = _RHSNAMESPACE;
+      /* Refences of LHS class should always be in LHS namespace. */
+      CMSetNameSpace(reference, _LHSNAMESPACE);
+   } else if (CMClassPathIsA(_BROKER, reference, _RHSCLASSNAME, NULL)) {
+      targetclass = _LHSCLASSNAME;
+      targetnamespace = _LHSNAMESPACE;
+   } else {
+      _SBLIM_TRACE(2, ("--- Unrecognized source class. Ignoring request."));
+      goto exit;
+   } 
+   _SBLIM_TRACE(2, ("--- targetclass=\"%s\"", targetclass));
+   _SBLIM_TRACE(2, ("--- targetnamespace=\"%s\"", targetnamespace));
+
+   /* If resultClass is specified, it should be a Xen_HostedComputerSystem.
+    * Otherwise caller is looking for a different association than what this
+    * code implements.
+    */
+   if (resultClass != NULL) {
+      CMPIObjectPath * assoc = CMNewObjectPath(_BROKER, _LHSNAMESPACE, 
_ASSOCCLASS, NULL);
+      if (!CMClassPathIsA(_BROKER, assoc, resultClass, NULL)) {
          _SBLIM_TRACE(2, ("--- Unrecognized association class. Ignoring 
request."));
          goto exit;
       }
@@ -300,27 +332,14 @@ static CMPIStatus ReferenceNames(
       goto exit;
    }
 
-   /* Determine the target class from the source class. */
-   /* This used to be done with strcmp, we will now do it with CMClassPAthIsA*/
-      if (CMClassPathIsA(_BROKER, reference, _LHSCLASSNAME, NULL)) {
-      targetclass = _RHSCLASSNAME;
-   } else if (CMClassPathIsA(_BROKER, reference, _RHSCLASSNAME, NULL)) {
-      targetclass = _LHSCLASSNAME;
-   } else {
-      _SBLIM_TRACE(2, ("--- Unrecognized source class. Ignoring request."));
-      goto exit;
-   } 
-      _SBLIM_TRACE(2, ("--- targetclass=\"%s\"", targetclass));
-
-   /* Create an object path for the result class. */
-   CMPIObjectPath * objectpath = CMNewObjectPath(_BROKER, namespace, 
targetclass, &status);
+   /* Retrieve object paths of objects on other side of association. */
+   CMPIObjectPath * objectpath = CMNewObjectPath(_BROKER, targetnamespace, 
targetclass, &status);
    if ((status.rc != CMPI_RC_OK) || CMIsNullObject(objectpath)) {
       _SBLIM_TRACE(1,("--- CMNewObjectPath() failed - %s", 
CMGetCharPtr(status.msg)));
       CMSetStatusWithChars(_BROKER, &status, CMPI_RC_ERROR, "Cannot create new 
CMPIObjectPath");
       goto exit;
    }
 
-   /* Get the list of all target class object paths from the CIMOM. */
    CMPIEnumeration * objectpaths = CBEnumInstanceNames(_BROKER, context, 
objectpath, &status);
    if ((status.rc != CMPI_RC_OK) || CMIsNullObject(objectpaths)) {
       _SBLIM_TRACE(1,("--- CBEnumInstanceNames() failed - %s", 
CMGetCharPtr(status.msg)));
@@ -328,37 +347,37 @@ static CMPIStatus ReferenceNames(
       goto exit;
    }
 
-   /* Return all object paths that exactly match the target class and 
resultClass, if specified. */
+   /* Already made it past the filters so return an association name
+    * (object path) for each association that exists to the source object.
+    */
    while (CMHasNext(objectpaths, NULL)) {
       CMPIData data = CMGetNext(objectpaths, NULL);
-      //char *class = CMGetCharPtr(CMGetClassName(data.value.ref, NULL));
-      // This used to be strcmp, now replaced with CMClassPathIsA
-      //if (strcmp(class,targetclass) == 0) {
-       if(CMClassPathIsA(_BROKER, data.value.ref, targetclass, NULL)) {
-         /* Create an object path for the association. */
-         CMPIObjectPath * refobjectpath = CMNewObjectPath(_BROKER, namespace, 
_ASSOCCLASS, &status);
+      
+      if((CMClassPathIsA(_BROKER, data.value.ref, targetclass, NULL)) &&
+         (!CMClassPathIsA(_BROKER, data.value.ref, sourceclass, NULL))) {
+         /* Create an object path for the association. Note that the 
association
+          * objects should exist in 'virt namespace' not the host namespace.
+          */
+         CMPIObjectPath * refobjectpath = CMNewObjectPath(_BROKER, 
_LHSNAMESPACE, _ASSOCCLASS, &status);
          if ((status.rc != CMPI_RC_OK) || CMIsNullObject(refobjectpath)) {
             _SBLIM_TRACE(1,("--- CMNewObjectPath() failed - %s", 
CMGetCharPtr(status.msg)));
             CMSetStatusWithChars(_BROKER, &status, CMPI_RC_ERROR, "Cannot 
create new CMPIObjectPath");
             goto exit;
          }
-
+      
          /* Assign the references in the association appropriately. */
-        /* This used to be strcmp (sourceclass, _RHSCLASSNAME), but since the 
RHSCLASSNAME will always be CIM_COMPUTERSYSTEM, 
-           we will be better off  comparing it to the _LHSCLASSNAME
-        */
          if (strcmp(sourceclass, _LHSCLASSNAME) == 0) {
             CMAddKey(refobjectpath, _RHSPROPERTYNAME, &data.value.ref, 
CMPI_ref);
             CMAddKey(refobjectpath, _LHSPROPERTYNAME, &reference, CMPI_ref);
          } else {
-           CMAddKey(refobjectpath, _RHSPROPERTYNAME, &reference, CMPI_ref);
+            CMAddKey(refobjectpath, _RHSPROPERTYNAME, &reference, CMPI_ref);
             CMAddKey(refobjectpath, _LHSPROPERTYNAME, &data.value.ref, 
CMPI_ref);
          }
-
+         
          CMReturnObjectPath(results, refobjectpath);
       }
    }
-
+   
 exit:
    _SBLIM_RETURNSTATUS(status);
 }
@@ -372,28 +391,49 @@ static CMPIStatus References(
                CMPIContext * context,          /* [in] Additional context 
info, if any. */
                CMPIResult * results,           /* [out] Results of this 
operation. */
                CMPIObjectPath * reference,     /* [in] Contains the namespace, 
classname and desired object path. */
-               const char *assocClass,
+               const char *resultClass,
                const char *role,
                char **properties)              /* [in] List of desired 
properties (NULL=all). */
 {
    CMPIStatus status = { CMPI_RC_OK, NULL };    /* Return status of CIM 
operations. */
-   char *namespace = CMGetCharPtr(CMGetNameSpace(reference, NULL)); /* Target 
namespace. */
    char *sourceclass = CMGetCharPtr(CMGetClassName(reference, &status)); /* 
Class of the source reference object */
    char *targetclass;                           /* Class of the target 
object(s). */
+   char *targetnamespace;
 
    _SBLIM_ENTER("References");
    _SBLIM_TRACE(2, ("--- self=\"%s\"", self->ft->miName));
    _SBLIM_TRACE(2, ("--- context=\"%s\"", CMGetCharPtr(CDToString(_BROKER, 
context, NULL))));
    _SBLIM_TRACE(2, ("--- reference=\"%s\"", CMGetCharPtr(CDToString(_BROKER, 
reference, NULL))));
-   _SBLIM_TRACE(2, ("--- assocClass=\"%s\"", assocClass));
+   _SBLIM_TRACE(2, ("--- resultClass=\"%s\"", resultClass));
    _SBLIM_TRACE(2, ("--- role=\"%s\"", role));
-   _SBLIM_TRACE(2, ("--- namespace=\"%s\"", namespace));
    _SBLIM_TRACE(2, ("--- sourceclass=\"%s\"", sourceclass));
 
-   /* Check that the requested association class, if any, is supported. */
-   if (assocClass != NULL) {
-      CMPIObjectPath * assoc = CMNewObjectPath(_BROKER, namespace, 
_ASSOCCLASS, NULL);
-      if (!CMClassPathIsA(_BROKER, assoc, assocClass, NULL)) {
+   /* Need to have object paths for objects on both sides of the returned
+    * associations.  We are given one in the reference parameter.  Need to
+    * fetch the others from cimom.
+    */
+   if (CMClassPathIsA(_BROKER, reference, _LHSCLASSNAME, NULL)) {
+      targetclass = _RHSCLASSNAME;
+      targetnamespace = _RHSNAMESPACE;
+      /* Refences of LHS class should always be in LHS namespace. */
+      CMSetNameSpace(reference, _LHSNAMESPACE);
+   } else if (CMClassPathIsA(_BROKER, reference, _RHSCLASSNAME, NULL)) {
+      targetclass = _LHSCLASSNAME;
+      targetnamespace = _LHSNAMESPACE;
+   } else {
+      _SBLIM_TRACE(2, ("--- Unrecognized source class. Ignoring request."));
+      goto exit;
+   } 
+   _SBLIM_TRACE(2, ("--- targetclass=\"%s\"", targetclass));
+   _SBLIM_TRACE(2, ("--- targetnamespace=\"%s\"", targetnamespace));
+
+   /* If resultClass is specified, it should be a Xen_HostedComputerSystem.
+    * Otherwise caller is looking for a different association than what this
+    * code implements.
+    */
+   if (resultClass != NULL) {
+      CMPIObjectPath * assoc = CMNewObjectPath(_BROKER, targetnamespace, 
_ASSOCCLASS, NULL);
+      if (!CMClassPathIsA(_BROKER, assoc, resultClass, NULL)) {
          _SBLIM_TRACE(2, ("--- Unrecognized association class. Ignoring 
request."));
          goto exit;
       }
@@ -405,27 +445,15 @@ static CMPIStatus References(
       goto exit;
    }
 
-   /* Determine the target class from the source class. */
-   /* This used to be done with strcmp, we will now do it with CMClassPAthIsA*/
-   if (CMClassPathIsA(_BROKER, reference, _LHSCLASSNAME, NULL)) {
-      targetclass = _RHSCLASSNAME;
-   } else if (CMClassPathIsA(_BROKER, reference, _RHSCLASSNAME, NULL)) {
-      targetclass = _LHSCLASSNAME;
-   } else {
-      _SBLIM_TRACE(2, ("--- Unrecognized source class. Ignoring request."));
-      goto exit;
-   } 
-   _SBLIM_TRACE(2, ("--- targetclass=\"%s\"", targetclass));
-
    /* Create an object path for the result class. */
-   CMPIObjectPath * objectpath = CMNewObjectPath(_BROKER, namespace, 
targetclass, &status);
+   CMPIObjectPath * objectpath = CMNewObjectPath(_BROKER, targetnamespace, 
targetclass, &status);
    if ((status.rc != CMPI_RC_OK) || CMIsNullObject(objectpath)) {
       _SBLIM_TRACE(1,("--- CMNewObjectPath() failed - %s", 
CMGetCharPtr(status.msg)));
       CMSetStatusWithChars(_BROKER, &status, CMPI_RC_ERROR, "Cannot create new 
CMPIObjectPath");
       goto exit;
    }
 
-   /* Get the list of all target class object paths from the CIMOM. */
+   /* Retrieve object paths of objects on other side of association. */
    CMPIEnumeration * objectpaths = CBEnumInstanceNames(_BROKER, context, 
objectpath, &status);
    if ((status.rc != CMPI_RC_OK) || CMIsNullObject(objectpaths)) {
       _SBLIM_TRACE(1,("--- CBEnumInstanceNames() failed - %s", 
CMGetCharPtr(status.msg)));
@@ -433,35 +461,36 @@ static CMPIStatus References(
       goto exit;
    }
 
-   /* Return all object paths that exactly match the target class and 
resultClass, if specified. */
+   /* Already made it past the filters so return an association instance
+    * for each association that exists to the source object.
+    */
    while (CMHasNext(objectpaths, NULL)) {
       CMPIData data = CMGetNext(objectpaths, NULL);
-      //char *class = CMGetCharPtr(CMGetClassName(data.value.ref, NULL));
-      // This used to be strcmp, now replaced with CMClassPathIsA
-      //if (strcmp(class,targetclass) == 0) {
-       if(CMClassPathIsA(_BROKER, data.value.ref, targetclass, NULL)) {
-         /* Create an instance for the association. */
-         CMPIInstance * refinstance = _CMNewInstance(_BROKER, namespace, 
_ASSOCCLASS, &status);
+       
+      if((CMClassPathIsA(_BROKER, data.value.ref, targetclass, NULL)) &&
+         (!CMClassPathIsA(_BROKER, data.value.ref, sourceclass, NULL))) {  
+         /* Create an instance for the association. Note that the association
+          * objects should exist in 'virt namespace' not the host namespace.
+          */
+         CMPIInstance * refinstance = _CMNewInstance(_BROKER, _LHSNAMESPACE, 
_ASSOCCLASS, &status);
          if ((status.rc != CMPI_RC_OK) || CMIsNullObject(refinstance)) {
             _SBLIM_TRACE(1,("--- CMNewInstance() failed - %s", 
CMGetCharPtr(status.msg)));
             CMSetStatusWithChars(_BROKER, &status, CMPI_RC_ERROR, "Cannot 
create new CMPIInstance");
             goto exit;
          }
-
+         
          /* Assign the references in the association appropriately. */
-        /* This used to be strcmp (sourceclass, _RHSCLASSNAME), but since the 
RHSCLASSNAME will always be CIM_COMPUTERSYSTEM, 
-           we will be better off  comparing it to the _LHSCLASSNAME
-        */
          if (strcmp(sourceclass, _LHSCLASSNAME) == 0) {
-           CMSetProperty(refinstance, _RHSPROPERTYNAME, &data.value.ref, 
CMPI_ref);
+            CMSetProperty(refinstance, _RHSPROPERTYNAME, &data.value.ref, 
CMPI_ref);
             CMSetProperty(refinstance, _LHSPROPERTYNAME, &reference, CMPI_ref);
-            } else {
-               CMSetProperty(refinstance, _RHSPROPERTYNAME, &reference, 
CMPI_ref);
-                CMSetProperty(refinstance, _LHSPROPERTYNAME, &data.value.ref, 
CMPI_ref);
+         } else {
+            CMSetProperty(refinstance, _RHSPROPERTYNAME, &reference, CMPI_ref);
+            CMSetProperty(refinstance, _LHSPROPERTYNAME, &data.value.ref, 
CMPI_ref);
          }
          CMReturnInstance(results, refinstance);
       }
    }
+   
 exit:
    _SBLIM_RETURNSTATUS(status);
 }
_______________________________________________
Xen-cim mailing list
Xen-cim@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-cim

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.