mirror of
https://github.com/libvirt/libvirt.git
synced 2026-09-03 20:53:04 -05:00
parallels: add cdroms support
Get cdrom devices list from parallels server in prlsdkLoadDomains and add ability to define a domain with cdroms. Signed-off-by: Dmitry Guryanov <dguryanov@parallels.com>
This commit is contained in:
committed by
Peter Krempa
parent
038a5a536b
commit
a7ed488dd7
@@ -452,7 +452,8 @@ prlsdkAddDomainVideoInfo(PRL_HANDLE sdkdom, virDomainDefPtr def)
|
|||||||
|
|
||||||
static int
|
static int
|
||||||
prlsdkGetDiskInfo(PRL_HANDLE prldisk,
|
prlsdkGetDiskInfo(PRL_HANDLE prldisk,
|
||||||
virDomainDiskDefPtr disk)
|
virDomainDiskDefPtr disk,
|
||||||
|
bool isCdrom)
|
||||||
{
|
{
|
||||||
char *buf = NULL;
|
char *buf = NULL;
|
||||||
PRL_UINT32 buflen = 0;
|
PRL_UINT32 buflen = 0;
|
||||||
@@ -467,11 +468,19 @@ prlsdkGetDiskInfo(PRL_HANDLE prldisk,
|
|||||||
prlsdkCheckRetGoto(pret, cleanup);
|
prlsdkCheckRetGoto(pret, cleanup);
|
||||||
if (emulatedType == PDT_USE_IMAGE_FILE) {
|
if (emulatedType == PDT_USE_IMAGE_FILE) {
|
||||||
virDomainDiskSetType(disk, VIR_STORAGE_TYPE_FILE);
|
virDomainDiskSetType(disk, VIR_STORAGE_TYPE_FILE);
|
||||||
virDomainDiskSetFormat(disk, VIR_STORAGE_FILE_PLOOP);
|
if (isCdrom)
|
||||||
|
virDomainDiskSetFormat(disk, VIR_STORAGE_FILE_AUTO);
|
||||||
|
else
|
||||||
|
virDomainDiskSetFormat(disk, VIR_STORAGE_FILE_PLOOP);
|
||||||
} else {
|
} else {
|
||||||
virDomainDiskSetType(disk, VIR_STORAGE_TYPE_BLOCK);
|
virDomainDiskSetType(disk, VIR_STORAGE_TYPE_BLOCK);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (isCdrom)
|
||||||
|
disk->device = VIR_DOMAIN_DISK_DEVICE_CDROM;
|
||||||
|
else
|
||||||
|
disk->device = VIR_DOMAIN_DISK_DEVICE_DISK;
|
||||||
|
|
||||||
pret = PrlVmDev_GetFriendlyName(prldisk, NULL, &buflen);
|
pret = PrlVmDev_GetFriendlyName(prldisk, NULL, &buflen);
|
||||||
prlsdkCheckRetGoto(pret, cleanup);
|
prlsdkCheckRetGoto(pret, cleanup);
|
||||||
|
|
||||||
@@ -549,7 +558,7 @@ prlsdkAddDomainHardDisksInfo(PRL_HANDLE sdkdom, virDomainDefPtr def)
|
|||||||
if (!(disk = virDomainDiskDefNew()))
|
if (!(disk = virDomainDiskDefNew()))
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
if (prlsdkGetDiskInfo(hdd, disk) < 0)
|
if (prlsdkGetDiskInfo(hdd, disk, false) < 0)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
PrlHandle_Free(hdd);
|
PrlHandle_Free(hdd);
|
||||||
@@ -568,6 +577,43 @@ prlsdkAddDomainHardDisksInfo(PRL_HANDLE sdkdom, virDomainDefPtr def)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
prlsdkAddDomainOpticalDisksInfo(PRL_HANDLE sdkdom, virDomainDefPtr def)
|
||||||
|
{
|
||||||
|
PRL_RESULT pret;
|
||||||
|
PRL_UINT32 cdromsCount;
|
||||||
|
PRL_UINT32 i;
|
||||||
|
PRL_HANDLE cdrom = PRL_INVALID_HANDLE;
|
||||||
|
virDomainDiskDefPtr disk = NULL;
|
||||||
|
|
||||||
|
pret = PrlVmCfg_GetOpticalDisksCount(sdkdom, &cdromsCount);
|
||||||
|
prlsdkCheckRetGoto(pret, error);
|
||||||
|
|
||||||
|
for (i = 0; i < cdromsCount; ++i) {
|
||||||
|
pret = PrlVmCfg_GetOpticalDisk(sdkdom, i, &cdrom);
|
||||||
|
prlsdkCheckRetGoto(pret, error);
|
||||||
|
|
||||||
|
if (!(disk = virDomainDiskDefNew()))
|
||||||
|
goto error;
|
||||||
|
|
||||||
|
if (prlsdkGetDiskInfo(cdrom, disk, true) < 0)
|
||||||
|
goto error;
|
||||||
|
|
||||||
|
PrlHandle_Free(cdrom);
|
||||||
|
cdrom = PRL_INVALID_HANDLE;
|
||||||
|
|
||||||
|
if (VIR_APPEND_ELEMENT(def->disks, def->ndisks, disk) < 0)
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
error:
|
||||||
|
PrlHandle_Free(cdrom);
|
||||||
|
virDomainDiskDefFree(disk);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
prlsdkGetNetInfo(PRL_HANDLE netAdapter, virDomainNetDefPtr net, bool isCt)
|
prlsdkGetNetInfo(PRL_HANDLE netAdapter, virDomainNetDefPtr net, bool isCt)
|
||||||
{
|
{
|
||||||
@@ -787,6 +833,9 @@ prlsdkAddDomainHardware(PRL_HANDLE sdkdom, virDomainDefPtr def)
|
|||||||
if (prlsdkAddDomainHardDisksInfo(sdkdom, def) < 0)
|
if (prlsdkAddDomainHardDisksInfo(sdkdom, def) < 0)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
|
if (prlsdkAddDomainOpticalDisksInfo(sdkdom, def) < 0)
|
||||||
|
goto error;
|
||||||
|
|
||||||
if (prlsdkAddDomainNetInfo(sdkdom, def) < 0)
|
if (prlsdkAddDomainNetInfo(sdkdom, def) < 0)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
@@ -2091,9 +2140,11 @@ static int prlsdkCheckNetUnsupportedParams(virDomainNetDefPtr net)
|
|||||||
|
|
||||||
static int prlsdkCheckDiskUnsupportedParams(virDomainDiskDefPtr disk)
|
static int prlsdkCheckDiskUnsupportedParams(virDomainDiskDefPtr disk)
|
||||||
{
|
{
|
||||||
if (disk->device != VIR_DOMAIN_DISK_DEVICE_DISK) {
|
if (disk->device != VIR_DOMAIN_DISK_DEVICE_DISK &&
|
||||||
|
disk->device != VIR_DOMAIN_DISK_DEVICE_CDROM) {
|
||||||
|
|
||||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
|
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
|
||||||
_("Only hard disks are supported "
|
_("Only hard disks and cdroms are supported "
|
||||||
"supported by parallels driver."));
|
"supported by parallels driver."));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@@ -2399,7 +2450,10 @@ static int prlsdkAddDisk(PRL_HANDLE sdkdom, virDomainDiskDefPtr disk)
|
|||||||
if (prlsdkCheckDiskUnsupportedParams(disk) < 0)
|
if (prlsdkCheckDiskUnsupportedParams(disk) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
pret = PrlVmCfg_CreateVmDev(sdkdom, PDE_HARD_DISK, &sdkdisk);
|
if (disk->device == VIR_DOMAIN_DISK_DEVICE_DISK)
|
||||||
|
pret = PrlVmCfg_CreateVmDev(sdkdom, PDE_HARD_DISK, &sdkdisk);
|
||||||
|
else
|
||||||
|
pret = PrlVmCfg_CreateVmDev(sdkdom, PDE_OPTICAL_DISK, &sdkdisk);
|
||||||
prlsdkCheckRetGoto(pret, cleanup);
|
prlsdkCheckRetGoto(pret, cleanup);
|
||||||
|
|
||||||
pret = PrlVmDev_SetEnabled(sdkdisk, 1);
|
pret = PrlVmDev_SetEnabled(sdkdisk, 1);
|
||||||
@@ -2409,7 +2463,9 @@ static int prlsdkAddDisk(PRL_HANDLE sdkdom, virDomainDiskDefPtr disk)
|
|||||||
prlsdkCheckRetGoto(pret, cleanup);
|
prlsdkCheckRetGoto(pret, cleanup);
|
||||||
|
|
||||||
if (disk->src->type == VIR_STORAGE_TYPE_FILE) {
|
if (disk->src->type == VIR_STORAGE_TYPE_FILE) {
|
||||||
if (virDomainDiskGetFormat(disk) != VIR_STORAGE_FILE_PLOOP) {
|
if (disk->device == VIR_DOMAIN_DISK_DEVICE_DISK &&
|
||||||
|
virDomainDiskGetFormat(disk) != VIR_STORAGE_FILE_PLOOP) {
|
||||||
|
|
||||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
||||||
_("Invalid disk format: %d"), disk->src->type);
|
_("Invalid disk format: %d"), disk->src->type);
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|||||||
Reference in New Issue
Block a user