[libvirt] [PATCH 2/2] bhyve: domainCreateXML
Daniel P. Berrange
berrange at redhat.com
Wed Apr 9 11:13:52 UTC 2014
On Wed, Apr 09, 2014 at 03:11:48PM +0400, Roman Bogorodskiy wrote:
> Daniel P. Berrange wrote:
>
> > On Wed, Apr 09, 2014 at 07:52:12AM +0200, Wojciech Macek wrote:
> > > Implement bhyveDomainCreteXML function.
> > > ---
> > > src/bhyve/bhyve_driver.c | 70 ++++++++++++++++++++++++++++++++++++++++++++++++
> > > 1 file changed, 70 insertions(+)
> > >
> > > diff --git a/src/bhyve/bhyve_driver.c b/src/bhyve/bhyve_driver.c
> > > index 23e7112..1357e07 100644
> > > --- a/src/bhyve/bhyve_driver.c
> > > +++ b/src/bhyve/bhyve_driver.c
> > > @@ -1107,6 +1107,75 @@ bhyveConnectCompareCPU(virConnectPtr conn,
> > > return ret;
> > > }
> > >
> > > +static virDomainPtr
> > > +bhyveDomainCreateXML(virConnectPtr conn,
> > > + const char *xml,
> > > + unsigned int flags)
> > > +{
> > > + bhyveConnPtr privconn = conn->privateData;
> > > + virDomainPtr dom = NULL;
> > > + virDomainDefPtr def = NULL;
> > > + virDomainObjPtr vm = NULL;
> > > + virCapsPtr caps = NULL;
> > > + int ret;
> > > + unsigned int start_flags = 0;
> > > +
> > > + virCheckFlags(VIR_DOMAIN_START_AUTODESTROY, NULL);
> > > +
> > > + if (flags & VIR_DOMAIN_START_AUTODESTROY)
> > > + start_flags |= VIR_BHYVE_PROCESS_START_AUTODESTROY;
> > > +
> > > + caps = bhyveDriverGetCapabilities(privconn);
> > > + if (!caps)
> > > + return NULL;
> > > +
> > > + if ((def = virDomainDefParseString(xml, caps, privconn->xmlopt,
> > > + 1 << VIR_DOMAIN_VIRT_BHYVE,
> > > + VIR_DOMAIN_XML_INACTIVE)) == NULL)
> > > + goto cleanup;
> > > +
> > > + if (virDomainCreateXMLEnsureACL(conn, def) < 0)
> > > + goto cleanup;
> > > +
> > > + if (!(vm = virDomainObjListAdd(privconn->domains, def,
> > > + privconn->xmlopt,
> > > + 0, NULL)))
> >
> > You should pass VIR_DOMAIN_OBJ_LIST_ADD_CHECK_LIVE, rather than 0.
> > This ensures you don't overwrite the config of an existing runing
> > guest
> >
> > > + goto cleanup;
> > > + def = NULL;
> > > + vm->persistent = 0;
> >
> > Don't reset the persistent flag. The guest may already exist
> > as an inactive persistent guest, and you're causing that to be
> > lost.
> >
> > > +
> > > + dom = virGetDomain(conn, vm->def->name, vm->def->uuid);
> > > + if (!dom)
> > > + goto cleanup;
> > > +
> > > + dom->id = vm->def->id;
> >
> > Err, the 'id' won't be set until you've started the guest,
> > so this fnuction call & set needs to be the last thing you
> > do
> >
> > > +
> > > + if (flags & VIR_DOMAIN_START_AUTODESTROY)
> > > + start_flags |= VIR_BHYVE_PROCESS_START_AUTODESTROY;
> >
> > You've already done this above.
> >
> > > +
> > > + if (virDomainObjIsActive(vm)) {
> > > + virReportError(VIR_ERR_OPERATION_INVALID,
> > > + "%s", _("Domain is already running"));
> > > + goto cleanup;
> > > + }
> >
> > This is not required if you pass the right flags to the
> > virDomainObjListAdd method
> >
> > > +
> > > + ret = virBhyveProcessStart(dom->conn, privconn, vm,
> > > + VIR_DOMAIN_RUNNING_BOOTED,
> > > + start_flags);
> > > + if (ret) {
>
> As discussed on IRC now, I think we need to call
> virDomainObjListRemove() if the domain is not persistent in case if
> virBhyveProcessStart() fails.
>
> Daniel, please correct me if I'm wrong.
You are right.
Regards,
Daniel
--
|: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org -o- http://virt-manager.org :|
|: http://autobuild.org -o- http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|
More information about the libvir-list
mailing list