[Libvirt-cim] [PATCH 5/8] RASD: Provider Support for Console RASDs

Viktor Mihajlovski mihajlov at linux.vnet.ibm.com
Thu Sep 5 15:36:39 UTC 2013


From: Thilo Boehm <tboehm at linux.vnet.ibm.com>

Instance support for console RASDs.

The ResourceType of the returned instances is is '1' (Other) and the
OtherResourceType is 'console'.

Implemented CIM operations:
   enumerate instances
   enumerate instance names
   get instance

Signed-off-by: Thilo Boehm <tboehm at linux.vnet.ibm.com>
Signed-off-by: Viktor Mihajlovski <mihajlov at linux.vnet.ibm.com>
Reviewed-by: Boris Fiuczynski <fiuczy at linux.vnet.ibm.com>
---
 src/Virt_RASD.c |  148 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 147 insertions(+), 1 deletion(-)

diff --git a/src/Virt_RASD.c b/src/Virt_RASD.c
index 150ccd3..7d72831 100644
--- a/src/Virt_RASD.c
+++ b/src/Virt_RASD.c
@@ -1,5 +1,5 @@
 /*
- * Copyright IBM Corp. 2007
+ * Copyright IBM Corp. 2007, 2013
  *
  * Authors:
  *  Dan Smith <danms at us.ibm.com>
@@ -662,6 +662,142 @@ static CMPIStatus set_graphics_rasd_params(const struct virt_device *dev,
         return s;
 }
 
+static char* _build_console_url(const char *protocol,
+                                const char *host,
+                                const char *port)
+{
+        char* result = NULL;
+
+        if (NULL == host)
+                goto out;
+
+        if (STREQC("file", protocol)) {
+                /* The host string contains the file name.
+                   Even if the file name does not start with a '/'
+                   it is treated by libvirt as a full qualified path.
+                */
+                if ('/' == host[0]) {
+                        if (asprintf(&result, "file://%s", host) < 0)
+                                result = NULL;
+                        goto out;
+                } else {
+                        if (asprintf(&result, "file:///%s", host) < 0)
+                                result = NULL;
+                        goto out;
+                }
+        }
+        /* The assumption is that the host does not contain a port.
+           If the host string contains a ':',
+           the host is treated as an IPv6 address.
+        */
+        if (NULL == strchr(host, ':')) {
+                if (NULL == port) {
+                        if (asprintf(&result,"%s://%s", protocol, host) < 0)
+                                result = NULL;
+                        goto out;
+                } else {
+                        if (asprintf(&result,"%s://%s:%s", protocol,
+                                     host,port) < 0)
+                                result = NULL;
+                        goto out;
+                }
+        }
+ out:
+        return result;
+}
+
+
+static CMPIStatus set_console_rasd_params(const struct virt_device *vdev,
+                                          CMPIInstance *inst)
+{
+        CMPIStatus s = {CMPI_RC_OK, NULL};
+        const struct console_device *cdev = NULL;
+        char* tmp = NULL;
+
+        cdev = &vdev->dev.console;
+
+        CMSetProperty(inst, "OtherResourceType", "console", CMPI_chars);
+        CMSetProperty(inst, "SourceType",
+                      (CMPIValue *)&cdev->source_type, CMPI_uint16);
+        CMSetProperty(inst, "TargetType",
+                      (CMPIValue *)cdev->target_type, CMPI_chars);
+
+        switch (cdev->source_type) {
+        case CIM_CHARDEV_SOURCE_TYPE_PTY:
+                CMSetProperty(inst, "SourcePath",
+                              (CMPIValue *)cdev->source_dev.pty.path,
+                              CMPI_chars);
+                break;
+        case CIM_CHARDEV_SOURCE_TYPE_DEV:
+                CMSetProperty(inst, "SourcePath",
+                              (CMPIValue *)cdev->source_dev.dev.path,
+                              CMPI_chars);
+                break;
+        case CIM_CHARDEV_SOURCE_TYPE_FILE:
+                CMSetProperty(inst, "SourcePath",
+                              (CMPIValue *)cdev->source_dev.file.path,
+                              CMPI_chars);
+                break;
+        case CIM_CHARDEV_SOURCE_TYPE_PIPE:
+                CMSetProperty(inst, "SourcePath",
+                              (CMPIValue *)cdev->source_dev.pipe.path,
+                              CMPI_chars);
+                break;
+        case CIM_CHARDEV_SOURCE_TYPE_UNIXSOCK:
+                tmp = _build_console_url("file",
+                                         cdev->source_dev.unixsock.path, NULL);
+                if (STREQC(cdev->source_dev.unixsock.mode, "bind"))
+                        CMSetProperty(inst, "BindURL",
+                                      (CMPIValue *)tmp, CMPI_chars);
+
+                if (STREQC(cdev->source_dev.unixsock.mode, "connect"))
+                        CMSetProperty(inst, "ConnectURL",
+                                      (CMPIValue *)tmp, CMPI_chars);
+
+                free(tmp);
+                break;
+        case CIM_CHARDEV_SOURCE_TYPE_UDP:
+                tmp = _build_console_url("udp",
+                                         cdev->source_dev.udp.bind_host,
+                                         cdev->source_dev.udp.bind_service);
+                CMSetProperty(inst, "BindURL",
+                              (CMPIValue *)tmp, CMPI_chars);
+                free(tmp);
+
+                tmp = _build_console_url("udp",
+                                         cdev->source_dev.udp.connect_host,
+                                         cdev->source_dev.udp.connect_service);
+                CMSetProperty(inst, "ConnectURL", (CMPIValue *)tmp, CMPI_chars);
+                free(tmp);
+                break;
+        case CIM_CHARDEV_SOURCE_TYPE_TCP:
+                tmp = _build_console_url(cdev->source_dev.tcp.protocol,
+                                         cdev->source_dev.tcp.host,
+                                         cdev->source_dev.tcp.service);
+                if (STREQC(cdev->source_dev.tcp.mode, "bind"))
+                        CMSetProperty(inst, "BindURL",
+                                      (CMPIValue *)tmp, CMPI_chars);
+
+                if (STREQC(cdev->source_dev.tcp.mode, "connect"))
+                        CMSetProperty(inst, "ConnectURL",
+                                      (CMPIValue *)tmp, CMPI_chars);
+
+                free(tmp);
+                break;
+
+        default:
+                /* Nothing to do for :
+                   CIM_CHARDEV_SOURCE_TYPE_STDIO
+                   CIM_CHARDEV_SOURCE_TYPE_NULL
+                   CIM_CHARDEV_SOURCE_TYPE_VC
+                   CIM_CHARDEV_SOURCE_TYPE_SPICEVMC
+                */
+                break;
+        }
+
+        return s;
+}
+
 static CMPIStatus set_input_rasd_params(const struct virt_device *dev,
                                         CMPIInstance *inst)
 {
@@ -721,6 +857,9 @@ CMPIInstance *rasd_from_vdev(const CMPIBroker *broker,
         } else if (dev->type == CIM_RES_TYPE_GRAPHICS) {
                 type = CIM_RES_TYPE_GRAPHICS;
                 base = "GraphicsResourceAllocationSettingData";
+        } else if (dev->type == CIM_RES_TYPE_CONSOLE) {
+                type = CIM_RES_TYPE_OTHER;
+                base = "ConsoleResourceAllocationSettingData";
         } else if (dev->type == CIM_RES_TYPE_INPUT) {
                 type = CIM_RES_TYPE_INPUT;
                 base = "InputResourceAllocationSettingData";
@@ -777,6 +916,8 @@ CMPIInstance *rasd_from_vdev(const CMPIBroker *broker,
                 s = set_graphics_rasd_params(dev, inst, host, CLASSNAME(ref));
         } else if (dev->type == CIM_RES_TYPE_INPUT) {
                 s = set_input_rasd_params(dev, inst);
+        } else if (dev->type == CIM_RES_TYPE_CONSOLE) {
+                s = set_console_rasd_params(dev, inst);
         }
 
         /* FIXME: Put the HostResource in place */
@@ -909,6 +1050,8 @@ CMPIrc res_type_from_rasd_classname(const char *cn, uint16_t *type)
                *type = CIM_RES_TYPE_INPUT;
        else if (STREQ(base, "StorageVolumeResourceAllocationSettingData"))
                *type = CIM_RES_TYPE_IMAGE;
+       else if (STREQ(base, "ConsoleResourceAllocationSettingData"))
+               *type = CIM_RES_TYPE_CONSOLE;
        else
                goto out;
 
@@ -940,6 +1083,9 @@ CMPIrc rasd_classname_from_type(uint16_t type, const char **classname)
         case CIM_RES_TYPE_GRAPHICS:
                 *classname = "GraphicsResourceAllocationSettingData";
                 break;
+        case CIM_RES_TYPE_CONSOLE:
+                *classname = "ConsoleResourceAllocationSettingData";
+                break;
         case CIM_RES_TYPE_INPUT:
                 *classname = "InputResourceAllocationSettingData";
                 break;
-- 
1.7.9.5




More information about the Libvirt-cim mailing list