You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by mc...@apache.org on 2013/10/26 06:18:44 UTC
[1/8] git commit: updated refs/heads/object_store_migration to 9da56fe
Updated Branches:
refs/heads/object_store_migration [created] 9da56fe1f
Add PrepareSecondaryStorageForMigrationCmd for preparing migration
of existing NFS secondary storage to object store like S3.
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/6935dd28
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/6935dd28
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/6935dd28
Branch: refs/heads/object_store_migration
Commit: 6935dd2888531e39d8e8c09c1467f7dabea72a36
Parents: ec3302a
Author: Min Chen <mi...@citrix.com>
Authored: Fri Oct 18 18:26:46 2013 -0700
Committer: Min Chen <mi...@citrix.com>
Committed: Fri Oct 18 18:26:46 2013 -0700
----------------------------------------------------------------------
api/src/com/cloud/event/EventTypes.java | 3 +
api/src/com/cloud/storage/StorageService.java | 16 ++-
.../cloudstack/api/ApiCommandJobType.java | 1 +
.../PrepareSecondaryStorageForMigrationCmd.java | 109 +++++++++++++++++++
client/tomcatconf/commands.properties.in | 1 +
.../api/storage/DataStoreLifeCycle.java | 2 +
.../datastore/db/SnapshotDataStoreDao.java | 2 +
.../datastore/db/SnapshotDataStoreVO.java | 36 +++---
.../datastore/db/TemplateDataStoreDao.java | 4 +-
.../datastore/db/TemplateDataStoreVO.java | 53 ++++-----
.../datastore/db/VolumeDataStoreDao.java | 2 +
.../storage/datastore/db/VolumeDataStoreVO.java | 49 +++++----
.../image/datastore/ImageStoreHelper.java | 16 ++-
.../image/db/SnapshotDataStoreDaoImpl.java | 39 ++++++-
.../image/db/TemplateDataStoreDaoImpl.java | 31 ++++++
.../image/db/VolumeDataStoreDaoImpl.java | 33 +++++-
.../SimulatorImageStoreLifeCycleImpl.java | 36 ++++--
.../CloudStackImageStoreLifeCycleImpl.java | 9 ++
.../lifecycle/S3ImageStoreLifeCycleImpl.java | 12 +-
.../SampleImageStoreLifeCycleImpl.java | 9 ++
.../lifecycle/SwiftImageStoreLifeCycleImpl.java | 30 +++--
...CloudStackPrimaryDataStoreLifeCycleImpl.java | 17 ++-
.../SamplePrimaryDataStoreLifeCycleImpl.java | 34 ++++--
.../SolidFirePrimaryDataStoreLifeCycle.java | 15 ++-
.../com/cloud/server/ManagementServerImpl.java | 9 +-
.../com/cloud/storage/StorageManagerImpl.java | 32 ++++++
tools/apidoc/gen_toc.py | 1 +
27 files changed, 488 insertions(+), 113 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6935dd28/api/src/com/cloud/event/EventTypes.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/event/EventTypes.java b/api/src/com/cloud/event/EventTypes.java
index a762606..2825077 100755
--- a/api/src/com/cloud/event/EventTypes.java
+++ b/api/src/com/cloud/event/EventTypes.java
@@ -448,6 +448,9 @@ public class EventTypes {
public static final String EVENT_UCS_ASSOCIATED_PROFILE = "UCS.ASSOCIATEPROFILE";
+ // Object store migration
+ public static final String EVENT_MIGRATE_PREPARE_SECONDARY_STORAGE = "MIGRATE.PREPARE.SS";
+
static {
// TODO: need a way to force author adding event types to declare the entity details as well, with out braking
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6935dd28/api/src/com/cloud/storage/StorageService.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/storage/StorageService.java b/api/src/com/cloud/storage/StorageService.java
index 1ae1d3a..cbbc1f3 100644
--- a/api/src/com/cloud/storage/StorageService.java
+++ b/api/src/com/cloud/storage/StorageService.java
@@ -22,9 +22,9 @@ import org.apache.cloudstack.api.command.admin.storage.AddImageStoreCmd;
import org.apache.cloudstack.api.command.admin.storage.CancelPrimaryStorageMaintenanceCmd;
import org.apache.cloudstack.api.command.admin.storage.CreateSecondaryStagingStoreCmd;
import org.apache.cloudstack.api.command.admin.storage.CreateStoragePoolCmd;
-import org.apache.cloudstack.api.command.admin.storage.DeleteSecondaryStagingStoreCmd;
import org.apache.cloudstack.api.command.admin.storage.DeleteImageStoreCmd;
import org.apache.cloudstack.api.command.admin.storage.DeletePoolCmd;
+import org.apache.cloudstack.api.command.admin.storage.DeleteSecondaryStagingStoreCmd;
import org.apache.cloudstack.api.command.admin.storage.UpdateStoragePoolCmd;
import com.cloud.exception.DiscoveryException;
@@ -97,4 +97,18 @@ public interface StorageService{
ImageStore discoverImageStore(AddImageStoreCmd cmd) throws IllegalArgumentException, DiscoveryException, InvalidParameterValueException;
+ /**
+ * Prepare NFS secondary storage for object store migration
+ *
+ * @param cmd
+ * - the command specifying secondaryStorageId
+ * @return the storage pool
+ * @throws ResourceUnavailableException
+ * TODO
+ * @throws InsufficientCapacityException
+ * TODO
+ */
+ public ImageStore prepareSecondaryStorageForObjectStoreMigration(Long storeId) throws ResourceUnavailableException,
+ InsufficientCapacityException;
+
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6935dd28/api/src/org/apache/cloudstack/api/ApiCommandJobType.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/ApiCommandJobType.java b/api/src/org/apache/cloudstack/api/ApiCommandJobType.java
index 204fe3e..3067af8 100644
--- a/api/src/org/apache/cloudstack/api/ApiCommandJobType.java
+++ b/api/src/org/apache/cloudstack/api/ApiCommandJobType.java
@@ -28,6 +28,7 @@ public enum ApiCommandJobType {
SystemVm,
Host,
StoragePool,
+ ImageStore,
IpAddress,
PortableIpAddress,
SecurityGroup,
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6935dd28/api/src/org/apache/cloudstack/api/command/admin/storage/PrepareSecondaryStorageForMigrationCmd.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/command/admin/storage/PrepareSecondaryStorageForMigrationCmd.java b/api/src/org/apache/cloudstack/api/command/admin/storage/PrepareSecondaryStorageForMigrationCmd.java
new file mode 100644
index 0000000..d0c995a
--- /dev/null
+++ b/api/src/org/apache/cloudstack/api/command/admin/storage/PrepareSecondaryStorageForMigrationCmd.java
@@ -0,0 +1,109 @@
+// 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 org.apache.cloudstack.api.command.admin.storage;
+
+import org.apache.log4j.Logger;
+
+import org.apache.cloudstack.api.APICommand;
+import org.apache.cloudstack.api.ApiCommandJobType;
+import org.apache.cloudstack.api.ApiConstants;
+import org.apache.cloudstack.api.ApiErrorCode;
+import org.apache.cloudstack.api.BaseAsyncCmd;
+import org.apache.cloudstack.api.Parameter;
+import org.apache.cloudstack.api.ServerApiException;
+import org.apache.cloudstack.api.response.ImageStoreResponse;
+import org.apache.cloudstack.context.CallContext;
+
+import com.cloud.event.EventTypes;
+import com.cloud.exception.InsufficientCapacityException;
+import com.cloud.exception.ResourceUnavailableException;
+import com.cloud.storage.ImageStore;
+import com.cloud.user.Account;
+
+@APICommand(name = "prepareSecondaryStorageForMigration", description = "Prepare a NFS secondary storage to migrate to use object store like S3", responseObject = ImageStoreResponse.class)
+public class PrepareSecondaryStorageForMigrationCmd extends BaseAsyncCmd {
+ public static final Logger s_logger = Logger.getLogger(PrepareSecondaryStorageForMigrationCmd.class.getName());
+ private static final String s_name = "preparesecondarystorageformigrationresponse";
+
+ /////////////////////////////////////////////////////
+ //////////////// API parameters /////////////////////
+ /////////////////////////////////////////////////////
+
+ @Parameter(name = ApiConstants.ID, type = CommandType.UUID, entityType = ImageStoreResponse.class,
+ required = true, description = "Secondary image store ID")
+ private Long id;
+
+ /////////////////////////////////////////////////////
+ /////////////////// Accessors ///////////////////////
+ /////////////////////////////////////////////////////
+
+ public Long getId() {
+ return id;
+ }
+
+ /////////////////////////////////////////////////////
+ /////////////// API Implementation///////////////////
+ /////////////////////////////////////////////////////
+
+ @Override
+ public String getCommandName() {
+ return s_name;
+ }
+
+ @Override
+ public ApiCommandJobType getInstanceType() {
+ return ApiCommandJobType.ImageStore;
+ }
+
+ @Override
+ public Long getInstanceId() {
+ return getId();
+ }
+
+ @Override
+ public long getEntityOwnerId() {
+ Account account = CallContext.current().getCallingAccount();
+ if (account != null) {
+ return account.getId();
+ }
+
+ return Account.ACCOUNT_ID_SYSTEM; // no account info given, parent this command to SYSTEM so ERROR events are tracked
+ }
+
+ @Override
+ public String getEventType() {
+ return EventTypes.EVENT_MIGRATE_PREPARE_SECONDARY_STORAGE;
+ }
+
+ @Override
+ public String getEventDescription() {
+ return "preparing secondary storage: " + getId() + " for object store migration";
+ }
+
+ @Override
+ public void execute() throws ResourceUnavailableException, InsufficientCapacityException{
+ ImageStore result = _storageService.prepareSecondaryStorageForObjectStoreMigration(getId());
+ if (result != null){
+ ImageStoreResponse response = _responseGenerator.createImageStoreResponse(result);
+ response.setResponseName(getCommandName());
+ response.setResponseName("secondarystorage");
+ setResponseObject(response);
+ } else {
+ throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to prepare secondary storage for object store migration");
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6935dd28/client/tomcatconf/commands.properties.in
----------------------------------------------------------------------
diff --git a/client/tomcatconf/commands.properties.in b/client/tomcatconf/commands.properties.in
index 96e841a..f5a8a71 100644
--- a/client/tomcatconf/commands.properties.in
+++ b/client/tomcatconf/commands.properties.in
@@ -255,6 +255,7 @@ deleteImageStore=1
createSecondaryStagingStore=1
listSecondaryStagingStores=1
deleteSecondaryStagingStore=1
+prepareSecondaryStorageForMigration=1
#### host commands
addHost=3
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6935dd28/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/DataStoreLifeCycle.java
----------------------------------------------------------------------
diff --git a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/DataStoreLifeCycle.java b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/DataStoreLifeCycle.java
index 1e893db..c881570 100644
--- a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/DataStoreLifeCycle.java
+++ b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/DataStoreLifeCycle.java
@@ -37,4 +37,6 @@ public interface DataStoreLifeCycle {
boolean cancelMaintain(DataStore store);
boolean deleteDataStore(DataStore store);
+
+ boolean migrateToObjectStore(DataStore store);
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6935dd28/engine/schema/src/org/apache/cloudstack/storage/datastore/db/SnapshotDataStoreDao.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/SnapshotDataStoreDao.java b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/SnapshotDataStoreDao.java
index e350a76..df74c17 100644
--- a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/SnapshotDataStoreDao.java
+++ b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/SnapshotDataStoreDao.java
@@ -41,4 +41,6 @@ StateDao<ObjectInDataStoreStateMachine.State, ObjectInDataStoreStateMachine.Even
List<SnapshotDataStoreVO> listDestroyed(long storeId);
List<SnapshotDataStoreVO> findBySnapshotId(long snapshotId);
+
+ void duplicateCacheRecordsOnRegionStore(long storeId);
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6935dd28/engine/schema/src/org/apache/cloudstack/storage/datastore/db/SnapshotDataStoreVO.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/SnapshotDataStoreVO.java b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/SnapshotDataStoreVO.java
index 0fe5e08..98fb7b1 100644
--- a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/SnapshotDataStoreVO.java
+++ b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/SnapshotDataStoreVO.java
@@ -34,7 +34,6 @@ import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreState
import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine.State;
import com.cloud.storage.DataStoreRole;
-import com.cloud.utils.db.GenericDao;
import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.fsm.StateObject;
@@ -60,7 +59,7 @@ public class SnapshotDataStoreVO implements StateObject<ObjectInDataStoreStateMa
private long snapshotId;
@Column(name = GenericDaoBase.CREATED_COLUMN)
- private Date created = null;
+ private final Date created = null;
@Column(name = "last_updated")
@Temporal(value = TemporalType.TIMESTAMP)
@@ -98,6 +97,7 @@ public class SnapshotDataStoreVO implements StateObject<ObjectInDataStoreStateMa
@Column(name = "volume_id")
Long volumeId;
+ @Override
public String getInstallPath() {
return installPath;
}
@@ -108,7 +108,7 @@ public class SnapshotDataStoreVO implements StateObject<ObjectInDataStoreStateMa
}
public void setDataStoreId(long storeId) {
- this.dataStoreId = storeId;
+ dataStoreId = storeId;
}
public long getSnapshotId() {
@@ -135,15 +135,16 @@ public class SnapshotDataStoreVO implements StateObject<ObjectInDataStoreStateMa
lastUpdated = date;
}
+ @Override
public void setInstallPath(String installPath) {
this.installPath = installPath;
}
public SnapshotDataStoreVO(long hostId, long snapshotId) {
super();
- this.dataStoreId = hostId;
+ dataStoreId = hostId;
this.snapshotId = snapshotId;
- this.state = ObjectInDataStoreStateMachine.State.Allocated;
+ state = ObjectInDataStoreStateMachine.State.Allocated;
}
public SnapshotDataStoreVO() {
@@ -158,14 +159,16 @@ public class SnapshotDataStoreVO implements StateObject<ObjectInDataStoreStateMa
return jobId;
}
+ @Override
public boolean equals(Object obj) {
if (obj instanceof SnapshotDataStoreVO) {
SnapshotDataStoreVO other = (SnapshotDataStoreVO) obj;
- return (this.snapshotId == other.getSnapshotId() && this.dataStoreId == other.getDataStoreId());
+ return (snapshotId == other.getSnapshotId() && dataStoreId == other.getDataStoreId());
}
return false;
}
+ @Override
public int hashCode() {
Long tid = new Long(snapshotId);
Long hid = new Long(dataStoreId);
@@ -192,21 +195,22 @@ public class SnapshotDataStoreVO implements StateObject<ObjectInDataStoreStateMa
return -1;
}
+ @Override
public String toString() {
return new StringBuilder("SnapshotDataStore[").append(id).append("-").append(snapshotId).append("-")
.append(dataStoreId).append(installPath).append("]").toString();
}
public long getUpdatedCount() {
- return this.updatedCount;
+ return updatedCount;
}
public void incrUpdatedCount() {
- this.updatedCount++;
+ updatedCount++;
}
public void decrUpdatedCount() {
- this.updatedCount--;
+ updatedCount--;
}
public Date getUpdated() {
@@ -216,7 +220,7 @@ public class SnapshotDataStoreVO implements StateObject<ObjectInDataStoreStateMa
@Override
public ObjectInDataStoreStateMachine.State getState() {
// TODO Auto-generated method stub
- return this.state;
+ return state;
}
public void setState(ObjectInDataStoreStateMachine.State state) {
@@ -225,7 +229,7 @@ public class SnapshotDataStoreVO implements StateObject<ObjectInDataStoreStateMa
@Override
public long getObjectId() {
- return this.getSnapshotId();
+ return getSnapshotId();
}
public DataStoreRole getRole() {
@@ -238,7 +242,7 @@ public class SnapshotDataStoreVO implements StateObject<ObjectInDataStoreStateMa
@Override
public State getObjectInStoreState() {
- return this.state;
+ return state;
}
public long getParentSnapshotId() {
@@ -253,12 +257,16 @@ public class SnapshotDataStoreVO implements StateObject<ObjectInDataStoreStateMa
return refCnt;
}
+ public void setRefCnt(Long refCnt) {
+ this.refCnt = refCnt;
+ }
+
public void incrRefCnt() {
- this.refCnt++;
+ refCnt++;
}
public void decrRefCnt() {
- this.refCnt--;
+ refCnt--;
}
public Long getVolumeId() {
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6935dd28/engine/schema/src/org/apache/cloudstack/storage/datastore/db/TemplateDataStoreDao.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/TemplateDataStoreDao.java b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/TemplateDataStoreDao.java
index 9350751..ba569c1 100644
--- a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/TemplateDataStoreDao.java
+++ b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/TemplateDataStoreDao.java
@@ -18,9 +18,9 @@ package org.apache.cloudstack.storage.datastore.db;
import java.util.List;
-import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine.State;
import org.apache.cloudstack.engine.subsystem.api.storage.DataObjectInStore;
import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine;
+import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine.State;
import com.cloud.storage.DataStoreRole;
import com.cloud.storage.VMTemplateStorageResourceAssoc;
@@ -62,4 +62,6 @@ StateDao<ObjectInDataStoreStateMachine.State, ObjectInDataStoreStateMachine.Even
TemplateDataStoreVO findByTemplateZone(long templateId, Long zoneId, DataStoreRole role);
List<TemplateDataStoreVO> listByTemplate(long templateId);
+
+ void duplicateCacheRecordsOnRegionStore(long storeId);
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6935dd28/engine/schema/src/org/apache/cloudstack/storage/datastore/db/TemplateDataStoreVO.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/TemplateDataStoreVO.java b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/TemplateDataStoreVO.java
index a890e4b..7d0a967 100755
--- a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/TemplateDataStoreVO.java
+++ b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/TemplateDataStoreVO.java
@@ -35,7 +35,6 @@ import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreState
import com.cloud.storage.DataStoreRole;
import com.cloud.storage.VMTemplateStorageResourceAssoc.Status;
-
import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.fsm.StateObject;
@@ -61,7 +60,7 @@ public class TemplateDataStoreVO implements StateObject<ObjectInDataStoreStateMa
private DataStoreRole dataStoreRole;
@Column(name = GenericDaoBase.CREATED_COLUMN)
- private Date created = null;
+ private final Date created = null;
@Column(name = "last_updated")
@Temporal(value = TemporalType.TIMESTAMP)
@@ -117,17 +116,17 @@ public class TemplateDataStoreVO implements StateObject<ObjectInDataStoreStateMa
public TemplateDataStoreVO(Long hostId, long templateId) {
super();
- this.dataStoreId = hostId;
+ dataStoreId = hostId;
this.templateId = templateId;
- this.state = ObjectInDataStoreStateMachine.State.Allocated;
- this.refCnt = 0L;
+ state = ObjectInDataStoreStateMachine.State.Allocated;
+ refCnt = 0L;
}
public TemplateDataStoreVO(Long hostId, long templateId, Date lastUpdated, int downloadPercent,
Status downloadState, String localDownloadPath, String errorString, String jobId, String installPath,
String downloadUrl) {
super();
- this.dataStoreId = hostId;
+ dataStoreId = hostId;
this.templateId = templateId;
this.lastUpdated = lastUpdated;
this.downloadPercent = downloadPercent;
@@ -135,33 +134,33 @@ public class TemplateDataStoreVO implements StateObject<ObjectInDataStoreStateMa
this.localDownloadPath = localDownloadPath;
this.errorString = errorString;
this.jobId = jobId;
- this.refCnt = 0L;
+ refCnt = 0L;
this.installPath = installPath;
- this.setDownloadUrl(downloadUrl);
+ setDownloadUrl(downloadUrl);
switch (downloadState) {
case DOWNLOADED:
- this.state = ObjectInDataStoreStateMachine.State.Ready;
+ state = ObjectInDataStoreStateMachine.State.Ready;
break;
case CREATING:
case DOWNLOAD_IN_PROGRESS:
case UPLOAD_IN_PROGRESS:
- this.state = ObjectInDataStoreStateMachine.State.Creating2;
+ state = ObjectInDataStoreStateMachine.State.Creating2;
break;
case DOWNLOAD_ERROR:
case UPLOAD_ERROR:
- this.state = ObjectInDataStoreStateMachine.State.Failed;
+ state = ObjectInDataStoreStateMachine.State.Failed;
break;
case ABANDONED:
- this.state = ObjectInDataStoreStateMachine.State.Destroyed;
+ state = ObjectInDataStoreStateMachine.State.Destroyed;
break;
default:
- this.state = ObjectInDataStoreStateMachine.State.Allocated;
+ state = ObjectInDataStoreStateMachine.State.Allocated;
break;
}
}
public TemplateDataStoreVO() {
- this.refCnt = 0L;
+ refCnt = 0L;
}
@Override
@@ -175,7 +174,7 @@ public class TemplateDataStoreVO implements StateObject<ObjectInDataStoreStateMa
}
public void setDataStoreId(long storeId) {
- this.dataStoreId = storeId;
+ dataStoreId = storeId;
}
public long getTemplateId() {
@@ -224,7 +223,7 @@ public class TemplateDataStoreVO implements StateObject<ObjectInDataStoreStateMa
}
public void setLocalDownloadPath(String localPath) {
- this.localDownloadPath = localPath;
+ localDownloadPath = localPath;
}
public String getLocalDownloadPath() {
@@ -251,7 +250,7 @@ public class TemplateDataStoreVO implements StateObject<ObjectInDataStoreStateMa
public boolean equals(Object obj) {
if (obj instanceof TemplateDataStoreVO) {
TemplateDataStoreVO other = (TemplateDataStoreVO) obj;
- return (this.templateId == other.getTemplateId() && this.dataStoreId == other.getDataStoreId());
+ return (templateId == other.getTemplateId() && dataStoreId == other.getDataStoreId());
}
return false;
}
@@ -316,7 +315,7 @@ public class TemplateDataStoreVO implements StateObject<ObjectInDataStoreStateMa
@Override
public ObjectInDataStoreStateMachine.State getState() {
// TODO Auto-generated method stub
- return this.state;
+ return state;
}
public void setState(ObjectInDataStoreStateMachine.State state) {
@@ -324,15 +323,15 @@ public class TemplateDataStoreVO implements StateObject<ObjectInDataStoreStateMa
}
public long getUpdatedCount() {
- return this.updatedCount;
+ return updatedCount;
}
public void incrUpdatedCount() {
- this.updatedCount++;
+ updatedCount++;
}
public void decrUpdatedCount() {
- this.updatedCount--;
+ updatedCount--;
}
public Date getUpdated() {
@@ -341,12 +340,12 @@ public class TemplateDataStoreVO implements StateObject<ObjectInDataStoreStateMa
@Override
public long getObjectId() {
- return this.getTemplateId();
+ return getTemplateId();
}
@Override
public State getObjectInStoreState() {
- return this.state;
+ return state;
}
public DataStoreRole getDataStoreRole() {
@@ -361,12 +360,16 @@ public class TemplateDataStoreVO implements StateObject<ObjectInDataStoreStateMa
return refCnt;
}
+ public void setRefCnt(Long refCnt) {
+ this.refCnt = refCnt;
+ }
+
public void incrRefCnt() {
- this.refCnt++;
+ refCnt++;
}
public void decrRefCnt() {
- this.refCnt--;
+ refCnt--;
}
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6935dd28/engine/schema/src/org/apache/cloudstack/storage/datastore/db/VolumeDataStoreDao.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/VolumeDataStoreDao.java b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/VolumeDataStoreDao.java
index 698465f..00a6d2a 100644
--- a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/VolumeDataStoreDao.java
+++ b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/VolumeDataStoreDao.java
@@ -40,4 +40,6 @@ StateDao<ObjectInDataStoreStateMachine.State, ObjectInDataStoreStateMachine.Even
VolumeDataStoreVO findByStoreVolume(long storeId, long volumeId, boolean lock);
List<VolumeDataStoreVO> listDestroyed(long storeId);
+
+ void duplicateCacheRecordsOnRegionStore(long storeId);
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6935dd28/engine/schema/src/org/apache/cloudstack/storage/datastore/db/VolumeDataStoreVO.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/VolumeDataStoreVO.java b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/VolumeDataStoreVO.java
index e11071b..6f3ccae 100755
--- a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/VolumeDataStoreVO.java
+++ b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/VolumeDataStoreVO.java
@@ -33,8 +33,6 @@ import org.apache.cloudstack.engine.subsystem.api.storage.DataObjectInStore;
import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine;
import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine.State;
-import com.cloud.storage.Storage;
-import com.cloud.storage.Storage.ImageFormat;
import com.cloud.storage.VMTemplateStorageResourceAssoc.Status;
import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.fsm.StateObject;
@@ -60,7 +58,7 @@ public class VolumeDataStoreVO implements StateObject<ObjectInDataStoreStateMach
private long zoneId;
@Column(name = GenericDaoBase.CREATED_COLUMN)
- private Date created = null;
+ private final Date created = null;
@Column(name = "last_updated")
@Temporal(value = TemporalType.TIMESTAMP)
@@ -117,6 +115,7 @@ public class VolumeDataStoreVO implements StateObject<ObjectInDataStoreStateMach
@Column(name = "ref_cnt")
Long refCnt = 0L;
+ @Override
public String getInstallPath() {
return installPath;
}
@@ -127,7 +126,7 @@ public class VolumeDataStoreVO implements StateObject<ObjectInDataStoreStateMach
}
public void setDataStoreId(long storeId) {
- this.dataStoreId = storeId;
+ dataStoreId = storeId;
}
public long getVolumeId() {
@@ -174,6 +173,7 @@ public class VolumeDataStoreVO implements StateObject<ObjectInDataStoreStateMach
lastUpdated = date;
}
+ @Override
public void setInstallPath(String installPath) {
this.installPath = installPath;
}
@@ -192,17 +192,17 @@ public class VolumeDataStoreVO implements StateObject<ObjectInDataStoreStateMach
public VolumeDataStoreVO(long hostId, long volumeId) {
super();
- this.dataStoreId = hostId;
+ dataStoreId = hostId;
this.volumeId = volumeId;
- this.state = ObjectInDataStoreStateMachine.State.Allocated;
- this.refCnt = 0L;
+ state = ObjectInDataStoreStateMachine.State.Allocated;
+ refCnt = 0L;
}
public VolumeDataStoreVO(long hostId, long volumeId, Date lastUpdated, int downloadPercent, Status downloadState,
String localDownloadPath, String errorString, String jobId, String installPath, String downloadUrl,
String checksum) {
// super();
- this.dataStoreId = hostId;
+ dataStoreId = hostId;
this.volumeId = volumeId;
// this.zoneId = zoneId;
this.lastUpdated = lastUpdated;
@@ -212,17 +212,17 @@ public class VolumeDataStoreVO implements StateObject<ObjectInDataStoreStateMach
this.errorString = errorString;
this.jobId = jobId;
this.installPath = installPath;
- this.setDownloadUrl(downloadUrl);
+ setDownloadUrl(downloadUrl);
this.checksum = checksum;
- this.refCnt = 0L;
+ refCnt = 0L;
}
public VolumeDataStoreVO() {
- this.refCnt = 0L;
+ refCnt = 0L;
}
public void setLocalDownloadPath(String localPath) {
- this.localDownloadPath = localPath;
+ localDownloadPath = localPath;
}
public String getLocalDownloadPath() {
@@ -245,14 +245,16 @@ public class VolumeDataStoreVO implements StateObject<ObjectInDataStoreStateMach
return jobId;
}
+ @Override
public boolean equals(Object obj) {
if (obj instanceof VolumeDataStoreVO) {
VolumeDataStoreVO other = (VolumeDataStoreVO) obj;
- return (this.volumeId == other.getVolumeId() && this.dataStoreId == other.getDataStoreId());
+ return (volumeId == other.getVolumeId() && dataStoreId == other.getDataStoreId());
}
return false;
}
+ @Override
public int hashCode() {
Long tid = new Long(volumeId);
Long hid = new Long(dataStoreId);
@@ -295,21 +297,22 @@ public class VolumeDataStoreVO implements StateObject<ObjectInDataStoreStateMach
return -1;
}
+ @Override
public String toString() {
return new StringBuilder("VolumeDataStore[").append(id).append("-").append(volumeId).append("-").append(dataStoreId)
.append(installPath).append("]").toString();
}
public long getUpdatedCount() {
- return this.updatedCount;
+ return updatedCount;
}
public void incrUpdatedCount() {
- this.updatedCount++;
+ updatedCount++;
}
public void decrUpdatedCount() {
- this.updatedCount--;
+ updatedCount--;
}
public Date getUpdated() {
@@ -319,7 +322,7 @@ public class VolumeDataStoreVO implements StateObject<ObjectInDataStoreStateMach
@Override
public ObjectInDataStoreStateMachine.State getState() {
// TODO Auto-generated method stub
- return this.state;
+ return state;
}
public void setState(ObjectInDataStoreStateMachine.State state) {
@@ -328,24 +331,28 @@ public class VolumeDataStoreVO implements StateObject<ObjectInDataStoreStateMach
@Override
public long getObjectId() {
- return this.getVolumeId();
+ return getVolumeId();
}
@Override
public State getObjectInStoreState() {
- return this.state;
+ return state;
}
public Long getRefCnt() {
return refCnt;
}
+ public void setRefCnt(Long refCnt) {
+ this.refCnt = refCnt;
+ }
+
public void incrRefCnt() {
- this.refCnt++;
+ refCnt++;
}
public void decrRefCnt() {
- this.refCnt--;
+ refCnt--;
}
public String getExtractUrl() {
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6935dd28/engine/storage/src/org/apache/cloudstack/storage/image/datastore/ImageStoreHelper.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/datastore/ImageStoreHelper.java b/engine/storage/src/org/apache/cloudstack/storage/image/datastore/ImageStoreHelper.java
index a641146..4b202f5 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/image/datastore/ImageStoreHelper.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/image/datastore/ImageStoreHelper.java
@@ -24,11 +24,13 @@ import java.util.UUID;
import javax.inject.Inject;
+import org.springframework.stereotype.Component;
+
+import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
import org.apache.cloudstack.storage.datastore.db.ImageStoreDao;
import org.apache.cloudstack.storage.datastore.db.ImageStoreDetailVO;
import org.apache.cloudstack.storage.datastore.db.ImageStoreDetailsDao;
import org.apache.cloudstack.storage.datastore.db.ImageStoreVO;
-import org.springframework.stereotype.Component;
import com.cloud.storage.DataStoreRole;
import com.cloud.storage.ScopeType;
@@ -115,4 +117,16 @@ public class ImageStoreHelper {
imageStoreDao.remove(id);
return true;
}
+
+ /**
+ * Convert current NFS secondary storage to Staging store to be ready to migrate to S3 object store.
+ * @param store NFS image store.
+ * @return true if successful.
+ */
+ public boolean convertToStagingStore(DataStore store) {
+ ImageStoreVO nfsStore = imageStoreDao.findById(store.getId());
+ nfsStore.setRole(DataStoreRole.ImageCache);
+ imageStoreDao.update(store.getId(), nfsStore);
+ return true;
+ }
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6935dd28/engine/storage/src/org/apache/cloudstack/storage/image/db/SnapshotDataStoreDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/db/SnapshotDataStoreDaoImpl.java b/engine/storage/src/org/apache/cloudstack/storage/image/db/SnapshotDataStoreDaoImpl.java
index d828085..5a21ae2 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/image/db/SnapshotDataStoreDaoImpl.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/image/db/SnapshotDataStoreDaoImpl.java
@@ -25,23 +25,23 @@ import java.util.Map;
import javax.naming.ConfigurationException;
+import org.apache.log4j.Logger;
+import org.springframework.stereotype.Component;
-import com.cloud.utils.db.DB;
import org.apache.cloudstack.engine.subsystem.api.storage.DataObjectInStore;
import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine;
import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine.Event;
import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine.State;
import org.apache.cloudstack.storage.datastore.db.SnapshotDataStoreDao;
import org.apache.cloudstack.storage.datastore.db.SnapshotDataStoreVO;
-import org.apache.log4j.Logger;
-import org.springframework.stereotype.Component;
import com.cloud.storage.DataStoreRole;
+import com.cloud.utils.db.DB;
import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
import com.cloud.utils.db.SearchCriteria.Op;
+import com.cloud.utils.db.Transaction;
import com.cloud.utils.db.UpdateBuilder;
@Component
@@ -54,7 +54,7 @@ public class SnapshotDataStoreDaoImpl extends GenericDaoBase<SnapshotDataStoreVO
private SearchBuilder<SnapshotDataStoreVO> snapshotSearch;
private SearchBuilder<SnapshotDataStoreVO> storeSnapshotSearch;
private SearchBuilder<SnapshotDataStoreVO> snapshotIdSearch;
- private String parentSearch = "select store_id, store_role, snapshot_id from cloud.snapshot_store_ref where store_id = ? " +
+ private final String parentSearch = "select store_id, store_role, snapshot_id from cloud.snapshot_store_ref where store_id = ? " +
" and store_role = ? and volume_id = ? and state = 'Ready'" +
" order by created DESC " +
" limit 1";
@@ -195,7 +195,7 @@ public class SnapshotDataStoreDaoImpl extends GenericDaoBase<SnapshotDataStoreVO
long sid = rs.getLong(1);
String rl = rs.getString(2);
long snid = rs.getLong(3);
- return this.findByStoreSnapshot(role, sid, snid);
+ return findByStoreSnapshot(role, sid, snid);
}
} catch (SQLException e) {
s_logger.debug("Failed to find parent snapshot: " + e.toString());
@@ -236,4 +236,31 @@ public class SnapshotDataStoreDaoImpl extends GenericDaoBase<SnapshotDataStoreVO
sc.setParameters("ref_cnt", 0);
return listBy(sc);
}
+
+ @Override
+ public void duplicateCacheRecordsOnRegionStore(long storeId) {
+ // find all records on image cache
+ SearchCriteria<SnapshotDataStoreVO> sc = cacheSearch.create();
+ sc.setParameters("store_id", storeId);
+ sc.setParameters("destroyed", false);
+ List<SnapshotDataStoreVO> snapshots = listBy(sc);
+ // create an entry for each record, but with empty install path since the content is not yet on region-wide store yet
+ if (snapshots != null) {
+ for (SnapshotDataStoreVO snap : snapshots) {
+ SnapshotDataStoreVO ss = new SnapshotDataStoreVO();
+ ss.setSnapshotId(snap.getId());
+ ss.setDataStoreId(storeId);
+ ss.setRole(DataStoreRole.Image);
+ ss.setVolumeId(snap.getVolumeId());
+ ss.setParentSnapshotId(snap.getParentSnapshotId());
+ ss.setState(snap.getState());
+ ss.setSize(snap.getSize());
+ ss.setPhysicalSize(snap.getPhysicalSize());
+ ss.setRefCnt(snap.getRefCnt() + 1); // increase ref_cnt so that this will not be recycled before the content is pushed to region-wide store
+ persist(ss);
+ }
+ }
+
+ }
+
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6935dd28/engine/storage/src/org/apache/cloudstack/storage/image/db/TemplateDataStoreDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/db/TemplateDataStoreDaoImpl.java b/engine/storage/src/org/apache/cloudstack/storage/image/db/TemplateDataStoreDaoImpl.java
index 5f47de8..a102537 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/image/db/TemplateDataStoreDaoImpl.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/image/db/TemplateDataStoreDaoImpl.java
@@ -341,4 +341,35 @@ public class TemplateDataStoreDaoImpl extends GenericDaoBase<TemplateDataStoreVO
return null;
}
+ /**
+ * Duplicate all image cache store entries
+ */
+ @Override
+ public void duplicateCacheRecordsOnRegionStore(long storeId) {
+ // find all records on image cache
+ SearchCriteria<TemplateDataStoreVO> sc = cacheSearch.create();
+ sc.setParameters("store_id", storeId);
+ sc.setParameters("destroyed", false);
+ List<TemplateDataStoreVO> tmpls = listBy(sc);
+ // create an entry for each record, but with empty install path since the content is not yet on region-wide store yet
+ if (tmpls != null) {
+ for (TemplateDataStoreVO tmpl : tmpls) {
+ TemplateDataStoreVO ts = new TemplateDataStoreVO();
+ ts.setTemplateId(tmpl.getTemplateId());
+ ts.setDataStoreId(storeId);
+ ts.setDataStoreRole(DataStoreRole.Image);
+ ts.setState(tmpl.getState());
+ ts.setDownloadPercent(tmpl.getDownloadPercent());
+ ts.setDownloadState(tmpl.getDownloadState());
+ ts.setSize(tmpl.getSize());
+ ts.setPhysicalSize(tmpl.getPhysicalSize());
+ ts.setErrorString(tmpl.getErrorString());
+ ts.setDownloadUrl(tmpl.getDownloadUrl());
+ ts.setRefCnt(tmpl.getRefCnt() + 1); // increase ref_cnt so that this will not be recycled before the content is pushed to region-wide store
+ persist(ts);
+ }
+ }
+
+ }
+
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6935dd28/engine/storage/src/org/apache/cloudstack/storage/image/db/VolumeDataStoreDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/db/VolumeDataStoreDaoImpl.java b/engine/storage/src/org/apache/cloudstack/storage/image/db/VolumeDataStoreDaoImpl.java
index 04f8b70..e2adb3e 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/image/db/VolumeDataStoreDaoImpl.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/image/db/VolumeDataStoreDaoImpl.java
@@ -22,19 +22,20 @@ import java.util.Map;
import javax.naming.ConfigurationException;
+import org.apache.log4j.Logger;
+import org.springframework.stereotype.Component;
+
import org.apache.cloudstack.engine.subsystem.api.storage.DataObjectInStore;
import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine.Event;
import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine.State;
import org.apache.cloudstack.storage.datastore.db.VolumeDataStoreDao;
import org.apache.cloudstack.storage.datastore.db.VolumeDataStoreVO;
-import org.apache.log4j.Logger;
-import org.springframework.stereotype.Component;
import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
import com.cloud.utils.db.SearchCriteria.Op;
+import com.cloud.utils.db.Transaction;
import com.cloud.utils.db.UpdateBuilder;
@Component
@@ -186,4 +187,30 @@ public class VolumeDataStoreDaoImpl extends GenericDaoBase<VolumeDataStoreVO, Lo
sc.setParameters("destroyed", true);
return listIncludingRemovedBy(sc);
}
+
+ @Override
+ public void duplicateCacheRecordsOnRegionStore(long storeId) {
+ // find all records on image cache
+ SearchCriteria<VolumeDataStoreVO> sc = cacheSearch.create();
+ sc.setParameters("store_id", storeId);
+ sc.setParameters("destroyed", false);
+ List<VolumeDataStoreVO> vols = listBy(sc);
+ // create an entry for each record, but with empty install path since the content is not yet on region-wide store yet
+ if (vols != null) {
+ for (VolumeDataStoreVO vol : vols) {
+ VolumeDataStoreVO vs = new VolumeDataStoreVO();
+ vs.setVolumeId(vol.getId());
+ vs.setDataStoreId(storeId);
+ vs.setState(vol.getState());
+ vs.setDownloadPercent(vol.getDownloadPercent());
+ vs.setDownloadState(vol.getDownloadState());
+ vs.setSize(vol.getSize());
+ vs.setPhysicalSize(vol.getPhysicalSize());
+ vs.setErrorString(vol.getErrorString());
+ vs.setRefCnt(vol.getRefCnt() + 1); // increase ref_cnt so that this will not be recycled before the content is pushed to region-wide store
+ persist(vs);
+ }
+ }
+
+ }
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6935dd28/plugins/hypervisors/simulator/src/org/apache/cloudstack/storage/datastore/lifecycle/SimulatorImageStoreLifeCycleImpl.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/simulator/src/org/apache/cloudstack/storage/datastore/lifecycle/SimulatorImageStoreLifeCycleImpl.java b/plugins/hypervisors/simulator/src/org/apache/cloudstack/storage/datastore/lifecycle/SimulatorImageStoreLifeCycleImpl.java
index beaa7a5..0964414 100644
--- a/plugins/hypervisors/simulator/src/org/apache/cloudstack/storage/datastore/lifecycle/SimulatorImageStoreLifeCycleImpl.java
+++ b/plugins/hypervisors/simulator/src/org/apache/cloudstack/storage/datastore/lifecycle/SimulatorImageStoreLifeCycleImpl.java
@@ -20,12 +20,15 @@
package org.apache.cloudstack.storage.datastore.lifecycle;
-import com.cloud.agent.api.StoragePoolInfo;
-import com.cloud.exception.InvalidParameterValueException;
-import com.cloud.hypervisor.Hypervisor;
-import com.cloud.storage.DataStoreRole;
-import com.cloud.storage.ScopeType;
-import com.cloud.utils.UriUtils;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.inject.Inject;
+
+import org.apache.log4j.Logger;
+
import org.apache.cloudstack.engine.subsystem.api.storage.ClusterScope;
import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
import org.apache.cloudstack.engine.subsystem.api.storage.HostScope;
@@ -34,13 +37,13 @@ import org.apache.cloudstack.storage.datastore.db.ImageStoreVO;
import org.apache.cloudstack.storage.image.datastore.ImageStoreHelper;
import org.apache.cloudstack.storage.image.datastore.ImageStoreProviderManager;
import org.apache.cloudstack.storage.image.store.lifecycle.ImageStoreLifeCycle;
-import org.apache.log4j.Logger;
-import javax.inject.Inject;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.util.HashMap;
-import java.util.Map;
+import com.cloud.agent.api.StoragePoolInfo;
+import com.cloud.exception.InvalidParameterValueException;
+import com.cloud.hypervisor.Hypervisor;
+import com.cloud.storage.DataStoreRole;
+import com.cloud.storage.ScopeType;
+import com.cloud.utils.UriUtils;
public class SimulatorImageStoreLifeCycleImpl implements ImageStoreLifeCycle {
private static final Logger s_logger = Logger.getLogger(SimulatorImageStoreLifeCycleImpl.class);
@@ -129,4 +132,13 @@ public class SimulatorImageStoreLifeCycleImpl implements ImageStoreLifeCycle {
public boolean deleteDataStore(DataStore store) {
return false;
}
+
+ /* (non-Javadoc)
+ * @see org.apache.cloudstack.engine.subsystem.api.storage.DataStoreLifeCycle#migrateToObjectStore(org.apache.cloudstack.engine.subsystem.api.storage.DataStore)
+ */
+ @Override
+ public boolean migrateToObjectStore(DataStore store) {
+ return false;
+ }
+
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6935dd28/plugins/storage/image/default/src/org/apache/cloudstack/storage/datastore/lifecycle/CloudStackImageStoreLifeCycleImpl.java
----------------------------------------------------------------------
diff --git a/plugins/storage/image/default/src/org/apache/cloudstack/storage/datastore/lifecycle/CloudStackImageStoreLifeCycleImpl.java b/plugins/storage/image/default/src/org/apache/cloudstack/storage/datastore/lifecycle/CloudStackImageStoreLifeCycleImpl.java
index ee6f47b..d644878 100644
--- a/plugins/storage/image/default/src/org/apache/cloudstack/storage/datastore/lifecycle/CloudStackImageStoreLifeCycleImpl.java
+++ b/plugins/storage/image/default/src/org/apache/cloudstack/storage/datastore/lifecycle/CloudStackImageStoreLifeCycleImpl.java
@@ -161,4 +161,13 @@ public class CloudStackImageStoreLifeCycleImpl implements ImageStoreLifeCycle {
public boolean deleteDataStore(DataStore store) {
return false;
}
+
+ /* (non-Javadoc)
+ * @see org.apache.cloudstack.engine.subsystem.api.storage.DataStoreLifeCycle#migrateToObjectStore(org.apache.cloudstack.engine.subsystem.api.storage.DataStore)
+ */
+ @Override
+ public boolean migrateToObjectStore(DataStore store) {
+ return imageStoreHelper.convertToStagingStore(store);
+ }
+
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6935dd28/plugins/storage/image/s3/src/org/apache/cloudstack/storage/datastore/lifecycle/S3ImageStoreLifeCycleImpl.java
----------------------------------------------------------------------
diff --git a/plugins/storage/image/s3/src/org/apache/cloudstack/storage/datastore/lifecycle/S3ImageStoreLifeCycleImpl.java b/plugins/storage/image/s3/src/org/apache/cloudstack/storage/datastore/lifecycle/S3ImageStoreLifeCycleImpl.java
index 249a4c6..de25830 100644
--- a/plugins/storage/image/s3/src/org/apache/cloudstack/storage/datastore/lifecycle/S3ImageStoreLifeCycleImpl.java
+++ b/plugins/storage/image/s3/src/org/apache/cloudstack/storage/datastore/lifecycle/S3ImageStoreLifeCycleImpl.java
@@ -22,6 +22,8 @@ import java.util.Map;
import javax.inject.Inject;
+import org.apache.log4j.Logger;
+
import org.apache.cloudstack.api.ApiConstants;
import org.apache.cloudstack.engine.subsystem.api.storage.ClusterScope;
import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
@@ -32,7 +34,6 @@ import org.apache.cloudstack.storage.datastore.db.ImageStoreVO;
import org.apache.cloudstack.storage.image.datastore.ImageStoreHelper;
import org.apache.cloudstack.storage.image.datastore.ImageStoreProviderManager;
import org.apache.cloudstack.storage.image.store.lifecycle.ImageStoreLifeCycle;
-import org.apache.log4j.Logger;
import com.cloud.agent.api.StoragePoolInfo;
import com.cloud.hypervisor.Hypervisor.HypervisorType;
@@ -131,4 +132,13 @@ public class S3ImageStoreLifeCycleImpl implements ImageStoreLifeCycle {
public boolean deleteDataStore(DataStore store) {
return false;
}
+
+ /* (non-Javadoc)
+ * @see org.apache.cloudstack.engine.subsystem.api.storage.DataStoreLifeCycle#migrateToObjectStore(org.apache.cloudstack.engine.subsystem.api.storage.DataStore)
+ */
+ @Override
+ public boolean migrateToObjectStore(DataStore store) {
+ return false;
+ }
+
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6935dd28/plugins/storage/image/sample/src/org/apache/cloudstack/storage/datastore/lifecycle/SampleImageStoreLifeCycleImpl.java
----------------------------------------------------------------------
diff --git a/plugins/storage/image/sample/src/org/apache/cloudstack/storage/datastore/lifecycle/SampleImageStoreLifeCycleImpl.java b/plugins/storage/image/sample/src/org/apache/cloudstack/storage/datastore/lifecycle/SampleImageStoreLifeCycleImpl.java
index e4df6f5..b10b756 100644
--- a/plugins/storage/image/sample/src/org/apache/cloudstack/storage/datastore/lifecycle/SampleImageStoreLifeCycleImpl.java
+++ b/plugins/storage/image/sample/src/org/apache/cloudstack/storage/datastore/lifecycle/SampleImageStoreLifeCycleImpl.java
@@ -79,4 +79,13 @@ public class SampleImageStoreLifeCycleImpl implements ImageStoreLifeCycle {
public boolean deleteDataStore(DataStore store) {
return false;
}
+
+ /* (non-Javadoc)
+ * @see org.apache.cloudstack.engine.subsystem.api.storage.DataStoreLifeCycle#migrateToObjectStore(org.apache.cloudstack.engine.subsystem.api.storage.DataStore)
+ */
+ @Override
+ public boolean migrateToObjectStore(DataStore store) {
+ return false;
+ }
+
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6935dd28/plugins/storage/image/swift/src/org/apache/cloudstack/storage/datastore/lifecycle/SwiftImageStoreLifeCycleImpl.java
----------------------------------------------------------------------
diff --git a/plugins/storage/image/swift/src/org/apache/cloudstack/storage/datastore/lifecycle/SwiftImageStoreLifeCycleImpl.java b/plugins/storage/image/swift/src/org/apache/cloudstack/storage/datastore/lifecycle/SwiftImageStoreLifeCycleImpl.java
index 4256cc2..0a2b72c 100644
--- a/plugins/storage/image/swift/src/org/apache/cloudstack/storage/datastore/lifecycle/SwiftImageStoreLifeCycleImpl.java
+++ b/plugins/storage/image/swift/src/org/apache/cloudstack/storage/datastore/lifecycle/SwiftImageStoreLifeCycleImpl.java
@@ -16,11 +16,13 @@
// under the License.
package org.apache.cloudstack.storage.datastore.lifecycle;
-import com.cloud.agent.api.StoragePoolInfo;
-import com.cloud.hypervisor.Hypervisor.HypervisorType;
-import com.cloud.resource.ResourceManager;
-import com.cloud.storage.DataStoreRole;
-import com.cloud.storage.ScopeType;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.inject.Inject;
+
+import org.apache.log4j.Logger;
+
import org.apache.cloudstack.engine.subsystem.api.storage.ClusterScope;
import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
import org.apache.cloudstack.engine.subsystem.api.storage.HostScope;
@@ -30,11 +32,12 @@ import org.apache.cloudstack.storage.datastore.db.ImageStoreVO;
import org.apache.cloudstack.storage.image.datastore.ImageStoreHelper;
import org.apache.cloudstack.storage.image.datastore.ImageStoreProviderManager;
import org.apache.cloudstack.storage.image.store.lifecycle.ImageStoreLifeCycle;
-import org.apache.log4j.Logger;
-import javax.inject.Inject;
-import java.util.HashMap;
-import java.util.Map;
+import com.cloud.agent.api.StoragePoolInfo;
+import com.cloud.hypervisor.Hypervisor.HypervisorType;
+import com.cloud.resource.ResourceManager;
+import com.cloud.storage.DataStoreRole;
+import com.cloud.storage.ScopeType;
public class SwiftImageStoreLifeCycleImpl implements ImageStoreLifeCycle {
@@ -113,4 +116,13 @@ public class SwiftImageStoreLifeCycleImpl implements ImageStoreLifeCycle {
public boolean deleteDataStore(DataStore store) {
return false;
}
+
+ /* (non-Javadoc)
+ * @see org.apache.cloudstack.engine.subsystem.api.storage.DataStoreLifeCycle#migrateToObjectStore(org.apache.cloudstack.engine.subsystem.api.storage.DataStore)
+ */
+ @Override
+ public boolean migrateToObjectStore(DataStore store) {
+ return false;
+ }
+
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6935dd28/plugins/storage/volume/default/src/org/apache/cloudstack/storage/datastore/lifecycle/CloudStackPrimaryDataStoreLifeCycleImpl.java
----------------------------------------------------------------------
diff --git a/plugins/storage/volume/default/src/org/apache/cloudstack/storage/datastore/lifecycle/CloudStackPrimaryDataStoreLifeCycleImpl.java b/plugins/storage/volume/default/src/org/apache/cloudstack/storage/datastore/lifecycle/CloudStackPrimaryDataStoreLifeCycleImpl.java
index 5e0dd95..d916d45 100644
--- a/plugins/storage/volume/default/src/org/apache/cloudstack/storage/datastore/lifecycle/CloudStackPrimaryDataStoreLifeCycleImpl.java
+++ b/plugins/storage/volume/default/src/org/apache/cloudstack/storage/datastore/lifecycle/CloudStackPrimaryDataStoreLifeCycleImpl.java
@@ -433,7 +433,7 @@ public class CloudStackPrimaryDataStoreLifeCycleImpl implements PrimaryDataStore
List<HostVO> poolHosts = new ArrayList<HostVO>();
for (HostVO host : hosts) {
try {
- this.storageMgr.connectHostToSharedPool(host.getId(), dataStore.getId());
+ storageMgr.connectHostToSharedPool(host.getId(), dataStore.getId());
poolHosts.add(host);
} catch (Exception e) {
s_logger.warn("Unable to establish a connection between " + host + " and " + dataStore, e);
@@ -444,20 +444,20 @@ public class CloudStackPrimaryDataStoreLifeCycleImpl implements PrimaryDataStore
primaryDataStoreDao.expunge(dataStore.getId());
throw new CloudRuntimeException("Failed to create storage pool as it is not accessible to hosts.");
}
- this.dataStoreHelper.attachZone(dataStore, hypervisorType);
+ dataStoreHelper.attachZone(dataStore, hypervisorType);
return true;
}
@Override
public boolean maintain(DataStore dataStore) {
storagePoolAutmation.maintain(dataStore);
- this.dataStoreHelper.maintain(dataStore);
+ dataStoreHelper.maintain(dataStore);
return true;
}
@Override
public boolean cancelMaintain(DataStore store) {
- this.dataStoreHelper.cancelMaintain(store);
+ dataStoreHelper.cancelMaintain(store);
storagePoolAutmation.cancelMaintain(store);
return true;
}
@@ -513,4 +513,13 @@ public class CloudStackPrimaryDataStoreLifeCycleImpl implements PrimaryDataStore
dataStoreHelper.attachHost(store, scope, existingInfo);
return true;
}
+
+ /* (non-Javadoc)
+ * @see org.apache.cloudstack.engine.subsystem.api.storage.DataStoreLifeCycle#migrateToObjectStore(org.apache.cloudstack.engine.subsystem.api.storage.DataStore)
+ */
+ @Override
+ public boolean migrateToObjectStore(DataStore store) {
+ return false;
+ }
+
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6935dd28/plugins/storage/volume/sample/src/org/apache/cloudstack/storage/datastore/lifecycle/SamplePrimaryDataStoreLifeCycleImpl.java
----------------------------------------------------------------------
diff --git a/plugins/storage/volume/sample/src/org/apache/cloudstack/storage/datastore/lifecycle/SamplePrimaryDataStoreLifeCycleImpl.java b/plugins/storage/volume/sample/src/org/apache/cloudstack/storage/datastore/lifecycle/SamplePrimaryDataStoreLifeCycleImpl.java
index 92538ad..6b5e431 100644
--- a/plugins/storage/volume/sample/src/org/apache/cloudstack/storage/datastore/lifecycle/SamplePrimaryDataStoreLifeCycleImpl.java
+++ b/plugins/storage/volume/sample/src/org/apache/cloudstack/storage/datastore/lifecycle/SamplePrimaryDataStoreLifeCycleImpl.java
@@ -18,12 +18,18 @@
*/
package org.apache.cloudstack.storage.datastore.lifecycle;
-import com.cloud.agent.api.StoragePoolInfo;
-import com.cloud.host.HostVO;
-import com.cloud.host.dao.HostDao;
-import com.cloud.hypervisor.Hypervisor.HypervisorType;
-import com.cloud.storage.StoragePoolStatus;
-import org.apache.cloudstack.engine.subsystem.api.storage.*;
+import java.util.List;
+import java.util.Map;
+
+import javax.inject.Inject;
+
+import org.apache.cloudstack.engine.subsystem.api.storage.ClusterScope;
+import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
+import org.apache.cloudstack.engine.subsystem.api.storage.EndPoint;
+import org.apache.cloudstack.engine.subsystem.api.storage.EndPointSelector;
+import org.apache.cloudstack.engine.subsystem.api.storage.HostScope;
+import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreLifeCycle;
+import org.apache.cloudstack.engine.subsystem.api.storage.ZoneScope;
import org.apache.cloudstack.storage.command.AttachPrimaryDataStoreCmd;
import org.apache.cloudstack.storage.command.CreatePrimaryDataStoreCmd;
import org.apache.cloudstack.storage.datastore.PrimaryDataStoreProviderManager;
@@ -31,9 +37,11 @@ import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
import org.apache.cloudstack.storage.volume.datastore.PrimaryDataStoreHelper;
-import javax.inject.Inject;
-import java.util.List;
-import java.util.Map;
+import com.cloud.agent.api.StoragePoolInfo;
+import com.cloud.host.HostVO;
+import com.cloud.host.dao.HostDao;
+import com.cloud.hypervisor.Hypervisor.HypervisorType;
+import com.cloud.storage.StoragePoolStatus;
public class SamplePrimaryDataStoreLifeCycleImpl implements PrimaryDataStoreLifeCycle {
@Inject
@@ -119,4 +127,12 @@ public class SamplePrimaryDataStoreLifeCycleImpl implements PrimaryDataStoreLife
return false;
}
+ /* (non-Javadoc)
+ * @see org.apache.cloudstack.engine.subsystem.api.storage.DataStoreLifeCycle#migrateToObjectStore(org.apache.cloudstack.engine.subsystem.api.storage.DataStore)
+ */
+ @Override
+ public boolean migrateToObjectStore(DataStore store) {
+ return false;
+ }
+
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6935dd28/plugins/storage/volume/solidfire/src/org/apache/cloudstack/storage/datastore/lifecycle/SolidFirePrimaryDataStoreLifeCycle.java
----------------------------------------------------------------------
diff --git a/plugins/storage/volume/solidfire/src/org/apache/cloudstack/storage/datastore/lifecycle/SolidFirePrimaryDataStoreLifeCycle.java b/plugins/storage/volume/solidfire/src/org/apache/cloudstack/storage/datastore/lifecycle/SolidFirePrimaryDataStoreLifeCycle.java
index f1ac3b3..a16ebad 100644
--- a/plugins/storage/volume/solidfire/src/org/apache/cloudstack/storage/datastore/lifecycle/SolidFirePrimaryDataStoreLifeCycle.java
+++ b/plugins/storage/volume/solidfire/src/org/apache/cloudstack/storage/datastore/lifecycle/SolidFirePrimaryDataStoreLifeCycle.java
@@ -26,20 +26,20 @@ import javax.inject.Inject;
import org.apache.cloudstack.engine.subsystem.api.storage.ClusterScope;
import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
import org.apache.cloudstack.engine.subsystem.api.storage.HostScope;
-import org.apache.cloudstack.engine.subsystem.api.storage.ZoneScope;
import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreLifeCycle;
import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreParameters;
+import org.apache.cloudstack.engine.subsystem.api.storage.ZoneScope;
import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
import org.apache.cloudstack.storage.datastore.db.StoragePoolDetailsDao;
import org.apache.cloudstack.storage.datastore.util.SolidFireUtil;
import org.apache.cloudstack.storage.volume.datastore.PrimaryDataStoreHelper;
+import com.cloud.agent.api.StoragePoolInfo;
import com.cloud.dc.DataCenterVO;
import com.cloud.dc.dao.DataCenterDao;
import com.cloud.hypervisor.Hypervisor.HypervisorType;
-import com.cloud.agent.api.StoragePoolInfo;
-import com.cloud.storage.StoragePoolAutomation;
import com.cloud.storage.Storage.StoragePoolType;
+import com.cloud.storage.StoragePoolAutomation;
import com.cloud.utils.exception.CloudRuntimeException;
public class SolidFirePrimaryDataStoreLifeCycle implements PrimaryDataStoreLifeCycle {
@@ -330,4 +330,13 @@ public class SolidFirePrimaryDataStoreLifeCycle implements PrimaryDataStoreLifeC
public boolean deleteDataStore(DataStore store) {
return dataStoreHelper.deletePrimaryDataStore(store);
}
+
+ /* (non-Javadoc)
+ * @see org.apache.cloudstack.engine.subsystem.api.storage.DataStoreLifeCycle#migrateToObjectStore(org.apache.cloudstack.engine.subsystem.api.storage.DataStore)
+ */
+ @Override
+ public boolean migrateToObjectStore(DataStore store) {
+ return false;
+ }
+
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6935dd28/server/src/com/cloud/server/ManagementServerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/server/ManagementServerImpl.java b/server/src/com/cloud/server/ManagementServerImpl.java
index 699f469..e3d4137 100755
--- a/server/src/com/cloud/server/ManagementServerImpl.java
+++ b/server/src/com/cloud/server/ManagementServerImpl.java
@@ -42,6 +42,9 @@ import javax.crypto.spec.SecretKeySpec;
import javax.inject.Inject;
import javax.naming.ConfigurationException;
+import org.apache.commons.codec.binary.Base64;
+import org.apache.log4j.Logger;
+
import org.apache.cloudstack.acl.ControlledEntity;
import org.apache.cloudstack.acl.SecurityChecker.AccessType;
import org.apache.cloudstack.affinity.AffinityGroupProcessor;
@@ -156,6 +159,7 @@ import org.apache.cloudstack.api.command.admin.storage.ListSecondaryStagingStore
import org.apache.cloudstack.api.command.admin.storage.ListStoragePoolsCmd;
import org.apache.cloudstack.api.command.admin.storage.ListStorageProvidersCmd;
import org.apache.cloudstack.api.command.admin.storage.PreparePrimaryStorageForMaintenanceCmd;
+import org.apache.cloudstack.api.command.admin.storage.PrepareSecondaryStorageForMigrationCmd;
import org.apache.cloudstack.api.command.admin.storage.UpdateStoragePoolCmd;
import org.apache.cloudstack.api.command.admin.swift.AddSwiftCmd;
import org.apache.cloudstack.api.command.admin.swift.ListSwiftsCmd;
@@ -436,8 +440,6 @@ import org.apache.cloudstack.storage.datastore.db.ImageStoreVO;
import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
import org.apache.cloudstack.utils.identity.ManagementServerNode;
-import org.apache.commons.codec.binary.Base64;
-import org.apache.log4j.Logger;
import com.cloud.agent.AgentManager;
import com.cloud.agent.api.GetVncPortAnswer;
@@ -2830,6 +2832,7 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe
cmdList.add(CreateSecondaryStagingStoreCmd.class);
cmdList.add(ListSecondaryStagingStoresCmd.class);
cmdList.add(DeleteSecondaryStagingStoreCmd.class);
+ cmdList.add(PrepareSecondaryStorageForMigrationCmd.class);
cmdList.add(CreateApplicationLoadBalancerCmd.class);
cmdList.add(ListApplicationLoadBalancersCmd.class);
cmdList.add(DeleteApplicationLoadBalancerCmd.class);
@@ -3878,6 +3881,6 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe
@Inject
public void setStoragePoolAllocators(List<StoragePoolAllocator> storagePoolAllocators) {
- this._storagePoolAllocators = storagePoolAllocators;
+ _storagePoolAllocators = storagePoolAllocators;
}
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6935dd28/server/src/com/cloud/storage/StorageManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/storage/StorageManagerImpl.java b/server/src/com/cloud/storage/StorageManagerImpl.java
index c046057..eaefcb2 100755
--- a/server/src/com/cloud/storage/StorageManagerImpl.java
+++ b/server/src/com/cloud/storage/StorageManagerImpl.java
@@ -43,6 +43,7 @@ import javax.naming.ConfigurationException;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Component;
+
import org.apache.cloudstack.api.command.admin.storage.AddImageStoreCmd;
import org.apache.cloudstack.api.command.admin.storage.CancelPrimaryStorageMaintenanceCmd;
import org.apache.cloudstack.api.command.admin.storage.CreateSecondaryStagingStoreCmd;
@@ -1243,6 +1244,26 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C
return (PrimaryDataStoreInfo) dataStoreMgr.getDataStore(primaryStorage.getId(), DataStoreRole.Primary);
}
+ @Override
+ @DB
+ public ImageStore prepareSecondaryStorageForObjectStoreMigration(Long storeId) throws ResourceUnavailableException, InsufficientCapacityException {
+ // Verify that image store exists
+ ImageStoreVO store = _imageStoreDao.findById(storeId);
+ if (store == null) {
+ throw new InvalidParameterValueException("Image store with id " + storeId + " doesn't exist");
+ } else if (!store.getProviderName().equals(DataStoreProvider.NFS_IMAGE)) {
+ throw new InvalidParameterValueException("We only support migrate NFS secondary storage to use object store!");
+ }
+ _accountMgr.checkAccessAndSpecifyAuthority(CallContext.current().getCallingAccount(), store.getDataCenterId());
+
+ DataStoreProvider provider = dataStoreProviderMgr.getDataStoreProvider(store.getProviderName());
+ DataStoreLifeCycle lifeCycle = provider.getDataStoreLifeCycle();
+ DataStore secStore = dataStoreMgr.getDataStore(storeId, DataStoreRole.Image);
+ lifeCycle.migrateToObjectStore(secStore);
+ // converted to an image cache store
+ return (ImageStore)_dataStoreMgr.getDataStore(storeId, DataStoreRole.ImageCache);
+ }
+
protected class StorageGarbageCollector extends ManagedContextRunnable {
public StorageGarbageCollector() {
@@ -1718,9 +1739,20 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C
// store
associateCrosszoneTemplatesToZone(dcId);
+ // duplicate cache store records to region wide storage
+ if (scopeType == ScopeType.REGION) {
+ duplicateCacheStoreRecordsToRegionStore(store.getId());
+ }
+
return (ImageStore) _dataStoreMgr.getDataStore(store.getId(), DataStoreRole.Image);
}
+ private void duplicateCacheStoreRecordsToRegionStore(long storeId) {
+ _templateStoreDao.duplicateCacheRecordsOnRegionStore(storeId);
+ _snapshotStoreDao.duplicateCacheRecordsOnRegionStore(storeId);
+ _volumeStoreDao.duplicateCacheRecordsOnRegionStore(storeId);
+ }
+
private void associateCrosszoneTemplatesToZone(Long zoneId) {
VMTemplateZoneVO tmpltZone;
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6935dd28/tools/apidoc/gen_toc.py
----------------------------------------------------------------------
diff --git a/tools/apidoc/gen_toc.py b/tools/apidoc/gen_toc.py
index 9c53a48..aa73b2a 100644
--- a/tools/apidoc/gen_toc.py
+++ b/tools/apidoc/gen_toc.py
@@ -148,6 +148,7 @@ known_categories = {
'createSecondaryStagingStore': 'Image Store',
'deleteSecondaryStagingStore': 'Image Store',
'listSecondaryStagingStores': 'Image Store',
+ 'prepareSecondaryStorageForMigration' : 'Image Store',
'InternalLoadBalancer': 'Internal LB',
'DeploymentPlanners': 'Configuration',
'PortableIp': 'Portable IP',
[4/8] git commit: updated refs/heads/object_store_migration to 9da56fe
Posted by mc...@apache.org.
Delete cache entries of template, snapshot, and volume when
deleteTemplate, deleteSnapshot, deleteVolume are invoked.
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/730832d8
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/730832d8
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/730832d8
Branch: refs/heads/object_store_migration
Commit: 730832d8fa5e75d7a30f990046ab3a004abda0fa
Parents: 184e539
Author: Min Chen <mi...@citrix.com>
Authored: Wed Oct 23 14:05:05 2013 -0700
Committer: Min Chen <mi...@citrix.com>
Committed: Wed Oct 23 14:05:05 2013 -0700
----------------------------------------------------------------------
.../subsystem/api/storage/DataStoreManager.java | 3 ++
.../api/storage/SnapshotDataFactory.java | 4 +++
.../api/storage/TemplateDataFactory.java | 4 +++
.../api/storage/VolumeDataFactory.java | 4 +++
.../storage/datastore/db/ImageStoreDao.java | 2 ++
.../datastore/db/SnapshotDataStoreDao.java | 2 ++
.../datastore/db/TemplateDataStoreDao.java | 2 ++
.../storage/image/TemplateDataFactoryImpl.java | 16 ++++++++++
.../manager/ImageStoreProviderManagerImpl.java | 15 +++++++--
.../snapshot/SnapshotDataFactoryImpl.java | 22 +++++++++++--
.../snapshot/XenserverSnapshotStrategy.java | 31 ++++++++++++------
.../storage/datastore/DataStoreManagerImpl.java | 5 +++
.../datastore/ImageStoreProviderManager.java | 2 ++
.../storage/image/db/ImageStoreDaoImpl.java | 10 +++++-
.../image/db/SnapshotDataStoreDaoImpl.java | 8 +++++
.../image/db/TemplateDataStoreDaoImpl.java | 8 +++++
.../image/db/VolumeDataStoreDaoImpl.java | 1 +
.../storage/volume/VolumeDataFactoryImpl.java | 33 +++++++++++++++++---
.../com/cloud/storage/VolumeApiServiceImpl.java | 12 +++++--
.../template/HypervisorTemplateAdapter.java | 29 ++++++++++-------
.../com/cloud/template/TemplateManagerImpl.java | 1 +
21 files changed, 181 insertions(+), 33 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/730832d8/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/DataStoreManager.java
----------------------------------------------------------------------
diff --git a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/DataStoreManager.java b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/DataStoreManager.java
index 0884453..7fbec0a 100644
--- a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/DataStoreManager.java
+++ b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/DataStoreManager.java
@@ -19,6 +19,7 @@
package org.apache.cloudstack.engine.subsystem.api.storage;
import java.util.List;
+
import com.cloud.storage.DataStoreRole;
public interface DataStoreManager {
@@ -37,4 +38,6 @@ public interface DataStoreManager {
DataStore getImageCacheStore(long zoneId);
List<DataStore> listImageStores();
+
+ List<DataStore> listImageCacheStores();
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/730832d8/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/SnapshotDataFactory.java
----------------------------------------------------------------------
diff --git a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/SnapshotDataFactory.java b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/SnapshotDataFactory.java
index 0b8d1f1..d5255f4 100644
--- a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/SnapshotDataFactory.java
+++ b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/SnapshotDataFactory.java
@@ -18,6 +18,8 @@
*/
package org.apache.cloudstack.engine.subsystem.api.storage;
+import java.util.List;
+
import com.cloud.storage.DataStoreRole;
public interface SnapshotDataFactory {
@@ -26,4 +28,6 @@ public interface SnapshotDataFactory {
SnapshotInfo getSnapshot(DataObject obj, DataStore store);
SnapshotInfo getSnapshot(long snapshotId, DataStoreRole role);
+
+ List<SnapshotInfo> listSnapshotOnCache(long snapshotId);
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/730832d8/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/TemplateDataFactory.java
----------------------------------------------------------------------
diff --git a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/TemplateDataFactory.java b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/TemplateDataFactory.java
index 980ed31..801c442 100644
--- a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/TemplateDataFactory.java
+++ b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/TemplateDataFactory.java
@@ -18,6 +18,8 @@
*/
package org.apache.cloudstack.engine.subsystem.api.storage;
+import java.util.List;
+
import com.cloud.storage.DataStoreRole;
public interface TemplateDataFactory {
@@ -30,4 +32,6 @@ public interface TemplateDataFactory {
TemplateInfo getTemplate(long templateId, DataStoreRole storeRole, Long zoneId);
TemplateInfo getReadyTemplateOnCache(long templateId);
+
+ List<TemplateInfo> listTemplateOnCache(long templateId);
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/730832d8/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/VolumeDataFactory.java
----------------------------------------------------------------------
diff --git a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/VolumeDataFactory.java b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/VolumeDataFactory.java
index 99e3b59..3de0b5b 100644
--- a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/VolumeDataFactory.java
+++ b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/VolumeDataFactory.java
@@ -18,6 +18,8 @@
*/
package org.apache.cloudstack.engine.subsystem.api.storage;
+import java.util.List;
+
import com.cloud.storage.DataStoreRole;
public interface VolumeDataFactory {
@@ -28,4 +30,6 @@ public interface VolumeDataFactory {
VolumeInfo getVolume(long volumeId, DataStoreRole storeRole);
VolumeInfo getVolume(long volumeId);
+
+ List<VolumeInfo> listVolumeOnCache(long volumeId);
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/730832d8/engine/schema/src/org/apache/cloudstack/storage/datastore/db/ImageStoreDao.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/ImageStoreDao.java b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/ImageStoreDao.java
index f95e66c..d0f8fe8 100644
--- a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/ImageStoreDao.java
+++ b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/ImageStoreDao.java
@@ -36,4 +36,6 @@ public interface ImageStoreDao extends GenericDao<ImageStoreVO, Long> {
List<ImageStoreVO> findImageCacheByScope(ZoneScope scope);
List<ImageStoreVO> listImageStores();
+
+ List<ImageStoreVO> listImageCacheStores();
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/730832d8/engine/schema/src/org/apache/cloudstack/storage/datastore/db/SnapshotDataStoreDao.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/SnapshotDataStoreDao.java b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/SnapshotDataStoreDao.java
index df74c17..19eac38 100644
--- a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/SnapshotDataStoreDao.java
+++ b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/SnapshotDataStoreDao.java
@@ -43,4 +43,6 @@ StateDao<ObjectInDataStoreStateMachine.State, ObjectInDataStoreStateMachine.Even
List<SnapshotDataStoreVO> findBySnapshotId(long snapshotId);
void duplicateCacheRecordsOnRegionStore(long storeId);
+
+ List<SnapshotDataStoreVO> listOnCache(long snapshotId);
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/730832d8/engine/schema/src/org/apache/cloudstack/storage/datastore/db/TemplateDataStoreDao.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/TemplateDataStoreDao.java b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/TemplateDataStoreDao.java
index fc61be5..95cbdb6 100644
--- a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/TemplateDataStoreDao.java
+++ b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/TemplateDataStoreDao.java
@@ -66,4 +66,6 @@ StateDao<ObjectInDataStoreStateMachine.State, ObjectInDataStoreStateMachine.Even
void duplicateCacheRecordsOnRegionStore(long storeId);
TemplateDataStoreVO findReadyOnCache(long templateId);
+
+ List<TemplateDataStoreVO> listOnCache(long templateId);
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/730832d8/engine/storage/image/src/org/apache/cloudstack/storage/image/TemplateDataFactoryImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/image/src/org/apache/cloudstack/storage/image/TemplateDataFactoryImpl.java b/engine/storage/image/src/org/apache/cloudstack/storage/image/TemplateDataFactoryImpl.java
index fe1c62c..6369311 100644
--- a/engine/storage/image/src/org/apache/cloudstack/storage/image/TemplateDataFactoryImpl.java
+++ b/engine/storage/image/src/org/apache/cloudstack/storage/image/TemplateDataFactoryImpl.java
@@ -18,6 +18,9 @@
*/
package org.apache.cloudstack.storage.image;
+import java.util.ArrayList;
+import java.util.List;
+
import javax.inject.Inject;
import org.apache.log4j.Logger;
@@ -127,4 +130,17 @@ public class TemplateDataFactoryImpl implements TemplateDataFactory {
}
+ @Override
+ public List<TemplateInfo> listTemplateOnCache(long templateId) {
+ List<TemplateDataStoreVO> cacheTmpls = templateStoreDao.listOnCache(templateId);
+ List<TemplateInfo> tmplObjs = new ArrayList<TemplateInfo>();
+ for (TemplateDataStoreVO cacheTmpl : cacheTmpls) {
+ long storeId = cacheTmpl.getDataStoreId();
+ DataStore store = storeMgr.getDataStore(storeId, DataStoreRole.ImageCache);
+ TemplateInfo tmplObj = getTemplate(templateId, store);
+ tmplObjs.add(tmplObj);
+ }
+ return tmplObjs;
+ }
+
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/730832d8/engine/storage/image/src/org/apache/cloudstack/storage/image/manager/ImageStoreProviderManagerImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/image/src/org/apache/cloudstack/storage/image/manager/ImageStoreProviderManagerImpl.java b/engine/storage/image/src/org/apache/cloudstack/storage/image/manager/ImageStoreProviderManagerImpl.java
index 64ef78f..0991860 100644
--- a/engine/storage/image/src/org/apache/cloudstack/storage/image/manager/ImageStoreProviderManagerImpl.java
+++ b/engine/storage/image/src/org/apache/cloudstack/storage/image/manager/ImageStoreProviderManagerImpl.java
@@ -26,6 +26,9 @@ import java.util.Map;
import javax.annotation.PostConstruct;
import javax.inject.Inject;
+import org.apache.log4j.Logger;
+import org.springframework.stereotype.Component;
+
import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreProviderManager;
import org.apache.cloudstack.engine.subsystem.api.storage.ImageStoreProvider;
@@ -37,8 +40,6 @@ import org.apache.cloudstack.storage.image.ImageStoreDriver;
import org.apache.cloudstack.storage.image.datastore.ImageStoreEntity;
import org.apache.cloudstack.storage.image.datastore.ImageStoreProviderManager;
import org.apache.cloudstack.storage.image.store.ImageStoreImpl;
-import org.apache.log4j.Logger;
-import org.springframework.stereotype.Component;
import com.cloud.storage.ScopeType;
import com.cloud.storage.dao.VMTemplateDao;
@@ -95,6 +96,16 @@ public class ImageStoreProviderManagerImpl implements ImageStoreProviderManager
}
@Override
+ public List<DataStore> listImageCacheStores() {
+ List<ImageStoreVO> stores = dataStoreDao.listImageCacheStores();
+ List<DataStore> imageStores = new ArrayList<DataStore>();
+ for (ImageStoreVO store : stores) {
+ imageStores.add(getImageStore(store.getId()));
+ }
+ return imageStores;
+ }
+
+ @Override
public List<DataStore> listImageStoresByScope(ZoneScope scope) {
List<ImageStoreVO> stores = dataStoreDao.findByScope(scope);
List<DataStore> imageStores = new ArrayList<DataStore>();
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/730832d8/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/SnapshotDataFactoryImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/SnapshotDataFactoryImpl.java b/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/SnapshotDataFactoryImpl.java
index aafdad0..6205fe4 100644
--- a/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/SnapshotDataFactoryImpl.java
+++ b/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/SnapshotDataFactoryImpl.java
@@ -18,8 +18,13 @@
*/
package org.apache.cloudstack.storage.snapshot;
+import java.util.ArrayList;
+import java.util.List;
+
import javax.inject.Inject;
+import org.springframework.stereotype.Component;
+
import org.apache.cloudstack.engine.subsystem.api.storage.DataObject;
import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
@@ -28,7 +33,6 @@ import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotInfo;
import org.apache.cloudstack.engine.subsystem.api.storage.VolumeDataFactory;
import org.apache.cloudstack.storage.datastore.db.SnapshotDataStoreDao;
import org.apache.cloudstack.storage.datastore.db.SnapshotDataStoreVO;
-import org.springframework.stereotype.Component;
import com.cloud.storage.DataStoreRole;
import com.cloud.storage.SnapshotVO;
@@ -70,8 +74,22 @@ public class SnapshotDataFactoryImpl implements SnapshotDataFactory {
if (snapshotStore == null) {
return null;
}
- DataStore store = this.storeMgr.getDataStore(snapshotStore.getDataStoreId(), role);
+ DataStore store = storeMgr.getDataStore(snapshotStore.getDataStoreId(), role);
SnapshotObject so = SnapshotObject.getSnapshotObject(snapshot, store);
return so;
}
+
+ @Override
+ public List<SnapshotInfo> listSnapshotOnCache(long snapshotId) {
+ List<SnapshotDataStoreVO> cacheSnapshots = snapshotStoreDao.listOnCache(snapshotId);
+ List<SnapshotInfo> snapObjs = new ArrayList<SnapshotInfo>();
+ for (SnapshotDataStoreVO cacheSnap : cacheSnapshots) {
+ long storeId = cacheSnap.getDataStoreId();
+ DataStore store = storeMgr.getDataStore(storeId, DataStoreRole.ImageCache);
+ SnapshotInfo tmplObj = getSnapshot(snapshotId, store);
+ snapObjs.add(tmplObj);
+ }
+ return snapObjs;
+ }
+
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/730832d8/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/XenserverSnapshotStrategy.java
----------------------------------------------------------------------
diff --git a/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/XenserverSnapshotStrategy.java b/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/XenserverSnapshotStrategy.java
index 6a874d6..cf67aeb 100644
--- a/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/XenserverSnapshotStrategy.java
+++ b/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/XenserverSnapshotStrategy.java
@@ -16,8 +16,13 @@
// under the License.
package org.apache.cloudstack.storage.snapshot;
+import java.util.List;
+
import javax.inject.Inject;
+import org.apache.log4j.Logger;
+import org.springframework.stereotype.Component;
+
import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine.Event;
@@ -33,8 +38,6 @@ import org.apache.cloudstack.storage.command.CreateObjectAnswer;
import org.apache.cloudstack.storage.datastore.db.SnapshotDataStoreDao;
import org.apache.cloudstack.storage.datastore.db.SnapshotDataStoreVO;
import org.apache.cloudstack.storage.to.SnapshotObjectTO;
-import org.apache.log4j.Logger;
-import org.springframework.stereotype.Component;
import com.cloud.exception.InvalidParameterValueException;
import com.cloud.storage.DataStoreRole;
@@ -74,7 +77,7 @@ public class XenserverSnapshotStrategy extends SnapshotStrategyBase {
if (parentSnapshot != null && snapshot.getPath().equalsIgnoreCase(parentSnapshot.getPath())) {
s_logger.debug("backup an empty snapshot");
// don't need to backup this snapshot
- SnapshotDataStoreVO parentSnapshotOnBackupStore = this.snapshotStoreDao.findBySnapshot(
+ SnapshotDataStoreVO parentSnapshotOnBackupStore = snapshotStoreDao.findBySnapshot(
parentSnapshot.getId(), DataStoreRole.Image);
if (parentSnapshotOnBackupStore != null && parentSnapshotOnBackupStore.getState() == State.Ready) {
DataStore store = dataStoreMgr.getDataStore(parentSnapshotOnBackupStore.getDataStoreId(),
@@ -96,7 +99,7 @@ public class XenserverSnapshotStrategy extends SnapshotStrategyBase {
s_logger.debug("Failed to change state: " + snapshot.getId() + ": " + e.toString());
throw new CloudRuntimeException(e.toString());
}
- return this.snapshotDataFactory.getSnapshot(snapObj.getId(), store);
+ return snapshotDataFactory.getSnapshot(snapObj.getId(), store);
} else {
s_logger.debug("parent snapshot hasn't been backed up yet");
}
@@ -114,7 +117,7 @@ public class XenserverSnapshotStrategy extends SnapshotStrategyBase {
int i;
SnapshotDataStoreVO parentSnapshotOnBackupStore = null;
for (i = 1; i < deltaSnap; i++) {
- parentSnapshotOnBackupStore = this.snapshotStoreDao.findBySnapshot(parentSnapshot.getId(),
+ parentSnapshotOnBackupStore = snapshotStoreDao.findBySnapshot(parentSnapshot.getId(),
DataStoreRole.Image);
if (parentSnapshotOnBackupStore == null) {
break;
@@ -125,7 +128,7 @@ public class XenserverSnapshotStrategy extends SnapshotStrategyBase {
break;
}
- parentSnapshotOnBackupStore = this.snapshotStoreDao.findBySnapshot(prevBackupId, DataStoreRole.Image);
+ parentSnapshotOnBackupStore = snapshotStoreDao.findBySnapshot(prevBackupId, DataStoreRole.Image);
}
if (i >= deltaSnap) {
fullBackup = true;
@@ -133,7 +136,7 @@ public class XenserverSnapshotStrategy extends SnapshotStrategyBase {
}
snapshot.addPayload(fullBackup);
- return this.snapshotSvr.backupSnapshot(snapshot);
+ return snapshotSvr.backupSnapshot(snapshot);
}
protected boolean deleteSnapshotChain(SnapshotInfo snapshot) {
@@ -167,7 +170,15 @@ public class XenserverSnapshotStrategy extends SnapshotStrategyBase {
}
}
if (!deleted) {
- boolean r = this.snapshotSvr.deleteSnapshot(snapshot);
+ boolean r = snapshotSvr.deleteSnapshot(snapshot);
+ if (r) {
+ // delete snapshot in cache if there is
+ List<SnapshotInfo> cacheSnaps = snapshotDataFactory.listSnapshotOnCache(snapshot.getId());
+ for (SnapshotInfo cacheSnap : cacheSnaps) {
+ s_logger.debug("Delete snapshot " + snapshot.getId() + " from image cache store: " + cacheSnap.getDataStore().getName());
+ cacheSnap.delete();
+ }
+ }
if (!resultIsSet) {
result = r;
resultIsSet = true;
@@ -203,7 +214,7 @@ public class XenserverSnapshotStrategy extends SnapshotStrategyBase {
// first mark the snapshot as destroyed, so that ui can't see it, but we
// may not destroy the snapshot on the storage, as other snapshots may
// depend on it.
- SnapshotInfo snapshotOnImage = this.snapshotDataFactory.getSnapshot(snapshotId, DataStoreRole.Image);
+ SnapshotInfo snapshotOnImage = snapshotDataFactory.getSnapshot(snapshotId, DataStoreRole.Image);
if (snapshotOnImage == null) {
s_logger.debug("Can't find snapshot on backup storage, delete it in db");
snapshotDao.remove(snapshotId);
@@ -276,7 +287,7 @@ public class XenserverSnapshotStrategy extends SnapshotStrategyBase {
snapshot = result.getSnashot();
DataStore primaryStore = snapshot.getDataStore();
- SnapshotInfo backupedSnapshot = this.backupSnapshot(snapshot);
+ SnapshotInfo backupedSnapshot = backupSnapshot(snapshot);
try {
SnapshotInfo parent = snapshot.getParent();
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/730832d8/engine/storage/src/org/apache/cloudstack/storage/datastore/DataStoreManagerImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/datastore/DataStoreManagerImpl.java b/engine/storage/src/org/apache/cloudstack/storage/datastore/DataStoreManagerImpl.java
index a9263a9..88061aa 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/datastore/DataStoreManagerImpl.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/datastore/DataStoreManagerImpl.java
@@ -107,6 +107,11 @@ public class DataStoreManagerImpl implements DataStoreManager {
return imageDataStoreMgr.listImageStores();
}
+ @Override
+ public List<DataStore> listImageCacheStores() {
+ return imageDataStoreMgr.listImageCacheStores();
+ }
+
public void setPrimaryStoreMgr(PrimaryDataStoreProviderManager primaryStoreMgr) {
this.primaryStoreMgr = primaryStoreMgr;
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/730832d8/engine/storage/src/org/apache/cloudstack/storage/image/datastore/ImageStoreProviderManager.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/datastore/ImageStoreProviderManager.java b/engine/storage/src/org/apache/cloudstack/storage/image/datastore/ImageStoreProviderManager.java
index be66cc5..8afb3d9 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/image/datastore/ImageStoreProviderManager.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/image/datastore/ImageStoreProviderManager.java
@@ -32,6 +32,8 @@ public interface ImageStoreProviderManager {
List<DataStore> listImageStores();
+ List<DataStore> listImageCacheStores();
+
List<DataStore> listImageStoresByScope(ZoneScope scope);
List<DataStore> listImageStoreByProvider(String provider);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/730832d8/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageStoreDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageStoreDaoImpl.java b/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageStoreDaoImpl.java
index b9ef9c3..13a7f47 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageStoreDaoImpl.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageStoreDaoImpl.java
@@ -23,10 +23,11 @@ import java.util.Map;
import javax.naming.ConfigurationException;
+import org.springframework.stereotype.Component;
+
import org.apache.cloudstack.engine.subsystem.api.storage.ZoneScope;
import org.apache.cloudstack.storage.datastore.db.ImageStoreDao;
import org.apache.cloudstack.storage.datastore.db.ImageStoreVO;
-import org.springframework.stereotype.Component;
import com.cloud.storage.DataStoreRole;
import com.cloud.storage.ScopeType;
@@ -118,4 +119,11 @@ public class ImageStoreDaoImpl extends GenericDaoBase<ImageStoreVO, Long> implem
return listBy(sc);
}
+ @Override
+ public List<ImageStoreVO> listImageCacheStores() {
+ SearchCriteria<ImageStoreVO> sc = createSearchCriteria();
+ sc.addAnd("role", SearchCriteria.Op.EQ, DataStoreRole.ImageCache);
+ return listBy(sc);
+ }
+
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/730832d8/engine/storage/src/org/apache/cloudstack/storage/image/db/SnapshotDataStoreDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/db/SnapshotDataStoreDaoImpl.java b/engine/storage/src/org/apache/cloudstack/storage/image/db/SnapshotDataStoreDaoImpl.java
index 5a21ae2..96a0c17 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/image/db/SnapshotDataStoreDaoImpl.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/image/db/SnapshotDataStoreDaoImpl.java
@@ -263,4 +263,12 @@ public class SnapshotDataStoreDaoImpl extends GenericDaoBase<SnapshotDataStoreVO
}
+ @Override
+ public List<SnapshotDataStoreVO> listOnCache(long snapshotId) {
+ SearchCriteria<SnapshotDataStoreVO> sc = storeSnapshotSearch.create();
+ sc.setParameters("snapshot_id", snapshotId);
+ sc.setParameters("store_role", DataStoreRole.ImageCache);
+ return search(sc, null);
+ }
+
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/730832d8/engine/storage/src/org/apache/cloudstack/storage/image/db/TemplateDataStoreDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/db/TemplateDataStoreDaoImpl.java b/engine/storage/src/org/apache/cloudstack/storage/image/db/TemplateDataStoreDaoImpl.java
index 25f3486..5c1ec33 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/image/db/TemplateDataStoreDaoImpl.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/image/db/TemplateDataStoreDaoImpl.java
@@ -335,6 +335,14 @@ public class TemplateDataStoreDaoImpl extends GenericDaoBase<TemplateDataStoreVO
}
@Override
+ public List<TemplateDataStoreVO> listOnCache(long templateId) {
+ SearchCriteria<TemplateDataStoreVO> sc = templateRoleSearch.create();
+ sc.setParameters("template_id", templateId);
+ sc.setParameters("store_role", DataStoreRole.ImageCache);
+ return search(sc, null);
+ }
+
+ @Override
public List<TemplateDataStoreVO> listByTemplate(long templateId) {
SearchCriteria<TemplateDataStoreVO> sc = templateSearch.create();
sc.setParameters("template_id", templateId);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/730832d8/engine/storage/src/org/apache/cloudstack/storage/image/db/VolumeDataStoreDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/db/VolumeDataStoreDaoImpl.java b/engine/storage/src/org/apache/cloudstack/storage/image/db/VolumeDataStoreDaoImpl.java
index e2adb3e..4118079 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/image/db/VolumeDataStoreDaoImpl.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/image/db/VolumeDataStoreDaoImpl.java
@@ -43,6 +43,7 @@ public class VolumeDataStoreDaoImpl extends GenericDaoBase<VolumeDataStoreVO, Lo
private static final Logger s_logger = Logger.getLogger(VolumeDataStoreDaoImpl.class);
private SearchBuilder<VolumeDataStoreVO> updateStateSearch;
private SearchBuilder<VolumeDataStoreVO> volumeSearch;
+ private SearchBuilder<VolumeDataStoreVO> volumeRoleSearch;
private SearchBuilder<VolumeDataStoreVO> storeSearch;
private SearchBuilder<VolumeDataStoreVO> cacheSearch;
private SearchBuilder<VolumeDataStoreVO> storeVolumeSearch;
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/730832d8/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeDataFactoryImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeDataFactoryImpl.java b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeDataFactoryImpl.java
index 1d75ba1..8065f9c 100644
--- a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeDataFactoryImpl.java
+++ b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeDataFactoryImpl.java
@@ -18,8 +18,13 @@
*/
package org.apache.cloudstack.storage.volume;
+import java.util.ArrayList;
+import java.util.List;
+
import javax.inject.Inject;
+import org.springframework.stereotype.Component;
+
import org.apache.cloudstack.engine.subsystem.api.storage.DataObject;
import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
@@ -27,7 +32,6 @@ import org.apache.cloudstack.engine.subsystem.api.storage.VolumeDataFactory;
import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo;
import org.apache.cloudstack.storage.datastore.db.VolumeDataStoreDao;
import org.apache.cloudstack.storage.datastore.db.VolumeDataStoreVO;
-import org.springframework.stereotype.Component;
import com.cloud.storage.DataStoreRole;
import com.cloud.storage.VolumeVO;
@@ -58,13 +62,13 @@ public class VolumeDataFactoryImpl implements VolumeDataFactory {
if (storeRole == DataStoreRole.Image) {
VolumeDataStoreVO volumeStore = volumeStoreDao.findByVolume(volumeId);
if (volumeStore != null) {
- DataStore store = this.storeMgr.getDataStore(volumeStore.getDataStoreId(), DataStoreRole.Image);
+ DataStore store = storeMgr.getDataStore(volumeStore.getDataStoreId(), DataStoreRole.Image);
vol = VolumeObject.getVolumeObject(store, volumeVO);
}
} else {
// Primary data store
if (volumeVO.getPoolId() != null) {
- DataStore store = this.storeMgr.getDataStore(volumeVO.getPoolId(), DataStoreRole.Primary);
+ DataStore store = storeMgr.getDataStore(volumeVO.getPoolId(), DataStoreRole.Primary);
vol = VolumeObject.getVolumeObject(store, volumeVO);
}
}
@@ -82,11 +86,11 @@ public class VolumeDataFactoryImpl implements VolumeDataFactory {
DataStore store = null;
VolumeDataStoreVO volumeStore = volumeStoreDao.findByVolume(volumeId);
if (volumeStore != null) {
- store = this.storeMgr.getDataStore(volumeStore.getDataStoreId(), DataStoreRole.Image);
+ store = storeMgr.getDataStore(volumeStore.getDataStoreId(), DataStoreRole.Image);
}
vol = VolumeObject.getVolumeObject(store, volumeVO);
} else {
- DataStore store = this.storeMgr.getDataStore(volumeVO.getPoolId(), DataStoreRole.Primary);
+ DataStore store = storeMgr.getDataStore(volumeVO.getPoolId(), DataStoreRole.Primary);
vol = VolumeObject.getVolumeObject(store, volumeVO);
}
return vol;
@@ -99,4 +103,23 @@ public class VolumeDataFactoryImpl implements VolumeDataFactory {
return vol;
}
+ @Override
+ public List<VolumeInfo> listVolumeOnCache(long volumeId) {
+ List<VolumeInfo> cacheVols = new ArrayList<VolumeInfo>();
+ // find all image cache stores for this zone scope
+ List<DataStore> cacheStores = storeMgr.listImageCacheStores();
+ if (cacheStores == null || cacheStores.size() == 0) {
+ return cacheVols;
+ }
+ for (DataStore store : cacheStores) {
+ // check if the volume is stored there
+ VolumeDataStoreVO volStore = volumeStoreDao.findByStoreVolume(store.getId(), volumeId);
+ if (volStore != null) {
+ VolumeInfo vol = getVolume(volumeId, store);
+ cacheVols.add(vol);
+ }
+ }
+ return cacheVols;
+ }
+
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/730832d8/server/src/com/cloud/storage/VolumeApiServiceImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/storage/VolumeApiServiceImpl.java b/server/src/com/cloud/storage/VolumeApiServiceImpl.java
index 00df333..12f0102 100644
--- a/server/src/com/cloud/storage/VolumeApiServiceImpl.java
+++ b/server/src/com/cloud/storage/VolumeApiServiceImpl.java
@@ -25,6 +25,8 @@ import java.util.concurrent.ExecutionException;
import javax.inject.Inject;
+import org.apache.log4j.Logger;
+
import org.apache.cloudstack.api.BaseCmd;
import org.apache.cloudstack.api.command.user.volume.AttachVolumeCmd;
import org.apache.cloudstack.api.command.user.volume.CreateVolumeCmd;
@@ -64,7 +66,6 @@ import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreDao;
import org.apache.cloudstack.storage.datastore.db.VolumeDataStoreDao;
import org.apache.cloudstack.storage.datastore.db.VolumeDataStoreVO;
import org.apache.cloudstack.storage.image.datastore.ImageStoreEntity;
-import org.apache.log4j.Logger;
import com.cloud.agent.AgentManager;
import com.cloud.agent.api.Answer;
@@ -945,6 +946,13 @@ public class VolumeApiServiceImpl extends ManagerBase implements VolumeApiServic
AsyncCallFuture<VolumeApiResult> future2 = volService.expungeVolumeAsync(volOnSecondary);
future2.get();
}
+ // delete all cache entries for this volume
+ List<VolumeInfo> cacheVols = volFactory.listVolumeOnCache(volume.getId());
+ for (VolumeInfo volOnCache : cacheVols) {
+ s_logger.info("Delete volume from image cache store: " + volOnCache.getDataStore().getName());
+ volOnCache.delete();
+ }
+
} catch (Exception e) {
s_logger.warn("Failed to expunge volume:", e);
return false;
@@ -1725,7 +1733,7 @@ public class VolumeApiServiceImpl extends ManagerBase implements VolumeApiServic
@Inject
public void setStoragePoolAllocators(List<StoragePoolAllocator> storagePoolAllocators) {
- this._storagePoolAllocators = storagePoolAllocators;
+ _storagePoolAllocators = storagePoolAllocators;
}
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/730832d8/server/src/com/cloud/template/HypervisorTemplateAdapter.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/template/HypervisorTemplateAdapter.java b/server/src/com/cloud/template/HypervisorTemplateAdapter.java
index 00e6222..b33a192 100755
--- a/server/src/com/cloud/template/HypervisorTemplateAdapter.java
+++ b/server/src/com/cloud/template/HypervisorTemplateAdapter.java
@@ -25,6 +25,8 @@ import java.util.concurrent.ExecutionException;
import javax.ejb.Local;
import javax.inject.Inject;
+import org.apache.log4j.Logger;
+
import org.apache.cloudstack.api.command.user.iso.DeleteIsoCmd;
import org.apache.cloudstack.api.command.user.iso.RegisterIsoCmd;
import org.apache.cloudstack.api.command.user.template.DeleteTemplateCmd;
@@ -44,7 +46,6 @@ import org.apache.cloudstack.framework.async.AsyncCompletionCallback;
import org.apache.cloudstack.framework.async.AsyncRpcContext;
import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreVO;
import org.apache.cloudstack.storage.image.datastore.ImageStoreEntity;
-import org.apache.log4j.Logger;
import com.cloud.agent.AgentManager;
import com.cloud.alert.AlertManager;
@@ -56,11 +57,11 @@ import com.cloud.event.UsageEventUtils;
import com.cloud.exception.InvalidParameterValueException;
import com.cloud.exception.ResourceAllocationException;
import com.cloud.org.Grouping;
+import com.cloud.storage.ScopeType;
import com.cloud.storage.Storage.ImageFormat;
import com.cloud.storage.Storage.TemplateType;
import com.cloud.storage.TemplateProfile;
import com.cloud.storage.VMTemplateStorageResourceAssoc.Status;
-import com.cloud.storage.ScopeType;
import com.cloud.storage.VMTemplateVO;
import com.cloud.storage.VMTemplateZoneVO;
import com.cloud.storage.dao.VMTemplateZoneDao;
@@ -182,7 +183,7 @@ public class HypervisorTemplateAdapter extends TemplateAdapterBase {
}
// find all eligible image stores for this zone scope
- List<DataStore> imageStores = this.storeMgr.getImageStoresByScope(new ZoneScope(profile.getZoneId()));
+ List<DataStore> imageStores = storeMgr.getImageStoresByScope(new ZoneScope(profile.getZoneId()));
if ( imageStores == null || imageStores.size() == 0 ){
throw new CloudRuntimeException("Unable to find image store to download template "+ profile.getTemplate());
}
@@ -205,12 +206,12 @@ public class HypervisorTemplateAdapter extends TemplateAdapterBase {
}
}
- TemplateInfo tmpl = this.imageFactory.getTemplate(template.getId(), imageStore);
+ TemplateInfo tmpl = imageFactory.getTemplate(template.getId(), imageStore);
CreateTemplateContext<TemplateApiResult> context = new CreateTemplateContext<TemplateApiResult>(null, tmpl);
AsyncCallbackDispatcher<HypervisorTemplateAdapter, TemplateApiResult> caller = AsyncCallbackDispatcher.create(this);
caller.setCallback(caller.getTarget().createTemplateAsyncCallBack(null, null));
caller.setContext(context);
- this.imageService.createTemplateAsync(tmpl, imageStore, caller);
+ imageService.createTemplateAsync(tmpl, imageStore, caller);
if( !(profile.getIsPublic() || profile.getFeatured()) ){ // If private template then break
break;
}
@@ -237,7 +238,7 @@ public class HypervisorTemplateAdapter extends TemplateAdapterBase {
// populated template entry
_tmpltDao.remove(template.getId());
} else {
- VMTemplateVO tmplt = this._tmpltDao.findById(template.getId());
+ VMTemplateVO tmplt = _tmpltDao.findById(template.getId());
long accountId = tmplt.getAccountId();
if (template.getSize() != null) {
// publish usage event
@@ -283,7 +284,7 @@ public class HypervisorTemplateAdapter extends TemplateAdapterBase {
VMTemplateVO template = profile.getTemplate();
// find all eligible image stores for this template
- List<DataStore> imageStores = this.templateMgr.getImageStoreByTemplate(template.getId(), profile.getZoneId());
+ List<DataStore> imageStores = templateMgr.getImageStoreByTemplate(template.getId(), profile.getZoneId());
if (imageStores == null || imageStores.size() == 0) {
// already destroyed on image stores
s_logger.info("Unable to find image store still having template: " + template.getName()
@@ -321,7 +322,7 @@ public class HypervisorTemplateAdapter extends TemplateAdapterBase {
}
s_logger.info("Delete template from image store: " + imageStore.getName());
- AsyncCallFuture<TemplateApiResult> future = this.imageService.deleteTemplateAsync(this.imageFactory
+ AsyncCallFuture<TemplateApiResult> future = imageService.deleteTemplateAsync(imageFactory
.getTemplate(template.getId(), imageStore));
try {
TemplateApiResult result = future.get();
@@ -350,9 +351,15 @@ public class HypervisorTemplateAdapter extends TemplateAdapterBase {
}
}
if (success) {
+ // delete all cache entries for this template
+ List<TemplateInfo> cacheTmpls = imageFactory.listTemplateOnCache(template.getId());
+ for (TemplateInfo tmplOnCache : cacheTmpls) {
+ s_logger.info("Delete template from image cache store: " + tmplOnCache.getDataStore().getName());
+ tmplOnCache.delete();
+ }
// find all eligible image stores for this template
- List<DataStore> iStores = this.templateMgr.getImageStoreByTemplate(template.getId(), null);
+ List<DataStore> iStores = templateMgr.getImageStoreByTemplate(template.getId(), null);
if (iStores == null || iStores.size() == 0) {
// remove template from vm_templates table
if (_tmpltDao.remove(template.getId())) {
@@ -380,7 +387,7 @@ public class HypervisorTemplateAdapter extends TemplateAdapterBase {
throw new InvalidParameterValueException("The DomR template cannot be deleted.");
}
- if (zoneId != null && (this.storeMgr.getImageStore(zoneId) == null)) {
+ if (zoneId != null && (storeMgr.getImageStore(zoneId) == null)) {
throw new InvalidParameterValueException("Failed to find a secondary storage in the specified zone.");
}
@@ -392,7 +399,7 @@ public class HypervisorTemplateAdapter extends TemplateAdapterBase {
TemplateProfile profile = super.prepareDelete(cmd);
Long zoneId = profile.getZoneId();
- if (zoneId != null && (this.storeMgr.getImageStore(zoneId) == null)) {
+ if (zoneId != null && (storeMgr.getImageStore(zoneId) == null)) {
throw new InvalidParameterValueException("Failed to find a secondary storage in the specified zone.");
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/730832d8/server/src/com/cloud/template/TemplateManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/template/TemplateManagerImpl.java b/server/src/com/cloud/template/TemplateManagerImpl.java
index 452e079..3b2ec58 100755
--- a/server/src/com/cloud/template/TemplateManagerImpl.java
+++ b/server/src/com/cloud/template/TemplateManagerImpl.java
@@ -1707,6 +1707,7 @@ public class TemplateManagerImpl extends ManagerBase implements TemplateManager,
return stores;
}
+
@Override
public VMTemplateVO updateTemplate(UpdateIsoCmd cmd) {
return updateTemplateOrIso(cmd);
[3/8] git commit: updated refs/heads/object_store_migration to 9da56fe
Posted by mc...@apache.org.
Trigger syncing templates to S3 in case of copyTemplate and
extractTemplate.
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/184e5394
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/184e5394
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/184e5394
Branch: refs/heads/object_store_migration
Commit: 184e53940ae247a744c4a6c5222c20d331af7d2e
Parents: 1b07c33
Author: Min Chen <mi...@citrix.com>
Authored: Mon Oct 21 17:23:58 2013 -0700
Committer: Min Chen <mi...@citrix.com>
Committed: Mon Oct 21 17:23:58 2013 -0700
----------------------------------------------------------------------
.../api/storage/TemplateDataFactory.java | 2 +
.../subsystem/api/storage/TemplateService.java | 2 +
.../datastore/db/TemplateDataStoreDao.java | 2 +
.../storage/image/TemplateDataFactoryImpl.java | 22 +++++--
.../storage/image/TemplateServiceImpl.java | 68 ++++++++++++++++++++
.../image/db/TemplateDataStoreDaoImpl.java | 12 ++++
.../com/cloud/template/TemplateManagerImpl.java | 20 ++++--
7 files changed, 117 insertions(+), 11 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/184e5394/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/TemplateDataFactory.java
----------------------------------------------------------------------
diff --git a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/TemplateDataFactory.java b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/TemplateDataFactory.java
index 0b78da0..980ed31 100644
--- a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/TemplateDataFactory.java
+++ b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/TemplateDataFactory.java
@@ -28,4 +28,6 @@ public interface TemplateDataFactory {
TemplateInfo getTemplate(long templateId, DataStoreRole storeRole);
TemplateInfo getTemplate(long templateId, DataStoreRole storeRole, Long zoneId);
+
+ TemplateInfo getReadyTemplateOnCache(long templateId);
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/184e5394/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/TemplateService.java
----------------------------------------------------------------------
diff --git a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/TemplateService.java b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/TemplateService.java
index 0d8b3c1..185d254 100644
--- a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/TemplateService.java
+++ b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/TemplateService.java
@@ -54,6 +54,8 @@ public interface TemplateService {
AsyncCallFuture<TemplateApiResult> prepareTemplateOnPrimary(TemplateInfo srcTemplate, StoragePool pool);
+ void syncTemplateToRegionStore(long templateId, DataStore store);
+
void handleSysTemplateDownload(HypervisorType hostHyper, Long dcId);
void handleTemplateSync(DataStore store);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/184e5394/engine/schema/src/org/apache/cloudstack/storage/datastore/db/TemplateDataStoreDao.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/TemplateDataStoreDao.java b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/TemplateDataStoreDao.java
index ba569c1..fc61be5 100644
--- a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/TemplateDataStoreDao.java
+++ b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/TemplateDataStoreDao.java
@@ -64,4 +64,6 @@ StateDao<ObjectInDataStoreStateMachine.State, ObjectInDataStoreStateMachine.Even
List<TemplateDataStoreVO> listByTemplate(long templateId);
void duplicateCacheRecordsOnRegionStore(long storeId);
+
+ TemplateDataStoreVO findReadyOnCache(long templateId);
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/184e5394/engine/storage/image/src/org/apache/cloudstack/storage/image/TemplateDataFactoryImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/image/src/org/apache/cloudstack/storage/image/TemplateDataFactoryImpl.java b/engine/storage/image/src/org/apache/cloudstack/storage/image/TemplateDataFactoryImpl.java
index a67f08f..fe1c62c 100644
--- a/engine/storage/image/src/org/apache/cloudstack/storage/image/TemplateDataFactoryImpl.java
+++ b/engine/storage/image/src/org/apache/cloudstack/storage/image/TemplateDataFactoryImpl.java
@@ -20,6 +20,9 @@ package org.apache.cloudstack.storage.image;
import javax.inject.Inject;
+import org.apache.log4j.Logger;
+import org.springframework.stereotype.Component;
+
import org.apache.cloudstack.engine.subsystem.api.storage.DataObject;
import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
@@ -28,8 +31,6 @@ import org.apache.cloudstack.engine.subsystem.api.storage.TemplateInfo;
import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreDao;
import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreVO;
import org.apache.cloudstack.storage.image.store.TemplateObject;
-import org.apache.log4j.Logger;
-import org.springframework.stereotype.Component;
import com.cloud.storage.DataStoreRole;
import com.cloud.storage.VMTemplateStoragePoolVO;
@@ -87,7 +88,7 @@ public class TemplateDataFactoryImpl implements TemplateDataFactory {
TemplateDataStoreVO tmplStore = templateStoreDao.findByTemplate(templateId, storeRole);
DataStore store = null;
if (tmplStore != null) {
- store = this.storeMgr.getDataStore(tmplStore.getDataStoreId(), storeRole);
+ store = storeMgr.getDataStore(tmplStore.getDataStoreId(), storeRole);
}
return this.getTemplate(templateId, store);
}
@@ -97,7 +98,7 @@ public class TemplateDataFactoryImpl implements TemplateDataFactory {
TemplateDataStoreVO tmplStore = templateStoreDao.findByTemplateZone(templateId, zoneId, storeRole);
DataStore store = null;
if (tmplStore != null) {
- store = this.storeMgr.getDataStore(tmplStore.getDataStoreId(), storeRole);
+ store = storeMgr.getDataStore(tmplStore.getDataStoreId(), storeRole);
}
return this.getTemplate(templateId, store);
}
@@ -113,4 +114,17 @@ public class TemplateDataFactoryImpl implements TemplateDataFactory {
tmpObj.setUrl(origTmpl.getUrl());
return tmpObj;
}
+
+ @Override
+ public TemplateInfo getReadyTemplateOnCache(long templateId) {
+ TemplateDataStoreVO tmplStore = templateStoreDao.findReadyOnCache(templateId);
+ if (tmplStore != null) {
+ DataStore store = storeMgr.getDataStore(tmplStore.getDataStoreId(), DataStoreRole.ImageCache);
+ return getTemplate(templateId, store);
+ } else {
+ return null;
+ }
+
+ }
+
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/184e5394/engine/storage/image/src/org/apache/cloudstack/storage/image/TemplateServiceImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/image/src/org/apache/cloudstack/storage/image/TemplateServiceImpl.java b/engine/storage/image/src/org/apache/cloudstack/storage/image/TemplateServiceImpl.java
index 06cb652..163c125 100644
--- a/engine/storage/image/src/org/apache/cloudstack/storage/image/TemplateServiceImpl.java
+++ b/engine/storage/image/src/org/apache/cloudstack/storage/image/TemplateServiceImpl.java
@@ -73,6 +73,7 @@ import com.cloud.dc.dao.DataCenterDao;
import com.cloud.exception.ResourceAllocationException;
import com.cloud.hypervisor.Hypervisor.HypervisorType;
import com.cloud.storage.DataStoreRole;
+import com.cloud.storage.ScopeType;
import com.cloud.storage.Storage.TemplateType;
import com.cloud.storage.StoragePool;
import com.cloud.storage.VMTemplateStorageResourceAssoc.Status;
@@ -609,6 +610,73 @@ public class TemplateServiceImpl implements TemplateService {
return copyAsync(volume, template, store);
}
+ private AsyncCallFuture<TemplateApiResult> syncToRegionStoreAsync(TemplateInfo template, DataStore store) {
+ AsyncCallFuture<TemplateApiResult> future = new AsyncCallFuture<TemplateApiResult>();
+ // no need to create entry on template_store_ref here, since entries are already created when prepareSecondaryStorageForMigration is invoked.
+ TemplateInfo templateOnStore = _templateFactory.getTemplate(template, store);
+ TemplateOpContext<TemplateApiResult> context = new TemplateOpContext<TemplateApiResult>(null,
+ (TemplateObject)templateOnStore, future);
+ AsyncCallbackDispatcher<TemplateServiceImpl, CopyCommandResult> caller = AsyncCallbackDispatcher.create(this);
+ caller.setCallback(caller.getTarget().syncTemplateCallBack(null, null)).setContext(context);
+ _motionSrv.copyAsync(template, templateOnStore, caller);
+ return future;
+ }
+
+ protected Void syncTemplateCallBack(AsyncCallbackDispatcher<TemplateServiceImpl, CopyCommandResult> callback,
+ TemplateOpContext<TemplateApiResult> context) {
+ TemplateInfo destTemplate = context.getTemplate();
+ CopyCommandResult result = callback.getResult();
+ AsyncCallFuture<TemplateApiResult> future = context.getFuture();
+ TemplateApiResult res = new TemplateApiResult(destTemplate);
+ try {
+ if (result.isFailed()) {
+ res.setResult(result.getResult());
+ // no change to existing template_store_ref, will try to re-sync later if other call triggers this sync operation, like copy template
+ } else {
+ // this will update install path properly, next time it will not sync anymore.
+ destTemplate.processEvent(Event.OperationSuccessed, result.getAnswer());
+ }
+ future.complete(res);
+ } catch (Exception e) {
+ s_logger.debug("Failed to process sync template callback", e);
+ res.setResult(e.toString());
+ future.complete(res);
+ }
+
+ return null;
+ }
+
+ // This routine is used to push templates currently on cache store, but not in region store to region store.
+ // used in migrating existing NFS secondary storage to S3.
+ @Override
+ public void syncTemplateToRegionStore(long templateId, DataStore store) {
+ if (store.getScope().getScopeType() == ScopeType.REGION) {
+ // if template is on region wide object store, check if it is really downloaded there (by checking install_path). Sync template to region
+ // wide store if it is not there physically.
+ TemplateInfo tmplOnStore = _templateFactory.getTemplate(templateId, store);
+ if (tmplOnStore == null) {
+ throw new CloudRuntimeException("Cannot find an entry in template_store_ref for template " + templateId + " on region store: " + store.getName());
+ }
+ if (tmplOnStore.getInstallPath() == null || tmplOnStore.getInstallPath().length() == 0) {
+ // template is not on region store yet, sync to region store
+ TemplateInfo srcTemplate = _templateFactory.getReadyTemplateOnCache(templateId);
+ if (srcTemplate == null) {
+ throw new CloudRuntimeException("Cannot find template " + templateId + " on cache store");
+ }
+ AsyncCallFuture<TemplateApiResult> future = syncToRegionStoreAsync(srcTemplate, store);
+ try {
+ TemplateApiResult result = future.get();
+ if (result.isFailed()) {
+ throw new CloudRuntimeException("sync template from cache to region wide store failed for image store " + store.getName() + ":"
+ + result.getResult());
+ }
+ } catch (Exception ex) {
+ throw new CloudRuntimeException("sync template from cache to region wide store failed for image store " + store.getName());
+ }
+ }
+ }
+ }
+
@Override
public AsyncCallFuture<TemplateApiResult> copyTemplate(TemplateInfo srcTemplate, DataStore destStore) {
// generate a URL from source template ssvm to download to destination data store
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/184e5394/engine/storage/src/org/apache/cloudstack/storage/image/db/TemplateDataStoreDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/db/TemplateDataStoreDaoImpl.java b/engine/storage/src/org/apache/cloudstack/storage/image/db/TemplateDataStoreDaoImpl.java
index 008180f..25f3486 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/image/db/TemplateDataStoreDaoImpl.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/image/db/TemplateDataStoreDaoImpl.java
@@ -31,6 +31,7 @@ import org.springframework.stereotype.Component;
import org.apache.cloudstack.engine.subsystem.api.storage.DataObjectInStore;
import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
+import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine;
import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine.Event;
import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine.State;
import org.apache.cloudstack.engine.subsystem.api.storage.TemplateService;
@@ -94,6 +95,7 @@ public class TemplateDataStoreDaoImpl extends GenericDaoBase<TemplateDataStoreVO
templateRoleSearch.and("template_id", templateRoleSearch.entity().getTemplateId(), SearchCriteria.Op.EQ);
templateRoleSearch.and("store_role", templateRoleSearch.entity().getDataStoreRole(), SearchCriteria.Op.EQ);
templateRoleSearch.and("destroyed", templateRoleSearch.entity().getDestroyed(), SearchCriteria.Op.EQ);
+ templateRoleSearch.and("state", templateRoleSearch.entity().getState(), SearchCriteria.Op.EQ);
templateRoleSearch.done();
updateStateSearch = this.createSearchBuilder();
@@ -323,6 +325,16 @@ public class TemplateDataStoreDaoImpl extends GenericDaoBase<TemplateDataStoreVO
}
@Override
+ public TemplateDataStoreVO findReadyOnCache(long templateId) {
+ SearchCriteria<TemplateDataStoreVO> sc = templateRoleSearch.create();
+ sc.setParameters("template_id", templateId);
+ sc.setParameters("store_role", DataStoreRole.ImageCache);
+ sc.setParameters("destroyed", false);
+ sc.setParameters("state", ObjectInDataStoreStateMachine.State.Ready);
+ return findOneIncludingRemovedBy(sc);
+ }
+
+ @Override
public List<TemplateDataStoreVO> listByTemplate(long templateId) {
SearchCriteria<TemplateDataStoreVO> sc = templateSearch.create();
sc.setParameters("template_id", templateId);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/184e5394/server/src/com/cloud/template/TemplateManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/template/TemplateManagerImpl.java b/server/src/com/cloud/template/TemplateManagerImpl.java
index c1ce892..452e079 100755
--- a/server/src/com/cloud/template/TemplateManagerImpl.java
+++ b/server/src/com/cloud/template/TemplateManagerImpl.java
@@ -479,6 +479,9 @@ public class TemplateManagerImpl extends ManagerBase implements TemplateManager,
throw new InvalidParameterValueException("The " + desc + " has not been downloaded ");
}
+ // Handle NFS to S3 object store migration case, we trigger template sync from NFS to S3 during extract template or copy template
+ _tmpltSvr.syncTemplateToRegionStore(templateId, tmpltStore);
+
DataObject templateObject = _tmplFactory.getTemplate(templateId, tmpltStore);
return tmpltStore.createEntityExtractUrl(tmpltStoreRef.getInstallPath(), template.getFormat(), templateObject);
@@ -698,7 +701,15 @@ public class TemplateManagerImpl extends ManagerBase implements TemplateManager,
throw new InvalidParameterValueException("Unable to find template with id");
}
+ DataStore srcSecStore = getImageStore(sourceZoneId, templateId);
+ if (srcSecStore == null) {
+ throw new InvalidParameterValueException("There is no template " + templateId + " in zone " + sourceZoneId);
+ }
+
if (template.isCrossZones()){
+ //TODO: we may need UI still enable CopyTemplate in case of cross zone template to trigger sync to region store.
+ // sync template from cache store to region store if it is not there, for cases where we are going to migrate existing NFS to S3.
+ _tmpltSvr.syncTemplateToRegionStore(templateId, srcSecStore);
s_logger.debug("Template " + templateId + " is cross-zone, don't need to copy");
return template;
}
@@ -710,11 +721,6 @@ public class TemplateManagerImpl extends ManagerBase implements TemplateManager,
return template;
}
- DataStore srcSecStore = getImageStore(sourceZoneId, templateId);
- if (srcSecStore == null) {
- throw new InvalidParameterValueException("There is no template " + templateId + " in zone " + sourceZoneId);
- }
-
_accountMgr.checkAccess(caller, AccessType.ModifyEntry, true, template);
boolean success = copy(userId, template, srcSecStore, dstZone);
@@ -781,7 +787,7 @@ public class TemplateManagerImpl extends ManagerBase implements TemplateManager,
}
try {
- StoragePool pool = (StoragePool) this._dataStoreMgr.getPrimaryDataStore(templatePoolVO.getPoolId());
+ StoragePool pool = (StoragePool) _dataStoreMgr.getPrimaryDataStore(templatePoolVO.getPoolId());
VMTemplateVO template = _tmpltDao.findByIdIncludingRemoved(templatePoolVO.getTemplateId());
if (s_logger.isDebugEnabled()) {
@@ -1830,6 +1836,6 @@ public class TemplateManagerImpl extends ManagerBase implements TemplateManager,
@Inject
public void setTemplateAdapters(List<TemplateAdapter> adapters) {
- this._adapters = adapters;
+ _adapters = adapters;
}
}
[8/8] git commit: updated refs/heads/object_store_migration to 9da56fe
Posted by mc...@apache.org.
Remove wrong final modifier from Created field in SnapshotDataStoreVO,
TemplateDataStoreVO and VolumeDataStoreVO.
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/9da56fe1
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/9da56fe1
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/9da56fe1
Branch: refs/heads/object_store_migration
Commit: 9da56fe1fe18cc544910365aaea72eafd8208c78
Parents: 7a1ee00
Author: Min Chen <mi...@citrix.com>
Authored: Fri Oct 25 21:15:36 2013 -0700
Committer: Min Chen <mi...@citrix.com>
Committed: Fri Oct 25 21:15:36 2013 -0700
----------------------------------------------------------------------
.../cloudstack/storage/datastore/db/SnapshotDataStoreVO.java | 2 +-
.../cloudstack/storage/datastore/db/TemplateDataStoreVO.java | 2 +-
.../apache/cloudstack/storage/datastore/db/VolumeDataStoreVO.java | 2 +-
3 files changed, 3 insertions(+), 3 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/9da56fe1/engine/schema/src/org/apache/cloudstack/storage/datastore/db/SnapshotDataStoreVO.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/SnapshotDataStoreVO.java b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/SnapshotDataStoreVO.java
index 98fb7b1..db86c3f 100644
--- a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/SnapshotDataStoreVO.java
+++ b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/SnapshotDataStoreVO.java
@@ -59,7 +59,7 @@ public class SnapshotDataStoreVO implements StateObject<ObjectInDataStoreStateMa
private long snapshotId;
@Column(name = GenericDaoBase.CREATED_COLUMN)
- private final Date created = null;
+ private Date created = null;
@Column(name = "last_updated")
@Temporal(value = TemporalType.TIMESTAMP)
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/9da56fe1/engine/schema/src/org/apache/cloudstack/storage/datastore/db/TemplateDataStoreVO.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/TemplateDataStoreVO.java b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/TemplateDataStoreVO.java
index 7d0a967..a3696d8 100755
--- a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/TemplateDataStoreVO.java
+++ b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/TemplateDataStoreVO.java
@@ -60,7 +60,7 @@ public class TemplateDataStoreVO implements StateObject<ObjectInDataStoreStateMa
private DataStoreRole dataStoreRole;
@Column(name = GenericDaoBase.CREATED_COLUMN)
- private final Date created = null;
+ private Date created = null;
@Column(name = "last_updated")
@Temporal(value = TemporalType.TIMESTAMP)
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/9da56fe1/engine/schema/src/org/apache/cloudstack/storage/datastore/db/VolumeDataStoreVO.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/VolumeDataStoreVO.java b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/VolumeDataStoreVO.java
index 6f3ccae..e34d4a6 100755
--- a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/VolumeDataStoreVO.java
+++ b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/VolumeDataStoreVO.java
@@ -58,7 +58,7 @@ public class VolumeDataStoreVO implements StateObject<ObjectInDataStoreStateMach
private long zoneId;
@Column(name = GenericDaoBase.CREATED_COLUMN)
- private final Date created = null;
+ private Date created = null;
@Column(name = "last_updated")
@Temporal(value = TemporalType.TIMESTAMP)
[7/8] git commit: updated refs/heads/object_store_migration to 9da56fe
Posted by mc...@apache.org.
Merge branch 'master' into object_store_migration.
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/7a1ee002
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/7a1ee002
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/7a1ee002
Branch: refs/heads/object_store_migration
Commit: 7a1ee002756ea545a849b29268e3cc72f7fcd8b3
Parents: 81686e8 7120c1e
Author: Min Chen <mi...@citrix.com>
Authored: Wed Oct 23 16:46:28 2013 -0700
Committer: Min Chen <mi...@citrix.com>
Committed: Wed Oct 23 16:46:28 2013 -0700
----------------------------------------------------------------------
agent/pom.xml | 4 +
agent/src/com/cloud/agent/Agent.java | 1 -
agent/src/com/cloud/agent/AgentShell.java | 61 +-
agent/test/com/cloud/agent/AgentShellTest.java | 48 +
.../cloudstack/api-planner/module.properties | 18 +
.../api-planner/spring-api-planner-context.xml | 34 +
.../exception/ConcurrentOperationException.java | 3 +-
.../element/RemoteAccessVPNServiceProvider.java | 5 +-
api/src/com/cloud/offering/NetworkOffering.java | 2 +
api/src/com/cloud/vm/VmDetailConstants.java | 1 +
.../org/apache/cloudstack/api/ApiConstants.java | 7 +-
.../admin/network/CreateNetworkOfferingCmd.java | 9 +-
.../admin/network/UpdateNetworkOfferingCmd.java | 7 +
.../command/user/network/UpdateNetworkCmd.java | 4 +-
.../command/user/ssh/CreateSSHKeyPairCmd.java | 6 +-
.../api/command/user/vm/DestroyVMCmd.java | 27 +-
.../user/volume/RemoveResourceDetailCmd.java | 15 +-
.../command/user/volume/UpdateVolumeCmd.java | 6 +-
.../api/response/CreateSSHKeyPairResponse.java | 41 +
.../api/response/SSHKeyPairResponse.java | 16 -
.../api/response/SnapshotResponse.java | 25 +-
.../cloudstack/api/response/UserVmResponse.java | 9 +-
.../apache/cloudstack/context/CallContext.java | 4 +-
.../bridge/persist/dao/BucketPolicyDaoImpl.java | 6 +-
.../persist/dao/CloudStackAccountDaoImpl.java | 3 +-
.../dao/CloudStackConfigurationDaoImpl.java | 3 +-
.../dao/CloudStackSvcOfferingDaoImpl.java | 5 +-
.../persist/dao/CloudStackUserDaoImpl.java | 3 +-
.../cloud/bridge/persist/dao/MHostDaoImpl.java | 5 +-
.../bridge/persist/dao/MHostMountDaoImpl.java | 3 +-
.../persist/dao/MultiPartPartsDaoImpl.java | 9 +-
.../persist/dao/MultiPartUploadsDaoImpl.java | 15 +-
.../bridge/persist/dao/MultipartLoadDao.java | 9 +-
.../persist/dao/MultipartMetaDaoImpl.java | 3 +-
.../bridge/persist/dao/OfferingDaoImpl.java | 11 +-
.../cloud/bridge/persist/dao/SAclDaoImpl.java | 7 +-
.../bridge/persist/dao/SBucketDaoImpl.java | 5 +-
.../cloud/bridge/persist/dao/SHostDaoImpl.java | 5 +-
.../cloud/bridge/persist/dao/SMetaDaoImpl.java | 5 +-
.../bridge/persist/dao/SObjectDaoImpl.java | 7 +-
.../bridge/persist/dao/SObjectItemDaoImpl.java | 5 +-
.../persist/dao/UserCredentialsDaoImpl.java | 5 +-
.../cloud/bridge/service/EC2RestServlet.java | 13 +-
.../com/cloud/bridge/service/S3RestServlet.java | 5 +-
.../service/controller/s3/S3BucketAction.java | 3 +-
.../service/controller/s3/ServiceProvider.java | 7 +-
.../cloud/bridge/service/core/s3/S3Engine.java | 23 +-
.../classes/resources/messages.properties | 2 +
client/WEB-INF/web.xml | 6 +-
client/pom.xml | 56 +-
.../cloudstack/webApplicationContext.xml | 32 +
client/tomcatconf/applicationContext.xml.in | 956 ------
client/tomcatconf/commands.properties.in | 2 +-
client/tomcatconf/componentContext.xml.in | 324 --
client/tomcatconf/log4j-cloud.xml.in | 8 +
client/tomcatconf/nonossComponentContext.xml.in | 421 ---
.../tomcatconf/simulatorComponentContext.xml.in | 284 --
client/tomcatconf/tomcat6-nonssl.conf.in | 2 +-
client/tomcatconf/tomcat6-ssl.conf.in | 2 +-
.../cloudstack/allocator/module.properties | 18 +
.../allocator/spring-core-allocator-context.xml | 32 +
...-lifecycle-allocator-context-inheritable.xml | 42 +
.../META-INF/cloudstack/api/module.properties | 18 +
...g-core-lifecycle-api-context-inheritable.xml | 53 +
.../cloudstack/backend/module.properties | 18 +
.../cloudstack/bootstrap/module.properties | 17 +
.../spring-bootstrap-context-inheritable.xml | 39 +
.../bootstrap/spring-bootstrap-context.xml | 32 +
.../cloudstack/compute/module.properties | 18 +
...re-lifecycle-compute-context-inheritable.xml | 45 +
.../META-INF/cloudstack/core/module.properties | 18 +
.../cloudstack/core/spring-core-context.xml | 36 +
...-core-lifecycle-core-context-inheritable.xml | 41 +
.../core/spring-core-registry-core-context.xml | 197 ++
.../cloudstack/discoverer/module.properties | 18 +
...lifecycle-discoverer-context-inheritable.xml | 35 +
.../cloudstack/network/module.properties | 18 +
...re-lifecycle-network-context-inheritable.xml | 58 +
.../cloudstack/planner/module.properties | 18 +
...re-lifecycle-planner-context-inheritable.xml | 41 +
.../cloudstack/storage/module.properties | 18 +
...ng-lifecycle-storage-context-inheritable.xml | 74 +
.../cloudstack/system/module.properties | 18 +
.../spring-core-system-context-inheritable.xml | 54 +
.../system/spring-core-system-context.xml | 50 +
.../com/cloud/agent/api/ClusterSyncAnswer.java | 8 +-
.../cloud/agent/api/StartupRoutingCommand.java | 8 +-
core/src/com/cloud/agent/api/StopAnswer.java | 23 +-
.../api/routing/LoadBalancerConfigCommand.java | 4 +-
.../virtualnetwork/VirtualRoutingResource.java | 25 +-
.../com/cloud/network/HAProxyConfigurator.java | 54 +-
.../StorageSubsystemCommandHandlerBase.java | 5 +-
.../cloud/network/HAProxyConfiguratorTest.java | 97 +
.../core/spring-engine-api-core-context.xml | 44 +
.../api/storage/DataMotionStrategy.java | 4 +-
.../subsystem/api/storage/SnapshotInfo.java | 2 +
.../subsystem/api/storage/SnapshotStrategy.java | 9 +-
.../api/storage/StorageStrategyFactory.java | 45 +
.../subsystem/api/storage/StrategyPriority.java | 86 +-
.../api/storage/StrategyPriorityTest.java | 116 -
...pring-engine-components-api-core-context.xml | 30 +
.../configuration/ConfigurationManager.java | 2 +-
...spring-engine-orchestration-core-context.xml | 71 +
.../cloud/agent/manager/AgentManagerImpl.java | 5 +-
.../manager/ClusteredAgentManagerImpl.java | 4 +-
.../com/cloud/vm/VirtualMachineManagerImpl.java | 390 ++-
.../entity/api/db/dao/DcDetailsDaoImpl.java | 4 +-
.../entity/api/db/dao/EngineClusterDaoImpl.java | 6 +-
.../api/db/dao/EngineDataCenterDaoImpl.java | 6 +-
.../entity/api/db/dao/EngineHostDaoImpl.java | 14 +-
.../entity/api/db/dao/EngineHostPodDaoImpl.java | 6 +-
.../entity/api/db/dao/HostDetailsDaoImpl.java | 4 +-
.../entity/api/db/dao/HostTagsDaoImpl.java | 4 +-
.../orchestration/NetworkOrchestrator.java | 916 ++---
.../orchestration/VolumeOrchestrator.java | 88 +-
.../spring-engine-schema-core-daos-context.xml | 322 ++
...ng-engine-schema-system-checkers-context.xml | 34 +
.../src/com/cloud/alert/dao/AlertDaoImpl.java | 4 +-
.../com/cloud/capacity/dao/CapacityDaoImpl.java | 26 +-
.../configuration/dao/ResourceCountDaoImpl.java | 4 +-
.../src/com/cloud/dc/ClusterDetailsDaoImpl.java | 6 +-
.../src/com/cloud/dc/dao/ClusterDaoImpl.java | 6 +-
.../com/cloud/dc/dao/ClusterVSMMapDaoImpl.java | 4 +-
.../src/com/cloud/dc/dao/DataCenterDaoImpl.java | 6 +-
.../dc/dao/DataCenterIpAddressDaoImpl.java | 8 +-
.../DataCenterLinkLocalIpAddressDaoImpl.java | 6 +-
.../src/com/cloud/dc/dao/DataCenterVnetDao.java | 3 +-
.../com/cloud/dc/dao/DataCenterVnetDaoImpl.java | 8 +-
.../src/com/cloud/dc/dao/DcDetailsDaoImpl.java | 4 +-
.../src/com/cloud/dc/dao/HostPodDaoImpl.java | 6 +-
.../src/com/cloud/dc/dao/PodVlanDaoImpl.java | 8 +-
.../dc/dao/StorageNetworkIpAddressDaoImpl.java | 6 +-
.../src/com/cloud/dc/dao/VlanDaoImpl.java | 4 +-
.../src/com/cloud/domain/dao/DomainDaoImpl.java | 8 +-
.../src/com/cloud/event/dao/EventDaoImpl.java | 4 +-
.../com/cloud/event/dao/UsageEventDaoImpl.java | 10 +-
.../src/com/cloud/host/dao/HostDaoImpl.java | 14 +-
.../com/cloud/host/dao/HostDetailsDaoImpl.java | 4 +-
.../src/com/cloud/host/dao/HostTagsDaoImpl.java | 4 +-
.../src/com/cloud/keystore/KeystoreDaoImpl.java | 4 +-
.../network/dao/FirewallRulesCidrsDaoImpl.java | 4 +-
.../cloud/network/dao/FirewallRulesDaoImpl.java | 6 +-
.../com/cloud/network/dao/IPAddressDaoImpl.java | 6 +-
.../com/cloud/network/dao/NetworkDaoImpl.java | 10 +-
.../cloud/network/dao/PortProfileDaoImpl.java | 4 +-
.../security/dao/SecurityGroupDaoImpl.java | 6 +-
.../security/dao/SecurityGroupWorkDaoImpl.java | 8 +-
.../security/dao/VmRulesetLogDaoImpl.java | 8 +-
.../cloud/network/vpc/dao/PrivateIpDaoImpl.java | 4 +-
.../network/vpc/dao/StaticRouteDaoImpl.java | 4 +-
.../com/cloud/network/vpc/dao/VpcDaoImpl.java | 8 +-
.../network/vpc/dao/VpcOfferingDaoImpl.java | 4 +-
.../com/cloud/offerings/NetworkOfferingVO.java | 12 +
.../offerings/dao/NetworkOfferingDaoImpl.java | 6 +-
.../com/cloud/projects/dao/ProjectDaoImpl.java | 4 +-
.../dao/ServiceOfferingDetailsDaoImpl.java | 4 +-
.../storage/dao/LaunchPermissionDaoImpl.java | 6 +-
.../com/cloud/storage/dao/SnapshotDaoImpl.java | 14 +-
.../storage/dao/StoragePoolDetailsDaoImpl.java | 4 +-
.../storage/dao/StoragePoolHostDaoImpl.java | 10 +-
.../storage/dao/StoragePoolWorkDaoImpl.java | 4 +-
.../com/cloud/storage/dao/VMTemplateDao.java | 3 +
.../cloud/storage/dao/VMTemplateDaoImpl.java | 31 +-
.../cloud/storage/dao/VMTemplateDetailsDao.java | 2 +
.../storage/dao/VMTemplateDetailsDaoImpl.java | 16 +-
.../storage/dao/VMTemplateHostDaoImpl.java | 8 +-
.../storage/dao/VMTemplatePoolDaoImpl.java | 8 +-
.../storage/dao/VMTemplateZoneDaoImpl.java | 4 +-
.../com/cloud/storage/dao/VolumeDaoImpl.java | 12 +-
.../cloud/storage/dao/VolumeDetailsDaoImpl.java | 4 +-
.../src/com/cloud/upgrade/DatabaseCreator.java | 8 +-
.../cloud/upgrade/DatabaseIntegrityChecker.java | 7 +-
.../cloud/upgrade/DatabaseUpgradeChecker.java | 9 +-
.../com/cloud/upgrade/dao/Upgrade307to410.java | 1 -
.../com/cloud/upgrade/dao/VersionDaoImpl.java | 4 +-
.../src/com/cloud/usage/dao/UsageDaoImpl.java | 26 +-
.../cloud/usage/dao/UsageIPAddressDaoImpl.java | 6 +-
.../com/cloud/usage/dao/UsageJobDaoImpl.java | 8 +-
.../dao/UsageLoadBalancerPolicyDaoImpl.java | 8 +-
.../cloud/usage/dao/UsageNetworkDaoImpl.java | 8 +-
.../usage/dao/UsageNetworkOfferingDaoImpl.java | 6 +-
.../dao/UsagePortForwardingRuleDaoImpl.java | 8 +-
.../usage/dao/UsageSecurityGroupDaoImpl.java | 6 +-
.../cloud/usage/dao/UsageStorageDaoImpl.java | 8 +-
.../cloud/usage/dao/UsageVMInstanceDaoImpl.java | 8 +-
.../cloud/usage/dao/UsageVMSnapshotDaoImpl.java | 8 +-
.../cloud/usage/dao/UsageVPNUserDaoImpl.java | 6 +-
.../com/cloud/usage/dao/UsageVmDiskDaoImpl.java | 8 +-
.../com/cloud/usage/dao/UsageVolumeDaoImpl.java | 8 +-
.../com/cloud/user/AccountDetailsDaoImpl.java | 4 +-
.../src/com/cloud/user/dao/AccountDaoImpl.java | 4 +-
.../cloud/user/dao/UserStatisticsDaoImpl.java | 6 +-
.../cloud/user/dao/VmDiskStatisticsDaoImpl.java | 6 +-
.../com/cloud/vm/dao/ConsoleProxyDaoImpl.java | 16 +-
.../com/cloud/vm/dao/DomainRouterDaoImpl.java | 8 +-
.../src/com/cloud/vm/dao/NicDetailDaoImpl.java | 4 +-
.../cloud/vm/dao/SecondaryStorageVmDaoImpl.java | 8 +-
.../src/com/cloud/vm/dao/UserVmDaoImpl.java | 8 +-
.../src/com/cloud/vm/dao/UserVmDetailsDao.java | 3 +-
.../com/cloud/vm/dao/UserVmDetailsDaoImpl.java | 17 +-
.../src/com/cloud/vm/dao/VMInstanceDaoImpl.java | 12 +-
.../affinity/dao/AffinityGroupVMMapDaoImpl.java | 4 +-
.../entity/api/db/dao/VMComputeTagDaoImpl.java | 4 +-
.../entity/api/db/dao/VMEntityDaoImpl.java | 4 +-
.../entity/api/db/dao/VMNetworkMapDaoImpl.java | 4 +-
.../entity/api/db/dao/VMReservationDaoImpl.java | 4 +-
.../entity/api/db/dao/VMRootDiskTagDaoImpl.java | 4 +-
.../datastore/db/PrimaryDataStoreDaoImpl.java | 10 +-
...spring-engine-storage-cache-core-context.xml | 38 +
...g-engine-storage-datamotion-core-context.xml | 34 +
...ngine-storage-datamotion-storage-context.xml | 34 +
.../motion/AncientDataMotionStrategy.java | 10 +-
.../storage/motion/DataMotionServiceImpl.java | 42 +-
...spring-engine-storage-image-core-context.xml | 45 +
.../cloudstack/storage/test/AopTestAdvice.java | 3 +-
.../storage/test/CloudStackTestNGBase.java | 5 +-
.../test/FakePrimaryDataStoreDriver.java | 7 +-
.../storage/test/MockStorageMotionStrategy.java | 10 +-
.../cloudstack/storage/test/SnapshotTest.java | 58 +-
.../cloudstack/storage/test/TestNGAop.java | 4 +-
.../test/resources/storageContext.xml | 1 +
.../core/spring-engine-storage-core-context.xml | 68 +
.../storage-allocator/module.properties | 18 +
...engine-storage-storage-allocator-context.xml | 49 +
...ing-engine-storage-snapshot-core-context.xml | 41 +
...-engine-storage-snapshot-storage-context.xml | 33 +
.../storage/snapshot/SnapshotObject.java | 40 +-
.../snapshot/XenserverSnapshotStrategy.java | 8 +-
.../ClusterScopeStoragePoolAllocator.java | 19 +-
.../allocator/LocalStoragePoolAllocator.java | 19 +-
.../allocator/ZoneWideStoragePoolAllocator.java | 31 +-
.../provider/DataStoreProviderManagerImpl.java | 112 +-
.../endpoint/DefaultEndPointSelector.java | 3 +-
.../helper/StorageStrategyFactoryImpl.java | 139 +
.../image/db/ImageStoreDetailsDaoImpl.java | 4 +-
.../image/db/SnapshotDataStoreDaoImpl.java | 8 +-
.../image/db/TemplateDataStoreDaoImpl.java | 6 +-
.../image/db/VolumeDataStoreDaoImpl.java | 5 +-
.../datastore/PrimaryDataStoreHelper.java | 4 +-
.../db/PrimaryDataStoreDetailsDaoImpl.java | 4 +-
.../api/storage/StrategyPriorityTest.java | 122 +
...pring-engine-storage-volume-core-context.xml | 49 +
.../storage/volume/VolumeServiceImpl.java | 2 +-
.../spring-framework-cluster-core-context.xml | 36 +
.../com/cloud/cluster/ClusterManagerImpl.java | 102 +-
.../dao/ManagementServerHostDaoImpl.java | 16 +-
.../dao/ManagementServerHostPeerDaoImpl.java | 4 +-
...mework-config-system-context-inheritable.xml | 38 +
.../spring-framework-config-system-context.xml | 51 +
.../framework/config/ConfigDepotAdmin.java | 2 +
.../framework/config/dao/ConfigurationDao.java | 2 +
.../config/dao/ConfigurationDaoImpl.java | 24 +-
.../framework/config/impl/ConfigDepotImpl.java | 98 +-
.../config/impl/ConfigDepotAdminTest.java | 1 +
.../spring-framework-db-system-context.xml | 32 +
.../utils/crypt/EncryptionSecretKeyChanger.java | 3 +-
.../com/cloud/utils/db/ConnectionConcierge.java | 2 +-
framework/db/src/com/cloud/utils/db/DbUtil.java | 2 +-
.../src/com/cloud/utils/db/GenericDaoBase.java | 36 +-
.../db/src/com/cloud/utils/db/Merovingian2.java | 2 +-
.../src/com/cloud/utils/db/SequenceFetcher.java | 2 +-
.../db/src/com/cloud/utils/db/Transaction.java | 1165 +------
.../com/cloud/utils/db/TransactionCallback.java | 25 +
.../utils/db/TransactionCallbackNoReturn.java | 31 +
.../db/TransactionCallbackWithException.java | 25 +
...ransactionCallbackWithExceptionNoReturn.java | 32 +
.../utils/db/TransactionContextBuilder.java | 6 +-
.../utils/db/TransactionContextInterceptor.java | 39 +
.../utils/db/TransactionContextListener.java | 41 +
.../com/cloud/utils/db/TransactionLegacy.java | 1194 +++++++
.../cloud/utils/db/TransactionMBeanImpl.java | 18 +-
.../com/cloud/utils/db/TransactionStatus.java | 25 +
.../db/test/com/cloud/utils/db/DbTestDao.java | 4 +-
.../db/test/com/cloud/utils/db/DbTestUtils.java | 4 +-
.../com/cloud/utils/db/TestTransaction.java | 154 +
.../com/cloud/utils/db/TransactionTest.java | 26 +-
framework/db/test/db.properties | 18 +
.../core/spring-framework-ipc-core-context.xml | 59 +
.../core/spring-framework-jobs-core-context.xml | 48 +
.../framework/jobs/dao/AsyncJobDaoImpl.java | 4 +-
.../jobs/dao/AsyncJobJoinMapDaoImpl.java | 10 +-
.../framework/jobs/dao/SyncQueueDaoImpl.java | 4 +-
.../jobs/dao/SyncQueueItemDaoImpl.java | 4 +-
.../jobs/impl/AsyncJobManagerImpl.java | 286 +-
.../jobs/impl/SyncQueueManagerImpl.java | 271 +-
framework/pom.xml | 2 +
framework/spring/lifecycle/pom.xml | 34 +
.../spring/lifecycle/AbstractBeanCollector.java | 113 +
.../lifecycle/AbstractSmartLifeCycle.java | 53 +
.../lifecycle/CloudStackExtendedLifeCycle.java | 169 +
.../CloudStackExtendedLifeCycleStart.java | 49 +
.../spring/lifecycle/CloudStackLog4jSetup.java | 56 +
.../spring/lifecycle/ConfigDepotLifeCycle.java | 47 +
.../spring/lifecycle/registry/DumpRegistry.java | 77 +
.../lifecycle/registry/ExtensionRegistry.java | 245 ++
.../registry/PluggableServiceLifecycle.java | 53 +
.../lifecycle/registry/RegistryLifecycle.java | 144 +
framework/spring/module/pom.xml | 50 +
.../context/ResourceApplicationContext.java | 55 +
.../module/factory/CloudStackSpringContext.java | 137 +
.../factory/ModuleBasedContextFactory.java | 84 +
.../module/locator/ModuleDefinitionLocator.java | 36 +
.../impl/ClasspathModuleDefinitionLocator.java | 62 +
.../spring/module/model/ModuleDefinition.java | 48 +
.../module/model/ModuleDefinitionSet.java | 32 +
.../model/impl/DefaultModuleDefinition.java | 167 +
.../model/impl/DefaultModuleDefinitionSet.java | 243 ++
.../cloudstack/spring/module/util/Main.java | 58 +
.../spring/module/util/ModuleLocationUtils.java | 53 +
.../web/CloudStackContextLoaderListener.java | 75 +
.../module/model/impl/defaults-context.xml | 28 +
.../spring/module/factory/InitTest.java | 39 +
.../factory/ModuleBasedContextFactoryTest.java | 121 +
...ClasspathModuleDefinitionSetLocatorTest.java | 40 +
.../model/impl/DefaultModuleDefinitionTest.java | 131 +
.../resources/testfiles/all/defaults.properties | 18 +
.../testfiles/all/empty-context-inheritable.xml | 26 +
.../resources/testfiles/all/empty-context.xml | 26 +
.../all/empty2-context-inheritable.xml | 26 +
.../resources/testfiles/all/empty2-context.xml | 26 +
.../resources/testfiles/all/module.properties | 17 +
.../testfiles/all/test2-defaults.properties | 17 +
.../testfiles/badname/module.properties | 17 +
.../testfiles/blankname/module.properties | 18 +
.../resources/testfiles/good/empty-context.xml | 26 +
.../resources/testfiles/good/module.properties | 17 +
.../testfiles/missingname/module.properties | 17 +
.../testfiles/wrongname/module.properties | 17 +
.../testhierarchy/base/module.properties | 17 +
.../base/test-context-inheritable.xml | 28 +
.../testhierarchy/base/test-context.xml | 34 +
.../testhierarchy/child1-1/module.properties | 18 +
.../testhierarchy/child1-1/test-context.xml | 34 +
.../testhierarchy/child1/module.properties | 18 +
.../child1/test-context-override.xml | 30 +
.../testhierarchy/child1/test-context.xml | 38 +
.../testhierarchy/child2/module.properties | 18 +
.../testhierarchy/child2/test-context.xml | 33 +
.../testhierarchy/orphan1/module.properties | 18 +
.../testhierarchy/orphan1/test-context.xml | 30 +
packaging/centos63/cloud-management.rc | 4 +-
packaging/centos63/cloud.spec | 18 +-
packaging/centos63/cloudstack-sccs | 20 +
.../debian/config/opt/cloud/bin/savepassword.sh | 62 +
.../acl-static-role-based/module.properties | 18 +
.../spring-acl-static-role-based-context.xml | 34 +
.../explicit-dedication/module.properties | 18 +
.../spring-explicit-dedication-context.xml | 36 +
.../affinity/ExplicitDedicationProcessor.java | 32 +-
.../host-anti-affinity/module.properties | 18 +
.../spring-host-anti-affinity-context.xml | 37 +
.../discovery/ApiDiscoveryServiceImpl.java | 65 +-
.../cloudstack/discovery/ApiDiscoveryTest.java | 2 +-
.../cloudstack/rate-limit/module.properties | 18 +
.../rate-limit/spring-rate-limit-context.xml | 32 +
.../spring-dedicated-resources-core-context.xml | 33 +
.../dedicated/DedicatedResourceManagerImpl.java | 273 +-
.../implicit-dedication/module.properties | 18 +
.../spring-implicit-dedication-context.xml | 25 +
.../user-concentrated-pod/module.properties | 18 +
.../spring-user-concentrated-pod-context.xml | 35 +
.../src/com/cloud/netapp/NetappManagerImpl.java | 10 +-
.../host-allocator-random/module.properties | 18 +
.../spring-host-allocator-random-context.xml | 34 +
.../baremetal-compute/module.properties | 18 +
.../spring-baremetal-compute-context.xml | 35 +
.../baremetal-discoverer/module.properties | 18 +
.../spring-baremetal-discoverer-context.xml | 34 +
.../baremetal-network/module.properties | 18 +
.../spring-baremetal-network-context.xml | 46 +
.../baremetal-planner/module.properties | 18 +
.../spring-baremetal-planner-context.xml | 34 +
.../baremetal-storage/module.properties | 18 +
.../spring-baremetal-storage-context.xml | 32 +
.../core/spring-baremetal-core-context.xml | 42 +
.../BareMetalPingServiceImpl.java | 3 -
.../networkservice/BareMetalResourceBase.java | 2 +-
.../networkservice/BaremetaNetworkGuru.java | 21 +-
.../networkservice/BaremetalDhcpElement.java | 4 -
.../BaremetalDhcpManagerImpl.java | 4 -
.../BaremetalKickStartServiceImpl.java | 7 +-
.../networkservice/BaremetalPxeElement.java | 4 -
.../cloudstack/kvm-compute/module.properties | 18 +
.../kvm-compute/spring-kvm-compute-context.xml | 34 +
.../kvm/resource/LibvirtComputingResource.java | 2 +-
.../cloudstack/ovm-compute/module.properties | 18 +
.../ovm-compute/spring-ovm-compute-context.xml | 39 +
.../cloudstack/ovm-discoverer/module.properties | 18 +
.../spring-ovm-discoverer-context.xml | 34 +
.../cloud/ovm/hypervisor/OvmResourceBase.java | 4 +-
.../core/spring-simulator-core-context.xml | 45 +
.../simulator-compute/module.properties | 18 +
.../spring-simulator-compute-context.xml | 34 +
.../simulator-discoverer/module.properties | 18 +
.../spring-simulator-discover-context.xml | 36 +
.../simulator-planner/module.properties | 18 +
.../simulator-planner/spring-context.xml | 34 +
.../simulator-storage/module.properties | 18 +
.../spring-simulator-storage-context.xml | 33 +
.../agent/manager/MockAgentManagerImpl.java | 95 +-
.../agent/manager/MockStorageManagerImpl.java | 170 +-
.../cloud/agent/manager/MockVmManagerImpl.java | 48 +-
.../agent/manager/SimulatorManagerImpl.java | 10 +-
.../cloud/resource/AgentRoutingResource.java | 2 +-
.../simulator/dao/MockConfigurationDaoImpl.java | 4 +-
.../motion/SimulatorDataMotionStrategy.java | 10 +-
.../cloudstack/core/spring-ucs-core-context.xml | 35 +
.../com/cloud/ucs/manager/UcsManagerImpl.java | 3 -
.../core/spring-vmware-core-context.xml | 43 +
.../cloudstack/vmware-compute/module.properties | 18 +
.../spring-vmware-compute-context.xml | 43 +
.../vmware-compute/vmware-defaults.properties | 17 +
.../vmware-discoverer/module.properties | 18 +
.../spring-vmware-discoverer-context.xml | 35 +
.../cloudstack/vmware-network/module.properties | 18 +
.../spring-vmware-network-context.xml | 34 +
.../cloudstack/vmware-storage/module.properties | 18 +
.../spring-vmware-storage-context.xml | 33 +
.../vmware/VmwareServerDiscoverer.java | 33 +-
.../vmware/manager/VmwareManagerImpl.java | 53 +-
.../vmware/resource/VmwareResource.java | 12 +-
.../network/CiscoNexusVSMDeviceManagerImpl.java | 68 +-
.../network/element/CiscoNexusVSMElement.java | 50 +-
.../motion/VmwareStorageMotionStrategy.java | 12 +-
.../motion/VmwareStorageMotionStrategyTest.java | 10 +-
.../xenserver-compute/module.properties | 18 +
.../spring-xenserver-compute-context.xml | 28 +
.../xenserver-discoverer/module.properties | 18 +
.../spring-xenserver-discoverer-context.xml | 25 +
.../xen/resource/CitrixResourceBase.java | 117 +-
.../xen/resource/XenServer56FP1Resource.java | 26 +-
.../xen/resource/XenServer610Resource.java | 22 +
.../xen/resource/XenServerPoolVms.java | 39 +-
.../motion/XenServerStorageMotionStrategy.java | 12 +-
.../META-INF/cloudstack/vns/module.properties | 18 +
.../cloudstack/vns/spring-vns-context.xml | 36 +
.../network/element/BigSwitchVnsElement.java | 45 +-
.../cloud/network/element/CiscoVnmcElement.java | 263 +-
.../META-INF/cloudstack/elb/module.properties | 18 +
.../cloudstack/elb/spring-elb-context.xml | 34 +
.../lb/ElasticLoadBalancerManagerImpl.java | 34 +-
.../core/spring-internallb-core-context.xml | 37 +
.../lb/InternalLoadBalancerVMManagerImpl.java | 2 +-
.../JuniperSRXExternalFirewallElement.java | 38 +-
.../cloudstack/midonet/module.properties | 18 +
.../midonet/spring-midonet-context.xml | 37 +
.../network/guru/MidoNetPublicNetworkGuru.java | 19 +-
.../cloud/network/element/NetscalerElement.java | 52 +-
.../META-INF/cloudstack/nvp/module.properties | 18 +
.../cloudstack/nvp/spring-nvp-context.xml | 40 +
.../cloud/network/element/NiciraNvpElement.java | 45 +-
.../META-INF/cloudstack/ovs/module.properties | 18 +
.../cloudstack/ovs/spring-ovs-context.xml | 40 +
.../META-INF/cloudstack/ssp/module.properties | 18 +
.../cloudstack/ssp/spring-ssp-context.xml | 42 +
.../META-INF/cloudstack/vxlan/module.properties | 18 +
.../cloudstack/vxlan/spring-vxlan-context.xml | 34 +
.../storage-image-default/module.properties | 18 +
.../spring-storage-image-default-context.xml | 33 +
.../storage-image-s3/module.properties | 18 +
.../spring-storage-image-s3-context.xml | 34 +
.../storage-image-swift/module.properties | 18 +
.../spring-storage-image-swift-context.xml | 33 +
.../storage-volume-default/module.properties | 18 +
.../spring-storage-volume-default-context.xml | 35 +
.../CloudStackPrimaryDataStoreDriverImpl.java | 49 +-
.../SamplePrimaryDataStoreDriverImpl.java | 22 +-
.../storage-volume-solidfire/module.properties | 18 +
.../spring-storage-volume-solidfire-context.xml | 33 +
.../driver/SolidfirePrimaryDataStoreDriver.java | 73 +-
.../cloudstack/storage/test/AopTestAdvice.java | 4 +-
.../META-INF/cloudstack/ldap/module.properties | 18 +
.../cloudstack/ldap/spring-ldap-context.xml | 39 +
.../META-INF/cloudstack/md5/module.properties | 18 +
.../cloudstack/md5/spring-md5-context.xml | 34 +
.../cloudstack/plaintext/module.properties | 18 +
.../plaintext/spring-plaintext-context.xml | 35 +
.../cloudstack/sha256salted/module.properties | 18 +
.../spring-sha256salted-context.xml | 34 +
pom.xml | 15 +-
python/lib/cloudutils/serviceConfig.py | 2 +-
quickcloud/pom.xml | 30 +
.../spring-quickcloud-core-context-override.xml | 32 +
.../vm/hypervisor/xenserver/setupxenserver.sh | 2 +-
scripts/vm/hypervisor/xenserver/vmops | 2 +-
server/conf/cloudstack-sudoers.in | 2 +-
server/pom.xml | 15 +-
.../spring-server-core-managers-context.xml | 214 ++
.../core/spring-server-core-misc-context.xml | 68 +
.../module.properties | 18 +
...ing-server-alert-adapter-backend-context.xml | 32 +
.../module.properties | 18 +
...ing-server-alert-adapter-compute-context.xml | 32 +
.../module.properties | 18 +
...ing-server-alert-adapter-storage-context.xml | 32 +
.../server-allocator/module.properties | 18 +
.../spring-server-allocator-context.xml | 48 +
.../cloudstack/server-api/module.properties | 18 +
.../server-api/spring-server-api-context.xml | 33 +
.../cloudstack/server-compute/module.properties | 18 +
.../spring-server-compute-context.xml | 38 +
.../server-discoverer/module.properties | 18 +
.../spring-server-discoverer-context.xml | 45 +
.../cloudstack/server-fencer/module.properties | 18 +
.../spring-server-fencer-context.xml | 37 +
.../server-investigator/module.properties | 18 +
.../spring-server-investigator-context.xml | 46 +
.../cloudstack/server-network/module.properties | 18 +
.../spring-server-network-context.xml | 64 +
.../cloudstack/server-planner/module.properties | 18 +
.../spring-server-planner-context.xml | 34 +
.../cloudstack/server-storage/module.properties | 18 +
.../spring-server-storage-context.xml | 34 +
.../server-template-adapter/module.properties | 18 +
.../spring-server-template-adapter-context.xml | 32 +
server/src/com/cloud/api/ApiResponseHelper.java | 22 +-
server/src/com/cloud/api/ApiServer.java | 72 +-
.../com/cloud/api/query/QueryManagerImpl.java | 59 +-
.../cloud/api/query/dao/UserVmJoinDaoImpl.java | 13 +-
.../com/cloud/api/query/vo/UserVmJoinVO.java | 15 +
.../com/cloud/capacity/CapacityManagerImpl.java | 321 +-
server/src/com/cloud/configuration/Config.java | 4 +-
.../configuration/ConfigurationManagerImpl.java | 925 ++---
.../consoleproxy/ConsoleProxyManagerImpl.java | 34 +-
.../consoleproxy/StaticConsoleProxyManager.java | 3 +
.../cloud/dc/dao/DedicatedResourceDaoImpl.java | 3 +-
.../deploy/DeploymentPlanningManagerImpl.java | 190 +-
.../com/cloud/event/ActionEventInterceptor.java | 33 +-
.../ha/HighAvailabilityManagerExtImpl.java | 7 +-
.../cloud/ha/dao/HighAvailabilityDaoImpl.java | 3 +-
.../cloud/hypervisor/HypervisorGuruBase.java | 6 +-
.../metadata/ResourceMetaDataManagerImpl.java | 116 +-
.../network/ExternalDeviceUsageManagerImpl.java | 155 +-
.../ExternalFirewallDeviceManagerImpl.java | 46 +-
.../ExternalLoadBalancerDeviceManagerImpl.java | 171 +-
.../com/cloud/network/IpAddressManagerImpl.java | 988 +++---
.../com/cloud/network/NetworkServiceImpl.java | 605 ++--
.../cloud/network/NetworkUsageManagerImpl.java | 50 +-
.../cloud/network/PortProfileManagerImpl.java | 39 +-
.../network/StorageNetworkManagerImpl.java | 169 +-
.../cloud/network/as/AutoScaleManagerImpl.java | 191 +-
.../network/element/VirtualRouterElement.java | 8 +-
.../network/firewall/FirewallManagerImpl.java | 93 +-
.../cloud/network/guru/DirectNetworkGuru.java | 121 +-
.../network/guru/DirectPodBasedNetworkGuru.java | 113 +-
.../cloud/network/guru/GuestNetworkGuru.java | 17 +-
.../cloud/network/guru/PublicNetworkGuru.java | 20 +-
.../lb/LoadBalancingRulesManagerImpl.java | 395 ++-
.../VirtualNetworkApplianceManagerImpl.java | 456 ++-
.../cloud/network/rules/RulesManagerImpl.java | 227 +-
.../security/SecurityGroupManagerImpl.java | 526 +--
.../network/vpc/NetworkACLManagerImpl.java | 40 +-
.../com/cloud/network/vpc/VpcManagerImpl.java | 639 ++--
.../network/vpn/RemoteAccessVpnManagerImpl.java | 228 +-
.../com/cloud/projects/ProjectManagerImpl.java | 365 +-
.../com/cloud/resource/ResourceManagerImpl.java | 305 +-
.../resourcelimit/ResourceLimitManagerImpl.java | 333 +-
.../cloud/server/ConfigurationServerImpl.java | 637 ++--
.../com/cloud/server/ManagementServerImpl.java | 47 +-
server/src/com/cloud/server/StatsCollector.java | 247 +-
.../com/cloud/servlet/CloudStartupServlet.java | 3 +-
.../com/cloud/servlet/ConsoleProxyServlet.java | 3 +-
.../com/cloud/storage/StorageManagerImpl.java | 30 +-
.../com/cloud/storage/VolumeApiServiceImpl.java | 32 +-
.../storage/snapshot/SnapshotManagerImpl.java | 68 +-
.../cloud/tags/TaggedResourceManagerImpl.java | 110 +-
.../com/cloud/template/TemplateAdapterBase.java | 17 +
.../com/cloud/template/TemplateManagerImpl.java | 42 +-
server/src/com/cloud/test/DatabaseConfig.java | 67 +-
server/src/com/cloud/test/IPRangeConfig.java | 15 +-
server/src/com/cloud/test/PodZoneConfig.java | 7 +-
.../src/com/cloud/usage/UsageServiceImpl.java | 28 +-
.../src/com/cloud/user/AccountManagerImpl.java | 192 +-
.../src/com/cloud/user/DomainManagerImpl.java | 70 +-
.../cloud/uuididentity/dao/IdentityDaoImpl.java | 13 +-
server/src/com/cloud/vm/UserVmManagerImpl.java | 714 ++--
.../vm/snapshot/VMSnapshotManagerImpl.java | 45 +-
.../affinity/AffinityGroupServiceImpl.java | 107 +-
.../lb/ApplicationLoadBalancerManagerImpl.java | 52 +-
.../cloudstack/region/RegionManagerImpl.java | 2 +-
.../GlobalLoadBalancingRulesServiceImpl.java | 219 +-
.../configuration/ConfigurationManagerTest.java | 20 +-
.../cloud/network/CreatePrivateNetworkTest.java | 6 +-
.../network/DedicateGuestVlanRangesTest.java | 18 +-
.../network/UpdatePhysicalNetworkTest.java | 5 +-
.../vpn/MockRemoteAccessVPNServiceProvider.java | 5 +-
.../cloud/vpc/MockConfigurationManagerImpl.java | 2 +-
.../cloud/vpc/dao/MockConfigurationDaoImpl.java | 11 +-
.../CreateNetworkOfferingTest.java | 20 +-
.../cloudstack/region/RegionManagerTest.java | 29 +-
...GlobalLoadBalancingRulesServiceImplTest.java | 28 +-
.../module.properties | 18 +
...ing-secondary-storage-discoverer-context.xml | 36 +
setup/db/db/schema-420to421.sql | 190 +-
setup/db/db/schema-421to430.sql | 2 +
setup/dev/advanced.cfg | 6 +-
.../debian/config/etc/init.d/cloud-early-config | 1 +
.../debian/config/opt/cloud/bin/savepassword.sh | 65 +
.../redundant_router/check_heartbeat.sh.templ | 5 +-
.../config/root/redundant_router/fault.sh.templ | 4 +
.../patches/debian/config/root/savepassword.sh | 58 -
.../component/test_egress_fw_rules.py | 108 +-
.../component/test_persistent_networks.py | 290 ++
tools/appliance/definitions/devcloud/base.sh | 2 +-
.../definitions/systemvm64template/base.sh | 2 +-
.../systemvm64template/postinstall.sh | 2 +-
.../definitions/systemvmtemplate/base.sh | 2 +-
.../definitions/systemvmtemplate/postinstall.sh | 2 +-
.../src/deps/boxes/basebox-build/postinstall.sh | 2 +-
tools/marvin/marvin/cloudstackConnection.py | 120 +-
tools/marvin/marvin/cloudstackTestClient.py | 55 +-
tools/marvin/marvin/codegenerator.py | 2 +-
tools/marvin/marvin/codes.py | 35 +
tools/marvin/marvin/configGenerator.py | 9 +-
tools/marvin/marvin/deployDataCenter.py | 54 +-
ui/css/cloudstack3.css | 23 +-
ui/dictionary.jsp | 2 +
ui/index.jsp | 3229 +++++++++---------
ui/scripts/accounts.js | 30 +
ui/scripts/instanceWizard.js | 3 +
ui/scripts/instances.js | 51 +-
ui/scripts/network.js | 4 +-
ui/scripts/sharedFunctions.js | 1 +
ui/scripts/storage.js | 2 +-
ui/scripts/system.js | 38 +-
ui/scripts/templates.js | 105 +-
ui/scripts/ui-custom/instanceWizard.js | 67 +-
ui/scripts/ui/dialog.js | 10 +-
ui/scripts/ui/widgets/detailView.js | 7 +
usage/src/com/cloud/usage/UsageManagerImpl.java | 16 +-
.../src/com/cloud/usage/UsageSanityChecker.java | 4 +-
utils/pom.xml | 29 +
utils/src/com/cloud/utils/DateUtil.java | 41 +-
utils/src/com/cloud/utils/PropertiesUtil.java | 16 +
.../cloud/utils/component/ComponentContext.java | 27 +-
.../cloud/utils/exception/ExceptionUtil.java | 12 +
utils/src/com/cloud/utils/net/NetUtils.java | 12 +
utils/src/com/cloud/utils/ssh/SshHelper.java | 10 +-
.../com/cloud/utils/PropertiesUtilsTest.java | 41 +
.../utils/exception/ExceptionUtilTest.java | 48 +
640 files changed, 23160 insertions(+), 13139 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/7a1ee002/client/tomcatconf/commands.properties.in
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/7a1ee002/engine/storage/datamotion/src/org/apache/cloudstack/storage/motion/AncientDataMotionStrategy.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/7a1ee002/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/XenserverSnapshotStrategy.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/7a1ee002/engine/storage/src/org/apache/cloudstack/storage/image/db/SnapshotDataStoreDaoImpl.java
----------------------------------------------------------------------
diff --cc engine/storage/src/org/apache/cloudstack/storage/image/db/SnapshotDataStoreDaoImpl.java
index 913112c,48416a2..d566b31
--- a/engine/storage/src/org/apache/cloudstack/storage/image/db/SnapshotDataStoreDaoImpl.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/image/db/SnapshotDataStoreDaoImpl.java
@@@ -40,8 -40,8 +40,8 @@@ import com.cloud.utils.db.DB
import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.TransactionLegacy;
import com.cloud.utils.db.SearchCriteria.Op;
- import com.cloud.utils.db.Transaction;
++import com.cloud.utils.db.TransactionLegacy;
import com.cloud.utils.db.UpdateBuilder;
@Component
@@@ -171,16 -171,6 +171,16 @@@ public class SnapshotDataStoreDaoImpl e
}
@Override
+ public void deleteSnapshotRecordsOnPrimary() {
+ SearchCriteria<SnapshotDataStoreVO> sc = storeSearch.create();
+ sc.setParameters("store_role", DataStoreRole.Primary);
- Transaction txn = Transaction.currentTxn();
++ TransactionLegacy txn = TransactionLegacy.currentTxn();
+ txn.start();
+ remove(sc);
+ txn.commit();
+ }
+
+ @Override
public SnapshotDataStoreVO findByStoreSnapshot(DataStoreRole role, long storeId, long snapshotId) {
SearchCriteria<SnapshotDataStoreVO> sc = storeSnapshotSearch.create();
sc.setParameters("store_id", storeId);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/7a1ee002/engine/storage/src/org/apache/cloudstack/storage/image/db/TemplateDataStoreDaoImpl.java
----------------------------------------------------------------------
diff --cc engine/storage/src/org/apache/cloudstack/storage/image/db/TemplateDataStoreDaoImpl.java
index 5c1ec33,4509e23..b7c70cc
--- a/engine/storage/src/org/apache/cloudstack/storage/image/db/TemplateDataStoreDaoImpl.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/image/db/TemplateDataStoreDaoImpl.java
@@@ -47,9 -43,8 +47,9 @@@ import com.cloud.utils.db.GenericDaoBas
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
import com.cloud.utils.db.SearchCriteria.Op;
- import com.cloud.utils.db.Transaction;
+ import com.cloud.utils.db.TransactionLegacy;
import com.cloud.utils.db.UpdateBuilder;
+import com.cloud.utils.exception.CloudRuntimeException;
@Component
public class TemplateDataStoreDaoImpl extends GenericDaoBase<TemplateDataStoreVO, Long> implements TemplateDataStoreDao {
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/7a1ee002/engine/storage/src/org/apache/cloudstack/storage/image/db/VolumeDataStoreDaoImpl.java
----------------------------------------------------------------------
diff --cc engine/storage/src/org/apache/cloudstack/storage/image/db/VolumeDataStoreDaoImpl.java
index 4118079,2bacd03..ef0a8c5
--- a/engine/storage/src/org/apache/cloudstack/storage/image/db/VolumeDataStoreDaoImpl.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/image/db/VolumeDataStoreDaoImpl.java
@@@ -34,8 -33,8 +34,8 @@@ import org.apache.cloudstack.storage.da
import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.TransactionLegacy;
import com.cloud.utils.db.SearchCriteria.Op;
- import com.cloud.utils.db.Transaction;
++import com.cloud.utils.db.TransactionLegacy;
import com.cloud.utils.db.UpdateBuilder;
@Component
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/7a1ee002/server/src/com/cloud/server/ManagementServerImpl.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/server/ManagementServerImpl.java
index e3d4137,bce6b45..5273203
--- a/server/src/com/cloud/server/ManagementServerImpl.java
+++ b/server/src/com/cloud/server/ManagementServerImpl.java
@@@ -2214,27 -2215,26 +2217,26 @@@ public class ManagementServerImpl exten
}
}
- Transaction txn = Transaction.currentTxn();
-
- txn.start();
-
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
- if (domainName != null) {
- String updatedDomainPath = getUpdatedDomainPath(domain.getPath(), domainName);
- updateDomainChildren(domain, updatedDomainPath);
- domain.setName(domainName);
- domain.setPath(updatedDomainPath);
- }
-
- if (networkDomain != null) {
- if (networkDomain.isEmpty()) {
- domain.setNetworkDomain(null);
- } else {
- domain.setNetworkDomain(networkDomain);
- }
- }
- _domainDao.update(domainId, domain);
+ if (domainName != null) {
+ String updatedDomainPath = getUpdatedDomainPath(domain.getPath(), domainName);
+ updateDomainChildren(domain, updatedDomainPath);
+ domain.setName(domainName);
+ domain.setPath(updatedDomainPath);
+ }
+
+ if (networkDomain != null) {
+ if (networkDomain.isEmpty()) {
+ domain.setNetworkDomain(null);
+ } else {
+ domain.setNetworkDomain(networkDomain);
+ }
+ }
+ _domainDao.update(domainId, domain);
-
- txn.commit();
+ }
+ });
return _domainDao.findById(domainId);
@@@ -3671,35 -3670,30 +3673,30 @@@
throw new InvalidParameterValueException("This operation is not supported for this hypervisor type");
}
// get all the hosts in this cluster
- List<HostVO> hosts = _resourceMgr.listAllHostsInCluster(cmd.getClusterId());
- Transaction txn = Transaction.currentTxn();
- try {
- txn.start();
+ final List<HostVO> hosts = _resourceMgr.listAllHostsInCluster(cmd.getClusterId());
+
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
- for (HostVO h : hosts) {
- if (s_logger.isDebugEnabled()) {
- s_logger.debug("Changing password for host name = " + h.getName());
- }
- // update password for this host
- DetailVO nv = _detailsDao.findDetail(h.getId(), ApiConstants.USERNAME);
- if (nv.getValue().equals(cmd.getUsername())) {
- DetailVO nvp = _detailsDao.findDetail(h.getId(), ApiConstants.PASSWORD);
- nvp.setValue(DBEncryptionUtil.encrypt(cmd.getPassword()));
- _detailsDao.persist(nvp);
- } else {
- // if one host in the cluster has diff username then
- // rollback to maintain consistency
- throw new InvalidParameterValueException(
- "The username is not same for all hosts, please modify passwords for individual hosts.");
- }
+ for (HostVO h : hosts) {
+ if (s_logger.isDebugEnabled()) {
+ s_logger.debug("Changing password for host name = " + h.getName());
+ }
+ // update password for this host
+ DetailVO nv = _detailsDao.findDetail(h.getId(), ApiConstants.USERNAME);
+ if (nv.getValue().equals(cmd.getUsername())) {
+ DetailVO nvp = _detailsDao.findDetail(h.getId(), ApiConstants.PASSWORD);
+ nvp.setValue(DBEncryptionUtil.encrypt(cmd.getPassword()));
+ _detailsDao.persist(nvp);
+ } else {
+ // if one host in the cluster has diff username then
+ // rollback to maintain consistency
- txn.rollback();
+ throw new InvalidParameterValueException(
+ "The username is not same for all hosts, please modify passwords for individual hosts.");
}
}
- txn.commit();
- // if hypervisor is xenserver then we update it in
- // CitrixResourceBase
- } catch (Exception e) {
- txn.rollback();
- throw new CloudRuntimeException("Failed to update password " + e.getMessage());
+ }
+ });
}
return true;
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/7a1ee002/server/src/com/cloud/storage/StorageManagerImpl.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/storage/StorageManagerImpl.java
index eaefcb2,75cedd0..8e199ee
--- a/server/src/com/cloud/storage/StorageManagerImpl.java
+++ b/server/src/com/cloud/storage/StorageManagerImpl.java
@@@ -1810,17 -1782,20 +1814,20 @@@ public class StorageManagerImpl extend
}
// ready to delete
- Transaction txn = Transaction.currentTxn();
- txn.start();
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
- // first delete from image_store_details table, we need to do that since
- // we are not actually deleting record from main
- // image_data_store table, so delete cascade will not work
- _imageStoreDetailsDao.deleteDetails(storeId);
- _snapshotStoreDao.deletePrimaryRecordsForStore(storeId, DataStoreRole.Image);
- _volumeStoreDao.deletePrimaryRecordsForStore(storeId);
- _templateStoreDao.deletePrimaryRecordsForStore(storeId);
- _imageStoreDao.remove(storeId);
+ // first delete from image_store_details table, we need to do that since
+ // we are not actually deleting record from main
+ // image_data_store table, so delete cascade will not work
+ _imageStoreDetailsDao.deleteDetails(storeId);
+ _snapshotStoreDao.deletePrimaryRecordsForStore(storeId, DataStoreRole.Image);
+ _volumeStoreDao.deletePrimaryRecordsForStore(storeId);
+ _templateStoreDao.deletePrimaryRecordsForStore(storeId);
+ _imageStoreDao.remove(storeId);
- txn.commit();
+ }
+ });
+
return true;
}
@@@ -1919,17 -1894,20 +1926,20 @@@
}
// ready to delete
- Transaction txn = Transaction.currentTxn();
- txn.start();
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
- // first delete from image_store_details table, we need to do that since
- // we are not actually deleting record from main
- // image_data_store table, so delete cascade will not work
- _imageStoreDetailsDao.deleteDetails(storeId);
- _snapshotStoreDao.deletePrimaryRecordsForStore(storeId, DataStoreRole.ImageCache);
- _volumeStoreDao.deletePrimaryRecordsForStore(storeId);
- _templateStoreDao.deletePrimaryRecordsForStore(storeId);
- _imageStoreDao.remove(storeId);
+ // first delete from image_store_details table, we need to do that since
+ // we are not actually deleting record from main
+ // image_data_store table, so delete cascade will not work
+ _imageStoreDetailsDao.deleteDetails(storeId);
+ _snapshotStoreDao.deletePrimaryRecordsForStore(storeId, DataStoreRole.ImageCache);
+ _volumeStoreDao.deletePrimaryRecordsForStore(storeId);
+ _templateStoreDao.deletePrimaryRecordsForStore(storeId);
+ _imageStoreDao.remove(storeId);
- txn.commit();
+ }
+ });
+
return true;
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/7a1ee002/server/src/com/cloud/storage/VolumeApiServiceImpl.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/storage/VolumeApiServiceImpl.java
index 12f0102,071281c..cfb54f0
--- a/server/src/com/cloud/storage/VolumeApiServiceImpl.java
+++ b/server/src/com/cloud/storage/VolumeApiServiceImpl.java
@@@ -404,35 -405,35 +406,35 @@@ public class VolumeApiServiceImpl exten
}
@DB
- protected VolumeVO persistVolume(Account owner, Long zoneId, String volumeName, String url, String format) {
-
- Transaction txn = Transaction.currentTxn();
- txn.start();
-
+ protected VolumeVO persistVolume(final Account owner, final Long zoneId, final String volumeName, final String url, final String format) {
+ return Transaction.execute(new TransactionCallback<VolumeVO>() {
+ @Override
+ public VolumeVO doInTransaction(TransactionStatus status) {
- VolumeVO volume = new VolumeVO(volumeName, zoneId, -1, -1, -1, new Long(-1), null, null, 0, Volume.Type.DATADISK);
- volume.setPoolId(null);
- volume.setDataCenterId(zoneId);
- volume.setPodId(null);
- volume.setAccountId(owner.getAccountId());
- volume.setDomainId(owner.getDomainId());
- long diskOfferingId = _diskOfferingDao.findByUniqueName("Cloud.com-Custom").getId();
- volume.setDiskOfferingId(diskOfferingId);
- // volume.setSize(size);
- volume.setInstanceId(null);
- volume.setUpdated(new Date());
- volume.setDomainId((owner == null) ? Domain.ROOT_DOMAIN : owner.getDomainId());
- volume.setFormat(ImageFormat.valueOf(format));
- volume = _volsDao.persist(volume);
- CallContext.current().setEventDetails("Volume Id: " + volume.getId());
-
- // Increment resource count during allocation; if actual creation fails,
- // decrement it
- _resourceLimitMgr.incrementResourceCount(volume.getAccountId(), ResourceType.volume);
- _resourceLimitMgr.incrementResourceCount(volume.getAccountId(), ResourceType.secondary_storage, UriUtils.getRemoteSize(url));
-
- return volume;
- }
+ VolumeVO volume = new VolumeVO(volumeName, zoneId, -1, -1, -1, new Long(-1), null, null, 0, Volume.Type.DATADISK);
+ volume.setPoolId(null);
+ volume.setDataCenterId(zoneId);
+ volume.setPodId(null);
+ volume.setAccountId(owner.getAccountId());
+ volume.setDomainId(owner.getDomainId());
+ long diskOfferingId = _diskOfferingDao.findByUniqueName("Cloud.com-Custom").getId();
+ volume.setDiskOfferingId(diskOfferingId);
+ // volume.setSize(size);
+ volume.setInstanceId(null);
+ volume.setUpdated(new Date());
+ volume.setDomainId((owner == null) ? Domain.ROOT_DOMAIN : owner.getDomainId());
+ volume.setFormat(ImageFormat.valueOf(format));
+ volume = _volsDao.persist(volume);
+ CallContext.current().setEventDetails("Volume Id: " + volume.getId());
+
+ // Increment resource count during allocation; if actual creation fails,
+ // decrement it
+ _resourceLimitMgr.incrementResourceCount(volume.getAccountId(), ResourceType.volume);
+ _resourceLimitMgr.incrementResourceCount(volume.getAccountId(), ResourceType.secondary_storage, UriUtils.getRemoteSize(url));
+
- txn.commit();
+ return volume;
+ }
+ });
+ }
/*
* Just allocate a volume in the database, don't send the createvolume cmd
@@@ -600,48 -601,56 +602,56 @@@
userSpecifiedName = getRandomVolumeName();
}
- Transaction txn = Transaction.currentTxn();
- txn.start();
+ VolumeVO volume = commitVolume(cmd, caller, ownerId, displayVolumeEnabled, zoneId, diskOfferingId, size,
+ minIops, maxIops, parentVolume, userSpecifiedName);
+ return volume;
+ }
+
+ private VolumeVO commitVolume(final CreateVolumeCmd cmd, final Account caller, final long ownerId, final Boolean displayVolumeEnabled,
+ final Long zoneId, final Long diskOfferingId, final Long size, final Long minIops, final Long maxIops, final VolumeVO parentVolume,
+ final String userSpecifiedName) {
+ return Transaction.execute(new TransactionCallback<VolumeVO>() {
+ @Override
+ public VolumeVO doInTransaction(TransactionStatus status) {
- VolumeVO volume = new VolumeVO(userSpecifiedName, -1, -1, -1, -1, new Long(-1), null, null, 0, Volume.Type.DATADISK);
- volume.setPoolId(null);
- volume.setDataCenterId(zoneId);
- volume.setPodId(null);
- volume.setAccountId(ownerId);
- volume.setDomainId(((caller == null) ? Domain.ROOT_DOMAIN : caller.getDomainId()));
- volume.setDiskOfferingId(diskOfferingId);
- volume.setSize(size);
- volume.setMinIops(minIops);
- volume.setMaxIops(maxIops);
- volume.setInstanceId(null);
- volume.setUpdated(new Date());
- volume.setDomainId((caller == null) ? Domain.ROOT_DOMAIN : caller.getDomainId());
- volume.setDisplayVolume(displayVolumeEnabled);
- if (parentVolume != null) {
- volume.setTemplateId(parentVolume.getTemplateId());
- volume.setFormat(parentVolume.getFormat());
- } else {
- volume.setTemplateId(null);
- }
-
- volume = _volsDao.persist(volume);
- if (cmd.getSnapshotId() == null) {
- // for volume created from snapshot, create usage event after volume creation
- UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VOLUME_CREATE, volume.getAccountId(), volume.getDataCenterId(), volume.getId(), volume.getName(), diskOfferingId,
- null, size, Volume.class.getName(), volume.getUuid());
- }
-
- CallContext.current().setEventDetails("Volume Id: " + volume.getId());
-
- // Increment resource count during allocation; if actual creation fails,
- // decrement it
- _resourceLimitMgr.incrementResourceCount(volume.getAccountId(), ResourceType.volume);
- _resourceLimitMgr.incrementResourceCount(volume.getAccountId(), ResourceType.primary_storage, new Long(volume.getSize()));
- return volume;
- }
+ VolumeVO volume = new VolumeVO(userSpecifiedName, -1, -1, -1, -1, new Long(-1), null, null, 0, Volume.Type.DATADISK);
+ volume.setPoolId(null);
+ volume.setDataCenterId(zoneId);
+ volume.setPodId(null);
+ volume.setAccountId(ownerId);
+ volume.setDomainId(((caller == null) ? Domain.ROOT_DOMAIN : caller.getDomainId()));
+ volume.setDiskOfferingId(diskOfferingId);
+ volume.setSize(size);
+ volume.setMinIops(minIops);
+ volume.setMaxIops(maxIops);
+ volume.setInstanceId(null);
+ volume.setUpdated(new Date());
+ volume.setDomainId((caller == null) ? Domain.ROOT_DOMAIN : caller.getDomainId());
+ volume.setDisplayVolume(displayVolumeEnabled);
+ if (parentVolume != null) {
+ volume.setTemplateId(parentVolume.getTemplateId());
+ volume.setFormat(parentVolume.getFormat());
+ } else {
+ volume.setTemplateId(null);
+ }
+
+ volume = _volsDao.persist(volume);
+ if (cmd.getSnapshotId() == null) {
+ // for volume created from snapshot, create usage event after volume creation
+ UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VOLUME_CREATE, volume.getAccountId(), volume.getDataCenterId(), volume.getId(), volume.getName(), diskOfferingId,
+ null, size, Volume.class.getName(), volume.getUuid());
+ }
+
+ CallContext.current().setEventDetails("Volume Id: " + volume.getId());
+
+ // Increment resource count during allocation; if actual creation fails,
+ // decrement it
+ _resourceLimitMgr.incrementResourceCount(volume.getAccountId(), ResourceType.volume);
+ _resourceLimitMgr.incrementResourceCount(volume.getAccountId(), ResourceType.primary_storage, new Long(volume.getSize()));
-
- txn.commit();
-
+ return volume;
+ }
+ });
+ }
public boolean validateVolumeSizeRange(long size) {
if (size < 0 || (size > 0 && size < (1024 * 1024 * 1024))) {
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/7a1ee002/server/src/com/cloud/template/TemplateManagerImpl.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/template/TemplateManagerImpl.java
index 3b2ec58,fb1bb27..aa4473d
--- a/server/src/com/cloud/template/TemplateManagerImpl.java
+++ b/server/src/com/cloud/template/TemplateManagerImpl.java
@@@ -1290,28 -1284,31 +1290,31 @@@ public class TemplateManagerImpl extend
//Derive the domain id from the template owner as updateTemplatePermissions is not cross domain operation
Account owner = _accountMgr.getAccount(ownerId);
- Domain domain = _domainDao.findById(owner.getDomainId());
+ final Domain domain = _domainDao.findById(owner.getDomainId());
if ("add".equalsIgnoreCase(operation)) {
- txn.start();
- for (String accountName : accountNames) {
+ final List<String> accountNamesFinal = accountNames;
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
+ for (String accountName : accountNamesFinal) {
- Account permittedAccount = _accountDao.findActiveAccount(accountName, domain.getId());
- if (permittedAccount != null) {
- if (permittedAccount.getId() == caller.getId()) {
- continue; // don't grant permission to the template
- // owner, they implicitly have permission
- }
- LaunchPermissionVO existingPermission = _launchPermissionDao.findByTemplateAndAccount(id, permittedAccount.getId());
- if (existingPermission == null) {
- LaunchPermissionVO launchPermission = new LaunchPermissionVO(id, permittedAccount.getId());
- _launchPermissionDao.persist(launchPermission);
- }
- } else {
- throw new InvalidParameterValueException("Unable to grant a launch permission to account " + accountName + " in domain id=" + domain.getUuid()
- + ", account not found. " + "No permissions updated, please verify the account names and retry.");
- }
+ Account permittedAccount = _accountDao.findActiveAccount(accountName, domain.getId());
+ if (permittedAccount != null) {
+ if (permittedAccount.getId() == caller.getId()) {
+ continue; // don't grant permission to the template
+ // owner, they implicitly have permission
}
+ LaunchPermissionVO existingPermission = _launchPermissionDao.findByTemplateAndAccount(id, permittedAccount.getId());
+ if (existingPermission == null) {
+ LaunchPermissionVO launchPermission = new LaunchPermissionVO(id, permittedAccount.getId());
+ _launchPermissionDao.persist(launchPermission);
+ }
+ } else {
- txn.rollback();
+ throw new InvalidParameterValueException("Unable to grant a launch permission to account " + accountName + " in domain id=" + domain.getUuid()
+ + ", account not found. " + "No permissions updated, please verify the account names and retry.");
+ }
+ }
- txn.commit();
+ }
+ });
} else if ("remove".equalsIgnoreCase(operation)) {
List<Long> accountIds = new ArrayList<Long>();
for (String accountName : accountNames) {
@@@ -1434,26 -1431,31 +1437,31 @@@
zoneId, accountId, volumeId);
}*/
if (privateTemplate == null) {
- Transaction txn = Transaction.currentTxn();
- txn.start();
+ final VolumeVO volumeFinal = volume;
+ final SnapshotVO snapshotFinal = snapshot;
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
- // template_store_ref entries should have been removed using our
- // DataObject.processEvent command in case of failure, but clean
- // it up here to avoid
- // some leftovers which will cause removing template from
- // vm_template table fail.
- _tmplStoreDao.deletePrimaryRecordsForTemplate(templateId);
- // Remove the template_zone_ref record
- _tmpltZoneDao.deletePrimaryRecordsForTemplate(templateId);
- // Remove the template record
- _tmpltDao.expunge(templateId);
-
- // decrement resource count
- if (accountId != null) {
- _resourceLimitMgr.decrementResourceCount(accountId, ResourceType.template);
+ // template_store_ref entries should have been removed using our
+ // DataObject.processEvent command in case of failure, but clean
+ // it up here to avoid
+ // some leftovers which will cause removing template from
+ // vm_template table fail.
+ _tmplStoreDao.deletePrimaryRecordsForTemplate(templateId);
+ // Remove the template_zone_ref record
+ _tmpltZoneDao.deletePrimaryRecordsForTemplate(templateId);
+ // Remove the template record
+ _tmpltDao.expunge(templateId);
+
+ // decrement resource count
+ if (accountId != null) {
+ _resourceLimitMgr.decrementResourceCount(accountId, ResourceType.template);
- _resourceLimitMgr.decrementResourceCount(accountId, ResourceType.secondary_storage, new Long(volume != null ? volume.getSize()
- : snapshot.getSize()));
+ _resourceLimitMgr.decrementResourceCount(accountId, ResourceType.secondary_storage, new Long(volumeFinal != null ? volumeFinal.getSize()
+ : snapshotFinal.getSize()));
- }
+ }
- txn.commit();
+ }
+ });
+
}
}
[2/8] git commit: updated refs/heads/object_store_migration to 9da56fe
Posted by mc...@apache.org.
Mark templates stored in current NFS secondary storage as cross-zones
when we invoke prepareSecondaryStorageForMigrationCmd.
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/1b07c334
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/1b07c334
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/1b07c334
Branch: refs/heads/object_store_migration
Commit: 1b07c3348174a56d81d951febd33d24032fe4b32
Parents: 6935dd2
Author: Min Chen <mi...@citrix.com>
Authored: Mon Oct 21 11:52:12 2013 -0700
Committer: Min Chen <mi...@citrix.com>
Committed: Mon Oct 21 11:52:12 2013 -0700
----------------------------------------------------------------------
.../subsystem/api/storage/TemplateService.java | 4 +++-
.../storage/image/TemplateServiceImpl.java | 11 +++++----
.../image/db/TemplateDataStoreDaoImpl.java | 25 ++++++++++++++++++++
3 files changed, 34 insertions(+), 6 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1b07c334/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/TemplateService.java
----------------------------------------------------------------------
diff --git a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/TemplateService.java b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/TemplateService.java
index 4950597..0d8b3c1 100644
--- a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/TemplateService.java
+++ b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/TemplateService.java
@@ -36,7 +36,7 @@ public interface TemplateService {
}
public TemplateInfo getTemplate() {
- return this.template;
+ return template;
}
}
@@ -62,5 +62,7 @@ public interface TemplateService {
void addSystemVMTemplatesToSecondary(DataStore store);
+ void associateTemplateToZone(long templateId, Long zoneId);
+
void associateCrosszoneTemplatesToZone(long dcId);
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1b07c334/engine/storage/image/src/org/apache/cloudstack/storage/image/TemplateServiceImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/image/src/org/apache/cloudstack/storage/image/TemplateServiceImpl.java b/engine/storage/image/src/org/apache/cloudstack/storage/image/TemplateServiceImpl.java
index a68e40c..06cb652 100644
--- a/engine/storage/image/src/org/apache/cloudstack/storage/image/TemplateServiceImpl.java
+++ b/engine/storage/image/src/org/apache/cloudstack/storage/image/TemplateServiceImpl.java
@@ -28,6 +28,9 @@ import java.util.Set;
import javax.inject.Inject;
+import org.apache.log4j.Logger;
+import org.springframework.stereotype.Component;
+
import org.apache.cloudstack.engine.subsystem.api.storage.CopyCommandResult;
import org.apache.cloudstack.engine.subsystem.api.storage.CreateCmdResult;
import org.apache.cloudstack.engine.subsystem.api.storage.DataMotionService;
@@ -59,9 +62,6 @@ import org.apache.cloudstack.storage.image.datastore.ImageStoreEntity;
import org.apache.cloudstack.storage.image.store.TemplateObject;
import org.apache.cloudstack.storage.to.TemplateObjectTO;
-import org.apache.log4j.Logger;
-import org.springframework.stereotype.Component;
-
import com.cloud.agent.api.Answer;
import com.cloud.agent.api.storage.ListTemplateAnswer;
import com.cloud.agent.api.storage.ListTemplateCommand;
@@ -73,8 +73,8 @@ import com.cloud.dc.dao.DataCenterDao;
import com.cloud.exception.ResourceAllocationException;
import com.cloud.hypervisor.Hypervisor.HypervisorType;
import com.cloud.storage.DataStoreRole;
-import com.cloud.storage.StoragePool;
import com.cloud.storage.Storage.TemplateType;
+import com.cloud.storage.StoragePool;
import com.cloud.storage.VMTemplateStorageResourceAssoc.Status;
import com.cloud.storage.VMTemplateVO;
import com.cloud.storage.VMTemplateZoneVO;
@@ -466,7 +466,8 @@ public class TemplateServiceImpl implements TemplateService {
// persist entry in template_zone_ref table. zoneId can be empty for
// region-wide image store, in that case,
// we will associate the template to all the zones.
- private void associateTemplateToZone(long templateId, Long zoneId) {
+ @Override
+ public void associateTemplateToZone(long templateId, Long zoneId) {
List<Long> dcs = new ArrayList<Long>();
if (zoneId != null) {
dcs.add(zoneId);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1b07c334/engine/storage/src/org/apache/cloudstack/storage/image/db/TemplateDataStoreDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/db/TemplateDataStoreDaoImpl.java b/engine/storage/src/org/apache/cloudstack/storage/image/db/TemplateDataStoreDaoImpl.java
index a102537..008180f 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/image/db/TemplateDataStoreDaoImpl.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/image/db/TemplateDataStoreDaoImpl.java
@@ -33,18 +33,22 @@ import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine.Event;
import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine.State;
+import org.apache.cloudstack.engine.subsystem.api.storage.TemplateService;
import org.apache.cloudstack.engine.subsystem.api.storage.ZoneScope;
import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreDao;
import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreVO;
import com.cloud.storage.DataStoreRole;
import com.cloud.storage.VMTemplateStorageResourceAssoc.Status;
+import com.cloud.storage.VMTemplateVO;
+import com.cloud.storage.dao.VMTemplateDao;
import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
import com.cloud.utils.db.SearchCriteria.Op;
import com.cloud.utils.db.Transaction;
import com.cloud.utils.db.UpdateBuilder;
+import com.cloud.utils.exception.CloudRuntimeException;
@Component
public class TemplateDataStoreDaoImpl extends GenericDaoBase<TemplateDataStoreVO, Long> implements TemplateDataStoreDao {
@@ -61,6 +65,11 @@ public class TemplateDataStoreDaoImpl extends GenericDaoBase<TemplateDataStoreVO
@Inject
private DataStoreManager _storeMgr;
+ @Inject
+ private VMTemplateDao _tmpltDao;
+ @Inject
+ private TemplateService _tmplSrv;
+
@Override
public boolean configure(String name, Map<String, Object> params) throws ConfigurationException {
super.configure(name, params);
@@ -368,8 +377,24 @@ public class TemplateDataStoreDaoImpl extends GenericDaoBase<TemplateDataStoreVO
ts.setRefCnt(tmpl.getRefCnt() + 1); // increase ref_cnt so that this will not be recycled before the content is pushed to region-wide store
persist(ts);
}
+
+ // mark template as cross-zones and add template_zone association
+ for (TemplateDataStoreVO tmpl : tmpls) {
+ long templateId = tmpl.getTemplateId();
+ VMTemplateVO template = _tmpltDao.findById(templateId);
+ if (template == null) {
+ throw new CloudRuntimeException("No template is found for template id: " + templateId);
+ }
+ // mark the template as cross-zones
+ template.setCrossZones(true);
+ _tmpltDao.update(templateId, template);
+ // add template_zone_ref association for these cross-zone templates
+ _tmplSrv.associateTemplateToZone(templateId, null);
+ }
+
}
+
}
}
[5/8] git commit: updated refs/heads/object_store_migration to 9da56fe
Posted by mc...@apache.org.
Modify various cache object deletion cases in orchestration layer to
handle cache store migrated from previous secondary storage.
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/1722c480
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/1722c480
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/1722c480
Branch: refs/heads/object_store_migration
Commit: 1722c48087f663c1931814c36802cace1a52d898
Parents: 730832d
Author: Min Chen <mi...@citrix.com>
Authored: Wed Oct 23 15:16:52 2013 -0700
Committer: Min Chen <mi...@citrix.com>
Committed: Wed Oct 23 15:16:52 2013 -0700
----------------------------------------------------------------------
.../motion/AncientDataMotionStrategy.java | 30 +++++++++++++-------
.../storage/image/TemplateServiceImpl.java | 4 +++
2 files changed, 24 insertions(+), 10 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1722c480/engine/storage/datamotion/src/org/apache/cloudstack/storage/motion/AncientDataMotionStrategy.java
----------------------------------------------------------------------
diff --git a/engine/storage/datamotion/src/org/apache/cloudstack/storage/motion/AncientDataMotionStrategy.java b/engine/storage/datamotion/src/org/apache/cloudstack/storage/motion/AncientDataMotionStrategy.java
index 5f5f01e..0d21047 100644
--- a/engine/storage/datamotion/src/org/apache/cloudstack/storage/motion/AncientDataMotionStrategy.java
+++ b/engine/storage/datamotion/src/org/apache/cloudstack/storage/motion/AncientDataMotionStrategy.java
@@ -22,6 +22,9 @@ import java.util.Map;
import javax.inject.Inject;
+import org.apache.log4j.Logger;
+import org.springframework.stereotype.Component;
+
import org.apache.cloudstack.engine.orchestration.service.VolumeOrchestrationService;
import org.apache.cloudstack.engine.subsystem.api.storage.ClusterScope;
import org.apache.cloudstack.engine.subsystem.api.storage.CopyCommandResult;
@@ -49,8 +52,6 @@ import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreDao;
import org.apache.cloudstack.storage.datastore.db.VolumeDataStoreDao;
import org.apache.cloudstack.storage.image.datastore.ImageStoreEntity;
import org.apache.cloudstack.storage.to.PrimaryDataStoreTO;
-import org.apache.log4j.Logger;
-import org.springframework.stereotype.Component;
import com.cloud.agent.api.Answer;
import com.cloud.agent.api.storage.MigrateVolumeAnswer;
@@ -211,7 +212,8 @@ AncientDataMotionStrategy implements DataMotionStrategy {
cacheMgr.deleteCacheObject(srcForCopy);
} else {
// for template, we want to leave it on cache for performance reason
- if (answer == null || !answer.getResult()) {
+ if ((answer == null || !answer.getResult()) && srcForCopy.getRefCount() < 2) {
+ // cache object created by this copy, not already there
cacheMgr.deleteCacheObject(srcForCopy);
} else {
cacheMgr.releaseCacheObject(srcForCopy);
@@ -248,6 +250,13 @@ AncientDataMotionStrategy implements DataMotionStrategy {
}
}
+ protected void releaseSnapshotCacheChain(SnapshotInfo snapshot) {
+ while (snapshot != null) {
+ cacheMgr.releaseCacheObject(snapshot);
+ snapshot = snapshot.getParent();
+ }
+ }
+
protected Answer copyVolumeFromSnapshot(DataObject snapObj, DataObject volObj) {
SnapshotInfo snapshot = (SnapshotInfo) snapObj;
StoragePool pool = (StoragePool) volObj.getDataStore();
@@ -281,7 +290,8 @@ AncientDataMotionStrategy implements DataMotionStrategy {
throw new CloudRuntimeException(basicErrMsg);
} finally {
if (!(storTO instanceof NfsTO)) {
- deleteSnapshotCacheChain((SnapshotInfo) srcData);
+ // still keep snapshot on cache which may be migrated from previous secondary storage
+ releaseSnapshotCacheChain((SnapshotInfo)srcData);
}
}
}
@@ -307,7 +317,7 @@ AncientDataMotionStrategy implements DataMotionStrategy {
if (cacheStore == null) {
// need to find a nfs or cifs image store, assuming that can't copy volume
// directly to s3
- ImageStoreEntity imageStore = (ImageStoreEntity) this.dataStoreMgr.getImageStore(destScope.getScopeId());
+ ImageStoreEntity imageStore = (ImageStoreEntity) dataStoreMgr.getImageStore(destScope.getScopeId());
if (!imageStore.getProtocol().equalsIgnoreCase("nfs") && !imageStore.getProtocol().equalsIgnoreCase("cifs")) {
s_logger.debug("can't find a nfs (or cifs) image store to satisfy the need for a staging store");
return null;
@@ -316,7 +326,7 @@ AncientDataMotionStrategy implements DataMotionStrategy {
DataObject objOnImageStore = imageStore.create(srcData);
objOnImageStore.processEvent(Event.CreateOnlyRequested);
- Answer answer = this.copyObject(srcData, objOnImageStore);
+ Answer answer = copyObject(srcData, objOnImageStore);
if (answer == null || !answer.getResult()) {
if (answer != null) {
s_logger.debug("copy to image store failed: " + answer.getDetails());
@@ -362,7 +372,7 @@ AncientDataMotionStrategy implements DataMotionStrategy {
protected Answer migrateVolumeToPool(DataObject srcData, DataObject destData) {
VolumeInfo volume = (VolumeInfo)srcData;
- StoragePool destPool = (StoragePool)this.dataStoreMgr.getDataStore(destData.getDataStore().getId(), DataStoreRole.Primary);
+ StoragePool destPool = (StoragePool)dataStoreMgr.getDataStore(destData.getDataStore().getId(), DataStoreRole.Primary);
MigrateVolumeCommand command = new MigrateVolumeCommand(volume.getId(), volume.getPath(), destPool);
EndPoint ep = selector.select(volume.getDataStore());
MigrateVolumeAnswer answer = (MigrateVolumeAnswer) ep.sendMessage(command);
@@ -371,14 +381,14 @@ AncientDataMotionStrategy implements DataMotionStrategy {
throw new CloudRuntimeException("Failed to migrate volume " + volume + " to storage pool " + destPool);
} else {
// Update the volume details after migration.
- VolumeVO volumeVo = this.volDao.findById(volume.getId());
+ VolumeVO volumeVo = volDao.findById(volume.getId());
Long oldPoolId = volume.getPoolId();
volumeVo.setPath(answer.getVolumePath());
volumeVo.setFolder(destPool.getPath());
volumeVo.setPodId(destPool.getPodId());
volumeVo.setPoolId(destPool.getId());
volumeVo.setLastPoolId(oldPoolId);
- this.volDao.update(volume.getId(), volumeVo);
+ volDao.update(volume.getId(), volumeVo);
}
return answer;
@@ -452,7 +462,7 @@ AncientDataMotionStrategy implements DataMotionStrategy {
// clean up snapshot copied to staging
if (needCache && srcData != null) {
- cacheMgr.deleteCacheObject(srcData);
+ cacheMgr.releaseCacheObject(srcData); // reduce ref count, but keep it there on cache which is converted from previous secondary storage
}
return answer;
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1722c480/engine/storage/image/src/org/apache/cloudstack/storage/image/TemplateServiceImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/image/src/org/apache/cloudstack/storage/image/TemplateServiceImpl.java b/engine/storage/image/src/org/apache/cloudstack/storage/image/TemplateServiceImpl.java
index 163c125..4121e85 100644
--- a/engine/storage/image/src/org/apache/cloudstack/storage/image/TemplateServiceImpl.java
+++ b/engine/storage/image/src/org/apache/cloudstack/storage/image/TemplateServiceImpl.java
@@ -42,6 +42,7 @@ import org.apache.cloudstack.engine.subsystem.api.storage.EndPointSelector;
import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine;
import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine.Event;
import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotInfo;
+import org.apache.cloudstack.engine.subsystem.api.storage.StorageCacheManager;
import org.apache.cloudstack.engine.subsystem.api.storage.TemplateDataFactory;
import org.apache.cloudstack.engine.subsystem.api.storage.TemplateInfo;
import org.apache.cloudstack.engine.subsystem.api.storage.TemplateService;
@@ -129,6 +130,8 @@ public class TemplateServiceImpl implements TemplateService {
TemplateManager _tmpltMgr;
@Inject
ConfigurationDao _configDao;
+ @Inject
+ StorageCacheManager _cacheMgr;
class TemplateOpContext<T> extends AsyncRpcContext<T> {
final TemplateObject template;
@@ -670,6 +673,7 @@ public class TemplateServiceImpl implements TemplateService {
throw new CloudRuntimeException("sync template from cache to region wide store failed for image store " + store.getName() + ":"
+ result.getResult());
}
+ _cacheMgr.releaseCacheObject(srcTemplate); // reduce reference count for template on cache, so it can recycled by schedule
} catch (Exception ex) {
throw new CloudRuntimeException("sync template from cache to region wide store failed for image store " + store.getName());
}
[6/8] git commit: updated refs/heads/object_store_migration to 9da56fe
Posted by mc...@apache.org.
Clear snapshot entry on primary from snapshot_store_ref when we migrate
secondary storage to object store so that next snapshot will be full
snapshot.
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/81686e86
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/81686e86
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/81686e86
Branch: refs/heads/object_store_migration
Commit: 81686e862c03fa8fd593e50490a2f80d5559d590
Parents: 1722c48
Author: Min Chen <mi...@citrix.com>
Authored: Wed Oct 23 15:57:08 2013 -0700
Committer: Min Chen <mi...@citrix.com>
Committed: Wed Oct 23 15:57:08 2013 -0700
----------------------------------------------------------------------
.../storage/datastore/db/SnapshotDataStoreDao.java | 3 +++
.../storage/image/datastore/ImageStoreHelper.java | 5 +++++
.../storage/image/db/SnapshotDataStoreDaoImpl.java | 10 ++++++++++
3 files changed, 18 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/81686e86/engine/schema/src/org/apache/cloudstack/storage/datastore/db/SnapshotDataStoreDao.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/SnapshotDataStoreDao.java b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/SnapshotDataStoreDao.java
index 19eac38..9cde86d 100644
--- a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/SnapshotDataStoreDao.java
+++ b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/SnapshotDataStoreDao.java
@@ -44,5 +44,8 @@ StateDao<ObjectInDataStoreStateMachine.State, ObjectInDataStoreStateMachine.Even
void duplicateCacheRecordsOnRegionStore(long storeId);
+ // delete the snapshot entry on primary data store to make sure that next snapshot will be full snapshot
+ void deleteSnapshotRecordsOnPrimary();
+
List<SnapshotDataStoreVO> listOnCache(long snapshotId);
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/81686e86/engine/storage/src/org/apache/cloudstack/storage/image/datastore/ImageStoreHelper.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/datastore/ImageStoreHelper.java b/engine/storage/src/org/apache/cloudstack/storage/image/datastore/ImageStoreHelper.java
index 4b202f5..e2c48ea 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/image/datastore/ImageStoreHelper.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/image/datastore/ImageStoreHelper.java
@@ -31,6 +31,7 @@ import org.apache.cloudstack.storage.datastore.db.ImageStoreDao;
import org.apache.cloudstack.storage.datastore.db.ImageStoreDetailVO;
import org.apache.cloudstack.storage.datastore.db.ImageStoreDetailsDao;
import org.apache.cloudstack.storage.datastore.db.ImageStoreVO;
+import org.apache.cloudstack.storage.datastore.db.SnapshotDataStoreDao;
import com.cloud.storage.DataStoreRole;
import com.cloud.storage.ScopeType;
@@ -42,6 +43,8 @@ public class ImageStoreHelper {
ImageStoreDao imageStoreDao;
@Inject
ImageStoreDetailsDao imageStoreDetailsDao;
+ @Inject
+ SnapshotDataStoreDao snapshotStoreDao;
public ImageStoreVO createImageStore(Map<String, Object> params) {
ImageStoreVO store = imageStoreDao.findByName((String) params.get("name"));
@@ -127,6 +130,8 @@ public class ImageStoreHelper {
ImageStoreVO nfsStore = imageStoreDao.findById(store.getId());
nfsStore.setRole(DataStoreRole.ImageCache);
imageStoreDao.update(store.getId(), nfsStore);
+ // clear snapshot entry on primary store to make next snapshot become full snapshot
+ snapshotStoreDao.deleteSnapshotRecordsOnPrimary();
return true;
}
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/81686e86/engine/storage/src/org/apache/cloudstack/storage/image/db/SnapshotDataStoreDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/db/SnapshotDataStoreDaoImpl.java b/engine/storage/src/org/apache/cloudstack/storage/image/db/SnapshotDataStoreDaoImpl.java
index 96a0c17..913112c 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/image/db/SnapshotDataStoreDaoImpl.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/image/db/SnapshotDataStoreDaoImpl.java
@@ -171,6 +171,16 @@ public class SnapshotDataStoreDaoImpl extends GenericDaoBase<SnapshotDataStoreVO
}
@Override
+ public void deleteSnapshotRecordsOnPrimary() {
+ SearchCriteria<SnapshotDataStoreVO> sc = storeSearch.create();
+ sc.setParameters("store_role", DataStoreRole.Primary);
+ Transaction txn = Transaction.currentTxn();
+ txn.start();
+ remove(sc);
+ txn.commit();
+ }
+
+ @Override
public SnapshotDataStoreVO findByStoreSnapshot(DataStoreRole role, long storeId, long snapshotId) {
SearchCriteria<SnapshotDataStoreVO> sc = storeSnapshotSearch.create();
sc.setParameters("store_id", storeId);