[Libvirt-cim] [PATCH] Set/Reset VM autostart
Chip Vincent
cvincent at linux.vnet.ibm.com
Thu Feb 24 17:22:10 UTC 2011
+1.
The MOF code has the nit regarding cap convesion, but we've already
agreed to clean-up at next schema bump.
On 02/23/2011 09:52 AM, Sharad Mishra wrote:
> # HG changeset patch
> # User Sharad Mishra<snmishra at us.ibm.com>
> # Date 1298472523 28800
> # Node ID 219b9e147e611772e9f540800943653ce73acdfd
> # Parent f3d3d546da029d62d3e5bceec52152a010e2e4b2
> Set/Reset VM autostart.
>
> Support for VM autostart was added few months back, but a defect was opened against libvirt-cim that autostart can only be set during VM creation and cannot be changed later. This patch fixes that issue.
>
> Signed-off-by: Sharad Mishra<snmishra at us.ibm.com>
>
> diff -r f3d3d546da02 -r 219b9e147e61 libxkutil/device_parsing.c
> --- a/libxkutil/device_parsing.c Thu Feb 17 12:00:51 2011 -0800
> +++ b/libxkutil/device_parsing.c Wed Feb 23 06:48:43 2011 -0800
> @@ -1086,12 +1086,17 @@
> {
> char *xml;
> int ret;
> + int start;
> xml = virDomainGetXMLDesc(dom, 0);
>
> if (xml == NULL)
> return 0;
>
> ret = get_dominfo_from_xml(xml, dominfo);
> + if (virDomainGetAutostart(dom,&start) != 0)
> + return 0;
> +
> + (*dominfo)->autostrt = start;
>
> free(xml);
>
> diff -r f3d3d546da02 -r 219b9e147e61 libxkutil/device_parsing.h
> --- a/libxkutil/device_parsing.h Thu Feb 17 12:00:51 2011 -0800
> +++ b/libxkutil/device_parsing.h Wed Feb 23 06:48:43 2011 -0800
> @@ -136,13 +136,13 @@
> char *name;
> char *typestr; /*xen, kvm, etc */
> char *uuid;
> - int autostart;
> char *bootloader;
> char *bootloader_args;
> char *clock;
> bool acpi;
> bool apic;
> bool pae;
> + int autostrt;
>
> union {
> struct pv_os_info pv;
> diff -r f3d3d546da02 -r 219b9e147e61 schema/ComputerSystem.mof
> --- a/schema/ComputerSystem.mof Thu Feb 17 12:00:51 2011 -0800
> +++ b/schema/ComputerSystem.mof Wed Feb 23 06:48:43 2011 -0800
> @@ -10,9 +10,6 @@
> [Description("UUID assigned to this DomU.")]
> string UUID;
>
> - [Description("Flag to set VM autostart.")]
> - string autoStart;
> -
> };
>
> [Description (
> @@ -26,9 +23,6 @@
> [Description("UUID assigned to this virtual machine.")]
> string UUID;
>
> - [Description("Flag to set VM autostart.")]
> - string autoStart;
> -
> };
>
> [Description (
> @@ -42,8 +36,5 @@
> [Description("UUID assigned to this virtual machine.")]
> string UUID;
>
> - [Description("Flag to set VM autostart.")]
> - string autoStart;
> -
> };
>
> diff -r f3d3d546da02 -r 219b9e147e61 schema/Virt_VSSD.mof
> --- a/schema/Virt_VSSD.mof Thu Feb 17 12:00:51 2011 -0800
> +++ b/schema/Virt_VSSD.mof Wed Feb 23 06:48:43 2011 -0800
> @@ -24,4 +24,7 @@
> [Description ("Flag to determine whether this guest has pae enabled")]
> boolean EnablePAE;
>
> + [Description ("Flag to determine whether this guest has to be autostarted on reboot")]
> + uint16 AutoStart;
> +
> };
> diff -r f3d3d546da02 -r 219b9e147e61 src/Virt_ComputerSystem.c
> --- a/src/Virt_ComputerSystem.c Thu Feb 17 12:00:51 2011 -0800
> +++ b/src/Virt_ComputerSystem.c Wed Feb 23 06:48:43 2011 -0800
> @@ -65,33 +65,6 @@
> return 1;
> }
>
> -/* Set the "autoStart" property of an instance from a domain */
> -static int set_autostart_from_dom(virDomainPtr dom,
> - CMPIInstance *instance,
> - struct domain *dominfo)
> -{
> - int autoFlag = 0;
> - char autovalue[16];
> -
> - if((virDomainGetAutostart(dom,&autoFlag)) == -1) {
> - CU_DEBUG("Could not read autostart value from xml");
> - } else {
> - CU_DEBUG("Autostart for current domain is set to %d",
> - autoFlag);
> - dominfo->autostart = autoFlag;
> - }
> -
> - if(autoFlag)
> - strcpy(autovalue, "enable");
> - else
> - strcpy(autovalue, "disable");
> -
> - CMSetProperty(instance, "autoStart",
> - (CMPIValue *)autovalue, CMPI_chars);
> -
> - return 1;
> -}
> -
> /* Set the "UUID" property of an instance from a domain */
> static int set_uuid_from_dom(virDomainPtr dom,
> CMPIInstance *instance,
> @@ -526,15 +499,6 @@
> goto out;
> }
>
> - if (!set_autostart_from_dom(dom, instance, domain)) {
> - virt_set_status(broker,&s,
> - CMPI_RC_ERR_FAILED,
> - virDomainGetConnect(dom),
> - "Unable to get domain autostart flag");
> -
> - goto out;
> - }
> -
> if (!set_uuid_from_dom(dom, instance,&uuid)) {
> virt_set_status(broker,&s,
> CMPI_RC_ERR_FAILED,
> diff -r f3d3d546da02 -r 219b9e147e61 src/Virt_VSSD.c
> --- a/src/Virt_VSSD.c Thu Feb 17 12:00:51 2011 -0800
> +++ b/src/Virt_VSSD.c Wed Feb 23 06:48:43 2011 -0800
> @@ -220,6 +220,9 @@
> CMSetProperty(inst, "EnablePAE",
> (CMPIValue *)&dominfo->pae, CMPI_boolean);
>
> + CMSetProperty(inst, "AutoStart",
> + (CMPIValue *)&dominfo->autostrt, CMPI_uint16);
> +
> if (dominfo->clock != NULL) {
> uint16_t clock = VSSD_CLOCK_UTC;
>
> diff -r f3d3d546da02 -r 219b9e147e61 src/Virt_VirtualSystemManagementService.c
> --- a/src/Virt_VirtualSystemManagementService.c Thu Feb 17 12:00:51 2011 -0800
> +++ b/src/Virt_VirtualSystemManagementService.c Wed Feb 23 06:48:43 2011 -0800
> @@ -1374,8 +1374,6 @@
> virDomainPtr dom;
> const char *name;
> CMPIInstance *inst = NULL;
> - const char *autoStartFlag = NULL;
> - int autoflag;
>
> conn = connect_by_classname(_BROKER, CLASSNAME(ref), s);
> if (conn == NULL) {
> @@ -1404,19 +1402,6 @@
> goto out;
> }
>
> - if (inst != NULL) {
> - if (cu_get_str_prop(inst, "autoStart",
> -&autoStartFlag) != CMPI_RC_OK)
> - autoStartFlag = strdup("disable");
> -
> - if (STREQ(autoStartFlag, "enable"))
> - autoflag = 1;
> - else
> - autoflag = 0;
> - if((virDomainSetAutostart(dom, autoflag)) == -1)
> - CU_DEBUG("Failed to set autostart flag.");
> - }
> -
> out:
> virDomainFree(dom);
> virConnectClose(conn);
> @@ -1663,6 +1648,74 @@
>
> }
>
> +static CMPIStatus set_autostart(CMPIInstance *vssd,
> + const CMPIObjectPath *ref,
> + virDomainPtr dom)
> +{
> + CMPIStatus s;
> + const char *name = NULL;
> + CMPIrc ret;
> + virConnectPtr conn = NULL;
> + virDomainPtr inst_dom = NULL;
> + uint16_t val = 0;
> + int i = 0;
> +
> + CU_DEBUG("Enter set_autostart");
> + ret = cu_get_str_prop(vssd, "VirtualSystemIdentifier",&name);
> + if (ret != CMPI_RC_OK) {
> + CU_DEBUG("Missing VirtualSystemIdentifier");
> + cu_statusf(_BROKER,&s,
> + ret,
> + "Missing VirtualSystemIdentifier");
> + goto out;
> + }
> +
> + conn = connect_by_classname(_BROKER, CLASSNAME(ref),&s);
> + if (conn == NULL) {
> + CU_DEBUG("Failed to connect");
> + cu_statusf(_BROKER,&s,
> + CMPI_RC_ERR_FAILED,
> + "Failed to connect");
> + goto out;
> + }
> +
> + inst_dom = virDomainLookupByName(conn, name);
> + if (inst_dom == NULL) {
> + CU_DEBUG("reference domain '%s' does not exist", name);
> + virt_set_status(_BROKER,&s,
> + CMPI_RC_ERR_NOT_FOUND,
> + conn,
> + "Referenced domain `%s' does not exist", name);
> + goto out;
> + }
> +
> + if (cu_get_u16_prop(vssd, "AutoStart",&val) != CMPI_RC_OK) {
> + if (dom != NULL) {
> + /* Read the current domain's autostart setting.
> + Since the user did not specify any new
> + autostart, the updated VM will use the same
> + autostart setting as used before this
> + update. */
> + if (virDomainGetAutostart(dom,&i) != 0)
> + i = 0;
> + }
> + }
> + else
> + i = val;
> + CU_DEBUG("setting VM's autostart to %d", i);
> + if (virDomainSetAutostart(inst_dom, i) == -1) {
> + CU_DEBUG("Failed to set autostart");
> + cu_statusf(_BROKER,&s,
> + CMPI_RC_ERR_FAILED,
> + "Failed to set autostart");
> + }
> +
> + out:
> + virDomainFree(inst_dom);
> + virConnectClose(conn);
> + return s;
> +}
> +
> static CMPIInstance *create_system(const CMPIContext *context,
> CMPIInstance *vssd,
> CMPIArray *resources,
> @@ -1673,15 +1726,13 @@
> CMPIInstance *inst = NULL;
> char *xml = NULL;
> const char *msg = NULL;
> - virConnectPtr conn = NULL;
> - virDomainPtr dom = NULL;
> struct inst_list list;
> const char *props[] = {NULL};
> -
> struct domain *domain = NULL;
>
> inst_list_init(&list);
>
> + CU_DEBUG("Enter create_system");
> if (refconf != NULL) {
> *s = get_reference_domain(&domain, ref, refconf);
> if (s->rc != CMPI_RC_OK)
> @@ -1731,6 +1782,7 @@
> inst = connect_and_create(xml, ref, s);
> if (inst != NULL) {
> update_dominfo(domain, CLASSNAME(ref));
> + set_autostart(vssd, ref, NULL);
>
> *s = enum_rasds(_BROKER,
> ref,
> @@ -1755,8 +1807,6 @@
> out:
> cleanup_dominfo(&domain);
> free(xml);
> - virDomainFree(dom);
> - virConnectClose(conn);
> inst_list_free(&list);
>
> return inst;
> @@ -1943,6 +1993,7 @@
> char *xml = NULL;
> const char *uuid = NULL;
>
> + CU_DEBUG("Enter update_system_settings");
> ret = cu_get_str_prop(vssd, "VirtualSystemIdentifier",&name);
> if (ret != CMPI_RC_OK) {
> cu_statusf(_BROKER,&s,
> @@ -2002,6 +2053,7 @@
> }
>
> if (s.rc == CMPI_RC_OK) {
> + set_autostart(vssd, ref, dom);
> trigger_indication(context,
> "ComputerSystemModifiedIndication",
> ref);
>
> _______________________________________________
> Libvirt-cim mailing list
> Libvirt-cim at redhat.com
> https://www.redhat.com/mailman/listinfo/libvirt-cim
--
Chip Vincent
Open Virtualization
IBM Linux Technology Center
cvincent at linux.vnet.ibm.com
More information about the Libvirt-cim
mailing list