Repository: cloudstack
Updated Branches:
  refs/heads/master c09a9f322 -> c3c9b8f38


CLOUDSTACK-9574: Redesign storage tags and remove details from listImageStores 
response and UI


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/13ccbda1
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/13ccbda1
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/13ccbda1

Branch: refs/heads/master
Commit: 13ccbda10e3a668184fde45246f246a4f942bc47
Parents: 122c27b
Author: nvazquez <nicolas.m.vazq...@gmail.com>
Authored: Mon Oct 31 17:07:42 2016 -0300
Committer: nvazquez <nicovazque...@gmail.com>
Committed: Tue Feb 7 17:50:09 2017 -0300

----------------------------------------------------------------------
 .../api/response/ImageStoreResponse.java        | 20 -----
 .../spring-engine-schema-core-daos-context.xml  |  1 +
 .../src/com/cloud/storage/StoragePoolTagVO.java | 64 ++++++++++++++++
 .../cloud/storage/dao/StoragePoolTagsDao.java   | 30 ++++++++
 .../storage/dao/StoragePoolTagsDaoImpl.java     | 80 +++++++++++++++++++
 .../api/query/dao/ImageStoreJoinDaoImpl.java    | 22 ------
 .../cloud/api/query/vo/ImageStoreJoinVO.java    | 14 ----
 .../com/cloud/storage/StorageManagerImpl.java   | 49 ++----------
 setup/db/db/schema-4920to41000.sql              | 81 ++++++++++++++++++++
 ui/scripts/system.js                            | 15 ----
 10 files changed, 264 insertions(+), 112 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/13ccbda1/api/src/org/apache/cloudstack/api/response/ImageStoreResponse.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/response/ImageStoreResponse.java 
b/api/src/org/apache/cloudstack/api/response/ImageStoreResponse.java
index bb44a01..aaef652 100644
--- a/api/src/org/apache/cloudstack/api/response/ImageStoreResponse.java
+++ b/api/src/org/apache/cloudstack/api/response/ImageStoreResponse.java
@@ -16,9 +16,6 @@
 // under the License.
 package org.apache.cloudstack.api.response;
 
-import java.util.LinkedHashSet;
-import java.util.Set;
-
 import com.google.gson.annotations.SerializedName;
 
 import org.apache.cloudstack.api.ApiConstants;
@@ -63,12 +60,7 @@ public class ImageStoreResponse extends BaseResponse {
     @Param(description = "the scope of the image store")
     private ScopeType scope;
 
-    @SerializedName("details")
-    @Param(description = "the details of the image store")
-    private Set<ImageStoreDetailResponse> details;
-
     public ImageStoreResponse() {
-        this.details = new LinkedHashSet<ImageStoreDetailResponse>();
     }
 
     @Override
@@ -140,16 +132,4 @@ public class ImageStoreResponse extends BaseResponse {
         this.protocol = protocol;
     }
 
-    public Set<ImageStoreDetailResponse> getDetails() {
-        return details;
-    }
-
-    public void setDetails(Set<ImageStoreDetailResponse> details) {
-        this.details = details;
-    }
-
-    public void addDetail(ImageStoreDetailResponse detail) {
-        this.details.add(detail);
-    }
-
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/13ccbda1/engine/schema/resources/META-INF/cloudstack/core/spring-engine-schema-core-daos-context.xml
----------------------------------------------------------------------
diff --git 
a/engine/schema/resources/META-INF/cloudstack/core/spring-engine-schema-core-daos-context.xml
 
b/engine/schema/resources/META-INF/cloudstack/core/spring-engine-schema-core-daos-context.xml
index 1c5a446..a572991 100644
--- 
a/engine/schema/resources/META-INF/cloudstack/core/spring-engine-schema-core-daos-context.xml
+++ 
b/engine/schema/resources/META-INF/cloudstack/core/spring-engine-schema-core-daos-context.xml
@@ -266,6 +266,7 @@
   <bean id="storageNetworkIpRangeDaoImpl" 
class="com.cloud.dc.dao.StorageNetworkIpRangeDaoImpl" />
   <bean id="storagePoolDetailsDaoImpl" 
class="com.cloud.storage.dao.StoragePoolDetailsDaoImpl" />
   <bean id="storagePoolJoinDaoImpl" 
class="com.cloud.api.query.dao.StoragePoolJoinDaoImpl" />
+  <bean id="storagePoolTagsDaoImpl" 
class="com.cloud.storage.dao.StoragePoolTagsDaoImpl" />
   <bean id="storageTagDaoImpl" 
class="com.cloud.api.query.dao.StorageTagDaoImpl" />
   <bean id="hostTagDaoImpl" class="com.cloud.api.query.dao.HostTagDaoImpl" />
   <bean id="storagePoolWorkDaoImpl" 
class="com.cloud.storage.dao.StoragePoolWorkDaoImpl" />

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/13ccbda1/engine/schema/src/com/cloud/storage/StoragePoolTagVO.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/storage/StoragePoolTagVO.java 
b/engine/schema/src/com/cloud/storage/StoragePoolTagVO.java
new file mode 100755
index 0000000..18c0dc3
--- /dev/null
+++ b/engine/schema/src/com/cloud/storage/StoragePoolTagVO.java
@@ -0,0 +1,64 @@
+// 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 javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+import org.apache.cloudstack.api.InternalIdentity;
+
+@Entity
+@Table(name = "storage_pool_tags")
+public class StoragePoolTagVO implements InternalIdentity {
+
+    protected StoragePoolTagVO() {
+    }
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    @Column(name = "id")
+    private long id;
+
+    @Column(name = "pool_id")
+    private long poolId;
+
+    @Column(name = "tag")
+    private String tag;
+
+    public StoragePoolTagVO(long poolId, String tag) {
+        this.poolId = poolId;
+        this.tag = tag;
+    }
+
+    @Override
+    public long getId() {
+        return this.id;
+    }
+
+    public long getPoolId() {
+        return poolId;
+    }
+
+    public String getTag() {
+        return tag;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/13ccbda1/engine/schema/src/com/cloud/storage/dao/StoragePoolTagsDao.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/storage/dao/StoragePoolTagsDao.java 
b/engine/schema/src/com/cloud/storage/dao/StoragePoolTagsDao.java
new file mode 100755
index 0000000..3e2b424
--- /dev/null
+++ b/engine/schema/src/com/cloud/storage/dao/StoragePoolTagsDao.java
@@ -0,0 +1,30 @@
+// 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.List;
+
+import com.cloud.storage.StoragePoolTagVO;
+import com.cloud.utils.db.GenericDao;
+
+public interface StoragePoolTagsDao extends GenericDao<StoragePoolTagVO, Long> 
{
+
+    void persist(long poolId, List<String> storagePoolTags);
+    List<String> getStoragePoolTags(long poolId);
+    void deleteTags(long poolId);
+
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/13ccbda1/engine/schema/src/com/cloud/storage/dao/StoragePoolTagsDaoImpl.java
----------------------------------------------------------------------
diff --git 
a/engine/schema/src/com/cloud/storage/dao/StoragePoolTagsDaoImpl.java 
b/engine/schema/src/com/cloud/storage/dao/StoragePoolTagsDaoImpl.java
new file mode 100755
index 0000000..830503b
--- /dev/null
+++ b/engine/schema/src/com/cloud/storage/dao/StoragePoolTagsDaoImpl.java
@@ -0,0 +1,80 @@
+// 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.ArrayList;
+import java.util.List;
+import com.cloud.storage.StoragePoolTagVO;
+import com.cloud.utils.db.GenericDaoBase;
+import com.cloud.utils.db.SearchBuilder;
+import com.cloud.utils.db.SearchCriteria;
+import com.cloud.utils.db.TransactionLegacy;
+
+public class StoragePoolTagsDaoImpl extends GenericDaoBase<StoragePoolTagVO, 
Long> implements StoragePoolTagsDao {
+
+    protected final SearchBuilder<StoragePoolTagVO> StoragePoolSearch;
+
+    public StoragePoolTagsDaoImpl() {
+        StoragePoolSearch = createSearchBuilder();
+        StoragePoolSearch.and("poolId", 
StoragePoolSearch.entity().getPoolId(), SearchCriteria.Op.EQ);
+        StoragePoolSearch.done();
+    }
+
+    @Override
+    public void persist(long poolId, List<String> storagePoolTags) {
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
+
+        txn.start();
+        SearchCriteria<StoragePoolTagVO> sc = StoragePoolSearch.create();
+        sc.setParameters("poolId", poolId);
+        expunge(sc);
+
+        for (String tag : storagePoolTags) {
+            tag = tag.trim();
+            if (tag.length() > 0) {
+                StoragePoolTagVO vo = new StoragePoolTagVO(poolId, tag);
+                persist(vo);
+            }
+        }
+        txn.commit();
+    }
+
+    @Override
+    public List<String> getStoragePoolTags(long poolId) {
+        SearchCriteria<StoragePoolTagVO> sc = StoragePoolSearch.create();
+        sc.setParameters("poolId", poolId);
+
+        List<StoragePoolTagVO> results = search(sc, null);
+        List<String> storagePoolTags = new ArrayList<String>(results.size());
+        for (StoragePoolTagVO result : results) {
+            storagePoolTags.add(result.getTag());
+        }
+
+        return storagePoolTags;
+    }
+
+    @Override
+    public void deleteTags(long poolId) {
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
+        txn.start();
+        SearchCriteria<StoragePoolTagVO> sc = StoragePoolSearch.create();
+        sc.setParameters("poolId", poolId);
+        expunge(sc);
+        txn.commit();
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/13ccbda1/server/src/com/cloud/api/query/dao/ImageStoreJoinDaoImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/api/query/dao/ImageStoreJoinDaoImpl.java 
b/server/src/com/cloud/api/query/dao/ImageStoreJoinDaoImpl.java
index 4add719..7734489 100644
--- a/server/src/com/cloud/api/query/dao/ImageStoreJoinDaoImpl.java
+++ b/server/src/com/cloud/api/query/dao/ImageStoreJoinDaoImpl.java
@@ -24,8 +24,6 @@ import javax.inject.Inject;
 import org.apache.log4j.Logger;
 import org.springframework.stereotype.Component;
 
-import org.apache.cloudstack.api.ApiConstants;
-import org.apache.cloudstack.api.response.ImageStoreDetailResponse;
 import org.apache.cloudstack.api.response.ImageStoreResponse;
 import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
 
@@ -77,32 +75,12 @@ public class ImageStoreJoinDaoImpl extends 
GenericDaoBase<ImageStoreJoinVO, Long
         osResponse.setZoneId(ids.getZoneUuid());
         osResponse.setZoneName(ids.getZoneName());
 
-        String detailName = ids.getDetailName();
-        if ( detailName != null && detailName.length() > 0 && 
!detailName.equals(ApiConstants.PASSWORD)) {
-            String detailValue = ids.getDetailValue();
-            if (detailName.equals(ApiConstants.KEY) || 
detailName.equals(ApiConstants.S3_SECRET_KEY)) {
-                // ALWAYS return an empty value for the S3 secret key since 
that key is managed by Amazon and not CloudStack
-                detailValue = "";
-            }
-            ImageStoreDetailResponse osdResponse = new 
ImageStoreDetailResponse(detailName, detailValue);
-            osResponse.addDetail(osdResponse);
-        }
         osResponse.setObjectName("imagestore");
         return osResponse;
     }
 
     @Override
     public ImageStoreResponse setImageStoreResponse(ImageStoreResponse 
response, ImageStoreJoinVO ids) {
-        String detailName = ids.getDetailName();
-        if ( detailName != null && detailName.length() > 0 && 
!detailName.equals(ApiConstants.PASSWORD)) {
-            String detailValue = ids.getDetailValue();
-            if (detailName.equals(ApiConstants.KEY) || 
detailName.equals(ApiConstants.S3_SECRET_KEY)) {
-                // ALWAYS return an empty value for the S3 secret key since 
that key is managed by Amazon and not CloudStack
-                detailValue = "";
-            }
-            ImageStoreDetailResponse osdResponse = new 
ImageStoreDetailResponse(detailName, detailValue);
-            response.addDetail(osdResponse);
-        }
         return response;
     }
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/13ccbda1/server/src/com/cloud/api/query/vo/ImageStoreJoinVO.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/api/query/vo/ImageStoreJoinVO.java 
b/server/src/com/cloud/api/query/vo/ImageStoreJoinVO.java
index 6d9f038..244f89e 100644
--- a/server/src/com/cloud/api/query/vo/ImageStoreJoinVO.java
+++ b/server/src/com/cloud/api/query/vo/ImageStoreJoinVO.java
@@ -76,12 +76,6 @@ public class ImageStoreJoinVO extends BaseViewVO implements 
InternalIdentity, Id
     @Column(name = "data_center_name")
     private String zoneName;
 
-    @Column(name = "detail_name")
-    private String detailName;
-
-    @Column(name = "detail_value")
-    private String detailValue;
-
     @Column(name = GenericDao.REMOVED_COLUMN)
     private Date removed;
 
@@ -127,14 +121,6 @@ public class ImageStoreJoinVO extends BaseViewVO 
implements InternalIdentity, Id
         return scope;
     }
 
-    public String getDetailName() {
-        return detailName;
-    }
-
-    public String getDetailValue() {
-        return detailValue;
-    }
-
     public DataStoreRole getRole() {
         return role;
     }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/13ccbda1/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 9553ff3..90d17e8 100644
--- a/server/src/com/cloud/storage/StorageManagerImpl.java
+++ b/server/src/com/cloud/storage/StorageManagerImpl.java
@@ -31,7 +31,6 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Random;
-import java.util.Set;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Executors;
 import java.util.concurrent.ScheduledExecutorService;
@@ -157,6 +156,7 @@ import com.cloud.storage.Volume.Type;
 import com.cloud.storage.dao.DiskOfferingDao;
 import com.cloud.storage.dao.SnapshotDao;
 import com.cloud.storage.dao.StoragePoolHostDao;
+import com.cloud.storage.dao.StoragePoolTagsDao;
 import com.cloud.storage.dao.StoragePoolWorkDao;
 import com.cloud.storage.dao.VMTemplateDao;
 import com.cloud.storage.dao.VMTemplatePoolDao;
@@ -290,6 +290,8 @@ public class StorageManagerImpl extends ManagerBase 
implements StorageManager, C
     ResourceLimitService _resourceLimitMgr;
     @Inject
     EntityManager _entityMgr;
+    @Inject
+    StoragePoolTagsDao _storagePoolTagsDao;
 
     protected List<StoragePoolDiscoverer> _discoverers;
 
@@ -776,51 +778,18 @@ public class StorageManagerImpl extends ManagerBase 
implements StorageManager, C
     public PrimaryDataStoreInfo updateStoragePool(UpdateStoragePoolCmd cmd) 
throws IllegalArgumentException {
         // Input validation
         Long id = cmd.getId();
-        List<String> tags = cmd.getTags();
 
         StoragePoolVO pool = _storagePoolDao.findById(id);
         if (pool == null) {
             throw new IllegalArgumentException("Unable to find storage pool 
with ID: " + id);
         }
 
-        Map<String, String> updatedDetails = new HashMap<String, String>();
-
-        if (tags != null) {
-            Map<String, String> existingDetails = 
_storagePoolDetailsDao.listDetailsKeyPairs(id);
-            Set<String> existingKeys = existingDetails.keySet();
-
-            Map<String, String> existingDetailsToKeep = new HashMap<String, 
String>();
-
-            for (String existingKey : existingKeys) {
-                String existingValue = existingDetails.get(existingKey);
-
-                if (!Boolean.TRUE.toString().equalsIgnoreCase(existingValue)) {
-                    existingDetailsToKeep.put(existingKey, existingValue);
-                }
-            }
-
-            Map<String, String> details = new HashMap<String, String>();
-            for (String tag : tags) {
-                tag = tag.trim();
-                if (tag.length() > 0 && !details.containsKey(tag)) {
-                    details.put(tag, "true");
-                }
-            }
-
-            Set<String> existingKeysToKeep = existingDetailsToKeep.keySet();
-
-            for (String existingKeyToKeep : existingKeysToKeep) {
-                String existingValueToKeep = 
existingDetailsToKeep.get(existingKeyToKeep);
-
-                if (details.containsKey(existingKeyToKeep)) {
-                    throw new CloudRuntimeException("Storage tag '" + 
existingKeyToKeep +
-                            "' conflicts with a stored property of this 
primary storage. No changes were made.");
-                }
-
-                details.put(existingKeyToKeep, existingValueToKeep);
+        final List<String> storagePoolTags = cmd.getTags();
+        if (storagePoolTags != null) {
+            if (s_logger.isDebugEnabled()) {
+                s_logger.debug("Updating Storage Pool Tags to :" + 
storagePoolTags);
             }
-
-            updatedDetails.putAll(details);
+            _storagePoolTagsDao.persist(pool.getId(), storagePoolTags);
         }
 
         Long updatedCapacityBytes = null;
@@ -863,8 +832,6 @@ public class StorageManagerImpl extends ManagerBase 
implements StorageManager, C
             } else {
                 disablePrimaryStoragePool(pool);
             }
-        } else if (updatedDetails.size() >= 0) {
-            _storagePoolDao.updateDetails(id, updatedDetails);
         }
 
         if (updatedCapacityBytes != null) {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/13ccbda1/setup/db/db/schema-4920to41000.sql
----------------------------------------------------------------------
diff --git a/setup/db/db/schema-4920to41000.sql 
b/setup/db/db/schema-4920to41000.sql
index b8b54e3..996e562 100644
--- a/setup/db/db/schema-4920to41000.sql
+++ b/setup/db/db/schema-4920to41000.sql
@@ -62,3 +62,84 @@ INSERT INTO `cloud`.`role_permissions` (`uuid`, `role_id`, 
`rule`, `permission`,
 INSERT INTO `cloud`.`role_permissions` (`uuid`, `role_id`, `rule`, 
`permission`, `sort_order`) values (UUID(), 3, 'createSnapshotFromVMSnapshot', 
'ALLOW', 302) ON DUPLICATE KEY UPDATE rule=rule;
 INSERT INTO `cloud`.`role_permissions` (`uuid`, `role_id`, `rule`, 
`permission`, `sort_order`) values (UUID(), 4, 'createSnapshotFromVMSnapshot', 
'ALLOW', 260) ON DUPLICATE KEY UPDATE rule=rule;
 
+-- Create table storage_pool_tags
+CREATE TABLE `cloud`.`storage_pool_tags` (
+  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
+  `pool_id` bigint(20) unsigned NOT NULL COMMENT "pool id",
+  `tag` varchar(255) NOT NULL,
+  PRIMARY KEY (`id`),
+  KEY `fk_storage_pool_tags__pool_id` (`pool_id`),
+  CONSTRAINT `fk_storage_pool_tags__pool_id` FOREIGN KEY (`pool_id`) 
REFERENCES `storage_pool` (`id`) ON DELETE CASCADE
+) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
+
+-- Insert storage tags from storage_pool_details
+INSERT INTO `cloud`.`storage_pool_tags` (pool_id, tag) SELECT pool_id, 
+name FROM `cloud`.`storage_pool_details` WHERE value = 'true';
+
+-- Alter view storage_pool_view
+CREATE OR REPLACE
+VIEW `storage_pool_view` AS
+    SELECT
+        `storage_pool`.`id` AS `id`,
+        `storage_pool`.`uuid` AS `uuid`,
+        `storage_pool`.`name` AS `name`,
+        `storage_pool`.`status` AS `status`,
+        `storage_pool`.`path` AS `path`,
+        `storage_pool`.`pool_type` AS `pool_type`,
+        `storage_pool`.`host_address` AS `host_address`,
+        `storage_pool`.`created` AS `created`,
+        `storage_pool`.`removed` AS `removed`,
+        `storage_pool`.`capacity_bytes` AS `capacity_bytes`,
+        `storage_pool`.`capacity_iops` AS `capacity_iops`,
+        `storage_pool`.`scope` AS `scope`,
+        `storage_pool`.`hypervisor` AS `hypervisor`,
+        `storage_pool`.`storage_provider_name` AS `storage_provider_name`,
+        `cluster`.`id` AS `cluster_id`,
+        `cluster`.`uuid` AS `cluster_uuid`,
+        `cluster`.`name` AS `cluster_name`,
+        `cluster`.`cluster_type` AS `cluster_type`,
+        `data_center`.`id` AS `data_center_id`,
+        `data_center`.`uuid` AS `data_center_uuid`,
+        `data_center`.`name` AS `data_center_name`,
+        `data_center`.`networktype` AS `data_center_type`,
+        `host_pod_ref`.`id` AS `pod_id`,
+        `host_pod_ref`.`uuid` AS `pod_uuid`,
+        `host_pod_ref`.`name` AS `pod_name`,
+        `storage_pool_tags`.`tag` AS `tag`,
+        `op_host_capacity`.`used_capacity` AS `disk_used_capacity`,
+        `op_host_capacity`.`reserved_capacity` AS `disk_reserved_capacity`,
+        `async_job`.`id` AS `job_id`,
+        `async_job`.`uuid` AS `job_uuid`,
+        `async_job`.`job_status` AS `job_status`,
+        `async_job`.`account_id` AS `job_account_id`
+    FROM
+        ((((((`storage_pool`
+        LEFT JOIN `cluster` ON ((`storage_pool`.`cluster_id` = 
`cluster`.`id`)))
+        LEFT JOIN `data_center` ON ((`storage_pool`.`data_center_id` = 
`data_center`.`id`)))
+        LEFT JOIN `host_pod_ref` ON ((`storage_pool`.`pod_id` = 
`host_pod_ref`.`id`)))
+        LEFT JOIN `storage_pool_tags` ON (((`storage_pool_tags`.`pool_id` = 
`storage_pool`.`id`))))
+        LEFT JOIN `op_host_capacity` ON (((`storage_pool`.`id` = 
`op_host_capacity`.`host_id`)
+            AND (`op_host_capacity`.`capacity_type` IN (3 , 9)))))
+        LEFT JOIN `async_job` ON (((`async_job`.`instance_id` = 
`storage_pool`.`id`)
+            AND (`async_job`.`instance_type` = 'StoragePool')
+            AND (`async_job`.`job_status` = 0))));
+
+-- Alter view image_store_view
+CREATE OR REPLACE
+VIEW `image_store_view` AS
+    SELECT
+        `image_store`.`id` AS `id`,
+        `image_store`.`uuid` AS `uuid`,
+        `image_store`.`name` AS `name`,
+        `image_store`.`image_provider_name` AS `image_provider_name`,
+        `image_store`.`protocol` AS `protocol`,
+        `image_store`.`url` AS `url`,
+        `image_store`.`scope` AS `scope`,
+        `image_store`.`role` AS `role`,
+        `image_store`.`removed` AS `removed`,
+        `data_center`.`id` AS `data_center_id`,
+        `data_center`.`uuid` AS `data_center_uuid`,
+        `data_center`.`name` AS `data_center_name`
+    FROM
+        (`image_store`
+        LEFT JOIN `data_center` ON ((`image_store`.`data_center_id` = 
`data_center`.`id`)));

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/13ccbda1/ui/scripts/system.js
----------------------------------------------------------------------
diff --git a/ui/scripts/system.js b/ui/scripts/system.js
index 369dfbf..0256e83 100644
--- a/ui/scripts/system.js
+++ b/ui/scripts/system.js
@@ -19973,21 +19973,6 @@
                                             zonename: {
                                                 label: 'label.zone'
                                             },
-                                            details: {
-                                                label: 'label.details',
-                                                converter: function (array1) {
-                                                    var string1 = '';
-                                                    if (array1 != null) {
-                                                        for (var i = 0; i < 
array1.length; i++) {
-                                                            if (i > 0)
-                                                            string1 += ', ';
-
-                                                            string1 += 
array1[i].name + ': ' + array1[i].value;
-                                                        }
-                                                    }
-                                                    return string1;
-                                                }
-                                            },
                                             id: {
                                                 label: 'label.id'
                                             }

Reply via email to