Search in sources :

Example 11 with StoragePool

use of org.libvirt.StoragePool in project cloudstack by apache.

the class LibvirtStorageAdaptor method createStoragePool.

@Override
public KVMStoragePool createStoragePool(String name, String host, int port, String path, String userInfo, StoragePoolType type) {
    s_logger.info("Attempting to create storage pool " + name + " (" + type.toString() + ") in libvirt");
    StoragePool sp = null;
    Connect conn = null;
    try {
        conn = LibvirtConnection.getConnection();
    } catch (LibvirtException e) {
        throw new CloudRuntimeException(e.toString());
    }
    try {
        sp = conn.storagePoolLookupByUUIDString(name);
        if (sp != null && sp.isActive() == 0) {
            sp.undefine();
            sp = null;
            s_logger.info("Found existing defined storage pool " + name + ". It wasn't running, so we undefined it.");
        }
        if (sp != null) {
            s_logger.info("Found existing defined storage pool " + name + ", using it.");
        }
    } catch (LibvirtException e) {
        sp = null;
        s_logger.warn("Storage pool " + name + " was not found running in libvirt. Need to create it.");
    }
    // existing paths
    if (path.endsWith("/")) {
        path = path.substring(0, path.length() - 1);
    }
    if (sp == null) {
        // see if any existing pool by another name is using our storage path.
        // if anyone is, undefine the pool so we can define it as requested.
        // This should be safe since a pool in use can't be removed, and no
        // volumes are affected by unregistering the pool with libvirt.
        s_logger.info("Didn't find an existing storage pool " + name + " by UUID, checking for pools with duplicate paths");
        try {
            String[] poolnames = conn.listStoragePools();
            for (String poolname : poolnames) {
                s_logger.debug("Checking path of existing pool " + poolname + " against pool we want to create");
                StoragePool p = conn.storagePoolLookupByName(poolname);
                LibvirtStoragePoolDef pdef = getStoragePoolDef(conn, p);
                String targetPath = pdef.getTargetPath();
                if (targetPath != null && targetPath.equals(path)) {
                    s_logger.debug("Storage pool utilizing path '" + path + "' already exists as pool " + poolname + ", undefining so we can re-define with correct name " + name);
                    if (p.isPersistent() == 1) {
                        p.destroy();
                        p.undefine();
                    } else {
                        p.destroy();
                    }
                }
            }
        } catch (LibvirtException e) {
            s_logger.error("Failure in attempting to see if an existing storage pool might be using the path of the pool to be created:" + e);
        }
        s_logger.debug("Attempting to create storage pool " + name);
        if (type == StoragePoolType.NetworkFilesystem) {
            try {
                sp = createNetfsStoragePool(PoolType.NETFS, conn, name, host, path);
            } catch (LibvirtException e) {
                s_logger.error("Failed to create netfs mount: " + host + ":" + path, e);
                s_logger.error(e.getStackTrace());
                throw new CloudRuntimeException(e.toString());
            }
        } else if (type == StoragePoolType.Gluster) {
            try {
                sp = createNetfsStoragePool(PoolType.GLUSTERFS, conn, name, host, path);
            } catch (LibvirtException e) {
                s_logger.error("Failed to create glusterfs mount: " + host + ":" + path, e);
                s_logger.error(e.getStackTrace());
                throw new CloudRuntimeException(e.toString());
            }
        } else if (type == StoragePoolType.SharedMountPoint || type == StoragePoolType.Filesystem) {
            sp = createSharedStoragePool(conn, name, host, path);
        } else if (type == StoragePoolType.RBD) {
            sp = createRBDStoragePool(conn, name, host, port, userInfo, path);
        } else if (type == StoragePoolType.CLVM) {
            sp = createCLVMStoragePool(conn, name, host, path);
        }
    }
    if (sp == null) {
        throw new CloudRuntimeException("Failed to create storage pool: " + name);
    }
    try {
        if (sp.isActive() == 0) {
            s_logger.debug("Attempting to activate pool " + name);
            sp.create(0);
        }
        return getStoragePool(name);
    } catch (LibvirtException e) {
        String error = e.toString();
        if (error.contains("Storage source conflict")) {
            throw new CloudRuntimeException("A pool matching this location already exists in libvirt, " + " but has a different UUID/Name. Cannot create new pool without first " + " removing it. Check for inactive pools via 'virsh pool-list --all'. " + error);
        } else {
            throw new CloudRuntimeException(error);
        }
    }
}
Also used : StoragePool(org.libvirt.StoragePool) LibvirtException(org.libvirt.LibvirtException) CloudRuntimeException(com.cloud.utils.exception.CloudRuntimeException) Connect(org.libvirt.Connect) LibvirtStoragePoolDef(com.cloud.hypervisor.kvm.resource.LibvirtStoragePoolDef)

Example 12 with StoragePool

use of org.libvirt.StoragePool in project cloudstack by apache.

the class LibvirtStorageAdaptor method createSharedStoragePool.

private StoragePool createSharedStoragePool(Connect conn, String uuid, String host, String path) {
    String mountPoint = path;
    if (!_storageLayer.exists(mountPoint)) {
        s_logger.error(mountPoint + " does not exists. Check local.storage.path in agent.properties.");
        return null;
    }
    LibvirtStoragePoolDef spd = new LibvirtStoragePoolDef(PoolType.DIR, uuid, uuid, host, path, path);
    StoragePool sp = null;
    try {
        s_logger.debug(spd.toString());
        sp = conn.storagePoolCreateXML(spd.toString(), 0);
        return sp;
    } catch (LibvirtException e) {
        s_logger.error(e.toString());
        if (sp != null) {
            try {
                if (sp.isPersistent() == 1) {
                    sp.destroy();
                    sp.undefine();
                } else {
                    sp.destroy();
                }
                sp.free();
            } catch (LibvirtException l) {
                s_logger.debug("Failed to define shared mount point storage pool with: " + l.toString());
            }
        }
        return null;
    }
}
Also used : StoragePool(org.libvirt.StoragePool) LibvirtException(org.libvirt.LibvirtException) LibvirtStoragePoolDef(com.cloud.hypervisor.kvm.resource.LibvirtStoragePoolDef)

Example 13 with StoragePool

use of org.libvirt.StoragePool in project cloudstack by apache.

the class LibvirtStorageAdaptor method createNetfsStoragePool.

private StoragePool createNetfsStoragePool(PoolType fsType, Connect conn, String uuid, String host, String path) throws LibvirtException {
    String targetPath = _mountPoint + File.separator + uuid;
    LibvirtStoragePoolDef spd = new LibvirtStoragePoolDef(fsType, uuid, uuid, host, path, targetPath);
    _storageLayer.mkdir(targetPath);
    StoragePool sp = null;
    try {
        s_logger.debug(spd.toString());
        sp = conn.storagePoolCreateXML(spd.toString(), 0);
        return sp;
    } catch (LibvirtException e) {
        s_logger.error(e.toString());
        // if error is that pool is mounted, try to handle it
        if (e.toString().contains("already mounted")) {
            s_logger.error("Attempting to unmount old mount libvirt is unaware of at " + targetPath);
            String result = Script.runSimpleBashScript("umount -l " + targetPath);
            if (result == null) {
                s_logger.error("Succeeded in unmounting " + targetPath);
                try {
                    sp = conn.storagePoolCreateXML(spd.toString(), 0);
                    s_logger.error("Succeeded in redefining storage");
                    return sp;
                } catch (LibvirtException l) {
                    s_logger.error("Target was already mounted, unmounted it but failed to redefine storage:" + l);
                }
            } else {
                s_logger.error("Failed in unmounting and redefining storage");
            }
        } else {
            s_logger.error("Internal error occurred when attempting to mount: specified path may be invalid");
            throw e;
        }
        if (sp != null) {
            try {
                if (sp.isPersistent() == 1) {
                    sp.destroy();
                    sp.undefine();
                } else {
                    sp.destroy();
                }
                sp.free();
            } catch (LibvirtException l) {
                s_logger.debug("Failed to undefine " + fsType.toString() + " storage pool with: " + l.toString());
            }
        }
        return null;
    }
}
Also used : StoragePool(org.libvirt.StoragePool) LibvirtException(org.libvirt.LibvirtException) LibvirtStoragePoolDef(com.cloud.hypervisor.kvm.resource.LibvirtStoragePoolDef)

Example 14 with StoragePool

use of org.libvirt.StoragePool in project CloudStack-archive by CloudStack-extras.

the class LibvirtStorageAdaptor method getStoragePool.

@Override
public KVMStoragePool getStoragePool(String uuid) {
    StoragePool storage = null;
    try {
        Connect conn = LibvirtConnection.getConnection();
        storage = conn.storagePoolLookupByUUIDString(uuid);
        if (storage.getInfo().state != StoragePoolState.VIR_STORAGE_POOL_RUNNING) {
            storage.create(0);
        }
        LibvirtStoragePoolDef spd = getStoragePoolDef(conn, storage);
        StoragePoolType type = null;
        if (spd.getPoolType() == LibvirtStoragePoolDef.poolType.NETFS || spd.getPoolType() == LibvirtStoragePoolDef.poolType.DIR) {
            type = StoragePoolType.Filesystem;
        }
        LibvirtStoragePool pool = new LibvirtStoragePool(uuid, storage.getName(), type, this, storage);
        pool.setLocalPath(spd.getTargetPath());
        getStats(pool);
        return pool;
    } catch (LibvirtException e) {
        throw new CloudRuntimeException(e.toString());
    }
}
Also used : StoragePool(org.libvirt.StoragePool) LibvirtException(org.libvirt.LibvirtException) StoragePoolType(com.cloud.storage.Storage.StoragePoolType) CloudRuntimeException(com.cloud.utils.exception.CloudRuntimeException) Connect(org.libvirt.Connect) LibvirtStoragePoolDef(com.cloud.agent.resource.computing.LibvirtStoragePoolDef)

Example 15 with StoragePool

use of org.libvirt.StoragePool in project CloudStack-archive by CloudStack-extras.

the class LibvirtStorageAdaptor method createNfsStoragePool.

private StoragePool createNfsStoragePool(Connect conn, String uuid, String host, String path) {
    String targetPath = _mountPoint + File.separator + uuid;
    LibvirtStoragePoolDef spd = new LibvirtStoragePoolDef(poolType.NETFS, uuid, uuid, host, path, targetPath);
    _storageLayer.mkdir(targetPath);
    StoragePool sp = null;
    try {
        s_logger.debug(spd.toString());
        sp = conn.storagePoolDefineXML(spd.toString(), 0);
        sp.create(0);
        return sp;
    } catch (LibvirtException e) {
        s_logger.debug(e.toString());
        if (sp != null) {
            try {
                sp.undefine();
                sp.free();
            } catch (LibvirtException l) {
                s_logger.debug("Failed to define nfs storage pool with: " + l.toString());
            }
        }
        return null;
    }
}
Also used : StoragePool(org.libvirt.StoragePool) LibvirtException(org.libvirt.LibvirtException) LibvirtStoragePoolDef(com.cloud.agent.resource.computing.LibvirtStoragePoolDef)

Aggregations

StoragePool (org.libvirt.StoragePool)31 LibvirtException (org.libvirt.LibvirtException)27 CloudRuntimeException (com.cloud.utils.exception.CloudRuntimeException)13 Connect (org.libvirt.Connect)8 LibvirtStoragePoolDef (com.cloud.agent.resource.computing.LibvirtStoragePoolDef)7 LibvirtStoragePoolDef (com.cloud.hypervisor.kvm.resource.LibvirtStoragePoolDef)7 StoragePoolInfo (org.libvirt.StoragePoolInfo)6 StorageVol (org.libvirt.StorageVol)4 StoragePoolType (com.cloud.storage.Storage.StoragePoolType)3 Secret (org.libvirt.Secret)3 LibvirtStorageVolumeDef (com.cloud.hypervisor.kvm.resource.LibvirtStorageVolumeDef)2 ArrayList (java.util.ArrayList)2 LibvirtStorageVolumeDef (com.cloud.agent.resource.computing.LibvirtStorageVolumeDef)1 LibvirtStorageVolumeDef.volFormat (com.cloud.agent.resource.computing.LibvirtStorageVolumeDef.volFormat)1 LibvirtSecretDef (com.cloud.hypervisor.kvm.resource.LibvirtSecretDef)1 VolumeFormat (com.cloud.hypervisor.kvm.resource.LibvirtStorageVolumeDef.VolumeFormat)1 File (java.io.File)1 URI (java.net.URI)1