Create DB view for Image Data Store.

This commit is contained in:
Min Chen 2013-04-02 18:15:15 -07:00
parent 86a3840412
commit 7699485b4f
12 changed files with 729 additions and 21 deletions

View File

@ -28,6 +28,16 @@ public class ObjectStoreDetailResponse extends BaseResponse {
@SerializedName("value") @Param(description="detail property value of the object store")
private String value;
public ObjectStoreDetailResponse(){
super();
}
public ObjectStoreDetailResponse(String name, String val){
super();
this.name = name;
this.value = val;
}
public String getName() {
return name;
}
@ -44,5 +54,33 @@ public class ObjectStoreDetailResponse extends BaseResponse {
this.value = value;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
String oid = this.getName();
result = prime * result + ((oid== null) ? 0 : oid.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
ObjectStoreDetailResponse other = (ObjectStoreDetailResponse) obj;
String oid = this.getName();
if (oid == null) {
if (other.getName() != null)
return false;
} else if (!oid.equals(other.getName()))
return false;
else if ( this.getValue().equals(other.getValue()))
return false;
return true;
}
}

View File

@ -16,9 +16,8 @@
// under the License.
package org.apache.cloudstack.api.response;
import java.util.Date;
import javax.persistence.Column;
import java.util.LinkedHashSet;
import java.util.Set;
import org.apache.cloudstack.api.ApiConstants;
import org.apache.cloudstack.api.BaseResponse;
@ -27,8 +26,6 @@ import org.apache.cloudstack.api.EntityReference;
import com.cloud.serializer.Param;
import com.cloud.storage.ObjectStore;
import com.cloud.storage.ScopeType;
import com.cloud.storage.StoragePool;
import com.cloud.storage.StoragePoolStatus;
import com.google.gson.annotations.SerializedName;
@EntityReference(value=ObjectStore.class)
@ -43,7 +40,7 @@ public class ObjectStoreResponse extends BaseResponse {
private String zoneName;
@SerializedName("regionid") @Param(description="the Region ID of the object store")
private String regionId;
private Long regionId;
@SerializedName("regionname") @Param(description="the Region name of the object store")
private String regionName;
@ -54,16 +51,22 @@ public class ObjectStoreResponse extends BaseResponse {
@SerializedName("url") @Param(description="the url of the object store")
private String url;
@SerializedName("protocol") @Param(description="the protocol of the object store")
private String protocol;
@SerializedName("providername") @Param(description="the provider name of the object store")
private String providerName;
@SerializedName("scope") @Param(description="the scope of the object store")
private ScopeType type;
private ScopeType scope;
@SerializedName("details") @Param(description="the details of the object store")
private String details;
private Set<ObjectStoreDetailResponse> details;
public ObjectStoreResponse(){
this.details = new LinkedHashSet<ObjectStoreDetailResponse>();
}
@Override
public String getObjectId() {
@ -95,11 +98,11 @@ public class ObjectStoreResponse extends BaseResponse {
}
public String getRegionId() {
public Long getRegionId() {
return regionId;
}
public void setRegionId(String regionId) {
public void setRegionId(Long regionId) {
this.regionId = regionId;
}
@ -135,22 +138,35 @@ public class ObjectStoreResponse extends BaseResponse {
this.providerName = providerName;
}
public ScopeType getType() {
return type;
public ScopeType getScope() {
return scope;
}
public void setType(ScopeType type) {
this.type = type;
public void setScope(ScopeType type) {
this.scope = type;
}
public String getDetails() {
public String getProtocol() {
return protocol;
}
public void setProtocol(String protocol) {
this.protocol = protocol;
}
public Set<ObjectStoreDetailResponse> getDetails() {
return details;
}
public void setDetails(String details) {
public void setDetails(Set<ObjectStoreDetailResponse> details) {
this.details = details;
}
public void addDetail(ObjectStoreDetailResponse detail){
this.details.add(detail);
}
}

View File

@ -0,0 +1,81 @@
// 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.datastore.db;
import org.apache.cloudstack.api.InternalIdentity;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name="image_data_store_details")
public class ImageDataStoreDetailVO implements InternalIdentity {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="id")
long id;
@Column(name="store_id")
long storeId;
@Column(name="name")
String name;
@Column(name="value")
String value;
public ImageDataStoreDetailVO(long storeId, String name, String value) {
this.storeId = storeId;
this.name = name;
this.value = value;
}
public long getId() {
return id;
}
public long getStoreId() {
return storeId;
}
public void setStoreId(long storeId) {
this.storeId = storeId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
protected ImageDataStoreDetailVO() {
}
}

View File

@ -0,0 +1,28 @@
// 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.datastore.db;
import java.util.Map;
import com.cloud.utils.db.GenericDao;
public interface ImageDataStoreDetailsDao extends GenericDao<ImageDataStoreDetailVO, Long> {
void update(long storeId, Map<String, String> details);
Map<String, String> getDetails(long storeId);
}

View File

@ -34,6 +34,7 @@ import org.apache.cloudstack.api.response.DomainRouterResponse;
import org.apache.cloudstack.api.response.EventResponse;
import org.apache.cloudstack.api.response.HostResponse;
import org.apache.cloudstack.api.response.InstanceGroupResponse;
import org.apache.cloudstack.api.response.ObjectStoreResponse;
import org.apache.cloudstack.api.response.ProjectAccountResponse;
import org.apache.cloudstack.api.response.ProjectInvitationResponse;
import org.apache.cloudstack.api.response.ProjectResponse;
@ -55,6 +56,7 @@ import com.cloud.api.query.dao.DataCenterJoinDao;
import com.cloud.api.query.dao.DiskOfferingJoinDao;
import com.cloud.api.query.dao.DomainRouterJoinDao;
import com.cloud.api.query.dao.HostJoinDao;
import com.cloud.api.query.dao.ImageDataStoreJoinDao;
import com.cloud.api.query.dao.InstanceGroupJoinDao;
import com.cloud.api.query.dao.ProjectAccountJoinDao;
import com.cloud.api.query.dao.ProjectInvitationJoinDao;
@ -73,6 +75,7 @@ import com.cloud.api.query.vo.DiskOfferingJoinVO;
import com.cloud.api.query.vo.DomainRouterJoinVO;
import com.cloud.api.query.vo.EventJoinVO;
import com.cloud.api.query.vo.HostJoinVO;
import com.cloud.api.query.vo.ImageDataStoreJoinVO;
import com.cloud.api.query.vo.InstanceGroupJoinVO;
import com.cloud.api.query.vo.ProjectAccountJoinVO;
import com.cloud.api.query.vo.ProjectInvitationJoinVO;
@ -284,7 +287,7 @@ public class ApiDBUtils {
static NetworkModel _networkModel;
static NetworkManager _networkMgr;
static TemplateManager _templateMgr;
static StatsCollector _statsCollector;
static AccountDao _accountDao;
@ -362,6 +365,7 @@ public class ApiDBUtils {
static HostJoinDao _hostJoinDao;
static VolumeJoinDao _volJoinDao;
static StoragePoolJoinDao _poolJoinDao;
static ImageDataStoreJoinDao _imageStoreJoinDao;
static AccountJoinDao _accountJoinDao;
static AsyncJobJoinDao _jobJoinDao;
@ -466,6 +470,7 @@ public class ApiDBUtils {
@Inject private HostJoinDao hostJoinDao;
@Inject private VolumeJoinDao volJoinDao;
@Inject private StoragePoolJoinDao poolJoinDao;
@Inject private ImageDataStoreJoinDao imageStoreJoinDao;
@Inject private AccountJoinDao accountJoinDao;
@Inject private AsyncJobJoinDao jobJoinDao;
@ -566,6 +571,7 @@ public class ApiDBUtils {
_hostJoinDao = hostJoinDao;
_volJoinDao = volJoinDao;
_poolJoinDao = poolJoinDao;
_imageStoreJoinDao = imageStoreJoinDao;
_accountJoinDao = accountJoinDao;
_jobJoinDao = jobJoinDao;
@ -1535,6 +1541,18 @@ public class ApiDBUtils {
return _poolJoinDao.newStoragePoolView(vr);
}
public static ObjectStoreResponse newImageStoreResponse(ImageDataStoreJoinVO vr) {
return _imageStoreJoinDao.newObjectStoreResponse(vr);
}
public static ObjectStoreResponse fillImageStoreDetails(ObjectStoreResponse vrData, ImageDataStoreJoinVO vr){
return _imageStoreJoinDao.setObjectStoreResponse(vrData, vr);
}
public static List<ImageDataStoreJoinVO> newImageStoreView(ObjectStore vr){
return _imageStoreJoinDao.newObjectStoreView(vr);
}
public static AccountResponse newAccountResponse(AccountJoinVO ve) {
return _accountJoinDao.newAccountResponse(ve);
@ -1579,7 +1597,7 @@ public class ApiDBUtils {
public static DataCenterJoinVO newDataCenterView(DataCenter dc){
return _dcJoinDao.newDataCenterView(dc);
}
public static Map<String, String> findHostDetailsById(long hostId){
return _hostDetailsDao.findDetails(hostId);
}

View File

@ -142,6 +142,7 @@ import com.cloud.api.query.vo.DiskOfferingJoinVO;
import com.cloud.api.query.vo.DomainRouterJoinVO;
import com.cloud.api.query.vo.EventJoinVO;
import com.cloud.api.query.vo.HostJoinVO;
import com.cloud.api.query.vo.ImageDataStoreJoinVO;
import com.cloud.api.query.vo.InstanceGroupJoinVO;
import com.cloud.api.query.vo.ProjectAccountJoinVO;
import com.cloud.api.query.vo.ProjectInvitationJoinVO;
@ -892,8 +893,12 @@ public class ApiResponseHelper implements ResponseGenerator {
@Override
public ObjectStoreResponse createObjectStoreResponse(ObjectStore os) {
// TODO Auto-generated method stub
return null;
List<ImageDataStoreJoinVO> viewStores = ApiDBUtils.newImageStoreView(os);
List<ObjectStoreResponse> listStores = ViewResponseHelper.createObjectStoreResponse(viewStores.toArray(new ImageDataStoreJoinVO[viewStores.size()]));
assert listStores != null && listStores.size() == 1 : "There should be one image data store returned";
return listStores.get(0);
}

View File

@ -30,6 +30,7 @@ import org.apache.cloudstack.api.response.DomainRouterResponse;
import org.apache.cloudstack.api.response.EventResponse;
import org.apache.cloudstack.api.response.HostResponse;
import org.apache.cloudstack.api.response.InstanceGroupResponse;
import org.apache.cloudstack.api.response.ObjectStoreResponse;
import org.apache.cloudstack.api.response.ProjectAccountResponse;
import org.apache.cloudstack.api.response.ProjectInvitationResponse;
import org.apache.cloudstack.api.response.ProjectResponse;
@ -51,6 +52,7 @@ import com.cloud.api.query.vo.DiskOfferingJoinVO;
import com.cloud.api.query.vo.DomainRouterJoinVO;
import com.cloud.api.query.vo.EventJoinVO;
import com.cloud.api.query.vo.HostJoinVO;
import com.cloud.api.query.vo.ImageDataStoreJoinVO;
import com.cloud.api.query.vo.InstanceGroupJoinVO;
import com.cloud.api.query.vo.ProjectAccountJoinVO;
import com.cloud.api.query.vo.ProjectInvitationJoinVO;
@ -263,6 +265,24 @@ public class ViewResponseHelper {
return new ArrayList<StoragePoolResponse>(vrDataList.values());
}
public static List<ObjectStoreResponse> createObjectStoreResponse(ImageDataStoreJoinVO... stores) {
Hashtable<Long, ObjectStoreResponse> vrDataList = new Hashtable<Long, ObjectStoreResponse>();
// Initialise the vrdatalist with the input data
for (ImageDataStoreJoinVO vr : stores) {
ObjectStoreResponse vrData = vrDataList.get(vr.getId());
if ( vrData == null ){
// first time encountering this vm
vrData = ApiDBUtils.newImageStoreResponse(vr);
}
else{
// update tags
vrData = ApiDBUtils.fillImageStoreDetails(vrData, vr);
}
vrDataList.put(vr.getId(), vrData);
}
return new ArrayList<ObjectStoreResponse>(vrDataList.values());
}
public static List<AccountResponse> createAccountResponse(AccountJoinVO... accounts) {
List<AccountResponse> respList = new ArrayList<AccountResponse>();

View File

@ -0,0 +1,36 @@
// 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 com.cloud.api.query.dao;
import java.util.List;
import org.apache.cloudstack.api.response.ObjectStoreResponse;
import com.cloud.api.query.vo.ImageDataStoreJoinVO;
import com.cloud.storage.ObjectStore;
import com.cloud.utils.db.GenericDao;
public interface ImageDataStoreJoinDao extends GenericDao<ImageDataStoreJoinVO, Long> {
ObjectStoreResponse newObjectStoreResponse(ImageDataStoreJoinVO os);
ObjectStoreResponse setObjectStoreResponse(ObjectStoreResponse response, ImageDataStoreJoinVO os);
List<ImageDataStoreJoinVO> newObjectStoreView(ObjectStore os);
List<ImageDataStoreJoinVO> searchByIds(Long... spIds);
}

View File

@ -0,0 +1,164 @@
// 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 com.cloud.api.query.dao;
import java.util.ArrayList;
import java.util.List;
import javax.ejb.Local;
import javax.inject.Inject;
import org.apache.cloudstack.api.response.ObjectStoreDetailResponse;
import org.apache.cloudstack.api.response.ObjectStoreResponse;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Component;
import com.cloud.api.query.vo.ImageDataStoreJoinVO;
import com.cloud.configuration.dao.ConfigurationDao;
import com.cloud.storage.ObjectStore;
import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
@Component
@Local(value={ImageDataStoreJoinDao.class})
public class ImageDataStoreJoinDaoImpl extends GenericDaoBase<ImageDataStoreJoinVO, Long> implements ImageDataStoreJoinDao {
public static final Logger s_logger = Logger.getLogger(ImageDataStoreJoinDaoImpl.class);
@Inject
private ConfigurationDao _configDao;
private final SearchBuilder<ImageDataStoreJoinVO> dsSearch;
private final SearchBuilder<ImageDataStoreJoinVO> dsIdSearch;
protected ImageDataStoreJoinDaoImpl() {
dsSearch = createSearchBuilder();
dsSearch.and("idIN", dsSearch.entity().getId(), SearchCriteria.Op.IN);
dsSearch.done();
dsIdSearch = createSearchBuilder();
dsIdSearch.and("id", dsIdSearch.entity().getId(), SearchCriteria.Op.EQ);
dsIdSearch.done();
this._count = "select count(distinct id) from image_data_store_view WHERE ";
}
@Override
public ObjectStoreResponse newObjectStoreResponse(ImageDataStoreJoinVO ids) {
ObjectStoreResponse osResponse = new ObjectStoreResponse();
osResponse.setId(ids.getUuid());
osResponse.setName(ids.getName());
osResponse.setProviderName(ids.getProviderName());
osResponse.setProtocol(ids.getProtocol());
osResponse.setUrl(ids.getUrl());
osResponse.setScope(ids.getScope());
osResponse.setZoneId(ids.getZoneUuid());
osResponse.setZoneName(ids.getZoneName());
osResponse.setRegionId(ids.getRegionId());
osResponse.setRegionName(ids.getRegionName());
String detailName = ids.getDetailName();
if ( detailName != null && detailName.length() > 0 ){
ObjectStoreDetailResponse osdResponse = new ObjectStoreDetailResponse(detailName, ids.getDetailValue());
osResponse.addDetail(osdResponse);
}
osResponse.setObjectName("objectstore");
return osResponse;
}
@Override
public ObjectStoreResponse setObjectStoreResponse(ObjectStoreResponse response, ImageDataStoreJoinVO ids) {
String detailName = ids.getDetailName();
if ( detailName != null && detailName.length() > 0 ){
ObjectStoreDetailResponse osdResponse = new ObjectStoreDetailResponse(detailName, ids.getDetailValue());
response.addDetail(osdResponse);
}
return response;
}
@Override
public List<ImageDataStoreJoinVO> newObjectStoreView(ObjectStore os) {
SearchCriteria<ImageDataStoreJoinVO> sc = dsIdSearch.create();
sc.setParameters("id", os.getId());
return searchIncludingRemoved(sc, null, null, false);
}
@Override
public List<ImageDataStoreJoinVO> searchByIds(Long... spIds) {
// set detail batch query size
int DETAILS_BATCH_SIZE = 2000;
String batchCfg = _configDao.getValue("detail.batch.query.size");
if ( batchCfg != null ){
DETAILS_BATCH_SIZE = Integer.parseInt(batchCfg);
}
// query details by batches
List<ImageDataStoreJoinVO> uvList = new ArrayList<ImageDataStoreJoinVO>();
// query details by batches
int curr_index = 0;
if ( spIds.length > DETAILS_BATCH_SIZE ){
while ( (curr_index + DETAILS_BATCH_SIZE ) <= spIds.length ) {
Long[] ids = new Long[DETAILS_BATCH_SIZE];
for (int k = 0, j = curr_index; j < curr_index + DETAILS_BATCH_SIZE; j++, k++) {
ids[k] = spIds[j];
}
SearchCriteria<ImageDataStoreJoinVO> sc = dsSearch.create();
sc.setParameters("idIN", ids);
List<ImageDataStoreJoinVO> vms = searchIncludingRemoved(sc, null, null, false);
if (vms != null) {
uvList.addAll(vms);
}
curr_index += DETAILS_BATCH_SIZE;
}
}
if (curr_index < spIds.length) {
int batch_size = (spIds.length - curr_index);
// set the ids value
Long[] ids = new Long[batch_size];
for (int k = 0, j = curr_index; j < curr_index + batch_size; j++, k++) {
ids[k] = spIds[j];
}
SearchCriteria<ImageDataStoreJoinVO> sc = dsSearch.create();
sc.setParameters("idIN", ids);
List<ImageDataStoreJoinVO> vms = searchIncludingRemoved(sc, null, null, false);
if (vms != null) {
uvList.addAll(vms);
}
}
return uvList;
}
}

View File

@ -0,0 +1,201 @@
// 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 com.cloud.api.query.vo;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.Id;
import javax.persistence.Table;
import com.cloud.storage.ScopeType;
import org.apache.cloudstack.api.Identity;
import org.apache.cloudstack.api.InternalIdentity;
/**
* Image Data Store DB view.
*
*/
@Entity
@Table(name="image_data_store_view")
public class ImageDataStoreJoinVO extends BaseViewVO implements InternalIdentity, Identity {
@Id
@Column(name="id")
private long id;
@Column(name="uuid")
private String uuid;
@Column(name="name")
private String name;
@Column(name="url")
private String url;
@Column(name = "protocol")
private String protocol;
@Column(name = "provider_name", nullable = false)
private String providerName;
@Column(name="scope")
@Enumerated(value = EnumType.STRING)
private ScopeType scope;
@Column(name="data_center_id")
private long zoneId;
@Column(name="data_center_uuid")
private String zoneUuid;
@Column(name="data_center_name")
private String zoneName;
@Column(name="region_id")
private long regionId;
@Column(name="region_name")
private String regionName;
@Column(name="detail_name")
private String detailName;
@Column(name="detail_value")
private String detailValue;
@Override
public long getId() {
return id;
}
@Override
public void setId(long id) {
this.id = id;
}
@Override
public String getUuid() {
return uuid;
}
public void setUuid(String uuid) {
this.uuid = uuid;
}
public String getName() {
return name;
}
public long getZoneId() {
return zoneId;
}
public void setZoneId(long zoneId) {
this.zoneId = zoneId;
}
public String getZoneUuid() {
return zoneUuid;
}
public void setZoneUuid(String zoneUuid) {
this.zoneUuid = zoneUuid;
}
public String getZoneName() {
return zoneName;
}
public void setZoneName(String zoneName) {
this.zoneName = zoneName;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getProtocol() {
return protocol;
}
public void setProtocol(String protocol) {
this.protocol = protocol;
}
public String getProviderName() {
return providerName;
}
public void setProviderName(String providerName) {
this.providerName = providerName;
}
public ScopeType getScope() {
return scope;
}
public void setScope(ScopeType scope) {
this.scope = scope;
}
public long getRegionId() {
return regionId;
}
public void setRegionId(long regionId) {
this.regionId = regionId;
}
public String getRegionName() {
return regionName;
}
public void setRegionName(String regionName) {
this.regionName = regionName;
}
public void setName(String name) {
this.name = name;
}
public String getDetailName() {
return detailName;
}
public void setDetailName(String detailName) {
this.detailName = detailName;
}
public String getDetailValue() {
return detailValue;
}
public void setDetailValue(String detailValue) {
this.detailValue = detailValue;
}
}

View File

@ -0,0 +1,75 @@
// 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 com.cloud.storage.dao;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.ejb.Local;
import org.apache.cloudstack.storage.datastore.db.ImageDataStoreDetailVO;
import org.apache.cloudstack.storage.datastore.db.ImageDataStoreDetailsDao;
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.Transaction;
@Component
@Local(value=ImageDataStoreDetailsDao.class)
public class ImageDataStoreDaoImpl extends GenericDaoBase<ImageDataStoreDetailVO, Long> implements ImageDataStoreDetailsDao {
protected final SearchBuilder<ImageDataStoreDetailVO> storeSearch;
protected ImageDataStoreDaoImpl() {
super();
storeSearch = createSearchBuilder();
storeSearch.and("store", storeSearch.entity().getStoreId(), SearchCriteria.Op.EQ);
storeSearch.done();
}
@Override
public void update(long storeId, Map<String, String> details) {
Transaction txn = Transaction.currentTxn();
SearchCriteria<ImageDataStoreDetailVO> sc = storeSearch.create();
sc.setParameters("store", storeId);
txn.start();
expunge(sc);
for (Map.Entry<String, String> entry : details.entrySet()) {
ImageDataStoreDetailVO detail = new ImageDataStoreDetailVO(storeId, entry.getKey(), entry.getValue());
persist(detail);
}
txn.commit();
}
@Override
public Map<String, String> getDetails(long storeId) {
SearchCriteria<ImageDataStoreDetailVO> sc = storeSearch.create();
sc.setParameters("store", storeId);
List<ImageDataStoreDetailVO> details = listBy(sc);
Map<String, String> detailsMap = new HashMap<String, String>();
for (ImageDataStoreDetailVO detail : details) {
detailsMap.put(detail.getName(), detail.getValue());
}
return detailsMap;
}
}

View File

@ -91,7 +91,33 @@ CREATE TABLE `cloud`.`image_data_store_details` (
INDEX `i_image_data_store__name__value`(`name`(128), `value`(128))
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
DROP VIEW IF EXISTS `cloud`.`image_data_store_view`;
CREATE VIEW `cloud`.`image_data_store_view` AS
select
image_data_store.id,
image_data_store.uuid,
image_data_store.name,
image_data_store.provider_name,
image_data_store.protocol,
image_data_store.url,
image_data_store.scope,
data_center.id data_center_id,
data_center.uuid data_center_uuid,
data_center.name data_center_name,
region.id region_id,
region.name region_name,
image_data_store_details.name detail_name,
image_data_store_details.value detail_value
from
`cloud`.`image_data_store`
left join
`cloud`.`data_center` ON image_data_store.data_center_id = data_center.id
left join
`cloud`.`region` ON image_data_store.region_id = region.id
left join
`cloud`.`image_data_store_details` ON image_data_store_details.store_id = image_data_store.id;
CREATE TABLE `cloud`.`template_store_ref` (
`id` bigint unsigned NOT NULL auto_increment,
`store_id` bigint unsigned NOT NULL,