You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by al...@apache.org on 2012/07/31 22:40:02 UTC
[23/50] [abbrv] Move KVM related code into plugins/hypervisor/kvm,
a new jar file is created: cloud-kvm.jar
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7a0a9231/agent/src/com/cloud/agent/storage/KVMStoragePoolManager.java
----------------------------------------------------------------------
diff --git a/agent/src/com/cloud/agent/storage/KVMStoragePoolManager.java b/agent/src/com/cloud/agent/storage/KVMStoragePoolManager.java
deleted file mode 100644
index a82318d..0000000
--- a/agent/src/com/cloud/agent/storage/KVMStoragePoolManager.java
+++ /dev/null
@@ -1,109 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements. See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership. The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License. You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied. See the License for the
-// specific language governing permissions and limitations
-// under the License.
-package com.cloud.agent.storage;
-
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-
-import com.cloud.agent.resource.computing.KVMHABase;
-import com.cloud.agent.resource.computing.KVMHABase.PoolType;
-import com.cloud.agent.resource.computing.KVMHAMonitor;
-import com.cloud.agent.storage.KVMPhysicalDisk.PhysicalDiskFormat;
-import com.cloud.storage.Storage.StoragePoolType;
-import com.cloud.storage.StorageLayer;
-
-public class KVMStoragePoolManager {
- private StorageAdaptor _storageAdaptor;
- private KVMHAMonitor _haMonitor;
- private final Map<String, Object> _storagePools = new ConcurrentHashMap<String, Object>();
-
- private void addStoragePool(String uuid) {
- synchronized (_storagePools) {
- if (!_storagePools.containsKey(uuid)) {
- _storagePools.put(uuid, new Object());
- }
- }
- }
-
- public KVMStoragePoolManager(StorageLayer storagelayer, KVMHAMonitor monitor) {
- this._storageAdaptor = new LibvirtStorageAdaptor(storagelayer);
- this._haMonitor = monitor;
- }
-
- public KVMStoragePool getStoragePool(String uuid) {
- return this._storageAdaptor.getStoragePool(uuid);
- }
-
- public KVMStoragePool getStoragePoolByURI(String uri) {
- return this._storageAdaptor.getStoragePoolByUri(uri);
- }
-
- public KVMStoragePool createStoragePool(String name, String host, int port, String path,
- String userInfo, StoragePoolType type) {
- KVMStoragePool pool = this._storageAdaptor.createStoragePool(name,
- host, port, path, userInfo, type);
- if (type == StoragePoolType.NetworkFilesystem) {
- KVMHABase.NfsStoragePool nfspool = new KVMHABase.NfsStoragePool(
- pool.getUuid(), host, path, pool.getLocalPath(),
- PoolType.PrimaryStorage);
- _haMonitor.addStoragePool(nfspool);
- }
- addStoragePool(pool.getUuid());
- return pool;
- }
-
- public boolean deleteStoragePool(String uuid) {
- _haMonitor.removeStoragePool(uuid);
- this._storageAdaptor.deleteStoragePool(uuid);
- _storagePools.remove(uuid);
- return true;
- }
-
- public KVMPhysicalDisk createDiskFromTemplate(KVMPhysicalDisk template, String name,
- KVMStoragePool destPool) {
- if (destPool.getType() == StoragePoolType.RBD) {
- return this._storageAdaptor.createDiskFromTemplate(template, name,
- KVMPhysicalDisk.PhysicalDiskFormat.RAW, template.getSize(), destPool);
- } else {
- return this._storageAdaptor.createDiskFromTemplate(template, name,
- KVMPhysicalDisk.PhysicalDiskFormat.QCOW2,
- template.getSize(), destPool);
- }
- }
-
- public KVMPhysicalDisk createTemplateFromDisk(KVMPhysicalDisk disk,
- String name, PhysicalDiskFormat format, long size,
- KVMStoragePool destPool) {
- return this._storageAdaptor.createTemplateFromDisk(disk, name, format,
- size, destPool);
- }
-
- public KVMPhysicalDisk copyPhysicalDisk(KVMPhysicalDisk disk, String name,
- KVMStoragePool destPool) {
- return this._storageAdaptor.copyPhysicalDisk(disk, name, destPool);
- }
-
- public KVMPhysicalDisk createDiskFromSnapshot(KVMPhysicalDisk snapshot,
- String snapshotName, String name, KVMStoragePool destPool) {
- return this._storageAdaptor.createDiskFromSnapshot(snapshot,
- snapshotName, name, destPool);
- }
-
- public KVMPhysicalDisk getPhysicalDiskFromUrl(String url) {
- return this._storageAdaptor.getPhysicalDiskFromURI(url);
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7a0a9231/agent/src/com/cloud/agent/storage/KVMVirtualDisk.java
----------------------------------------------------------------------
diff --git a/agent/src/com/cloud/agent/storage/KVMVirtualDisk.java b/agent/src/com/cloud/agent/storage/KVMVirtualDisk.java
deleted file mode 100644
index c454b12..0000000
--- a/agent/src/com/cloud/agent/storage/KVMVirtualDisk.java
+++ /dev/null
@@ -1,21 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements. See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership. The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License. You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied. See the License for the
-// specific language governing permissions and limitations
-// under the License.
-package com.cloud.agent.storage;
-
-public class KVMVirtualDisk {
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7a0a9231/agent/src/com/cloud/agent/storage/LibvirtStorageAdaptor.java
----------------------------------------------------------------------
diff --git a/agent/src/com/cloud/agent/storage/LibvirtStorageAdaptor.java b/agent/src/com/cloud/agent/storage/LibvirtStorageAdaptor.java
deleted file mode 100644
index da000aa..0000000
--- a/agent/src/com/cloud/agent/storage/LibvirtStorageAdaptor.java
+++ /dev/null
@@ -1,901 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements. See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership. The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License. You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied. See the License for the
-// specific language governing permissions and limitations
-// under the License.
-package com.cloud.agent.storage;
-
-import java.io.File;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.UUID;
-import org.apache.log4j.Logger;
-import org.apache.commons.codec.binary.Base64;
-import org.libvirt.Connect;
-import org.libvirt.LibvirtException;
-import org.libvirt.Secret;
-import org.libvirt.StoragePool;
-import org.libvirt.StoragePoolInfo;
-import org.libvirt.StorageVol;
-import org.libvirt.StoragePoolInfo.StoragePoolState;
-
-import com.cloud.agent.api.ManageSnapshotCommand;
-import com.cloud.agent.resource.computing.LibvirtConnection;
-import com.cloud.agent.resource.computing.LibvirtSecretDef;
-import com.cloud.agent.resource.computing.LibvirtSecretDef.usage;
-import com.cloud.agent.resource.computing.LibvirtStoragePoolDef;
-import com.cloud.agent.resource.computing.LibvirtStoragePoolXMLParser;
-import com.cloud.agent.resource.computing.LibvirtStorageVolumeDef;
-import com.cloud.agent.resource.computing.LibvirtStoragePoolDef.poolType;
-import com.cloud.agent.resource.computing.LibvirtStoragePoolDef.authType;
-import com.cloud.agent.resource.computing.LibvirtStorageVolumeDef.volFormat;
-import com.cloud.agent.resource.computing.LibvirtStorageVolumeXMLParser;
-import com.cloud.agent.storage.KVMPhysicalDisk.PhysicalDiskFormat;
-import com.cloud.exception.InternalErrorException;
-import com.cloud.storage.Storage.StoragePoolType;
-import com.cloud.storage.StorageLayer;
-import com.cloud.utils.exception.CloudRuntimeException;
-import com.cloud.utils.script.OutputInterpreter;
-import com.cloud.utils.script.Script;
-
-public class LibvirtStorageAdaptor implements StorageAdaptor {
- private static final Logger s_logger = Logger
- .getLogger(LibvirtStorageAdaptor.class);
- private StorageLayer _storageLayer;
- private String _mountPoint = "/mnt";
- private String _manageSnapshotPath;
-
- public LibvirtStorageAdaptor(StorageLayer storage) {
- _storageLayer = storage;
- _manageSnapshotPath = Script.findScript("scripts/storage/qcow2/",
- "managesnapshot.sh");
- }
-
- @Override
- public boolean createFolder(String uuid, String path) {
- String mountPoint = _mountPoint + File.separator + uuid;
- File f = new File(mountPoint + path);
- if (!f.exists()) {
- f.mkdirs();
- }
- return true;
- }
-
- public StorageVol getVolume(StoragePool pool, String volName) {
- StorageVol vol = null;
-
- try {
- vol = pool.storageVolLookupByName(volName);
- } catch (LibvirtException e) {
-
- }
- if (vol == null) {
- storagePoolRefresh(pool);
- try {
- vol = pool.storageVolLookupByName(volName);
- } catch (LibvirtException e) {
- throw new CloudRuntimeException(e.toString());
- }
- }
- return vol;
- }
-
- public StorageVol createVolume(Connect conn, StoragePool pool, String uuid,
- long size, volFormat format) throws LibvirtException {
- LibvirtStorageVolumeDef volDef = new LibvirtStorageVolumeDef(UUID
- .randomUUID().toString(), size, format, null, null);
- s_logger.debug(volDef.toString());
- return pool.storageVolCreateXML(volDef.toString(), 0);
- }
-
- public StoragePool getStoragePoolbyURI(Connect conn, URI uri)
- throws LibvirtException {
- String sourcePath;
- String uuid;
- String sourceHost = "";
- String protocal;
- if (uri.getScheme().equalsIgnoreCase("local")) {
- sourcePath = _mountPoint + File.separator
- + uri.toString().replace("local:///", "");
- sourcePath = sourcePath.replace("//", "/");
- uuid = UUID.nameUUIDFromBytes(new String(sourcePath).getBytes())
- .toString();
- protocal = "DIR";
- } else {
- sourcePath = uri.getPath();
- sourcePath = sourcePath.replace("//", "/");
- sourceHost = uri.getHost();
- uuid = UUID.nameUUIDFromBytes(
- new String(sourceHost + sourcePath).getBytes()).toString();
- protocal = "NFS";
- }
-
- String targetPath = _mountPoint + File.separator + uuid;
- StoragePool sp = null;
- try {
- sp = conn.storagePoolLookupByUUIDString(uuid);
- } catch (LibvirtException e) {
- }
-
- if (sp == null) {
- try {
- LibvirtStoragePoolDef spd = null;
- if (protocal.equalsIgnoreCase("NFS")) {
- _storageLayer.mkdir(targetPath);
- spd = new LibvirtStoragePoolDef(poolType.NETFS, uuid, uuid,
- sourceHost, sourcePath, targetPath);
- s_logger.debug(spd.toString());
- // addStoragePool(uuid);
-
- } else if (protocal.equalsIgnoreCase("DIR")) {
- _storageLayer.mkdir(targetPath);
- spd = new LibvirtStoragePoolDef(poolType.DIR, uuid, uuid,
- null, null, sourcePath);
- }
-
- synchronized (getStoragePool(uuid)) {
- sp = conn.storagePoolDefineXML(spd.toString(), 0);
- if (sp == null) {
- s_logger.debug("Failed to define storage pool");
- return null;
- }
- sp.create(0);
- }
-
- return sp;
- } catch (LibvirtException e) {
- try {
- if (sp != null) {
- sp.undefine();
- sp.free();
- }
- } catch (LibvirtException l) {
-
- }
- throw e;
- }
- } else {
- StoragePoolInfo spi = sp.getInfo();
- if (spi.state != StoragePoolState.VIR_STORAGE_POOL_RUNNING) {
- sp.create(0);
- }
- return sp;
- }
- }
-
- public void storagePoolRefresh(StoragePool pool) {
- try {
- synchronized (getStoragePool(pool.getUUIDString())) {
- pool.refresh(0);
- }
- } catch (LibvirtException e) {
-
- }
- }
-
- 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;
- }
- }
-
- private StoragePool CreateSharedStoragePool(Connect conn, String uuid,
- String host, String path) {
- String mountPoint = path;
- if (!_storageLayer.exists(mountPoint)) {
- return null;
- }
- LibvirtStoragePoolDef spd = new LibvirtStoragePoolDef(poolType.DIR,
- uuid, uuid, host, path, path);
- 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 shared mount point storage pool with: "
- + l.toString());
- }
- }
- return null;
- }
- }
-
- private StoragePool createCLVMStoragePool(Connect conn, String uuid,
- String host, String path) {
-
- String volgroupPath = "/dev/" + path;
- String volgroupName = path;
- volgroupName = volgroupName.replaceFirst("/", "");
-
- LibvirtStoragePoolDef spd = new LibvirtStoragePoolDef(poolType.LOGICAL,
- volgroupName, uuid, host, volgroupPath, volgroupPath);
- 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 clvm storage pool with: "
- + l.toString());
- }
- }
- return null;
- }
-
- }
-
- private StoragePool createRBDStoragePool(Connect conn, String uuid,
- String host, int port, String userInfo, String path) {
-
- LibvirtStoragePoolDef spd;
- StoragePool sp = null;
-
- String[] userInfoTemp = userInfo.split(":");
- if (userInfoTemp.length == 2) {
- s_logger.debug("libvirt secret information found. id: " + userInfoTemp[0] + " secret: " + userInfoTemp[1]);
- LibvirtSecretDef sd = new LibvirtSecretDef(usage.CEPH, uuid);
-
- Secret s = null;
-
- sd.setCephName(userInfoTemp[0]);
-
- try {
- s_logger.debug(sd.toString());
- s = conn.secretDefineXML(sd.toString());
- s.setValue(Base64.decodeBase64(userInfoTemp[1]));
- } catch (LibvirtException e) {
- s_logger.debug(e.toString());
- if (s != null) {
- try {
- s.undefine();
- s.free();
- } catch (LibvirtException l) {
- s_logger.debug("Failed to define secret with: " + l.toString());
- }
- }
- }
- spd = new LibvirtStoragePoolDef(poolType.RBD, uuid, uuid, host, port, path, userInfoTemp[0], authType.CEPH, uuid);
- } else {
- spd = new LibvirtStoragePoolDef(poolType.RBD, uuid, uuid, host, port, path, "");
- }
-
- 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 RBD storage pool with: " + l.toString());
- }
- }
- return null;
- }
- }
-
- public StorageVol copyVolume(StoragePool destPool,
- LibvirtStorageVolumeDef destVol, StorageVol srcVol, int timeout)
- throws LibvirtException {
- StorageVol vol = destPool.storageVolCreateXML(destVol.toString(), 0);
- String srcPath = srcVol.getKey();
- String destPath = vol.getKey();
- Script.runSimpleBashScript("cp " + srcPath + " " + destPath, timeout);
- return vol;
- }
-
- public boolean copyVolume(String srcPath, String destPath,
- String volumeName, int timeout) throws InternalErrorException {
- _storageLayer.mkdirs(destPath);
- if (!_storageLayer.exists(srcPath)) {
- throw new InternalErrorException("volume:" + srcPath
- + " is not exits");
- }
- String result = Script.runSimpleBashScript("cp " + srcPath + " "
- + destPath + File.separator + volumeName, timeout);
- if (result != null) {
- return false;
- } else {
- return true;
- }
- }
-
- public LibvirtStoragePoolDef getStoragePoolDef(Connect conn,
- StoragePool pool) throws LibvirtException {
- String poolDefXML = pool.getXMLDesc(0);
- LibvirtStoragePoolXMLParser parser = new LibvirtStoragePoolXMLParser();
- return parser.parseStoragePoolXML(poolDefXML);
- }
-
- public LibvirtStorageVolumeDef getStorageVolumeDef(Connect conn,
- StorageVol vol) throws LibvirtException {
- String volDefXML = vol.getXMLDesc(0);
- LibvirtStorageVolumeXMLParser parser = new LibvirtStorageVolumeXMLParser();
- return parser.parseStorageVolumeXML(volDefXML);
- }
-
- public StorageVol getVolumeFromURI(Connect conn, String volPath)
- throws LibvirtException, URISyntaxException {
- int index = volPath.lastIndexOf("/");
- URI volDir = null;
- StoragePool sp = null;
- StorageVol vol = null;
- try {
- volDir = new URI(volPath.substring(0, index));
- String volName = volPath.substring(index + 1);
- sp = getStoragePoolbyURI(conn, volDir);
- vol = sp.storageVolLookupByName(volName);
- return vol;
- } catch (LibvirtException e) {
- s_logger.debug("Faild to get vol path: " + e.toString());
- throw e;
- } finally {
- try {
- if (sp != null) {
- sp.free();
- }
- } catch (LibvirtException e) {
-
- }
- }
- }
-
- public StoragePool createFileBasedStoragePool(Connect conn,
- String localStoragePath, String uuid) {
- if (!(_storageLayer.exists(localStoragePath) && _storageLayer
- .isDirectory(localStoragePath))) {
- return null;
- }
-
- File path = new File(localStoragePath);
- if (!(path.canWrite() && path.canRead() && path.canExecute())) {
- return null;
- }
-
- StoragePool pool = null;
-
- try {
- pool = conn.storagePoolLookupByUUIDString(uuid);
- } catch (LibvirtException e) {
-
- }
-
- if (pool == null) {
- LibvirtStoragePoolDef spd = new LibvirtStoragePoolDef(poolType.DIR,
- uuid, uuid, null, null, localStoragePath);
- try {
- pool = conn.storagePoolDefineXML(spd.toString(), 0);
- pool.create(0);
- } catch (LibvirtException e) {
- if (pool != null) {
- try {
- pool.destroy();
- pool.undefine();
- } catch (LibvirtException e1) {
- }
- pool = null;
- }
- throw new CloudRuntimeException(e.toString());
- }
- }
-
- try {
- StoragePoolInfo spi = pool.getInfo();
- if (spi.state != StoragePoolState.VIR_STORAGE_POOL_RUNNING) {
- pool.create(0);
- }
-
- } catch (LibvirtException e) {
- throw new CloudRuntimeException(e.toString());
- }
-
- return pool;
- }
-
- private void getStats(LibvirtStoragePool pool) {
- Script statsScript = new Script("/bin/bash", s_logger);
- statsScript.add("-c");
- statsScript.add("stats=$(df --total " + pool.getLocalPath()
- + " |grep total|awk '{print $2,$3}');echo $stats");
- final OutputInterpreter.OneLineParser statsParser = new OutputInterpreter.OneLineParser();
- String result = statsScript.execute(statsParser);
- if (result == null) {
- String stats = statsParser.getLine();
- if (stats != null && !stats.isEmpty()) {
- String sizes[] = stats.trim().split(" ");
- if (sizes.length == 2) {
- pool.setCapacity(Long.parseLong(sizes[0]) * 1024);
- pool.setUsed(Long.parseLong(sizes[1]) * 1024);
- }
- }
- }
- }
-
- @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;
- } else if (spd.getPoolType() == LibvirtStoragePoolDef.poolType.RBD) {
- type = StoragePoolType.RBD;
- }
-
- LibvirtStoragePool pool = new LibvirtStoragePool(uuid, storage.getName(),
- type, this, storage);
-
- if (pool.getType() != StoragePoolType.RBD) {
- pool.setLocalPath(spd.getTargetPath());
- } else {
- pool.setLocalPath("");
- pool.setSourceHost(spd.getSourceHost());
- pool.setSourcePort(spd.getSourcePort());
- pool.setSourceDir(spd.getSourceDir());
- String authUsername = spd.getAuthUserName();
- if (authUsername != null) {
- Secret secret = conn.secretLookupByUUIDString(spd.getSecretUUID());
- String secretValue = new String(Base64.encodeBase64(secret.getByteValue()));
- pool.setAuthUsername(authUsername);
- pool.setAuthSecret(secretValue);
- }
- }
-
- if (pool.getType() == StoragePoolType.RBD) {
- pool.setCapacity(storage.getInfo().capacity);
- pool.setUsed(storage.getInfo().allocation);
- } else {
- getStats(pool);
- }
-
- return pool;
- } catch (LibvirtException e) {
- throw new CloudRuntimeException(e.toString());
- }
- }
-
- @Override
- public KVMPhysicalDisk getPhysicalDisk(String volumeUuid,
- KVMStoragePool pool) {
- LibvirtStoragePool libvirtPool = (LibvirtStoragePool) pool;
-
- try {
- StorageVol vol = this.getVolume(libvirtPool.getPool(), volumeUuid);
- KVMPhysicalDisk disk;
- LibvirtStorageVolumeDef voldef = getStorageVolumeDef(libvirtPool
- .getPool().getConnect(), vol);
- disk = new KVMPhysicalDisk(vol.getPath(), vol.getName(), pool);
- disk.setSize(vol.getInfo().allocation);
- disk.setVirtualSize(vol.getInfo().capacity);
- if (voldef.getFormat() == null) {
- disk.setFormat(pool.getDefaultFormat());
- } else if (pool.getType() == StoragePoolType.RBD) {
- disk.setFormat(KVMPhysicalDisk.PhysicalDiskFormat.RAW);
- } else if (voldef.getFormat() == LibvirtStorageVolumeDef.volFormat.QCOW2) {
- disk.setFormat(KVMPhysicalDisk.PhysicalDiskFormat.QCOW2);
- } else if (voldef.getFormat() == LibvirtStorageVolumeDef.volFormat.RAW) {
- disk.setFormat(KVMPhysicalDisk.PhysicalDiskFormat.RAW);
- }
- return disk;
- } catch (LibvirtException e) {
- throw new CloudRuntimeException(e.toString());
- }
-
- }
-
- @Override
- public KVMStoragePool createStoragePool(String name, String host, int port,
- String path, String userInfo, StoragePoolType type) {
- 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.getInfo().state != StoragePoolState.VIR_STORAGE_POOL_RUNNING) {
- sp.undefine();
- sp = null;
- }
- } catch (LibvirtException e) {
-
- }
-
- if (sp == null) {
- if (type == StoragePoolType.NetworkFilesystem) {
- sp = createNfsStoragePool(conn, name, host, path);
- } 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);
- }
- }
-
- try {
- StoragePoolInfo spi = sp.getInfo();
- if (spi.state != StoragePoolState.VIR_STORAGE_POOL_RUNNING) {
- sp.create(0);
- }
-
- LibvirtStoragePoolDef spd = getStoragePoolDef(conn, sp);
- LibvirtStoragePool pool = new LibvirtStoragePool(name,
- sp.getName(), type, this, sp);
-
- if (pool.getType() != StoragePoolType.RBD) {
- pool.setLocalPath(spd.getTargetPath());
- } else {
- pool.setLocalPath("");
- }
-
- if (pool.getType() == StoragePoolType.RBD) {
- pool.setCapacity(sp.getInfo().capacity);
- pool.setUsed(sp.getInfo().allocation);
- } else {
- getStats(pool);
- }
- return pool;
- } catch (LibvirtException e) {
- throw new CloudRuntimeException(e.toString());
- }
- }
-
- @Override
- public boolean deleteStoragePool(String uuid) {
- Connect conn = null;
- try {
- conn = LibvirtConnection.getConnection();
- } catch (LibvirtException e) {
- throw new CloudRuntimeException(e.toString());
- }
-
- StoragePool sp = null;
- Secret s = null;
-
- try {
- sp = conn.storagePoolLookupByUUIDString(uuid);
- } catch (LibvirtException e) {
- return true;
- }
-
- /*
- * Some storage pools, like RBD also have 'secret' information stored in libvirt
- * Destroy them if they exist
- */
- try {
- s = conn.secretLookupByUUIDString(uuid);
- } catch (LibvirtException e) {
- }
-
- try {
- sp.destroy();
- sp.undefine();
- sp.free();
- if (s != null) {
- s.undefine();
- s.free();
- }
- return true;
- } catch (LibvirtException e) {
- throw new CloudRuntimeException(e.toString());
- }
- }
-
- @Override
- public KVMPhysicalDisk createPhysicalDisk(String name, KVMStoragePool pool,
- PhysicalDiskFormat format, long size) {
- LibvirtStoragePool libvirtPool = (LibvirtStoragePool) pool;
- StoragePool virtPool = libvirtPool.getPool();
- LibvirtStorageVolumeDef.volFormat libvirtformat = null;
-
- if (pool.getType() == StoragePoolType.RBD) {
- format = PhysicalDiskFormat.RAW;
- }
-
- if (format == PhysicalDiskFormat.QCOW2) {
- libvirtformat = LibvirtStorageVolumeDef.volFormat.QCOW2;
- } else if (format == PhysicalDiskFormat.RAW) {
- libvirtformat = LibvirtStorageVolumeDef.volFormat.RAW;
- }
-
- LibvirtStorageVolumeDef volDef = new LibvirtStorageVolumeDef(name,
- size, libvirtformat, null, null);
- s_logger.debug(volDef.toString());
- try {
- StorageVol vol = virtPool.storageVolCreateXML(volDef.toString(), 0);
- KVMPhysicalDisk disk = new KVMPhysicalDisk(vol.getPath(),
- vol.getName(), pool);
- disk.setFormat(format);
- disk.setSize(vol.getInfo().allocation);
- disk.setVirtualSize(vol.getInfo().capacity);
- return disk;
- } catch (LibvirtException e) {
- throw new CloudRuntimeException(e.toString());
- }
- }
-
- @Override
- public boolean deletePhysicalDisk(String uuid, KVMStoragePool pool) {
- LibvirtStoragePool libvirtPool = (LibvirtStoragePool) pool;
- try {
- StorageVol vol = this.getVolume(libvirtPool.getPool(), uuid);
- vol.delete(0);
- vol.free();
- return true;
- } catch (LibvirtException e) {
- throw new CloudRuntimeException(e.toString());
- }
- }
-
- @Override
- public KVMPhysicalDisk createDiskFromTemplate(KVMPhysicalDisk template,
- String name, PhysicalDiskFormat format, long size, KVMStoragePool destPool) {
-
- String newUuid = UUID.randomUUID().toString();
- KVMStoragePool srcPool = template.getPool();
- KVMPhysicalDisk disk = null;
-
- /*
- With RBD you can't run qemu-img convert with an existing RBD image as destination
- qemu-img will exit with the error that the destination already exists.
- So for RBD we don't create the image, but let qemu-img do that for us.
-
- We then create a KVMPhysicalDisk object that we can return
- */
-
- if (destPool.getType() != StoragePoolType.RBD) {
- disk = destPool.createPhysicalDisk(newUuid, format, template.getVirtualSize());
-
- Script.runSimpleBashScript("qemu-img create -f "
- + template.getFormat() + " -b " + template.getPath() + " "
- + disk.getPath());
- } else {
- disk = new KVMPhysicalDisk(destPool.getSourceDir() + "/" + newUuid, newUuid, destPool);
- disk.setFormat(format);
- disk.setSize(template.getVirtualSize());
- disk.setVirtualSize(disk.getSize());
-
- if (srcPool.getType() != StoragePoolType.RBD) {
- Script.runSimpleBashScript("qemu-img convert"
- + " -f " + template.getFormat()
- + " -O " + format
- + " " + template.getPath()
- + " " + KVMPhysicalDisk.RBDStringBuilder(destPool.getSourceHost(),
- destPool.getSourcePort(),
- destPool.getAuthUserName(),
- destPool.getAuthSecret(),
- disk.getPath()));
- } else {
- template.setFormat(PhysicalDiskFormat.RAW);
- Script.runSimpleBashScript("qemu-img convert"
- + " -f " + template.getFormat()
- + " -O " + format
- + " " + KVMPhysicalDisk.RBDStringBuilder(srcPool.getSourceHost(),
- srcPool.getSourcePort(),
- srcPool.getAuthUserName(),
- srcPool.getAuthSecret(),
- template.getPath())
- + " " + KVMPhysicalDisk.RBDStringBuilder(destPool.getSourceHost(),
- destPool.getSourcePort(),
- destPool.getAuthUserName(),
- destPool.getAuthSecret(),
- disk.getPath()));
- }
- }
- return disk;
- }
-
- @Override
- public KVMPhysicalDisk createTemplateFromDisk(KVMPhysicalDisk disk,
- String name, PhysicalDiskFormat format, long size,
- KVMStoragePool destPool) {
- return null;
- }
-
- @Override
- public List<KVMPhysicalDisk> listPhysicalDisks(String storagePoolUuid,
- KVMStoragePool pool) {
- LibvirtStoragePool libvirtPool = (LibvirtStoragePool) pool;
- StoragePool virtPool = libvirtPool.getPool();
- List<KVMPhysicalDisk> disks = new ArrayList<KVMPhysicalDisk>();
- try {
- String[] vols = virtPool.listVolumes();
- for (String volName : vols) {
- KVMPhysicalDisk disk = this.getPhysicalDisk(volName, pool);
- disks.add(disk);
- }
- return disks;
- } catch (LibvirtException e) {
- throw new CloudRuntimeException(e.toString());
- }
- }
-
- @Override
- public KVMPhysicalDisk copyPhysicalDisk(KVMPhysicalDisk disk, String name,
- KVMStoragePool destPool) {
-
- /*
- With RBD you can't run qemu-img convert with an existing RBD image as destination
- qemu-img will exit with the error that the destination already exists.
- So for RBD we don't create the image, but let qemu-img do that for us.
-
- We then create a KVMPhysicalDisk object that we can return
- */
-
- KVMPhysicalDisk newDisk;
- if (destPool.getType() != StoragePoolType.RBD) {
- newDisk = destPool.createPhysicalDisk(name, disk.getVirtualSize());
- } else {
- newDisk = new KVMPhysicalDisk(destPool.getSourceDir() + "/" + name, name, destPool);
- newDisk.setFormat(PhysicalDiskFormat.RAW);
- newDisk.setSize(disk.getVirtualSize());
- newDisk.setVirtualSize(disk.getSize());
- }
-
- KVMStoragePool srcPool = disk.getPool();
- String destPath = newDisk.getPath();
- String sourcePath = disk.getPath();
- PhysicalDiskFormat sourceFormat = disk.getFormat();
- PhysicalDiskFormat destFormat = newDisk.getFormat();
-
- if ((srcPool.getType() != StoragePoolType.RBD) && (destPool.getType() != StoragePoolType.RBD)) {
- Script.runSimpleBashScript("qemu-img convert -f " + sourceFormat
- + " -O " + destFormat
- + " " + sourcePath
- + " " + destPath);
- } else if ((srcPool.getType() != StoragePoolType.RBD) && (destPool.getType() == StoragePoolType.RBD)) {
- Script.runSimpleBashScript("qemu-img convert -f " + sourceFormat
- + " -O " + destFormat
- + " " + sourcePath
- + " " + KVMPhysicalDisk.RBDStringBuilder(destPool.getSourceHost(),
- destPool.getSourcePort(),
- destPool.getAuthUserName(),
- destPool.getAuthSecret(),
- destPath));
- } else {
- Script.runSimpleBashScript("qemu-img convert -f " + sourceFormat
- + " -O " + destFormat
- + " " + KVMPhysicalDisk.RBDStringBuilder(srcPool.getSourceHost(),
- srcPool.getSourcePort(),
- srcPool.getAuthUserName(),
- srcPool.getAuthSecret(),
- sourcePath)
- + " " + KVMPhysicalDisk.RBDStringBuilder(destPool.getSourceHost(),
- destPool.getSourcePort(),
- destPool.getAuthUserName(),
- destPool.getAuthSecret(),
- destPath));
- }
-
- return newDisk;
- }
-
- @Override
- public KVMStoragePool getStoragePoolByUri(String uri) {
- URI storageUri = null;
-
- try {
- storageUri = new URI(uri);
- } catch (URISyntaxException e) {
- throw new CloudRuntimeException(e.toString());
- }
-
- String sourcePath = null;
- String uuid = null;
- String sourceHost = "";
- StoragePoolType protocal = null;
- if (storageUri.getScheme().equalsIgnoreCase("nfs")) {
- sourcePath = storageUri.getPath();
- sourcePath = sourcePath.replace("//", "/");
- sourceHost = storageUri.getHost();
- uuid = UUID.randomUUID().toString();
- protocal = StoragePoolType.NetworkFilesystem;
- }
-
- return createStoragePool(uuid, sourceHost, 0, sourcePath, "", protocal);
- }
-
- @Override
- public KVMPhysicalDisk getPhysicalDiskFromURI(String uri) {
- // TODO Auto-generated method stub
- return null;
- }
-
- @Override
- public KVMPhysicalDisk createDiskFromSnapshot(KVMPhysicalDisk snapshot,
- String snapshotName, String name, KVMStoragePool destPool) {
- return null;
- }
-
- @Override
- public boolean refresh(KVMStoragePool pool) {
- LibvirtStoragePool libvirtPool = (LibvirtStoragePool) pool;
- StoragePool virtPool = libvirtPool.getPool();
- try {
- virtPool.refresh(0);
- } catch (LibvirtException e) {
- return false;
- }
- return true;
- }
-
- @Override
- public boolean deleteStoragePool(KVMStoragePool pool) {
- LibvirtStoragePool libvirtPool = (LibvirtStoragePool) pool;
- StoragePool virtPool = libvirtPool.getPool();
- try {
- virtPool.destroy();
- virtPool.undefine();
- virtPool.free();
- } catch (LibvirtException e) {
- return false;
- }
-
- return true;
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7a0a9231/agent/src/com/cloud/agent/storage/LibvirtStoragePool.java
----------------------------------------------------------------------
diff --git a/agent/src/com/cloud/agent/storage/LibvirtStoragePool.java b/agent/src/com/cloud/agent/storage/LibvirtStoragePool.java
deleted file mode 100644
index 943b8b2..0000000
--- a/agent/src/com/cloud/agent/storage/LibvirtStoragePool.java
+++ /dev/null
@@ -1,208 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements. See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership. The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License. You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied. See the License for the
-// specific language governing permissions and limitations
-// under the License.
-package com.cloud.agent.storage;
-
-import java.util.List;
-
-import org.libvirt.StoragePool;
-
-import com.cloud.agent.storage.KVMPhysicalDisk.PhysicalDiskFormat;
-import com.cloud.storage.Storage.StoragePoolType;
-
-public class LibvirtStoragePool implements KVMStoragePool {
- protected String uuid;
- protected String uri;
- protected long capacity;
- protected long used;
- protected String name;
- protected String localPath;
- protected PhysicalDiskFormat defaultFormat;
- protected StoragePoolType type;
- protected StorageAdaptor _storageAdaptor;
- protected StoragePool _pool;
- protected String authUsername;
- protected String authSecret;
- protected String sourceHost;
- protected int sourcePort;
- protected String sourceDir;
-
- public LibvirtStoragePool(String uuid, String name, StoragePoolType type,
- StorageAdaptor adaptor, StoragePool pool) {
- this.uuid = uuid;
- this.name = name;
- this.type = type;
- this._storageAdaptor = adaptor;
- this.capacity = 0;
- this.used = 0;
- this._pool = pool;
-
- }
-
- public void setCapacity(long capacity) {
- this.capacity = capacity;
- }
-
- @Override
- public long getCapacity() {
- return this.capacity;
- }
-
- public void setUsed(long used) {
- this.used = used;
- }
-
- @Override
- public long getUsed() {
- return this.used;
- }
-
- public StoragePoolType getStoragePoolType() {
- return this.type;
- }
-
- public String getName() {
- return this.name;
- }
-
- public String getUuid() {
- return this.uuid;
- }
-
- public String uri() {
- return this.uri;
- }
-
- @Override
- public PhysicalDiskFormat getDefaultFormat() {
- return PhysicalDiskFormat.QCOW2;
- }
-
- @Override
- public KVMPhysicalDisk createPhysicalDisk(String name,
- PhysicalDiskFormat format, long size) {
- return this._storageAdaptor
- .createPhysicalDisk(name, this, format, size);
- }
-
- @Override
- public KVMPhysicalDisk createPhysicalDisk(String name, long size) {
- return this._storageAdaptor.createPhysicalDisk(name, this,
- this.getDefaultFormat(), size);
- }
-
- @Override
- public KVMPhysicalDisk getPhysicalDisk(String volumeUuid) {
- return this._storageAdaptor.getPhysicalDisk(volumeUuid, this);
- }
-
- @Override
- public boolean deletePhysicalDisk(String uuid) {
- return this._storageAdaptor.deletePhysicalDisk(uuid, this);
- }
-
- @Override
- public List<KVMPhysicalDisk> listPhysicalDisks() {
- return this._storageAdaptor.listPhysicalDisks(this.uuid, this);
- }
-
- @Override
- public boolean refresh() {
- return this._storageAdaptor.refresh(this);
- }
-
- @Override
- public boolean isExternalSnapshot() {
- if (this.type == StoragePoolType.Filesystem) {
- return false;
- }
-
- return true;
- }
-
- @Override
- public String getLocalPath() {
- return this.localPath;
- }
-
- public void setLocalPath(String localPath) {
- this.localPath = localPath;
- }
-
- @Override
- public String getAuthUserName() {
- return this.authUsername;
- }
-
- public void setAuthUsername(String authUsername) {
- this.authUsername = authUsername;
- }
-
- @Override
- public String getAuthSecret() {
- return this.authSecret;
- }
-
- public void setAuthSecret(String authSecret) {
- this.authSecret = authSecret;
- }
-
- @Override
- public String getSourceHost() {
- return this.sourceHost;
- }
-
- public void setSourceHost(String host) {
- this.sourceHost = host;
- }
-
- @Override
- public int getSourcePort() {
- return this.sourcePort;
- }
-
- public void setSourcePort(int port) {
- this.sourcePort = port;
- }
-
- @Override
- public String getSourceDir() {
- return this.sourceDir;
- }
-
- public void setSourceDir(String dir) {
- this.sourceDir = dir;
- }
-
- @Override
- public StoragePoolType getType() {
- return this.type;
- }
-
- public StoragePool getPool() {
- return this._pool;
- }
-
- @Override
- public boolean delete() {
- return this._storageAdaptor.deleteStoragePool(this);
- }
-
- @Override
- public boolean createFolder(String path) {
- return this._storageAdaptor.createFolder(this.uuid, path);
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7a0a9231/agent/src/com/cloud/agent/storage/StorageAdaptor.java
----------------------------------------------------------------------
diff --git a/agent/src/com/cloud/agent/storage/StorageAdaptor.java b/agent/src/com/cloud/agent/storage/StorageAdaptor.java
deleted file mode 100644
index 8238677..0000000
--- a/agent/src/com/cloud/agent/storage/StorageAdaptor.java
+++ /dev/null
@@ -1,70 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements. See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership. The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License. You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied. See the License for the
-// specific language governing permissions and limitations
-// under the License.
-package com.cloud.agent.storage;
-
-import java.util.List;
-
-import org.libvirt.StoragePool;
-
-import com.cloud.agent.storage.KVMPhysicalDisk.PhysicalDiskFormat;
-import com.cloud.storage.Storage.StoragePoolType;
-
-public interface StorageAdaptor {
-
- public KVMStoragePool getStoragePool(String uuid);
-
- public KVMPhysicalDisk getPhysicalDisk(String volumeUuid,
- KVMStoragePool pool);
-
- public KVMStoragePool createStoragePool(String name, String host, int port,
- String path, String userInfo, StoragePoolType type);
-
- public boolean deleteStoragePool(String uuid);
-
- public KVMPhysicalDisk createPhysicalDisk(String name, KVMStoragePool pool,
- PhysicalDiskFormat format, long size);
-
- public boolean deletePhysicalDisk(String uuid, KVMStoragePool pool);
-
- public KVMPhysicalDisk createDiskFromTemplate(KVMPhysicalDisk template,
- String name, PhysicalDiskFormat format, long size,
- KVMStoragePool destPool);
-
- public KVMPhysicalDisk createTemplateFromDisk(KVMPhysicalDisk disk,
- String name, PhysicalDiskFormat format, long size,
- KVMStoragePool destPool);
-
- public List<KVMPhysicalDisk> listPhysicalDisks(String storagePoolUuid,
- KVMStoragePool pool);
-
- public KVMPhysicalDisk copyPhysicalDisk(KVMPhysicalDisk disk, String name,
- KVMStoragePool destPools);
-
- public KVMPhysicalDisk createDiskFromSnapshot(KVMPhysicalDisk snapshot,
- String snapshotName, String name, KVMStoragePool destPool);
-
- public KVMStoragePool getStoragePoolByUri(String uri);
-
- public KVMPhysicalDisk getPhysicalDiskFromURI(String uri);
-
- public boolean refresh(KVMStoragePool pool);
-
- public boolean deleteStoragePool(KVMStoragePool pool);
-
- public boolean createFolder(String uuid, String path);
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7a0a9231/build/build-cloud-plugins.xml
----------------------------------------------------------------------
diff --git a/build/build-cloud-plugins.xml b/build/build-cloud-plugins.xml
index c16474d..a7a1f39 100755
--- a/build/build-cloud-plugins.xml
+++ b/build/build-cloud-plugins.xml
@@ -198,9 +198,14 @@
<!-- ===================== Hypervisors ========================= -->
- <target name="compile-hypervisors" depends="compile-ovm, compile-xen, compile-vmware" description="Compile all hypervisors"/>
- <target name="build-hypervisors" depends="build-ovm, build-xen, build-vmware" description="Builds all hypervisors"/>
+ <target name="compile-hypervisors" depends="compile-kvm, compile-ovm, compile-xen, compile-vmware" description="Compile all hypervisors"/>
+ <target name="build-hypervisors" depends="build-kvm, build-ovm, build-xen, build-vmware" description="Builds all hypervisors"/>
+ <target name="compile-kvm" depends="-init, compile-core, compile-agent" description="Compile KVM">
+ <ant antfile="${base.dir}/plugins/hypervisors/kvm/build.xml" target="build"/>
+ </target>
+ <target name="build-kvm" depends="compile-kvm" />
+
<target name="compile-ovm" depends="-init, compile-server" description="Compile OVM">
<ant antfile="${base.dir}/plugins/hypervisors/ovm/build.xml" target="build"/>
</target>
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7a0a9231/build/package.xml
----------------------------------------------------------------------
diff --git a/build/package.xml b/build/package.xml
index 30dde94..a2768b6 100755
--- a/build/package.xml
+++ b/build/package.xml
@@ -82,7 +82,6 @@
<include name="cloud-commons-collections-3.2.1.jar" />
<include name="cloud-commons-codec-1.4.jar" />
<include name="cloud-commons-pool-1.4.jar" />
- <include name="libvirt-0.4.8.jar" />
<include name="cloud-jna.jar" />
<include name="cloud-cglib.jar" />
<include name="jetty-6.1.26.jar" />
@@ -93,6 +92,7 @@
<include name="${utils.jar}" />
<include name="${core.jar}" />
<include name="${api.jar}" />
+ <include name="${kvm.jar}" />
</zipfileset>
<zipfileset dir="${agent.dist.dir}" filemode="770">
@@ -112,7 +112,7 @@
</target>
- <target name="package-agent" depends="-init-package, package-oss-systemvm, build-systemvm-patch, package-agent-common">
+ <target name="package-agent" depends="-init-package, package-oss-systemvm, build-systemvm-patch, package-agent-common, build-kvm">
<zip destfile="${dist.dir}/agent.zip" duplicate="preserve" update="true">
<zipfileset dir="${dist.dir}" prefix="vms">
<include name="patch.tgz" />
@@ -291,6 +291,17 @@
</zip>
</target>
+ <target name="package-kvm" depends="package-agent">
+ <zip destfile="${dist.dir}/agent.zip" update="true">
+ <zipfileset dir="${jar.dir}">
+ <include name="cloud-kvm.jar"/>
+ </zipfileset>
+ <zipfileset dir="${deps.dir}">
+ <include name="libvirt-0.4.8.jar"/>
+ </zipfileset>
+ </zip>
+ </target>
+
<target name="clean-zip">
<delete dir="${dist.dir}">
<include name="*.zip" />
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7a0a9231/cloud.spec
----------------------------------------------------------------------
diff --git a/cloud.spec b/cloud.spec
index 63a7e8a..fcfa740 100644
--- a/cloud.spec
+++ b/cloud.spec
@@ -532,6 +532,7 @@ fi
%files agent-libs
%defattr(0644,root,root,0755)
%{_javadir}/%{name}-agent.jar
+%{_javadir}/%{name}-kvm.jar
%files agent
%defattr(0644,root,root,0755)
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7a0a9231/core/src/com/cloud/hypervisor/kvm/resource/KvmDummyResourceBase.java
----------------------------------------------------------------------
diff --git a/core/src/com/cloud/hypervisor/kvm/resource/KvmDummyResourceBase.java b/core/src/com/cloud/hypervisor/kvm/resource/KvmDummyResourceBase.java
deleted file mode 100644
index d49780f..0000000
--- a/core/src/com/cloud/hypervisor/kvm/resource/KvmDummyResourceBase.java
+++ /dev/null
@@ -1,89 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements. See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership. The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License. You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied. See the License for the
-// specific language governing permissions and limitations
-// under the License.
-package com.cloud.hypervisor.kvm.resource;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import javax.naming.ConfigurationException;
-
-import com.cloud.agent.api.Answer;
-import com.cloud.agent.api.Command;
-import com.cloud.agent.api.PingCommand;
-import com.cloud.agent.api.StartupCommand;
-import com.cloud.agent.api.StartupRoutingCommand;
-import com.cloud.agent.api.StartupRoutingCommand.VmState;
-import com.cloud.host.Host.Type;
-import com.cloud.hypervisor.Hypervisor;
-import com.cloud.resource.ServerResource;
-import com.cloud.resource.ServerResourceBase;
-import com.cloud.vm.VirtualMachine.State;
-
-public class KvmDummyResourceBase extends ServerResourceBase implements ServerResource {
- private String _zoneId;
- private String _podId;
- private String _clusterId;
- private String _guid;
- private String _agentIp;
- @Override
- public Type getType() {
- // TODO Auto-generated method stub
- return null;
- }
-
- @Override
- public StartupCommand[] initialize() {
- StartupRoutingCommand cmd = new StartupRoutingCommand(0, 0, 0, 0, null, Hypervisor.HypervisorType.KVM, new HashMap<String, String>(), new HashMap<String, VmState>());
- cmd.setDataCenter(_zoneId);
- cmd.setPod(_podId);
- cmd.setCluster(_clusterId);
- cmd.setGuid(_guid);
- cmd.setName(_agentIp);
- cmd.setPrivateIpAddress(_agentIp);
- cmd.setStorageIpAddress(_agentIp);
- cmd.setVersion(KvmDummyResourceBase.class.getPackage().getImplementationVersion());
- return new StartupCommand[] { cmd };
- }
-
- @Override
- public PingCommand getCurrentStatus(long id) {
- // TODO Auto-generated method stub
- return null;
- }
-
- @Override
- public Answer executeRequest(Command cmd) {
- // TODO Auto-generated method stub
- return null;
- }
-
- @Override
- protected String getDefaultScriptsDir() {
- // TODO Auto-generated method stub
- return null;
- }
-
- @Override
- public boolean configure(final String name, final Map<String, Object> params) throws ConfigurationException {
- _zoneId = (String)params.get("zone");
- _podId = (String)params.get("pod");
- _clusterId = (String)params.get("cluster");
- _guid = (String)params.get("guid");
- _agentIp = (String)params.get("agentIp");
- return true;
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7a0a9231/debian/cloud-agent-libs.install
----------------------------------------------------------------------
diff --git a/debian/cloud-agent-libs.install b/debian/cloud-agent-libs.install
index 538f068..4cc5336 100644
--- a/debian/cloud-agent-libs.install
+++ b/debian/cloud-agent-libs.install
@@ -1 +1,2 @@
/usr/share/java/cloud-agent.jar
+/usr/share/java/cloud-kvm.jar
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7a0a9231/plugins/hypervisors/kvm/.classpath
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/kvm/.classpath b/plugins/hypervisors/kvm/.classpath
new file mode 100644
index 0000000..9e6fddb
--- /dev/null
+++ b/plugins/hypervisors/kvm/.classpath
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+ <classpathentry combineaccessrules="false" kind="src" path="/agent"/>
+ <classpathentry combineaccessrules="false" kind="src" path="/utils"/>
+ <classpathentry combineaccessrules="false" kind="src" path="/deps"/>
+ <classpathentry combineaccessrules="false" kind="src" path="/api"/>
+ <classpathentry combineaccessrules="false" kind="src" path="/core"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7a0a9231/plugins/hypervisors/kvm/.project
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/kvm/.project b/plugins/hypervisors/kvm/.project
new file mode 100755
index 0000000..4a89b9e
--- /dev/null
+++ b/plugins/hypervisors/kvm/.project
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>KVM</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.python.pydev.PyDevBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.python.pydev.pythonNature</nature>
+ </natures>
+</projectDescription>
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7a0a9231/plugins/hypervisors/kvm/.pydevproject
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/kvm/.pydevproject b/plugins/hypervisors/kvm/.pydevproject
new file mode 100644
index 0000000..a9cca03
--- /dev/null
+++ b/plugins/hypervisors/kvm/.pydevproject
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<?eclipse-pydev version="1.0"?>
+
+<pydev_project>
+<pydev_property name="org.python.pydev.PYTHON_PROJECT_INTERPRETER">Default</pydev_property>
+<pydev_property name="org.python.pydev.PYTHON_PROJECT_VERSION">python 2.7</pydev_property>
+</pydev_project>
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7a0a9231/plugins/hypervisors/kvm/build.xml
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/kvm/build.xml b/plugins/hypervisors/kvm/build.xml
new file mode 100755
index 0000000..60e6653
--- /dev/null
+++ b/plugins/hypervisors/kvm/build.xml
@@ -0,0 +1,137 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+
+<project name="Cloud Stack KVM" default="help" basedir=".">
+ <description>
+ Cloud Stack ant build file
+ </description>
+
+ <dirname property="kvm.base.dir" file="${ant.file.Cloud Stack KVM}/"/>
+ <!-- This directory must be set -->
+ <property name="top.dir" location="${kvm.base.dir}/../../.."/>
+ <property name="build.dir" location="${top.dir}/build"/>
+
+ <echo message="build.dir=${build.dir}; top.dir=${top.dir}; kvm.base.dir=${kvm.base.dir}"/>
+
+ <!-- Import anything that the user wants to set-->
+ <!-- Import properties files and environment variables here -->
+
+ <property environment="env" />
+
+ <condition property="build-cloud.properties.file" value="${build.dir}/override/build-cloud.properties" else="${build.dir}/build-cloud.properties">
+ <available file="${build.dir}/override/build-cloud.properties" />
+ </condition>
+
+ <condition property="cloud.properties.file" value="${build.dir}/override/cloud.properties" else="${build.dir}/cloud.properties">
+ <available file="${build.dir}/override/cloud.properties" />
+ </condition>
+
+ <condition property="override.file" value="${build.dir}/override/replace.properties" else="${build.dir}/replace.properties">
+ <available file="${build.dir}/override/replace.properties" />
+ </condition>
+
+ <echo message="Using build parameters from ${build-cloud.properties.file}" />
+ <property file="${build-cloud.properties.file}" />
+
+ <echo message="Using company info from ${cloud.properties.file}" />
+ <property file="${cloud.properties.file}" />
+
+ <echo message="Using override file from ${override.file}" />
+ <property file="${override.file}" />
+
+ <property file="${build.dir}/build.number" />
+
+ <!-- In case these didn't get defined in the build-cloud.properties -->
+ <property name="branding.name" value="default" />
+ <property name="deprecation" value="off" />
+ <property name="target.compat.version" value="1.6" />
+ <property name="source.compat.version" value="1.6" />
+ <property name="debug" value="true" />
+ <property name="debuglevel" value="lines,source"/>
+
+ <echo message="target.dir=${target.dir}; top.dir=${top.dir}"/>
+ <!-- directories for build and distribution -->
+ <property name="target.dir" location="${top.dir}/target" />
+ <property name="classes.dir" location="${target.dir}/classes" />
+ <property name="jar.dir" location="${target.dir}/jar" />
+ <property name="dep.cache.dir" location="${target.dir}/dep-cache" />
+ <property name="build.log" location="${target.dir}/ant_verbose.txt" />
+
+ <property name="deps.dir" location="${top.dir}/deps" />
+
+ <property name="kvm.jar" value="cloud-kvm.jar" />
+ <property name="scripts.target.dir" location="${target.dir}/scripts"/>
+ <property name="kvm.scripts.dir" location="${base.dir}/plugins/hypervisors/kvm/scripts" />
+
+ <import file="${build.dir}/build-common.xml"/>
+
+ <echo message="target.dir=${target.dir}; top.dir=${top.dir}"/>
+
+ <!-- This section needs to be replaced by some kind of dependency library-->
+ <path id="deps.classpath">
+ <!--filelist files="${deps.classpath}" /-->
+ <fileset dir="${deps.dir}" erroronmissingdir="false">
+ <include name="*.jar" />
+ </fileset>
+ </path>
+
+ <path id="cloudstack.classpath">
+ <fileset dir="${jar.dir}">
+ <include name="*.jar"/>
+ </fileset>
+ </path>
+
+ <path id="kvm.classpath">
+ <path refid="deps.classpath"/>
+ <path refid="cloudstack.classpath"/>
+ </path>
+
+ <!-- This section needs to be replaced by some kind of dependency library-->
+
+ <target name="deploy-kvm" >
+ <copy todir="${server.deploy.to.dir}/webapps/client/WEB-INF/lib/scripts">
+ <fileset dir="${kvm.scripts.dir}">
+ <include name="**/*"/>
+ </fileset>
+ </copy>
+ </target>
+
+ <target name="init" description="Initialize binaries directory">
+ <mkdir dir="${classes.dir}/${kvm.jar}"/>
+ <mkdir dir="${jar.dir}"/>
+ </target>
+
+ <target name="compile-kvm" depends="init" description="Compiles Xen ">
+ <compile-java jar.name="${kvm.jar}" top.dir="${kvm.base.dir}" classpath="kvm.classpath" />
+ </target>
+
+ <target name="help" description="help">
+ <echo level="info" message="This is the build file for kvmserver"/>
+ <echo level="info" message="You can do a build by doing ant build or clean by ant clean" />
+ </target>
+
+ <target name="clean-kvm">
+ <delete dir="${classes.dir}/${kvm.jar}"/>
+ </target>
+
+ <target name="build" depends="compile-kvm"/>
+
+ <target name="clean" depends="clean-kvm"/>
+
+</project>