[Libvirt-cim] [PATCH] Hang a default VSSD off of the VSMC to mirror the AC RASD behavior

Dan Smith danms at us.ibm.com
Wed Apr 16 20:40:56 UTC 2008


# HG changeset patch
# User Dan Smith <danms at us.ibm.com>
# Date 1208378296 25200
# Node ID 00dc567c364daeeebc40888742516dc1dcd2b106
# Parent  f7e2c322ac0ab1d109192a362d508ca4a2a87310
Hang a default VSSD off of the VSMC to mirror the AC RASD behavior

Signed-off-by: Dan Smith <danms at us.ibm.com>

diff -r f7e2c322ac0a -r 00dc567c364d src/Virt_SettingsDefineCapabilities.c
--- a/src/Virt_SettingsDefineCapabilities.c	Wed Apr 16 11:08:13 2008 -0700
+++ b/src/Virt_SettingsDefineCapabilities.c	Wed Apr 16 13:38:16 2008 -0700
@@ -55,6 +55,176 @@ const static CMPIBroker *_BROKER;
 #define SDC_DISK_INC 250
 
 #define DEFAULT_MAC_PREFIX "00:16:3e"
+
+static bool system_has_vt(virConnectPtr conn)
+{
+        char *caps = NULL;
+        bool vt = false;
+
+        caps = virConnectGetCapabilities(conn);
+        if (caps != NULL)
+                vt = (strstr(caps, "hvm") != NULL);
+
+        free(caps);
+
+        return vt;
+}
+
+static CMPIInstance *_xen_base_vssd(virConnectPtr conn,
+                                    const char *ns,
+                                    const char *name)
+{
+        CMPIInstance *inst;
+
+        inst = get_typed_instance(_BROKER,
+                                  pfx_from_conn(conn),
+                                  "VirtualSystemSettingData",
+                                  ns);
+        if (inst == NULL)
+                return NULL;
+
+        CMSetProperty(inst, "VirtualSystemIdentifier",
+                      (CMPIValue *)name, CMPI_chars);
+
+        return inst;
+}
+
+static CMPIStatus _xen_vsmc_to_vssd(virConnectPtr conn,
+                                    const char *ns,
+                                    struct inst_list *list)
+{
+        CMPIStatus s = {CMPI_RC_OK, NULL};
+        CMPIInstance *inst;
+        int isfv = 0;
+
+        inst = _xen_base_vssd(conn, ns, "Xen_Paravirt_Guest");
+        if (inst == NULL)
+                goto error;
+
+        CMSetProperty(inst, "Bootloader",
+                      (CMPIValue *)"/usr/bin/pygrub", CMPI_chars);
+
+        CMSetProperty(inst, "isFullVirt",
+                      (CMPIValue *)&isfv, CMPI_boolean);
+
+        inst_list_add(list, inst);
+
+        if (system_has_vt(conn)) {
+                isfv = 1;
+
+                inst = _xen_base_vssd(conn, ns, "Xen_Fullvirt_Guest");
+                if (inst == NULL)
+                        goto error;
+
+                CMSetProperty(inst, "BootDevice",
+                              (CMPIValue *)"hda", CMPI_chars);
+
+                CMSetProperty(inst, "isFullVirt",
+                              (CMPIValue *)&isfv, CMPI_boolean);
+
+                inst_list_add(list, inst);
+        }
+
+        return s;
+
+ error:
+        cu_statusf(_BROKER, &s,
+                   CMPI_RC_ERR_FAILED,
+                   "Unable to create %s_VSSD instance",
+                   pfx_from_conn(conn));
+
+        return s;
+}
+
+static CMPIStatus _kvm_vsmc_to_vssd(virConnectPtr conn,
+                                    const char *ns,
+                                    struct inst_list *list)
+{
+        CMPIStatus s = {CMPI_RC_OK, NULL};
+        CMPIInstance *inst;
+
+        inst = get_typed_instance(_BROKER,
+                                  pfx_from_conn(conn),
+                                  "VirtualSystemSettingData",
+                                  ns);
+        if (inst == NULL) {
+                cu_statusf(_BROKER, &s,
+                           CMPI_RC_ERR_FAILED,
+                           "Unable to create %s_VSSD instance",
+                           pfx_from_conn(conn));
+                goto out;
+        }
+
+        CMSetProperty(inst, "VirtualSystemIdentifier",
+                      (CMPIValue *)"KVM_guest", CMPI_chars);
+
+        CMSetProperty(inst, "BootDevice",
+                      (CMPIValue *)"hda", CMPI_chars);
+
+        inst_list_add(list, inst);
+ out:
+        return s;
+}
+
+static CMPIStatus _lxc_vsmc_to_vssd(virConnectPtr conn,
+                                    const char *ns,
+                                    struct inst_list *list)
+{
+        CMPIStatus s = {CMPI_RC_OK, NULL};
+        CMPIInstance *inst;
+
+        inst = get_typed_instance(_BROKER,
+                                  pfx_from_conn(conn),
+                                  "VirtualSystemSettingData",
+                                  ns);
+        if (inst == NULL) {
+                cu_statusf(_BROKER, &s,
+                           CMPI_RC_ERR_FAILED,
+                           "Unable to create %s_VSSD instance",
+                           pfx_from_conn(conn));
+                goto out;
+        }
+
+        CMSetProperty(inst, "InitPath",
+                      (CMPIValue *)"/sbin/init", CMPI_chars);
+
+        inst_list_add(list, inst);
+ out:
+        return s;
+}
+
+static CMPIStatus vsmc_to_vssd(const CMPIObjectPath *ref,
+                               struct std_assoc_info *info,
+                               struct inst_list *list)
+{
+        CMPIStatus s;
+        virConnectPtr conn = NULL;
+        const char *cn;
+        const char *ns;
+
+        cn = CLASSNAME(ref);
+        ns = NAMESPACE(ref);
+
+        conn = connect_by_classname(_BROKER, cn, &s);
+        if (conn == NULL)
+                goto out;
+
+        if (STARTS_WITH(cn, "Xen"))
+                s = _xen_vsmc_to_vssd(conn, ns, list);
+        else if (STARTS_WITH(cn, "KVM"))
+                s = _kvm_vsmc_to_vssd(conn, ns, list);
+        else if (STARTS_WITH(cn, "LXC"))
+                s = _lxc_vsmc_to_vssd(conn, ns, list);
+        else
+                cu_statusf(_BROKER, &s,
+                           CMPI_RC_ERR_FAILED,
+                           "Invalid reference");
+
+ out:
+        virConnectClose(conn);
+
+        return s;
+}
 
 static bool rasd_prop_copy_value(struct sdc_rasd_prop src, 
                                  struct sdc_rasd_prop *dest)
@@ -1008,11 +1178,39 @@ static struct std_assoc _vsmsd_to_migrat
         .make_ref = make_ref
 };
 
+static char *vsmc[] = {
+        "Xen_VirtualSystemManagementCapabilities",
+        "KVM_VirtualSystemManagementCapabilities",
+        "LXC_VirtualSystemManagementCapabilities",
+        NULL
+};
+
+static char *vssd[] = {
+        "Xen_VirtualSystemSettingData",
+        "KVM_VirtualSystemSettingData",
+        "LXC_VirtualSystemSettingData",
+        NULL
+};
+
+static struct std_assoc _vsmc_to_vssd = {
+        .source_class = (char**)&vsmc,
+        .source_prop = "GroupComponent",
+
+        .target_class = (char**)&vssd,
+        .target_prop = "PartComponent",
+
+        .assoc_class = (char**)&assoc_classname,
+
+        .handler = vsmc_to_vssd,
+        .make_ref = make_ref
+};
+
 static struct std_assoc *assoc_handlers[] = {
         &_alloc_cap_to_rasd,
         &_rasd_to_alloc_cap,
         &_migrate_cap_to_vsmsd,
         &_vsmsd_to_migrate_cap,
+        &_vsmc_to_vssd,
         NULL
 };
 




More information about the Libvirt-cim mailing list