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 <[email protected]> Authored: Mon Apr 8 14:16:51 2013 -0700 Committer: Min Chen <[email protected]> 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; - } - - }
