On Tue, May 31, 2011 at 11:52:20AM +0200, Matthias Bolte wrote:
2011/5/27 Daniel P. Berrange <berrange(a)redhat.com>:
> To allow a client app to pass in custom XML during migration
> of a guest it is neccessary to ensure the guest ABI remains
> unchanged. The virDomainDefCheckABIStablity method accepts
> two virDomainDefPtr structs and compares everything in them
> that could impact the guest machine ABI
>
> * src/conf/domain_conf.c, src/conf/domain_conf.h,
> src/libvirt_private.syms: Add virDomainDefCheckABIStablity
> * src/conf/cpu_conf.c, src/conf/cpu_conf.h: Add virCPUDefIsEqual
> * src/util/sysinfo.c, src/util/sysinfo.h: Add virSysinfoIsEqual
> ---
> src/conf/cpu_conf.c | 91 +++++
> src/conf/cpu_conf.h | 9 +-
> src/conf/domain_conf.c | 881 +++++++++++++++++++++++++++++++++++++++++++++-
> src/conf/domain_conf.h | 11 +-
> src/libvirt_private.syms | 1 +
> src/util/sysinfo.c | 60 +++-
> src/util/sysinfo.h | 11 +-
> 7 files changed, 1051 insertions(+), 13 deletions(-)
>
> diff --git a/src/conf/cpu_conf.c b/src/conf/cpu_conf.c
> index 98d598a..77d0976 100644
> --- a/src/conf/cpu_conf.c
> +++ b/src/conf/cpu_conf.c
> @@ -446,3 +449,91 @@ no_memory:
> virReportOOMError();
> return -1;
> }
> +
> +bool
> +virCPUDefIsEqual(virCPUDefPtr src,
> + virCPUDefPtr dst)
> +{
> + bool identical = false;
> + int i;
> + for (i = 0 ; i < src->nfeatures ; i++) {
> + if (STRNEQ(src->features[i].name, dst->features[i].name)) {
> + virCPUReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> + _("Target CPU feature %s does not match source
%s"),
> + dst->features[i].name, src->features[i].name);
> + goto cleanup;
> + }
I think you need to compare features[i].policy here too.
> + }
> +
> + identical = true;
> +
> +cleanup:
> + return identical;
> +}
> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> index 8ff155b..a9a4655 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> +static bool virDomainNetDefCheckABIStability(virDomainNetDefPtr src,
> + virDomainNetDefPtr dst)
> +{
> + bool identical = false;
> +
> + if (memcmp(src->mac, dst->mac, VIR_MAC_BUFLEN) != 0) {
> + virDomainReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> + _("Target network card mac
%02x:%02x:%02x:%02x:%02x:%02x"
> + "does not match source
%02x:%02x:%02x:%02x:%02x:%02x"),
> + dst->mac[0], dst->mac[2], dst->mac[2],
Shouldn't this be dst->mac[0], dst->mac[1], dst->mac[2]?
> + dst->mac[3], dst->mac[4], dst->mac[5],
> + src->mac[0], src->mac[2], src->mac[2],
Copy-n-paste error here.
> diff --git a/src/util/sysinfo.c b/src/util/sysinfo.c
> index d929073..70da532 100644
> --- a/src/util/sysinfo.c
> +++ b/src/util/sysinfo.c
> @@ -326,4 +328,56 @@ virSysinfoFormat(virSysinfoDefPtr def, const char *prefix)
> return virBufferContentAndReset(&buf);
> }
>
> +bool virSysinfoIsEqual(virSysinfoDefPtr src,
> + virSysinfoDefPtr dst)
> +{
> + bool identical = false;
> +
> + if (!src && !dst)
> + return true;
> +
> + if ((src && !dst) || (!src && dst)) {
> + virSmbiosReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
> + _("Target sysinfo does not match source"));
> + goto cleanup;
> + }
> +
> + if (src->type != dst->type) {
> + virSmbiosReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> + _("Target sysinfo %s does not match source
%s"),
> + virSysinfoTypeToString(dst->type),
> + virSysinfoTypeToString(src->type));
> + goto cleanup;
> + }
> +
> +#define CHECK_FIELD(name, desc) \
This needs to be '# define CHECK_FIELD(name, desc)' to please syntax-check.
> + do { \
> + if (STRNEQ_NULLABLE(src->name, dst->name)) { \
> + virSmbiosReportError(VIR_ERR_CONFIG_UNSUPPORTED, \
> + _("Target sysinfo " desc " %s does
not match source %s"), \
Are you sure that this insertion of dest into the string in this way
will work properly with gettext? I think
_("Target sysinfo %s %s does not match source %s"), desc
will work better.
> + src->name, dst->name); \
You used STRNEQ_NULLABLE as src->name, dst->name could be NULL, so you
need to use
NULLSTR(src->name), NULLSTR(dst->name)
here too.
> + } \
> + } while (0)
> +
> + CHECK_FIELD(bios_vendor, "BIOS vendor");
> + CHECK_FIELD(bios_version, "BIOS version");
> + CHECK_FIELD(bios_date, "BIOS date");
> + CHECK_FIELD(bios_release, "BIOS release");
> +
> + CHECK_FIELD(system_manufacturer, "system vendor");
> + CHECK_FIELD(system_product, "system product");
> + CHECK_FIELD(system_version, "system version");
> + CHECK_FIELD(system_serial, "system serial");
> + CHECK_FIELD(system_uuid, "system uuid");
> + CHECK_FIELD(system_sku, "system sku");
> + CHECK_FIELD(system_family, "system family");
> +
> +#undef CHECK_FIELD
s/#undef CHECK_FIELD/# undef CHECK_FIELD/
> +
> + identical = true;
> +
> +cleanup:
> + return identical;
> +}
> +
> #endif /* !WIN32 */
ACK with those nits fixed.
Thanks, I've pushed this series with those fixes
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 :|