# HG changeset patch
# User Richard Maciel <rmaciel(a)linux.vnet.ibm.com>
# Date 1242218025 10800
# Node ID b188a6d5bfea59ab1aae26be4b62817a5a414f4e
# Parent c0bd6c9a2c0084398784bb1ae36649bd3400e36c
Add boot order support
Signed-off-by: Richard Maciel <rmaciel(a)linux.vnet.ibm.com>
diff -r c0bd6c9a2c00 -r b188a6d5bfea libxkutil/device_parsing.c
--- a/libxkutil/device_parsing.c Mon May 11 16:47:15 2009 -0300
+++ b/libxkutil/device_parsing.c Wed May 13 09:33:45 2009 -0300
@@ -810,6 +810,9 @@
static int parse_os(struct domain *dominfo, xmlNode *os)
{
xmlNode *child;
+ char **blist = NULL;
+ char **tmp_list = NULL;
+ unsigned bl_size = 0;
for (child = os->children; child != NULL; child = child->next) {
if (XSTREQ(child->name, "type"))
@@ -822,10 +825,23 @@
STRPROP(dominfo, os_info.pv.cmdline, child);
else if (XSTREQ(child->name, "loader"))
STRPROP(dominfo, os_info.fv.loader, child);
- else if (XSTREQ(child->name, "boot"))
- dominfo->os_info.fv.boot = get_attr_value(child,
- "dev");
- else if (XSTREQ(child->name, "init"))
+ else if (XSTREQ(child->name, "boot")) {
+ //dominfo->os_info.fv.boot = get_attr_value(child,
+ //"dev");
+ bl_size++;
+
+ tmp_list = (char **)realloc(blist,
+ bl_size * sizeof(char *));
+ if (tmp_list == NULL) {
+ // Nothing you can do. Just go on.
+ CU_DEBUG("Could not alloc space for "
+ "boot device");
+ bl_size--;
+ continue;
+ }
+
+ blist[bl_size - 1] = get_attr_value(child, "dev");
+ } else if (XSTREQ(child->name, "init"))
STRPROP(dominfo, os_info.lxc.init, child);
}
@@ -843,6 +859,9 @@
else
dominfo->type = -1;
+ dominfo->os_info.fv.bootlist = blist;
+ dominfo->os_info.fv.bootlist_size = bl_size;
+
return 1;
}
@@ -1001,9 +1020,15 @@
free(dom->os_info.pv.cmdline);
} else if ((dom->type == DOMAIN_XENFV) ||
(dom->type == DOMAIN_KVM) || (dom->type == DOMAIN_QEMU)) {
+ int i;
+
free(dom->os_info.fv.type);
free(dom->os_info.fv.loader);
- free(dom->os_info.fv.boot);
+
+ for (i = 0; i < dom->os_info.fv.bootlist_size; i++) {
+ free(dom->os_info.fv.bootlist[i]);
+ }
+ free(dom->os_info.fv.bootlist);
} else if (dom->type == DOMAIN_LXC) {
free(dom->os_info.lxc.type);
free(dom->os_info.lxc.init);
diff -r c0bd6c9a2c00 -r b188a6d5bfea libxkutil/device_parsing.h
--- a/libxkutil/device_parsing.h Mon May 11 16:47:15 2009 -0300
+++ b/libxkutil/device_parsing.h Wed May 13 09:33:45 2009 -0300
@@ -99,7 +99,9 @@
struct fv_os_info {
char *type; /* Should always be 'hvm' */
char *loader;
- char *boot;
+ unsigned bootlist_size;
+ char **bootlist;
+ //char *boot;
};
struct lxc_os_info {
diff -r c0bd6c9a2c00 -r b188a6d5bfea libxkutil/xml_parse_test.c
--- a/libxkutil/xml_parse_test.c Mon May 11 16:47:15 2009 -0300
+++ b/libxkutil/xml_parse_test.c Wed May 13 09:33:45 2009 -0300
@@ -28,6 +28,7 @@
static void print_os(struct domain *dom,
FILE *d)
{
+ int i;
if (dom->type == DOMAIN_XENPV) {
print_value(d, "Domain Type", "Xen PV");
@@ -39,13 +40,18 @@
print_value(d, "Domain Type", "Xen FV");
print_value(d, "Type", dom->os_info.fv.type);
print_value(d, "Loader", dom->os_info.fv.loader);
- print_value(d, "Boot", dom->os_info.fv.boot);
+ for (i = 0; i < dom->os_info.fv.bootlist_size; i++) {
+ print_value(d, "Boot",
dom->os_info.fv.bootlist[i]);
+ }
} else if ((dom->type == DOMAIN_KVM) || (dom->type == DOMAIN_QEMU)) {
print_value(d, "Domain Type", "KVM/QEMU");
print_value(d, "Type", dom->os_info.fv.type);
print_value(d, "Loader", dom->os_info.fv.loader);
- print_value(d, "Boot", dom->os_info.fv.boot);
+
+ for (i = 0; i < dom->os_info.fv.bootlist_size; i++) {
+ print_value(d, "Boot",
dom->os_info.fv.bootlist[i]);
+ }
} else if (dom->type == DOMAIN_LXC) {
print_value(d, "Init", dom->os_info.lxc.init);
} else {
diff -r c0bd6c9a2c00 -r b188a6d5bfea libxkutil/xmlgen.c
--- a/libxkutil/xmlgen.c Mon May 11 16:47:15 2009 -0300
+++ b/libxkutil/xmlgen.c Wed May 13 09:33:45 2009 -0300
@@ -439,6 +439,7 @@
{
struct fv_os_info *os = &domain->os_info.fv;
xmlNodePtr tmp;
+ unsigned i;
if (os->type == NULL)
os->type = strdup("hvm");
@@ -446,8 +447,13 @@
if (os->loader == NULL)
os->loader = strdup("/usr/lib/xen/boot/hvmloader");
- if (os->boot == NULL)
- os->boot = strdup("hd");
+ //if (os->boot == NULL)
+ // os->boot = strdup("hd");
+ if (os->bootlist_size == 0) {
+ os->bootlist_size = 1;
+ os->bootlist = (char **)calloc(1, sizeof(char *));
+ os->bootlist[0] = strdup("hd");
+ }
tmp = xmlNewChild(root, NULL, BAD_CAST "type", BAD_CAST os->type);
if (tmp == NULL)
@@ -457,11 +463,13 @@
if (tmp == NULL)
return XML_ERROR;
- tmp = xmlNewChild(root, NULL, BAD_CAST "boot", NULL);
- if (tmp == NULL)
- return XML_ERROR;
+ for (i = 0; i < os->bootlist_size; i++) {
+ tmp = xmlNewChild(root, NULL, BAD_CAST "boot", NULL);
+ if (tmp == NULL)
+ return XML_ERROR;
- xmlNewProp(tmp, BAD_CAST "dev", BAD_CAST os->boot);
+ xmlNewProp(tmp, BAD_CAST "dev", BAD_CAST os->bootlist[i]);
+ }
tmp = xmlNewChild(root, NULL, BAD_CAST "features", NULL);
xmlNewChild(tmp, NULL, BAD_CAST "pae", NULL);
@@ -475,21 +483,28 @@
{
struct fv_os_info *os = &domain->os_info.fv;
xmlNodePtr tmp;
+ unsigned i;
if (os->type == NULL)
os->type = strdup("hvm");
- if (os->boot == NULL)
- os->boot = strdup("hd");
+ if (os->bootlist_size == 0) {
+ os->bootlist_size = 1;
+ os->bootlist = (char **)calloc(1, sizeof(char *));
+ os->bootlist[0] = strdup("hd");
+ }
tmp = xmlNewChild(root, NULL, BAD_CAST "type", BAD_CAST os->type);
if (tmp == NULL)
return XML_ERROR;
- tmp = xmlNewChild(root, NULL, BAD_CAST "boot", NULL);
- if (tmp == NULL)
- return XML_ERROR;
- xmlNewProp(tmp, BAD_CAST "dev", BAD_CAST os->boot);
+ for (i = 0; i < os->bootlist_size; i++) {
+ tmp = xmlNewChild(root, NULL, BAD_CAST "boot", NULL);
+ if (tmp == NULL)
+ return XML_ERROR;
+
+ xmlNewProp(tmp, BAD_CAST "dev", BAD_CAST os->bootlist[i]);
+ }
return NULL;
}
diff -r c0bd6c9a2c00 -r b188a6d5bfea schema/VSSD.mof
--- a/schema/VSSD.mof Mon May 11 16:47:15 2009 -0300
+++ b/schema/VSSD.mof Wed May 13 09:33:45 2009 -0300
@@ -27,7 +27,7 @@
[Description ("The device to boot from when in fully-virtualized mode."
"One of hd,fd,cdrom.")]
- string BootDevice;
+ string BootDevices[];
[Description ("The emulator the guest should use during runtime.")]
string Emulator;
@@ -42,8 +42,8 @@
class KVM_VirtualSystemSettingData : Virt_VirtualSystemSettingData
{
- [Description ("The device to boot from. One of hd,fd,cdrom.")]
- string BootDevice;
+ [Description ("The list of devices to boot from. hd,fd,cdrom.")]
+ string BootDevices[];
[Description ("The emulator the guest should use during runtime.")]
string Emulator;
diff -r c0bd6c9a2c00 -r b188a6d5bfea src/Virt_VSSD.c
--- a/src/Virt_VSSD.c Mon May 11 16:47:15 2009 -0300
+++ b/src/Virt_VSSD.c Wed May 13 09:33:45 2009 -0300
@@ -42,16 +42,50 @@
CMPIInstance *inst)
{
bool fv = true;
+ CMPIArray *array;
if (dominfo->type == DOMAIN_XENFV)
CMSetProperty(inst, "IsFullVirt",
(CMPIValue *)&fv, CMPI_boolean);
- if (dominfo->os_info.fv.boot != NULL)
- CMSetProperty(inst,
- "BootDevice",
- (CMPIValue *)dominfo->os_info.fv.boot,
- CMPI_chars);
+ if (dominfo->os_info.fv.bootlist_size > 0) {
+ CMPICount i;
+ CMPICount bl_size;
+ CMPIStatus s;
+
+ bl_size = (CMPICount)dominfo->os_info.fv.bootlist_size;
+
+ array = CMNewArray(_BROKER,
+ bl_size,
+ CMPI_string,
+ &s);
+
+ if (s.rc != CMPI_RC_OK)
+ CU_DEBUG("Error creating BootDevice list");
+
+ for (i = 0; i < bl_size; i++) {
+ CMPIString *cm_str;
+
+ cm_str = CMNewString(_BROKER,
+ (const char
*)dominfo->os_info.fv.bootlist[i],
+ &s);
+ if (s.rc != CMPI_RC_OK)
+ CU_DEBUG("Error adding item to BootDevice "
+ "list");
+ }
+
+ s = CMSetProperty(inst,
+ "BootDevices",
+ (CMPIValue *)array,
+ CMPI_stringA);
+
+ if (s.rc != CMPI_RC_OK)
+ CU_DEBUG("Error setting BootDevices property");
+
+ //CMSetProperty(inst,
+ // "BootDevices",
+ // (CMPIValue *)dominfo->os_info.fv.boot);
+ }
}
static void _set_pv_prop(struct domain *dominfo,
diff -r c0bd6c9a2c00 -r b188a6d5bfea src/Virt_VirtualSystemManagementService.c
--- a/src/Virt_VirtualSystemManagementService.c Mon May 11 16:47:15 2009 -0300
+++ b/src/Virt_VirtualSystemManagementService.c Wed May 13 09:33:45 2009 -0300
@@ -202,7 +202,13 @@
const char *pfx)
{
int ret;
+ CMPICount i;
const char *val;
+ CMPIArray *bootlist;
+ CMPIStatus s;
+ CMPIData boot_elem;
+ char **tmp_str_arr;
+
if (STREQC(pfx, "KVM")) {
if (system_has_kvm(pfx))
@@ -216,12 +222,75 @@
return 0;
}
- ret = cu_get_str_prop(inst, "BootDevice", &val);
- if (ret != CMPI_RC_OK)
- val = "hd";
+ for (i = 0; i < domain->os_info.fv.bootlist_size; i++)
+ free(domain->os_info.fv.bootlist[i]);
- free(domain->os_info.fv.boot);
- domain->os_info.fv.boot = strdup(val);
+ ret = cu_get_array_prop(inst, "BootDevices", &bootlist);
+
+ if (ret == CMPI_RC_OK) {
+ CMPICount bl_size;
+
+ bl_size = CMGetArrayCount(bootlist, &s);
+ if (s.rc != CMPI_RC_OK) {
+ CU_DEBUG("Invalid BootDevice array size");
+ return 0;
+ }
+
+ tmp_str_arr = (char **)realloc(domain->os_info.fv.bootlist,
+ bl_size * sizeof(char *));
+
+ if (tmp_str_arr == NULL) {
+ CU_DEBUG("Could not alloc BootDevices array");
+ return 0;
+ }
+
+ for (i = 0; i < bl_size; i++) {
+ CMPIString *cmpi_str;
+ const char *str;
+
+ boot_elem = CMGetArrayElementAt(bootlist,
+ i,
+ NULL);
+
+ if (CMIsNullValue(boot_elem)) {
+ CU_DEBUG("Null BootDevice");
+ return 0;
+ }
+
+ cmpi_str = boot_elem.value.string;
+
+ free(domain->os_info.fv.bootlist[i]);
+ CU_DEBUG("Freed item from bootlist");
+
+ str = cmpi_str->ft->getCharPtr(cmpi_str, &s);
+
+ if (s.rc != CMPI_RC_OK) {
+ CU_DEBUG("Could not extract char pointer from
"
+ "CMPIArray");
+ }
+
+ tmp_str_arr[i] = strdup(str);
+ }
+ domain->os_info.fv.bootlist_size = bl_size;
+ domain->os_info.fv.bootlist = tmp_str_arr;
+
+ } else {
+
+ CU_DEBUG("Failed to get BootDevices property");
+
+ tmp_str_arr = (char **)realloc(domain->os_info.fv.bootlist,
+ sizeof(char *));
+ if (tmp_str_arr == NULL)
+ return 0;
+
+ tmp_str_arr[0] = strdup("hd");
+
+ domain->os_info.fv.bootlist = tmp_str_arr;
+ domain->os_info.fv.bootlist_size = 1;
+ }
+
+ //free(domain->os_info.fv.boot);
+ //domain->os_info.fv.boot = strdup(val);
ret = cu_get_str_prop(inst, "Emulator", &val);
if (ret != CMPI_RC_OK)