[libvirt] [PATCH 07/16] hyperv: implement ability to send xml soap requests
Matthias Bolte
matthias.bolte at googlemail.com
Fri Sep 16 17:53:02 UTC 2016
2016-08-09 14:39 GMT+02:00 Jason Miesionczek <jmiesionczek at datto.com>:
> also added ability to get/set auto start
> ---
> src/hyperv/hyperv_driver.c | 101 +++++++
> src/hyperv/hyperv_wmi.c | 670 ++++++++++++++++++++++++++++++++++++++++++++-
> src/hyperv/hyperv_wmi.h | 58 ++++
> src/hyperv/openwsman.h | 4 +
> 4 files changed, 827 insertions(+), 6 deletions(-)
>
> diff --git a/src/hyperv/hyperv_driver.c b/src/hyperv/hyperv_driver.c
> index 861d5ab..aea7837 100644
> --- a/src/hyperv/hyperv_driver.c
> +++ b/src/hyperv/hyperv_driver.c
> @@ -1604,6 +1604,105 @@ hypervNodeGetFreeMemory(virConnectPtr conn)
> return res;
> }
>
> +static int
> +hypervDomainSetAutostart(virDomainPtr domain, int autostart)
> +{
> + int result = -1;
> + invokeXmlParam *params = NULL;
> + hypervPrivate *priv = domain->conn->privateData;
> + virBuffer query = VIR_BUFFER_INITIALIZER;
> + virBuffer queryVssd = VIR_BUFFER_INITIALIZER;
> + Msvm_VirtualSystemSettingData *virtualSystemSettingData = NULL;
> + properties_t *tab_props = NULL;
> + eprParam eprparam;
> + embeddedParam embeddedparam;
These types are not properly named. The all need a hyperv prefix and
should not have _t suffixed.
> + int nb_params;
> + char uuid_string[VIR_UUID_STRING_BUFLEN];
> + const char *selector = "CreationClassName=Msvm_VirtualSystemManagementService";
> +
> + virUUIDFormat(domain->uuid, uuid_string);
> +
> + /* Prepare EPR param */
> + virBufferAddLit(&query, MSVM_COMPUTERSYSTEM_WQL_SELECT);
> + virBufferAsprintf(&query, "where Name = \"%s\"", uuid_string);
> + eprparam.query = &query;
> + eprparam.wmiProviderURI = ROOT_VIRTUALIZATION;
> +
> + /* Prepare EMBEDDED param */
> + virBufferAsprintf(&queryVssd,
> + "associators of "
> + "{Msvm_ComputerSystem.CreationClassName=\"Msvm_ComputerSystem\","
> + "Name=\"%s\"} "
> + "where AssocClass = Msvm_SettingsDefineState "
> + "ResultClass = Msvm_VirtualSystemSettingData",
> + uuid_string);
> +
> + if (hypervGetMsvmVirtualSystemSettingDataList(priv, &queryVssd, &virtualSystemSettingData) < 0)
> + goto cleanup;
> +
> + embeddedparam.nbProps = 2;
> + if (VIR_ALLOC_N(tab_props, embeddedparam.nbProps) < 0)
> + goto cleanup;
> + (*tab_props).name = "AutomaticStartupAction";
> + (*tab_props).val = autostart ? "2" : "0";
> + (*(tab_props+1)).name = "InstanceID";
> + (*(tab_props+1)).val = virtualSystemSettingData->data->InstanceID;
Why do you do a VIR_ALLOC_N here? You know the number of elements at
compile time and the array doesn't have to life after the call to
hypervDomainSetAutostart.
You can turn this into a stack allocation.
Also, as pointed out earlier, the names should be converted from
strings to enum/int values. Those can then be used for an O(1) index
based lookup instead of an O(n) string based lookup.
--
Matthias Bolte
http://photron.blogspot.com
More information about the libvir-list
mailing list