mirror of
https://github.com/apache/cloudstack.git
synced 2025-10-26 08:42:29 +01:00
Summary: Allow for custom storage adaptors based on pool type in KVM
Detail: Instead of using LibvirtStorageAdaptor for everything, you can create your own storage adaptor and use it. We select storage adaptor based on storage pool type, thus we needed to adjust LibvirtComputingResource to pass pool type to everything in KVMStoragePoolManager. This in turn required that we pass the info necessary to LibvirtComputingResource as well, so a few agent Commands were modified. Note this patch in and of itself shouldn't change any existing behavior, just allow for new storage adaptors to be selected based on storage pool type. Reviewed-by: Edison Su Signed-off-by: Marcus Sorensen <marcus@betterservers.com> 1355769696 -0700
This commit is contained in:
parent
0be6e2e02b
commit
6ed1989133
@ -50,8 +50,7 @@ public class BackupSnapshotCommand extends SnapshotCommand {
|
|||||||
* @param isFirstSnapshotOfRootVolume true if this is the first snapshot of a root volume. Set the parent of the backup to null.
|
* @param isFirstSnapshotOfRootVolume true if this is the first snapshot of a root volume. Set the parent of the backup to null.
|
||||||
* @param isVolumeInactive True if the volume belongs to a VM that is not running or is detached.
|
* @param isVolumeInactive True if the volume belongs to a VM that is not running or is detached.
|
||||||
*/
|
*/
|
||||||
public BackupSnapshotCommand(String primaryStoragePoolNameLabel,
|
public BackupSnapshotCommand(String secondaryStoragePoolURL,
|
||||||
String secondaryStoragePoolURL,
|
|
||||||
Long dcId,
|
Long dcId,
|
||||||
Long accountId,
|
Long accountId,
|
||||||
Long volumeId,
|
Long volumeId,
|
||||||
@ -66,17 +65,16 @@ public class BackupSnapshotCommand extends SnapshotCommand {
|
|||||||
String vmName,
|
String vmName,
|
||||||
int wait)
|
int wait)
|
||||||
{
|
{
|
||||||
super(primaryStoragePoolNameLabel, secondaryStoragePoolURL, snapshotUuid, snapshotName, dcId, accountId, volumeId);
|
super(pool, secondaryStoragePoolURL, snapshotUuid, snapshotName, dcId, accountId, volumeId);
|
||||||
this.snapshotId = snapshotId;
|
this.snapshotId = snapshotId;
|
||||||
this.prevSnapshotUuid = prevSnapshotUuid;
|
this.prevSnapshotUuid = prevSnapshotUuid;
|
||||||
this.prevBackupUuid = prevBackupUuid;
|
this.prevBackupUuid = prevBackupUuid;
|
||||||
this.isVolumeInactive = isVolumeInactive;
|
this.isVolumeInactive = isVolumeInactive;
|
||||||
this.vmName = vmName;
|
this.vmName = vmName;
|
||||||
this.pool = new StorageFilerTO(pool);
|
|
||||||
setVolumePath(volumePath);
|
setVolumePath(volumePath);
|
||||||
setWait(wait);
|
setWait(wait);
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getPrevSnapshotUuid() {
|
public String getPrevSnapshotUuid() {
|
||||||
return prevSnapshotUuid;
|
return prevSnapshotUuid;
|
||||||
}
|
}
|
||||||
@ -113,7 +111,4 @@ public class BackupSnapshotCommand extends SnapshotCommand {
|
|||||||
return snapshotId;
|
return snapshotId;
|
||||||
}
|
}
|
||||||
|
|
||||||
public StorageFilerTO getPool() {
|
}
|
||||||
return pool;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
@ -16,6 +16,8 @@
|
|||||||
// under the License.
|
// under the License.
|
||||||
package com.cloud.agent.api;
|
package com.cloud.agent.api;
|
||||||
|
|
||||||
|
import com.cloud.storage.StoragePool;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This currently assumes that both primary and secondary storage are mounted on the XenServer.
|
* This currently assumes that both primary and secondary storage are mounted on the XenServer.
|
||||||
*/
|
*/
|
||||||
@ -40,7 +42,8 @@ public class CreatePrivateTemplateFromSnapshotCommand extends SnapshotCommand {
|
|||||||
* It may not be the UUID of the base copy of the snapshot, if no data was written since last snapshot.
|
* It may not be the UUID of the base copy of the snapshot, if no data was written since last snapshot.
|
||||||
* @param origTemplateInstallPath The install path of the original template VHD on the secondary
|
* @param origTemplateInstallPath The install path of the original template VHD on the secondary
|
||||||
*/
|
*/
|
||||||
public CreatePrivateTemplateFromSnapshotCommand(String primaryStoragePoolNameLabel,
|
|
||||||
|
public CreatePrivateTemplateFromSnapshotCommand(StoragePool pool,
|
||||||
String secondaryStoragePoolURL,
|
String secondaryStoragePoolURL,
|
||||||
Long dcId,
|
Long dcId,
|
||||||
Long accountId,
|
Long accountId,
|
||||||
@ -52,7 +55,7 @@ public class CreatePrivateTemplateFromSnapshotCommand extends SnapshotCommand {
|
|||||||
String templateName,
|
String templateName,
|
||||||
int wait)
|
int wait)
|
||||||
{
|
{
|
||||||
super(primaryStoragePoolNameLabel, secondaryStoragePoolURL, backedUpSnapshotUuid, backedUpSnapshotName, dcId, accountId, volumeId);
|
super(pool, secondaryStoragePoolURL, backedUpSnapshotUuid, backedUpSnapshotName, dcId, accountId, volumeId);
|
||||||
this.origTemplateInstallPath = origTemplateInstallPath;
|
this.origTemplateInstallPath = origTemplateInstallPath;
|
||||||
this.newTemplateId = newTemplateId;
|
this.newTemplateId = newTemplateId;
|
||||||
this.templateName = templateName;
|
this.templateName = templateName;
|
||||||
@ -76,4 +79,4 @@ public class CreatePrivateTemplateFromSnapshotCommand extends SnapshotCommand {
|
|||||||
public String getTemplateName() {
|
public String getTemplateName() {
|
||||||
return templateName;
|
return templateName;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -16,6 +16,9 @@
|
|||||||
// under the License.
|
// under the License.
|
||||||
package com.cloud.agent.api;
|
package com.cloud.agent.api;
|
||||||
|
|
||||||
|
import com.cloud.agent.api.to.StorageFilerTO;
|
||||||
|
import com.cloud.storage.StoragePool;
|
||||||
|
|
||||||
public class CreatePrivateTemplateFromVolumeCommand extends SnapshotCommand {
|
public class CreatePrivateTemplateFromVolumeCommand extends SnapshotCommand {
|
||||||
private String _vmName;
|
private String _vmName;
|
||||||
private String _volumePath;
|
private String _volumePath;
|
||||||
@ -23,13 +26,14 @@ public class CreatePrivateTemplateFromVolumeCommand extends SnapshotCommand {
|
|||||||
private String _uniqueName;
|
private String _uniqueName;
|
||||||
private long _templateId;
|
private long _templateId;
|
||||||
private long _accountId;
|
private long _accountId;
|
||||||
|
StorageFilerTO _primaryPool;
|
||||||
// For XenServer
|
// For XenServer
|
||||||
private String _secondaryStorageUrl;
|
private String _secondaryStorageUrl;
|
||||||
|
|
||||||
public CreatePrivateTemplateFromVolumeCommand() {
|
public CreatePrivateTemplateFromVolumeCommand() {
|
||||||
}
|
}
|
||||||
|
|
||||||
public CreatePrivateTemplateFromVolumeCommand(String StoragePoolUUID, String secondaryStorageUrl, long templateId, long accountId, String userSpecifiedName, String uniqueName, String volumePath, String vmName, int wait) {
|
public CreatePrivateTemplateFromVolumeCommand(StoragePool pool, String secondaryStorageUrl, long templateId, long accountId, String userSpecifiedName, String uniqueName, String volumePath, String vmName, int wait) {
|
||||||
_secondaryStorageUrl = secondaryStorageUrl;
|
_secondaryStorageUrl = secondaryStorageUrl;
|
||||||
_templateId = templateId;
|
_templateId = templateId;
|
||||||
_accountId = accountId;
|
_accountId = accountId;
|
||||||
@ -37,7 +41,8 @@ public class CreatePrivateTemplateFromVolumeCommand extends SnapshotCommand {
|
|||||||
_uniqueName = uniqueName;
|
_uniqueName = uniqueName;
|
||||||
_volumePath = volumePath;
|
_volumePath = volumePath;
|
||||||
_vmName = vmName;
|
_vmName = vmName;
|
||||||
primaryStoragePoolNameLabel = StoragePoolUUID;
|
primaryStoragePoolNameLabel = pool.getUuid();
|
||||||
|
_primaryPool = new StorageFilerTO(pool);
|
||||||
setWait(wait);
|
setWait(wait);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -46,6 +51,10 @@ public class CreatePrivateTemplateFromVolumeCommand extends SnapshotCommand {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public StorageFilerTO getPool() {
|
||||||
|
return _primaryPool;
|
||||||
|
}
|
||||||
|
|
||||||
public String getSecondaryStorageUrl() {
|
public String getSecondaryStorageUrl() {
|
||||||
return _secondaryStorageUrl;
|
return _secondaryStorageUrl;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -16,6 +16,8 @@
|
|||||||
// under the License.
|
// under the License.
|
||||||
package com.cloud.agent.api;
|
package com.cloud.agent.api;
|
||||||
|
|
||||||
|
import com.cloud.storage.StoragePool;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This currently assumes that both primary and secondary storage are mounted on the XenServer.
|
* This currently assumes that both primary and secondary storage are mounted on the XenServer.
|
||||||
*/
|
*/
|
||||||
@ -39,7 +41,8 @@ public class CreateVolumeFromSnapshotCommand extends SnapshotCommand {
|
|||||||
* It may not be the UUID of the base copy of the snapshot, if no data was written since last snapshot.
|
* It may not be the UUID of the base copy of the snapshot, if no data was written since last snapshot.
|
||||||
* @param templatePath The install path of the template VHD on the secondary, if this a root volume
|
* @param templatePath The install path of the template VHD on the secondary, if this a root volume
|
||||||
*/
|
*/
|
||||||
public CreateVolumeFromSnapshotCommand(String primaryStoragePoolNameLabel,
|
|
||||||
|
public CreateVolumeFromSnapshotCommand(StoragePool pool,
|
||||||
String secondaryStoragePoolURL,
|
String secondaryStoragePoolURL,
|
||||||
Long dcId,
|
Long dcId,
|
||||||
Long accountId,
|
Long accountId,
|
||||||
@ -48,7 +51,7 @@ public class CreateVolumeFromSnapshotCommand extends SnapshotCommand {
|
|||||||
String backedUpSnapshotName,
|
String backedUpSnapshotName,
|
||||||
int wait)
|
int wait)
|
||||||
{
|
{
|
||||||
super(primaryStoragePoolNameLabel, secondaryStoragePoolURL, backedUpSnapshotUuid, backedUpSnapshotName, dcId, accountId, volumeId);
|
super(pool, secondaryStoragePoolURL, backedUpSnapshotUuid, backedUpSnapshotName, dcId, accountId, volumeId);
|
||||||
setWait(wait);
|
setWait(wait);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -33,7 +33,7 @@ public class DownloadSnapshotFromS3Command extends SnapshotCommand {
|
|||||||
String secondaryStorageUrl, Long dcId, Long accountId,
|
String secondaryStorageUrl, Long dcId, Long accountId,
|
||||||
Long volumeId, String backupUuid, int wait) {
|
Long volumeId, String backupUuid, int wait) {
|
||||||
|
|
||||||
super("", secondaryStorageUrl, backupUuid, "", dcId, accountId,
|
super(null, secondaryStorageUrl, backupUuid, "", dcId, accountId,
|
||||||
volumeId);
|
volumeId);
|
||||||
|
|
||||||
this.s3 = s3;
|
this.s3 = s3;
|
||||||
|
|||||||
@ -16,12 +16,16 @@
|
|||||||
// under the License.
|
// under the License.
|
||||||
package com.cloud.agent.api;
|
package com.cloud.agent.api;
|
||||||
|
|
||||||
|
import com.cloud.agent.api.to.StorageFilerTO;
|
||||||
|
import com.cloud.storage.StoragePool;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This currently assumes that both primary and secondary storage are mounted on
|
* This currently assumes that both primary and secondary storage are mounted on
|
||||||
* the XenServer.
|
* the XenServer.
|
||||||
*/
|
*/
|
||||||
public class SnapshotCommand extends Command {
|
public class SnapshotCommand extends Command {
|
||||||
protected String primaryStoragePoolNameLabel;
|
protected String primaryStoragePoolNameLabel;
|
||||||
|
StorageFilerTO primaryPool;
|
||||||
private String snapshotUuid;
|
private String snapshotUuid;
|
||||||
private String snapshotName;
|
private String snapshotName;
|
||||||
private String secondaryStorageUrl;
|
private String secondaryStorageUrl;
|
||||||
@ -46,10 +50,11 @@ public class SnapshotCommand extends Command {
|
|||||||
* is the value of that field If you have better ideas on how to
|
* is the value of that field If you have better ideas on how to
|
||||||
* get it, you are welcome.
|
* get it, you are welcome.
|
||||||
*/
|
*/
|
||||||
public SnapshotCommand(String primaryStoragePoolNameLabel,
|
public SnapshotCommand(StoragePool pool,
|
||||||
String secondaryStorageUrl, String snapshotUuid,
|
String secondaryStorageUrl, String snapshotUuid,
|
||||||
String snapshotName, Long dcId, Long accountId, Long volumeId) {
|
String snapshotName, Long dcId, Long accountId, Long volumeId) {
|
||||||
this.primaryStoragePoolNameLabel = primaryStoragePoolNameLabel;
|
this.primaryStoragePoolNameLabel = pool.getUuid();
|
||||||
|
this.primaryPool = new StorageFilerTO(pool);
|
||||||
this.snapshotUuid = snapshotUuid;
|
this.snapshotUuid = snapshotUuid;
|
||||||
this.secondaryStorageUrl = secondaryStorageUrl;
|
this.secondaryStorageUrl = secondaryStorageUrl;
|
||||||
this.dcId = dcId;
|
this.dcId = dcId;
|
||||||
@ -65,6 +70,13 @@ public class SnapshotCommand extends Command {
|
|||||||
return primaryStoragePoolNameLabel;
|
return primaryStoragePoolNameLabel;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the primaryPool
|
||||||
|
*/
|
||||||
|
public StorageFilerTO getPool() {
|
||||||
|
return primaryPool;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return the snapshotUuid
|
* @return the snapshotUuid
|
||||||
*/
|
*/
|
||||||
@ -111,4 +123,4 @@ public class SnapshotCommand extends Command {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -15,6 +15,8 @@
|
|||||||
// specific language governing permissions and limitations
|
// specific language governing permissions and limitations
|
||||||
// under the License.
|
// under the License.
|
||||||
package com.cloud.agent.api;
|
package com.cloud.agent.api;
|
||||||
|
import com.cloud.storage.StoragePool;
|
||||||
|
|
||||||
public class UpgradeSnapshotCommand extends SnapshotCommand {
|
public class UpgradeSnapshotCommand extends SnapshotCommand {
|
||||||
private String version;
|
private String version;
|
||||||
private Long templateId;
|
private Long templateId;
|
||||||
@ -30,7 +32,7 @@ public class UpgradeSnapshotCommand extends SnapshotCommand {
|
|||||||
* @param snapshotUuid The UUID of the snapshot which is going to be upgraded
|
* @param snapshotUuid The UUID of the snapshot which is going to be upgraded
|
||||||
* @param _version version for this snapshot
|
* @param _version version for this snapshot
|
||||||
*/
|
*/
|
||||||
public UpgradeSnapshotCommand(String primaryStoragePoolNameLabel,
|
public UpgradeSnapshotCommand(StoragePool pool,
|
||||||
String secondaryStoragePoolURL,
|
String secondaryStoragePoolURL,
|
||||||
Long dcId,
|
Long dcId,
|
||||||
Long accountId,
|
Long accountId,
|
||||||
@ -42,7 +44,7 @@ public class UpgradeSnapshotCommand extends SnapshotCommand {
|
|||||||
String snapshotName,
|
String snapshotName,
|
||||||
String version)
|
String version)
|
||||||
{
|
{
|
||||||
super(primaryStoragePoolNameLabel, secondaryStoragePoolURL, snapshotUuid, snapshotName, dcId, accountId, volumeId);
|
super(pool, secondaryStoragePoolURL, snapshotUuid, snapshotName, dcId, accountId, volumeId);
|
||||||
this.version = version;
|
this.version = version;
|
||||||
this.templateId = templateId;
|
this.templateId = templateId;
|
||||||
this.tmpltAccountId = tmpltAccountId;
|
this.tmpltAccountId = tmpltAccountId;
|
||||||
|
|||||||
@ -34,7 +34,7 @@ public class downloadSnapshotFromSwiftCommand extends SnapshotCommand {
|
|||||||
|
|
||||||
public downloadSnapshotFromSwiftCommand(SwiftTO swift, String secondaryStorageUrl, Long dcId, Long accountId, Long volumeId, String parent, String BackupUuid, int wait) {
|
public downloadSnapshotFromSwiftCommand(SwiftTO swift, String secondaryStorageUrl, Long dcId, Long accountId, Long volumeId, String parent, String BackupUuid, int wait) {
|
||||||
|
|
||||||
super("", secondaryStorageUrl, BackupUuid, "", dcId, accountId, volumeId);
|
super(null, secondaryStorageUrl, BackupUuid, "", dcId, accountId, volumeId);
|
||||||
setParent(parent);
|
setParent(parent);
|
||||||
setSwift(swift);
|
setSwift(swift);
|
||||||
setWait(wait);
|
setWait(wait);
|
||||||
@ -57,4 +57,4 @@ public class downloadSnapshotFromSwiftCommand extends SnapshotCommand {
|
|||||||
this._parent = parent;
|
this._parent = parent;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -17,7 +17,8 @@
|
|||||||
package com.cloud.agent.api.storage;
|
package com.cloud.agent.api.storage;
|
||||||
|
|
||||||
import com.cloud.storage.Storage.ImageFormat;
|
import com.cloud.storage.Storage.ImageFormat;
|
||||||
|
import com.cloud.agent.api.to.StorageFilerTO;
|
||||||
|
import com.cloud.storage.StoragePool;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
@ -26,6 +27,7 @@ public class PrimaryStorageDownloadCommand extends AbstractDownloadCommand {
|
|||||||
String localPath;
|
String localPath;
|
||||||
String poolUuid;
|
String poolUuid;
|
||||||
long poolId;
|
long poolId;
|
||||||
|
StorageFilerTO primaryPool;
|
||||||
|
|
||||||
String secondaryStorageUrl;
|
String secondaryStorageUrl;
|
||||||
String primaryStorageUrl;
|
String primaryStorageUrl;
|
||||||
@ -33,10 +35,11 @@ public class PrimaryStorageDownloadCommand extends AbstractDownloadCommand {
|
|||||||
protected PrimaryStorageDownloadCommand() {
|
protected PrimaryStorageDownloadCommand() {
|
||||||
}
|
}
|
||||||
|
|
||||||
public PrimaryStorageDownloadCommand(String name, String url, ImageFormat format, long accountId, long poolId, String poolUuid, int wait) {
|
public PrimaryStorageDownloadCommand(String name, String url, ImageFormat format, long accountId, StoragePool pool, int wait) {
|
||||||
super(name, url, format, accountId);
|
super(name, url, format, accountId);
|
||||||
this.poolId = poolId;
|
this.poolId = pool.getId();
|
||||||
this.poolUuid = poolUuid;
|
this.poolUuid = pool.getUuid();
|
||||||
|
this.primaryPool = new StorageFilerTO(pool);
|
||||||
setWait(wait);
|
setWait(wait);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -47,6 +50,10 @@ public class PrimaryStorageDownloadCommand extends AbstractDownloadCommand {
|
|||||||
public long getPoolId() {
|
public long getPoolId() {
|
||||||
return poolId;
|
return poolId;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public StorageFilerTO getPool() {
|
||||||
|
return primaryPool;
|
||||||
|
}
|
||||||
|
|
||||||
public void setLocalPath(String path) {
|
public void setLocalPath(String path) {
|
||||||
this.localPath = path;
|
this.localPath = path;
|
||||||
|
|||||||
@ -36,7 +36,7 @@ public class BackupSnapshotAnswerTest {
|
|||||||
|
|
||||||
StoragePool pool = Mockito.mock(StoragePool.class);
|
StoragePool pool = Mockito.mock(StoragePool.class);
|
||||||
|
|
||||||
bsc = new BackupSnapshotCommand("primaryStoragePoolNameLabel",
|
bsc = new BackupSnapshotCommand(
|
||||||
"secondaryStoragePoolURL", 101L, 102L, 103L, 104L,
|
"secondaryStoragePoolURL", 101L, 102L, 103L, 104L,
|
||||||
"volumePath", pool, "snapshotUuid", "snapshotName",
|
"volumePath", pool, "snapshotUuid", "snapshotName",
|
||||||
"prevSnapshotUuid", "prevBackupUuid", false, "vmName", 5);
|
"prevSnapshotUuid", "prevBackupUuid", false, "vmName", 5);
|
||||||
|
|||||||
@ -116,14 +116,14 @@ public class BackupSnapshotCommandTest {
|
|||||||
};
|
};
|
||||||
|
|
||||||
BackupSnapshotCommand bsc = new BackupSnapshotCommand(
|
BackupSnapshotCommand bsc = new BackupSnapshotCommand(
|
||||||
"primaryStoragePoolNameLabel", "http://secondary.Storage.Url",
|
"http://secondary.Storage.Url",
|
||||||
101L, 102L, 103L, 104L, "vPath", pool,
|
101L, 102L, 103L, 104L, "vPath", pool,
|
||||||
"420fa39c-4ef1-a83c-fd93-46dc1ff515ae", "sName",
|
"420fa39c-4ef1-a83c-fd93-46dc1ff515ae", "sName",
|
||||||
"9012793e-0657-11e2-bebc-0050568b0057",
|
"9012793e-0657-11e2-bebc-0050568b0057",
|
||||||
"7167e0b2-f5b0-11e1-8414-0050568b0057", false, "vmName", 5);
|
"7167e0b2-f5b0-11e1-8414-0050568b0057", false, "vmName", 5);
|
||||||
|
|
||||||
BackupSnapshotCommand bsc1 = new BackupSnapshotCommand(
|
BackupSnapshotCommand bsc1 = new BackupSnapshotCommand(
|
||||||
"primaryStoragePoolNameLabel", "http://secondary.Storage.Url",
|
"http://secondary.Storage.Url",
|
||||||
101L, 102L, 103L, 104L, "vPath", pool,
|
101L, 102L, 103L, 104L, "vPath", pool,
|
||||||
"420fa39c-4ef1-a83c-fd93-46dc1ff515ae", "sName",
|
"420fa39c-4ef1-a83c-fd93-46dc1ff515ae", "sName",
|
||||||
"9012793e-0657-11e2-bebc-0050568b0057",
|
"9012793e-0657-11e2-bebc-0050568b0057",
|
||||||
@ -132,7 +132,7 @@ public class BackupSnapshotCommandTest {
|
|||||||
@Test
|
@Test
|
||||||
public void testGetPrimaryStoragePoolNameLabel() {
|
public void testGetPrimaryStoragePoolNameLabel() {
|
||||||
String label = bsc.getPrimaryStoragePoolNameLabel();
|
String label = bsc.getPrimaryStoragePoolNameLabel();
|
||||||
assertTrue(label.equals("primaryStoragePoolNameLabel"));
|
assertTrue(label.equals("bed9f83e-cac3-11e1-ac8a-0050568b007e"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|||||||
@ -23,19 +23,109 @@ import static org.junit.Assert.assertTrue;
|
|||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import java.text.ParseException;
|
||||||
|
import java.text.SimpleDateFormat;
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
import com.cloud.agent.api.SnapshotCommand;
|
import com.cloud.agent.api.SnapshotCommand;
|
||||||
|
import com.cloud.storage.Storage.StoragePoolType;
|
||||||
|
import com.cloud.storage.StoragePool;
|
||||||
|
import com.cloud.storage.StoragePoolStatus;
|
||||||
|
|
||||||
public class SnapshotCommandTest {
|
public class SnapshotCommandTest {
|
||||||
SnapshotCommand ssc = new SnapshotCommand("primaryStoragePoolNameLabel",
|
|
||||||
|
public StoragePool pool = new StoragePool() {
|
||||||
|
public long getId() {
|
||||||
|
return 1L;
|
||||||
|
};
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return "name";
|
||||||
|
};
|
||||||
|
|
||||||
|
public String getUuid() {
|
||||||
|
return "bed9f83e-cac3-11e1-ac8a-0050568b007e";
|
||||||
|
};
|
||||||
|
|
||||||
|
public StoragePoolType getPoolType() {
|
||||||
|
return StoragePoolType.Filesystem;
|
||||||
|
};
|
||||||
|
|
||||||
|
public Date getCreated() {
|
||||||
|
Date date = null;
|
||||||
|
try {
|
||||||
|
date = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss")
|
||||||
|
.parse("01/01/1970 12:12:12");
|
||||||
|
} catch (ParseException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return date;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Date getUpdateTime() {
|
||||||
|
return new Date();
|
||||||
|
};
|
||||||
|
|
||||||
|
public long getDataCenterId() {
|
||||||
|
return 0L;
|
||||||
|
};
|
||||||
|
|
||||||
|
public long getCapacityBytes() {
|
||||||
|
return 0L;
|
||||||
|
};
|
||||||
|
|
||||||
|
public long getAvailableBytes() {
|
||||||
|
return 0L;
|
||||||
|
};
|
||||||
|
|
||||||
|
public Long getClusterId() {
|
||||||
|
return 0L;
|
||||||
|
};
|
||||||
|
|
||||||
|
public String getHostAddress() {
|
||||||
|
return "hostAddress";
|
||||||
|
};
|
||||||
|
|
||||||
|
public String getPath() {
|
||||||
|
return "path";
|
||||||
|
};
|
||||||
|
|
||||||
|
public String getUserInfo() {
|
||||||
|
return "userInfo";
|
||||||
|
};
|
||||||
|
|
||||||
|
public boolean isShared() {
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
|
||||||
|
public boolean isLocal() {
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
|
||||||
|
public StoragePoolStatus getStatus() {
|
||||||
|
return StoragePoolStatus.Up;
|
||||||
|
};
|
||||||
|
|
||||||
|
public int getPort() {
|
||||||
|
return 25;
|
||||||
|
};
|
||||||
|
|
||||||
|
public Long getPodId() {
|
||||||
|
return 0L;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
SnapshotCommand ssc = new SnapshotCommand(pool,
|
||||||
"http://secondary.Storage.Url",
|
"http://secondary.Storage.Url",
|
||||||
"420fa39c-4ef1-a83c-fd93-46dc1ff515ae", "snapshotName", 101L, 102L,
|
"420fa39c-4ef1-a83c-fd93-46dc1ff515ae", "snapshotName", 101L, 102L,
|
||||||
103L);
|
103L);
|
||||||
|
|
||||||
SnapshotCommand ssc1;
|
SnapshotCommand ssc1;
|
||||||
|
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setUp() {
|
public void setUp() {
|
||||||
ssc1 = new SnapshotCommand("primaryStoragePoolNameLabel",
|
ssc1 = new SnapshotCommand(pool,
|
||||||
"secondaryStorageUrl", "snapshotUuid", "snapshotName", 101L,
|
"secondaryStorageUrl", "snapshotUuid", "snapshotName", 101L,
|
||||||
102L, 103L);
|
102L, 103L);
|
||||||
}
|
}
|
||||||
@ -43,7 +133,7 @@ public class SnapshotCommandTest {
|
|||||||
@Test
|
@Test
|
||||||
public void testGetPrimaryStoragePoolNameLabel() {
|
public void testGetPrimaryStoragePoolNameLabel() {
|
||||||
String label = ssc.getPrimaryStoragePoolNameLabel();
|
String label = ssc.getPrimaryStoragePoolNameLabel();
|
||||||
assertTrue(label.equals("primaryStoragePoolNameLabel"));
|
assertTrue(label.equals("bed9f83e-cac3-11e1-ac8a-0050568b007e"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|||||||
@ -1104,8 +1104,9 @@ public class LibvirtComputingResource extends ServerResourceBase implements
|
|||||||
String secondaryStorageUrl = cmd.getSecondaryStorageURL();
|
String secondaryStorageUrl = cmd.getSecondaryStorageURL();
|
||||||
KVMStoragePool secondaryStoragePool = null;
|
KVMStoragePool secondaryStoragePool = null;
|
||||||
try {
|
try {
|
||||||
KVMStoragePool primaryPool = _storagePoolMgr.getStoragePool(pool
|
KVMStoragePool primaryPool = _storagePoolMgr.getStoragePool(
|
||||||
.getUuid());
|
pool.getType(),
|
||||||
|
pool.getUuid());
|
||||||
String volumeName = UUID.randomUUID().toString();
|
String volumeName = UUID.randomUUID().toString();
|
||||||
|
|
||||||
if (copyToSecondary) {
|
if (copyToSecondary) {
|
||||||
@ -1114,20 +1115,21 @@ public class LibvirtComputingResource extends ServerResourceBase implements
|
|||||||
.getVolumePath());
|
.getVolumePath());
|
||||||
String volumeDestPath = "/volumes/" + cmd.getVolumeId()
|
String volumeDestPath = "/volumes/" + cmd.getVolumeId()
|
||||||
+ File.separator;
|
+ File.separator;
|
||||||
secondaryStoragePool = _storagePoolMgr
|
secondaryStoragePool = _storagePoolMgr.getStoragePoolByURI(
|
||||||
.getStoragePoolByURI(secondaryStorageUrl);
|
secondaryStorageUrl);
|
||||||
secondaryStoragePool.createFolder(volumeDestPath);
|
secondaryStoragePool.createFolder(volumeDestPath);
|
||||||
secondaryStoragePool.delete();
|
secondaryStoragePool.delete();
|
||||||
secondaryStoragePool = _storagePoolMgr
|
secondaryStoragePool = _storagePoolMgr.getStoragePoolByURI(
|
||||||
.getStoragePoolByURI(secondaryStorageUrl
|
secondaryStorageUrl
|
||||||
+ volumeDestPath);
|
+ volumeDestPath);
|
||||||
_storagePoolMgr.copyPhysicalDisk(volume, destVolumeName,
|
_storagePoolMgr.copyPhysicalDisk(volume,
|
||||||
secondaryStoragePool);
|
destVolumeName,secondaryStoragePool);
|
||||||
return new CopyVolumeAnswer(cmd, true, null, null, volumeName);
|
return new CopyVolumeAnswer(cmd, true, null, null, volumeName);
|
||||||
} else {
|
} else {
|
||||||
volumePath = "/volumes/" + cmd.getVolumeId() + File.separator;
|
volumePath = "/volumes/" + cmd.getVolumeId() + File.separator;
|
||||||
secondaryStoragePool = _storagePoolMgr
|
secondaryStoragePool = _storagePoolMgr.getStoragePoolByURI(
|
||||||
.getStoragePoolByURI(secondaryStorageUrl + volumePath);
|
secondaryStorageUrl
|
||||||
|
+ volumePath);
|
||||||
KVMPhysicalDisk volume = secondaryStoragePool
|
KVMPhysicalDisk volume = secondaryStoragePool
|
||||||
.getPhysicalDisk(cmd.getVolumePath() + ".qcow2");
|
.getPhysicalDisk(cmd.getVolumePath() + ".qcow2");
|
||||||
_storagePoolMgr.copyPhysicalDisk(volume, volumeName,
|
_storagePoolMgr.copyPhysicalDisk(volume, volumeName,
|
||||||
@ -1145,7 +1147,8 @@ public class LibvirtComputingResource extends ServerResourceBase implements
|
|||||||
|
|
||||||
protected Answer execute(DeleteStoragePoolCommand cmd) {
|
protected Answer execute(DeleteStoragePoolCommand cmd) {
|
||||||
try {
|
try {
|
||||||
_storagePoolMgr.deleteStoragePool(cmd.getPool().getUuid());
|
_storagePoolMgr.deleteStoragePool(cmd.getPool().getType(),
|
||||||
|
cmd.getPool().getUuid());
|
||||||
return new Answer(cmd);
|
return new Answer(cmd);
|
||||||
} catch (CloudRuntimeException e) {
|
} catch (CloudRuntimeException e) {
|
||||||
return new Answer(cmd, false, e.toString());
|
return new Answer(cmd, false, e.toString());
|
||||||
@ -1186,7 +1189,8 @@ public class LibvirtComputingResource extends ServerResourceBase implements
|
|||||||
KVMPhysicalDisk vol = null;
|
KVMPhysicalDisk vol = null;
|
||||||
long disksize;
|
long disksize;
|
||||||
try {
|
try {
|
||||||
primaryPool = _storagePoolMgr.getStoragePool(pool.getUuid());
|
primaryPool = _storagePoolMgr.getStoragePool(pool.getType(),
|
||||||
|
pool.getUuid());
|
||||||
disksize = dskch.getSize();
|
disksize = dskch.getSize();
|
||||||
|
|
||||||
if (cmd.getTemplateUrl() != null) {
|
if (cmd.getTemplateUrl() != null) {
|
||||||
@ -1268,8 +1272,9 @@ public class LibvirtComputingResource extends ServerResourceBase implements
|
|||||||
VolumeTO vol = cmd.getVolume();
|
VolumeTO vol = cmd.getVolume();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
KVMStoragePool pool = _storagePoolMgr.getStoragePool(vol
|
KVMStoragePool pool = _storagePoolMgr.getStoragePool(
|
||||||
.getPoolUuid());
|
vol.getPoolType(),
|
||||||
|
vol.getPoolUuid());
|
||||||
pool.deletePhysicalDisk(vol.getPath());
|
pool.deletePhysicalDisk(vol.getPath());
|
||||||
String vmName = cmd.getVmName();
|
String vmName = cmd.getVmName();
|
||||||
String poolPath = pool.getLocalPath();
|
String poolPath = pool.getLocalPath();
|
||||||
@ -1281,7 +1286,7 @@ public class LibvirtComputingResource extends ServerResourceBase implements
|
|||||||
File patchVbd = new File(poolPath + File.separator + vmName + "-patchdisk");
|
File patchVbd = new File(poolPath + File.separator + vmName + "-patchdisk");
|
||||||
if(patchVbd.exists()){
|
if(patchVbd.exists()){
|
||||||
try {
|
try {
|
||||||
_storagePoolMgr.deleteVbdByPath(patchVbd.getAbsolutePath());
|
_storagePoolMgr.deleteVbdByPath(vol.getPoolType(),patchVbd.getAbsolutePath());
|
||||||
} catch(CloudRuntimeException e) {
|
} catch(CloudRuntimeException e) {
|
||||||
s_logger.warn("unable to destroy patch disk '" + patchVbd.getAbsolutePath() +
|
s_logger.warn("unable to destroy patch disk '" + patchVbd.getAbsolutePath() +
|
||||||
"' while removing root disk for " + vmName + " : " + e);
|
"' while removing root disk for " + vmName + " : " + e);
|
||||||
@ -1643,8 +1648,9 @@ public class LibvirtComputingResource extends ServerResourceBase implements
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
KVMStoragePool primaryPool = _storagePoolMgr.getStoragePool(cmd
|
KVMStoragePool primaryPool = _storagePoolMgr.getStoragePool(
|
||||||
.getPool().getUuid());
|
cmd.getPool().getType(),
|
||||||
|
cmd.getPool().getUuid());
|
||||||
|
|
||||||
if (primaryPool.getType() == StoragePoolType.RBD) {
|
if (primaryPool.getType() == StoragePoolType.RBD) {
|
||||||
s_logger.debug("Snapshots are not supported on RBD volumes");
|
s_logger.debug("Snapshots are not supported on RBD volumes");
|
||||||
@ -1721,8 +1727,8 @@ public class LibvirtComputingResource extends ServerResourceBase implements
|
|||||||
try {
|
try {
|
||||||
Connect conn = LibvirtConnection.getConnection();
|
Connect conn = LibvirtConnection.getConnection();
|
||||||
|
|
||||||
secondaryStoragePool = _storagePoolMgr
|
secondaryStoragePool = _storagePoolMgr.getStoragePoolByURI(
|
||||||
.getStoragePoolByURI(secondaryStoragePoolUrl);
|
secondaryStoragePoolUrl);
|
||||||
|
|
||||||
String ssPmountPath = secondaryStoragePool.getLocalPath();
|
String ssPmountPath = secondaryStoragePool.getLocalPath();
|
||||||
snapshotRelPath = File.separator + "snapshots" + File.separator
|
snapshotRelPath = File.separator + "snapshots" + File.separator
|
||||||
@ -1732,8 +1738,9 @@ public class LibvirtComputingResource extends ServerResourceBase implements
|
|||||||
snapshotDestPath = ssPmountPath + File.separator + "snapshots"
|
snapshotDestPath = ssPmountPath + File.separator + "snapshots"
|
||||||
+ File.separator + dcId + File.separator + accountId
|
+ File.separator + dcId + File.separator + accountId
|
||||||
+ File.separator + volumeId;
|
+ File.separator + volumeId;
|
||||||
KVMStoragePool primaryPool = _storagePoolMgr.getStoragePool(cmd
|
KVMStoragePool primaryPool = _storagePoolMgr.getStoragePool(
|
||||||
.getPrimaryStoragePoolNameLabel());
|
cmd.getPool().getType(),
|
||||||
|
cmd.getPrimaryStoragePoolNameLabel());
|
||||||
KVMPhysicalDisk snapshotDisk = primaryPool.getPhysicalDisk(cmd
|
KVMPhysicalDisk snapshotDisk = primaryPool.getPhysicalDisk(cmd
|
||||||
.getVolumePath());
|
.getVolumePath());
|
||||||
Script command = new Script(_manageSnapshotPath, _cmdsTimeout,
|
Script command = new Script(_manageSnapshotPath, _cmdsTimeout,
|
||||||
@ -1760,8 +1767,9 @@ public class LibvirtComputingResource extends ServerResourceBase implements
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
KVMStoragePool primaryStorage = _storagePoolMgr.getStoragePool(cmd
|
KVMStoragePool primaryStorage = _storagePoolMgr.getStoragePool(
|
||||||
.getPool().getUuid());
|
cmd.getPool().getType(),
|
||||||
|
cmd.getPool().getUuid());
|
||||||
if (state == DomainInfo.DomainState.VIR_DOMAIN_RUNNING
|
if (state == DomainInfo.DomainState.VIR_DOMAIN_RUNNING
|
||||||
&& !primaryStorage.isExternalSnapshot()) {
|
&& !primaryStorage.isExternalSnapshot()) {
|
||||||
String vmUuid = vm.getUUIDString();
|
String vmUuid = vm.getUUIDString();
|
||||||
@ -1845,7 +1853,7 @@ public class LibvirtComputingResource extends ServerResourceBase implements
|
|||||||
KVMStoragePool secondaryStoragePool = null;
|
KVMStoragePool secondaryStoragePool = null;
|
||||||
try {
|
try {
|
||||||
secondaryStoragePool = _storagePoolMgr.getStoragePoolByURI(cmd
|
secondaryStoragePool = _storagePoolMgr.getStoragePoolByURI(cmd
|
||||||
.getSecondaryStorageUrl());
|
.getSecondaryStorageUrl());
|
||||||
|
|
||||||
String ssPmountPath = secondaryStoragePool.getLocalPath();
|
String ssPmountPath = secondaryStoragePool.getLocalPath();
|
||||||
String snapshotDestPath = ssPmountPath + File.separator
|
String snapshotDestPath = ssPmountPath + File.separator
|
||||||
@ -1875,15 +1883,16 @@ public class LibvirtComputingResource extends ServerResourceBase implements
|
|||||||
String snapshotPath = cmd.getSnapshotUuid();
|
String snapshotPath = cmd.getSnapshotUuid();
|
||||||
int index = snapshotPath.lastIndexOf("/");
|
int index = snapshotPath.lastIndexOf("/");
|
||||||
snapshotPath = snapshotPath.substring(0, index);
|
snapshotPath = snapshotPath.substring(0, index);
|
||||||
KVMStoragePool secondaryPool = _storagePoolMgr
|
KVMStoragePool secondaryPool = _storagePoolMgr.getStoragePoolByURI(
|
||||||
.getStoragePoolByURI(cmd.getSecondaryStorageUrl()
|
cmd.getSecondaryStorageUrl()
|
||||||
+ snapshotPath);
|
+ snapshotPath);
|
||||||
KVMPhysicalDisk snapshot = secondaryPool.getPhysicalDisk(cmd
|
KVMPhysicalDisk snapshot = secondaryPool.getPhysicalDisk(cmd
|
||||||
.getSnapshotName());
|
.getSnapshotName());
|
||||||
|
|
||||||
String primaryUuid = cmd.getPrimaryStoragePoolNameLabel();
|
String primaryUuid = cmd.getPrimaryStoragePoolNameLabel();
|
||||||
KVMStoragePool primaryPool = _storagePoolMgr
|
KVMStoragePool primaryPool = _storagePoolMgr
|
||||||
.getStoragePool(primaryUuid);
|
.getStoragePool(cmd.getPool().getType(),
|
||||||
|
primaryUuid);
|
||||||
String volUuid = UUID.randomUUID().toString();
|
String volUuid = UUID.randomUUID().toString();
|
||||||
KVMPhysicalDisk disk = _storagePoolMgr.copyPhysicalDisk(snapshot,
|
KVMPhysicalDisk disk = _storagePoolMgr.copyPhysicalDisk(snapshot,
|
||||||
volUuid, primaryPool);
|
volUuid, primaryPool);
|
||||||
@ -1918,8 +1927,8 @@ public class LibvirtComputingResource extends ServerResourceBase implements
|
|||||||
KVMPhysicalDisk snapshot = snapshotPool.getPhysicalDisk(cmd
|
KVMPhysicalDisk snapshot = snapshotPool.getPhysicalDisk(cmd
|
||||||
.getSnapshotName());
|
.getSnapshotName());
|
||||||
|
|
||||||
secondaryPool = _storagePoolMgr.getStoragePoolByURI(cmd
|
secondaryPool = _storagePoolMgr.getStoragePoolByURI(
|
||||||
.getSecondaryStorageUrl());
|
cmd.getSecondaryStorageUrl());
|
||||||
|
|
||||||
String templatePath = secondaryPool.getLocalPath() + File.separator
|
String templatePath = secondaryPool.getLocalPath() + File.separator
|
||||||
+ templateInstallFolder;
|
+ templateInstallFolder;
|
||||||
@ -1968,8 +1977,9 @@ public class LibvirtComputingResource extends ServerResourceBase implements
|
|||||||
|
|
||||||
protected GetStorageStatsAnswer execute(final GetStorageStatsCommand cmd) {
|
protected GetStorageStatsAnswer execute(final GetStorageStatsCommand cmd) {
|
||||||
try {
|
try {
|
||||||
KVMStoragePool sp = _storagePoolMgr.getStoragePool(cmd
|
KVMStoragePool sp = _storagePoolMgr.getStoragePool(
|
||||||
.getStorageId());
|
cmd.getPooltype(),
|
||||||
|
cmd.getStorageId());
|
||||||
return new GetStorageStatsAnswer(cmd, sp.getCapacity(),
|
return new GetStorageStatsAnswer(cmd, sp.getCapacity(),
|
||||||
sp.getUsed());
|
sp.getUsed());
|
||||||
} catch (CloudRuntimeException e) {
|
} catch (CloudRuntimeException e) {
|
||||||
@ -1988,11 +1998,12 @@ public class LibvirtComputingResource extends ServerResourceBase implements
|
|||||||
+ cmd.getTemplateId() + File.separator;
|
+ cmd.getTemplateId() + File.separator;
|
||||||
String templateInstallFolder = "/template/tmpl/" + templateFolder;
|
String templateInstallFolder = "/template/tmpl/" + templateFolder;
|
||||||
|
|
||||||
secondaryStorage = _storagePoolMgr
|
secondaryStorage = _storagePoolMgr.getStoragePoolByURI(
|
||||||
.getStoragePoolByURI(secondaryStorageURL);
|
secondaryStorageURL);
|
||||||
|
|
||||||
KVMStoragePool primary = _storagePoolMgr.getStoragePool(cmd
|
KVMStoragePool primary = _storagePoolMgr.getStoragePool(
|
||||||
.getPrimaryStoragePoolNameLabel());
|
cmd.getPool().getType(),
|
||||||
|
cmd.getPrimaryStoragePoolNameLabel());
|
||||||
KVMPhysicalDisk disk = primary.getPhysicalDisk(cmd.getVolumePath());
|
KVMPhysicalDisk disk = primary.getPhysicalDisk(cmd.getVolumePath());
|
||||||
String tmpltPath = secondaryStorage.getLocalPath() + File.separator
|
String tmpltPath = secondaryStorage.getLocalPath() + File.separator
|
||||||
+ templateInstallFolder;
|
+ templateInstallFolder;
|
||||||
@ -2114,8 +2125,9 @@ public class LibvirtComputingResource extends ServerResourceBase implements
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Copy volume to primary storage */
|
/* Copy volume to primary storage */
|
||||||
KVMStoragePool primaryPool = _storagePoolMgr.getStoragePool(cmd
|
KVMStoragePool primaryPool = _storagePoolMgr.getStoragePool(
|
||||||
.getPoolUuid());
|
cmd.getPool().getType(),
|
||||||
|
cmd.getPoolUuid());
|
||||||
|
|
||||||
KVMPhysicalDisk primaryVol = _storagePoolMgr.copyPhysicalDisk(
|
KVMPhysicalDisk primaryVol = _storagePoolMgr.copyPhysicalDisk(
|
||||||
tmplVol, UUID.randomUUID().toString(), primaryPool);
|
tmplVol, UUID.randomUUID().toString(), primaryPool);
|
||||||
@ -2136,9 +2148,11 @@ public class LibvirtComputingResource extends ServerResourceBase implements
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected Answer execute(ModifyStoragePoolCommand cmd) {
|
protected Answer execute(ModifyStoragePoolCommand cmd) {
|
||||||
|
String poolType = cmd.getPool().getType().toString();
|
||||||
KVMStoragePool storagepool = _storagePoolMgr.createStoragePool(cmd
|
KVMStoragePool storagepool = _storagePoolMgr.createStoragePool(cmd
|
||||||
.getPool().getUuid(), cmd.getPool().getHost(), cmd.getPool().getPort(),
|
.getPool().getUuid(), cmd.getPool().getHost(),
|
||||||
cmd.getPool().getPath(), cmd.getPool().getUserInfo(), cmd.getPool().getType());
|
cmd.getPool().getPort(), cmd.getPool().getPath(),
|
||||||
|
cmd.getPool().getUserInfo(), cmd.getPool().getType());
|
||||||
if (storagepool == null) {
|
if (storagepool == null) {
|
||||||
return new Answer(cmd, false, " Failed to create storage pool");
|
return new Answer(cmd, false, " Failed to create storage pool");
|
||||||
}
|
}
|
||||||
@ -2276,8 +2290,9 @@ public class LibvirtComputingResource extends ServerResourceBase implements
|
|||||||
private AttachVolumeAnswer execute(AttachVolumeCommand cmd) {
|
private AttachVolumeAnswer execute(AttachVolumeCommand cmd) {
|
||||||
try {
|
try {
|
||||||
Connect conn = LibvirtConnection.getConnection();
|
Connect conn = LibvirtConnection.getConnection();
|
||||||
KVMStoragePool primary = _storagePoolMgr.getStoragePool(cmd
|
KVMStoragePool primary = _storagePoolMgr.getStoragePool(
|
||||||
.getPoolUuid());
|
cmd.getPooltype(),
|
||||||
|
cmd.getPoolUuid());
|
||||||
KVMPhysicalDisk disk = primary.getPhysicalDisk(cmd.getVolumePath());
|
KVMPhysicalDisk disk = primary.getPhysicalDisk(cmd.getVolumePath());
|
||||||
attachOrDetachDisk(conn, cmd.getAttach(), cmd.getVmName(), disk,
|
attachOrDetachDisk(conn, cmd.getAttach(), cmd.getVmName(), disk,
|
||||||
cmd.getDeviceId().intValue());
|
cmd.getDeviceId().intValue());
|
||||||
@ -2924,8 +2939,8 @@ public class LibvirtComputingResource extends ServerResourceBase implements
|
|||||||
int index = isoPath.lastIndexOf("/");
|
int index = isoPath.lastIndexOf("/");
|
||||||
String path = isoPath.substring(0, index);
|
String path = isoPath.substring(0, index);
|
||||||
String name = isoPath.substring(index + 1);
|
String name = isoPath.substring(index + 1);
|
||||||
KVMStoragePool secondaryPool = _storagePoolMgr
|
KVMStoragePool secondaryPool = _storagePoolMgr.getStoragePoolByURI(
|
||||||
.getStoragePoolByURI(path);
|
path);
|
||||||
KVMPhysicalDisk isoVol = secondaryPool.getPhysicalDisk(name);
|
KVMPhysicalDisk isoVol = secondaryPool.getPhysicalDisk(name);
|
||||||
return isoVol.getPath();
|
return isoVol.getPath();
|
||||||
} else {
|
} else {
|
||||||
@ -2952,11 +2967,13 @@ public class LibvirtComputingResource extends ServerResourceBase implements
|
|||||||
int index = volPath.lastIndexOf("/");
|
int index = volPath.lastIndexOf("/");
|
||||||
String volDir = volPath.substring(0, index);
|
String volDir = volPath.substring(0, index);
|
||||||
String volName = volPath.substring(index + 1);
|
String volName = volPath.substring(index + 1);
|
||||||
KVMStoragePool secondaryStorage = _storagePoolMgr
|
KVMStoragePool secondaryStorage = _storagePoolMgr.
|
||||||
.getStoragePoolByURI(volDir);
|
getStoragePoolByURI(volDir);
|
||||||
physicalDisk = secondaryStorage.getPhysicalDisk(volName);
|
physicalDisk = secondaryStorage.getPhysicalDisk(volName);
|
||||||
} else if (volume.getType() != Volume.Type.ISO) {
|
} else if (volume.getType() != Volume.Type.ISO) {
|
||||||
pool = _storagePoolMgr.getStoragePool(volume.getPoolUuid());
|
pool = _storagePoolMgr.getStoragePool(
|
||||||
|
volume.getPoolType(),
|
||||||
|
volume.getPoolUuid());
|
||||||
physicalDisk = pool.getPhysicalDisk(volume.getPath());
|
physicalDisk = pool.getPhysicalDisk(volume.getPath());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3034,7 +3051,9 @@ public class LibvirtComputingResource extends ServerResourceBase implements
|
|||||||
DiskDef rootDisk = disks.get(0);
|
DiskDef rootDisk = disks.get(0);
|
||||||
VolumeTO rootVol = getVolume(vmSpec, Volume.Type.ROOT);
|
VolumeTO rootVol = getVolume(vmSpec, Volume.Type.ROOT);
|
||||||
String patchName = vmName + "-patchdisk";
|
String patchName = vmName + "-patchdisk";
|
||||||
KVMStoragePool pool = _storagePoolMgr.getStoragePool(rootVol.getPoolUuid());
|
KVMStoragePool pool = _storagePoolMgr.getStoragePool(
|
||||||
|
rootVol.getPoolType(),
|
||||||
|
rootVol.getPoolUuid());
|
||||||
String patchDiskPath = pool.getLocalPath() + "/" + patchName;
|
String patchDiskPath = pool.getLocalPath() + "/" + patchName;
|
||||||
|
|
||||||
List<KVMPhysicalDisk> phyDisks = pool.listPhysicalDisks();
|
List<KVMPhysicalDisk> phyDisks = pool.listPhysicalDisks();
|
||||||
@ -3130,7 +3149,8 @@ public class LibvirtComputingResource extends ServerResourceBase implements
|
|||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
KVMStoragePool pool = _storagePoolMgr.getStoragePool(poolUuid);
|
//we use libvirt since we passed a libvirt connection to cleanupDisk
|
||||||
|
KVMStoragePool pool = _storagePoolMgr.getStoragePool(null, poolUuid);
|
||||||
if (pool != null) {
|
if (pool != null) {
|
||||||
pool.delete();
|
pool.delete();
|
||||||
}
|
}
|
||||||
@ -3148,8 +3168,8 @@ public class LibvirtComputingResource extends ServerResourceBase implements
|
|||||||
int index = isoPath.lastIndexOf("/");
|
int index = isoPath.lastIndexOf("/");
|
||||||
String path = isoPath.substring(0, index);
|
String path = isoPath.substring(0, index);
|
||||||
String name = isoPath.substring(index + 1);
|
String name = isoPath.substring(index + 1);
|
||||||
KVMStoragePool secondaryPool = _storagePoolMgr
|
KVMStoragePool secondaryPool = _storagePoolMgr.getStoragePoolByURI(
|
||||||
.getStoragePoolByURI(path);
|
path);
|
||||||
KVMPhysicalDisk isoVol = secondaryPool.getPhysicalDisk(name);
|
KVMPhysicalDisk isoVol = secondaryPool.getPhysicalDisk(name);
|
||||||
isoPath = isoVol.getPath();
|
isoPath = isoVol.getPath();
|
||||||
|
|
||||||
@ -4416,4 +4436,5 @@ public class LibvirtComputingResource extends ServerResourceBase implements
|
|||||||
|
|
||||||
return new Answer(cmd, success, "");
|
return new Answer(cmd, success, "");
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -16,8 +16,12 @@
|
|||||||
// under the License.
|
// under the License.
|
||||||
package com.cloud.hypervisor.kvm.storage;
|
package com.cloud.hypervisor.kvm.storage;
|
||||||
|
|
||||||
|
import java.net.URI;
|
||||||
|
import java.net.URISyntaxException;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
import com.cloud.hypervisor.kvm.resource.KVMHABase;
|
import com.cloud.hypervisor.kvm.resource.KVMHABase;
|
||||||
import com.cloud.hypervisor.kvm.resource.KVMHABase.PoolType;
|
import com.cloud.hypervisor.kvm.resource.KVMHABase.PoolType;
|
||||||
@ -25,11 +29,22 @@ import com.cloud.hypervisor.kvm.resource.KVMHAMonitor;
|
|||||||
import com.cloud.hypervisor.kvm.storage.KVMPhysicalDisk.PhysicalDiskFormat;
|
import com.cloud.hypervisor.kvm.storage.KVMPhysicalDisk.PhysicalDiskFormat;
|
||||||
import com.cloud.storage.Storage.StoragePoolType;
|
import com.cloud.storage.Storage.StoragePoolType;
|
||||||
import com.cloud.storage.StorageLayer;
|
import com.cloud.storage.StorageLayer;
|
||||||
|
import com.cloud.utils.exception.CloudRuntimeException;
|
||||||
|
|
||||||
public class KVMStoragePoolManager {
|
public class KVMStoragePoolManager {
|
||||||
private StorageAdaptor _storageAdaptor;
|
private StorageAdaptor _storageAdaptor;
|
||||||
private KVMHAMonitor _haMonitor;
|
private KVMHAMonitor _haMonitor;
|
||||||
private final Map<String, Object> _storagePools = new ConcurrentHashMap<String, Object>();
|
private final Map<String, Object> _storagePools = new ConcurrentHashMap<String, Object>();
|
||||||
|
private final Map<String, StorageAdaptor> _storageMapper = new HashMap<String, StorageAdaptor>();
|
||||||
|
|
||||||
|
private StorageAdaptor getStorageAdaptor(StoragePoolType type) {
|
||||||
|
StorageAdaptor adaptor = _storageMapper.get(type.toString());
|
||||||
|
if (adaptor == null) {
|
||||||
|
// LibvirtStorageAdaptor is selected by default
|
||||||
|
adaptor = _storageMapper.get("libvirt");
|
||||||
|
}
|
||||||
|
return adaptor;
|
||||||
|
}
|
||||||
|
|
||||||
private void addStoragePool(String uuid) {
|
private void addStoragePool(String uuid) {
|
||||||
synchronized (_storagePools) {
|
synchronized (_storagePools) {
|
||||||
@ -42,20 +57,49 @@ public class KVMStoragePoolManager {
|
|||||||
public KVMStoragePoolManager(StorageLayer storagelayer, KVMHAMonitor monitor) {
|
public KVMStoragePoolManager(StorageLayer storagelayer, KVMHAMonitor monitor) {
|
||||||
this._storageAdaptor = new LibvirtStorageAdaptor(storagelayer);
|
this._storageAdaptor = new LibvirtStorageAdaptor(storagelayer);
|
||||||
this._haMonitor = monitor;
|
this._haMonitor = monitor;
|
||||||
|
this._storageMapper.put("libvirt", new LibvirtStorageAdaptor(storagelayer));
|
||||||
|
// add other storage adaptors here
|
||||||
|
// this._storageMapper.put("newadaptor", new NewStorageAdaptor(storagelayer));
|
||||||
}
|
}
|
||||||
|
|
||||||
public KVMStoragePool getStoragePool(String uuid) {
|
public KVMStoragePool getStoragePool(StoragePoolType type, String uuid) {
|
||||||
return this._storageAdaptor.getStoragePool(uuid);
|
StorageAdaptor adaptor = getStorageAdaptor(type);
|
||||||
|
return adaptor.getStoragePool(uuid);
|
||||||
}
|
}
|
||||||
|
|
||||||
public KVMStoragePool getStoragePoolByURI(String uri) {
|
public KVMStoragePool getStoragePoolByURI(String uri) {
|
||||||
return this._storageAdaptor.getStoragePoolByURI(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 protocol = null;
|
||||||
|
if (storageUri.getScheme().equalsIgnoreCase("nfs")) {
|
||||||
|
sourcePath = storageUri.getPath();
|
||||||
|
sourcePath = sourcePath.replace("//", "/");
|
||||||
|
sourceHost = storageUri.getHost();
|
||||||
|
uuid = UUID.nameUUIDFromBytes(
|
||||||
|
new String(sourceHost + sourcePath).getBytes()).toString();
|
||||||
|
protocol = StoragePoolType.NetworkFilesystem;
|
||||||
|
}
|
||||||
|
|
||||||
|
return createStoragePool(uuid, sourceHost, 0, sourcePath, "", protocol);
|
||||||
}
|
}
|
||||||
|
|
||||||
public KVMStoragePool createStoragePool(String name, String host, int port, String path,
|
public KVMStoragePool createStoragePool( String name, String host, int port,
|
||||||
String userInfo, StoragePoolType type) {
|
String path, String userInfo,
|
||||||
KVMStoragePool pool = this._storageAdaptor.createStoragePool(name,
|
StoragePoolType type) {
|
||||||
|
StorageAdaptor adaptor = getStorageAdaptor(type);
|
||||||
|
KVMStoragePool pool = adaptor.createStoragePool(name,
|
||||||
host, port, path, userInfo, type);
|
host, port, path, userInfo, type);
|
||||||
|
|
||||||
|
// LibvirtStorageAdaptor-specific statement
|
||||||
if (type == StoragePoolType.NetworkFilesystem) {
|
if (type == StoragePoolType.NetworkFilesystem) {
|
||||||
KVMHABase.NfsStoragePool nfspool = new KVMHABase.NfsStoragePool(
|
KVMHABase.NfsStoragePool nfspool = new KVMHABase.NfsStoragePool(
|
||||||
pool.getUuid(), host, path, pool.getLocalPath(),
|
pool.getUuid(), host, path, pool.getLocalPath(),
|
||||||
@ -66,28 +110,33 @@ public class KVMStoragePoolManager {
|
|||||||
return pool;
|
return pool;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean deleteStoragePool(String uuid) {
|
public boolean deleteStoragePool(StoragePoolType type, String uuid) {
|
||||||
|
StorageAdaptor adaptor = getStorageAdaptor(type);
|
||||||
_haMonitor.removeStoragePool(uuid);
|
_haMonitor.removeStoragePool(uuid);
|
||||||
this._storageAdaptor.deleteStoragePool(uuid);
|
adaptor.deleteStoragePool(uuid);
|
||||||
_storagePools.remove(uuid);
|
_storagePools.remove(uuid);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean deleteVbdByPath(String diskPath) {
|
public boolean deleteVbdByPath(StoragePoolType type, String diskPath) {
|
||||||
return this._storageAdaptor.deleteVbdByPath(diskPath);
|
StorageAdaptor adaptor = getStorageAdaptor(type);
|
||||||
|
return adaptor.deleteVbdByPath(diskPath);
|
||||||
}
|
}
|
||||||
|
|
||||||
public KVMPhysicalDisk createDiskFromTemplate(KVMPhysicalDisk template, String name,
|
public KVMPhysicalDisk createDiskFromTemplate(KVMPhysicalDisk template, String name,
|
||||||
KVMStoragePool destPool) {
|
KVMStoragePool destPool) {
|
||||||
|
StorageAdaptor adaptor = getStorageAdaptor(destPool.getType());
|
||||||
|
|
||||||
|
// LibvirtStorageAdaptor-specific statement
|
||||||
if (destPool.getType() == StoragePoolType.RBD) {
|
if (destPool.getType() == StoragePoolType.RBD) {
|
||||||
return this._storageAdaptor.createDiskFromTemplate(template, name,
|
return adaptor.createDiskFromTemplate(template, name,
|
||||||
KVMPhysicalDisk.PhysicalDiskFormat.RAW, template.getSize(), destPool);
|
KVMPhysicalDisk.PhysicalDiskFormat.RAW, template.getSize(), destPool);
|
||||||
} else if (destPool.getType() == StoragePoolType.CLVM) {
|
} else if (destPool.getType() == StoragePoolType.CLVM) {
|
||||||
return this._storageAdaptor.createDiskFromTemplate(template, name,
|
return adaptor.createDiskFromTemplate(template, name,
|
||||||
KVMPhysicalDisk.PhysicalDiskFormat.RAW, template.getSize(),
|
KVMPhysicalDisk.PhysicalDiskFormat.RAW, template.getSize(),
|
||||||
destPool);
|
destPool);
|
||||||
} else {
|
} else {
|
||||||
return this._storageAdaptor.createDiskFromTemplate(template, name,
|
return adaptor.createDiskFromTemplate(template, name,
|
||||||
KVMPhysicalDisk.PhysicalDiskFormat.QCOW2,
|
KVMPhysicalDisk.PhysicalDiskFormat.QCOW2,
|
||||||
template.getSize(), destPool);
|
template.getSize(), destPool);
|
||||||
}
|
}
|
||||||
@ -96,22 +145,22 @@ public class KVMStoragePoolManager {
|
|||||||
public KVMPhysicalDisk createTemplateFromDisk(KVMPhysicalDisk disk,
|
public KVMPhysicalDisk createTemplateFromDisk(KVMPhysicalDisk disk,
|
||||||
String name, PhysicalDiskFormat format, long size,
|
String name, PhysicalDiskFormat format, long size,
|
||||||
KVMStoragePool destPool) {
|
KVMStoragePool destPool) {
|
||||||
return this._storageAdaptor.createTemplateFromDisk(disk, name, format,
|
StorageAdaptor adaptor = getStorageAdaptor(destPool.getType());
|
||||||
|
return adaptor.createTemplateFromDisk(disk, name, format,
|
||||||
size, destPool);
|
size, destPool);
|
||||||
}
|
}
|
||||||
|
|
||||||
public KVMPhysicalDisk copyPhysicalDisk(KVMPhysicalDisk disk, String name,
|
public KVMPhysicalDisk copyPhysicalDisk(KVMPhysicalDisk disk, String name,
|
||||||
KVMStoragePool destPool) {
|
KVMStoragePool destPool) {
|
||||||
return this._storageAdaptor.copyPhysicalDisk(disk, name, destPool);
|
StorageAdaptor adaptor = getStorageAdaptor(destPool.getType());
|
||||||
|
return adaptor.copyPhysicalDisk(disk, name, destPool);
|
||||||
}
|
}
|
||||||
|
|
||||||
public KVMPhysicalDisk createDiskFromSnapshot(KVMPhysicalDisk snapshot,
|
public KVMPhysicalDisk createDiskFromSnapshot(KVMPhysicalDisk snapshot,
|
||||||
String snapshotName, String name, KVMStoragePool destPool) {
|
String snapshotName, String name, KVMStoragePool destPool) {
|
||||||
return this._storageAdaptor.createDiskFromSnapshot(snapshot,
|
StorageAdaptor adaptor = getStorageAdaptor(destPool.getType());
|
||||||
|
return adaptor.createDiskFromSnapshot(snapshot,
|
||||||
snapshotName, name, destPool);
|
snapshotName, name, destPool);
|
||||||
}
|
}
|
||||||
|
|
||||||
public KVMPhysicalDisk getPhysicalDiskFromUrl(String url) {
|
|
||||||
return this._storageAdaptor.getPhysicalDiskFromURI(url);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -725,38 +725,6 @@ public class LibvirtStorageAdaptor implements StorageAdaptor {
|
|||||||
return newDisk;
|
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.nameUUIDFromBytes(
|
|
||||||
new String(sourceHost + sourcePath).getBytes()).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
|
@Override
|
||||||
public KVMPhysicalDisk createDiskFromSnapshot(KVMPhysicalDisk snapshot,
|
public KVMPhysicalDisk createDiskFromSnapshot(KVMPhysicalDisk snapshot,
|
||||||
String snapshotName, String name, KVMStoragePool destPool) {
|
String snapshotName, String name, KVMStoragePool destPool) {
|
||||||
|
|||||||
@ -55,10 +55,6 @@ public interface StorageAdaptor {
|
|||||||
public KVMPhysicalDisk createDiskFromSnapshot(KVMPhysicalDisk snapshot,
|
public KVMPhysicalDisk createDiskFromSnapshot(KVMPhysicalDisk snapshot,
|
||||||
String snapshotName, String name, KVMStoragePool destPool);
|
String snapshotName, String name, KVMStoragePool destPool);
|
||||||
|
|
||||||
public KVMStoragePool getStoragePoolByURI(String uri);
|
|
||||||
|
|
||||||
public KVMPhysicalDisk getPhysicalDiskFromURI(String uri);
|
|
||||||
|
|
||||||
public boolean refresh(KVMStoragePool pool);
|
public boolean refresh(KVMStoragePool pool);
|
||||||
|
|
||||||
public boolean deleteStoragePool(KVMStoragePool pool);
|
public boolean deleteStoragePool(KVMStoragePool pool);
|
||||||
|
|||||||
@ -669,7 +669,6 @@ public class StorageManagerImpl implements StorageManager, Manager, ClusterManag
|
|||||||
String vdiUUID = null;
|
String vdiUUID = null;
|
||||||
Long snapshotId = snapshot.getId();
|
Long snapshotId = snapshot.getId();
|
||||||
Long volumeId = snapshot.getVolumeId();
|
Long volumeId = snapshot.getVolumeId();
|
||||||
String primaryStoragePoolNameLabel = pool.getUuid(); // pool's uuid is actually the namelabel.
|
|
||||||
Long dcId = snapshot.getDataCenterId();
|
Long dcId = snapshot.getDataCenterId();
|
||||||
String secondaryStoragePoolUrl = _snapMgr.getSecondaryStorageURL(snapshot);
|
String secondaryStoragePoolUrl = _snapMgr.getSecondaryStorageURL(snapshot);
|
||||||
long accountId = snapshot.getAccountId();
|
long accountId = snapshot.getAccountId();
|
||||||
@ -716,7 +715,7 @@ public class StorageManagerImpl implements StorageManager, Manager, ClusterManag
|
|||||||
} else if (snapshot.getS3Id() != null && snapshot.getS3Id() != 0) {
|
} else if (snapshot.getS3Id() != null && snapshot.getS3Id() != 0) {
|
||||||
_snapshotMgr.downloadSnapshotsFromS3(snapshot);
|
_snapshotMgr.downloadSnapshotsFromS3(snapshot);
|
||||||
}
|
}
|
||||||
CreateVolumeFromSnapshotCommand createVolumeFromSnapshotCommand = new CreateVolumeFromSnapshotCommand(primaryStoragePoolNameLabel, secondaryStoragePoolUrl, dcId, accountId, volumeId,
|
CreateVolumeFromSnapshotCommand createVolumeFromSnapshotCommand = new CreateVolumeFromSnapshotCommand(pool, secondaryStoragePoolUrl, dcId, accountId, volumeId,
|
||||||
backedUpSnapshotUuid, snapshot.getName(), _createVolumeFromSnapshotWait);
|
backedUpSnapshotUuid, snapshot.getName(), _createVolumeFromSnapshotWait);
|
||||||
CreateVolumeFromSnapshotAnswer answer;
|
CreateVolumeFromSnapshotAnswer answer;
|
||||||
if (!_snapshotDao.lockInLockTable(snapshotId.toString(), 10)) {
|
if (!_snapshotDao.lockInLockTable(snapshotId.toString(), 10)) {
|
||||||
|
|||||||
@ -628,7 +628,6 @@ public class SnapshotManagerImpl implements SnapshotManager, SnapshotService, Ma
|
|||||||
long volumeId = snapshot.getVolumeId();
|
long volumeId = snapshot.getVolumeId();
|
||||||
VolumeVO volume = _volsDao.lockRow(volumeId, true);
|
VolumeVO volume = _volsDao.lockRow(volumeId, true);
|
||||||
|
|
||||||
String primaryStoragePoolNameLabel = _storageMgr.getPrimaryStorageNameLabel(volume);
|
|
||||||
Long dcId = volume.getDataCenterId();
|
Long dcId = volume.getDataCenterId();
|
||||||
Long accountId = volume.getAccountId();
|
Long accountId = volume.getAccountId();
|
||||||
|
|
||||||
@ -666,7 +665,7 @@ public class SnapshotManagerImpl implements SnapshotManager, SnapshotService, Ma
|
|||||||
boolean isVolumeInactive = _storageMgr.volumeInactive(volume);
|
boolean isVolumeInactive = _storageMgr.volumeInactive(volume);
|
||||||
String vmName = _storageMgr.getVmNameOnVolume(volume);
|
String vmName = _storageMgr.getVmNameOnVolume(volume);
|
||||||
StoragePoolVO srcPool = _storagePoolDao.findById(volume.getPoolId());
|
StoragePoolVO srcPool = _storagePoolDao.findById(volume.getPoolId());
|
||||||
BackupSnapshotCommand backupSnapshotCommand = new BackupSnapshotCommand(primaryStoragePoolNameLabel, secondaryStoragePoolUrl, dcId, accountId, volumeId, snapshot.getId(), volume.getPath(), srcPool, snapshotUuid,
|
BackupSnapshotCommand backupSnapshotCommand = new BackupSnapshotCommand(secondaryStoragePoolUrl, dcId, accountId, volumeId, snapshot.getId(), volume.getPath(), srcPool, snapshotUuid,
|
||||||
snapshot.getName(), prevSnapshotUuid, prevBackupUuid, isVolumeInactive, vmName, _backupsnapshotwait);
|
snapshot.getName(), prevSnapshotUuid, prevBackupUuid, isVolumeInactive, vmName, _backupsnapshotwait);
|
||||||
|
|
||||||
if ( swift != null ) {
|
if ( swift != null ) {
|
||||||
|
|||||||
@ -667,7 +667,7 @@ public class TemplateManagerImpl implements TemplateManager, Manager, TemplateSe
|
|||||||
}
|
}
|
||||||
String url = origUrl + "/" + templateHostRef.getInstallPath();
|
String url = origUrl + "/" + templateHostRef.getInstallPath();
|
||||||
PrimaryStorageDownloadCommand dcmd = new PrimaryStorageDownloadCommand(template.getUniqueName(), url, template.getFormat(),
|
PrimaryStorageDownloadCommand dcmd = new PrimaryStorageDownloadCommand(template.getUniqueName(), url, template.getFormat(),
|
||||||
template.getAccountId(), pool.getId(), pool.getUuid(), _primaryStorageDownloadWait);
|
template.getAccountId(), pool, _primaryStorageDownloadWait);
|
||||||
HostVO secondaryStorageHost = _hostDao.findById(templateHostRef.getHostId());
|
HostVO secondaryStorageHost = _hostDao.findById(templateHostRef.getHostId());
|
||||||
assert(secondaryStorageHost != null);
|
assert(secondaryStorageHost != null);
|
||||||
dcmd.setSecondaryStorageUrl(secondaryStorageHost.getStorageUrl());
|
dcmd.setSecondaryStorageUrl(secondaryStorageHost.getStorageUrl());
|
||||||
|
|||||||
@ -1448,7 +1448,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager
|
|||||||
if( snapshot.getSwiftId() != null && snapshot.getSwiftId() != 0 ) {
|
if( snapshot.getSwiftId() != null && snapshot.getSwiftId() != 0 ) {
|
||||||
_snapshotMgr.downloadSnapshotsFromSwift(snapshot);
|
_snapshotMgr.downloadSnapshotsFromSwift(snapshot);
|
||||||
}
|
}
|
||||||
cmd = new CreatePrivateTemplateFromSnapshotCommand(pool.getUuid(), secondaryStorageURL, dcId, accountId, snapshot.getVolumeId(), backupSnapshotUUID, snapshot.getName(),
|
cmd = new CreatePrivateTemplateFromSnapshotCommand(pool, secondaryStorageURL, dcId, accountId, snapshot.getVolumeId(), backupSnapshotUUID, snapshot.getName(),
|
||||||
origTemplateInstallPath, templateId, name, _createprivatetemplatefromsnapshotwait);
|
origTemplateInstallPath, templateId, name, _createprivatetemplatefromsnapshotwait);
|
||||||
} else if (volumeId != null) {
|
} else if (volumeId != null) {
|
||||||
VolumeVO volume = _volsDao.findById(volumeId);
|
VolumeVO volume = _volsDao.findById(volumeId);
|
||||||
@ -1470,7 +1470,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager
|
|||||||
secondaryStorageURL = secondaryStorageHost.getStorageUrl();
|
secondaryStorageURL = secondaryStorageHost.getStorageUrl();
|
||||||
|
|
||||||
pool = _storagePoolDao.findById(volume.getPoolId());
|
pool = _storagePoolDao.findById(volume.getPoolId());
|
||||||
cmd = new CreatePrivateTemplateFromVolumeCommand(pool.getUuid(), secondaryStorageURL, templateId, accountId, command.getTemplateName(), uniqueName, volume.getPath(), vmName, _createprivatetemplatefromvolumewait);
|
cmd = new CreatePrivateTemplateFromVolumeCommand(pool, secondaryStorageURL, templateId, accountId, command.getTemplateName(), uniqueName, volume.getPath(), vmName, _createprivatetemplatefromvolumewait);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
throw new CloudRuntimeException("Creating private Template need to specify snapshotId or volumeId");
|
throw new CloudRuntimeException("Creating private Template need to specify snapshotId or volumeId");
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user