You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by mc...@apache.org on 2013/04/03 03:15:41 UTC
[1/3] git commit: updated refs/heads/object_store to db76107
Updated Branches:
refs/heads/object_store b7e14ce19 -> db76107df
add image_data_store_details to store more properties for s3, swift like
data store properties.
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/49323790
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/49323790
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/49323790
Branch: refs/heads/object_store
Commit: 4932379094126c44079f860cb5f0aa050a856ea0
Parents: b7e14ce
Author: Min Chen <mi...@citrix.com>
Authored: Mon Apr 1 14:16:34 2013 -0700
Committer: Min Chen <mi...@citrix.com>
Committed: Mon Apr 1 14:16:34 2013 -0700
----------------------------------------------------------------------
setup/db/db/schema-410to420.sql | 10 ++++++++++
1 files changed, 10 insertions(+), 0 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/49323790/setup/db/db/schema-410to420.sql
----------------------------------------------------------------------
diff --git a/setup/db/db/schema-410to420.sql b/setup/db/db/schema-410to420.sql
index 60f84b2..cbff750 100644
--- a/setup/db/db/schema-410to420.sql
+++ b/setup/db/db/schema-410to420.sql
@@ -79,6 +79,16 @@ CREATE TABLE `cloud`.`image_data_store` (
PRIMARY KEY(`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+CREATE TABLE `cloud`.`image_data_store_details` (
+ `id` bigint unsigned UNIQUE NOT NULL AUTO_INCREMENT COMMENT 'id',
+ `store_id` bigint unsigned NOT NULL COMMENT 'store the detail is related to',
+ `name` varchar(255) NOT NULL COMMENT 'name of the detail',
+ `value` varchar(255) NOT NULL COMMENT 'value of the detail',
+ PRIMARY KEY (`id`),
+ CONSTRAINT `fk_image_data_store_details__store_id` FOREIGN KEY `fk_image_data_store__store_id`(`store_id`) REFERENCES `image_data_store`(`id`) ON DELETE CASCADE,
+ INDEX `i_image_data_store__name__value`(`name`(128), `value`(128))
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
CREATE TABLE `cloud`.`template_store_ref` (
`id` bigint unsigned NOT NULL auto_increment,
[3/3] git commit: updated refs/heads/object_store to db76107
Posted by mc...@apache.org.
Create DB view for Image Data Store.
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/db76107d
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/db76107d
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/db76107d
Branch: refs/heads/object_store
Commit: db76107dffda8172d2bb847846162edddfb6379e
Parents: 0d54d01
Author: Min Chen <mi...@citrix.com>
Authored: Tue Apr 2 18:15:15 2013 -0700
Committer: Min Chen <mi...@citrix.com>
Committed: Tue Apr 2 18:15:15 2013 -0700
----------------------------------------------------------------------
.../api/response/ObjectStoreDetailResponse.java | 38 +++
.../api/response/ObjectStoreResponse.java | 48 +++--
.../datastore/db/ImageDataStoreDetailVO.java | 81 ++++++
.../datastore/db/ImageDataStoreDetailsDao.java | 28 ++
server/src/com/cloud/api/ApiDBUtils.java | 22 ++-
server/src/com/cloud/api/ApiResponseHelper.java | 9 +-
.../com/cloud/api/query/ViewResponseHelper.java | 20 ++
.../cloud/api/query/dao/ImageDataStoreJoinDao.java | 36 +++
.../api/query/dao/ImageDataStoreJoinDaoImpl.java | 164 ++++++++++++
.../cloud/api/query/vo/ImageDataStoreJoinVO.java | 201 +++++++++++++++
.../cloud/storage/dao/ImageDataStoreDaoImpl.java | 75 ++++++
setup/db/db/schema-410to420.sql | 28 ++-
12 files changed, 729 insertions(+), 21 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/db76107d/api/src/org/apache/cloudstack/api/response/ObjectStoreDetailResponse.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/response/ObjectStoreDetailResponse.java b/api/src/org/apache/cloudstack/api/response/ObjectStoreDetailResponse.java
index b532c28..74a42f2 100644
--- a/api/src/org/apache/cloudstack/api/response/ObjectStoreDetailResponse.java
+++ b/api/src/org/apache/cloudstack/api/response/ObjectStoreDetailResponse.java
@@ -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;
+ }
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/db76107d/api/src/org/apache/cloudstack/api/response/ObjectStoreResponse.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/response/ObjectStoreResponse.java b/api/src/org/apache/cloudstack/api/response/ObjectStoreResponse.java
index de3a26f..595ae97 100644
--- a/api/src/org/apache/cloudstack/api/response/ObjectStoreResponse.java
+++ b/api/src/org/apache/cloudstack/api/response/ObjectStoreResponse.java
@@ -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 setScope(ScopeType type) {
+ this.scope = type;
}
- public void setType(ScopeType type) {
- this.type = type;
+
+ public String getProtocol() {
+ return protocol;
+ }
+
+ public void setProtocol(String protocol) {
+ this.protocol = protocol;
}
- public String getDetails() {
+ 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);
+ }
+
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/db76107d/engine/api/src/org/apache/cloudstack/storage/datastore/db/ImageDataStoreDetailVO.java
----------------------------------------------------------------------
diff --git a/engine/api/src/org/apache/cloudstack/storage/datastore/db/ImageDataStoreDetailVO.java b/engine/api/src/org/apache/cloudstack/storage/datastore/db/ImageDataStoreDetailVO.java
new file mode 100644
index 0000000..c980cf1
--- /dev/null
+++ b/engine/api/src/org/apache/cloudstack/storage/datastore/db/ImageDataStoreDetailVO.java
@@ -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() {
+ }
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/db76107d/engine/api/src/org/apache/cloudstack/storage/datastore/db/ImageDataStoreDetailsDao.java
----------------------------------------------------------------------
diff --git a/engine/api/src/org/apache/cloudstack/storage/datastore/db/ImageDataStoreDetailsDao.java b/engine/api/src/org/apache/cloudstack/storage/datastore/db/ImageDataStoreDetailsDao.java
new file mode 100644
index 0000000..781efcf
--- /dev/null
+++ b/engine/api/src/org/apache/cloudstack/storage/datastore/db/ImageDataStoreDetailsDao.java
@@ -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);
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/db76107d/server/src/com/cloud/api/ApiDBUtils.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/api/ApiDBUtils.java b/server/src/com/cloud/api/ApiDBUtils.java
index 8e6f806..c29f52e 100755
--- a/server/src/com/cloud/api/ApiDBUtils.java
+++ b/server/src/com/cloud/api/ApiDBUtils.java
@@ -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;
@@ -230,7 +233,7 @@ public class ApiDBUtils {
static NetworkModel _networkModel;
static NetworkManager _networkMgr;
static TemplateManager _templateMgr;
-
+
static StatsCollector _statsCollector;
static AccountDao _accountDao;
@@ -308,6 +311,7 @@ public class ApiDBUtils {
static HostJoinDao _hostJoinDao;
static VolumeJoinDao _volJoinDao;
static StoragePoolJoinDao _poolJoinDao;
+ static ImageDataStoreJoinDao _imageStoreJoinDao;
static AccountJoinDao _accountJoinDao;
static AsyncJobJoinDao _jobJoinDao;
@@ -411,6 +415,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;
@@ -510,6 +515,7 @@ public class ApiDBUtils {
_hostJoinDao = hostJoinDao;
_volJoinDao = volJoinDao;
_poolJoinDao = poolJoinDao;
+ _imageStoreJoinDao = imageStoreJoinDao;
_accountJoinDao = accountJoinDao;
_jobJoinDao = jobJoinDao;
@@ -1478,6 +1484,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);
@@ -1522,7 +1540,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);
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/db76107d/server/src/com/cloud/api/ApiResponseHelper.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/api/ApiResponseHelper.java b/server/src/com/cloud/api/ApiResponseHelper.java
index f22437b..5569525 100755
--- a/server/src/com/cloud/api/ApiResponseHelper.java
+++ b/server/src/com/cloud/api/ApiResponseHelper.java
@@ -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;
@@ -891,8 +892,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);
+
+
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/db76107d/server/src/com/cloud/api/query/ViewResponseHelper.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/api/query/ViewResponseHelper.java b/server/src/com/cloud/api/query/ViewResponseHelper.java
index 9e612b0..a1d1bf8 100644
--- a/server/src/com/cloud/api/query/ViewResponseHelper.java
+++ b/server/src/com/cloud/api/query/ViewResponseHelper.java
@@ -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>();
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/db76107d/server/src/com/cloud/api/query/dao/ImageDataStoreJoinDao.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/api/query/dao/ImageDataStoreJoinDao.java b/server/src/com/cloud/api/query/dao/ImageDataStoreJoinDao.java
new file mode 100644
index 0000000..b92fbe6
--- /dev/null
+++ b/server/src/com/cloud/api/query/dao/ImageDataStoreJoinDao.java
@@ -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);
+
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/db76107d/server/src/com/cloud/api/query/dao/ImageDataStoreJoinDaoImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/api/query/dao/ImageDataStoreJoinDaoImpl.java b/server/src/com/cloud/api/query/dao/ImageDataStoreJoinDaoImpl.java
new file mode 100644
index 0000000..c58f954
--- /dev/null
+++ b/server/src/com/cloud/api/query/dao/ImageDataStoreJoinDaoImpl.java
@@ -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;
+ }
+
+
+
+
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/db76107d/server/src/com/cloud/api/query/vo/ImageDataStoreJoinVO.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/api/query/vo/ImageDataStoreJoinVO.java b/server/src/com/cloud/api/query/vo/ImageDataStoreJoinVO.java
new file mode 100644
index 0000000..5858dff
--- /dev/null
+++ b/server/src/com/cloud/api/query/vo/ImageDataStoreJoinVO.java
@@ -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;
+ }
+
+
+
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/db76107d/server/src/com/cloud/storage/dao/ImageDataStoreDaoImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/storage/dao/ImageDataStoreDaoImpl.java b/server/src/com/cloud/storage/dao/ImageDataStoreDaoImpl.java
new file mode 100644
index 0000000..1b3fa46
--- /dev/null
+++ b/server/src/com/cloud/storage/dao/ImageDataStoreDaoImpl.java
@@ -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;
+ }
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/db76107d/setup/db/db/schema-410to420.sql
----------------------------------------------------------------------
diff --git a/setup/db/db/schema-410to420.sql b/setup/db/db/schema-410to420.sql
index 491a708..660a79d 100644
--- a/setup/db/db/schema-410to420.sql
+++ b/setup/db/db/schema-410to420.sql
@@ -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,
[2/3] git commit: updated refs/heads/object_store to db76107
Posted by mc...@apache.org.
Fix AddSecondaryStorageCmd to use CloudStack default secondary storage
store plugin.
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/0d54d01d
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/0d54d01d
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/0d54d01d
Branch: refs/heads/object_store
Commit: 0d54d01d5e201bae02ff2bd62731f9999e5629fb
Parents: 4932379
Author: Min Chen <mi...@citrix.com>
Authored: Tue Apr 2 11:19:49 2013 -0700
Committer: Min Chen <mi...@citrix.com>
Committed: Tue Apr 2 11:19:49 2013 -0700
----------------------------------------------------------------------
api/src/com/cloud/resource/ResourceService.java | 6 +-
api/src/com/cloud/storage/ObjectStore.java | 51 +++++
api/src/com/cloud/storage/ScopeType.java | 27 +++
.../apache/cloudstack/api/ResponseGenerator.java | 4 +-
.../command/admin/host/AddSecondaryStorageCmd.java | 56 ++++-
.../api/response/ObjectStoreDetailResponse.java | 48 +++++
.../api/response/ObjectStoreResponse.java | 156 +++++++++++++++
.../engine/subsystem/api/storage/ClusterScope.java | 2 +
.../api/storage/DataStoreProviderManager.java | 1 +
.../engine/subsystem/api/storage/HostScope.java | 2 +
.../engine/subsystem/api/storage/Scope.java | 2 +
.../engine/subsystem/api/storage/ScopeType.java | 27 ---
.../engine/subsystem/api/storage/ZoneScope.java | 2 +
.../storage/datastore/db/PrimaryDataStoreDao.java | 2 +-
.../datastore/db/PrimaryDataStoreDaoImpl.java | 2 +-
.../storage/datastore/db/StoragePoolVO.java | 2 +-
.../storage/image/store/ImageDataStoreImpl.java | 35 +++-
.../storage/allocator/StorageAllocatorTest.java | 2 +-
.../cloudstack/storage/test/volumeServiceTest.java | 2 +-
.../provider/DataStoreProviderManagerImpl.java | 6 +
.../storage/endpoint/DefaultEndPointSelector.java | 2 +-
.../storage/image/datastore/ImageDataStore.java | 4 +-
.../image/datastore/ImageDataStoreHelper.java | 7 +-
.../storage/image/db/ImageDataStoreVO.java | 63 ++++--
.../volume/datastore/PrimaryDataStoreHelper.java | 2 +-
.../storage/datastore/PrimaryDataStoreImpl.java | 2 +-
.../allocator/RandomStoragePoolAllocator.java | 2 +-
.../CloudStackImageDataStoreLifeCycle.java | 72 +++++++-
.../provider/CloudStackImageDataStoreProvider.java | 2 +-
.../CloudStackPrimaryDataStoreLifeCycleImpl.java | 2 +-
server/src/com/cloud/api/ApiResponseHelper.java | 25 ++-
.../com/cloud/resource/ResourceManagerImpl.java | 115 +++++++++++-
.../src/com/cloud/storage/StorageManagerImpl.java | 1 -
.../src/com/cloud/storage/VolumeManagerImpl.java | 1 -
.../cloud/storage/listener/StoragePoolMonitor.java | 2 +-
.../cloud/resource/MockResourceManagerImpl.java | 9 +
setup/db/db/schema-410to420.sql | 2 +
37 files changed, 660 insertions(+), 88 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/0d54d01d/api/src/com/cloud/resource/ResourceService.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/resource/ResourceService.java b/api/src/com/cloud/resource/ResourceService.java
index 08e2585..dbed36e 100755
--- a/api/src/com/cloud/resource/ResourceService.java
+++ b/api/src/com/cloud/resource/ResourceService.java
@@ -38,6 +38,7 @@ import com.cloud.exception.ResourceInUseException;
import com.cloud.host.Host;
import com.cloud.hypervisor.Hypervisor.HypervisorType;
import com.cloud.org.Cluster;
+import com.cloud.storage.ObjectStore;
import com.cloud.storage.S3;
import com.cloud.storage.Swift;
import com.cloud.utils.Pair;
@@ -100,7 +101,10 @@ public interface ResourceService {
Swift discoverSwift(AddSwiftCmd addSwiftCmd) throws DiscoveryException;
S3 discoverS3(AddS3Cmd cmd) throws DiscoveryException;
-
+
+ ObjectStore discoverObjectStore(AddSecondaryStorageCmd cmd) throws IllegalArgumentException, DiscoveryException, InvalidParameterValueException;
+
+
List<HypervisorType> getSupportedHypervisorTypes(long zoneId, boolean forVirtualRouter, Long podId);
Pair<List<? extends Swift>, Integer> listSwifts(ListSwiftsCmd cmd);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/0d54d01d/api/src/com/cloud/storage/ObjectStore.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/storage/ObjectStore.java b/api/src/com/cloud/storage/ObjectStore.java
new file mode 100644
index 0000000..636537f
--- /dev/null
+++ b/api/src/com/cloud/storage/ObjectStore.java
@@ -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 com.cloud.storage;
+
+import org.apache.cloudstack.api.Identity;
+import org.apache.cloudstack.api.InternalIdentity;
+
+public interface ObjectStore extends Identity, InternalIdentity {
+
+ /**
+ * @return name of the object store.
+ */
+ String getName();
+
+ /**
+ * @return availability zone.
+ */
+ Long getDataCenterId();
+
+ /**
+ * @return region id.
+ * @return
+ */
+ Long getRegionId();
+
+ /**
+ * @return object store provider name
+ */
+ String getProviderName();
+
+
+ /**
+ *
+ * @return data store protocol
+ */
+ String getProtocol();
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/0d54d01d/api/src/com/cloud/storage/ScopeType.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/storage/ScopeType.java b/api/src/com/cloud/storage/ScopeType.java
new file mode 100644
index 0000000..c9786d8
--- /dev/null
+++ b/api/src/com/cloud/storage/ScopeType.java
@@ -0,0 +1,27 @@
+/*
+ * 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;
+
+public enum ScopeType {
+ HOST,
+ CLUSTER,
+ ZONE,
+ REGION,
+ GLOBAL;
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/0d54d01d/api/src/org/apache/cloudstack/api/ResponseGenerator.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/ResponseGenerator.java b/api/src/org/apache/cloudstack/api/ResponseGenerator.java
index d1e1302..b85f2c5 100644
--- a/api/src/org/apache/cloudstack/api/ResponseGenerator.java
+++ b/api/src/org/apache/cloudstack/api/ResponseGenerator.java
@@ -326,6 +326,8 @@ public interface ResponseGenerator {
RegionResponse createRegionResponse(Region region);
+ ObjectStoreResponse createObjectStoreResponse(ObjectStore os);
+
/**
* @param resourceTag
* @param keyValueOnly TODO
@@ -384,7 +386,7 @@ public interface ResponseGenerator {
GuestOSResponse createGuestOSResponse(GuestOS os);
SnapshotScheduleResponse createSnapshotScheduleResponse(SnapshotSchedule sched);
-
+
UsageRecordResponse createUsageResponse(Usage usageRecord);
TrafficMonitorResponse createTrafficMonitorResponse(Host trafficMonitor);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/0d54d01d/api/src/org/apache/cloudstack/api/command/admin/host/AddSecondaryStorageCmd.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/command/admin/host/AddSecondaryStorageCmd.java b/api/src/org/apache/cloudstack/api/command/admin/host/AddSecondaryStorageCmd.java
index f1d12b3..663750e 100644
--- a/api/src/org/apache/cloudstack/api/command/admin/host/AddSecondaryStorageCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/admin/host/AddSecondaryStorageCmd.java
@@ -17,6 +17,7 @@
package org.apache.cloudstack.api.command.admin.host;
import java.util.List;
+import java.util.Map;
import org.apache.cloudstack.api.APICommand;
import org.apache.cloudstack.api.ApiConstants;
@@ -24,12 +25,16 @@ 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.HostResponse;
+import org.apache.cloudstack.api.response.ObjectStoreResponse;
+import org.apache.cloudstack.api.response.RegionResponse;
import org.apache.cloudstack.api.response.ZoneResponse;
import org.apache.log4j.Logger;
import com.cloud.exception.DiscoveryException;
import com.cloud.host.Host;
+import com.cloud.storage.ObjectStore;
import com.cloud.user.Account;
@APICommand(name = "addSecondaryStorage", description="Adds secondary storage.", responseObject=HostResponse.class)
@@ -48,6 +53,21 @@ public class AddSecondaryStorageCmd extends BaseCmd {
description="the Zone ID for the secondary storage")
private Long zoneId;
+ @Parameter(name=ApiConstants.REGION_ID, type=CommandType.UUID, entityType=RegionResponse.class,
+ description="the Region ID for the secondary storage")
+ private Long regionId;
+
+ @Parameter(name=ApiConstants.DETAILS, type=CommandType.MAP, description="the details for the secondary storage data store")
+ private Map details;
+
+ @Parameter(name=ApiConstants.SCOPE, type=CommandType.STRING,
+ required=false, description="the scope of the secondary storage data store: zone or region or global")
+ private String scope;
+
+ @Parameter(name=ApiConstants.PROVIDER, type=CommandType.STRING,
+ required=false, description="the secondary storage store provider name")
+ private String imageProviderName;
+
/////////////////////////////////////////////////////
/////////////////// Accessors ///////////////////////
/////////////////////////////////////////////////////
@@ -60,6 +80,23 @@ public class AddSecondaryStorageCmd extends BaseCmd {
return zoneId;
}
+ public Long getRegionId() {
+ return regionId;
+ }
+
+ public Map getDetails() {
+ return details;
+ }
+
+ public String getScope() {
+ return this.scope;
+ }
+
+ public String getImageProviderName() {
+ return this.imageProviderName;
+ }
+
+
/////////////////////////////////////////////////////
/////////////// API Implementation///////////////////
/////////////////////////////////////////////////////
@@ -76,17 +113,14 @@ public class AddSecondaryStorageCmd extends BaseCmd {
@Override
public void execute(){
- try {
- List<? extends Host> result = _resourceService.discoverHosts(this);
- HostResponse hostResponse = null;
- if (result != null && result.size() > 0) {
- for (Host host : result) {
- // There should only be one secondary storage host per add
- hostResponse = _responseGenerator.createHostResponse(host);
- hostResponse.setResponseName(getCommandName());
- hostResponse.setObjectName("secondarystorage");
- this.setResponseObject(hostResponse);
- }
+ try{
+ ObjectStore result = _resourceService.discoverObjectStore(this);
+ ObjectStoreResponse storeResponse = null;
+ if (result != null ) {
+ storeResponse = _responseGenerator.createObjectStoreResponse(result);
+ storeResponse.setResponseName(getCommandName());
+ storeResponse.setObjectName("secondarystorage");
+ this.setResponseObject(storeResponse);
} else {
throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to add secondary storage");
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/0d54d01d/api/src/org/apache/cloudstack/api/response/ObjectStoreDetailResponse.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/response/ObjectStoreDetailResponse.java b/api/src/org/apache/cloudstack/api/response/ObjectStoreDetailResponse.java
new file mode 100644
index 0000000..b532c28
--- /dev/null
+++ b/api/src/org/apache/cloudstack/api/response/ObjectStoreDetailResponse.java
@@ -0,0 +1,48 @@
+// 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.response;
+
+import org.apache.cloudstack.api.BaseResponse;
+
+import com.cloud.serializer.Param;
+import com.google.gson.annotations.SerializedName;
+
+public class ObjectStoreDetailResponse extends BaseResponse {
+ @SerializedName("name") @Param(description="detail property name of the object store")
+ private String name;
+
+ @SerializedName("value") @Param(description="detail property value of the object store")
+ private String value;
+
+ 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;
+ }
+
+
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/0d54d01d/api/src/org/apache/cloudstack/api/response/ObjectStoreResponse.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/response/ObjectStoreResponse.java b/api/src/org/apache/cloudstack/api/response/ObjectStoreResponse.java
new file mode 100644
index 0000000..de3a26f
--- /dev/null
+++ b/api/src/org/apache/cloudstack/api/response/ObjectStoreResponse.java
@@ -0,0 +1,156 @@
+// 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.response;
+
+import java.util.Date;
+
+import javax.persistence.Column;
+
+import org.apache.cloudstack.api.ApiConstants;
+import org.apache.cloudstack.api.BaseResponse;
+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)
+public class ObjectStoreResponse extends BaseResponse {
+ @SerializedName("id") @Param(description="the ID of the object store")
+ private String id;
+
+ @SerializedName("zoneid") @Param(description="the Zone ID of the object store")
+ private String zoneId;
+
+ @SerializedName(ApiConstants.ZONE_NAME) @Param(description="the Zone name of the object store")
+ private String zoneName;
+
+ @SerializedName("regionid") @Param(description="the Region ID of the object store")
+ private String regionId;
+
+ @SerializedName("regionname") @Param(description="the Region name of the object store")
+ private String regionName;
+
+ @SerializedName("name") @Param(description="the name of the object store")
+ private String name;
+
+ @SerializedName("url") @Param(description="the url of the object store")
+ private String url;
+
+ @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;
+
+ @SerializedName("details") @Param(description="the details of the object store")
+ private String details;
+
+
+
+ @Override
+ public String getObjectId() {
+ return this.getId();
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public String getZoneId() {
+ return zoneId;
+ }
+
+ public void setZoneId(String zoneId) {
+ this.zoneId = zoneId;
+ }
+
+ public String getZoneName() {
+ return zoneName;
+ }
+
+ public void setZoneName(String zoneName) {
+ this.zoneName = zoneName;
+ }
+
+
+ public String getRegionId() {
+ return regionId;
+ }
+
+ public void setRegionId(String regionId) {
+ this.regionId = regionId;
+ }
+
+ public String getRegionName() {
+ return regionName;
+ }
+
+ public void setRegionName(String regionName) {
+ this.regionName = regionName;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getUrl() {
+ return url;
+ }
+
+ public void setUrl(String url) {
+ this.url = url;
+ }
+
+ public String getProviderName() {
+ return providerName;
+ }
+
+ public void setProviderName(String providerName) {
+ this.providerName = providerName;
+ }
+
+ public ScopeType getType() {
+ return type;
+ }
+
+ public void setType(ScopeType type) {
+ this.type = type;
+ }
+
+ public String getDetails() {
+ return details;
+ }
+
+ public void setDetails(String details) {
+ this.details = details;
+ }
+
+
+
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/0d54d01d/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/ClusterScope.java
----------------------------------------------------------------------
diff --git a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/ClusterScope.java b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/ClusterScope.java
index 0f0e958..938f055 100644
--- a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/ClusterScope.java
+++ b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/ClusterScope.java
@@ -18,6 +18,8 @@
*/
package org.apache.cloudstack.engine.subsystem.api.storage;
+import com.cloud.storage.ScopeType;
+
public class ClusterScope extends AbstractScope {
private ScopeType type = ScopeType.CLUSTER;
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/0d54d01d/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/DataStoreProviderManager.java
----------------------------------------------------------------------
diff --git a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/DataStoreProviderManager.java b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/DataStoreProviderManager.java
index 906720a..8dd8c3a 100644
--- a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/DataStoreProviderManager.java
+++ b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/DataStoreProviderManager.java
@@ -26,6 +26,7 @@ import com.cloud.utils.component.Manager;
public interface DataStoreProviderManager extends Manager, DataStoreProviderApiService {
public DataStoreProvider getDataStoreProvider(String name);
public DataStoreProvider getDefaultPrimaryDataStoreProvider();
+ public DataStoreProvider getDefaultImageDataStoreProvider();
public List<DataStoreProvider> getDataStoreProviders();
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/0d54d01d/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/HostScope.java
----------------------------------------------------------------------
diff --git a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/HostScope.java b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/HostScope.java
index c5e90ac..57a448f 100644
--- a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/HostScope.java
+++ b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/HostScope.java
@@ -18,6 +18,8 @@
*/
package org.apache.cloudstack.engine.subsystem.api.storage;
+import com.cloud.storage.ScopeType;
+
public class HostScope extends AbstractScope {
private ScopeType type = ScopeType.HOST;
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/0d54d01d/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/Scope.java
----------------------------------------------------------------------
diff --git a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/Scope.java b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/Scope.java
index 91d4734..25226f9 100644
--- a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/Scope.java
+++ b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/Scope.java
@@ -18,6 +18,8 @@
*/
package org.apache.cloudstack.engine.subsystem.api.storage;
+import com.cloud.storage.ScopeType;
+
public interface Scope {
public ScopeType getScopeType();
public boolean isSameScope(Scope scope);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/0d54d01d/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/ScopeType.java
----------------------------------------------------------------------
diff --git a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/ScopeType.java b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/ScopeType.java
deleted file mode 100644
index a3d21ce..0000000
--- a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/ScopeType.java
+++ /dev/null
@@ -1,27 +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.engine.subsystem.api.storage;
-
-public enum ScopeType {
- HOST,
- CLUSTER,
- ZONE,
- REGION,
- GLOBAL;
-}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/0d54d01d/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/ZoneScope.java
----------------------------------------------------------------------
diff --git a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/ZoneScope.java b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/ZoneScope.java
index 2d3d41f..a71a9c7 100644
--- a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/ZoneScope.java
+++ b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/ZoneScope.java
@@ -18,6 +18,8 @@
*/
package org.apache.cloudstack.engine.subsystem.api.storage;
+import com.cloud.storage.ScopeType;
+
public class ZoneScope extends AbstractScope {
private ScopeType type = ScopeType.ZONE;
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/0d54d01d/engine/api/src/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDao.java
----------------------------------------------------------------------
diff --git a/engine/api/src/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDao.java b/engine/api/src/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDao.java
index 4d84525..16fed35 100644
--- a/engine/api/src/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDao.java
+++ b/engine/api/src/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDao.java
@@ -20,8 +20,8 @@ import java.util.ArrayList;
import java.util.List;
import java.util.Map;
-import org.apache.cloudstack.engine.subsystem.api.storage.ScopeType;
+import com.cloud.storage.ScopeType;
import com.cloud.storage.StoragePoolStatus;
import com.cloud.utils.db.GenericDao;
/**
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/0d54d01d/engine/api/src/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/api/src/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDaoImpl.java b/engine/api/src/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDaoImpl.java
index 7fcddf1..7e7e6fd 100644
--- a/engine/api/src/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDaoImpl.java
+++ b/engine/api/src/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDaoImpl.java
@@ -28,11 +28,11 @@ import javax.ejb.Local;
import javax.inject.Inject;
import javax.naming.ConfigurationException;
-import org.apache.cloudstack.engine.subsystem.api.storage.ScopeType;
import org.springframework.stereotype.Component;
import com.cloud.host.Status;
+import com.cloud.storage.ScopeType;
import com.cloud.storage.StoragePoolStatus;
import com.cloud.utils.db.DB;
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/0d54d01d/engine/api/src/org/apache/cloudstack/storage/datastore/db/StoragePoolVO.java
----------------------------------------------------------------------
diff --git a/engine/api/src/org/apache/cloudstack/storage/datastore/db/StoragePoolVO.java b/engine/api/src/org/apache/cloudstack/storage/datastore/db/StoragePoolVO.java
index 55b2314..6a7c854 100644
--- a/engine/api/src/org/apache/cloudstack/storage/datastore/db/StoragePoolVO.java
+++ b/engine/api/src/org/apache/cloudstack/storage/datastore/db/StoragePoolVO.java
@@ -29,9 +29,9 @@ import javax.persistence.TableGenerator;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
-import org.apache.cloudstack.engine.subsystem.api.storage.ScopeType;
import com.cloud.storage.Storage.StoragePoolType;
+import com.cloud.storage.ScopeType;
import com.cloud.storage.StoragePool;
import com.cloud.storage.StoragePoolStatus;
import com.cloud.utils.db.GenericDao;
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/0d54d01d/engine/storage/image/src/org/apache/cloudstack/storage/image/store/ImageDataStoreImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/image/src/org/apache/cloudstack/storage/image/store/ImageDataStoreImpl.java b/engine/storage/image/src/org/apache/cloudstack/storage/image/store/ImageDataStoreImpl.java
index 5761033..4a6016c 100644
--- a/engine/storage/image/src/org/apache/cloudstack/storage/image/store/ImageDataStoreImpl.java
+++ b/engine/storage/image/src/org/apache/cloudstack/storage/image/store/ImageDataStoreImpl.java
@@ -52,9 +52,9 @@ public class ImageDataStoreImpl implements ImageDataStore {
boolean needDownloadToCacheStorage = false;
public ImageDataStoreImpl() {
-
+
}
-
+
protected void configure(ImageDataStoreVO dataStoreVO, ImageDataStoreDriver imageDataStoreDriver,
ImageDataStoreProvider provider) {
this.driver = imageDataStoreDriver;
@@ -99,7 +99,7 @@ public class ImageDataStoreImpl implements ImageDataStore {
@Override
public Scope getScope() {
- return new ZoneScope(imageDataStoreVO.getDcId());
+ return new ZoneScope(imageDataStoreVO.getDataCenterId());
}
@Override
@@ -142,4 +142,33 @@ public class ImageDataStoreImpl implements ImageDataStore {
// TODO Auto-generated method stub
return false;
}
+
+ @Override
+ public String getName() {
+ return imageDataStoreVO.getName();
+ }
+
+ @Override
+ public Long getDataCenterId() {
+ return imageDataStoreVO.getDataCenterId();
+ }
+
+ @Override
+ public Long getRegionId() {
+ return imageDataStoreVO.getRegionId();
+ }
+
+ @Override
+ public String getProviderName() {
+ return imageDataStoreVO.getProviderName();
+ }
+
+ @Override
+ public String getProtocol() {
+ return imageDataStoreVO.getProtocol();
+ }
+
+
+
+
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/0d54d01d/engine/storage/integration-test/test/org/apache/cloudstack/storage/allocator/StorageAllocatorTest.java
----------------------------------------------------------------------
diff --git a/engine/storage/integration-test/test/org/apache/cloudstack/storage/allocator/StorageAllocatorTest.java b/engine/storage/integration-test/test/org/apache/cloudstack/storage/allocator/StorageAllocatorTest.java
index c6ebf2e..b369459 100644
--- a/engine/storage/integration-test/test/org/apache/cloudstack/storage/allocator/StorageAllocatorTest.java
+++ b/engine/storage/integration-test/test/org/apache/cloudstack/storage/allocator/StorageAllocatorTest.java
@@ -28,7 +28,6 @@ import junit.framework.Assert;
import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreProvider;
import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreProviderManager;
-import org.apache.cloudstack.engine.subsystem.api.storage.ScopeType;
import org.apache.cloudstack.engine.subsystem.api.storage.StoragePoolAllocator;
import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
import org.apache.cloudstack.storage.datastore.db.StoragePoolDetailVO;
@@ -55,6 +54,7 @@ import com.cloud.hypervisor.Hypervisor.HypervisorType;
import com.cloud.org.Cluster.ClusterType;
import com.cloud.org.Managed.ManagedState;
import com.cloud.storage.DiskOfferingVO;
+import com.cloud.storage.ScopeType;
import com.cloud.storage.StorageManager;
import com.cloud.storage.StoragePool;
import com.cloud.storage.StoragePoolStatus;
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/0d54d01d/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/volumeServiceTest.java
----------------------------------------------------------------------
diff --git a/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/volumeServiceTest.java b/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/volumeServiceTest.java
index b542e85..293d7fb 100644
--- a/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/volumeServiceTest.java
+++ b/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/volumeServiceTest.java
@@ -40,7 +40,6 @@ import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreRole;
import org.apache.cloudstack.engine.subsystem.api.storage.EndPoint;
import org.apache.cloudstack.engine.subsystem.api.storage.ImageDataFactory;
import org.apache.cloudstack.engine.subsystem.api.storage.ImageService;
-import org.apache.cloudstack.engine.subsystem.api.storage.ScopeType;
import org.apache.cloudstack.engine.subsystem.api.storage.TemplateInfo;
import org.apache.cloudstack.engine.subsystem.api.storage.VolumeDataFactory;
import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo;
@@ -74,6 +73,7 @@ import com.cloud.hypervisor.Hypervisor.HypervisorType;
import com.cloud.org.Cluster.ClusterType;
import com.cloud.org.Managed.ManagedState;
import com.cloud.resource.ResourceState;
+import com.cloud.storage.ScopeType;
import com.cloud.storage.Storage;
import com.cloud.storage.Storage.StoragePoolType;
import com.cloud.storage.Storage.TemplateType;
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/0d54d01d/engine/storage/src/org/apache/cloudstack/storage/datastore/provider/DataStoreProviderManagerImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/datastore/provider/DataStoreProviderManagerImpl.java b/engine/storage/src/org/apache/cloudstack/storage/datastore/provider/DataStoreProviderManagerImpl.java
index c6911df..aa1ace2 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/datastore/provider/DataStoreProviderManagerImpl.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/datastore/provider/DataStoreProviderManagerImpl.java
@@ -139,6 +139,12 @@ public class DataStoreProviderManagerImpl extends ManagerBase implements DataSto
return this.getDataStoreProvider("cloudstack primary data store provider");
}
+
+ @Override
+ public DataStoreProvider getDefaultImageDataStoreProvider() {
+ return this.getDataStoreProvider("cloudstack image data store provider");
+ }
+
@Override
public List<StorageProviderResponse> getDataStoreProviders(String type) {
if (type == null) {
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/0d54d01d/engine/storage/src/org/apache/cloudstack/storage/endpoint/DefaultEndPointSelector.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/endpoint/DefaultEndPointSelector.java b/engine/storage/src/org/apache/cloudstack/storage/endpoint/DefaultEndPointSelector.java
index c385abe..772a8f2 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/endpoint/DefaultEndPointSelector.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/endpoint/DefaultEndPointSelector.java
@@ -31,7 +31,6 @@ import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreRole;
import org.apache.cloudstack.engine.subsystem.api.storage.EndPoint;
import org.apache.cloudstack.engine.subsystem.api.storage.Scope;
-import org.apache.cloudstack.engine.subsystem.api.storage.ScopeType;
import org.apache.cloudstack.engine.subsystem.api.storage.disktype.DiskFormat;
import org.apache.cloudstack.storage.HypervisorHostEndPoint;
import org.apache.log4j.Logger;
@@ -40,6 +39,7 @@ import org.springframework.stereotype.Component;
import com.cloud.host.HostVO;
import com.cloud.host.Status;
import com.cloud.host.dao.HostDao;
+import com.cloud.storage.ScopeType;
import com.cloud.utils.db.DB;
import com.cloud.utils.db.SearchCriteria2;
import com.cloud.utils.db.SearchCriteriaService;
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/0d54d01d/engine/storage/src/org/apache/cloudstack/storage/image/datastore/ImageDataStore.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/datastore/ImageDataStore.java b/engine/storage/src/org/apache/cloudstack/storage/image/datastore/ImageDataStore.java
index ed2274e..a9b7e9b 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/image/datastore/ImageDataStore.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/image/datastore/ImageDataStore.java
@@ -26,7 +26,9 @@ import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotInfo;
import org.apache.cloudstack.engine.subsystem.api.storage.TemplateInfo;
import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo;
-public interface ImageDataStore extends DataStore {
+import com.cloud.storage.ObjectStore;
+
+public interface ImageDataStore extends DataStore, ObjectStore {
TemplateInfo getTemplate(long templateId);
VolumeInfo getVolume(long volumeId);
SnapshotInfo getSnapshot(long snapshotId);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/0d54d01d/engine/storage/src/org/apache/cloudstack/storage/image/datastore/ImageDataStoreHelper.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/datastore/ImageDataStoreHelper.java b/engine/storage/src/org/apache/cloudstack/storage/image/datastore/ImageDataStoreHelper.java
index 3f1632c..e31a644 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/image/datastore/ImageDataStoreHelper.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/image/datastore/ImageDataStoreHelper.java
@@ -22,11 +22,11 @@ import java.util.Map;
import javax.inject.Inject;
-import org.apache.cloudstack.engine.subsystem.api.storage.ScopeType;
import org.apache.cloudstack.storage.image.db.ImageDataStoreDao;
import org.apache.cloudstack.storage.image.db.ImageDataStoreVO;
import org.springframework.stereotype.Component;
+import com.cloud.storage.ScopeType;
import com.cloud.utils.exception.CloudRuntimeException;
@Component
@@ -44,16 +44,17 @@ public class ImageDataStoreHelper {
store.setProviderName((String)params.get("providerName"));
store.setScope((ScopeType)params.get("scope"));
store.setUuid((String)params.get("uuid"));
+ store.setUrl((String)params.get("url"));
store = imageStoreDao.persist(store);
return store;
}
-
+
public boolean deleteImageDataStore(long id) {
ImageDataStoreVO store = imageStoreDao.findById(id);
if (store == null) {
throw new CloudRuntimeException("can't find image store:" + id);
}
-
+
imageStoreDao.remove(id);
return true;
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/0d54d01d/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageDataStoreVO.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageDataStoreVO.java b/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageDataStoreVO.java
index 4cb402a..3e0d838 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageDataStoreVO.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageDataStoreVO.java
@@ -26,11 +26,13 @@ import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.TableGenerator;
-import org.apache.cloudstack.engine.subsystem.api.storage.ScopeType;
+
+import com.cloud.storage.ObjectStore;
+import com.cloud.storage.ScopeType;
@Entity
@Table(name = "image_data_store")
-public class ImageDataStoreVO {
+public class ImageDataStoreVO implements ObjectStore {
@Id
@TableGenerator(name = "image_data_store_sq", table = "sequence", pkColumnName = "name", valueColumnName = "value", pkColumnValue = "image_data_store_seq", allocationSize = 1)
@Column(name = "id", nullable = false)
@@ -38,24 +40,30 @@ public class ImageDataStoreVO {
@Column(name = "name", nullable = false)
private String name;
-
+
@Column(name = "uuid", nullable = false)
private String uuid;
-
+
@Column(name = "protocol", nullable = false)
private String protocol;
+ @Column(name = "url", nullable = false)
+ private String url;
+
@Column(name = "image_provider_name", nullable = false)
private String providerName;
-
+
@Column(name = "data_center_id")
private long dcId;
-
+
+ @Column(name = "region_id")
+ private long regionId;
+
@Column(name = "scope")
@Enumerated(value = EnumType.STRING)
private ScopeType scope;
-
-
+
+
public long getId() {
return this.id;
}
@@ -75,36 +83,55 @@ public class ImageDataStoreVO {
public void setProviderName(String provider) {
this.providerName = provider;
}
-
+
public void setProtocol(String protocol) {
this.protocol = protocol;
}
-
+
public String getProtocol() {
return this.protocol;
}
-
- public void setDcId(long dcId) {
+
+ public void setDataCenterId(long dcId) {
this.dcId = dcId;
}
-
- public long getDcId() {
+
+ public Long getDataCenterId() {
return this.dcId;
}
-
+
+
+ public Long getRegionId() {
+ return regionId;
+ }
+
+ public void setRegionId(long regionId) {
+ this.regionId = regionId;
+ }
+
public ScopeType getScope() {
return this.scope;
}
-
+
public void setScope(ScopeType scope) {
this.scope = scope;
}
-
+
public void setUuid(String uuid) {
this.uuid = uuid;
}
-
+
public String getUuid() {
return this.uuid;
}
+
+ public String getUrl() {
+ return url;
+ }
+
+ public void setUrl(String url) {
+ this.url = url;
+ }
+
+
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/0d54d01d/engine/storage/src/org/apache/cloudstack/storage/volume/datastore/PrimaryDataStoreHelper.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/volume/datastore/PrimaryDataStoreHelper.java b/engine/storage/src/org/apache/cloudstack/storage/volume/datastore/PrimaryDataStoreHelper.java
index 5f8daf4..c5f7a1b 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/volume/datastore/PrimaryDataStoreHelper.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/volume/datastore/PrimaryDataStoreHelper.java
@@ -28,7 +28,6 @@ import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreRole;
import org.apache.cloudstack.engine.subsystem.api.storage.HostScope;
import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreParameters;
-import org.apache.cloudstack.engine.subsystem.api.storage.ScopeType;
import org.apache.cloudstack.storage.command.AttachPrimaryDataStoreCmd;
import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
@@ -42,6 +41,7 @@ import com.cloud.alert.AlertManager;
import com.cloud.capacity.Capacity;
import com.cloud.capacity.CapacityVO;
import com.cloud.capacity.dao.CapacityDao;
+import com.cloud.storage.ScopeType;
import com.cloud.storage.StorageManager;
import com.cloud.storage.StoragePool;
import com.cloud.storage.StoragePoolHostVO;
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/0d54d01d/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/PrimaryDataStoreImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/PrimaryDataStoreImpl.java b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/PrimaryDataStoreImpl.java
index b695ff0..3266eaf 100644
--- a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/PrimaryDataStoreImpl.java
+++ b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/PrimaryDataStoreImpl.java
@@ -35,7 +35,6 @@ import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreState
import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreDriver;
import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreLifeCycle;
import org.apache.cloudstack.engine.subsystem.api.storage.Scope;
-import org.apache.cloudstack.engine.subsystem.api.storage.ScopeType;
import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotDataFactory;
import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotInfo;
import org.apache.cloudstack.engine.subsystem.api.storage.TemplateInfo;
@@ -49,6 +48,7 @@ import org.apache.log4j.Logger;
import com.cloud.hypervisor.Hypervisor.HypervisorType;
import com.cloud.storage.Storage.StoragePoolType;
+import com.cloud.storage.ScopeType;
import com.cloud.storage.StoragePoolHostVO;
import com.cloud.storage.StoragePoolStatus;
import com.cloud.storage.VMTemplateStoragePoolVO;
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/0d54d01d/plugins/storage-allocators/random/src/org/apache/cloudstack/storage/allocator/RandomStoragePoolAllocator.java
----------------------------------------------------------------------
diff --git a/plugins/storage-allocators/random/src/org/apache/cloudstack/storage/allocator/RandomStoragePoolAllocator.java b/plugins/storage-allocators/random/src/org/apache/cloudstack/storage/allocator/RandomStoragePoolAllocator.java
index cbe6647..5de3f6b 100644
--- a/plugins/storage-allocators/random/src/org/apache/cloudstack/storage/allocator/RandomStoragePoolAllocator.java
+++ b/plugins/storage-allocators/random/src/org/apache/cloudstack/storage/allocator/RandomStoragePoolAllocator.java
@@ -21,13 +21,13 @@ import java.util.List;
import javax.ejb.Local;
-import org.apache.cloudstack.engine.subsystem.api.storage.ScopeType;
import org.apache.cloudstack.engine.subsystem.api.storage.StoragePoolAllocator;
import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
import org.apache.log4j.Logger;
import com.cloud.deploy.DeploymentPlan;
import com.cloud.deploy.DeploymentPlanner.ExcludeList;
+import com.cloud.storage.ScopeType;
import com.cloud.storage.StoragePool;
import com.cloud.vm.DiskProfile;
import com.cloud.vm.VirtualMachine;
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/0d54d01d/plugins/storage/image/default/src/org/apache/cloudstack/storage/datastore/lifecycle/CloudStackImageDataStoreLifeCycle.java
----------------------------------------------------------------------
diff --git a/plugins/storage/image/default/src/org/apache/cloudstack/storage/datastore/lifecycle/CloudStackImageDataStoreLifeCycle.java b/plugins/storage/image/default/src/org/apache/cloudstack/storage/datastore/lifecycle/CloudStackImageDataStoreLifeCycle.java
index dce40d9..f111dfa 100644
--- a/plugins/storage/image/default/src/org/apache/cloudstack/storage/datastore/lifecycle/CloudStackImageDataStoreLifeCycle.java
+++ b/plugins/storage/image/default/src/org/apache/cloudstack/storage/datastore/lifecycle/CloudStackImageDataStoreLifeCycle.java
@@ -16,6 +16,11 @@
// under the License.
package org.apache.cloudstack.storage.datastore.lifecycle;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
import java.util.Map;
import javax.inject.Inject;
@@ -29,23 +34,88 @@ import org.apache.cloudstack.storage.image.datastore.ImageDataStoreProviderManag
import org.apache.cloudstack.storage.image.db.ImageDataStoreDao;
import org.apache.cloudstack.storage.image.db.ImageDataStoreVO;
import org.apache.cloudstack.storage.image.store.lifecycle.ImageDataStoreLifeCycle;
+import org.apache.log4j.Logger;
import com.cloud.agent.api.StoragePoolInfo;
+import com.cloud.exception.DiscoveryException;
+import com.cloud.exception.InvalidParameterValueException;
+import com.cloud.host.Host;
+import com.cloud.host.HostVO;
+import com.cloud.hypervisor.kvm.discoverer.KvmDummyResourceBase;
+import com.cloud.resource.Discoverer;
+import com.cloud.resource.ResourceListener;
+import com.cloud.resource.ResourceManager;
+import com.cloud.resource.ServerResource;
+import com.cloud.storage.ScopeType;
+import com.cloud.utils.UriUtils;
public class CloudStackImageDataStoreLifeCycle implements ImageDataStoreLifeCycle {
+
+ private static final Logger s_logger = Logger
+ .getLogger(CloudStackImageDataStoreLifeCycle.class);
+ @Inject
+ protected ResourceManager _resourceMgr;
@Inject
protected ImageDataStoreDao imageStoreDao;
@Inject
ImageDataStoreHelper imageStoreHelper;
@Inject
ImageDataStoreProviderManager imageStoreMgr;
+
+ protected List<? extends Discoverer> _discoverers;
+ public List<? extends Discoverer> getDiscoverers() {
+ return _discoverers;
+ }
+ public void setDiscoverers(List<? extends Discoverer> _discoverers) {
+ this._discoverers = _discoverers;
+ }
+
public CloudStackImageDataStoreLifeCycle() {
}
@Override
public DataStore initialize(Map<String, Object> dsInfos) {
- ImageDataStoreVO ids = imageStoreHelper.createImageDataStore(dsInfos);
+
+ Long dcId = (Long) dsInfos.get("zoneId");
+ String url = (String) dsInfos.get("url");
+ String providerName = (String)dsInfos.get("providerName");
+
+ s_logger.info("Trying to add a new host at " + url + " in data center " + dcId);
+
+ URI uri = null;
+ try {
+ uri = new URI(UriUtils.encodeURIComponent(url));
+ if (uri.getScheme() == null) {
+ throw new InvalidParameterValueException("uri.scheme is null "
+ + url + ", add nfs:// as a prefix");
+ } else if (uri.getScheme().equalsIgnoreCase("nfs")) {
+ if (uri.getHost() == null || uri.getHost().equalsIgnoreCase("")
+ || uri.getPath() == null
+ || uri.getPath().equalsIgnoreCase("")) {
+ throw new InvalidParameterValueException(
+ "Your host and/or path is wrong. Make sure it's of the format nfs://hostname/path");
+ }
+ }
+ } catch (URISyntaxException e) {
+ throw new InvalidParameterValueException(url
+ + " is not a valid uri");
+ }
+
+ if ( dcId == null ){
+ throw new InvalidParameterValueException("DataCenter id is null, and cloudstack default image storehas to be associated with a data center");
+ }
+
+
+ Map<String, Object> imageStoreParameters = new HashMap<String, Object>();
+ imageStoreParameters.put("name", url);
+ imageStoreParameters.put("zoneId", dcId);
+ imageStoreParameters.put("url", url);
+ imageStoreParameters.put("protocol", uri.getScheme().toLowerCase());
+ imageStoreParameters.put("scope", ScopeType.ZONE);
+ imageStoreParameters.put("providerName", providerName);
+
+ ImageDataStoreVO ids = imageStoreHelper.createImageDataStore(imageStoreParameters);
return imageStoreMgr.getImageDataStore(ids.getId());
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/0d54d01d/plugins/storage/image/default/src/org/apache/cloudstack/storage/datastore/provider/CloudStackImageDataStoreProvider.java
----------------------------------------------------------------------
diff --git a/plugins/storage/image/default/src/org/apache/cloudstack/storage/datastore/provider/CloudStackImageDataStoreProvider.java b/plugins/storage/image/default/src/org/apache/cloudstack/storage/datastore/provider/CloudStackImageDataStoreProvider.java
index c91aa1e..1e88da3 100644
--- a/plugins/storage/image/default/src/org/apache/cloudstack/storage/datastore/provider/CloudStackImageDataStoreProvider.java
+++ b/plugins/storage/image/default/src/org/apache/cloudstack/storage/datastore/provider/CloudStackImageDataStoreProvider.java
@@ -30,7 +30,6 @@ import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreDriver;
import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreLifeCycle;
import org.apache.cloudstack.engine.subsystem.api.storage.HypervisorHostListener;
import org.apache.cloudstack.engine.subsystem.api.storage.ImageDataStoreProvider;
-import org.apache.cloudstack.engine.subsystem.api.storage.ScopeType;
import org.apache.cloudstack.storage.datastore.driver.CloudStackImageDataStoreDriverImpl;
import org.apache.cloudstack.storage.datastore.lifecycle.CloudStackImageDataStoreLifeCycle;
import org.apache.cloudstack.storage.image.ImageDataStoreDriver;
@@ -39,6 +38,7 @@ import org.apache.cloudstack.storage.image.datastore.ImageDataStoreProviderManag
import org.apache.cloudstack.storage.image.store.lifecycle.ImageDataStoreLifeCycle;
import org.springframework.stereotype.Component;
+import com.cloud.storage.ScopeType;
import com.cloud.utils.component.ComponentContext;
@Component
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/0d54d01d/plugins/storage/volume/default/src/org/apache/cloudstack/storage/datastore/lifecycle/CloudStackPrimaryDataStoreLifeCycleImpl.java
----------------------------------------------------------------------
diff --git a/plugins/storage/volume/default/src/org/apache/cloudstack/storage/datastore/lifecycle/CloudStackPrimaryDataStoreLifeCycleImpl.java b/plugins/storage/volume/default/src/org/apache/cloudstack/storage/datastore/lifecycle/CloudStackPrimaryDataStoreLifeCycleImpl.java
index b8b0859..66034ba 100644
--- a/plugins/storage/volume/default/src/org/apache/cloudstack/storage/datastore/lifecycle/CloudStackPrimaryDataStoreLifeCycleImpl.java
+++ b/plugins/storage/volume/default/src/org/apache/cloudstack/storage/datastore/lifecycle/CloudStackPrimaryDataStoreLifeCycleImpl.java
@@ -35,7 +35,6 @@ import org.apache.cloudstack.engine.subsystem.api.storage.HostScope;
import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreInfo;
import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreLifeCycle;
import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreParameters;
-import org.apache.cloudstack.engine.subsystem.api.storage.ScopeType;
import org.apache.cloudstack.engine.subsystem.api.storage.ZoneScope;
import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
@@ -62,6 +61,7 @@ import com.cloud.resource.ResourceManager;
import com.cloud.server.ManagementServer;
import com.cloud.storage.OCFS2Manager;
import com.cloud.storage.Storage.StoragePoolType;
+import com.cloud.storage.ScopeType;
import com.cloud.storage.StorageManager;
import com.cloud.storage.StoragePool;
import com.cloud.storage.StoragePoolAutomation;
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/0d54d01d/server/src/com/cloud/api/ApiResponseHelper.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/api/ApiResponseHelper.java b/server/src/com/cloud/api/ApiResponseHelper.java
index d350de2..f22437b 100755
--- a/server/src/com/cloud/api/ApiResponseHelper.java
+++ b/server/src/com/cloud/api/ApiResponseHelper.java
@@ -80,6 +80,7 @@ import org.apache.cloudstack.api.response.NetworkOfferingResponse;
import org.apache.cloudstack.api.response.NetworkResponse;
import org.apache.cloudstack.api.response.NicResponse;
import org.apache.cloudstack.api.response.NicSecondaryIpResponse;
+import org.apache.cloudstack.api.response.ObjectStoreResponse;
import org.apache.cloudstack.api.response.PhysicalNetworkResponse;
import org.apache.cloudstack.api.response.PodResponse;
import org.apache.cloudstack.api.response.PrivateGatewayResponse;
@@ -235,6 +236,7 @@ import com.cloud.service.ServiceOfferingVO;
import com.cloud.storage.DiskOfferingVO;
import com.cloud.storage.GuestOS;
import com.cloud.storage.GuestOSCategoryVO;
+import com.cloud.storage.ObjectStore;
import com.cloud.storage.S3;
import com.cloud.storage.Snapshot;
import com.cloud.storage.SnapshotVO;
@@ -439,7 +441,7 @@ public class ApiResponseHelper implements ResponseGenerator {
vmSnapshotResponse.setCreated(vmSnapshot.getCreated());
vmSnapshotResponse.setDescription(vmSnapshot.getDescription());
vmSnapshotResponse.setDisplayName(vmSnapshot.getDisplayName());
- UserVm vm = ApiDBUtils.findUserVmById(vmSnapshot.getVmId());
+ UserVm vm = ApiDBUtils.findUserVmById(vmSnapshot.getVmId());
if(vm!=null)
vmSnapshotResponse.setVirtualMachineid(vm.getUuid());
if(vmSnapshot.getParent() != null)
@@ -448,7 +450,7 @@ public class ApiResponseHelper implements ResponseGenerator {
vmSnapshotResponse.setType(vmSnapshot.getType().toString());
return vmSnapshotResponse;
}
-
+
@Override
public SnapshotPolicyResponse createSnapshotPolicyResponse(SnapshotPolicy policy) {
SnapshotPolicyResponse policyResponse = new SnapshotPolicyResponse();
@@ -545,7 +547,7 @@ public class ApiResponseHelper implements ResponseGenerator {
vlanResponse.setIp6Gateway(vlan.getIp6Gateway());
vlanResponse.setIp6Cidr(vlan.getIp6Cidr());
-
+
String ip6Range = vlan.getIp6Range();
if (ip6Range != null) {
String[] range = ip6Range.split("-");
@@ -886,6 +888,15 @@ public class ApiResponseHelper implements ResponseGenerator {
}
+
+ @Override
+ public ObjectStoreResponse createObjectStoreResponse(ObjectStore os) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+
+
@Override
public ClusterResponse createClusterResponse(Cluster cluster, Boolean showCapacities) {
ClusterResponse clusterResponse = new ClusterResponse();
@@ -2248,7 +2259,7 @@ public class ApiResponseHelper implements ResponseGenerator {
if (((network.getCidr()) != null) && (network.getNetworkCidr() == null)) {
response.setNetmask(NetUtils.cidr2Netmask(network.getCidr()));
}
-
+
response.setIp6Gateway(network.getIp6Gateway());
response.setIp6Cidr(network.getIp6Cidr());
@@ -2443,7 +2454,7 @@ public class ApiResponseHelper implements ResponseGenerator {
List<String> cidrs = ApiDBUtils.findFirewallSourceCidrs(fwRule.getId());
response.setCidrList(StringUtils.join(cidrs, ","));
-
+
if (fwRule.getTrafficType() == FirewallRule.TrafficType.Ingress) {
IpAddress ip = ApiDBUtils.findIpAddressById(fwRule.getSourceIpAddressId());
response.setPublicIpAddressId(ip.getId());
@@ -3474,7 +3485,7 @@ public class ApiResponseHelper implements ResponseGenerator {
return usageRecResponse;
}
-
+
public String getDateStringInternal(Date inputDate) {
if (inputDate == null) return null;
@@ -3558,7 +3569,7 @@ public class ApiResponseHelper implements ResponseGenerator {
return sb.toString();
}
-
+
@Override
public TrafficMonitorResponse createTrafficMonitorResponse(Host trafficMonitor) {
Map<String, String> tmDetails = ApiDBUtils.findHostDetailsById(trafficMonitor.getId());
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/0d54d01d/server/src/com/cloud/resource/ResourceManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/resource/ResourceManagerImpl.java b/server/src/com/cloud/resource/ResourceManagerImpl.java
index 82bca51..e9b0c82 100755
--- a/server/src/com/cloud/resource/ResourceManagerImpl.java
+++ b/server/src/com/cloud/resource/ResourceManagerImpl.java
@@ -45,6 +45,17 @@ import org.apache.cloudstack.api.command.admin.storage.AddS3Cmd;
import org.apache.cloudstack.api.command.admin.storage.ListS3sCmd;
import org.apache.cloudstack.api.command.admin.swift.AddSwiftCmd;
import org.apache.cloudstack.api.command.admin.swift.ListSwiftsCmd;
+import org.apache.cloudstack.engine.subsystem.api.storage.ClusterScope;
+import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
+import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreLifeCycle;
+import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
+import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreProvider;
+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.PrimaryDataStoreInfo;
+import org.apache.cloudstack.engine.subsystem.api.storage.ZoneScope;
+import org.apache.cloudstack.region.RegionVO;
+import org.apache.cloudstack.region.dao.RegionDao;
import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
import org.apache.log4j.Logger;
@@ -107,8 +118,10 @@ import com.cloud.org.Grouping.AllocationState;
import com.cloud.org.Managed;
import com.cloud.service.ServiceOfferingVO;
import com.cloud.storage.GuestOSCategoryVO;
+import com.cloud.storage.ObjectStore;
import com.cloud.storage.S3;
import com.cloud.storage.S3VO;
+import com.cloud.storage.ScopeType;
import com.cloud.storage.StorageManager;
import com.cloud.storage.StoragePool;
import com.cloud.storage.StoragePoolHostVO;
@@ -167,7 +180,10 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager,
StorageManager _storageMgr;
@Inject
protected SecondaryStorageVmManager _secondaryStorageMgr;
-
+ @Inject
+ DataStoreProviderManager _dataStoreProviderMgr;
+ @Inject
+ protected RegionDao _regionDao;
@Inject
protected DataCenterDao _dcDao;
@Inject
@@ -206,6 +222,9 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager,
protected HighAvailabilityManager _haMgr;
@Inject
protected StorageService _storageSvr;
+ @Inject
+ DataStoreManager _dataStoreMgr;
+
protected List<? extends Discoverer> _discoverers;
public List<? extends Discoverer> getDiscoverers() {
@@ -639,6 +658,10 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager,
return discoverHostsFull(dcId, podId, clusterId, clusterName, url, username, password, cmd.getHypervisor(), hostTags, cmd.getFullUrlParams(), true);
}
+
+
+
+
@Override
public List<? extends Host> discoverHosts(AddSecondaryStorageCmd cmd)
throws IllegalArgumentException, DiscoveryException,
@@ -669,6 +692,96 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager,
return this._s3Mgr.listS3s(cmd);
}
+ @Override
+ public ObjectStore discoverObjectStore(AddSecondaryStorageCmd cmd) throws IllegalArgumentException, DiscoveryException,
+ InvalidParameterValueException {
+ String providerName = cmd.getImageProviderName();
+ DataStoreProvider storeProvider = _dataStoreProviderMgr.getDataStoreProvider(providerName);
+
+ if (storeProvider == null) {
+ storeProvider = _dataStoreProviderMgr.getDefaultImageDataStoreProvider();
+ if (storeProvider == null) {
+ throw new InvalidParameterValueException(
+ "can't find image store provider: " + providerName);
+ }
+ }
+
+ Long dcId = cmd.getZoneId();
+ Long regionId = cmd.getRegionId();
+ String url = cmd.getUrl();
+ Map details = cmd.getDetails();
+
+ ScopeType scopeType = ScopeType.ZONE;
+ String scope = cmd.getScope();
+ if (scope != null) {
+ try {
+ scopeType = Enum.valueOf(ScopeType.class, scope.toUpperCase());
+ } catch (Exception e) {
+ throw new InvalidParameterValueException("invalid scope"
+ + scope);
+ }
+ }
+ if (scopeType == ScopeType.ZONE && dcId == null) {
+ throw new InvalidParameterValueException(
+ "zone id can't be null, if scope is zone");
+ } else if (scopeType == ScopeType.REGION && regionId == null) {
+ throw new InvalidParameterValueException(
+ "region id can't be null, if scope is region");
+ }
+
+ if ( dcId != null ){
+ // Check if the zone exists in the system
+ DataCenterVO zone = _dcDao.findById(dcId);
+ if (zone == null) {
+ throw new InvalidParameterValueException("Can't find zone by id "
+ + dcId);
+ }
+
+ Account account = UserContext.current().getCaller();
+ if (Grouping.AllocationState.Disabled == zone.getAllocationState()
+ && !_accountMgr.isRootAdmin(account.getType())) {
+ PermissionDeniedException ex = new PermissionDeniedException(
+ "Cannot perform this operation, Zone with specified id is currently disabled");
+ ex.addProxyObject(zone, dcId, "dcId");
+ throw ex;
+ }
+ }
+
+ if ( regionId != null ){
+ // Check if the region exists in the system
+ RegionVO region = _regionDao.findById(regionId.intValue());
+ if (region == null) {
+ throw new InvalidParameterValueException("Can't find region by id "
+ + regionId);
+ }
+ }
+
+ Map<String, Object> params = new HashMap<String, Object>();
+ params.put("zoneId", dcId);
+ params.put("regionId", regionId);
+ params.put("url", cmd.getUrl());
+ params.put("name", cmd.getUrl());
+ params.put("details", details);
+ params.put("providerName", storeProvider.getName());
+
+ DataStoreLifeCycle lifeCycle = storeProvider.getDataStoreLifeCycle();
+ DataStore store = null;
+ try {
+ store = lifeCycle.initialize(params);
+
+ if (scopeType == ScopeType.ZONE) {
+ ZoneScope zoneScope = new ZoneScope(dcId);
+ lifeCycle.attachZone(store, zoneScope);
+ }
+ } catch (Exception e) {
+ s_logger.debug("Failed to add data store", e);
+ throw new CloudRuntimeException("Failed to add data store", e);
+ }
+
+ return (ObjectStore)_dataStoreMgr.getDataStore(store.getId(),
+ DataStoreRole.Image);
+ }
+
private List<HostVO> discoverHostsFull(Long dcId, Long podId, Long clusterId, String clusterName, String url, String username, String password, String hypervisorType, List<String> hostTags,
Map<String, String> params, boolean deferAgentCreation) throws IllegalArgumentException, DiscoveryException, InvalidParameterValueException {
URI uri = null;
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/0d54d01d/server/src/com/cloud/storage/StorageManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/storage/StorageManagerImpl.java b/server/src/com/cloud/storage/StorageManagerImpl.java
index a33d524..76c2cea 100755
--- a/server/src/com/cloud/storage/StorageManagerImpl.java
+++ b/server/src/com/cloud/storage/StorageManagerImpl.java
@@ -56,7 +56,6 @@ import org.apache.cloudstack.engine.subsystem.api.storage.HostScope;
import org.apache.cloudstack.engine.subsystem.api.storage.HypervisorHostListener;
import org.apache.cloudstack.engine.subsystem.api.storage.ImageDataFactory;
import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreInfo;
-import org.apache.cloudstack.engine.subsystem.api.storage.ScopeType;
import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotDataFactory;
import org.apache.cloudstack.engine.subsystem.api.storage.StoragePoolAllocator;
import org.apache.cloudstack.engine.subsystem.api.storage.VolumeDataFactory;
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/0d54d01d/server/src/com/cloud/storage/VolumeManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/storage/VolumeManagerImpl.java b/server/src/com/cloud/storage/VolumeManagerImpl.java
index ff0235f..c22b72d 100644
--- a/server/src/com/cloud/storage/VolumeManagerImpl.java
+++ b/server/src/com/cloud/storage/VolumeManagerImpl.java
@@ -49,7 +49,6 @@ import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreRole;
import org.apache.cloudstack.engine.subsystem.api.storage.ImageDataFactory;
import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreInfo;
import org.apache.cloudstack.engine.subsystem.api.storage.Scope;
-import org.apache.cloudstack.engine.subsystem.api.storage.ScopeType;
import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotDataFactory;
import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotInfo;
import org.apache.cloudstack.engine.subsystem.api.storage.StoragePoolAllocator;
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/0d54d01d/server/src/com/cloud/storage/listener/StoragePoolMonitor.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/storage/listener/StoragePoolMonitor.java b/server/src/com/cloud/storage/listener/StoragePoolMonitor.java
index f957ca3..e035fd7 100755
--- a/server/src/com/cloud/storage/listener/StoragePoolMonitor.java
+++ b/server/src/com/cloud/storage/listener/StoragePoolMonitor.java
@@ -20,7 +20,6 @@ import java.util.List;
import javax.inject.Inject;
-import org.apache.cloudstack.engine.subsystem.api.storage.ScopeType;
import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
import org.apache.log4j.Logger;
@@ -38,6 +37,7 @@ import com.cloud.host.Status;
import com.cloud.hypervisor.Hypervisor.HypervisorType;
import com.cloud.storage.OCFS2Manager;
import com.cloud.storage.Storage.StoragePoolType;
+import com.cloud.storage.ScopeType;
import com.cloud.storage.StorageManagerImpl;
import com.cloud.storage.StoragePoolStatus;
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/0d54d01d/server/test/com/cloud/resource/MockResourceManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/test/com/cloud/resource/MockResourceManagerImpl.java b/server/test/com/cloud/resource/MockResourceManagerImpl.java
index 5202c31..df62d2e 100644
--- a/server/test/com/cloud/resource/MockResourceManagerImpl.java
+++ b/server/test/com/cloud/resource/MockResourceManagerImpl.java
@@ -49,6 +49,7 @@ import com.cloud.hypervisor.Hypervisor.HypervisorType;
import com.cloud.org.Cluster;
import com.cloud.resource.ResourceState.Event;
import com.cloud.service.ServiceOfferingVO;
+import com.cloud.storage.ObjectStore;
import com.cloud.storage.S3;
import com.cloud.storage.Swift;
import com.cloud.template.VirtualMachineTemplate;
@@ -608,4 +609,12 @@ public class MockResourceManagerImpl extends ManagerBase implements ResourceMana
return null;
}
+ @Override
+ public ObjectStore discoverObjectStore(AddSecondaryStorageCmd cmd) throws IllegalArgumentException, DiscoveryException,
+ InvalidParameterValueException {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/0d54d01d/setup/db/db/schema-410to420.sql
----------------------------------------------------------------------
diff --git a/setup/db/db/schema-410to420.sql b/setup/db/db/schema-410to420.sql
index cbff750..491a708 100644
--- a/setup/db/db/schema-410to420.sql
+++ b/setup/db/db/schema-410to420.sql
@@ -73,7 +73,9 @@ CREATE TABLE `cloud`.`image_data_store` (
`name` varchar(255) NOT NULL COMMENT 'name of data store',
`image_provider_name` varchar(255) NOT NULL COMMENT 'id of image_data_store_provider',
`protocol` varchar(255) NOT NULL COMMENT 'protocol of data store',
+ `url` varchar(255) COMMENT 'url for image data store',
`data_center_id` bigint unsigned COMMENT 'datacenter id of data store',
+ `region_id` bigint unsigned COMMENT 'region id of data store',
`scope` varchar(255) COMMENT 'scope of data store',
`uuid` varchar(255) COMMENT 'uuid of data store',
PRIMARY KEY(`id`)