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/04/08 23:17:27 UTC
git commit: updated refs/heads/object_store to 7f64b61
Updated Branches:
refs/heads/object_store 848fea606 -> 7f64b61cb
Move some image store related interface methods from ResourceService to
StorageService.
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/7f64b61c
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/7f64b61c
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/7f64b61c
Branch: refs/heads/object_store
Commit: 7f64b61cbd1cf81c610d23559354dd778b32321c
Parents: 848fea6
Author: Min Chen <mi...@citrix.com>
Authored: Mon Apr 8 14:16:51 2013 -0700
Committer: Min Chen <mi...@citrix.com>
Committed: Mon Apr 8 14:16:51 2013 -0700
----------------------------------------------------------------------
api/src/com/cloud/resource/ResourceService.java | 3 -
api/src/com/cloud/storage/StorageService.java | 9 ++
.../command/admin/storage/AddImageStoreCmd.java | 2 +-
.../command/admin/storage/DeleteImageStoreCmd.java | 80 +++++++++++
.../com/cloud/resource/ResourceManagerImpl.java | 71 +----------
.../src/com/cloud/storage/StorageManagerImpl.java | 105 +++++++++++++--
.../cloud/resource/MockResourceManagerImpl.java | 8 -
7 files changed, 184 insertions(+), 94 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/7f64b61c/api/src/com/cloud/resource/ResourceService.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/resource/ResourceService.java b/api/src/com/cloud/resource/ResourceService.java
index d8c09d9..268bcd6 100755
--- a/api/src/com/cloud/resource/ResourceService.java
+++ b/api/src/com/cloud/resource/ResourceService.java
@@ -27,7 +27,6 @@ import org.apache.cloudstack.api.command.admin.host.PrepareForMaintenanceCmd;
import org.apache.cloudstack.api.command.admin.host.ReconnectHostCmd;
import org.apache.cloudstack.api.command.admin.host.UpdateHostCmd;
import org.apache.cloudstack.api.command.admin.host.UpdateHostPasswordCmd;
-import org.apache.cloudstack.api.command.admin.storage.AddImageStoreCmd;
import org.apache.cloudstack.api.command.admin.storage.AddS3Cmd;
import org.apache.cloudstack.api.command.admin.storage.ListS3sCmd;
import org.apache.cloudstack.api.command.admin.swift.AddSwiftCmd;
@@ -39,7 +38,6 @@ import com.cloud.exception.ResourceInUseException;
import com.cloud.host.Host;
import com.cloud.hypervisor.Hypervisor.HypervisorType;
import com.cloud.org.Cluster;
-import com.cloud.storage.ImageStore;
import com.cloud.storage.S3;
import com.cloud.storage.Swift;
import com.cloud.utils.Pair;
@@ -103,7 +101,6 @@ public interface ResourceService {
S3 discoverS3(AddS3Cmd cmd) throws DiscoveryException;
- ImageStore discoverImageStore(AddImageStoreCmd cmd) throws IllegalArgumentException, DiscoveryException, InvalidParameterValueException;
List<HypervisorType> getSupportedHypervisorTypes(long zoneId, boolean forVirtualRouter, Long podId);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/7f64b61c/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 63c5023..ee1a956 100644
--- a/api/src/com/cloud/storage/StorageService.java
+++ b/api/src/com/cloud/storage/StorageService.java
@@ -18,12 +18,16 @@ package com.cloud.storage;
import java.net.UnknownHostException;
+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.CreateStoragePoolCmd;
+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.UpdateStoragePoolCmd;
+import com.cloud.exception.DiscoveryException;
import com.cloud.exception.InsufficientCapacityException;
+import com.cloud.exception.InvalidParameterValueException;
import com.cloud.exception.ResourceInUseException;
import com.cloud.exception.ResourceUnavailableException;
@@ -82,4 +86,9 @@ public interface StorageService{
public StoragePool updateStoragePool(UpdateStoragePoolCmd cmd) throws IllegalArgumentException;
public StoragePool getStoragePool(long id);
+
+ boolean deleteImageStore(DeleteImageStoreCmd cmd);
+
+ ImageStore discoverImageStore(AddImageStoreCmd cmd) throws IllegalArgumentException, DiscoveryException, InvalidParameterValueException;
+
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/7f64b61c/api/src/org/apache/cloudstack/api/command/admin/storage/AddImageStoreCmd.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/command/admin/storage/AddImageStoreCmd.java b/api/src/org/apache/cloudstack/api/command/admin/storage/AddImageStoreCmd.java
index 40ae6b2..511283f 100644
--- a/api/src/org/apache/cloudstack/api/command/admin/storage/AddImageStoreCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/admin/storage/AddImageStoreCmd.java
@@ -102,7 +102,7 @@ public class AddImageStoreCmd extends BaseCmd {
@Override
public void execute(){
try{
- ImageStore result = _resourceService.discoverImageStore(this);
+ ImageStore result = _storageService.discoverImageStore(this);
ImageStoreResponse storeResponse = null;
if (result != null ) {
storeResponse = _responseGenerator.createImageStoreResponse(result);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/7f64b61c/api/src/org/apache/cloudstack/api/command/admin/storage/DeleteImageStoreCmd.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/command/admin/storage/DeleteImageStoreCmd.java b/api/src/org/apache/cloudstack/api/command/admin/storage/DeleteImageStoreCmd.java
new file mode 100644
index 0000000..34a4ae0
--- /dev/null
+++ b/api/src/org/apache/cloudstack/api/command/admin/storage/DeleteImageStoreCmd.java
@@ -0,0 +1,80 @@
+// 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.cloudstack.api.APICommand;
+import org.apache.cloudstack.api.ApiConstants;
+import org.apache.cloudstack.api.ApiErrorCode;
+import org.apache.cloudstack.api.BaseCmd;
+import org.apache.cloudstack.api.Parameter;
+import org.apache.cloudstack.api.ServerApiException;
+import org.apache.cloudstack.api.response.HostResponse;
+import org.apache.cloudstack.api.response.ImageStoreResponse;
+import org.apache.cloudstack.api.response.SuccessResponse;
+import org.apache.log4j.Logger;
+
+import com.cloud.user.Account;
+
+@APICommand(name = "deleteImageStore", description = "Deletes an image store .", responseObject = SuccessResponse.class)
+public class DeleteImageStoreCmd extends BaseCmd {
+ public static final Logger s_logger = Logger.getLogger(DeleteImageStoreCmd.class.getName());
+
+ private static final String s_name = "deleteimagestoreresponse";
+
+ // ///////////////////////////////////////////////////
+ // ////////////// API parameters /////////////////////
+ // ///////////////////////////////////////////////////
+
+ @Parameter(name = ApiConstants.ID, type = CommandType.UUID, entityType = ImageStoreResponse.class,
+ required = true, description = "the image store ID")
+ private Long id;
+
+
+ // ///////////////////////////////////////////////////
+ // ///////////////// Accessors ///////////////////////
+ // ///////////////////////////////////////////////////
+
+ public Long getId() {
+ return id;
+ }
+
+
+ // ///////////////////////////////////////////////////
+ // ///////////// API Implementation///////////////////
+ // ///////////////////////////////////////////////////
+
+ @Override
+ public String getCommandName() {
+ return s_name;
+ }
+
+ @Override
+ public long getEntityOwnerId() {
+ return Account.ACCOUNT_ID_SYSTEM;
+ }
+
+ @Override
+ public void execute() {
+ boolean result = _storageService.deleteImageStore(this);
+ if (result) {
+ SuccessResponse response = new SuccessResponse(getCommandName());
+ this.setResponseObject(response);
+ } else {
+ throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to delete image store");
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/7f64b61c/server/src/com/cloud/resource/ResourceManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/resource/ResourceManagerImpl.java b/server/src/com/cloud/resource/ResourceManagerImpl.java
index 27df1af..ef56769 100755
--- a/server/src/com/cloud/resource/ResourceManagerImpl.java
+++ b/server/src/com/cloud/resource/ResourceManagerImpl.java
@@ -176,8 +176,6 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager,
@Inject
protected SecondaryStorageVmManager _secondaryStorageMgr;
@Inject
- DataStoreProviderManager _dataStoreProviderMgr;
- @Inject
protected RegionDao _regionDao;
@Inject
protected DataCenterDao _dcDao;
@@ -217,8 +215,7 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager,
protected HighAvailabilityManager _haMgr;
@Inject
protected StorageService _storageSvr;
- @Inject
- DataStoreManager _dataStoreMgr;
+
protected List<? extends Discoverer> _discoverers;
@@ -633,72 +630,6 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager,
return this._s3Mgr.listS3s(cmd);
}
- @Override
- public ImageStore discoverImageStore(AddImageStoreCmd cmd) throws IllegalArgumentException, DiscoveryException,
- InvalidParameterValueException {
- String providerName = cmd.getProviderName();
- DataStoreProvider storeProvider = _dataStoreProviderMgr.getDataStoreProvider(providerName);
-
- if (storeProvider == null) {
- storeProvider = _dataStoreProviderMgr.getDefaultImageDataStoreProvider();
- if (storeProvider == null) {
- throw new InvalidParameterValueException("can't find image store provider: " + providerName);
- }
- }
-
- Long dcId = cmd.getZoneId();
- String url = cmd.getUrl();
- Map details = cmd.getDetails();
-
- ScopeType scopeType = null;
- String scope = cmd.getScope();
- if (scope != null) {
- try {
- scopeType = Enum.valueOf(ScopeType.class, scope.toUpperCase());
- } catch (Exception e) {
- throw new InvalidParameterValueException("invalid scope" + scope);
- }
- }
- if (scopeType == ScopeType.ZONE && dcId == null) {
- throw new InvalidParameterValueException("zone id can't be null, if scope is zone");
- }
-
- if (dcId != null) {
- // Check if the zone exists in the system
- DataCenterVO zone = _dcDao.findById(dcId);
- if (zone == null) {
- throw new InvalidParameterValueException("Can't find zone by id " + dcId);
- }
-
- Account account = UserContext.current().getCaller();
- if (Grouping.AllocationState.Disabled == zone.getAllocationState() && !_accountMgr.isRootAdmin(account.getType())) {
- PermissionDeniedException ex = new PermissionDeniedException(
- "Cannot perform this operation, Zone with specified id is currently disabled");
- ex.addProxyObject(zone, dcId, "dcId");
- throw ex;
- }
- }
-
-
- Map<String, Object> params = new HashMap<String, Object>();
- params.put("zoneId", dcId);
- params.put("url", cmd.getUrl());
- params.put("name", cmd.getUrl());
- params.put("details", details);
- params.put("scope", scopeType);
- params.put("providerName", storeProvider.getName());
-
- DataStoreLifeCycle lifeCycle = storeProvider.getDataStoreLifeCycle();
- DataStore store = null;
- try {
- store = lifeCycle.initialize(params);
- } catch (Exception e) {
- s_logger.debug("Failed to add data store", e);
- throw new CloudRuntimeException("Failed to add data store", e);
- }
-
- return (ImageStore) _dataStoreMgr.getDataStore(store.getId(), DataStoreRole.Image);
- }
private List<HostVO> discoverHostsFull(Long dcId, Long podId, Long clusterId, String clusterName, String url, String username, String password,
String hypervisorType, List<String> hostTags, Map<String, String> params, boolean deferAgentCreation) throws IllegalArgumentException,
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/7f64b61c/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 72a0e07..88b1a52 100755
--- a/server/src/com/cloud/storage/StorageManagerImpl.java
+++ b/server/src/com/cloud/storage/StorageManagerImpl.java
@@ -40,8 +40,10 @@ import javax.ejb.Local;
import javax.inject.Inject;
import javax.naming.ConfigurationException;
+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.CreateStoragePoolCmd;
+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.UpdateStoragePoolCmd;
import org.apache.cloudstack.engine.subsystem.api.storage.ClusterScope;
@@ -103,6 +105,7 @@ import com.cloud.domain.dao.DomainDao;
import com.cloud.event.dao.EventDao;
import com.cloud.exception.AgentUnavailableException;
import com.cloud.exception.ConnectionException;
+import com.cloud.exception.DiscoveryException;
import com.cloud.exception.InsufficientCapacityException;
import com.cloud.exception.InvalidParameterValueException;
import com.cloud.exception.OperationTimedoutException;
@@ -294,6 +297,11 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C
@Inject protected ResourceTagDao _resourceTagDao;
+ @Inject
+ DataStoreManager _dataStoreMgr;
+ @Inject
+ DataStoreProviderManager _dataStoreProviderMgr;
+
protected List<StoragePoolAllocator> _storagePoolAllocators;
public List<StoragePoolAllocator> getStoragePoolAllocators() {
return _storagePoolAllocators;
@@ -453,13 +461,13 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C
VirtualMachineProfile<VMInstanceVO> profile = new VirtualMachineProfileImpl<VMInstanceVO>(
vm);
for (StoragePoolAllocator allocator : _storagePoolAllocators) {
-
+
ExcludeList avoidList = new ExcludeList();
for(StoragePool pool : avoid){
avoidList.addPool(pool.getId());
}
DataCenterDeployment plan = new DataCenterDeployment(dc.getId(), pod.getId(), clusterId, hostId, null, null);
-
+
final List<StoragePool> poolList = allocator.allocateToPool(dskCh, profile, plan, avoidList, 1);
if (poolList != null && !poolList.isEmpty()) {
return (StoragePool)this.dataStoreMgr.getDataStore(poolList.get(0).getId(), DataStoreRole.Primary);
@@ -672,7 +680,7 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C
return true;
}
-
+
@Override
public String getStoragePoolTags(long poolId) {
return _configMgr.listToCsvTags(_storagePoolDao
@@ -701,7 +709,7 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C
return true;
}
-
+
@DB
@Override
public DataStore createLocalStorage(Host host, StoragePoolInfo pInfo) throws ConnectionException {
@@ -715,7 +723,7 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C
StoragePoolVO pool = _storagePoolDao.findPoolByHostPath(host.getDataCenterId(), host.getPodId(), pInfo.getHost(), pInfo.getHostPath(), pInfo.getUuid());
if(pool == null && host.getHypervisorType() == HypervisorType.VMware) {
// perform run-time upgrade. In versions prior to 2.2.12, there is a bug that we don't save local datastore info (host path is empty), this will cause us
- // not able to distinguish multiple local datastores that may be available on the host, to support smooth migration, we
+ // not able to distinguish multiple local datastores that may be available on the host, to support smooth migration, we
// need to perform runtime upgrade here
if(pInfo.getHostPath().length() > 0) {
pool = _storagePoolDao.findPoolByHostPath(host.getDataCenterId(), host.getPodId(), pInfo.getHost(), "", pInfo.getUuid());
@@ -735,13 +743,13 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C
params.put("details", pInfo.getDetails());
params.put("uuid", pInfo.getUuid());
params.put("providerName", provider.getName());
-
+
store = lifeCycle.initialize(params);
} else {
store = (DataStore) dataStoreMgr.getDataStore(pool.getId(),
DataStoreRole.Primary);
}
-
+
HostScope scope = new HostScope(host.getId());
lifeCycle.attachHost(store, scope, pInfo);
} catch (Exception e) {
@@ -1007,7 +1015,7 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C
}
CapacityState capacityState = (allocationState == AllocationState.Disabled) ?
CapacityState.Disabled : CapacityState.Enabled;
-
+
capacity.setCapacityState(capacityState);
_capacityDao.persist(capacity);
} else {
@@ -1147,7 +1155,7 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C
}finally {
scanLock.unlock();
}
- }
+ }
}finally {
scanLock.releaseRef();
}
@@ -1479,7 +1487,7 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C
DataStore store = dataStoreMgr.getDataStore(
primaryStorage.getId(), DataStoreRole.Primary);
lifeCycle.cancelMaintain(store);
-
+
return (PrimaryDataStoreInfo) dataStoreMgr.getDataStore(
primaryStorage.getId(), DataStoreRole.Primary);
}
@@ -1627,7 +1635,7 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C
DataStoreRole.Primary);
}
-
+
@Override
@DB
@@ -1708,7 +1716,7 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C
return secHost;
}
-
+
@Override
public HypervisorType getHypervisorTypeFromFormat(ImageFormat format) {
@@ -1875,4 +1883,77 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C
return null;
}
+ @Override
+ public ImageStore discoverImageStore(AddImageStoreCmd cmd) throws IllegalArgumentException, DiscoveryException,
+ InvalidParameterValueException {
+ String providerName = cmd.getProviderName();
+ DataStoreProvider storeProvider = _dataStoreProviderMgr.getDataStoreProvider(providerName);
+
+ if (storeProvider == null) {
+ storeProvider = _dataStoreProviderMgr.getDefaultImageDataStoreProvider();
+ if (storeProvider == null) {
+ throw new InvalidParameterValueException("can't find image store provider: " + providerName);
+ }
+ }
+
+ Long dcId = cmd.getZoneId();
+ String url = cmd.getUrl();
+ Map details = cmd.getDetails();
+
+ ScopeType scopeType = null;
+ String scope = cmd.getScope();
+ if (scope != null) {
+ try {
+ scopeType = Enum.valueOf(ScopeType.class, scope.toUpperCase());
+ } catch (Exception e) {
+ throw new InvalidParameterValueException("invalid scope" + scope);
+ }
+ }
+ if (scopeType == ScopeType.ZONE && dcId == null) {
+ throw new InvalidParameterValueException("zone id can't be null, if scope is zone");
+ }
+
+ if (dcId != null) {
+ // Check if the zone exists in the system
+ DataCenterVO zone = _dcDao.findById(dcId);
+ if (zone == null) {
+ throw new InvalidParameterValueException("Can't find zone by id " + dcId);
+ }
+
+ Account account = UserContext.current().getCaller();
+ if (Grouping.AllocationState.Disabled == zone.getAllocationState() && !_accountMgr.isRootAdmin(account.getType())) {
+ PermissionDeniedException ex = new PermissionDeniedException(
+ "Cannot perform this operation, Zone with specified id is currently disabled");
+ ex.addProxyObject(zone, dcId, "dcId");
+ throw ex;
+ }
+ }
+
+
+ Map<String, Object> params = new HashMap<String, Object>();
+ params.put("zoneId", dcId);
+ params.put("url", cmd.getUrl());
+ params.put("name", cmd.getUrl());
+ params.put("details", details);
+ params.put("scope", scopeType);
+ params.put("providerName", storeProvider.getName());
+
+ DataStoreLifeCycle lifeCycle = storeProvider.getDataStoreLifeCycle();
+ DataStore store = null;
+ try {
+ store = lifeCycle.initialize(params);
+ } catch (Exception e) {
+ s_logger.debug("Failed to add data store", e);
+ throw new CloudRuntimeException("Failed to add data store", e);
+ }
+
+ return (ImageStore) _dataStoreMgr.getDataStore(store.getId(), DataStoreRole.Image);
+ }
+ @Override
+ public boolean deleteImageStore(DeleteImageStoreCmd cmd) {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/7f64b61c/server/test/com/cloud/resource/MockResourceManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/test/com/cloud/resource/MockResourceManagerImpl.java b/server/test/com/cloud/resource/MockResourceManagerImpl.java
index da4d3fb..819120b 100644
--- a/server/test/com/cloud/resource/MockResourceManagerImpl.java
+++ b/server/test/com/cloud/resource/MockResourceManagerImpl.java
@@ -609,12 +609,4 @@ public class MockResourceManagerImpl extends ManagerBase implements ResourceMana
return null;
}
- @Override
- public ImageStore discoverImageStore(AddImageStoreCmd cmd) throws IllegalArgumentException, DiscoveryException,
- InvalidParameterValueException {
- // TODO Auto-generated method stub
- return null;
- }
-
-
}