Add optional model attribute to the controller element

This is a step towards controller support for the ESX driver.
This commit is contained in:
Matthias Bolte 2010-06-17 16:39:50 +02:00
parent f8f29b1fc2
commit c391291244
4 changed files with 55 additions and 0 deletions

View File

@ -670,6 +670,15 @@
<attribute name="index"> <attribute name="index">
<ref name="unsignedInt"/> <ref name="unsignedInt"/>
</attribute> </attribute>
<optional>
<attribute name="model">
<choice>
<value>buslogic</value>
<value>lsilogic</value>
<value>lsisas1068</value>
</choice>
</attribute>
</optional>
<optional> <optional>
<ref name="address"/> <ref name="address"/>
</optional> </optional>

View File

@ -139,6 +139,11 @@ VIR_ENUM_IMPL(virDomainController, VIR_DOMAIN_CONTROLLER_TYPE_LAST,
"sata", "sata",
"virtio-serial") "virtio-serial")
VIR_ENUM_IMPL(virDomainControllerModel, VIR_DOMAIN_CONTROLLER_MODEL_LAST,
"buslogic",
"lsilogic",
"lsisas1068")
VIR_ENUM_IMPL(virDomainFS, VIR_DOMAIN_FS_TYPE_LAST, VIR_ENUM_IMPL(virDomainFS, VIR_DOMAIN_FS_TYPE_LAST,
"mount", "mount",
"block", "block",
@ -1670,6 +1675,7 @@ virDomainControllerDefParseXML(xmlNodePtr node,
virDomainControllerDefPtr def; virDomainControllerDefPtr def;
char *type = NULL; char *type = NULL;
char *idx = NULL; char *idx = NULL;
char *model = NULL;
if (VIR_ALLOC(def) < 0) { if (VIR_ALLOC(def) < 0) {
virReportOOMError(); virReportOOMError();
@ -1694,6 +1700,17 @@ virDomainControllerDefParseXML(xmlNodePtr node,
} }
} }
model = virXMLPropString(node, "model");
if (model) {
if ((def->model = virDomainControllerModelTypeFromString(model)) < 0) {
virDomainReportError(VIR_ERR_INTERNAL_ERROR,
_("Unknown model type '%s'"), model);
goto error;
}
} else {
def->model = -1;
}
if (virDomainDeviceInfoParseXML(node, &def->info, flags) < 0) if (virDomainDeviceInfoParseXML(node, &def->info, flags) < 0)
goto error; goto error;
@ -1745,6 +1762,7 @@ virDomainControllerDefParseXML(xmlNodePtr node,
cleanup: cleanup:
VIR_FREE(type); VIR_FREE(type);
VIR_FREE(idx); VIR_FREE(idx);
VIR_FREE(model);
return def; return def;
@ -4819,6 +4837,7 @@ static int virDomainDefMaybeAddController(virDomainDefPtr def,
cont->type = type; cont->type = type;
cont->idx = idx; cont->idx = idx;
cont->model = -1;
if (cont->type == VIR_DOMAIN_CONTROLLER_TYPE_VIRTIO_SERIAL) { if (cont->type == VIR_DOMAIN_CONTROLLER_TYPE_VIRTIO_SERIAL) {
cont->opts.vioserial.ports = -1; cont->opts.vioserial.ports = -1;
@ -5232,6 +5251,7 @@ virDomainControllerDefFormat(virBufferPtr buf,
int flags) int flags)
{ {
const char *type = virDomainControllerTypeToString(def->type); const char *type = virDomainControllerTypeToString(def->type);
const char *model = NULL;
if (!type) { if (!type) {
virDomainReportError(VIR_ERR_INTERNAL_ERROR, virDomainReportError(VIR_ERR_INTERNAL_ERROR,
@ -5239,10 +5259,24 @@ virDomainControllerDefFormat(virBufferPtr buf,
return -1; return -1;
} }
if (def->model != -1) {
model = virDomainControllerModelTypeToString(def->model);
if (!model) {
virDomainReportError(VIR_ERR_INTERNAL_ERROR,
_("unexpected model type %d"), def->model);
return -1;
}
}
virBufferVSprintf(buf, virBufferVSprintf(buf,
" <controller type='%s' index='%d'", " <controller type='%s' index='%d'",
type, def->idx); type, def->idx);
if (model) {
virBufferEscapeString(buf, " model='%s'", model);
}
switch (def->type) { switch (def->type) {
case VIR_DOMAIN_CONTROLLER_TYPE_VIRTIO_SERIAL: case VIR_DOMAIN_CONTROLLER_TYPE_VIRTIO_SERIAL:
if (def->opts.vioserial.ports != -1) { if (def->opts.vioserial.ports != -1) {

View File

@ -194,6 +194,15 @@ enum virDomainControllerType {
VIR_DOMAIN_CONTROLLER_TYPE_LAST VIR_DOMAIN_CONTROLLER_TYPE_LAST
}; };
enum virDomainControllerModel {
VIR_DOMAIN_CONTROLLER_MODEL_BUSLOGIC,
VIR_DOMAIN_CONTROLLER_MODEL_LSILOGIC,
VIR_DOMAIN_CONTROLLER_MODEL_LSISAS1068,
VIR_DOMAIN_CONTROLLER_MODEL_LAST
};
typedef struct _virDomainVirtioSerialOpts virDomainVirtioSerialOpts; typedef struct _virDomainVirtioSerialOpts virDomainVirtioSerialOpts;
typedef virDomainVirtioSerialOpts *virDomainVirtioSerialOptsPtr; typedef virDomainVirtioSerialOpts *virDomainVirtioSerialOptsPtr;
struct _virDomainVirtioSerialOpts { struct _virDomainVirtioSerialOpts {
@ -207,6 +216,7 @@ typedef virDomainControllerDef *virDomainControllerDefPtr;
struct _virDomainControllerDef { struct _virDomainControllerDef {
int type; int type;
int idx; int idx;
int model; /* -1 == undef */
union { union {
virDomainVirtioSerialOpts vioserial; virDomainVirtioSerialOpts vioserial;
} opts; } opts;
@ -1073,6 +1083,7 @@ VIR_ENUM_DECL(virDomainDiskBus)
VIR_ENUM_DECL(virDomainDiskCache) VIR_ENUM_DECL(virDomainDiskCache)
VIR_ENUM_DECL(virDomainDiskErrorPolicy) VIR_ENUM_DECL(virDomainDiskErrorPolicy)
VIR_ENUM_DECL(virDomainController) VIR_ENUM_DECL(virDomainController)
VIR_ENUM_DECL(virDomainControllerModel)
VIR_ENUM_DECL(virDomainFS) VIR_ENUM_DECL(virDomainFS)
VIR_ENUM_DECL(virDomainNet) VIR_ENUM_DECL(virDomainNet)
VIR_ENUM_DECL(virDomainChrTarget) VIR_ENUM_DECL(virDomainChrTarget)

View File

@ -7270,6 +7270,7 @@ qemuDomainFindOrCreateSCSIDiskController(struct qemud_driver *driver,
} }
cont->type = VIR_DOMAIN_CONTROLLER_TYPE_SCSI; cont->type = VIR_DOMAIN_CONTROLLER_TYPE_SCSI;
cont->idx = 0; cont->idx = 0;
cont->model = -1;
VIR_INFO0("No SCSI controller present, hotplugging one"); VIR_INFO0("No SCSI controller present, hotplugging one");
if (qemudDomainAttachPciControllerDevice(driver, if (qemudDomainAttachPciControllerDevice(driver,