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.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.DeleteImageStoreCmd; | ||||
| import org.apache.cloudstack.api.command.admin.storage.DeletePoolCmd; | ||||
| @ -48,6 +49,8 @@ public interface StorageService{ | ||||
|     StoragePool createPool(CreateStoragePoolCmd cmd) throws ResourceInUseException, IllegalArgumentException, | ||||
|     UnknownHostException, ResourceUnavailableException; | ||||
|      | ||||
|     ImageStore createCacheStore(CreateCacheStoreCmd cmd); | ||||
| 
 | ||||
|     /** | ||||
|      * 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 | ||||
|  * 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; | ||||
| 
 | ||||
| public interface DataMotionService { | ||||
| @ -16,10 +16,8 @@ | ||||
|  * specific language governing permissions and limitations | ||||
|  * 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; | ||||
| 
 | ||||
| public interface DataMotionStrategy { | ||||
| @ -28,5 +28,6 @@ public interface DataStoreManager { | ||||
|     public DataStore getDataStore(String uuid, DataStoreRole role); | ||||
|     public List<DataStore> getImageStoresByScope(ZoneScope scope); | ||||
|     public List<DataStore> getImageStoresByProvider(String provider); | ||||
|     public List<DataStore> getImageCacheStores(Scope scope); | ||||
|     public DataStore registerDataStore(Map<String, String> params, String providerUuid); | ||||
| } | ||||
|  | ||||
| @ -27,7 +27,8 @@ import java.util.Set; | ||||
| public interface DataStoreProvider { | ||||
|     public static enum DataStoreProviderType { | ||||
|         PRIMARY, | ||||
|         IMAGE | ||||
|         IMAGE, | ||||
|         ImageCache | ||||
|     } | ||||
|     public DataStoreLifeCycle getDataStoreLifeCycle(); | ||||
|     public DataStoreDriver getDataStoreDriver(); | ||||
|  | ||||
| @ -27,6 +27,7 @@ public interface DataStoreProviderManager extends Manager, DataStoreProviderApiS | ||||
|     public DataStoreProvider getDataStoreProvider(String name); | ||||
|     public DataStoreProvider getDefaultPrimaryDataStoreProvider(); | ||||
|     public DataStoreProvider getDefaultImageDataStoreProvider(); | ||||
|     public DataStoreProvider getDefaultCacheDataStoreProvider(); | ||||
|     public List<DataStoreProvider> getDataStoreProviders(); | ||||
| 
 | ||||
| } | ||||
|  | ||||
| @ -16,8 +16,9 @@ | ||||
|  * specific language governing permissions and limitations | ||||
|  * 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.TableGenerator; | ||||
| 
 | ||||
| import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreRole; | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| import com.cloud.storage.ImageStore; | ||||
| @ -70,6 +72,18 @@ public class ImageStoreVO implements ImageStore { | ||||
|     @Column(name=GenericDao.REMOVED_COLUMN) | ||||
|     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() { | ||||
|         return this.id; | ||||
|     } | ||||
|  | ||||
| @ -39,8 +39,8 @@ | ||||
|     <module>storage</module> | ||||
|     <module>storage/volume</module> | ||||
|     <module>storage/image</module> | ||||
|     <module>storage/imagemotion</module> | ||||
|     <module>storage/backup</module> | ||||
|     <module>storage/datamotion</module> | ||||
|     <module>storage/cache</module> | ||||
|     <module>storage/snapshot</module> | ||||
|     <module>storage/integration-test</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" | ||||
|   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> | ||||
|   <artifactId>cloud-engine-storage-backup</artifactId> | ||||
|   <name>Apache CloudStack Engine Storage Backup Component</name> | ||||
|   <artifactId>cloud-engine-storage-cache</artifactId> | ||||
|   <name>Apache CloudStack Engine Storage Cache Component</name> | ||||
|   <parent> | ||||
|     <groupId>org.apache.cloudstack</groupId> | ||||
|     <artifactId>cloud-engine</artifactId> | ||||
| @ -16,9 +16,11 @@ | ||||
|  * specific language governing permissions and limitations | ||||
|  * 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" | ||||
|   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> | ||||
|   <artifactId>cloud-engine-storage-imagemotion</artifactId> | ||||
|   <name>Apache CloudStack Engine Storage Image Motion Component</name> | ||||
|   <artifactId>cloud-engine-storage-datamotion</artifactId> | ||||
|   <name>Apache CloudStack Engine Storage Data Motion Component</name> | ||||
|   <parent> | ||||
|     <groupId>org.apache.cloudstack</groupId> | ||||
|     <artifactId>cloud-engine</artifactId> | ||||
| @ -24,6 +24,7 @@ import java.util.List; | ||||
| import javax.inject.Inject; | ||||
| 
 | ||||
| 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.DataObjectType; | ||||
| import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager; | ||||
| @ -23,6 +23,8 @@ import java.util.List; | ||||
| import javax.inject.Inject; | ||||
| 
 | ||||
| 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.framework.async.AsyncCompletionCallback; | ||||
| 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.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.Scope; | ||||
| 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.ImageStoreProviderManager; | ||||
| import org.apache.cloudstack.storage.image.store.ImageStoreImpl; | ||||
| import org.apache.log4j.Logger; | ||||
| import org.springframework.stereotype.Component; | ||||
| 
 | ||||
| import com.cloud.storage.ScopeType; | ||||
| import com.cloud.storage.dao.VMTemplateDao; | ||||
| import com.cloud.utils.db.SearchCriteria.Op; | ||||
| import com.cloud.utils.db.SearchCriteria2; | ||||
| import com.cloud.utils.db.SearchCriteriaService; | ||||
| 
 | ||||
| @Component | ||||
| public class ImageStoreProviderManagerImpl implements ImageStoreProviderManager { | ||||
| 	private static final Logger s_logger = Logger.getLogger(ImageStoreProviderManagerImpl.class); | ||||
|     @Inject | ||||
|     ImageStoreDao dataStoreDao; | ||||
|     @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; | ||||
| 
 | ||||
| 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.framework.async.AsyncCompletionCallback; | ||||
| import org.apache.cloudstack.storage.motion.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.CopyCommandResult; | ||||
| 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.DataObjectType; | ||||
| 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.storage.datastore.ObjectInDataStoreManager; | ||||
| 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.SnapshotStateMachineManager; | ||||
| import org.apache.log4j.Logger; | ||||
| import org.springframework.stereotype.Component; | ||||
| 
 | ||||
| import com.cloud.agent.api.Answer; | ||||
| 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.dc.ClusterVO; | ||||
| import com.cloud.dc.dao.ClusterDao; | ||||
| import com.cloud.event.EventTypes; | ||||
| import com.cloud.event.UsageEventUtils; | ||||
| import com.cloud.exception.InvalidParameterValueException; | ||||
| import com.cloud.host.HostVO; | ||||
| import com.cloud.hypervisor.Hypervisor.HypervisorType; | ||||
| @ -73,12 +65,9 @@ import com.cloud.storage.VolumeManager; | ||||
| import com.cloud.storage.VolumeVO; | ||||
| import com.cloud.storage.dao.SnapshotDao; | ||||
| import com.cloud.storage.dao.VolumeDao; | ||||
| import com.cloud.storage.s3.S3Manager; | ||||
| import com.cloud.storage.snapshot.SnapshotManager; | ||||
| import com.cloud.storage.swift.SwiftManager; | ||||
| import com.cloud.utils.NumbersUtil; | ||||
| import com.cloud.utils.db.DB; | ||||
| import com.cloud.utils.db.Transaction; | ||||
| import com.cloud.utils.exception.CloudRuntimeException; | ||||
| import com.cloud.utils.fsm.NoTransitionException; | ||||
| 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.CopyCommandResult; | ||||
| 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.DataObjectInStore; | ||||
| 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.AsyncCompletionCallback; | ||||
| import org.apache.cloudstack.framework.async.AsyncRpcConext; | ||||
| import org.apache.cloudstack.storage.motion.DataMotionService; | ||||
| import org.apache.log4j.Logger; | ||||
| import org.springframework.stereotype.Component; | ||||
| 
 | ||||
|  | ||||
| @ -46,6 +46,8 @@ public class DataStoreManagerImpl implements DataStoreManager { | ||||
|             return primaryStorMgr.getPrimaryDataStore(storeId); | ||||
|         } else if (role == DataStoreRole.Image) { | ||||
|             return imageDataStoreMgr.getImageStore(storeId); | ||||
|         } else if (role == DataStoreRole.ImageCache) { | ||||
|             return imageDataStoreMgr.getImageStore(storeId); | ||||
|         } | ||||
|         throw new CloudRuntimeException("un recognized type" + role); | ||||
|     } | ||||
| @ -81,5 +83,8 @@ public class DataStoreManagerImpl implements DataStoreManager { | ||||
|     public DataStore getPrimaryDataStore(long storeId) { | ||||
|         return primaryStorMgr.getPrimaryDataStore(storeId); | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public List<DataStore> getImageCacheStores(Scope scope) { | ||||
|     	return imageDataStoreMgr.listImageCacheStores(scope); | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -161,12 +161,8 @@ public class ObjectInDataStoreManagerImpl implements ObjectInDataStoreManager { | ||||
|             this.stateMachines.transitTo(obj, event, null, | ||||
|                     templatePoolDao); | ||||
|             } catch (NoTransitionException e) { | ||||
|                 if (event == Event.CreateOnlyRequested || event == Event.OperationSuccessed) { | ||||
|                     s_logger.debug("allow muliple create requests"); | ||||
|                 } else { | ||||
|                     throw e; | ||||
|             } | ||||
|             } | ||||
|         } else { | ||||
|             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.PrimaryDataStoreDriver; | ||||
| 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.image.ImageStoreDriver; | ||||
| import org.apache.cloudstack.storage.image.datastore.ImageStoreProviderManager; | ||||
| import org.apache.log4j.Logger; | ||||
| import org.springframework.stereotype.Component; | ||||
| @ -68,7 +68,7 @@ public class DataStoreProviderManagerImpl extends ManagerBase implements DataSto | ||||
|     public List<StorageProviderResponse> getPrimaryDataStoreProviders() { | ||||
|         List<StorageProviderResponse> providers = new ArrayList<StorageProviderResponse>(); | ||||
|         for (DataStoreProvider provider : providerMap.values()) { | ||||
|             if (provider instanceof PrimaryDataStoreProvider) { | ||||
|             if (provider.getTypes().contains(DataStoreProviderType.PRIMARY)) { | ||||
|                 StorageProviderResponse response = new StorageProviderResponse(); | ||||
|                 response.setName(provider.getName()); | ||||
|                 response.setType(DataStoreProvider.DataStoreProviderType.PRIMARY.toString()); | ||||
| @ -81,7 +81,7 @@ public class DataStoreProviderManagerImpl extends ManagerBase implements DataSto | ||||
|     public List<StorageProviderResponse> getImageDataStoreProviders() { | ||||
|         List<StorageProviderResponse> providers = new ArrayList<StorageProviderResponse>(); | ||||
|         for (DataStoreProvider provider : providerMap.values()) { | ||||
|             if (provider instanceof ImageStoreProvider) { | ||||
|             if (provider.getTypes().contains(DataStoreProviderType.IMAGE)) { | ||||
|                 StorageProviderResponse response = new StorageProviderResponse(); | ||||
|                 response.setName(provider.getName()); | ||||
|                 response.setType(DataStoreProvider.DataStoreProviderType.IMAGE.toString()); | ||||
| @ -91,6 +91,19 @@ public class DataStoreProviderManagerImpl extends ManagerBase implements DataSto | ||||
|         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 | ||||
|     public boolean configure(String name, Map<String, Object> params) | ||||
|     		throws ConfigurationException { | ||||
| @ -125,6 +138,7 @@ public class DataStoreProviderManagerImpl extends ManagerBase implements DataSto | ||||
|             } catch(Exception e) { | ||||
|                 s_logger.debug("configure provider failed", e); | ||||
|                 providerMap.remove(providerName); | ||||
|                 return false; | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
| @ -142,6 +156,11 @@ public class DataStoreProviderManagerImpl extends ManagerBase implements DataSto | ||||
|         return this.getDataStoreProvider("CloudStack ImageStore Provider"); | ||||
|     } | ||||
|      | ||||
|     @Override | ||||
|     public DataStoreProvider getDefaultCacheDataStoreProvider() { | ||||
|         return this.getDataStoreProvider("cloudstack image store provider"); | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public List<StorageProviderResponse> getDataStoreProviders(String type) { | ||||
|         if (type == null) { | ||||
| @ -151,6 +170,8 @@ public class DataStoreProviderManagerImpl extends ManagerBase implements DataSto | ||||
|             return this.getPrimaryDataStoreProviders(); | ||||
|         } else if (type.equalsIgnoreCase(DataStoreProvider.DataStoreProviderType.IMAGE.toString())) { | ||||
|             return this.getImageDataStoreProviders(); | ||||
|         } else if (type.equalsIgnoreCase(DataStoreProvider.DataStoreProviderType.ImageCache.toString())) { | ||||
|            return this.getCacheDataStoreProviders(); | ||||
|         } else { | ||||
|             throw new InvalidParameterValueException("Invalid parameter: " + type); | ||||
|         } | ||||
|  | ||||
| @ -23,6 +23,7 @@ import java.util.Map; | ||||
| 
 | ||||
| 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.ImageStoreDetailVO; | ||||
| import org.apache.cloudstack.storage.datastore.db.ImageStoreDetailsDao; | ||||
| @ -52,6 +53,7 @@ public class ImageStoreHelper { | ||||
|         store.setScope((ScopeType)params.get("scope")); | ||||
|         store.setUuid((String)params.get("uuid")); | ||||
|         store.setUrl((String)params.get("url")); | ||||
|         store.setRole(DataStoreRole.getRole((String)params.get("role"))); | ||||
|         store = imageStoreDao.persist(store); | ||||
|         return store; | ||||
|     } | ||||
| @ -68,6 +70,7 @@ public class ImageStoreHelper { | ||||
|         store.setScope((ScopeType)params.get("scope")); | ||||
|         store.setUuid((String)params.get("uuid")); | ||||
|         store.setUrl((String)params.get("url")); | ||||
|         store.setRole(DataStoreRole.getRole((String)params.get("role"))); | ||||
|         store = imageStoreDao.persist(store); | ||||
| 
 | ||||
|         // persist details | ||||
|  | ||||
| @ -31,5 +31,6 @@ public interface ImageStoreProviderManager { | ||||
|     List<DataStore> listImageStores(); | ||||
|     List<DataStore> listImageStoresByScope(ZoneScope scope); | ||||
|     List<DataStore> listImageStoreByProvider(String provider); | ||||
|     List<DataStore> listImageCacheStores(Scope scope); | ||||
|     boolean registerDriver(String uuid, ImageStoreDriver driver); | ||||
| } | ||||
|  | ||||
| @ -20,12 +20,12 @@ package org.apache.cloudstack.storage.volume; | ||||
| 
 | ||||
| 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.TemplateInfo; | ||||
| import org.apache.cloudstack.framework.async.AsyncCompletionCallback; | ||||
| import org.apache.cloudstack.storage.datastore.ObjectInDataStoreManager; | ||||
| 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.log4j.Logger; | ||||
| 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.CopyCommandResult; | ||||
| 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.DataStore; | ||||
| 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.PrimaryDataStore; | ||||
| import org.apache.cloudstack.storage.datastore.PrimaryDataStoreProviderManager; | ||||
| import org.apache.cloudstack.storage.motion.DataMotionService; | ||||
| import org.apache.log4j.Logger; | ||||
| import org.springframework.stereotype.Component; | ||||
| 
 | ||||
| @ -52,7 +52,6 @@ import com.cloud.storage.VolumeVO; | ||||
| import com.cloud.storage.dao.VolumeDao; | ||||
| import com.cloud.storage.snapshot.SnapshotManager; | ||||
| import com.cloud.utils.db.DB; | ||||
| import com.cloud.utils.exception.CloudRuntimeException; | ||||
| import com.cloud.vm.VirtualMachine; | ||||
| import com.cloud.vm.dao.VMInstanceDao; | ||||
| 
 | ||||
|  | ||||
| @ -83,6 +83,7 @@ public class CloudStackImageStoreProviderImpl implements ImageStoreProvider { | ||||
|     public Set<DataStoreProviderType> getTypes() { | ||||
|         Set<DataStoreProviderType> types =  new HashSet<DataStoreProviderType>(); | ||||
|         types.add(DataStoreProviderType.IMAGE); | ||||
|         types.add(DataStoreProviderType.ImageCache); | ||||
|         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.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.DeleteImageStoreCmd; | ||||
| 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("scope", scopeType); | ||||
|         params.put("providerName", storeProvider.getName()); | ||||
|         params.put("role", DataStoreRole.Image); | ||||
| 
 | ||||
|         DataStoreLifeCycle lifeCycle = storeProvider.getDataStoreLifeCycle(); | ||||
|         DataStore store = null; | ||||
| @ -2017,6 +2019,74 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C | ||||
|         txn.commit(); | ||||
|         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', | ||||
|     'StorageMaintenance': 'Storage Pool', | ||||
|     'StoragePool': 'Storage Pool', | ||||
|     'CacheStore': 'Storage Pool', | ||||
|     'StorageProvider': 'Storage Pool', | ||||
|     'SecurityGroup': 'Security Group', | ||||
|     'SSH': 'SSH', | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user