Resource details (metadata) - added support for Storage pool details

This commit is contained in:
Alena Prokharchyk 2013-10-28 10:15:55 -07:00
parent 92f97248a8
commit d0090a0c24
18 changed files with 93 additions and 180 deletions

View File

@ -43,7 +43,8 @@ public interface ResourceTag extends ControlledEntity, Identity, InternalIdentit
VMSnapshot (true, false),
RemoteAccessVpn (true, false),
Zone (false, true),
ServiceOffering (false, true);
ServiceOffering (false, true),
Storage(false, true);
ResourceObjectType(boolean resourceTagsSupport, boolean resourceMetadataSupport) {
this.resourceTagsSupport = resourceTagsSupport;

View File

@ -103,6 +103,9 @@ public abstract class ResourceDetailDaoBase<R extends ResourceDetail> extends Ge
public void addDetail(R detail) {
if (detail == null) {
return;
}
R existingDetail = findDetail(detail.getResourceId(), detail.getName());
if (existingDetail != null) {
remove(existingDetail.getId());

View File

@ -27,5 +27,7 @@ import com.cloud.service.ServiceOfferingDetailsVO;
@Local(value=ServiceOfferingDetailsDao.class)
public class ServiceOfferingDetailsDaoImpl extends ResourceDetailDaoBase<ServiceOfferingDetailsVO>
implements ServiceOfferingDetailsDao {
public ServiceOfferingDetailsDaoImpl() {
}
}

View File

@ -16,10 +16,6 @@
// under the License.
package com.cloud.storage.dao;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.ejb.Local;
import org.apache.cloudstack.framework.config.ConfigKey;
@ -28,60 +24,12 @@ import org.apache.cloudstack.framework.config.ScopedConfigStorage;
import org.apache.cloudstack.storage.datastore.db.StoragePoolDetailVO;
import org.apache.cloudstack.storage.datastore.db.StoragePoolDetailsDao;
import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
import com.cloud.utils.db.TransactionLegacy;
import com.cloud.dc.dao.ResourceDetailDaoBase;
@Local(value = StoragePoolDetailsDao.class)
public class StoragePoolDetailsDaoImpl extends GenericDaoBase<StoragePoolDetailVO, Long> implements StoragePoolDetailsDao, ScopedConfigStorage {
public class StoragePoolDetailsDaoImpl extends ResourceDetailDaoBase<StoragePoolDetailVO> implements StoragePoolDetailsDao, ScopedConfigStorage {
protected final SearchBuilder<StoragePoolDetailVO> PoolSearch;
protected StoragePoolDetailsDaoImpl() {
super();
PoolSearch = createSearchBuilder();
PoolSearch.and("pool", PoolSearch.entity().getPoolId(), SearchCriteria.Op.EQ);
PoolSearch.and("name", PoolSearch.entity().getName(), SearchCriteria.Op.EQ);
PoolSearch.done();
}
@Override
public void update(long poolId, Map<String, String> details) {
TransactionLegacy txn = TransactionLegacy.currentTxn();
SearchCriteria<StoragePoolDetailVO> sc = PoolSearch.create();
sc.setParameters("pool", poolId);
txn.start();
expunge(sc);
for (Map.Entry<String, String> entry : details.entrySet()) {
StoragePoolDetailVO detail = new StoragePoolDetailVO(poolId, entry.getKey(), entry.getValue());
persist(detail);
}
txn.commit();
}
@Override
public Map<String, String> getDetails(long poolId) {
SearchCriteria<StoragePoolDetailVO> sc = PoolSearch.create();
sc.setParameters("pool", poolId);
List<StoragePoolDetailVO> details = listBy(sc);
Map<String, String> detailsMap = new HashMap<String, String>();
for (StoragePoolDetailVO detail : details) {
detailsMap.put(detail.getName(), detail.getValue());
}
return detailsMap;
}
@Override
public StoragePoolDetailVO findDetail(long poolId, String name) {
SearchCriteria<StoragePoolDetailVO> sc = PoolSearch.create();
sc.setParameters("pool", poolId);
sc.setParameters("name", name);
return findOneIncludingRemovedBy(sc);
public StoragePoolDetailsDaoImpl() {
}
@Override

View File

@ -26,4 +26,8 @@ import com.cloud.storage.VMTemplateDetailVO;
@Component
@Local(value = VMTemplateDetailsDao.class)
public class VMTemplateDetailsDaoImpl extends ResourceDetailDaoBase<VMTemplateDetailVO> implements VMTemplateDetailsDao {
public VMTemplateDetailsDaoImpl(){
}
}

View File

@ -26,5 +26,7 @@ import com.cloud.storage.VolumeDetailVO;
@Component
@Local(value=VolumeDetailsDao.class)
public class VolumeDetailsDaoImpl extends ResourceDetailDaoBase<VolumeDetailVO> implements VolumeDetailsDao {
public VolumeDetailsDaoImpl() {
}
}

View File

@ -26,5 +26,7 @@ import com.cloud.vm.NicDetailVO;
@Component
@Local (value={NicDetailDao.class})
public class NicDetailDaoImpl extends ResourceDetailDaoBase<NicDetailVO> implements NicDetailDao {
public NicDetailDaoImpl() {
}
}

View File

@ -26,5 +26,7 @@ import com.cloud.vm.UserVmDetailVO;
@Component
@Local(value=UserVmDetailsDao.class)
public class UserVmDetailsDaoImpl extends ResourceDetailDaoBase<UserVmDetailVO> implements UserVmDetailsDao {
public UserVmDetailsDaoImpl() {
}
}

View File

@ -28,6 +28,8 @@ import javax.ejb.Local;
import javax.inject.Inject;
import javax.naming.ConfigurationException;
import org.springframework.stereotype.Component;
import com.cloud.host.Status;
import com.cloud.hypervisor.Hypervisor.HypervisorType;
import com.cloud.storage.ScopeType;
@ -43,6 +45,7 @@ import com.cloud.utils.db.SearchCriteria.Op;
import com.cloud.utils.db.TransactionLegacy;
import com.cloud.utils.exception.CloudRuntimeException;
@Local(value = { PrimaryDataStoreDao.class })
@DB()
public class PrimaryDataStoreDaoImpl extends GenericDaoBase<StoragePoolVO, Long> implements PrimaryDataStoreDao {
@ -52,8 +55,7 @@ public class PrimaryDataStoreDaoImpl extends GenericDaoBase<StoragePoolVO, Long>
protected final SearchBuilder<StoragePoolVO> DeleteLvmSearch;
protected final GenericSearchBuilder<StoragePoolVO, Long> StatusCountSearch;
@Inject
protected StoragePoolDetailsDao _detailsDao;
@Inject protected StoragePoolDetailsDao _detailsDao;
private final String DetailsSqlPrefix = "SELECT storage_pool.* from storage_pool LEFT JOIN storage_pool_details ON storage_pool.id = storage_pool_details.pool_id WHERE storage_pool.removed is null and storage_pool.status = 'Up' and storage_pool.data_center_id = ? and (storage_pool.pod_id = ? or storage_pool.pod_id is null) and storage_pool.scope = ? and (";
private final String DetailsSqlSuffix = ") GROUP BY storage_pool_details.pool_id HAVING COUNT(storage_pool_details.name) >= ?";
@ -380,13 +382,17 @@ public class PrimaryDataStoreDaoImpl extends GenericDaoBase<StoragePoolVO, Long>
@Override
public void updateDetails(long poolId, Map<String, String> details) {
if (details != null) {
_detailsDao.update(poolId, details);
List<StoragePoolDetailVO> detailsVO = new ArrayList<StoragePoolDetailVO>();
for (String key : details.keySet()) {
detailsVO.add(new StoragePoolDetailVO(poolId, key, details.get(key)));
}
_detailsDao.addDetails(detailsVO);
}
}
@Override
public Map<String, String> getDetails(long poolId) {
return _detailsDao.getDetails(poolId);
return _detailsDao.findDetails(poolId);
}
@Override

View File

@ -23,16 +23,18 @@ import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import org.apache.cloudstack.api.ResourceDetail;
@Entity
@Table(name = "storage_pool_details")
public class PrimaryDataStoreDetailVO {
public class PrimaryDataStoreDetailVO implements ResourceDetail{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
long id;
@Column(name = "pool_id")
long poolId;
long resourceId;
@Column(name = "name")
String name;
@ -41,39 +43,31 @@ public class PrimaryDataStoreDetailVO {
String value;
public PrimaryDataStoreDetailVO(long poolId, String name, String value) {
this.poolId = poolId;
this.resourceId = poolId;
this.name = name;
this.value = value;
}
protected PrimaryDataStoreDetailVO() {
}
@Override
public long getId() {
return id;
}
public long getPoolId() {
return poolId;
}
public void setPoolId(long poolId) {
this.poolId = poolId;
@Override
public long getResourceId() {
return resourceId;
}
@Override
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
protected PrimaryDataStoreDetailVO() {
}
}

View File

@ -16,13 +16,7 @@
// under the License.
package org.apache.cloudstack.storage.datastore.db;
import java.util.Map;
import com.cloud.dc.dao.ResourceDetailDao;
import com.cloud.utils.db.GenericDao;
public interface PrimaryDataStoreDetailsDao extends GenericDao<PrimaryDataStoreDetailVO, Long> {
void update(long poolId, Map<String, String> details);
Map<String, String> getDetails(long poolId);
public interface PrimaryDataStoreDetailsDao extends ResourceDetailDao<PrimaryDataStoreDetailVO> {
}

View File

@ -16,8 +16,6 @@
// under the License.
package org.apache.cloudstack.storage.datastore.db;
import org.apache.cloudstack.api.InternalIdentity;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
@ -25,16 +23,18 @@ import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import org.apache.cloudstack.api.ResourceDetail;
@Entity
@Table(name = "storage_pool_details")
public class StoragePoolDetailVO implements InternalIdentity {
public class StoragePoolDetailVO implements ResourceDetail {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
long id;
@Column(name = "pool_id")
long poolId;
long resourceId;
@Column(name = "name")
String name;
@ -43,39 +43,31 @@ public class StoragePoolDetailVO implements InternalIdentity {
String value;
public StoragePoolDetailVO(long poolId, String name, String value) {
this.poolId = poolId;
this.resourceId = poolId;
this.name = name;
this.value = value;
}
public StoragePoolDetailVO() {
}
@Override
public long getId() {
return id;
}
public long getPoolId() {
return poolId;
}
public void setPoolId(long poolId) {
this.poolId = poolId;
@Override
public long getResourceId() {
return resourceId;
}
@Override
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
protected StoragePoolDetailVO() {
}
}

View File

@ -16,15 +16,8 @@
// under the License.
package org.apache.cloudstack.storage.datastore.db;
import java.util.Map;
import com.cloud.dc.dao.ResourceDetailDao;
import com.cloud.utils.db.GenericDao;
public interface StoragePoolDetailsDao extends GenericDao<StoragePoolDetailVO, Long> {
void update(long poolId, Map<String, String> details);
Map<String, String> getDetails(long poolId);
StoragePoolDetailVO findDetail(long poolId, String name);
public interface StoragePoolDetailsDao extends GenericDao<StoragePoolDetailVO, Long>, ResourceDetailDao<StoragePoolDetailVO> {
}

View File

@ -16,59 +16,17 @@
// under the License.
package org.apache.cloudstack.storage.volume.db;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDetailVO;
import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDetailsDao;
import org.springframework.stereotype.Component;
import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
import com.cloud.utils.db.TransactionLegacy;
import com.cloud.dc.dao.ResourceDetailDaoBase;
@Component
public class PrimaryDataStoreDetailsDaoImpl extends GenericDaoBase<PrimaryDataStoreDetailVO, Long> implements
public class PrimaryDataStoreDetailsDaoImpl extends ResourceDetailDaoBase<PrimaryDataStoreDetailVO> implements
PrimaryDataStoreDetailsDao {
protected final SearchBuilder<PrimaryDataStoreDetailVO> PoolSearch = null;
protected PrimaryDataStoreDetailsDaoImpl() {
/*
* super(); PoolSearch = createSearchBuilder(); PoolSearch.and("pool",
* PoolSearch.entity().getPoolId(), SearchCriteria.Op.EQ);
* PoolSearch.done();
*/
}
@Override
public void update(long poolId, Map<String, String> details) {
TransactionLegacy txn = TransactionLegacy.currentTxn();
SearchCriteria<PrimaryDataStoreDetailVO> sc = PoolSearch.create();
sc.setParameters("pool", poolId);
txn.start();
expunge(sc);
for (Map.Entry<String, String> entry : details.entrySet()) {
PrimaryDataStoreDetailVO detail = new PrimaryDataStoreDetailVO(poolId, entry.getKey(), entry.getValue());
persist(detail);
}
txn.commit();
}
@Override
public Map<String, String> getDetails(long poolId) {
SearchCriteria<PrimaryDataStoreDetailVO> sc = PoolSearch.create();
sc.setParameters("pool", poolId);
List<PrimaryDataStoreDetailVO> details = listBy(sc);
Map<String, String> detailsMap = new HashMap<String, String>();
for (PrimaryDataStoreDetailVO detail : details) {
detailsMap.put(detail.getName(), detail.getValue());
}
return detailsMap;
public PrimaryDataStoreDetailsDaoImpl() {
}
}

View File

@ -475,14 +475,8 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
throw new InvalidParameterValueException("unable to find storage pool by id " + resourceId);
}
StoragePoolDetailVO storagePoolDetailVO = _storagePoolDetailsDao.findDetail(resourceId, name);
if (storagePoolDetailVO == null) {
storagePoolDetailVO = new StoragePoolDetailVO(resourceId, name, value);
_storagePoolDetailsDao.persist(storagePoolDetailVO);
} else {
storagePoolDetailVO.setValue(value);
_storagePoolDetailsDao.update(storagePoolDetailVO.getId(), storagePoolDetailVO);
}
_storagePoolDetailsDao.addDetail(storagePoolDetailVO);
break;
case Account:

View File

@ -26,6 +26,8 @@ import javax.inject.Inject;
import javax.naming.ConfigurationException;
import org.apache.cloudstack.api.ResourceDetail;
import org.apache.cloudstack.storage.datastore.db.StoragePoolDetailVO;
import org.apache.cloudstack.storage.datastore.db.StoragePoolDetailsDao;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Component;
@ -77,6 +79,8 @@ public class ResourceMetaDataManagerImpl extends ManagerBase implements Resource
VMTemplateDetailsDao _templateDetailsDao;
@Inject
ServiceOfferingDetailsDao _serviceOfferingDetailsDao;
@Inject
StoragePoolDetailsDao _storageDetailsDao;
private static Map<ResourceObjectType, ResourceDetailDao<? extends ResourceDetail>> _daoMap=
new HashMap<ResourceObjectType, ResourceDetailDao<? extends ResourceDetail>>();
@ -91,6 +95,8 @@ public class ResourceMetaDataManagerImpl extends ManagerBase implements Resource
_daoMap.put(ResourceObjectType.Nic, _nicDetailDao);
_daoMap.put(ResourceObjectType.ServiceOffering, _serviceOfferingDetailsDao);
_daoMap.put(ResourceObjectType.Zone, _dcDetailsDao);
_daoMap.put(ResourceObjectType.Storage, _storageDetailsDao);
return true;
}
@ -138,6 +144,10 @@ public class ResourceMetaDataManagerImpl extends ManagerBase implements Resource
detail = new VMTemplateDetailVO(id, key, value);
} else if (resourceType == ResourceObjectType.ServiceOffering) {
detail = new ServiceOfferingDetailsVO(id, key, value);
} else if (resourceType == ResourceObjectType.Storage) {
detail = new StoragePoolDetailVO(id, key, value);
} else {
throw new UnsupportedOperationException("ResourceType " + resourceType + " doesn't support metadata");
}
newDetailDaoHelper.addDetail(detail);
@ -174,6 +184,9 @@ public class ResourceMetaDataManagerImpl extends ManagerBase implements Resource
private void addDetail(ResourceDetail detail) {
ResourceDetailDao<ResourceDetail> dao = (ResourceDetailDao<ResourceDetail>)_daoMap.get(resourceType);
if (dao == null) {
throw new UnsupportedOperationException("ResourceType " + resourceType + " doesn't support metadata");
}
dao.addDetail(detail);
}

View File

@ -706,7 +706,7 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C
Map<String, String> updatedDetails = new HashMap<String, String>();
if (tags != null) {
Map<String, String> existingDetails = _storagePoolDetailsDao.getDetails(id);
Map<String, String> existingDetails = _storagePoolDetailsDao.findDetails(id);
Set<String> existingKeys = existingDetails.keySet();
Map<String, String> existingDetailsToKeep = new HashMap<String, String>();

View File

@ -26,6 +26,7 @@ import javax.inject.Inject;
import javax.naming.ConfigurationException;
import org.apache.cloudstack.context.CallContext;
import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Component;
@ -131,6 +132,8 @@ public class TaggedResourceManagerImpl extends ManagerBase implements TaggedReso
DataCenterDao _dataCenterDao;
@Inject
ServiceOfferingDao _serviceOffDao;
@Inject
PrimaryDataStoreDao _storagePoolDao;
@Override
@ -155,6 +158,8 @@ public class TaggedResourceManagerImpl extends ManagerBase implements TaggedReso
_daoMap.put(ResourceObjectType.RemoteAccessVpn, _vpnDao);
_daoMap.put(ResourceObjectType.Zone, _dataCenterDao);
_daoMap.put(ResourceObjectType.ServiceOffering, _serviceOffDao);
_daoMap.put(ResourceObjectType.Storage, _storagePoolDao);
return true;
}