提交 73c901a8 编写于 作者: M Mark McLoughlin

Take domain type into account when looking up default machine

If one has e.g.

  <guest>
    <os_type>hvm</os_type>
    <arch name='x86_64'>
      <wordsize>64</wordsize>
      <emulator>/usr/bin/qemu-system-x86_64</emulator>
      <machine>pc-0.11</machine>
      <machine canonical='pc-0.11'>pc</machine>
      <machine>pc-0.10</machine>
      <machine>isapc</machine>
      <domain type='qemu'>
      </domain>
      <domain type='kvm'>
        <emulator>/usr/bin/kvm</emulator>
        <machine>pc</machine>
        <machine>isapc</machine>
      </domain>
    </arch>
  </guest>

and start a guest with:

  <domain type='kvm'>
    ...
    <os>
      <type arch='x86_64'>hvm</type>
      ...
    </os>
  </domain>

then the default machine type should be 'pc' and not 'pc-0.11'

Issue was reported by Anton Protopopov.

* src/capabilities.[ch]: pass the domain type to
  virCapabilitiesDefaultGuestArch() and use it to look up the default
  machine type from a specific guest domain if needed.

* src/conf/domain_conf.c, src/xen/xm_internal.c: update

* tests/qemuxml2argvdata/qemuxml2argv-machine-aliases2.xml: update
  the domain type to 'kvm' and remove the machine type to check
  that the default gets looked up correctly
上级 33948c68
...@@ -549,22 +549,43 @@ virCapabilitiesDefaultGuestArch(virCapsPtr caps, ...@@ -549,22 +549,43 @@ virCapabilitiesDefaultGuestArch(virCapsPtr caps,
* @caps: capabilities to query * @caps: capabilities to query
* @ostype: OS type to search for * @ostype: OS type to search for
* @arch: architecture to search for * @arch: architecture to search for
* @domain: domain type to search for
* *
* Returns the first machine variant associated with * Returns the first machine variant associated with
* the requested operating system type and architecture * the requested operating system type, architecture
* and domain type
*/ */
extern const char * extern const char *
virCapabilitiesDefaultGuestMachine(virCapsPtr caps, virCapabilitiesDefaultGuestMachine(virCapsPtr caps,
const char *ostype, const char *ostype,
const char *arch) const char *arch,
const char *domain)
{ {
int i; int i;
for (i = 0 ; i < caps->nguests ; i++) { for (i = 0 ; i < caps->nguests ; i++) {
if (STREQ(caps->guests[i]->ostype, ostype) && virCapsGuestPtr guest = caps->guests[i];
STREQ(caps->guests[i]->arch.name, arch) && int j;
caps->guests[i]->arch.defaultInfo.nmachines)
if (!STREQ(guest->ostype, ostype) || !STREQ(guest->arch.name, arch))
continue;
for (j = 0; j < guest->arch.ndomains; j++) {
virCapsGuestDomainPtr dom= guest->arch.domains[j];
if (!STREQ(dom->type, domain))
continue;
if (!dom->info.nmachines)
break;
return dom->info.machines[0]->name;
}
if (guest->arch.defaultInfo.nmachines)
return caps->guests[i]->arch.defaultInfo.machines[0]->name; return caps->guests[i]->arch.defaultInfo.machines[0]->name;
} }
return NULL; return NULL;
} }
......
...@@ -207,7 +207,8 @@ virCapabilitiesDefaultGuestArch(virCapsPtr caps, ...@@ -207,7 +207,8 @@ virCapabilitiesDefaultGuestArch(virCapsPtr caps,
extern const char * extern const char *
virCapabilitiesDefaultGuestMachine(virCapsPtr caps, virCapabilitiesDefaultGuestMachine(virCapsPtr caps,
const char *ostype, const char *ostype,
const char *arch); const char *arch,
const char *domain);
extern const char * extern const char *
virCapabilitiesDefaultGuestEmulator(virCapsPtr caps, virCapabilitiesDefaultGuestEmulator(virCapsPtr caps,
const char *ostype, const char *ostype,
......
...@@ -2669,7 +2669,8 @@ static virDomainDefPtr virDomainDefParseXML(virConnectPtr conn, ...@@ -2669,7 +2669,8 @@ static virDomainDefPtr virDomainDefParseXML(virConnectPtr conn,
if (!def->os.machine) { if (!def->os.machine) {
const char *defaultMachine = virCapabilitiesDefaultGuestMachine(caps, const char *defaultMachine = virCapabilitiesDefaultGuestMachine(caps,
def->os.type, def->os.type,
def->os.arch); def->os.arch,
virDomainVirtTypeToString(def->virtType));
if (defaultMachine != NULL) { if (defaultMachine != NULL) {
if (!(def->os.machine = strdup(defaultMachine))) { if (!(def->os.machine = strdup(defaultMachine))) {
virReportOOMError(conn); virReportOOMError(conn);
......
...@@ -720,7 +720,8 @@ xenXMDomainConfigParse(virConnectPtr conn, virConfPtr conf) { ...@@ -720,7 +720,8 @@ xenXMDomainConfigParse(virConnectPtr conn, virConfPtr conf) {
defaultMachine = virCapabilitiesDefaultGuestMachine(priv->caps, defaultMachine = virCapabilitiesDefaultGuestMachine(priv->caps,
def->os.type, def->os.type,
def->os.arch); def->os.arch,
virDomainVirtTypeToString(def->virtType));
if (defaultMachine != NULL) { if (defaultMachine != NULL) {
if (!(def->os.machine = strdup(defaultMachine))) if (!(def->os.machine = strdup(defaultMachine)))
goto no_memory; goto no_memory;
......
<domain type='qemu'> <domain type='kvm'>
<name>QEMUGuest1</name> <name>QEMUGuest1</name>
<uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid> <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
<memory>219200</memory> <memory>219200</memory>
<currentMemory>219200</currentMemory> <currentMemory>219200</currentMemory>
<vcpu>1</vcpu> <vcpu>1</vcpu>
<os> <os>
<type arch='x86_64' machine='pc'>hvm</type> <type arch='x86_64'>hvm</type>
<boot dev='hd'/> <boot dev='hd'/>
</os> </os>
<clock offset='utc'/> <clock offset='utc'/>
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册