1
0

qemu: Refactor hotplug to introduce qemuDomain{Add|Del}TLSObjects

Refactor the TLS object adding code to make two separate API's that will
handle the add/remove of the "secret" and "tls-creds-x509" objects including
the Enter/Exit monitor commands.

Signed-off-by: John Ferlan <jferlan@redhat.com>
This commit is contained in:
John Ferlan 2017-02-16 10:33:35 -05:00
parent e49af42c22
commit ee4f382a9c
2 changed files with 107 additions and 71 deletions

View File

@ -1528,6 +1528,85 @@ qemuDomainAttachHostPCIDevice(virQEMUDriverPtr driver,
} }
void
qemuDomainDelTLSObjects(virQEMUDriverPtr driver,
virDomainObjPtr vm,
const char *secAlias,
const char *tlsAlias)
{
qemuDomainObjPrivatePtr priv = vm->privateData;
virErrorPtr orig_err;
if (!tlsAlias && !secAlias)
return;
orig_err = virSaveLastError();
qemuDomainObjEnterMonitor(driver, vm);
if (tlsAlias)
ignore_value(qemuMonitorDelObject(priv->mon, tlsAlias));
if (secAlias)
ignore_value(qemuMonitorDelObject(priv->mon, secAlias));
ignore_value(qemuDomainObjExitMonitor(driver, vm));
if (orig_err) {
virSetError(orig_err);
virFreeError(orig_err);
}
}
int
qemuDomainAddTLSObjects(virQEMUDriverPtr driver,
virDomainObjPtr vm,
const char *secAlias,
virJSONValuePtr *secProps,
const char *tlsAlias,
virJSONValuePtr *tlsProps)
{
qemuDomainObjPrivatePtr priv = vm->privateData;
int rc;
virErrorPtr orig_err;
if (!tlsAlias && !secAlias)
return 0;
qemuDomainObjEnterMonitor(driver, vm);
if (secAlias) {
rc = qemuMonitorAddObject(priv->mon, "secret",
secAlias, *secProps);
*secProps = NULL; /* qemuMonitorAddObject consumes */
if (rc < 0)
goto error;
}
if (tlsAlias) {
rc = qemuMonitorAddObject(priv->mon, "tls-creds-x509",
tlsAlias, *tlsProps);
*tlsProps = NULL; /* qemuMonitorAddObject consumes */
if (rc < 0)
goto error;
}
return qemuDomainObjExitMonitor(driver, vm);
error:
orig_err = virSaveLastError();
ignore_value(qemuDomainObjExitMonitor(driver, vm));
if (orig_err) {
virSetError(orig_err);
virFreeError(orig_err);
}
qemuDomainDelTLSObjects(driver, vm, secAlias, tlsAlias);
return -1;
}
static int static int
qemuDomainGetChardevTLSObjects(virQEMUDriverConfigPtr cfg, qemuDomainGetChardevTLSObjects(virQEMUDriverConfigPtr cfg,
qemuDomainObjPrivatePtr priv, qemuDomainObjPrivatePtr priv,
@ -1584,8 +1663,6 @@ int qemuDomainAttachRedirdevDevice(virConnectPtr conn,
char *charAlias = NULL; char *charAlias = NULL;
char *devstr = NULL; char *devstr = NULL;
bool chardevAdded = false; bool chardevAdded = false;
bool tlsobjAdded = false;
bool secobjAdded = false;
virJSONValuePtr tlsProps = NULL; virJSONValuePtr tlsProps = NULL;
virJSONValuePtr secProps = NULL; virJSONValuePtr secProps = NULL;
char *tlsAlias = NULL; char *tlsAlias = NULL;
@ -1621,26 +1698,12 @@ int qemuDomainAttachRedirdevDevice(virConnectPtr conn,
&secProps, &secAlias) < 0) &secProps, &secAlias) < 0)
goto cleanup; goto cleanup;
if (qemuDomainAddTLSObjects(driver, vm, secAlias, &secProps,
tlsAlias, &tlsProps) < 0)
goto audit;
qemuDomainObjEnterMonitor(driver, vm); qemuDomainObjEnterMonitor(driver, vm);
if (secAlias) {
rc = qemuMonitorAddObject(priv->mon, "secret",
secAlias, secProps);
secProps = NULL;
if (rc < 0)
goto exit_monitor;
secobjAdded = true;
}
if (tlsAlias) {
rc = qemuMonitorAddObject(priv->mon, "tls-creds-x509",
tlsAlias, tlsProps);
tlsProps = NULL; /* qemuMonitorAddObject consumes */
if (rc < 0)
goto exit_monitor;
tlsobjAdded = true;
}
if (qemuMonitorAttachCharDev(priv->mon, if (qemuMonitorAttachCharDev(priv->mon,
charAlias, charAlias,
redirdev->source) < 0) redirdev->source) < 0)
@ -1674,15 +1737,12 @@ int qemuDomainAttachRedirdevDevice(virConnectPtr conn,
/* detach associated chardev on error */ /* detach associated chardev on error */
if (chardevAdded) if (chardevAdded)
ignore_value(qemuMonitorDetachCharDev(priv->mon, charAlias)); ignore_value(qemuMonitorDetachCharDev(priv->mon, charAlias));
if (tlsobjAdded)
ignore_value(qemuMonitorDelObject(priv->mon, tlsAlias));
if (secobjAdded)
ignore_value(qemuMonitorDelObject(priv->mon, secAlias));
ignore_value(qemuDomainObjExitMonitor(driver, vm)); ignore_value(qemuDomainObjExitMonitor(driver, vm));
if (orig_err) { if (orig_err) {
virSetError(orig_err); virSetError(orig_err);
virFreeError(orig_err); virFreeError(orig_err);
} }
qemuDomainDelTLSObjects(driver, vm, secAlias, tlsAlias);
goto audit; goto audit;
} }
@ -1860,10 +1920,8 @@ int qemuDomainAttachChrDevice(virConnectPtr conn,
virDomainChrSourceDefPtr dev = chr->source; virDomainChrSourceDefPtr dev = chr->source;
char *charAlias = NULL; char *charAlias = NULL;
bool chardevAttached = false; bool chardevAttached = false;
bool tlsobjAdded = false;
bool teardowncgroup = false; bool teardowncgroup = false;
bool teardowndevice = false; bool teardowndevice = false;
bool secobjAdded = false;
virJSONValuePtr tlsProps = NULL; virJSONValuePtr tlsProps = NULL;
char *tlsAlias = NULL; char *tlsAlias = NULL;
virJSONValuePtr secProps = NULL; virJSONValuePtr secProps = NULL;
@ -1910,24 +1968,11 @@ int qemuDomainAttachChrDevice(virConnectPtr conn,
&secProps, &secAlias) < 0) &secProps, &secAlias) < 0)
goto cleanup; goto cleanup;
qemuDomainObjEnterMonitor(driver, vm); if (qemuDomainAddTLSObjects(driver, vm, secAlias, &secProps,
if (secAlias) { tlsAlias, &tlsProps) < 0)
rc = qemuMonitorAddObject(priv->mon, "secret", goto audit;
secAlias, secProps);
secProps = NULL;
if (rc < 0)
goto exit_monitor;
secobjAdded = true;
}
if (tlsAlias) { qemuDomainObjEnterMonitor(driver, vm);
rc = qemuMonitorAddObject(priv->mon, "tls-creds-x509",
tlsAlias, tlsProps);
tlsProps = NULL; /* qemuMonitorAddObject consumes */
if (rc < 0)
goto exit_monitor;
tlsobjAdded = true;
}
if (qemuMonitorAttachCharDev(priv->mon, charAlias, chr->source) < 0) if (qemuMonitorAttachCharDev(priv->mon, charAlias, chr->source) < 0)
goto exit_monitor; goto exit_monitor;
@ -1968,16 +2013,13 @@ int qemuDomainAttachChrDevice(virConnectPtr conn,
/* detach associated chardev on error */ /* detach associated chardev on error */
if (chardevAttached) if (chardevAttached)
qemuMonitorDetachCharDev(priv->mon, charAlias); qemuMonitorDetachCharDev(priv->mon, charAlias);
if (tlsobjAdded)
ignore_value(qemuMonitorDelObject(priv->mon, tlsAlias));
if (secobjAdded)
ignore_value(qemuMonitorDelObject(priv->mon, secAlias));
ignore_value(qemuDomainObjExitMonitor(driver, vm)); ignore_value(qemuDomainObjExitMonitor(driver, vm));
if (orig_err) { if (orig_err) {
virSetError(orig_err); virSetError(orig_err);
virFreeError(orig_err); virFreeError(orig_err);
} }
qemuDomainDelTLSObjects(driver, vm, secAlias, tlsAlias);
goto audit; goto audit;
} }
@ -2002,8 +2044,6 @@ qemuDomainAttachRNGDevice(virConnectPtr conn,
bool teardowndevice = false; bool teardowndevice = false;
bool chardevAdded = false; bool chardevAdded = false;
bool objAdded = false; bool objAdded = false;
bool tlsobjAdded = false;
bool secobjAdded = false;
virJSONValuePtr props = NULL; virJSONValuePtr props = NULL;
virJSONValuePtr tlsProps = NULL; virJSONValuePtr tlsProps = NULL;
virJSONValuePtr secProps = NULL; virJSONValuePtr secProps = NULL;
@ -2078,28 +2118,14 @@ qemuDomainAttachRNGDevice(virConnectPtr conn,
charAlias, &tlsProps, &tlsAlias, charAlias, &tlsProps, &tlsAlias,
&secProps, &secAlias) < 0) &secProps, &secAlias) < 0)
goto cleanup; goto cleanup;
if (qemuDomainAddTLSObjects(driver, vm, secAlias, &secProps,
tlsAlias, &tlsProps) < 0)
goto audit;
} }
qemuDomainObjEnterMonitor(driver, vm); qemuDomainObjEnterMonitor(driver, vm);
if (secAlias) {
rv = qemuMonitorAddObject(priv->mon, "secret",
secAlias, secProps);
secProps = NULL;
if (rv < 0)
goto exit_monitor;
secobjAdded = true;
}
if (tlsAlias) {
rv = qemuMonitorAddObject(priv->mon, "tls-creds-x509",
tlsAlias, tlsProps);
tlsProps = NULL; /* qemuMonitorAddObject consumes */
if (rv < 0)
goto exit_monitor;
tlsobjAdded = true;
}
if (rng->backend == VIR_DOMAIN_RNG_BACKEND_EGD && if (rng->backend == VIR_DOMAIN_RNG_BACKEND_EGD &&
qemuMonitorAttachCharDev(priv->mon, charAlias, qemuMonitorAttachCharDev(priv->mon, charAlias,
rng->source.chardev) < 0) rng->source.chardev) < 0)
@ -2154,10 +2180,6 @@ qemuDomainAttachRNGDevice(virConnectPtr conn,
ignore_value(qemuMonitorDelObject(priv->mon, objAlias)); ignore_value(qemuMonitorDelObject(priv->mon, objAlias));
if (rng->backend == VIR_DOMAIN_RNG_BACKEND_EGD && chardevAdded) if (rng->backend == VIR_DOMAIN_RNG_BACKEND_EGD && chardevAdded)
ignore_value(qemuMonitorDetachCharDev(priv->mon, charAlias)); ignore_value(qemuMonitorDetachCharDev(priv->mon, charAlias));
if (tlsobjAdded)
ignore_value(qemuMonitorDelObject(priv->mon, tlsAlias));
if (secobjAdded)
ignore_value(qemuMonitorDelObject(priv->mon, secAlias));
if (qemuDomainObjExitMonitor(driver, vm) < 0) if (qemuDomainObjExitMonitor(driver, vm) < 0)
releaseaddr = false; releaseaddr = false;
if (orig_err) { if (orig_err) {
@ -2165,6 +2187,7 @@ qemuDomainAttachRNGDevice(virConnectPtr conn,
virFreeError(orig_err); virFreeError(orig_err);
} }
qemuDomainDelTLSObjects(driver, vm, secAlias, tlsAlias);
goto audit; goto audit;
} }

View File

@ -33,6 +33,19 @@ int qemuDomainChangeEjectableMedia(virQEMUDriverPtr driver,
virDomainDiskDefPtr disk, virDomainDiskDefPtr disk,
virStorageSourcePtr newsrc, virStorageSourcePtr newsrc,
bool force); bool force);
void qemuDomainDelTLSObjects(virQEMUDriverPtr driver,
virDomainObjPtr vm,
const char *secAlias,
const char *tlsAlias);
int qemuDomainAddTLSObjects(virQEMUDriverPtr driver,
virDomainObjPtr vm,
const char *secAlias,
virJSONValuePtr *secProps,
const char *tlsAlias,
virJSONValuePtr *tlsProps);
int qemuDomainAttachControllerDevice(virQEMUDriverPtr driver, int qemuDomainAttachControllerDevice(virQEMUDriverPtr driver,
virDomainObjPtr vm, virDomainObjPtr vm,
virDomainControllerDefPtr controller); virDomainControllerDefPtr controller);