Search in sources :

Example 1 with LibvirtDomainXMLParser

use of com.cloud.hypervisor.kvm.resource.LibvirtDomainXMLParser in project cloudstack by apache.

the class KVMStorageProcessor method attachOrDetachDisk.

protected synchronized String attachOrDetachDisk(final Connect conn, final boolean attach, final String vmName, final KVMPhysicalDisk attachingDisk, final int devId, final String serial, final Long bytesReadRate, final Long bytesWriteRate, final Long iopsReadRate, final Long iopsWriteRate) throws LibvirtException, InternalErrorException {
    List<DiskDef> disks = null;
    Domain dm = null;
    DiskDef diskdef = null;
    final KVMStoragePool attachingPool = attachingDisk.getPool();
    try {
        dm = conn.domainLookupByName(vmName);
        final LibvirtDomainXMLParser parser = new LibvirtDomainXMLParser();
        final String domXml = dm.getXMLDesc(0);
        parser.parseDomainXML(domXml);
        disks = parser.getDisks();
        if (!attach) {
            if (attachingPool.getType() == StoragePoolType.RBD) {
                if (resource.getHypervisorType() == Hypervisor.HypervisorType.LXC) {
                    final String device = resource.mapRbdDevice(attachingDisk);
                    if (device != null) {
                        s_logger.debug("RBD device on host is: " + device);
                        attachingDisk.setPath(device);
                    }
                }
            }
            for (final DiskDef disk : disks) {
                final String file = disk.getDiskPath();
                if (file != null && file.equalsIgnoreCase(attachingDisk.getPath())) {
                    diskdef = disk;
                    break;
                }
            }
            if (diskdef == null) {
                throw new InternalErrorException("disk: " + attachingDisk.getPath() + " is not attached before");
            }
        } else {
            DiskDef.DiskBus busT = DiskDef.DiskBus.VIRTIO;
            for (final DiskDef disk : disks) {
                if (disk.getDeviceType() == DeviceType.DISK) {
                    if (disk.getBusType() == DiskDef.DiskBus.SCSI) {
                        busT = DiskDef.DiskBus.SCSI;
                    }
                    break;
                }
            }
            diskdef = new DiskDef();
            if (busT == DiskDef.DiskBus.SCSI) {
                diskdef.setQemuDriver(true);
                diskdef.setDiscard(DiscardType.UNMAP);
            }
            diskdef.setSerial(serial);
            if (attachingPool.getType() == StoragePoolType.RBD) {
                if (resource.getHypervisorType() == Hypervisor.HypervisorType.LXC) {
                    // For LXC, map image to host and then attach to Vm
                    final String device = resource.mapRbdDevice(attachingDisk);
                    if (device != null) {
                        s_logger.debug("RBD device on host is: " + device);
                        diskdef.defBlockBasedDisk(device, devId, busT);
                    } else {
                        throw new InternalErrorException("Error while mapping disk " + attachingDisk.getPath() + " on host");
                    }
                } else {
                    diskdef.defNetworkBasedDisk(attachingDisk.getPath(), attachingPool.getSourceHost(), attachingPool.getSourcePort(), attachingPool.getAuthUserName(), attachingPool.getUuid(), devId, busT, DiskProtocol.RBD, DiskDef.DiskFmtType.RAW);
                }
            } else if (attachingPool.getType() == StoragePoolType.Gluster) {
                final String mountpoint = attachingPool.getLocalPath();
                final String path = attachingDisk.getPath();
                final String glusterVolume = attachingPool.getSourceDir().replace("/", "");
                diskdef.defNetworkBasedDisk(glusterVolume + path.replace(mountpoint, ""), attachingPool.getSourceHost(), attachingPool.getSourcePort(), null, null, devId, busT, DiskProtocol.GLUSTER, DiskDef.DiskFmtType.QCOW2);
            } else if (attachingDisk.getFormat() == PhysicalDiskFormat.QCOW2) {
                diskdef.defFileBasedDisk(attachingDisk.getPath(), devId, busT, DiskDef.DiskFmtType.QCOW2);
            } else if (attachingDisk.getFormat() == PhysicalDiskFormat.RAW) {
                diskdef.defBlockBasedDisk(attachingDisk.getPath(), devId, busT);
            }
            if ((bytesReadRate != null) && (bytesReadRate > 0)) {
                diskdef.setBytesReadRate(bytesReadRate);
            }
            if ((bytesWriteRate != null) && (bytesWriteRate > 0)) {
                diskdef.setBytesWriteRate(bytesWriteRate);
            }
            if ((iopsReadRate != null) && (iopsReadRate > 0)) {
                diskdef.setIopsReadRate(iopsReadRate);
            }
            if ((iopsWriteRate != null) && (iopsWriteRate > 0)) {
                diskdef.setIopsWriteRate(iopsWriteRate);
            }
        }
        final String xml = diskdef.toString();
        return attachOrDetachDevice(conn, attach, vmName, xml);
    } finally {
        if (dm != null) {
            dm.free();
        }
    }
}
Also used : DiskDef(com.cloud.hypervisor.kvm.resource.LibvirtVMDef.DiskDef) LibvirtDomainXMLParser(com.cloud.hypervisor.kvm.resource.LibvirtDomainXMLParser) InternalErrorException(com.cloud.exception.InternalErrorException) Domain(org.libvirt.Domain)

Aggregations

InternalErrorException (com.cloud.exception.InternalErrorException)1 LibvirtDomainXMLParser (com.cloud.hypervisor.kvm.resource.LibvirtDomainXMLParser)1 DiskDef (com.cloud.hypervisor.kvm.resource.LibvirtVMDef.DiskDef)1 Domain (org.libvirt.Domain)1