
On Thu, Sep 06, 2012 at 11:58:52AM -0400, Laine Stump wrote:
On 09/04/2012 04:35 PM, Kyle Mestery wrote:
Add the ability to migrate per-port data on Open vSwitch ports during qemu live migration. A controller can use this to store data relating to each port, and have it migrated with the virtual machine and populated on the destination host.
+static int +qemuMigrationCookieAddOvsPortData(qemuMigrationCookiePtr mig, + struct qemud_driver *driver, + virDomainObjPtr dom) +{ + if (mig->flags & QEMU_MIGRATION_COOKIE_OVS_PORT_DATA) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("Migration ovs port data data already present")); + return -1; + } + + if (dom->def->nnets >= 1) { + if (!(mig->ovsportdata = qemuMigrationCookieOvsPortDataAlloc( + driver, dom->def))) + return -1; + mig->flags |= QEMU_MIGRATION_COOKIE_OVS_PORT_DATA; + } + + return 0; +} +
static void qemuMigrationCookieGraphicsXMLFormat(virBufferPtr buf, qemuMigrationCookieGraphicsPtr grap) @@ -389,6 +504,25 @@ static void qemuMigrationCookieGraphicsXMLFormat(virBufferPtr buf, }
+static void qemuMigrationCookieOvsPortDataXMLFormat(virBufferPtr buf, + qemuMigrationCookieOvsPortDataPtr optr) +{ + int i; + + virBufferAsprintf(buf, " <ovsportdata nnets='%d'>\n", optr->nnets);
A minor point - is there a reason for including nnets here, when it can be implied from the number of <vif> elements and/or their "num" attributes?
But beyond that, I'm thinking we might want a more generic toplevel element name (similar to the graphics one being called <graphics> even though it could be used for vnc or spice), so that in the future it could be passed to / retrieved from a separate network driver/daemon without regard (within the migration code at least) to the specific type of the interface (or at least allow for the migration code to get multiple types without needing to clutter the namespace).
In the end, what we're really doing here is sending a last-instant update to the state of the domain's network interface. Thinking of it in that way, it would be really nice if it mimicked the <network> element of the domain XML as much as possible, to make explanations easier and make future additions more automatic, but I'm not sure how far we want to go in that direction, since the <network> element of the domain is unnecessarily complex for this specific job (e.g. it has both the configuration (which could be type='network') *and* the actual network connection that's used (which could have a different type if the config type is 'network'). Another difference specific to this case is that, in order to detect an interface that uses Open vSwitch, you need to look both for type='bridge' and for <virtualport type='openvswitch'>.
So, to take this to the very end of that road of reasoning, how bad of an idea would it be to make the "cookie" for each interface be the full live XML of that interface, then just include the portdata inside <virtualport> for every interface that has <virtualport type='openvswitch'>?
I'm not sure I entirely like the idea of duplicating the full live network interface XML that we've already sent across, mostly because it is duplicating a whole lot of information.
The advantage of doing it this way is that this would automatically handle any other need for last-minute interface state change info we might encounter in the future (as long as 1) the desired information is included in virDomainNetDef and handled by the standard parser/formatter, and 2) the cookie eating code did something with that data), and we could just call the parse/format functions in src/conf rather than needing our own. (A side effect is that "virsh dumpxml $myguest" would display the portdata for every Open vSwitch interface. Not having seen the length of the data, I don't know if that's a plus or a minus :-)
Admittedly from a position of ignorance about what the data is, I would tend to view this data as internal technical implementation data and not really relevant to app developers/users. AFAIK, it isn't data that an app developer would want to interpret or manipulate - just opaque state to be passed across at migration. Considering your point about generality though, I think we could argue that the top level element name could be something different. Eg instead of <ovsportdata> perhaps, <interfacestate type='bridge|direct|etc'> where type matches the types on <interface> in the domain XML, and then subelements which vary per type as needed.
+ if (optr->nnets > 0) + virBufferAsprintf(buf, " <vifs>\n");
Stepping back from my larger change idea above, does having the extra <vifs> level in the hierarchy make something easier (either now or in a hypothetical future with more data sent in this cookie)? Or could we just have the <vif> elements right below the toplevel?
Oh, and just to shake things up - we need to account for the possibility where the source host is using Open vSwitch, and the destination isn't :-)
+ for (i = 0; i < optr->nnets; i++) { + virBufferAsprintf(buf, " <vif num='%d' portdata='%s'/>\n", + i, optr->portdata[i]); + } + if (optr->nnets > 0) + virBufferAsprintf(buf, " </vifs>\n"); + + virBufferAddLit(buf, " </ovsportdata>\n"); +} +
I would like to hear others' opinions on whether or not they think it's reasonable to include the entire <network> live XML in the cookie, or if they think that's going beyond the bounds of the intended purpose of the migration cookie. I don't know if we should go all the way in that direction, but possibly we should at least make it a *subset* of the full domain <network> xml (as is done with the <graphics> cookie).
If the graphics cookie is a subset of the domain <graphics> schema that was a pure accident on my part - I didn't put any effort into making it so :-) 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 :|