mirror of
https://github.com/apache/cloudstack.git
synced 2025-10-26 08:42:29 +01:00
add cache storage
This commit is contained in:
parent
dcbeea057b
commit
e5bf38ed05
@ -20,6 +20,7 @@ import java.net.UnknownHostException;
|
|||||||
|
|
||||||
import org.apache.cloudstack.api.command.admin.storage.AddImageStoreCmd;
|
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.CancelPrimaryStorageMaintenanceCmd;
|
||||||
|
import org.apache.cloudstack.api.command.admin.storage.CreateCacheStoreCmd;
|
||||||
import org.apache.cloudstack.api.command.admin.storage.CreateStoragePoolCmd;
|
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.DeleteImageStoreCmd;
|
||||||
import org.apache.cloudstack.api.command.admin.storage.DeletePoolCmd;
|
import org.apache.cloudstack.api.command.admin.storage.DeletePoolCmd;
|
||||||
@ -47,6 +48,8 @@ public interface StorageService{
|
|||||||
*/
|
*/
|
||||||
StoragePool createPool(CreateStoragePoolCmd cmd) throws ResourceInUseException, IllegalArgumentException,
|
StoragePool createPool(CreateStoragePoolCmd cmd) throws ResourceInUseException, IllegalArgumentException,
|
||||||
UnknownHostException, ResourceUnavailableException;
|
UnknownHostException, ResourceUnavailableException;
|
||||||
|
|
||||||
|
ImageStore createCacheStore(CreateCacheStoreCmd cmd);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Delete the storage pool
|
* Delete the storage pool
|
||||||
|
|||||||
@ -0,0 +1,123 @@
|
|||||||
|
/*
|
||||||
|
* 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 java.util.Map;
|
||||||
|
|
||||||
|
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.BaseCmd.CommandType;
|
||||||
|
import org.apache.cloudstack.api.response.ImageStoreResponse;
|
||||||
|
import org.apache.cloudstack.api.response.ZoneResponse;
|
||||||
|
import org.apache.log4j.Logger;
|
||||||
|
|
||||||
|
import com.cloud.exception.DiscoveryException;
|
||||||
|
import com.cloud.storage.ImageStore;
|
||||||
|
import com.cloud.user.Account;
|
||||||
|
|
||||||
|
@APICommand(name = "createCacheStore", description="create cache store.", responseObject=ImageStoreResponse.class)
|
||||||
|
public class CreateCacheStoreCmd extends BaseCmd {
|
||||||
|
public static final Logger s_logger = Logger.getLogger(AddImageStoreCmd.class.getName());
|
||||||
|
private static final String s_name = "createcachestoreresponse";
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////
|
||||||
|
//////////////// API parameters /////////////////////
|
||||||
|
/////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
@Parameter(name=ApiConstants.URL, type=CommandType.STRING, required=true, description="the URL for the cache store")
|
||||||
|
private String url;
|
||||||
|
|
||||||
|
@Parameter(name=ApiConstants.ZONE_ID, type=CommandType.UUID, entityType=ZoneResponse.class,
|
||||||
|
description="the Zone ID for the image store")
|
||||||
|
private Long zoneId;
|
||||||
|
|
||||||
|
|
||||||
|
@Parameter(name=ApiConstants.DETAILS, type=CommandType.MAP, description="the details for the image store")
|
||||||
|
private Map<String, String> details;
|
||||||
|
|
||||||
|
@Parameter(name=ApiConstants.SCOPE, type=CommandType.STRING,
|
||||||
|
required=false, description="the scope of the image store: zone only for now")
|
||||||
|
private String scope;
|
||||||
|
|
||||||
|
@Parameter(name=ApiConstants.PROVIDER, type=CommandType.STRING,
|
||||||
|
required=false, description="the cache store provider name")
|
||||||
|
private String providerName;
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////
|
||||||
|
/////////////////// Accessors ///////////////////////
|
||||||
|
/////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
public String getUrl() {
|
||||||
|
return url;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Long getZoneId() {
|
||||||
|
return zoneId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Map<String, String> getDetails() {
|
||||||
|
return details;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getScope() {
|
||||||
|
return this.scope;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getProviderName() {
|
||||||
|
return this.providerName;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////
|
||||||
|
/////////////// API Implementation///////////////////
|
||||||
|
/////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getCommandName() {
|
||||||
|
return s_name;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long getEntityOwnerId() {
|
||||||
|
return Account.ACCOUNT_ID_SYSTEM;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void execute(){
|
||||||
|
try{
|
||||||
|
ImageStore result = _storageService.createCacheStore(this);
|
||||||
|
ImageStoreResponse storeResponse = null;
|
||||||
|
if (result != null ) {
|
||||||
|
storeResponse = _responseGenerator.createImageStoreResponse(result);
|
||||||
|
storeResponse.setResponseName(getCommandName());
|
||||||
|
storeResponse.setObjectName("secondarystorage");
|
||||||
|
this.setResponseObject(storeResponse);
|
||||||
|
} else {
|
||||||
|
throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to add secondary storage");
|
||||||
|
}
|
||||||
|
} catch (Exception ex) {
|
||||||
|
s_logger.warn("Exception: ", ex);
|
||||||
|
throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, ex.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -16,10 +16,8 @@
|
|||||||
* specific language governing permissions and limitations
|
* specific language governing permissions and limitations
|
||||||
* under the License.
|
* under the License.
|
||||||
*/
|
*/
|
||||||
package org.apache.cloudstack.storage.motion;
|
package org.apache.cloudstack.engine.subsystem.api.storage;
|
||||||
|
|
||||||
import org.apache.cloudstack.engine.subsystem.api.storage.CopyCommandResult;
|
|
||||||
import org.apache.cloudstack.engine.subsystem.api.storage.DataObject;
|
|
||||||
import org.apache.cloudstack.framework.async.AsyncCompletionCallback;
|
import org.apache.cloudstack.framework.async.AsyncCompletionCallback;
|
||||||
|
|
||||||
public interface DataMotionService {
|
public interface DataMotionService {
|
||||||
@ -16,10 +16,8 @@
|
|||||||
* specific language governing permissions and limitations
|
* specific language governing permissions and limitations
|
||||||
* under the License.
|
* under the License.
|
||||||
*/
|
*/
|
||||||
package org.apache.cloudstack.storage.motion;
|
package org.apache.cloudstack.engine.subsystem.api.storage;
|
||||||
|
|
||||||
import org.apache.cloudstack.engine.subsystem.api.storage.CopyCommandResult;
|
|
||||||
import org.apache.cloudstack.engine.subsystem.api.storage.DataObject;
|
|
||||||
import org.apache.cloudstack.framework.async.AsyncCompletionCallback;
|
import org.apache.cloudstack.framework.async.AsyncCompletionCallback;
|
||||||
|
|
||||||
public interface DataMotionStrategy {
|
public interface DataMotionStrategy {
|
||||||
@ -28,5 +28,6 @@ public interface DataStoreManager {
|
|||||||
public DataStore getDataStore(String uuid, DataStoreRole role);
|
public DataStore getDataStore(String uuid, DataStoreRole role);
|
||||||
public List<DataStore> getImageStoresByScope(ZoneScope scope);
|
public List<DataStore> getImageStoresByScope(ZoneScope scope);
|
||||||
public List<DataStore> getImageStoresByProvider(String provider);
|
public List<DataStore> getImageStoresByProvider(String provider);
|
||||||
|
public List<DataStore> getImageCacheStores(Scope scope);
|
||||||
public DataStore registerDataStore(Map<String, String> params, String providerUuid);
|
public DataStore registerDataStore(Map<String, String> params, String providerUuid);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -27,7 +27,8 @@ import java.util.Set;
|
|||||||
public interface DataStoreProvider {
|
public interface DataStoreProvider {
|
||||||
public static enum DataStoreProviderType {
|
public static enum DataStoreProviderType {
|
||||||
PRIMARY,
|
PRIMARY,
|
||||||
IMAGE
|
IMAGE,
|
||||||
|
ImageCache
|
||||||
}
|
}
|
||||||
public DataStoreLifeCycle getDataStoreLifeCycle();
|
public DataStoreLifeCycle getDataStoreLifeCycle();
|
||||||
public DataStoreDriver getDataStoreDriver();
|
public DataStoreDriver getDataStoreDriver();
|
||||||
|
|||||||
@ -27,6 +27,7 @@ public interface DataStoreProviderManager extends Manager, DataStoreProviderApiS
|
|||||||
public DataStoreProvider getDataStoreProvider(String name);
|
public DataStoreProvider getDataStoreProvider(String name);
|
||||||
public DataStoreProvider getDefaultPrimaryDataStoreProvider();
|
public DataStoreProvider getDefaultPrimaryDataStoreProvider();
|
||||||
public DataStoreProvider getDefaultImageDataStoreProvider();
|
public DataStoreProvider getDefaultImageDataStoreProvider();
|
||||||
|
public DataStoreProvider getDefaultCacheDataStoreProvider();
|
||||||
public List<DataStoreProvider> getDataStoreProviders();
|
public List<DataStoreProvider> getDataStoreProviders();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -16,8 +16,9 @@
|
|||||||
* specific language governing permissions and limitations
|
* specific language governing permissions and limitations
|
||||||
* under the License.
|
* under the License.
|
||||||
*/
|
*/
|
||||||
package org.apache.cloudstack.storage.backup;
|
package org.apache.cloudstack.engine.subsystem.api.storage;
|
||||||
|
|
||||||
public interface BackupMotionService {
|
|
||||||
boolean copySnapshot(String snapshotUri, String destSnapshotUri);
|
public interface StorageCacheManager {
|
||||||
|
public DataStore getCacheStorage(Scope scope);
|
||||||
}
|
}
|
||||||
@ -28,6 +28,8 @@ import javax.persistence.Id;
|
|||||||
import javax.persistence.Table;
|
import javax.persistence.Table;
|
||||||
import javax.persistence.TableGenerator;
|
import javax.persistence.TableGenerator;
|
||||||
|
|
||||||
|
import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreRole;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
import com.cloud.storage.ImageStore;
|
import com.cloud.storage.ImageStore;
|
||||||
@ -69,6 +71,18 @@ public class ImageStoreVO implements ImageStore {
|
|||||||
|
|
||||||
@Column(name=GenericDao.REMOVED_COLUMN)
|
@Column(name=GenericDao.REMOVED_COLUMN)
|
||||||
private Date removed;
|
private Date removed;
|
||||||
|
|
||||||
|
@Column(name = "role")
|
||||||
|
@Enumerated(value = EnumType.STRING)
|
||||||
|
private DataStoreRole role;
|
||||||
|
|
||||||
|
public DataStoreRole getRole() {
|
||||||
|
return role;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setRole(DataStoreRole role) {
|
||||||
|
this.role = role;
|
||||||
|
}
|
||||||
|
|
||||||
public long getId() {
|
public long getId() {
|
||||||
return this.id;
|
return this.id;
|
||||||
|
|||||||
@ -39,8 +39,8 @@
|
|||||||
<module>storage</module>
|
<module>storage</module>
|
||||||
<module>storage/volume</module>
|
<module>storage/volume</module>
|
||||||
<module>storage/image</module>
|
<module>storage/image</module>
|
||||||
<module>storage/imagemotion</module>
|
<module>storage/datamotion</module>
|
||||||
<module>storage/backup</module>
|
<module>storage/cache</module>
|
||||||
<module>storage/snapshot</module>
|
<module>storage/snapshot</module>
|
||||||
<module>storage/integration-test</module>
|
<module>storage/integration-test</module>
|
||||||
<module>components-api</module>
|
<module>components-api</module>
|
||||||
|
|||||||
@ -1,26 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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.storage.backup;
|
|
||||||
|
|
||||||
import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotInfo;
|
|
||||||
|
|
||||||
public interface BackupService {
|
|
||||||
public boolean backupSnapshot(SnapshotInfo snapshot, long backupStoreId);
|
|
||||||
public SnapshotOnBackupStoreInfo getSnapshot(long snapshotId);
|
|
||||||
}
|
|
||||||
@ -11,8 +11,8 @@
|
|||||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<artifactId>cloud-engine-storage-backup</artifactId>
|
<artifactId>cloud-engine-storage-cache</artifactId>
|
||||||
<name>Apache CloudStack Engine Storage Backup Component</name>
|
<name>Apache CloudStack Engine Storage Cache Component</name>
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>org.apache.cloudstack</groupId>
|
<groupId>org.apache.cloudstack</groupId>
|
||||||
<artifactId>cloud-engine</artifactId>
|
<artifactId>cloud-engine</artifactId>
|
||||||
@ -16,9 +16,11 @@
|
|||||||
* specific language governing permissions and limitations
|
* specific language governing permissions and limitations
|
||||||
* under the License.
|
* under the License.
|
||||||
*/
|
*/
|
||||||
package org.apache.cloudstack.storage.image.motion;
|
package org.apache.cloudstack.storage.cache.allocator;
|
||||||
|
|
||||||
import org.apache.cloudstack.storage.motion.DataMotionStrategy;
|
import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
|
||||||
|
import org.apache.cloudstack.engine.subsystem.api.storage.Scope;
|
||||||
|
|
||||||
public interface ImageMotionStrategy extends DataMotionStrategy {
|
public interface StorageCacheAllocator {
|
||||||
|
DataStore getCacheStore(Scope scope);
|
||||||
}
|
}
|
||||||
@ -0,0 +1,51 @@
|
|||||||
|
/*
|
||||||
|
* 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.storage.cache.allocator;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import javax.inject.Inject;
|
||||||
|
|
||||||
|
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 com.cloud.storage.ScopeType;
|
||||||
|
import com.cloud.utils.exception.CloudRuntimeException;
|
||||||
|
|
||||||
|
import edu.emory.mathcs.backport.java.util.Collections;
|
||||||
|
|
||||||
|
public class StorageCacheRandomAllocator implements StorageCacheAllocator {
|
||||||
|
@Inject
|
||||||
|
DataStoreManager dataStoreMgr;
|
||||||
|
@Override
|
||||||
|
public DataStore getCacheStore(Scope scope) {
|
||||||
|
if (scope.getScopeType() != ScopeType.ZONE) {
|
||||||
|
throw new CloudRuntimeException("Can only support zone wide cache storage");
|
||||||
|
}
|
||||||
|
|
||||||
|
List<DataStore> cacheStores = dataStoreMgr.getImageCacheStores(scope);
|
||||||
|
if (cacheStores.size() <= 0) {
|
||||||
|
throw new CloudRuntimeException("Can't find cache storage in zone: " + scope.getScopeId());
|
||||||
|
}
|
||||||
|
|
||||||
|
Collections.shuffle(cacheStores);
|
||||||
|
return cacheStores.get(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
100
engine/storage/cache/src/org/apache/cloudstack/storage/cache/manager/StorageCacheManagerImpl.java
vendored
Normal file
100
engine/storage/cache/src/org/apache/cloudstack/storage/cache/manager/StorageCacheManagerImpl.java
vendored
Normal file
@ -0,0 +1,100 @@
|
|||||||
|
/*
|
||||||
|
* 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.storage.cache.manager;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
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.Scope;
|
||||||
|
import org.apache.cloudstack.engine.subsystem.api.storage.StorageCacheManager;
|
||||||
|
import org.apache.cloudstack.storage.cache.allocator.StorageCacheAllocator;
|
||||||
|
|
||||||
|
import com.cloud.utils.component.Manager;
|
||||||
|
|
||||||
|
public class StorageCacheManagerImpl implements StorageCacheManager, Manager {
|
||||||
|
@Inject
|
||||||
|
List<StorageCacheAllocator> storageCacheAllocator;
|
||||||
|
@Override
|
||||||
|
public DataStore getCacheStorage(Scope scope) {
|
||||||
|
for (StorageCacheAllocator allocator : storageCacheAllocator) {
|
||||||
|
DataStore store = allocator.getCacheStore(scope);
|
||||||
|
if (store != null) {
|
||||||
|
return store;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getName() {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setName(String name) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setConfigParams(Map<String, Object> params) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Map<String, Object> getConfigParams() {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getRunLevel() {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setRunLevel(int level) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean configure(String name, Map<String, Object> params) throws ConfigurationException {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean start() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean stop() {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -11,8 +11,8 @@
|
|||||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<artifactId>cloud-engine-storage-imagemotion</artifactId>
|
<artifactId>cloud-engine-storage-datamotion</artifactId>
|
||||||
<name>Apache CloudStack Engine Storage Image Motion Component</name>
|
<name>Apache CloudStack Engine Storage Data Motion Component</name>
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>org.apache.cloudstack</groupId>
|
<groupId>org.apache.cloudstack</groupId>
|
||||||
<artifactId>cloud-engine</artifactId>
|
<artifactId>cloud-engine</artifactId>
|
||||||
@ -24,6 +24,7 @@ import java.util.List;
|
|||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
|
|
||||||
import org.apache.cloudstack.engine.subsystem.api.storage.CopyCommandResult;
|
import org.apache.cloudstack.engine.subsystem.api.storage.CopyCommandResult;
|
||||||
|
import org.apache.cloudstack.engine.subsystem.api.storage.DataMotionStrategy;
|
||||||
import org.apache.cloudstack.engine.subsystem.api.storage.DataObject;
|
import org.apache.cloudstack.engine.subsystem.api.storage.DataObject;
|
||||||
import org.apache.cloudstack.engine.subsystem.api.storage.DataObjectType;
|
import org.apache.cloudstack.engine.subsystem.api.storage.DataObjectType;
|
||||||
import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
|
import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
|
||||||
@ -23,6 +23,8 @@ import java.util.List;
|
|||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
|
|
||||||
import org.apache.cloudstack.engine.subsystem.api.storage.CopyCommandResult;
|
import org.apache.cloudstack.engine.subsystem.api.storage.CopyCommandResult;
|
||||||
|
import org.apache.cloudstack.engine.subsystem.api.storage.DataMotionService;
|
||||||
|
import org.apache.cloudstack.engine.subsystem.api.storage.DataMotionStrategy;
|
||||||
import org.apache.cloudstack.engine.subsystem.api.storage.DataObject;
|
import org.apache.cloudstack.engine.subsystem.api.storage.DataObject;
|
||||||
import org.apache.cloudstack.framework.async.AsyncCompletionCallback;
|
import org.apache.cloudstack.framework.async.AsyncCompletionCallback;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
@ -28,6 +28,7 @@ import javax.inject.Inject;
|
|||||||
|
|
||||||
import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
|
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.DataStoreProviderManager;
|
||||||
|
import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreRole;
|
||||||
import org.apache.cloudstack.engine.subsystem.api.storage.ImageStoreProvider;
|
import org.apache.cloudstack.engine.subsystem.api.storage.ImageStoreProvider;
|
||||||
import org.apache.cloudstack.engine.subsystem.api.storage.Scope;
|
import org.apache.cloudstack.engine.subsystem.api.storage.Scope;
|
||||||
import org.apache.cloudstack.engine.subsystem.api.storage.ZoneScope;
|
import org.apache.cloudstack.engine.subsystem.api.storage.ZoneScope;
|
||||||
@ -37,12 +38,18 @@ import org.apache.cloudstack.storage.image.ImageStoreDriver;
|
|||||||
import org.apache.cloudstack.storage.image.datastore.ImageStoreEntity;
|
import org.apache.cloudstack.storage.image.datastore.ImageStoreEntity;
|
||||||
import org.apache.cloudstack.storage.image.datastore.ImageStoreProviderManager;
|
import org.apache.cloudstack.storage.image.datastore.ImageStoreProviderManager;
|
||||||
import org.apache.cloudstack.storage.image.store.ImageStoreImpl;
|
import org.apache.cloudstack.storage.image.store.ImageStoreImpl;
|
||||||
|
import org.apache.log4j.Logger;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import com.cloud.storage.ScopeType;
|
||||||
import com.cloud.storage.dao.VMTemplateDao;
|
import com.cloud.storage.dao.VMTemplateDao;
|
||||||
|
import com.cloud.utils.db.SearchCriteria.Op;
|
||||||
|
import com.cloud.utils.db.SearchCriteria2;
|
||||||
|
import com.cloud.utils.db.SearchCriteriaService;
|
||||||
|
|
||||||
@Component
|
@Component
|
||||||
public class ImageStoreProviderManagerImpl implements ImageStoreProviderManager {
|
public class ImageStoreProviderManagerImpl implements ImageStoreProviderManager {
|
||||||
|
private static final Logger s_logger = Logger.getLogger(ImageStoreProviderManagerImpl.class);
|
||||||
@Inject
|
@Inject
|
||||||
ImageStoreDao dataStoreDao;
|
ImageStoreDao dataStoreDao;
|
||||||
@Inject
|
@Inject
|
||||||
@ -115,4 +122,21 @@ public class ImageStoreProviderManagerImpl implements ImageStoreProviderManager
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<DataStore> listImageCacheStores(Scope scope) {
|
||||||
|
List<DataStore> imageStores = new ArrayList<DataStore>();
|
||||||
|
if (scope.getScopeType() != ScopeType.ZONE) {
|
||||||
|
s_logger.debug("only support zone wide image cache stores");
|
||||||
|
return imageStores;
|
||||||
|
}
|
||||||
|
SearchCriteriaService<ImageStoreVO, ImageStoreVO> sc = SearchCriteria2.create(ImageStoreVO.class);
|
||||||
|
sc.addAnd(sc.getEntity().getScope(), Op.EQ, ScopeType.ZONE);
|
||||||
|
sc.addAnd(sc.getEntity().getDataCenterId(), Op.EQ, scope.getScopeId());
|
||||||
|
sc.addAnd(sc.getEntity().getRole(), Op.EQ, DataStoreRole.ImageCache);
|
||||||
|
List<ImageStoreVO> cacheStores = sc.list();
|
||||||
|
for (ImageStoreVO store : cacheStores) {
|
||||||
|
imageStores.add(getImageStore(store.getId()));
|
||||||
|
}
|
||||||
|
return imageStores;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,140 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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.storage.image.motion;
|
|
||||||
|
|
||||||
import javax.inject.Inject;
|
|
||||||
|
|
||||||
import org.apache.cloudstack.engine.subsystem.api.storage.CopyCommandResult;
|
|
||||||
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.EndPoint;
|
|
||||||
import org.apache.cloudstack.framework.async.AsyncCallbackDispatcher;
|
|
||||||
import org.apache.cloudstack.framework.async.AsyncCompletionCallback;
|
|
||||||
import org.apache.cloudstack.framework.async.AsyncRpcConext;
|
|
||||||
import org.apache.cloudstack.storage.command.CopyCmd;
|
|
||||||
import org.apache.cloudstack.storage.command.CopyCmdAnswer;
|
|
||||||
import org.apache.cloudstack.storage.endpoint.EndPointSelector;
|
|
||||||
import org.apache.cloudstack.storage.volume.TemplateOnPrimaryDataStoreInfo;
|
|
||||||
|
|
||||||
import com.cloud.agent.api.Answer;
|
|
||||||
|
|
||||||
//At least one of datastore is coming from image store or image cache store
|
|
||||||
|
|
||||||
public class DefaultImageMotionStrategy implements ImageMotionStrategy {
|
|
||||||
@Inject
|
|
||||||
EndPointSelector selector;
|
|
||||||
private class CreateTemplateContext<T> extends AsyncRpcConext<T> {
|
|
||||||
private final TemplateOnPrimaryDataStoreInfo template;
|
|
||||||
public CreateTemplateContext(AsyncCompletionCallback<T> callback, TemplateOnPrimaryDataStoreInfo template) {
|
|
||||||
super(callback);
|
|
||||||
this.template = template;
|
|
||||||
}
|
|
||||||
|
|
||||||
public TemplateOnPrimaryDataStoreInfo getTemplate() {
|
|
||||||
return this.template;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
@Override
|
|
||||||
public void copyTemplateAsync(String destUri, String srcUri, EndPoint ep, AsyncCompletionCallback<CommandResult> callback) {
|
|
||||||
|
|
||||||
CopyCmd copyCommand = new CopyCmd(destUri, srcUri);
|
|
||||||
CreateTemplateContext<CommandResult> context = new CreateTemplateContext<CommandResult>(callback, null);
|
|
||||||
AsyncCallbackDispatcher<DefaultImageMotionStrategy, Answer> caller = AsyncCallbackDispatcher.create(this);
|
|
||||||
caller.setCallback(caller.getTarget().copyTemplateCallBack(null, null))
|
|
||||||
.setContext(context);
|
|
||||||
|
|
||||||
ep.sendMessageAsync(copyCommand, caller);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Object copyTemplateCallBack(AsyncCallbackDispatcher<DefaultImageMotionStrategy, Answer> callback, CreateTemplateContext<CommandResult> context) {
|
|
||||||
AsyncCompletionCallback<CommandResult> parentCall = context.getParentCallback();
|
|
||||||
CopyTemplateToPrimaryStorageAnswer answer = (CopyTemplateToPrimaryStorageAnswer)callback.getResult();
|
|
||||||
CommandResult result = new CommandResult();
|
|
||||||
|
|
||||||
if (!answer.getResult()) {
|
|
||||||
result.setSucess(answer.getResult());
|
|
||||||
result.setResult(answer.getDetails());
|
|
||||||
} else {
|
|
||||||
TemplateOnPrimaryDataStoreInfo templateStore = context.getTemplate();
|
|
||||||
templateStore.setPath(answer.getPath());
|
|
||||||
result.setSucess(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
parentCall.complete(result);
|
|
||||||
return null;
|
|
||||||
}*/
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean canHandle(DataObject srcData, DataObject destData) {
|
|
||||||
/*
|
|
||||||
DataStore destStore = destData.getDataStore();
|
|
||||||
DataStore srcStore = srcData.getDataStore();
|
|
||||||
if (destStore.getRole() == DataStoreRole.Image || destStore.getRole() == DataStoreRole.ImageCache
|
|
||||||
|| srcStore.getRole() == DataStoreRole.Image
|
|
||||||
|| srcStore.getRole() == DataStoreRole.ImageCache) {
|
|
||||||
return true;
|
|
||||||
}*/
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Void copyAsync(DataObject srcData, DataObject destData,
|
|
||||||
AsyncCompletionCallback<CopyCommandResult> callback) {
|
|
||||||
DataStore destStore = destData.getDataStore();
|
|
||||||
DataStore srcStore = srcData.getDataStore();
|
|
||||||
EndPoint ep = selector.select(srcData, destData);
|
|
||||||
CopyCommandResult result = new CopyCommandResult("", null);
|
|
||||||
if (ep == null) {
|
|
||||||
result.setResult("can't find end point");
|
|
||||||
callback.complete(result);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
String srcUri = srcStore.getDriver().grantAccess(srcData, ep);
|
|
||||||
String destUri = destStore.getDriver().grantAccess(destData, ep);
|
|
||||||
CopyCmd cmd = new CopyCmd(srcUri, destUri);
|
|
||||||
|
|
||||||
CreateTemplateContext<CopyCommandResult> context = new CreateTemplateContext<CopyCommandResult>(callback, null);
|
|
||||||
AsyncCallbackDispatcher<DefaultImageMotionStrategy, Answer> caller = AsyncCallbackDispatcher.create(this);
|
|
||||||
caller.setCallback(caller.getTarget().copyAsyncCallback(null, null))
|
|
||||||
.setContext(context);
|
|
||||||
|
|
||||||
ep.sendMessageAsync(cmd, caller);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected Void copyAsyncCallback(AsyncCallbackDispatcher<DefaultImageMotionStrategy, Answer> callback, CreateTemplateContext<CopyCommandResult> context) {
|
|
||||||
AsyncCompletionCallback<CopyCommandResult> parentCall = context.getParentCallback();
|
|
||||||
Answer answer = (Answer)callback.getResult();
|
|
||||||
if (!answer.getResult()) {
|
|
||||||
CopyCommandResult result = new CopyCommandResult("", null);
|
|
||||||
result.setResult(answer.getDetails());
|
|
||||||
parentCall.complete(result);
|
|
||||||
} else {
|
|
||||||
CopyCmdAnswer ans = (CopyCmdAnswer)answer;
|
|
||||||
CopyCommandResult result = new CopyCommandResult(ans.getPath(), null);
|
|
||||||
parentCall.complete(result);
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@ -1,70 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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.storage.image.motion;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import javax.inject.Inject;
|
|
||||||
|
|
||||||
import org.apache.cloudstack.engine.subsystem.api.storage.CommandResult;
|
|
||||||
import org.apache.cloudstack.engine.subsystem.api.storage.ImageService;
|
|
||||||
import org.apache.cloudstack.engine.subsystem.api.storage.TemplateInfo;
|
|
||||||
import org.apache.cloudstack.engine.subsystem.api.storage.VolumeService;
|
|
||||||
import org.apache.cloudstack.framework.async.AsyncCompletionCallback;
|
|
||||||
|
|
||||||
|
|
||||||
public class ImageMotionServiceImpl implements ImageMotionService {
|
|
||||||
@Inject
|
|
||||||
List<ImageMotionStrategy> motionStrategies;
|
|
||||||
@Inject
|
|
||||||
VolumeService volumeService;
|
|
||||||
@Inject
|
|
||||||
ImageService imageService;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean copyIso(String isoUri, String destIsoUri) {
|
|
||||||
// TODO Auto-generated method stub
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void copyTemplateAsync(TemplateInfo destTemplate, TemplateInfo srcTemplate, AsyncCompletionCallback<CommandResult> callback) {
|
|
||||||
/* ImageMotionStrategy ims = null;
|
|
||||||
for (ImageMotionStrategy strategy : motionStrategies) {
|
|
||||||
if (strategy.canHandle(srcTemplate)) {
|
|
||||||
ims = strategy;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ims == null) {
|
|
||||||
throw new CloudRuntimeException("Can't find proper image motion strategy");
|
|
||||||
}
|
|
||||||
|
|
||||||
EndPoint ep = ims.getEndPoint(destTemplate, srcTemplate);
|
|
||||||
String srcUri = srcTemplate.getDataStore().grantAccess(srcTemplate, ep);
|
|
||||||
String destUri = destTemplate.getDataStore().grantAccess(destTemplate, ep);
|
|
||||||
|
|
||||||
ims.copyTemplateAsync(destUri, srcUri, ep, callback);*/
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
@ -19,9 +19,9 @@
|
|||||||
package org.apache.cloudstack.storage.test;
|
package org.apache.cloudstack.storage.test;
|
||||||
|
|
||||||
import org.apache.cloudstack.engine.subsystem.api.storage.CopyCommandResult;
|
import org.apache.cloudstack.engine.subsystem.api.storage.CopyCommandResult;
|
||||||
|
import org.apache.cloudstack.engine.subsystem.api.storage.DataMotionStrategy;
|
||||||
import org.apache.cloudstack.engine.subsystem.api.storage.DataObject;
|
import org.apache.cloudstack.engine.subsystem.api.storage.DataObject;
|
||||||
import org.apache.cloudstack.framework.async.AsyncCompletionCallback;
|
import org.apache.cloudstack.framework.async.AsyncCompletionCallback;
|
||||||
import org.apache.cloudstack.storage.motion.DataMotionStrategy;
|
|
||||||
|
|
||||||
public class MockStorageMotionStrategy implements DataMotionStrategy {
|
public class MockStorageMotionStrategy implements DataMotionStrategy {
|
||||||
|
|
||||||
|
|||||||
@ -25,7 +25,7 @@ import javax.inject.Inject;
|
|||||||
import org.apache.cloudstack.engine.subsystem.api.storage.CommandResult;
|
import org.apache.cloudstack.engine.subsystem.api.storage.CommandResult;
|
||||||
import org.apache.cloudstack.engine.subsystem.api.storage.CopyCommandResult;
|
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.CreateCmdResult;
|
||||||
import org.apache.cloudstack.engine.subsystem.api.storage.DataObject;
|
import org.apache.cloudstack.engine.subsystem.api.storage.DataMotionService;
|
||||||
import org.apache.cloudstack.engine.subsystem.api.storage.DataObjectInStore;
|
import org.apache.cloudstack.engine.subsystem.api.storage.DataObjectInStore;
|
||||||
import org.apache.cloudstack.engine.subsystem.api.storage.DataObjectType;
|
import org.apache.cloudstack.engine.subsystem.api.storage.DataObjectType;
|
||||||
import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
|
import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
|
||||||
@ -45,23 +45,15 @@ import org.apache.cloudstack.framework.async.AsyncCompletionCallback;
|
|||||||
import org.apache.cloudstack.framework.async.AsyncRpcConext;
|
import org.apache.cloudstack.framework.async.AsyncRpcConext;
|
||||||
import org.apache.cloudstack.storage.datastore.ObjectInDataStoreManager;
|
import org.apache.cloudstack.storage.datastore.ObjectInDataStoreManager;
|
||||||
import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
|
import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
|
||||||
import org.apache.cloudstack.storage.motion.DataMotionService;
|
|
||||||
import org.apache.cloudstack.storage.snapshot.SnapshotObject;
|
import org.apache.cloudstack.storage.snapshot.SnapshotObject;
|
||||||
import org.apache.cloudstack.storage.snapshot.SnapshotStateMachineManager;
|
import org.apache.cloudstack.storage.snapshot.SnapshotStateMachineManager;
|
||||||
import org.apache.log4j.Logger;
|
import org.apache.log4j.Logger;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
import com.cloud.agent.api.Answer;
|
|
||||||
import com.cloud.agent.api.BackupSnapshotAnswer;
|
import com.cloud.agent.api.BackupSnapshotAnswer;
|
||||||
import com.cloud.agent.api.DeleteSnapshotBackupCommand;
|
|
||||||
import com.cloud.agent.api.to.S3TO;
|
|
||||||
import com.cloud.agent.api.to.SwiftTO;
|
|
||||||
import com.cloud.configuration.Resource.ResourceType;
|
|
||||||
import com.cloud.configuration.dao.ConfigurationDao;
|
import com.cloud.configuration.dao.ConfigurationDao;
|
||||||
import com.cloud.dc.ClusterVO;
|
import com.cloud.dc.ClusterVO;
|
||||||
import com.cloud.dc.dao.ClusterDao;
|
import com.cloud.dc.dao.ClusterDao;
|
||||||
import com.cloud.event.EventTypes;
|
|
||||||
import com.cloud.event.UsageEventUtils;
|
|
||||||
import com.cloud.exception.InvalidParameterValueException;
|
import com.cloud.exception.InvalidParameterValueException;
|
||||||
import com.cloud.host.HostVO;
|
import com.cloud.host.HostVO;
|
||||||
import com.cloud.hypervisor.Hypervisor.HypervisorType;
|
import com.cloud.hypervisor.Hypervisor.HypervisorType;
|
||||||
@ -73,12 +65,9 @@ import com.cloud.storage.VolumeManager;
|
|||||||
import com.cloud.storage.VolumeVO;
|
import com.cloud.storage.VolumeVO;
|
||||||
import com.cloud.storage.dao.SnapshotDao;
|
import com.cloud.storage.dao.SnapshotDao;
|
||||||
import com.cloud.storage.dao.VolumeDao;
|
import com.cloud.storage.dao.VolumeDao;
|
||||||
import com.cloud.storage.s3.S3Manager;
|
|
||||||
import com.cloud.storage.snapshot.SnapshotManager;
|
import com.cloud.storage.snapshot.SnapshotManager;
|
||||||
import com.cloud.storage.swift.SwiftManager;
|
|
||||||
import com.cloud.utils.NumbersUtil;
|
import com.cloud.utils.NumbersUtil;
|
||||||
import com.cloud.utils.db.DB;
|
import com.cloud.utils.db.DB;
|
||||||
import com.cloud.utils.db.Transaction;
|
|
||||||
import com.cloud.utils.exception.CloudRuntimeException;
|
import com.cloud.utils.exception.CloudRuntimeException;
|
||||||
import com.cloud.utils.fsm.NoTransitionException;
|
import com.cloud.utils.fsm.NoTransitionException;
|
||||||
import com.cloud.vm.UserVmVO;
|
import com.cloud.vm.UserVmVO;
|
||||||
|
|||||||
@ -23,6 +23,7 @@ import javax.inject.Inject;
|
|||||||
import org.apache.cloudstack.engine.subsystem.api.storage.CommandResult;
|
import org.apache.cloudstack.engine.subsystem.api.storage.CommandResult;
|
||||||
import org.apache.cloudstack.engine.subsystem.api.storage.CopyCommandResult;
|
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.CreateCmdResult;
|
||||||
|
import org.apache.cloudstack.engine.subsystem.api.storage.DataMotionService;
|
||||||
import org.apache.cloudstack.engine.subsystem.api.storage.DataObject;
|
import org.apache.cloudstack.engine.subsystem.api.storage.DataObject;
|
||||||
import org.apache.cloudstack.engine.subsystem.api.storage.DataObjectInStore;
|
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.DataStore;
|
||||||
@ -31,7 +32,6 @@ import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreState
|
|||||||
import org.apache.cloudstack.framework.async.AsyncCallbackDispatcher;
|
import org.apache.cloudstack.framework.async.AsyncCallbackDispatcher;
|
||||||
import org.apache.cloudstack.framework.async.AsyncCompletionCallback;
|
import org.apache.cloudstack.framework.async.AsyncCompletionCallback;
|
||||||
import org.apache.cloudstack.framework.async.AsyncRpcConext;
|
import org.apache.cloudstack.framework.async.AsyncRpcConext;
|
||||||
import org.apache.cloudstack.storage.motion.DataMotionService;
|
|
||||||
import org.apache.log4j.Logger;
|
import org.apache.log4j.Logger;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
|||||||
@ -46,6 +46,8 @@ public class DataStoreManagerImpl implements DataStoreManager {
|
|||||||
return primaryStorMgr.getPrimaryDataStore(storeId);
|
return primaryStorMgr.getPrimaryDataStore(storeId);
|
||||||
} else if (role == DataStoreRole.Image) {
|
} else if (role == DataStoreRole.Image) {
|
||||||
return imageDataStoreMgr.getImageStore(storeId);
|
return imageDataStoreMgr.getImageStore(storeId);
|
||||||
|
} else if (role == DataStoreRole.ImageCache) {
|
||||||
|
return imageDataStoreMgr.getImageStore(storeId);
|
||||||
}
|
}
|
||||||
throw new CloudRuntimeException("un recognized type" + role);
|
throw new CloudRuntimeException("un recognized type" + role);
|
||||||
}
|
}
|
||||||
@ -81,5 +83,8 @@ public class DataStoreManagerImpl implements DataStoreManager {
|
|||||||
public DataStore getPrimaryDataStore(long storeId) {
|
public DataStore getPrimaryDataStore(long storeId) {
|
||||||
return primaryStorMgr.getPrimaryDataStore(storeId);
|
return primaryStorMgr.getPrimaryDataStore(storeId);
|
||||||
}
|
}
|
||||||
|
@Override
|
||||||
|
public List<DataStore> getImageCacheStores(Scope scope) {
|
||||||
|
return imageDataStoreMgr.listImageCacheStores(scope);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -161,11 +161,7 @@ public class ObjectInDataStoreManagerImpl implements ObjectInDataStoreManager {
|
|||||||
this.stateMachines.transitTo(obj, event, null,
|
this.stateMachines.transitTo(obj, event, null,
|
||||||
templatePoolDao);
|
templatePoolDao);
|
||||||
} catch (NoTransitionException e) {
|
} catch (NoTransitionException e) {
|
||||||
if (event == Event.CreateOnlyRequested || event == Event.OperationSuccessed) {
|
|
||||||
s_logger.debug("allow muliple create requests");
|
|
||||||
} else {
|
|
||||||
throw e;
|
throw e;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
throw new CloudRuntimeException("Invalid data or store type: " + data.getType() + " " + data.getDataStore().getRole());
|
throw new CloudRuntimeException("Invalid data or store type: " + data.getType() + " " + data.getDataStore().getRole());
|
||||||
|
|||||||
@ -34,8 +34,8 @@ import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreProviderManag
|
|||||||
import org.apache.cloudstack.engine.subsystem.api.storage.ImageStoreProvider;
|
import org.apache.cloudstack.engine.subsystem.api.storage.ImageStoreProvider;
|
||||||
import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreDriver;
|
import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreDriver;
|
||||||
import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreProvider;
|
import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreProvider;
|
||||||
import org.apache.cloudstack.storage.image.ImageStoreDriver;
|
|
||||||
import org.apache.cloudstack.storage.datastore.PrimaryDataStoreProviderManager;
|
import org.apache.cloudstack.storage.datastore.PrimaryDataStoreProviderManager;
|
||||||
|
import org.apache.cloudstack.storage.image.ImageStoreDriver;
|
||||||
import org.apache.cloudstack.storage.image.datastore.ImageStoreProviderManager;
|
import org.apache.cloudstack.storage.image.datastore.ImageStoreProviderManager;
|
||||||
import org.apache.log4j.Logger;
|
import org.apache.log4j.Logger;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
@ -68,7 +68,7 @@ public class DataStoreProviderManagerImpl extends ManagerBase implements DataSto
|
|||||||
public List<StorageProviderResponse> getPrimaryDataStoreProviders() {
|
public List<StorageProviderResponse> getPrimaryDataStoreProviders() {
|
||||||
List<StorageProviderResponse> providers = new ArrayList<StorageProviderResponse>();
|
List<StorageProviderResponse> providers = new ArrayList<StorageProviderResponse>();
|
||||||
for (DataStoreProvider provider : providerMap.values()) {
|
for (DataStoreProvider provider : providerMap.values()) {
|
||||||
if (provider instanceof PrimaryDataStoreProvider) {
|
if (provider.getTypes().contains(DataStoreProviderType.PRIMARY)) {
|
||||||
StorageProviderResponse response = new StorageProviderResponse();
|
StorageProviderResponse response = new StorageProviderResponse();
|
||||||
response.setName(provider.getName());
|
response.setName(provider.getName());
|
||||||
response.setType(DataStoreProvider.DataStoreProviderType.PRIMARY.toString());
|
response.setType(DataStoreProvider.DataStoreProviderType.PRIMARY.toString());
|
||||||
@ -81,7 +81,7 @@ public class DataStoreProviderManagerImpl extends ManagerBase implements DataSto
|
|||||||
public List<StorageProviderResponse> getImageDataStoreProviders() {
|
public List<StorageProviderResponse> getImageDataStoreProviders() {
|
||||||
List<StorageProviderResponse> providers = new ArrayList<StorageProviderResponse>();
|
List<StorageProviderResponse> providers = new ArrayList<StorageProviderResponse>();
|
||||||
for (DataStoreProvider provider : providerMap.values()) {
|
for (DataStoreProvider provider : providerMap.values()) {
|
||||||
if (provider instanceof ImageStoreProvider) {
|
if (provider.getTypes().contains(DataStoreProviderType.IMAGE)) {
|
||||||
StorageProviderResponse response = new StorageProviderResponse();
|
StorageProviderResponse response = new StorageProviderResponse();
|
||||||
response.setName(provider.getName());
|
response.setName(provider.getName());
|
||||||
response.setType(DataStoreProvider.DataStoreProviderType.IMAGE.toString());
|
response.setType(DataStoreProvider.DataStoreProviderType.IMAGE.toString());
|
||||||
@ -90,6 +90,19 @@ public class DataStoreProviderManagerImpl extends ManagerBase implements DataSto
|
|||||||
}
|
}
|
||||||
return providers;
|
return providers;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public List<StorageProviderResponse> getCacheDataStoreProviders() {
|
||||||
|
List<StorageProviderResponse> providers = new ArrayList<StorageProviderResponse>();
|
||||||
|
for (DataStoreProvider provider : providerMap.values()) {
|
||||||
|
if (provider.getTypes().contains(DataStoreProviderType.ImageCache)) {
|
||||||
|
StorageProviderResponse response = new StorageProviderResponse();
|
||||||
|
response.setName(provider.getName());
|
||||||
|
response.setType(DataStoreProviderType.ImageCache.toString());
|
||||||
|
providers.add(response);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return providers;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean configure(String name, Map<String, Object> params)
|
public boolean configure(String name, Map<String, Object> params)
|
||||||
@ -125,6 +138,7 @@ public class DataStoreProviderManagerImpl extends ManagerBase implements DataSto
|
|||||||
} catch(Exception e) {
|
} catch(Exception e) {
|
||||||
s_logger.debug("configure provider failed", e);
|
s_logger.debug("configure provider failed", e);
|
||||||
providerMap.remove(providerName);
|
providerMap.remove(providerName);
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -141,6 +155,11 @@ public class DataStoreProviderManagerImpl extends ManagerBase implements DataSto
|
|||||||
public DataStoreProvider getDefaultImageDataStoreProvider() {
|
public DataStoreProvider getDefaultImageDataStoreProvider() {
|
||||||
return this.getDataStoreProvider("CloudStack ImageStore Provider");
|
return this.getDataStoreProvider("CloudStack ImageStore Provider");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public DataStoreProvider getDefaultCacheDataStoreProvider() {
|
||||||
|
return this.getDataStoreProvider("cloudstack image store provider");
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<StorageProviderResponse> getDataStoreProviders(String type) {
|
public List<StorageProviderResponse> getDataStoreProviders(String type) {
|
||||||
@ -151,6 +170,8 @@ public class DataStoreProviderManagerImpl extends ManagerBase implements DataSto
|
|||||||
return this.getPrimaryDataStoreProviders();
|
return this.getPrimaryDataStoreProviders();
|
||||||
} else if (type.equalsIgnoreCase(DataStoreProvider.DataStoreProviderType.IMAGE.toString())) {
|
} else if (type.equalsIgnoreCase(DataStoreProvider.DataStoreProviderType.IMAGE.toString())) {
|
||||||
return this.getImageDataStoreProviders();
|
return this.getImageDataStoreProviders();
|
||||||
|
} else if (type.equalsIgnoreCase(DataStoreProvider.DataStoreProviderType.ImageCache.toString())) {
|
||||||
|
return this.getCacheDataStoreProviders();
|
||||||
} else {
|
} else {
|
||||||
throw new InvalidParameterValueException("Invalid parameter: " + type);
|
throw new InvalidParameterValueException("Invalid parameter: " + type);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -23,6 +23,7 @@ import java.util.Map;
|
|||||||
|
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
|
|
||||||
|
import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreRole;
|
||||||
import org.apache.cloudstack.storage.datastore.db.ImageStoreDao;
|
import org.apache.cloudstack.storage.datastore.db.ImageStoreDao;
|
||||||
import org.apache.cloudstack.storage.datastore.db.ImageStoreDetailVO;
|
import org.apache.cloudstack.storage.datastore.db.ImageStoreDetailVO;
|
||||||
import org.apache.cloudstack.storage.datastore.db.ImageStoreDetailsDao;
|
import org.apache.cloudstack.storage.datastore.db.ImageStoreDetailsDao;
|
||||||
@ -52,6 +53,7 @@ public class ImageStoreHelper {
|
|||||||
store.setScope((ScopeType)params.get("scope"));
|
store.setScope((ScopeType)params.get("scope"));
|
||||||
store.setUuid((String)params.get("uuid"));
|
store.setUuid((String)params.get("uuid"));
|
||||||
store.setUrl((String)params.get("url"));
|
store.setUrl((String)params.get("url"));
|
||||||
|
store.setRole(DataStoreRole.getRole((String)params.get("role")));
|
||||||
store = imageStoreDao.persist(store);
|
store = imageStoreDao.persist(store);
|
||||||
return store;
|
return store;
|
||||||
}
|
}
|
||||||
@ -68,6 +70,7 @@ public class ImageStoreHelper {
|
|||||||
store.setScope((ScopeType)params.get("scope"));
|
store.setScope((ScopeType)params.get("scope"));
|
||||||
store.setUuid((String)params.get("uuid"));
|
store.setUuid((String)params.get("uuid"));
|
||||||
store.setUrl((String)params.get("url"));
|
store.setUrl((String)params.get("url"));
|
||||||
|
store.setRole(DataStoreRole.getRole((String)params.get("role")));
|
||||||
store = imageStoreDao.persist(store);
|
store = imageStoreDao.persist(store);
|
||||||
|
|
||||||
// persist details
|
// persist details
|
||||||
|
|||||||
@ -31,5 +31,6 @@ public interface ImageStoreProviderManager {
|
|||||||
List<DataStore> listImageStores();
|
List<DataStore> listImageStores();
|
||||||
List<DataStore> listImageStoresByScope(ZoneScope scope);
|
List<DataStore> listImageStoresByScope(ZoneScope scope);
|
||||||
List<DataStore> listImageStoreByProvider(String provider);
|
List<DataStore> listImageStoreByProvider(String provider);
|
||||||
|
List<DataStore> listImageCacheStores(Scope scope);
|
||||||
boolean registerDriver(String uuid, ImageStoreDriver driver);
|
boolean registerDriver(String uuid, ImageStoreDriver driver);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -20,12 +20,12 @@ package org.apache.cloudstack.storage.volume;
|
|||||||
|
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
|
|
||||||
|
import org.apache.cloudstack.engine.subsystem.api.storage.DataMotionService;
|
||||||
import org.apache.cloudstack.engine.subsystem.api.storage.ImageDataFactory;
|
import org.apache.cloudstack.engine.subsystem.api.storage.ImageDataFactory;
|
||||||
import org.apache.cloudstack.engine.subsystem.api.storage.TemplateInfo;
|
import org.apache.cloudstack.engine.subsystem.api.storage.TemplateInfo;
|
||||||
import org.apache.cloudstack.framework.async.AsyncCompletionCallback;
|
import org.apache.cloudstack.framework.async.AsyncCompletionCallback;
|
||||||
import org.apache.cloudstack.storage.datastore.ObjectInDataStoreManager;
|
import org.apache.cloudstack.storage.datastore.ObjectInDataStoreManager;
|
||||||
import org.apache.cloudstack.storage.datastore.PrimaryDataStore;
|
import org.apache.cloudstack.storage.datastore.PrimaryDataStore;
|
||||||
import org.apache.cloudstack.storage.motion.DataMotionService;
|
|
||||||
import org.apache.cloudstack.storage.volume.VolumeServiceImpl.CreateBaseImageResult;
|
import org.apache.cloudstack.storage.volume.VolumeServiceImpl.CreateBaseImageResult;
|
||||||
import org.apache.log4j.Logger;
|
import org.apache.log4j.Logger;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|||||||
@ -24,6 +24,7 @@ import org.apache.cloudstack.engine.cloud.entity.api.VolumeEntity;
|
|||||||
import org.apache.cloudstack.engine.subsystem.api.storage.CommandResult;
|
import org.apache.cloudstack.engine.subsystem.api.storage.CommandResult;
|
||||||
import org.apache.cloudstack.engine.subsystem.api.storage.CopyCommandResult;
|
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.CreateCmdResult;
|
||||||
|
import org.apache.cloudstack.engine.subsystem.api.storage.DataMotionService;
|
||||||
import org.apache.cloudstack.engine.subsystem.api.storage.DataObject;
|
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.DataStore;
|
||||||
import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine.Event;
|
import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine.Event;
|
||||||
@ -40,7 +41,6 @@ import org.apache.cloudstack.storage.datastore.DataObjectManager;
|
|||||||
import org.apache.cloudstack.storage.datastore.ObjectInDataStoreManager;
|
import org.apache.cloudstack.storage.datastore.ObjectInDataStoreManager;
|
||||||
import org.apache.cloudstack.storage.datastore.PrimaryDataStore;
|
import org.apache.cloudstack.storage.datastore.PrimaryDataStore;
|
||||||
import org.apache.cloudstack.storage.datastore.PrimaryDataStoreProviderManager;
|
import org.apache.cloudstack.storage.datastore.PrimaryDataStoreProviderManager;
|
||||||
import org.apache.cloudstack.storage.motion.DataMotionService;
|
|
||||||
import org.apache.log4j.Logger;
|
import org.apache.log4j.Logger;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
@ -52,7 +52,6 @@ import com.cloud.storage.VolumeVO;
|
|||||||
import com.cloud.storage.dao.VolumeDao;
|
import com.cloud.storage.dao.VolumeDao;
|
||||||
import com.cloud.storage.snapshot.SnapshotManager;
|
import com.cloud.storage.snapshot.SnapshotManager;
|
||||||
import com.cloud.utils.db.DB;
|
import com.cloud.utils.db.DB;
|
||||||
import com.cloud.utils.exception.CloudRuntimeException;
|
|
||||||
import com.cloud.vm.VirtualMachine;
|
import com.cloud.vm.VirtualMachine;
|
||||||
import com.cloud.vm.dao.VMInstanceDao;
|
import com.cloud.vm.dao.VMInstanceDao;
|
||||||
|
|
||||||
|
|||||||
@ -83,6 +83,7 @@ public class CloudStackImageStoreProviderImpl implements ImageStoreProvider {
|
|||||||
public Set<DataStoreProviderType> getTypes() {
|
public Set<DataStoreProviderType> getTypes() {
|
||||||
Set<DataStoreProviderType> types = new HashSet<DataStoreProviderType>();
|
Set<DataStoreProviderType> types = new HashSet<DataStoreProviderType>();
|
||||||
types.add(DataStoreProviderType.IMAGE);
|
types.add(DataStoreProviderType.IMAGE);
|
||||||
|
types.add(DataStoreProviderType.ImageCache);
|
||||||
return types;
|
return types;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -42,6 +42,7 @@ import javax.naming.ConfigurationException;
|
|||||||
|
|
||||||
import org.apache.cloudstack.api.command.admin.storage.AddImageStoreCmd;
|
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.CancelPrimaryStorageMaintenanceCmd;
|
||||||
|
import org.apache.cloudstack.api.command.admin.storage.CreateCacheStoreCmd;
|
||||||
import org.apache.cloudstack.api.command.admin.storage.CreateStoragePoolCmd;
|
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.DeleteImageStoreCmd;
|
||||||
import org.apache.cloudstack.api.command.admin.storage.DeletePoolCmd;
|
import org.apache.cloudstack.api.command.admin.storage.DeletePoolCmd;
|
||||||
@ -1966,6 +1967,7 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C
|
|||||||
params.put("details", details);
|
params.put("details", details);
|
||||||
params.put("scope", scopeType);
|
params.put("scope", scopeType);
|
||||||
params.put("providerName", storeProvider.getName());
|
params.put("providerName", storeProvider.getName());
|
||||||
|
params.put("role", DataStoreRole.Image);
|
||||||
|
|
||||||
DataStoreLifeCycle lifeCycle = storeProvider.getDataStoreLifeCycle();
|
DataStoreLifeCycle lifeCycle = storeProvider.getDataStoreLifeCycle();
|
||||||
DataStore store = null;
|
DataStore store = null;
|
||||||
@ -2017,6 +2019,74 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C
|
|||||||
txn.commit();
|
txn.commit();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@Override
|
||||||
|
public ImageStore createCacheStore(CreateCacheStoreCmd cmd) {
|
||||||
|
String providerName = cmd.getProviderName();
|
||||||
|
DataStoreProvider storeProvider = _dataStoreProviderMgr.getDataStoreProvider(providerName);
|
||||||
|
|
||||||
|
if (storeProvider == null) {
|
||||||
|
storeProvider = _dataStoreProviderMgr.getDefaultCacheDataStoreProvider();
|
||||||
|
if (storeProvider == null) {
|
||||||
|
throw new InvalidParameterValueException("can't find cache store provider: " + providerName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Long dcId = cmd.getZoneId();
|
||||||
|
|
||||||
|
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) {
|
||||||
|
throw new InvalidParameterValueException("Only zone wide cache storage is supported");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (scopeType == ScopeType.ZONE && dcId == null) {
|
||||||
|
throw new InvalidParameterValueException("zone id can't be null, if scope is zone");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// 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", cmd.getDetails());
|
||||||
|
params.put("scope", scopeType);
|
||||||
|
params.put("providerName", storeProvider.getName());
|
||||||
|
params.put("role", DataStoreRole.ImageCache);
|
||||||
|
|
||||||
|
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.ImageCache);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -95,6 +95,7 @@ known_categories = {
|
|||||||
'InstanceGroup': 'VM Group',
|
'InstanceGroup': 'VM Group',
|
||||||
'StorageMaintenance': 'Storage Pool',
|
'StorageMaintenance': 'Storage Pool',
|
||||||
'StoragePool': 'Storage Pool',
|
'StoragePool': 'Storage Pool',
|
||||||
|
'CacheStore': 'Storage Pool',
|
||||||
'StorageProvider': 'Storage Pool',
|
'StorageProvider': 'Storage Pool',
|
||||||
'SecurityGroup': 'Security Group',
|
'SecurityGroup': 'Security Group',
|
||||||
'SSH': 'SSH',
|
'SSH': 'SSH',
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user