On Wed, Nov 15, 2006 at 05:45:09AM -0500, Daniel Veillard wrote:
On Wed, Nov 15, 2006 at 02:33:26AM +0000, Daniel P. Berrange wrote:
> This is the main patch. It adds a new 'xm config file' backend driver to
> libvirt. This basically just scans /etc/xen for config files, reads them
> and turns them into libvirt XML to create domains. Similarly it can accept
> libvirt XML and create config files from it.
Haha, the whole point of the exercise :-)
> Some important points
>
> - It can override /etc/xen with LIBVIRT_XM_CONFIG_DIR env variable
I added an extra check so that this environment variable is *NOT* used
if getuid() != geteuid(), or getgid() != getegid() to avoid a potential
security issue in setuid usage.
> - It only re-scans /etc/xen every X seconds & caches parsed
config
> files in-memory to avoid parsing / I/O overhead
> - Automatically generates a UUID if the config file doesn;t have one
> - Skips over a blacklist of files from /etc/xen which are known to
> not be valid config files to avoid too many error messages
> - Filters list of inactive domains to strip out any which are currently
> running (acccording to XenD)
> - Allows changing of VCPUS, memory & max memory config settings and
> writes changes back out to disk
> - Can start, create, delete domains from disk
> + /* This method is called by various methods to scan /etc/xen
> + (or whatever directory was set by LIBVIRT_XM_CONFIG_DIR
> + environment variable) and process any domain configs. It
> + has rate-limited so never rescans more frequently than
> + once every X seconds */
Right, I don't want to be chastanized publicly by Dave Jones again
at OLS 2007 :-)
> + static int xenXMConfigCacheRefresh(void) {
[...]
> + /* Skip anything which isn't a file (takes care of scripts/ subdir */
> + if ((stat(path, &st) < 0) ||
> + !S_ISREG(st.st_mode)) {
I would put extra braces (!S_ISREG(st.st_mode)) ... paranoid as usual :-)
Ok, added that.
> + memset(info, 0, sizeof(virDomainInfo));
> + if (xenXMConfigGetInt(entry->conf, "memory", &mem) < 0 ||
> + mem < 0)
> + info->memory = 64 * 1024;
64 MB is a minimal memory limit that we are referencing in various places
in libvirt for Xen back-ends, maybe that ought to be isolated in internal.h
I committed the code as is for now. There're a bunch of things which can
be shared between various backends, so I'll knock up a separate patch to
pull out some of this duplicated code.
> + virBufferAdd(buf, "<domain
type='xen'>\n", -1);
> + virBufferVSprintf(buf, " <name>%s</name>\n", name);
Okay one of the things which scares me a bit here is encoding for the
strings. We generate XML files without any encoding information which means
it has to be UTF-8 (or UTF-16 but clearly it's not), it was more or less
fine to do those direct buffers write before because we were in a contained
environment, but now those strings come from external files, and well
a chinese person may genuinely want to use chinese name in his config file
and use BIG5 encoding for example, and in such case the config file generated
here would not be XML. I assume config files generated by virt-manager
when creating new domains are likely to use the strings returned from
Gnome widget, I wonder if it is UTF-8 or the encoding of the user's locale.
GNOME will use whatever your localized character set is defined to. Fedora
defaults to UTF-8 everywhere, but this isn't true in the general case. This
should be fixed in the virtinst library when it generates its XML to create
new domains, ensuring a sensible encoding is specified.
I guess the simplest and cleanest at this point would be to make
sure
anything parsed by conf.[ch] is actually UTF-8, and maybe double check
virt-manager string generation.
I think we have to expect the char set to be bsaed on user's locale rather
than assuming the config files are UTF-8 ? This all said, the only bit of
the config file which is free text is its name, and since the name is used
for the filename of the config too, this will have to be encoded UTF-8. So
I guess validating UTF-8 compliance when parsing is sufficient.
> + virBufferVSprintf(buf, " <graphics
type='vnc' port='%d'/>\n", (5900+display));
Shouldn't the 5900 magic number be in a header too ?
Yes, will refactor later.
Good to finally have the bridge from config files to libvirt
loading :-)
Very cool ! Push it :-)
Committed.
Dan.
--
|=- Red Hat, Engineering, Emerging Technologies, Boston. +1 978 392 2496 -=|
|=- Perl modules:
http://search.cpan.org/~danberr/ -=|
|=- Projects:
http://freshmeat.net/~danielpb/ -=|
|=- GnuPG: 7D3B9505 F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 -=|