Updated Branches: refs/heads/object_store 14b5f0da1 -> fe4f53bfc
Fix SecStorageSetupCommand for Nfs image store. Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/fe4f53bf Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/fe4f53bf Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/fe4f53bf Branch: refs/heads/object_store Commit: fe4f53bfcdbe157e9500e2a806f7f9942250211e Parents: 14b5f0d Author: Min Chen <min.c...@citrix.com> Authored: Wed Apr 17 17:16:01 2013 -0700 Committer: Min Chen <min.c...@citrix.com> Committed: Wed Apr 17 17:16:01 2013 -0700 ---------------------------------------------------------------------- .../cloud/agent/api/SecStorageSetupCommand.java | 15 +++++- .../resource/NfsSecondaryStorageResource.java | 43 +++++++++------ .../storage/datastore/db/ImageStoreVO.java | 15 +++++- .../storage/image/store/ImageStoreImpl.java | 3 + .../storage/download/DownloadMonitorImpl.java | 10 +++- .../secondary/SecondaryStorageManagerImpl.java | 35 +++++++++---- .../com/cloud/template/TemplateManagerImpl.java | 6 +- .../src/com/cloud/upgrade/dao/Upgrade410to420.java | 18 ++++--- setup/db/db/schema-410to420.sql | 1 + 9 files changed, 102 insertions(+), 44 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cloudstack/blob/fe4f53bf/api/src/com/cloud/agent/api/SecStorageSetupCommand.java ---------------------------------------------------------------------- diff --git a/api/src/com/cloud/agent/api/SecStorageSetupCommand.java b/api/src/com/cloud/agent/api/SecStorageSetupCommand.java index 50c06cf..b1f3234 100644 --- a/api/src/com/cloud/agent/api/SecStorageSetupCommand.java +++ b/api/src/com/cloud/agent/api/SecStorageSetupCommand.java @@ -17,8 +17,10 @@ package com.cloud.agent.api; import com.cloud.agent.api.LogLevel.Log4jLevel; +import com.cloud.agent.api.to.DataStoreTO; public class SecStorageSetupCommand extends Command { + private DataStoreTO store; private String secUrl; private Certificates certs; @@ -57,10 +59,11 @@ public class SecStorageSetupCommand extends Command { super(); } - public SecStorageSetupCommand(String secUrl, Certificates certs) { + public SecStorageSetupCommand(DataStoreTO store, String secUrl, Certificates certs) { super(); this.secUrl = secUrl; this.certs = certs; + this.store = store; } @Override @@ -80,4 +83,14 @@ public class SecStorageSetupCommand extends Command { this.secUrl = secUrl; } + + public DataStoreTO getDataStore() { + return store; + } + + public void setDataStore(DataStoreTO store) { + this.store = store; + } + + } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/fe4f53bf/core/src/com/cloud/storage/resource/NfsSecondaryStorageResource.java ---------------------------------------------------------------------- diff --git a/core/src/com/cloud/storage/resource/NfsSecondaryStorageResource.java b/core/src/com/cloud/storage/resource/NfsSecondaryStorageResource.java index bb5b454..04b715d 100755 --- a/core/src/com/cloud/storage/resource/NfsSecondaryStorageResource.java +++ b/core/src/com/cloud/storage/resource/NfsSecondaryStorageResource.java @@ -968,29 +968,36 @@ SecondaryStorageResource { if (!_inSystemVM){ return new Answer(cmd, true, null); } - String secUrl = cmd.getSecUrl(); - try { - URI uri = new URI(secUrl); - String nfsHost = uri.getHost(); + DataStoreTO dStore = cmd.getDataStore(); + if (dStore instanceof NfsTO ){ + String secUrl = cmd.getSecUrl(); + try { + URI uri = new URI(secUrl); + String nfsHost = uri.getHost(); - InetAddress nfsHostAddr = InetAddress.getByName(nfsHost); - String nfsHostIp = nfsHostAddr.getHostAddress(); + InetAddress nfsHostAddr = InetAddress.getByName(nfsHost); + String nfsHostIp = nfsHostAddr.getHostAddress(); - addRouteToInternalIpOrCidr(_storageGateway, _storageIp, _storageNetmask, nfsHostIp); - String nfsPath = nfsHostIp + ":" + uri.getPath(); - String dir = UUID.nameUUIDFromBytes(nfsPath.getBytes()).toString(); - String root = _parent + "/" + dir; - mount(root, nfsPath); + addRouteToInternalIpOrCidr(_storageGateway, _storageIp, _storageNetmask, nfsHostIp); + String nfsPath = nfsHostIp + ":" + uri.getPath(); + String dir = UUID.nameUUIDFromBytes(nfsPath.getBytes()).toString(); + String root = _parent + "/" + dir; + mount(root, nfsPath); - configCerts(cmd.getCerts()); + configCerts(cmd.getCerts()); - nfsIps.add(nfsHostIp); - return new SecStorageSetupAnswer(dir); - } catch (Exception e) { - String msg = "GetRootDir for " + secUrl + " failed due to " + e.toString(); - s_logger.error(msg); - return new Answer(cmd, false, msg); + nfsIps.add(nfsHostIp); + return new SecStorageSetupAnswer(dir); + } catch (Exception e) { + String msg = "GetRootDir for " + secUrl + " failed due to " + e.toString(); + s_logger.error(msg); + return new Answer(cmd, false, msg); + } + } + else{ + // TODO: what do we need to setup for S3/Swift, maybe need to mount to some cache storage + return new Answer(cmd, true, null); } } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/fe4f53bf/engine/api/src/org/apache/cloudstack/storage/datastore/db/ImageStoreVO.java ---------------------------------------------------------------------- diff --git a/engine/api/src/org/apache/cloudstack/storage/datastore/db/ImageStoreVO.java b/engine/api/src/org/apache/cloudstack/storage/datastore/db/ImageStoreVO.java index 39b74d0..676004b 100644 --- a/engine/api/src/org/apache/cloudstack/storage/datastore/db/ImageStoreVO.java +++ b/engine/api/src/org/apache/cloudstack/storage/datastore/db/ImageStoreVO.java @@ -71,11 +71,16 @@ public class ImageStoreVO implements ImageStore { @Column(name=GenericDao.REMOVED_COLUMN) private Date removed; - + @Column(name = "role") @Enumerated(value = EnumType.STRING) private DataStoreRole role; + @Column(name="parent") + private String parent; + + + public DataStoreRole getRole() { return role; } @@ -160,6 +165,14 @@ public class ImageStoreVO implements ImageStore { this.removed = removed; } + public String getParent() { + return parent; + } + + public void setParent(String parent) { + this.parent = parent; + } + } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/fe4f53bf/engine/storage/image/src/org/apache/cloudstack/storage/image/store/ImageStoreImpl.java ---------------------------------------------------------------------- diff --git a/engine/storage/image/src/org/apache/cloudstack/storage/image/store/ImageStoreImpl.java b/engine/storage/image/src/org/apache/cloudstack/storage/image/store/ImageStoreImpl.java index bc8d2e2..638e135 100644 --- a/engine/storage/image/src/org/apache/cloudstack/storage/image/store/ImageStoreImpl.java +++ b/engine/storage/image/src/org/apache/cloudstack/storage/image/store/ImageStoreImpl.java @@ -178,5 +178,8 @@ public class ImageStoreImpl implements ImageStoreEntity { return getDriver().getStoreTO(this); } + public ImageStoreVO getImageStoreVO(){ + return this.imageDataStoreVO; + } } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/fe4f53bf/server/src/com/cloud/storage/download/DownloadMonitorImpl.java ---------------------------------------------------------------------- diff --git a/server/src/com/cloud/storage/download/DownloadMonitorImpl.java b/server/src/com/cloud/storage/download/DownloadMonitorImpl.java index 50ded27..6af8db5 100755 --- a/server/src/com/cloud/storage/download/DownloadMonitorImpl.java +++ b/server/src/com/cloud/storage/download/DownloadMonitorImpl.java @@ -30,6 +30,8 @@ import javax.inject.Inject; import org.apache.cloudstack.engine.subsystem.api.storage.CreateCmdResult; import org.apache.cloudstack.engine.subsystem.api.storage.DataStore; import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager; +import org.apache.cloudstack.storage.datastore.db.ImageStoreDao; +import org.apache.cloudstack.storage.datastore.db.ImageStoreVO; import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreDao; import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreVO; import org.apache.cloudstack.storage.datastore.db.VolumeDataStoreDao; @@ -126,6 +128,8 @@ public class DownloadMonitorImpl extends ManagerBase implements DownloadMonitor @Inject SecondaryStorageVmDao _secStorageVmDao; @Inject + ImageStoreDao _imageStoreDao; + @Inject VolumeDao _volumeDao; @Inject VolumeHostDao _volumeHostDao; @@ -344,9 +348,9 @@ public class DownloadMonitorImpl extends ManagerBase implements DownloadMonitor s_logger.warn("A running secondary storage vm has a null public ip?"); return null; } - //TODO: how to handle parent field from hostVO in image_store? and how we can populate that column? - // return generateCopyUrl(ssVm.getPublicIpAddress(), sourceServer.getParent(), srcTmpltStore.getInstallPath()); - return generateCopyUrl(ssVm.getPublicIpAddress(), null, srcTmpltStore.getInstallPath()); + // get parent path of nfs secondary storage + ImageStoreVO svo = this._imageStoreDao.findById(sourceServer.getId()); + return generateCopyUrl(ssVm.getPublicIpAddress(), svo.getParent(), srcTmpltStore.getInstallPath()); } VMTemplateVO tmplt = _templateDao.findById(srcTmpltStore.getTemplateId()); http://git-wip-us.apache.org/repos/asf/cloudstack/blob/fe4f53bf/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java ---------------------------------------------------------------------- diff --git a/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java b/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java index 7a1984c..1b50083 100755 --- a/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java +++ b/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java @@ -30,7 +30,11 @@ import javax.inject.Inject; import javax.naming.ConfigurationException; 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.Scope; +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.apache.log4j.Logger; import org.springframework.context.annotation.Primary; import org.springframework.stereotype.Component; @@ -240,6 +244,10 @@ public class SecondaryStorageManagerImpl extends ManagerBase implements Secondar @Inject KeystoreManager _keystoreMgr; + @Inject + DataStoreManager _dataStoreMgr; + @Inject + ImageStoreDao _imageStoreDao; private long _capacityScanInterval = DEFAULT_CAPACITY_SCAN_INTERVAL; private int _secStorageVmMtuSize; @@ -300,33 +308,39 @@ public class SecondaryStorageManagerImpl extends ManagerBase implements Secondar return false; } - List<HostVO> ssHosts = _ssvmMgr.listSecondaryStorageHostsInOneZone(zoneId); - for( HostVO ssHost : ssHosts ) { - String secUrl = ssHost.getStorageUrl(); + List<DataStore> ssStores = this._dataStoreMgr.getImageStoresByScope(new ZoneScope(zoneId)); + for( DataStore ssStore : ssStores ) { + String secUrl = ssStore.getUri(); SecStorageSetupCommand setupCmd = null; if (!_useSSlCopy) { - setupCmd = new SecStorageSetupCommand(secUrl, null); + setupCmd = new SecStorageSetupCommand(ssStore.getTO(), secUrl, null); } else { Certificates certs = _keystoreMgr.getCertificates(ConsoleProxyManager.CERTIFICATE_NAME); - setupCmd = new SecStorageSetupCommand(secUrl, certs); + setupCmd = new SecStorageSetupCommand(ssStore.getTO(), secUrl, certs); } Answer answer = _agentMgr.easySend(ssHostId, setupCmd); if (answer != null && answer.getResult()) { SecStorageSetupAnswer an = (SecStorageSetupAnswer) answer; - ssHost.setParent(an.get_dir()); - _hostDao.update(ssHost.getId(), ssHost); + if (an.get_dir() != null){ + // update the parent path in image_store table for this image store + ImageStoreVO svo = this._imageStoreDao.findById(ssStore.getId()); + svo.setParent(an.get_dir()); + _imageStoreDao.update(ssStore.getId(), svo); + } if (s_logger.isDebugEnabled()) { - s_logger.debug("Successfully programmed secondary storage " + ssHost.getName() + " in secondary storage VM " + secStorageVm.getInstanceName()); + s_logger.debug("Successfully programmed secondary storage " + ssStore.getName() + " in secondary storage VM " + secStorageVm.getInstanceName()); } } else { if (s_logger.isDebugEnabled()) { - s_logger.debug("Successfully programmed secondary storage " + ssHost.getName() + " in secondary storage VM " + secStorageVm.getInstanceName()); + s_logger.debug("Successfully programmed secondary storage " + ssStore.getName() + " in secondary storage VM " + secStorageVm.getInstanceName()); } return false; } } - } else if( cssHost.getType() == Host.Type.SecondaryStorage ) { + } + /* After removing SecondaryStorage entries from host table, control should never come here!! + else if( cssHost.getType() == Host.Type.SecondaryStorage ) { List<SecondaryStorageVmVO> alreadyRunning = _secStorageVmDao.getSecStorageVmListInStates(SecondaryStorageVm.Role.templateProcessor, zoneId, State.Running); String secUrl = cssHost.getStorageUrl(); SecStorageSetupCommand setupCmd = new SecStorageSetupCommand(secUrl, null); @@ -345,6 +359,7 @@ public class SecondaryStorageManagerImpl extends ManagerBase implements Secondar } } } + */ return true; } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/fe4f53bf/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 7ef658c..6640df2 100755 --- a/server/src/com/cloud/template/TemplateManagerImpl.java +++ b/server/src/com/cloud/template/TemplateManagerImpl.java @@ -252,7 +252,7 @@ public class TemplateManagerImpl extends ManagerBase implements TemplateManager, @Inject SnapshotDataFactory snapshotFactory; @Inject - TemplateService imageSvr; + TemplateService tmpltSvr; @Inject DataStoreManager dataStoreMgr; @Inject @@ -1768,11 +1768,11 @@ public class TemplateManagerImpl extends ManagerBase implements TemplateManager, AsyncCallFuture<CommandResult> future = null; if (snapshotId != null) { SnapshotInfo snapInfo = this.snapshotFactory.getSnapshot(snapshotId); - future = this.imageSvr.createTemplateFromSnapshotAsync(snapInfo, tmplInfo, store.get(0)); + future = this.tmpltSvr.createTemplateFromSnapshotAsync(snapInfo, tmplInfo, store.get(0)); } else if (volumeId != null) { volume = _volumeDao.findById(volumeId); VolumeInfo volInfo = this.volFactory.getVolume(volumeId); - future = this.imageSvr.createTemplateFromVolumeAsync(volInfo, tmplInfo, store.get(0)); + future = this.tmpltSvr.createTemplateFromVolumeAsync(volInfo, tmplInfo, store.get(0)); } else { throw new CloudRuntimeException( "Creating private Template need to specify snapshotId or volumeId"); http://git-wip-us.apache.org/repos/asf/cloudstack/blob/fe4f53bf/server/src/com/cloud/upgrade/dao/Upgrade410to420.java ---------------------------------------------------------------------- diff --git a/server/src/com/cloud/upgrade/dao/Upgrade410to420.java b/server/src/com/cloud/upgrade/dao/Upgrade410to420.java index f39038f..a39d5bc 100644 --- a/server/src/com/cloud/upgrade/dao/Upgrade410to420.java +++ b/server/src/com/cloud/upgrade/dao/Upgrade410to420.java @@ -66,8 +66,9 @@ public class Upgrade410to420 implements DbUpgrade { updateCluster_details(conn); updatePrimaryStore(conn); } - + private void updateSystemVmTemplates(Connection conn) { + /* TODO: where should be system vm templates located? PreparedStatement sql = null; try { sql = conn.prepareStatement("update vm_template set image_data_store_id = 1 where type = 'SYSTEM' or type = 'BUILTIN'"); @@ -82,8 +83,9 @@ public class Upgrade410to420 implements DbUpgrade { } } } + */ } - + private void updatePrimaryStore(Connection conn) { PreparedStatement sql = null; PreparedStatement sql2 = null; @@ -92,7 +94,7 @@ public class Upgrade410to420 implements DbUpgrade { sql.setString(1, "ancient primary data store provider"); sql.setString(2, "HOST"); sql.executeUpdate(); - + sql2 = conn.prepareStatement("update storage_pool set storage_provider_name = ? , scope = ? where pool_type != 'Filesystem' and pool_type != 'LVM'"); sql2.setString(1, "ancient primary data store provider"); sql2.setString(2, "CLUSTER"); @@ -106,7 +108,7 @@ public class Upgrade410to420 implements DbUpgrade { } catch (SQLException e) { } } - + if (sql2 != null) { try { sql2.close(); @@ -234,7 +236,7 @@ public class Upgrade410to420 implements DbUpgrade { } } } - + private void createPlaceHolderNics(Connection conn) { PreparedStatement pstmt = null; ResultSet rs = null; @@ -255,7 +257,7 @@ public class Upgrade410to420 implements DbUpgrade { pstmt.setLong(4, networkId); pstmt.executeUpdate(); s_logger.debug("Created placeholder nic for the ipAddress " + ip); - + } } catch (SQLException e) { throw new CloudRuntimeException("Unable to create placeholder nics", e); @@ -271,8 +273,8 @@ public class Upgrade410to420 implements DbUpgrade { } } } - - + + private void updateRemoteAccessVpn(Connection conn) { PreparedStatement pstmt = null; ResultSet rs = null; http://git-wip-us.apache.org/repos/asf/cloudstack/blob/fe4f53bf/setup/db/db/schema-410to420.sql ---------------------------------------------------------------------- diff --git a/setup/db/db/schema-410to420.sql b/setup/db/db/schema-410to420.sql index 65eedee..fd03088 100644 --- a/setup/db/db/schema-410to420.sql +++ b/setup/db/db/schema-410to420.sql @@ -77,6 +77,7 @@ CREATE TABLE `cloud`.`image_store` ( `data_center_id` bigint unsigned COMMENT 'datacenter id of data store', `scope` varchar(255) COMMENT 'scope of data store', `uuid` varchar(255) COMMENT 'uuid of data store', + `parent` varchar(255) COMMENT 'parent path for the storage server', `created` datetime COMMENT 'date the image store first signed on', `removed` datetime COMMENT 'date removed if not null', PRIMARY KEY(`id`)