Connect up domain destroy, suspend, resume, reboot, shutdown methods to driver backends

This commit is contained in:
Daniel P. Berrange 2006-06-14 17:07:00 +00:00
parent 037f413e4e
commit 5cc5f540f0
2 changed files with 108 additions and 57 deletions

View File

@ -1,3 +1,9 @@
Wed Jun 14 11:20:23 EDT 2006 Daniel P. Berrange <berrange@redhat.com>
* src/libvirt.c: connect virDomainDestroy, virDomainSuspend,
virDomainResume, virDomainShutdown & virDomainReboot to the
driver backends.
Wed Jun 14 15:51:00 EDT 2006 Daniel Veillard <veillard@redhat.com> Wed Jun 14 15:51:00 EDT 2006 Daniel Veillard <veillard@redhat.com>
* src/libvirt.c src/xend_internal.c src/xend_internal.h: cleaned up * src/libvirt.c src/xend_internal.c src/xend_internal.h: cleaned up

View File

@ -847,28 +847,35 @@ virDomainLookupByName(virConnectPtr conn, const char *name)
int int
virDomainDestroy(virDomainPtr domain) virDomainDestroy(virDomainPtr domain)
{ {
int ret; int ret = -1, i;
virConnectPtr conn;
if (!VIR_IS_CONNECTED_DOMAIN(domain)) { if (!VIR_IS_CONNECTED_DOMAIN(domain)) {
virLibDomainError(domain, VIR_ERR_INVALID_DOMAIN, __FUNCTION__); virLibDomainError(domain, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
return (-1); return (-1);
} }
/* conn = domain->conn;
* try first with the xend method #if PEDANTIC
*/ if (domain->conn->flags & VIR_CONNECT_RO)
ret = xenDaemonDomainDestroy(domain); return (-1);
if (ret == 0) { #endif
virDomainFree(domain);
return (0); /* Go though the driver registered entry points */
for (i = 0;i < conn->nb_drivers;i++) {
if ((conn->drivers[i] != NULL) &&
(conn->drivers[i]->domainDestroy != NULL)) {
if (conn->drivers[i]->domainDestroy(domain) == 0)
ret = 0;
}
} }
ret = xenHypervisorDestroyDomain(domain); if (ret != 0) {
if (ret < 0) virLibConnError(conn, VIR_ERR_CALL_FAILED, __FUNCTION__);
return (-1); return (ret);
}
virDomainFree(domain); return (ret);
return (0);
} }
/** /**
@ -907,20 +914,35 @@ virDomainFree(virDomainPtr domain)
int int
virDomainSuspend(virDomainPtr domain) virDomainSuspend(virDomainPtr domain)
{ {
int ret; int ret = -1, i;
virConnectPtr conn;
if (!VIR_IS_CONNECTED_DOMAIN(domain)) { if (!VIR_IS_CONNECTED_DOMAIN(domain)) {
virLibDomainError(domain, VIR_ERR_INVALID_DOMAIN, __FUNCTION__); virLibDomainError(domain, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
return (-1); return (-1);
} }
/* first try though the Xen daemon */ conn = domain->conn;
ret = xenDaemonDomainSuspend(domain); #if PEDANTIC
if (ret == 0) if (domain->conn->flags & VIR_CONNECT_RO)
return (0); return (-1);
#endif
/* then try a direct hypervisor access */ /* Go though the driver registered entry points */
return (xenHypervisorPauseDomain(domain)); for (i = 0;i < conn->nb_drivers;i++) {
if ((conn->drivers[i] != NULL) &&
(conn->drivers[i]->domainSuspend != NULL)) {
if (conn->drivers[i]->domainSuspend(domain) == 0)
ret = 0;
}
}
if (ret != 0) {
virLibConnError(conn, VIR_ERR_CALL_FAILED, __FUNCTION__);
return (ret);
}
return (ret);
} }
/** /**
@ -936,20 +958,35 @@ virDomainSuspend(virDomainPtr domain)
int int
virDomainResume(virDomainPtr domain) virDomainResume(virDomainPtr domain)
{ {
int ret; int ret = -1, i;
virConnectPtr conn;
if (!VIR_IS_CONNECTED_DOMAIN(domain)) { if (!VIR_IS_CONNECTED_DOMAIN(domain)) {
virLibDomainError(domain, VIR_ERR_INVALID_DOMAIN, __FUNCTION__); virLibDomainError(domain, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
return (-1); return (-1);
} }
/* first try though the Xen daemon */ conn = domain->conn;
ret = xenDaemonDomainResume(domain); #if PEDANTIC
if (ret == 0) if (domain->conn->flags & VIR_CONNECT_RO)
return (0); return (-1);
#endif
/* then try a direct hypervisor access */ /* Go though the driver registered entry points */
return (xenHypervisorResumeDomain(domain)); for (i = 0;i < conn->nb_drivers;i++) {
if ((conn->drivers[i] != NULL) &&
(conn->drivers[i]->domainResume != NULL)) {
if (conn->drivers[i]->domainResume(domain) == 0)
ret = 0;
}
}
if (ret != 0) {
virLibConnError(conn, VIR_ERR_CALL_FAILED, __FUNCTION__);
return (ret);
}
return (ret);
} }
/** /**
@ -1066,30 +1103,34 @@ virDomainRestore(virConnectPtr conn, const char *from)
int int
virDomainShutdown(virDomainPtr domain) virDomainShutdown(virDomainPtr domain)
{ {
int ret; int ret = -1, i;
virConnectPtr conn;
if (!VIR_IS_CONNECTED_DOMAIN(domain)) { if (!VIR_IS_CONNECTED_DOMAIN(domain)) {
virLibDomainError(domain, VIR_ERR_INVALID_DOMAIN, __FUNCTION__); virLibDomainError(domain, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
return (-1); return (-1);
} }
/* conn = domain->conn;
* try first with the xend daemon #if PEDANTIC
*/ if (domain->conn->flags & VIR_CONNECT_RO)
ret = xenDaemonDomainShutdown(domain); return (-1);
if (ret == 0) { #endif
domain->flags |= DOMAIN_IS_SHUTDOWN;
return (0); /* Go though the driver registered entry points */
for (i = 0;i < conn->nb_drivers;i++) {
if ((conn->drivers[i] != NULL) &&
(conn->drivers[i]->domainShutdown != NULL)) {
if (conn->drivers[i]->domainShutdown(domain) == 0)
ret = 0;
}
} }
/* if (ret != 0) {
* this is very hackish, the domU kernel probes for a special virLibConnError(conn, VIR_ERR_CALL_FAILED, __FUNCTION__);
* node in the xenstore and launch the shutdown command if found. return (ret);
*/
ret = xenDaemonDomainShutdown(domain);
if (ret == 0) {
domain->flags |= DOMAIN_IS_SHUTDOWN;
} }
return (ret); return (ret);
} }
@ -1107,30 +1148,34 @@ virDomainShutdown(virDomainPtr domain)
int int
virDomainReboot(virDomainPtr domain, unsigned int flags) virDomainReboot(virDomainPtr domain, unsigned int flags)
{ {
int ret; int ret = -1, i;
virConnectPtr conn;
if (!VIR_IS_CONNECTED_DOMAIN(domain)) { if (!VIR_IS_CONNECTED_DOMAIN(domain)) {
virLibDomainError(domain, VIR_ERR_INVALID_DOMAIN, __FUNCTION__); virLibDomainError(domain, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
return (-1); return (-1);
} }
/* conn = domain->conn;
* try first with the xend daemon #if PEDANTIC
*/ if (domain->conn->flags & VIR_CONNECT_RO)
ret = xenDaemonDomainReboot(domain, flags); return (-1);
if (ret == 0) { #endif
domain->flags |= DOMAIN_IS_SHUTDOWN;
return (0); /* Go though the driver registered entry points */
for (i = 0;i < conn->nb_drivers;i++) {
if ((conn->drivers[i] != NULL) &&
(conn->drivers[i]->domainReboot != NULL)) {
if (conn->drivers[i]->domainReboot(domain, flags) == 0)
ret = 0;
}
} }
/* if (ret != 0) {
* this is very hackish, the domU kernel probes for a special virLibConnError(conn, VIR_ERR_CALL_FAILED, __FUNCTION__);
* node in the xenstore and launch the shutdown command if found. return (ret);
*/
ret = xenDaemonDomainReboot(domain, flags);
if (ret == 0) {
domain->flags |= DOMAIN_IS_SHUTDOWN;
} }
return (ret); return (ret);
} }