On 10/21/20 10:46 AM, Matt Coleman wrote:
Co-authored-by: Sri Ramanujam <sramanujam(a)datto.com>
Signed-off-by: Matt Coleman <matt(a)datto.com>
---
src/hyperv/hyperv_driver.c | 77 ++++++++++++++++++++++++++
src/hyperv/hyperv_wmi_generator.input | 78 +++++++++++++++++++++++++++
2 files changed, 155 insertions(+)
diff --git a/src/hyperv/hyperv_driver.c b/src/hyperv/hyperv_driver.c
index 4bddc86273..791f34444d 100644
--- a/src/hyperv/hyperv_driver.c
+++ b/src/hyperv/hyperv_driver.c
@@ -941,6 +941,81 @@ hypervDomainResume(virDomainPtr domain)
+static int
+hypervDomainShutdownFlags(virDomainPtr domain, unsigned int flags)
+{
+ int result = -1;
+ hypervPrivate *priv = domain->conn->privateData;
+ Msvm_ComputerSystem *computerSystem = NULL;
+ Msvm_ShutdownComponent *shutdown = NULL;
+ bool in_transition = false;
+ char uuid[VIR_UUID_STRING_BUFLEN];
+ g_auto(virBuffer) query = VIR_BUFFER_INITIALIZER;
+ g_autoptr(hypervInvokeParamsList) params = NULL;
+ g_autofree char *selector = NULL;
+
+ virCheckFlags(0, -1);
+
+ virUUIDFormat(domain->uuid, uuid);
+
+ if (hypervMsvmComputerSystemFromDomain(domain, &computerSystem) < 0)
+ goto cleanup;
+
+ if (!hypervIsMsvmComputerSystemActive(computerSystem, &in_transition) ||
+ in_transition) {
+ virReportError(VIR_ERR_OPERATION_INVALID, "%s",
+ _("Domain is not active or in state transition"));
+ goto cleanup;
+ }
+
+ virBufferEscapeSQL(&query, MSVM_SHUTDOWNCOMPONENT_WQL_SELECT "WHERE
SystemName = '%s'", uuid);
+
+ if (hypervGetWmiClass(Msvm_ShutdownComponent, &shutdown) < 0 ||
+ !shutdown) {
+ virReportError(VIR_ERR_OPERATION_FAILED,
+ _("Could not get Msvm_ShutdownComponent for domain with UUID
'%s'"),
+ uuid);
+ goto cleanup;
+ }
+
+ selector =
g_strdup_printf("CreationClassName=\"Msvm_ShutdownComponent\"&DeviceID=\"%s\"&"
+
"SystemCreationClassName=\"Msvm_ComputerSystem\"&SystemName=\"%s\"",
+ shutdown->data.common->DeviceID, uuid);
+
+ params = hypervCreateInvokeParamsList(priv, "InitiateShutdown", selector,
+ Msvm_ShutdownComponent_WmiInfo);
+
+ hypervAddSimpleParam(params, "Force", "False");
+
+ /* "Reason" is not translated because the Hyper-V administrator may not
+ * know the libvirt user's language. They may not know English, either,
+ * but this makes it consistent, at least. */
+ hypervAddSimpleParam(params, "Reason", "Planned shutdown via
libvirt");
+
+ if (hypervInvokeMethod(priv, ¶ms, NULL) < 0) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, _("Could not shutdown domain with
UUID '%s'"), uuid);
Again, no need to overwrite the error message.
+ goto cleanup;
+ }
+
+ result = 0;
+
+ cleanup:
+ hypervFreeObject(priv, (hypervObject *) computerSystem);
+ hypervFreeObject(priv, (hypervObject *) shutdown);
+
+ return result;
+}
Michal