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/10/29 04:52:51 UTC

[01/50] [abbrv] git commit: updated refs/heads/object_store_migration to 5ec2a44

Updated Branches:
  refs/heads/object_store_migration afcf09eda -> 5ec2a44ce


CLOUDSTACK-4947 VM creation fails if the global config apply.allocation.algorithm.to.pods is set to true."


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

Branch: refs/heads/object_store_migration
Commit: e4a1ff818fa78b727cac41442535d832f3ebc3f5
Parents: da7d2fe
Author: Bharat Kumar <bh...@citrix.com>
Authored: Fri Oct 25 12:45:59 2013 +0530
Committer: Kishan Kavala <ki...@cloud.com>
Committed: Fri Oct 25 15:07:00 2013 +0530

----------------------------------------------------------------------
 engine/schema/src/com/cloud/capacity/dao/CapacityDaoImpl.java | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e4a1ff81/engine/schema/src/com/cloud/capacity/dao/CapacityDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/capacity/dao/CapacityDaoImpl.java b/engine/schema/src/com/cloud/capacity/dao/CapacityDaoImpl.java
index c642504..64a1660 100755
--- a/engine/schema/src/com/cloud/capacity/dao/CapacityDaoImpl.java
+++ b/engine/schema/src/com/cloud/capacity/dao/CapacityDaoImpl.java
@@ -80,7 +80,7 @@ public class CapacityDaoImpl extends GenericDaoBase<CapacityVO, Long> implements
     private static final String ORDER_CLUSTERS_BY_AGGREGATE_OVERCOMMIT_CAPACITY_PART2= " AND capacity_type = ?  AND cluster_details.name =? GROUP BY capacity.cluster_id ORDER BY SUM(used_capacity+reserved_capacity)/SUM(total_capacity * cluster_details.value) ASC";
 
     private static final String LIST_PODSINZONE_BY_HOST_CAPACITY_TYPE = "SELECT DISTINCT capacity.pod_id FROM `cloud`.`op_host_capacity` capacity INNER JOIN `cloud`.`host_pod_ref` pod " +
-                                                          " ON (pod.id = capacity.pod_id AND pod.removed is NULL) INNER JOIN `cloud`.`cluster_details` cluster ON (capacity.cluster_id = cluster.cluster_id ) WHERE capacity.data_center_id = ? AND capacity_type = ? AND cluster_details.name= ? ((total_capacity * cluster.value ) - used_capacity + reserved_capacity) >= ? ";
+                                                          " ON (pod.id = capacity.pod_id AND pod.removed is NULL) INNER JOIN `cloud`.`cluster_details` cluster_details ON (capacity.cluster_id = cluster_details.cluster_id ) WHERE capacity.data_center_id = ? AND capacity_type = ? AND cluster_details.name= ? AND ((total_capacity * cluster_details.value ) - used_capacity + reserved_capacity) >= ? ";
 
     private static final String ORDER_PODS_BY_AGGREGATE_CAPACITY = " SELECT capacity.pod_id, SUM(used_capacity+reserved_capacity)/SUM(total_capacity) FROM `cloud`.`op_host_capacity` capacity WHERE data_center_id= ? AND capacity_type = ? GROUP BY capacity.pod_id ORDER BY SUM(used_capacity+reserved_capacity)/SUM(total_capacity) ASC ";
 


[03/50] [abbrv] Made all resource details DAOs (nic_details, user_vm_details, template_details, volume_details, service_offering_details) extend from the same base class as although details are being stored in diff tables, those tables have the same stru

Posted by mc...@apache.org.
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/0fb4d9d5/server/src/com/cloud/template/TemplateManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/template/TemplateManagerImpl.java b/server/src/com/cloud/template/TemplateManagerImpl.java
index fb1bb27..7a1b5aa 100755
--- a/server/src/com/cloud/template/TemplateManagerImpl.java
+++ b/server/src/com/cloud/template/TemplateManagerImpl.java
@@ -30,7 +30,6 @@ import javax.ejb.Local;
 import javax.inject.Inject;
 import javax.naming.ConfigurationException;
 
-import org.apache.log4j.Logger;
 import org.apache.cloudstack.acl.SecurityChecker.AccessType;
 import org.apache.cloudstack.api.BaseListTemplateOrIsoPermissionsCmd;
 import org.apache.cloudstack.api.BaseUpdateTemplateOrIsoCmd;
@@ -82,6 +81,7 @@ import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
 import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreDao;
 import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreVO;
 import org.apache.cloudstack.storage.image.datastore.ImageStoreEntity;
+import org.apache.log4j.Logger;
 
 import com.cloud.agent.AgentManager;
 import com.cloud.agent.api.Answer;
@@ -135,6 +135,7 @@ import com.cloud.storage.StoragePoolHostVO;
 import com.cloud.storage.StoragePoolStatus;
 import com.cloud.storage.TemplateProfile;
 import com.cloud.storage.Upload;
+import com.cloud.storage.VMTemplateDetailVO;
 import com.cloud.storage.VMTemplateHostVO;
 import com.cloud.storage.VMTemplateStoragePoolVO;
 import com.cloud.storage.VMTemplateStorageResourceAssoc;
@@ -176,7 +177,6 @@ import com.cloud.utils.component.ManagerBase;
 import com.cloud.utils.concurrency.NamedThreadFactory;
 import com.cloud.utils.db.DB;
 import com.cloud.utils.db.Transaction;
-import com.cloud.utils.db.TransactionCallback;
 import com.cloud.utils.db.TransactionCallbackNoReturn;
 import com.cloud.utils.db.TransactionStatus;
 import com.cloud.utils.exception.CloudRuntimeException;
@@ -1627,8 +1627,13 @@ public class TemplateManagerImpl extends ManagerBase implements TemplateManager,
         VMTemplateVO template = _tmpltDao.persist(privateTemplate);
         // Increment the number of templates
         if (template != null) {
-            if (cmd.getDetails() != null) {
-                _templateDetailsDao.persist(template.getId(), cmd.getDetails());
+            Map<String, String> detailsStr = cmd.getDetails();
+            if (detailsStr != null) {
+                List<VMTemplateDetailVO> details = new ArrayList<VMTemplateDetailVO>();
+                for (String key : detailsStr.keySet()) {
+                    details.add(new VMTemplateDetailVO(template.getId(), key, detailsStr.get(key)));
+                }
+                _templateDetailsDao.addDetails(details);
             }
 
             _resourceLimitMgr.incrementResourceCount(templateOwner.getId(), ResourceType.template);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/0fb4d9d5/server/test/com/cloud/metadata/ResourceMetaDataManagerTest.java
----------------------------------------------------------------------
diff --git a/server/test/com/cloud/metadata/ResourceMetaDataManagerTest.java b/server/test/com/cloud/metadata/ResourceMetaDataManagerTest.java
index b071955..ae3cae4 100644
--- a/server/test/com/cloud/metadata/ResourceMetaDataManagerTest.java
+++ b/server/test/com/cloud/metadata/ResourceMetaDataManagerTest.java
@@ -76,8 +76,8 @@ public class ResourceMetaDataManagerTest {
         doReturn(1L).when(_taggedResourceMgr).getResourceId(anyString(), eq(ResourceTag.ResourceObjectType.Volume));
         //           _volumeDetailDao.removeDetails(id, key);
 
-        doNothing().when(_volumeDetailDao).removeDetails(anyLong(), anyString());
-        doNothing().when(_nicDetailDao).removeDetails(anyLong(), anyString());
+        doNothing().when(_volumeDetailDao).removeDetail(anyLong(), anyString());
+        doNothing().when(_nicDetailDao).removeDetail(anyLong(), anyString());
         _resourceMetaDataMgr.deleteResourceMetaData(anyString(), eq(ResourceTag.ResourceObjectType.Volume), anyString());
 
     }
@@ -91,8 +91,8 @@ public class ResourceMetaDataManagerTest {
         doReturn(1L).when(_taggedResourceMgr).getResourceId("1", ResourceTag.ResourceObjectType.Volume);
         //           _volumeDetailDao.removeDetails(id, key);
 
-        doNothing().when(_volumeDetailDao).removeDetails(anyLong(), anyString());
-        doNothing().when(_nicDetailDao).removeDetails(anyLong(), anyString());
+        doNothing().when(_volumeDetailDao).removeDetail(anyLong(), anyString());
+        doNothing().when(_nicDetailDao).removeDetail(anyLong(), anyString());
         Map<String, String> map = new HashedMap();
         map.put("key","value");
         _resourceMetaDataMgr.addResourceMetaData("1", ResourceTag.ResourceObjectType.Volume, map);


[38/50] [abbrv] git commit: updated refs/heads/object_store_migration to 5ec2a44

Posted by mc...@apache.org.
Fix z-index of header bar causing overlap w/ dialogs


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

Branch: refs/heads/object_store_migration
Commit: 6748d19dbcea2df53036eaf43397083ab2a6460b
Parents: 10d4714
Author: Brian Federle <br...@citrix.com>
Authored: Mon Oct 28 11:36:46 2013 -0700
Committer: Brian Federle <br...@citrix.com>
Committed: Mon Oct 28 11:47:18 2013 -0700

----------------------------------------------------------------------
 ui/css/cloudstack3.css | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6748d19d/ui/css/cloudstack3.css
----------------------------------------------------------------------
diff --git a/ui/css/cloudstack3.css b/ui/css/cloudstack3.css
index 3e48062..9018511 100644
--- a/ui/css/cloudstack3.css
+++ b/ui/css/cloudstack3.css
@@ -2202,7 +2202,7 @@ div.detail-group.actions td {
   width: 100%;
   height: 117px;
   background: url(../images/overlay-pattern.png) repeat 0, #1B5070 url(../images/header-gradient.png) no-repeat center;
-  z-index: 10000;
+  z-index: 100;
   background-size: auto, cover;
   position: relative;
 }


[37/50] [abbrv] git commit: updated refs/heads/object_store_migration to 5ec2a44

Posted by mc...@apache.org.
Remove the old duplicate savepassword.sh

The working one is at: systemvm/patches/debian/config/opt/cloud/bin/


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

Branch: refs/heads/object_store_migration
Commit: 10d47147a655d555bf8f3d055f244bc2bf16dc05
Parents: d5777c8
Author: Sheng Yang <sh...@citrix.com>
Authored: Mon Oct 28 11:36:16 2013 -0700
Committer: Sheng Yang <sh...@citrix.com>
Committed: Mon Oct 28 11:37:25 2013 -0700

----------------------------------------------------------------------
 .../debian/config/opt/cloud/bin/savepassword.sh | 62 --------------------
 1 file changed, 62 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/10d47147/patches/systemvm/debian/config/opt/cloud/bin/savepassword.sh
----------------------------------------------------------------------
diff --git a/patches/systemvm/debian/config/opt/cloud/bin/savepassword.sh b/patches/systemvm/debian/config/opt/cloud/bin/savepassword.sh
deleted file mode 100644
index 9c59757..0000000
--- a/patches/systemvm/debian/config/opt/cloud/bin/savepassword.sh
+++ /dev/null
@@ -1,62 +0,0 @@
-#!/bin/bash
-# Copyright 2012 Citrix Systems, Inc. Licensed under the
-# Apache License, Version 2.0 (the "License"); you may not use this
-# file except in compliance with the License.  Citrix Systems, Inc.
-# reserves all rights not expressly granted by 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.
-# 
-# Automatically generated by addcopyright.py at 04/03/2012
-
-
-
- 
-
-# Usage
-#	save_password -v <user VM IP> -p <password>
-
-source /root/func.sh
-
-lock="passwdlock"
-#default timeout value is 30 mins as password reset command is not synchronized on agent side any more,
-#and multiple commands can be sent to the same VR at a time
-locked=$(getLockFile $lock 1800)
-if [ "$locked" != "1" ]
-then
-    exit 1
-fi
-
-PASSWD_FILE=/var/cache/cloud/passwords
-
-while getopts 'v:p:' OPTION
-do
-  case $OPTION in
-  v)	VM_IP="$OPTARG"
-		;;
-  p)	
-		ENCODEDPASSWORD="$OPTARG"
-		PASSWORD=$(echo $ENCODEDPASSWORD | tr '[a-m][n-z][A-M][N-Z]' '[n-z][a-m][N-Z][A-M]')
-		;;
-  ?)	echo "Incorrect usage"
-                unlock_exit 1 $lock $locked
-		;;
-  esac
-done
-
-[ -f $PASSWD_FILE ] ||  touch $PASSWD_FILE
-
-sed -i /$VM_IP/d $PASSWD_FILE
-
-ps aux | grep serve_password.sh |grep -v grep 2>&1 > /dev/null
-if [ $? -eq 0 ]
-then
-    echo "$VM_IP=$PASSWORD" >> $PASSWD_FILE
-else
-    echo "$VM_IP=saved_password" >> $PASSWD_FILE
-fi
-
-unlock_exit $? $lock $locked


[04/50] [abbrv] git commit: updated refs/heads/object_store_migration to 5ec2a44

Posted by mc...@apache.org.
Made all resource details DAOs (nic_details, user_vm_details, template_details, volume_details, service_offering_details) extend from the same base class as although details are being stored in diff tables, those tables have the same structure and same accessors.


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

Branch: refs/heads/object_store_migration
Commit: 0fb4d9d5a2d4321c3a87f26c5ea9f77d2d82b7d8
Parents: 8e62fb7
Author: Alena Prokharchyk <al...@citrix.com>
Authored: Fri Oct 25 09:54:46 2013 -0700
Committer: Alena Prokharchyk <al...@citrix.com>
Committed: Fri Oct 25 10:56:19 2013 -0700

----------------------------------------------------------------------
 .../apache/cloudstack/api/ResourceDetail.java   |   6 +-
 .../com/cloud/vm/VirtualMachineManagerImpl.java |   8 +-
 .../src/com/cloud/dc/DataCenterDetailVO.java    |  23 ++--
 .../src/com/cloud/dc/dao/DataCenterDaoImpl.java |  10 +-
 .../com/cloud/dc/dao/DataCenterDetailsDao.java  |  16 +--
 .../cloud/dc/dao/DataCenterDetailsDaoImpl.java  |  98 +----------------
 .../src/com/cloud/dc/dao/ResourceDetailDao.java |  40 +++++++
 .../com/cloud/dc/dao/ResourceDetailDaoImpl.java | 110 +++++++++++++++++++
 .../com/cloud/network/dao/NetworkDetailVO.java  |  38 ++-----
 .../cloud/network/dao/NetworkDetailsDao.java    |  15 +--
 .../network/dao/NetworkDetailsDaoImpl.java      |  72 +-----------
 .../cloud/service/ServiceOfferingDetailsVO.java |  22 ++--
 .../service/dao/ServiceOfferingDaoImpl.java     |  13 ++-
 .../service/dao/ServiceOfferingDetailsDao.java  |  10 +-
 .../dao/ServiceOfferingDetailsDaoImpl.java      |  84 +-------------
 .../com/cloud/storage/VMTemplateDetailVO.java   |  34 ++----
 .../src/com/cloud/storage/VolumeDetailVO.java   |  33 ++----
 .../cloud/storage/dao/VMTemplateDaoImpl.java    |  25 +++--
 .../cloud/storage/dao/VMTemplateDetailsDao.java |  17 +--
 .../storage/dao/VMTemplateDetailsDaoImpl.java   |  98 +----------------
 .../com/cloud/storage/dao/VolumeDetailsDao.java |  17 +--
 .../cloud/storage/dao/VolumeDetailsDaoImpl.java |  90 +--------------
 engine/schema/src/com/cloud/vm/NicDetailVO.java |  34 ++----
 .../schema/src/com/cloud/vm/UserVmDetailVO.java |  34 ++----
 .../src/com/cloud/vm/dao/NicDetailDao.java      |  15 +--
 .../src/com/cloud/vm/dao/NicDetailDaoImpl.java  |  83 +-------------
 .../src/com/cloud/vm/dao/UserVmDaoImpl.java     |  16 +--
 .../src/com/cloud/vm/dao/UserVmDetailsDao.java  |  19 +---
 .../com/cloud/vm/dao/UserVmDetailsDaoImpl.java  | 105 +-----------------
 server/src/com/cloud/api/ApiDBUtils.java        |   2 +
 .../com/cloud/api/query/QueryManagerImpl.java   |   6 +-
 .../configuration/ConfigurationManagerImpl.java |  24 ++--
 .../hypervisor/CloudZonesStartupProcessor.java  |   9 +-
 .../metadata/ResourceMetaDataManagerImpl.java   |  40 ++++---
 .../com/cloud/template/TemplateManagerImpl.java |  13 ++-
 .../metadata/ResourceMetaDataManagerTest.java   |   8 +-
 36 files changed, 361 insertions(+), 926 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/0fb4d9d5/api/src/org/apache/cloudstack/api/ResourceDetail.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/ResourceDetail.java b/api/src/org/apache/cloudstack/api/ResourceDetail.java
index 0c5dcab..7a2570b 100644
--- a/api/src/org/apache/cloudstack/api/ResourceDetail.java
+++ b/api/src/org/apache/cloudstack/api/ResourceDetail.java
@@ -16,12 +16,12 @@
 // under the License.
 package org.apache.cloudstack.api;
 
-public interface ResourceDetail {
+public interface ResourceDetail extends InternalIdentity{
     
-    public long getResourceDetail();
+    public long getResourceId();
     
     public String getName();
     
     public String getValue();
-
+        
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/0fb4d9d5/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java
----------------------------------------------------------------------
diff --git a/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java b/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java
index ce078c9..0ff4446 100755
--- a/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java
+++ b/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java
@@ -439,7 +439,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
         VirtualMachineGuru guru = getVmGuru(vm);
         guru.finalizeExpunge(vm);
         //remove the overcommit detials from the uservm details
-        _uservmDetailsDao.deleteDetails(vm.getId());
+        _uservmDetailsDao.removeDetails(vm.getId());
 
         // send hypervisor-dependent commands before removing
         List<Command> finalizeExpungeCommands = hvGuru.finalizeExpunge(vm);
@@ -810,11 +810,9 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
                     _uservmDetailsDao.persist(vmDetail_ram);
                 } else if (_uservmDetailsDao.findDetail(vm.getId(), "cpuOvercommitRatio") != null) {
                     UserVmDetailVO vmDetail_cpu = _uservmDetailsDao.findDetail(vm.getId(), "cpuOvercommitRatio");
-                    vmDetail_cpu.setValue(cluster_detail_cpu.getValue());
                     UserVmDetailVO vmDetail_ram = _uservmDetailsDao.findDetail(vm.getId(), "memoryOvercommitRatio");
-                    vmDetail_ram.setValue(cluster_detail_ram.getValue());
-                    _uservmDetailsDao.update(vmDetail_cpu.getId(), vmDetail_cpu);
-                    _uservmDetailsDao.update(vmDetail_ram.getId(), vmDetail_ram);
+                    _uservmDetailsDao.addDetail(vmDetail_cpu);
+                    _uservmDetailsDao.addDetail(vmDetail_ram);
                 }
                 vmProfile.setCpuOvercommitRatio(Float.parseFloat(cluster_detail_cpu.getValue()));
                 vmProfile.setMemoryOvercommitRatio(Float.parseFloat(cluster_detail_ram.getValue()));

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/0fb4d9d5/engine/schema/src/com/cloud/dc/DataCenterDetailVO.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/dc/DataCenterDetailVO.java b/engine/schema/src/com/cloud/dc/DataCenterDetailVO.java
index 4476a6f..6771ef8 100644
--- a/engine/schema/src/com/cloud/dc/DataCenterDetailVO.java
+++ b/engine/schema/src/com/cloud/dc/DataCenterDetailVO.java
@@ -23,19 +23,18 @@ import javax.persistence.GenerationType;
 import javax.persistence.Id;
 import javax.persistence.Table;
 
-import org.apache.cloudstack.api.InternalIdentity;
 import org.apache.cloudstack.api.ResourceDetail;
 
 @Entity
 @Table(name="data_center_details")
-public class DataCenterDetailVO implements InternalIdentity, ResourceDetail {
+public class DataCenterDetailVO implements ResourceDetail {
     @Id
     @GeneratedValue(strategy=GenerationType.IDENTITY)
     @Column(name="id")
     private long id;
     
     @Column(name="dc_id")
-    private long dcId;
+    private long resourceId;
     
     @Column(name="name")
     private String name;
@@ -47,33 +46,29 @@ public class DataCenterDetailVO implements InternalIdentity, ResourceDetail {
     }
     
     public DataCenterDetailVO(long dcId, String name, String value) {
-        this.dcId = dcId;
+        this.resourceId = dcId;
         this.name = name;
         this.value = value;
     }
+    
 
-    public long getDcId() {
-        return dcId;
-    }
-
+    @Override
     public String getName() {
         return name;
     }
 
+    @Override
     public String getValue() {
         return value;
     }
 
-    public void setValue(String value) {
-        this.value = value;
-    }
-
+    @Override
     public long getId() {
         return id;
     }
 
     @Override
-    public long getResourceDetail() {
-        return dcId;
+    public long getResourceId() {
+        return resourceId;
     }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/0fb4d9d5/engine/schema/src/com/cloud/dc/dao/DataCenterDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/dc/dao/DataCenterDaoImpl.java b/engine/schema/src/com/cloud/dc/dao/DataCenterDaoImpl.java
index aaa372f..9d90241 100755
--- a/engine/schema/src/com/cloud/dc/dao/DataCenterDaoImpl.java
+++ b/engine/schema/src/com/cloud/dc/dao/DataCenterDaoImpl.java
@@ -26,9 +26,11 @@ import javax.inject.Inject;
 import javax.naming.ConfigurationException;
 import javax.persistence.TableGenerator;
 
+import org.apache.cloudstack.api.ResourceDetail;
 import org.apache.log4j.Logger;
 import org.springframework.stereotype.Component;
 
+import com.cloud.dc.DataCenterDetailVO;
 import com.cloud.dc.DataCenterIpAddressVO;
 import com.cloud.dc.DataCenterLinkLocalIpAddressVO;
 import com.cloud.dc.DataCenterVO;
@@ -366,7 +368,13 @@ public class DataCenterDaoImpl extends GenericDaoBase<DataCenterVO, Long> implem
         if (details == null) {
             return;
         }
-        _detailsDao.persist(zone.getId(), details);
+        
+        List<DataCenterDetailVO> resourceDetails = new ArrayList<DataCenterDetailVO>();
+        for (String key : details.keySet()) {
+            resourceDetails.add(new DataCenterDetailVO(zone.getId(), key, details.get(key)));
+        }
+        
+        _detailsDao.addDetails(resourceDetails);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/0fb4d9d5/engine/schema/src/com/cloud/dc/dao/DataCenterDetailsDao.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/dc/dao/DataCenterDetailsDao.java b/engine/schema/src/com/cloud/dc/dao/DataCenterDetailsDao.java
index 2cc7df8..011aa73 100644
--- a/engine/schema/src/com/cloud/dc/dao/DataCenterDetailsDao.java
+++ b/engine/schema/src/com/cloud/dc/dao/DataCenterDetailsDao.java
@@ -16,22 +16,8 @@
 // under the License.
 package com.cloud.dc.dao;
 
-import java.util.List;
-import java.util.Map;
-
 import com.cloud.dc.DataCenterDetailVO;
 import com.cloud.utils.db.GenericDao;
 
-public interface DataCenterDetailsDao extends GenericDao<DataCenterDetailVO, Long> {
-    Map<String, String> findDetails(long dcId);
-    
-    void persist(long dcId, Map<String, String> details);
-    
-    DataCenterDetailVO findDetail(long dcId, String name);
-
-	void deleteDetails(long dcId);
-
-    void removeDetails(long id, String key);
-
-    List<DataCenterDetailVO> findDetailsList(long dcId);
+public interface DataCenterDetailsDao extends GenericDao<DataCenterDetailVO, Long>, ResourceDetailDao<DataCenterDetailVO> {
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/0fb4d9d5/engine/schema/src/com/cloud/dc/dao/DataCenterDetailsDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/dc/dao/DataCenterDetailsDaoImpl.java b/engine/schema/src/com/cloud/dc/dao/DataCenterDetailsDaoImpl.java
index b8a36f0..b6949f5 100644
--- a/engine/schema/src/com/cloud/dc/dao/DataCenterDetailsDaoImpl.java
+++ b/engine/schema/src/com/cloud/dc/dao/DataCenterDetailsDaoImpl.java
@@ -16,117 +16,29 @@
 // under the License.
 package com.cloud.dc.dao;
 
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
 import javax.ejb.Local;
 
-import com.cloud.vm.UserVmDetailVO;
+import org.apache.cloudstack.api.ResourceDetail;
 import org.apache.cloudstack.framework.config.ConfigKey;
 import org.apache.cloudstack.framework.config.ConfigKey.Scope;
 import org.apache.cloudstack.framework.config.ScopedConfigStorage;
 
 import com.cloud.dc.DataCenterDetailVO;
-import com.cloud.utils.db.GenericDaoBase;
-import com.cloud.utils.db.SearchBuilder;
-import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.TransactionLegacy;
 
 @Local(value=DataCenterDetailsDao.class)
-public class DataCenterDetailsDaoImpl extends GenericDaoBase<DataCenterDetailVO, Long> implements DataCenterDetailsDao, ScopedConfigStorage {
-    protected final SearchBuilder<DataCenterDetailVO> DcSearch;
-    protected final SearchBuilder<DataCenterDetailVO> DetailSearch;
+public class DataCenterDetailsDaoImpl extends ResourceDetailDaoImpl<DataCenterDetailVO> implements DataCenterDetailsDao, ScopedConfigStorage {
     
     public DataCenterDetailsDaoImpl() {
-        DcSearch = createSearchBuilder();
-        DcSearch.and("dcId", DcSearch.entity().getDcId(), SearchCriteria.Op.EQ);
-        DcSearch.done();
-        
-        DetailSearch = createSearchBuilder();
-        DetailSearch.and("dcId", DetailSearch.entity().getDcId(), SearchCriteria.Op.EQ);
-        DetailSearch.and("name", DetailSearch.entity().getName(), SearchCriteria.Op.EQ);
-        DetailSearch.done();
-    }
-
-    @Override
-    public DataCenterDetailVO findDetail(long dcId, String name) {
-        SearchCriteria<DataCenterDetailVO> sc = DetailSearch.create();
-        sc.setParameters("dcId", dcId);
-        sc.setParameters("name", name);
-        
-        return findOneIncludingRemovedBy(sc);
-    }
-
-    @Override
-    public Map<String, String> findDetails(long dcId) {
-        SearchCriteria<DataCenterDetailVO> sc = DcSearch.create();
-        sc.setParameters("dcId", dcId);
-        
-        List<DataCenterDetailVO> results = search(sc, null);
-        Map<String, String> details = new HashMap<String, String>(results.size());
-        for (DataCenterDetailVO result : results) {
-            details.put(result.getName(), result.getValue());
-        }
-        return details;
     }
-
-    @Override
-    public List<DataCenterDetailVO> findDetailsList(long dcId) {
-        SearchCriteria<DataCenterDetailVO> sc = DcSearch.create();
-        sc.setParameters("dcId", dcId);
-
-        List<DataCenterDetailVO> results = search(sc, null);
-        return results;
-    }
-
-
-    @Override
-    public void deleteDetails(long dcId) {
-        SearchCriteria<DataCenterDetailVO> sc = DcSearch.create();
-        sc.setParameters("dcId", dcId);
-        
-        List<DataCenterDetailVO> results = search(sc, null);
-        for (DataCenterDetailVO result : results) {
-        	remove(result.getId());
-        }
-    }
-
-    @Override
-    public void removeDetails(long id, String key) {
-        if(key != null){
-            DataCenterDetailVO detail = findDetail(id, key);
-            if(detail != null){
-                remove(detail.getId());
-            }
-        }else {
-            deleteDetails(id);
-        }
-    }
-
-    @Override
-    public void persist(long dcId, Map<String, String> details) {
-        TransactionLegacy txn = TransactionLegacy.currentTxn();
-        txn.start();
-        SearchCriteria<DataCenterDetailVO> sc = DcSearch.create();
-        sc.setParameters("dcId", dcId);
-        expunge(sc);
-        
-        for (Map.Entry<String, String> detail : details.entrySet()) {
-            DataCenterDetailVO vo = new DataCenterDetailVO(dcId, detail.getKey(), detail.getValue());
-            persist(vo);
-        }
-        txn.commit();
-    }
-
+    
     @Override
     public Scope getScope() {
         return ConfigKey.Scope.Zone;
     }
-
+    
     @Override
     public String getConfigValue(long id, ConfigKey<?> key) {
-        DataCenterDetailVO vo = findDetail(id, key.key());
+        ResourceDetail vo = findDetail(id, key.key());
         return vo == null ? null : vo.getValue();
     }
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/0fb4d9d5/engine/schema/src/com/cloud/dc/dao/ResourceDetailDao.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/dc/dao/ResourceDetailDao.java b/engine/schema/src/com/cloud/dc/dao/ResourceDetailDao.java
new file mode 100644
index 0000000..85d2c78
--- /dev/null
+++ b/engine/schema/src/com/cloud/dc/dao/ResourceDetailDao.java
@@ -0,0 +1,40 @@
+// 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.dc.dao;
+
+import java.util.List;
+import java.util.Map;
+
+import org.apache.cloudstack.api.ResourceDetail;
+
+import com.cloud.utils.db.GenericDao;
+
+public interface ResourceDetailDao<R extends ResourceDetail> extends GenericDao<R, Long>{
+    public R findDetail(long resourceId, String name);
+
+    public Map<String, String> findDetails(long resourceId);
+
+    public List<R> findDetailsList(long resourceId);
+
+    public void removeDetails(long resourceId);
+
+    public void removeDetail(long resourceId, String key);
+
+    public void addDetails(List<R> details);
+    
+    public void addDetail(R detail);
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/0fb4d9d5/engine/schema/src/com/cloud/dc/dao/ResourceDetailDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/dc/dao/ResourceDetailDaoImpl.java b/engine/schema/src/com/cloud/dc/dao/ResourceDetailDaoImpl.java
new file mode 100644
index 0000000..8819e4b
--- /dev/null
+++ b/engine/schema/src/com/cloud/dc/dao/ResourceDetailDaoImpl.java
@@ -0,0 +1,110 @@
+// 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.dc.dao;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.cloudstack.api.ResourceDetail;
+
+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 abstract class ResourceDetailDaoImpl<R extends ResourceDetail> extends GenericDaoBase<R, Long>{
+    private SearchBuilder<R> AllFieldsSearch;
+    
+    public ResourceDetailDaoImpl() {
+        AllFieldsSearch = createSearchBuilder();
+        AllFieldsSearch.and("resourceId", AllFieldsSearch.entity().getResourceId(), SearchCriteria.Op.EQ);
+        AllFieldsSearch.and("name", AllFieldsSearch.entity().getName(), SearchCriteria.Op.EQ);
+        AllFieldsSearch.done();
+    }
+
+    public R findDetail(long resourceId, String name) {
+        SearchCriteria<R> sc = AllFieldsSearch.create();
+        sc.setParameters("resourceId", resourceId);
+        sc.setParameters("name", name);
+        
+        return findOneBy(sc);
+    }
+
+
+    public Map<String, String> findDetails(long resourceId) {
+        SearchCriteria<R> sc = AllFieldsSearch.create();
+        sc.setParameters("resourceId", resourceId);
+        
+        List<R> results = search(sc, null);
+        Map<String, String> details = new HashMap<String, String>(results.size());
+        for (R result : results) {
+            details.put(result.getName(), result.getValue());
+        }
+        return details;
+    }
+
+    public List<R> findDetailsList(long resourceId) {
+        SearchCriteria<R> sc = AllFieldsSearch.create();
+        sc.setParameters("resourceId", resourceId);
+
+        List<R> results = search(sc, null);
+        return results;
+    }
+
+
+    public void removeDetails(long resourceId) {
+        SearchCriteria<R> sc = AllFieldsSearch.create();
+        sc.setParameters("resourceId", resourceId);
+        remove(sc);
+    }
+
+    
+    public void removeDetail(long resourceId, String key) {
+        if (key != null){
+            SearchCriteria<R> sc = AllFieldsSearch.create();
+            sc.setParameters("name", key);
+            remove(sc);
+        }
+    }
+
+
+    public void addDetails(List<R> details) {
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
+        txn.start();
+        SearchCriteria<R> sc = AllFieldsSearch.create();
+        sc.setParameters("resourceId", details.get(0).getResourceId());
+        expunge(sc);
+        
+        for (R detail : details) {
+            persist(detail);
+        }
+        
+        txn.commit();
+    }
+    
+
+    public void addDetail(R detail) {
+        R existingDetail = findDetail(detail.getResourceId(), detail.getName());
+        if (existingDetail != null) {
+            remove(existingDetail.getId());
+        }
+        persist(detail);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/0fb4d9d5/engine/schema/src/com/cloud/network/dao/NetworkDetailVO.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/network/dao/NetworkDetailVO.java b/engine/schema/src/com/cloud/network/dao/NetworkDetailVO.java
index 6292397..c7006c4 100644
--- a/engine/schema/src/com/cloud/network/dao/NetworkDetailVO.java
+++ b/engine/schema/src/com/cloud/network/dao/NetworkDetailVO.java
@@ -16,9 +16,6 @@
 // under the License.
 package com.cloud.network.dao;
 
-import org.apache.cloudstack.api.InternalIdentity;
-import org.apache.cloudstack.api.ResourceDetail;
-
 import javax.persistence.Column;
 import javax.persistence.Entity;
 import javax.persistence.GeneratedValue;
@@ -26,16 +23,18 @@ import javax.persistence.GenerationType;
 import javax.persistence.Id;
 import javax.persistence.Table;
 
+import org.apache.cloudstack.api.ResourceDetail;
+
 @Entity
 @Table(name="network_details")
-public class NetworkDetailVO implements InternalIdentity, ResourceDetail {
+public class NetworkDetailVO implements ResourceDetail {
     @Id
     @GeneratedValue(strategy= GenerationType.IDENTITY)
     @Column(name="id")
     private long id;
 
     @Column(name="network_id")
-    private long networkId;
+    private long resourceId;
 
     @Column(name="name")
     private String name;
@@ -46,45 +45,28 @@ public class NetworkDetailVO implements InternalIdentity, ResourceDetail {
     public NetworkDetailVO() {}
 
     public NetworkDetailVO(long networkId, String name, String value) {
-        this.networkId = networkId;
+        this.resourceId = networkId;
         this.name = name;
         this.value = value;
     }
 
+    @Override
     public long getId() {
         return id;
     }
 
-    public long getNetworkId() {
-        return networkId;
-    }
-
+    @Override
     public String getName() {
         return name;
     }
 
+    @Override
     public String getValue() {
         return value;
     }
 
-    public void setId(long id) {
-        this.id = id;
-    }
-
-    public void setNetworkId(long networkId) {
-        this.networkId = networkId;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public void setValue(String value) {
-        this.value = value;
-    }
-
     @Override
-    public long getResourceDetail() {
-        return networkId;
+    public long getResourceId() {
+        return resourceId;
     }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/0fb4d9d5/engine/schema/src/com/cloud/network/dao/NetworkDetailsDao.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/network/dao/NetworkDetailsDao.java b/engine/schema/src/com/cloud/network/dao/NetworkDetailsDao.java
index 930e8f8..f791888 100644
--- a/engine/schema/src/com/cloud/network/dao/NetworkDetailsDao.java
+++ b/engine/schema/src/com/cloud/network/dao/NetworkDetailsDao.java
@@ -16,20 +16,9 @@
 // under the License.
 package com.cloud.network.dao;
 
+import com.cloud.dc.dao.ResourceDetailDao;
 import com.cloud.utils.db.GenericDao;
 
-import java.util.List;
-import java.util.Map;
-
-public interface NetworkDetailsDao extends GenericDao<NetworkDetailVO, Long> {
-    List<NetworkDetailVO> findDetails(long networkId);
-
-    void persist(long networkId, Map<String, String> details);
-
-    NetworkDetailVO findDetail(long networkId, String name);
-
-    void deleteDetails(long networkId);
-
-    public void removeDetails(long networkId, String key);
+public interface NetworkDetailsDao extends GenericDao<NetworkDetailVO, Long>, ResourceDetailDao<NetworkDetailVO> {
 
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/0fb4d9d5/engine/schema/src/com/cloud/network/dao/NetworkDetailsDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/network/dao/NetworkDetailsDaoImpl.java b/engine/schema/src/com/cloud/network/dao/NetworkDetailsDaoImpl.java
index 29bac95..76dc24a 100644
--- a/engine/schema/src/com/cloud/network/dao/NetworkDetailsDaoImpl.java
+++ b/engine/schema/src/com/cloud/network/dao/NetworkDetailsDaoImpl.java
@@ -16,78 +16,14 @@
 // under the License.
 package com.cloud.network.dao;
 
-import com.cloud.utils.db.GenericDaoBase;
-import com.cloud.utils.db.SearchBuilder;
-import com.cloud.utils.db.SearchCriteria;
-import com.cloud.network.dao.NetworkDetailVO;
-import com.cloud.vm.dao.UserVmDetailsDao;
+import javax.ejb.Local;
+
 import org.springframework.stereotype.Component;
 
-import javax.ejb.Local;
-import java.util.List;
-import java.util.Map;
+import com.cloud.dc.dao.ResourceDetailDaoImpl;
 
 @Component
 @Local(value=NetworkDetailsDao.class)
-public class NetworkDetailsDaoImpl extends GenericDaoBase<NetworkDetailVO, Long> implements NetworkDetailsDao {
-
-    protected final SearchBuilder<NetworkDetailVO> NetworkSearch;
-    protected final SearchBuilder<NetworkDetailVO> DetailSearch;
-
-    public NetworkDetailsDaoImpl() {
-        NetworkSearch = createSearchBuilder();
-        NetworkSearch.and("networkId", NetworkSearch.entity().getNetworkId(), SearchCriteria.Op.EQ);
-        NetworkSearch.done();
-
-        DetailSearch = createSearchBuilder();
-        DetailSearch.and("networkId", DetailSearch.entity().getNetworkId(), SearchCriteria.Op.EQ);
-        DetailSearch.and("name", DetailSearch.entity().getName(), SearchCriteria.Op.EQ);
-        DetailSearch.done();
-    }
-    
-    
-    @Override
-    public List<NetworkDetailVO> findDetails(long networkId) {
-        SearchCriteria<NetworkDetailVO> sc = NetworkSearch.create();
-        sc.setParameters("networkId", networkId);
-
-        List<NetworkDetailVO> results = search(sc, null);
-        return results;
-    }
-
-    @Override
-    public void persist(long networkId, Map<String, String> details) {
-        //To change body of implemented methods use File | Settings | File Templates.
-    }
-
-    @Override
-    public NetworkDetailVO findDetail(long networkId, String name) {
-        SearchCriteria<NetworkDetailVO> sc = DetailSearch.create();
-        sc.setParameters("networkId", networkId);
-        sc.setParameters("name", name);
-
-        return findOneBy(sc);    }
-
-    @Override
-    public void deleteDetails(long networkId) {
-        SearchCriteria<NetworkDetailVO> sc = NetworkSearch.create();
-        sc.setParameters("networkId", networkId);
-
-        List<NetworkDetailVO> results = search(sc, null);
-        for (NetworkDetailVO result : results) {
-            remove(result.getId());
-        }	
-    }
+public class NetworkDetailsDaoImpl extends ResourceDetailDaoImpl<NetworkDetailVO> implements NetworkDetailsDao {
 
-    @Override
-    public void removeDetails(long networkId, String key) {
-        if(key != null){
-            NetworkDetailVO detail = findDetail(networkId, key);
-            if(detail != null){
-                remove(detail.getId());
-            }
-        }else {
-            deleteDetails(networkId);
-        }
-    }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/0fb4d9d5/engine/schema/src/com/cloud/service/ServiceOfferingDetailsVO.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/service/ServiceOfferingDetailsVO.java b/engine/schema/src/com/cloud/service/ServiceOfferingDetailsVO.java
index b005c73..8b70b77 100644
--- a/engine/schema/src/com/cloud/service/ServiceOfferingDetailsVO.java
+++ b/engine/schema/src/com/cloud/service/ServiceOfferingDetailsVO.java
@@ -16,8 +16,6 @@
 // under the License.
 package com.cloud.service;
 
-import org.apache.cloudstack.api.InternalIdentity;
-
 import javax.persistence.Column;
 import javax.persistence.Entity;
 import javax.persistence.GeneratedValue;
@@ -25,16 +23,18 @@ import javax.persistence.GenerationType;
 import javax.persistence.Id;
 import javax.persistence.Table;
 
+import org.apache.cloudstack.api.ResourceDetail;
+
 @Entity
 @Table(name="service_offering_details")
-public class ServiceOfferingDetailsVO implements InternalIdentity {
+public class ServiceOfferingDetailsVO implements ResourceDetail {
     @Id
     @GeneratedValue(strategy=GenerationType.IDENTITY)
     @Column(name="id")
     private long id;
 
     @Column(name="service_offering_id")
-    private long serviceOfferingId;
+    private long resourceId;
 
     @Column(name="name")
     private String name;
@@ -46,27 +46,27 @@ public class ServiceOfferingDetailsVO implements InternalIdentity {
     }
 
     public ServiceOfferingDetailsVO(long serviceOfferingId, String name, String value) {
-        this.serviceOfferingId = serviceOfferingId;
+        this.resourceId = serviceOfferingId;
         this.name = name;
         this.value = value;
     }
 
-    public long getServiceOfferingId() {
-        return serviceOfferingId;
+    @Override
+    public long getResourceId() {
+        return resourceId;
     }
 
+    @Override
     public String getName() {
         return name;
     }
 
+    @Override
     public String getValue() {
         return value;
     }
 
-    public void setValue(String value) {
-        this.value = value;
-    }
-
+    @Override
     public long getId() {
         return id;
     }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/0fb4d9d5/engine/schema/src/com/cloud/service/dao/ServiceOfferingDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/service/dao/ServiceOfferingDaoImpl.java b/engine/schema/src/com/cloud/service/dao/ServiceOfferingDaoImpl.java
index b7890a4..648e4d0 100644
--- a/engine/schema/src/com/cloud/service/dao/ServiceOfferingDaoImpl.java
+++ b/engine/schema/src/com/cloud/service/dao/ServiceOfferingDaoImpl.java
@@ -16,6 +16,7 @@
 // under the License.
 package com.cloud.service.dao;
 
+import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
@@ -27,6 +28,7 @@ import javax.persistence.EntityExistsException;
 import org.apache.log4j.Logger;
 import org.springframework.stereotype.Component;
 
+import com.cloud.service.ServiceOfferingDetailsVO;
 import com.cloud.service.ServiceOfferingVO;
 import com.cloud.utils.db.DB;
 import com.cloud.utils.db.GenericDaoBase;
@@ -167,8 +169,15 @@ public class ServiceOfferingDaoImpl extends GenericDaoBase<ServiceOfferingVO, Lo
     @Override
     public void saveDetails(ServiceOfferingVO serviceOffering) {
         Map<String, String> details = serviceOffering.getDetails();
-        if (details != null) {
-            detailsDao.persist(serviceOffering.getId(), details);
+        if (details == null) {
+            return;
         }
+        
+        List<ServiceOfferingDetailsVO> resourceDetails = new ArrayList<ServiceOfferingDetailsVO>();
+        for (String key : details.keySet()) {
+            resourceDetails.add(new ServiceOfferingDetailsVO(serviceOffering.getId(), key, details.get(key)));
+        }
+        
+        detailsDao.addDetails(resourceDetails);
     }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/0fb4d9d5/engine/schema/src/com/cloud/service/dao/ServiceOfferingDetailsDao.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/service/dao/ServiceOfferingDetailsDao.java b/engine/schema/src/com/cloud/service/dao/ServiceOfferingDetailsDao.java
index e6ff6e5..ba753b7 100644
--- a/engine/schema/src/com/cloud/service/dao/ServiceOfferingDetailsDao.java
+++ b/engine/schema/src/com/cloud/service/dao/ServiceOfferingDetailsDao.java
@@ -16,15 +16,9 @@
 // under the License.
 package com.cloud.service.dao;
 
-import java.util.Map;
-
+import com.cloud.dc.dao.ResourceDetailDao;
 import com.cloud.service.ServiceOfferingDetailsVO;
 import com.cloud.utils.db.GenericDao;
 
-public interface ServiceOfferingDetailsDao extends GenericDao<ServiceOfferingDetailsVO, Long> {
-    Map<String, String> findDetails(long serviceOfferingId);
-    void persist(long serviceOfferingId, Map<String, String> details);
-    ServiceOfferingDetailsVO findDetail(long serviceOfferingId, String name);
-    void deleteDetails(long serviceOfferingId);
-    void removeDetails(long offId, String key);
+public interface ServiceOfferingDetailsDao extends GenericDao<ServiceOfferingDetailsVO, Long>, ResourceDetailDao<ServiceOfferingDetailsVO> {
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/0fb4d9d5/engine/schema/src/com/cloud/service/dao/ServiceOfferingDetailsDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/service/dao/ServiceOfferingDetailsDaoImpl.java b/engine/schema/src/com/cloud/service/dao/ServiceOfferingDetailsDaoImpl.java
index de99cf2..bf3cdcc 100644
--- a/engine/schema/src/com/cloud/service/dao/ServiceOfferingDetailsDaoImpl.java
+++ b/engine/schema/src/com/cloud/service/dao/ServiceOfferingDetailsDaoImpl.java
@@ -16,96 +16,16 @@
 // under the License.
 package com.cloud.service.dao;
 
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
 import javax.ejb.Local;
 
 import org.springframework.stereotype.Component;
 
+import com.cloud.dc.dao.ResourceDetailDaoImpl;
 import com.cloud.service.ServiceOfferingDetailsVO;
-import com.cloud.utils.db.GenericDaoBase;
-import com.cloud.utils.db.SearchBuilder;
-import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.TransactionLegacy;
 
 @Component
 @Local(value=ServiceOfferingDetailsDao.class)
-public class ServiceOfferingDetailsDaoImpl extends GenericDaoBase<ServiceOfferingDetailsVO, Long>
+public class ServiceOfferingDetailsDaoImpl extends ResourceDetailDaoImpl<ServiceOfferingDetailsVO>
         implements ServiceOfferingDetailsDao {
-    protected final SearchBuilder<ServiceOfferingDetailsVO> ServiceOfferingSearch;
-    protected final SearchBuilder<ServiceOfferingDetailsVO> DetailSearch;
-
-    public ServiceOfferingDetailsDaoImpl() {
-        ServiceOfferingSearch = createSearchBuilder();
-        ServiceOfferingSearch.and("serviceOfferingId", ServiceOfferingSearch.entity().getServiceOfferingId(), SearchCriteria.Op.EQ);
-        ServiceOfferingSearch.done();
-
-        DetailSearch = createSearchBuilder();
-        DetailSearch.and("serviceOfferingId", DetailSearch.entity().getServiceOfferingId(), SearchCriteria.Op.EQ);
-        DetailSearch.and("name", DetailSearch.entity().getName(), SearchCriteria.Op.EQ);
-        DetailSearch.done();
-    }
-
-    @Override
-    public ServiceOfferingDetailsVO findDetail(long serviceOfferingId, String name) {
-        SearchCriteria<ServiceOfferingDetailsVO> sc = DetailSearch.create();
-        sc.setParameters("serviceOfferingId", serviceOfferingId);
-        sc.setParameters("name", name);
-        ServiceOfferingDetailsVO detail = findOneIncludingRemovedBy(sc);
-        return detail;
-    }
-
-    @Override
-    public Map<String, String> findDetails(long serviceOfferingId) {
-        SearchCriteria<ServiceOfferingDetailsVO> sc = ServiceOfferingSearch.create();
-        sc.setParameters("serviceOfferingId", serviceOfferingId);
-        List<ServiceOfferingDetailsVO> results = search(sc, null);
-        Map<String, String> details = new HashMap<String, String>(results.size());
-        for (ServiceOfferingDetailsVO result : results) {
-            details.put(result.getName(), result.getValue());
-        }
-
-        return details;
-    }
-
-    @Override
-    public void deleteDetails(long serviceOfferingId) {
-        SearchCriteria sc = ServiceOfferingSearch.create();
-        sc.setParameters("serviceOfferingId", serviceOfferingId);
-        List<ServiceOfferingDetailsVO> results = search(sc, null);
-        for (ServiceOfferingDetailsVO result : results) {
-            remove(result.getId());
-        }
-    }
-
-    @Override
-    public void persist(long serviceOfferingId, Map<String, String> details) {
-        TransactionLegacy txn = TransactionLegacy.currentTxn();
-        txn.start();
-        SearchCriteria<ServiceOfferingDetailsVO> sc = ServiceOfferingSearch.create();
-        sc.setParameters("serviceOfferingId", serviceOfferingId);
-        expunge(sc);
-
-        for (Map.Entry<String, String> detail : details.entrySet()) {
-            String value = detail.getValue();
-            ServiceOfferingDetailsVO vo = new ServiceOfferingDetailsVO(serviceOfferingId, detail.getKey(), value);
-            persist(vo);
-        }
-        txn.commit();
-    }
     
-    @Override
-    public void removeDetails(long offId, String key) {
-        if(key != null){
-            ServiceOfferingDetailsVO detail = findDetail(offId, key);
-            if(detail != null){
-                remove(detail.getId());
-            }
-        }else {
-            deleteDetails(offId);
-        }
-    }
-
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/0fb4d9d5/engine/schema/src/com/cloud/storage/VMTemplateDetailVO.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/storage/VMTemplateDetailVO.java b/engine/schema/src/com/cloud/storage/VMTemplateDetailVO.java
index 3d4c7ef..59b490b 100644
--- a/engine/schema/src/com/cloud/storage/VMTemplateDetailVO.java
+++ b/engine/schema/src/com/cloud/storage/VMTemplateDetailVO.java
@@ -16,8 +16,6 @@
 // under the License.
 package com.cloud.storage;
 
-import org.apache.cloudstack.api.InternalIdentity;
-
 import javax.persistence.Column;
 import javax.persistence.Entity;
 import javax.persistence.GeneratedValue;
@@ -25,16 +23,18 @@ import javax.persistence.GenerationType;
 import javax.persistence.Id;
 import javax.persistence.Table;
 
+import org.apache.cloudstack.api.ResourceDetail;
+
 @Entity
 @Table(name = "vm_template_details")
-public class VMTemplateDetailVO implements InternalIdentity {
+public class VMTemplateDetailVO implements ResourceDetail {
     @Id
     @GeneratedValue(strategy = GenerationType.IDENTITY)
     @Column(name = "id")
     private long id;
 
     @Column(name = "template_id")
-    private long templateId;
+    private long resourceId;
 
     @Column(name = "name")
     private String name;
@@ -46,40 +46,28 @@ public class VMTemplateDetailVO implements InternalIdentity {
     }
 
     public VMTemplateDetailVO(long templateId, String name, String value) {
-        this.templateId = templateId;
+        this.resourceId = templateId;
         this.name = name;
         this.value = value;
     }
 
+    @Override
     public long getId() {
         return id;
     }
 
-    public long getTemplateId() {
-        return templateId;
+    @Override
+    public long getResourceId() {
+        return resourceId;
     }
 
+    @Override
     public String getName() {
         return name;
     }
 
+    @Override
     public String getValue() {
         return value;
     }
-
-    public void setId(long id) {
-        this.id = id;
-    }
-
-    public void setTemplateId(long templateId) {
-        this.templateId = templateId;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public void setValue(String value) {
-        this.value = value;
-    }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/0fb4d9d5/engine/schema/src/com/cloud/storage/VolumeDetailVO.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/storage/VolumeDetailVO.java b/engine/schema/src/com/cloud/storage/VolumeDetailVO.java
index 6d2a618..499be86 100644
--- a/engine/schema/src/com/cloud/storage/VolumeDetailVO.java
+++ b/engine/schema/src/com/cloud/storage/VolumeDetailVO.java
@@ -28,14 +28,14 @@ import org.apache.cloudstack.api.ResourceDetail;
 
 @Entity
 @Table(name="volume_details")
-public class VolumeDetailVO implements InternalIdentity, ResourceDetail {
+public class VolumeDetailVO implements ResourceDetail {
     @Id
     @GeneratedValue(strategy=GenerationType.IDENTITY)
     @Column(name="id")
     private long id;
 
     @Column(name="volume_id")
-    private long volumeId;
+    private long resourceId;
 
     @Column(name="name")
     private String name;
@@ -46,46 +46,29 @@ public class VolumeDetailVO implements InternalIdentity, ResourceDetail {
     public VolumeDetailVO() {}
 
     public VolumeDetailVO(long volumeId, String name, String value) {
-        this.volumeId = volumeId;
+        this.resourceId = volumeId;
         this.name = name;
         this.value = value;
     }
 
+    @Override
     public long getId() {
         return id;
     }
 
-    public long getVolumeId() {
-        return volumeId;
-    }
-
+    @Override
     public String getName() {
         return name;
     }
 
+    @Override
     public String getValue() {
         return value;
     }
 
-    public void setId(long id) {
-        this.id = id;
-    }
-
-    public void setVolumeId(long volumeId) {
-        this.volumeId = volumeId;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public void setValue(String value) {
-        this.value = value;
-    }
-
     @Override
-    public long getResourceDetail() {
-        return volumeId;
+    public long getResourceId() {
+        return resourceId;
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/0fb4d9d5/engine/schema/src/com/cloud/storage/dao/VMTemplateDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/storage/dao/VMTemplateDaoImpl.java b/engine/schema/src/com/cloud/storage/dao/VMTemplateDaoImpl.java
index 71ec6c7..d4bb367 100755
--- a/engine/schema/src/com/cloud/storage/dao/VMTemplateDaoImpl.java
+++ b/engine/schema/src/com/cloud/storage/dao/VMTemplateDaoImpl.java
@@ -28,11 +28,10 @@ import javax.ejb.Local;
 import javax.inject.Inject;
 import javax.naming.ConfigurationException;
 
-import org.apache.log4j.Logger;
-import org.springframework.stereotype.Component;
-
 import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreDao;
 import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreVO;
+import org.apache.log4j.Logger;
+import org.springframework.stereotype.Component;
 
 import com.cloud.dc.dao.DataCenterDao;
 import com.cloud.domain.dao.DomainDao;
@@ -44,6 +43,7 @@ import com.cloud.server.ResourceTag.ResourceObjectType;
 import com.cloud.storage.Storage;
 import com.cloud.storage.Storage.ImageFormat;
 import com.cloud.storage.Storage.TemplateType;
+import com.cloud.storage.VMTemplateDetailVO;
 import com.cloud.storage.VMTemplateStorageResourceAssoc;
 import com.cloud.storage.VMTemplateVO;
 import com.cloud.storage.VMTemplateZoneVO;
@@ -411,11 +411,17 @@ public class VMTemplateDaoImpl extends GenericDaoBase<VMTemplateVO, Long> implem
 
     @Override
     public void saveDetails(VMTemplateVO tmpl) {
-        Map<String, String> details = tmpl.getDetails();
-        if (details == null) {
+        Map<String, String> detailsStr = tmpl.getDetails();
+        if (detailsStr == null) {
             return;
         }
-        _templateDetailsDao.persist(tmpl.getId(), details);
+        List<VMTemplateDetailVO> details = new ArrayList<VMTemplateDetailVO>();
+        for (String key : detailsStr.keySet()) {
+            VMTemplateDetailVO detail = new VMTemplateDetailVO(tmpl.getId(), key, detailsStr.get(key));
+            details.add(detail);
+        }
+        
+        _templateDetailsDao.addDetails(details);
     }
 
 
@@ -744,8 +750,13 @@ public class VMTemplateDaoImpl extends GenericDaoBase<VMTemplateVO, Long> implem
             if (persist(tmplt) == null) {
                 throw new CloudRuntimeException("Failed to persist the template " + tmplt);
             }
+            
             if (tmplt.getDetails() != null) {
-                _templateDetailsDao.persist(tmplt.getId(), tmplt.getDetails());
+                List<VMTemplateDetailVO> details = new ArrayList<VMTemplateDetailVO>();
+                for (String key : tmplt.getDetails().keySet()) {
+                    details.add(new VMTemplateDetailVO(tmplt.getId(), key, tmplt.getDetails().get(key)));
+                }
+                _templateDetailsDao.addDetails(details);
             }
         }
         VMTemplateZoneVO tmpltZoneVO = _templateZoneDao.findByZoneTemplate(zoneId, tmplt.getId());

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/0fb4d9d5/engine/schema/src/com/cloud/storage/dao/VMTemplateDetailsDao.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/storage/dao/VMTemplateDetailsDao.java b/engine/schema/src/com/cloud/storage/dao/VMTemplateDetailsDao.java
index 3021b8f..aa7ce4b 100644
--- a/engine/schema/src/com/cloud/storage/dao/VMTemplateDetailsDao.java
+++ b/engine/schema/src/com/cloud/storage/dao/VMTemplateDetailsDao.java
@@ -16,21 +16,10 @@
 // under the License.
 package com.cloud.storage.dao;
 
-import java.util.Map;
-
+import com.cloud.dc.dao.ResourceDetailDao;
 import com.cloud.storage.VMTemplateDetailVO;
 import com.cloud.utils.db.GenericDao;
 
-public interface VMTemplateDetailsDao extends GenericDao<VMTemplateDetailVO, Long> {
-    Map<String, String> findDetails(long templateId);
-
-    void persist(long templateId, Map<String, String> details);
-
-    VMTemplateDetailVO findDetail(long templateId, String name);
-
-    void deleteDetails(long vmId);
-    
-    void addTemplateDetail(long templateId, String key, String value);
-    
-    void removeDetails(long templateId, String key);
+public interface VMTemplateDetailsDao extends GenericDao<VMTemplateDetailVO, Long>, ResourceDetailDao<VMTemplateDetailVO> {
+  
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/0fb4d9d5/engine/schema/src/com/cloud/storage/dao/VMTemplateDetailsDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/storage/dao/VMTemplateDetailsDaoImpl.java b/engine/schema/src/com/cloud/storage/dao/VMTemplateDetailsDaoImpl.java
index f1af0d0..007f9ca 100644
--- a/engine/schema/src/com/cloud/storage/dao/VMTemplateDetailsDaoImpl.java
+++ b/engine/schema/src/com/cloud/storage/dao/VMTemplateDetailsDaoImpl.java
@@ -16,108 +16,14 @@
 // 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.springframework.stereotype.Component;
 
+import com.cloud.dc.dao.ResourceDetailDaoImpl;
 import com.cloud.storage.VMTemplateDetailVO;
-import com.cloud.utils.db.GenericDaoBase;
-import com.cloud.utils.db.SearchBuilder;
-import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.TransactionLegacy;
 
 @Component
 @Local(value = VMTemplateDetailsDao.class)
-public class VMTemplateDetailsDaoImpl extends GenericDaoBase<VMTemplateDetailVO, Long> implements VMTemplateDetailsDao {
-
-    protected final SearchBuilder<VMTemplateDetailVO> TemplateSearch;
-    protected final SearchBuilder<VMTemplateDetailVO> DetailSearch;
-
-    public VMTemplateDetailsDaoImpl() {
-        TemplateSearch = createSearchBuilder();
-        TemplateSearch.and("templateId", TemplateSearch.entity().getTemplateId(), SearchCriteria.Op.EQ);
-        TemplateSearch.done();
-
-        DetailSearch = createSearchBuilder();
-        DetailSearch.and("templateId", DetailSearch.entity().getTemplateId(), SearchCriteria.Op.EQ);
-        DetailSearch.and("name", DetailSearch.entity().getName(), SearchCriteria.Op.EQ);
-        DetailSearch.done();
-    }
-
-    @Override
-    public void deleteDetails(long templateId) {
-        SearchCriteria<VMTemplateDetailVO> sc = TemplateSearch.create();
-        sc.setParameters("templateId", templateId);
-
-        List<VMTemplateDetailVO> results = search(sc, null);
-        for (VMTemplateDetailVO result : results) {
-            remove(result.getId());
-        }
-    }
-
-    @Override
-    public VMTemplateDetailVO findDetail(long templateId, String name) {
-        SearchCriteria<VMTemplateDetailVO> sc = DetailSearch.create();
-        sc.setParameters("templateId", templateId);
-        sc.setParameters("name", name);
-
-        return findOneBy(sc);
-    }
-
-    @Override
-    public Map<String, String> findDetails(long templateId) {
-        SearchCriteria<VMTemplateDetailVO> sc = TemplateSearch.create();
-        sc.setParameters("templateId", templateId);
-
-        List<VMTemplateDetailVO> results = search(sc, null);
-        Map<String, String> details = new HashMap<String, String>(results.size());
-        for (VMTemplateDetailVO result : results) {
-            details.put(result.getName(), result.getValue());
-        }
-
-        return details;
-    }
-
-    @Override
-    public void persist(long templateId, Map<String, String> details) {
-        TransactionLegacy txn = TransactionLegacy.currentTxn();
-        txn.start();
-        SearchCriteria<VMTemplateDetailVO> sc = TemplateSearch.create();
-        sc.setParameters("templateId", templateId);
-        expunge(sc);
-
-        for (Map.Entry<String, String> detail : details.entrySet()) {
-            VMTemplateDetailVO vo = new VMTemplateDetailVO(templateId, detail.getKey(), detail.getValue());
-            persist(vo);
-        }
-        txn.commit();
-    }
-    
-    @Override
-    public void addTemplateDetail(long templateId, String key, String value) {
-        VMTemplateDetailVO detail = findDetail(templateId, key);
-        if (detail == null) {
-            VMTemplateDetailVO newEntry = new VMTemplateDetailVO(templateId, key, value);
-            persist(newEntry);
-        } else {
-            detail.setValue(value);
-            update(detail.getId(), detail);
-        }
-    }
-    
-    @Override
-    public void removeDetails(long templateId, String key) {
-        if(key != null){
-            VMTemplateDetailVO detail = findDetail(templateId, key);
-            if(detail != null){
-                remove(detail.getId());
-            }
-        } else {
-            deleteDetails(templateId);
-        }
-    }
+public class VMTemplateDetailsDaoImpl extends ResourceDetailDaoImpl<VMTemplateDetailVO> implements VMTemplateDetailsDao {
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/0fb4d9d5/engine/schema/src/com/cloud/storage/dao/VolumeDetailsDao.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/storage/dao/VolumeDetailsDao.java b/engine/schema/src/com/cloud/storage/dao/VolumeDetailsDao.java
index 4e786ba..635ca97 100644
--- a/engine/schema/src/com/cloud/storage/dao/VolumeDetailsDao.java
+++ b/engine/schema/src/com/cloud/storage/dao/VolumeDetailsDao.java
@@ -16,21 +16,10 @@
 // under the License.
 package com.cloud.storage.dao;
 
-import java.util.List;
-import java.util.Map;
-
+import com.cloud.dc.dao.ResourceDetailDao;
 import com.cloud.storage.VolumeDetailVO;
 import com.cloud.utils.db.GenericDao;
 
-public interface VolumeDetailsDao extends GenericDao<VolumeDetailVO, Long> {
-    List<VolumeDetailVO> findDetails(long volumeId);
-
-    void persist(long vmId, Map<String, String> details);
-
-    VolumeDetailVO findDetail(long vmId, String name);
-
-    void deleteDetails(long vmId);
-
-    public void removeDetails(long volumeId, String key);
+public interface VolumeDetailsDao extends GenericDao<VolumeDetailVO, Long>, ResourceDetailDao<VolumeDetailVO> {
 
-    }
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/0fb4d9d5/engine/schema/src/com/cloud/storage/dao/VolumeDetailsDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/storage/dao/VolumeDetailsDaoImpl.java b/engine/schema/src/com/cloud/storage/dao/VolumeDetailsDaoImpl.java
index 54158f5..d264394 100644
--- a/engine/schema/src/com/cloud/storage/dao/VolumeDetailsDaoImpl.java
+++ b/engine/schema/src/com/cloud/storage/dao/VolumeDetailsDaoImpl.java
@@ -16,99 +16,15 @@
 // under the License.
 package com.cloud.storage.dao;
 
-import java.util.List;
-import java.util.Map;
-
 import javax.ejb.Local;
 
-import com.cloud.storage.VolumeDetailVO;
 import org.springframework.stereotype.Component;
 
-import com.cloud.utils.db.GenericDaoBase;
-import com.cloud.utils.db.SearchBuilder;
-import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.TransactionLegacy;
+import com.cloud.dc.dao.ResourceDetailDaoImpl;
+import com.cloud.storage.VolumeDetailVO;
 
 @Component
 @Local(value=VolumeDetailsDao.class)
-public class VolumeDetailsDaoImpl extends GenericDaoBase<VolumeDetailVO, Long> implements VolumeDetailsDao {
-    protected final SearchBuilder<VolumeDetailVO> VolumeSearch;
-    protected final SearchBuilder<VolumeDetailVO> DetailSearch;
-    protected final SearchBuilder<VolumeDetailVO> VolumeDetailSearch;
-
-    public VolumeDetailsDaoImpl() {
-        VolumeSearch = createSearchBuilder();
-        VolumeSearch.and("volumeId", VolumeSearch.entity().getVolumeId(), SearchCriteria.Op.EQ);
-        VolumeSearch.done();
-
-        DetailSearch = createSearchBuilder();
-        DetailSearch.and("volumeId", DetailSearch.entity().getVolumeId(), SearchCriteria.Op.EQ);
-        DetailSearch.and("name", DetailSearch.entity().getName(), SearchCriteria.Op.EQ);
-        DetailSearch.done();
-
-        VolumeDetailSearch = createSearchBuilder();
-        VolumeDetailSearch.and("volumeId", VolumeDetailSearch.entity().getVolumeId(), SearchCriteria.Op.EQ);
-        VolumeDetailSearch.and("name", VolumeDetailSearch.entity().getName(), SearchCriteria.Op.IN);
-        VolumeDetailSearch.done();
-
-    }
-
-    @Override
-    public void deleteDetails(long volumeId) {
-        SearchCriteria<VolumeDetailVO> sc = VolumeSearch.create();
-        sc.setParameters("volumeId", volumeId);
-
-        List<VolumeDetailVO> results = search(sc, null);
-        for (VolumeDetailVO result : results) {
-            remove(result.getId());
-        }
-    }
-
-    @Override
-    public VolumeDetailVO findDetail(long volumeId, String name) {
-        SearchCriteria<VolumeDetailVO> sc = DetailSearch.create();
-        sc.setParameters("volumeId", volumeId);
-        sc.setParameters("name", name);
-
-        return findOneBy(sc);
-    }
-
-    @Override
-    public void removeDetails(long volumeId, String key) {
-
-        if(key != null){
-            VolumeDetailVO detail = findDetail(volumeId, key);
-            if(detail != null){
-                remove(detail.getId());
-            }
-        }else {
-           deleteDetails(volumeId);
-        }
-
-    }
-
-    @Override
-    public List<VolumeDetailVO> findDetails(long volumeId) {
-        SearchCriteria<VolumeDetailVO> sc = VolumeSearch.create();
-        sc.setParameters("volumeId", volumeId);
-
-        List<VolumeDetailVO> results = search(sc, null);
-        return results;
-    }
-
-    @Override
-    public void persist(long volumeId, Map<String, String> details) {
-        TransactionLegacy txn = TransactionLegacy.currentTxn();
-        txn.start();
-        SearchCriteria<VolumeDetailVO> sc = VolumeSearch.create();
-        sc.setParameters("volumeId", volumeId);
-        expunge(sc);
-
-        for (Map.Entry<String, String> detail : details.entrySet()) {
-            VolumeDetailVO vo = new VolumeDetailVO(volumeId, detail.getKey(), detail.getValue());
-            persist(vo);
-        }
-        txn.commit();
-    }
+public class VolumeDetailsDaoImpl extends ResourceDetailDaoImpl<VolumeDetailVO> implements VolumeDetailsDao {
 
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/0fb4d9d5/engine/schema/src/com/cloud/vm/NicDetailVO.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/vm/NicDetailVO.java b/engine/schema/src/com/cloud/vm/NicDetailVO.java
index 5d05501..4be5723 100644
--- a/engine/schema/src/com/cloud/vm/NicDetailVO.java
+++ b/engine/schema/src/com/cloud/vm/NicDetailVO.java
@@ -23,19 +23,18 @@ import javax.persistence.GenerationType;
 import javax.persistence.Id;
 import javax.persistence.Table;
 
-import org.apache.cloudstack.api.InternalIdentity;
 import org.apache.cloudstack.api.ResourceDetail;
 
 @Entity
 @Table(name="nic_details")
-public class NicDetailVO implements InternalIdentity, ResourceDetail {
+public class NicDetailVO implements ResourceDetail {
     @Id
     @GeneratedValue(strategy=GenerationType.IDENTITY)
     @Column(name="id")
     private long id;
 
     @Column(name="nic_id")
-    private long nicId;
+    private long resourceId;
 
     @Column(name="name")
     private String name;
@@ -46,46 +45,29 @@ public class NicDetailVO implements InternalIdentity, ResourceDetail {
     public NicDetailVO() {}
 
     public NicDetailVO(long nicId, String name, String value) {
-        this.nicId = nicId;
+        this.resourceId = nicId;
         this.name = name;
         this.value = value;
     }
 
+    @Override
     public long getId() {
         return id;
     }
 
-    public long getNicId() {
-        return nicId;
-    }
-
+    @Override
     public String getName() {
         return name;
     }
 
+    @Override
     public String getValue() {
         return value;
     }
 
-    public void setId(long id) {
-        this.id = id;
-    }
-
-    public void setNicId(long nicId) {
-        this.nicId = nicId;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public void setValue(String value) {
-        this.value = value;
-    }
-
     @Override
-    public long getResourceDetail() {
-        return nicId;
+    public long getResourceId() {
+        return resourceId;
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/0fb4d9d5/engine/schema/src/com/cloud/vm/UserVmDetailVO.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/vm/UserVmDetailVO.java b/engine/schema/src/com/cloud/vm/UserVmDetailVO.java
index 5811ab4..62c924b 100644
--- a/engine/schema/src/com/cloud/vm/UserVmDetailVO.java
+++ b/engine/schema/src/com/cloud/vm/UserVmDetailVO.java
@@ -23,19 +23,18 @@ import javax.persistence.GenerationType;
 import javax.persistence.Id;
 import javax.persistence.Table;
 
-import org.apache.cloudstack.api.InternalIdentity;
 import org.apache.cloudstack.api.ResourceDetail;
 
 @Entity
 @Table(name="user_vm_details")
-public class UserVmDetailVO implements InternalIdentity, ResourceDetail {
+public class UserVmDetailVO implements ResourceDetail {
     @Id
     @GeneratedValue(strategy=GenerationType.IDENTITY)
     @Column(name="id")
     private long id;
     
     @Column(name="vm_id")
-    private long vmId;
+    private long resourceId;
     
     @Column(name="name")
     private String name;
@@ -46,46 +45,29 @@ public class UserVmDetailVO implements InternalIdentity, ResourceDetail {
     public UserVmDetailVO() {}
     
     public UserVmDetailVO(long vmId, String name, String value) {
-    	this.vmId = vmId;
+    	this.resourceId = vmId;
     	this.name = name;
     	this.value = value;
     }
 
+    @Override
 	public long getId() {
 		return id;
 	}
 
-	public long getVmId() {
-		return vmId;
-	}
-
+	@Override
 	public String getName() {
 		return name;
 	}
 
+	@Override
 	public String getValue() {
 		return value;
 	}
 
-	public void setId(long id) {
-		this.id = id;
-	}
-
-	public void setVmId(long vmId) {
-		this.vmId = vmId;
-	}
-
-	public void setName(String name) {
-		this.name = name;
-	}
-
-	public void setValue(String value) {
-		this.value = value;
-	}
-
     @Override
-    public long getResourceDetail() {
-        return vmId;
+    public long getResourceId() {
+        return resourceId;
     }
 	
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/0fb4d9d5/engine/schema/src/com/cloud/vm/dao/NicDetailDao.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/vm/dao/NicDetailDao.java b/engine/schema/src/com/cloud/vm/dao/NicDetailDao.java
index 66bff16..f960ecf 100644
--- a/engine/schema/src/com/cloud/vm/dao/NicDetailDao.java
+++ b/engine/schema/src/com/cloud/vm/dao/NicDetailDao.java
@@ -16,20 +16,9 @@
 // under the License.
 package com.cloud.vm.dao;
 
-import java.util.List;
-import java.util.Map;
-
+import com.cloud.dc.dao.ResourceDetailDao;
 import com.cloud.utils.db.GenericDao;
 import com.cloud.vm.NicDetailVO;
 
-public interface NicDetailDao extends GenericDao<NicDetailVO, Long> {
-    List<NicDetailVO> findDetails(long nicId);
-
-    void persist(long nicId, Map<String, String> details);
-
-    NicDetailVO findDetail(long nicId, String name);
-
-    void deleteDetails(long nicId);
-
-    void removeDetails(long nicId, String key);
+public interface NicDetailDao extends GenericDao<NicDetailVO, Long>, ResourceDetailDao<NicDetailVO> {
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/0fb4d9d5/engine/schema/src/com/cloud/vm/dao/NicDetailDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/vm/dao/NicDetailDaoImpl.java b/engine/schema/src/com/cloud/vm/dao/NicDetailDaoImpl.java
index 4c1d59c..65a327f 100644
--- a/engine/schema/src/com/cloud/vm/dao/NicDetailDaoImpl.java
+++ b/engine/schema/src/com/cloud/vm/dao/NicDetailDaoImpl.java
@@ -16,88 +16,15 @@
 // under the License.
 package com.cloud.vm.dao;
 
-import com.cloud.utils.db.GenericDaoBase;
-import com.cloud.utils.db.SearchBuilder;
-import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.TransactionLegacy;
-import com.cloud.vm.NicDetailVO;
+import javax.ejb.Local;
+
 import org.springframework.stereotype.Component;
 
-import javax.ejb.Local;
-import java.util.List;
-import java.util.Map;
+import com.cloud.dc.dao.ResourceDetailDaoImpl;
+import com.cloud.vm.NicDetailVO;
 
 @Component
 @Local (value={NicDetailDao.class})
-public class NicDetailDaoImpl extends GenericDaoBase<NicDetailVO, Long> implements NicDetailDao {
-    protected final SearchBuilder<NicDetailVO> NicSearch;
-    protected final SearchBuilder<NicDetailVO> DetailSearch;
-
-    public NicDetailDaoImpl() {
-        NicSearch = createSearchBuilder();
-        NicSearch.and("nicId", NicSearch.entity().getNicId(), SearchCriteria.Op.EQ);
-        NicSearch.done();
-
-        DetailSearch = createSearchBuilder();
-        DetailSearch.and("nicId", DetailSearch.entity().getNicId(), SearchCriteria.Op.EQ);
-        DetailSearch.and("name", DetailSearch.entity().getName(), SearchCriteria.Op.EQ);
-        DetailSearch.done();
-    }
-
-    @Override
-    public void deleteDetails(long nicId) {
-        SearchCriteria<NicDetailVO> sc = NicSearch.create();
-        sc.setParameters("nicId", nicId);
-
-        List<NicDetailVO> results = search(sc, null);
-        for (NicDetailVO result : results) {
-            remove(result.getId());
-        }
-    }
-
-    @Override
-    public NicDetailVO findDetail(long nicId, String name) {
-        SearchCriteria<NicDetailVO> sc = DetailSearch.create();
-        sc.setParameters("nicId", nicId);
-        sc.setParameters("name", name);
-
-        return findOneBy(sc);
-    }
-
-    @Override
-    public List<NicDetailVO> findDetails(long nicId) {
-        SearchCriteria<NicDetailVO> sc = NicSearch.create();
-        sc.setParameters("nicId", nicId);
-
-        List<NicDetailVO> results = search(sc, null);
-        return results;
-    }
-
-    @Override
-    public void persist(long nicId, Map<String, String> details) {
-        TransactionLegacy txn = TransactionLegacy.currentTxn();
-        txn.start();
-        SearchCriteria<NicDetailVO> sc = NicSearch.create();
-        sc.setParameters("nicId", nicId);
-        expunge(sc);
-
-        for (Map.Entry<String, String> detail : details.entrySet()) {
-            NicDetailVO vo = new NicDetailVO(nicId, detail.getKey(), detail.getValue());
-            persist(vo);
-        }
-        txn.commit();
-    }
-
-    @Override
-    public void removeDetails(long nicId, String key) {
-        if(key != null){
-            NicDetailVO detail = findDetail(nicId, key);
-            if(detail != null){
-                remove(detail.getId());
-            }
-        }else {
-            deleteDetails(nicId);
-        }
-    }
+public class NicDetailDaoImpl extends ResourceDetailDaoImpl<NicDetailVO> implements NicDetailDao {
     
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/0fb4d9d5/engine/schema/src/com/cloud/vm/dao/UserVmDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/vm/dao/UserVmDaoImpl.java b/engine/schema/src/com/cloud/vm/dao/UserVmDaoImpl.java
index 70b04e3..1992ef47 100755
--- a/engine/schema/src/com/cloud/vm/dao/UserVmDaoImpl.java
+++ b/engine/schema/src/com/cloud/vm/dao/UserVmDaoImpl.java
@@ -31,14 +31,10 @@ import javax.ejb.Local;
 import javax.inject.Inject;
 
 import org.apache.log4j.Logger;
-import org.springframework.stereotype.Component;
 
-import com.cloud.configuration.Resource;
 import com.cloud.server.ResourceTag.ResourceObjectType;
 import com.cloud.tags.dao.ResourceTagDao;
-import com.cloud.tags.dao.ResourceTagsDaoImpl;
 import com.cloud.user.Account;
-
 import com.cloud.utils.db.Attribute;
 import com.cloud.utils.db.GenericDaoBase;
 import com.cloud.utils.db.GenericSearchBuilder;
@@ -49,6 +45,7 @@ import com.cloud.utils.db.SearchCriteria.Func;
 import com.cloud.utils.db.TransactionLegacy;
 import com.cloud.utils.exception.CloudRuntimeException;
 import com.cloud.vm.NicVO;
+import com.cloud.vm.UserVmDetailVO;
 import com.cloud.vm.UserVmVO;
 import com.cloud.vm.VirtualMachine;
 import com.cloud.vm.VirtualMachine.State;
@@ -341,11 +338,16 @@ public class UserVmDaoImpl extends GenericDaoBase<UserVmVO, Long> implements Use
 
 	@Override
     public void saveDetails(UserVmVO vm) {
-        Map<String, String> details = vm.getDetails();
-        if (details == null) {
+        Map<String, String> detailsStr = vm.getDetails();
+        if (detailsStr == null) {
             return;
         }
-        _detailsDao.persist(vm.getId(), details);
+        List<UserVmDetailVO> details = new ArrayList<UserVmDetailVO>();
+        for (String key : detailsStr.keySet()) {
+            details.add(new UserVmDetailVO(vm.getId(), key, detailsStr.get(key)));
+        }
+        
+        _detailsDao.addDetails(details);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/0fb4d9d5/engine/schema/src/com/cloud/vm/dao/UserVmDetailsDao.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/vm/dao/UserVmDetailsDao.java b/engine/schema/src/com/cloud/vm/dao/UserVmDetailsDao.java
index ce36c0b..a0249e6 100644
--- a/engine/schema/src/com/cloud/vm/dao/UserVmDetailsDao.java
+++ b/engine/schema/src/com/cloud/vm/dao/UserVmDetailsDao.java
@@ -16,24 +16,9 @@
 // under the License.
 package com.cloud.vm.dao;
 
-import java.util.List;
-import java.util.Map;
-
+import com.cloud.dc.dao.ResourceDetailDao;
 import com.cloud.utils.db.GenericDao;
 import com.cloud.vm.UserVmDetailVO;
 
-public interface UserVmDetailsDao extends GenericDao<UserVmDetailVO, Long> {
-    Map<String, String> findDetails(long vmId);
-
-    public List<UserVmDetailVO> findDetailsList(long vmId);
-
-    void persist(long vmId, Map<String, String> details);
-    
-    UserVmDetailVO findDetail(long vmId, String name);
-    
-	void deleteDetails(long vmId);
-	
-    void addVmDetail(long vmId, String key, String value);
-    
-    void removeDetails(long vmId, String key);
+public interface UserVmDetailsDao extends GenericDao<UserVmDetailVO, Long>, ResourceDetailDao<UserVmDetailVO> {
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/0fb4d9d5/engine/schema/src/com/cloud/vm/dao/UserVmDetailsDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/vm/dao/UserVmDetailsDaoImpl.java b/engine/schema/src/com/cloud/vm/dao/UserVmDetailsDaoImpl.java
index 67b7f81..38b691d 100644
--- a/engine/schema/src/com/cloud/vm/dao/UserVmDetailsDaoImpl.java
+++ b/engine/schema/src/com/cloud/vm/dao/UserVmDetailsDaoImpl.java
@@ -16,116 +16,15 @@
 // under the License.
 package com.cloud.vm.dao;
 
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
 import javax.ejb.Local;
 
 import org.springframework.stereotype.Component;
 
-import com.cloud.utils.db.GenericDaoBase;
-import com.cloud.utils.db.SearchBuilder;
-import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.TransactionLegacy;
+import com.cloud.dc.dao.ResourceDetailDaoImpl;
 import com.cloud.vm.UserVmDetailVO;
 
 @Component
 @Local(value=UserVmDetailsDao.class)
-public class UserVmDetailsDaoImpl extends GenericDaoBase<UserVmDetailVO, Long> implements UserVmDetailsDao {
-    protected final SearchBuilder<UserVmDetailVO> VmSearch;
-    protected final SearchBuilder<UserVmDetailVO> DetailSearch;
-
-	public UserVmDetailsDaoImpl() {
-		VmSearch = createSearchBuilder();
-		VmSearch.and("vmId", VmSearch.entity().getVmId(), SearchCriteria.Op.EQ);
-        VmSearch.done();
-		
-		DetailSearch = createSearchBuilder();
-        DetailSearch.and("vmId", DetailSearch.entity().getVmId(), SearchCriteria.Op.EQ);
-        DetailSearch.and("name", DetailSearch.entity().getName(), SearchCriteria.Op.EQ);
-        DetailSearch.done();
-	}
-    
-	@Override
-	public void deleteDetails(long vmId) {
-        SearchCriteria<UserVmDetailVO> sc = VmSearch.create();
-        sc.setParameters("vmId", vmId);
-        
-        List<UserVmDetailVO> results = search(sc, null);
-        for (UserVmDetailVO result : results) {
-        	remove(result.getId());
-        }		
-	}
-
-	@Override
-	public UserVmDetailVO findDetail(long vmId, String name) {
-        SearchCriteria<UserVmDetailVO> sc = DetailSearch.create();
-        sc.setParameters("vmId", vmId);
-        sc.setParameters("name", name);
-		
-        return findOneBy(sc);
-	}
-
-	@Override
-	public Map<String, String> findDetails(long vmId) {
-        SearchCriteria<UserVmDetailVO> sc = VmSearch.create();
-        sc.setParameters("vmId", vmId);
-        
-        List<UserVmDetailVO> results = search(sc, null);
-        Map<String, String> details = new HashMap<String, String>(results.size());
-        for (UserVmDetailVO result : results) {
-            details.put(result.getName(), result.getValue());
-        }
-        
-        return details;
-	}
-
-    @Override
-    public List<UserVmDetailVO> findDetailsList(long vmId) {
-        SearchCriteria<UserVmDetailVO> sc = VmSearch.create();
-        sc.setParameters("vmId", vmId);
-
-        List<UserVmDetailVO> results = search(sc, null);
-        return results;
-    }
-
-	@Override
-	public void persist(long vmId, Map<String, String> details) {
-        TransactionLegacy txn = TransactionLegacy.currentTxn();
-        txn.start();
-        SearchCriteria<UserVmDetailVO> sc = VmSearch.create();
-        sc.setParameters("vmId", vmId);
-        expunge(sc);
-        
-        for (Map.Entry<String, String> detail : details.entrySet()) {
-            UserVmDetailVO vo = new UserVmDetailVO(vmId, detail.getKey(), detail.getValue());
-            persist(vo);
-        }
-        txn.commit();		
-	}
-
-    @Override
-    public void addVmDetail(long vmId, String key, String value) {
-        UserVmDetailVO detail = findDetail(vmId, key);
-        if (detail == null) {
-            UserVmDetailVO newEntry = new UserVmDetailVO(vmId, key, value);
-            persist(newEntry);
-        } else {
-            detail.setValue(value);
-            update(detail.getId(), detail);
-        }
-    }
+public class UserVmDetailsDaoImpl extends ResourceDetailDaoImpl<UserVmDetailVO> implements UserVmDetailsDao {
 
-    @Override
-    public void removeDetails(long vmId, String key) {
-        if(key != null){
-            UserVmDetailVO detail = findDetail(vmId, key);
-            if(detail != null){
-                remove(detail.getId());
-            }
-        }else {
-            deleteDetails(vmId);
-        }
-    }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/0fb4d9d5/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 a14fdba..36fddf4 100755
--- a/server/src/com/cloud/api/ApiDBUtils.java
+++ b/server/src/com/cloud/api/ApiDBUtils.java
@@ -116,6 +116,7 @@ import com.cloud.dc.ClusterDetailsDao;
 import com.cloud.dc.ClusterDetailsVO;
 import com.cloud.dc.ClusterVO;
 import com.cloud.dc.DataCenter;
+import com.cloud.dc.DataCenterDetailVO;
 import com.cloud.dc.DataCenterVO;
 import com.cloud.dc.HostPodVO;
 import com.cloud.dc.Vlan;
@@ -125,6 +126,7 @@ import com.cloud.dc.dao.ClusterDao;
 import com.cloud.dc.dao.DataCenterDao;
 import com.cloud.dc.dao.DataCenterDetailsDao;
 import com.cloud.dc.dao.HostPodDao;
+import com.cloud.dc.dao.ResourceDetailDaoImpl;
 import com.cloud.dc.dao.VlanDao;
 import com.cloud.domain.DomainVO;
 import com.cloud.domain.dao.DomainDao;

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/0fb4d9d5/server/src/com/cloud/api/query/QueryManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/api/query/QueryManagerImpl.java b/server/src/com/cloud/api/query/QueryManagerImpl.java
index e92680f..8cf09bf 100644
--- a/server/src/com/cloud/api/query/QueryManagerImpl.java
+++ b/server/src/com/cloud/api/query/QueryManagerImpl.java
@@ -3273,13 +3273,13 @@ public class QueryManagerImpl extends ManagerBase implements QueryService {
         
         if (resourceType == ResourceTag.ResourceObjectType.Volume) {
             if (key == null) {
-                detailList = _volumeDetailDao.findDetails(id);
+                detailList = _volumeDetailDao.findDetailsList(id);
             } else {
                 requestedDetail = _volumeDetailDao.findDetail(id, key);
             }
         } else if (resourceType == ResourceTag.ResourceObjectType.Nic){
             if (key == null) {
-                detailList = _nicDetailDao.findDetails(id);
+                detailList = _nicDetailDao.findDetailsList(id);
             } else {
                 requestedDetail = _nicDetailDao.findDetail(id, key);
             }
@@ -3297,7 +3297,7 @@ public class QueryManagerImpl extends ManagerBase implements QueryService {
             }
         } else if (resourceType == ResourceObjectType.Network){
             if (key == null) {
-                detailList = _networkDetailsDao.findDetails(id);
+                detailList = _networkDetailsDao.findDetailsList(id);
             } else {
                 requestedDetail = _networkDetailsDao.findDetail(id, key);
             }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/0fb4d9d5/server/src/com/cloud/configuration/ConfigurationManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java
index 84ea2d2..6af50df 100755
--- a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java
+++ b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java
@@ -35,7 +35,6 @@ import javax.ejb.Local;
 import javax.inject.Inject;
 import javax.naming.ConfigurationException;
 
-import org.apache.log4j.Logger;
 import org.apache.cloudstack.acl.SecurityChecker;
 import org.apache.cloudstack.affinity.AffinityGroup;
 import org.apache.cloudstack.affinity.AffinityGroupService;
@@ -83,6 +82,7 @@ import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
 import org.apache.cloudstack.storage.datastore.db.StoragePoolDetailVO;
 import org.apache.cloudstack.storage.datastore.db.StoragePoolDetailsDao;
 import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
+import org.apache.log4j.Logger;
 
 import com.cloud.alert.AlertManager;
 import com.cloud.api.ApiDBUtils;
@@ -95,10 +95,10 @@ import com.cloud.dc.ClusterDetailsVO;
 import com.cloud.dc.ClusterVO;
 import com.cloud.dc.DataCenter;
 import com.cloud.dc.DataCenter.NetworkType;
+import com.cloud.dc.DataCenterDetailVO;
 import com.cloud.dc.DataCenterIpAddressVO;
 import com.cloud.dc.DataCenterLinkLocalIpAddressVO;
 import com.cloud.dc.DataCenterVO;
-import com.cloud.dc.DataCenterDetailVO;
 import com.cloud.dc.DedicatedResourceVO;
 import com.cloud.dc.HostPodVO;
 import com.cloud.dc.Pod;
@@ -109,9 +109,9 @@ import com.cloud.dc.VlanVO;
 import com.cloud.dc.dao.AccountVlanMapDao;
 import com.cloud.dc.dao.ClusterDao;
 import com.cloud.dc.dao.DataCenterDao;
+import com.cloud.dc.dao.DataCenterDetailsDao;
 import com.cloud.dc.dao.DataCenterIpAddressDao;
 import com.cloud.dc.dao.DataCenterLinkLocalIpAddressDao;
-import com.cloud.dc.dao.DataCenterDetailsDao;
 import com.cloud.dc.dao.DedicatedResourceDao;
 import com.cloud.dc.dao.HostPodDao;
 import com.cloud.dc.dao.PodVlanMapDao;
@@ -167,6 +167,7 @@ import com.cloud.projects.Project;
 import com.cloud.projects.ProjectManager;
 import com.cloud.server.ConfigurationServer;
 import com.cloud.server.ManagementService;
+import com.cloud.service.ServiceOfferingDetailsVO;
 import com.cloud.service.ServiceOfferingVO;
 import com.cloud.service.dao.ServiceOfferingDao;
 import com.cloud.service.dao.ServiceOfferingDetailsDao;
@@ -450,14 +451,8 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
                 if (zone == null) {
                     throw new InvalidParameterValueException("unable to find zone by id " + resourceId);
                 }
-                DataCenterDetailVO dcDetailVO = _dcDetailsDao.findDetail(resourceId, name.toLowerCase());
-                if (dcDetailVO == null) {
-                    dcDetailVO = new DataCenterDetailVO(resourceId, name, value);
-                    _dcDetailsDao.persist(dcDetailVO);
-                } else {
-                    dcDetailVO.setValue(value);
-                    _dcDetailsDao.update(dcDetailVO.getId(), dcDetailVO);
-                }
+                DataCenterDetailVO dcDetailVO = new DataCenterDetailVO(resourceId, name, value);
+                _dcDetailsDao.addDetail(dcDetailVO);
                 break;
             case Cluster:
                 ClusterVO cluster = _clusterDao.findById(resourceId);
@@ -2113,7 +2108,12 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
 
         if ((offering = _serviceOfferingDao.persist(offering)) != null) {
             if (details != null) {
-                _serviceOfferingDetailsDao.persist(offering.getId(), details);
+                List<ServiceOfferingDetailsVO> detailsVO = new ArrayList<ServiceOfferingDetailsVO>();
+                for (String key : details.keySet()) {
+                    detailsVO.add(new ServiceOfferingDetailsVO(offering.getId(), key, details.get(key)));
+                }
+                
+                _serviceOfferingDetailsDao.addDetails(detailsVO);
             }
             CallContext.current().setEventDetails("Service offering id=" + offering.getId());
             return offering;

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/0fb4d9d5/server/src/com/cloud/hypervisor/CloudZonesStartupProcessor.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/hypervisor/CloudZonesStartupProcessor.java b/server/src/com/cloud/hypervisor/CloudZonesStartupProcessor.java
index c056c67..8761b6b 100755
--- a/server/src/com/cloud/hypervisor/CloudZonesStartupProcessor.java
+++ b/server/src/com/cloud/hypervisor/CloudZonesStartupProcessor.java
@@ -23,11 +23,11 @@ import javax.ejb.Local;
 import javax.inject.Inject;
 import javax.naming.ConfigurationException;
 
+import org.apache.cloudstack.api.ResourceDetail;
+import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
 import org.apache.log4j.Logger;
 import org.springframework.stereotype.Component;
 
-import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
-
 import com.cloud.agent.AgentManager;
 import com.cloud.agent.StartupCommandProcessor;
 import com.cloud.agent.api.StartupCommand;
@@ -38,7 +38,6 @@ import com.cloud.configuration.ConfigurationManager;
 import com.cloud.configuration.ZoneConfig;
 import com.cloud.dc.ClusterVO;
 import com.cloud.dc.DataCenterVO;
-import com.cloud.dc.DataCenterDetailVO;
 import com.cloud.dc.HostPodVO;
 import com.cloud.dc.dao.ClusterDao;
 import com.cloud.dc.dao.DataCenterDao;
@@ -46,11 +45,9 @@ import com.cloud.dc.dao.DataCenterDetailsDao;
 import com.cloud.dc.dao.HostPodDao;
 import com.cloud.exception.ConnectionException;
 import com.cloud.host.Host;
-import com.cloud.host.Host.Type;
 import com.cloud.host.HostVO;
 import com.cloud.host.dao.HostDao;
 import com.cloud.hypervisor.Hypervisor.HypervisorType;
-import com.cloud.storage.Storage;
 import com.cloud.utils.component.AdapterBase;
 import com.cloud.utils.exception.CloudRuntimeException;
 import com.cloud.utils.net.MacAddress;
@@ -175,7 +172,7 @@ public class CloudZonesStartupProcessor extends AdapterBase implements StartupCo
     	}
         
         long zoneId = zone.getId();
-        DataCenterDetailVO maxHostsInZone = _zoneDetailsDao.findDetail(zoneId, ZoneConfig.MaxHosts.key());
+        ResourceDetail maxHostsInZone = _zoneDetailsDao.findDetail(zoneId, ZoneConfig.MaxHosts.key());
         if(maxHostsInZone != null){
         	long maxHosts = new Long(maxHostsInZone.getValue()).longValue();
         	long currentCountOfHosts = _hostDao.countRoutingHostsByDataCenter(zoneId);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/0fb4d9d5/server/src/com/cloud/metadata/ResourceMetaDataManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/metadata/ResourceMetaDataManagerImpl.java b/server/src/com/cloud/metadata/ResourceMetaDataManagerImpl.java
index 8fc7471..152e57f 100644
--- a/server/src/com/cloud/metadata/ResourceMetaDataManagerImpl.java
+++ b/server/src/com/cloud/metadata/ResourceMetaDataManagerImpl.java
@@ -37,6 +37,7 @@ import com.cloud.server.ResourceTag.ResourceObjectType;
 import com.cloud.server.TaggedResourceService;
 import com.cloud.service.ServiceOfferingDetailsVO;
 import com.cloud.service.dao.ServiceOfferingDetailsDao;
+import com.cloud.storage.VMTemplateDetailVO;
 import com.cloud.storage.VolumeDetailVO;
 import com.cloud.storage.dao.VMTemplateDetailsDao;
 import com.cloud.storage.dao.VolumeDetailsDao;
@@ -46,6 +47,7 @@ import com.cloud.utils.db.Transaction;
 import com.cloud.utils.db.TransactionCallback;
 import com.cloud.utils.db.TransactionStatus;
 import com.cloud.vm.NicDetailVO;
+import com.cloud.vm.UserVmDetailVO;
 import com.cloud.vm.dao.NicDetailDao;
 import com.cloud.vm.dao.UserVmDetailsDao;
 
@@ -111,24 +113,26 @@ public class ResourceMetaDataManagerImpl extends ManagerBase implements Resource
                         long id = _taggedResourceMgr.getResourceId(resourceId, resourceType);
                         // TODO - Have a better design here for getting the DAO.
                         if(resourceType == ResourceObjectType.Volume){
-                            VolumeDetailVO v = new VolumeDetailVO(id, key, value);
-                            _volumeDetailDao.persist(v);
+                            VolumeDetailVO detail = new VolumeDetailVO(id, key, value);
+                            _volumeDetailDao.addDetail(detail);
                         } else if (resourceType == ResourceObjectType.Nic){
-                            NicDetailVO n = new NicDetailVO(id, key, value);
-                            _nicDetailDao.persist(n);
+                            NicDetailVO detail = new NicDetailVO(id, key, value);
+                            _nicDetailDao.addDetail(detail);
                         } else if (resourceType == ResourceObjectType.Zone){
                              DataCenterDetailVO dataCenterDetail = new DataCenterDetailVO(id, key, value);
-                             _dcDetailsDao.persist(dataCenterDetail);
+                             _dcDetailsDao.addDetail(dataCenterDetail);
                         } else if (resourceType == ResourceObjectType.Network){
-                            NetworkDetailVO networkDetail = new NetworkDetailVO(id, key, value);
-                            _networkDetailsDao.persist(networkDetail);
+                            NetworkDetailVO detail = new NetworkDetailVO(id, key, value);
+                            _networkDetailsDao.addDetail(detail);
                         } else if (resourceType == ResourceObjectType.UserVm) {
-                            _userVmDetailsDao.addVmDetail(id, key, value);
+                            UserVmDetailVO detail = new UserVmDetailVO(id, key, value);
+                            _userVmDetailsDao.addDetail(detail);
                         } else if (resourceType == ResourceObjectType.Template) {
-                            _templateDetailsDao.addTemplateDetail(id, key, value);
+                             VMTemplateDetailVO detail = new VMTemplateDetailVO(id, key, value);
+                            _templateDetailsDao.addDetail(detail);
                         } else if (resourceType == ResourceObjectType.ServiceOffering) {
-                            ServiceOfferingDetailsVO entity = new ServiceOfferingDetailsVO(id, key, value);
-                            _serviceOfferingDetailsDao.persist(entity);
+                            ServiceOfferingDetailsVO detail = new ServiceOfferingDetailsVO(id, key, value);
+                            _serviceOfferingDetailsDao.addDetail(detail);
                         }
                 }
                 
@@ -152,19 +156,19 @@ public class ResourceMetaDataManagerImpl extends ManagerBase implements Resource
         
         // TODO - Have a better design here for getting the DAO.
         if (resourceType == ResourceObjectType.Volume){
-           _volumeDetailDao.removeDetails(id, key);
+           _volumeDetailDao.removeDetail(id, key);
         } else if (resourceType == ResourceObjectType.Nic){
-            _nicDetailDao.removeDetails(id, key);
+            _nicDetailDao.removeDetail(id, key);
         } else if (resourceType == ResourceObjectType.UserVm) {
-            _userVmDetailsDao.removeDetails(id, key); 
+            _userVmDetailsDao.removeDetail(id, key); 
         } else if (resourceType == ResourceObjectType.Template) {
-            _templateDetailsDao.removeDetails(id, key);
+            _templateDetailsDao.removeDetail(id, key);
         } else if (resourceType == ResourceObjectType.Zone){
-            _dcDetailsDao.removeDetails(id, key);
+            _dcDetailsDao.removeDetail(id, key);
         } else if (resourceType == ResourceObjectType.ServiceOffering) {
-            _serviceOfferingDetailsDao.removeDetails(id, key);
+            _serviceOfferingDetailsDao.removeDetail(id, key);
         } else if (resourceType == ResourceObjectType.Network) {
-            _networkDetailsDao.removeDetails(id, key);
+            _networkDetailsDao.removeDetail(id, key);
         }
 
         return true;


[14/50] [abbrv] git commit: updated refs/heads/object_store_migration to 5ec2a44

Posted by mc...@apache.org.
CLOUDSTACK-4128: UI > Infrastructure > Secondary Storage > Create Secondary Storage > Provider S3 > make "Create NFS Secondary Staging Store" checked and non-editable.


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

Branch: refs/heads/object_store_migration
Commit: 718bc37dc0333d96ef7f48c96715fe22033c1803
Parents: 9f7b488
Author: Jessica Wang <je...@apache.org>
Authored: Fri Oct 25 16:47:05 2013 -0700
Committer: Jessica Wang <je...@apache.org>
Committed: Fri Oct 25 16:47:52 2013 -0700

----------------------------------------------------------------------
 ui/scripts/system.js | 1 +
 1 file changed, 1 insertion(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/718bc37d/ui/scripts/system.js
----------------------------------------------------------------------
diff --git a/ui/scripts/system.js b/ui/scripts/system.js
index 7fb807d..8d8c02c 100644
--- a/ui/scripts/system.js
+++ b/ui/scripts/system.js
@@ -14288,6 +14288,7 @@
                                                                     $form.find('.form-item[rel=sockettimeout]').css('display', 'inline-block');
 
                                                                     $form.find('.form-item[rel=createNfsCache]').find('input').attr('checked', 'checked');
+                                                                    $form.find('.form-item[rel=createNfsCache]').find('input').attr('disabled', 'disabled');  //Create NFS staging is required for S3 at this moment. So, disallow user to uncheck "Create NFS Secondary Staging" checkbox
                                                                     $form.find('.form-item[rel=createNfsCache]').css('display', 'inline-block');
                                                                     $form.find('.form-item[rel=nfsCacheZoneid]').css('display', 'inline-block');
                                                                     $form.find('.form-item[rel=nfsCacheNfsServer]').css('display', 'inline-block');


[07/50] [abbrv] git commit: updated refs/heads/object_store_migration to 5ec2a44

Posted by mc...@apache.org.
Renamed ResourceDetailDaoImpl to ResourceDetailDaoBase


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

Branch: refs/heads/object_store_migration
Commit: 300f626d42fbb0c944517b2e548c135f7e0873c9
Parents: ad51b8e
Author: Alena Prokharchyk <al...@citrix.com>
Authored: Fri Oct 25 14:20:58 2013 -0700
Committer: Alena Prokharchyk <al...@citrix.com>
Committed: Fri Oct 25 14:21:20 2013 -0700

----------------------------------------------------------------------
 .../cloud/dc/dao/DataCenterDetailsDaoImpl.java  |   2 +-
 .../com/cloud/dc/dao/ResourceDetailDaoBase.java | 113 +++++++++++++++++++
 .../com/cloud/dc/dao/ResourceDetailDaoImpl.java | 110 ------------------
 .../network/dao/NetworkDetailsDaoImpl.java      |   4 +-
 .../dao/ServiceOfferingDetailsDaoImpl.java      |   4 +-
 .../storage/dao/VMTemplateDetailsDaoImpl.java   |   4 +-
 .../cloud/storage/dao/VolumeDetailsDaoImpl.java |   4 +-
 .../src/com/cloud/vm/dao/NicDetailDaoImpl.java  |   4 +-
 .../com/cloud/vm/dao/UserVmDetailsDaoImpl.java  |   4 +-
 server/src/com/cloud/api/ApiDBUtils.java        |   2 +-
 10 files changed, 127 insertions(+), 124 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/300f626d/engine/schema/src/com/cloud/dc/dao/DataCenterDetailsDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/dc/dao/DataCenterDetailsDaoImpl.java b/engine/schema/src/com/cloud/dc/dao/DataCenterDetailsDaoImpl.java
index b6949f5..eb9176d 100644
--- a/engine/schema/src/com/cloud/dc/dao/DataCenterDetailsDaoImpl.java
+++ b/engine/schema/src/com/cloud/dc/dao/DataCenterDetailsDaoImpl.java
@@ -26,7 +26,7 @@ import org.apache.cloudstack.framework.config.ScopedConfigStorage;
 import com.cloud.dc.DataCenterDetailVO;
 
 @Local(value=DataCenterDetailsDao.class)
-public class DataCenterDetailsDaoImpl extends ResourceDetailDaoImpl<DataCenterDetailVO> implements DataCenterDetailsDao, ScopedConfigStorage {
+public class DataCenterDetailsDaoImpl extends ResourceDetailDaoBase<DataCenterDetailVO> implements DataCenterDetailsDao, ScopedConfigStorage {
     
     public DataCenterDetailsDaoImpl() {
     }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/300f626d/engine/schema/src/com/cloud/dc/dao/ResourceDetailDaoBase.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/dc/dao/ResourceDetailDaoBase.java b/engine/schema/src/com/cloud/dc/dao/ResourceDetailDaoBase.java
new file mode 100644
index 0000000..ea8f85a
--- /dev/null
+++ b/engine/schema/src/com/cloud/dc/dao/ResourceDetailDaoBase.java
@@ -0,0 +1,113 @@
+// 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.dc.dao;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.cloudstack.api.ResourceDetail;
+
+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 abstract class ResourceDetailDaoBase<R extends ResourceDetail> extends GenericDaoBase<R, Long>{
+    private SearchBuilder<R> AllFieldsSearch;
+    
+    public ResourceDetailDaoBase() {
+        AllFieldsSearch = createSearchBuilder();
+        AllFieldsSearch.and("resourceId", AllFieldsSearch.entity().getResourceId(), SearchCriteria.Op.EQ);
+        AllFieldsSearch.and("name", AllFieldsSearch.entity().getName(), SearchCriteria.Op.EQ);
+        AllFieldsSearch.done();
+    }
+
+    public R findDetail(long resourceId, String name) {
+        SearchCriteria<R> sc = AllFieldsSearch.create();
+        sc.setParameters("resourceId", resourceId);
+        sc.setParameters("name", name);
+        
+        return findOneBy(sc);
+    }
+
+
+    public Map<String, String> findDetails(long resourceId) {
+        SearchCriteria<R> sc = AllFieldsSearch.create();
+        sc.setParameters("resourceId", resourceId);
+        
+        List<R> results = search(sc, null);
+        Map<String, String> details = new HashMap<String, String>(results.size());
+        for (R result : results) {
+            details.put(result.getName(), result.getValue());
+        }
+        return details;
+    }
+
+    public List<R> findDetailsList(long resourceId) {
+        SearchCriteria<R> sc = AllFieldsSearch.create();
+        sc.setParameters("resourceId", resourceId);
+
+        List<R> results = search(sc, null);
+        return results;
+    }
+
+
+    public void removeDetails(long resourceId) {
+        SearchCriteria<R> sc = AllFieldsSearch.create();
+        sc.setParameters("resourceId", resourceId);
+        remove(sc);
+    }
+
+    
+    public void removeDetail(long resourceId, String key) {
+        if (key != null){
+            SearchCriteria<R> sc = AllFieldsSearch.create();
+            sc.setParameters("name", key);
+            remove(sc);
+        }
+    }
+
+
+    public void addDetails(List<R> details) {
+        if (details.isEmpty()) {
+            return;
+        }
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
+        txn.start();
+        SearchCriteria<R> sc = AllFieldsSearch.create();
+        sc.setParameters("resourceId", details.get(0).getResourceId());
+        expunge(sc);
+        
+        for (R detail : details) {
+            persist(detail);
+        }
+        
+        txn.commit();
+    }
+    
+
+    public void addDetail(R detail) {
+        R existingDetail = findDetail(detail.getResourceId(), detail.getName());
+        if (existingDetail != null) {
+            remove(existingDetail.getId());
+        }
+        persist(detail);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/300f626d/engine/schema/src/com/cloud/dc/dao/ResourceDetailDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/dc/dao/ResourceDetailDaoImpl.java b/engine/schema/src/com/cloud/dc/dao/ResourceDetailDaoImpl.java
deleted file mode 100644
index 8819e4b..0000000
--- a/engine/schema/src/com/cloud/dc/dao/ResourceDetailDaoImpl.java
+++ /dev/null
@@ -1,110 +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 com.cloud.dc.dao;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.cloudstack.api.ResourceDetail;
-
-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 abstract class ResourceDetailDaoImpl<R extends ResourceDetail> extends GenericDaoBase<R, Long>{
-    private SearchBuilder<R> AllFieldsSearch;
-    
-    public ResourceDetailDaoImpl() {
-        AllFieldsSearch = createSearchBuilder();
-        AllFieldsSearch.and("resourceId", AllFieldsSearch.entity().getResourceId(), SearchCriteria.Op.EQ);
-        AllFieldsSearch.and("name", AllFieldsSearch.entity().getName(), SearchCriteria.Op.EQ);
-        AllFieldsSearch.done();
-    }
-
-    public R findDetail(long resourceId, String name) {
-        SearchCriteria<R> sc = AllFieldsSearch.create();
-        sc.setParameters("resourceId", resourceId);
-        sc.setParameters("name", name);
-        
-        return findOneBy(sc);
-    }
-
-
-    public Map<String, String> findDetails(long resourceId) {
-        SearchCriteria<R> sc = AllFieldsSearch.create();
-        sc.setParameters("resourceId", resourceId);
-        
-        List<R> results = search(sc, null);
-        Map<String, String> details = new HashMap<String, String>(results.size());
-        for (R result : results) {
-            details.put(result.getName(), result.getValue());
-        }
-        return details;
-    }
-
-    public List<R> findDetailsList(long resourceId) {
-        SearchCriteria<R> sc = AllFieldsSearch.create();
-        sc.setParameters("resourceId", resourceId);
-
-        List<R> results = search(sc, null);
-        return results;
-    }
-
-
-    public void removeDetails(long resourceId) {
-        SearchCriteria<R> sc = AllFieldsSearch.create();
-        sc.setParameters("resourceId", resourceId);
-        remove(sc);
-    }
-
-    
-    public void removeDetail(long resourceId, String key) {
-        if (key != null){
-            SearchCriteria<R> sc = AllFieldsSearch.create();
-            sc.setParameters("name", key);
-            remove(sc);
-        }
-    }
-
-
-    public void addDetails(List<R> details) {
-        TransactionLegacy txn = TransactionLegacy.currentTxn();
-        txn.start();
-        SearchCriteria<R> sc = AllFieldsSearch.create();
-        sc.setParameters("resourceId", details.get(0).getResourceId());
-        expunge(sc);
-        
-        for (R detail : details) {
-            persist(detail);
-        }
-        
-        txn.commit();
-    }
-    
-
-    public void addDetail(R detail) {
-        R existingDetail = findDetail(detail.getResourceId(), detail.getName());
-        if (existingDetail != null) {
-            remove(existingDetail.getId());
-        }
-        persist(detail);
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/300f626d/engine/schema/src/com/cloud/network/dao/NetworkDetailsDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/network/dao/NetworkDetailsDaoImpl.java b/engine/schema/src/com/cloud/network/dao/NetworkDetailsDaoImpl.java
index 76dc24a..915e184 100644
--- a/engine/schema/src/com/cloud/network/dao/NetworkDetailsDaoImpl.java
+++ b/engine/schema/src/com/cloud/network/dao/NetworkDetailsDaoImpl.java
@@ -20,10 +20,10 @@ import javax.ejb.Local;
 
 import org.springframework.stereotype.Component;
 
-import com.cloud.dc.dao.ResourceDetailDaoImpl;
+import com.cloud.dc.dao.ResourceDetailDaoBase;
 
 @Component
 @Local(value=NetworkDetailsDao.class)
-public class NetworkDetailsDaoImpl extends ResourceDetailDaoImpl<NetworkDetailVO> implements NetworkDetailsDao {
+public class NetworkDetailsDaoImpl extends ResourceDetailDaoBase<NetworkDetailVO> implements NetworkDetailsDao {
 
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/300f626d/engine/schema/src/com/cloud/service/dao/ServiceOfferingDetailsDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/service/dao/ServiceOfferingDetailsDaoImpl.java b/engine/schema/src/com/cloud/service/dao/ServiceOfferingDetailsDaoImpl.java
index bf3cdcc..eed8a13 100644
--- a/engine/schema/src/com/cloud/service/dao/ServiceOfferingDetailsDaoImpl.java
+++ b/engine/schema/src/com/cloud/service/dao/ServiceOfferingDetailsDaoImpl.java
@@ -20,12 +20,12 @@ import javax.ejb.Local;
 
 import org.springframework.stereotype.Component;
 
-import com.cloud.dc.dao.ResourceDetailDaoImpl;
+import com.cloud.dc.dao.ResourceDetailDaoBase;
 import com.cloud.service.ServiceOfferingDetailsVO;
 
 @Component
 @Local(value=ServiceOfferingDetailsDao.class)
-public class ServiceOfferingDetailsDaoImpl extends ResourceDetailDaoImpl<ServiceOfferingDetailsVO>
+public class ServiceOfferingDetailsDaoImpl extends ResourceDetailDaoBase<ServiceOfferingDetailsVO>
         implements ServiceOfferingDetailsDao {
     
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/300f626d/engine/schema/src/com/cloud/storage/dao/VMTemplateDetailsDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/storage/dao/VMTemplateDetailsDaoImpl.java b/engine/schema/src/com/cloud/storage/dao/VMTemplateDetailsDaoImpl.java
index 007f9ca..4b9bfb5 100644
--- a/engine/schema/src/com/cloud/storage/dao/VMTemplateDetailsDaoImpl.java
+++ b/engine/schema/src/com/cloud/storage/dao/VMTemplateDetailsDaoImpl.java
@@ -20,10 +20,10 @@ import javax.ejb.Local;
 
 import org.springframework.stereotype.Component;
 
-import com.cloud.dc.dao.ResourceDetailDaoImpl;
+import com.cloud.dc.dao.ResourceDetailDaoBase;
 import com.cloud.storage.VMTemplateDetailVO;
 
 @Component
 @Local(value = VMTemplateDetailsDao.class)
-public class VMTemplateDetailsDaoImpl extends ResourceDetailDaoImpl<VMTemplateDetailVO> implements VMTemplateDetailsDao {
+public class VMTemplateDetailsDaoImpl extends ResourceDetailDaoBase<VMTemplateDetailVO> implements VMTemplateDetailsDao {
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/300f626d/engine/schema/src/com/cloud/storage/dao/VolumeDetailsDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/storage/dao/VolumeDetailsDaoImpl.java b/engine/schema/src/com/cloud/storage/dao/VolumeDetailsDaoImpl.java
index d264394..9df6ee1 100644
--- a/engine/schema/src/com/cloud/storage/dao/VolumeDetailsDaoImpl.java
+++ b/engine/schema/src/com/cloud/storage/dao/VolumeDetailsDaoImpl.java
@@ -20,11 +20,11 @@ import javax.ejb.Local;
 
 import org.springframework.stereotype.Component;
 
-import com.cloud.dc.dao.ResourceDetailDaoImpl;
+import com.cloud.dc.dao.ResourceDetailDaoBase;
 import com.cloud.storage.VolumeDetailVO;
 
 @Component
 @Local(value=VolumeDetailsDao.class)
-public class VolumeDetailsDaoImpl extends ResourceDetailDaoImpl<VolumeDetailVO> implements VolumeDetailsDao {
+public class VolumeDetailsDaoImpl extends ResourceDetailDaoBase<VolumeDetailVO> implements VolumeDetailsDao {
 
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/300f626d/engine/schema/src/com/cloud/vm/dao/NicDetailDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/vm/dao/NicDetailDaoImpl.java b/engine/schema/src/com/cloud/vm/dao/NicDetailDaoImpl.java
index 65a327f..6263cae 100644
--- a/engine/schema/src/com/cloud/vm/dao/NicDetailDaoImpl.java
+++ b/engine/schema/src/com/cloud/vm/dao/NicDetailDaoImpl.java
@@ -20,11 +20,11 @@ import javax.ejb.Local;
 
 import org.springframework.stereotype.Component;
 
-import com.cloud.dc.dao.ResourceDetailDaoImpl;
+import com.cloud.dc.dao.ResourceDetailDaoBase;
 import com.cloud.vm.NicDetailVO;
 
 @Component
 @Local (value={NicDetailDao.class})
-public class NicDetailDaoImpl extends ResourceDetailDaoImpl<NicDetailVO> implements NicDetailDao {
+public class NicDetailDaoImpl extends ResourceDetailDaoBase<NicDetailVO> implements NicDetailDao {
     
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/300f626d/engine/schema/src/com/cloud/vm/dao/UserVmDetailsDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/vm/dao/UserVmDetailsDaoImpl.java b/engine/schema/src/com/cloud/vm/dao/UserVmDetailsDaoImpl.java
index 38b691d..b435381 100644
--- a/engine/schema/src/com/cloud/vm/dao/UserVmDetailsDaoImpl.java
+++ b/engine/schema/src/com/cloud/vm/dao/UserVmDetailsDaoImpl.java
@@ -20,11 +20,11 @@ import javax.ejb.Local;
 
 import org.springframework.stereotype.Component;
 
-import com.cloud.dc.dao.ResourceDetailDaoImpl;
+import com.cloud.dc.dao.ResourceDetailDaoBase;
 import com.cloud.vm.UserVmDetailVO;
 
 @Component
 @Local(value=UserVmDetailsDao.class)
-public class UserVmDetailsDaoImpl extends ResourceDetailDaoImpl<UserVmDetailVO> implements UserVmDetailsDao {
+public class UserVmDetailsDaoImpl extends ResourceDetailDaoBase<UserVmDetailVO> implements UserVmDetailsDao {
 
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/300f626d/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 36fddf4..37b9e9c 100755
--- a/server/src/com/cloud/api/ApiDBUtils.java
+++ b/server/src/com/cloud/api/ApiDBUtils.java
@@ -126,7 +126,7 @@ import com.cloud.dc.dao.ClusterDao;
 import com.cloud.dc.dao.DataCenterDao;
 import com.cloud.dc.dao.DataCenterDetailsDao;
 import com.cloud.dc.dao.HostPodDao;
-import com.cloud.dc.dao.ResourceDetailDaoImpl;
+import com.cloud.dc.dao.ResourceDetailDaoBase;
 import com.cloud.dc.dao.VlanDao;
 import com.cloud.domain.DomainVO;
 import com.cloud.domain.dao.DomainDao;


[27/50] [abbrv] Extend support of CloudStack-managed storage to KVM

Posted by mc...@apache.org.
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/858ce766/plugins/storage/volume/solidfire/src/org/apache/cloudstack/storage/datastore/lifecycle/SolidFirePrimaryDataStoreLifeCycle.java
----------------------------------------------------------------------
diff --git a/plugins/storage/volume/solidfire/src/org/apache/cloudstack/storage/datastore/lifecycle/SolidFirePrimaryDataStoreLifeCycle.java b/plugins/storage/volume/solidfire/src/org/apache/cloudstack/storage/datastore/lifecycle/SolidFirePrimaryDataStoreLifeCycle.java
index f1ac3b3..038e89b 100644
--- a/plugins/storage/volume/solidfire/src/org/apache/cloudstack/storage/datastore/lifecycle/SolidFirePrimaryDataStoreLifeCycle.java
+++ b/plugins/storage/volume/solidfire/src/org/apache/cloudstack/storage/datastore/lifecycle/SolidFirePrimaryDataStoreLifeCycle.java
@@ -18,6 +18,8 @@
  */
 package org.apache.cloudstack.storage.datastore.lifecycle;
 
+import java.util.ArrayList;
+import java.util.List;
 import java.util.Map;
 import java.util.StringTokenizer;
 
@@ -33,54 +35,62 @@ import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
 import org.apache.cloudstack.storage.datastore.db.StoragePoolDetailsDao;
 import org.apache.cloudstack.storage.datastore.util.SolidFireUtil;
 import org.apache.cloudstack.storage.volume.datastore.PrimaryDataStoreHelper;
+import org.apache.log4j.Logger;
 
 import com.cloud.dc.DataCenterVO;
 import com.cloud.dc.dao.DataCenterDao;
+import com.cloud.host.HostVO;
 import com.cloud.hypervisor.Hypervisor.HypervisorType;
 import com.cloud.agent.api.StoragePoolInfo;
+import com.cloud.resource.ResourceManager;
+import com.cloud.storage.StorageManager;
 import com.cloud.storage.StoragePoolAutomation;
 import com.cloud.storage.Storage.StoragePoolType;
 import com.cloud.utils.exception.CloudRuntimeException;
 
 public class SolidFirePrimaryDataStoreLifeCycle implements PrimaryDataStoreLifeCycle {
-    @Inject PrimaryDataStoreDao storagePoolDao;
-    @Inject PrimaryDataStoreHelper dataStoreHelper;
-    @Inject StoragePoolAutomation storagePoolAutomation;
-    @Inject StoragePoolDetailsDao storagePoolDetailsDao;
-    @Inject DataCenterDao zoneDao;
-    
+    private static final Logger s_logger = Logger.getLogger(SolidFirePrimaryDataStoreLifeCycle.class);
+
+    @Inject private DataCenterDao zoneDao;
+    @Inject private PrimaryDataStoreDao storagePoolDao;
+    @Inject private PrimaryDataStoreHelper dataStoreHelper;
+    @Inject private ResourceManager _resourceMgr;
+    @Inject StorageManager _storageMgr;
+    @Inject private StoragePoolAutomation storagePoolAutomation;
+    @Inject private StoragePoolDetailsDao storagePoolDetailsDao;
+
     private static final int DEFAULT_MANAGEMENT_PORT = 443;
     private static final int DEFAULT_STORAGE_PORT = 3260;
-    
+
     // invoked to add primary storage that is based on the SolidFire plug-in
     @Override
     public DataStore initialize(Map<String, Object> dsInfos) {
-    	String url = (String)dsInfos.get("url");
-    	Long zoneId = (Long)dsInfos.get("zoneId");
+        String url = (String)dsInfos.get("url");
+        Long zoneId = (Long)dsInfos.get("zoneId");
         String storagePoolName = (String) dsInfos.get("name");
         String providerName = (String)dsInfos.get("providerName");
         Long capacityBytes = (Long)dsInfos.get("capacityBytes");
         Long capacityIops = (Long)dsInfos.get("capacityIops");
         String tags = (String)dsInfos.get("tags");
         Map<String, String> details = (Map<String, String>)dsInfos.get("details");
-    	
-    	String storageVip = getStorageVip(url);
-    	int storagePort = getStoragePort(url);
-    	
-    	DataCenterVO zone = zoneDao.findById(zoneId);
-    	
-    	String uuid = SolidFireUtil.PROVIDER_NAME + "_" + zone.getUuid() + "_" + storageVip;
+
+        String storageVip = getStorageVip(url);
+        int storagePort = getStoragePort(url);
+
+        DataCenterVO zone = zoneDao.findById(zoneId);
+
+        String uuid = SolidFireUtil.PROVIDER_NAME + "_" + zone.getUuid() + "_" + storageVip;
 
         if (capacityBytes == null || capacityBytes <= 0) {
             throw new IllegalArgumentException("'capacityBytes' must be present and greater than 0.");
         }
-    	
-    	if (capacityIops == null || capacityIops <= 0) {
-    	    throw new IllegalArgumentException("'capacityIops' must be present and greater than 0.");
-    	}
-    	
+
+        if (capacityIops == null || capacityIops <= 0) {
+            throw new IllegalArgumentException("'capacityIops' must be present and greater than 0.");
+        }
+
         PrimaryDataStoreParameters parameters = new PrimaryDataStoreParameters();
-        
+
         parameters.setHost(storageVip);
         parameters.setPort(storagePort);
         parameters.setPath(getModifiedUrl(url));
@@ -96,16 +106,16 @@ public class SolidFirePrimaryDataStoreLifeCycle implements PrimaryDataStoreLifeC
         parameters.setHypervisorType(HypervisorType.Any);
         parameters.setTags(tags);
         parameters.setDetails(details);
-        
+
         String managementVip = getManagementVip(url);
         int managementPort = getManagementPort(url);
-        
+
         details.put(SolidFireUtil.MANAGEMENT_VIP, managementVip);
         details.put(SolidFireUtil.MANAGEMENT_PORT, String.valueOf(managementPort));
-        
+
         String clusterAdminUsername = getValue(SolidFireUtil.CLUSTER_ADMIN_USERNAME, url);
         String clusterAdminPassword = getValue(SolidFireUtil.CLUSTER_ADMIN_PASSWORD, url);
-        
+
         details.put(SolidFireUtil.CLUSTER_ADMIN_USERNAME, clusterAdminUsername);
         details.put(SolidFireUtil.CLUSTER_ADMIN_PASSWORD, clusterAdminPassword);
 
@@ -171,144 +181,158 @@ public class SolidFirePrimaryDataStoreLifeCycle implements PrimaryDataStoreLifeC
         // this adds a row in the cloud.storage_pool table for this SolidFire cluster
     	return dataStoreHelper.createPrimaryDataStore(parameters);
     }
-    
+
     // remove the clusterAdmin and password key/value pairs
     private String getModifiedUrl(String originalUrl)
     {
-    	StringBuilder sb = new StringBuilder();
-    	
-    	String delimiter = ";";
-    	
-    	StringTokenizer st = new StringTokenizer(originalUrl, delimiter);
-    	
-    	while (st.hasMoreElements()) {
-			String token = st.nextElement().toString().toUpperCase();
-			
-			if (token.startsWith(SolidFireUtil.MANAGEMENT_VIP.toUpperCase()) ||
-				token.startsWith(SolidFireUtil.STORAGE_VIP.toUpperCase())) {
-				sb.append(token).append(delimiter);
-			}
-    	}
-    	
-    	String modifiedUrl = sb.toString();
-    	int lastIndexOf = modifiedUrl.lastIndexOf(delimiter);
-    	
-    	if (lastIndexOf == (modifiedUrl.length() - delimiter.length())) {
-    		return modifiedUrl.substring(0, lastIndexOf);
-    	}
-    	
-    	return modifiedUrl;
+        StringBuilder sb = new StringBuilder();
+
+        String delimiter = ";";
+
+        StringTokenizer st = new StringTokenizer(originalUrl, delimiter);
+
+        while (st.hasMoreElements()) {
+            String token = st.nextElement().toString().toUpperCase();
+
+            if (token.startsWith(SolidFireUtil.MANAGEMENT_VIP.toUpperCase()) ||
+                token.startsWith(SolidFireUtil.STORAGE_VIP.toUpperCase())) {
+                sb.append(token).append(delimiter);
+            }
+        }
+
+        String modifiedUrl = sb.toString();
+        int lastIndexOf = modifiedUrl.lastIndexOf(delimiter);
+
+        if (lastIndexOf == (modifiedUrl.length() - delimiter.length())) {
+            return modifiedUrl.substring(0, lastIndexOf);
+        }
+
+        return modifiedUrl;
     }
-    
+
     private String getManagementVip(String url)
     {
     	return getVip(SolidFireUtil.MANAGEMENT_VIP, url);
     }
-    
+
     private String getStorageVip(String url)
     {
     	return getVip(SolidFireUtil.STORAGE_VIP, url);
     }
-    
+
     private int getManagementPort(String url)
     {
     	return getPort(SolidFireUtil.MANAGEMENT_VIP, url, DEFAULT_MANAGEMENT_PORT);
     }
-    
+
     private int getStoragePort(String url)
     {
     	return getPort(SolidFireUtil.STORAGE_VIP, url, DEFAULT_STORAGE_PORT);
     }
-    
+
     private String getVip(String keyToMatch, String url)
     {
-    	String delimiter = ":";
-    	
-    	String storageVip = getValue(keyToMatch, url);
-    	
-    	int index = storageVip.indexOf(delimiter);
-    	
-    	if (index != -1)
-    	{
-    		return storageVip.substring(0, index);
-    	}
-    	
-    	return storageVip;
+        String delimiter = ":";
+
+        String storageVip = getValue(keyToMatch, url);
+
+        int index = storageVip.indexOf(delimiter);
+
+        if (index != -1)
+        {
+            return storageVip.substring(0, index);
+        }
+
+        return storageVip;
     }
-    
+
     private int getPort(String keyToMatch, String url, int defaultPortNumber)
     {
-    	String delimiter = ":";
-    	
-    	String storageVip = getValue(keyToMatch, url);
-    	
-    	int index = storageVip.indexOf(delimiter);
-    	
-    	int portNumber = defaultPortNumber;
-    	
-    	if (index != -1) {
-    		String port = storageVip.substring(index + delimiter.length());
-    		
-    		try {
-    			portNumber = Integer.parseInt(port);
-    		}
-    		catch (NumberFormatException ex) {
-    			throw new IllegalArgumentException("Invalid URL format (port is not an integer)");
-    		}
-    	}
-    	
-    	return portNumber;
+        String delimiter = ":";
+
+        String storageVip = getValue(keyToMatch, url);
+
+        int index = storageVip.indexOf(delimiter);
+
+        int portNumber = defaultPortNumber;
+
+        if (index != -1) {
+            String port = storageVip.substring(index + delimiter.length());
+
+            try {
+                portNumber = Integer.parseInt(port);
+            }
+            catch (NumberFormatException ex) {
+                throw new IllegalArgumentException("Invalid URL format (port is not an integer)");
+            }
+        }
+
+        return portNumber;
     }
-    
+
     private String getValue(String keyToMatch, String url)
     {
-    	String delimiter1 = ";";
-    	String delimiter2 = "=";
-    	
-    	StringTokenizer st = new StringTokenizer(url, delimiter1);
-    	
-    	while (st.hasMoreElements()) {
-			String token = st.nextElement().toString();
-			
-			int index = token.indexOf(delimiter2);
-			
-			if (index == -1)
-			{
-				throw new RuntimeException("Invalid URL format");
-			}
-			
-			String key = token.substring(0, index);
-			
-			if (key.equalsIgnoreCase(keyToMatch)) {
-				String valueToReturn = token.substring(index + delimiter2.length());
-				
-				return valueToReturn;
-			}
-		}
-    	
-    	throw new RuntimeException("Key not found in URL");
+        String delimiter1 = ";";
+        String delimiter2 = "=";
+
+        StringTokenizer st = new StringTokenizer(url, delimiter1);
+
+        while (st.hasMoreElements()) {
+            String token = st.nextElement().toString();
+
+            int index = token.indexOf(delimiter2);
+
+            if (index == -1)
+            {
+                throw new RuntimeException("Invalid URL format");
+            }
+
+            String key = token.substring(0, index);
+
+            if (key.equalsIgnoreCase(keyToMatch)) {
+                String valueToReturn = token.substring(index + delimiter2.length());
+
+                return valueToReturn;
+            }
+        }
+
+        throw new RuntimeException("Key not found in URL");
     }
-    
+
     // do not implement this method for SolidFire's plug-in
     @Override
     public boolean attachHost(DataStore store, HostScope scope, StoragePoolInfo existingInfo) {
         return true; // should be ignored for zone-wide-only plug-ins like SolidFire's
     }
-    
+
     // do not implement this method for SolidFire's plug-in
     @Override
     public boolean attachCluster(DataStore store, ClusterScope scope) {
     	return true; // should be ignored for zone-wide-only plug-ins like SolidFire's
     }
-    
+
     @Override
     public boolean attachZone(DataStore dataStore, ZoneScope scope, HypervisorType hypervisorType) {
-    	dataStoreHelper.attachZone(dataStore);
-    	
+        dataStoreHelper.attachZone(dataStore);
+
+        List<HostVO> xenServerHosts = _resourceMgr.listAllUpAndEnabledHostsInOneZoneByHypervisor(HypervisorType.XenServer, scope.getScopeId());
+        List<HostVO> kvmHosts = _resourceMgr.listAllUpAndEnabledHostsInOneZoneByHypervisor(HypervisorType.KVM, scope.getScopeId());
+        List<HostVO> hosts = new ArrayList<HostVO>();
+
+        hosts.addAll(xenServerHosts);
+        hosts.addAll(kvmHosts);
+
+        for (HostVO host : hosts) {
+            try {
+                _storageMgr.connectHostToSharedPool(host.getId(), dataStore.getId());
+            } catch (Exception e) {
+                s_logger.warn("Unable to establish a connection between " + host + " and " + dataStore, e);
+            }
+        }
+
         return true;
     }
 
-    
     @Override
     public boolean maintain(DataStore dataStore) {
         storagePoolAutomation.maintain(dataStore);
@@ -316,7 +340,7 @@ public class SolidFirePrimaryDataStoreLifeCycle implements PrimaryDataStoreLifeC
         
         return true;
     }
-    
+
     @Override
     public boolean cancelMaintain(DataStore store) {
         dataStoreHelper.cancelMaintain(store);
@@ -324,7 +348,7 @@ public class SolidFirePrimaryDataStoreLifeCycle implements PrimaryDataStoreLifeC
         
         return true;
     }
-    
+
     // invoked to delete primary storage that is based on the SolidFire plug-in
     @Override
     public boolean deleteDataStore(DataStore store) {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/858ce766/plugins/storage/volume/solidfire/src/org/apache/cloudstack/storage/datastore/provider/SolidFireHostListener.java
----------------------------------------------------------------------
diff --git a/plugins/storage/volume/solidfire/src/org/apache/cloudstack/storage/datastore/provider/SolidFireHostListener.java b/plugins/storage/volume/solidfire/src/org/apache/cloudstack/storage/datastore/provider/SolidFireHostListener.java
new file mode 100644
index 0000000..43e9830
--- /dev/null
+++ b/plugins/storage/volume/solidfire/src/org/apache/cloudstack/storage/datastore/provider/SolidFireHostListener.java
@@ -0,0 +1,102 @@
+/*
+ * 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.provider;
+
+import javax.inject.Inject;
+
+import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
+import org.apache.cloudstack.engine.subsystem.api.storage.HypervisorHostListener;
+import org.apache.log4j.Logger;
+
+import com.cloud.agent.AgentManager;
+import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.ModifyStoragePoolAnswer;
+import com.cloud.agent.api.ModifyStoragePoolCommand;
+import com.cloud.alert.AlertManager;
+import com.cloud.host.HostVO;
+import com.cloud.host.dao.HostDao;
+import com.cloud.hypervisor.Hypervisor.HypervisorType;
+import com.cloud.storage.DataStoreRole;
+import com.cloud.storage.StoragePool;
+import com.cloud.storage.StoragePoolHostVO;
+import com.cloud.storage.dao.StoragePoolHostDao;
+import com.cloud.utils.exception.CloudRuntimeException;
+
+public class SolidFireHostListener implements HypervisorHostListener {
+    private static final Logger s_logger = Logger.getLogger(SolidFireHostListener.class);
+
+    @Inject private AgentManager _agentMgr;
+    @Inject private AlertManager _alertMgr;
+    @Inject private DataStoreManager _dataStoreMgr;
+    @Inject private HostDao _hostDao;
+    @Inject private StoragePoolHostDao storagePoolHostDao;
+
+    @Override
+    public boolean hostConnect(long hostId, long storagePoolId) {
+        HostVO host = _hostDao.findById(hostId);
+
+        StoragePoolHostVO storagePoolHost = storagePoolHostDao.findByPoolHost(storagePoolId, hostId);
+
+        if (storagePoolHost == null) {
+            storagePoolHost = new StoragePoolHostVO(storagePoolId, hostId, "");
+
+            storagePoolHostDao.persist(storagePoolHost);
+        }
+
+        // just want to send the ModifyStoragePoolCommand for KVM
+        if (host.getHypervisorType() != HypervisorType.KVM) {
+            return true;
+        }
+
+        StoragePool storagePool = (StoragePool)_dataStoreMgr.getDataStore(storagePoolId, DataStoreRole.Primary);
+        ModifyStoragePoolCommand cmd = new ModifyStoragePoolCommand(true, storagePool);
+
+        Answer answer = _agentMgr.easySend(hostId, cmd);
+
+        if (answer == null) {
+            throw new CloudRuntimeException("Unable to get an answer to the modify storage pool command (" + storagePool.getId() + ")");
+        }
+
+        if (!answer.getResult()) {
+            String msg = "Unable to attach storage pool " + storagePoolId + " to host " + hostId;
+
+            _alertMgr.sendAlert(AlertManager.ALERT_TYPE_HOST, storagePool.getDataCenterId(), storagePool.getPodId(), msg, msg);
+
+            throw new CloudRuntimeException("Unable to establish a connection from agent to storage pool " + storagePool.getId() +
+                    " due to " + answer.getDetails() + " (" + storagePool.getId() + ")");
+        }
+
+        assert (answer instanceof ModifyStoragePoolAnswer) : "ModifyStoragePoolAnswer expected ; Pool = " + storagePool.getId() + " Host = " + hostId;
+
+        s_logger.info("Connection established between storage pool " + storagePool + " and host + " + hostId);
+
+        return true;
+    }
+
+    @Override
+    public boolean hostDisconnected(long hostId, long storagePoolId) {
+        StoragePoolHostVO storagePoolHost = storagePoolHostDao.findByPoolHost(storagePoolId, hostId);
+
+        if (storagePoolHost != null) {
+            storagePoolHostDao.deleteStoragePoolHostDetails(hostId, storagePoolId);
+        }
+
+        return true;
+    }
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/858ce766/plugins/storage/volume/solidfire/src/org/apache/cloudstack/storage/datastore/provider/SolidfirePrimaryDataStoreProvider.java
----------------------------------------------------------------------
diff --git a/plugins/storage/volume/solidfire/src/org/apache/cloudstack/storage/datastore/provider/SolidfirePrimaryDataStoreProvider.java b/plugins/storage/volume/solidfire/src/org/apache/cloudstack/storage/datastore/provider/SolidfirePrimaryDataStoreProvider.java
index 9c784ba..576d1a2 100644
--- a/plugins/storage/volume/solidfire/src/org/apache/cloudstack/storage/datastore/provider/SolidfirePrimaryDataStoreProvider.java
+++ b/plugins/storage/volume/solidfire/src/org/apache/cloudstack/storage/datastore/provider/SolidfirePrimaryDataStoreProvider.java
@@ -66,15 +66,7 @@ public class SolidfirePrimaryDataStoreProvider implements PrimaryDataStoreProvid
     public boolean configure(Map<String, Object> params) {
         lifecycle = ComponentContext.inject(SolidFirePrimaryDataStoreLifeCycle.class);
         driver = ComponentContext.inject(SolidfirePrimaryDataStoreDriver.class);
-        listener = ComponentContext.inject(new HypervisorHostListener() {
-            public boolean hostConnect(long hostId, long poolId) {
-                return true;
-            }
-
-            public boolean hostDisconnected(long hostId, long poolId) {
-                return true;
-            }
-        });
+        listener = ComponentContext.inject(SolidFireHostListener.class);
 
         return true;
     }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/858ce766/server/src/com/cloud/storage/VolumeApiServiceImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/storage/VolumeApiServiceImpl.java b/server/src/com/cloud/storage/VolumeApiServiceImpl.java
index e4c8264..67aa388 100644
--- a/server/src/com/cloud/storage/VolumeApiServiceImpl.java
+++ b/server/src/com/cloud/storage/VolumeApiServiceImpl.java
@@ -20,6 +20,7 @@ import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
+import java.util.HashMap;
 import java.util.UUID;
 import java.util.concurrent.ExecutionException;
 
@@ -1231,7 +1232,7 @@ public class VolumeApiServiceImpl extends ManagerBase implements VolumeApiServic
             StoragePoolVO volumePool = _storagePoolDao.findById(volume.getPoolId());
 
             DataTO volTO = volFactory.getVolume(volume.getId()).getTO();
-            DiskTO disk = new DiskTO(volTO, volume.getDeviceId(), null, volume.getVolumeType());
+            DiskTO disk = new DiskTO(volTO, volume.getDeviceId(), volume.getPath(), volume.getVolumeType());
 
             DettachCommand cmd = new DettachCommand(disk, vm.getInstanceName());
 
@@ -1605,29 +1606,41 @@ public class VolumeApiServiceImpl extends ManagerBase implements VolumeApiServic
 
         if (sendCommand) {
             volumeToAttachStoragePool = _storagePoolDao.findById(volumeToAttach.getPoolId());
-            long storagePoolId = volumeToAttachStoragePool.getId();
 
-            DataTO volTO = volFactory.getVolume(volumeToAttach.getId()).getTO();
-            DiskTO disk = new DiskTO(volTO, deviceId, null, volumeToAttach.getVolumeType());
+            HostVO host = _hostDao.findById(hostId);
 
-            AttachCommand cmd = new AttachCommand(disk, vm.getInstanceName());
+            if (host.getHypervisorType() == HypervisorType.KVM &&
+                volumeToAttachStoragePool.isManaged() &&
+                volumeToAttach.getPath() == null) {
+                volumeToAttach.setPath(volumeToAttach.get_iScsiName());
 
-            cmd.setManaged(volumeToAttachStoragePool.isManaged());
+                _volsDao.update(volumeToAttach.getId(), volumeToAttach);
+            }
 
-            cmd.setStorageHost(volumeToAttachStoragePool.getHostAddress());
-            cmd.setStoragePort(volumeToAttachStoragePool.getPort());
+            DataTO volTO = volFactory.getVolume(volumeToAttach.getId()).getTO();
+            DiskTO disk = new DiskTO(volTO, deviceId, volumeToAttach.getPath(), volumeToAttach.getVolumeType());
 
-            cmd.set_iScsiName(volumeToAttach.get_iScsiName());
+            AttachCommand cmd = new AttachCommand(disk, vm.getInstanceName());
 
             VolumeInfo volumeInfo = volFactory.getVolume(volumeToAttach.getId());
-            DataStore dataStore = dataStoreMgr.getDataStore(storagePoolId, DataStoreRole.Primary);
+            DataStore dataStore = dataStoreMgr.getDataStore(volumeToAttachStoragePool.getId(), DataStoreRole.Primary);
             ChapInfo chapInfo = volService.getChapInfo(volumeInfo, dataStore);
 
+            Map<String, String> details = new HashMap<String, String>();
+
+            disk.setDetails(details);
+
+            details.put(DiskTO.MANAGED, String.valueOf(volumeToAttachStoragePool.isManaged()));
+            details.put(DiskTO.STORAGE_HOST, volumeToAttachStoragePool.getHostAddress());
+            details.put(DiskTO.STORAGE_PORT, String.valueOf(volumeToAttachStoragePool.getPort()));
+            details.put(DiskTO.VOLUME_SIZE, String.valueOf(volumeToAttach.getSize()));
+            details.put(DiskTO.IQN, volumeToAttach.get_iScsiName());
+
             if (chapInfo != null) {
-                cmd.setChapInitiatorUsername(chapInfo.getInitiatorUsername());
-                cmd.setChapInitiatorPassword(chapInfo.getInitiatorSecret());
-                cmd.setChapTargetUsername(chapInfo.getTargetUsername());
-                cmd.setChapTargetPassword(chapInfo.getTargetSecret());
+                details.put(DiskTO.CHAP_INITIATOR_USERNAME, chapInfo.getInitiatorUsername());
+                details.put(DiskTO.CHAP_INITIATOR_SECRET, chapInfo.getInitiatorSecret());
+                details.put(DiskTO.CHAP_TARGET_USERNAME, chapInfo.getTargetUsername());
+                details.put(DiskTO.CHAP_TARGET_SECRET, chapInfo.getTargetSecret());
             }
 
             try {
@@ -1646,7 +1659,7 @@ public class VolumeApiServiceImpl extends ManagerBase implements VolumeApiServic
                 volumeToAttach = _volsDao.findById(volumeToAttach.getId());
 
                 if (volumeToAttachStoragePool.isManaged() && volumeToAttach.getPath() == null) {
-                    volumeToAttach.setPath(answer.getDisk().getVdiUuid());
+                    volumeToAttach.setPath(answer.getDisk().getPath());
 
                     _volsDao.update(volumeToAttach.getId(), volumeToAttach);
                 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/858ce766/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 2be0c65..e1d0e08 100755
--- a/server/src/com/cloud/storage/listener/StoragePoolMonitor.java
+++ b/server/src/com/cloud/storage/listener/StoragePoolMonitor.java
@@ -81,6 +81,9 @@ public class StoragePoolMonitor implements Listener {
                 List<StoragePoolVO> zoneStoragePoolsByHypervisor = _poolDao.findZoneWideStoragePoolsByHypervisor(host.getDataCenterId(), scCmd.getHypervisorType());
                 zoneStoragePoolsByTags.retainAll(zoneStoragePoolsByHypervisor);
                 pools.addAll(zoneStoragePoolsByTags);
+                List<StoragePoolVO> zoneStoragePoolsByAnyHypervisor = _poolDao.findZoneWideStoragePoolsByHypervisor(host.getDataCenterId(), HypervisorType.Any);
+                pools.addAll(zoneStoragePoolsByAnyHypervisor);
+
                 for (StoragePoolVO pool : pools) {
                     if (pool.getStatus() != StoragePoolStatus.Up) {
                         continue;


[23/50] [abbrv] git commit: updated refs/heads/object_store_migration to 5ec2a44

Posted by mc...@apache.org.
InputStream use fix in LibvirtComputingResource

- Properties object polulation using PropertiesUtil.loadFromFile

Signed-off-by: Laszlo Hornyak <la...@gmail.com>


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

Branch: refs/heads/object_store_migration
Commit: c17831532e6fad4039b893a771376ef956e21550
Parents: 5847783
Author: Laszlo Hornyak <la...@gmail.com>
Authored: Thu Oct 24 22:45:43 2013 +0200
Committer: Laszlo Hornyak <la...@gmail.com>
Committed: Sat Oct 26 17:47:34 2013 +0200

----------------------------------------------------------------------
 .../cloud/hypervisor/kvm/resource/LibvirtComputingResource.java   | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/c1783153/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java
index 51ba743..49e3501 100755
--- a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java
+++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java
@@ -18,7 +18,6 @@ package com.cloud.hypervisor.kvm.resource;
 
 import java.io.BufferedReader;
 import java.io.File;
-import java.io.FileInputStream;
 import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
 import java.io.BufferedOutputStream;
@@ -436,7 +435,7 @@ ServerResource {
         s_logger.info("developer.properties found at " + file.getAbsolutePath());
         Properties properties = new Properties();
         try {
-            properties.load(new FileInputStream(file));
+            PropertiesUtil.loadFromFile(properties, file);
 
             String startMac = (String) properties.get("private.macaddr.start");
             if (startMac == null) {


[10/50] [abbrv] git commit: updated refs/heads/object_store_migration to 5ec2a44

Posted by mc...@apache.org.
move a lot of code into vmsnapshot strategy

fix compile

fix compile

add vm_snapshot_details table in db

add vmsnapshot test cases


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

Branch: refs/heads/object_store_migration
Commit: a6ce66e55a65eb0fbae9ead92de6ceac7a87c531
Parents: 5c5326f
Author: Edison Su <su...@gmail.com>
Authored: Thu Oct 10 18:00:21 2013 -0700
Committer: Edison Su <su...@gmail.com>
Committed: Fri Oct 25 15:09:04 2013 -0700

----------------------------------------------------------------------
 client/tomcatconf/applicationContext.xml.in     |  12 +-
 .../cloud/agent/api/CreateVMSnapshotAnswer.java |  12 +-
 .../agent/api/CreateVMSnapshotCommand.java      |   4 +-
 .../cloud/agent/api/DeleteVMSnapshotAnswer.java |  12 +-
 .../agent/api/DeleteVMSnapshotCommand.java      |   3 +-
 .../agent/api/RevertToVMSnapshotAnswer.java     |  14 +-
 .../agent/api/RevertToVMSnapshotCommand.java    |   3 +-
 .../cloud/agent/api/VMSnapshotBaseCommand.java  |  10 +-
 .../cloudstack/storage/to/VolumeObjectTO.java   |  12 +
 .../api/storage/VMSnapshotStrategy.java         |  28 ++
 .../cloud/vm/snapshot/VMSnapshotDetailsVO.java  |  87 ++++
 .../src/com/cloud/vm/snapshot/VMSnapshotVO.java |   2 +-
 .../vm/snapshot/dao/VMSnapshotDetailsDao.java   |  28 ++
 .../snapshot/dao/VMSnapshotDetailsDaoImpl.java  |  52 ++
 .../motion/AncientDataMotionStrategy.java       |  26 -
 .../vm/snapshot/dao/VmSnapshotDaoTest.java      |  46 ++
 .../storage/test/ChildTestConfiguration.java    |  47 +-
 .../cloudstack/storage/test/SnapshotTest.java   | 100 ++--
 .../test/resources/storageContext.xml           |   2 +
 engine/storage/snapshot/pom.xml                 |  32 ++
 .../storage/snapshot/SnapshotServiceImpl.java   |  44 +-
 .../snapshot/XenserverSnapshotStrategy.java     |  27 +-
 .../vmsnapshot/DefaultVMSnapshotStrategy.java   | 369 ++++++++++++++
 .../storage/vmsnapshot/VMSnapshotHelper.java    |  38 ++
 .../vmsnapshot/VMSnapshotHelperImpl.java        | 148 ++++++
 .../test/src/VMSnapshotStrategyTest.java        | 256 ++++++++++
 .../storage/volume/VolumeServiceImpl.java       |  85 ++--
 .../manager/VmwareStorageManagerImpl.java       |  87 ++--
 .../xen/resource/CitrixResourceBase.java        |  28 +-
 .../storage/snapshot/SnapshotManagerImpl.java   |  97 ----
 .../vm/snapshot/VMSnapshotManagerImpl.java      | 484 +++----------------
 .../vm/snapshot/VMSnapshotManagerTest.java      |   7 -
 setup/db/db/schema-421to430.sql                 |   9 +
 33 files changed, 1398 insertions(+), 813 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/a6ce66e5/client/tomcatconf/applicationContext.xml.in
----------------------------------------------------------------------
diff --git a/client/tomcatconf/applicationContext.xml.in b/client/tomcatconf/applicationContext.xml.in
index 2a3520b..13ab71e 100644
--- a/client/tomcatconf/applicationContext.xml.in
+++ b/client/tomcatconf/applicationContext.xml.in
@@ -365,6 +365,7 @@
   <bean id="vMReservationDaoImpl" class="org.apache.cloudstack.engine.cloud.entity.api.db.dao.VMReservationDaoImpl" />
   <bean id="vMRootDiskTagDaoImpl" class="org.apache.cloudstack.engine.cloud.entity.api.db.dao.VMRootDiskTagDaoImpl" />
   <bean id="vMSnapshotDaoImpl" class="com.cloud.vm.snapshot.dao.VMSnapshotDaoImpl" />
+  <bean id="vMSnapshotDetailsDaoImpl" class="com.cloud.vm.snapshot.dao.VMSnapshotDetailsDaoImpl" />
   <bean id="vMTemplateDetailsDaoImpl" class="com.cloud.storage.dao.VMTemplateDetailsDaoImpl" />
   <bean id="vMTemplateHostDaoImpl" class="com.cloud.storage.dao.VMTemplateHostDaoImpl" />
   <bean id="vMTemplatePoolDaoImpl" class="com.cloud.storage.dao.VMTemplatePoolDaoImpl" />
@@ -882,8 +883,17 @@
   <bean id="ApplicationLoadBalancerService" class="org.apache.cloudstack.network.lb.ApplicationLoadBalancerManagerImpl" />
   <bean id="InternalLoadBalancerVMManager" class="org.apache.cloudstack.network.lb.InternalLoadBalancerVMManagerImpl" />
 
-  <bean id="vMSnapshotManagerImpl" class="com.cloud.vm.snapshot.VMSnapshotManagerImpl" />
+  <!--VM snapshot Strategies-->
+  <bean id='vmSnapshotHelper' class="org.apache.cloudstack.storage.vmsnapshot.VMSnapshotHelperImpl" />
+  <bean id='defaultVMSnapshotStrategy' class="org.apache.cloudstack.storage.vmsnapshot.DefaultVMSnapshotStrategy"/>
 
+  <bean id="vMSnapshotManagerImpl" class="com.cloud.vm.snapshot.VMSnapshotManagerImpl">
+    <property name="vmSnapshotStrategies">
+      <list>
+        <ref local="defaultVMSnapshotStrategy"/>
+      </list>
+    </property>
+  </bean>
 
 <!--=======================================================================================================-->
 <!--                                                                                                       -->

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/a6ce66e5/core/src/com/cloud/agent/api/CreateVMSnapshotAnswer.java
----------------------------------------------------------------------
diff --git a/core/src/com/cloud/agent/api/CreateVMSnapshotAnswer.java b/core/src/com/cloud/agent/api/CreateVMSnapshotAnswer.java
index f9fb164..8b8e69e 100644
--- a/core/src/com/cloud/agent/api/CreateVMSnapshotAnswer.java
+++ b/core/src/com/cloud/agent/api/CreateVMSnapshotAnswer.java
@@ -17,21 +17,21 @@
 
 package com.cloud.agent.api;
 
-import java.util.List;
+import org.apache.cloudstack.storage.to.VolumeObjectTO;
 
-import com.cloud.agent.api.to.VolumeTO;
+import java.util.List;
 
 public class CreateVMSnapshotAnswer extends Answer {
 
-    private List<VolumeTO> volumeTOs;
+    private List<VolumeObjectTO> volumeTOs;
     private VMSnapshotTO vmSnapshotTo;
     
  
-	public List<VolumeTO> getVolumeTOs() {
+	public List<VolumeObjectTO> getVolumeTOs() {
         return volumeTOs;
     }
 
-    public void setVolumeTOs(List<VolumeTO> volumeTOs) {
+    public void setVolumeTOs(List<VolumeObjectTO> volumeTOs) {
         this.volumeTOs = volumeTOs;
     }
 
@@ -53,7 +53,7 @@ public class CreateVMSnapshotAnswer extends Answer {
     }
 
     public CreateVMSnapshotAnswer(CreateVMSnapshotCommand cmd,
-    		VMSnapshotTO vmSnapshotTo, List<VolumeTO> volumeTOs) {
+    		VMSnapshotTO vmSnapshotTo, List<VolumeObjectTO> volumeTOs) {
         super(cmd, true, "");
         this.vmSnapshotTo = vmSnapshotTo;
         this.volumeTOs = volumeTOs;

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/a6ce66e5/core/src/com/cloud/agent/api/CreateVMSnapshotCommand.java
----------------------------------------------------------------------
diff --git a/core/src/com/cloud/agent/api/CreateVMSnapshotCommand.java b/core/src/com/cloud/agent/api/CreateVMSnapshotCommand.java
index 478987d..bfbc21d 100644
--- a/core/src/com/cloud/agent/api/CreateVMSnapshotCommand.java
+++ b/core/src/com/cloud/agent/api/CreateVMSnapshotCommand.java
@@ -18,12 +18,14 @@ package com.cloud.agent.api;
 
 import java.util.List;
 
+import com.cloud.agent.api.to.DataTO;
 import com.cloud.agent.api.to.VolumeTO;
 import com.cloud.vm.VirtualMachine;
+import org.apache.cloudstack.storage.to.VolumeObjectTO;
 
 public class CreateVMSnapshotCommand extends VMSnapshotBaseCommand {
 
-    public CreateVMSnapshotCommand(String vmName, VMSnapshotTO snapshot, List<VolumeTO> volumeTOs, String guestOSType, VirtualMachine.State vmState) {
+    public CreateVMSnapshotCommand(String vmName, VMSnapshotTO snapshot, List<VolumeObjectTO> volumeTOs, String guestOSType, VirtualMachine.State vmState) {
         super(vmName, snapshot, volumeTOs, guestOSType);
         this.vmState  = vmState;
     }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/a6ce66e5/core/src/com/cloud/agent/api/DeleteVMSnapshotAnswer.java
----------------------------------------------------------------------
diff --git a/core/src/com/cloud/agent/api/DeleteVMSnapshotAnswer.java b/core/src/com/cloud/agent/api/DeleteVMSnapshotAnswer.java
index 8f4ecad..d6ae95c 100644
--- a/core/src/com/cloud/agent/api/DeleteVMSnapshotAnswer.java
+++ b/core/src/com/cloud/agent/api/DeleteVMSnapshotAnswer.java
@@ -16,12 +16,12 @@
 // under the License.
 package com.cloud.agent.api;
 
-import java.util.List;
+import org.apache.cloudstack.storage.to.VolumeObjectTO;
 
-import com.cloud.agent.api.to.VolumeTO;
+import java.util.List;
 
 public class DeleteVMSnapshotAnswer extends Answer {
-    private List<VolumeTO> volumeTOs;
+    private List<VolumeObjectTO> volumeTOs;
 
     public DeleteVMSnapshotAnswer() {
     }
@@ -32,16 +32,16 @@ public class DeleteVMSnapshotAnswer extends Answer {
     }
 
     public DeleteVMSnapshotAnswer(DeleteVMSnapshotCommand cmd,
-            List<VolumeTO> volumeTOs) {
+            List<VolumeObjectTO> volumeTOs) {
         super(cmd, true, "");
         this.volumeTOs = volumeTOs;
     }
 
-    public List<VolumeTO> getVolumeTOs() {
+    public List<VolumeObjectTO> getVolumeTOs() {
         return volumeTOs;
     }
 
-    public void setVolumeTOs(List<VolumeTO> volumeTOs) {
+    public void setVolumeTOs(List<VolumeObjectTO> volumeTOs) {
         this.volumeTOs = volumeTOs;
     }
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/a6ce66e5/core/src/com/cloud/agent/api/DeleteVMSnapshotCommand.java
----------------------------------------------------------------------
diff --git a/core/src/com/cloud/agent/api/DeleteVMSnapshotCommand.java b/core/src/com/cloud/agent/api/DeleteVMSnapshotCommand.java
index c213448..1c64a2b 100644
--- a/core/src/com/cloud/agent/api/DeleteVMSnapshotCommand.java
+++ b/core/src/com/cloud/agent/api/DeleteVMSnapshotCommand.java
@@ -19,10 +19,11 @@ package com.cloud.agent.api;
 import java.util.List;
 
 import com.cloud.agent.api.to.VolumeTO;
+import org.apache.cloudstack.storage.to.VolumeObjectTO;
 
 
 public class DeleteVMSnapshotCommand extends VMSnapshotBaseCommand {
-    public DeleteVMSnapshotCommand(String vmName, VMSnapshotTO snapshot, List<VolumeTO> volumeTOs, String guestOSType) {
+    public DeleteVMSnapshotCommand(String vmName, VMSnapshotTO snapshot, List<VolumeObjectTO> volumeTOs, String guestOSType) {
         super( vmName,  snapshot, volumeTOs, guestOSType);
     }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/a6ce66e5/core/src/com/cloud/agent/api/RevertToVMSnapshotAnswer.java
----------------------------------------------------------------------
diff --git a/core/src/com/cloud/agent/api/RevertToVMSnapshotAnswer.java b/core/src/com/cloud/agent/api/RevertToVMSnapshotAnswer.java
index 848ffc0..6170864 100644
--- a/core/src/com/cloud/agent/api/RevertToVMSnapshotAnswer.java
+++ b/core/src/com/cloud/agent/api/RevertToVMSnapshotAnswer.java
@@ -17,14 +17,14 @@
 
 package com.cloud.agent.api;
 
-import java.util.List;
-
-import com.cloud.agent.api.to.VolumeTO;
 import com.cloud.vm.VirtualMachine;
+import org.apache.cloudstack.storage.to.VolumeObjectTO;
+
+import java.util.List;
 
 public class RevertToVMSnapshotAnswer extends Answer {
 
-    private List<VolumeTO> volumeTOs;
+    private List<VolumeObjectTO> volumeTOs;
     private VirtualMachine.State vmState;
 
     public RevertToVMSnapshotAnswer(RevertToVMSnapshotCommand cmd, boolean result,
@@ -37,7 +37,7 @@ public class RevertToVMSnapshotAnswer extends Answer {
     }
 
     public RevertToVMSnapshotAnswer(RevertToVMSnapshotCommand cmd,
-            List<VolumeTO> volumeTOs,
+            List<VolumeObjectTO> volumeTOs,
             VirtualMachine.State vmState) {
         super(cmd, true, "");
         this.volumeTOs = volumeTOs;
@@ -48,11 +48,11 @@ public class RevertToVMSnapshotAnswer extends Answer {
         return vmState;
     }
 
-    public List<VolumeTO> getVolumeTOs() {
+    public List<VolumeObjectTO> getVolumeTOs() {
         return volumeTOs;
     }
 
-    public void setVolumeTOs(List<VolumeTO> volumeTOs) {
+    public void setVolumeTOs(List<VolumeObjectTO> volumeTOs) {
         this.volumeTOs = volumeTOs;
     }
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/a6ce66e5/core/src/com/cloud/agent/api/RevertToVMSnapshotCommand.java
----------------------------------------------------------------------
diff --git a/core/src/com/cloud/agent/api/RevertToVMSnapshotCommand.java b/core/src/com/cloud/agent/api/RevertToVMSnapshotCommand.java
index 429a186..1e5fd6c 100644
--- a/core/src/com/cloud/agent/api/RevertToVMSnapshotCommand.java
+++ b/core/src/com/cloud/agent/api/RevertToVMSnapshotCommand.java
@@ -19,10 +19,11 @@ package com.cloud.agent.api;
 import java.util.List;
 
 import com.cloud.agent.api.to.VolumeTO;
+import org.apache.cloudstack.storage.to.VolumeObjectTO;
 
 public class RevertToVMSnapshotCommand extends VMSnapshotBaseCommand {
 
-    public RevertToVMSnapshotCommand(String vmName, VMSnapshotTO snapshot, List<VolumeTO> volumeTOs, String guestOSType) {
+    public RevertToVMSnapshotCommand(String vmName, VMSnapshotTO snapshot, List<VolumeObjectTO> volumeTOs, String guestOSType) {
         super(vmName, snapshot, volumeTOs, guestOSType);
     }
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/a6ce66e5/core/src/com/cloud/agent/api/VMSnapshotBaseCommand.java
----------------------------------------------------------------------
diff --git a/core/src/com/cloud/agent/api/VMSnapshotBaseCommand.java b/core/src/com/cloud/agent/api/VMSnapshotBaseCommand.java
index 2120f2f..b2c5241 100644
--- a/core/src/com/cloud/agent/api/VMSnapshotBaseCommand.java
+++ b/core/src/com/cloud/agent/api/VMSnapshotBaseCommand.java
@@ -19,27 +19,29 @@ package com.cloud.agent.api;
 
 import java.util.List;
 
+import com.cloud.agent.api.to.DataTO;
 import com.cloud.agent.api.to.VolumeTO;
+import org.apache.cloudstack.storage.to.VolumeObjectTO;
 
 public class VMSnapshotBaseCommand extends Command{
-    protected List<VolumeTO> volumeTOs;
+    protected List<VolumeObjectTO> volumeTOs;
     protected VMSnapshotTO target;
     protected String vmName;
     protected String guestOSType;
     
     
-    public VMSnapshotBaseCommand(String vmName, VMSnapshotTO snapshot, List<VolumeTO> volumeTOs, String guestOSType) {
+    public VMSnapshotBaseCommand(String vmName, VMSnapshotTO snapshot, List<VolumeObjectTO> volumeTOs, String guestOSType) {
         this.vmName = vmName;
         this.target = snapshot;
         this.volumeTOs = volumeTOs;
         this.guestOSType = guestOSType;
     }
     
-    public List<VolumeTO> getVolumeTOs() {
+    public List<VolumeObjectTO> getVolumeTOs() {
         return volumeTOs;
     }
 
-    public void setVolumeTOs(List<VolumeTO> volumeTOs) {
+    public void setVolumeTOs(List<VolumeObjectTO> volumeTOs) {
         this.volumeTOs = volumeTOs;
     }
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/a6ce66e5/core/src/org/apache/cloudstack/storage/to/VolumeObjectTO.java
----------------------------------------------------------------------
diff --git a/core/src/org/apache/cloudstack/storage/to/VolumeObjectTO.java b/core/src/org/apache/cloudstack/storage/to/VolumeObjectTO.java
index 5685fad..46659a3 100644
--- a/core/src/org/apache/cloudstack/storage/to/VolumeObjectTO.java
+++ b/core/src/org/apache/cloudstack/storage/to/VolumeObjectTO.java
@@ -38,6 +38,8 @@ public class VolumeObjectTO implements DataTO {
     private String chainInfo;
     private Storage.ImageFormat format;
     private long id;
+
+    private Long deviceId;
     private Long bytesReadRate;
     private Long bytesWriteRate;
     private Long iopsReadRate;
@@ -70,6 +72,7 @@ public class VolumeObjectTO implements DataTO {
         this.iopsReadRate = volume.getIopsReadRate();
         this.iopsWriteRate = volume.getIopsWriteRate();
         this.hypervisorType = volume.getHypervisorType();
+        setDeviceId(volume.getDeviceId());
     }
 
     public String getUuid() {
@@ -220,4 +223,13 @@ public class VolumeObjectTO implements DataTO {
         return iopsWriteRate;
     }
 
+    public Long getDeviceId() {
+        return deviceId;
+    }
+
+    public void setDeviceId(Long deviceId) {
+        this.deviceId = deviceId;
+    }
+
+
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/a6ce66e5/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/VMSnapshotStrategy.java
----------------------------------------------------------------------
diff --git a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/VMSnapshotStrategy.java b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/VMSnapshotStrategy.java
new file mode 100644
index 0000000..8dd6eca
--- /dev/null
+++ b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/VMSnapshotStrategy.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.engine.subsystem.api.storage;
+
+import com.cloud.vm.snapshot.VMSnapshot;
+
+public interface VMSnapshotStrategy {
+    VMSnapshot takeVMSnapshot(VMSnapshot vmSnapshot);
+    boolean deleteVMSnapshot(VMSnapshot vmSnapshot);
+    boolean revertVMSnapshot(VMSnapshot vmSnapshot);
+    boolean canHandle(VMSnapshot vmSnapshot);
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/a6ce66e5/engine/schema/src/com/cloud/vm/snapshot/VMSnapshotDetailsVO.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/vm/snapshot/VMSnapshotDetailsVO.java b/engine/schema/src/com/cloud/vm/snapshot/VMSnapshotDetailsVO.java
new file mode 100644
index 0000000..934dd92
--- /dev/null
+++ b/engine/schema/src/com/cloud/vm/snapshot/VMSnapshotDetailsVO.java
@@ -0,0 +1,87 @@
+/*
+ * 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.vm.snapshot;
+
+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;
+import javax.persistence.TableGenerator;
+
+@Entity
+@Table(name = "vm_snapshot_details")
+public class VMSnapshotDetailsVO implements InternalIdentity {
+    @Id
+    @TableGenerator(name = "vm_snapshot_details_seq", table = "sequence", pkColumnName = "name", valueColumnName = "value", pkColumnValue = "vm_snapshot_details_seq", allocationSize = 1)
+    @GeneratedValue(strategy = GenerationType.TABLE)
+    @Column(name = "id")
+    private long id;
+
+    @Column(name = "vm_snapshot_id")
+    Long vmSnapshotId;
+
+    @Column(name = "name")
+    String name;
+
+    @Column(name = "value")
+    String value;
+
+    public VMSnapshotDetailsVO() {
+
+    }
+
+    public VMSnapshotDetailsVO(Long vmSnapshotId, String name, String value) {
+        this.vmSnapshotId = vmSnapshotId;
+        this.name = name;
+        this.value = value;
+    }
+
+    public Long getVmSnapshotId() {
+        return this.vmSnapshotId;
+    }
+
+    public void setVmSnapshotId(Long vmSnapshotId) {
+        this.vmSnapshotId = vmSnapshotId;
+    }
+
+    public String getName() {
+        return this.name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getValue() {
+        return this.value;
+    }
+
+    public void setValue(String value) {
+        this.value = value;
+    }
+
+    @Override
+    public long getId() {
+       return id;
+    }
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/a6ce66e5/engine/schema/src/com/cloud/vm/snapshot/VMSnapshotVO.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/vm/snapshot/VMSnapshotVO.java b/engine/schema/src/com/cloud/vm/snapshot/VMSnapshotVO.java
index 03d4945..477148c 100644
--- a/engine/schema/src/com/cloud/vm/snapshot/VMSnapshotVO.java
+++ b/engine/schema/src/com/cloud/vm/snapshot/VMSnapshotVO.java
@@ -41,7 +41,7 @@ public class VMSnapshotVO implements VMSnapshot {
     @TableGenerator(name = "vm_snapshots_sq", table = "sequence", pkColumnName = "name", valueColumnName = "value", pkColumnValue = "vm_snapshots_seq", allocationSize = 1)
     @GeneratedValue(strategy = GenerationType.TABLE)
     @Column(name = "id")
-    long id;
+    Long id;
 
     @Column(name = "uuid")
     String uuid = UUID.randomUUID().toString();

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/a6ce66e5/engine/schema/src/com/cloud/vm/snapshot/dao/VMSnapshotDetailsDao.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/vm/snapshot/dao/VMSnapshotDetailsDao.java b/engine/schema/src/com/cloud/vm/snapshot/dao/VMSnapshotDetailsDao.java
new file mode 100644
index 0000000..e84178c
--- /dev/null
+++ b/engine/schema/src/com/cloud/vm/snapshot/dao/VMSnapshotDetailsDao.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 com.cloud.vm.snapshot.dao;
+
+import com.cloud.utils.db.GenericDao;
+import com.cloud.vm.snapshot.VMSnapshotDetailsVO;
+
+import java.util.Map;
+
+public interface VMSnapshotDetailsDao extends GenericDao<VMSnapshotDetailsVO, Long> {
+    Map<String, String> getDetails(Long vmSnapshotId);
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/a6ce66e5/engine/schema/src/com/cloud/vm/snapshot/dao/VMSnapshotDetailsDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/vm/snapshot/dao/VMSnapshotDetailsDaoImpl.java b/engine/schema/src/com/cloud/vm/snapshot/dao/VMSnapshotDetailsDaoImpl.java
new file mode 100644
index 0000000..b528b39
--- /dev/null
+++ b/engine/schema/src/com/cloud/vm/snapshot/dao/VMSnapshotDetailsDaoImpl.java
@@ -0,0 +1,52 @@
+/*
+ * 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.vm.snapshot.dao;
+
+import com.cloud.utils.db.GenericDaoBase;
+import com.cloud.utils.db.SearchBuilder;
+import com.cloud.utils.db.SearchCriteria;
+import com.cloud.vm.snapshot.VMSnapshotDetailsVO;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class VMSnapshotDetailsDaoImpl extends GenericDaoBase<VMSnapshotDetailsVO, Long> implements VMSnapshotDetailsDao {
+    protected final SearchBuilder<VMSnapshotDetailsVO> searchDetails;
+
+    protected VMSnapshotDetailsDaoImpl() {
+        super();
+        searchDetails = createSearchBuilder();
+        searchDetails.and("vmsnapshotId", searchDetails.entity().getVmSnapshotId(), SearchCriteria.Op.EQ);
+        searchDetails.done();
+    }
+    @Override
+    public Map<String, String> getDetails(Long vmSnapshotId) {
+        SearchCriteria<VMSnapshotDetailsVO> sc = searchDetails.create();
+        sc.setParameters("vmsnapshotId", vmSnapshotId);
+
+        List<VMSnapshotDetailsVO> details = listBy(sc);
+        Map<String, String> detailsMap = new HashMap<String, String>();
+        for (VMSnapshotDetailsVO detail : details) {
+            detailsMap.put(detail.getName(), detail.getValue());
+        }
+
+        return detailsMap;
+    }
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/a6ce66e5/engine/storage/datamotion/src/org/apache/cloudstack/storage/motion/AncientDataMotionStrategy.java
----------------------------------------------------------------------
diff --git a/engine/storage/datamotion/src/org/apache/cloudstack/storage/motion/AncientDataMotionStrategy.java b/engine/storage/datamotion/src/org/apache/cloudstack/storage/motion/AncientDataMotionStrategy.java
index 5f5f01e..7b5b7fc 100644
--- a/engine/storage/datamotion/src/org/apache/cloudstack/storage/motion/AncientDataMotionStrategy.java
+++ b/engine/storage/datamotion/src/org/apache/cloudstack/storage/motion/AncientDataMotionStrategy.java
@@ -87,38 +87,12 @@ AncientDataMotionStrategy implements DataMotionStrategy {
     @Inject
     EndPointSelector selector;
     @Inject
-    TemplateManager templateMgr;
-    @Inject
-    VolumeDataStoreDao volumeStoreDao;
-    @Inject
-    HostDao hostDao;
-    @Inject
     ConfigurationDao configDao;
     @Inject
-    StorageManager storageMgr;
-    @Inject
     VolumeDao volDao;
     @Inject
-    VMTemplateDao templateDao;
-    @Inject
-    SnapshotManager snapshotMgr;
-    @Inject
-    SnapshotDao snapshotDao;
-    @Inject
-    SnapshotDataStoreDao _snapshotStoreDao;
-    @Inject
-    PrimaryDataStoreDao primaryDataStoreDao;
-    @Inject
     DataStoreManager dataStoreMgr;
     @Inject
-    TemplateDataStoreDao templateStoreDao;
-    @Inject
-    DiskOfferingDao diskOfferingDao;
-    @Inject
-    VMTemplatePoolDao templatePoolDao;
-    @Inject
-    VolumeOrchestrationService volumeMgr;
-    @Inject
     StorageCacheManager cacheMgr;
     @Inject
     ManagementService _mgmtServer;

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/a6ce66e5/engine/storage/integration-test/test/com/cloud/vm/snapshot/dao/VmSnapshotDaoTest.java
----------------------------------------------------------------------
diff --git a/engine/storage/integration-test/test/com/cloud/vm/snapshot/dao/VmSnapshotDaoTest.java b/engine/storage/integration-test/test/com/cloud/vm/snapshot/dao/VmSnapshotDaoTest.java
new file mode 100644
index 0000000..fc52f89
--- /dev/null
+++ b/engine/storage/integration-test/test/com/cloud/vm/snapshot/dao/VmSnapshotDaoTest.java
@@ -0,0 +1,46 @@
+/*
+ * 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.vm.snapshot.dao;
+
+import com.cloud.vm.snapshot.VMSnapshotDetailsVO;
+import junit.framework.Assert;
+import org.apache.cloudstack.storage.test.CloudStackTestNGBase;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+import javax.inject.Inject;
+import java.util.Map;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(locations = "classpath:/storageContext.xml")
+public class VmSnapshotDaoTest extends CloudStackTestNGBase {
+    @Inject
+    VMSnapshotDetailsDao vmsnapshotDetailsDao;
+
+    @Test
+    public void testVmSnapshotDetails() {
+        VMSnapshotDetailsVO detailsVO = new VMSnapshotDetailsVO(1L, "test", "foo");
+        vmsnapshotDetailsDao.persist(detailsVO);
+        Map<String, String> details = vmsnapshotDetailsDao.getDetails(1L);
+        Assert.assertTrue(details.containsKey("test"));
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/a6ce66e5/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/ChildTestConfiguration.java
----------------------------------------------------------------------
diff --git a/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/ChildTestConfiguration.java b/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/ChildTestConfiguration.java
index d5eea85..228b957 100644
--- a/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/ChildTestConfiguration.java
+++ b/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/ChildTestConfiguration.java
@@ -16,30 +16,6 @@
 // under the License.
 package org.apache.cloudstack.storage.test;
 
-import java.io.IOException;
-
-import com.cloud.event.ActionEventUtils;
-import com.cloud.event.dao.EventDaoImpl;
-import org.apache.cloudstack.acl.APIChecker;
-import org.apache.cloudstack.engine.orchestration.service.VolumeOrchestrationService;
-import org.apache.cloudstack.engine.service.api.OrchestrationService;
-import org.apache.cloudstack.engine.subsystem.api.storage.EndPointSelector;
-import org.apache.cloudstack.framework.config.dao.ConfigurationDaoImpl;
-import org.apache.cloudstack.framework.rpc.RpcProvider;
-import org.apache.cloudstack.storage.cache.manager.StorageCacheManagerImpl;
-import org.apache.cloudstack.storage.test.ChildTestConfiguration.Library;
-import org.apache.cloudstack.test.utils.SpringUtils;
-
-import org.mockito.Mockito;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.ComponentScan;
-import org.springframework.context.annotation.ComponentScan.Filter;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.FilterType;
-import org.springframework.core.type.classreading.MetadataReader;
-import org.springframework.core.type.classreading.MetadataReaderFactory;
-import org.springframework.core.type.filter.TypeFilter;
-
 import com.cloud.agent.AgentManager;
 import com.cloud.alert.AlertManager;
 import com.cloud.capacity.dao.CapacityDaoImpl;
@@ -55,6 +31,8 @@ import com.cloud.dc.dao.DcDetailsDaoImpl;
 import com.cloud.dc.dao.HostPodDaoImpl;
 import com.cloud.dc.dao.PodVlanDaoImpl;
 import com.cloud.domain.dao.DomainDaoImpl;
+import com.cloud.event.ActionEventUtils;
+import com.cloud.event.dao.EventDaoImpl;
 import com.cloud.host.dao.HostDao;
 import com.cloud.host.dao.HostDaoImpl;
 import com.cloud.host.dao.HostDetailsDaoImpl;
@@ -80,7 +58,6 @@ import com.cloud.storage.dao.VolumeDaoImpl;
 import com.cloud.storage.dao.VolumeHostDaoImpl;
 import com.cloud.storage.download.DownloadMonitorImpl;
 import com.cloud.storage.secondary.SecondaryStorageVmManager;
-import com.cloud.storage.snapshot.SnapshotManager;
 import com.cloud.tags.dao.ResourceTagsDaoImpl;
 import com.cloud.template.TemplateManager;
 import com.cloud.user.AccountManager;
@@ -96,6 +73,26 @@ import com.cloud.vm.dao.UserVmDaoImpl;
 import com.cloud.vm.dao.UserVmDetailsDaoImpl;
 import com.cloud.vm.dao.VMInstanceDaoImpl;
 import com.cloud.vm.snapshot.dao.VMSnapshotDaoImpl;
+import org.apache.cloudstack.acl.APIChecker;
+import org.apache.cloudstack.engine.orchestration.service.VolumeOrchestrationService;
+import org.apache.cloudstack.engine.service.api.OrchestrationService;
+import org.apache.cloudstack.engine.subsystem.api.storage.EndPointSelector;
+import org.apache.cloudstack.framework.config.dao.ConfigurationDaoImpl;
+import org.apache.cloudstack.framework.rpc.RpcProvider;
+import org.apache.cloudstack.storage.cache.manager.StorageCacheManagerImpl;
+import org.apache.cloudstack.storage.test.ChildTestConfiguration.Library;
+import org.apache.cloudstack.test.utils.SpringUtils;
+import org.mockito.Mockito;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.ComponentScan.Filter;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.FilterType;
+import org.springframework.core.type.classreading.MetadataReader;
+import org.springframework.core.type.classreading.MetadataReaderFactory;
+import org.springframework.core.type.filter.TypeFilter;
+
+import java.io.IOException;
 
 @Configuration
 @ComponentScan(basePackageClasses = { NicDaoImpl.class, VMInstanceDaoImpl.class, VMTemplateHostDaoImpl.class,

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/a6ce66e5/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/SnapshotTest.java
----------------------------------------------------------------------
diff --git a/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/SnapshotTest.java b/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/SnapshotTest.java
index 81f77d6..36bc912 100644
--- a/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/SnapshotTest.java
+++ b/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/SnapshotTest.java
@@ -18,16 +18,42 @@
  */
 package org.apache.cloudstack.storage.test;
 
-import java.net.URI;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.UUID;
-import java.util.concurrent.ExecutionException;
-
-import javax.inject.Inject;
-
+import com.cloud.agent.AgentManager;
+import com.cloud.agent.api.Command;
+import com.cloud.dc.ClusterVO;
+import com.cloud.dc.DataCenter.NetworkType;
+import com.cloud.dc.DataCenterVO;
+import com.cloud.dc.HostPodVO;
+import com.cloud.dc.dao.ClusterDao;
+import com.cloud.dc.dao.DataCenterDao;
+import com.cloud.dc.dao.HostPodDao;
+import com.cloud.host.Host;
+import com.cloud.host.Host.Type;
+import com.cloud.host.HostVO;
+import com.cloud.host.dao.HostDao;
+import com.cloud.hypervisor.Hypervisor.HypervisorType;
+import com.cloud.hypervisor.HypervisorGuruManager;
+import com.cloud.org.Cluster.ClusterType;
+import com.cloud.org.Managed.ManagedState;
+import com.cloud.resource.ResourceManager;
+import com.cloud.resource.ResourceState;
+import com.cloud.storage.DataStoreRole;
+import com.cloud.storage.ScopeType;
+import com.cloud.storage.Snapshot;
+import com.cloud.storage.SnapshotVO;
+import com.cloud.storage.Storage;
+import com.cloud.storage.Storage.ImageFormat;
+import com.cloud.storage.Storage.StoragePoolType;
+import com.cloud.storage.Storage.TemplateType;
+import com.cloud.storage.StoragePoolStatus;
+import com.cloud.storage.VMTemplateVO;
+import com.cloud.storage.Volume;
+import com.cloud.storage.VolumeVO;
+import com.cloud.storage.dao.SnapshotDao;
+import com.cloud.storage.dao.VMTemplateDao;
+import com.cloud.storage.dao.VolumeDao;
+import com.cloud.utils.component.ComponentContext;
 import junit.framework.Assert;
-
 import org.apache.cloudstack.engine.subsystem.api.storage.DataObject;
 import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
 import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
@@ -39,13 +65,14 @@ 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.SnapshotService;
 import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotStrategy;
+import org.apache.cloudstack.engine.subsystem.api.storage.StrategyPriority;
 import org.apache.cloudstack.engine.subsystem.api.storage.TemplateDataFactory;
 import org.apache.cloudstack.engine.subsystem.api.storage.TemplateInfo;
 import org.apache.cloudstack.engine.subsystem.api.storage.TemplateService;
+import org.apache.cloudstack.engine.subsystem.api.storage.TemplateService.TemplateApiResult;
 import org.apache.cloudstack.engine.subsystem.api.storage.VolumeDataFactory;
 import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo;
 import org.apache.cloudstack.engine.subsystem.api.storage.VolumeService;
-import org.apache.cloudstack.engine.subsystem.api.storage.TemplateService.TemplateApiResult;
 import org.apache.cloudstack.engine.subsystem.api.storage.VolumeService.VolumeApiResult;
 import org.apache.cloudstack.framework.async.AsyncCallFuture;
 import org.apache.cloudstack.storage.LocalHostEndpoint;
@@ -64,41 +91,12 @@ import org.springframework.test.context.ContextConfiguration;
 import org.testng.AssertJUnit;
 import org.testng.annotations.Test;
 
-import com.cloud.agent.AgentManager;
-import com.cloud.agent.api.Command;
-import com.cloud.dc.ClusterVO;
-import com.cloud.dc.DataCenter.NetworkType;
-import com.cloud.dc.DataCenterVO;
-import com.cloud.dc.HostPodVO;
-import com.cloud.dc.dao.ClusterDao;
-import com.cloud.dc.dao.DataCenterDao;
-import com.cloud.dc.dao.HostPodDao;
-import com.cloud.host.Host;
-import com.cloud.host.Host.Type;
-import com.cloud.host.HostVO;
-import com.cloud.host.dao.HostDao;
-import com.cloud.hypervisor.Hypervisor.HypervisorType;
-import com.cloud.hypervisor.HypervisorGuruManager;
-import com.cloud.org.Cluster.ClusterType;
-import com.cloud.org.Managed.ManagedState;
-import com.cloud.resource.ResourceManager;
-import com.cloud.resource.ResourceState;
-import com.cloud.storage.DataStoreRole;
-import com.cloud.storage.ScopeType;
-import com.cloud.storage.Snapshot;
-import com.cloud.storage.SnapshotVO;
-import com.cloud.storage.Storage;
-import com.cloud.storage.Storage.ImageFormat;
-import com.cloud.storage.Storage.StoragePoolType;
-import com.cloud.storage.Storage.TemplateType;
-import com.cloud.storage.StoragePoolStatus;
-import com.cloud.storage.VMTemplateVO;
-import com.cloud.storage.Volume;
-import com.cloud.storage.VolumeVO;
-import com.cloud.storage.dao.SnapshotDao;
-import com.cloud.storage.dao.VMTemplateDao;
-import com.cloud.storage.dao.VolumeDao;
-import com.cloud.utils.component.ComponentContext;
+import javax.inject.Inject;
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+import java.util.concurrent.ExecutionException;
 
 @ContextConfiguration(locations = { "classpath:/storageContext.xml" })
 public class SnapshotTest extends CloudStackTestNGBase {
@@ -404,7 +402,7 @@ public class SnapshotTest extends CloudStackTestNGBase {
         StrategyPriority.sortStrategies(snapshotStrategies, snapshot);
 
         for (SnapshotStrategy strategy : this.snapshotStrategies) {
-            if (strategy.canHandle(snapshot) != Priority.CANT_HANDLE) {
+            if (strategy.canHandle(snapshot) != StrategyPriority.Priority.CANT_HANDLE) {
                 snapshot = strategy.takeSnapshot(snapshot);
                 result = true;
             }
@@ -429,7 +427,7 @@ public class SnapshotTest extends CloudStackTestNGBase {
         StrategyPriority.sortStrategies(snapshotStrategies, newSnapshot);
 
         for (SnapshotStrategy strategy : this.snapshotStrategies) {
-            if (strategy.canHandle(snapshot) != Priority.CANT_HANDLE) {
+            if (strategy.canHandle(snapshot) != StrategyPriority.Priority.CANT_HANDLE) {
                 newSnapshot = strategy.takeSnapshot(snapshot);
             }
         }
@@ -437,7 +435,7 @@ public class SnapshotTest extends CloudStackTestNGBase {
 
         // create another snapshot
         for (SnapshotStrategy strategy : this.snapshotStrategies) {
-            if (strategy.canHandle(snapshot) != Priority.CANT_HANDLE) {
+            if (strategy.canHandle(snapshot) != StrategyPriority.Priority.CANT_HANDLE) {
                 strategy.deleteSnapshot(newSnapshot.getId());
             }
         }
@@ -454,7 +452,7 @@ public class SnapshotTest extends CloudStackTestNGBase {
         StrategyPriority.sortStrategies(snapshotStrategies, snapshot);
 
         for (SnapshotStrategy strategy : this.snapshotStrategies) {
-            if (strategy.canHandle(snapshot) != Priority.CANT_HANDLE) {
+            if (strategy.canHandle(snapshot) != StrategyPriority.Priority.CANT_HANDLE) {
                 snapshot = strategy.takeSnapshot(snapshot);
                 result = true;
             }
@@ -487,7 +485,7 @@ public class SnapshotTest extends CloudStackTestNGBase {
         StrategyPriority.sortStrategies(snapshotStrategies, newSnapshot);
 
         for (SnapshotStrategy strategy : this.snapshotStrategies) {
-            if (strategy.canHandle(snapshot) != Priority.CANT_HANDLE) {
+            if (strategy.canHandle(snapshot) != StrategyPriority.Priority.CANT_HANDLE) {
                 newSnapshot = strategy.takeSnapshot(snapshot);
             }
         }
@@ -499,7 +497,7 @@ public class SnapshotTest extends CloudStackTestNGBase {
 
         try {
             for (SnapshotStrategy strategy : this.snapshotStrategies) {
-                if (strategy.canHandle(snapshot) != Priority.CANT_HANDLE) {
+                if (strategy.canHandle(snapshot) != StrategyPriority.Priority.CANT_HANDLE) {
                     boolean res = strategy.deleteSnapshot(newSnapshot.getId());
                     Assert.assertTrue(res);
                 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/a6ce66e5/engine/storage/integration-test/test/resources/storageContext.xml
----------------------------------------------------------------------
diff --git a/engine/storage/integration-test/test/resources/storageContext.xml b/engine/storage/integration-test/test/resources/storageContext.xml
index 664f1e3..884e813 100644
--- a/engine/storage/integration-test/test/resources/storageContext.xml
+++ b/engine/storage/integration-test/test/resources/storageContext.xml
@@ -85,4 +85,6 @@
   <bean id="AccountGuestVlanMapDaoImpl" class="com.cloud.network.dao.AccountGuestVlanMapDaoImpl" />
   <bean id="StorageCacheReplacementAlgorithm" class="org.apache.cloudstack.storage.cache.manager.StorageCacheReplacementAlgorithmLRU" />
   <bean id="ServiceOfferingDetailsDao" class="com.cloud.service.dao.ServiceOfferingDetailsDaoImpl" />
+  <bean id="vmsnapshotDetailsDao" class="com.cloud.vm.snapshot.dao.VMSnapshotDetailsDaoImpl" />
+  <bean id="snapshotManager" class="com.cloud.storage.snapshot.SnapshotManagerImpl" />
 </beans>

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/a6ce66e5/engine/storage/snapshot/pom.xml
----------------------------------------------------------------------
diff --git a/engine/storage/snapshot/pom.xml b/engine/storage/snapshot/pom.xml
index 8a84704..808d0c2 100644
--- a/engine/storage/snapshot/pom.xml
+++ b/engine/storage/snapshot/pom.xml
@@ -30,5 +30,37 @@
       <artifactId>cloud-engine-api</artifactId>
       <version>${project.version}</version>
     </dependency>
+      <dependency>
+          <groupId>org.apache.cloudstack</groupId>
+          <artifactId>cloud-api</artifactId>
+          <version>${project.version}</version>
+          <type>test-jar</type>
+          <scope>test</scope>
+      </dependency>
   </dependencies>
+    <build>
+        <plugins>
+            <plugin>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>testCompile</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <artifactId>maven-surefire-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <phase>integration-test</phase>
+                        <goals>
+                            <goal>test</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
 </project>

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/a6ce66e5/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/SnapshotServiceImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/SnapshotServiceImpl.java b/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/SnapshotServiceImpl.java
index a4014b0..0799721 100644
--- a/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/SnapshotServiceImpl.java
+++ b/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/SnapshotServiceImpl.java
@@ -17,11 +17,10 @@
 
 package org.apache.cloudstack.storage.snapshot;
 
-import java.util.concurrent.ExecutionException;
-
-import javax.inject.Inject;
-
-import org.apache.cloudstack.engine.orchestration.service.VolumeOrchestrationService;
+import com.cloud.storage.DataStoreRole;
+import com.cloud.storage.Snapshot;
+import com.cloud.utils.exception.CloudRuntimeException;
+import com.cloud.utils.fsm.NoTransitionException;
 import org.apache.cloudstack.engine.subsystem.api.storage.CopyCommandResult;
 import org.apache.cloudstack.engine.subsystem.api.storage.CreateCmdResult;
 import org.apache.cloudstack.engine.subsystem.api.storage.DataMotionService;
@@ -41,57 +40,26 @@ import org.apache.cloudstack.framework.async.AsyncCompletionCallback;
 import org.apache.cloudstack.framework.async.AsyncRpcContext;
 import org.apache.cloudstack.storage.command.CommandResult;
 import org.apache.cloudstack.storage.command.CopyCmdAnswer;
-import org.apache.cloudstack.storage.datastore.ObjectInDataStoreManager;
 import org.apache.cloudstack.storage.datastore.PrimaryDataStore;
-import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
 import org.apache.cloudstack.storage.datastore.db.SnapshotDataStoreDao;
 import org.apache.cloudstack.storage.datastore.db.SnapshotDataStoreVO;
 import org.apache.log4j.Logger;
 import org.springframework.stereotype.Component;
 
-import com.cloud.dc.dao.ClusterDao;
-import com.cloud.storage.DataStoreRole;
-import com.cloud.storage.Snapshot;
-import com.cloud.storage.dao.SnapshotDao;
-import com.cloud.storage.dao.VolumeDao;
-import com.cloud.storage.snapshot.SnapshotManager;
-import com.cloud.utils.exception.CloudRuntimeException;
-import com.cloud.utils.fsm.NoTransitionException;
-import com.cloud.vm.dao.UserVmDao;
-import com.cloud.vm.snapshot.dao.VMSnapshotDao;
+import javax.inject.Inject;
+import java.util.concurrent.ExecutionException;
 
 @Component
 public class SnapshotServiceImpl implements SnapshotService {
     private static final Logger s_logger = Logger.getLogger(SnapshotServiceImpl.class);
     @Inject
-    protected VolumeDao _volsDao;
-    @Inject
-    protected UserVmDao _vmDao;
-    @Inject
-    protected PrimaryDataStoreDao _storagePoolDao;
-    @Inject
-    protected ClusterDao _clusterDao;
-    @Inject
-    protected SnapshotDao _snapshotDao;
-    @Inject
     protected SnapshotDataStoreDao _snapshotStoreDao;
-
-    @Inject
-    protected SnapshotManager snapshotMgr;
-    @Inject
-    protected VolumeOrchestrationService volumeMgr;
-    @Inject
-    protected SnapshotStateMachineManager stateMachineManager;
     @Inject
     SnapshotDataFactory snapshotfactory;
     @Inject
     DataStoreManager dataStoreMgr;
     @Inject
     DataMotionService motionSrv;
-    @Inject
-    ObjectInDataStoreManager objInStoreMgr;
-    @Inject
-    VMSnapshotDao _vmSnapshotDao;
 
     static private class CreateSnapshotContext<T> extends AsyncRpcContext<T> {
         final SnapshotInfo snapshot;

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/a6ce66e5/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/XenserverSnapshotStrategy.java
----------------------------------------------------------------------
diff --git a/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/XenserverSnapshotStrategy.java b/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/XenserverSnapshotStrategy.java
index 6a874d6..403f113 100644
--- a/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/XenserverSnapshotStrategy.java
+++ b/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/XenserverSnapshotStrategy.java
@@ -16,8 +16,17 @@
 // under the License.
 package org.apache.cloudstack.storage.snapshot;
 
-import javax.inject.Inject;
-
+import com.cloud.exception.InvalidParameterValueException;
+import com.cloud.storage.DataStoreRole;
+import com.cloud.storage.Snapshot;
+import com.cloud.storage.SnapshotVO;
+import com.cloud.storage.Volume;
+import com.cloud.storage.dao.SnapshotDao;
+import com.cloud.storage.snapshot.SnapshotManager;
+import com.cloud.utils.NumbersUtil;
+import com.cloud.utils.db.DB;
+import com.cloud.utils.exception.CloudRuntimeException;
+import com.cloud.utils.fsm.NoTransitionException;
 import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
 import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
 import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine.Event;
@@ -36,25 +45,13 @@ import org.apache.cloudstack.storage.to.SnapshotObjectTO;
 import org.apache.log4j.Logger;
 import org.springframework.stereotype.Component;
 
-import com.cloud.exception.InvalidParameterValueException;
-import com.cloud.storage.DataStoreRole;
-import com.cloud.storage.Snapshot;
-import com.cloud.storage.SnapshotVO;
-import com.cloud.storage.Volume;
-import com.cloud.storage.dao.SnapshotDao;
-import com.cloud.storage.snapshot.SnapshotManager;
-import com.cloud.utils.NumbersUtil;
-import com.cloud.utils.db.DB;
-import com.cloud.utils.exception.CloudRuntimeException;
-import com.cloud.utils.fsm.NoTransitionException;
+import javax.inject.Inject;
 
 @Component
 public class XenserverSnapshotStrategy extends SnapshotStrategyBase {
     private static final Logger s_logger = Logger.getLogger(XenserverSnapshotStrategy.class);
 
     @Inject
-    SnapshotManager snapshotMgr;
-    @Inject
     SnapshotService snapshotSvr;
     @Inject
     DataStoreManager dataStoreMgr;

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/a6ce66e5/engine/storage/snapshot/src/org/apache/cloudstack/storage/vmsnapshot/DefaultVMSnapshotStrategy.java
----------------------------------------------------------------------
diff --git a/engine/storage/snapshot/src/org/apache/cloudstack/storage/vmsnapshot/DefaultVMSnapshotStrategy.java b/engine/storage/snapshot/src/org/apache/cloudstack/storage/vmsnapshot/DefaultVMSnapshotStrategy.java
new file mode 100644
index 0000000..6b5e5fb
--- /dev/null
+++ b/engine/storage/snapshot/src/org/apache/cloudstack/storage/vmsnapshot/DefaultVMSnapshotStrategy.java
@@ -0,0 +1,369 @@
+/*
+ * 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.vmsnapshot;
+
+import java.util.List;
+import java.util.Map;
+
+import javax.inject.Inject;
+import javax.naming.ConfigurationException;
+
+import org.apache.cloudstack.engine.subsystem.api.storage.VMSnapshotStrategy;
+import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
+import org.apache.cloudstack.storage.to.VolumeObjectTO;
+import org.apache.log4j.Logger;
+
+import com.cloud.agent.AgentManager;
+import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.CreateVMSnapshotAnswer;
+import com.cloud.agent.api.CreateVMSnapshotCommand;
+import com.cloud.agent.api.DeleteVMSnapshotAnswer;
+import com.cloud.agent.api.DeleteVMSnapshotCommand;
+import com.cloud.agent.api.RevertToVMSnapshotAnswer;
+import com.cloud.agent.api.RevertToVMSnapshotCommand;
+import com.cloud.agent.api.VMSnapshotTO;
+import com.cloud.event.EventTypes;
+import com.cloud.event.UsageEventUtils;
+import com.cloud.exception.AgentUnavailableException;
+import com.cloud.exception.OperationTimedoutException;
+import com.cloud.storage.DiskOfferingVO;
+import com.cloud.storage.GuestOSVO;
+import com.cloud.storage.VolumeVO;
+import com.cloud.storage.dao.DiskOfferingDao;
+import com.cloud.storage.dao.GuestOSDao;
+import com.cloud.storage.dao.VolumeDao;
+import com.cloud.uservm.UserVm;
+import com.cloud.utils.NumbersUtil;
+import com.cloud.utils.component.ManagerBase;
+import com.cloud.utils.db.DB;
+import com.cloud.utils.db.Transaction;
+import com.cloud.utils.exception.CloudRuntimeException;
+import com.cloud.utils.fsm.NoTransitionException;
+import com.cloud.vm.UserVmVO;
+import com.cloud.vm.dao.UserVmDao;
+import com.cloud.vm.snapshot.VMSnapshot;
+import com.cloud.vm.snapshot.VMSnapshotVO;
+import com.cloud.vm.snapshot.dao.VMSnapshotDao;
+
+public class DefaultVMSnapshotStrategy extends ManagerBase implements VMSnapshotStrategy {
+    private static final Logger s_logger = Logger.getLogger(DefaultVMSnapshotStrategy.class);
+    @Inject
+    VMSnapshotHelper vmSnapshotHelper;
+    @Inject
+    GuestOSDao guestOSDao;
+    @Inject
+    UserVmDao userVmDao;
+    @Inject
+    VMSnapshotDao vmSnapshotDao;
+    int _wait;
+    @Inject
+    ConfigurationDao configurationDao;
+    @Inject
+    AgentManager agentMgr;
+    @Inject
+    VolumeDao volumeDao;
+    @Inject
+    DiskOfferingDao diskOfferingDao;
+    @Override
+    public boolean configure(String name, Map<String, Object> params) throws ConfigurationException {
+        String value = configurationDao.getValue("vmsnapshot.create.wait");
+        _wait = NumbersUtil.parseInt(value, 1800);
+        return true;
+    }
+
+    public VMSnapshot takeVMSnapshot(VMSnapshot vmSnapshot) {
+        Long hostId = vmSnapshotHelper.pickRunningHost(vmSnapshot.getVmId());
+        UserVm userVm = userVmDao.findById(vmSnapshot.getVmId());
+        VMSnapshotVO vmSnapshotVO = (VMSnapshotVO)vmSnapshot;
+        try {
+            vmSnapshotHelper.vmSnapshotStateTransitTo(vmSnapshotVO, VMSnapshot.Event.CreateRequested);
+        } catch (NoTransitionException e) {
+            throw new CloudRuntimeException(e.getMessage());
+        }
+
+        CreateVMSnapshotAnswer answer = null;
+        boolean result = false;
+        try {
+            GuestOSVO guestOS = guestOSDao.findById(userVm.getGuestOSId());
+
+            List<VolumeObjectTO> volumeTOs = vmSnapshotHelper.getVolumeTOList(userVm.getId());
+
+            VMSnapshotTO current = null;
+            VMSnapshotVO currentSnapshot = vmSnapshotDao.findCurrentSnapshotByVmId(userVm.getId());
+            if (currentSnapshot != null)
+                current = vmSnapshotHelper.getSnapshotWithParents(currentSnapshot);
+            VMSnapshotTO target = new VMSnapshotTO(vmSnapshot.getId(),  vmSnapshot.getName(), vmSnapshot.getType(), null, vmSnapshot.getDescription(), false,
+                    current);
+            if (current == null)
+                vmSnapshotVO.setParent(null);
+            else
+                vmSnapshotVO.setParent(current.getId());
+
+            CreateVMSnapshotCommand ccmd = new CreateVMSnapshotCommand(userVm.getInstanceName(),target ,volumeTOs, guestOS.getDisplayName(),userVm.getState());
+            ccmd.setWait(_wait);
+
+            answer = (CreateVMSnapshotAnswer)agentMgr.send(hostId, ccmd);
+            if (answer != null && answer.getResult()) {
+                processAnswer(vmSnapshotVO, userVm, answer, hostId);
+                s_logger.debug("Create vm snapshot " + vmSnapshot.getName() + " succeeded for vm: " + userVm.getInstanceName());
+                result = true;
+
+                for (VolumeObjectTO volumeTo : answer.getVolumeTOs()){
+                    publishUsageEvent(EventTypes.EVENT_VM_SNAPSHOT_CREATE,vmSnapshot,userVm,volumeTo);
+                }
+                return vmSnapshot;
+            } else {
+                String errMsg = "Creating VM snapshot: " + vmSnapshot.getName() + " failed";
+                if(answer != null && answer.getDetails() != null)
+                    errMsg = errMsg + " due to " + answer.getDetails();
+                s_logger.error(errMsg);
+                throw new CloudRuntimeException(errMsg);
+            }
+        } catch (OperationTimedoutException e) {
+            s_logger.debug("Creating VM snapshot: " + vmSnapshot.getName() + " failed: " + e.toString());
+            throw new CloudRuntimeException("Creating VM snapshot: " + vmSnapshot.getName() + " failed: " + e.toString());
+        } catch (AgentUnavailableException e) {
+            s_logger.debug("Creating VM snapshot: " + vmSnapshot.getName() + " failed", e);
+            throw new CloudRuntimeException("Creating VM snapshot: " + vmSnapshot.getName() + " failed: " + e.toString());
+        } finally{
+            if (!result) {
+                try {
+                    vmSnapshotHelper.vmSnapshotStateTransitTo(vmSnapshot, VMSnapshot.Event.OperationFailed);
+                } catch (NoTransitionException e1) {
+                    s_logger.error("Cannot set vm snapshot state due to: " + e1.getMessage());
+                }
+            }
+        }
+    }
+
+    @Override
+    public boolean deleteVMSnapshot(VMSnapshot vmSnapshot) {
+        UserVmVO userVm = userVmDao.findById(vmSnapshot.getVmId());
+        VMSnapshotVO vmSnapshotVO = (VMSnapshotVO)vmSnapshot;
+        try {
+            vmSnapshotHelper.vmSnapshotStateTransitTo(vmSnapshot,VMSnapshot.Event.ExpungeRequested);
+        } catch (NoTransitionException e) {
+            s_logger.debug("Failed to change vm snapshot state with event ExpungeRequested");
+            throw new CloudRuntimeException("Failed to change vm snapshot state with event ExpungeRequested: " + e.getMessage());
+        }
+
+        try {
+            Long hostId = vmSnapshotHelper.pickRunningHost(vmSnapshot.getVmId());
+
+            List<VolumeObjectTO> volumeTOs = vmSnapshotHelper.getVolumeTOList(vmSnapshot.getVmId());
+
+            String vmInstanceName = userVm.getInstanceName();
+            VMSnapshotTO parent = vmSnapshotHelper.getSnapshotWithParents(vmSnapshotVO).getParent();
+            VMSnapshotTO vmSnapshotTO = new VMSnapshotTO(vmSnapshot.getId(), vmSnapshot.getName(), vmSnapshot.getType(),
+                    vmSnapshot.getCreated().getTime(), vmSnapshot.getDescription(), vmSnapshot.getCurrent(), parent);
+            GuestOSVO guestOS = guestOSDao.findById(userVm.getGuestOSId());
+            DeleteVMSnapshotCommand deleteSnapshotCommand = new DeleteVMSnapshotCommand(vmInstanceName, vmSnapshotTO, volumeTOs,guestOS.getDisplayName());
+
+            Answer answer = agentMgr.send(hostId, deleteSnapshotCommand);
+
+            if (answer != null && answer.getResult()) {
+                DeleteVMSnapshotAnswer deleteVMSnapshotAnswer = (DeleteVMSnapshotAnswer)answer;
+                processAnswer(vmSnapshotVO, userVm, answer, hostId);
+                for (VolumeObjectTO volumeTo : deleteVMSnapshotAnswer.getVolumeTOs()){
+                    publishUsageEvent(EventTypes.EVENT_VM_SNAPSHOT_DELETE,vmSnapshot,userVm,volumeTo);
+                }
+                return true;
+            } else {
+                String errMsg = (answer == null) ? null : answer.getDetails();
+                s_logger.error("Delete vm snapshot " + vmSnapshot.getName() + " of vm " + userVm.getInstanceName() + " failed due to " + errMsg);
+                throw new  CloudRuntimeException("Delete vm snapshot " + vmSnapshot.getName() + " of vm " + userVm.getInstanceName() + " failed due to " + errMsg);
+            }
+        } catch (OperationTimedoutException e) {
+            throw new CloudRuntimeException("Delete vm snapshot " + vmSnapshot.getName() + " of vm " + userVm.getInstanceName() + " failed due to " + e.getMessage());
+        } catch (AgentUnavailableException e) {
+            throw new CloudRuntimeException("Delete vm snapshot " + vmSnapshot.getName() + " of vm " + userVm.getInstanceName() + " failed due to " + e.getMessage());
+        }
+    }
+
+    @DB
+    protected void processAnswer(VMSnapshotVO vmSnapshot, UserVm userVm, Answer as, Long hostId) {
+        final Transaction txn = Transaction.currentTxn();
+        try {
+            txn.start();
+            if (as instanceof CreateVMSnapshotAnswer) {
+                CreateVMSnapshotAnswer answer = (CreateVMSnapshotAnswer) as;
+                finalizeCreate(vmSnapshot, answer.getVolumeTOs());
+                vmSnapshotHelper.vmSnapshotStateTransitTo(vmSnapshot, VMSnapshot.Event.OperationSucceeded);
+            } else if (as instanceof RevertToVMSnapshotAnswer) {
+                RevertToVMSnapshotAnswer answer = (RevertToVMSnapshotAnswer) as;
+                finalizeRevert(vmSnapshot, answer.getVolumeTOs());
+                vmSnapshotHelper.vmSnapshotStateTransitTo(vmSnapshot, VMSnapshot.Event.OperationSucceeded);
+            } else if (as instanceof DeleteVMSnapshotAnswer) {
+                DeleteVMSnapshotAnswer answer = (DeleteVMSnapshotAnswer) as;
+                finalizeDelete(vmSnapshot, answer.getVolumeTOs());
+                vmSnapshotDao.remove(vmSnapshot.getId());
+            }
+            txn.commit();
+        } catch (Exception e) {
+            String errMsg = "Error while process answer: " + as.getClass() + " due to " + e.getMessage();
+            s_logger.error(errMsg, e);
+            txn.rollback();
+            throw new CloudRuntimeException(errMsg);
+        } finally {
+            txn.close();
+        }
+    }
+
+    protected void finalizeDelete(VMSnapshotVO vmSnapshot, List<VolumeObjectTO> VolumeTOs) {
+        // update volumes path
+        updateVolumePath(VolumeTOs);
+
+        // update children's parent snapshots
+        List<VMSnapshotVO> children= vmSnapshotDao.listByParent(vmSnapshot.getId());
+        for (VMSnapshotVO child : children) {
+            child.setParent(vmSnapshot.getParent());
+            vmSnapshotDao.persist(child);
+        }
+
+        // update current snapshot
+        VMSnapshotVO current = vmSnapshotDao.findCurrentSnapshotByVmId(vmSnapshot.getVmId());
+        if(current != null && current.getId() == vmSnapshot.getId() && vmSnapshot.getParent() != null){
+            VMSnapshotVO parent = vmSnapshotDao.findById(vmSnapshot.getParent());
+            parent.setCurrent(true);
+            vmSnapshotDao.persist(parent);
+        }
+        vmSnapshot.setCurrent(false);
+        vmSnapshotDao.persist(vmSnapshot);
+    }
+
+    protected void finalizeCreate(VMSnapshotVO vmSnapshot, List<VolumeObjectTO> VolumeTOs) {
+        // update volumes path
+        updateVolumePath(VolumeTOs);
+
+        vmSnapshot.setCurrent(true);
+
+        // change current snapshot
+        if (vmSnapshot.getParent() != null) {
+            VMSnapshotVO previousCurrent = vmSnapshotDao.findById(vmSnapshot.getParent());
+            previousCurrent.setCurrent(false);
+            vmSnapshotDao.persist(previousCurrent);
+        }
+        vmSnapshotDao.persist(vmSnapshot);
+    }
+
+    protected void finalizeRevert(VMSnapshotVO vmSnapshot, List<VolumeObjectTO> volumeToList) {
+        // update volumes path
+        updateVolumePath(volumeToList);
+
+        // update current snapshot, current snapshot is the one reverted to
+        VMSnapshotVO previousCurrent = vmSnapshotDao.findCurrentSnapshotByVmId(vmSnapshot.getVmId());
+        if(previousCurrent != null){
+            previousCurrent.setCurrent(false);
+            vmSnapshotDao.persist(previousCurrent);
+        }
+        vmSnapshot.setCurrent(true);
+        vmSnapshotDao.persist(vmSnapshot);
+    }
+
+    private void updateVolumePath(List<VolumeObjectTO> volumeTOs) {
+        for (VolumeObjectTO volume : volumeTOs) {
+            if (volume.getPath() != null) {
+                VolumeVO volumeVO = volumeDao.findById(volume.getId());
+                volumeVO.setPath(volume.getPath());
+                volumeVO.setVmSnapshotChainSize(volume.getSize());
+                volumeDao.persist(volumeVO);
+            }
+        }
+    }
+
+    private void publishUsageEvent(String type, VMSnapshot vmSnapshot, UserVm userVm, VolumeObjectTO volumeTo){
+        VolumeVO volume = volumeDao.findById(volumeTo.getId());
+        Long diskOfferingId = volume.getDiskOfferingId();
+        Long offeringId = null;
+        if (diskOfferingId != null) {
+            DiskOfferingVO offering = diskOfferingDao.findById(diskOfferingId);
+            if (offering != null
+                    && (offering.getType() == DiskOfferingVO.Type.Disk)) {
+                offeringId = offering.getId();
+            }
+        }
+        UsageEventUtils.publishUsageEvent(
+                type,
+                vmSnapshot.getAccountId(),
+                userVm.getDataCenterId(),
+                userVm.getId(),
+                vmSnapshot.getName(),
+                offeringId,
+                volume.getId(), // save volume's id into templateId field
+                volumeTo.getSize(),
+                VMSnapshot.class.getName(), vmSnapshot.getUuid());
+    }
+
+    @Override
+    public boolean revertVMSnapshot(VMSnapshot vmSnapshot) {
+        VMSnapshotVO vmSnapshotVO = (VMSnapshotVO)vmSnapshot;
+        UserVmVO userVm = userVmDao.findById(vmSnapshot.getVmId());
+        try {
+            vmSnapshotHelper.vmSnapshotStateTransitTo(vmSnapshotVO, VMSnapshot.Event.RevertRequested);
+        } catch (NoTransitionException e) {
+            throw new CloudRuntimeException(e.getMessage());
+        }
+
+        boolean result = false;
+        try {
+            VMSnapshotVO snapshot = vmSnapshotDao.findById(vmSnapshotVO.getId());
+            List<VolumeObjectTO> volumeTOs = vmSnapshotHelper.getVolumeTOList(userVm.getId());
+            String vmInstanceName = userVm.getInstanceName();
+            VMSnapshotTO parent = vmSnapshotHelper.getSnapshotWithParents(snapshot).getParent();
+
+            VMSnapshotTO vmSnapshotTO = new VMSnapshotTO(snapshot.getId(), snapshot.getName(), snapshot.getType(),
+                    snapshot.getCreated().getTime(), snapshot.getDescription(), snapshot.getCurrent(), parent);
+            Long hostId = vmSnapshotHelper.pickRunningHost(vmSnapshot.getVmId());
+            GuestOSVO guestOS = guestOSDao.findById(userVm.getGuestOSId());
+            RevertToVMSnapshotCommand revertToSnapshotCommand = new RevertToVMSnapshotCommand(vmInstanceName, vmSnapshotTO, volumeTOs, guestOS.getDisplayName());
+
+            RevertToVMSnapshotAnswer answer = (RevertToVMSnapshotAnswer) agentMgr.send(hostId, revertToSnapshotCommand);
+            if (answer != null && answer.getResult()) {
+                processAnswer(vmSnapshotVO, userVm, answer, hostId);
+                result = true;
+            } else {
+                String errMsg = "Revert VM: " + userVm.getInstanceName() + " to snapshot: "+ vmSnapshotVO.getName() + " failed";
+                if(answer != null && answer.getDetails() != null)
+                    errMsg = errMsg + " due to " + answer.getDetails();
+                s_logger.error(errMsg);
+                throw new CloudRuntimeException(errMsg);
+            }
+        } catch (OperationTimedoutException e) {
+            s_logger.debug("Failed to revert vm snapshot", e);
+            throw new CloudRuntimeException(e.getMessage());
+        } catch (AgentUnavailableException e) {
+            s_logger.debug("Failed to revert vm snapshot", e);
+            throw new CloudRuntimeException(e.getMessage());
+        } finally {
+            if (!result) {
+                try {
+                    vmSnapshotHelper.vmSnapshotStateTransitTo(vmSnapshot, VMSnapshot.Event.OperationFailed);
+                } catch (NoTransitionException e1) {
+                    s_logger.error("Cannot set vm snapshot state due to: " + e1.getMessage());
+                }
+            }
+        }
+        return result;
+    }
+
+    @Override
+    public boolean canHandle(VMSnapshot vmSnapshot) {
+        return true;
+    }
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/a6ce66e5/engine/storage/snapshot/src/org/apache/cloudstack/storage/vmsnapshot/VMSnapshotHelper.java
----------------------------------------------------------------------
diff --git a/engine/storage/snapshot/src/org/apache/cloudstack/storage/vmsnapshot/VMSnapshotHelper.java b/engine/storage/snapshot/src/org/apache/cloudstack/storage/vmsnapshot/VMSnapshotHelper.java
new file mode 100644
index 0000000..1437f80
--- /dev/null
+++ b/engine/storage/snapshot/src/org/apache/cloudstack/storage/vmsnapshot/VMSnapshotHelper.java
@@ -0,0 +1,38 @@
+/*
+ * 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.vmsnapshot;
+
+import com.cloud.agent.api.VMSnapshotTO;
+import com.cloud.agent.api.to.DataTO;
+import com.cloud.utils.fsm.NoTransitionException;
+import com.cloud.vm.snapshot.VMSnapshot;
+import com.cloud.vm.snapshot.VMSnapshotVO;
+import org.apache.cloudstack.storage.to.VolumeObjectTO;
+
+import java.util.List;
+
+public interface VMSnapshotHelper {
+  boolean vmSnapshotStateTransitTo(VMSnapshot vsnp, VMSnapshot.Event event) throws NoTransitionException;
+
+    Long pickRunningHost(Long vmId);
+
+    List<VolumeObjectTO> getVolumeTOList(Long vmId);
+
+    VMSnapshotTO getSnapshotWithParents(VMSnapshotVO snapshot);
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/a6ce66e5/engine/storage/snapshot/src/org/apache/cloudstack/storage/vmsnapshot/VMSnapshotHelperImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/snapshot/src/org/apache/cloudstack/storage/vmsnapshot/VMSnapshotHelperImpl.java b/engine/storage/snapshot/src/org/apache/cloudstack/storage/vmsnapshot/VMSnapshotHelperImpl.java
new file mode 100644
index 0000000..320a59c
--- /dev/null
+++ b/engine/storage/snapshot/src/org/apache/cloudstack/storage/vmsnapshot/VMSnapshotHelperImpl.java
@@ -0,0 +1,148 @@
+/*
+ * 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.vmsnapshot;
+
+import com.cloud.agent.api.VMSnapshotTO;
+import com.cloud.agent.api.to.DataTO;
+import com.cloud.agent.api.to.VolumeTO;
+import com.cloud.exception.InvalidParameterValueException;
+import com.cloud.host.Host;
+import com.cloud.host.HostVO;
+import com.cloud.host.dao.HostDao;
+import com.cloud.storage.StoragePool;
+import com.cloud.storage.VolumeVO;
+import com.cloud.storage.dao.VolumeDao;
+import com.cloud.utils.fsm.NoTransitionException;
+import com.cloud.utils.fsm.StateMachine2;
+import com.cloud.vm.UserVmVO;
+import com.cloud.vm.VirtualMachine;
+import com.cloud.vm.dao.UserVmDao;
+import com.cloud.vm.snapshot.VMSnapshot;
+import com.cloud.vm.snapshot.VMSnapshotVO;
+import com.cloud.vm.snapshot.dao.VMSnapshotDao;
+import org.apache.cloudstack.engine.subsystem.api.storage.VolumeDataFactory;
+import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo;
+import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
+import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
+import org.apache.cloudstack.storage.to.VolumeObjectTO;
+
+import javax.inject.Inject;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class VMSnapshotHelperImpl implements VMSnapshotHelper {
+    @Inject
+    VMSnapshotDao _vmSnapshotDao;
+    @Inject
+    UserVmDao userVmDao;
+    @Inject
+    HostDao hostDao;
+    @Inject
+    VolumeDao volumeDao;
+    @Inject
+    PrimaryDataStoreDao primaryDataStoreDao;
+    @Inject
+    VolumeDataFactory volumeDataFactory;
+
+    StateMachine2<VMSnapshot.State, VMSnapshot.Event, VMSnapshot> _vmSnapshottateMachine ;
+    public VMSnapshotHelperImpl() {
+        _vmSnapshottateMachine   = VMSnapshot.State.getStateMachine();
+    }
+    @Override
+    public boolean vmSnapshotStateTransitTo(VMSnapshot vsnp, VMSnapshot.Event event) throws NoTransitionException {
+        return _vmSnapshottateMachine.transitTo(vsnp, event, null, _vmSnapshotDao);
+    }
+
+    @Override
+    public Long pickRunningHost(Long vmId) {
+        UserVmVO vm = userVmDao.findById(vmId);
+        // use VM's host if VM is running
+        if(vm.getState() == VirtualMachine.State.Running)
+            return vm.getHostId();
+
+        // check if lastHostId is available
+        if(vm.getLastHostId() != null){
+            HostVO lastHost =  hostDao.findById(vm.getLastHostId());
+            if(lastHost.getStatus() == com.cloud.host.Status.Up && !lastHost.isInMaintenanceStates())
+                return lastHost.getId();
+        }
+
+        List<VolumeVO> listVolumes = volumeDao.findByInstance(vmId);
+        if (listVolumes == null || listVolumes.size() == 0) {
+            throw new InvalidParameterValueException("vmInstance has no volumes");
+        }
+        VolumeVO volume = listVolumes.get(0);
+        Long poolId = volume.getPoolId();
+        if (poolId == null) {
+            throw new InvalidParameterValueException("pool id is not found");
+        }
+        StoragePoolVO storagePool = primaryDataStoreDao.findById(poolId);
+        if (storagePool == null) {
+            throw new InvalidParameterValueException("storage pool is not found");
+        }
+        List<HostVO> listHost = hostDao.listAllUpAndEnabledNonHAHosts(Host.Type.Routing, storagePool.getClusterId(), storagePool.getPodId(),
+                storagePool.getDataCenterId(), null);
+        if (listHost == null || listHost.size() == 0) {
+            throw new InvalidParameterValueException("no host in up state is found");
+        }
+        return listHost.get(0).getId();
+    }
+
+    @Override
+    public List<VolumeObjectTO> getVolumeTOList(Long vmId) {
+        List<VolumeObjectTO> volumeTOs = new ArrayList<VolumeObjectTO>();
+        List<VolumeVO> volumeVos = volumeDao.findByInstance(vmId);
+        VolumeInfo volumeInfo = null;
+        for (VolumeVO volume : volumeVos) {
+            volumeInfo = volumeDataFactory.getVolume(volume.getId());
+
+            volumeTOs.add((VolumeObjectTO)volumeInfo.getTO());
+        }
+        return volumeTOs;
+    }
+
+
+    private VMSnapshotTO convert2VMSnapshotTO(VMSnapshotVO vo) {
+        return new VMSnapshotTO(vo.getId(), vo.getName(),  vo.getType(), vo.getCreated().getTime(), vo.getDescription(),
+                vo.getCurrent(), null);
+    }
+
+    @Override
+    public VMSnapshotTO getSnapshotWithParents(VMSnapshotVO snapshot) {
+        Map<Long, VMSnapshotVO> snapshotMap = new HashMap<Long, VMSnapshotVO>();
+        List<VMSnapshotVO> allSnapshots = _vmSnapshotDao.findByVm(snapshot.getVmId());
+        for (VMSnapshotVO vmSnapshotVO : allSnapshots) {
+            snapshotMap.put(vmSnapshotVO.getId(), vmSnapshotVO);
+        }
+
+        VMSnapshotTO currentTO = convert2VMSnapshotTO(snapshot);
+        VMSnapshotTO result = currentTO;
+        VMSnapshotVO current = snapshot;
+        while (current.getParent() != null) {
+            VMSnapshotVO parent = snapshotMap.get(current.getParent());
+            currentTO.setParent(convert2VMSnapshotTO(parent));
+            current = snapshotMap.get(current.getParent());
+            currentTO = currentTO.getParent();
+        }
+        return result;
+    }
+
+}


[34/50] [abbrv] git commit: updated refs/heads/object_store_migration to 5ec2a44

Posted by mc...@apache.org.
CLOUDSTACK-4967: vxlan doesn't scale

- Fix inproper multicast address creation (when VNI > 65535)
- Fix missing bride name in delete oparation

Signed-off-by : Toshiaki Hatano <ha...@haeena.net>


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

Branch: refs/heads/object_store_migration
Commit: 3e70b145c45126593dd3b1116a82d3cd8bc18b87
Parents: 7116268
Author: Toshiaki Hatano <ha...@haeena.net>
Authored: Tue Oct 29 02:37:09 2013 +0900
Committer: Toshiaki Hatano <ha...@haeena.net>
Committed: Tue Oct 29 02:38:02 2013 +0900

----------------------------------------------------------------------
 scripts/vm/network/vnet/modifyvxlan.sh | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/3e70b145/scripts/vm/network/vnet/modifyvxlan.sh
----------------------------------------------------------------------
diff --git a/scripts/vm/network/vnet/modifyvxlan.sh b/scripts/vm/network/vnet/modifyvxlan.sh
index 45d141a..a3ec71f 100755
--- a/scripts/vm/network/vnet/modifyvxlan.sh
+++ b/scripts/vm/network/vnet/modifyvxlan.sh
@@ -16,7 +16,7 @@
 # specific language governing permissions and limitations
 # under the License.
 
-# modifyvnet.sh -- adds and deletes VXLANs from a Routing Server
+# modifyvxlan.sh -- adds and deletes VXLANs from a Routing Server
 # set -x
 
 ## TODO(VXLAN): MTU, IPv6 underlying
@@ -30,7 +30,7 @@ addVxlan() {
 	local pif=$2
 	local vxlanDev=vxlan$vxlanId
 	local vxlanBr=$3
-	local mcastGrp="239.$(( $vxlanId >> 16 % 256 )).$(( $vxlanId >> 8 % 256 )).$(( $vxlanId % 256 ))"
+	local mcastGrp="239.$(( ($vxlanId >> 16) % 256 )).$(( ($vxlanId >> 8) % 256 )).$(( $vxlanId % 256 ))"
 	
 	## TODO(VXLAN): $brif (trafficlabel) should be passed from caller because we cannot assume 1:1 mapping between pif and brif.
 	# lookup bridge interface 
@@ -133,7 +133,10 @@ deleteVxlan() {
 	local pif=$2
 	local vxlanDev=vxlan$vxlanId
 	local vxlanBr=$3
-	local mcastGrp="239.$(( $vxlanId >> 16 % 256 )).$(( $vxlanId >> 8 % 256 )).$(( $vxlanId % 256 ))"
+	local mcastGrp="239.$(( ($vxlanId >> 16) % 256 )).$(( ($vxlanId >> 8) % 256 )).$(( $vxlanId % 256 ))"
+	
+	local sysfs_dir=/sys/devices/virtual/net/
+	local brif=`find ${sysfs_dir}*/brif/ -name $pif | sed -e "s,$sysfs_dir,," | sed -e 's,/brif/.*$,,'`
 	
 	ip route del $mcastGrp/32 dev $brif
 	


[31/50] [abbrv] git commit: updated refs/heads/object_store_migration to 5ec2a44

Posted by mc...@apache.org.
CLOUDSTACK-4686: Fixed volume limit for domain


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

Branch: refs/heads/object_store_migration
Commit: c8b91f1b72d228b9979bdd38d62138eb84cb69c3
Parents: b4ceefa
Author: Girish Shilamkar <gs...@ddn.com>
Authored: Mon Oct 28 11:36:20 2013 +0530
Committer: Girish Shilamkar <gs...@ddn.com>
Committed: Mon Oct 28 11:36:20 2013 +0530

----------------------------------------------------------------------
 test/integration/component/test_resource_limits.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/c8b91f1b/test/integration/component/test_resource_limits.py
----------------------------------------------------------------------
diff --git a/test/integration/component/test_resource_limits.py b/test/integration/component/test_resource_limits.py
index 833723c..377aa74 100644
--- a/test/integration/component/test_resource_limits.py
+++ b/test/integration/component/test_resource_limits.py
@@ -1185,7 +1185,7 @@ class TestResourceLimitsDomain(cloudstackTestCase):
                               self.apiclient,
                               2, # Volume
                               domainid=self.account.domainid,
-                              max=2
+                              max=1
                               )
 
         self.debug("Deploying VM for account: %s" % self.account.name)


[08/50] [abbrv] git commit: updated refs/heads/object_store_migration to 5ec2a44

Posted by mc...@apache.org.
fix master build

Signed-off-by: Laszlo Hornyak <la...@gmail.com>


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

Branch: refs/heads/object_store_migration
Commit: 56f1277339fe68b6ff06747d9aec5206b0ddbb6e
Parents: 300f626
Author: Laszlo Hornyak <la...@gmail.com>
Authored: Fri Oct 25 23:53:14 2013 +0200
Committer: Laszlo Hornyak <la...@gmail.com>
Committed: Fri Oct 25 23:54:10 2013 +0200

----------------------------------------------------------------------
 server/pom.xml | 5 +++++
 1 file changed, 5 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/56f12773/server/pom.xml
----------------------------------------------------------------------
diff --git a/server/pom.xml b/server/pom.xml
index c7978e2..8760fcb 100644
--- a/server/pom.xml
+++ b/server/pom.xml
@@ -135,6 +135,11 @@
       <artifactId>cloud-engine-components-api</artifactId>
       <version>${project.version}</version>
     </dependency>
+    <dependency>
+      <groupId>mysql</groupId>
+      <artifactId>mysql-connector-java</artifactId>
+      <scope>test</scope>
+    </dependency>
   </dependencies>
   <build>
     <resources>


[21/50] [abbrv] git commit: updated refs/heads/object_store_migration to 5ec2a44

Posted by mc...@apache.org.
InputStream use fix in ProcessUtil

- use PropertiesUtil to load Properties from file

Signed-off-by: Laszlo Hornyak <la...@gmail.com>


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

Branch: refs/heads/object_store_migration
Commit: fa35490fef785ae3963c428e7a3d3f9471382ebc
Parents: dbaa818
Author: Laszlo Hornyak <la...@gmail.com>
Authored: Fri Oct 25 21:49:16 2013 +0200
Committer: Laszlo Hornyak <la...@gmail.com>
Committed: Sat Oct 26 17:47:34 2013 +0200

----------------------------------------------------------------------
 utils/src/com/cloud/utils/ProcessUtil.java | 5 +----
 1 file changed, 1 insertion(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/fa35490f/utils/src/com/cloud/utils/ProcessUtil.java
----------------------------------------------------------------------
diff --git a/utils/src/com/cloud/utils/ProcessUtil.java b/utils/src/com/cloud/utils/ProcessUtil.java
index e64c931..eee4ab5 100644
--- a/utils/src/com/cloud/utils/ProcessUtil.java
+++ b/utils/src/com/cloud/utils/ProcessUtil.java
@@ -17,7 +17,6 @@
 package com.cloud.utils;
 
 import java.io.File;
-import java.io.FileInputStream;
 import java.io.IOException;
 import java.util.Properties;
 
@@ -44,10 +43,8 @@ public class ProcessUtil {
 				s_logger.debug("environment.properties could not be opened");
 			}
 			else {
-				final FileInputStream finputstream = new FileInputStream(propsFile);
 				final Properties props = new Properties();
-				props.load(finputstream);
-				finputstream.close();
+				PropertiesUtil.loadFromFile(props, propsFile);
 				dir = props.getProperty("paths.pid");
 				if (dir == null) {
 					dir = pidDir==null?"/var/run":pidDir;


[40/50] [abbrv] git commit: updated refs/heads/object_store_migration to 5ec2a44

Posted by mc...@apache.org.
Fix panel dimensions and colors


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

Branch: refs/heads/object_store_migration
Commit: f92f7b5c5df177cc59fb14e2b6761d43f154a2c3
Parents: bd697c5
Author: Brian Federle <br...@citrix.com>
Authored: Mon Oct 28 11:57:50 2013 -0700
Committer: Brian Federle <br...@citrix.com>
Committed: Mon Oct 28 11:57:50 2013 -0700

----------------------------------------------------------------------
 ui/css/cloudstack3.css | 18 ++++++++----------
 1 file changed, 8 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f92f7b5c/ui/css/cloudstack3.css
----------------------------------------------------------------------
diff --git a/ui/css/cloudstack3.css b/ui/css/cloudstack3.css
index 7880d6c..34018a1 100644
--- a/ui/css/cloudstack3.css
+++ b/ui/css/cloudstack3.css
@@ -63,7 +63,7 @@ body.install-wizard {
 
 #main-area {
   width: 1024px;
-  height: 100%;
+  height: 700px;
   margin: auto;
   border: 1px solid #D4D4D4;
   /*+box-shadow:0px -5px 11px #B7B7B7;*/
@@ -76,7 +76,7 @@ body.install-wizard {
 
 #container {
   /*[empty]width:;*/
-  height: 783px;
+  height: 700px;
   margin: auto;
   position: relative;
 }
@@ -1190,9 +1190,8 @@ div.notification.corner-alert:hover div.message span {
 div.panel div.list-view {
   overflow: auto;
   overflow-x: hidden;
-  height: 668px;
+  height: 632px;
   margin-top: 30px;
-  border-bottom: 1px solid #E7E7E7;
 }
 
 .detail-view div.list-view {
@@ -2420,8 +2419,7 @@ div.detail-group.actions td {
 }
 
 #navigation ul {
-  border-right: 1px solid #CECCCC;
-  height: 100%;
+  height: 700px;
   padding-top: 29px;
 }
 
@@ -2513,7 +2511,6 @@ div.detail-group.actions td {
 #navigation ul li.last {
   background-repeat: repeat;
   background-position: 0px 0px;
-  height: 57px;
   /*[empty]color:;*/
 }
 
@@ -2566,7 +2563,6 @@ div.detail-group.actions td {
 
 #navigation ul li.last.active,
 #navigation ul li.last:hover {
-  height: 52px;
 }
 
 /*Navigation icons*/
@@ -2635,6 +2631,7 @@ div.detail-group.actions td {
 /*Browser*/
 #browser {
   width: 794px;
+  height: 700px;
   max-width: 794px;
   position: relative;
   float: left;
@@ -2650,10 +2647,11 @@ div.detail-group.actions td {
 }
 
 #browser div.panel {
-  height: 698px;
-  background: #F7F7F7;
+  height: 100%;
+  background: #FFFFFF;
   border-right: 1px solid #A5A5A5;
   overflow: visible;
+  background-color: #F7F7F7;
 }
 
 #browser div.panel.panel-highlight-wrapper {


[20/50] [abbrv] git commit: updated refs/heads/object_store_migration to 5ec2a44

Posted by mc...@apache.org.
InputStream use fix in PorpoertiesStorage

- Properties object polulation using PropertiesUtil.loadFromFile
- test added
- the separate FileNotFoundException handling block was removed as the next IOException block is catching it and it is only logging

Signed-off-by: Laszlo Hornyak <la...@gmail.com>


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

Branch: refs/heads/object_store_migration
Commit: 5e1ea1a3e4411bf2c891406e189f9015c7327aec
Parents: 7902315
Author: Laszlo Hornyak <la...@gmail.com>
Authored: Thu Oct 24 21:20:56 2013 +0200
Committer: Laszlo Hornyak <la...@gmail.com>
Committed: Sat Oct 26 17:47:33 2013 +0200

----------------------------------------------------------------------
 .../cloud/agent/dao/impl/PropertiesStorage.java | 14 ++----
 .../agent/dao/impl/PropertiesStorageTest.java   | 51 ++++++++++++++++++++
 2 files changed, 54 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5e1ea1a3/agent/src/com/cloud/agent/dao/impl/PropertiesStorage.java
----------------------------------------------------------------------
diff --git a/agent/src/com/cloud/agent/dao/impl/PropertiesStorage.java b/agent/src/com/cloud/agent/dao/impl/PropertiesStorage.java
index 2bf26f4..411d946 100755
--- a/agent/src/com/cloud/agent/dao/impl/PropertiesStorage.java
+++ b/agent/src/com/cloud/agent/dao/impl/PropertiesStorage.java
@@ -17,7 +17,6 @@
 package com.cloud.agent.dao.impl;
 
 import java.io.File;
-import java.io.FileInputStream;
 import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
 import java.io.IOException;
@@ -26,6 +25,7 @@ import java.util.Properties;
 
 import javax.ejb.Local;
 
+import org.apache.commons.io.IOUtils;
 import org.apache.log4j.Logger;
 
 import com.cloud.agent.dao.StorageComponent;
@@ -59,18 +59,10 @@ public class PropertiesStorage implements StorageComponent {
             _properties.store(output, _name);
             output.flush();
             output.close();
-        } catch (FileNotFoundException e) {
-            s_logger.error("Who deleted the file? ", e);
         } catch (IOException e) {
             s_logger.error("Uh-oh: ", e);
         } finally {
-            if (output != null) {
-                try {
-                    output.close();
-                } catch (IOException e) {
-                    // ignore.
-                }
-            }
+            IOUtils.closeQuietly(output);
         }
     }
 
@@ -99,7 +91,7 @@ public class PropertiesStorage implements StorageComponent {
         }
 
         try {
-            _properties.load(new FileInputStream(file));
+            PropertiesUtil.loadFromFile(_properties, file);
             _file = file;
         } catch (FileNotFoundException e) {
             s_logger.error("How did we get here? ", e);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5e1ea1a3/agent/test/com/cloud/agent/dao/impl/PropertiesStorageTest.java
----------------------------------------------------------------------
diff --git a/agent/test/com/cloud/agent/dao/impl/PropertiesStorageTest.java b/agent/test/com/cloud/agent/dao/impl/PropertiesStorageTest.java
new file mode 100644
index 0000000..4075892
--- /dev/null
+++ b/agent/test/com/cloud/agent/dao/impl/PropertiesStorageTest.java
@@ -0,0 +1,51 @@
+package com.cloud.agent.dao.impl;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.HashMap;
+
+import junit.framework.Assert;
+
+import org.apache.commons.io.FileUtils;
+import org.junit.Test;
+
+public class PropertiesStorageTest {
+    @Test
+    public void configureWithNotExistingFile() {
+        String fileName = "target/notyetexistingfile"
+                + System.currentTimeMillis();
+        File file = new File(fileName);
+
+        PropertiesStorage storage = new PropertiesStorage();
+        HashMap<String, Object> params = new HashMap<String, Object>();
+        params.put("path", fileName);
+        Assert.assertTrue(storage.configure("test", params));
+        Assert.assertTrue(file.exists());
+        storage.persist("foo", "bar");
+        Assert.assertEquals("bar", storage.get("foo"));
+
+        storage.stop();
+        file.delete();
+    }
+
+    @Test
+    public void configureWithExistingFile() throws IOException {
+        String fileName = "target/existingfile"
+                + System.currentTimeMillis();
+        File file = new File(fileName);
+
+        FileUtils.writeStringToFile(file, "a=b\n\n");
+
+        PropertiesStorage storage = new PropertiesStorage();
+        HashMap<String, Object> params = new HashMap<String, Object>();
+        params.put("path", fileName);
+        Assert.assertTrue(storage.configure("test", params));
+        Assert.assertEquals("b", storage.get("a"));
+        Assert.assertTrue(file.exists());
+        storage.persist("foo", "bar");
+        Assert.assertEquals("bar", storage.get("foo"));
+
+        storage.stop();
+        file.delete();
+    }
+}


[46/50] [abbrv] git commit: updated refs/heads/object_store_migration to 5ec2a44

Posted by mc...@apache.org.
ResourceDetails -

1) added createDetail to ResourceDetailDao interface to provide generic way of creating resourceDetail DB objects
2) added resource details support for firewall rules


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

Branch: refs/heads/object_store_migration
Commit: 5caeab782d8123bc8f1bfe0937e1bbd703a35f66
Parents: 9b1cfa4
Author: Alena Prokharchyk <al...@citrix.com>
Authored: Mon Oct 28 12:53:00 2013 -0700
Committer: Alena Prokharchyk <al...@citrix.com>
Committed: Mon Oct 28 14:45:52 2013 -0700

----------------------------------------------------------------------
 api/src/com/cloud/server/ResourceTag.java       |   2 +-
 .../spring-engine-schema-core-daos-context.xml  |   4 +-
 .../com/cloud/dc/dao/DataCenterDetailsDao.java  |   2 +-
 .../cloud/dc/dao/DataCenterDetailsDaoImpl.java  |   3 +-
 .../src/com/cloud/dc/dao/ResourceDetailDao.java |  42 -------
 .../com/cloud/dc/dao/ResourceDetailDaoBase.java | 116 -------------------
 .../com/cloud/dc/dao/ResourceDetailsDao.java    |  42 +++++++
 .../cloud/dc/dao/ResourceDetailsDaoBase.java    | 116 +++++++++++++++++++
 .../cloud/network/dao/NetworkDetailsDao.java    |   4 +-
 .../network/dao/NetworkDetailsDaoImpl.java      |   4 +-
 .../service/dao/ServiceOfferingDetailsDao.java  |   4 +-
 .../dao/ServiceOfferingDetailsDaoImpl.java      |   4 +-
 .../storage/dao/StoragePoolDetailsDaoImpl.java  |   4 +-
 .../cloud/storage/dao/VMTemplateDetailsDao.java |   4 +-
 .../storage/dao/VMTemplateDetailsDaoImpl.java   |   4 +-
 .../com/cloud/storage/dao/VolumeDetailsDao.java |   4 +-
 .../cloud/storage/dao/VolumeDetailsDaoImpl.java |   4 +-
 .../src/com/cloud/vm/dao/NicDetailDao.java      |  24 ----
 .../src/com/cloud/vm/dao/NicDetailDaoImpl.java  |  34 ------
 .../src/com/cloud/vm/dao/NicDetailsDao.java     |  24 ++++
 .../src/com/cloud/vm/dao/NicDetailsDaoImpl.java |  34 ++++++
 .../src/com/cloud/vm/dao/UserVmDetailsDao.java  |   4 +-
 .../com/cloud/vm/dao/UserVmDetailsDaoImpl.java  |   4 +-
 .../resourcedetail/FirewallRuleDetailVO.java    |  72 ++++++++++++
 .../dao/FirewallRuleDetailsDao.java             |  26 +++++
 .../dao/FirewallRuleDetailsDaoImpl.java         |  34 ++++++
 .../db/PrimaryDataStoreDetailsDao.java          |   4 +-
 .../datastore/db/StoragePoolDetailsDao.java     |   4 +-
 .../db/PrimaryDataStoreDetailsDaoImpl.java      |   4 +-
 server/src/com/cloud/api/ApiDBUtils.java        |   2 +-
 .../com/cloud/api/query/QueryManagerImpl.java   |   4 +-
 .../metadata/ResourceMetaDataManagerImpl.java   |  20 ++--
 .../metadata/ResourceMetaDataManagerTest.java   |   4 +-
 setup/db/db/schema-421to430.sql                 |  13 +++
 34 files changed, 412 insertions(+), 262 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5caeab78/api/src/com/cloud/server/ResourceTag.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/server/ResourceTag.java b/api/src/com/cloud/server/ResourceTag.java
index 85bbcd0..ab74d26 100644
--- a/api/src/com/cloud/server/ResourceTag.java
+++ b/api/src/com/cloud/server/ResourceTag.java
@@ -33,7 +33,7 @@ public interface ResourceTag extends ControlledEntity, Identity, InternalIdentit
         Nic (false, true),
         LoadBalancer (true, false),
         PortForwardingRule (true, false),
-        FirewallRule (true, false),
+        FirewallRule (true, true),
         SecurityGroup (true, false),
         PublicIpAddress (true, false),
         Project (true, false),

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5caeab78/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 3fce439..e811cce 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
@@ -203,7 +203,7 @@
   <bean id="networkRuleConfigDaoImpl" class="com.cloud.network.dao.NetworkRuleConfigDaoImpl" />
   <bean id="networkServiceMapDaoImpl" class="com.cloud.network.dao.NetworkServiceMapDaoImpl" />
   <bean id="nicDaoImpl" class="com.cloud.vm.dao.NicDaoImpl" />
-  <bean id="nicDetailDaoImpl" class="com.cloud.vm.dao.NicDetailDaoImpl" />
+  <bean id="nicDetailsDaoImpl" class="com.cloud.vm.dao.NicDetailsDaoImpl" />
   <bean id="nicSecondaryIpDaoImpl" class="com.cloud.vm.dao.NicSecondaryIpDaoImpl" />
   <bean id="nicIpAliasDaoImpl" class="com.cloud.vm.dao.NicIpAliasDaoImpl" />
   <bean id="objectInDataStoreDaoImpl" class="org.apache.cloudstack.storage.db.ObjectInDataStoreDaoImpl" />
@@ -313,10 +313,10 @@
   <bean id="networkOfferingDetailsDaoImpl" class="com.cloud.offerings.dao.NetworkOfferingDetailsDaoImpl" />
   <bean id="serviceOfferingDetailsDaoImpl" class="com.cloud.service.dao.ServiceOfferingDetailsDaoImpl"/>
   <bean id="networkDetailsDaoImpl" class="com.cloud.network.dao.NetworkDetailsDaoImpl" />
-
   <bean id="AffinityGroupDaoImpl" class="org.apache.cloudstack.affinity.dao.AffinityGroupDaoImpl" />
   <bean id="AffinityGroupVMMapDaoImpl" class="org.apache.cloudstack.affinity.dao.AffinityGroupVMMapDaoImpl" />
   <bean id="AffinityGroupDomainMapDaoImpl" class="org.apache.cloudstack.affinity.dao.AffinityGroupDomainMapDaoImpl" />
+  <bean id="FirewallRuleDetailsDaoImpl" class="org.apache.cloudstack.resourcedetail.dao.FirewallRuleDetailsDaoImpl" />
   
   <bean id="databaseIntegrityChecker" class="com.cloud.upgrade.DatabaseIntegrityChecker" />
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5caeab78/engine/schema/src/com/cloud/dc/dao/DataCenterDetailsDao.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/dc/dao/DataCenterDetailsDao.java b/engine/schema/src/com/cloud/dc/dao/DataCenterDetailsDao.java
index 011aa73..747d558 100644
--- a/engine/schema/src/com/cloud/dc/dao/DataCenterDetailsDao.java
+++ b/engine/schema/src/com/cloud/dc/dao/DataCenterDetailsDao.java
@@ -19,5 +19,5 @@ package com.cloud.dc.dao;
 import com.cloud.dc.DataCenterDetailVO;
 import com.cloud.utils.db.GenericDao;
 
-public interface DataCenterDetailsDao extends GenericDao<DataCenterDetailVO, Long>, ResourceDetailDao<DataCenterDetailVO> {
+public interface DataCenterDetailsDao extends GenericDao<DataCenterDetailVO, Long>, ResourceDetailsDao<DataCenterDetailVO> {
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5caeab78/engine/schema/src/com/cloud/dc/dao/DataCenterDetailsDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/dc/dao/DataCenterDetailsDaoImpl.java b/engine/schema/src/com/cloud/dc/dao/DataCenterDetailsDaoImpl.java
index bc0621d..1d003ca 100644
--- a/engine/schema/src/com/cloud/dc/dao/DataCenterDetailsDaoImpl.java
+++ b/engine/schema/src/com/cloud/dc/dao/DataCenterDetailsDaoImpl.java
@@ -26,7 +26,8 @@ import org.apache.cloudstack.framework.config.ScopedConfigStorage;
 import com.cloud.dc.DataCenterDetailVO;
 
 @Local(value=DataCenterDetailsDao.class)
-public class DataCenterDetailsDaoImpl extends ResourceDetailDaoBase<DataCenterDetailVO> implements DataCenterDetailsDao, ScopedConfigStorage {
+public class DataCenterDetailsDaoImpl extends ResourceDetailsDaoBase<DataCenterDetailVO> implements DataCenterDetailsDao, ScopedConfigStorage {
+
     
     @Override
     public Scope getScope() {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5caeab78/engine/schema/src/com/cloud/dc/dao/ResourceDetailDao.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/dc/dao/ResourceDetailDao.java b/engine/schema/src/com/cloud/dc/dao/ResourceDetailDao.java
deleted file mode 100644
index e47e6f3..0000000
--- a/engine/schema/src/com/cloud/dc/dao/ResourceDetailDao.java
+++ /dev/null
@@ -1,42 +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 com.cloud.dc.dao;
-
-import java.util.List;
-import java.util.Map;
-
-import org.apache.cloudstack.api.ResourceDetail;
-
-import com.cloud.utils.db.GenericDao;
-
-public interface ResourceDetailDao<R extends ResourceDetail> extends GenericDao<R, Long>{
-    public R findDetail(long resourceId, String name);
-
-    public Map<String, String> findDetails(long resourceId);
-
-    public List<R> findDetailsList(long resourceId);
-
-    public void removeDetails(long resourceId);
-
-    public void removeDetail(long resourceId, String key);
-
-    public void addDetails(List<R> details);
-    
-    public void addDetail(R detail);
-    
-    public R createDetail(long resourceId, String key, String value);
-}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5caeab78/engine/schema/src/com/cloud/dc/dao/ResourceDetailDaoBase.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/dc/dao/ResourceDetailDaoBase.java b/engine/schema/src/com/cloud/dc/dao/ResourceDetailDaoBase.java
deleted file mode 100644
index 9102a62..0000000
--- a/engine/schema/src/com/cloud/dc/dao/ResourceDetailDaoBase.java
+++ /dev/null
@@ -1,116 +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 com.cloud.dc.dao;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.cloudstack.api.ResourceDetail;
-
-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 abstract class ResourceDetailDaoBase<R extends ResourceDetail> extends GenericDaoBase<R, Long>{
-    private SearchBuilder<R> AllFieldsSearch;
-    
-    public ResourceDetailDaoBase() {
-        AllFieldsSearch = createSearchBuilder();
-        AllFieldsSearch.and("resourceId", AllFieldsSearch.entity().getResourceId(), SearchCriteria.Op.EQ);
-        AllFieldsSearch.and("name", AllFieldsSearch.entity().getName(), SearchCriteria.Op.EQ);
-        AllFieldsSearch.done();
-    }
-
-    public R findDetail(long resourceId, String name) {
-        SearchCriteria<R> sc = AllFieldsSearch.create();
-        sc.setParameters("resourceId", resourceId);
-        sc.setParameters("name", name);
-        
-        return findOneBy(sc);
-    }
-
-
-    public Map<String, String> findDetails(long resourceId) {
-        SearchCriteria<R> sc = AllFieldsSearch.create();
-        sc.setParameters("resourceId", resourceId);
-        
-        List<R> results = search(sc, null);
-        Map<String, String> details = new HashMap<String, String>(results.size());
-        for (R result : results) {
-            details.put(result.getName(), result.getValue());
-        }
-        return details;
-    }
-
-    public List<R> findDetailsList(long resourceId) {
-        SearchCriteria<R> sc = AllFieldsSearch.create();
-        sc.setParameters("resourceId", resourceId);
-
-        List<R> results = search(sc, null);
-        return results;
-    }
-
-
-    public void removeDetails(long resourceId) {
-        SearchCriteria<R> sc = AllFieldsSearch.create();
-        sc.setParameters("resourceId", resourceId);
-        remove(sc);
-    }
-
-    
-    public void removeDetail(long resourceId, String key) {
-        if (key != null){
-            SearchCriteria<R> sc = AllFieldsSearch.create();
-            sc.setParameters("name", key);
-            remove(sc);
-        }
-    }
-
-
-    public void addDetails(List<R> details) {
-        if (details.isEmpty()) {
-            return;
-        }
-        TransactionLegacy txn = TransactionLegacy.currentTxn();
-        txn.start();
-        SearchCriteria<R> sc = AllFieldsSearch.create();
-        sc.setParameters("resourceId", details.get(0).getResourceId());
-        expunge(sc);
-        
-        for (R detail : details) {
-            persist(detail);
-        }
-        
-        txn.commit();
-    }
-    
-
-    public void addDetail(R detail) {
-        if (detail == null) {
-            return;
-        }
-        R existingDetail = findDetail(detail.getResourceId(), detail.getName());
-        if (existingDetail != null) {
-            remove(existingDetail.getId());
-        }
-        persist(detail);
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5caeab78/engine/schema/src/com/cloud/dc/dao/ResourceDetailsDao.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/dc/dao/ResourceDetailsDao.java b/engine/schema/src/com/cloud/dc/dao/ResourceDetailsDao.java
new file mode 100644
index 0000000..fd8f89c
--- /dev/null
+++ b/engine/schema/src/com/cloud/dc/dao/ResourceDetailsDao.java
@@ -0,0 +1,42 @@
+// 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.dc.dao;
+
+import java.util.List;
+import java.util.Map;
+
+import org.apache.cloudstack.api.ResourceDetail;
+
+import com.cloud.utils.db.GenericDao;
+
+public interface ResourceDetailsDao<R extends ResourceDetail> extends GenericDao<R, Long>{
+    public R findDetail(long resourceId, String name);
+
+    public Map<String, String> findDetails(long resourceId);
+
+    public List<R> findDetailsList(long resourceId);
+
+    public void removeDetails(long resourceId);
+
+    public void removeDetail(long resourceId, String key);
+
+    public void addDetails(List<R> details);
+    
+    public void addDetail(R detail);
+    
+    public R createDetail(long resourceId, String key, String value);
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5caeab78/engine/schema/src/com/cloud/dc/dao/ResourceDetailsDaoBase.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/dc/dao/ResourceDetailsDaoBase.java b/engine/schema/src/com/cloud/dc/dao/ResourceDetailsDaoBase.java
new file mode 100644
index 0000000..ba0e5c3
--- /dev/null
+++ b/engine/schema/src/com/cloud/dc/dao/ResourceDetailsDaoBase.java
@@ -0,0 +1,116 @@
+// 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.dc.dao;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.cloudstack.api.ResourceDetail;
+
+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 abstract class ResourceDetailsDaoBase<R extends ResourceDetail> extends GenericDaoBase<R, Long>{
+    private SearchBuilder<R> AllFieldsSearch;
+    
+    public ResourceDetailsDaoBase() {
+        AllFieldsSearch = createSearchBuilder();
+        AllFieldsSearch.and("resourceId", AllFieldsSearch.entity().getResourceId(), SearchCriteria.Op.EQ);
+        AllFieldsSearch.and("name", AllFieldsSearch.entity().getName(), SearchCriteria.Op.EQ);
+        AllFieldsSearch.done();
+    }
+
+    public R findDetail(long resourceId, String name) {
+        SearchCriteria<R> sc = AllFieldsSearch.create();
+        sc.setParameters("resourceId", resourceId);
+        sc.setParameters("name", name);
+        
+        return findOneBy(sc);
+    }
+
+
+    public Map<String, String> findDetails(long resourceId) {
+        SearchCriteria<R> sc = AllFieldsSearch.create();
+        sc.setParameters("resourceId", resourceId);
+        
+        List<R> results = search(sc, null);
+        Map<String, String> details = new HashMap<String, String>(results.size());
+        for (R result : results) {
+            details.put(result.getName(), result.getValue());
+        }
+        return details;
+    }
+
+    public List<R> findDetailsList(long resourceId) {
+        SearchCriteria<R> sc = AllFieldsSearch.create();
+        sc.setParameters("resourceId", resourceId);
+
+        List<R> results = search(sc, null);
+        return results;
+    }
+
+
+    public void removeDetails(long resourceId) {
+        SearchCriteria<R> sc = AllFieldsSearch.create();
+        sc.setParameters("resourceId", resourceId);
+        remove(sc);
+    }
+
+    
+    public void removeDetail(long resourceId, String key) {
+        if (key != null){
+            SearchCriteria<R> sc = AllFieldsSearch.create();
+            sc.setParameters("name", key);
+            remove(sc);
+        }
+    }
+
+
+    public void addDetails(List<R> details) {
+        if (details.isEmpty()) {
+            return;
+        }
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
+        txn.start();
+        SearchCriteria<R> sc = AllFieldsSearch.create();
+        sc.setParameters("resourceId", details.get(0).getResourceId());
+        expunge(sc);
+        
+        for (R detail : details) {
+            persist(detail);
+        }
+        
+        txn.commit();
+    }
+    
+
+    public void addDetail(R detail) {
+        if (detail == null) {
+            return;
+        }
+        R existingDetail = findDetail(detail.getResourceId(), detail.getName());
+        if (existingDetail != null) {
+            remove(existingDetail.getId());
+        }
+        persist(detail);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5caeab78/engine/schema/src/com/cloud/network/dao/NetworkDetailsDao.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/network/dao/NetworkDetailsDao.java b/engine/schema/src/com/cloud/network/dao/NetworkDetailsDao.java
index f791888..ec1b44c 100644
--- a/engine/schema/src/com/cloud/network/dao/NetworkDetailsDao.java
+++ b/engine/schema/src/com/cloud/network/dao/NetworkDetailsDao.java
@@ -16,9 +16,9 @@
 // under the License.
 package com.cloud.network.dao;
 
-import com.cloud.dc.dao.ResourceDetailDao;
+import com.cloud.dc.dao.ResourceDetailsDao;
 import com.cloud.utils.db.GenericDao;
 
-public interface NetworkDetailsDao extends GenericDao<NetworkDetailVO, Long>, ResourceDetailDao<NetworkDetailVO> {
+public interface NetworkDetailsDao extends GenericDao<NetworkDetailVO, Long>, ResourceDetailsDao<NetworkDetailVO> {
 
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5caeab78/engine/schema/src/com/cloud/network/dao/NetworkDetailsDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/network/dao/NetworkDetailsDaoImpl.java b/engine/schema/src/com/cloud/network/dao/NetworkDetailsDaoImpl.java
index 7f43f44..5306a35 100644
--- a/engine/schema/src/com/cloud/network/dao/NetworkDetailsDaoImpl.java
+++ b/engine/schema/src/com/cloud/network/dao/NetworkDetailsDaoImpl.java
@@ -20,11 +20,11 @@ import javax.ejb.Local;
 
 import org.springframework.stereotype.Component;
 
-import com.cloud.dc.dao.ResourceDetailDaoBase;
+import com.cloud.dc.dao.ResourceDetailsDaoBase;
 
 @Component
 @Local(value=NetworkDetailsDao.class)
-public class NetworkDetailsDaoImpl extends ResourceDetailDaoBase<NetworkDetailVO> implements NetworkDetailsDao {
+public class NetworkDetailsDaoImpl extends ResourceDetailsDaoBase<NetworkDetailVO> implements NetworkDetailsDao {
 
     @Override
     public NetworkDetailVO createDetail(long resourceId, String key, String value) {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5caeab78/engine/schema/src/com/cloud/service/dao/ServiceOfferingDetailsDao.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/service/dao/ServiceOfferingDetailsDao.java b/engine/schema/src/com/cloud/service/dao/ServiceOfferingDetailsDao.java
index ba753b7..495ccd5 100644
--- a/engine/schema/src/com/cloud/service/dao/ServiceOfferingDetailsDao.java
+++ b/engine/schema/src/com/cloud/service/dao/ServiceOfferingDetailsDao.java
@@ -16,9 +16,9 @@
 // under the License.
 package com.cloud.service.dao;
 
-import com.cloud.dc.dao.ResourceDetailDao;
+import com.cloud.dc.dao.ResourceDetailsDao;
 import com.cloud.service.ServiceOfferingDetailsVO;
 import com.cloud.utils.db.GenericDao;
 
-public interface ServiceOfferingDetailsDao extends GenericDao<ServiceOfferingDetailsVO, Long>, ResourceDetailDao<ServiceOfferingDetailsVO> {
+public interface ServiceOfferingDetailsDao extends GenericDao<ServiceOfferingDetailsVO, Long>, ResourceDetailsDao<ServiceOfferingDetailsVO> {
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5caeab78/engine/schema/src/com/cloud/service/dao/ServiceOfferingDetailsDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/service/dao/ServiceOfferingDetailsDaoImpl.java b/engine/schema/src/com/cloud/service/dao/ServiceOfferingDetailsDaoImpl.java
index 96f1085..c059ca8 100644
--- a/engine/schema/src/com/cloud/service/dao/ServiceOfferingDetailsDaoImpl.java
+++ b/engine/schema/src/com/cloud/service/dao/ServiceOfferingDetailsDaoImpl.java
@@ -20,12 +20,12 @@ import javax.ejb.Local;
 
 import org.springframework.stereotype.Component;
 
-import com.cloud.dc.dao.ResourceDetailDaoBase;
+import com.cloud.dc.dao.ResourceDetailsDaoBase;
 import com.cloud.service.ServiceOfferingDetailsVO;
 
 @Component
 @Local(value=ServiceOfferingDetailsDao.class)
-public class ServiceOfferingDetailsDaoImpl extends ResourceDetailDaoBase<ServiceOfferingDetailsVO>
+public class ServiceOfferingDetailsDaoImpl extends ResourceDetailsDaoBase<ServiceOfferingDetailsVO>
         implements ServiceOfferingDetailsDao {
 
     @Override

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5caeab78/engine/schema/src/com/cloud/storage/dao/StoragePoolDetailsDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/storage/dao/StoragePoolDetailsDaoImpl.java b/engine/schema/src/com/cloud/storage/dao/StoragePoolDetailsDaoImpl.java
index 521f325..8914732 100644
--- a/engine/schema/src/com/cloud/storage/dao/StoragePoolDetailsDaoImpl.java
+++ b/engine/schema/src/com/cloud/storage/dao/StoragePoolDetailsDaoImpl.java
@@ -24,10 +24,10 @@ import org.apache.cloudstack.framework.config.ScopedConfigStorage;
 import org.apache.cloudstack.storage.datastore.db.StoragePoolDetailVO;
 import org.apache.cloudstack.storage.datastore.db.StoragePoolDetailsDao;
 
-import com.cloud.dc.dao.ResourceDetailDaoBase;
+import com.cloud.dc.dao.ResourceDetailsDaoBase;
 
 @Local(value = StoragePoolDetailsDao.class)
-public class StoragePoolDetailsDaoImpl extends ResourceDetailDaoBase<StoragePoolDetailVO> implements StoragePoolDetailsDao, ScopedConfigStorage {
+public class StoragePoolDetailsDaoImpl extends ResourceDetailsDaoBase<StoragePoolDetailVO> implements StoragePoolDetailsDao, ScopedConfigStorage {
 
     public StoragePoolDetailsDaoImpl() {
     }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5caeab78/engine/schema/src/com/cloud/storage/dao/VMTemplateDetailsDao.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/storage/dao/VMTemplateDetailsDao.java b/engine/schema/src/com/cloud/storage/dao/VMTemplateDetailsDao.java
index aa7ce4b..818f9dd 100644
--- a/engine/schema/src/com/cloud/storage/dao/VMTemplateDetailsDao.java
+++ b/engine/schema/src/com/cloud/storage/dao/VMTemplateDetailsDao.java
@@ -16,10 +16,10 @@
 // under the License.
 package com.cloud.storage.dao;
 
-import com.cloud.dc.dao.ResourceDetailDao;
+import com.cloud.dc.dao.ResourceDetailsDao;
 import com.cloud.storage.VMTemplateDetailVO;
 import com.cloud.utils.db.GenericDao;
 
-public interface VMTemplateDetailsDao extends GenericDao<VMTemplateDetailVO, Long>, ResourceDetailDao<VMTemplateDetailVO> {
+public interface VMTemplateDetailsDao extends GenericDao<VMTemplateDetailVO, Long>, ResourceDetailsDao<VMTemplateDetailVO> {
   
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5caeab78/engine/schema/src/com/cloud/storage/dao/VMTemplateDetailsDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/storage/dao/VMTemplateDetailsDaoImpl.java b/engine/schema/src/com/cloud/storage/dao/VMTemplateDetailsDaoImpl.java
index ad3f1d5..d4ca38e 100644
--- a/engine/schema/src/com/cloud/storage/dao/VMTemplateDetailsDaoImpl.java
+++ b/engine/schema/src/com/cloud/storage/dao/VMTemplateDetailsDaoImpl.java
@@ -20,12 +20,12 @@ import javax.ejb.Local;
 
 import org.springframework.stereotype.Component;
 
-import com.cloud.dc.dao.ResourceDetailDaoBase;
+import com.cloud.dc.dao.ResourceDetailsDaoBase;
 import com.cloud.storage.VMTemplateDetailVO;
 
 @Component
 @Local(value = VMTemplateDetailsDao.class)
-public class VMTemplateDetailsDaoImpl extends ResourceDetailDaoBase<VMTemplateDetailVO> implements VMTemplateDetailsDao {
+public class VMTemplateDetailsDaoImpl extends ResourceDetailsDaoBase<VMTemplateDetailVO> implements VMTemplateDetailsDao {
 
     @Override
     public VMTemplateDetailVO createDetail(long resourceId, String key, String value) {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5caeab78/engine/schema/src/com/cloud/storage/dao/VolumeDetailsDao.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/storage/dao/VolumeDetailsDao.java b/engine/schema/src/com/cloud/storage/dao/VolumeDetailsDao.java
index 635ca97..a7c7013 100644
--- a/engine/schema/src/com/cloud/storage/dao/VolumeDetailsDao.java
+++ b/engine/schema/src/com/cloud/storage/dao/VolumeDetailsDao.java
@@ -16,10 +16,10 @@
 // under the License.
 package com.cloud.storage.dao;
 
-import com.cloud.dc.dao.ResourceDetailDao;
+import com.cloud.dc.dao.ResourceDetailsDao;
 import com.cloud.storage.VolumeDetailVO;
 import com.cloud.utils.db.GenericDao;
 
-public interface VolumeDetailsDao extends GenericDao<VolumeDetailVO, Long>, ResourceDetailDao<VolumeDetailVO> {
+public interface VolumeDetailsDao extends GenericDao<VolumeDetailVO, Long>, ResourceDetailsDao<VolumeDetailVO> {
 
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5caeab78/engine/schema/src/com/cloud/storage/dao/VolumeDetailsDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/storage/dao/VolumeDetailsDaoImpl.java b/engine/schema/src/com/cloud/storage/dao/VolumeDetailsDaoImpl.java
index 26fdd2f..700be46 100644
--- a/engine/schema/src/com/cloud/storage/dao/VolumeDetailsDaoImpl.java
+++ b/engine/schema/src/com/cloud/storage/dao/VolumeDetailsDaoImpl.java
@@ -20,12 +20,12 @@ import javax.ejb.Local;
 
 import org.springframework.stereotype.Component;
 
-import com.cloud.dc.dao.ResourceDetailDaoBase;
+import com.cloud.dc.dao.ResourceDetailsDaoBase;
 import com.cloud.storage.VolumeDetailVO;
 
 @Component
 @Local(value=VolumeDetailsDao.class)
-public class VolumeDetailsDaoImpl extends ResourceDetailDaoBase<VolumeDetailVO> implements VolumeDetailsDao {
+public class VolumeDetailsDaoImpl extends ResourceDetailsDaoBase<VolumeDetailVO> implements VolumeDetailsDao {
 
     @Override
     public VolumeDetailVO createDetail(long resourceId, String key, String value) {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5caeab78/engine/schema/src/com/cloud/vm/dao/NicDetailDao.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/vm/dao/NicDetailDao.java b/engine/schema/src/com/cloud/vm/dao/NicDetailDao.java
deleted file mode 100644
index f960ecf..0000000
--- a/engine/schema/src/com/cloud/vm/dao/NicDetailDao.java
+++ /dev/null
@@ -1,24 +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 com.cloud.vm.dao;
-
-import com.cloud.dc.dao.ResourceDetailDao;
-import com.cloud.utils.db.GenericDao;
-import com.cloud.vm.NicDetailVO;
-
-public interface NicDetailDao extends GenericDao<NicDetailVO, Long>, ResourceDetailDao<NicDetailVO> {
-}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5caeab78/engine/schema/src/com/cloud/vm/dao/NicDetailDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/vm/dao/NicDetailDaoImpl.java b/engine/schema/src/com/cloud/vm/dao/NicDetailDaoImpl.java
deleted file mode 100644
index afab4fd..0000000
--- a/engine/schema/src/com/cloud/vm/dao/NicDetailDaoImpl.java
+++ /dev/null
@@ -1,34 +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 com.cloud.vm.dao;
-
-import javax.ejb.Local;
-
-import org.springframework.stereotype.Component;
-
-import com.cloud.dc.dao.ResourceDetailDaoBase;
-import com.cloud.vm.NicDetailVO;
-
-@Component
-@Local (value={NicDetailDao.class})
-public class NicDetailDaoImpl extends ResourceDetailDaoBase<NicDetailVO> implements NicDetailDao {
-
-    @Override
-    public NicDetailVO createDetail(long resourceId, String key, String value) {
-        return new NicDetailVO(resourceId, key, value);
-    }
-}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5caeab78/engine/schema/src/com/cloud/vm/dao/NicDetailsDao.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/vm/dao/NicDetailsDao.java b/engine/schema/src/com/cloud/vm/dao/NicDetailsDao.java
new file mode 100644
index 0000000..3835ddc
--- /dev/null
+++ b/engine/schema/src/com/cloud/vm/dao/NicDetailsDao.java
@@ -0,0 +1,24 @@
+// 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.vm.dao;
+
+import com.cloud.dc.dao.ResourceDetailsDao;
+import com.cloud.utils.db.GenericDao;
+import com.cloud.vm.NicDetailVO;
+
+public interface NicDetailsDao extends GenericDao<NicDetailVO, Long>, ResourceDetailsDao<NicDetailVO> {
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5caeab78/engine/schema/src/com/cloud/vm/dao/NicDetailsDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/vm/dao/NicDetailsDaoImpl.java b/engine/schema/src/com/cloud/vm/dao/NicDetailsDaoImpl.java
new file mode 100644
index 0000000..0775f7f
--- /dev/null
+++ b/engine/schema/src/com/cloud/vm/dao/NicDetailsDaoImpl.java
@@ -0,0 +1,34 @@
+// 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.vm.dao;
+
+import javax.ejb.Local;
+
+import org.springframework.stereotype.Component;
+
+import com.cloud.dc.dao.ResourceDetailsDaoBase;
+import com.cloud.vm.NicDetailVO;
+
+@Component
+@Local (value={NicDetailsDao.class})
+public class NicDetailsDaoImpl extends ResourceDetailsDaoBase<NicDetailVO> implements NicDetailsDao {
+
+    @Override
+    public NicDetailVO createDetail(long resourceId, String key, String value) {
+        return new NicDetailVO(resourceId, key, value);
+    }
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5caeab78/engine/schema/src/com/cloud/vm/dao/UserVmDetailsDao.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/vm/dao/UserVmDetailsDao.java b/engine/schema/src/com/cloud/vm/dao/UserVmDetailsDao.java
index a0249e6..c06e9bb 100644
--- a/engine/schema/src/com/cloud/vm/dao/UserVmDetailsDao.java
+++ b/engine/schema/src/com/cloud/vm/dao/UserVmDetailsDao.java
@@ -16,9 +16,9 @@
 // under the License.
 package com.cloud.vm.dao;
 
-import com.cloud.dc.dao.ResourceDetailDao;
+import com.cloud.dc.dao.ResourceDetailsDao;
 import com.cloud.utils.db.GenericDao;
 import com.cloud.vm.UserVmDetailVO;
 
-public interface UserVmDetailsDao extends GenericDao<UserVmDetailVO, Long>, ResourceDetailDao<UserVmDetailVO> {
+public interface UserVmDetailsDao extends GenericDao<UserVmDetailVO, Long>, ResourceDetailsDao<UserVmDetailVO> {
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5caeab78/engine/schema/src/com/cloud/vm/dao/UserVmDetailsDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/vm/dao/UserVmDetailsDaoImpl.java b/engine/schema/src/com/cloud/vm/dao/UserVmDetailsDaoImpl.java
index 2829192..45c33cd 100644
--- a/engine/schema/src/com/cloud/vm/dao/UserVmDetailsDaoImpl.java
+++ b/engine/schema/src/com/cloud/vm/dao/UserVmDetailsDaoImpl.java
@@ -20,12 +20,12 @@ import javax.ejb.Local;
 
 import org.springframework.stereotype.Component;
 
-import com.cloud.dc.dao.ResourceDetailDaoBase;
+import com.cloud.dc.dao.ResourceDetailsDaoBase;
 import com.cloud.vm.UserVmDetailVO;
 
 @Component
 @Local(value=UserVmDetailsDao.class)
-public class UserVmDetailsDaoImpl extends ResourceDetailDaoBase<UserVmDetailVO> implements UserVmDetailsDao {
+public class UserVmDetailsDaoImpl extends ResourceDetailsDaoBase<UserVmDetailVO> implements UserVmDetailsDao {
 
     @Override
     public UserVmDetailVO createDetail(long resourceId, String key, String value) {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5caeab78/engine/schema/src/org/apache/cloudstack/resourcedetail/FirewallRuleDetailVO.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/org/apache/cloudstack/resourcedetail/FirewallRuleDetailVO.java b/engine/schema/src/org/apache/cloudstack/resourcedetail/FirewallRuleDetailVO.java
new file mode 100644
index 0000000..d7e90e8
--- /dev/null
+++ b/engine/schema/src/org/apache/cloudstack/resourcedetail/FirewallRuleDetailVO.java
@@ -0,0 +1,72 @@
+// 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.resourcedetail;
+
+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.ResourceDetail;
+
+@Entity
+@Table(name="firewall_rule_details")
+public class FirewallRuleDetailVO implements ResourceDetail{
+        @Id
+        @GeneratedValue(strategy= GenerationType.IDENTITY)
+        @Column(name="id")
+        private long id;
+
+        @Column(name="firewall_rule_id")
+        private long resourceId;
+
+        @Column(name="name")
+        private String name;
+
+        @Column(name="value", length=1024)
+        private String value;
+
+        public FirewallRuleDetailVO() {}
+
+        public FirewallRuleDetailVO(long networkId, String name, String value) {
+            this.resourceId = networkId;
+            this.name = name;
+            this.value = value;
+        }
+
+        @Override
+        public long getId() {
+            return id;
+        }
+
+        @Override
+        public String getName() {
+            return name;
+        }
+
+        @Override
+        public String getValue() {
+            return value;
+        }
+
+        @Override
+        public long getResourceId() {
+            return resourceId;
+        }
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5caeab78/engine/schema/src/org/apache/cloudstack/resourcedetail/dao/FirewallRuleDetailsDao.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/org/apache/cloudstack/resourcedetail/dao/FirewallRuleDetailsDao.java b/engine/schema/src/org/apache/cloudstack/resourcedetail/dao/FirewallRuleDetailsDao.java
new file mode 100644
index 0000000..eae1d10
--- /dev/null
+++ b/engine/schema/src/org/apache/cloudstack/resourcedetail/dao/FirewallRuleDetailsDao.java
@@ -0,0 +1,26 @@
+// 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.resourcedetail.dao;
+
+import org.apache.cloudstack.resourcedetail.FirewallRuleDetailVO;
+
+import com.cloud.dc.dao.ResourceDetailsDao;
+import com.cloud.utils.db.GenericDao;
+
+public interface FirewallRuleDetailsDao extends GenericDao<FirewallRuleDetailVO, Long>, ResourceDetailsDao<FirewallRuleDetailVO>{
+
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5caeab78/engine/schema/src/org/apache/cloudstack/resourcedetail/dao/FirewallRuleDetailsDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/org/apache/cloudstack/resourcedetail/dao/FirewallRuleDetailsDaoImpl.java b/engine/schema/src/org/apache/cloudstack/resourcedetail/dao/FirewallRuleDetailsDaoImpl.java
new file mode 100644
index 0000000..b235ace
--- /dev/null
+++ b/engine/schema/src/org/apache/cloudstack/resourcedetail/dao/FirewallRuleDetailsDaoImpl.java
@@ -0,0 +1,34 @@
+// 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.resourcedetail.dao;
+
+import javax.ejb.Local;
+
+import org.apache.cloudstack.resourcedetail.FirewallRuleDetailVO;
+import org.springframework.stereotype.Component;
+
+import com.cloud.dc.dao.ResourceDetailsDaoBase;
+
+@Component
+@Local (value={FirewallRuleDetailsDao.class})
+public class FirewallRuleDetailsDaoImpl extends ResourceDetailsDaoBase<FirewallRuleDetailVO> implements FirewallRuleDetailsDao {
+
+    @Override
+    public FirewallRuleDetailVO createDetail(long resourceId, String key, String value) {
+        return new FirewallRuleDetailVO(resourceId, key, value);
+    }
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5caeab78/engine/schema/src/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDetailsDao.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDetailsDao.java b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDetailsDao.java
index 8466107..7b6d390 100644
--- a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDetailsDao.java
+++ b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDetailsDao.java
@@ -16,7 +16,7 @@
 // under the License.
 package org.apache.cloudstack.storage.datastore.db;
 
-import com.cloud.dc.dao.ResourceDetailDao;
+import com.cloud.dc.dao.ResourceDetailsDao;
 
-public interface PrimaryDataStoreDetailsDao extends ResourceDetailDao<PrimaryDataStoreDetailVO> {
+public interface PrimaryDataStoreDetailsDao extends ResourceDetailsDao<PrimaryDataStoreDetailVO> {
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5caeab78/engine/schema/src/org/apache/cloudstack/storage/datastore/db/StoragePoolDetailsDao.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/StoragePoolDetailsDao.java b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/StoragePoolDetailsDao.java
index f7ef631..2ec04d5 100644
--- a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/StoragePoolDetailsDao.java
+++ b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/StoragePoolDetailsDao.java
@@ -16,8 +16,8 @@
 // under the License.
 package org.apache.cloudstack.storage.datastore.db;
 
-import com.cloud.dc.dao.ResourceDetailDao;
+import com.cloud.dc.dao.ResourceDetailsDao;
 import com.cloud.utils.db.GenericDao;
 
-public interface StoragePoolDetailsDao extends GenericDao<StoragePoolDetailVO, Long>, ResourceDetailDao<StoragePoolDetailVO> {
+public interface StoragePoolDetailsDao extends GenericDao<StoragePoolDetailVO, Long>, ResourceDetailsDao<StoragePoolDetailVO> {
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5caeab78/engine/storage/src/org/apache/cloudstack/storage/volume/db/PrimaryDataStoreDetailsDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/volume/db/PrimaryDataStoreDetailsDaoImpl.java b/engine/storage/src/org/apache/cloudstack/storage/volume/db/PrimaryDataStoreDetailsDaoImpl.java
index a1470a3..5613931 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/volume/db/PrimaryDataStoreDetailsDaoImpl.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/volume/db/PrimaryDataStoreDetailsDaoImpl.java
@@ -20,10 +20,10 @@ import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDetailVO;
 import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDetailsDao;
 import org.springframework.stereotype.Component;
 
-import com.cloud.dc.dao.ResourceDetailDaoBase;
+import com.cloud.dc.dao.ResourceDetailsDaoBase;
 
 @Component
-public class PrimaryDataStoreDetailsDaoImpl extends ResourceDetailDaoBase<PrimaryDataStoreDetailVO> implements
+public class PrimaryDataStoreDetailsDaoImpl extends ResourceDetailsDaoBase<PrimaryDataStoreDetailVO> implements
         PrimaryDataStoreDetailsDao {
 
     @Override

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5caeab78/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 37b9e9c..1be6a21 100755
--- a/server/src/com/cloud/api/ApiDBUtils.java
+++ b/server/src/com/cloud/api/ApiDBUtils.java
@@ -126,7 +126,7 @@ import com.cloud.dc.dao.ClusterDao;
 import com.cloud.dc.dao.DataCenterDao;
 import com.cloud.dc.dao.DataCenterDetailsDao;
 import com.cloud.dc.dao.HostPodDao;
-import com.cloud.dc.dao.ResourceDetailDaoBase;
+import com.cloud.dc.dao.ResourceDetailsDaoBase;
 import com.cloud.dc.dao.VlanDao;
 import com.cloud.domain.DomainVO;
 import com.cloud.domain.dao.DomainDao;

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5caeab78/server/src/com/cloud/api/query/QueryManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/api/query/QueryManagerImpl.java b/server/src/com/cloud/api/query/QueryManagerImpl.java
index 85674ea..a7d85cf 100644
--- a/server/src/com/cloud/api/query/QueryManagerImpl.java
+++ b/server/src/com/cloud/api/query/QueryManagerImpl.java
@@ -189,7 +189,7 @@ import com.cloud.vm.DomainRouterVO;
 import com.cloud.vm.UserVmVO;
 import com.cloud.vm.VirtualMachine;
 import com.cloud.vm.dao.DomainRouterDao;
-import com.cloud.vm.dao.NicDetailDao;
+import com.cloud.vm.dao.NicDetailsDao;
 import com.cloud.vm.dao.UserVmDao;
 import com.cloud.vm.dao.UserVmDetailsDao;
 
@@ -295,7 +295,7 @@ public class QueryManagerImpl extends ManagerBase implements QueryService {
     private VolumeDetailsDao _volumeDetailDao;
 
     @Inject
-    private NicDetailDao _nicDetailDao;
+    private NicDetailsDao _nicDetailDao;
 
     @Inject
     UserVmDetailsDao _userVmDetailDao;

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5caeab78/server/src/com/cloud/metadata/ResourceMetaDataManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/metadata/ResourceMetaDataManagerImpl.java b/server/src/com/cloud/metadata/ResourceMetaDataManagerImpl.java
index 9a61a67..6d03b2a 100644
--- a/server/src/com/cloud/metadata/ResourceMetaDataManagerImpl.java
+++ b/server/src/com/cloud/metadata/ResourceMetaDataManagerImpl.java
@@ -26,12 +26,13 @@ import javax.inject.Inject;
 import javax.naming.ConfigurationException;
 
 import org.apache.cloudstack.api.ResourceDetail;
+import org.apache.cloudstack.resourcedetail.dao.FirewallRuleDetailsDao;
 import org.apache.cloudstack.storage.datastore.db.StoragePoolDetailsDao;
 import org.apache.log4j.Logger;
 import org.springframework.stereotype.Component;
 
 import com.cloud.dc.dao.DataCenterDetailsDao;
-import com.cloud.dc.dao.ResourceDetailDao;
+import com.cloud.dc.dao.ResourceDetailsDao;
 import com.cloud.event.ActionEvent;
 import com.cloud.event.EventTypes;
 import com.cloud.exception.InvalidParameterValueException;
@@ -47,7 +48,7 @@ import com.cloud.utils.db.DB;
 import com.cloud.utils.db.Transaction;
 import com.cloud.utils.db.TransactionCallback;
 import com.cloud.utils.db.TransactionStatus;
-import com.cloud.vm.dao.NicDetailDao;
+import com.cloud.vm.dao.NicDetailsDao;
 import com.cloud.vm.dao.UserVmDetailsDao;
 
 
@@ -58,7 +59,7 @@ public class ResourceMetaDataManagerImpl extends ManagerBase implements Resource
     @Inject
     VolumeDetailsDao _volumeDetailDao;
     @Inject
-    NicDetailDao _nicDetailDao;
+    NicDetailsDao _nicDetailDao;
     @Inject
     UserVmDetailsDao _userVmDetailDao;
     @Inject
@@ -73,9 +74,11 @@ public class ResourceMetaDataManagerImpl extends ManagerBase implements Resource
     ServiceOfferingDetailsDao _serviceOfferingDetailsDao;
     @Inject
     StoragePoolDetailsDao _storageDetailsDao;
+    @Inject
+    FirewallRuleDetailsDao _firewallRuleDetailsDao;
     
-    private static Map<ResourceObjectType, ResourceDetailDao<? extends ResourceDetail>> _daoMap= 
-            new HashMap<ResourceObjectType, ResourceDetailDao<? extends ResourceDetail>>();
+    private static Map<ResourceObjectType, ResourceDetailsDao<? extends ResourceDetail>> _daoMap= 
+            new HashMap<ResourceObjectType, ResourceDetailsDao<? extends ResourceDetail>>();
     
 
     @Override
@@ -88,6 +91,7 @@ public class ResourceMetaDataManagerImpl extends ManagerBase implements Resource
         _daoMap.put(ResourceObjectType.ServiceOffering, _serviceOfferingDetailsDao);
         _daoMap.put(ResourceObjectType.Zone, _dcDetailsDao);
         _daoMap.put(ResourceObjectType.Storage, _storageDetailsDao);
+        _daoMap.put(ResourceObjectType.FirewallRule, _firewallRuleDetailsDao);
         
         return true;
     }
@@ -148,18 +152,18 @@ public class ResourceMetaDataManagerImpl extends ManagerBase implements Resource
 
     private class DetailDaoHelper {
         private ResourceObjectType resourceType;
-        private ResourceDetailDao<? super ResourceDetail> dao;
+        private ResourceDetailsDao<? super ResourceDetail> dao;
         
         private DetailDaoHelper(ResourceObjectType resourceType) {
             if (!resourceType.resourceMetadataSupport()) {
                 throw new UnsupportedOperationException("ResourceType " + resourceType + " doesn't support metadata");
             }
             this.resourceType = resourceType;
-            ResourceDetailDao<?> dao = _daoMap.get(resourceType);
+            ResourceDetailsDao<?> dao = _daoMap.get(resourceType);
             if (dao == null) {
                 throw new UnsupportedOperationException("ResourceType " + resourceType + " doesn't support metadata");
             }
-            this.dao = (ResourceDetailDao)_daoMap.get(resourceType);
+            this.dao = (ResourceDetailsDao)_daoMap.get(resourceType);
         }
         
         private void addDetail(ResourceDetail detail) {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5caeab78/server/test/com/cloud/metadata/ResourceMetaDataManagerTest.java
----------------------------------------------------------------------
diff --git a/server/test/com/cloud/metadata/ResourceMetaDataManagerTest.java b/server/test/com/cloud/metadata/ResourceMetaDataManagerTest.java
index ae3cae4..84000fc 100644
--- a/server/test/com/cloud/metadata/ResourceMetaDataManagerTest.java
+++ b/server/test/com/cloud/metadata/ResourceMetaDataManagerTest.java
@@ -37,7 +37,7 @@ import com.cloud.exception.ResourceAllocationException;
 import com.cloud.server.ResourceTag;
 import com.cloud.server.TaggedResourceService;
 import com.cloud.storage.dao.VolumeDetailsDao;
-import com.cloud.vm.dao.NicDetailDao;
+import com.cloud.vm.dao.NicDetailsDao;
 
 
 public class ResourceMetaDataManagerTest {
@@ -47,7 +47,7 @@ public class ResourceMetaDataManagerTest {
     @Spy ResourceMetaDataManagerImpl _resourceMetaDataMgr = new ResourceMetaDataManagerImpl();
     @Mock VolumeDetailsDao _volumeDetailDao;
     @Mock
-    NicDetailDao _nicDetailDao;
+    NicDetailsDao _nicDetailDao;
     @Mock TaggedResourceService _taggedResourceMgr;
 
     @Before

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5caeab78/setup/db/db/schema-421to430.sql
----------------------------------------------------------------------
diff --git a/setup/db/db/schema-421to430.sql b/setup/db/db/schema-421to430.sql
index a858e27..0e78875 100644
--- a/setup/db/db/schema-421to430.sql
+++ b/setup/db/db/schema-421to430.sql
@@ -458,3 +458,16 @@ CREATE VIEW `cloud`.`storage_pool_view` AS
         `cloud`.`async_job` ON async_job.instance_id = storage_pool.id
             and async_job.instance_type = 'StoragePool'
             and async_job.job_status = 0;
+            
+            
+            DROP TABLE IF EXISTS `cloud`.`vm_snapshot_details`;
+            
+CREATE TABLE `cloud`.`firewall_rule_details` (
+  `id` bigint unsigned NOT NULL auto_increment,
+  `firewall_rule_id` bigint unsigned NOT NULL COMMENT 'firewall rule id',
+  `name` varchar(255) NOT NULL,
+  `value` varchar(1024) NOT NULL,
+  `display_detail` tinyint(1) NOT NULL DEFAULT '1' COMMENT 'True if detail can be displayed to the end user',
+  PRIMARY KEY (`id`),
+  CONSTRAINT `fk_firewall_rule_details__firewall_rule_id` FOREIGN KEY `fk_firewall_rule_details__firewall_rule_id`(`firewall_rule_id`) REFERENCES `firewall_rules`(`id`) ON DELETE CASCADE
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;


[12/50] [abbrv] git commit: updated refs/heads/object_store_migration to 5ec2a44

Posted by mc...@apache.org.
Make commands.properties optional for non-ACS code

Currently any new API extension to CloudStack must edit
commands.properties to add the appropriate ACLs.  This generally works
fine for ACS as we control the contents of that file and distribute
all the code ourself.  The hang up comes when somebody develops code
outside of ACS and want to add their code to an existing ACS
installation.  The Spring work that has been done has made this much
easier, but you are still required to manually edit
commands.properties.  This change introduces the following logic.

First check commands.properties for ACL info.  If ACL info exists, use
that to authorize the command.  If no ACL information exists (ie
null), then look at the @APICommand annotation.  The defaults of
@APICommand will provide no ACL info.  If the @APICommand annotation
provides no ACL info, use that.


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

Branch: refs/heads/object_store_migration
Commit: 9f7b4884a7a0bf0b15d94777cff449fde4664af2
Parents: ad74948
Author: Darren Shepherd <da...@gmail.com>
Authored: Thu Oct 24 15:05:05 2013 -0700
Committer: Darren Shepherd <da...@gmail.com>
Committed: Fri Oct 25 16:31:55 2013 -0700

----------------------------------------------------------------------
 .../org/apache/cloudstack/api/APICommand.java   |  4 +++
 .../acl/StaticRoleBasedAPIAccessChecker.java    | 37 +++++++++++++++++---
 2 files changed, 36 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/9f7b4884/api/src/org/apache/cloudstack/api/APICommand.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/APICommand.java b/api/src/org/apache/cloudstack/api/APICommand.java
index 4d024c1..7c9e6fe 100644
--- a/api/src/org/apache/cloudstack/api/APICommand.java
+++ b/api/src/org/apache/cloudstack/api/APICommand.java
@@ -22,6 +22,8 @@ import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.lang.annotation.Target;
 
+import org.apache.cloudstack.acl.RoleType;
+
 @Retention(RetentionPolicy.RUNTIME)
 @Target({ TYPE })
 public @interface APICommand {
@@ -36,4 +38,6 @@ public @interface APICommand {
     boolean includeInApiDoc() default true;
 
     String since() default "";
+
+    RoleType[] authorized() default {};
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/9f7b4884/plugins/acl/static-role-based/src/org/apache/cloudstack/acl/StaticRoleBasedAPIAccessChecker.java
----------------------------------------------------------------------
diff --git a/plugins/acl/static-role-based/src/org/apache/cloudstack/acl/StaticRoleBasedAPIAccessChecker.java b/plugins/acl/static-role-based/src/org/apache/cloudstack/acl/StaticRoleBasedAPIAccessChecker.java
index affcf91..bf3acf5 100644
--- a/plugins/acl/static-role-based/src/org/apache/cloudstack/acl/StaticRoleBasedAPIAccessChecker.java
+++ b/plugins/acl/static-role-based/src/org/apache/cloudstack/acl/StaticRoleBasedAPIAccessChecker.java
@@ -26,6 +26,7 @@ import javax.ejb.Local;
 import javax.inject.Inject;
 import javax.naming.ConfigurationException;
 
+import org.apache.cloudstack.api.APICommand;
 import org.apache.log4j.Logger;
 
 import com.cloud.exception.PermissionDeniedException;
@@ -43,7 +44,10 @@ public class StaticRoleBasedAPIAccessChecker extends AdapterBase implements APIC
 
     protected static final Logger s_logger = Logger.getLogger(StaticRoleBasedAPIAccessChecker.class);
 
-    private static Map<RoleType, Set<String>> s_roleBasedApisMap =
+    Set<String> commandsPropertiesOverrides = new HashSet<String>();
+    Map<RoleType, Set<String>> commandsPropertiesRoleBasedApisMap =
+            new HashMap<RoleType, Set<String>>();
+    Map<RoleType, Set<String>> annotationRoleBasedApisMap =
             new HashMap<RoleType, Set<String>>();
 
     List<PluggableService> _services;
@@ -51,8 +55,10 @@ public class StaticRoleBasedAPIAccessChecker extends AdapterBase implements APIC
 
     protected StaticRoleBasedAPIAccessChecker() {
         super();
-        for (RoleType roleType: RoleType.values())
-            s_roleBasedApisMap.put(roleType, new HashSet<String>());
+        for (RoleType roleType: RoleType.values()) {
+            commandsPropertiesRoleBasedApisMap.put(roleType, new HashSet<String>());
+            annotationRoleBasedApisMap.put(roleType, new HashSet<String>());
+        }
     }
 
     @Override
@@ -64,7 +70,10 @@ public class StaticRoleBasedAPIAccessChecker extends AdapterBase implements APIC
         }
 
         RoleType roleType = _accountService.getRoleType(account);
-        boolean isAllowed = s_roleBasedApisMap.get(roleType).contains(commandName);
+        boolean isAllowed = commandsPropertiesOverrides.contains(commandName) ?
+                commandsPropertiesRoleBasedApisMap.get(roleType).contains(commandName) :
+                    annotationRoleBasedApisMap.get(roleType).contains(commandName);
+
         if (!isAllowed) {
             throw new PermissionDeniedException("The API does not exist or is blacklisted. Role type=" + roleType.toString() + " is not allowed to request the api: " + commandName);
         }
@@ -80,15 +89,32 @@ public class StaticRoleBasedAPIAccessChecker extends AdapterBase implements APIC
         return true;
     }
 
+
+    @Override
+    public boolean start() {
+        for ( PluggableService service : _services ) {
+            for ( Class<?> clz : service.getCommands() ) {
+                APICommand command = clz.getAnnotation(APICommand.class);
+                for ( RoleType role : command.authorized() ) {
+                    Set<String> commands = annotationRoleBasedApisMap.get(role);
+                    if (!commands.contains(command.name()))
+                        commands.add(command.name());
+                }
+            }
+        }
+        return super.start();
+    }
+
     private void processMapping(Map<String, String> configMap) {
         for (Map.Entry<String, String> entry: configMap.entrySet()) {
             String apiName = entry.getKey();
             String roleMask = entry.getValue();
+            commandsPropertiesOverrides.add(apiName);
             try {
                 short cmdPermissions = Short.parseShort(roleMask);
                 for (RoleType roleType: RoleType.values()) {
                     if ((cmdPermissions & roleType.getValue()) != 0)
-                        s_roleBasedApisMap.get(roleType).add(apiName);
+                        commandsPropertiesRoleBasedApisMap.get(roleType).add(apiName);
                 }
             } catch (NumberFormatException nfe) {
                 s_logger.info("Malformed key=value pair for entry: " + entry.toString());
@@ -104,4 +130,5 @@ public class StaticRoleBasedAPIAccessChecker extends AdapterBase implements APIC
     public void setServices(List<PluggableService> _services) {
         this._services = _services;
     }
+
 }


[02/50] [abbrv] git commit: updated refs/heads/object_store_migration to 5ec2a44

Posted by mc...@apache.org.
CLOUDSTACK-4964: Cisco VNMC: Nexus password gets logged in MS logs during guest n/w implementation with VNMC provider
Suppressing the password from getting logged


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

Branch: refs/heads/object_store_migration
Commit: 8e62fb7998fea0e06cbb6c98e4699b2df4064967
Parents: e4a1ff8
Author: Koushik Das <ko...@apache.org>
Authored: Fri Oct 25 17:58:15 2013 +0530
Committer: Koushik Das <ko...@apache.org>
Committed: Fri Oct 25 17:58:15 2013 +0530

----------------------------------------------------------------------
 .../api/ConfigureNexusVsmForAsaCommand.java     |   3 +
 .../cloud/network/element/CiscoVnmcElement.java | 206 +++++++++----------
 2 files changed, 104 insertions(+), 105 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/8e62fb79/plugins/network-elements/cisco-vnmc/src/com/cloud/agent/api/ConfigureNexusVsmForAsaCommand.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/cisco-vnmc/src/com/cloud/agent/api/ConfigureNexusVsmForAsaCommand.java b/plugins/network-elements/cisco-vnmc/src/com/cloud/agent/api/ConfigureNexusVsmForAsaCommand.java
index b20ad1f..863b347 100755
--- a/plugins/network-elements/cisco-vnmc/src/com/cloud/agent/api/ConfigureNexusVsmForAsaCommand.java
+++ b/plugins/network-elements/cisco-vnmc/src/com/cloud/agent/api/ConfigureNexusVsmForAsaCommand.java
@@ -16,6 +16,8 @@
 // under the License.
 package com.cloud.agent.api;
 
+import com.cloud.agent.api.LogLevel.Log4jLevel;
+
 /**
  * Command for configuring n1kv VSM for asa1kv device. It does the following in VSM:
  * a. creating vservice node for asa1kv
@@ -25,6 +27,7 @@ public class ConfigureNexusVsmForAsaCommand extends Command {
     private long _vlanId;
     private String _ipAddress;
     private String _vsmUsername;
+    @LogLevel(Log4jLevel.Off)
     private String _vsmPassword;
     private String _vsmIp;
     private String _asaInPortProfile;

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/8e62fb79/plugins/network-elements/cisco-vnmc/src/com/cloud/network/element/CiscoVnmcElement.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/cisco-vnmc/src/com/cloud/network/element/CiscoVnmcElement.java b/plugins/network-elements/cisco-vnmc/src/com/cloud/network/element/CiscoVnmcElement.java
index 5beb1ba..fbda707 100644
--- a/plugins/network-elements/cisco-vnmc/src/com/cloud/network/element/CiscoVnmcElement.java
+++ b/plugins/network-elements/cisco-vnmc/src/com/cloud/network/element/CiscoVnmcElement.java
@@ -317,114 +317,110 @@ public class CiscoVnmcElement extends AdapterBase implements SourceNatServicePro
         }
 
         try {
-            Transaction.execute(new TransactionCallbackWithExceptionNoReturn<Exception>() {
-                @Override
-                public void doInTransactionWithoutResult(TransactionStatus status) throws InsufficientAddressCapacityException, ResourceUnavailableException {
-
-                    // ensure that there is an ASA 1000v assigned to this network
-                    CiscoAsa1000vDevice assignedAsa = assignAsa1000vToNetwork(network);
-                    if (assignedAsa == null) {
-                        s_logger.error("Unable to assign ASA 1000v device to network " + network.getName());
-                        throw new CloudRuntimeException("Unable to assign ASA 1000v device to network " + network.getName());
-                    }
-        
-                    ClusterVO asaCluster = _clusterDao.findById(assignedAsa.getClusterId());
-                    ClusterVSMMapVO clusterVsmMap = _clusterVsmMapDao.findByClusterId(assignedAsa.getClusterId());
-                    if (clusterVsmMap == null) {
-                        s_logger.error("Vmware cluster " + asaCluster.getName() + " has no Cisco Nexus VSM device associated with it");
-                        throw new CloudRuntimeException("Vmware cluster " + asaCluster.getName() + " has no Cisco Nexus VSM device associated with it");
-                    }
-        
-                    CiscoNexusVSMDeviceVO vsmDevice = _vsmDeviceDao.findById(clusterVsmMap.getVsmId());
-                    if (vsmDevice == null) {
-                        s_logger.error("Unable to load details of Cisco Nexus VSM device associated with cluster " + asaCluster.getName());
-                        throw new CloudRuntimeException("Unable to load details of Cisco Nexus VSM device associated with cluster " + asaCluster.getName());
-                    }
-        
-                    CiscoVnmcControllerVO ciscoVnmcDevice = devices.get(0);
-                    HostVO ciscoVnmcHost = _hostDao.findById(ciscoVnmcDevice.getHostId());
-                    _hostDao.loadDetails(ciscoVnmcHost);
-                    Account owner = context.getAccount();
-                    PublicIp sourceNatIp = _ipAddrMgr.assignSourceNatIpAddressToGuestNetwork(owner, network);
-                    long vlanId = Long.parseLong(BroadcastDomainType.getValue(network.getBroadcastUri()));
-        
-                    List<VlanVO> vlanVOList = _vlanDao.listVlansByPhysicalNetworkId(network.getPhysicalNetworkId());
-                    List<String> publicGateways = new ArrayList<String>();
-                    for (VlanVO vlanVO : vlanVOList) {
-                        publicGateways.add(vlanVO.getVlanGateway());
-                    }
-        
-                    // due to VNMC limitation of not allowing source NAT ip as the outside ip of firewall,
-                    // an additional public ip needs to acquired for assigning as firewall outside ip.
-                    // In case there are already additional ip addresses available (network restart) use one
-                    // of them such that it is not the source NAT ip
-                    IpAddress outsideIp = null;
-                    List<IPAddressVO> publicIps = _ipAddressDao.listByAssociatedNetwork(network.getId(), null);
-                    for (IPAddressVO ip : publicIps) {
-                        if (!ip.isSourceNat()) {
-                            outsideIp = ip;
-                            break;
-                        }
-                    }
-                    if (outsideIp == null) { // none available, acquire one
-                        try {
-                            Account caller = CallContext.current().getCallingAccount();
-                            long callerUserId = CallContext.current().getCallingUserId();
-                            outsideIp = _ipAddrMgr.allocateIp(owner, false, caller, callerUserId, zone);
-                        } catch (ResourceAllocationException e) {
-                            s_logger.error("Unable to allocate additional public Ip address. Exception details " + e);
-                            throw new CloudRuntimeException("Unable to allocate additional public Ip address. Exception details " + e);
-                        }
-        
-                        try {
-                            outsideIp = _ipAddrMgr.associateIPToGuestNetwork(outsideIp.getId(), network.getId(), true);
-                        } catch (ResourceAllocationException e) {
-                            s_logger.error("Unable to assign allocated additional public Ip " + outsideIp.getAddress().addr() + " to network with vlan " + vlanId + ". Exception details "
-                                    + e);
-                            throw new CloudRuntimeException("Unable to assign allocated additional public Ip " + outsideIp.getAddress().addr() + " to network with vlan " + vlanId + ". Exception details "
-                                    + e);
-                        }
-                    }
-        
-                    // create logical edge firewall in VNMC
-                    String gatewayNetmask = NetUtils.getCidrNetmask(network.getCidr());
-                    // due to ASA limitation of allowing single subnet to be assigned to firewall interfaces,
-                    // all public ip addresses must be from same subnet, this essentially means single public subnet in zone
-                    if (!createLogicalEdgeFirewall(vlanId, network.getGateway(), gatewayNetmask,
-                            outsideIp.getAddress().addr(), sourceNatIp.getNetmask(), publicGateways, ciscoVnmcHost.getId())) {
-                        s_logger.error("Failed to create logical edge firewall in Cisco VNMC device for network " + network.getName());
-                        throw new CloudRuntimeException("Failed to create logical edge firewall in Cisco VNMC device for network " + network.getName());
-                    }
-        
-                    // create stuff in VSM for ASA device
-                    if (!configureNexusVsmForAsa(vlanId, network.getGateway(),
-                            vsmDevice.getUserName(), vsmDevice.getPassword(), vsmDevice.getipaddr(),
-                            assignedAsa.getInPortProfile(), ciscoVnmcHost.getId())) {
-                        s_logger.error("Failed to configure Cisco Nexus VSM " + vsmDevice.getipaddr() +
-                                " for ASA device for network " + network.getName());
-                        throw new CloudRuntimeException("Failed to configure Cisco Nexus VSM " + vsmDevice.getipaddr() +
-                                " for ASA device for network " + network.getName());
-                    }
-        
-                    // configure source NAT
-                    if (!configureSourceNat(vlanId, network.getCidr(), sourceNatIp, ciscoVnmcHost.getId())) {
-                        s_logger.error("Failed to configure source NAT in Cisco VNMC device for network " + network.getName());
-                        throw new CloudRuntimeException("Failed to configure source NAT in Cisco VNMC device for network " + network.getName());
-                    }
-        
-                    // associate Asa 1000v instance with logical edge firewall
-                    if (!associateAsaWithLogicalEdgeFirewall(vlanId, assignedAsa.getManagementIp(), ciscoVnmcHost.getId())) {
-                        s_logger.error("Failed to associate Cisco ASA 1000v (" + assignedAsa.getManagementIp() +
-                                ") with logical edge firewall in VNMC for network " + network.getName());
-                        throw new CloudRuntimeException("Failed to associate Cisco ASA 1000v (" + assignedAsa.getManagementIp() +
-                                ") with logical edge firewall in VNMC for network " + network.getName());
-                    }
+            // ensure that there is an ASA 1000v assigned to this network
+            CiscoAsa1000vDevice assignedAsa = assignAsa1000vToNetwork(network);
+            if (assignedAsa == null) {
+                s_logger.error("Unable to assign ASA 1000v device to network " + network.getName());
+                throw new CloudRuntimeException("Unable to assign ASA 1000v device to network " + network.getName());
+            }
+
+            ClusterVO asaCluster = _clusterDao.findById(assignedAsa.getClusterId());
+            ClusterVSMMapVO clusterVsmMap = _clusterVsmMapDao.findByClusterId(assignedAsa.getClusterId());
+            if (clusterVsmMap == null) {
+                s_logger.error("Vmware cluster " + asaCluster.getName() + " has no Cisco Nexus VSM device associated with it");
+                throw new CloudRuntimeException("Vmware cluster " + asaCluster.getName() + " has no Cisco Nexus VSM device associated with it");
+            }
+
+            CiscoNexusVSMDeviceVO vsmDevice = _vsmDeviceDao.findById(clusterVsmMap.getVsmId());
+            if (vsmDevice == null) {
+                s_logger.error("Unable to load details of Cisco Nexus VSM device associated with cluster " + asaCluster.getName());
+                throw new CloudRuntimeException("Unable to load details of Cisco Nexus VSM device associated with cluster " + asaCluster.getName());
+            }
+
+            CiscoVnmcControllerVO ciscoVnmcDevice = devices.get(0);
+            HostVO ciscoVnmcHost = _hostDao.findById(ciscoVnmcDevice.getHostId());
+            _hostDao.loadDetails(ciscoVnmcHost);
+            Account owner = context.getAccount();
+            PublicIp sourceNatIp = _ipAddrMgr.assignSourceNatIpAddressToGuestNetwork(owner, network);
+            long vlanId = Long.parseLong(BroadcastDomainType.getValue(network.getBroadcastUri()));
+
+            List<VlanVO> vlanVOList = _vlanDao.listVlansByPhysicalNetworkId(network.getPhysicalNetworkId());
+            List<String> publicGateways = new ArrayList<String>();
+            for (VlanVO vlanVO : vlanVOList) {
+                publicGateways.add(vlanVO.getVlanGateway());
+            }
+
+            // due to VNMC limitation of not allowing source NAT ip as the outside ip of firewall,
+            // an additional public ip needs to acquired for assigning as firewall outside ip.
+            // In case there are already additional ip addresses available (network restart) use one
+            // of them such that it is not the source NAT ip
+            IpAddress outsideIp = null;
+            List<IPAddressVO> publicIps = _ipAddressDao.listByAssociatedNetwork(network.getId(), null);
+            for (IPAddressVO ip : publicIps) {
+                if (!ip.isSourceNat()) {
+                    outsideIp = ip;
+                    break;
                 }
-            });
+            }
+            if (outsideIp == null) { // none available, acquire one
+                try {
+                    Account caller = CallContext.current().getCallingAccount();
+                    long callerUserId = CallContext.current().getCallingUserId();
+                    outsideIp = _ipAddrMgr.allocateIp(owner, false, caller, callerUserId, zone);
+                } catch (ResourceAllocationException e) {
+                    s_logger.error("Unable to allocate additional public Ip address. Exception details " + e);
+                    throw new CloudRuntimeException("Unable to allocate additional public Ip address. Exception details " + e);
+                }
+
+                try {
+                    outsideIp = _ipAddrMgr.associateIPToGuestNetwork(outsideIp.getId(), network.getId(), true);
+                } catch (ResourceAllocationException e) {
+                    s_logger.error("Unable to assign allocated additional public Ip " + outsideIp.getAddress().addr() + " to network with vlan " + vlanId + ". Exception details "
+                            + e);
+                    throw new CloudRuntimeException("Unable to assign allocated additional public Ip " + outsideIp.getAddress().addr() + " to network with vlan " + vlanId + ". Exception details "
+                            + e);
+                }
+            }
+
+            // create logical edge firewall in VNMC
+            String gatewayNetmask = NetUtils.getCidrNetmask(network.getCidr());
+            // due to ASA limitation of allowing single subnet to be assigned to firewall interfaces,
+            // all public ip addresses must be from same subnet, this essentially means single public subnet in zone
+            if (!createLogicalEdgeFirewall(vlanId, network.getGateway(), gatewayNetmask,
+                    outsideIp.getAddress().addr(), sourceNatIp.getNetmask(), publicGateways, ciscoVnmcHost.getId())) {
+                s_logger.error("Failed to create logical edge firewall in Cisco VNMC device for network " + network.getName());
+                throw new CloudRuntimeException("Failed to create logical edge firewall in Cisco VNMC device for network " + network.getName());
+            }
+
+            // create stuff in VSM for ASA device
+            if (!configureNexusVsmForAsa(vlanId, network.getGateway(),
+                    vsmDevice.getUserName(), vsmDevice.getPassword(), vsmDevice.getipaddr(),
+                    assignedAsa.getInPortProfile(), ciscoVnmcHost.getId())) {
+                s_logger.error("Failed to configure Cisco Nexus VSM " + vsmDevice.getipaddr() +
+                        " for ASA device for network " + network.getName());
+                throw new CloudRuntimeException("Failed to configure Cisco Nexus VSM " + vsmDevice.getipaddr() +
+                        " for ASA device for network " + network.getName());
+            }
+
+            // configure source NAT
+            if (!configureSourceNat(vlanId, network.getCidr(), sourceNatIp, ciscoVnmcHost.getId())) {
+                s_logger.error("Failed to configure source NAT in Cisco VNMC device for network " + network.getName());
+                throw new CloudRuntimeException("Failed to configure source NAT in Cisco VNMC device for network " + network.getName());
+            }
+
+            // associate Asa 1000v instance with logical edge firewall
+            if (!associateAsaWithLogicalEdgeFirewall(vlanId, assignedAsa.getManagementIp(), ciscoVnmcHost.getId())) {
+                s_logger.error("Failed to associate Cisco ASA 1000v (" + assignedAsa.getManagementIp() +
+                        ") with logical edge firewall in VNMC for network " + network.getName());
+                throw new CloudRuntimeException("Failed to associate Cisco ASA 1000v (" + assignedAsa.getManagementIp() +
+                        ") with logical edge firewall in VNMC for network " + network.getName());
+            }
         } catch (CloudRuntimeException e) {
+            unassignAsa1000vFromNetwork(network);
             s_logger.error("CiscoVnmcElement failed", e);
             return false;
         } catch (Exception e) {
+            unassignAsa1000vFromNetwork(network);
             ExceptionUtil.rethrowRuntime(e);
             ExceptionUtil.rethrow(e, InsufficientAddressCapacityException.class);
             ExceptionUtil.rethrow(e, ResourceUnavailableException.class);
@@ -579,10 +575,10 @@ public class CiscoVnmcElement extends AdapterBase implements SourceNatServicePro
                     public CiscoVnmcController doInTransaction(TransactionStatus status) {
                         CiscoVnmcController ciscoVnmcResource = new CiscoVnmcControllerVO(host.getId(), physicalNetworkId, ntwkSvcProvider.getProviderName(), deviceName);
                         _ciscoVnmcDao.persist((CiscoVnmcControllerVO)ciscoVnmcResource);
-        
+
                         DetailVO detail = new DetailVO(host.getId(), "deviceid", String.valueOf(ciscoVnmcResource.getId()));
                         _hostDetailsDao.persist(detail);
-                        
+
                         return ciscoVnmcResource;
                     }
                 });


[19/50] [abbrv] git commit: updated refs/heads/object_store_migration to 5ec2a44

Posted by mc...@apache.org.
build fix

Failing VMSnapshotStrategyTest was missing db.properties

Signed-off-by: Laszlo Hornyak <la...@gmail.com>


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

Branch: refs/heads/object_store_migration
Commit: 7902315287c268ff81e3b6664df6ddee7351716a
Parents: 694ec68
Author: Laszlo Hornyak <la...@gmail.com>
Authored: Sat Oct 26 17:34:00 2013 +0200
Committer: Laszlo Hornyak <la...@gmail.com>
Committed: Sat Oct 26 17:34:00 2013 +0200

----------------------------------------------------------------------
 .../snapshot/test/resources/db.properties       | 70 ++++++++++++++++++++
 1 file changed, 70 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/79023152/engine/storage/snapshot/test/resources/db.properties
----------------------------------------------------------------------
diff --git a/engine/storage/snapshot/test/resources/db.properties b/engine/storage/snapshot/test/resources/db.properties
new file mode 100644
index 0000000..18bf54c
--- /dev/null
+++ b/engine/storage/snapshot/test/resources/db.properties
@@ -0,0 +1,70 @@
+# 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.
+
+
+# management server clustering parameters, change cluster.node.IP to the machine IP address
+# in which the management server(Tomcat) is running
+cluster.node.IP=127.0.0.1
+cluster.servlet.port=9090
+
+# CloudStack database settings
+db.cloud.username=cloud
+db.cloud.password=cloud
+db.root.password=
+db.cloud.host=localhost
+db.cloud.port=3306
+db.cloud.name=cloud
+
+# CloudStack database tuning parameters
+db.cloud.maxActive=250
+db.cloud.maxIdle=30
+db.cloud.maxWait=10000
+db.cloud.autoReconnect=true
+db.cloud.validationQuery=SELECT 1
+db.cloud.testOnBorrow=true
+db.cloud.testWhileIdle=true
+db.cloud.timeBetweenEvictionRunsMillis=40000
+db.cloud.minEvictableIdleTimeMillis=240000
+db.cloud.poolPreparedStatements=false
+db.cloud.url.params=prepStmtCacheSize=517&cachePrepStmts=true&prepStmtCacheSqlLimit=4096
+
+# usage database settings
+db.usage.username=cloud
+db.usage.password=cloud
+db.usage.host=localhost
+db.usage.port=3306
+db.usage.name=cloud_usage
+
+# usage database tuning parameters
+db.usage.maxActive=100
+db.usage.maxIdle=30
+db.usage.maxWait=10000
+db.usage.autoReconnect=true
+
+# awsapi database settings
+db.awsapi.name=cloudbridge
+
+# Simulator database settings
+db.simulator.username=cloud
+db.simulator.password=cloud
+db.simulator.host=localhost
+db.simulator.port=3306
+db.simulator.name=simulator
+db.simulator.maxActive=250
+db.simulator.maxIdle=30
+db.simulator.maxWait=10000
+db.simulator.autoReconnect=true


[15/50] [abbrv] git commit: updated refs/heads/object_store_migration to 5ec2a44

Posted by mc...@apache.org.
rebase to spring changes


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

Branch: refs/heads/object_store_migration
Commit: 70b2c0150dad5ca3b42e34d20831a256661bc8f0
Parents: 51a8086
Author: Edison Su <su...@gmail.com>
Authored: Fri Oct 25 18:15:36 2013 -0700
Committer: Edison Su <su...@gmail.com>
Committed: Fri Oct 25 18:15:36 2013 -0700

----------------------------------------------------------------------
 .../core/spring-core-registry-core-context.xml  |  7 ++-
 ...ng-lifecycle-storage-context-inheritable.xml |  6 ++
 .../api/storage/StorageStrategyFactory.java     |  5 +-
 .../api/storage/VMSnapshotStrategy.java         |  2 +-
 .../spring-engine-schema-core-daos-context.xml  |  1 +
 .../core/spring-engine-storage-core-context.xml |  1 +
 ...-engine-storage-snapshot-storage-context.xml |  7 ++-
 .../vmsnapshot/DefaultVMSnapshotStrategy.java   |  5 +-
 .../helper/StorageStrategyFactoryImpl.java      | 22 +++++++
 .../vm/snapshot/VMSnapshotManagerImpl.java      | 62 ++------------------
 10 files changed, 56 insertions(+), 62 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/70b2c015/core/resources/META-INF/cloudstack/core/spring-core-registry-core-context.xml
----------------------------------------------------------------------
diff --git a/core/resources/META-INF/cloudstack/core/spring-core-registry-core-context.xml b/core/resources/META-INF/cloudstack/core/spring-core-registry-core-context.xml
index 26d70c9..a8b2e29 100644
--- a/core/resources/META-INF/cloudstack/core/spring-core-registry-core-context.xml
+++ b/core/resources/META-INF/cloudstack/core/spring-core-registry-core-context.xml
@@ -260,9 +260,14 @@
         <property name="excludeKey" value="snapshot.strategies.exclude" />
     </bean>
 
+    <bean id="vmSnapshotStrategiesRegistry"
+        class="org.apache.cloudstack.spring.lifecycle.registry.ExtensionRegistry">
+        <property name="excludeKey" value="vmSnapshot.strategies.exclude" />
+    </bean>
+
     <bean id="dataMotionStrategiesRegistry"
         class="org.apache.cloudstack.spring.lifecycle.registry.ExtensionRegistry">
         <property name="excludeKey" value="data.motion.strategies.exclude" />
     </bean>
     
-</beans>
\ No newline at end of file
+</beans>

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/70b2c015/core/resources/META-INF/cloudstack/storage/spring-lifecycle-storage-context-inheritable.xml
----------------------------------------------------------------------
diff --git a/core/resources/META-INF/cloudstack/storage/spring-lifecycle-storage-context-inheritable.xml b/core/resources/META-INF/cloudstack/storage/spring-lifecycle-storage-context-inheritable.xml
index b6eed7d..ad78cad 100644
--- a/core/resources/META-INF/cloudstack/storage/spring-lifecycle-storage-context-inheritable.xml
+++ b/core/resources/META-INF/cloudstack/storage/spring-lifecycle-storage-context-inheritable.xml
@@ -64,6 +64,12 @@
     </bean>
 
     <bean class="org.apache.cloudstack.spring.lifecycle.registry.RegistryLifecycle">
+        <property name="registry" ref="vmSnapshotStrategiesRegistry" />
+        <property name="typeClass"
+            value="org.apache.cloudstack.engine.subsystem.api.storage.VMSnapshotStrategy" />
+    </bean>
+
+    <bean class="org.apache.cloudstack.spring.lifecycle.registry.RegistryLifecycle">
         <property name="registry" ref="dataMotionStrategiesRegistry" />
         <property name="typeClass"
             value="org.apache.cloudstack.engine.subsystem.api.storage.DataMotionStrategy" />

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/70b2c015/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/StorageStrategyFactory.java
----------------------------------------------------------------------
diff --git a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/StorageStrategyFactory.java b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/StorageStrategyFactory.java
index ac1e311..91bcc1f 100644
--- a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/StorageStrategyFactory.java
+++ b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/StorageStrategyFactory.java
@@ -24,6 +24,7 @@ import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotStrategy.Snaps
 
 import com.cloud.host.Host;
 import com.cloud.storage.Snapshot;
+import com.cloud.vm.snapshot.VMSnapshot;
 
 public interface StorageStrategyFactory {
 
@@ -31,6 +32,8 @@ public interface StorageStrategyFactory {
 
     DataMotionStrategy getDataMotionStrategy(Map<VolumeInfo, DataStore> volumeMap, Host srcHost, Host destHost);
 
-    SnapshotStrategy getSnapshotStrategy(Snapshot snapshot, SnapshotOperation op); 
+    SnapshotStrategy getSnapshotStrategy(Snapshot snapshot, SnapshotOperation op);
+
+    VMSnapshotStrategy getVmSnapshotStrategy(VMSnapshot vmSnapshot);
 
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/70b2c015/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/VMSnapshotStrategy.java
----------------------------------------------------------------------
diff --git a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/VMSnapshotStrategy.java b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/VMSnapshotStrategy.java
index 8dd6eca..c2a0ded 100644
--- a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/VMSnapshotStrategy.java
+++ b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/VMSnapshotStrategy.java
@@ -24,5 +24,5 @@ public interface VMSnapshotStrategy {
     VMSnapshot takeVMSnapshot(VMSnapshot vmSnapshot);
     boolean deleteVMSnapshot(VMSnapshot vmSnapshot);
     boolean revertVMSnapshot(VMSnapshot vmSnapshot);
-    boolean canHandle(VMSnapshot vmSnapshot);
+    StrategyPriority canHandle(VMSnapshot vmSnapshot);
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/70b2c015/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 a70cd00..3fce439 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
@@ -291,6 +291,7 @@
   <bean id="vMReservationDaoImpl" class="org.apache.cloudstack.engine.cloud.entity.api.db.dao.VMReservationDaoImpl" />
   <bean id="vMRootDiskTagDaoImpl" class="org.apache.cloudstack.engine.cloud.entity.api.db.dao.VMRootDiskTagDaoImpl" />
   <bean id="vMSnapshotDaoImpl" class="com.cloud.vm.snapshot.dao.VMSnapshotDaoImpl" />
+  <bean id="vMSnapshotDetailsDaoImpl" class="com.cloud.vm.snapshot.dao.VMSnapshotDetailsDaoImpl" />
   <bean id="vMTemplateDetailsDaoImpl" class="com.cloud.storage.dao.VMTemplateDetailsDaoImpl" />
   <bean id="vMTemplateHostDaoImpl" class="com.cloud.storage.dao.VMTemplateHostDaoImpl" />
   <bean id="vMTemplatePoolDaoImpl" class="com.cloud.storage.dao.VMTemplatePoolDaoImpl" />

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/70b2c015/engine/storage/resources/META-INF/cloudstack/core/spring-engine-storage-core-context.xml
----------------------------------------------------------------------
diff --git a/engine/storage/resources/META-INF/cloudstack/core/spring-engine-storage-core-context.xml b/engine/storage/resources/META-INF/cloudstack/core/spring-engine-storage-core-context.xml
index 8a78fdd..a6a0c22 100644
--- a/engine/storage/resources/META-INF/cloudstack/core/spring-engine-storage-core-context.xml
+++ b/engine/storage/resources/META-INF/cloudstack/core/spring-engine-storage-core-context.xml
@@ -63,6 +63,7 @@
     <bean id="storageStrategyFactoryImpl" class="org.apache.cloudstack.storage.helper.StorageStrategyFactoryImpl" >
         <property name="dataMotionStrategies" value="#{dataMotionStrategiesRegistry.registered}" />
         <property name="snapshotStrategies" value="#{snapshotStrategiesRegistry.registered}" />
+        <property name="vmSnapshotStrategies" value="#{vmSnapshotStrategiesRegistry.registered}" />
     </bean>
 
 </beans>

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/70b2c015/engine/storage/snapshot/resources/META-INF/cloudstack/storage/spring-engine-storage-snapshot-storage-context.xml
----------------------------------------------------------------------
diff --git a/engine/storage/snapshot/resources/META-INF/cloudstack/storage/spring-engine-storage-snapshot-storage-context.xml b/engine/storage/snapshot/resources/META-INF/cloudstack/storage/spring-engine-storage-snapshot-storage-context.xml
index 3faa894..d25aeea 100644
--- a/engine/storage/snapshot/resources/META-INF/cloudstack/storage/spring-engine-storage-snapshot-storage-context.xml
+++ b/engine/storage/snapshot/resources/META-INF/cloudstack/storage/spring-engine-storage-snapshot-storage-context.xml
@@ -30,4 +30,9 @@
     <bean id="xenserverSnapshotStrategy"
         class="org.apache.cloudstack.storage.snapshot.XenserverSnapshotStrategy" />
 
-</beans>
\ No newline at end of file
+    <bean id="DefaultVMSnapshotStrategy"
+        class="org.apache.cloudstack.storage.vmsnapshot.DefaultVMSnapshotStrategy" />
+
+    <bean id="VMSnapshotHelperImpl"
+        class="org.apache.cloudstack.storage.vmsnapshot.VMSnapshotHelperImpl" />
+</beans>

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/70b2c015/engine/storage/snapshot/src/org/apache/cloudstack/storage/vmsnapshot/DefaultVMSnapshotStrategy.java
----------------------------------------------------------------------
diff --git a/engine/storage/snapshot/src/org/apache/cloudstack/storage/vmsnapshot/DefaultVMSnapshotStrategy.java b/engine/storage/snapshot/src/org/apache/cloudstack/storage/vmsnapshot/DefaultVMSnapshotStrategy.java
index 0ef8ebb..be3cce9 100644
--- a/engine/storage/snapshot/src/org/apache/cloudstack/storage/vmsnapshot/DefaultVMSnapshotStrategy.java
+++ b/engine/storage/snapshot/src/org/apache/cloudstack/storage/vmsnapshot/DefaultVMSnapshotStrategy.java
@@ -24,6 +24,7 @@ import java.util.Map;
 import javax.inject.Inject;
 import javax.naming.ConfigurationException;
 
+import org.apache.cloudstack.engine.subsystem.api.storage.StrategyPriority;
 import org.apache.cloudstack.engine.subsystem.api.storage.VMSnapshotStrategy;
 import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
 import org.apache.cloudstack.storage.to.VolumeObjectTO;
@@ -364,7 +365,7 @@ public class DefaultVMSnapshotStrategy extends ManagerBase implements VMSnapshot
     }
 
     @Override
-    public boolean canHandle(VMSnapshot vmSnapshot) {
-        return true;
+    public StrategyPriority canHandle(VMSnapshot vmSnapshot) {
+        return StrategyPriority.DEFAULT;
     }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/70b2c015/engine/storage/src/org/apache/cloudstack/storage/helper/StorageStrategyFactoryImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/helper/StorageStrategyFactoryImpl.java b/engine/storage/src/org/apache/cloudstack/storage/helper/StorageStrategyFactoryImpl.java
index 30812bf..a1d128b 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/helper/StorageStrategyFactoryImpl.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/helper/StorageStrategyFactoryImpl.java
@@ -31,15 +31,18 @@ import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotStrategy;
 import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotStrategy.SnapshotOperation;
 import org.apache.cloudstack.engine.subsystem.api.storage.StorageStrategyFactory;
 import org.apache.cloudstack.engine.subsystem.api.storage.StrategyPriority;
+import org.apache.cloudstack.engine.subsystem.api.storage.VMSnapshotStrategy;
 import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo;
 
 import com.cloud.host.Host;
 import com.cloud.storage.Snapshot;
+import com.cloud.vm.snapshot.VMSnapshot;
 
 public class StorageStrategyFactoryImpl implements StorageStrategyFactory {
 
     List<SnapshotStrategy> snapshotStrategies;
     List<DataMotionStrategy> dataMotionStrategies;
+    List<VMSnapshotStrategy> vmSnapshotStrategies;
 
     @Override
     public DataMotionStrategy getDataMotionStrategy(final DataObject srcData, final DataObject destData) {
@@ -71,6 +74,16 @@ public class StorageStrategyFactoryImpl implements StorageStrategyFactory {
         });
     }
 
+    @Override
+    public VMSnapshotStrategy getVmSnapshotStrategy(final VMSnapshot vmSnapshot) {
+       return bestMatch(vmSnapshotStrategies, new CanHandle<VMSnapshotStrategy>() {
+           @Override
+           public StrategyPriority canHandle(VMSnapshotStrategy strategy) {
+                return strategy.canHandle(vmSnapshot);
+           }
+       });
+    }
+
     private static <T> T bestMatch(Collection<T> collection, final CanHandle<T> canHandle) {
         if (collection.size() == 0)
             return null;
@@ -111,4 +124,13 @@ public class StorageStrategyFactoryImpl implements StorageStrategyFactory {
         this.dataMotionStrategies = dataMotionStrategies;
     }
 
+    @Inject
+    public void setVmSnapshotStrategies(List<VMSnapshotStrategy> vmSnapshotStrategies) {
+        this.vmSnapshotStrategies = vmSnapshotStrategies;
+    }
+
+    public List<VMSnapshotStrategy> getVmSnapshotStrategies() {
+        return vmSnapshotStrategies;
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/70b2c015/server/src/com/cloud/vm/snapshot/VMSnapshotManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/vm/snapshot/VMSnapshotManagerImpl.java b/server/src/com/cloud/vm/snapshot/VMSnapshotManagerImpl.java
index 3f473bd..ee81c82 100644
--- a/server/src/com/cloud/vm/snapshot/VMSnapshotManagerImpl.java
+++ b/server/src/com/cloud/vm/snapshot/VMSnapshotManagerImpl.java
@@ -27,26 +27,13 @@ import javax.ejb.Local;
 import javax.inject.Inject;
 import javax.naming.ConfigurationException;
 
-import org.apache.log4j.Logger;
-import org.springframework.stereotype.Component;
 import org.apache.cloudstack.api.command.user.vmsnapshot.ListVMSnapshotCmd;
 import org.apache.cloudstack.context.CallContext;
-import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
+import org.apache.cloudstack.engine.subsystem.api.storage.StorageStrategyFactory;
+import org.apache.cloudstack.engine.subsystem.api.storage.VMSnapshotStrategy;
 import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
-import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
-import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
-
-import com.cloud.agent.AgentManager;
-import com.cloud.agent.api.Answer;
-import com.cloud.agent.api.Command;
-import com.cloud.agent.api.CreateVMSnapshotAnswer;
-import com.cloud.agent.api.CreateVMSnapshotCommand;
-import com.cloud.agent.api.DeleteVMSnapshotAnswer;
-import com.cloud.agent.api.DeleteVMSnapshotCommand;
-import com.cloud.agent.api.RevertToVMSnapshotAnswer;
-import com.cloud.agent.api.RevertToVMSnapshotCommand;
-import com.cloud.agent.api.VMSnapshotTO;
-import com.cloud.agent.api.to.VolumeTO;
+import org.apache.log4j.Logger;
+import org.springframework.stereotype.Component;
 
 import com.cloud.event.ActionEvent;
 import com.cloud.event.EventTypes;
@@ -75,14 +62,6 @@ import com.cloud.utils.component.ManagerBase;
 import com.cloud.utils.db.Filter;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
-
-import com.cloud.utils.db.Transaction;
-import com.cloud.utils.db.TransactionCallback;
-import com.cloud.utils.db.TransactionCallbackNoReturn;
-import com.cloud.utils.db.TransactionCallbackWithException;
-import com.cloud.utils.db.TransactionCallbackWithExceptionNoReturn;
-import com.cloud.utils.db.TransactionStatus;
-
 import com.cloud.utils.exception.CloudRuntimeException;
 import com.cloud.vm.UserVmVO;
 import com.cloud.vm.VMInstanceVO;
@@ -92,21 +71,6 @@ import com.cloud.vm.VirtualMachineManager;
 import com.cloud.vm.VirtualMachineProfile;
 import com.cloud.vm.dao.UserVmDao;
 import com.cloud.vm.snapshot.dao.VMSnapshotDao;
-import org.apache.cloudstack.api.command.user.vmsnapshot.ListVMSnapshotCmd;
-import org.apache.cloudstack.context.CallContext;
-import org.apache.cloudstack.engine.subsystem.api.storage.VMSnapshotStrategy;
-import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
-import org.apache.log4j.Logger;
-import org.springframework.stereotype.Component;
-
-import javax.ejb.Local;
-import javax.inject.Inject;
-import javax.naming.ConfigurationException;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
 
 @Component
 @Local(value = { VMSnapshotManager.class, VMSnapshotService.class })
@@ -123,16 +87,8 @@ public class VMSnapshotManagerImpl extends ManagerBase implements VMSnapshotMana
     @Inject VirtualMachineManager _itMgr;
     @Inject ConfigurationDao _configDao;
     @Inject HypervisorCapabilitiesDao _hypervisorCapabilitiesDao;
-    @Inject List<VMSnapshotStrategy> vmSnapshotStrategies;
-
-    public List<VMSnapshotStrategy> getVmSnapshotStrategies() {
-        return vmSnapshotStrategies;
-    }
-
     @Inject
-    public void setVmSnapshotStrategies(List<VMSnapshotStrategy> vmSnapshotStrategies) {
-        this.vmSnapshotStrategies = vmSnapshotStrategies;
-    }
+    StorageStrategyFactory storageStrategyFactory;
 
     int _vmSnapshotMax;
     int _wait;
@@ -343,13 +299,7 @@ public class VMSnapshotManagerImpl extends ManagerBase implements VMSnapshotMana
     }
 
     private VMSnapshotStrategy findVMSnapshotStrategy(VMSnapshot vmSnapshot) {
-        VMSnapshotStrategy snapshotStrategy = null;
-        for(VMSnapshotStrategy strategy : vmSnapshotStrategies) {
-            if (strategy.canHandle(vmSnapshot)) {
-                snapshotStrategy = strategy;
-                break;
-            }
-        }
+        VMSnapshotStrategy snapshotStrategy = storageStrategyFactory.getVmSnapshotStrategy(vmSnapshot);
 
         if (snapshotStrategy == null) {
             throw new CloudRuntimeException("can't find vm snapshot strategy for vmsnapshot: " + vmSnapshot.getId());


[09/50] [abbrv] move a lot of code into vmsnapshot strategy

Posted by mc...@apache.org.
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/a6ce66e5/engine/storage/snapshot/test/src/VMSnapshotStrategyTest.java
----------------------------------------------------------------------
diff --git a/engine/storage/snapshot/test/src/VMSnapshotStrategyTest.java b/engine/storage/snapshot/test/src/VMSnapshotStrategyTest.java
new file mode 100644
index 0000000..8e36faf
--- /dev/null
+++ b/engine/storage/snapshot/test/src/VMSnapshotStrategyTest.java
@@ -0,0 +1,256 @@
+/*
+ * 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 src;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+import javax.inject.Inject;
+
+import org.apache.cloudstack.engine.subsystem.api.storage.VMSnapshotStrategy;
+import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
+import org.apache.cloudstack.storage.to.VolumeObjectTO;
+import org.apache.cloudstack.storage.vmsnapshot.DefaultVMSnapshotStrategy;
+import org.apache.cloudstack.storage.vmsnapshot.VMSnapshotHelper;
+import org.apache.cloudstack.test.utils.SpringUtils;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mockito;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.FilterType;
+import org.springframework.core.type.classreading.MetadataReader;
+import org.springframework.core.type.classreading.MetadataReaderFactory;
+import org.springframework.core.type.filter.TypeFilter;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import org.springframework.test.context.support.AnnotationConfigContextLoader;
+
+import com.cloud.agent.AgentManager;
+import com.cloud.agent.api.Command;
+import com.cloud.agent.api.CreateVMSnapshotAnswer;
+import com.cloud.agent.api.DeleteVMSnapshotAnswer;
+import com.cloud.agent.api.RevertToVMSnapshotAnswer;
+import com.cloud.agent.api.VMSnapshotTO;
+import com.cloud.exception.AgentUnavailableException;
+import com.cloud.exception.OperationTimedoutException;
+import com.cloud.storage.GuestOSVO;
+import com.cloud.storage.dao.DiskOfferingDao;
+import com.cloud.storage.dao.GuestOSDao;
+import com.cloud.storage.dao.VolumeDao;
+import com.cloud.utils.component.ComponentContext;
+import com.cloud.utils.exception.CloudRuntimeException;
+import com.cloud.utils.net.NetUtils;
+import com.cloud.vm.UserVmVO;
+import com.cloud.vm.dao.UserVmDao;
+import com.cloud.vm.snapshot.VMSnapshot;
+import com.cloud.vm.snapshot.VMSnapshotVO;
+import com.cloud.vm.snapshot.dao.VMSnapshotDao;
+
+import junit.framework.TestCase;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(loader = AnnotationConfigContextLoader.class)
+public class VMSnapshotStrategyTest extends TestCase {
+    @Inject
+    VMSnapshotStrategy vmSnapshotStrategy;
+    @Inject
+    VMSnapshotHelper vmSnapshotHelper;
+    @Inject UserVmDao userVmDao;
+    @Inject
+    GuestOSDao guestOSDao;
+    @Inject
+    AgentManager agentMgr;
+    @Inject
+    VMSnapshotDao vmSnapshotDao;
+    @Override
+    @Before
+    public void setUp() {
+        ComponentContext.initComponentsLifeCycle();
+    }
+
+
+    @Test
+    public void testCreateVMSnapshot() throws AgentUnavailableException, OperationTimedoutException {
+        Long hostId = 1L;
+        Long vmId = 1L;
+        Long guestOsId = 1L;
+        List<VolumeObjectTO> volumeObjectTOs = new ArrayList<VolumeObjectTO>();
+        VMSnapshotVO vmSnapshot = Mockito.mock(VMSnapshotVO.class);
+        UserVmVO userVmVO = Mockito.mock(UserVmVO.class);
+        Mockito.when(userVmVO.getGuestOSId()).thenReturn(guestOsId);
+        Mockito.when(vmSnapshot.getVmId()).thenReturn(vmId);
+        Mockito.when(vmSnapshotHelper.pickRunningHost(Mockito.anyLong())).thenReturn(hostId);
+        Mockito.when(vmSnapshotHelper.getVolumeTOList(Mockito.anyLong())).thenReturn(volumeObjectTOs);
+        Mockito.when(userVmDao.findById(Mockito.anyLong())).thenReturn(userVmVO);
+        GuestOSVO guestOSVO = Mockito.mock(GuestOSVO.class);
+        Mockito.when(guestOSDao.findById(Mockito.anyLong())).thenReturn(guestOSVO);
+        Mockito.when(agentMgr.send(Mockito.anyLong(), Mockito.any(Command.class))).thenReturn(null);
+        Exception e = null;
+        try {
+            vmSnapshotStrategy.takeVMSnapshot(vmSnapshot);
+        } catch (CloudRuntimeException e1) {
+            e = e1;
+        }
+
+        assertNotNull(e);
+        CreateVMSnapshotAnswer answer = Mockito.mock(CreateVMSnapshotAnswer.class);
+        Mockito.when(answer.getResult()).thenReturn(true);
+        Mockito.when(agentMgr.send(Mockito.anyLong(), Mockito.any(Command.class))).thenReturn(answer);
+        Mockito.when(vmSnapshotDao.findById(Mockito.anyLong())).thenReturn(vmSnapshot);
+        VMSnapshot snapshot = null;
+        snapshot = vmSnapshotStrategy.takeVMSnapshot(vmSnapshot);
+        assertNotNull(snapshot);
+    }
+
+    @Test
+    public void testRevertSnapshot() throws AgentUnavailableException, OperationTimedoutException {
+        Long hostId = 1L;
+        Long vmId = 1L;
+        Long guestOsId = 1L;
+        List<VolumeObjectTO> volumeObjectTOs = new ArrayList<VolumeObjectTO>();
+        VMSnapshotVO vmSnapshot = Mockito.mock(VMSnapshotVO.class);
+        UserVmVO userVmVO = Mockito.mock(UserVmVO.class);
+        Mockito.when(userVmVO.getGuestOSId()).thenReturn(guestOsId);
+        Mockito.when(vmSnapshot.getVmId()).thenReturn(vmId);
+        Mockito.when(vmSnapshotHelper.pickRunningHost(Mockito.anyLong())).thenReturn(hostId);
+        Mockito.when(vmSnapshotHelper.getVolumeTOList(Mockito.anyLong())).thenReturn(volumeObjectTOs);
+        Mockito.when(userVmDao.findById(Mockito.anyLong())).thenReturn(userVmVO);
+        GuestOSVO guestOSVO = Mockito.mock(GuestOSVO.class);
+        Mockito.when(guestOSDao.findById(Mockito.anyLong())).thenReturn(guestOSVO);
+        VMSnapshotTO vmSnapshotTO = Mockito.mock(VMSnapshotTO.class);
+        Mockito.when(vmSnapshotHelper.getSnapshotWithParents(Mockito.any(VMSnapshotVO.class))).thenReturn(vmSnapshotTO);
+        Mockito.when(vmSnapshotDao.findById(Mockito.anyLong())).thenReturn(vmSnapshot);
+        Mockito.when(vmSnapshot.getId()).thenReturn(1L);
+        Mockito.when(vmSnapshot.getCreated()).thenReturn(new Date());
+        Mockito.when(agentMgr.send(Mockito.anyLong(), Mockito.any(Command.class))).thenReturn(null);
+        Exception e = null;
+        try {
+            vmSnapshotStrategy.revertVMSnapshot(vmSnapshot);
+        } catch (CloudRuntimeException e1) {
+            e = e1;
+        }
+
+        assertNotNull(e);
+
+        RevertToVMSnapshotAnswer answer = Mockito.mock(RevertToVMSnapshotAnswer.class);
+        Mockito.when(answer.getResult()).thenReturn(Boolean.TRUE);
+        Mockito.when(agentMgr.send(Mockito.anyLong(), Mockito.any(Command.class))).thenReturn(answer);
+        boolean result = vmSnapshotStrategy.revertVMSnapshot(vmSnapshot);
+        assertTrue(result);
+    }
+
+    @Test
+    public void testDeleteVMSnapshot() throws AgentUnavailableException, OperationTimedoutException {
+        Long hostId = 1L;
+        Long vmId = 1L;
+        Long guestOsId = 1L;
+        List<VolumeObjectTO> volumeObjectTOs = new ArrayList<VolumeObjectTO>();
+        VMSnapshotVO vmSnapshot = Mockito.mock(VMSnapshotVO.class);
+        UserVmVO userVmVO = Mockito.mock(UserVmVO.class);
+        Mockito.when(userVmVO.getGuestOSId()).thenReturn(guestOsId);
+        Mockito.when(vmSnapshot.getVmId()).thenReturn(vmId);
+        Mockito.when(vmSnapshotHelper.pickRunningHost(Mockito.anyLong())).thenReturn(hostId);
+        Mockito.when(vmSnapshotHelper.getVolumeTOList(Mockito.anyLong())).thenReturn(volumeObjectTOs);
+        Mockito.when(userVmDao.findById(Mockito.anyLong())).thenReturn(userVmVO);
+        GuestOSVO guestOSVO = Mockito.mock(GuestOSVO.class);
+        Mockito.when(guestOSDao.findById(Mockito.anyLong())).thenReturn(guestOSVO);
+        VMSnapshotTO vmSnapshotTO = Mockito.mock(VMSnapshotTO.class);
+        Mockito.when(vmSnapshotHelper.getSnapshotWithParents(Mockito.any(VMSnapshotVO.class))).thenReturn(vmSnapshotTO);
+        Mockito.when(vmSnapshotDao.findById(Mockito.anyLong())).thenReturn(vmSnapshot);
+        Mockito.when(vmSnapshot.getId()).thenReturn(1L);
+        Mockito.when(vmSnapshot.getCreated()).thenReturn(new Date());
+        Mockito.when(agentMgr.send(Mockito.anyLong(), Mockito.any(Command.class))).thenReturn(null);
+
+        Exception e = null;
+        try {
+            vmSnapshotStrategy.deleteVMSnapshot(vmSnapshot);
+        } catch (CloudRuntimeException e1) {
+            e = e1;
+        }
+
+        assertNotNull(e);
+
+        DeleteVMSnapshotAnswer answer = Mockito.mock(DeleteVMSnapshotAnswer.class);
+        Mockito.when(answer.getResult()).thenReturn(true);
+        Mockito.when(agentMgr.send(Mockito.anyLong(), Mockito.any(Command.class))).thenReturn(answer);
+
+        boolean result = vmSnapshotStrategy.deleteVMSnapshot(vmSnapshot);
+        assertTrue(result);
+    }
+
+
+    @Configuration
+    @ComponentScan(basePackageClasses = {NetUtils.class, DefaultVMSnapshotStrategy.class}, includeFilters = {@ComponentScan.Filter(value = TestConfiguration.Library.class, type = FilterType.CUSTOM)}, useDefaultFilters = false)
+    public static class TestConfiguration extends SpringUtils.CloudStackTestConfiguration {
+
+        public static class Library implements TypeFilter {
+            @Override
+            public boolean match(MetadataReader mdr, MetadataReaderFactory arg1) throws IOException {
+                mdr.getClassMetadata().getClassName();
+                ComponentScan cs = TestConfiguration.class.getAnnotation(ComponentScan.class);
+                return SpringUtils.includedInBasePackageClasses(mdr.getClassMetadata().getClassName(), cs);
+            }
+        }
+
+        @Bean
+        public VMSnapshotHelper vmSnapshotHelper() {
+            return Mockito.mock(VMSnapshotHelper.class);
+        }
+
+        @Bean
+        public GuestOSDao guestOSDao() {
+            return Mockito.mock(GuestOSDao.class);
+        }
+
+        @Bean
+        public UserVmDao userVmDao() {
+            return Mockito.mock(UserVmDao.class);
+        }
+
+        @Bean
+        public VMSnapshotDao vmSnapshotDao() {
+            return Mockito.mock(VMSnapshotDao.class);
+        }
+
+        @Bean
+        public ConfigurationDao configurationDao() {
+            return Mockito.mock(ConfigurationDao.class);
+        }
+
+        @Bean
+        public AgentManager agentManager() {
+            return Mockito.mock(AgentManager.class);
+        }
+
+        @Bean
+        public VolumeDao volumeDao() {
+            return Mockito.mock(VolumeDao.class);
+        }
+
+        @Bean
+        public DiskOfferingDao diskOfferingDao() {
+            return Mockito.mock(DiskOfferingDao.class);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/a6ce66e5/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java
index c902aef..376baa5 100644
--- a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java
+++ b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java
@@ -18,16 +18,37 @@
  */
 package org.apache.cloudstack.storage.volume;
 
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
-
-import javax.inject.Inject;
-
-import org.apache.log4j.Logger;
-import org.springframework.stereotype.Component;
-
+import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.storage.ListVolumeAnswer;
+import com.cloud.agent.api.storage.ListVolumeCommand;
+import com.cloud.agent.api.to.VirtualMachineTO;
+import com.cloud.alert.AlertManager;
+import com.cloud.configuration.Config;
+import com.cloud.configuration.Resource.ResourceType;
+import com.cloud.event.EventTypes;
+import com.cloud.event.UsageEventUtils;
+import com.cloud.exception.ConcurrentOperationException;
+import com.cloud.exception.ResourceAllocationException;
+import com.cloud.host.Host;
+import com.cloud.storage.DataStoreRole;
+import com.cloud.storage.ScopeType;
+import com.cloud.storage.StoragePool;
+import com.cloud.storage.VMTemplateStoragePoolVO;
+import com.cloud.storage.VMTemplateStorageResourceAssoc;
+import com.cloud.storage.VMTemplateStorageResourceAssoc.Status;
+import com.cloud.storage.Volume;
+import com.cloud.storage.Volume.State;
+import com.cloud.storage.VolumeVO;
+import com.cloud.storage.dao.VMTemplatePoolDao;
+import com.cloud.storage.dao.VolumeDao;
+import com.cloud.storage.snapshot.SnapshotManager;
+import com.cloud.storage.template.TemplateProp;
+import com.cloud.user.AccountManager;
+import com.cloud.user.ResourceLimitService;
+import com.cloud.utils.NumbersUtil;
+import com.cloud.utils.db.DB;
+import com.cloud.utils.db.GlobalLock;
+import com.cloud.utils.exception.CloudRuntimeException;
 import org.apache.cloudstack.engine.cloud.entity.api.VolumeEntity;
 import org.apache.cloudstack.engine.subsystem.api.storage.ChapInfo;
 import org.apache.cloudstack.engine.subsystem.api.storage.CopyCommandResult;
@@ -55,45 +76,19 @@ import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
 import org.apache.cloudstack.storage.command.CommandResult;
 import org.apache.cloudstack.storage.command.CopyCmdAnswer;
 import org.apache.cloudstack.storage.command.DeleteCommand;
-import org.apache.cloudstack.storage.datastore.DataObjectManager;
-import org.apache.cloudstack.storage.datastore.ObjectInDataStoreManager;
 import org.apache.cloudstack.storage.datastore.PrimaryDataStore;
 import org.apache.cloudstack.storage.datastore.PrimaryDataStoreProviderManager;
 import org.apache.cloudstack.storage.datastore.db.VolumeDataStoreDao;
 import org.apache.cloudstack.storage.datastore.db.VolumeDataStoreVO;
 import org.apache.cloudstack.storage.to.VolumeObjectTO;
+import org.apache.log4j.Logger;
+import org.springframework.stereotype.Component;
 
-import com.cloud.agent.api.Answer;
-import com.cloud.agent.api.storage.ListVolumeAnswer;
-import com.cloud.agent.api.storage.ListVolumeCommand;
-import com.cloud.agent.api.to.VirtualMachineTO;
-import com.cloud.alert.AlertManager;
-import com.cloud.configuration.Config;
-import com.cloud.configuration.Resource.ResourceType;
-import com.cloud.event.EventTypes;
-import com.cloud.event.UsageEventUtils;
-import com.cloud.exception.ConcurrentOperationException;
-import com.cloud.exception.ResourceAllocationException;
-import com.cloud.host.Host;
-import com.cloud.storage.DataStoreRole;
-import com.cloud.storage.ScopeType;
-import com.cloud.storage.StoragePool;
-import com.cloud.storage.VMTemplateStoragePoolVO;
-import com.cloud.storage.VMTemplateStorageResourceAssoc;
-import com.cloud.storage.VMTemplateStorageResourceAssoc.Status;
-import com.cloud.storage.Volume;
-import com.cloud.storage.Volume.State;
-import com.cloud.storage.VolumeVO;
-import com.cloud.storage.dao.VMTemplatePoolDao;
-import com.cloud.storage.dao.VolumeDao;
-import com.cloud.storage.snapshot.SnapshotManager;
-import com.cloud.storage.template.TemplateProp;
-import com.cloud.user.AccountManager;
-import com.cloud.user.ResourceLimitService;
-import com.cloud.utils.NumbersUtil;
-import com.cloud.utils.db.DB;
-import com.cloud.utils.db.GlobalLock;
-import com.cloud.utils.exception.CloudRuntimeException;
+import javax.inject.Inject;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
 
 @Component
 public class VolumeServiceImpl implements VolumeService {
@@ -103,10 +98,6 @@ public class VolumeServiceImpl implements VolumeService {
     @Inject
     PrimaryDataStoreProviderManager dataStoreMgr;
     @Inject
-    ObjectInDataStoreManager objectInDataStoreMgr;
-    @Inject
-    DataObjectManager dataObjectMgr;
-    @Inject
     DataMotionService motionSrv;
     @Inject
     VolumeDataFactory volFactory;

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/a6ce66e5/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareStorageManagerImpl.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareStorageManagerImpl.java b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareStorageManagerImpl.java
index e11e766..0e2423e 100644
--- a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareStorageManagerImpl.java
+++ b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareStorageManagerImpl.java
@@ -16,39 +16,6 @@
 // under the License.
 package com.cloud.hypervisor.vmware.manager;
 
-import java.io.BufferedWriter;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.OutputStreamWriter;
-import java.rmi.RemoteException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Properties;
-import java.util.UUID;
-
-import org.apache.log4j.Logger;
-
-import com.vmware.vim25.FileInfo;
-import com.vmware.vim25.FileQueryFlags;
-import com.vmware.vim25.HostDatastoreBrowserSearchResults;
-import com.vmware.vim25.HostDatastoreBrowserSearchSpec;
-import com.vmware.vim25.ManagedObjectReference;
-import com.vmware.vim25.TaskInfo;
-import com.vmware.vim25.VirtualDeviceConfigSpec;
-import com.vmware.vim25.VirtualDeviceConfigSpecOperation;
-import com.vmware.vim25.VirtualDisk;
-import com.vmware.vim25.VirtualLsiLogicController;
-import com.vmware.vim25.VirtualMachineConfigSpec;
-import com.vmware.vim25.VirtualMachineFileInfo;
-import com.vmware.vim25.VirtualMachineGuestOsIdentifier;
-import com.vmware.vim25.VirtualSCSISharing;
-
-import org.apache.cloudstack.storage.to.TemplateObjectTO;
-import org.apache.cloudstack.storage.to.VolumeObjectTO;
-
 import com.cloud.agent.api.Answer;
 import com.cloud.agent.api.BackupSnapshotAnswer;
 import com.cloud.agent.api.BackupSnapshotCommand;
@@ -73,7 +40,6 @@ import com.cloud.agent.api.to.DataStoreTO;
 import com.cloud.agent.api.to.DataTO;
 import com.cloud.agent.api.to.NfsTO;
 import com.cloud.agent.api.to.StorageFilerTO;
-import com.cloud.agent.api.to.VolumeTO;
 import com.cloud.hypervisor.vmware.mo.CustomFieldConstants;
 import com.cloud.hypervisor.vmware.mo.DatacenterMO;
 import com.cloud.hypervisor.vmware.mo.DatastoreMO;
@@ -97,6 +63,29 @@ import com.cloud.utils.exception.CloudRuntimeException;
 import com.cloud.utils.script.Script;
 import com.cloud.vm.VirtualMachine;
 import com.cloud.vm.snapshot.VMSnapshot;
+import com.vmware.vim25.FileInfo;
+import com.vmware.vim25.FileQueryFlags;
+import com.vmware.vim25.HostDatastoreBrowserSearchResults;
+import com.vmware.vim25.HostDatastoreBrowserSearchSpec;
+import com.vmware.vim25.ManagedObjectReference;
+import com.vmware.vim25.TaskInfo;
+import com.vmware.vim25.VirtualDisk;
+import org.apache.cloudstack.storage.to.TemplateObjectTO;
+import org.apache.cloudstack.storage.to.VolumeObjectTO;
+import org.apache.log4j.Logger;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.OutputStreamWriter;
+import java.rmi.RemoteException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+import java.util.UUID;
 
 public class VmwareStorageManagerImpl implements VmwareStorageManager {
     @Override
@@ -1280,7 +1269,7 @@ public class VmwareStorageManagerImpl implements VmwareStorageManager {
 
     @Override
     public CreateVMSnapshotAnswer execute(VmwareHostService hostService, CreateVMSnapshotCommand cmd) {
-        List<VolumeTO> volumeTOs = cmd.getVolumeTOs();
+        List<VolumeObjectTO> volumeTOs = cmd.getVolumeTOs();
         String vmName = cmd.getVmName();
         String vmSnapshotName = cmd.getTarget().getSnapshotName();
         String vmSnapshotDesc = cmd.getTarget().getDescription();
@@ -1330,19 +1319,20 @@ public class VmwareStorageManagerImpl implements VmwareStorageManager {
                         mapNewDisk.put(baseName, vmdkName);
                     }
                 }
-                for (VolumeTO volumeTO : volumeTOs) {
+                for (VolumeObjectTO volumeTO : volumeTOs) {
                     String baseName = extractSnapshotBaseFileName(volumeTO.getPath());
                     String newPath = mapNewDisk.get(baseName);
                     // get volume's chain size for this VM snapshot, exclude current volume vdisk
+                    DataStoreTO store = volumeTO.getDataStore();
                     long size = getVMSnapshotChainSize(context,hyperHost,baseName + "*.vmdk",
-                            volumeTO.getPoolUuid(), newPath);
+                            store.getUuid(), newPath);
 
-                    if(volumeTO.getType()== Volume.Type.ROOT){
+                    if(volumeTO.getVolumeType()== Volume.Type.ROOT){
                         // add memory snapshot size
-                        size = size + getVMSnapshotChainSize(context,hyperHost,cmd.getVmName()+"*.vmsn",volumeTO.getPoolUuid(),null);
+                        size = size + getVMSnapshotChainSize(context,hyperHost,cmd.getVmName()+"*.vmsn",store.getUuid(),null);
                     }
 
-                    volumeTO.setChainSize(size);
+                    volumeTO.setSize(size);
                     volumeTO.setPath(newPath);
                 }
                 return new CreateVMSnapshotAnswer(cmd, cmd.getTarget(), volumeTOs);
@@ -1362,7 +1352,7 @@ public class VmwareStorageManagerImpl implements VmwareStorageManager {
 
     @Override
     public DeleteVMSnapshotAnswer execute(VmwareHostService hostService, DeleteVMSnapshotCommand cmd) {
-        List<VolumeTO> listVolumeTo = cmd.getVolumeTOs();
+        List<VolumeObjectTO> listVolumeTo = cmd.getVolumeTOs();
         VirtualMachineMO vmMo = null;
         VmwareContext context = hostService.getServiceContext(cmd);
         Map<String, String> mapNewDisk = new HashMap<String, String>();
@@ -1403,16 +1393,17 @@ public class VmwareStorageManagerImpl implements VmwareStorageManager {
                         mapNewDisk.put(baseName, vmdkName);
                     }
                 }
-                for (VolumeTO volumeTo : listVolumeTo) {
+                for (VolumeObjectTO volumeTo : listVolumeTo) {
                     String baseName = extractSnapshotBaseFileName(volumeTo.getPath());
                     String newPath = mapNewDisk.get(baseName);
+                    DataStoreTO store = volumeTo.getDataStore();
                     long size = getVMSnapshotChainSize(context,hyperHost,
-                            baseName + "*.vmdk", volumeTo.getPoolUuid(), newPath);
-                    if(volumeTo.getType()== Volume.Type.ROOT){
+                            baseName + "*.vmdk", store.getUuid(), newPath);
+                    if(volumeTo.getVolumeType()== Volume.Type.ROOT){
                         // add memory snapshot size
-                        size = size + getVMSnapshotChainSize(context,hyperHost,cmd.getVmName()+"*.vmsn",volumeTo.getPoolUuid(),null);
+                        size = size + getVMSnapshotChainSize(context,hyperHost,cmd.getVmName()+"*.vmsn",volumeTo.getUuid(),null);
                     }
-                    volumeTo.setChainSize(size);
+                    volumeTo.setSize(size);
                     volumeTo.setPath(newPath);
                 }
                 return new DeleteVMSnapshotAnswer(cmd, listVolumeTo);
@@ -1429,7 +1420,7 @@ public class VmwareStorageManagerImpl implements VmwareStorageManager {
         String snapshotName = cmd.getTarget().getSnapshotName();
         String vmName = cmd.getVmName();
         Boolean snapshotMemory = cmd.getTarget().getType() == VMSnapshot.Type.DiskAndMemory;
-        List<VolumeTO> listVolumeTo = cmd.getVolumeTOs();
+        List<VolumeObjectTO> listVolumeTo = cmd.getVolumeTOs();
         VirtualMachine.State vmState = VirtualMachine.State.Running;
         VirtualMachineMO vmMo = null;
         VmwareContext context = hostService.getServiceContext(cmd);
@@ -1483,7 +1474,7 @@ public class VmwareStorageManagerImpl implements VmwareStorageManager {
                         }
                     }
                     String key = null;
-                    for (VolumeTO volumeTo : listVolumeTo) {
+                    for (VolumeObjectTO volumeTo : listVolumeTo) {
                         String parentUUID = volumeTo.getPath();
                         String[] s = parentUUID.split("-");
                         key = s[0];

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/a6ce66e5/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
index 0ac8b1c..c6a35cc 100644
--- a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
+++ b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
@@ -734,7 +734,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
 
     private Answer execute(RevertToVMSnapshotCommand cmd) {
         String vmName = cmd.getVmName();
-        List<VolumeTO> listVolumeTo = cmd.getVolumeTOs();
+        List<VolumeObjectTO> listVolumeTo = cmd.getVolumeTOs();
         VMSnapshot.Type vmSnapshotType = cmd.getTarget().getType();
         Boolean snapshotMemory = vmSnapshotType == VMSnapshot.Type.DiskAndMemory;
         Connection conn = getConnection();
@@ -786,7 +786,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
             }
 
             // after revert, VM's volumes path have been changed, need to report to manager
-            for (VolumeTO volumeTo : listVolumeTo) {
+            for (VolumeObjectTO volumeTo : listVolumeTo) {
                 Long deviceId = volumeTo.getDeviceId();
                 VDI vdi = vdiMap.get(deviceId.toString());
                 volumeTo.setPath(vdi.getUuid(conn));
@@ -6633,7 +6633,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
 
     }
 
-    private long getVMSnapshotChainSize(Connection conn, VolumeTO volumeTo, String vmName) 
+    private long getVMSnapshotChainSize(Connection conn, VolumeObjectTO volumeTo, String vmName)
             throws BadServerResponse, XenAPIException, XmlRpcException {
         Set<VDI> allvolumeVDIs = VDI.getByNameLabel(conn, volumeTo.getName());
         long size = 0;
@@ -6657,7 +6657,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
                 continue;
             }
         }
-        if (volumeTo.getType() == Volume.Type.ROOT) {
+        if (volumeTo.getVolumeType() == Volume.Type.ROOT) {
             Map<VM, VM.Record> allVMs = VM.getAllRecords(conn);
             // add size of memory snapshot vdi
             if (allVMs.size() > 0) {
@@ -6690,7 +6690,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
     protected Answer execute(final CreateVMSnapshotCommand cmd) {
         String vmName = cmd.getVmName();
         String vmSnapshotName = cmd.getTarget().getSnapshotName();
-        List<VolumeTO> listVolumeTo = cmd.getVolumeTOs();
+        List<VolumeObjectTO> listVolumeTo = cmd.getVolumeTOs();
         VirtualMachine.State vmState = cmd.getVmState();
         String guestOSType = cmd.getGuestOSType();
 
@@ -6770,9 +6770,9 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
 
             }
             // calculate used capacity for this VM snapshot
-            for (VolumeTO volumeTo : cmd.getVolumeTOs()){
+            for (VolumeObjectTO volumeTo : cmd.getVolumeTOs()){
                 long size = getVMSnapshotChainSize(conn,volumeTo,cmd.getVmName());
-                volumeTo.setChainSize(size);
+                volumeTo.setSize(size);
             }
             
             success = true;
@@ -6821,7 +6821,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
     }
 
     private VM createWorkingVM(Connection conn, String vmName,
-            String guestOSType, List<VolumeTO> listVolumeTo)
+            String guestOSType, List<VolumeObjectTO> listVolumeTo)
                     throws BadServerResponse, VmBadPowerState, SrFull,
                     OperationNotAllowed, XenAPIException, XmlRpcException {
         String guestOsTypeName = getGuestOsType(guestOSType, false);
@@ -6835,8 +6835,8 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
         VM template = getVM(conn, guestOsTypeName);
         VM vm = template.createClone(conn, vmName);
         vm.setIsATemplate(conn, false);
-        Map<VDI, VolumeTO> vdiMap = new HashMap<VDI, VolumeTO>();
-        for (VolumeTO volume : listVolumeTo) {
+        Map<VDI, VolumeObjectTO> vdiMap = new HashMap<VDI, VolumeObjectTO>();
+        for (VolumeObjectTO volume : listVolumeTo) {
             String vdiUuid = volume.getPath();
             try {
                 VDI vdi = VDI.getByUuid(conn, vdiUuid);
@@ -6847,11 +6847,11 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
             }
         }
         for (VDI vdi : vdiMap.keySet()) {
-            VolumeTO volumeTO = vdiMap.get(vdi);
+            VolumeObjectTO volumeTO = vdiMap.get(vdi);
             VBD.Record vbdr = new VBD.Record();
             vbdr.VM = vm;
             vbdr.VDI = vdi;
-            if (volumeTO.getType() == Volume.Type.ROOT) {
+            if (volumeTO.getVolumeType() == Volume.Type.ROOT) {
                 vbdr.bootable = true;
                 vbdr.unpluggable = false;
             } else {
@@ -6898,9 +6898,9 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
 
             }
             // re-calculate used capacify for this VM snapshot
-            for (VolumeTO volumeTo : cmd.getVolumeTOs()){
+            for (VolumeObjectTO volumeTo : cmd.getVolumeTOs()){
                 long size = getVMSnapshotChainSize(conn,volumeTo,cmd.getVmName());
-                volumeTo.setChainSize(size);
+                volumeTo.setSize(size);
             }
             
             return new DeleteVMSnapshotAnswer(cmd, cmd.getVolumeTOs());

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/a6ce66e5/server/src/com/cloud/storage/snapshot/SnapshotManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/storage/snapshot/SnapshotManagerImpl.java b/server/src/com/cloud/storage/snapshot/SnapshotManagerImpl.java
index dade983..9de0031 100755
--- a/server/src/com/cloud/storage/snapshot/SnapshotManagerImpl.java
+++ b/server/src/com/cloud/storage/snapshot/SnapshotManagerImpl.java
@@ -342,8 +342,6 @@ public class SnapshotManagerImpl extends ManagerBase implements SnapshotManager,
         return snapshot;
     }
 
-
-
     @Override
     public Snapshot backupSnapshot(Long snapshotId) {
         SnapshotInfo snapshot = snapshotFactory.getSnapshot(snapshotId, DataStoreRole.Image);
@@ -354,97 +352,6 @@ public class SnapshotManagerImpl extends ManagerBase implements SnapshotManager,
         return snapshotSrv.backupSnapshot(snapshot);
     }
 
-    /*
-    @Override
-    public void downloadSnapshotsFromSwift(SnapshotVO ss) {
-
-        long volumeId = ss.getVolumeId();
-        VolumeVO volume = _volsDao.findById(volumeId);
-        Long dcId = volume.getDataCenterId();
-        Long accountId = volume.getAccountId();
-        DataStore secStore = this.dataStoreMgr.getImageStore(dcId);
-
-        Long swiftId = ss.getSwiftId();
-        SwiftTO swift = _swiftMgr.getSwiftTO(swiftId);
-        SnapshotVO tss = ss;
-        List<String> BackupUuids = new ArrayList<String>(30);
-        while (true) {
-            BackupUuids.add(0, tss.getBackupSnapshotId());
-            if (tss.getPrevSnapshotId() == 0)
-                break;
-            Long id = tss.getPrevSnapshotId();
-            tss = _snapshotDao.findById(id);
-            assert tss != null : " can not find snapshot " + id;
-        }
-        String parent = null;
-        try {
-            for (String backupUuid : BackupUuids) {
-<<<<<<< HEAD
-                downloadSnapshotFromSwiftCommand cmd = new downloadSnapshotFromSwiftCommand(swift, secStore.getUri(), dcId, accountId, volumeId, parent, backupUuid, _backupsnapshotwait);
-=======
-                 DownloadSnapshotFromSwiftCommand cmd = new DownloadSnapshotFromSwiftCommand(swift, secondaryStoragePoolUrl, dcId, accountId, volumeId, parent, backupUuid, _backupsnapshotwait);
->>>>>>> master
-                Answer answer = _agentMgr.sendToSSVM(dcId, cmd);
-                if ((answer == null) || !answer.getResult()) {
-                    throw new CloudRuntimeException("downloadSnapshotsFromSwift failed ");
-                }
-                parent = backupUuid;
-            }
-        } catch (Exception e) {
-            throw new CloudRuntimeException("downloadSnapshotsFromSwift failed due to " + e.toString());
-        }
-
-    }
-
-    private List<String> determineBackupUuids(final SnapshotVO snapshot) {
-
-        final List<String> backupUuids = new ArrayList<String>();
-        backupUuids.add(0, snapshot.getBackupSnapshotId());
-
-        SnapshotVO tempSnapshot = snapshot;
-        while (tempSnapshot.getPrevSnapshotId() != 0) {
-            tempSnapshot = _snapshotDao.findById(tempSnapshot
-                    .getPrevSnapshotId());
-            backupUuids.add(0, tempSnapshot.getBackupSnapshotId());
-        }
-
-        return Collections.unmodifiableList(backupUuids);
-    }
-
-    @Override
-    public void downloadSnapshotsFromS3(final SnapshotVO snapshot) {
-
-        final VolumeVO volume = _volsDao.findById(snapshot.getVolumeId());
-        final Long zoneId = volume.getDataCenterId();
-        final DataStore secStore = this.dataStoreMgr.getImageStore(zoneId);
-
-        final S3TO s3 = _s3Mgr.getS3TO(snapshot.getS3Id());
-        final List<String> backupUuids = determineBackupUuids(snapshot);
-
-        try {
-            String parent = null;
-            for (final String backupUuid : backupUuids) {
-                final DownloadSnapshotFromS3Command cmd = new DownloadSnapshotFromS3Command(
-                        s3, parent, secStore.getUri(), zoneId,
-                        volume.getAccountId(), volume.getId(), backupUuid,
-                        _backupsnapshotwait);
-                final Answer answer = _agentMgr.sendToSSVM(zoneId, cmd);
-                if ((answer == null) || !answer.getResult()) {
-                    throw new CloudRuntimeException(String.format(
-                            "S3 snapshot download failed due to %1$s.",
-                            answer != null ? answer.getDetails()
-                                    : "unspecified error"));
-                }
-                parent = backupUuid;
-            }
-        } catch (Exception e) {
-            throw new CloudRuntimeException(
-                    "Snapshot download from S3 failed due to " + e.toString(),
-                    e);
-        }
-
-    }*/
-
     @Override
     public SnapshotVO getParentSnapshot(VolumeInfo volume) {
         long preId = _snapshotDao.getLastSnapshot(volume.getId(), DataStoreRole.Primary);
@@ -546,7 +453,6 @@ public class SnapshotManagerImpl extends ManagerBase implements SnapshotManager,
         }
     }
 
-
     @Override
     public String getSecondaryStorageURL(SnapshotVO snapshot) {
         SnapshotDataStoreVO snapshotStore = _snapshotStoreDao.findBySnapshot(snapshot.getId(), DataStoreRole.Image);
@@ -672,7 +578,6 @@ public class SnapshotManagerImpl extends ManagerBase implements SnapshotManager,
         return new Pair<List<? extends Snapshot>, Integer>(result.first(), result.second());
     }
 
-
     @Override
     public boolean deleteSnapshotDirsForAccount(long accountId) {
 
@@ -942,8 +847,6 @@ public class SnapshotManagerImpl extends ManagerBase implements SnapshotManager,
         return null;
     }
 
-
-
     private boolean hostSupportSnapsthotForVolume(HostVO host, VolumeInfo volume) {
         if (host.getHypervisorType() != HypervisorType.KVM) {
             return true;

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/a6ce66e5/server/src/com/cloud/vm/snapshot/VMSnapshotManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/vm/snapshot/VMSnapshotManagerImpl.java b/server/src/com/cloud/vm/snapshot/VMSnapshotManagerImpl.java
index aa772fe..7a200ff 100644
--- a/server/src/com/cloud/vm/snapshot/VMSnapshotManagerImpl.java
+++ b/server/src/com/cloud/vm/snapshot/VMSnapshotManagerImpl.java
@@ -17,82 +17,34 @@
 
 package com.cloud.vm.snapshot;
 
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import javax.ejb.Local;
-import javax.inject.Inject;
-import javax.naming.ConfigurationException;
-
-import org.apache.log4j.Logger;
-import org.springframework.stereotype.Component;
-
-import org.apache.cloudstack.api.command.user.vmsnapshot.ListVMSnapshotCmd;
-import org.apache.cloudstack.context.CallContext;
-import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
-import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
-import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
-import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
-
-import com.cloud.agent.AgentManager;
-import com.cloud.agent.api.Answer;
-import com.cloud.agent.api.Command;
-import com.cloud.agent.api.CreateVMSnapshotAnswer;
-import com.cloud.agent.api.CreateVMSnapshotCommand;
-import com.cloud.agent.api.DeleteVMSnapshotAnswer;
-import com.cloud.agent.api.DeleteVMSnapshotCommand;
-import com.cloud.agent.api.RevertToVMSnapshotAnswer;
-import com.cloud.agent.api.RevertToVMSnapshotCommand;
-import com.cloud.agent.api.VMSnapshotTO;
-import com.cloud.agent.api.to.VolumeTO;
 import com.cloud.event.ActionEvent;
 import com.cloud.event.EventTypes;
-import com.cloud.event.UsageEventUtils;
-import com.cloud.exception.AgentUnavailableException;
 import com.cloud.exception.ConcurrentOperationException;
 import com.cloud.exception.InsufficientCapacityException;
 import com.cloud.exception.InvalidParameterValueException;
-import com.cloud.exception.OperationTimedoutException;
 import com.cloud.exception.ResourceAllocationException;
 import com.cloud.exception.ResourceUnavailableException;
-import com.cloud.host.Host;
-import com.cloud.host.HostVO;
-import com.cloud.host.dao.HostDao;
 import com.cloud.hypervisor.Hypervisor.HypervisorType;
-import com.cloud.hypervisor.HypervisorGuruManager;
 import com.cloud.hypervisor.dao.HypervisorCapabilitiesDao;
 import com.cloud.projects.Project.ListProjectResourcesCriteria;
-import com.cloud.service.dao.ServiceOfferingDao;
-import com.cloud.storage.DiskOfferingVO;
-import com.cloud.storage.GuestOSVO;
 import com.cloud.storage.Snapshot;
 import com.cloud.storage.SnapshotVO;
-import com.cloud.storage.StoragePool;
 import com.cloud.storage.VolumeVO;
-import com.cloud.storage.dao.DiskOfferingDao;
 import com.cloud.storage.dao.GuestOSDao;
 import com.cloud.storage.dao.SnapshotDao;
 import com.cloud.storage.dao.VolumeDao;
 import com.cloud.user.Account;
 import com.cloud.user.AccountManager;
 import com.cloud.user.dao.AccountDao;
-import com.cloud.user.dao.UserDao;
 import com.cloud.uservm.UserVm;
 import com.cloud.utils.DateUtil;
 import com.cloud.utils.NumbersUtil;
 import com.cloud.utils.Ternary;
 import com.cloud.utils.component.ManagerBase;
-import com.cloud.utils.db.DB;
 import com.cloud.utils.db.Filter;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
 import com.cloud.utils.exception.CloudRuntimeException;
-import com.cloud.utils.fsm.NoTransitionException;
-import com.cloud.utils.fsm.StateMachine2;
 import com.cloud.vm.UserVmVO;
 import com.cloud.vm.VMInstanceVO;
 import com.cloud.vm.VirtualMachine;
@@ -100,8 +52,22 @@ import com.cloud.vm.VirtualMachine.State;
 import com.cloud.vm.VirtualMachineManager;
 import com.cloud.vm.VirtualMachineProfile;
 import com.cloud.vm.dao.UserVmDao;
-import com.cloud.vm.dao.VMInstanceDao;
 import com.cloud.vm.snapshot.dao.VMSnapshotDao;
+import org.apache.cloudstack.api.command.user.vmsnapshot.ListVMSnapshotCmd;
+import org.apache.cloudstack.context.CallContext;
+import org.apache.cloudstack.engine.subsystem.api.storage.VMSnapshotStrategy;
+import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
+import org.apache.log4j.Logger;
+import org.springframework.stereotype.Component;
+
+import javax.ejb.Local;
+import javax.inject.Inject;
+import javax.naming.ConfigurationException;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 
 @Component
 @Local(value = { VMSnapshotManager.class, VMSnapshotService.class })
@@ -111,25 +77,27 @@ public class VMSnapshotManagerImpl extends ManagerBase implements VMSnapshotMana
     @Inject VMSnapshotDao _vmSnapshotDao;
     @Inject VolumeDao _volumeDao;
     @Inject AccountDao _accountDao;
-    @Inject VMInstanceDao _vmInstanceDao;
     @Inject UserVmDao _userVMDao;
-    @Inject HostDao _hostDao;
-    @Inject UserDao _userDao;
-    @Inject AgentManager _agentMgr;
-    @Inject HypervisorGuruManager _hvGuruMgr;
     @Inject AccountManager _accountMgr;
     @Inject GuestOSDao _guestOSDao;
-    @Inject PrimaryDataStoreDao _storagePoolDao;
     @Inject SnapshotDao _snapshotDao;
     @Inject VirtualMachineManager _itMgr;
-    @Inject DataStoreManager dataStoreMgr;
     @Inject ConfigurationDao _configDao;
     @Inject HypervisorCapabilitiesDao _hypervisorCapabilitiesDao;
-    @Inject DiskOfferingDao _diskOfferingDao;
-    @Inject ServiceOfferingDao _serviceOfferingDao;
+    @Inject List<VMSnapshotStrategy> vmSnapshotStrategies;
+
+    public List<VMSnapshotStrategy> getVmSnapshotStrategies() {
+        return vmSnapshotStrategies;
+    }
+
+    @Inject
+    public void setVmSnapshotStrategies(List<VMSnapshotStrategy> vmSnapshotStrategies) {
+        this.vmSnapshotStrategies = vmSnapshotStrategies;
+    }
+
     int _vmSnapshotMax;
     int _wait;
-    StateMachine2<VMSnapshot.State, VMSnapshot.Event, VMSnapshot> _vmSnapshottateMachine ;
+
 
     @Override
     public boolean configure(String name, Map<String, Object> params) throws ConfigurationException {
@@ -144,7 +112,6 @@ public class VMSnapshotManagerImpl extends ManagerBase implements VMSnapshotMana
         String value = _configDao.getValue("vmsnapshot.create.wait");
         _wait = NumbersUtil.parseInt(value, 1800);
 
-        _vmSnapshottateMachine   = VMSnapshot.State.getStateMachine();
         return true;
     }
 
@@ -336,6 +303,22 @@ public class VMSnapshotManagerImpl extends ManagerBase implements VMSnapshotMana
         return _name;
     }
 
+    private VMSnapshotStrategy findVMSnapshotStrategy(VMSnapshot vmSnapshot) {
+        VMSnapshotStrategy snapshotStrategy = null;
+        for(VMSnapshotStrategy strategy : vmSnapshotStrategies) {
+            if (strategy.canHandle(vmSnapshot)) {
+                snapshotStrategy = strategy;
+                break;
+            }
+        }
+
+        if (snapshotStrategy == null) {
+            throw new CloudRuntimeException("can't find vm snapshot strategy for vmsnapshot: " + vmSnapshot.getId());
+        }
+
+        return snapshotStrategy;
+    }
+
     @Override
     @ActionEvent(eventType = EventTypes.EVENT_VM_SNAPSHOT_CREATE, eventDescription = "creating VM snapshot", async = true)
     public VMSnapshot creatVMSnapshot(Long vmId, Long vmSnapshotId) {
@@ -347,241 +330,21 @@ public class VMSnapshotManagerImpl extends ManagerBase implements VMSnapshotMana
         if(vmSnapshot == null){
             throw new CloudRuntimeException("VM snapshot id: " + vmSnapshotId + " can not be found");
         }
-        Long hostId = pickRunningHost(vmId);
-        try {
-            vmSnapshotStateTransitTo(vmSnapshot, VMSnapshot.Event.CreateRequested);
-        } catch (NoTransitionException e) {
-            throw new CloudRuntimeException(e.getMessage());
-        }
-        return createVmSnapshotInternal(userVm, vmSnapshot, hostId);
-    }
-
-    protected VMSnapshot createVmSnapshotInternal(UserVmVO userVm, VMSnapshotVO vmSnapshot, Long hostId) {
-        CreateVMSnapshotAnswer answer = null;
-        try {
-            GuestOSVO guestOS = _guestOSDao.findById(userVm.getGuestOSId());
-            
-            // prepare snapshotVolumeTos
-            List<VolumeTO> volumeTOs = getVolumeTOList(userVm.getId());
-            
-            // prepare target snapshotTO and its parent snapshot (current snapshot)
-            VMSnapshotTO current = null;
-            VMSnapshotVO currentSnapshot = _vmSnapshotDao.findCurrentSnapshotByVmId(userVm.getId());
-            if (currentSnapshot != null)
-                current = getSnapshotWithParents(currentSnapshot);
-            VMSnapshotTO target = new VMSnapshotTO(vmSnapshot.getId(),  vmSnapshot.getName(), vmSnapshot.getType(), null, vmSnapshot.getDescription(), false,
-                    current);
-            if (current == null)
-                vmSnapshot.setParent(null);
-            else
-                vmSnapshot.setParent(current.getId());
-
-            CreateVMSnapshotCommand ccmd = new CreateVMSnapshotCommand(userVm.getInstanceName(),target ,volumeTOs, guestOS.getDisplayName(),userVm.getState());
-            ccmd.setWait(_wait);
-            
-            answer = (CreateVMSnapshotAnswer) sendToPool(hostId, ccmd);
-            if (answer != null && answer.getResult()) {
-                processAnswer(vmSnapshot, userVm, answer, hostId);
-                s_logger.debug("Create vm snapshot " + vmSnapshot.getName() + " succeeded for vm: " + userVm.getInstanceName());
-            }else{
-                
-                String errMsg = "Creating VM snapshot: " + vmSnapshot.getName() + " failed";
-                if(answer != null && answer.getDetails() != null)
-                    errMsg = errMsg + " due to " + answer.getDetails();
-                s_logger.error(errMsg);
-                vmSnapshotStateTransitTo(vmSnapshot, VMSnapshot.Event.OperationFailed);
-                throw new CloudRuntimeException(errMsg);
-            }
-            return vmSnapshot;
-        } catch (Exception e) {
-            if(e instanceof AgentUnavailableException){
-                try {
-                    vmSnapshotStateTransitTo(vmSnapshot, VMSnapshot.Event.OperationFailed);
-                } catch (NoTransitionException e1) {
-                    s_logger.error("Cannot set vm snapshot state due to: " + e1.getMessage());
-                }
-            }
-            String msg = e.getMessage();
-            s_logger.error("Create vm snapshot " + vmSnapshot.getName() + " failed for vm: " + userVm.getInstanceName() + " due to " + msg);
-            throw new CloudRuntimeException(msg);
-        } finally{
-            if(vmSnapshot.getState() == VMSnapshot.State.Allocated){
-                s_logger.warn("Create vm snapshot " + vmSnapshot.getName() + " failed for vm: " + userVm.getInstanceName());
-                _vmSnapshotDao.remove(vmSnapshot.getId());
-            }
-            if(vmSnapshot.getState() == VMSnapshot.State.Ready && answer != null){
-                for (VolumeTO volumeTo : answer.getVolumeTOs()){
-                    publishUsageEvent(EventTypes.EVENT_VM_SNAPSHOT_CREATE,vmSnapshot,userVm,volumeTo);
-                }
-            }
-        }
-    }
-
-    private void publishUsageEvent(String type, VMSnapshot vmSnapshot, UserVm userVm, VolumeTO volumeTo){
-        VolumeVO volume = _volumeDao.findById(volumeTo.getId());
-        Long diskOfferingId = volume.getDiskOfferingId();
-        Long offeringId = null;
-        if (diskOfferingId != null) {
-            DiskOfferingVO offering = _diskOfferingDao.findById(diskOfferingId);
-            if (offering != null
-                    && (offering.getType() == DiskOfferingVO.Type.Disk)) {
-                offeringId = offering.getId();
-            }
-        }
-        UsageEventUtils.publishUsageEvent(
-                type,
-                vmSnapshot.getAccountId(),
-                userVm.getDataCenterId(),
-                userVm.getId(),
-                vmSnapshot.getName(),
-                offeringId,     
-                volume.getId(), // save volume's id into templateId field
-                volumeTo.getChainSize(),
-                VMSnapshot.class.getName(), vmSnapshot.getUuid());       
-    }
-    
-    protected List<VolumeTO> getVolumeTOList(Long vmId) {
-        List<VolumeTO> volumeTOs = new ArrayList<VolumeTO>();
-        List<VolumeVO> volumeVos = _volumeDao.findByInstance(vmId);
-        
-        for (VolumeVO volume : volumeVos) {
-            StoragePool pool = (StoragePool)dataStoreMgr.getPrimaryDataStore(volume.getPoolId());
-            VolumeTO volumeTO = new VolumeTO(volume, pool);
-            volumeTOs.add(volumeTO);
-        }
-        return volumeTOs;
-    }
-
-    // get snapshot and its parents recursively
-    private VMSnapshotTO getSnapshotWithParents(VMSnapshotVO snapshot) {
-        Map<Long, VMSnapshotVO> snapshotMap = new HashMap<Long, VMSnapshotVO>();
-        List<VMSnapshotVO> allSnapshots = _vmSnapshotDao.findByVm(snapshot.getVmId());
-        for (VMSnapshotVO vmSnapshotVO : allSnapshots) {
-            snapshotMap.put(vmSnapshotVO.getId(), vmSnapshotVO);
-        }
-
-        VMSnapshotTO currentTO = convert2VMSnapshotTO(snapshot);
-        VMSnapshotTO result = currentTO;
-        VMSnapshotVO current = snapshot;
-        while (current.getParent() != null) {
-            VMSnapshotVO parent = snapshotMap.get(current.getParent());
-            currentTO.setParent(convert2VMSnapshotTO(parent));
-            current = snapshotMap.get(current.getParent());
-            currentTO = currentTO.getParent();
-        }
-        return result;
-    }
 
-    private VMSnapshotTO convert2VMSnapshotTO(VMSnapshotVO vo) {
-        return new VMSnapshotTO(vo.getId(), vo.getName(),  vo.getType(), vo.getCreated().getTime(), vo.getDescription(),
-                vo.getCurrent(), null);
-    }
-
-    protected boolean vmSnapshotStateTransitTo(VMSnapshotVO vsnp, VMSnapshot.Event event) throws NoTransitionException {
-        return _vmSnapshottateMachine.transitTo(vsnp, event, null, _vmSnapshotDao);
-    }
-    
-    @DB
-    protected void processAnswer(VMSnapshotVO vmSnapshot, UserVmVO  userVm, Answer as, Long hostId) {
-        final Transaction txn = Transaction.currentTxn();
         try {
-            txn.start();
-            if (as instanceof CreateVMSnapshotAnswer) {
-                CreateVMSnapshotAnswer answer = (CreateVMSnapshotAnswer) as;
-                finalizeCreate(vmSnapshot, answer.getVolumeTOs());
-                vmSnapshotStateTransitTo(vmSnapshot, VMSnapshot.Event.OperationSucceeded);
-            } else if (as instanceof RevertToVMSnapshotAnswer) {
-                RevertToVMSnapshotAnswer answer = (RevertToVMSnapshotAnswer) as;
-                finalizeRevert(vmSnapshot, answer.getVolumeTOs());
-                vmSnapshotStateTransitTo(vmSnapshot, VMSnapshot.Event.OperationSucceeded);
-            } else if (as instanceof DeleteVMSnapshotAnswer) {
-                DeleteVMSnapshotAnswer answer = (DeleteVMSnapshotAnswer) as;
-                finalizeDelete(vmSnapshot, answer.getVolumeTOs());
-                _vmSnapshotDao.remove(vmSnapshot.getId());
-            }
-            txn.commit();
+            VMSnapshotStrategy strategy = findVMSnapshotStrategy(vmSnapshot);
+            VMSnapshot snapshot = strategy.takeVMSnapshot(vmSnapshot);
+            return snapshot;
         } catch (Exception e) {
-            String errMsg = "Error while process answer: " + as.getClass() + " due to " + e.getMessage();
-            s_logger.error(errMsg, e);
-            txn.rollback();
-            throw new CloudRuntimeException(errMsg);
-        } finally {
-            txn.close();
-        }
-    }
-
-    protected void finalizeDelete(VMSnapshotVO vmSnapshot, List<VolumeTO> VolumeTOs) {
-        // update volumes path
-        updateVolumePath(VolumeTOs);
-        
-        // update children's parent snapshots
-        List<VMSnapshotVO> children= _vmSnapshotDao.listByParent(vmSnapshot.getId());
-        for (VMSnapshotVO child : children) {
-            child.setParent(vmSnapshot.getParent());
-            _vmSnapshotDao.persist(child);
+            s_logger.debug("Failed to create vm snapshot: " + vmSnapshotId ,e);
+            return null;
         }
-        
-        // update current snapshot
-        VMSnapshotVO current = _vmSnapshotDao.findCurrentSnapshotByVmId(vmSnapshot.getVmId());
-        if(current != null && current.getId() == vmSnapshot.getId() && vmSnapshot.getParent() != null){
-            VMSnapshotVO parent = _vmSnapshotDao.findById(vmSnapshot.getParent());
-            parent.setCurrent(true);
-            _vmSnapshotDao.persist(parent);
-        }
-        vmSnapshot.setCurrent(false);
-        _vmSnapshotDao.persist(vmSnapshot);
-    }
-
-    protected void finalizeCreate(VMSnapshotVO vmSnapshot, List<VolumeTO> VolumeTOs) {
-        // update volumes path
-        updateVolumePath(VolumeTOs);
-        
-        vmSnapshot.setCurrent(true);
-        
-        // change current snapshot
-        if (vmSnapshot.getParent() != null) {
-            VMSnapshotVO previousCurrent = _vmSnapshotDao.findById(vmSnapshot.getParent());
-            previousCurrent.setCurrent(false);
-            _vmSnapshotDao.persist(previousCurrent);
-        }
-        _vmSnapshotDao.persist(vmSnapshot);
-    }
-
-    protected void finalizeRevert(VMSnapshotVO vmSnapshot, List<VolumeTO> volumeToList) {
-        // update volumes path
-        updateVolumePath(volumeToList);
-
-        // update current snapshot, current snapshot is the one reverted to
-        VMSnapshotVO previousCurrent = _vmSnapshotDao.findCurrentSnapshotByVmId(vmSnapshot.getVmId());
-        if(previousCurrent != null){
-            previousCurrent.setCurrent(false);
-            _vmSnapshotDao.persist(previousCurrent);
-        }
-        vmSnapshot.setCurrent(true);
-        _vmSnapshotDao.persist(vmSnapshot);
     }
 
-    private void updateVolumePath(List<VolumeTO> volumeTOs) {
-        for (VolumeTO volume : volumeTOs) {
-            if (volume.getPath() != null) {
-                VolumeVO volumeVO = _volumeDao.findById(volume.getId());
-                volumeVO.setPath(volume.getPath());
-                volumeVO.setVmSnapshotChainSize(volume.getChainSize());
-                _volumeDao.persist(volumeVO);
-            }
-        }
-    }
-    
     public VMSnapshotManagerImpl() {
         
     }
-    
-    protected Answer sendToPool(Long hostId, Command cmd) throws AgentUnavailableException, OperationTimedoutException {
-        long targetHostId = _hvGuruMgr.getGuruProcessedCommandTargetHost(hostId, cmd);
-        Answer answer = _agentMgr.send(targetHostId, cmd);
-        return answer;
-    }
-    
+
     @Override
     public boolean hasActiveVMSnapshotTasks(Long vmId){
         List<VMSnapshotVO> activeVMSnapshots = _vmSnapshotDao.listByInstanceId(vmId,
@@ -617,50 +380,14 @@ public class VMSnapshotManagerImpl extends ManagerBase implements VMSnapshotMana
 
         if(vmSnapshot.getState() == VMSnapshot.State.Allocated){
             return _vmSnapshotDao.remove(vmSnapshot.getId());
-        }else{
-            return deleteSnapshotInternal(vmSnapshot);
-        }
-    }
-
-    @DB
-    protected boolean deleteSnapshotInternal(VMSnapshotVO vmSnapshot) {
-        UserVmVO userVm = _userVMDao.findById(vmSnapshot.getVmId());
-        DeleteVMSnapshotAnswer answer = null;
-        try {
-            vmSnapshotStateTransitTo(vmSnapshot,VMSnapshot.Event.ExpungeRequested);
-            Long hostId = pickRunningHost(vmSnapshot.getVmId());
-
-            // prepare snapshotVolumeTos
-            List<VolumeTO> volumeTOs = getVolumeTOList(vmSnapshot.getVmId());
-            
-            // prepare DeleteVMSnapshotCommand
-            String vmInstanceName = userVm.getInstanceName();
-            VMSnapshotTO parent = getSnapshotWithParents(vmSnapshot).getParent();
-            VMSnapshotTO vmSnapshotTO = new VMSnapshotTO(vmSnapshot.getId(), vmSnapshot.getName(), vmSnapshot.getType(),
-                    vmSnapshot.getCreated().getTime(), vmSnapshot.getDescription(), vmSnapshot.getCurrent(), parent);
-            GuestOSVO guestOS = _guestOSDao.findById(userVm.getGuestOSId());
-            DeleteVMSnapshotCommand deleteSnapshotCommand = new DeleteVMSnapshotCommand(vmInstanceName, vmSnapshotTO, volumeTOs,guestOS.getDisplayName());
-            
-            answer = (DeleteVMSnapshotAnswer) sendToPool(hostId, deleteSnapshotCommand);
-           
-            if (answer != null && answer.getResult()) {
-                processAnswer(vmSnapshot, userVm, answer, hostId);
-                s_logger.debug("Delete VM snapshot " + vmSnapshot.getName() + " succeeded for vm: " + userVm.getInstanceName());
-                return true;
-            } else {
-                s_logger.error("Delete vm snapshot " + vmSnapshot.getName() + " of vm " + userVm.getInstanceName() + " failed due to " + answer.getDetails());
+        } else{
+            try {
+                VMSnapshotStrategy strategy = findVMSnapshotStrategy(vmSnapshot);
+                return strategy.deleteVMSnapshot(vmSnapshot);
+            } catch (Exception e) {
+                s_logger.debug("Failed to delete vm snapshot: " + vmSnapshotId, e);
                 return false;
             }
-        } catch (Exception e) {
-            String msg = "Delete vm snapshot " + vmSnapshot.getName() + " of vm " + userVm.getInstanceName() + " failed due to " + e.getMessage();
-            s_logger.error(msg , e);
-            throw new CloudRuntimeException(e.getMessage());
-        } finally{
-            if(answer != null && answer.getResult()){
-                for (VolumeTO volumeTo : answer.getVolumeTOs()){
-                    publishUsageEvent(EventTypes.EVENT_VM_SNAPSHOT_DELETE,vmSnapshot,userVm,volumeTo);
-                }
-            }
         }
     }
 
@@ -726,108 +453,29 @@ public class VMSnapshotManagerImpl extends ManagerBase implements VMSnapshotMana
                     throw new CloudRuntimeException(e.getMessage());
                 }
             }
-            hostId = pickRunningHost(userVm.getId());
         }
-        
-        if(hostId == null)
-            throw new CloudRuntimeException("Can not find any host to revert snapshot " + vmSnapshotVo.getName());
-        
+
         // check if there are other active VM snapshot tasks
         if (hasActiveVMSnapshotTasks(userVm.getId())) {
             throw new InvalidParameterValueException("There is other active vm snapshot tasks on the instance, please try again later");
         }
-        
-        userVm = _userVMDao.findById(userVm.getId());
-        try {
-            vmSnapshotStateTransitTo(vmSnapshotVo, VMSnapshot.Event.RevertRequested);
-        } catch (NoTransitionException e) {
-            throw new CloudRuntimeException(e.getMessage());
-        }
-        return revertInternal(userVm, vmSnapshotVo, hostId);
-    }
 
-    private UserVm revertInternal(UserVmVO userVm, VMSnapshotVO vmSnapshotVo, Long hostId) {
         try {
-            VMSnapshotVO snapshot = _vmSnapshotDao.findById(vmSnapshotVo.getId());
-            // prepare RevertToSnapshotCommand
-            List<VolumeTO> volumeTOs = getVolumeTOList(userVm.getId());
-            String vmInstanceName = userVm.getInstanceName();
-            VMSnapshotTO parent = getSnapshotWithParents(snapshot).getParent();
-            VMSnapshotTO vmSnapshotTO = new VMSnapshotTO(snapshot.getId(), snapshot.getName(), snapshot.getType(), 
-                    snapshot.getCreated().getTime(), snapshot.getDescription(), snapshot.getCurrent(), parent);
-            
-            GuestOSVO guestOS = _guestOSDao.findById(userVm.getGuestOSId());
-            RevertToVMSnapshotCommand revertToSnapshotCommand = new RevertToVMSnapshotCommand(vmInstanceName, vmSnapshotTO, volumeTOs, guestOS.getDisplayName());
-           
-            RevertToVMSnapshotAnswer answer = (RevertToVMSnapshotAnswer) sendToPool(hostId, revertToSnapshotCommand);
-            if (answer != null && answer.getResult()) {
-                processAnswer(vmSnapshotVo, userVm, answer, hostId);
-                s_logger.debug("RevertTo " + vmSnapshotVo.getName() + " succeeded for vm: " + userVm.getInstanceName());
-            } else {
-                String errMsg = "Revert VM: " + userVm.getInstanceName() + " to snapshot: "+ vmSnapshotVo.getName() + " failed";
-                if(answer != null && answer.getDetails() != null)
-                    errMsg = errMsg + " due to " + answer.getDetails();
-                s_logger.error(errMsg);
-                // agent report revert operation fails
-                vmSnapshotStateTransitTo(vmSnapshotVo, VMSnapshot.Event.OperationFailed);
-                throw new CloudRuntimeException(errMsg);
-            }
+            VMSnapshotStrategy strategy = findVMSnapshotStrategy(vmSnapshotVo);
+            strategy.revertVMSnapshot(vmSnapshotVo);
+            return userVm;
         } catch (Exception e) {
-            if(e instanceof AgentUnavailableException){
-                try {
-                    vmSnapshotStateTransitTo(vmSnapshotVo, VMSnapshot.Event.OperationFailed);
-                } catch (NoTransitionException e1) {
-                    s_logger.error("Cannot set vm snapshot state due to: " + e1.getMessage());
-                }
-            }
-            // for other exceptions, do not change VM snapshot state, leave it for snapshotSync
-            String errMsg = "revert vm: " + userVm.getInstanceName() + " to snapshot " + vmSnapshotVo.getName() + " failed due to " + e.getMessage();
-            s_logger.error(errMsg);
-            throw new CloudRuntimeException(e.getMessage());
+            s_logger.debug("Failed to revert vmsnapshot: " + vmSnapshotId, e);
+            return null;
         }
-        return userVm;
     }
 
-
     @Override
     public VMSnapshot getVMSnapshotById(Long id) {
         VMSnapshotVO vmSnapshot = _vmSnapshotDao.findById(id);
         return vmSnapshot;
     }
 
-    protected Long pickRunningHost(Long vmId) {
-        UserVmVO vm = _userVMDao.findById(vmId);
-        // use VM's host if VM is running
-        if(vm.getState() == State.Running)
-            return vm.getHostId();
-        
-        // check if lastHostId is available
-        if(vm.getLastHostId() != null){
-           HostVO lastHost =  _hostDao.findById(vm.getLastHostId());
-           if(lastHost.getStatus() == com.cloud.host.Status.Up && !lastHost.isInMaintenanceStates())
-               return lastHost.getId();
-        }
-        
-        List<VolumeVO> listVolumes = _volumeDao.findByInstance(vmId);
-        if (listVolumes == null || listVolumes.size() == 0) {
-            throw new InvalidParameterValueException("vmInstance has no volumes");
-        }
-        VolumeVO volume = listVolumes.get(0);
-        Long poolId = volume.getPoolId();
-        if (poolId == null) {
-            throw new InvalidParameterValueException("pool id is not found");
-        }
-        StoragePoolVO storagePool = _storagePoolDao.findById(poolId);
-        if (storagePool == null) {
-            throw new InvalidParameterValueException("storage pool is not found");
-        }
-        List<HostVO> listHost = _hostDao.listAllUpAndEnabledNonHAHosts(Host.Type.Routing, storagePool.getClusterId(), storagePool.getPodId(),
-                storagePool.getDataCenterId(), null);
-        if (listHost == null || listHost.size() == 0) {
-            throw new InvalidParameterValueException("no host in up state is found");
-        }
-        return listHost.get(0).getId();
-    }
 
     @Override
     public VirtualMachine getVMBySnapshotId(Long id) {
@@ -851,7 +499,8 @@ public class VMSnapshotManagerImpl extends ManagerBase implements VMSnapshotMana
             VMSnapshotVO target = _vmSnapshotDao.findById(snapshot.getId());
             if(type != null && target.getType() != type)
                 continue;
-            if (!deleteSnapshotInternal(target)) {
+            VMSnapshotStrategy strategy = findVMSnapshotStrategy(target);
+            if (!strategy.deleteVMSnapshot(target)) {
                 result = false;
                 break;
             }
@@ -869,12 +518,13 @@ public class VMSnapshotManagerImpl extends ManagerBase implements VMSnapshotMana
             
             List<VMSnapshotVO> vmSnapshotsInExpungingStates = _vmSnapshotDao.listByInstanceId(vm.getId(), VMSnapshot.State.Expunging, VMSnapshot.State.Reverting, VMSnapshot.State.Creating);
             for (VMSnapshotVO vmSnapshotVO : vmSnapshotsInExpungingStates) {
+                VMSnapshotStrategy strategy = findVMSnapshotStrategy(vmSnapshotVO);
                 if(vmSnapshotVO.getState() == VMSnapshot.State.Expunging){
-                    return deleteSnapshotInternal(vmSnapshotVO);
+                    return strategy.deleteVMSnapshot(vmSnapshotVO);
                 }else if(vmSnapshotVO.getState() == VMSnapshot.State.Creating){
-                    return createVmSnapshotInternal(userVm, vmSnapshotVO, hostId) != null;
+                    return strategy.takeVMSnapshot(vmSnapshotVO) != null;
                 }else if(vmSnapshotVO.getState() == VMSnapshot.State.Reverting){
-                    return revertInternal(userVm, vmSnapshotVO, hostId) != null;
+                    return strategy.revertVMSnapshot(vmSnapshotVO);
                 }
             }
         }catch (Exception e) {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/a6ce66e5/server/test/com/cloud/vm/snapshot/VMSnapshotManagerTest.java
----------------------------------------------------------------------
diff --git a/server/test/com/cloud/vm/snapshot/VMSnapshotManagerTest.java b/server/test/com/cloud/vm/snapshot/VMSnapshotManagerTest.java
index 055b2b0..da6e7af 100644
--- a/server/test/com/cloud/vm/snapshot/VMSnapshotManagerTest.java
+++ b/server/test/com/cloud/vm/snapshot/VMSnapshotManagerTest.java
@@ -192,13 +192,6 @@ public class VMSnapshotManagerTest {
         when(vmMock.getState()).thenReturn(State.Running);
         _vmSnapshotMgr.allocVMSnapshot(TEST_VM_ID,"","",true);
 
-        when(_vmSnapshotDao.findCurrentSnapshotByVmId(anyLong())).thenReturn(null);
-        doReturn(new ArrayList<VolumeTO>()).when(_vmSnapshotMgr).getVolumeTOList(anyLong());
-        doReturn(new CreateVMSnapshotAnswer(null,true,"")).when(_vmSnapshotMgr).sendToPool(anyLong(), any(CreateVMSnapshotCommand.class));
-        doNothing().when(_vmSnapshotMgr).processAnswer(any(VMSnapshotVO.class),
-                any(UserVmVO.class), any(Answer.class), anyLong());
-        doReturn(true).when(_vmSnapshotMgr).vmSnapshotStateTransitTo(any(VMSnapshotVO.class),any(VMSnapshot.Event.class));
-        _vmSnapshotMgr.createVmSnapshotInternal(vmMock, mock(VMSnapshotVO.class), 5L);
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/a6ce66e5/setup/db/db/schema-421to430.sql
----------------------------------------------------------------------
diff --git a/setup/db/db/schema-421to430.sql b/setup/db/db/schema-421to430.sql
index 8e4aa93..d355104 100644
--- a/setup/db/db/schema-421to430.sql
+++ b/setup/db/db/schema-421to430.sql
@@ -39,6 +39,15 @@ ALTER TABLE `cloud`.`vm_instance` ADD COLUMN `power_state_update_count` INT DEFA
 ALTER TABLE `cloud`.`vm_instance` ADD COLUMN `power_host` bigint unsigned;
 ALTER TABLE `cloud`.`vm_instance` ADD CONSTRAINT `fk_vm_instance__power_host` FOREIGN KEY (`power_host`) REFERENCES `cloud`.`host`(`id`);
 
+DROP TABLE IF EXISTS `cloud`.`vm_snapshot_details`;
+CREATE TABLE `cloud`.`vm_snapshot_details` (
+  `id` bigint unsigned UNIQUE NOT NULL,
+  `vm_snapshot_id` bigint unsigned NOT NULL,
+  `name` varchar(255) NOT NULL,
+  `value` varchar(255) NOT NULL,
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
 CREATE TABLE `cloud`.`vm_work_job` (
   `id` bigint unsigned UNIQUE NOT NULL,
   `step` char(32) NOT NULL COMMENT 'state',


[18/50] [abbrv] git commit: updated refs/heads/object_store_migration to 5ec2a44

Posted by mc...@apache.org.
Add back initialization of _maxVolumeSizeInGb in VolumeApiServiceImpl.

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

Branch: refs/heads/object_store_migration
Commit: 694ec684a372c95abf8d1a798714b6f074862816
Parents: 28f9952
Author: Min Chen <mi...@citrix.com>
Authored: Fri Oct 25 21:24:08 2013 -0700
Committer: Min Chen <mi...@citrix.com>
Committed: Fri Oct 25 21:24:08 2013 -0700

----------------------------------------------------------------------
 server/src/com/cloud/storage/VolumeApiServiceImpl.java | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/694ec684/server/src/com/cloud/storage/VolumeApiServiceImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/storage/VolumeApiServiceImpl.java b/server/src/com/cloud/storage/VolumeApiServiceImpl.java
index 071281c..e4c8264 100644
--- a/server/src/com/cloud/storage/VolumeApiServiceImpl.java
+++ b/server/src/com/cloud/storage/VolumeApiServiceImpl.java
@@ -25,6 +25,8 @@ import java.util.concurrent.ExecutionException;
 
 import javax.inject.Inject;
 
+import org.apache.log4j.Logger;
+
 import org.apache.cloudstack.api.BaseCmd;
 import org.apache.cloudstack.api.command.user.volume.AttachVolumeCmd;
 import org.apache.cloudstack.api.command.user.volume.CreateVolumeCmd;
@@ -64,7 +66,6 @@ import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreDao;
 import org.apache.cloudstack.storage.datastore.db.VolumeDataStoreDao;
 import org.apache.cloudstack.storage.datastore.db.VolumeDataStoreVO;
 import org.apache.cloudstack.storage.image.datastore.ImageStoreEntity;
-import org.apache.log4j.Logger;
 
 import com.cloud.agent.AgentManager;
 import com.cloud.agent.api.Answer;
@@ -1726,6 +1727,8 @@ public class VolumeApiServiceImpl extends ManagerBase implements VolumeApiServic
         String _customDiskOfferingMinSizeStr = _configDao.getValue(Config.CustomDiskOfferingMinSize.toString());
         _customDiskOfferingMinSize = NumbersUtil.parseInt(_customDiskOfferingMinSizeStr, Integer.parseInt(Config.CustomDiskOfferingMinSize.getDefaultValue()));
 
+        String maxVolumeSizeInGbString = _configDao.getValue(Config.MaxVolumeSize.toString());
+        _maxVolumeSizeInGb = NumbersUtil.parseLong(maxVolumeSizeInGbString, 2000);
         return true;
     }
 
@@ -1735,7 +1738,7 @@ public class VolumeApiServiceImpl extends ManagerBase implements VolumeApiServic
 
     @Inject
     public void setStoragePoolAllocators(List<StoragePoolAllocator> storagePoolAllocators) {
-        this._storagePoolAllocators = storagePoolAllocators;
+        _storagePoolAllocators = storagePoolAllocators;
     }
 
 }


[29/50] [abbrv] git commit: updated refs/heads/object_store_migration to 5ec2a44

Posted by mc...@apache.org.
spring-modularization: remove simulator planner

The simulator uses the default planners of cloudstack and does not
require a separate planner context (as of now). This was just c&p from
baremetal planners.

Signed-off-by: Prasanna Santhanam <ts...@apache.org>


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

Branch: refs/heads/object_store_migration
Commit: f4fb5f5582569ea30a0004587a3f340193caf47a
Parents: 858ce76
Author: Prasanna Santhanam <ts...@apache.org>
Authored: Fri Oct 25 11:18:31 2013 +0530
Committer: Prasanna Santhanam <ts...@apache.org>
Committed: Mon Oct 28 11:29:01 2013 +0530

----------------------------------------------------------------------
 .../simulator-planner/module.properties         | 18 -----------
 .../simulator-planner/spring-context.xml        | 34 --------------------
 2 files changed, 52 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f4fb5f55/plugins/hypervisors/simulator/resources/META-INF/cloudstack/simulator-planner/module.properties
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/simulator/resources/META-INF/cloudstack/simulator-planner/module.properties b/plugins/hypervisors/simulator/resources/META-INF/cloudstack/simulator-planner/module.properties
deleted file mode 100644
index 055be73..0000000
--- a/plugins/hypervisors/simulator/resources/META-INF/cloudstack/simulator-planner/module.properties
+++ /dev/null
@@ -1,18 +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.
-name=simulator-planner
-parent=planner
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f4fb5f55/plugins/hypervisors/simulator/resources/META-INF/cloudstack/simulator-planner/spring-context.xml
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/simulator/resources/META-INF/cloudstack/simulator-planner/spring-context.xml b/plugins/hypervisors/simulator/resources/META-INF/cloudstack/simulator-planner/spring-context.xml
deleted file mode 100644
index 8c14c3e..0000000
--- a/plugins/hypervisors/simulator/resources/META-INF/cloudstack/simulator-planner/spring-context.xml
+++ /dev/null
@@ -1,34 +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.
--->
-<beans xmlns="http://www.springframework.org/schema/beans"
-       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-       xmlns:context="http://www.springframework.org/schema/context"
-       xmlns:aop="http://www.springframework.org/schema/aop"
-       xsi:schemaLocation="http://www.springframework.org/schema/beans
-                      http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
-                      http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
-                      http://www.springframework.org/schema/context
-                      http://www.springframework.org/schema/context/spring-context-3.0.xsd"
-                      >
-
-    <bean id="BareMetalPlanner" class="com.cloud.baremetal.manager.BareMetalPlanner">
-        <property name="name" value="BareMetalPlanner" />
-    </bean>
-    
-</beans>


[30/50] [abbrv] git commit: updated refs/heads/object_store_migration to 5ec2a44

Posted by mc...@apache.org.
Adding readable start and end time stamps

Signed-off-by: Santhosh Edukulla <Sa...@citrix.com>


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

Branch: refs/heads/object_store_migration
Commit: b4ceefa469cfc1ebce8e162ed569a5c844d8765e
Parents: f4fb5f5
Author: Santhosh Edukulla <Sa...@citrix.com>
Authored: Fri Oct 25 23:39:35 2013 +0530
Committer: Prasanna Santhanam <ts...@apache.org>
Committed: Mon Oct 28 11:29:27 2013 +0530

----------------------------------------------------------------------
 tools/marvin/marvin/marvinPlugin.py | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/b4ceefa4/tools/marvin/marvin/marvinPlugin.py
----------------------------------------------------------------------
diff --git a/tools/marvin/marvin/marvinPlugin.py b/tools/marvin/marvin/marvinPlugin.py
index 3b282e4..c5931e0 100644
--- a/tools/marvin/marvin/marvinPlugin.py
+++ b/tools/marvin/marvin/marvinPlugin.py
@@ -140,9 +140,10 @@ class MarvinPlugin(Plugin):
         if self.startTime is not None:
             totTime = int(endTime - self.startTime)
             self.logger.debug(
-                "****TestCaseName: %s; Time Taken: %s Seconds; \
-                StartTime: %s; EndTime: %s****"
-                % (self.testName, str(totTime), self.startTime, endTime))
+                "TestCaseName: %s; Time Taken: %s Seconds; \
+                StartTime: %s; EndTime: %s"
+                % (self.testName, str(totTime),
+                   str(time.ctime(self.startTime)), str(time.ctime(endTime))))
 
     def _injectClients(self, test):
         self.debug_stream. \


[33/50] [abbrv] git commit: updated refs/heads/object_store_migration to 5ec2a44

Posted by mc...@apache.org.
CLOUDSTACK-4946. VM Restore with template id/Volatile VM feature doesnt work on VMware
When a ROOT volume is created from base template, if a folder already exists for the ROOT volume's VM then replace the old ROOT disk files with the new one.


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

Branch: refs/heads/object_store_migration
Commit: 7116268f33a5576f2eb80dffc921918021fd510f
Parents: 03830c5
Author: Likitha Shetty <li...@citrix.com>
Authored: Fri Oct 25 15:39:33 2013 +0530
Committer: Likitha Shetty <li...@citrix.com>
Committed: Mon Oct 28 13:17:54 2013 +0530

----------------------------------------------------------------------
 .../resource/VmwareStorageProcessor.java        | 21 +++++++++++---------
 1 file changed, 12 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/7116268f/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareStorageProcessor.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareStorageProcessor.java b/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareStorageProcessor.java
index 53bd144..71ba4e9 100644
--- a/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareStorageProcessor.java
+++ b/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareStorageProcessor.java
@@ -345,11 +345,6 @@ public class VmwareStorageProcessor implements StorageProcessor {
                         vmMo.createDisk(volumeDatastorePath, (int) (volume.getSize() / (1024L * 1024L)), morDatastore, -1);
                         vmMo.detachDisk(volumeDatastorePath, false);
                     }
-
-                    VolumeObjectTO newVol = new VolumeObjectTO();
-                    newVol.setPath(vmdkName);
-                    newVol.setSize(volume.getSize());
-                    return new CopyCmdAnswer(newVol);
                 } finally {
                     vmMo.detachAllDisks();
 
@@ -383,11 +378,19 @@ public class VmwareStorageProcessor implements StorageProcessor {
 
                 String srcFile = dsMo.getDatastorePath(vmdkName, true);
                 dsMo.deleteFile(srcFile, dcMo.getMor(), true);
-                VolumeObjectTO newVol = new VolumeObjectTO();
-                newVol.setPath(vmdkName);
-                newVol.setSize(volume.getSize());
-                return new CopyCmdAnswer(newVol);
             }
+            // restoreVM - move the new ROOT disk into corresponding VM folder
+            String vmInternalCSName = volume.getVmName();
+            if (dsMo.folderExists(String.format("[%s]", dsMo.getName()), vmInternalCSName)) {
+                String oldRootDisk = VmwareStorageLayoutHelper.getVmwareDatastorePathFromVmdkFileName(dsMo, vmInternalCSName, vmdkName);
+                if (oldRootDisk != null)
+                    VmwareStorageLayoutHelper.syncVolumeToVmDefaultFolder(dcMo, vmInternalCSName, dsMo, vmdkName);
+            }
+
+            VolumeObjectTO newVol = new VolumeObjectTO();
+            newVol.setPath(vmdkName);
+            newVol.setSize(volume.getSize());
+            return new CopyCmdAnswer(newVol);
         } catch (Throwable e) {
             if (e instanceof RemoteException) {
                 s_logger.warn("Encounter remote exception to vCenter, invalidate VMware session context");


[35/50] [abbrv] git commit: updated refs/heads/object_store_migration to 5ec2a44

Posted by mc...@apache.org.
Style header bar


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

Branch: refs/heads/object_store_migration
Commit: e9dcdc041131c63347eabeefb836dfb1f84d0315
Parents: 3e70b14
Author: Brian Federle <br...@citrix.com>
Authored: Mon Oct 28 11:12:45 2013 -0700
Committer: Brian Federle <br...@citrix.com>
Committed: Mon Oct 28 11:12:57 2013 -0700

----------------------------------------------------------------------
 ui/css/cloudstack3.css | 165 ++++++++++++++++----------------------------
 ui/scripts/ui/core.js  |   2 +-
 2 files changed, 59 insertions(+), 108 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e9dcdc04/ui/css/cloudstack3.css
----------------------------------------------------------------------
diff --git a/ui/css/cloudstack3.css b/ui/css/cloudstack3.css
index 8519def..58fa424 100644
--- a/ui/css/cloudstack3.css
+++ b/ui/css/cloudstack3.css
@@ -84,6 +84,16 @@ body.install-wizard {
   display: none;
 }
 
+a {
+  color: #0B84DC;
+  text-decoration: none;
+}
+
+a:hover {
+  text-decoration: underline;
+  color: #000000;
+}
+
 /*Table*/
 table {
   width: 740px;
@@ -282,16 +292,6 @@ table th div.ui-resizable-handle {
 }
 
 /** Header, misc*/
-#header,
-#navigation {
-  /*+text-shadow:0px -1px 1px #000000;*/
-  -moz-text-shadow: 0px -1px 1px #000000;
-  -webkit-text-shadow: 0px -1px 1px #000000;
-  -o-text-shadow: 0px -1px 1px #000000;
-  text-shadow: 0px -1px 1px #000000;
-  /*[empty]padding:;*/
-}
-
 #template {
   display: none;
 }
@@ -2199,7 +2199,7 @@ div.detail-group.actions td {
 /*Header*/
 #header {
   width: 100%;
-  height: 56px;
+  height: 117px;
   background: url(../images/overlay-pattern.png) repeat 0, #1B5070 url(../images/header-gradient.png) no-repeat center;
   z-index: 10000;
   background-size: auto, cover;
@@ -2213,25 +2213,40 @@ div.detail-group.actions td {
 }
 
 #header.nologo div.logo {
-  width: 210px;
+  width: 1024px;
   height: 47px;
-  position: relative;
-  float: left;
-  margin: 4px 0 0 19px;
+  margin: auto;
   background: url(../images/logo.png) no-repeat 0 center;
 }
 
 #header div.controls {
-  height: 39px;
+  width: 1024px;
+  height: 48px;
   position: relative;
-  float: right;
-  margin-top: 8px;
-  display: inline-block;
-  padding: 0 96px 0 0;
+  margin: 8px auto;
+  padding-top: 14px;
+  /*+border-radius:4px 4px 0 0;*/
+  -moz-border-radius: 4px 4px 0 0;
+  -webkit-border-radius: 4px 4px 0 0;
+  -khtml-border-radius: 4px 4px 0 0;
+  border-radius: 4px 4px 0 0;
 }
 
 #header div.controls.nologo {
-  background-image: none;
+  background: #666666;
+  background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzY2NjY2NiIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiMzZDNkM2QiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+);
+  background: -moz-linear-gradient(top, #666666 0%, #3d3d3d 100%);
+  background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#666666), color-stop(100%,#3d3d3d));
+  background: -webkit-linear-gradient(top, #666666 0%,#3d3d3d 100%);
+  background: -o-linear-gradient(top, #666666 0%,#3d3d3d 100%);
+  background: -ms-linear-gradient(top, #666666 0%,#3d3d3d 100%);
+  background: linear-gradient(to bottom, #666666 0%,#3d3d3d 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#666666', endColorstr='#3d3d3d',GradientType=0 );
+  /*+box-shadow:0px -1px 6px #0E3955;*/
+  -moz-box-shadow: 0px -1px 6px #0E3955;
+  -webkit-box-shadow: 0px -1px 6px #0E3955;
+  -o-box-shadow: 0px -1px 6px #0E3955;
+  box-shadow: 0px -1px 6px #0E3955;
 }
 
 .button {
@@ -2244,7 +2259,7 @@ div.detail-group.actions td {
   background: transparent;
   height: 18px;
   padding: 1px 0 0;
-  margin: 8px 36px 0 50px;
+  margin: 8px 36px 0 29px;
 }
 
 #header div.notifications span {
@@ -2295,7 +2310,9 @@ div.detail-group.actions td {
 #user {
   height: 30px;
   margin: 5px 6px 0 0;
-  position: relative;
+  position: absolute;
+  top: -48px;
+  left: 880px;
   cursor: default !important;
   display: inline-block;
   float: left;
@@ -2303,22 +2320,9 @@ div.detail-group.actions td {
 }
 
 #user div.name {
-  background: url(../images/bg-gradients.png) 0px -867px;
   display: inline-block;
   float: left;
   padding: 9px 18px 7px 12px;
-  border: 1px solid #7A7A7A;
-  border-bottom: 1px solid #ADADAD;
-  /*+box-shadow:inset 0px -1px 2px #6D6D6D;*/
-  -moz-box-shadow: inset 0px -1px 2px #6D6D6D;
-  -webkit-box-shadow: inset 0px -1px 2px #6D6D6D;
-  -o-box-shadow: inset 0px -1px 2px #6D6D6D;
-  box-shadow: inset 0px -1px 2px #6D6D6D;
-  /*+border-radius:4px 0 0 4px;*/
-  -moz-border-radius: 4px 0 0 4px;
-  -webkit-border-radius: 4px 0 0 4px;
-  -khtml-border-radius: 4px 0 0 4px;
-  border-radius: 4px 0 0 4px;
   border-right: none;
   /*[empty]border-top:;*/
   min-width: 75px;
@@ -2343,27 +2347,11 @@ div.detail-group.actions td {
   position: relative;
   left: 0px;
   top: 0px;
-  background: url(../images/bg-gradients.png);
   background-position: 0px -867px;
-  border-top: 1px solid #7A7A7A;
-  border-bottom: 1px solid #ADADAD;
-  border-left: 1px solid #B5B5B5;
-  /*+border-radius:0 4px 4px 0;*/
-  -moz-border-radius: 0 4px 4px 0;
-  -webkit-border-radius: 0 4px 4px 0;
-  -khtml-border-radius: 0 4px 4px 0;
-  border-radius: 0 4px 4px 0;
-  /*+box-shadow:inset 1px 0px 2px #6D6D6D;*/
-  -moz-box-shadow: inset 1px 0px 2px #6D6D6D;
-  -webkit-box-shadow: inset 1px 0px 2px #6D6D6D;
-  -o-box-shadow: inset 1px 0px 2px #6D6D6D;
-  box-shadow: inset 1px 0px 2px #6D6D6D;
   cursor: pointer;
 }
 
 #user div.options:hover {
-  background-position: 0px -904px;
-  /*[empty]background-color:;*/
 }
 
 #user div.options .arrow {
@@ -4028,68 +4016,31 @@ Dialogs*/
 
 /*User options*/
 #user-options {
-  width: 115px;
-  height: 33px;
-  display: none;
+  background: #FFFFFF;
+  z-index: 10000;
+  width: 104px;
   position: absolute;
-  z-index: 5000;
-  /*+placement:shift 804px 42px;*/
-  position: relative;
-  left: 804px;
-  top: 42px;
-  border-top: 1px solid #FFFFFF;
-  border-bottom: 1px solid #C6C4C5;
-  /*+border-radius:0 0 5px 5px;*/
-  -moz-border-radius: 0 0 5px 5px;
-  -webkit-border-radius: 0 0 5px 5px;
-  -khtml-border-radius: 0 0 5px 5px;
-  border-radius: 0 0 5px 5px;
-  /*+box-shadow:0px 8px 17px #505050;*/
-  -moz-box-shadow: 0px 8px 17px #505050;
-  -webkit-box-shadow: 0px 8px 17px #505050;
-  -o-box-shadow: 0px 8px 17px #505050;
-  box-shadow: 0px 8px 17px #505050;
-  padding: 0;
-  border: 1px solid #8A8888;
+  padding: 15px;
+  top: 30px;
+  /*+border-radius:0 0 3px 3px;*/
+  -moz-border-radius: 0 0 3px 3px;
+  -webkit-border-radius: 0 0 3px 3px;
+  -khtml-border-radius: 0 0 3px 3px;
+  border-radius: 0 0 3px 3px;
+  /*+box-shadow:0px 1px 7px #000000;*/
+  -moz-box-shadow: 0px 1px 7px #000000;
+  -webkit-box-shadow: 0px 1px 7px #000000;
+  -o-box-shadow: 0px 1px 7px #000000;
+  box-shadow: 0px 1px 7px #000000;
 }
 
 #user-options a {
-  position: relative;
-  background: #929292;
+  float: left;
   width: 100%;
-  display: block;
-  clear: both;
-  text-indent: 13px;
-  color: #FFFFFF;
-  text-decoration: none;
-  font-size: 12px;
-  /*+placement:shift 0px -51px;*/
-  position: relative;
-  left: 0px;
-  top: -51px;
-  padding: 11px 0 9px;
-  border-bottom: 1px solid #C5C5C5;
-  border-top: 1px solid #FFFFFF;
-  /*+text-shadow:0px 2px 1px #606060;*/
-  -moz-text-shadow: 0px 2px 1px #606060;
-  -webkit-text-shadow: 0px 2px 1px #606060;
-  -o-text-shadow: 0px 2px 1px #606060;
-  text-shadow: 0px 2px 1px #606060;
-  /*+border-radius:0 0 5px 5px;*/
-  -moz-border-radius: 0 0 5px 5px;
-  -webkit-border-radius: 0 0 5px 5px;
-  -khtml-border-radius: 0 0 5px 5px;
-  border-radius: 0 0 5px 5px;
+  padding: 10px 0;
 }
 
 #user-options a:hover {
-  background: #ADADAD;
-  color: #FFFFFF;
-  /*+text-shadow:0px 1px 2px #383838;*/
-  -moz-text-shadow: 0px 1px 2px #383838;
-  -webkit-text-shadow: 0px 1px 2px #383838;
-  -o-text-shadow: 0px 1px 2px #383838;
-  text-shadow: 0px 1px 2px #383838;
 }
 
 /*Dashboard
@@ -9128,7 +9079,7 @@ div.ui-dialog div.multi-edit-add-list div.view div.data-table table.body tbody t
 
 .project-switcher label {
   position: absolute;
-  top: 15px;
+  top: 29px;
   color: #FFFFFF;
   font-size: 12px;
   font-weight: bold;

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e9dcdc04/ui/scripts/ui/core.js
----------------------------------------------------------------------
diff --git a/ui/scripts/ui/core.js b/ui/scripts/ui/core.js
index a11d14e..3df2b2b 100644
--- a/ui/scripts/ui/core.js
+++ b/ui/scripts/ui/core.js
@@ -291,7 +291,7 @@
         var $options = $('<div>').attr({
             id: 'user-options'
         })
-            .appendTo($('#header'));
+            .appendTo($('#user'));
 
         $(['label.logout', 'label.help', 'label.about']).each(function() {
             var $link = $('<a>')


[16/50] [abbrv] git commit: updated refs/heads/object_store_migration to 5ec2a44

Posted by mc...@apache.org.
Merge remote-tracking branch 'origin/master'


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

Branch: refs/heads/object_store_migration
Commit: 465c9ec5c3916009a6f87d1d450a5fe39e57b8fe
Parents: 70b2c01 718bc37
Author: Edison Su <su...@gmail.com>
Authored: Fri Oct 25 18:24:29 2013 -0700
Committer: Edison Su <su...@gmail.com>
Committed: Fri Oct 25 18:24:29 2013 -0700

----------------------------------------------------------------------
 .../org/apache/cloudstack/api/APICommand.java   |  4 +++
 .../acl/StaticRoleBasedAPIAccessChecker.java    | 37 +++++++++++++++++---
 .../spring-server-core-managers-context.xml     |  1 +
 .../system/spring-server-system-context.xml     | 36 +++++++++++++++++++
 .../com/cloud/server/ManagementServerImpl.java  | 18 ++++++++--
 ui/scripts/system.js                            |  1 +
 6 files changed, 89 insertions(+), 8 deletions(-)
----------------------------------------------------------------------



[32/50] [abbrv] git commit: updated refs/heads/object_store_migration to 5ec2a44

Posted by mc...@apache.org.
Adding few changes and cleaning up the code

- Added few common naming conventions
- Cleanedup code
- Added a simple utility function

Signed-off-by: Santhosh Edukulla <Sa...@citrix.com>


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

Branch: refs/heads/object_store_migration
Commit: 03830c570eebe25181cb9ae8a0eb5e72a542e2a9
Parents: c8b91f1
Author: Santhosh Edukulla <Sa...@citrix.com>
Authored: Mon Oct 28 12:48:05 2013 +0530
Committer: Prasanna Santhanam <ts...@apache.org>
Committed: Mon Oct 28 12:49:41 2013 +0530

----------------------------------------------------------------------
 tools/marvin/marvin/codes.py                 |  6 +++-
 tools/marvin/marvin/configGenerator.py       |  8 ++----
 tools/marvin/marvin/deployDataCenter.py      | 18 ++++++------
 tools/marvin/marvin/integration/lib/utils.py | 35 +++++++++++++++++++++++
 tools/marvin/marvin/marvinPlugin.py          | 15 ++--------
 5 files changed, 54 insertions(+), 28 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/03830c57/tools/marvin/marvin/codes.py
----------------------------------------------------------------------
diff --git a/tools/marvin/marvin/codes.py b/tools/marvin/marvin/codes.py
index 6099d88..3da90d6 100644
--- a/tools/marvin/marvin/codes.py
+++ b/tools/marvin/marvin/codes.py
@@ -24,7 +24,7 @@
             a code viz., ENABLED  with value "Enabled",then using \
             this code in a sample feature say test_a.py as below. \
 
-            from marvinCodes import *
+            from codes import *
             if obj.getvalue() == ENABLED
 
 @DateAdded: 20th October 2013
@@ -33,3 +33,7 @@
 ENABLED = "Enabled"
 NETWORK_OFFERING = "network_offering"
 ROOT = "ROOT"
+INVALID_INPUT = "INVALID INPUT"
+EMPTY_LIST = "EMPTY_LIST"
+FAIL = 0
+PASS = 1

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/03830c57/tools/marvin/marvin/configGenerator.py
----------------------------------------------------------------------
diff --git a/tools/marvin/marvin/configGenerator.py b/tools/marvin/marvin/configGenerator.py
index 50614c1..0cfad30 100644
--- a/tools/marvin/marvin/configGenerator.py
+++ b/tools/marvin/marvin/configGenerator.py
@@ -830,7 +830,7 @@ def generate_setup_config(config, file=None):
         fp.close()
 
 
-def get_setup_config(file):
+def getSetupConfig(file):
     if not os.path.exists(file):
         raise IOError("config file %s not found. \
                       please specify a valid config file" % file)
@@ -841,9 +841,7 @@ def get_setup_config(file):
             ws = line.strip()
             if not ws.startswith("#"):
                 configLines.append(ws)
-    k = json.loads("\n".join(configLines))
-    #config = json.loads("\n".join(configLines))
-    config = k
+    config = json.loads("\n".join(configLines))
     return jsonHelper.jsonLoader(config)
 
 if __name__ == "__main__":
@@ -864,7 +862,7 @@ by default is ./datacenterCfg")
     (options, args) = parser.parse_args()
 
     if options.inputfile:
-        config = get_setup_config(options.inputfile)
+        config = getSetupConfig(options.inputfile)
     if options.advanced:
         config = describe_setup_in_advanced_mode()
     elif options.advancedsg:

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/03830c57/tools/marvin/marvin/deployDataCenter.py
----------------------------------------------------------------------
diff --git a/tools/marvin/marvin/deployDataCenter.py b/tools/marvin/marvin/deployDataCenter.py
index f2dccdb..3f7eebb 100644
--- a/tools/marvin/marvin/deployDataCenter.py
+++ b/tools/marvin/marvin/deployDataCenter.py
@@ -92,11 +92,11 @@ class deployDataCenters(object):
             if cluster.hypervisor.lower() != "vmware":
                 self.addHosts(cluster.hosts, zoneId, podId, clusterId,
                               cluster.hypervisor)
-            self.wait_for_host(zoneId, clusterId)
+            self.waitForHost(zoneId, clusterId)
             self.createPrimaryStorages(cluster.primaryStorages, zoneId, podId,
                                        clusterId)
 
-    def wait_for_host(self, zoneId, clusterId):
+    def waitForHost(self, zoneId, clusterId):
         """
         Wait for the hosts in the zoneid, clusterid to be up
 
@@ -127,7 +127,7 @@ class deployDataCenters(object):
             primarycmd.clusterid = clusterId
             self.apiClient.createStoragePool(primarycmd)
 
-    def createpods(self, pods, zoneId, networkId=None):
+    def createPods(self, pods, zoneId, networkId=None):
         if pods is None:
             return
         for pod in pods:
@@ -212,7 +212,7 @@ class deployDataCenters(object):
                                             })
             self.apiClient.createSecondaryStagingStore(cachecmd)
 
-    def createnetworks(self, networks, zoneId):
+    def createNetworks(self, networks, zoneId):
         if networks is None:
             return
         for network in networks:
@@ -421,8 +421,8 @@ class deployDataCenters(object):
                 guestntwrk.networkofferingid = \
                     listnetworkofferingresponse[0].id
 
-                networkid = self.createnetworks([guestntwrk], zoneId)
-                self.createpods(zone.pods, zoneId, networkid)
+                networkid = self.createNetworks([guestntwrk], zoneId)
+                self.createPods(zone.pods, zoneId, networkid)
                 if self.isEipElbZone(zone):
                     self.createVlanIpRanges(zone.networktype, zone.ipranges,
                                             zoneId, forvirtualnetwork=True)
@@ -430,7 +430,7 @@ class deployDataCenters(object):
             isPureAdvancedZone = (zone.networktype == "Advanced"
                                   and zone.securitygroupenabled != "true")
             if isPureAdvancedZone:
-                self.createpods(zone.pods, zoneId)
+                self.createPods(zone.pods, zoneId)
                 self.createVlanIpRanges(zone.networktype, zone.ipranges,
                                         zoneId)
             elif (zone.networktype == "Advanced"
@@ -463,7 +463,7 @@ class deployDataCenters(object):
 
                 networkcmdresponse = self.apiClient.createNetwork(networkcmd)
                 networkId = networkcmdresponse.id
-                self.createpods(zone.pods, zoneId, networkId)
+                self.createPods(zone.pods, zoneId, networkId)
 
             '''Note: Swift needs cache storage first'''
             self.createCacheStorages(zone.cacheStorages, zoneId)
@@ -514,7 +514,7 @@ class deployDataCenters(object):
 
     def loadCfg(self):
         try:
-            self.config = configGenerator.get_setup_config(self.configFile)
+            self.config = configGenerator.getSetupConfig(self.configFile)
         except:
             raise cloudstackException.InvalidParameterException(
                 "Failed to load config %s" % self.configFile)

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/03830c57/tools/marvin/marvin/integration/lib/utils.py
----------------------------------------------------------------------
diff --git a/tools/marvin/marvin/integration/lib/utils.py b/tools/marvin/marvin/integration/lib/utils.py
index d81e80d..7d662af 100644
--- a/tools/marvin/marvin/integration/lib/utils.py
+++ b/tools/marvin/marvin/integration/lib/utils.py
@@ -30,6 +30,7 @@ import urlparse
 import datetime
 from marvin.cloudstackAPI import *
 from marvin.remoteSSHClient import remoteSSHClient
+from marvin.codes import *
 
 
 def restart_mgmt_server(server):
@@ -318,3 +319,37 @@ def is_snapshot_on_nfs(apiclient, dbconn, config, zoneid, snapshotid):
         raise Exception("SSH failed for management server: %s - %s" %
                       (config.mgtSvr[0].mgtSvrIp, e))
     return 'snapshot exists' in result
+
+
+def validateList(inp):
+        '''
+   @name: validateList
+        @Description: 1. A utility function to validate
+                 whether the input passed is a list
+              2. The list is empty or not
+              3. If it is list and not empty, return PASS and first element
+              4. If not reason for FAIL
+        @Input: Input to be validated
+        @output: List, containing [ Result,FirstElement,Reason ]
+                 Ist Argument('Result') : FAIL : If it is not a list
+                                          If it is list but empty
+                                         PASS : If it is list and not empty
+                 IInd Argument('FirstElement'): If it is list and not empty,
+                                           then first element
+                                            in it, default to None
+                 IIIrd Argument( 'Reason' ):  Reason for failure ( FAIL ),
+                                              default to None.
+                                              INVALID_INPUT
+                                              EMPTY_LIST
+        '''
+        ret = [FAIL, None, None]
+        if inp is None:
+            ret[2] = INVALID_INPUT
+            return ret
+        if not isinstance(inp, list):
+            ret[2] = INVALID_INPUT
+            return ret
+        if len(inp) == 0:
+            ret[2] = EMPTY_LIST
+            return ret
+        return [PASS, inp[0], None]

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/03830c57/tools/marvin/marvin/marvinPlugin.py
----------------------------------------------------------------------
diff --git a/tools/marvin/marvin/marvinPlugin.py b/tools/marvin/marvin/marvinPlugin.py
index c5931e0..2a749f0 100644
--- a/tools/marvin/marvin/marvinPlugin.py
+++ b/tools/marvin/marvin/marvinPlugin.py
@@ -33,13 +33,6 @@ class MarvinPlugin(Plugin):
     name = "marvin"
 
     def configure(self, options, config):
-        if hasattr(options, self.enableOpt):
-            if not getattr(options, self.enableOpt):
-                self.enabled = False
-                return
-            else:
-                self.enabled = True
-
         self.logformat = logging.Formatter("%(asctime)s - %(levelname)s - " +
                                            "%(name)s - %(message)s")
 
@@ -59,7 +52,7 @@ class MarvinPlugin(Plugin):
         else:
             self.result_stream = sys.stdout
 
-        deploy = deployDataCenter.deployDataCenters(options.config)
+        deploy = deployDataCenter.deployDataCenters(options.config_file)
         deploy.loadCfg() if options.load else deploy.deploy()
         self.setClient(deploy.testClient)
         self.setConfig(deploy.getCfg())
@@ -74,7 +67,7 @@ class MarvinPlugin(Plugin):
         """
         parser.add_option("--marvin-config", action="store",
                           default=env.get('MARVIN_CONFIG', './datacenter.cfg'),
-                          dest="config",
+                          dest="config_file",
                           help="Marvin's configuration file where the " +
                                "datacenter information is specified " +
                                "[MARVIN_CONFIG]")
@@ -146,10 +139,6 @@ class MarvinPlugin(Plugin):
                    str(time.ctime(self.startTime)), str(time.ctime(endTime))))
 
     def _injectClients(self, test):
-        self.debug_stream. \
-            setFormatter(logging.
-                         Formatter("%(asctime)s - %(levelname)s - %(name)s" +
-                                   " - %(message)s"))
         setattr(test, "debug", self.logger.debug)
         setattr(test, "info", self.logger.info)
         setattr(test, "warn", self.logger.warning)


[22/50] [abbrv] git commit: updated refs/heads/object_store_migration to 5ec2a44

Posted by mc...@apache.org.
InputStream use fix

Closes the FileInputStream opened at configuration in
- ClusterManagerImpl
- ClusterServiceServletAdapter
- TransactionLegacy
- AsyncJobManagerImpl
- DBEncryptionUtil
- EncryptionSecretKeyChecker

Signed-off-by: Laszlo Hornyak <la...@gmail.com>


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

Branch: refs/heads/object_store_migration
Commit: dbaa818d1eaf80f7d62792abe380a8c7c2ffa0ac
Parents: c178315
Author: Laszlo Hornyak <la...@gmail.com>
Authored: Fri Oct 25 20:38:36 2013 +0200
Committer: Laszlo Hornyak <la...@gmail.com>
Committed: Sat Oct 26 17:47:34 2013 +0200

----------------------------------------------------------------------
 framework/cluster/src/com/cloud/cluster/ClusterManagerImpl.java   | 3 +--
 .../src/com/cloud/cluster/ClusterServiceServletAdapter.java       | 3 +--
 framework/db/src/com/cloud/utils/db/TransactionLegacy.java        | 1 +
 .../cloudstack/framework/jobs/impl/AsyncJobManagerImpl.java       | 3 +--
 utils/src/com/cloud/utils/crypt/DBEncryptionUtil.java             | 2 +-
 utils/src/com/cloud/utils/crypt/EncryptionSecretKeyChecker.java   | 3 +--
 6 files changed, 6 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/dbaa818d/framework/cluster/src/com/cloud/cluster/ClusterManagerImpl.java
----------------------------------------------------------------------
diff --git a/framework/cluster/src/com/cloud/cluster/ClusterManagerImpl.java b/framework/cluster/src/com/cloud/cluster/ClusterManagerImpl.java
index 35968ee..71bea4f 100644
--- a/framework/cluster/src/com/cloud/cluster/ClusterManagerImpl.java
+++ b/framework/cluster/src/com/cloud/cluster/ClusterManagerImpl.java
@@ -17,7 +17,6 @@
 package com.cloud.cluster;
 
 import java.io.File;
-import java.io.FileInputStream;
 import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.net.ConnectException;
@@ -1033,7 +1032,7 @@ public class ClusterManagerImpl extends ManagerBase implements ClusterManager, C
         File dbPropsFile = PropertiesUtil.findConfigFile("db.properties");
         Properties dbProps = new Properties();
         try {
-            dbProps.load(new FileInputStream(dbPropsFile));
+            PropertiesUtil.loadFromFile(dbProps, dbPropsFile);
         } catch (FileNotFoundException e) {
             throw new ConfigurationException("Unable to find db.properties");
         } catch (IOException e) {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/dbaa818d/framework/cluster/src/com/cloud/cluster/ClusterServiceServletAdapter.java
----------------------------------------------------------------------
diff --git a/framework/cluster/src/com/cloud/cluster/ClusterServiceServletAdapter.java b/framework/cluster/src/com/cloud/cluster/ClusterServiceServletAdapter.java
index 67df946..f80e21f 100644
--- a/framework/cluster/src/com/cloud/cluster/ClusterServiceServletAdapter.java
+++ b/framework/cluster/src/com/cloud/cluster/ClusterServiceServletAdapter.java
@@ -17,7 +17,6 @@
 package com.cloud.cluster;
 
 import java.io.File;
-import java.io.FileInputStream;
 import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.rmi.RemoteException;
@@ -126,7 +125,7 @@ public class ClusterServiceServletAdapter extends AdapterBase implements Cluster
         File dbPropsFile = PropertiesUtil.findConfigFile("db.properties");
         Properties dbProps = new Properties();
         try {
-            dbProps.load(new FileInputStream(dbPropsFile));
+            PropertiesUtil.loadFromFile(dbProps, dbPropsFile);
         } catch (FileNotFoundException e) {
             throw new ConfigurationException("Unable to find db.properties");
         } catch (IOException e) {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/dbaa818d/framework/db/src/com/cloud/utils/db/TransactionLegacy.java
----------------------------------------------------------------------
diff --git a/framework/db/src/com/cloud/utils/db/TransactionLegacy.java b/framework/db/src/com/cloud/utils/db/TransactionLegacy.java
index 9cf7c3f..a318d83 100755
--- a/framework/db/src/com/cloud/utils/db/TransactionLegacy.java
+++ b/framework/db/src/com/cloud/utils/db/TransactionLegacy.java
@@ -1039,6 +1039,7 @@ public class TransactionLegacy {
                 dbProps = new Properties();
             }
             try {
+                PropertiesUtil.loadFromFile(dbProps, dbPropsFile);
                 dbProps.load(new FileInputStream(dbPropsFile));
             } catch (IOException e) {
                 s_logger.fatal("Unable to load db properties file, pl. check the classpath and file path configuration", e);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/dbaa818d/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/AsyncJobManagerImpl.java
----------------------------------------------------------------------
diff --git a/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/AsyncJobManagerImpl.java b/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/AsyncJobManagerImpl.java
index ffc7b3a..29a299f 100644
--- a/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/AsyncJobManagerImpl.java
+++ b/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/AsyncJobManagerImpl.java
@@ -18,7 +18,6 @@
 package org.apache.cloudstack.framework.jobs.impl;
 
 import java.io.File;
-import java.io.FileInputStream;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.Date;
@@ -868,7 +867,7 @@ public class AsyncJobManagerImpl extends ManagerBase implements AsyncJobManager,
         try {
             final File dbPropsFile = PropertiesUtil.findConfigFile("db.properties");
             final Properties dbProps = new Properties();
-            dbProps.load(new FileInputStream(dbPropsFile));
+            PropertiesUtil.loadFromFile(dbProps, dbPropsFile);
 
             final int cloudMaxActive = Integer.parseInt(dbProps.getProperty("db.cloud.maxActive"));
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/dbaa818d/utils/src/com/cloud/utils/crypt/DBEncryptionUtil.java
----------------------------------------------------------------------
diff --git a/utils/src/com/cloud/utils/crypt/DBEncryptionUtil.java b/utils/src/com/cloud/utils/crypt/DBEncryptionUtil.java
index 06df799..2f44c5a 100755
--- a/utils/src/com/cloud/utils/crypt/DBEncryptionUtil.java
+++ b/utils/src/com/cloud/utils/crypt/DBEncryptionUtil.java
@@ -78,7 +78,7 @@ public class DBEncryptionUtil {
         	StandardPBEStringEncryptor encryptor = EncryptionSecretKeyChecker.getEncryptor();
         	dbProps = new EncryptableProperties(encryptor);
         	try {
-				dbProps.load(new FileInputStream(dbPropsFile));
+        	    PropertiesUtil.loadFromFile(dbProps, dbPropsFile);
 			} catch (FileNotFoundException e) {
 				throw new CloudRuntimeException("db.properties file not found while reading DB secret key", e);
 			} catch (IOException e) {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/dbaa818d/utils/src/com/cloud/utils/crypt/EncryptionSecretKeyChecker.java
----------------------------------------------------------------------
diff --git a/utils/src/com/cloud/utils/crypt/EncryptionSecretKeyChecker.java b/utils/src/com/cloud/utils/crypt/EncryptionSecretKeyChecker.java
index bf6c351..56195de 100755
--- a/utils/src/com/cloud/utils/crypt/EncryptionSecretKeyChecker.java
+++ b/utils/src/com/cloud/utils/crypt/EncryptionSecretKeyChecker.java
@@ -18,7 +18,6 @@ package com.cloud.utils.crypt;
 
 import java.io.BufferedReader;
 import java.io.File;
-import java.io.FileInputStream;
 import java.io.FileNotFoundException;
 import java.io.FileReader;
 import java.io.IOException;
@@ -62,7 +61,7 @@ public class EncryptionSecretKeyChecker extends AdapterBase implements SystemInt
         final File dbPropsFile = PropertiesUtil.findConfigFile("db.properties");
         final Properties dbProps = new Properties();
         try {
-            dbProps.load(new FileInputStream(dbPropsFile));
+            PropertiesUtil.loadFromFile(dbProps, dbPropsFile);
 
             final String encryptionType = dbProps.getProperty("db.cloud.encryption.type");
 


[48/50] [abbrv] git commit: updated refs/heads/object_store_migration to 5ec2a44

Posted by mc...@apache.org.
CLOUDSTACK-4817: fix s3 multipart uplaod

Conflicts:

	plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServerStorageProcessor.java


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

Branch: refs/heads/object_store_migration
Commit: 89d6e7ed66e92ded84e85d57a7b2681fd088c20b
Parents: 2cac1aa
Author: Edison Su <su...@gmail.com>
Authored: Mon Oct 28 17:31:49 2013 -0700
Committer: Edison Su <su...@gmail.com>
Committed: Mon Oct 28 17:31:49 2013 -0700

----------------------------------------------------------------------
 .../xen/resource/XenServerStorageProcessor.java | 11 ++--
 scripts/vm/hypervisor/xenserver/s3xen           | 68 ++++++++++++++++++--
 2 files changed, 71 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/89d6e7ed/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServerStorageProcessor.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServerStorageProcessor.java b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServerStorageProcessor.java
index 1496108..5a19aee 100644
--- a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServerStorageProcessor.java
+++ b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServerStorageProcessor.java
@@ -18,6 +18,11 @@
  */
 package com.cloud.hypervisor.xen.resource;
 
+
+import static com.cloud.utils.ReflectUtil.flattenProperties;
+import static com.google.common.collect.Lists.newArrayList;
+
+
 import java.io.File;
 import java.net.URI;
 import java.util.Arrays;
@@ -82,9 +87,6 @@ import com.xensource.xenapi.VDI;
 import com.xensource.xenapi.VM;
 import com.xensource.xenapi.VMGuestMetrics;
 
-import static com.cloud.utils.ReflectUtil.flattenProperties;
-import static com.google.common.collect.Lists.newArrayList;
-
 public class XenServerStorageProcessor implements StorageProcessor {
     private static final Logger s_logger = Logger.getLogger(XenServerStorageProcessor.class);
     protected CitrixResourceBase hypervisorResource;
@@ -1091,11 +1093,12 @@ public class XenServerStorageProcessor implements StorageProcessor {
                     S3Utils.ClientOptions.class));
             // https workaround for Introspector bug that does not
             // recognize Boolean accessor methods ...
+
             parameters.addAll(Arrays.asList("operation", "put", "filename",
                     dir + "/" + filename, "iSCSIFlag",
                     iSCSIFlag.toString(), "bucket", s3.getBucketName(),
                     "key", key, "https", s3.isHttps() != null ? s3.isHttps().toString()
-                            : "null"));
+                            : "null", "maxSingleUploadSizeInBytes", String.valueOf(s3.getMaxSingleUploadSizeInBytes())));
             final String result = hypervisorResource.callHostPluginAsync(connection, "s3xen",
                     "s3", wait,
                     parameters.toArray(new String[parameters.size()]));

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/89d6e7ed/scripts/vm/hypervisor/xenserver/s3xen
----------------------------------------------------------------------
diff --git a/scripts/vm/hypervisor/xenserver/s3xen b/scripts/vm/hypervisor/xenserver/s3xen
index 372a6da..bf81bbd 100644
--- a/scripts/vm/hypervisor/xenserver/s3xen
+++ b/scripts/vm/hypervisor/xenserver/s3xen
@@ -34,6 +34,7 @@ import base64
 import hmac
 import traceback
 import urllib2
+from xml.dom.minidom import parseString
 
 import XenAPIPlugin
 sys.path.extend(["/opt/xensource/sm/"])
@@ -260,15 +261,73 @@ class S3Client(object):
                      sha).digest())[:-1]
 
         return signature, request_date
+        
+    def getText(self, nodelist):
+        rc = []
+        for node in nodelist:
+            if node.nodeType == node.TEXT_NODE:
+                rc.append(node.data)
+        return ''.join(rc)
+
+    def multiUpload(self, bucket, key, src_fileName, chunkSize=5 * 1024 * 1024):
+        uploadId={}
+        def readInitalMultipart(response):
+           data = response.read()
+           xmlResult = parseString(data) 
+           result = xmlResult.getElementsByTagName("InitiateMultipartUploadResult")[0]
+           upload = result.getElementsByTagName("UploadId")[0]
+           uploadId["0"] = upload.childNodes[0].data
+       
+        self.do_operation('POST', bucket, key + "?uploads", fn_read=readInitalMultipart) 
+
+        fileSize = os.path.getsize(src_fileName) 
+        parts = fileSize / chunkSize + ((fileSize % chunkSize) and 1)
+        part = 1
+        srcFile = open(src_fileName, 'rb')
+        etags = []
+        while part <= parts:
+            offset = part - 1
+            size = min(fileSize - offset * chunkSize, chunkSize)
+            headers = {
+                self.HEADER_CONTENT_LENGTH: size
+            }
+            def send_body(connection): 
+               srcFile.seek(offset * chunkSize)
+               block = srcFile.read(size)
+               connection.send(block)
+            def read_multiPart(response):
+               etag = response.getheader('ETag') 
+               etags.append((part, etag))
+            self.do_operation("PUT", bucket, "%s?partNumber=%s&uploadId=%s"%(key, part, uploadId["0"]), headers, send_body, read_multiPart)
+            part = part + 1
+        srcFile.close()
+
+        data = [] 
+        partXml = "<Part><PartNumber>%i</PartNumber><ETag>%s</ETag></Part>"
+        for etag in etags:
+            data.append(partXml%etag)
+        msg = "<CompleteMultipartUpload>%s</CompleteMultipartUpload>"%("".join(data))
+        size = len(msg)
+        headers = {
+            self.HEADER_CONTENT_LENGTH: size
+        }
+        def send_complete_multipart(connection):
+            connection.send(msg) 
+        self.do_operation("POST", bucket, "%s?uploadId=%s"%(key, uploadId["0"]), headers, send_complete_multipart)
 
-    def put(self, bucket, key, src_filename):
+    def put(self, bucket, key, src_filename, maxSingleUpload):
 
         if not os.path.isfile(src_filename):
             raise Exception(
                 "Attempt to put " + src_filename + " that does not exist.")
 
+        size = os.path.getsize(src_filename)
+        if size > maxSingleUpload or maxSingleUpload == 0:
+            return self.multiUpload(bucket, key, src_filename)
+           
         headers = {
             self.HEADER_CONTENT_MD5: compute_md5(src_filename),
+        
             self.HEADER_CONTENT_TYPE: 'application/octet-stream',
             self.HEADER_CONTENT_LENGTH: str(os.stat(src_filename).st_size),
         }
@@ -323,6 +382,7 @@ def parseArguments(args):
     bucket = args['bucket']
     key = args['key']
     filename = args['filename']
+    maxSingleUploadBytes = int(args["maxSingleUploadSizeInBytes"])
 
     if is_blank(operation):
         raise ValueError('An operation must be specified.')
@@ -336,18 +396,18 @@ def parseArguments(args):
     if is_blank(filename):
         raise ValueError('A filename must be specified.')
 
-    return client, operation, bucket, key, filename
+    return client, operation, bucket, key, filename, maxSingleUploadBytes
 
 
 @echo
 def s3(session, args):
 
-    client, operation, bucket, key, filename = parseArguments(args)
+    client, operation, bucket, key, filename, maxSingleUploadBytes = parseArguments(args)
 
     try:
 
         if operation == 'put':
-            client.put(bucket, key, filename)
+            client.put(bucket, key, filename, maxSingleUploadBytes)
         elif operation == 'get':
             client.get(bucket, key, filename)
         elif operation == 'delete':


[36/50] [abbrv] git commit: updated refs/heads/object_store_migration to 5ec2a44

Posted by mc...@apache.org.
Style nav bar & body BG


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

Branch: refs/heads/object_store_migration
Commit: d5777c8e3300822a0eefff0971f332e6beb8c7ef
Parents: e9dcdc0
Author: Brian Federle <br...@citrix.com>
Authored: Mon Oct 28 11:34:43 2013 -0700
Committer: Brian Federle <br...@citrix.com>
Committed: Mon Oct 28 11:34:43 2013 -0700

----------------------------------------------------------------------
 ui/css/cloudstack3.css | 61 ++++++++++++++++++++++++++++-----------------
 1 file changed, 38 insertions(+), 23 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d5777c8e/ui/css/cloudstack3.css
----------------------------------------------------------------------
diff --git a/ui/css/cloudstack3.css b/ui/css/cloudstack3.css
index 58fa424..3e48062 100644
--- a/ui/css/cloudstack3.css
+++ b/ui/css/cloudstack3.css
@@ -50,7 +50,7 @@ body {
   font-family: sans-serif;
   height: 769px !important;
   overflow: auto;
-  background: #FFFFFF;
+  background: #EDE8E8;
 }
 
 body.install-wizard {
@@ -63,7 +63,7 @@ body.install-wizard {
 
 #main-area {
   width: 1024px;
-  height: 728px;
+  height: 100%;
   margin: auto;
   border: 1px solid #D4D4D4;
   /*+box-shadow:0px -5px 11px #B7B7B7;*/
@@ -71,6 +71,7 @@ body.install-wizard {
   -webkit-box-shadow: 0px -5px 11px #B7B7B7;
   -o-box-shadow: 0px -5px 11px #B7B7B7;
   box-shadow: 0px -5px 11px #B7B7B7;
+  border: 1px solid #E8E8E8;
 }
 
 #container {
@@ -2403,6 +2404,14 @@ div.detail-group.actions td {
   position: relative;
   float: left;
   background: #EDE8E8;
+  background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2ZmZmZmZiIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjYlIiBzdG9wLWNvbG9yPSIjZWRlOGU4IiBzdG9wLW9wYWNpdHk9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIGZpbGw9InVybCgjZ3JhZC11Y2dnLWdlbmVyYXRlZCkiIC8+Cjwvc3ZnPg==);
+  background: -moz-linear-gradient(top, #ffffff 0%, #ede8e8 6%);
+  background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#ffffff), color-stop(6%,#ede8e8));
+  background: -webkit-linear-gradient(top, #ffffff 0%,#ede8e8 6%);
+  background: -o-linear-gradient(top, #ffffff 0%,#ede8e8 6%);
+  background: -ms-linear-gradient(top, #ffffff 0%,#ede8e8 6%);
+  background: linear-gradient(to bottom, #ffffff 0%,#ede8e8 6%);
+  filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#ede8e8',GradientType=0 );
 }
 
 .project-view #navigation {
@@ -2412,6 +2421,7 @@ div.detail-group.actions td {
 #navigation ul {
   border-right: 1px solid #CECCCC;
   height: 100%;
+  padding-top: 29px;
 }
 
 .project-view #navigation ul {
@@ -2419,14 +2429,9 @@ div.detail-group.actions td {
 }
 
 #navigation ul li {
-  background: url(../images/bg-nav-item.png) repeat-x;
-  height: 50px;
+  height: 42px;
   cursor: pointer;
-  /*+text-shadow:0px 1px 1px #FFFFFF;*/
-  -moz-text-shadow: 0px 1px 1px #FFFFFF;
-  -webkit-text-shadow: 0px 1px 1px #FFFFFF;
-  -o-text-shadow: 0px 1px 1px #FFFFFF;
-  text-shadow: 0px 1px 1px #FFFFFF;
+  border-bottom: 1px solid #D2D2D2;
 }
 
 .project-view #navigation ul li {
@@ -2445,9 +2450,13 @@ div.detail-group.actions td {
 
 #navigation ul li:hover,
 #navigation ul li.active {
-  background: url(../images/bg-nav-item-active.png);
-  background-position: 0px 0px;
   width: 230px;
+  background: #2C5D7B;
+  /*+box-shadow:inset 0px 0px 7px #000000;*/
+  -moz-box-shadow: inset 0px 0px 7px #000000;
+  -webkit-box-shadow: inset 0px 0px 7px #000000;
+  -o-box-shadow: inset 0px 0px 7px #000000;
+  box-shadow: inset 0px 0px 7px #000000;
 }
 
 #navigation ul li.disabled {
@@ -2474,11 +2483,11 @@ div.detail-group.actions td {
 #navigation ul li:hover span,
 #navigation ul li.active span {
   color: #FFFFFF;
-  /*+text-shadow:1px 2px 1px #5D5F6D;*/
-  -moz-text-shadow: 1px 2px 1px #5D5F6D;
-  -webkit-text-shadow: 1px 2px 1px #5D5F6D;
-  -o-text-shadow: 1px 2px 1px #5D5F6D;
-  text-shadow: 1px 2px 1px #5D5F6D;
+  /*+text-shadow:0px 1px #000000;*/
+  -moz-text-shadow: 0px 1px #000000;
+  -webkit-text-shadow: 0px 1px #000000;
+  -o-text-shadow: 0px 1px #000000;
+  text-shadow: 0px 1px #000000;
 }
 
 #navigation ul li.disabled:hover {
@@ -2508,22 +2517,28 @@ div.detail-group.actions td {
 }
 
 #navigation ul li span {
-  /*+placement:shift 14px 18px;*/
+  /*+placement:shift 14px 13px;*/
   position: relative;
   left: 14px;
-  top: 18px;
-  font-size: 13px;
-  color: #596D7F;
+  top: 13px;
+  font-size: 11px;
+  color: #515151;
   padding-left: 19px;
+  font-weight: bold;
+  /*+text-shadow:0px 1px #FFFFFF;*/
+  -moz-text-shadow: 0px 1px #FFFFFF;
+  -webkit-text-shadow: 0px 1px #FFFFFF;
+  -o-text-shadow: 0px 1px #FFFFFF;
+  text-shadow: 0px 1px #FFFFFF;
 }
 
 #navigation ul li span.icon {
   background: url(../images/icons.png) no-repeat 0px 0px;
-  padding: 16px 16px 12px;
-  /*+placement:shift 17px 18px;*/
+  padding: 16px 16px 13px;
+  /*+placement:shift 17px 10px;*/
   position: relative;
   left: 17px;
-  top: 18px;
+  top: 10px;
 }
 
 #navigation ul li.custom-icon span.icon {


[28/50] [abbrv] git commit: updated refs/heads/object_store_migration to 5ec2a44

Posted by mc...@apache.org.
Extend support of CloudStack-managed storage to KVM


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

Branch: refs/heads/object_store_migration
Commit: 858ce766659101eb731c83c806892dd5d9baa976
Parents: 11441a3
Author: Mike Tutkowski <mi...@solidfire.com>
Authored: Thu Sep 19 15:44:03 2013 -0600
Committer: Mike Tutkowski <mi...@solidfire.com>
Committed: Sun Oct 27 22:30:03 2013 -0600

----------------------------------------------------------------------
 api/src/com/cloud/agent/api/to/DiskTO.java      |  36 +-
 .../src/com/cloud/agent/api/MigrateCommand.java |  11 +-
 core/src/com/cloud/agent/api/StartAnswer.java   |  11 +
 .../storage/command/AttachCommand.java          |  72 ----
 .../com/cloud/vm/VirtualMachineManagerImpl.java |  59 ++-
 .../orchestration/VolumeOrchestrator.java       |  38 +-
 .../kvm/resource/LibvirtComputingResource.java  |  63 ++--
 .../hypervisor/kvm/storage/KVMStoragePool.java  |  12 +-
 .../kvm/storage/KVMStoragePoolManager.java      | 112 +++++-
 .../kvm/storage/KVMStorageProcessor.java        |   8 +-
 .../kvm/storage/LibvirtStorageAdaptor.java      |  47 +++
 .../kvm/storage/LibvirtStoragePool.java         |  11 +
 .../hypervisor/kvm/storage/StorageAdaptor.java  |  13 +
 .../kvm/storage/iScsiAdmStorageAdaptor.java     | 373 +++++++++++++++++++
 .../kvm/storage/iScsiAdmStoragePool.java        | 167 +++++++++
 .../resource/VmwareStorageProcessor.java        |  24 +-
 .../xen/resource/CitrixResourceBase.java        | 124 +++++-
 .../xen/resource/XenServerStorageProcessor.java |  22 +-
 .../SolidFirePrimaryDataStoreLifeCycle.java     | 268 +++++++------
 .../provider/SolidFireHostListener.java         | 102 +++++
 .../SolidfirePrimaryDataStoreProvider.java      |  10 +-
 .../com/cloud/storage/VolumeApiServiceImpl.java |  43 ++-
 .../storage/listener/StoragePoolMonitor.java    |   3 +
 23 files changed, 1321 insertions(+), 308 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/858ce766/api/src/com/cloud/agent/api/to/DiskTO.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/agent/api/to/DiskTO.java b/api/src/com/cloud/agent/api/to/DiskTO.java
index 556ccd4..a577689 100644
--- a/api/src/com/cloud/agent/api/to/DiskTO.java
+++ b/api/src/com/cloud/agent/api/to/DiskTO.java
@@ -18,21 +18,35 @@
  */
 package com.cloud.agent.api.to;
 
+import java.util.Map;
+
 import com.cloud.storage.Volume;
 
 public class DiskTO {
+    public static final String CHAP_INITIATOR_USERNAME = "chapInitiatorUsername";
+    public static final String CHAP_INITIATOR_SECRET = "chapInitiatorSecret";
+    public static final String CHAP_TARGET_USERNAME = "chapTargetUsername";
+    public static final String CHAP_TARGET_SECRET = "chapTargetSecret";
+    public static final String MANAGED = "managed";
+    public static final String IQN = "iqn";
+    public static final String STORAGE_HOST = "storageHost";
+    public static final String STORAGE_PORT = "storagePort";
+    public static final String VOLUME_SIZE = "volumeSize";
+
     private DataTO data;
     private Long diskSeq;
-    private String vdiUuid;
+    private String path;
     private Volume.Type type;
+    private Map<String, String> _details;
+
     public DiskTO() {
         
     }
     
-    public DiskTO(DataTO data, Long diskSeq, String vdiUuid, Volume.Type type) {
+    public DiskTO(DataTO data, Long diskSeq, String path, Volume.Type type) {
         this.data = data;
         this.diskSeq = diskSeq;
-        this.vdiUuid = vdiUuid;
+        this.path = path;
         this.type = type;
     }
 
@@ -52,12 +66,12 @@ public class DiskTO {
         this.diskSeq = diskSeq;
     }
 
-    public String getVdiUuid() {
-        return vdiUuid;
+    public String getPath() {
+        return path;
     }
 
-    public void setVdiUuid(String vdiUuid) {
-        this.vdiUuid = vdiUuid;
+    public void setPath(String path) {
+        this.path = path;
     }
 
     public Volume.Type getType() {
@@ -67,4 +81,12 @@ public class DiskTO {
     public void setType(Volume.Type type) {
         this.type = type;
     }
+
+    public void setDetails(Map<String, String> details) {
+        _details = details;
+    }
+
+    public Map<String, String> getDetails() {
+        return _details;
+    }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/858ce766/core/src/com/cloud/agent/api/MigrateCommand.java
----------------------------------------------------------------------
diff --git a/core/src/com/cloud/agent/api/MigrateCommand.java b/core/src/com/cloud/agent/api/MigrateCommand.java
index 5042b8c..0d8f70c 100644
--- a/core/src/com/cloud/agent/api/MigrateCommand.java
+++ b/core/src/com/cloud/agent/api/MigrateCommand.java
@@ -16,26 +16,33 @@
 // under the License.
 package com.cloud.agent.api;
 
+import com.cloud.agent.api.to.VirtualMachineTO;
+
 public class MigrateCommand extends Command {
     String vmName;
     String destIp;
     String hostGuid;
     boolean isWindows;
-
+    VirtualMachineTO vmTO;
 
     protected MigrateCommand() {
     }
 
-    public MigrateCommand(String vmName, String destIp, boolean isWindows) {
+    public MigrateCommand(String vmName, String destIp, boolean isWindows, VirtualMachineTO vmTO) {
         this.vmName = vmName;
         this.destIp = destIp;
         this.isWindows = isWindows;
+        this.vmTO = vmTO;
     }
 
     public boolean isWindows() {
         return isWindows;
     }
 
+    public VirtualMachineTO getVirtualMachine() {
+        return vmTO;
+    }
+
     public String getDestinationIp() {
         return destIp;
     }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/858ce766/core/src/com/cloud/agent/api/StartAnswer.java
----------------------------------------------------------------------
diff --git a/core/src/com/cloud/agent/api/StartAnswer.java b/core/src/com/cloud/agent/api/StartAnswer.java
index 922d060..f3e75df 100644
--- a/core/src/com/cloud/agent/api/StartAnswer.java
+++ b/core/src/com/cloud/agent/api/StartAnswer.java
@@ -16,11 +16,14 @@
 // under the License.
 package com.cloud.agent.api;
 
+import java.util.Map;
+
 import com.cloud.agent.api.to.VirtualMachineTO;
 
 public class StartAnswer extends Answer {
     VirtualMachineTO vm;
     String host_guid;
+    Map<String, String> _iqnToPath;
 
     protected StartAnswer() {
     }
@@ -54,4 +57,12 @@ public class StartAnswer extends Answer {
     public String getHost_guid() {
         return host_guid;
     }
+
+    public void setIqnToPath(Map<String, String> iqnToPath) {
+        _iqnToPath = iqnToPath;
+    }
+
+    public Map<String, String> getIqnToPath() {
+        return _iqnToPath;
+    }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/858ce766/core/src/org/apache/cloudstack/storage/command/AttachCommand.java
----------------------------------------------------------------------
diff --git a/core/src/org/apache/cloudstack/storage/command/AttachCommand.java b/core/src/org/apache/cloudstack/storage/command/AttachCommand.java
index 44bce91..7e47ba4 100644
--- a/core/src/org/apache/cloudstack/storage/command/AttachCommand.java
+++ b/core/src/org/apache/cloudstack/storage/command/AttachCommand.java
@@ -24,14 +24,6 @@ import com.cloud.agent.api.to.DiskTO;
 public final class AttachCommand extends Command implements StorageSubSystemCommand {
     private DiskTO disk;
     private String vmName;
-    private String _storageHost;
-    private int _storagePort;
-    private boolean _managed;
-    private String _iScsiName;
-    private String _chapInitiatorUsername;
-    private String _chapInitiatorPassword;
-    private String _chapTargetUsername;
-    private String _chapTargetPassword;
 
     public AttachCommand(DiskTO disk, String vmName) {
         super();
@@ -59,68 +51,4 @@ public final class AttachCommand extends Command implements StorageSubSystemComm
     public void setVmName(String vmName) {
         this.vmName = vmName;
     }
-
-    public void setStorageHost(String storageHost) {
-        _storageHost = storageHost;
-    }
-
-    public String getStorageHost() {
-        return _storageHost;
-    }
-
-    public void setStoragePort(int storagePort) {
-        _storagePort = storagePort;
-    }
-
-    public int getStoragePort() {
-        return _storagePort;
-    }
-
-    public void setManaged(boolean managed) {
-        _managed = managed;
-    }
-
-    public boolean isManaged() {
-        return _managed;
-    }
-
-    public void set_iScsiName(String iScsiName) {
-        this._iScsiName = iScsiName;
-    }
-
-    public String get_iScsiName() {
-        return _iScsiName;
-    }
-
-    public void setChapInitiatorUsername(String chapInitiatorUsername) {
-        _chapInitiatorUsername = chapInitiatorUsername;
-    }
-
-    public String getChapInitiatorUsername() {
-        return _chapInitiatorUsername;
-    }
-
-    public void setChapInitiatorPassword(String chapInitiatorPassword) {
-        _chapInitiatorPassword = chapInitiatorPassword;
-    }
-
-    public String getChapInitiatorPassword() {
-        return _chapInitiatorPassword;
-    }
-
-    public void setChapTargetUsername(String chapTargetUsername) {
-        _chapTargetUsername = chapTargetUsername;
-    }
-
-    public String getChapTargetUsername() {
-        return _chapTargetUsername;
-    }
-
-    public void setChapTargetPassword(String chapTargetPassword) {
-        _chapTargetPassword = chapTargetPassword;
-    }
-
-    public String getChapTargetPassword() {
-        return _chapTargetPassword;
-    }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/858ce766/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java
----------------------------------------------------------------------
diff --git a/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java b/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java
index 0ff4446..539936f 100755
--- a/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java
+++ b/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java
@@ -51,7 +51,6 @@ import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
 import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
 import org.apache.cloudstack.storage.to.VolumeObjectTO;
 import org.apache.cloudstack.utils.identity.ManagementServerNode;
-import org.apache.log4j.Logger;
 
 import com.cloud.agent.AgentManager;
 import com.cloud.agent.Listener;
@@ -844,6 +843,8 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
 
                     VirtualMachineTO vmTO = hvGuru.implement(vmProfile);
 
+                    handlePath(vmTO.getDisks(), vm.getHypervisorType());
+
                     cmds = new Commands(Command.OnError.Stop);
                     cmds.addCommand(new StartCommand(vmTO, dest.getHost(), getExecuteInSequence()));
 
@@ -862,6 +863,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
 
                     startAnswer = cmds.getAnswer(StartAnswer.class);
                     if (startAnswer != null && startAnswer.getResult()) {
+                        handlePath(vmTO.getDisks(), startAnswer.getIqnToPath());
                         String host_guid = startAnswer.getHost_guid();
                         if (host_guid != null) {
                             HostVO finalHost = _resourceMgr.findHostByGuid(host_guid);
@@ -975,14 +977,63 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
         }
     }
 
+    // for managed storage on KVM, need to make sure the path field of the volume in question is populated with the IQN
+    private void handlePath(DiskTO[] disks, HypervisorType hypervisorType) {
+        if (hypervisorType != HypervisorType.KVM) {
+            return;
+        }
+
+        if (disks != null) {
+            for (DiskTO disk : disks) {
+                Map<String, String> details = disk.getDetails();
+                boolean isManaged = details != null && Boolean.parseBoolean(details.get(DiskTO.MANAGED));
+
+                if (isManaged && disk.getPath() == null) {
+                    Long volumeId = disk.getData().getId();
+                    VolumeVO volume = _volsDao.findById(volumeId);
+
+                    disk.setPath(volume.get_iScsiName());
+                    volume.setPath(volume.get_iScsiName());
+
+                    _volsDao.update(volumeId, volume);
+                }
+            }
+        }
+    }
+
+    // for managed storage on XenServer and VMware, need to update the DB with a path if the VDI/VMDK file was newly created
+    private void handlePath(DiskTO[] disks, Map<String, String> iqnToPath) {
+        if (disks != null) {
+            for (DiskTO disk : disks) {
+                Map<String, String> details = disk.getDetails();
+                boolean isManaged = details != null && Boolean.parseBoolean(details.get(DiskTO.MANAGED));
+
+                if (isManaged && disk.getPath() == null) {
+                    Long volumeId = disk.getData().getId();
+                    VolumeVO volume = _volsDao.findById(volumeId);
+                    String iScsiName = volume.get_iScsiName();
+                    String path = iqnToPath.get(iScsiName);
+
+                    volume.setPath(path);
+
+                    _volsDao.update(volumeId, volume);
+                }
+            }
+        }
+    }
+
     private void syncDiskChainChange(StartAnswer answer) {
         VirtualMachineTO vmSpec = answer.getVirtualMachine();
 
         for(DiskTO disk : vmSpec.getDisks()) {
             if(disk.getType() != Volume.Type.ISO) {
                 VolumeObjectTO vol = (VolumeObjectTO)disk.getData();
+                VolumeVO volume = _volsDao.findById(vol.getId());
 
-                volumeMgr.updateVolumeDiskChain(vol.getId(), vol.getPath(), vol.getChainInfo());
+                // Use getPath() from VolumeVO to get a fresh copy of what's in the DB.
+                // Before doing this, in a certain situation, getPath() from VolumeObjectTO
+                // returned null instead of an actual path (because it was out of date with the DB).
+                volumeMgr.updateVolumeDiskChain(vol.getId(), volume.getPath(), vol.getChainInfo());
             }
         }
     }
@@ -1523,7 +1574,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
         boolean migrated = false;
         try {
             boolean isWindows = _guestOsCategoryDao.findById(_guestOsDao.findById(vm.getGuestOSId()).getCategoryId()).getName().equalsIgnoreCase("Windows");
-            MigrateCommand mc = new MigrateCommand(vm.getInstanceName(), dest.getHost().getPrivateIpAddress(), isWindows);
+            MigrateCommand mc = new MigrateCommand(vm.getInstanceName(), dest.getHost().getPrivateIpAddress(), isWindows, to);
             mc.setHostGuid(dest.getHost().getGuid());
 
             try {
@@ -3150,7 +3201,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
         boolean migrated = false;
         try {
             boolean isWindows = _guestOsCategoryDao.findById(_guestOsDao.findById(vm.getGuestOSId()).getCategoryId()).getName().equalsIgnoreCase("Windows");
-            MigrateCommand mc = new MigrateCommand(vm.getInstanceName(), dest.getHost().getPrivateIpAddress(), isWindows);
+            MigrateCommand mc = new MigrateCommand(vm.getInstanceName(), dest.getHost().getPrivateIpAddress(), isWindows, to);
             mc.setHostGuid(dest.getHost().getGuid());
 
             try {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/858ce766/engine/orchestration/src/org/apache/cloudstack/engine/orchestration/VolumeOrchestrator.java
----------------------------------------------------------------------
diff --git a/engine/orchestration/src/org/apache/cloudstack/engine/orchestration/VolumeOrchestrator.java b/engine/orchestration/src/org/apache/cloudstack/engine/orchestration/VolumeOrchestrator.java
index 7d81232..0821c81 100644
--- a/engine/orchestration/src/org/apache/cloudstack/engine/orchestration/VolumeOrchestrator.java
+++ b/engine/orchestration/src/org/apache/cloudstack/engine/orchestration/VolumeOrchestrator.java
@@ -32,6 +32,7 @@ import javax.naming.ConfigurationException;
 
 import org.apache.log4j.Logger;
 import org.apache.cloudstack.engine.orchestration.service.VolumeOrchestrationService;
+import org.apache.cloudstack.engine.subsystem.api.storage.ChapInfo;
 import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
 import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
 import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotDataFactory;
@@ -886,7 +887,12 @@ public class VolumeOrchestrator extends ManagerBase implements VolumeOrchestrati
 
         for (VolumeVO vol : vols) {
             DataTO volTO = volFactory.getVolume(vol.getId()).getTO();
-            DiskTO disk = new DiskTO(volTO, vol.getDeviceId(), null, vol.getVolumeType());
+            DiskTO disk = new DiskTO(volTO, vol.getDeviceId(), vol.getPath(), vol.getVolumeType());
+            VolumeInfo volumeInfo = volFactory.getVolume(vol.getId());
+            DataStore dataStore = dataStoreMgr.getDataStore(vol.getPoolId(), DataStoreRole.Primary);
+
+            disk.setDetails(getDetails(volumeInfo, dataStore));
+
             vm.addDisk(disk);
         }
 
@@ -897,6 +903,29 @@ public class VolumeOrchestrator extends ManagerBase implements VolumeOrchestrati
         }
     }
 
+    private Map<String, String> getDetails(VolumeInfo volumeInfo, DataStore dataStore) {
+        Map<String, String> details = new HashMap<String, String>();
+
+        StoragePoolVO storagePool = _storagePoolDao.findById(dataStore.getId());
+
+        details.put(DiskTO.MANAGED, String.valueOf(storagePool.isManaged()));
+        details.put(DiskTO.STORAGE_HOST, storagePool.getHostAddress());
+        details.put(DiskTO.STORAGE_PORT, String.valueOf(storagePool.getPort()));
+        details.put(DiskTO.VOLUME_SIZE, String.valueOf(volumeInfo.getSize()));
+        details.put(DiskTO.IQN, volumeInfo.get_iScsiName());
+
+        ChapInfo chapInfo = volService.getChapInfo(volumeInfo, dataStore);
+
+        if (chapInfo != null) {
+            details.put(DiskTO.CHAP_INITIATOR_USERNAME, chapInfo.getInitiatorUsername());
+            details.put(DiskTO.CHAP_INITIATOR_SECRET, chapInfo.getInitiatorSecret());
+            details.put(DiskTO.CHAP_TARGET_USERNAME, chapInfo.getTargetUsername());
+            details.put(DiskTO.CHAP_TARGET_SECRET, chapInfo.getTargetSecret());
+        }
+
+        return details;
+    }
+
     private static enum VolumeTaskType {
         RECREATE, NOP, MIGRATE
     }
@@ -1084,7 +1113,12 @@ public class VolumeOrchestrator extends ManagerBase implements VolumeOrchestrati
                 vol = result.first();
             }
             DataTO volumeTO = volFactory.getVolume(vol.getId()).getTO();
-            DiskTO disk = new DiskTO(volumeTO, vol.getDeviceId(), null, vol.getVolumeType());
+            DiskTO disk = new DiskTO(volumeTO, vol.getDeviceId(), vol.getPath(), vol.getVolumeType());
+            VolumeInfo volumeInfo = volFactory.getVolume(vol.getId());
+            DataStore dataStore = dataStoreMgr.getDataStore(vol.getPoolId(), DataStoreRole.Primary);
+
+            disk.setDetails(getDetails(volumeInfo, dataStore));
+
             vm.addDisk(disk);
         }
     }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/858ce766/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java
index 49e3501..286d0f7 100755
--- a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java
+++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java
@@ -1203,8 +1203,6 @@ ServerResource {
                 return execute((AttachIsoCommand) cmd);
             } else if (cmd instanceof AttachVolumeCommand) {
                 return execute((AttachVolumeCommand) cmd);
-            } else if (cmd instanceof StopCommand) {
-                return execute((StopCommand) cmd);
             } else if (cmd instanceof CheckConsoleProxyLoadCommand) {
                 return execute((CheckConsoleProxyLoadCommand) cmd);
             } else if (cmd instanceof WatchConsoleProxyLoadCommand) {
@@ -2905,6 +2903,8 @@ ServerResource {
              */
             destDomain = dm.migrate(dconn, (1 << 0) | (1 << 3), xmlDesc, vmName, "tcp:"
                     + cmd.getDestinationIp(), _migrateSpeed);
+
+            _storagePoolMgr.disconnectPhysicalDisksViaVmSpec(cmd.getVirtualMachine());
         } catch (LibvirtException e) {
             s_logger.debug("Can't migrate domain: " + e.getMessage());
             result = e.getMessage();
@@ -2953,6 +2953,9 @@ ServerResource {
         }
 
         NicTO[] nics = vm.getNics();
+
+        boolean success = false;
+
         try {
             Connect conn = LibvirtConnection.getConnectionByVmName(vm.getName());
             for (NicTO nic : nics) {
@@ -2967,10 +2970,14 @@ ServerResource {
                 }
             }
 
+            _storagePoolMgr.connectPhysicalDisksViaVmSpec(vm);
+
             synchronized (_vms) {
                 _vms.put(vm.getName(), State.Migrating);
             }
 
+            success = true;
+
             return new PrepareForMigrationAnswer(cmd);
         } catch (LibvirtException e) {
             return new PrepareForMigrationAnswer(cmd, e.toString());
@@ -2978,6 +2985,10 @@ ServerResource {
             return new PrepareForMigrationAnswer(cmd, e.toString());
         } catch (URISyntaxException e) {
             return new PrepareForMigrationAnswer(cmd, e.toString());
+        } finally {
+            if (!success) {
+                _storagePoolMgr.disconnectPhysicalDisksViaVmSpec(vm);
+            }
         }
     }
 
@@ -3241,10 +3252,7 @@ ServerResource {
             String result = stopVM(conn, vmName);
             if (result == null) {
                 for (DiskDef disk : disks) {
-                    if (disk.getDeviceType() == DiskDef.deviceType.CDROM
-                            && disk.getDiskPath() != null) {
-                        cleanupDisk(conn, disk);
-                    }
+                    cleanupDisk(disk);
                 }
                 for (InterfaceDef iface: ifaces) {
                     // We don't know which "traffic type" is associated with
@@ -3517,6 +3525,8 @@ ServerResource {
 
             createVbd(conn, vmSpec, vmName, vm);
 
+            _storagePoolMgr.connectPhysicalDisksViaVmSpec(vmSpec);
+
             createVifs(vmSpec, vm);
 
             s_logger.debug("starting " + vmName + ": " + vm.toString());
@@ -3597,6 +3607,9 @@ ServerResource {
                     _vms.remove(vmName);
                 }
             }
+            if (state != State.Running) {
+                _storagePoolMgr.disconnectPhysicalDisksViaVmSpec(vmSpec);
+            }
         }
     }
 
@@ -3678,7 +3691,7 @@ ServerResource {
                     disk.defNetworkBasedDisk(physicalDisk.getPath().replace("rbd:", ""), pool.getSourceHost(), pool.getSourcePort(),
                             pool.getAuthUserName(), pool.getUuid(),
                             devId, diskBusType, diskProtocol.RBD);
-                } else if (pool.getType() == StoragePoolType.CLVM) {
+                } else if (pool.getType() == StoragePoolType.CLVM || physicalDisk.getFormat() == PhysicalDiskFormat.RAW) {
                     disk.defBlockBasedDisk(physicalDisk.getPath(), devId,
                             diskBusType);
                 } else {
@@ -3762,38 +3775,20 @@ ServerResource {
         return new CheckSshAnswer(cmd);
     }
 
-    public boolean cleanupDisk(Connect conn, DiskDef disk) {
-        // need to umount secondary storage
+    public boolean cleanupDisk(DiskDef disk) {
         String path = disk.getDiskPath();
-        String poolUuid = null;
-        if (path.endsWith("systemvm.iso")) {
-            //Don't need to clean up system vm iso, as it's stored in local
-            return true;
-        }
-        if (path != null) {
-            String[] token = path.split("/");
-            if (token.length > 3) {
-                poolUuid = token[2];
-            }
-        }
 
-        if (poolUuid == null) {
-            return true;
+        if (path == null) {
+            s_logger.debug("Unable to clean up disk with null path (perhaps empty cdrom drive):" + disk);
+            return false;
         }
 
-        try {
-            // we use libvirt as storage adaptor since we passed a libvirt
-            // connection to cleanupDisk. We pass a storage type that maps
-            // to libvirt adaptor.
-            KVMStoragePool pool = _storagePoolMgr.getStoragePool(
-                                      StoragePoolType.Filesystem, poolUuid);
-            if (pool != null) {
-                _storagePoolMgr.deleteStoragePool(pool.getType(),pool.getUuid());
-            }
+        if (path.endsWith("systemvm.iso")) {
+            // don't need to clean up system vm ISO as it's stored in local
             return true;
-        } catch (CloudRuntimeException e) {
-            return false;
         }
+
+        return _storagePoolMgr.disconnectPhysicalDiskByPath(path);
     }
 
     protected synchronized String attachOrDetachISO(Connect conn,
@@ -3823,7 +3818,7 @@ ServerResource {
         if (result == null && !isAttach) {
             for (DiskDef disk : disks) {
                 if (disk.getDeviceType() == DiskDef.deviceType.CDROM) {
-                    cleanupDisk(conn, disk);
+                    cleanupDisk(disk);
                 }
             }
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/858ce766/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/KVMStoragePool.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/KVMStoragePool.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/KVMStoragePool.java
index a1721e1..c704a4f 100644
--- a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/KVMStoragePool.java
+++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/KVMStoragePool.java
@@ -17,19 +17,23 @@
 package com.cloud.hypervisor.kvm.storage;
 
 import java.util.List;
+import java.util.Map;
 
 import org.apache.cloudstack.utils.qemu.QemuImg.PhysicalDiskFormat;
 import com.cloud.storage.Storage.StoragePoolType;
 
 public interface KVMStoragePool {
-    public KVMPhysicalDisk createPhysicalDisk(String name,
-            PhysicalDiskFormat format, long size);
+    public KVMPhysicalDisk createPhysicalDisk(String volumeUuid, PhysicalDiskFormat format, long size);
 
-    public KVMPhysicalDisk createPhysicalDisk(String name, long size);
+    public KVMPhysicalDisk createPhysicalDisk(String volumeUuid, long size);
+
+    public boolean connectPhysicalDisk(String volumeUuid, Map<String, String> details);
 
     public KVMPhysicalDisk getPhysicalDisk(String volumeUuid);
 
-    public boolean deletePhysicalDisk(String uuid);
+    public boolean disconnectPhysicalDisk(String volumeUuid);
+
+    public boolean deletePhysicalDisk(String volumeUuid);
 
     public List<KVMPhysicalDisk> listPhysicalDisks();
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/858ce766/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/KVMStoragePoolManager.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/KVMStoragePoolManager.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/KVMStoragePoolManager.java
index 945243a..9ca709c 100644
--- a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/KVMStoragePoolManager.java
+++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/KVMStoragePoolManager.java
@@ -18,6 +18,8 @@ package com.cloud.hypervisor.kvm.storage;
 
 import java.net.URI;
 import java.net.URISyntaxException;
+import java.util.List;
+import java.util.Arrays;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.HashMap;
@@ -25,14 +27,21 @@ import java.util.UUID;
 
 import org.apache.cloudstack.utils.qemu.QemuImg.PhysicalDiskFormat;
 
+import com.cloud.agent.api.to.VirtualMachineTO;
+import com.cloud.agent.api.to.DiskTO;
+
 import com.cloud.hypervisor.kvm.resource.KVMHABase;
 import com.cloud.hypervisor.kvm.resource.KVMHABase.PoolType;
 import com.cloud.hypervisor.kvm.resource.KVMHAMonitor;
 import com.cloud.storage.Storage.StoragePoolType;
 import com.cloud.storage.StorageLayer;
+import com.cloud.storage.Volume;
 import com.cloud.utils.exception.CloudRuntimeException;
 import org.apache.log4j.Logger;
 
+import org.apache.cloudstack.storage.to.PrimaryDataStoreTO;
+import org.apache.cloudstack.storage.to.VolumeObjectTO;
+
 public class KVMStoragePoolManager {
     private static final Logger s_logger = Logger
             .getLogger(KVMStoragePoolManager.class);
@@ -62,7 +71,6 @@ public class KVMStoragePoolManager {
             this.poolType = poolType;
         }
     }
-    private StorageAdaptor _storageAdaptor;
     private KVMHAMonitor _haMonitor;
     private final Map<String, StoragePoolInformation> _storagePools = new ConcurrentHashMap<String, StoragePoolInformation>();
     private final Map<String, StorageAdaptor> _storageMapper = new HashMap<String, StorageAdaptor>();
@@ -89,11 +97,102 @@ public class KVMStoragePoolManager {
     }
 
     public KVMStoragePoolManager(StorageLayer storagelayer, KVMHAMonitor monitor) {
-        this._storageAdaptor = new LibvirtStorageAdaptor(storagelayer);
         this._haMonitor = monitor;
         this._storageMapper.put("libvirt", new LibvirtStorageAdaptor(storagelayer));
         // add other storage adaptors here
-	// this._storageMapper.put("newadaptor", new NewStorageAdaptor(storagelayer));
+        // this._storageMapper.put("newadaptor", new NewStorageAdaptor(storagelayer));
+        this._storageMapper.put(StoragePoolType.Iscsi.toString(), new iScsiAdmStorageAdaptor());
+    }
+
+    public boolean connectPhysicalDisk(StoragePoolType type, String poolUuid, String volPath, Map<String, String> details) {
+        StorageAdaptor adaptor = getStorageAdaptor(type);
+        KVMStoragePool pool = adaptor.getStoragePool(poolUuid);
+
+        return adaptor.connectPhysicalDisk(volPath, pool, details);
+    }
+
+    public boolean connectPhysicalDisksViaVmSpec(VirtualMachineTO vmSpec) {
+        boolean result = false;
+
+        final String vmName = vmSpec.getName();
+
+        List<DiskTO> disks = Arrays.asList(vmSpec.getDisks());
+
+        for (DiskTO disk : disks) {
+            if (disk.getType() != Volume.Type.ISO) {
+                VolumeObjectTO vol = (VolumeObjectTO) disk.getData();
+                PrimaryDataStoreTO store = (PrimaryDataStoreTO) vol.getDataStore();
+                KVMStoragePool pool = getStoragePool(store.getPoolType(), store.getUuid());
+
+                StorageAdaptor adaptor = getStorageAdaptor(pool.getType());
+
+                result = adaptor.connectPhysicalDisk(vol.getPath(), pool, disk.getDetails());
+
+                if (!result) {
+                    s_logger.error("Failed to connect disks via vm spec for vm: " + vmName + " volume:" + vol.toString());
+
+                    return result;
+                }
+            }
+        }
+
+        return result;
+    }
+
+    public boolean disconnectPhysicalDiskByPath(String path) {
+        for (Map.Entry<String, StorageAdaptor> set : _storageMapper.entrySet()) {
+            StorageAdaptor adaptor = set.getValue();
+
+            if (adaptor.disconnectPhysicalDiskByPath(path)) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+    public boolean disconnectPhysicalDisksViaVmSpec(VirtualMachineTO vmSpec) {
+        if (vmSpec == null) {
+            /* CloudStack often tries to stop VMs that shouldn't be running, to ensure a known state,
+               for example if we lose communication with the agent and the VM is brought up elsewhere.
+               We may not know about these yet. This might mean that we can't use the vmspec map, because
+               when we restart the agent we lose all of the info about running VMs. */
+
+            s_logger.debug("disconnectPhysicalDiskViaVmSpec: Attempted to stop a VM that is not yet in our hash map");
+
+            return true;
+        }
+
+        boolean result = true;
+
+        final String vmName = vmSpec.getName();
+
+        List<DiskTO> disks = Arrays.asList(vmSpec.getDisks());
+
+        for (DiskTO disk : disks) {
+            if (disk.getType() != Volume.Type.ISO) {
+                s_logger.debug("Disconnecting disk " + disk.getPath());
+
+                VolumeObjectTO vol = (VolumeObjectTO) disk.getData();
+                PrimaryDataStoreTO store = (PrimaryDataStoreTO) vol.getDataStore();
+
+                KVMStoragePool pool = getStoragePool(store.getPoolType(), store.getUuid());
+
+                StorageAdaptor adaptor = getStorageAdaptor(pool.getType());
+
+                // if a disk fails to disconnect, still try to disconnect remaining
+
+                boolean subResult = adaptor.disconnectPhysicalDisk(vol.getPath(), pool);
+
+                if (!subResult) {
+                    s_logger.error("Failed to disconnect disks via vm spec for vm: " + vmName + " volume:" + vol.toString());
+
+                    result = false;
+                }
+            }
+        }
+
+        return result;
     }
 
     public KVMStoragePool getStoragePool(StoragePoolType type, String uuid) {
@@ -197,6 +296,13 @@ public class KVMStoragePoolManager {
         return pool;
     }
 
+    public boolean disconnectPhysicalDisk(StoragePoolType type, String poolUuid, String volPath) {
+        StorageAdaptor adaptor = getStorageAdaptor(type);
+        KVMStoragePool pool = adaptor.getStoragePool(poolUuid);
+
+        return adaptor.disconnectPhysicalDisk(volPath, pool);
+    }
+
     public boolean deleteStoragePool(StoragePoolType type, String uuid) {
         StorageAdaptor adaptor = getStorageAdaptor(type);
         _haMonitor.removeStoragePool(uuid);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/858ce766/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/KVMStorageProcessor.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/KVMStorageProcessor.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/KVMStorageProcessor.java
index 04bdd76..8b8cd9e 100644
--- a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/KVMStorageProcessor.java
+++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/KVMStorageProcessor.java
@@ -828,7 +828,7 @@ public class KVMStorageProcessor implements StorageProcessor {
         if (result == null && !isAttach) {
             for (DiskDef disk : disks) {
                 if (disk.getDeviceType() == DiskDef.deviceType.CDROM) {
-                    this.resource.cleanupDisk(conn, disk);
+                    this.resource.cleanupDisk(disk);
                 }
             }
 
@@ -972,6 +972,9 @@ public class KVMStorageProcessor implements StorageProcessor {
         String vmName = cmd.getVmName();
         try {
             Connect conn = LibvirtConnection.getConnectionByVmName(vmName);
+
+            storagePoolMgr.connectPhysicalDisk(primaryStore.getPoolType(), primaryStore.getUuid(), vol.getPath(), disk.getDetails());
+
             KVMPhysicalDisk phyDisk = storagePoolMgr.getPhysicalDisk(primaryStore.getPoolType(), primaryStore.getUuid(), vol.getPath());
 
             attachOrDetachDisk(conn, true, vmName, phyDisk, disk.getDiskSeq().intValue());
@@ -994,10 +997,13 @@ public class KVMStorageProcessor implements StorageProcessor {
         String vmName = cmd.getVmName();
         try {
             Connect conn = LibvirtConnection.getConnectionByVmName(vmName);
+
             KVMPhysicalDisk phyDisk = storagePoolMgr.getPhysicalDisk(primaryStore.getPoolType(), primaryStore.getUuid(), vol.getPath());
 
             attachOrDetachDisk(conn, false, vmName, phyDisk, disk.getDiskSeq().intValue());
 
+            storagePoolMgr.disconnectPhysicalDisk(primaryStore.getPoolType(), primaryStore.getUuid(), vol.getPath());
+
             return new DettachAnswer(disk);
         } catch (LibvirtException e) {
             s_logger.debug("Failed to attach volume: " + vol.getPath() + ", due to " + e.toString());

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/858ce766/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/LibvirtStorageAdaptor.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/LibvirtStorageAdaptor.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/LibvirtStorageAdaptor.java
index e04297e..8ef855e 100644
--- a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/LibvirtStorageAdaptor.java
+++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/LibvirtStorageAdaptor.java
@@ -707,6 +707,53 @@ public class LibvirtStorageAdaptor implements StorageAdaptor {
     }
 
     @Override
+    public boolean connectPhysicalDisk(String name, KVMStoragePool pool, Map<String, String> details) {
+        // this is for managed storage that needs to prep disks prior to use
+        return true;
+    }
+
+    @Override
+    public boolean disconnectPhysicalDisk(String uuid, KVMStoragePool pool) {
+        // this is for managed storage that needs to cleanup disks after use
+        return true;
+    }
+
+    @Override
+    public boolean disconnectPhysicalDiskByPath(String localPath) {
+        // we've only ever cleaned up ISOs that are NFS mounted
+
+        String poolUuid = null;
+
+        if (localPath != null && localPath.startsWith(_mountPoint)) {
+            String[] token = localPath.split("/");
+
+            if (token.length > 3) {
+                poolUuid = token[2];
+            }
+        } else {
+            return false;
+        }
+
+        if (poolUuid == null) {
+            return false;
+        }
+
+        try {
+            Connect conn = LibvirtConnection.getConnection();
+
+            StoragePool pool = conn.storagePoolLookupByUUIDString(poolUuid);
+
+            deleteStoragePool(poolUuid);
+
+            return true;
+        } catch (LibvirtException ex) {
+            return false;
+        } catch (CloudRuntimeException ex) {
+            return false;
+        }
+    }
+
+    @Override
     public boolean deletePhysicalDisk(String uuid, KVMStoragePool pool) {
 
         /**

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/858ce766/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/LibvirtStoragePool.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/LibvirtStoragePool.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/LibvirtStoragePool.java
index c0e1000..df0af5f 100644
--- a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/LibvirtStoragePool.java
+++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/LibvirtStoragePool.java
@@ -18,6 +18,7 @@ package com.cloud.hypervisor.kvm.storage;
 
 import java.io.File;
 import java.util.List;
+import java.util.Map;
 
 import com.cloud.utils.exception.CloudRuntimeException;
 import org.apache.cloudstack.utils.qemu.QemuImg.PhysicalDiskFormat;
@@ -154,6 +155,16 @@ public class LibvirtStoragePool implements KVMStoragePool {
     }
 
     @Override
+    public boolean connectPhysicalDisk(String name, Map<String, String> details) {
+        return true;
+    }
+
+    @Override
+    public boolean disconnectPhysicalDisk(String uuid) {
+        return true;
+    }
+
+    @Override
     public boolean deletePhysicalDisk(String uuid) {
         return this._storageAdaptor.deletePhysicalDisk(uuid, this);
     }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/858ce766/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/StorageAdaptor.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/StorageAdaptor.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/StorageAdaptor.java
index 44e0691..c5ff421 100644
--- a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/StorageAdaptor.java
+++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/StorageAdaptor.java
@@ -17,6 +17,7 @@
 package com.cloud.hypervisor.kvm.storage;
 
 import java.util.List;
+import java.util.Map;
 
 import org.apache.cloudstack.utils.qemu.QemuImg.PhysicalDiskFormat;
 import com.cloud.storage.Storage.StoragePoolType;
@@ -25,6 +26,8 @@ public interface StorageAdaptor {
 
     public KVMStoragePool getStoragePool(String uuid);
 
+    // given disk path (per database) and pool, create new KVMPhysicalDisk, populate
+    // it with info from local disk, and return it
     public KVMPhysicalDisk getPhysicalDisk(String volumeUuid,
             KVMStoragePool pool);
 
@@ -36,6 +39,16 @@ public interface StorageAdaptor {
     public KVMPhysicalDisk createPhysicalDisk(String name, KVMStoragePool pool,
             PhysicalDiskFormat format, long size);
 
+    // given disk path (per database) and pool, prepare disk on host
+    public boolean connectPhysicalDisk(String volumePath, KVMStoragePool pool, Map<String, String> details);
+
+    // given disk path (per database) and pool, clean up disk on host
+    public boolean disconnectPhysicalDisk(String volumePath, KVMStoragePool pool);
+
+    // given local path to file/device (per Libvirt XML), 1) check that device is
+    // handled by your adaptor, return false if not. 2) clean up device, return true
+    public boolean disconnectPhysicalDiskByPath(String localPath);
+
     public boolean deletePhysicalDisk(String uuid, KVMStoragePool pool);
 
     public KVMPhysicalDisk createDiskFromTemplate(KVMPhysicalDisk template,

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/858ce766/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/iScsiAdmStorageAdaptor.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/iScsiAdmStorageAdaptor.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/iScsiAdmStorageAdaptor.java
new file mode 100644
index 0000000..476a727
--- /dev/null
+++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/iScsiAdmStorageAdaptor.java
@@ -0,0 +1,373 @@
+// 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.hypervisor.kvm.storage;
+
+import java.util.List;
+import java.util.Map;
+import java.util.HashMap;
+
+import org.apache.log4j.Logger;
+import org.apache.cloudstack.utils.qemu.QemuImg.PhysicalDiskFormat;
+
+import com.cloud.agent.api.to.DiskTO;
+import com.cloud.storage.Storage.StoragePoolType;
+import com.cloud.utils.StringUtils;
+import com.cloud.utils.exception.CloudRuntimeException;
+import com.cloud.utils.script.OutputInterpreter;
+import com.cloud.utils.script.Script;
+
+public class iScsiAdmStorageAdaptor implements StorageAdaptor {
+    private static final Logger s_logger = Logger.getLogger(iScsiAdmStorageAdaptor.class);
+
+    private static final Map<String, KVMStoragePool> _mapStorageUuidToStoragePool = new HashMap<String, KVMStoragePool>();
+
+    @Override
+    public KVMStoragePool createStoragePool(String uuid, String host, int port, String path, String userInfo, StoragePoolType storagePoolType) {
+        iScsiAdmStoragePool storagePool = new iScsiAdmStoragePool(uuid, host, port, storagePoolType, this);
+
+        _mapStorageUuidToStoragePool.put(uuid, storagePool);
+
+        return storagePool;
+    }
+
+    @Override
+    public KVMStoragePool getStoragePool(String uuid) {
+        return _mapStorageUuidToStoragePool.get(uuid);
+    }
+
+    @Override
+    public boolean deleteStoragePool(String uuid) {
+        return _mapStorageUuidToStoragePool.remove(uuid) != null;
+    }
+
+    @Override
+    public boolean deleteStoragePool(KVMStoragePool pool) {
+        return deleteStoragePool(pool.getUuid());
+    }
+
+    // called from LibvirtComputingResource.execute(CreateCommand)
+    // does not apply for iScsiAdmStorageAdaptor
+    @Override
+    public KVMPhysicalDisk createPhysicalDisk(String volumeUuid, KVMStoragePool pool, PhysicalDiskFormat format, long size) {
+        throw new UnsupportedOperationException("Creating a physical disk is not supported.");
+    }
+
+    @Override
+    public boolean connectPhysicalDisk(String volumeUuid, KVMStoragePool pool, Map<String, String> details) {
+        // ex. sudo iscsiadm -m node -T iqn.2012-03.com.test:volume1 -p 192.168.233.10:3260 -o new
+        Script iScsiAdmCmd = new Script(true, "iscsiadm", 0, s_logger);
+
+        iScsiAdmCmd.add("-m", "node");
+        iScsiAdmCmd.add("-T", getIqn(volumeUuid));
+        iScsiAdmCmd.add("-p", pool.getSourceHost() + ":" + pool.getSourcePort());
+        iScsiAdmCmd.add("-o", "new");
+
+        String result = iScsiAdmCmd.execute();
+
+        if (result != null) {
+            s_logger.debug("Failed to add iSCSI target " + volumeUuid);
+            System.out.println("Failed to add iSCSI target " + volumeUuid);
+
+            return false;
+        }
+        else {
+            s_logger.debug("Successfully added iSCSI target " + volumeUuid);
+            System.out.println("Successfully added to iSCSI target " + volumeUuid);
+        }
+
+        String chapInitiatorUsername = details.get(DiskTO.CHAP_INITIATOR_USERNAME);
+        String chapInitiatorSecret = details.get(DiskTO.CHAP_INITIATOR_SECRET);
+
+        if (StringUtils.isNotBlank(chapInitiatorUsername) && StringUtils.isNotBlank(chapInitiatorSecret)) {
+            try {
+                // ex. sudo iscsiadm -m node -T iqn.2012-03.com.test:volume1 -p 192.168.233.10:3260 --op update -n node.session.auth.authmethod -v CHAP
+                executeChapCommand(volumeUuid, pool, "node.session.auth.authmethod", "CHAP", null);
+
+                // ex. sudo iscsiadm -m node -T iqn.2012-03.com.test:volume1 -p 192.168.233.10:3260 --op update -n node.session.auth.username -v username
+                executeChapCommand(volumeUuid, pool, "node.session.auth.username", chapInitiatorUsername, "username");
+
+                // ex. sudo iscsiadm -m node -T iqn.2012-03.com.test:volume1 -p 192.168.233.10:3260 --op update -n node.session.auth.password -v password
+                executeChapCommand(volumeUuid, pool, "node.session.auth.password", chapInitiatorSecret, "password");
+            }
+            catch (Exception ex) {
+                return false;
+            }
+        }
+
+        // ex. sudo iscsiadm -m node -T iqn.2012-03.com.test:volume1 -p 192.168.233.10 --login
+        iScsiAdmCmd = new Script(true, "iscsiadm", 0, s_logger);
+
+        iScsiAdmCmd.add("-m", "node");
+        iScsiAdmCmd.add("-T", getIqn(volumeUuid));
+        iScsiAdmCmd.add("-p", pool.getSourceHost() + ":" + pool.getSourcePort());
+        iScsiAdmCmd.add("--login");
+
+        result = iScsiAdmCmd.execute();
+
+        if (result != null) {
+            s_logger.debug("Failed to log in to iSCSI target " + volumeUuid);
+            System.out.println("Failed to log in to iSCSI target " + volumeUuid);
+
+            return false;
+        }
+        else {
+            s_logger.debug("Successfully logged in to iSCSI target " + volumeUuid);
+            System.out.println("Successfully logged in to iSCSI target " + volumeUuid);
+        }
+
+        // There appears to be a race condition where logging in to the iSCSI volume via iscsiadm
+        // returns success before the device has been added to the OS.
+        // What happens is you get logged in and the device shows up, but the device may not
+        // show up before we invoke Libvirt to attach the device to a VM.
+        // waitForDiskToBecomeAvailable(String, KVMStoragePool) invokes blockdev
+        // via getPhysicalDisk(String, KVMStoragePool) and checks if the size came back greater
+        // than 0.
+        // After a certain number of tries and a certain waiting period in between tries,
+        // this method could still return (it should not block indefinitely) (the race condition
+        // isn't solved here, but made highly unlikely to be a problem).
+        waitForDiskToBecomeAvailable(volumeUuid, pool);
+
+        return true;
+    }
+
+    private void waitForDiskToBecomeAvailable(String volumeUuid, KVMStoragePool pool) {
+        int numberOfTries = 10;
+        int timeBetweenTries = 1000;
+
+        while (getPhysicalDisk(volumeUuid, pool).getSize() == 0 && numberOfTries > 0) {
+            numberOfTries--;
+
+            try {
+                Thread.sleep(timeBetweenTries);
+            }
+            catch (Exception ex) {
+                // don't do anything
+            }
+        }
+    }
+
+    private void executeChapCommand(String path, KVMStoragePool pool, String nParameter, String vParameter, String detail) throws Exception {
+        Script iScsiAdmCmd = new Script(true, "iscsiadm", 0, s_logger);
+
+        iScsiAdmCmd.add("-m", "node");
+        iScsiAdmCmd.add("-T", getIqn(path));
+        iScsiAdmCmd.add("-p", pool.getSourceHost() + ":" + pool.getSourcePort());
+        iScsiAdmCmd.add("--op", "update");
+        iScsiAdmCmd.add("-n", nParameter);
+        iScsiAdmCmd.add("-v", vParameter);
+
+        String result = iScsiAdmCmd.execute();
+
+        boolean useDetail = detail != null && detail.trim().length() > 0;
+
+        detail = useDetail ? detail.trim() + " " : detail;
+
+        if (result != null) {
+            s_logger.debug("Failed to execute CHAP " + (useDetail ? detail : "") + "command for iSCSI target " + path + " : message = " + result);
+            System.out.println("Failed to execute CHAP " + (useDetail ? detail : "") + "command for iSCSI target " + path + " : message = " + result);
+
+            throw new Exception("Failed to execute CHAP " + (useDetail ? detail : "") + "command for iSCSI target " + path + " : message = " + result);
+        } else {
+            s_logger.debug("CHAP " + (useDetail ? detail : "") + "command executed successfully for iSCSI target " + path);
+            System.out.println("CHAP " + (useDetail ? detail : "") + "command executed successfully for iSCSI target " + path);
+        }
+    }
+
+    // example by-path: /dev/disk/by-path/ip-192.168.233.10:3260-iscsi-iqn.2012-03.com.solidfire:storagepool2-lun-0
+    private String getByPath(String host, String path) {
+        return "/dev/disk/by-path/ip-" + host + "-iscsi-" + getIqn(path) + "-lun-" + getLun(path);
+    }
+
+    @Override
+    public KVMPhysicalDisk getPhysicalDisk(String volumeUuid, KVMStoragePool pool) {
+        String deviceByPath = getByPath(pool.getSourceHost() + ":" + pool.getSourcePort(), volumeUuid);
+        KVMPhysicalDisk physicalDisk = new KVMPhysicalDisk(deviceByPath, volumeUuid, pool);
+
+        physicalDisk.setFormat(PhysicalDiskFormat.RAW);
+
+        long deviceSize = getDeviceSize(deviceByPath);
+
+        physicalDisk.setSize(deviceSize);
+        physicalDisk.setVirtualSize(deviceSize);
+
+        return physicalDisk;
+    }
+
+    private long getDeviceSize(String deviceByPath) {
+        Script iScsiAdmCmd = new Script(true, "blockdev", 0, s_logger);
+
+        iScsiAdmCmd.add("--getsize64", deviceByPath);
+
+        OutputInterpreter.OneLineParser parser = new OutputInterpreter.OneLineParser();
+
+        String result = iScsiAdmCmd.execute(parser);
+
+        if (result != null) {
+            s_logger.warn("Unable to retrieve the size of device " + deviceByPath);
+
+            return 0;
+        }
+
+        return Long.parseLong(parser.getLine());
+    }
+
+    private static String getIqn(String path) {
+        return getComponent(path, 1);
+    }
+
+    private static String getLun(String path) {
+        return getComponent(path, 2);
+    }
+
+    private static String getComponent(String path, int index) {
+        String[] tmp = path.split("/");
+
+        if (tmp.length != 3) {
+            String msg = "Wrong format for iScsi path: " + path + ". It should be formatted as '/targetIQN/LUN'.";
+
+            s_logger.warn(msg);
+
+            throw new CloudRuntimeException(msg);
+        }
+
+        return tmp[index].trim();
+    }
+
+    public boolean disconnectPhysicalDisk(String host, int port, String iqn, String lun) {
+        // use iscsiadm to log out of the iSCSI target and un-discover it
+
+        // ex. sudo iscsiadm -m node -T iqn.2012-03.com.test:volume1 -p 192.168.233.10 --logout
+        Script iScsiAdmCmd = new Script(true, "iscsiadm", 0, s_logger);
+
+        iScsiAdmCmd.add("-m", "node");
+        iScsiAdmCmd.add("-T", iqn);
+        iScsiAdmCmd.add("-p", host + ":" + port);
+        iScsiAdmCmd.add("--logout");
+
+        String result = iScsiAdmCmd.execute();
+
+        if (result != null) {
+            s_logger.debug("Failed to log out of iSCSI target /" + iqn + "/" + lun + " : message = " + result);
+            System.out.println("Failed to log out of iSCSI target /" + iqn + "/" + lun + " : message = " + result);
+
+            return false;
+        }
+        else {
+            s_logger.debug("Successfully logged out of iSCSI target /" + iqn + "/" + lun);
+            System.out.println("Successfully logged out of iSCSI target /" + iqn + "/" + lun);
+        }
+
+        // ex. sudo iscsiadm -m node -T iqn.2012-03.com.test:volume1 -p 192.168.233.10:3260 -o delete
+        iScsiAdmCmd = new Script(true, "iscsiadm", 0, s_logger);
+
+        iScsiAdmCmd.add("-m", "node");
+        iScsiAdmCmd.add("-T", iqn);
+        iScsiAdmCmd.add("-p", host + ":" + port);
+        iScsiAdmCmd.add("-o", "delete");
+
+        result = iScsiAdmCmd.execute();
+
+        if (result != null) {
+            s_logger.debug("Failed to remove iSCSI target /" + iqn + "/" + lun + " : message = " + result);
+            System.out.println("Failed to remove iSCSI target /" + iqn + "/" + lun + " : message = " + result);
+
+            return false;
+        } else {
+            s_logger.debug("Removed iSCSI target /" + iqn + "/" + lun);
+            System.out.println("Removed iSCSI target /" + iqn + "/" + lun);
+        }
+
+        return true;
+    }
+
+    @Override
+    public boolean disconnectPhysicalDisk(String volumeUuid, KVMStoragePool pool) {
+        return disconnectPhysicalDisk(pool.getSourceHost(), pool.getSourcePort(), getIqn(volumeUuid), getLun(volumeUuid));
+    }
+
+    @Override
+    public boolean disconnectPhysicalDiskByPath(String localPath) {
+        String search1 = "/dev/disk/by-path/ip-";
+        String search2 = ":";
+        String search3 = "-iscsi-";
+        String search4 = "-lun-";
+
+        if (localPath.indexOf(search3) == -1) {
+            // this volume doesn't below to this adaptor, so just return true
+            return true;
+        }
+
+        int index = localPath.indexOf(search2);
+
+        String host = localPath.substring(search1.length(), index);
+
+        int index2 = localPath.indexOf(search3);
+
+        String port = localPath.substring(index + search2.length(), index2);
+
+        index = localPath.indexOf(search4);
+
+        String iqn = localPath.substring(index2 + search3.length(), index);
+
+        String lun = localPath.substring(index + search4.length());
+
+        return disconnectPhysicalDisk(host, Integer.parseInt(port), iqn, lun);
+    }
+
+    @Override
+    public boolean deletePhysicalDisk(String volumeUuid, KVMStoragePool pool) {
+        throw new UnsupportedOperationException("Deleting a physical disk is not supported.");
+    }
+
+    // does not apply for iScsiAdmStorageAdaptor
+    @Override
+    public List<KVMPhysicalDisk> listPhysicalDisks(String storagePoolUuid, KVMStoragePool pool) {
+        throw new UnsupportedOperationException("Listing disks is not supported for this configuration.");
+    }
+
+    @Override
+    public KVMPhysicalDisk createDiskFromTemplate(KVMPhysicalDisk template, String name, PhysicalDiskFormat format, long size,
+            KVMStoragePool destPool, int timeout) {
+        throw new UnsupportedOperationException("Creating a disk from a template is not yet supported for this configuration.");
+    }
+
+    @Override
+    public KVMPhysicalDisk createTemplateFromDisk(KVMPhysicalDisk disk, String name, PhysicalDiskFormat format,
+            long size, KVMStoragePool destPool) {
+        throw new UnsupportedOperationException("Creating a template from a disk is not yet supported for this configuration.");
+    }
+
+    @Override
+    public KVMPhysicalDisk copyPhysicalDisk(KVMPhysicalDisk disk, String name, KVMStoragePool destPool, int timeout) {
+        throw new UnsupportedOperationException("Copying a disk is not supported in this configuration.");
+    }
+
+    @Override
+    public KVMPhysicalDisk createDiskFromSnapshot(KVMPhysicalDisk snapshot, String snapshotName, String name, KVMStoragePool destPool) {
+        throw new UnsupportedOperationException("Creating a disk from a snapshot is not supported in this configuration.");
+    }
+
+    @Override
+    public boolean refresh(KVMStoragePool pool) {
+        return true;
+    }
+
+    @Override
+    public boolean createFolder(String uuid, String path) {
+        throw new UnsupportedOperationException("A folder cannot be created in this configuration.");
+    }
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/858ce766/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/iScsiAdmStoragePool.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/iScsiAdmStoragePool.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/iScsiAdmStoragePool.java
new file mode 100644
index 0000000..3808815
--- /dev/null
+++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/iScsiAdmStoragePool.java
@@ -0,0 +1,167 @@
+// 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.hypervisor.kvm.storage;
+
+import java.util.List;
+import java.util.Map;
+
+import org.apache.cloudstack.utils.qemu.QemuImg.PhysicalDiskFormat;
+
+import com.cloud.storage.Storage.StoragePoolType;
+
+public class iScsiAdmStoragePool implements KVMStoragePool {
+    private String _uuid;
+    private String _sourceHost;
+    private int _sourcePort;
+    private StoragePoolType _storagePoolType;
+    private StorageAdaptor _storageAdaptor;
+    private String _authUsername;
+    private String _authSecret;
+    private String _sourceDir;
+    private String _localPath;
+
+    public iScsiAdmStoragePool(String uuid, String host, int port, StoragePoolType storagePoolType, StorageAdaptor storageAdaptor) {
+        _uuid = uuid;
+        _sourceHost = host;
+        _sourcePort = port;
+        _storagePoolType = storagePoolType;
+        _storageAdaptor = storageAdaptor;
+    }
+
+    @Override
+    public String getUuid() {
+        return _uuid;
+    }
+
+    @Override
+    public String getSourceHost() {
+        return _sourceHost;
+    }
+
+    @Override
+    public int getSourcePort() {
+        return _sourcePort;
+    }
+
+    @Override
+    public long getCapacity() {
+        return 0;
+    }
+
+    @Override
+    public long getUsed() {
+        return 0;
+    }
+
+    @Override
+    public long getAvailable() {
+        return 0;
+    }
+
+    @Override
+    public StoragePoolType getType() {
+        return _storagePoolType;
+    }
+
+    @Override
+    public PhysicalDiskFormat getDefaultFormat() {
+        return PhysicalDiskFormat.RAW;
+    }
+
+    // called from LibvirtComputingResource.copyPhysicalDisk(KVMPhysicalDisk, String, KVMStoragePool) and
+    // from LibvirtComputingResource.createDiskFromTemplate(KVMPhysicalDisk, String, PhysicalDiskFormat, long, KVMStoragePool)
+    // does not apply for iScsiAdmStoragePool
+    @Override
+    public KVMPhysicalDisk createPhysicalDisk(String name, PhysicalDiskFormat format, long size) {
+        throw new UnsupportedOperationException("Creating a physical disk is not supported.");
+    }
+
+    // called from LibvirtComputingResource.execute(CreateCommand) and
+    // from KVMStorageProcessor.createVolume(CreateObjectCommand)
+    // does not apply for iScsiAdmStoragePool
+    @Override
+    public KVMPhysicalDisk createPhysicalDisk(String name, long size) {
+        throw new UnsupportedOperationException("Creating a physical disk is not supported.");
+    }
+
+    @Override
+    public boolean connectPhysicalDisk(String name, Map<String, String> details) {
+        return this._storageAdaptor.connectPhysicalDisk(name, this, details);
+    }
+
+    @Override
+    public KVMPhysicalDisk getPhysicalDisk(String volumeUuid) {
+        return this._storageAdaptor.getPhysicalDisk(volumeUuid, this);
+    }
+
+    @Override
+    public boolean disconnectPhysicalDisk(String volumeUuid) {
+        return this._storageAdaptor.disconnectPhysicalDisk(volumeUuid, this);
+    }
+
+    @Override
+    public boolean deletePhysicalDisk(String volumeUuid) {
+        return this._storageAdaptor.deletePhysicalDisk(volumeUuid, this);
+    }
+
+    // does not apply for iScsiAdmStoragePool
+    @Override
+    public List<KVMPhysicalDisk> listPhysicalDisks() {
+        return this._storageAdaptor.listPhysicalDisks(_uuid, this);
+    }
+
+    // does not apply for iScsiAdmStoragePool
+    @Override
+    public boolean refresh() {
+        return this._storageAdaptor.refresh(this);
+    }
+
+    @Override
+    public boolean delete() {
+        return this._storageAdaptor.deleteStoragePool(this);
+    }
+
+    @Override
+    public boolean createFolder(String path) {
+        return this._storageAdaptor.createFolder(_uuid, path);
+    }
+
+    @Override
+    public boolean isExternalSnapshot() {
+        return false;
+    }
+
+    @Override
+    public String getAuthUserName() {
+        return _authUsername;
+    }
+
+    @Override
+    public String getAuthSecret() {
+        return _authSecret;
+    }
+
+    @Override
+    public String getSourceDir() {
+        return _sourceDir;
+    }
+
+    @Override
+    public String getLocalPath() {
+        return _localPath;
+    }
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/858ce766/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareStorageProcessor.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareStorageProcessor.java b/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareStorageProcessor.java
index 34bfe18..53bd144 100644
--- a/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareStorageProcessor.java
+++ b/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareStorageProcessor.java
@@ -1164,19 +1164,16 @@ public class VmwareStorageProcessor implements StorageProcessor {
 
     @Override
     public Answer attachVolume(AttachCommand cmd) {
-        return this.attachVolume(cmd, cmd.getDisk(), true, cmd.isManaged(), cmd.getVmName(), cmd.get_iScsiName(),
-                cmd.getStorageHost(), cmd.getStoragePort(), cmd.getChapInitiatorUsername(), cmd.getChapInitiatorPassword(),
-                cmd.getChapTargetUsername(), cmd.getChapTargetPassword());
-    }
+        Map<String, String> details = cmd.getDisk().getDetails();
+        boolean isManaged = Boolean.parseBoolean(details.get(DiskTO.MANAGED));
+        String iScsiName = details.get(DiskTO.IQN);
+        String storageHost = details.get(DiskTO.STORAGE_HOST);
+        int storagePort = Integer.parseInt(details.get(DiskTO.STORAGE_PORT));
 
-    private Answer attachVolume(Command cmd, DiskTO disk, boolean isAttach, boolean isManaged, String vmName, String iScsiName, String storageHost, int storagePort) {
-        return attachVolume(cmd, disk, isAttach, isManaged, vmName, iScsiName, storageHost, storagePort, null, null, null, null);
+        return this.attachVolume(cmd, cmd.getDisk(), true, isManaged, cmd.getVmName(), iScsiName, storageHost, storagePort);
     }
 
-    private Answer attachVolume(Command cmd, DiskTO disk, boolean isAttach, boolean isManaged, String vmName,
-            String iScsiName, String storageHost, int storagePort, String initiatorUsername, String initiatorPassword,
-            String targetUsername, String targetPassword) {
-
+    private Answer attachVolume(Command cmd, DiskTO disk, boolean isAttach, boolean isManaged, String vmName, String iScsiName, String storageHost, int storagePort) {
         VolumeObjectTO volumeTO = (VolumeObjectTO)disk.getData();
         PrimaryDataStoreTO primaryStore = (PrimaryDataStoreTO)volumeTO.getDataStore();
         try {
@@ -1191,8 +1188,11 @@ public class VmwareStorageProcessor implements StorageProcessor {
             ManagedObjectReference morDs = null;
 
             if (isAttach && isManaged) {
+                Map<String, String> details = disk.getDetails();
+
                 morDs = hostService.getVmfsDatastore(hyperHost, VmwareResource.getDatastoreName(iScsiName), storageHost, storagePort,
-                            VmwareResource.trimIqn(iScsiName), initiatorUsername, initiatorPassword, targetUsername, targetPassword);
+                            VmwareResource.trimIqn(iScsiName),  details.get(DiskTO.CHAP_INITIATOR_USERNAME), details.get(DiskTO.CHAP_INITIATOR_SECRET),
+                            details.get(DiskTO.CHAP_TARGET_USERNAME), details.get(DiskTO.CHAP_TARGET_SECRET));
 
                 DatastoreMO dsMo = new DatastoreMO(hostService.getServiceContext(null), morDs);
 
@@ -1236,7 +1236,7 @@ public class VmwareStorageProcessor implements StorageProcessor {
                 }
             }
 
-            disk.setVdiUuid(datastoreVolumePath);
+            disk.setPath(datastoreVolumePath);
 
             AttachAnswer answer = new AttachAnswer(disk);
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/858ce766/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
index 3c44daa..6c1efe7 100644
--- a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
+++ b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
@@ -1199,10 +1199,13 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
         }
     }
 
-    protected VBD createVbd(Connection conn, DiskTO volume, String vmName, VM vm, BootloaderType bootLoaderType) throws XmlRpcException, XenAPIException {
+    protected VBD createVbd(Connection conn, DiskTO volume, String vmName, VM vm, BootloaderType bootLoaderType, VDI vdi) throws XmlRpcException, XenAPIException {
         Volume.Type type = volume.getType();
 
-        VDI vdi = mount(conn, vmName, volume);
+        if (vdi == null) {
+            vdi = mount(conn, vmName, volume);
+        }
+
         if ( vdi != null ) {
             Map<String, String> smConfig = vdi.getSmConfig(conn);
             for (String key : smConfig.keySet()) {
@@ -1608,6 +1611,8 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
         String vmName = vmSpec.getName();
         State state = State.Stopped;
         VM vm = null;
+        // if a VDI is created, record its UUID to send back to the CS MS
+        Map<String, String> iqnToPath = new HashMap<String, String>();
         try {
             Set<VM> vms = VM.getByNameLabel(conn, vmName);
             if ( vms != null ) {
@@ -1636,7 +1641,37 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
             vm = createVmFromTemplate(conn, vmSpec, host);
 
             for (DiskTO disk : vmSpec.getDisks()) {
-                createVbd(conn, disk, vmName, vm, vmSpec.getBootloader());
+                VDI vdi = null;
+
+                if (disk.getData() instanceof VolumeObjectTO) {
+                    Map<String, String> details = disk.getDetails();
+                    boolean isManaged = details != null && Boolean.parseBoolean(details.get(DiskTO.MANAGED));
+
+                    if (isManaged) {
+                        String iScsiName = details.get(DiskTO.IQN);
+                        String storageHost = details.get(DiskTO.STORAGE_HOST);
+                        String chapInitiatorUsername = disk.getDetails().get(DiskTO.CHAP_INITIATOR_USERNAME);
+                        String chapInitiatorSecret = disk.getDetails().get(DiskTO.CHAP_INITIATOR_SECRET);
+                        Long volumeSize = Long.parseLong(details.get(DiskTO.VOLUME_SIZE));
+                        String vdiNameLabel = vmName + "-DATA";
+
+                        SR sr = getIscsiSR(conn, iScsiName, storageHost, iScsiName,
+                                    chapInitiatorUsername, chapInitiatorSecret, true);
+
+                        vdi = getVDIbyUuid(conn, disk.getPath(), false);
+
+                        if (vdi == null) {
+                            vdi = createVdi(sr, vdiNameLabel, volumeSize);
+
+                            iqnToPath.put(iScsiName, vdi.getUuid(conn));
+                        }
+                        else {
+                            vdi.setNameLabel(conn, vdiNameLabel);
+                        }
+                    }
+                }
+
+                createVbd(conn, disk, vmName, vm, vmSpec.getBootloader(), vdi);
             }
 
             if (vmSpec.getType() != VirtualMachine.Type.User) {
@@ -1718,11 +1753,21 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
             }
 
             state = State.Running;
-            return new StartAnswer(cmd);
+
+            StartAnswer startAnswer = new StartAnswer(cmd);
+
+            startAnswer.setIqnToPath(iqnToPath);
+
+            return startAnswer;
         } catch (Exception e) {
             s_logger.warn("Catch Exception: " + e.getClass().toString() + " due to " + e.toString(), e);
             String msg = handleVmStartFailure(conn, vmName, vm, "", e);
-            return new StartAnswer(cmd, msg);
+
+            StartAnswer startAnswer = new StartAnswer(cmd, msg);
+
+            startAnswer.setIqnToPath(iqnToPath);
+
+            return startAnswer;
         } finally {
             synchronized (_cluster.intern()) {
                 if (state != State.Stopped) {
@@ -1733,6 +1778,46 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
                     s_logger.debug("The VM is in stopped state, detected problem during startup : " + vmName);
                 }
             }
+
+            if (state != State.Running) {
+                disconnectManagedVolumes(conn, vm);
+            }
+        }
+    }
+
+    private void disconnectManagedVolumes(Connection conn, VM vm) {
+        try {
+            Set<VBD> vbds = vm.getVBDs(conn);
+
+            for (VBD vbd : vbds) {
+                VDI vdi = vbd.getVDI(conn);
+                SR sr = null;
+
+                try {
+                    sr = vdi.getSR(conn);
+                }
+                catch (Exception ex) {
+                    continue;
+                }
+
+                if (sr.getNameLabel(conn).startsWith("/iqn.")) {
+                    VBD.Record vbdr = vbd.getRecord(conn);
+
+                    if (vbdr.currentlyAttached) {
+                        vbd.unplug(conn);
+                    }
+
+                    vbd.destroy(conn);
+
+                    vdi.setNameLabel(conn, "detached");
+
+                    umount(conn, vdi);
+
+                    handleSrAndVdiDetach(sr.getNameLabel(conn));
+                }
+            }
+        } catch (Exception ex) {
+            s_logger.debug(ex.getMessage());
         }
     }
 
@@ -3976,6 +4061,8 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
 
                     try {
                         if (vm.getPowerState(conn) == VmPowerState.HALTED) {
+                            disconnectManagedVolumes(conn, vm);
+
                             Map<String, String> platform = vm.getPlatform(conn);
                             Integer timeoffset = null;
                             try {
@@ -5385,7 +5472,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
             if (pool.getType() == StoragePoolType.NetworkFilesystem) {
                 getNfsSR(conn, pool);
             } else if (pool.getType() == StoragePoolType.IscsiLUN) {
-                getIscsiSR(conn, pool.getUuid(), pool.getHost(), pool.getPath(), null, null);
+                getIscsiSR(conn, pool.getUuid(), pool.getHost(), pool.getPath(), null, null, false);
             } else if (pool.getType() == StoragePoolType.PreSetup) {
             } else {
                 return new Answer(cmd, false, "The pool type: " + pool.getType().name() + " is not supported.");
@@ -6224,7 +6311,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
     }
 
     protected SR getIscsiSR(Connection conn, String srNameLabel, String target, String path,
-            String chapInitiatorUsername, String chapInitiatorPassword) {
+            String chapInitiatorUsername, String chapInitiatorPassword, boolean ignoreIntroduceException) {
         synchronized (srNameLabel.intern()) {
             Map<String, String> deviceConfig = new HashMap<String, String>();
             try {
@@ -6273,8 +6360,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
                 deviceConfig.put("target", target);
                 deviceConfig.put("targetIQN", targetiqn);
 
-                if (StringUtils.isNotBlank(chapInitiatorUsername) &&
-                        StringUtils.isNotBlank(chapInitiatorPassword)) {
+                if (StringUtils.isNotBlank(chapInitiatorUsername) && StringUtils.isNotBlank(chapInitiatorPassword)) {
                     deviceConfig.put("chapuser", chapInitiatorUsername);
                     deviceConfig.put("chappassword", chapInitiatorPassword);
                 }
@@ -6329,8 +6415,17 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
                     sr = SR.create(conn, host, deviceConfig, new Long(0), srNameLabel, srNameLabel, type, "user", true,
                             smConfig);
                 } else {
-                    sr = SR.introduce(conn, pooluuid, srNameLabel, srNameLabel,
-                            type, "user", true, smConfig);
+                    try {
+                        sr = SR.introduce(conn, pooluuid, srNameLabel, srNameLabel,
+                                type, "user", true, smConfig);
+                    }
+                    catch (XenAPIException ex) {
+                        if (ignoreIntroduceException) {
+                            return sr;
+                        }
+
+                        throw ex;
+                    }
 
                     Set<Host> setHosts = Host.getAll(conn);
 
@@ -6557,6 +6652,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
         Connection conn = getConnection();
         boolean attach = cmd.getAttach();
         String vmName = cmd.getVmName();
+        String vdiNameLabel = vmName + "-DATA";
         Long deviceId = cmd.getDeviceId();
 
         String errorMsg;
@@ -6571,12 +6667,12 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
 
             if (cmd.getAttach() && cmd.isManaged()) {
                 SR sr = getIscsiSR(conn, cmd.get_iScsiName(), cmd.getStorageHost(), cmd.get_iScsiName(),
-                            cmd.getChapInitiatorUsername(), cmd.getChapInitiatorPassword());
+                            cmd.getChapInitiatorUsername(), cmd.getChapInitiatorPassword(), true);
 
                 vdi = getVDIbyUuid(conn, cmd.getVolumePath(), false);
 
                 if (vdi == null) {
-                    vdi = createVdi(sr, cmd.get_iScsiName(), cmd.getVolumeSize());
+                    vdi = createVdi(sr, vdiNameLabel, cmd.getVolumeSize());
                 }
             }
             else {
@@ -6632,7 +6728,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
                 vbd.plug(conn);
 
                 // Update the VDI's label to include the VM name
-                vdi.setNameLabel(conn, vmName + "-DATA");
+                vdi.setNameLabel(conn, vdiNameLabel);
 
                 return new AttachVolumeAnswer(cmd, Long.parseLong(diskNumber), vdi.getUuid(conn));
             } else {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/858ce766/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServerStorageProcessor.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServerStorageProcessor.java b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServerStorageProcessor.java
index 2d4c86e..1496108 100644
--- a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServerStorageProcessor.java
+++ b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServerStorageProcessor.java
@@ -162,6 +162,7 @@ public class XenServerStorageProcessor implements StorageProcessor {
     @Override
     public AttachAnswer attachVolume(AttachCommand cmd) {
         String vmName = cmd.getVmName();
+        String vdiNameLabel = vmName + "-DATA";
         DiskTO disk = cmd.getDisk();
         DataTO data = disk.getData();
 
@@ -170,16 +171,23 @@ public class XenServerStorageProcessor implements StorageProcessor {
 
             VDI vdi = null;
 
-            if (cmd.isManaged()) {
-                SR sr = this.hypervisorResource.getIscsiSR(conn, cmd.get_iScsiName(), cmd.getStorageHost(), cmd.get_iScsiName(),
-                            cmd.getChapInitiatorUsername(), cmd.getChapInitiatorPassword());
+            Map<String, String> details = cmd.getDisk().getDetails();
+            boolean isManaged = Boolean.parseBoolean(details.get(DiskTO.MANAGED));
+
+            if (isManaged) {
+                String iScsiName = details.get(DiskTO.IQN);
+                String storageHost = details.get(DiskTO.STORAGE_HOST);
+                String chapInitiatorUsername = disk.getDetails().get(DiskTO.CHAP_INITIATOR_USERNAME);
+                String chapInitiatorSecret = disk.getDetails().get(DiskTO.CHAP_INITIATOR_SECRET);
+                Long volumeSize = Long.parseLong(details.get(DiskTO.VOLUME_SIZE));
+
+                SR sr = this.hypervisorResource.getIscsiSR(conn, iScsiName, storageHost, iScsiName,
+                            chapInitiatorUsername, chapInitiatorSecret, true);
 
                 vdi = this.hypervisorResource.getVDIbyUuid(conn, data.getPath(), false);
 
                 if (vdi == null) {
-                    VolumeObjectTO volume = (VolumeObjectTO)data;
-
-                    vdi = this.hypervisorResource.createVdi(sr, cmd.get_iScsiName(), volume.getSize());
+                    vdi = this.hypervisorResource.createVdi(sr, vdiNameLabel, volumeSize);
                 }
             }
             else {
@@ -236,7 +244,7 @@ public class XenServerStorageProcessor implements StorageProcessor {
             vbd.plug(conn);
 
             // Update the VDI's label to include the VM name
-            vdi.setNameLabel(conn, vmName + "-DATA");
+            vdi.setNameLabel(conn, vdiNameLabel);
             DiskTO newDisk = new DiskTO(disk.getData(), Long.parseLong(diskNumber), vdi.getUuid(conn), disk.getType());
             return new AttachAnswer(newDisk);
 


[50/50] [abbrv] git commit: updated refs/heads/object_store_migration to 5ec2a44

Posted by mc...@apache.org.
Rebase with latest master.


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

Branch: refs/heads/object_store_migration
Commit: 5ec2a44ce91198e9fd55161b0cb48572058f51f1
Parents: afcf09e 271a7df
Author: Min Chen <mi...@citrix.com>
Authored: Mon Oct 28 20:51:34 2013 -0700
Committer: Min Chen <mi...@citrix.com>
Committed: Mon Oct 28 20:51:34 2013 -0700

----------------------------------------------------------------------
 .../cloud/agent/dao/impl/PropertiesStorage.java |  14 +-
 .../agent/dao/impl/PropertiesStorageTest.java   |  69 +++
 api/src/com/cloud/agent/api/to/DiskTO.java      |  36 +-
 api/src/com/cloud/event/EventTypes.java         |   1 +
 api/src/com/cloud/network/RemoteAccessVpn.java  |   3 +-
 .../network/vpn/RemoteAccessVpnService.java     |   3 +-
 .../cloud/server/ResourceMetaDataService.java   |  16 +-
 api/src/com/cloud/server/ResourceTag.java       |  62 +-
 .../com/cloud/server/TaggedResourceService.java |  30 +-
 api/src/com/cloud/vm/UserVmService.java         |   5 +
 .../org/apache/cloudstack/api/APICommand.java   |   4 +
 .../org/apache/cloudstack/api/ApiConstants.java |   2 +-
 .../apache/cloudstack/api/ResourceDetail.java   |   6 +-
 .../api/command/admin/vm/ExpungeVMCmd.java      | 116 ++++
 .../user/offering/ListServiceOfferingsCmd.java  |  22 -
 .../api/command/user/tag/CreateTagsCmd.java     |   4 +-
 .../api/command/user/tag/DeleteTagsCmd.java     |   4 +-
 .../user/volume/AddResourceDetailCmd.java       |   2 +-
 .../user/volume/ListResourceDetailsCmd.java     |  11 +-
 .../user/volume/RemoveResourceDetailCmd.java    |   2 +-
 .../user/vpn/CreateRemoteAccessVpnCmd.java      |  17 +-
 .../api/response/ServiceOfferingResponse.java   |  10 -
 .../cloudstack/api/response/ZoneResponse.java   |   9 +
 .../apache/cloudstack/context/CallContext.java  |  46 +-
 .../classes/resources/messages.properties       |   4 +
 client/tomcatconf/commands.properties.in        |   1 +
 .../core/spring-core-registry-core-context.xml  |  78 ++-
 ...re-lifecycle-network-context-inheritable.xml |  38 +-
 ...ng-lifecycle-storage-context-inheritable.xml |   6 +
 .../cloud/agent/api/CreateVMSnapshotAnswer.java |  12 +-
 .../agent/api/CreateVMSnapshotCommand.java      |   4 +-
 .../cloud/agent/api/DeleteVMSnapshotAnswer.java |  12 +-
 .../agent/api/DeleteVMSnapshotCommand.java      |   3 +-
 .../src/com/cloud/agent/api/MigrateCommand.java |  11 +-
 .../agent/api/RevertToVMSnapshotAnswer.java     |  14 +-
 .../agent/api/RevertToVMSnapshotCommand.java    |   3 +-
 core/src/com/cloud/agent/api/StartAnswer.java   |  11 +
 .../cloud/agent/api/VMSnapshotBaseCommand.java  |  10 +-
 .../api/routing/RemoteAccessVpnCfgCommand.java  |  35 +-
 .../virtualnetwork/VirtualRoutingResource.java  |   2 +
 .../storage/command/AttachCommand.java          |  72 ---
 .../cloudstack/storage/to/VolumeObjectTO.java   |  12 +
 debian/cloudstack-management.install            |   3 -
 debian/control                                  |   2 +-
 .../api/storage/StorageStrategyFactory.java     |  12 +-
 .../api/storage/VMSnapshotStrategy.java         |  28 +
 .../com/cloud/vm/VirtualMachineManagerImpl.java |  67 ++-
 .../orchestration/VolumeOrchestrator.java       |  38 +-
 .../spring-engine-schema-core-daos-context.xml  |   7 +-
 .../com/cloud/capacity/dao/CapacityDaoImpl.java |   2 +-
 .../src/com/cloud/dc/DataCenterDetailVO.java    |  74 +++
 engine/schema/src/com/cloud/dc/DcDetailVO.java  |  79 ---
 .../src/com/cloud/dc/dao/DataCenterDaoImpl.java |  12 +-
 .../com/cloud/dc/dao/DataCenterDetailsDao.java  |  25 +
 .../cloud/dc/dao/DataCenterDetailsDaoImpl.java  |  49 ++
 .../src/com/cloud/dc/dao/DcDetailsDao.java      |  37 --
 .../src/com/cloud/dc/dao/DcDetailsDaoImpl.java  | 133 -----
 .../cloud/network/dao/FirewallRulesDaoImpl.java |  10 +-
 .../com/cloud/network/dao/IPAddressDaoImpl.java |   4 +-
 .../com/cloud/network/dao/NetworkDaoImpl.java   |   4 +-
 .../com/cloud/network/dao/NetworkDetailVO.java  |  38 +-
 .../cloud/network/dao/NetworkDetailsDao.java    |  16 +-
 .../network/dao/NetworkDetailsDaoImpl.java      |  71 +--
 .../cloud/network/dao/RemoteAccessVpnDao.java   |   3 +-
 .../network/dao/RemoteAccessVpnDaoImpl.java     |   9 +
 .../cloud/network/dao/RemoteAccessVpnVO.java    |  15 +-
 .../security/dao/SecurityGroupDaoImpl.java      |   6 +-
 .../network/vpc/dao/StaticRouteDaoImpl.java     |   4 +-
 .../com/cloud/network/vpc/dao/VpcDaoImpl.java   |   4 +-
 .../com/cloud/projects/dao/ProjectDaoImpl.java  |   4 +-
 .../cloud/service/ServiceOfferingDetailsVO.java |  22 +-
 .../service/dao/ServiceOfferingDaoImpl.java     |  13 +-
 .../service/dao/ServiceOfferingDetailsDao.java  |   8 +-
 .../dao/ServiceOfferingDetailsDaoImpl.java      |  72 +--
 .../com/cloud/storage/VMTemplateDetailVO.java   |  34 +-
 .../src/com/cloud/storage/VolumeDetailVO.java   |  33 +-
 .../com/cloud/storage/dao/SnapshotDaoImpl.java  |   4 +-
 .../storage/dao/StoragePoolDetailsDaoImpl.java  |  63 +-
 .../cloud/storage/dao/VMTemplateDaoImpl.java    |  33 +-
 .../cloud/storage/dao/VMTemplateDetailsDao.java |  14 +-
 .../storage/dao/VMTemplateDetailsDaoImpl.java   |  85 +--
 .../com/cloud/storage/dao/VolumeDaoImpl.java    |   4 +-
 .../com/cloud/storage/dao/VolumeDetailsDao.java |  16 +-
 .../cloud/storage/dao/VolumeDetailsDaoImpl.java |  91 +--
 .../src/com/cloud/tags/ResourceTagVO.java       |   6 +-
 .../src/com/cloud/tags/dao/ResourceTagDao.java  |   6 +-
 .../com/cloud/tags/dao/ResourceTagsDaoImpl.java |   6 +-
 engine/schema/src/com/cloud/vm/NicDetailVO.java |  34 +-
 .../schema/src/com/cloud/vm/UserVmDetailVO.java |  34 +-
 .../src/com/cloud/vm/dao/NicDetailDao.java      |  35 --
 .../src/com/cloud/vm/dao/NicDetailDaoImpl.java  | 105 ----
 .../src/com/cloud/vm/dao/NicDetailsDao.java     |  25 +
 .../src/com/cloud/vm/dao/NicDetailsDaoImpl.java |  34 ++
 .../src/com/cloud/vm/dao/UserVmDaoImpl.java     |  20 +-
 .../src/com/cloud/vm/dao/UserVmDetailsDao.java  |  18 +-
 .../com/cloud/vm/dao/UserVmDetailsDaoImpl.java  | 107 +---
 .../src/com/cloud/vm/dao/VMInstanceDaoImpl.java |   4 +-
 .../cloud/vm/snapshot/VMSnapshotDetailsVO.java  |  87 +++
 .../src/com/cloud/vm/snapshot/VMSnapshotVO.java |   2 +-
 .../vm/snapshot/dao/VMSnapshotDetailsDao.java   |  28 +
 .../snapshot/dao/VMSnapshotDetailsDaoImpl.java  |  52 ++
 .../resourcedetail/FirewallRuleDetailVO.java    |  72 +++
 .../resourcedetail/ResourceDetailsDao.java      |  42 ++
 .../resourcedetail/ResourceDetailsDaoBase.java  | 116 ++++
 .../dao/FirewallRuleDetailsDao.java             |  26 +
 .../dao/FirewallRuleDetailsDaoImpl.java         |  34 ++
 .../datastore/db/PrimaryDataStoreDaoImpl.java   |  14 +-
 .../datastore/db/PrimaryDataStoreDetailVO.java  |  34 +-
 .../db/PrimaryDataStoreDetailsDao.java          |  10 +-
 .../datastore/db/StoragePoolDetailVO.java       |  38 +-
 .../datastore/db/StoragePoolDetailsDao.java     |  10 +-
 .../motion/AncientDataMotionStrategy.java       |  26 -
 .../vm/snapshot/dao/VmSnapshotDaoTest.java      |  46 ++
 .../storage/test/ChildTestConfiguration.java    |  51 +-
 .../cloudstack/storage/test/SnapshotTest.java   |  89 +--
 .../test/resources/storageContext.xml           |   5 +
 .../core/spring-engine-storage-core-context.xml |   2 +
 engine/storage/snapshot/pom.xml                 |  32 +
 ...-engine-storage-snapshot-storage-context.xml |   7 +-
 .../storage/snapshot/SnapshotServiceImpl.java   |  44 +-
 .../snapshot/XenserverSnapshotStrategy.java     |   3 +-
 .../vmsnapshot/DefaultVMSnapshotStrategy.java   | 371 ++++++++++++
 .../storage/vmsnapshot/VMSnapshotHelper.java    |  38 ++
 .../vmsnapshot/VMSnapshotHelperImpl.java        | 148 +++++
 .../snapshot/test/resources/db.properties       |  70 +++
 .../test/src/VMSnapshotStrategyTest.java        | 256 ++++++++
 .../helper/StorageStrategyFactoryImpl.java      |  79 ++-
 .../db/PrimaryDataStoreDetailsDaoImpl.java      |  50 +-
 .../api/storage/StrategyPriorityTest.java       |  93 ++-
 .../storage/volume/VolumeServiceImpl.java       |  85 ++-
 .../com/cloud/cluster/ClusterManagerImpl.java   |   3 +-
 .../cluster/ClusterServiceServletAdapter.java   |   3 +-
 .../com/cloud/utils/db/TransactionLegacy.java   |   1 +
 .../jobs/impl/AsyncJobManagerImpl.java          |   3 +-
 .../debian/config/opt/cloud/bin/savepassword.sh |  62 --
 .../acl/StaticRoleBasedAPIAccessChecker.java    |  37 +-
 .../kvm/resource/LibvirtComputingResource.java  |  66 +--
 .../hypervisor/kvm/storage/KVMStoragePool.java  |  12 +-
 .../kvm/storage/KVMStoragePoolManager.java      | 112 +++-
 .../kvm/storage/KVMStorageProcessor.java        |   8 +-
 .../kvm/storage/LibvirtStorageAdaptor.java      |  47 ++
 .../kvm/storage/LibvirtStoragePool.java         |  11 +
 .../hypervisor/kvm/storage/StorageAdaptor.java  |  13 +
 .../kvm/storage/iScsiAdmStorageAdaptor.java     | 373 ++++++++++++
 .../kvm/storage/iScsiAdmStoragePool.java        | 167 ++++++
 .../simulator-planner/module.properties         |  18 -
 .../simulator-planner/spring-context.xml        |  34 --
 .../manager/VmwareStorageManagerImpl.java       |  87 ++-
 .../vmware/resource/VmwareResource.java         |   2 +
 .../resource/VmwareStorageProcessor.java        |  45 +-
 .../xen/discoverer/XcpServerDiscoverer.java     |   3 +
 .../xen/resource/CitrixResourceBase.java        | 164 ++++-
 .../xen/resource/XenServerStorageProcessor.java |  33 +-
 .../api/ConfigureNexusVsmForAsaCommand.java     |   3 +
 .../cloud/network/element/CiscoVnmcElement.java | 206 ++++---
 .../SolidFirePrimaryDataStoreLifeCycle.java     |  37 +-
 .../provider/SolidFireHostListener.java         | 102 ++++
 .../SolidfirePrimaryDataStoreProvider.java      |  10 +-
 scripts/vm/hypervisor/xenserver/s3xen           |  68 ++-
 scripts/vm/network/vnet/modifyvxlan.sh          |   9 +-
 .../spring-server-core-managers-context.xml     |  20 +-
 .../system/spring-server-system-context.xml     |  36 ++
 server/src/com/cloud/api/ApiDBUtils.java        |  24 +-
 server/src/com/cloud/api/ApiResponseHelper.java |  22 +-
 .../com/cloud/api/query/QueryManagerImpl.java   |  97 +--
 .../api/query/dao/DataCenterJoinDaoImpl.java    |   6 +-
 .../cloud/api/query/dao/ResourceTagJoinDao.java |   4 +-
 .../api/query/dao/ResourceTagJoinDaoImpl.java   |   4 +-
 .../query/dao/ServiceOfferingJoinDaoImpl.java   |  10 -
 .../com/cloud/api/query/vo/ProjectJoinVO.java   |   6 +-
 .../cloud/api/query/vo/ResourceTagJoinVO.java   |   6 +-
 .../cloud/api/query/vo/SecurityGroupJoinVO.java |   6 +-
 .../com/cloud/api/query/vo/TemplateJoinVO.java  |   6 +-
 .../com/cloud/api/query/vo/UserVmJoinVO.java    |   6 +-
 .../com/cloud/api/query/vo/VolumeJoinVO.java    |   6 +-
 .../configuration/ConfigurationManagerImpl.java |  36 +-
 .../hypervisor/CloudZonesStartupProcessor.java  |  13 +-
 .../cloud/hypervisor/HypervisorGuruBase.java    |   4 +-
 .../metadata/ResourceMetaDataManagerImpl.java   | 272 ++++-----
 .../ExternalFirewallDeviceManagerImpl.java      |   2 +-
 .../com/cloud/network/NetworkServiceImpl.java   |   4 +-
 .../network/element/VirtualRouterElement.java   |  15 +-
 .../element/VpcVirtualRouterElement.java        |  45 ++
 .../network/firewall/FirewallManagerImpl.java   |  55 +-
 .../lb/LoadBalancingRulesManagerImpl.java       |  14 +-
 .../VirtualNetworkApplianceManagerImpl.java     |  11 +-
 .../VpcVirtualNetworkApplianceManager.java      |  29 +
 .../VpcVirtualNetworkApplianceManagerImpl.java  | 118 +++-
 .../cloud/network/rules/RulesManagerImpl.java   |   4 +-
 .../network/vpc/NetworkACLManagerImpl.java      |  10 +-
 .../network/vpc/NetworkACLServiceImpl.java      |   4 +-
 .../com/cloud/network/vpc/VpcManagerImpl.java   |   6 +-
 .../network/vpn/RemoteAccessVpnManagerImpl.java |  89 ++-
 .../network/vpn/Site2SiteVpnManagerImpl.java    |  12 +-
 .../com/cloud/server/ManagementServerImpl.java  |  22 +-
 .../com/cloud/storage/StorageManagerImpl.java   |   2 +-
 .../com/cloud/storage/VolumeApiServiceImpl.java |  43 +-
 .../storage/listener/StoragePoolMonitor.java    |   3 +
 .../storage/snapshot/SnapshotManagerImpl.java   |  97 +--
 .../cloud/tags/TaggedResourceManagerImpl.java   |  87 ++-
 .../com/cloud/template/TemplateManagerImpl.java |  10 +-
 .../com/cloud/uuididentity/dao/IdentityDao.java |   4 +-
 .../cloud/uuididentity/dao/IdentityDaoImpl.java |   6 +-
 server/src/com/cloud/vm/UserVmManagerImpl.java  |  49 ++
 .../vm/snapshot/VMSnapshotManagerImpl.java      | 451 ++------------
 .../lb/ApplicationLoadBalancerManagerImpl.java  |   4 +-
 .../metadata/ResourceMetaDataManagerTest.java   |  41 +-
 .../SecurityGroupManagerTestConfiguration.java  |   4 +-
 .../vm/snapshot/VMSnapshotManagerTest.java      |   7 -
 .../MockVpcVirtualNetworkApplianceManager.java  |  22 +
 .../com/cloud/vpc/VpcTestConfiguration.java     |   4 +-
 .../networkoffering/ChildTestConfiguration.java |   4 +-
 setup/db/db/schema-421to430.sql                 |  25 +
 .../debian/vpn/opt/cloud/bin/vpc_vpn_l2tp.sh    | 178 ------
 .../debian/vpn/opt/cloud/bin/vpn_l2tp.sh        |  95 ++-
 .../component/maint/test_multiple_ip_ranges.py  | 557 ++++++++++-------
 test/integration/component/test_egress_rules.py | 207 -------
 .../component/test_resource_limits.py           |   2 +-
 test/integration/smoke/test_vpc_vpn.py          | 192 ++++++
 .../systemvm64template/postinstall.sh           |   1 +
 .../definitions/systemvm64template/zerodisk.sh  |   2 +-
 tools/marvin/marvin/codes.py                    |   6 +-
 tools/marvin/marvin/configGenerator.py          |   8 +-
 tools/marvin/marvin/deployDataCenter.py         |  18 +-
 tools/marvin/marvin/integration/lib/utils.py    |  35 ++
 tools/marvin/marvin/marvinPlugin.py             |  39 +-
 ui/css/cloudstack3.css                          | 593 +++++++++----------
 ui/dictionary.jsp                               |   4 +
 ui/images/header-gradient.png                   | Bin 0 -> 62651 bytes
 ui/images/logo-login-oss.png                    | Bin 4567 -> 22165 bytes
 ui/images/logo.png                              | Bin 3886 -> 21781 bytes
 ui/images/overlay-pattern.png                   | Bin 0 -> 14969 bytes
 ui/index.jsp                                    |   6 +-
 ui/scripts/instances.js                         | 115 +++-
 ui/scripts/network.js                           |   2 +-
 ui/scripts/system.js                            |   1 +
 ui/scripts/templates.js                         |  40 +-
 ui/scripts/ui/core.js                           |   2 +-
 ui/scripts/ui/widgets/cloudBrowser.js           |  52 +-
 ui/scripts/ui/widgets/detailView.js             |  43 +-
 ui/scripts/ui/widgets/listView.js               |   3 +-
 ui/scripts/ui/widgets/treeView.js               |   1 +
 utils/src/com/cloud/utils/ProcessUtil.java      |   5 +-
 utils/src/com/cloud/utils/PropertiesUtil.java   |   2 +-
 .../com/cloud/utils/crypt/DBEncryptionUtil.java |   2 +-
 .../utils/crypt/EncryptionSecretKeyChecker.java |   3 +-
 .../com/cloud/utils/PropertiesUtilsTest.java    |  13 +
 .../hypervisor/vmware/util/VmwareClient.java    |   5 +-
 .../vmware/util/VmwareContextPool.java          |   4 +-
 249 files changed, 6253 insertions(+), 4173 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5ec2a44c/api/src/com/cloud/event/EventTypes.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5ec2a44c/client/tomcatconf/commands.properties.in
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5ec2a44c/engine/storage/datamotion/src/org/apache/cloudstack/storage/motion/AncientDataMotionStrategy.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5ec2a44c/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/XenserverSnapshotStrategy.java
----------------------------------------------------------------------
diff --cc engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/XenserverSnapshotStrategy.java
index 111e9a3,15335bf..7eec5ff
--- a/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/XenserverSnapshotStrategy.java
+++ b/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/XenserverSnapshotStrategy.java
@@@ -16,13 -16,17 +16,14 @@@
  // under the License.
  package org.apache.cloudstack.storage.snapshot;
  
 -import com.cloud.exception.InvalidParameterValueException;
 -import com.cloud.storage.DataStoreRole;
 -import com.cloud.storage.Snapshot;
 -import com.cloud.storage.SnapshotVO;
 -import com.cloud.storage.Volume;
 -import com.cloud.storage.dao.SnapshotDao;
 -import com.cloud.storage.snapshot.SnapshotManager;
 -import com.cloud.utils.NumbersUtil;
 -import com.cloud.utils.db.DB;
 -import com.cloud.utils.exception.CloudRuntimeException;
 -import com.cloud.utils.fsm.NoTransitionException;
++
 +import java.util.List;
 +
 +import javax.inject.Inject;
 +
 +import org.apache.log4j.Logger;
 +import org.springframework.stereotype.Component;
 +
  import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
  import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
  import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine.Event;

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5ec2a44c/plugins/storage/volume/solidfire/src/org/apache/cloudstack/storage/datastore/lifecycle/SolidFirePrimaryDataStoreLifeCycle.java
----------------------------------------------------------------------
diff --cc plugins/storage/volume/solidfire/src/org/apache/cloudstack/storage/datastore/lifecycle/SolidFirePrimaryDataStoreLifeCycle.java
index a16ebad,038e89b..120a357
--- a/plugins/storage/volume/solidfire/src/org/apache/cloudstack/storage/datastore/lifecycle/SolidFirePrimaryDataStoreLifeCycle.java
+++ b/plugins/storage/volume/solidfire/src/org/apache/cloudstack/storage/datastore/lifecycle/SolidFirePrimaryDataStoreLifeCycle.java
@@@ -23,6 -25,6 +25,8 @@@ import java.util.StringTokenizer
  
  import javax.inject.Inject;
  
++import org.apache.log4j.Logger;
++
  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.HostScope;
@@@ -33,25 -35,33 +37,32 @@@ import org.apache.cloudstack.storage.da
  import org.apache.cloudstack.storage.datastore.db.StoragePoolDetailsDao;
  import org.apache.cloudstack.storage.datastore.util.SolidFireUtil;
  import org.apache.cloudstack.storage.volume.datastore.PrimaryDataStoreHelper;
 -import org.apache.log4j.Logger;
  
 +import com.cloud.agent.api.StoragePoolInfo;
  import com.cloud.dc.DataCenterVO;
  import com.cloud.dc.dao.DataCenterDao;
+ import com.cloud.host.HostVO;
  import com.cloud.hypervisor.Hypervisor.HypervisorType;
 -import com.cloud.agent.api.StoragePoolInfo;
+ import com.cloud.resource.ResourceManager;
 +import com.cloud.storage.Storage.StoragePoolType;
+ import com.cloud.storage.StorageManager;
  import com.cloud.storage.StoragePoolAutomation;
  import com.cloud.utils.exception.CloudRuntimeException;
  
  public class SolidFirePrimaryDataStoreLifeCycle implements PrimaryDataStoreLifeCycle {
-     @Inject PrimaryDataStoreDao storagePoolDao;
-     @Inject PrimaryDataStoreHelper dataStoreHelper;
-     @Inject StoragePoolAutomation storagePoolAutomation;
-     @Inject StoragePoolDetailsDao storagePoolDetailsDao;
-     @Inject DataCenterDao zoneDao;
+     private static final Logger s_logger = Logger.getLogger(SolidFirePrimaryDataStoreLifeCycle.class);
+ 
+     @Inject private DataCenterDao zoneDao;
+     @Inject private PrimaryDataStoreDao storagePoolDao;
+     @Inject private PrimaryDataStoreHelper dataStoreHelper;
+     @Inject private ResourceManager _resourceMgr;
+     @Inject StorageManager _storageMgr;
+     @Inject private StoragePoolAutomation storagePoolAutomation;
+     @Inject private StoragePoolDetailsDao storagePoolDetailsDao;
 -
 +    
      private static final int DEFAULT_MANAGEMENT_PORT = 443;
      private static final int DEFAULT_STORAGE_PORT = 3260;
 -
 +    
      // invoked to add primary storage that is based on the SolidFire plug-in
      @Override
      public DataStore initialize(Map<String, Object> dsInfos) {
@@@ -300,15 -310,29 +311,29 @@@
      public boolean attachCluster(DataStore store, ClusterScope scope) {
      	return true; // should be ignored for zone-wide-only plug-ins like SolidFire's
      }
 -
 +    
      @Override
      public boolean attachZone(DataStore dataStore, ZoneScope scope, HypervisorType hypervisorType) {
 -        dataStoreHelper.attachZone(dataStore);
 -
 +    	dataStoreHelper.attachZone(dataStore);
 +    	
-         return true;
+         List<HostVO> xenServerHosts = _resourceMgr.listAllUpAndEnabledHostsInOneZoneByHypervisor(HypervisorType.XenServer, scope.getScopeId());
+         List<HostVO> kvmHosts = _resourceMgr.listAllUpAndEnabledHostsInOneZoneByHypervisor(HypervisorType.KVM, scope.getScopeId());
+         List<HostVO> hosts = new ArrayList<HostVO>();
+ 
+         hosts.addAll(xenServerHosts);
+         hosts.addAll(kvmHosts);
+ 
+         for (HostVO host : hosts) {
+             try {
+                 _storageMgr.connectHostToSharedPool(host.getId(), dataStore.getId());
+             } catch (Exception e) {
+                 s_logger.warn("Unable to establish a connection between " + host + " and " + dataStore, e);
+             }
 -        }
 +    }
  
+         return true;
+     }
 -
 +    
      @Override
      public boolean maintain(DataStore dataStore) {
          storagePoolAutomation.maintain(dataStore);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5ec2a44c/server/src/com/cloud/server/ManagementServerImpl.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/server/ManagementServerImpl.java
index 5273203,058a756..79b20d0
--- a/server/src/com/cloud/server/ManagementServerImpl.java
+++ b/server/src/com/cloud/server/ManagementServerImpl.java
@@@ -3878,6 -3883,14 +3886,14 @@@ public class ManagementServerImpl exten
  
      @Inject
      public void setStoragePoolAllocators(List<StoragePoolAllocator> storagePoolAllocators) {
 -        this._storagePoolAllocators = storagePoolAllocators;
 +        _storagePoolAllocators = storagePoolAllocators;
      }
+ 
+     public LockMasterListener getLockMasterListener() {
+         return _lockMasterListener;
+     }
+ 
+     public void setLockMasterListener(LockMasterListener lockMasterListener) {
+         this._lockMasterListener = lockMasterListener;
+     }
  }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5ec2a44c/server/src/com/cloud/storage/StorageManagerImpl.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5ec2a44c/server/src/com/cloud/storage/VolumeApiServiceImpl.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5ec2a44c/server/src/com/cloud/template/TemplateManagerImpl.java
----------------------------------------------------------------------


[06/50] [abbrv] git commit: updated refs/heads/object_store_migration to 5ec2a44

Posted by mc...@apache.org.
CLOUDSTACK-4966: UI: (1) detailView widget: extend detailView widget to support destroy action that will close detailView and remove item from listView when toRemove parameter is passed.
(2)Destroy Instance action: add expunge option for root-admin and domain-admin. When expunge is set to true, instance will be expunged right after destroyed.


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

Branch: refs/heads/object_store_migration
Commit: ad51b8edfbb7e110db45368b118b55f89c7b7cba
Parents: aa9f8e6
Author: Jessica Wang <je...@apache.org>
Authored: Fri Oct 25 13:48:38 2013 -0700
Committer: Jessica Wang <je...@apache.org>
Committed: Fri Oct 25 13:48:50 2013 -0700

----------------------------------------------------------------------
 ui/scripts/instances.js             | 43 +++++++++++++++++++++++++-------
 ui/scripts/ui/widgets/detailView.js | 43 +++++++++++++++++++++++++++++++-
 2 files changed, 76 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/ad51b8ed/ui/scripts/instances.js
----------------------------------------------------------------------
diff --git a/ui/scripts/instances.js b/ui/scripts/instances.js
index b729c4b..ac8605a 100644
--- a/ui/scripts/instances.js
+++ b/ui/scripts/instances.js
@@ -535,26 +535,51 @@
                     destroy: {
                         label: 'label.action.destroy.instance',
                         compactLabel: 'label.destroy',
-                        messages: {
-                            confirm: function(args) {
-                                return 'message.action.destroy.instance';
+                        createForm: {
+                            title: 'label.action.destroy.instance', 
+                            desc: 'Please confirm that you want to destroy this instance',
+                            preFilter: function(args) {
+                            	if (isAdmin() || isDomainAdmin()) {
+                            		args.$form.find('.form-item[rel=expunge]').css('display', 'inline-block');
+                            	} else {
+                            		args.$form.find('.form-item[rel=expunge]').hide();
+                            	}
                             },
+                            fields: {
+                            	expunge: {
+                                    label: 'Expunge',
+                                    isBoolean: true,
+                                    isChecked: false
+                                }
+                            }
+                        },                        
+                        messages: {                            
                             notification: function(args) {
                                 return 'label.action.destroy.instance';
                             }
                         },
-                        action: function(args) {
+                        action: function(args) {                        	
+                        	var data = {
+                        		id: args.context.instances[0].id		
+                        	};                        	
+                        	if (args.data.expunge == 'on') {
+                        		$.extend(data, {
+                        			expunge: true
+                        		});
+                        	}                        	
                             $.ajax({
-                                url: createURL("destroyVirtualMachine&id=" + args.context.instances[0].id),
-                                dataType: "json",
-                                async: true,
+                                url: createURL('destroyVirtualMachine'),
+                                data: data,                                
                                 success: function(json) {
                                     var jid = json.destroyvirtualmachineresponse.jobid;
                                     args.response.success({
                                         _custom: {
                                             jobId: jid,
-                                            getUpdatedItem: function(json) {
-                                                return json.queryasyncjobresultresponse.jobresult.virtualmachine;
+                                            getUpdatedItem: function(json) {                                            	
+                                            	if ('virtualmachine' in json.queryasyncjobresultresponse.jobresult) //destroy without expunge                                            	
+                                                    return json.queryasyncjobresultresponse.jobresult.virtualmachine;
+                                            	else //destroy with expunge
+                                            		return { 'toRemove': true };
                                             },
                                             getActionFilter: function() {
                                                 return vmActionfilter;

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/ad51b8ed/ui/scripts/ui/widgets/detailView.js
----------------------------------------------------------------------
diff --git a/ui/scripts/ui/widgets/detailView.js b/ui/scripts/ui/widgets/detailView.js
index 7bb0e13..65f71b3 100644
--- a/ui/scripts/ui/widgets/detailView.js
+++ b/ui/scripts/ui/widgets/detailView.js
@@ -231,7 +231,7 @@
                                         }
                                         if (additional && additional.complete) additional.complete($.extend(true, args, {
                                             $detailView: $detailView
-                                        }));
+                                        }), args2);
 
                                         replaceListViewItem($detailView, args.data ? args.data : args2.data);
 
@@ -374,6 +374,47 @@
             var isMultiple = tab.multiple;
             uiActions.remove($detailView, args);
         },            
+               
+        destroy: function($detailView, args) {
+            var tab = args.tabs[args.activeTab];
+            var isMultiple = tab.multiple;
+
+            uiActions.standard($detailView, args, {
+                noRefresh: true,
+                complete: function(args, args2) {                   	
+                	if ((!('id' in args2.data)) && ('toRemove' in args2.data) && (args2.data.toRemove == true)) {   
+	                    if (isMultiple && $detailView.is(':visible')) {
+	                        $detailView.find('.refresh').click(); // Reload tab
+	                    } else {
+	                        var $browser = $('#browser .container');
+	                        var $panel = $detailView.closest('.panel');
+	
+	                        if ($detailView.is(':visible')) {
+	                            $browser.cloudBrowser('selectPanel', {
+	                                panel: $panel.prev()
+	                            });
+	                        }
+	
+	                        if ($detailView.data("list-view-row") != null) {
+	                            var $row = $detailView.data('list-view-row');
+	                            var $tbody = $row.closest('tbody');
+	
+	                            $row.remove();
+	                            if (!$tbody.find('tr').size()) {
+	                                $("<tr>").addClass('empty').append(
+	                                    $("<td>").html(_l('label.no.data'))
+	                                ).appendTo($tbody);
+	                            }
+	                            $tbody.closest('table').dataTable('refresh');
+	                        }
+	                    }
+                	}  else {
+                		$detailView.find('.refresh').click(); // Reload tab
+                	}
+                }
+            });
+        },
+       
         
         /**
          * Convert editable fields to text boxes; clicking again saves data


[44/50] [abbrv] git commit: updated refs/heads/object_store_migration to 5ec2a44

Posted by mc...@apache.org.
Style toolbar


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

Branch: refs/heads/object_store_migration
Commit: ee1c83e68970267f522a2db0908f1747639063e1
Parents: e86b612
Author: Brian Federle <br...@citrix.com>
Authored: Mon Oct 28 13:50:21 2013 -0700
Committer: Brian Federle <br...@citrix.com>
Committed: Mon Oct 28 13:50:21 2013 -0700

----------------------------------------------------------------------
 ui/css/cloudstack3.css | 43 +++++++++++++------------------------------
 1 file changed, 13 insertions(+), 30 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/ee1c83e6/ui/css/cloudstack3.css
----------------------------------------------------------------------
diff --git a/ui/css/cloudstack3.css b/ui/css/cloudstack3.css
index 34018a1..8b7c339 100644
--- a/ui/css/cloudstack3.css
+++ b/ui/css/cloudstack3.css
@@ -1323,6 +1323,7 @@ div.list-view td.state.off span {
 .quick-view-tooltip > div.title .icon {
   position: relative;
   top: -2px;
+  left: -7px;
   background: url(../images/sprites.png) no-repeat -42px -67px;
   float: right;
   padding: 0px 13px 0 0px;
@@ -1345,7 +1346,7 @@ div.list-view td.state.off span {
 .quick-view-tooltip .container {
   border: 1px solid #9EA2A5;
   background: #FFFFFF;
-  width: 478px;
+  width: 471px;
   min-height: 100px;
   height: auto;
   overflow: hidden;
@@ -2739,19 +2740,13 @@ div.detail-group.actions td {
 
 /*Toolbar*/
 /*[clearfix]*/div.toolbar {
-  width: 793px;
+  width: 100%;
   height: 32px;
-  background: #A8AFB6;
-  border-top: 1px solid #D0D5DA;
-  border-bottom: 1px solid #43586B;
-  border-right: 1px solid #43586B;
-  border-left: 1px solid #43586B;
-  /*+border-radius:0 2px 2px;*/
-  -moz-border-radius: 0 2px 2px;
-  -webkit-border-radius: 0 2px 2px;
-  -khtml-border-radius: 0 2px 2px;
-  border-radius: 0 2px 2px;
-  border-radius: 0 2px 2px 2px;
+  /*+box-shadow:0px 1px 4px #CFCFCF;*/
+  -moz-box-shadow: 0px 1px 4px #CFCFCF;
+  -webkit-box-shadow: 0px 1px 4px #CFCFCF;
+  -o-box-shadow: 0px 1px 4px #CFCFCF;
+  box-shadow: 0px 1px 4px #CFCFCF;
   /*+placement:shift 0px -1px;*/
   position: relative;
   left: 0px;
@@ -2759,6 +2754,7 @@ div.detail-group.actions td {
   z-index: 6;
   position: absolute;
   top: 0px;
+  background: #ECECEC 0px -6px;
 }
 
 .detail-view .ui-tabs-panel div.toolbar {
@@ -2777,14 +2773,9 @@ div.toolbar div.filters {
 }
 
 div.toolbar div.filters label {
-  color: #4E5C6B;
+  color: #3F3B3B;
   font-size: 12px;
-  font-weight: bold;
-  /*+text-shadow:0px 1px 1px #CDCDCD;*/
-  -moz-text-shadow: 0px 1px 1px #CDCDCD;
-  -webkit-text-shadow: 0px 1px 1px #CDCDCD;
-  -o-text-shadow: 0px 1px 1px #CDCDCD;
-  text-shadow: 0px 1px 1px #CDCDCD;
+  font-weight: 100;
   display: block;
   float: left;
   padding: 5px 11px 0 0;
@@ -3131,7 +3122,8 @@ div.panel div.toolbar div.section-switcher {
 
 div.toolbar div.section-switcher div.section-select {
   float: right;
-  background: #A8AFB6;
+  font-size: 12px;
+  font-weight: 100;
 }
 
 div.toolbar div.section-switcher div.section {
@@ -3201,7 +3193,6 @@ div.toolbar div.section-switcher div.section.first.last a {
 
 div.toolbar div.section-switcher div.section-select {
   float: left;
-  background: #A8AFB6;
   height: 26px;
 }
 
@@ -3244,14 +3235,6 @@ div.toolbar div.filters {
 }
 
 div.toolbar label {
-  color: #4E5C6B;
-  font-size: 12px;
-  font-weight: bold;
-  /*+text-shadow:0px 1px 1px #CDCDCD;*/
-  -moz-text-shadow: 0px 1px 1px #CDCDCD;
-  -webkit-text-shadow: 0px 1px 1px #CDCDCD;
-  -o-text-shadow: 0px 1px 1px #CDCDCD;
-  text-shadow: 0px 1px 1px #CDCDCD;
 }
 
 div.toolbar div.filters select {


[24/50] [abbrv] git commit: updated refs/heads/object_store_migration to 5ec2a44

Posted by mc...@apache.org.
InputStream use fix in PropertiesUtil

- use PropertiesUtil.loadFromFile to read the properties
- test added

Signed-off-by: Laszlo Hornyak <la...@gmail.com>


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

Branch: refs/heads/object_store_migration
Commit: 58477834b6a4170022235a5ed0d495ee9c3ddd57
Parents: 5e1ea1a
Author: Laszlo Hornyak <la...@gmail.com>
Authored: Thu Oct 24 22:37:14 2013 +0200
Committer: Laszlo Hornyak <la...@gmail.com>
Committed: Sat Oct 26 17:47:34 2013 +0200

----------------------------------------------------------------------
 utils/src/com/cloud/utils/PropertiesUtil.java       |  2 +-
 utils/test/com/cloud/utils/PropertiesUtilsTest.java | 13 +++++++++++++
 2 files changed, 14 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/58477834/utils/src/com/cloud/utils/PropertiesUtil.java
----------------------------------------------------------------------
diff --git a/utils/src/com/cloud/utils/PropertiesUtil.java b/utils/src/com/cloud/utils/PropertiesUtil.java
index 6db66ff..6f3796a 100755
--- a/utils/src/com/cloud/utils/PropertiesUtil.java
+++ b/utils/src/com/cloud/utils/PropertiesUtil.java
@@ -130,7 +130,7 @@ public class PropertiesUtil {
             File commandsFile = findConfigFile(configFile);
             if (commandsFile != null) {
                 try {
-                    preProcessedCommands.load(new FileInputStream(commandsFile));
+                    loadFromFile(preProcessedCommands, commandsFile);
                 } catch (FileNotFoundException fnfex) {
                     // in case of a file within a jar in classpath, try to open stream using url
                     InputStream stream = PropertiesUtil.openStreamFromURL(configFile);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/58477834/utils/test/com/cloud/utils/PropertiesUtilsTest.java
----------------------------------------------------------------------
diff --git a/utils/test/com/cloud/utils/PropertiesUtilsTest.java b/utils/test/com/cloud/utils/PropertiesUtilsTest.java
index 5ebe095..d27a0b4 100644
--- a/utils/test/com/cloud/utils/PropertiesUtilsTest.java
+++ b/utils/test/com/cloud/utils/PropertiesUtilsTest.java
@@ -18,6 +18,7 @@ package com.cloud.utils;
 
 import java.io.File;
 import java.io.IOException;
+import java.util.Map;
 import java.util.Properties;
 
 import org.apache.commons.io.FileUtils;
@@ -30,6 +31,7 @@ public class PropertiesUtilsTest {
         File configFile = PropertiesUtil.findConfigFile("notexistingresource");
         Assert.assertNull(configFile);
     }
+
     @Test
     public void loadFromFile() throws IOException {
         File file = File.createTempFile("test", ".properties");
@@ -38,4 +40,15 @@ public class PropertiesUtilsTest {
         PropertiesUtil.loadFromFile(properties, file);
         Assert.assertEquals("b", properties.get("a"));
     }
+
+    @Test
+    public void processConfigFile() throws IOException {
+        File tempFile = File.createTempFile("temp", ".properties");
+        FileUtils.writeStringToFile(tempFile, "a=b\nc=d\n");
+        Map<String, String> config = PropertiesUtil
+                .processConfigFile(new String[] { tempFile.getAbsolutePath() });
+        Assert.assertEquals("b", config.get("a"));
+        Assert.assertEquals("d", config.get("c"));
+        tempFile.delete();
+    }
 }


[45/50] [abbrv] git commit: updated refs/heads/object_store_migration to 5ec2a44

Posted by mc...@apache.org.
Style toolbar, tables


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

Branch: refs/heads/object_store_migration
Commit: 9b1cfa41eb0287670a7ee191c5a4e99bd9cbb110
Parents: ee1c83e
Author: Brian Federle <br...@citrix.com>
Authored: Mon Oct 28 13:56:12 2013 -0700
Committer: Brian Federle <br...@citrix.com>
Committed: Mon Oct 28 13:56:12 2013 -0700

----------------------------------------------------------------------
 ui/css/cloudstack3.css | 14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/9b1cfa41/ui/css/cloudstack3.css
----------------------------------------------------------------------
diff --git a/ui/css/cloudstack3.css b/ui/css/cloudstack3.css
index 8b7c339..2861e11 100644
--- a/ui/css/cloudstack3.css
+++ b/ui/css/cloudstack3.css
@@ -115,7 +115,7 @@ table thead {
 
 table thead th {
   border: 1px solid #C6C3C3;
-  color: #566677;
+  color: #525252;
   border-top: none;
   border-bottom: 1px solid #CFC9C9;
   text-align: left;
@@ -124,7 +124,7 @@ table thead th {
   -webkit-text-shadow: 0px 1px 1px #FFFFFF;
   -o-text-shadow: 0px 1px 1px #FFFFFF;
   text-shadow: 0px 1px 1px #FFFFFF;
-  font-weight: normal;
+  font-weight: bold;
 }
 
 table thead th.sorted {
@@ -148,7 +148,7 @@ table tbody td,
 table th {
   padding: 10px 5px 8px;
   border-right: 1px solid #BFBFBF;
-  color: #495A76;
+  color: #282828;
   clear: none;
   min-width: 88px;
   font-size: 11px;
@@ -196,7 +196,7 @@ table thead th.quick-view {
   max-width: 58px !important;
   width: 58px !important;
   height: 14px !important;
-  text-indent: 7px;
+  text-indent: 2px;
 }
 
 table tbody td.quick-view {
@@ -2864,9 +2864,9 @@ div.toolbar div.button.main-action,
   left: 0px;
   top: 5px;
   background: url(../images/gradients.png) 0px -98px;
-  font-size: 11px;
-  font-weight: bold;
-  color: #4A5A6D;
+  font-size: 12px;
+  font-weight: 100;
+  color: #000000;
   margin: 0 14px 0 0;
   cursor: pointer;
   /*+text-shadow:0px 1px 1px #DEE5EA;*/


[13/50] [abbrv] git commit: updated refs/heads/object_store_migration to 5ec2a44

Posted by mc...@apache.org.
Merge branch 'pluggable_vm_snapshot'

Conflicts:
	client/tomcatconf/applicationContext.xml.in
	engine/storage/integration-test/test/org/apache/cloudstack/storage/test/SnapshotTest.java
	engine/storage/integration-test/test/resources/storageContext.xml
	server/src/com/cloud/storage/snapshot/SnapshotManagerImpl.java
	server/src/com/cloud/vm/snapshot/VMSnapshotManagerImpl.java


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

Branch: refs/heads/object_store_migration
Commit: 51a8086cf6d1cdf7db3f89468e210020a179a57c
Parents: 56f1277 a6ce66e
Author: Edison Su <su...@gmail.com>
Authored: Fri Oct 25 16:47:17 2013 -0700
Committer: Edison Su <su...@gmail.com>
Committed: Fri Oct 25 16:47:17 2013 -0700

----------------------------------------------------------------------
 .../cloud/agent/api/CreateVMSnapshotAnswer.java |  12 +-
 .../agent/api/CreateVMSnapshotCommand.java      |   4 +-
 .../cloud/agent/api/DeleteVMSnapshotAnswer.java |  12 +-
 .../agent/api/DeleteVMSnapshotCommand.java      |   3 +-
 .../agent/api/RevertToVMSnapshotAnswer.java     |  14 +-
 .../agent/api/RevertToVMSnapshotCommand.java    |   3 +-
 .../cloud/agent/api/VMSnapshotBaseCommand.java  |  10 +-
 .../cloudstack/storage/to/VolumeObjectTO.java   |  12 +
 .../api/storage/VMSnapshotStrategy.java         |  28 ++
 .../cloud/vm/snapshot/VMSnapshotDetailsVO.java  |  87 ++++
 .../src/com/cloud/vm/snapshot/VMSnapshotVO.java |   2 +-
 .../vm/snapshot/dao/VMSnapshotDetailsDao.java   |  28 ++
 .../snapshot/dao/VMSnapshotDetailsDaoImpl.java  |  52 +++
 .../motion/AncientDataMotionStrategy.java       |  26 --
 .../vm/snapshot/dao/VmSnapshotDaoTest.java      |  46 ++
 .../storage/test/ChildTestConfiguration.java    |  47 +-
 .../cloudstack/storage/test/SnapshotTest.java   |  89 ++--
 .../test/resources/storageContext.xml           |   5 +
 engine/storage/snapshot/pom.xml                 |  32 ++
 .../storage/snapshot/SnapshotServiceImpl.java   |  44 +-
 .../snapshot/XenserverSnapshotStrategy.java     |  27 +-
 .../vmsnapshot/DefaultVMSnapshotStrategy.java   | 370 +++++++++++++++
 .../storage/vmsnapshot/VMSnapshotHelper.java    |  38 ++
 .../vmsnapshot/VMSnapshotHelperImpl.java        | 148 ++++++
 .../test/src/VMSnapshotStrategyTest.java        | 256 +++++++++++
 .../storage/volume/VolumeServiceImpl.java       |  85 ++--
 .../manager/VmwareStorageManagerImpl.java       |  87 ++--
 .../xen/resource/CitrixResourceBase.java        |  28 +-
 .../storage/snapshot/SnapshotManagerImpl.java   |  93 ----
 .../vm/snapshot/VMSnapshotManagerImpl.java      | 455 +++----------------
 .../vm/snapshot/VMSnapshotManagerTest.java      |   7 -
 setup/db/db/schema-421to430.sql                 |   9 +
 32 files changed, 1390 insertions(+), 769 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/51a8086c/engine/storage/datamotion/src/org/apache/cloudstack/storage/motion/AncientDataMotionStrategy.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/51a8086c/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/ChildTestConfiguration.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/51a8086c/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/SnapshotTest.java
----------------------------------------------------------------------
diff --cc engine/storage/integration-test/test/org/apache/cloudstack/storage/test/SnapshotTest.java
index 1407707,36bc912..550a6bf
--- a/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/SnapshotTest.java
+++ b/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/SnapshotTest.java
@@@ -406,10 -399,13 +403,11 @@@ public class SnapshotTest extends Cloud
          SnapshotInfo snapshot = this.snapshotFactory.getSnapshot(snapshotVO.getId(), vol.getDataStore());
          boolean result = false;
  
 -        StrategyPriority.sortStrategies(snapshotStrategies, snapshot);
+ 
 -        for (SnapshotStrategy strategy : this.snapshotStrategies) {
 -            if (strategy.canHandle(snapshot) != StrategyPriority.Priority.CANT_HANDLE) {
 -                snapshot = strategy.takeSnapshot(snapshot);
 -                result = true;
 -            }
 +        SnapshotStrategy snapshotStrategy = storageStrategyFactory.getSnapshotStrategy(snapshot, SnapshotOperation.TAKE);
 +        if (snapshotStrategy != null) {
 +            snapshot = snapshotStrategy.takeSnapshot(snapshot);
 +            result = true;
          }
  
          AssertJUnit.assertTrue(result);
@@@ -428,9 -424,12 +426,11 @@@
          SnapshotInfo snapshot = this.snapshotFactory.getSnapshot(snapshotVO.getId(), vol.getDataStore());
          SnapshotInfo newSnapshot = null;
  
 -        StrategyPriority.sortStrategies(snapshotStrategies, newSnapshot);
+ 
 -        for (SnapshotStrategy strategy : this.snapshotStrategies) {
 -            if (strategy.canHandle(snapshot) != StrategyPriority.Priority.CANT_HANDLE) {
 -                newSnapshot = strategy.takeSnapshot(snapshot);
 -            }
 +        SnapshotStrategy snapshotStrategy = storageStrategyFactory.getSnapshotStrategy(snapshot, SnapshotOperation.TAKE);
 +        if (snapshotStrategy != null) {
 +            newSnapshot = snapshotStrategy.takeSnapshot(snapshot);
++
          }
          AssertJUnit.assertNotNull(newSnapshot);
  
@@@ -480,11 -482,13 +480,12 @@@
          SnapshotInfo snapshot = this.snapshotFactory.getSnapshot(snapshotVO.getId(), vol.getDataStore());
          SnapshotInfo newSnapshot = null;
  
 -        StrategyPriority.sortStrategies(snapshotStrategies, newSnapshot);
+ 
 -        for (SnapshotStrategy strategy : this.snapshotStrategies) {
 -            if (strategy.canHandle(snapshot) != StrategyPriority.Priority.CANT_HANDLE) {
 -                newSnapshot = strategy.takeSnapshot(snapshot);
 -            }
 +        SnapshotStrategy snapshotStrategy = storageStrategyFactory.getSnapshotStrategy(snapshot, SnapshotOperation.TAKE);
 +        if (snapshotStrategy != null) {
 +            newSnapshot = snapshotStrategy.takeSnapshot(snapshot);
          }
 +
          AssertJUnit.assertNotNull(newSnapshot);
  
          LocalHostEndpoint ep = new MockLocalHostEndPoint();

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/51a8086c/engine/storage/integration-test/test/resources/storageContext.xml
----------------------------------------------------------------------
diff --cc engine/storage/integration-test/test/resources/storageContext.xml
index e4b8274,884e813..0dcd6a8
--- a/engine/storage/integration-test/test/resources/storageContext.xml
+++ b/engine/storage/integration-test/test/resources/storageContext.xml
@@@ -85,5 -85,6 +85,10 @@@
    <bean id="AccountGuestVlanMapDaoImpl" class="com.cloud.network.dao.AccountGuestVlanMapDaoImpl" />
    <bean id="StorageCacheReplacementAlgorithm" class="org.apache.cloudstack.storage.cache.manager.StorageCacheReplacementAlgorithmLRU" />
    <bean id="ServiceOfferingDetailsDao" class="com.cloud.service.dao.ServiceOfferingDetailsDaoImpl" />
++<<<<<<< HEAD
 +  <bean id="storageStrategyFactoryImpl" class="org.apache.cloudstack.storage.helper.StorageStrategyFactoryImpl" />
++=======
+   <bean id="vmsnapshotDetailsDao" class="com.cloud.vm.snapshot.dao.VMSnapshotDetailsDaoImpl" />
+   <bean id="snapshotManager" class="com.cloud.storage.snapshot.SnapshotManagerImpl" />
++>>>>>>> pluggable_vm_snapshot
  </beans>

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/51a8086c/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/XenserverSnapshotStrategy.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/51a8086c/engine/storage/snapshot/src/org/apache/cloudstack/storage/vmsnapshot/DefaultVMSnapshotStrategy.java
----------------------------------------------------------------------
diff --cc engine/storage/snapshot/src/org/apache/cloudstack/storage/vmsnapshot/DefaultVMSnapshotStrategy.java
index 0000000,6b5e5fb..0ef8ebb
mode 000000,100644..100644
--- a/engine/storage/snapshot/src/org/apache/cloudstack/storage/vmsnapshot/DefaultVMSnapshotStrategy.java
+++ b/engine/storage/snapshot/src/org/apache/cloudstack/storage/vmsnapshot/DefaultVMSnapshotStrategy.java
@@@ -1,0 -1,369 +1,370 @@@
+ /*
+  * 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.vmsnapshot;
+ 
+ import java.util.List;
+ import java.util.Map;
+ 
+ import javax.inject.Inject;
+ import javax.naming.ConfigurationException;
+ 
+ import org.apache.cloudstack.engine.subsystem.api.storage.VMSnapshotStrategy;
+ import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
+ import org.apache.cloudstack.storage.to.VolumeObjectTO;
+ import org.apache.log4j.Logger;
+ 
+ import com.cloud.agent.AgentManager;
+ import com.cloud.agent.api.Answer;
+ import com.cloud.agent.api.CreateVMSnapshotAnswer;
+ import com.cloud.agent.api.CreateVMSnapshotCommand;
+ import com.cloud.agent.api.DeleteVMSnapshotAnswer;
+ import com.cloud.agent.api.DeleteVMSnapshotCommand;
+ import com.cloud.agent.api.RevertToVMSnapshotAnswer;
+ import com.cloud.agent.api.RevertToVMSnapshotCommand;
+ import com.cloud.agent.api.VMSnapshotTO;
+ import com.cloud.event.EventTypes;
+ import com.cloud.event.UsageEventUtils;
+ import com.cloud.exception.AgentUnavailableException;
+ import com.cloud.exception.OperationTimedoutException;
+ import com.cloud.storage.DiskOfferingVO;
+ import com.cloud.storage.GuestOSVO;
+ import com.cloud.storage.VolumeVO;
+ import com.cloud.storage.dao.DiskOfferingDao;
+ import com.cloud.storage.dao.GuestOSDao;
+ import com.cloud.storage.dao.VolumeDao;
+ import com.cloud.uservm.UserVm;
+ import com.cloud.utils.NumbersUtil;
+ import com.cloud.utils.component.ManagerBase;
+ import com.cloud.utils.db.DB;
+ import com.cloud.utils.db.Transaction;
++import com.cloud.utils.db.TransactionCallbackWithExceptionNoReturn;
++import com.cloud.utils.db.TransactionStatus;
+ import com.cloud.utils.exception.CloudRuntimeException;
+ import com.cloud.utils.fsm.NoTransitionException;
+ import com.cloud.vm.UserVmVO;
+ import com.cloud.vm.dao.UserVmDao;
+ import com.cloud.vm.snapshot.VMSnapshot;
+ import com.cloud.vm.snapshot.VMSnapshotVO;
+ import com.cloud.vm.snapshot.dao.VMSnapshotDao;
+ 
+ public class DefaultVMSnapshotStrategy extends ManagerBase implements VMSnapshotStrategy {
+     private static final Logger s_logger = Logger.getLogger(DefaultVMSnapshotStrategy.class);
+     @Inject
+     VMSnapshotHelper vmSnapshotHelper;
+     @Inject
+     GuestOSDao guestOSDao;
+     @Inject
+     UserVmDao userVmDao;
+     @Inject
+     VMSnapshotDao vmSnapshotDao;
+     int _wait;
+     @Inject
+     ConfigurationDao configurationDao;
+     @Inject
+     AgentManager agentMgr;
+     @Inject
+     VolumeDao volumeDao;
+     @Inject
+     DiskOfferingDao diskOfferingDao;
+     @Override
+     public boolean configure(String name, Map<String, Object> params) throws ConfigurationException {
+         String value = configurationDao.getValue("vmsnapshot.create.wait");
+         _wait = NumbersUtil.parseInt(value, 1800);
+         return true;
+     }
+ 
+     public VMSnapshot takeVMSnapshot(VMSnapshot vmSnapshot) {
+         Long hostId = vmSnapshotHelper.pickRunningHost(vmSnapshot.getVmId());
+         UserVm userVm = userVmDao.findById(vmSnapshot.getVmId());
+         VMSnapshotVO vmSnapshotVO = (VMSnapshotVO)vmSnapshot;
+         try {
+             vmSnapshotHelper.vmSnapshotStateTransitTo(vmSnapshotVO, VMSnapshot.Event.CreateRequested);
+         } catch (NoTransitionException e) {
+             throw new CloudRuntimeException(e.getMessage());
+         }
+ 
+         CreateVMSnapshotAnswer answer = null;
+         boolean result = false;
+         try {
+             GuestOSVO guestOS = guestOSDao.findById(userVm.getGuestOSId());
+ 
+             List<VolumeObjectTO> volumeTOs = vmSnapshotHelper.getVolumeTOList(userVm.getId());
+ 
+             VMSnapshotTO current = null;
+             VMSnapshotVO currentSnapshot = vmSnapshotDao.findCurrentSnapshotByVmId(userVm.getId());
+             if (currentSnapshot != null)
+                 current = vmSnapshotHelper.getSnapshotWithParents(currentSnapshot);
+             VMSnapshotTO target = new VMSnapshotTO(vmSnapshot.getId(),  vmSnapshot.getName(), vmSnapshot.getType(), null, vmSnapshot.getDescription(), false,
+                     current);
+             if (current == null)
+                 vmSnapshotVO.setParent(null);
+             else
+                 vmSnapshotVO.setParent(current.getId());
+ 
+             CreateVMSnapshotCommand ccmd = new CreateVMSnapshotCommand(userVm.getInstanceName(),target ,volumeTOs, guestOS.getDisplayName(),userVm.getState());
+             ccmd.setWait(_wait);
+ 
+             answer = (CreateVMSnapshotAnswer)agentMgr.send(hostId, ccmd);
+             if (answer != null && answer.getResult()) {
+                 processAnswer(vmSnapshotVO, userVm, answer, hostId);
+                 s_logger.debug("Create vm snapshot " + vmSnapshot.getName() + " succeeded for vm: " + userVm.getInstanceName());
+                 result = true;
+ 
+                 for (VolumeObjectTO volumeTo : answer.getVolumeTOs()){
+                     publishUsageEvent(EventTypes.EVENT_VM_SNAPSHOT_CREATE,vmSnapshot,userVm,volumeTo);
+                 }
+                 return vmSnapshot;
+             } else {
+                 String errMsg = "Creating VM snapshot: " + vmSnapshot.getName() + " failed";
+                 if(answer != null && answer.getDetails() != null)
+                     errMsg = errMsg + " due to " + answer.getDetails();
+                 s_logger.error(errMsg);
+                 throw new CloudRuntimeException(errMsg);
+             }
+         } catch (OperationTimedoutException e) {
+             s_logger.debug("Creating VM snapshot: " + vmSnapshot.getName() + " failed: " + e.toString());
+             throw new CloudRuntimeException("Creating VM snapshot: " + vmSnapshot.getName() + " failed: " + e.toString());
+         } catch (AgentUnavailableException e) {
+             s_logger.debug("Creating VM snapshot: " + vmSnapshot.getName() + " failed", e);
+             throw new CloudRuntimeException("Creating VM snapshot: " + vmSnapshot.getName() + " failed: " + e.toString());
+         } finally{
+             if (!result) {
+                 try {
+                     vmSnapshotHelper.vmSnapshotStateTransitTo(vmSnapshot, VMSnapshot.Event.OperationFailed);
+                 } catch (NoTransitionException e1) {
+                     s_logger.error("Cannot set vm snapshot state due to: " + e1.getMessage());
+                 }
+             }
+         }
+     }
+ 
+     @Override
+     public boolean deleteVMSnapshot(VMSnapshot vmSnapshot) {
+         UserVmVO userVm = userVmDao.findById(vmSnapshot.getVmId());
+         VMSnapshotVO vmSnapshotVO = (VMSnapshotVO)vmSnapshot;
+         try {
+             vmSnapshotHelper.vmSnapshotStateTransitTo(vmSnapshot,VMSnapshot.Event.ExpungeRequested);
+         } catch (NoTransitionException e) {
+             s_logger.debug("Failed to change vm snapshot state with event ExpungeRequested");
+             throw new CloudRuntimeException("Failed to change vm snapshot state with event ExpungeRequested: " + e.getMessage());
+         }
+ 
+         try {
+             Long hostId = vmSnapshotHelper.pickRunningHost(vmSnapshot.getVmId());
+ 
+             List<VolumeObjectTO> volumeTOs = vmSnapshotHelper.getVolumeTOList(vmSnapshot.getVmId());
+ 
+             String vmInstanceName = userVm.getInstanceName();
+             VMSnapshotTO parent = vmSnapshotHelper.getSnapshotWithParents(vmSnapshotVO).getParent();
+             VMSnapshotTO vmSnapshotTO = new VMSnapshotTO(vmSnapshot.getId(), vmSnapshot.getName(), vmSnapshot.getType(),
+                     vmSnapshot.getCreated().getTime(), vmSnapshot.getDescription(), vmSnapshot.getCurrent(), parent);
+             GuestOSVO guestOS = guestOSDao.findById(userVm.getGuestOSId());
+             DeleteVMSnapshotCommand deleteSnapshotCommand = new DeleteVMSnapshotCommand(vmInstanceName, vmSnapshotTO, volumeTOs,guestOS.getDisplayName());
+ 
+             Answer answer = agentMgr.send(hostId, deleteSnapshotCommand);
+ 
+             if (answer != null && answer.getResult()) {
+                 DeleteVMSnapshotAnswer deleteVMSnapshotAnswer = (DeleteVMSnapshotAnswer)answer;
+                 processAnswer(vmSnapshotVO, userVm, answer, hostId);
+                 for (VolumeObjectTO volumeTo : deleteVMSnapshotAnswer.getVolumeTOs()){
+                     publishUsageEvent(EventTypes.EVENT_VM_SNAPSHOT_DELETE,vmSnapshot,userVm,volumeTo);
+                 }
+                 return true;
+             } else {
+                 String errMsg = (answer == null) ? null : answer.getDetails();
+                 s_logger.error("Delete vm snapshot " + vmSnapshot.getName() + " of vm " + userVm.getInstanceName() + " failed due to " + errMsg);
+                 throw new  CloudRuntimeException("Delete vm snapshot " + vmSnapshot.getName() + " of vm " + userVm.getInstanceName() + " failed due to " + errMsg);
+             }
+         } catch (OperationTimedoutException e) {
+             throw new CloudRuntimeException("Delete vm snapshot " + vmSnapshot.getName() + " of vm " + userVm.getInstanceName() + " failed due to " + e.getMessage());
+         } catch (AgentUnavailableException e) {
+             throw new CloudRuntimeException("Delete vm snapshot " + vmSnapshot.getName() + " of vm " + userVm.getInstanceName() + " failed due to " + e.getMessage());
+         }
+     }
+ 
+     @DB
 -    protected void processAnswer(VMSnapshotVO vmSnapshot, UserVm userVm, Answer as, Long hostId) {
 -        final Transaction txn = Transaction.currentTxn();
++    protected void processAnswer(final VMSnapshotVO vmSnapshot, UserVm userVm, final Answer as, Long hostId) {
+         try {
 -            txn.start();
 -            if (as instanceof CreateVMSnapshotAnswer) {
 -                CreateVMSnapshotAnswer answer = (CreateVMSnapshotAnswer) as;
 -                finalizeCreate(vmSnapshot, answer.getVolumeTOs());
 -                vmSnapshotHelper.vmSnapshotStateTransitTo(vmSnapshot, VMSnapshot.Event.OperationSucceeded);
 -            } else if (as instanceof RevertToVMSnapshotAnswer) {
 -                RevertToVMSnapshotAnswer answer = (RevertToVMSnapshotAnswer) as;
 -                finalizeRevert(vmSnapshot, answer.getVolumeTOs());
 -                vmSnapshotHelper.vmSnapshotStateTransitTo(vmSnapshot, VMSnapshot.Event.OperationSucceeded);
 -            } else if (as instanceof DeleteVMSnapshotAnswer) {
 -                DeleteVMSnapshotAnswer answer = (DeleteVMSnapshotAnswer) as;
 -                finalizeDelete(vmSnapshot, answer.getVolumeTOs());
 -                vmSnapshotDao.remove(vmSnapshot.getId());
 -            }
 -            txn.commit();
++            Transaction.execute(new TransactionCallbackWithExceptionNoReturn<NoTransitionException>() {
++                @Override
++                public void doInTransactionWithoutResult(TransactionStatus status) throws NoTransitionException {
++                    if (as instanceof CreateVMSnapshotAnswer) {
++                        CreateVMSnapshotAnswer answer = (CreateVMSnapshotAnswer) as;
++                        finalizeCreate(vmSnapshot, answer.getVolumeTOs());
++                        vmSnapshotHelper.vmSnapshotStateTransitTo(vmSnapshot, VMSnapshot.Event.OperationSucceeded);
++                    } else if (as instanceof RevertToVMSnapshotAnswer) {
++                        RevertToVMSnapshotAnswer answer = (RevertToVMSnapshotAnswer) as;
++                        finalizeRevert(vmSnapshot, answer.getVolumeTOs());
++                        vmSnapshotHelper.vmSnapshotStateTransitTo(vmSnapshot, VMSnapshot.Event.OperationSucceeded);
++                    } else if (as instanceof DeleteVMSnapshotAnswer) {
++                        DeleteVMSnapshotAnswer answer = (DeleteVMSnapshotAnswer) as;
++                        finalizeDelete(vmSnapshot, answer.getVolumeTOs());
++                        vmSnapshotDao.remove(vmSnapshot.getId());
++                    }
++                }
++            });
+         } catch (Exception e) {
+             String errMsg = "Error while process answer: " + as.getClass() + " due to " + e.getMessage();
+             s_logger.error(errMsg, e);
 -            txn.rollback();
+             throw new CloudRuntimeException(errMsg);
 -        } finally {
 -            txn.close();
+         }
+     }
+ 
+     protected void finalizeDelete(VMSnapshotVO vmSnapshot, List<VolumeObjectTO> VolumeTOs) {
+         // update volumes path
+         updateVolumePath(VolumeTOs);
+ 
+         // update children's parent snapshots
+         List<VMSnapshotVO> children= vmSnapshotDao.listByParent(vmSnapshot.getId());
+         for (VMSnapshotVO child : children) {
+             child.setParent(vmSnapshot.getParent());
+             vmSnapshotDao.persist(child);
+         }
+ 
+         // update current snapshot
+         VMSnapshotVO current = vmSnapshotDao.findCurrentSnapshotByVmId(vmSnapshot.getVmId());
+         if(current != null && current.getId() == vmSnapshot.getId() && vmSnapshot.getParent() != null){
+             VMSnapshotVO parent = vmSnapshotDao.findById(vmSnapshot.getParent());
+             parent.setCurrent(true);
+             vmSnapshotDao.persist(parent);
+         }
+         vmSnapshot.setCurrent(false);
+         vmSnapshotDao.persist(vmSnapshot);
+     }
+ 
+     protected void finalizeCreate(VMSnapshotVO vmSnapshot, List<VolumeObjectTO> VolumeTOs) {
+         // update volumes path
+         updateVolumePath(VolumeTOs);
+ 
+         vmSnapshot.setCurrent(true);
+ 
+         // change current snapshot
+         if (vmSnapshot.getParent() != null) {
+             VMSnapshotVO previousCurrent = vmSnapshotDao.findById(vmSnapshot.getParent());
+             previousCurrent.setCurrent(false);
+             vmSnapshotDao.persist(previousCurrent);
+         }
+         vmSnapshotDao.persist(vmSnapshot);
+     }
+ 
+     protected void finalizeRevert(VMSnapshotVO vmSnapshot, List<VolumeObjectTO> volumeToList) {
+         // update volumes path
+         updateVolumePath(volumeToList);
+ 
+         // update current snapshot, current snapshot is the one reverted to
+         VMSnapshotVO previousCurrent = vmSnapshotDao.findCurrentSnapshotByVmId(vmSnapshot.getVmId());
+         if(previousCurrent != null){
+             previousCurrent.setCurrent(false);
+             vmSnapshotDao.persist(previousCurrent);
+         }
+         vmSnapshot.setCurrent(true);
+         vmSnapshotDao.persist(vmSnapshot);
+     }
+ 
+     private void updateVolumePath(List<VolumeObjectTO> volumeTOs) {
+         for (VolumeObjectTO volume : volumeTOs) {
+             if (volume.getPath() != null) {
+                 VolumeVO volumeVO = volumeDao.findById(volume.getId());
+                 volumeVO.setPath(volume.getPath());
+                 volumeVO.setVmSnapshotChainSize(volume.getSize());
+                 volumeDao.persist(volumeVO);
+             }
+         }
+     }
+ 
+     private void publishUsageEvent(String type, VMSnapshot vmSnapshot, UserVm userVm, VolumeObjectTO volumeTo){
+         VolumeVO volume = volumeDao.findById(volumeTo.getId());
+         Long diskOfferingId = volume.getDiskOfferingId();
+         Long offeringId = null;
+         if (diskOfferingId != null) {
+             DiskOfferingVO offering = diskOfferingDao.findById(diskOfferingId);
+             if (offering != null
+                     && (offering.getType() == DiskOfferingVO.Type.Disk)) {
+                 offeringId = offering.getId();
+             }
+         }
+         UsageEventUtils.publishUsageEvent(
+                 type,
+                 vmSnapshot.getAccountId(),
+                 userVm.getDataCenterId(),
+                 userVm.getId(),
+                 vmSnapshot.getName(),
+                 offeringId,
+                 volume.getId(), // save volume's id into templateId field
+                 volumeTo.getSize(),
+                 VMSnapshot.class.getName(), vmSnapshot.getUuid());
+     }
+ 
+     @Override
+     public boolean revertVMSnapshot(VMSnapshot vmSnapshot) {
+         VMSnapshotVO vmSnapshotVO = (VMSnapshotVO)vmSnapshot;
+         UserVmVO userVm = userVmDao.findById(vmSnapshot.getVmId());
+         try {
+             vmSnapshotHelper.vmSnapshotStateTransitTo(vmSnapshotVO, VMSnapshot.Event.RevertRequested);
+         } catch (NoTransitionException e) {
+             throw new CloudRuntimeException(e.getMessage());
+         }
+ 
+         boolean result = false;
+         try {
+             VMSnapshotVO snapshot = vmSnapshotDao.findById(vmSnapshotVO.getId());
+             List<VolumeObjectTO> volumeTOs = vmSnapshotHelper.getVolumeTOList(userVm.getId());
+             String vmInstanceName = userVm.getInstanceName();
+             VMSnapshotTO parent = vmSnapshotHelper.getSnapshotWithParents(snapshot).getParent();
+ 
+             VMSnapshotTO vmSnapshotTO = new VMSnapshotTO(snapshot.getId(), snapshot.getName(), snapshot.getType(),
+                     snapshot.getCreated().getTime(), snapshot.getDescription(), snapshot.getCurrent(), parent);
+             Long hostId = vmSnapshotHelper.pickRunningHost(vmSnapshot.getVmId());
+             GuestOSVO guestOS = guestOSDao.findById(userVm.getGuestOSId());
+             RevertToVMSnapshotCommand revertToSnapshotCommand = new RevertToVMSnapshotCommand(vmInstanceName, vmSnapshotTO, volumeTOs, guestOS.getDisplayName());
+ 
+             RevertToVMSnapshotAnswer answer = (RevertToVMSnapshotAnswer) agentMgr.send(hostId, revertToSnapshotCommand);
+             if (answer != null && answer.getResult()) {
+                 processAnswer(vmSnapshotVO, userVm, answer, hostId);
+                 result = true;
+             } else {
+                 String errMsg = "Revert VM: " + userVm.getInstanceName() + " to snapshot: "+ vmSnapshotVO.getName() + " failed";
+                 if(answer != null && answer.getDetails() != null)
+                     errMsg = errMsg + " due to " + answer.getDetails();
+                 s_logger.error(errMsg);
+                 throw new CloudRuntimeException(errMsg);
+             }
+         } catch (OperationTimedoutException e) {
+             s_logger.debug("Failed to revert vm snapshot", e);
+             throw new CloudRuntimeException(e.getMessage());
+         } catch (AgentUnavailableException e) {
+             s_logger.debug("Failed to revert vm snapshot", e);
+             throw new CloudRuntimeException(e.getMessage());
+         } finally {
+             if (!result) {
+                 try {
+                     vmSnapshotHelper.vmSnapshotStateTransitTo(vmSnapshot, VMSnapshot.Event.OperationFailed);
+                 } catch (NoTransitionException e1) {
+                     s_logger.error("Cannot set vm snapshot state due to: " + e1.getMessage());
+                 }
+             }
+         }
+         return result;
+     }
+ 
+     @Override
+     public boolean canHandle(VMSnapshot vmSnapshot) {
+         return true;
+     }
+ }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/51a8086c/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/51a8086c/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/51a8086c/server/src/com/cloud/storage/snapshot/SnapshotManagerImpl.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/51a8086c/server/src/com/cloud/vm/snapshot/VMSnapshotManagerImpl.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/vm/snapshot/VMSnapshotManagerImpl.java
index cd064f5,7a200ff..3f473bd
--- a/server/src/com/cloud/vm/snapshot/VMSnapshotManagerImpl.java
+++ b/server/src/com/cloud/vm/snapshot/VMSnapshotManagerImpl.java
@@@ -17,40 -17,8 +17,39 @@@
  
  package com.cloud.vm.snapshot;
  
 +import java.util.ArrayList;
 +import java.util.Date;
 +import java.util.HashMap;
 +import java.util.List;
 +import java.util.Map;
 +
 +import javax.ejb.Local;
 +import javax.inject.Inject;
 +import javax.naming.ConfigurationException;
 +
 +import org.apache.log4j.Logger;
 +import org.springframework.stereotype.Component;
 +import org.apache.cloudstack.api.command.user.vmsnapshot.ListVMSnapshotCmd;
 +import org.apache.cloudstack.context.CallContext;
 +import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
 +import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
 +import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
 +import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
 +
 +import com.cloud.agent.AgentManager;
 +import com.cloud.agent.api.Answer;
 +import com.cloud.agent.api.Command;
 +import com.cloud.agent.api.CreateVMSnapshotAnswer;
 +import com.cloud.agent.api.CreateVMSnapshotCommand;
 +import com.cloud.agent.api.DeleteVMSnapshotAnswer;
 +import com.cloud.agent.api.DeleteVMSnapshotCommand;
 +import com.cloud.agent.api.RevertToVMSnapshotAnswer;
 +import com.cloud.agent.api.RevertToVMSnapshotCommand;
 +import com.cloud.agent.api.VMSnapshotTO;
 +import com.cloud.agent.api.to.VolumeTO;
++
  import com.cloud.event.ActionEvent;
  import com.cloud.event.EventTypes;
- import com.cloud.event.UsageEventUtils;
- import com.cloud.exception.AgentUnavailableException;
  import com.cloud.exception.ConcurrentOperationException;
  import com.cloud.exception.InsufficientCapacityException;
  import com.cloud.exception.InvalidParameterValueException;
@@@ -87,16 -44,7 +75,15 @@@ import com.cloud.utils.component.Manage
  import com.cloud.utils.db.Filter;
  import com.cloud.utils.db.SearchBuilder;
  import com.cloud.utils.db.SearchCriteria;
++
 +import com.cloud.utils.db.Transaction;
 +import com.cloud.utils.db.TransactionCallback;
 +import com.cloud.utils.db.TransactionCallbackNoReturn;
 +import com.cloud.utils.db.TransactionCallbackWithException;
 +import com.cloud.utils.db.TransactionCallbackWithExceptionNoReturn;
 +import com.cloud.utils.db.TransactionStatus;
++
  import com.cloud.utils.exception.CloudRuntimeException;
- import com.cloud.utils.fsm.NoTransitionException;
- import com.cloud.utils.fsm.StateMachine2;
  import com.cloud.vm.UserVmVO;
  import com.cloud.vm.VMInstanceVO;
  import com.cloud.vm.VirtualMachine;
@@@ -351,165 -330,14 +369,13 @@@ public class VMSnapshotManagerImpl exte
          if(vmSnapshot == null){
              throw new CloudRuntimeException("VM snapshot id: " + vmSnapshotId + " can not be found");
          }
-         Long hostId = pickRunningHost(vmId);
-         try {
-             vmSnapshotStateTransitTo(vmSnapshot, VMSnapshot.Event.CreateRequested);
-         } catch (NoTransitionException e) {
-             throw new CloudRuntimeException(e.getMessage());
-         }
-         return createVmSnapshotInternal(userVm, vmSnapshot, hostId);
-     }
--
-     protected VMSnapshot createVmSnapshotInternal(UserVmVO userVm, VMSnapshotVO vmSnapshot, Long hostId) {
-         CreateVMSnapshotAnswer answer = null;
-         try {
-             GuestOSVO guestOS = _guestOSDao.findById(userVm.getGuestOSId());
-             
-             // prepare snapshotVolumeTos
-             List<VolumeTO> volumeTOs = getVolumeTOList(userVm.getId());
-             
-             // prepare target snapshotTO and its parent snapshot (current snapshot)
-             VMSnapshotTO current = null;
-             VMSnapshotVO currentSnapshot = _vmSnapshotDao.findCurrentSnapshotByVmId(userVm.getId());
-             if (currentSnapshot != null)
-                 current = getSnapshotWithParents(currentSnapshot);
-             VMSnapshotTO target = new VMSnapshotTO(vmSnapshot.getId(),  vmSnapshot.getName(), vmSnapshot.getType(), null, vmSnapshot.getDescription(), false,
-                     current);
-             if (current == null)
-                 vmSnapshot.setParent(null);
-             else
-                 vmSnapshot.setParent(current.getId());
- 
-             CreateVMSnapshotCommand ccmd = new CreateVMSnapshotCommand(userVm.getInstanceName(),target ,volumeTOs, guestOS.getDisplayName(),userVm.getState());
-             ccmd.setWait(_wait);
-             
-             answer = (CreateVMSnapshotAnswer) sendToPool(hostId, ccmd);
-             if (answer != null && answer.getResult()) {
-                 processAnswer(vmSnapshot, userVm, answer, hostId);
-                 s_logger.debug("Create vm snapshot " + vmSnapshot.getName() + " succeeded for vm: " + userVm.getInstanceName());
-             }else{
-                 
-                 String errMsg = "Creating VM snapshot: " + vmSnapshot.getName() + " failed";
-                 if(answer != null && answer.getDetails() != null)
-                     errMsg = errMsg + " due to " + answer.getDetails();
-                 s_logger.error(errMsg);
-                 vmSnapshotStateTransitTo(vmSnapshot, VMSnapshot.Event.OperationFailed);
-                 throw new CloudRuntimeException(errMsg);
-             }
-             return vmSnapshot;
-         } catch (Exception e) {
-             if(e instanceof AgentUnavailableException){
-                 try {
-                     vmSnapshotStateTransitTo(vmSnapshot, VMSnapshot.Event.OperationFailed);
-                 } catch (NoTransitionException e1) {
-                     s_logger.error("Cannot set vm snapshot state due to: " + e1.getMessage());
-                 }
-             }
-             String msg = e.getMessage();
-             s_logger.error("Create vm snapshot " + vmSnapshot.getName() + " failed for vm: " + userVm.getInstanceName() + " due to " + msg);
-             throw new CloudRuntimeException(msg);
-         } finally{
-             if(vmSnapshot.getState() == VMSnapshot.State.Allocated){
-                 s_logger.warn("Create vm snapshot " + vmSnapshot.getName() + " failed for vm: " + userVm.getInstanceName());
-                 _vmSnapshotDao.remove(vmSnapshot.getId());
-             }
-             if(vmSnapshot.getState() == VMSnapshot.State.Ready && answer != null){
-                 for (VolumeTO volumeTo : answer.getVolumeTOs()){
-                     publishUsageEvent(EventTypes.EVENT_VM_SNAPSHOT_CREATE,vmSnapshot,userVm,volumeTo);
-                 }
-             }
-         }
-     }
- 
-     private void publishUsageEvent(String type, VMSnapshot vmSnapshot, UserVm userVm, VolumeTO volumeTo){
-         VolumeVO volume = _volumeDao.findById(volumeTo.getId());
-         Long diskOfferingId = volume.getDiskOfferingId();
-         Long offeringId = null;
-         if (diskOfferingId != null) {
-             DiskOfferingVO offering = _diskOfferingDao.findById(diskOfferingId);
-             if (offering != null
-                     && (offering.getType() == DiskOfferingVO.Type.Disk)) {
-                 offeringId = offering.getId();
-             }
-         }
-         UsageEventUtils.publishUsageEvent(
-                 type,
-                 vmSnapshot.getAccountId(),
-                 userVm.getDataCenterId(),
-                 userVm.getId(),
-                 vmSnapshot.getName(),
-                 offeringId,     
-                 volume.getId(), // save volume's id into templateId field
-                 volumeTo.getChainSize(),
-                 VMSnapshot.class.getName(), vmSnapshot.getUuid());       
-     }
-     
-     protected List<VolumeTO> getVolumeTOList(Long vmId) {
-         List<VolumeTO> volumeTOs = new ArrayList<VolumeTO>();
-         List<VolumeVO> volumeVos = _volumeDao.findByInstance(vmId);
-         
-         for (VolumeVO volume : volumeVos) {
-             StoragePool pool = (StoragePool)dataStoreMgr.getPrimaryDataStore(volume.getPoolId());
-             VolumeTO volumeTO = new VolumeTO(volume, pool);
-             volumeTOs.add(volumeTO);
-         }
-         return volumeTOs;
-     }
- 
-     // get snapshot and its parents recursively
-     private VMSnapshotTO getSnapshotWithParents(VMSnapshotVO snapshot) {
-         Map<Long, VMSnapshotVO> snapshotMap = new HashMap<Long, VMSnapshotVO>();
-         List<VMSnapshotVO> allSnapshots = _vmSnapshotDao.findByVm(snapshot.getVmId());
-         for (VMSnapshotVO vmSnapshotVO : allSnapshots) {
-             snapshotMap.put(vmSnapshotVO.getId(), vmSnapshotVO);
-         }
- 
-         VMSnapshotTO currentTO = convert2VMSnapshotTO(snapshot);
-         VMSnapshotTO result = currentTO;
-         VMSnapshotVO current = snapshot;
-         while (current.getParent() != null) {
-             VMSnapshotVO parent = snapshotMap.get(current.getParent());
-             currentTO.setParent(convert2VMSnapshotTO(parent));
-             current = snapshotMap.get(current.getParent());
-             currentTO = currentTO.getParent();
-         }
-         return result;
-     }
- 
-     private VMSnapshotTO convert2VMSnapshotTO(VMSnapshotVO vo) {
-         return new VMSnapshotTO(vo.getId(), vo.getName(),  vo.getType(), vo.getCreated().getTime(), vo.getDescription(),
-                 vo.getCurrent(), null);
-     }
- 
-     protected boolean vmSnapshotStateTransitTo(VMSnapshotVO vsnp, VMSnapshot.Event event) throws NoTransitionException {
-         return _vmSnapshottateMachine.transitTo(vsnp, event, null, _vmSnapshotDao);
-     }
-     
-     @DB
-     protected void processAnswer(final VMSnapshotVO vmSnapshot, UserVmVO  userVm, final Answer as, Long hostId) {
          try {
-             Transaction.execute(new TransactionCallbackWithExceptionNoReturn<NoTransitionException>() {
-                 @Override
-                 public void doInTransactionWithoutResult(TransactionStatus status) throws NoTransitionException {
-                     if (as instanceof CreateVMSnapshotAnswer) {
-                         CreateVMSnapshotAnswer answer = (CreateVMSnapshotAnswer) as;
-                         finalizeCreate(vmSnapshot, answer.getVolumeTOs());
-                         vmSnapshotStateTransitTo(vmSnapshot, VMSnapshot.Event.OperationSucceeded);
-                     } else if (as instanceof RevertToVMSnapshotAnswer) {
-                         RevertToVMSnapshotAnswer answer = (RevertToVMSnapshotAnswer) as;
-                         finalizeRevert(vmSnapshot, answer.getVolumeTOs());
-                         vmSnapshotStateTransitTo(vmSnapshot, VMSnapshot.Event.OperationSucceeded);
-                     } else if (as instanceof DeleteVMSnapshotAnswer) {
-                         DeleteVMSnapshotAnswer answer = (DeleteVMSnapshotAnswer) as;
-                         finalizeDelete(vmSnapshot, answer.getVolumeTOs());
-                         _vmSnapshotDao.remove(vmSnapshot.getId());
-                     }
-                 }
-             });
+             VMSnapshotStrategy strategy = findVMSnapshotStrategy(vmSnapshot);
+             VMSnapshot snapshot = strategy.takeVMSnapshot(vmSnapshot);
+             return snapshot;
          } catch (Exception e) {
-             String errMsg = "Error while process answer: " + as.getClass() + " due to " + e.getMessage();
-             s_logger.error(errMsg, e);
-             throw new CloudRuntimeException(errMsg);
+             s_logger.debug("Failed to create vm snapshot: " + vmSnapshotId ,e);
+             return null;
          }
      }
  

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/51a8086c/setup/db/db/schema-421to430.sql
----------------------------------------------------------------------


[43/50] [abbrv] git commit: updated refs/heads/object_store_migration to 5ec2a44

Posted by mc...@apache.org.
ResourceDetails - added createDetail to ResourceDetailDao interface to provide generic way of creating resourceDetail DB objects


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

Branch: refs/heads/object_store_migration
Commit: e86b6127500d448ca72fa0dd6ffc76e42192632b
Parents: d0090a0
Author: Alena Prokharchyk <al...@citrix.com>
Authored: Mon Oct 28 12:53:00 2013 -0700
Committer: Alena Prokharchyk <al...@citrix.com>
Committed: Mon Oct 28 12:53:53 2013 -0700

----------------------------------------------------------------------
 .../cloud/dc/dao/DataCenterDetailsDaoImpl.java  |  8 ++--
 .../src/com/cloud/dc/dao/ResourceDetailDao.java |  2 +
 .../network/dao/NetworkDetailsDaoImpl.java      |  5 ++
 .../dao/ServiceOfferingDetailsDaoImpl.java      |  7 ++-
 .../storage/dao/StoragePoolDetailsDaoImpl.java  |  5 ++
 .../storage/dao/VMTemplateDetailsDaoImpl.java   |  7 +--
 .../cloud/storage/dao/VolumeDetailsDaoImpl.java |  7 ++-
 .../src/com/cloud/vm/dao/NicDetailDaoImpl.java  |  6 ++-
 .../com/cloud/vm/dao/UserVmDetailsDaoImpl.java  |  7 ++-
 .../db/PrimaryDataStoreDetailsDaoImpl.java      |  8 ++--
 .../metadata/ResourceMetaDataManagerImpl.java   | 50 ++++++--------------
 11 files changed, 59 insertions(+), 53 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e86b6127/engine/schema/src/com/cloud/dc/dao/DataCenterDetailsDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/dc/dao/DataCenterDetailsDaoImpl.java b/engine/schema/src/com/cloud/dc/dao/DataCenterDetailsDaoImpl.java
index eb9176d..bc0621d 100644
--- a/engine/schema/src/com/cloud/dc/dao/DataCenterDetailsDaoImpl.java
+++ b/engine/schema/src/com/cloud/dc/dao/DataCenterDetailsDaoImpl.java
@@ -28,9 +28,6 @@ import com.cloud.dc.DataCenterDetailVO;
 @Local(value=DataCenterDetailsDao.class)
 public class DataCenterDetailsDaoImpl extends ResourceDetailDaoBase<DataCenterDetailVO> implements DataCenterDetailsDao, ScopedConfigStorage {
     
-    public DataCenterDetailsDaoImpl() {
-    }
-    
     @Override
     public Scope getScope() {
         return ConfigKey.Scope.Zone;
@@ -42,4 +39,9 @@ public class DataCenterDetailsDaoImpl extends ResourceDetailDaoBase<DataCenterDe
         return vo == null ? null : vo.getValue();
     }
 
+    @Override
+    public DataCenterDetailVO createDetail(long resourceId, String key, String value) {
+        return new DataCenterDetailVO(resourceId, key, value);
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e86b6127/engine/schema/src/com/cloud/dc/dao/ResourceDetailDao.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/dc/dao/ResourceDetailDao.java b/engine/schema/src/com/cloud/dc/dao/ResourceDetailDao.java
index 85d2c78..e47e6f3 100644
--- a/engine/schema/src/com/cloud/dc/dao/ResourceDetailDao.java
+++ b/engine/schema/src/com/cloud/dc/dao/ResourceDetailDao.java
@@ -37,4 +37,6 @@ public interface ResourceDetailDao<R extends ResourceDetail> extends GenericDao<
     public void addDetails(List<R> details);
     
     public void addDetail(R detail);
+    
+    public R createDetail(long resourceId, String key, String value);
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e86b6127/engine/schema/src/com/cloud/network/dao/NetworkDetailsDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/network/dao/NetworkDetailsDaoImpl.java b/engine/schema/src/com/cloud/network/dao/NetworkDetailsDaoImpl.java
index 915e184..7f43f44 100644
--- a/engine/schema/src/com/cloud/network/dao/NetworkDetailsDaoImpl.java
+++ b/engine/schema/src/com/cloud/network/dao/NetworkDetailsDaoImpl.java
@@ -26,4 +26,9 @@ import com.cloud.dc.dao.ResourceDetailDaoBase;
 @Local(value=NetworkDetailsDao.class)
 public class NetworkDetailsDaoImpl extends ResourceDetailDaoBase<NetworkDetailVO> implements NetworkDetailsDao {
 
+    @Override
+    public NetworkDetailVO createDetail(long resourceId, String key, String value) {
+        return new NetworkDetailVO(resourceId, key, value);
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e86b6127/engine/schema/src/com/cloud/service/dao/ServiceOfferingDetailsDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/service/dao/ServiceOfferingDetailsDaoImpl.java b/engine/schema/src/com/cloud/service/dao/ServiceOfferingDetailsDaoImpl.java
index 6cac9da..96f1085 100644
--- a/engine/schema/src/com/cloud/service/dao/ServiceOfferingDetailsDaoImpl.java
+++ b/engine/schema/src/com/cloud/service/dao/ServiceOfferingDetailsDaoImpl.java
@@ -27,7 +27,10 @@ import com.cloud.service.ServiceOfferingDetailsVO;
 @Local(value=ServiceOfferingDetailsDao.class)
 public class ServiceOfferingDetailsDaoImpl extends ResourceDetailDaoBase<ServiceOfferingDetailsVO>
         implements ServiceOfferingDetailsDao {
-    public ServiceOfferingDetailsDaoImpl() {
-        
+
+    @Override
+    public ServiceOfferingDetailsVO createDetail(long resourceId, String key, String value) {
+        return new ServiceOfferingDetailsVO(resourceId, key, value);
     }
+    
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e86b6127/engine/schema/src/com/cloud/storage/dao/StoragePoolDetailsDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/storage/dao/StoragePoolDetailsDaoImpl.java b/engine/schema/src/com/cloud/storage/dao/StoragePoolDetailsDaoImpl.java
index 6d7991f..521f325 100644
--- a/engine/schema/src/com/cloud/storage/dao/StoragePoolDetailsDaoImpl.java
+++ b/engine/schema/src/com/cloud/storage/dao/StoragePoolDetailsDaoImpl.java
@@ -42,4 +42,9 @@ public class StoragePoolDetailsDaoImpl extends ResourceDetailDaoBase<StoragePool
         StoragePoolDetailVO vo = findDetail(id, key.key());
         return vo == null ? null : vo.getValue();
     }
+
+    @Override
+    public StoragePoolDetailVO createDetail(long resourceId, String key, String value) {
+        return new StoragePoolDetailVO(resourceId, key, value);
+    }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e86b6127/engine/schema/src/com/cloud/storage/dao/VMTemplateDetailsDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/storage/dao/VMTemplateDetailsDaoImpl.java b/engine/schema/src/com/cloud/storage/dao/VMTemplateDetailsDaoImpl.java
index 384b2d6..ad3f1d5 100644
--- a/engine/schema/src/com/cloud/storage/dao/VMTemplateDetailsDaoImpl.java
+++ b/engine/schema/src/com/cloud/storage/dao/VMTemplateDetailsDaoImpl.java
@@ -26,8 +26,9 @@ import com.cloud.storage.VMTemplateDetailVO;
 @Component
 @Local(value = VMTemplateDetailsDao.class)
 public class VMTemplateDetailsDaoImpl extends ResourceDetailDaoBase<VMTemplateDetailVO> implements VMTemplateDetailsDao {
-    public VMTemplateDetailsDaoImpl(){
-        
+
+    @Override
+    public VMTemplateDetailVO createDetail(long resourceId, String key, String value) {
+        return new VMTemplateDetailVO(resourceId, key, value);
     }
-    
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e86b6127/engine/schema/src/com/cloud/storage/dao/VolumeDetailsDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/storage/dao/VolumeDetailsDaoImpl.java b/engine/schema/src/com/cloud/storage/dao/VolumeDetailsDaoImpl.java
index c62b66a..26fdd2f 100644
--- a/engine/schema/src/com/cloud/storage/dao/VolumeDetailsDaoImpl.java
+++ b/engine/schema/src/com/cloud/storage/dao/VolumeDetailsDaoImpl.java
@@ -26,7 +26,10 @@ import com.cloud.storage.VolumeDetailVO;
 @Component
 @Local(value=VolumeDetailsDao.class)
 public class VolumeDetailsDaoImpl extends ResourceDetailDaoBase<VolumeDetailVO> implements VolumeDetailsDao {
-    public VolumeDetailsDaoImpl() {
-        
+
+    @Override
+    public VolumeDetailVO createDetail(long resourceId, String key, String value) {
+        return new VolumeDetailVO(resourceId, key, value);
     }
+    
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e86b6127/engine/schema/src/com/cloud/vm/dao/NicDetailDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/vm/dao/NicDetailDaoImpl.java b/engine/schema/src/com/cloud/vm/dao/NicDetailDaoImpl.java
index a009025..afab4fd 100644
--- a/engine/schema/src/com/cloud/vm/dao/NicDetailDaoImpl.java
+++ b/engine/schema/src/com/cloud/vm/dao/NicDetailDaoImpl.java
@@ -26,7 +26,9 @@ import com.cloud.vm.NicDetailVO;
 @Component
 @Local (value={NicDetailDao.class})
 public class NicDetailDaoImpl extends ResourceDetailDaoBase<NicDetailVO> implements NicDetailDao {
-    public NicDetailDaoImpl() {
-        
+
+    @Override
+    public NicDetailVO createDetail(long resourceId, String key, String value) {
+        return new NicDetailVO(resourceId, key, value);
     }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e86b6127/engine/schema/src/com/cloud/vm/dao/UserVmDetailsDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/vm/dao/UserVmDetailsDaoImpl.java b/engine/schema/src/com/cloud/vm/dao/UserVmDetailsDaoImpl.java
index ba72f25..2829192 100644
--- a/engine/schema/src/com/cloud/vm/dao/UserVmDetailsDaoImpl.java
+++ b/engine/schema/src/com/cloud/vm/dao/UserVmDetailsDaoImpl.java
@@ -26,7 +26,10 @@ import com.cloud.vm.UserVmDetailVO;
 @Component
 @Local(value=UserVmDetailsDao.class)
 public class UserVmDetailsDaoImpl extends ResourceDetailDaoBase<UserVmDetailVO> implements UserVmDetailsDao {
-    public UserVmDetailsDaoImpl() {
-        
+
+    @Override
+    public UserVmDetailVO createDetail(long resourceId, String key, String value) {
+        return new UserVmDetailVO(resourceId, key, value);
     }
+    
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e86b6127/engine/storage/src/org/apache/cloudstack/storage/volume/db/PrimaryDataStoreDetailsDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/volume/db/PrimaryDataStoreDetailsDaoImpl.java b/engine/storage/src/org/apache/cloudstack/storage/volume/db/PrimaryDataStoreDetailsDaoImpl.java
index 13b19d0..a1470a3 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/volume/db/PrimaryDataStoreDetailsDaoImpl.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/volume/db/PrimaryDataStoreDetailsDaoImpl.java
@@ -25,8 +25,10 @@ import com.cloud.dc.dao.ResourceDetailDaoBase;
 @Component
 public class PrimaryDataStoreDetailsDaoImpl extends ResourceDetailDaoBase<PrimaryDataStoreDetailVO> implements
         PrimaryDataStoreDetailsDao {
-    
-    public PrimaryDataStoreDetailsDaoImpl() {
-        
+
+    @Override
+    public PrimaryDataStoreDetailVO createDetail(long resourceId, String key, String value) {
+        return new PrimaryDataStoreDetailVO(resourceId, key, value);
     }
+    
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e86b6127/server/src/com/cloud/metadata/ResourceMetaDataManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/metadata/ResourceMetaDataManagerImpl.java b/server/src/com/cloud/metadata/ResourceMetaDataManagerImpl.java
index c94f32f..9a61a67 100644
--- a/server/src/com/cloud/metadata/ResourceMetaDataManagerImpl.java
+++ b/server/src/com/cloud/metadata/ResourceMetaDataManagerImpl.java
@@ -26,26 +26,20 @@ import javax.inject.Inject;
 import javax.naming.ConfigurationException;
 
 import org.apache.cloudstack.api.ResourceDetail;
-import org.apache.cloudstack.storage.datastore.db.StoragePoolDetailVO;
 import org.apache.cloudstack.storage.datastore.db.StoragePoolDetailsDao;
 import org.apache.log4j.Logger;
 import org.springframework.stereotype.Component;
 
-import com.cloud.dc.DataCenterDetailVO;
 import com.cloud.dc.dao.DataCenterDetailsDao;
 import com.cloud.dc.dao.ResourceDetailDao;
 import com.cloud.event.ActionEvent;
 import com.cloud.event.EventTypes;
 import com.cloud.exception.InvalidParameterValueException;
-import com.cloud.network.dao.NetworkDetailVO;
 import com.cloud.network.dao.NetworkDetailsDao;
 import com.cloud.server.ResourceMetaDataService;
 import com.cloud.server.ResourceTag.ResourceObjectType;
 import com.cloud.server.TaggedResourceService;
-import com.cloud.service.ServiceOfferingDetailsVO;
 import com.cloud.service.dao.ServiceOfferingDetailsDao;
-import com.cloud.storage.VMTemplateDetailVO;
-import com.cloud.storage.VolumeDetailVO;
 import com.cloud.storage.dao.VMTemplateDetailsDao;
 import com.cloud.storage.dao.VolumeDetailsDao;
 import com.cloud.utils.component.ManagerBase;
@@ -53,8 +47,6 @@ import com.cloud.utils.db.DB;
 import com.cloud.utils.db.Transaction;
 import com.cloud.utils.db.TransactionCallback;
 import com.cloud.utils.db.TransactionStatus;
-import com.cloud.vm.NicDetailVO;
-import com.cloud.vm.UserVmDetailVO;
 import com.cloud.vm.dao.NicDetailDao;
 import com.cloud.vm.dao.UserVmDetailsDao;
 
@@ -119,7 +111,6 @@ public class ResourceMetaDataManagerImpl extends ManagerBase implements Resource
             @Override
             public Boolean doInTransaction(TransactionStatus status) {
                 for (String key : details.keySet()) {
-                    long id = _taggedResourceMgr.getResourceId(resourceId, resourceType);
                     String value = details.get(key);
 
                     if (value == null || value.isEmpty()) {
@@ -127,33 +118,16 @@ public class ResourceMetaDataManagerImpl extends ManagerBase implements Resource
                     }
 
                     DetailDaoHelper newDetailDaoHelper = new DetailDaoHelper(resourceType);
-                    ResourceDetail detail = null;
+                    ResourceDetail detail = newDetailDaoHelper.createDetail( _taggedResourceMgr.getResourceId(resourceId, resourceType), key, value);
                     
-                    // TODO - Have a better design here for getting the DAO.
-                    if(resourceType == ResourceObjectType.Volume){
-                        detail = new VolumeDetailVO(id, key, value);
-                    } else if (resourceType == ResourceObjectType.Nic){
-                        detail = new NicDetailVO(id, key, value);
-                    } else if (resourceType == ResourceObjectType.Zone){
-                        detail = new DataCenterDetailVO(id, key, value);
-                    } else if (resourceType == ResourceObjectType.Network){
-                        detail = new NetworkDetailVO(id, key, value);
-                    } else if (resourceType == ResourceObjectType.UserVm) {
-                        detail = new UserVmDetailVO(id, key, value);
-                    } else if (resourceType == ResourceObjectType.Template) {
-                        detail = new VMTemplateDetailVO(id, key, value);
-                    } else if (resourceType == ResourceObjectType.ServiceOffering) {
-                        detail = new ServiceOfferingDetailsVO(id, key, value);
-                    } else if (resourceType == ResourceObjectType.Storage) {
-                        detail = new StoragePoolDetailVO(id, key, value);
-                    } else {
+                    if (detail == null) {
                         throw new UnsupportedOperationException("ResourceType " + resourceType + " doesn't support metadata");
+
                     }
                     newDetailDaoHelper.addDetail(detail);
                         
                 }
                 
-                
                 return true;
             }
         });
@@ -174,38 +148,42 @@ public class ResourceMetaDataManagerImpl extends ManagerBase implements Resource
 
     private class DetailDaoHelper {
         private ResourceObjectType resourceType;
+        private ResourceDetailDao<? super ResourceDetail> dao;
         
         private DetailDaoHelper(ResourceObjectType resourceType) {
             if (!resourceType.resourceMetadataSupport()) {
                 throw new UnsupportedOperationException("ResourceType " + resourceType + " doesn't support metadata");
             }
             this.resourceType = resourceType;
-        }
-        
-        private void addDetail(ResourceDetail detail) {
-            ResourceDetailDao<ResourceDetail> dao = (ResourceDetailDao<ResourceDetail>)_daoMap.get(resourceType);
+            ResourceDetailDao<?> dao = _daoMap.get(resourceType);
             if (dao == null) {
                 throw new UnsupportedOperationException("ResourceType " + resourceType + " doesn't support metadata");
             }
+            this.dao = (ResourceDetailDao)_daoMap.get(resourceType);
+        }
+        
+        private void addDetail(ResourceDetail detail) {
             dao.addDetail(detail);   
         }
         
         private void removeDetail(long resourceId, String key) {
-            ResourceDetailDao<? extends ResourceDetail> dao = _daoMap.get(resourceType);
             dao.removeDetail(resourceId, key);
         }
         
         private List<? extends ResourceDetail> getDetails(long resourceId) {
-            ResourceDetailDao<? extends ResourceDetail> dao = _daoMap.get(resourceType);
             List<? extends ResourceDetail> detailList = new ArrayList<ResourceDetail>();        
             detailList = dao.findDetailsList(resourceId);
             return detailList;
         }
         
         private ResourceDetail getDetail(long resourceId, String key) {
-            ResourceDetailDao<? extends ResourceDetail> dao = _daoMap.get(resourceType);
             return dao.findDetail(resourceId, key);
         }
+        
+        private ResourceDetail createDetail(long resourceId, String key, String value) {
+            return dao.createDetail(resourceId, key, value);
+        }
+        
     }
     
     @Override


[17/50] [abbrv] git commit: updated refs/heads/object_store_migration to 5ec2a44

Posted by mc...@apache.org.
CLOUDSTACK-4816: Removed unused field from S3TO to avoid confusion in
the log.


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

Branch: refs/heads/object_store_migration
Commit: 28f9952c6e34393cce1b49aa330b07f55e923b9c
Parents: 465c9ec
Author: Min Chen <mi...@citrix.com>
Authored: Fri Oct 25 21:12:24 2013 -0700
Committer: Min Chen <mi...@citrix.com>
Committed: Fri Oct 25 21:20:09 2013 -0700

----------------------------------------------------------------------
 api/src/com/cloud/agent/api/to/S3TO.java | 1 -
 1 file changed, 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/28f9952c/api/src/com/cloud/agent/api/to/S3TO.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/agent/api/to/S3TO.java b/api/src/com/cloud/agent/api/to/S3TO.java
index ea7564d..350b9ca 100644
--- a/api/src/com/cloud/agent/api/to/S3TO.java
+++ b/api/src/com/cloud/agent/api/to/S3TO.java
@@ -39,7 +39,6 @@ public final class S3TO implements S3Utils.ClientOptions, DataStoreTO {
     private Integer socketTimeout;
     private Date created;
     private boolean enableRRS;
-    private boolean multipartEnabled;
     private long maxSingleUploadSizeInBytes;
 
     public S3TO() {


[39/50] [abbrv] git commit: updated refs/heads/object_store_migration to 5ec2a44

Posted by mc...@apache.org.
Style detail view


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

Branch: refs/heads/object_store_migration
Commit: bd697c53d8744876299b8a5d15edc2de5728bbce
Parents: 6748d19
Author: Brian Federle <br...@citrix.com>
Authored: Mon Oct 28 11:47:06 2013 -0700
Committer: Brian Federle <br...@citrix.com>
Committed: Mon Oct 28 11:47:18 2013 -0700

----------------------------------------------------------------------
 ui/css/cloudstack3.css | 55 +++++++++++++++++++++++----------------------
 1 file changed, 28 insertions(+), 27 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/bd697c53/ui/css/cloudstack3.css
----------------------------------------------------------------------
diff --git a/ui/css/cloudstack3.css b/ui/css/cloudstack3.css
index 9018511..7880d6c 100644
--- a/ui/css/cloudstack3.css
+++ b/ui/css/cloudstack3.css
@@ -1590,10 +1590,13 @@ div.list-view td.state.off span {
   min-width: 91px;
   text-align: center;
   font-size: 11px;
-  margin-right: 1px;
+  margin-right: 12px;
   color: #4E6070;
   text-decoration: none;
-  background: #DEE3E5;
+  /*+placement:shift 0px 2px;*/
+  position: relative;
+  left: 0px;
+  top: 2px;
 }
 
 .ui-tabs li {
@@ -1601,10 +1604,13 @@ div.list-view td.state.off span {
 }
 
 .ui-tabs ul li.ui-state-default a {
-  border-right: 1px solid #97AFC5;
-  border-top: 2px solid #D6DCDE;
-  background: url(../images/bg-details-tab-gradient.png);
-  padding-bottom: 11px;
+  padding-bottom: 12px;
+  border: 1px solid #E2DDDD;
+  /*+border-radius:4px 4px 0 0;*/
+  -moz-border-radius: 4px 4px 0 0;
+  -webkit-border-radius: 4px 4px 0 0;
+  -khtml-border-radius: 4px 4px 0 0;
+  border-radius: 4px 4px 0 0;
 }
 
 .project-view .ui-tabs ul li.ui-state-default a {
@@ -1625,7 +1631,8 @@ div.list-view td.state.off span {
 }
 
 .ui-tabs ul li.ui-state-hover a {
-  background: url(../images/gradients.png) -8px -1413px;
+  text-decoration: underline;
+  color: #000000;
 }
 
 .ui-tabs ul li.ui-state-active {
@@ -1633,9 +1640,7 @@ div.list-view td.state.off span {
 }
 
 .ui-tabs ul li.ui-state-active a {
-  border-right: 1px solid #D6DCDE;
   background: #FFFFFF;
-  border-left: none;
   padding-bottom: 12px;
 }
 
@@ -1664,26 +1669,17 @@ div.list-view td.state.off span {
 
 .ui-tabs li.ui-state-active.first a,
 .ui-tabs li.ui-state-default.first a {
-  border-left: 1px solid #E2DDDD;
-  /*+placement:shift 0px 0px;*/
-  position: relative;
-  left: 0px;
-  top: 0px;
-  /*+border-radius:4px 0 0;*/
-  -moz-border-radius: 4px 0 0;
-  -webkit-border-radius: 4px 0 0;
-  -khtml-border-radius: 4px 0 0;
-  border-radius: 4px 0 0;
-  border-radius: 4px 0 0 0;
+  /*+border-radius:4px 4px 0 0;*/
+  -moz-border-radius: 4px 4px 0 0;
+  -webkit-border-radius: 4px 4px 0 0;
+  -khtml-border-radius: 4px 4px 0 0;
+  border-radius: 4px 4px 0 0;
+  border: 1px solid #E2DDDD;
+  border: 1px solid #E2DDDD;
 }
 
 .ui-tabs li.ui-state-active.last a,
 .ui-tabs li.ui-state-default.last a {
-  /*+border-radius:0 4px 0 0;*/
-  -moz-border-radius: 0 4px 0 0;
-  -webkit-border-radius: 0 4px 0 0;
-  -khtml-border-radius: 0 4px 0 0;
-  border-radius: 0 4px 0 0;
 }
 
 .ui-tabs li.ui-state-active.first.last a,
@@ -1727,8 +1723,13 @@ div.list-view td.state.off span {
 .detail-group table {
   width: 96%;
   font-size: 12px;
-  border: 1px solid #CFC9C9;
-  background: #E4E6E7;
+  /*+border-radius:5px;*/
+  -moz-border-radius: 5px;
+  -webkit-border-radius: 5px;
+  -khtml-border-radius: 5px;
+  border-radius: 5px;
+  border-bottom: none;
+  background: #F4F4F4;
   margin-top: 11px;
 }
 


[26/50] [abbrv] git commit: updated refs/heads/object_store_migration to 5ec2a44

Posted by mc...@apache.org.
License header added to PropertiesStorageTest

Signed-off-by: Laszlo Hornyak <la...@gmail.com>


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

Branch: refs/heads/object_store_migration
Commit: 11441a367205d183836c82ad2b39ee32e0746fd5
Parents: c72f65d
Author: Laszlo Hornyak <la...@gmail.com>
Authored: Sat Oct 26 18:39:00 2013 +0200
Committer: Laszlo Hornyak <la...@gmail.com>
Committed: Sat Oct 26 18:39:00 2013 +0200

----------------------------------------------------------------------
 .../agent/dao/impl/PropertiesStorageTest.java     | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/11441a36/agent/test/com/cloud/agent/dao/impl/PropertiesStorageTest.java
----------------------------------------------------------------------
diff --git a/agent/test/com/cloud/agent/dao/impl/PropertiesStorageTest.java b/agent/test/com/cloud/agent/dao/impl/PropertiesStorageTest.java
index 4075892..adaebc6 100644
--- a/agent/test/com/cloud/agent/dao/impl/PropertiesStorageTest.java
+++ b/agent/test/com/cloud/agent/dao/impl/PropertiesStorageTest.java
@@ -1,3 +1,21 @@
+/*
+ * 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.agent.dao.impl;
 
 import java.io.File;


[41/50] [abbrv] git commit: updated refs/heads/object_store_migration to 5ec2a44

Posted by mc...@apache.org.
fix inject hypervisorHelperImpl


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

Branch: refs/heads/object_store_migration
Commit: 92f97248a82528593de89dc4ab2bafff6cacc905
Parents: f92f7b5
Author: Edison Su <su...@gmail.com>
Authored: Mon Oct 28 12:08:17 2013 -0700
Committer: Edison Su <su...@gmail.com>
Committed: Mon Oct 28 12:09:14 2013 -0700

----------------------------------------------------------------------
 .../META-INF/cloudstack/core/spring-engine-storage-core-context.xml | 1 +
 1 file changed, 1 insertion(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/92f97248/engine/storage/resources/META-INF/cloudstack/core/spring-engine-storage-core-context.xml
----------------------------------------------------------------------
diff --git a/engine/storage/resources/META-INF/cloudstack/core/spring-engine-storage-core-context.xml b/engine/storage/resources/META-INF/cloudstack/core/spring-engine-storage-core-context.xml
index a6a0c22..76ec23e 100644
--- a/engine/storage/resources/META-INF/cloudstack/core/spring-engine-storage-core-context.xml
+++ b/engine/storage/resources/META-INF/cloudstack/core/spring-engine-storage-core-context.xml
@@ -36,6 +36,7 @@
     <bean id="unknown" class="org.apache.cloudstack.storage.image.format.Unknown" />
     <bean id="BAREMETAL" class="org.apache.cloudstack.storage.image.format.BAREMETAL" />
     
+    <bean id="hypervisorHelperImpl" class="org.apache.cloudstack.storage.helper.HypervisorHelperImpl" />
 
     <bean id="objectInDataStoreManagerImpl"
         class="org.apache.cloudstack.storage.datastore.ObjectInDataStoreManagerImpl" />


[11/50] [abbrv] git commit: updated refs/heads/object_store_migration to 5ec2a44

Posted by mc...@apache.org.
Move LockMasterListener initialization to system context

This reverts commit d178b25daa484dda44bb34e63cb719d1c3cc1519 and moves
the initialization to the system context, which really where it should have
been from the beginning.


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

Branch: refs/heads/object_store_migration
Commit: ad74948480f017694fb31277b97bd8582372fb2c
Parents: 56f1277
Author: Darren Shepherd <da...@gmail.com>
Authored: Fri Oct 25 15:10:51 2013 -0700
Committer: Darren Shepherd <da...@gmail.com>
Committed: Fri Oct 25 15:11:47 2013 -0700

----------------------------------------------------------------------
 .../spring-server-core-managers-context.xml     |  1 +
 .../system/spring-server-system-context.xml     | 36 ++++++++++++++++++++
 .../com/cloud/server/ManagementServerImpl.java  | 18 ++++++++--
 3 files changed, 52 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/ad749484/server/resources/META-INF/cloudstack/core/spring-server-core-managers-context.xml
----------------------------------------------------------------------
diff --git a/server/resources/META-INF/cloudstack/core/spring-server-core-managers-context.xml b/server/resources/META-INF/cloudstack/core/spring-server-core-managers-context.xml
index 8a13b14..5e37908 100644
--- a/server/resources/META-INF/cloudstack/core/spring-server-core-managers-context.xml
+++ b/server/resources/META-INF/cloudstack/core/spring-server-core-managers-context.xml
@@ -36,6 +36,7 @@
     </bean>
 
     <bean id="managementServerImpl" class="com.cloud.server.ManagementServerImpl">
+        <property name="lockMasterListener" ref="lockMasterListener" />
         <property name="userAuthenticators"
             value="#{userAuthenticatorsRegistry.registered}" />
         <property name="userPasswordEncoders"

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/ad749484/server/resources/META-INF/cloudstack/system/spring-server-system-context.xml
----------------------------------------------------------------------
diff --git a/server/resources/META-INF/cloudstack/system/spring-server-system-context.xml b/server/resources/META-INF/cloudstack/system/spring-server-system-context.xml
new file mode 100644
index 0000000..a14a073
--- /dev/null
+++ b/server/resources/META-INF/cloudstack/system/spring-server-system-context.xml
@@ -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.
+-->
+<beans xmlns="http://www.springframework.org/schema/beans"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xmlns:context="http://www.springframework.org/schema/context"
+       xmlns:aop="http://www.springframework.org/schema/aop"
+       xsi:schemaLocation="http://www.springframework.org/schema/beans
+                      http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
+                      http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
+                      http://www.springframework.org/schema/context
+                      http://www.springframework.org/schema/context/spring-context-3.0.xsd"
+                      >
+
+    <bean id="lockMasterListener" class="com.cloud.server.LockMasterListener" >
+        <constructor-arg>
+            <bean class="org.apache.cloudstack.utils.identity.ManagementServerNode" factory-method="getManagementServerId" />
+        </constructor-arg>
+    </bean>
+
+</beans>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/ad749484/server/src/com/cloud/server/ManagementServerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/server/ManagementServerImpl.java b/server/src/com/cloud/server/ManagementServerImpl.java
index e00c182..058a756 100755
--- a/server/src/com/cloud/server/ManagementServerImpl.java
+++ b/server/src/com/cloud/server/ManagementServerImpl.java
@@ -599,8 +599,6 @@ import com.cloud.vm.dao.VMInstanceDao;
 public class ManagementServerImpl extends ManagerBase implements ManagementServer {
     public static final Logger s_logger = Logger.getLogger(ManagementServerImpl.class.getName());
 
-    private static final LockMasterListener s_lockMasterListener = new LockMasterListener(ManagementServerNode.getManagementServerId());
-
     @Inject
     public AccountManager _accountMgr;
     @Inject
@@ -716,6 +714,8 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe
     @Inject
     DeploymentPlanningManager _dpMgr;
 
+    LockMasterListener _lockMasterListener;
+
     private final ScheduledExecutorService _eventExecutor = Executors.newScheduledThreadPool(1, new NamedThreadFactory("EventChecker"));
     private final ScheduledExecutorService _alertExecutor = Executors.newScheduledThreadPool(1, new NamedThreadFactory("AlertChecker"));
     @Inject private KeystoreManager _ksMgr;
@@ -820,7 +820,11 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe
     public boolean start() {
         s_logger.info("Startup CloudStack management server...");
 
-        _clusterMgr.registerListener(s_lockMasterListener);
+        if ( _lockMasterListener == null ) {
+            _lockMasterListener = new LockMasterListener(ManagementServerNode.getManagementServerId());
+        }
+
+        _clusterMgr.registerListener(_lockMasterListener);
 
         enableAdminUser("password");
         return true;
@@ -3881,4 +3885,12 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe
     public void setStoragePoolAllocators(List<StoragePoolAllocator> storagePoolAllocators) {
         this._storagePoolAllocators = storagePoolAllocators;
     }
+
+    public LockMasterListener getLockMasterListener() {
+        return _lockMasterListener;
+    }
+
+    public void setLockMasterListener(LockMasterListener lockMasterListener) {
+        this._lockMasterListener = lockMasterListener;
+    }
 }


[25/50] [abbrv] git commit: updated refs/heads/object_store_migration to 5ec2a44

Posted by mc...@apache.org.
Remove test dependency on mysql driver

The dependency is no longer needed.


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

Branch: refs/heads/object_store_migration
Commit: c72f65dc170f31c21a96c5af3dc3f59373b4596c
Parents: fa35490
Author: Laszlo Hornyak <la...@gmail.com>
Authored: Sat Oct 26 16:09:53 2013 +0200
Committer: Laszlo Hornyak <la...@gmail.com>
Committed: Sat Oct 26 17:47:35 2013 +0200

----------------------------------------------------------------------
 server/pom.xml | 5 -----
 1 file changed, 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/c72f65dc/server/pom.xml
----------------------------------------------------------------------
diff --git a/server/pom.xml b/server/pom.xml
index 8760fcb..c7978e2 100644
--- a/server/pom.xml
+++ b/server/pom.xml
@@ -135,11 +135,6 @@
       <artifactId>cloud-engine-components-api</artifactId>
       <version>${project.version}</version>
     </dependency>
-    <dependency>
-      <groupId>mysql</groupId>
-      <artifactId>mysql-connector-java</artifactId>
-      <scope>test</scope>
-    </dependency>
   </dependencies>
   <build>
     <resources>


[42/50] [abbrv] git commit: updated refs/heads/object_store_migration to 5ec2a44

Posted by mc...@apache.org.
Resource details (metadata) - added support for Storage pool details


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

Branch: refs/heads/object_store_migration
Commit: d0090a0c24bbbef2575207193f2e5bed83bdd242
Parents: 92f9724
Author: Alena Prokharchyk <al...@citrix.com>
Authored: Mon Oct 28 10:15:55 2013 -0700
Committer: Alena Prokharchyk <al...@citrix.com>
Committed: Mon Oct 28 12:53:53 2013 -0700

----------------------------------------------------------------------
 api/src/com/cloud/server/ResourceTag.java       |  3 +-
 .../com/cloud/dc/dao/ResourceDetailDaoBase.java |  3 +
 .../dao/ServiceOfferingDetailsDaoImpl.java      |  4 +-
 .../storage/dao/StoragePoolDetailsDaoImpl.java  | 58 +-------------------
 .../storage/dao/VMTemplateDetailsDaoImpl.java   |  4 ++
 .../cloud/storage/dao/VolumeDetailsDaoImpl.java |  4 +-
 .../src/com/cloud/vm/dao/NicDetailDaoImpl.java  |  4 +-
 .../com/cloud/vm/dao/UserVmDetailsDaoImpl.java  |  4 +-
 .../datastore/db/PrimaryDataStoreDaoImpl.java   | 14 +++--
 .../datastore/db/PrimaryDataStoreDetailVO.java  | 34 +++++-------
 .../db/PrimaryDataStoreDetailsDao.java          | 10 +---
 .../datastore/db/StoragePoolDetailVO.java       | 38 +++++--------
 .../datastore/db/StoragePoolDetailsDao.java     | 11 +---
 .../db/PrimaryDataStoreDetailsDaoImpl.java      | 52 ++----------------
 .../configuration/ConfigurationManagerImpl.java | 10 +---
 .../metadata/ResourceMetaDataManagerImpl.java   | 13 +++++
 .../com/cloud/storage/StorageManagerImpl.java   |  2 +-
 .../cloud/tags/TaggedResourceManagerImpl.java   |  5 ++
 18 files changed, 93 insertions(+), 180 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d0090a0c/api/src/com/cloud/server/ResourceTag.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/server/ResourceTag.java b/api/src/com/cloud/server/ResourceTag.java
index f2bcd18..85bbcd0 100644
--- a/api/src/com/cloud/server/ResourceTag.java
+++ b/api/src/com/cloud/server/ResourceTag.java
@@ -43,7 +43,8 @@ public interface ResourceTag extends ControlledEntity, Identity, InternalIdentit
         VMSnapshot (true, false),
         RemoteAccessVpn (true, false),
         Zone (false, true),
-        ServiceOffering (false, true);
+        ServiceOffering (false, true),
+        Storage(false, true);
         
         ResourceObjectType(boolean resourceTagsSupport, boolean resourceMetadataSupport) {
             this.resourceTagsSupport = resourceTagsSupport;

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d0090a0c/engine/schema/src/com/cloud/dc/dao/ResourceDetailDaoBase.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/dc/dao/ResourceDetailDaoBase.java b/engine/schema/src/com/cloud/dc/dao/ResourceDetailDaoBase.java
index ea8f85a..9102a62 100644
--- a/engine/schema/src/com/cloud/dc/dao/ResourceDetailDaoBase.java
+++ b/engine/schema/src/com/cloud/dc/dao/ResourceDetailDaoBase.java
@@ -103,6 +103,9 @@ public abstract class ResourceDetailDaoBase<R extends ResourceDetail> extends Ge
     
 
     public void addDetail(R detail) {
+        if (detail == null) {
+            return;
+        }
         R existingDetail = findDetail(detail.getResourceId(), detail.getName());
         if (existingDetail != null) {
             remove(existingDetail.getId());

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d0090a0c/engine/schema/src/com/cloud/service/dao/ServiceOfferingDetailsDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/service/dao/ServiceOfferingDetailsDaoImpl.java b/engine/schema/src/com/cloud/service/dao/ServiceOfferingDetailsDaoImpl.java
index eed8a13..6cac9da 100644
--- a/engine/schema/src/com/cloud/service/dao/ServiceOfferingDetailsDaoImpl.java
+++ b/engine/schema/src/com/cloud/service/dao/ServiceOfferingDetailsDaoImpl.java
@@ -27,5 +27,7 @@ import com.cloud.service.ServiceOfferingDetailsVO;
 @Local(value=ServiceOfferingDetailsDao.class)
 public class ServiceOfferingDetailsDaoImpl extends ResourceDetailDaoBase<ServiceOfferingDetailsVO>
         implements ServiceOfferingDetailsDao {
-    
+    public ServiceOfferingDetailsDaoImpl() {
+        
+    }
 }

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

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d0090a0c/engine/schema/src/com/cloud/storage/dao/VMTemplateDetailsDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/storage/dao/VMTemplateDetailsDaoImpl.java b/engine/schema/src/com/cloud/storage/dao/VMTemplateDetailsDaoImpl.java
index 4b9bfb5..384b2d6 100644
--- a/engine/schema/src/com/cloud/storage/dao/VMTemplateDetailsDaoImpl.java
+++ b/engine/schema/src/com/cloud/storage/dao/VMTemplateDetailsDaoImpl.java
@@ -26,4 +26,8 @@ import com.cloud.storage.VMTemplateDetailVO;
 @Component
 @Local(value = VMTemplateDetailsDao.class)
 public class VMTemplateDetailsDaoImpl extends ResourceDetailDaoBase<VMTemplateDetailVO> implements VMTemplateDetailsDao {
+    public VMTemplateDetailsDaoImpl(){
+        
+    }
+    
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d0090a0c/engine/schema/src/com/cloud/storage/dao/VolumeDetailsDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/storage/dao/VolumeDetailsDaoImpl.java b/engine/schema/src/com/cloud/storage/dao/VolumeDetailsDaoImpl.java
index 9df6ee1..c62b66a 100644
--- a/engine/schema/src/com/cloud/storage/dao/VolumeDetailsDaoImpl.java
+++ b/engine/schema/src/com/cloud/storage/dao/VolumeDetailsDaoImpl.java
@@ -26,5 +26,7 @@ import com.cloud.storage.VolumeDetailVO;
 @Component
 @Local(value=VolumeDetailsDao.class)
 public class VolumeDetailsDaoImpl extends ResourceDetailDaoBase<VolumeDetailVO> implements VolumeDetailsDao {
-
+    public VolumeDetailsDaoImpl() {
+        
+    }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d0090a0c/engine/schema/src/com/cloud/vm/dao/NicDetailDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/vm/dao/NicDetailDaoImpl.java b/engine/schema/src/com/cloud/vm/dao/NicDetailDaoImpl.java
index 6263cae..a009025 100644
--- a/engine/schema/src/com/cloud/vm/dao/NicDetailDaoImpl.java
+++ b/engine/schema/src/com/cloud/vm/dao/NicDetailDaoImpl.java
@@ -26,5 +26,7 @@ import com.cloud.vm.NicDetailVO;
 @Component
 @Local (value={NicDetailDao.class})
 public class NicDetailDaoImpl extends ResourceDetailDaoBase<NicDetailVO> implements NicDetailDao {
-    
+    public NicDetailDaoImpl() {
+        
+    }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d0090a0c/engine/schema/src/com/cloud/vm/dao/UserVmDetailsDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/vm/dao/UserVmDetailsDaoImpl.java b/engine/schema/src/com/cloud/vm/dao/UserVmDetailsDaoImpl.java
index b435381..ba72f25 100644
--- a/engine/schema/src/com/cloud/vm/dao/UserVmDetailsDaoImpl.java
+++ b/engine/schema/src/com/cloud/vm/dao/UserVmDetailsDaoImpl.java
@@ -26,5 +26,7 @@ import com.cloud.vm.UserVmDetailVO;
 @Component
 @Local(value=UserVmDetailsDao.class)
 public class UserVmDetailsDaoImpl extends ResourceDetailDaoBase<UserVmDetailVO> implements UserVmDetailsDao {
-
+    public UserVmDetailsDaoImpl() {
+        
+    }
 }

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

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d0090a0c/engine/schema/src/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDetailVO.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDetailVO.java b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDetailVO.java
index 0d9af4b..badb637 100644
--- a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDetailVO.java
+++ b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDetailVO.java
@@ -23,16 +23,18 @@ import javax.persistence.GenerationType;
 import javax.persistence.Id;
 import javax.persistence.Table;
 
+import org.apache.cloudstack.api.ResourceDetail;
+
 @Entity
 @Table(name = "storage_pool_details")
-public class PrimaryDataStoreDetailVO {
+public class PrimaryDataStoreDetailVO implements ResourceDetail{
     @Id
     @GeneratedValue(strategy = GenerationType.IDENTITY)
     @Column(name = "id")
     long id;
 
     @Column(name = "pool_id")
-    long poolId;
+    long resourceId;
 
     @Column(name = "name")
     String name;
@@ -41,39 +43,31 @@ public class PrimaryDataStoreDetailVO {
     String value;
 
     public PrimaryDataStoreDetailVO(long poolId, String name, String value) {
-        this.poolId = poolId;
+        this.resourceId = poolId;
         this.name = name;
         this.value = value;
     }
+    
+    protected PrimaryDataStoreDetailVO() {
+    }
 
+    @Override
     public long getId() {
         return id;
     }
 
-    public long getPoolId() {
-        return poolId;
-    }
-
-    public void setPoolId(long poolId) {
-        this.poolId = poolId;
+    @Override
+    public long getResourceId() {
+        return resourceId;
     }
 
+    @Override
     public String getName() {
         return name;
     }
 
-    public void setName(String name) {
-        this.name = name;
-    }
-
+    @Override
     public String getValue() {
         return value;
     }
-
-    public void setValue(String value) {
-        this.value = value;
-    }
-
-    protected PrimaryDataStoreDetailVO() {
-    }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d0090a0c/engine/schema/src/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDetailsDao.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDetailsDao.java b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDetailsDao.java
index 18e2f1c..8466107 100644
--- a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDetailsDao.java
+++ b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDetailsDao.java
@@ -16,13 +16,7 @@
 // under the License.
 package org.apache.cloudstack.storage.datastore.db;
 
-import java.util.Map;
+import com.cloud.dc.dao.ResourceDetailDao;
 
-import com.cloud.utils.db.GenericDao;
-
-public interface PrimaryDataStoreDetailsDao extends GenericDao<PrimaryDataStoreDetailVO, Long> {
-
-    void update(long poolId, Map<String, String> details);
-
-    Map<String, String> getDetails(long poolId);
+public interface PrimaryDataStoreDetailsDao extends ResourceDetailDao<PrimaryDataStoreDetailVO> {
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d0090a0c/engine/schema/src/org/apache/cloudstack/storage/datastore/db/StoragePoolDetailVO.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/StoragePoolDetailVO.java b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/StoragePoolDetailVO.java
index e51f3a3..9499df0 100644
--- a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/StoragePoolDetailVO.java
+++ b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/StoragePoolDetailVO.java
@@ -16,8 +16,6 @@
 // under the License.
 package org.apache.cloudstack.storage.datastore.db;
 
-import org.apache.cloudstack.api.InternalIdentity;
-
 import javax.persistence.Column;
 import javax.persistence.Entity;
 import javax.persistence.GeneratedValue;
@@ -25,16 +23,18 @@ import javax.persistence.GenerationType;
 import javax.persistence.Id;
 import javax.persistence.Table;
 
+import org.apache.cloudstack.api.ResourceDetail;
+
 @Entity
 @Table(name = "storage_pool_details")
-public class StoragePoolDetailVO implements InternalIdentity {
+public class StoragePoolDetailVO implements ResourceDetail {
     @Id
     @GeneratedValue(strategy = GenerationType.IDENTITY)
     @Column(name = "id")
     long id;
 
     @Column(name = "pool_id")
-    long poolId;
+    long resourceId;
 
     @Column(name = "name")
     String name;
@@ -43,39 +43,31 @@ public class StoragePoolDetailVO implements InternalIdentity {
     String value;
 
     public StoragePoolDetailVO(long poolId, String name, String value) {
-        this.poolId = poolId;
+        this.resourceId = poolId;
         this.name = name;
         this.value = value;
     }
+    
+    public StoragePoolDetailVO() {
+    }
 
+    @Override
     public long getId() {
         return id;
     }
 
-    public long getPoolId() {
-        return poolId;
-    }
-
-    public void setPoolId(long poolId) {
-        this.poolId = poolId;
+    @Override
+    public long getResourceId() {
+        return resourceId;
     }
 
+    @Override
     public String getName() {
         return name;
     }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
+    
+    @Override
     public String getValue() {
         return value;
     }
-
-    public void setValue(String value) {
-        this.value = value;
-    }
-
-    protected StoragePoolDetailVO() {
-    }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d0090a0c/engine/schema/src/org/apache/cloudstack/storage/datastore/db/StoragePoolDetailsDao.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/StoragePoolDetailsDao.java b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/StoragePoolDetailsDao.java
index 49f4f19..f7ef631 100644
--- a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/StoragePoolDetailsDao.java
+++ b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/StoragePoolDetailsDao.java
@@ -16,15 +16,8 @@
 // under the License.
 package org.apache.cloudstack.storage.datastore.db;
 
-import java.util.Map;
-
+import com.cloud.dc.dao.ResourceDetailDao;
 import com.cloud.utils.db.GenericDao;
 
-public interface StoragePoolDetailsDao extends GenericDao<StoragePoolDetailVO, Long> {
-
-    void update(long poolId, Map<String, String> details);
-
-    Map<String, String> getDetails(long poolId);
-
-    StoragePoolDetailVO findDetail(long poolId, String name);
+public interface StoragePoolDetailsDao extends GenericDao<StoragePoolDetailVO, Long>, ResourceDetailDao<StoragePoolDetailVO> {
 }

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

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d0090a0c/server/src/com/cloud/configuration/ConfigurationManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java
index 6af50df..998e3ef 100755
--- a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java
+++ b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java
@@ -475,14 +475,8 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
                     throw new InvalidParameterValueException("unable to find storage pool by id " + resourceId);
                 }
                 StoragePoolDetailVO storagePoolDetailVO = _storagePoolDetailsDao.findDetail(resourceId, name);
-                if (storagePoolDetailVO == null) {
-                    storagePoolDetailVO = new StoragePoolDetailVO(resourceId, name, value);
-                    _storagePoolDetailsDao.persist(storagePoolDetailVO);
-
-                } else {
-                    storagePoolDetailVO.setValue(value);
-                    _storagePoolDetailsDao.update(storagePoolDetailVO.getId(), storagePoolDetailVO);
-                }
+                _storagePoolDetailsDao.addDetail(storagePoolDetailVO);
+                
                 break;
 
             case Account:

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

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d0090a0c/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 75cedd0..fe7863b 100755
--- a/server/src/com/cloud/storage/StorageManagerImpl.java
+++ b/server/src/com/cloud/storage/StorageManagerImpl.java
@@ -706,7 +706,7 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C
         Map<String, String> updatedDetails = new HashMap<String, String>();
 
         if (tags != null) {
-            Map<String, String> existingDetails = _storagePoolDetailsDao.getDetails(id);
+            Map<String, String> existingDetails = _storagePoolDetailsDao.findDetails(id);
             Set<String> existingKeys = existingDetails.keySet();
 
             Map<String, String> existingDetailsToKeep = new HashMap<String, String>();

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d0090a0c/server/src/com/cloud/tags/TaggedResourceManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/tags/TaggedResourceManagerImpl.java b/server/src/com/cloud/tags/TaggedResourceManagerImpl.java
index 7d7692f..d8d2689 100644
--- a/server/src/com/cloud/tags/TaggedResourceManagerImpl.java
+++ b/server/src/com/cloud/tags/TaggedResourceManagerImpl.java
@@ -26,6 +26,7 @@ import javax.inject.Inject;
 import javax.naming.ConfigurationException;
 
 import org.apache.cloudstack.context.CallContext;
+import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
 import org.apache.log4j.Logger;
 import org.springframework.stereotype.Component;
 
@@ -131,6 +132,8 @@ public class TaggedResourceManagerImpl extends ManagerBase implements TaggedReso
     DataCenterDao _dataCenterDao;
     @Inject
     ServiceOfferingDao _serviceOffDao;
+    @Inject
+    PrimaryDataStoreDao _storagePoolDao;
 
 
     @Override
@@ -155,6 +158,8 @@ public class TaggedResourceManagerImpl extends ManagerBase implements TaggedReso
         _daoMap.put(ResourceObjectType.RemoteAccessVpn, _vpnDao);
         _daoMap.put(ResourceObjectType.Zone, _dataCenterDao);
         _daoMap.put(ResourceObjectType.ServiceOffering, _serviceOffDao);
+        _daoMap.put(ResourceObjectType.Storage, _storagePoolDao);
+
 
         return true;
     }


[05/50] [abbrv] git commit: updated refs/heads/object_store_migration to 5ec2a44

Posted by mc...@apache.org.
Resource details: added way of generic access of resource DAO based on the resourceType passed in (was hardcoded before)


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

Branch: refs/heads/object_store_migration
Commit: aa9f8e64ae35adab531c92c7ee5c1dc9f60bc6cd
Parents: 0fb4d9d
Author: Alena Prokharchyk <al...@citrix.com>
Authored: Fri Oct 25 11:49:13 2013 -0700
Committer: Alena Prokharchyk <al...@citrix.com>
Committed: Fri Oct 25 11:57:17 2013 -0700

----------------------------------------------------------------------
 .../cloud/server/ResourceMetaDataService.java   |   9 ++
 .../user/volume/ListResourceDetailsCmd.java     |   9 +-
 .../com/cloud/api/query/QueryManagerImpl.java   |  50 ++-----
 .../metadata/ResourceMetaDataManagerImpl.java   | 145 +++++++++++--------
 4 files changed, 112 insertions(+), 101 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/aa9f8e64/api/src/com/cloud/server/ResourceMetaDataService.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/server/ResourceMetaDataService.java b/api/src/com/cloud/server/ResourceMetaDataService.java
index 1a12b6a..46f1c4a 100644
--- a/api/src/com/cloud/server/ResourceMetaDataService.java
+++ b/api/src/com/cloud/server/ResourceMetaDataService.java
@@ -16,8 +16,11 @@
 // under the License.package com.cloud.server;
 
 package com.cloud.server;
+import java.util.List;
 import java.util.Map;
 
+import org.apache.cloudstack.api.ResourceDetail;
+
 import com.cloud.server.ResourceTag.ResourceObjectType;
 
 public interface ResourceMetaDataService {
@@ -41,4 +44,10 @@ public interface ResourceMetaDataService {
     public boolean deleteResourceMetaData(String resourceId, ResourceObjectType resourceType, String key);
 
 
+    List<? extends ResourceDetail> getDetails(long resourceId, ResourceObjectType resourceType);
+
+
+    ResourceDetail getDetail(long resourceId, ResourceObjectType resourceType, String key);
+
+
     }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/aa9f8e64/api/src/org/apache/cloudstack/api/command/user/volume/ListResourceDetailsCmd.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/command/user/volume/ListResourceDetailsCmd.java b/api/src/org/apache/cloudstack/api/command/user/volume/ListResourceDetailsCmd.java
index 4c2856b..18accac 100644
--- a/api/src/org/apache/cloudstack/api/command/user/volume/ListResourceDetailsCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/volume/ListResourceDetailsCmd.java
@@ -17,7 +17,8 @@
 
 package org.apache.cloudstack.api.command.user.volume;
 
-import com.cloud.server.ResourceTag;
+import java.util.List;
+
 import org.apache.cloudstack.api.APICommand;
 import org.apache.cloudstack.api.ApiConstants;
 import org.apache.cloudstack.api.BaseListProjectAndAccountResourcesCmd;
@@ -26,16 +27,16 @@ import org.apache.cloudstack.api.response.ListResponse;
 import org.apache.cloudstack.api.response.ResourceDetailResponse;
 import org.apache.cloudstack.api.response.ResourceTagResponse;
 
-import java.util.List;
+import com.cloud.server.ResourceTag;
 
 @APICommand(name = "listResourceDetails", description = "List resource detail(s)", responseObject = ResourceTagResponse.class, since = "4.2")
 public class ListResourceDetailsCmd extends BaseListProjectAndAccountResourcesCmd{
     private static final String s_name = "listresourcedetailsresponse";
 
-    @Parameter(name=ApiConstants.RESOURCE_TYPE, type=CommandType.STRING, description="list by resource type")
+    @Parameter(name=ApiConstants.RESOURCE_TYPE, type=CommandType.STRING, description="list by resource type", required=true)
     private String resourceType;
 
-    @Parameter(name=ApiConstants.RESOURCE_ID, type=CommandType.STRING, description="list by resource id")
+    @Parameter(name=ApiConstants.RESOURCE_ID, type=CommandType.STRING, description="list by resource id", required=true)
     private String resourceId;
 
     @Parameter(name=ApiConstants.KEY, type=CommandType.STRING, description="list by key")

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/aa9f8e64/server/src/com/cloud/api/query/QueryManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/api/query/QueryManagerImpl.java b/server/src/com/cloud/api/query/QueryManagerImpl.java
index 8cf09bf..85674ea 100644
--- a/server/src/com/cloud/api/query/QueryManagerImpl.java
+++ b/server/src/com/cloud/api/query/QueryManagerImpl.java
@@ -138,7 +138,6 @@ import com.cloud.event.dao.EventJoinDao;
 import com.cloud.exception.CloudAuthenticationException;
 import com.cloud.exception.InvalidParameterValueException;
 import com.cloud.exception.PermissionDeniedException;
-import com.cloud.exception.UnsupportedServiceException;
 import com.cloud.ha.HighAvailabilityManager;
 import com.cloud.hypervisor.Hypervisor.HypervisorType;
 import com.cloud.network.dao.NetworkDetailsDao;
@@ -3264,54 +3263,25 @@ public class QueryManagerImpl extends ManagerBase implements QueryService {
     public List<ResourceDetailResponse> listResource(ListResourceDetailsCmd cmd) {
         String key = cmd.getKey();
         ResourceTag.ResourceObjectType resourceType = cmd.getResourceType();
-        String resourceId = cmd.getResourceId();
-        long id = _taggedResourceMgr.getResourceId(resourceId, resourceType);
-        List<ResourceDetailResponse> responseList = new ArrayList<ResourceDetailResponse>();
-        List<? extends ResourceDetail> detailList = new ArrayList<ResourceDetail>();
+        String resourceIdStr = cmd.getResourceId();
+        long resourceId = _taggedResourceMgr.getResourceId(resourceIdStr, resourceType);
+        List<? extends ResourceDetail> detailList = new ArrayList<ResourceDetail>();        
         ResourceDetail requestedDetail = null;
 
-        
-        if (resourceType == ResourceTag.ResourceObjectType.Volume) {
-            if (key == null) {
-                detailList = _volumeDetailDao.findDetailsList(id);
-            } else {
-                requestedDetail = _volumeDetailDao.findDetail(id, key);
-            }
-        } else if (resourceType == ResourceTag.ResourceObjectType.Nic){
-            if (key == null) {
-                detailList = _nicDetailDao.findDetailsList(id);
-            } else {
-                requestedDetail = _nicDetailDao.findDetail(id, key);
-            }
-        } else if (resourceType == ResourceTag.ResourceObjectType.UserVm){
-            if (key == null) {
-                detailList = _userVmDetailDao.findDetailsList(id);
-            } else {
-                requestedDetail = _userVmDetailDao.findDetail(id, key);
-            }
-        } else if (resourceType == ResourceTag.ResourceObjectType.Zone){
-            if (key == null) {
-                detailList = _dcDetailsDao.findDetailsList(id);
-            } else {
-                requestedDetail = _dcDetailsDao.findDetail(id, key);
-            }
-        } else if (resourceType == ResourceObjectType.Network){
-            if (key == null) {
-                detailList = _networkDetailsDao.findDetailsList(id);
-            } else {
-                requestedDetail = _networkDetailsDao.findDetail(id, key);
-            }
-        }else {
-            throw new UnsupportedServiceException("Resource type " + resourceType + " is not supported by the cloudStack");
+        if (key == null) {
+            detailList = _resourceMetaDataMgr.getDetails(resourceId, resourceType);
+        } else {
+            requestedDetail = _resourceMetaDataMgr.getDetail(resourceId, resourceType, key);
         }
         
+        List<ResourceDetailResponse> responseList = new ArrayList<ResourceDetailResponse>();
         if (requestedDetail != null) {
-            ResourceDetailResponse detailResponse = createResourceDetailsResponse(id, requestedDetail.getName(), requestedDetail.getValue(),
+            ResourceDetailResponse detailResponse = createResourceDetailsResponse(resourceId, requestedDetail.getName(), requestedDetail.getValue(),
                     resourceType);
             responseList.add(detailResponse);
         } else {
             for (ResourceDetail detail : detailList) {
-                ResourceDetailResponse detailResponse = createResourceDetailsResponse(id, detail.getName(), detail.getValue(),
+                ResourceDetailResponse detailResponse = createResourceDetailsResponse(resourceId, detail.getName(), detail.getValue(),
                         resourceType);
                 responseList.add(detailResponse);
             }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/aa9f8e64/server/src/com/cloud/metadata/ResourceMetaDataManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/metadata/ResourceMetaDataManagerImpl.java b/server/src/com/cloud/metadata/ResourceMetaDataManagerImpl.java
index 152e57f..5bfe004 100644
--- a/server/src/com/cloud/metadata/ResourceMetaDataManagerImpl.java
+++ b/server/src/com/cloud/metadata/ResourceMetaDataManagerImpl.java
@@ -16,17 +16,22 @@
 // under the License.
 package com.cloud.metadata;
 
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 import javax.ejb.Local;
 import javax.inject.Inject;
 import javax.naming.ConfigurationException;
 
+import org.apache.cloudstack.api.ResourceDetail;
 import org.apache.log4j.Logger;
 import org.springframework.stereotype.Component;
 
 import com.cloud.dc.DataCenterDetailVO;
 import com.cloud.dc.dao.DataCenterDetailsDao;
+import com.cloud.dc.dao.ResourceDetailDao;
 import com.cloud.event.ActionEvent;
 import com.cloud.event.EventTypes;
 import com.cloud.exception.InvalidParameterValueException;
@@ -71,13 +76,21 @@ public class ResourceMetaDataManagerImpl extends ManagerBase implements Resource
     @Inject
     VMTemplateDetailsDao _templateDetailsDao;
     @Inject
-    UserVmDetailsDao _userVmDetailsDao;
-    @Inject
     ServiceOfferingDetailsDao _serviceOfferingDetailsDao;
     
+    private static Map<ResourceObjectType, ResourceDetailDao<? extends ResourceDetail>> _daoMap= 
+            new HashMap<ResourceObjectType, ResourceDetailDao<? extends ResourceDetail>>();
+    
 
     @Override
     public boolean configure(String name, Map<String, Object> params) throws ConfigurationException {
+        _daoMap.put(ResourceObjectType.UserVm, _userVmDetailDao);
+        _daoMap.put(ResourceObjectType.Volume, _volumeDetailDao);
+        _daoMap.put(ResourceObjectType.Template, _templateDetailsDao);
+        _daoMap.put(ResourceObjectType.Network, _networkDetailsDao);
+        _daoMap.put(ResourceObjectType.Nic, _nicDetailDao);
+        _daoMap.put(ResourceObjectType.ServiceOffering, _serviceOfferingDetailsDao);
+        _daoMap.put(ResourceObjectType.Zone, _dcDetailsDao);
         return true;
     }
 
@@ -100,40 +113,34 @@ public class ResourceMetaDataManagerImpl extends ManagerBase implements Resource
             @Override
             public Boolean doInTransaction(TransactionStatus status) {
                 for (String key : details.keySet()) {
-                        String value = details.get(key);
-
-                        if (value == null || value.isEmpty()) {
-                            throw new InvalidParameterValueException("Value for the key " + key + " is either null or empty");
-                        }
+                    long id = _taggedResourceMgr.getResourceId(resourceId, resourceType);
+                    String value = details.get(key);
+
+                    if (value == null || value.isEmpty()) {
+                        throw new InvalidParameterValueException("Value for the key " + key + " is either null or empty");
+                    }
+
+                    DetailDaoHelper newDetailDaoHelper = new DetailDaoHelper(resourceType);
+                    ResourceDetail detail = null;
+                    
+                    // TODO - Have a better design here for getting the DAO.
+                    if(resourceType == ResourceObjectType.Volume){
+                        detail = new VolumeDetailVO(id, key, value);
+                    } else if (resourceType == ResourceObjectType.Nic){
+                        detail = new NicDetailVO(id, key, value);
+                    } else if (resourceType == ResourceObjectType.Zone){
+                        detail = new DataCenterDetailVO(id, key, value);
+                    } else if (resourceType == ResourceObjectType.Network){
+                        detail = new NetworkDetailVO(id, key, value);
+                    } else if (resourceType == ResourceObjectType.UserVm) {
+                        detail = new UserVmDetailVO(id, key, value);
+                    } else if (resourceType == ResourceObjectType.Template) {
+                        detail = new VMTemplateDetailVO(id, key, value);
+                    } else if (resourceType == ResourceObjectType.ServiceOffering) {
+                        detail = new ServiceOfferingDetailsVO(id, key, value);
+                    }
+                    newDetailDaoHelper.addDetail(detail);
                         
-                        if (!resourceType.resourceMetadataSupport())  {
-                            throw new InvalidParameterValueException("The resource type " + resourceType + " doesn't support metadata (resource details)");
-                        }
-
-                        long id = _taggedResourceMgr.getResourceId(resourceId, resourceType);
-                        // TODO - Have a better design here for getting the DAO.
-                        if(resourceType == ResourceObjectType.Volume){
-                            VolumeDetailVO detail = new VolumeDetailVO(id, key, value);
-                            _volumeDetailDao.addDetail(detail);
-                        } else if (resourceType == ResourceObjectType.Nic){
-                            NicDetailVO detail = new NicDetailVO(id, key, value);
-                            _nicDetailDao.addDetail(detail);
-                        } else if (resourceType == ResourceObjectType.Zone){
-                             DataCenterDetailVO dataCenterDetail = new DataCenterDetailVO(id, key, value);
-                             _dcDetailsDao.addDetail(dataCenterDetail);
-                        } else if (resourceType == ResourceObjectType.Network){
-                            NetworkDetailVO detail = new NetworkDetailVO(id, key, value);
-                            _networkDetailsDao.addDetail(detail);
-                        } else if (resourceType == ResourceObjectType.UserVm) {
-                            UserVmDetailVO detail = new UserVmDetailVO(id, key, value);
-                            _userVmDetailsDao.addDetail(detail);
-                        } else if (resourceType == ResourceObjectType.Template) {
-                             VMTemplateDetailVO detail = new VMTemplateDetailVO(id, key, value);
-                            _templateDetailsDao.addDetail(detail);
-                        } else if (resourceType == ResourceObjectType.ServiceOffering) {
-                            ServiceOfferingDetailsVO detail = new ServiceOfferingDetailsVO(id, key, value);
-                            _serviceOfferingDetailsDao.addDetail(detail);
-                        }
                 }
                 
                 
@@ -147,32 +154,56 @@ public class ResourceMetaDataManagerImpl extends ManagerBase implements Resource
     @DB
     @ActionEvent(eventType = EventTypes.EVENT_RESOURCE_DETAILS_DELETE, eventDescription = "deleting resource meta data")
     public boolean deleteResourceMetaData(String resourceId, ResourceObjectType resourceType, String key){
-
         long id = _taggedResourceMgr.getResourceId(resourceId, resourceType);
         
-        if (!resourceType.resourceMetadataSupport()) {
-            throw new InvalidParameterValueException("The resource type " + resourceType + " is not supported by the API yet");
-        }
-        
-        // TODO - Have a better design here for getting the DAO.
-        if (resourceType == ResourceObjectType.Volume){
-           _volumeDetailDao.removeDetail(id, key);
-        } else if (resourceType == ResourceObjectType.Nic){
-            _nicDetailDao.removeDetail(id, key);
-        } else if (resourceType == ResourceObjectType.UserVm) {
-            _userVmDetailsDao.removeDetail(id, key); 
-        } else if (resourceType == ResourceObjectType.Template) {
-            _templateDetailsDao.removeDetail(id, key);
-        } else if (resourceType == ResourceObjectType.Zone){
-            _dcDetailsDao.removeDetail(id, key);
-        } else if (resourceType == ResourceObjectType.ServiceOffering) {
-            _serviceOfferingDetailsDao.removeDetail(id, key);
-        } else if (resourceType == ResourceObjectType.Network) {
-            _networkDetailsDao.removeDetail(id, key);
-        }
+        DetailDaoHelper newDetailDaoHelper = new DetailDaoHelper(resourceType);
+        newDetailDaoHelper.removeDetail(id, key);
 
         return true;
     }
 
-
+    private class DetailDaoHelper {
+        private ResourceObjectType resourceType;
+        
+        private DetailDaoHelper(ResourceObjectType resourceType) {
+            if (!resourceType.resourceMetadataSupport()) {
+                throw new UnsupportedOperationException("ResourceType " + resourceType + " doesn't support metadata");
+            }
+            this.resourceType = resourceType;
+        }
+        
+        private void addDetail(ResourceDetail detail) {
+            ResourceDetailDao<ResourceDetail> dao = (ResourceDetailDao<ResourceDetail>)_daoMap.get(resourceType);
+            dao.addDetail(detail);   
+        }
+        
+        private void removeDetail(long resourceId, String key) {
+            ResourceDetailDao<? extends ResourceDetail> dao = _daoMap.get(resourceType);
+            dao.removeDetail(resourceId, key);
+        }
+        
+        private List<? extends ResourceDetail> getDetails(long resourceId) {
+            ResourceDetailDao<? extends ResourceDetail> dao = _daoMap.get(resourceType);
+            List<? extends ResourceDetail> detailList = new ArrayList<ResourceDetail>();        
+            detailList = dao.findDetailsList(resourceId);
+            return detailList;
+        }
+        
+        private ResourceDetail getDetail(long resourceId, String key) {
+            ResourceDetailDao<? extends ResourceDetail> dao = _daoMap.get(resourceType);
+            return dao.findDetail(resourceId, key);
+        }
+    }
+    
+    @Override
+    public List<? extends ResourceDetail> getDetails(long resourceId, ResourceObjectType resourceType) {
+        DetailDaoHelper newDetailDaoHelper = new DetailDaoHelper(resourceType);
+        return newDetailDaoHelper.getDetails(resourceId);  
+    }
+    
+    @Override
+    public ResourceDetail getDetail(long resourceId, ResourceObjectType resourceType, String key) {
+        DetailDaoHelper newDetailDaoHelper = new DetailDaoHelper(resourceType);
+        return newDetailDaoHelper.getDetail(resourceId, key);  
+    }
 }


[49/50] [abbrv] git commit: updated refs/heads/object_store_migration to 5ec2a44

Posted by mc...@apache.org.
Fix VPC issue due to VpcVirtualNetworkApplianceManagerImpl.java is not registered

It should be registered rather than VirtualNetworkApplianceManageImpl.java,
since it would cover the isolated network case as well.


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

Branch: refs/heads/object_store_migration
Commit: 271a7dff9eabfb5c2bdb79316899c2e32a90c629
Parents: 89d6e7e
Author: Sheng Yang <sh...@citrix.com>
Authored: Mon Oct 28 17:00:23 2013 -0700
Committer: Sheng Yang <sh...@citrix.com>
Committed: Mon Oct 28 17:55:51 2013 -0700

----------------------------------------------------------------------
 .../network/router/VirtualNetworkApplianceManagerImpl.java    | 1 -
 .../network/router/VpcVirtualNetworkApplianceManagerImpl.java | 7 +++++++
 2 files changed, 7 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/271a7dff/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
index ee4c6f4..48fdc35 100755
--- a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
+++ b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
@@ -694,7 +694,6 @@ public class VirtualNetworkApplianceManagerImpl extends ManagerBase implements V
         s_logger.info("Router configurations: " + "ramsize=" + _routerRamSize);
 
         _agentMgr.registerForHostEvents(new SshKeysDistriMonitor(_agentMgr, _hostDao, _configDao), true, false, false);
-        _itMgr.registerGuru(VirtualMachine.Type.DomainRouter, this);
 
         boolean useLocalStorage = Boolean.parseBoolean(configs.get(Config.SystemVMUseLocalStorage.key()));
         _offering = new ServiceOfferingVO("System Offering For Software Router", 1, _routerRamSize, _routerCpuMHz, null,

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/271a7dff/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java b/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java
index 2e0f411..63eb75b 100644
--- a/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java
+++ b/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java
@@ -27,6 +27,7 @@ import java.util.TreeSet;
 
 import javax.ejb.Local;
 import javax.inject.Inject;
+import javax.naming.ConfigurationException;
 
 import org.apache.log4j.Logger;
 import org.springframework.stereotype.Component;
@@ -169,6 +170,12 @@ public class VpcVirtualNetworkApplianceManagerImpl extends VirtualNetworkApplian
     EntityManager _entityMgr;
     
     @Override
+    public boolean configure(final String name, final Map<String, Object> params) throws ConfigurationException {
+        _itMgr.registerGuru(VirtualMachine.Type.DomainRouter, this);
+        return super.configure(name, params);
+    }
+    
+    @Override
     public List<DomainRouterVO> deployVirtualRouterInVpc(Vpc vpc, DeployDestination dest, Account owner,
             Map<Param, Object> params) throws InsufficientCapacityException,
             ConcurrentOperationException, ResourceUnavailableException {


[47/50] [abbrv] git commit: updated refs/heads/object_store_migration to 5ec2a44

Posted by mc...@apache.org.
Moved ResourceDao and ResourceDaoBase to cloud-engine-schema/org/apache/cloudstack (used to be mistakenly placed under com/cloud/cloud)


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

Branch: refs/heads/object_store_migration
Commit: 2cac1aaa0fc9ab82c64b66244ad4f169654a3d73
Parents: 5caeab7
Author: Alena Prokharchyk <al...@citrix.com>
Authored: Mon Oct 28 15:03:57 2013 -0700
Committer: Alena Prokharchyk <al...@citrix.com>
Committed: Mon Oct 28 15:03:57 2013 -0700

----------------------------------------------------------------------
 .../com/cloud/dc/dao/DataCenterDetailsDao.java  |   2 +
 .../cloud/dc/dao/DataCenterDetailsDaoImpl.java  |   1 +
 .../com/cloud/dc/dao/ResourceDetailsDao.java    |  42 -------
 .../cloud/dc/dao/ResourceDetailsDaoBase.java    | 116 -------------------
 .../cloud/network/dao/NetworkDetailsDao.java    |   3 +-
 .../network/dao/NetworkDetailsDaoImpl.java      |   2 +-
 .../service/dao/ServiceOfferingDetailsDao.java  |   3 +-
 .../dao/ServiceOfferingDetailsDaoImpl.java      |   2 +-
 .../storage/dao/StoragePoolDetailsDaoImpl.java  |   2 +-
 .../cloud/storage/dao/VMTemplateDetailsDao.java |   3 +-
 .../storage/dao/VMTemplateDetailsDaoImpl.java   |   2 +-
 .../com/cloud/storage/dao/VolumeDetailsDao.java |   3 +-
 .../cloud/storage/dao/VolumeDetailsDaoImpl.java |   2 +-
 .../src/com/cloud/vm/dao/NicDetailsDao.java     |   3 +-
 .../src/com/cloud/vm/dao/NicDetailsDaoImpl.java |   2 +-
 .../src/com/cloud/vm/dao/UserVmDetailsDao.java  |   3 +-
 .../com/cloud/vm/dao/UserVmDetailsDaoImpl.java  |   2 +-
 .../resourcedetail/ResourceDetailsDao.java      |  42 +++++++
 .../resourcedetail/ResourceDetailsDaoBase.java  | 116 +++++++++++++++++++
 .../dao/FirewallRuleDetailsDao.java             |   2 +-
 .../dao/FirewallRuleDetailsDaoImpl.java         |   2 +-
 .../db/PrimaryDataStoreDetailsDao.java          |   2 +-
 .../datastore/db/StoragePoolDetailsDao.java     |   3 +-
 .../db/PrimaryDataStoreDetailsDaoImpl.java      |   2 +-
 server/src/com/cloud/api/ApiDBUtils.java        |   2 +-
 .../metadata/ResourceMetaDataManagerImpl.java   |   2 +-
 26 files changed, 188 insertions(+), 178 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2cac1aaa/engine/schema/src/com/cloud/dc/dao/DataCenterDetailsDao.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/dc/dao/DataCenterDetailsDao.java b/engine/schema/src/com/cloud/dc/dao/DataCenterDetailsDao.java
index 747d558..ed7c494 100644
--- a/engine/schema/src/com/cloud/dc/dao/DataCenterDetailsDao.java
+++ b/engine/schema/src/com/cloud/dc/dao/DataCenterDetailsDao.java
@@ -16,6 +16,8 @@
 // under the License.
 package com.cloud.dc.dao;
 
+import org.apache.cloudstack.resourcedetail.ResourceDetailsDao;
+
 import com.cloud.dc.DataCenterDetailVO;
 import com.cloud.utils.db.GenericDao;
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2cac1aaa/engine/schema/src/com/cloud/dc/dao/DataCenterDetailsDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/dc/dao/DataCenterDetailsDaoImpl.java b/engine/schema/src/com/cloud/dc/dao/DataCenterDetailsDaoImpl.java
index 1d003ca..93c08ec 100644
--- a/engine/schema/src/com/cloud/dc/dao/DataCenterDetailsDaoImpl.java
+++ b/engine/schema/src/com/cloud/dc/dao/DataCenterDetailsDaoImpl.java
@@ -22,6 +22,7 @@ import org.apache.cloudstack.api.ResourceDetail;
 import org.apache.cloudstack.framework.config.ConfigKey;
 import org.apache.cloudstack.framework.config.ConfigKey.Scope;
 import org.apache.cloudstack.framework.config.ScopedConfigStorage;
+import org.apache.cloudstack.resourcedetail.ResourceDetailsDaoBase;
 
 import com.cloud.dc.DataCenterDetailVO;
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2cac1aaa/engine/schema/src/com/cloud/dc/dao/ResourceDetailsDao.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/dc/dao/ResourceDetailsDao.java b/engine/schema/src/com/cloud/dc/dao/ResourceDetailsDao.java
deleted file mode 100644
index fd8f89c..0000000
--- a/engine/schema/src/com/cloud/dc/dao/ResourceDetailsDao.java
+++ /dev/null
@@ -1,42 +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 com.cloud.dc.dao;
-
-import java.util.List;
-import java.util.Map;
-
-import org.apache.cloudstack.api.ResourceDetail;
-
-import com.cloud.utils.db.GenericDao;
-
-public interface ResourceDetailsDao<R extends ResourceDetail> extends GenericDao<R, Long>{
-    public R findDetail(long resourceId, String name);
-
-    public Map<String, String> findDetails(long resourceId);
-
-    public List<R> findDetailsList(long resourceId);
-
-    public void removeDetails(long resourceId);
-
-    public void removeDetail(long resourceId, String key);
-
-    public void addDetails(List<R> details);
-    
-    public void addDetail(R detail);
-    
-    public R createDetail(long resourceId, String key, String value);
-}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2cac1aaa/engine/schema/src/com/cloud/dc/dao/ResourceDetailsDaoBase.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/dc/dao/ResourceDetailsDaoBase.java b/engine/schema/src/com/cloud/dc/dao/ResourceDetailsDaoBase.java
deleted file mode 100644
index ba0e5c3..0000000
--- a/engine/schema/src/com/cloud/dc/dao/ResourceDetailsDaoBase.java
+++ /dev/null
@@ -1,116 +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 com.cloud.dc.dao;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.cloudstack.api.ResourceDetail;
-
-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 abstract class ResourceDetailsDaoBase<R extends ResourceDetail> extends GenericDaoBase<R, Long>{
-    private SearchBuilder<R> AllFieldsSearch;
-    
-    public ResourceDetailsDaoBase() {
-        AllFieldsSearch = createSearchBuilder();
-        AllFieldsSearch.and("resourceId", AllFieldsSearch.entity().getResourceId(), SearchCriteria.Op.EQ);
-        AllFieldsSearch.and("name", AllFieldsSearch.entity().getName(), SearchCriteria.Op.EQ);
-        AllFieldsSearch.done();
-    }
-
-    public R findDetail(long resourceId, String name) {
-        SearchCriteria<R> sc = AllFieldsSearch.create();
-        sc.setParameters("resourceId", resourceId);
-        sc.setParameters("name", name);
-        
-        return findOneBy(sc);
-    }
-
-
-    public Map<String, String> findDetails(long resourceId) {
-        SearchCriteria<R> sc = AllFieldsSearch.create();
-        sc.setParameters("resourceId", resourceId);
-        
-        List<R> results = search(sc, null);
-        Map<String, String> details = new HashMap<String, String>(results.size());
-        for (R result : results) {
-            details.put(result.getName(), result.getValue());
-        }
-        return details;
-    }
-
-    public List<R> findDetailsList(long resourceId) {
-        SearchCriteria<R> sc = AllFieldsSearch.create();
-        sc.setParameters("resourceId", resourceId);
-
-        List<R> results = search(sc, null);
-        return results;
-    }
-
-
-    public void removeDetails(long resourceId) {
-        SearchCriteria<R> sc = AllFieldsSearch.create();
-        sc.setParameters("resourceId", resourceId);
-        remove(sc);
-    }
-
-    
-    public void removeDetail(long resourceId, String key) {
-        if (key != null){
-            SearchCriteria<R> sc = AllFieldsSearch.create();
-            sc.setParameters("name", key);
-            remove(sc);
-        }
-    }
-
-
-    public void addDetails(List<R> details) {
-        if (details.isEmpty()) {
-            return;
-        }
-        TransactionLegacy txn = TransactionLegacy.currentTxn();
-        txn.start();
-        SearchCriteria<R> sc = AllFieldsSearch.create();
-        sc.setParameters("resourceId", details.get(0).getResourceId());
-        expunge(sc);
-        
-        for (R detail : details) {
-            persist(detail);
-        }
-        
-        txn.commit();
-    }
-    
-
-    public void addDetail(R detail) {
-        if (detail == null) {
-            return;
-        }
-        R existingDetail = findDetail(detail.getResourceId(), detail.getName());
-        if (existingDetail != null) {
-            remove(existingDetail.getId());
-        }
-        persist(detail);
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2cac1aaa/engine/schema/src/com/cloud/network/dao/NetworkDetailsDao.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/network/dao/NetworkDetailsDao.java b/engine/schema/src/com/cloud/network/dao/NetworkDetailsDao.java
index ec1b44c..efe84f6 100644
--- a/engine/schema/src/com/cloud/network/dao/NetworkDetailsDao.java
+++ b/engine/schema/src/com/cloud/network/dao/NetworkDetailsDao.java
@@ -16,7 +16,8 @@
 // under the License.
 package com.cloud.network.dao;
 
-import com.cloud.dc.dao.ResourceDetailsDao;
+import org.apache.cloudstack.resourcedetail.ResourceDetailsDao;
+
 import com.cloud.utils.db.GenericDao;
 
 public interface NetworkDetailsDao extends GenericDao<NetworkDetailVO, Long>, ResourceDetailsDao<NetworkDetailVO> {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2cac1aaa/engine/schema/src/com/cloud/network/dao/NetworkDetailsDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/network/dao/NetworkDetailsDaoImpl.java b/engine/schema/src/com/cloud/network/dao/NetworkDetailsDaoImpl.java
index 5306a35..db5c44f 100644
--- a/engine/schema/src/com/cloud/network/dao/NetworkDetailsDaoImpl.java
+++ b/engine/schema/src/com/cloud/network/dao/NetworkDetailsDaoImpl.java
@@ -18,9 +18,9 @@ package com.cloud.network.dao;
 
 import javax.ejb.Local;
 
+import org.apache.cloudstack.resourcedetail.ResourceDetailsDaoBase;
 import org.springframework.stereotype.Component;
 
-import com.cloud.dc.dao.ResourceDetailsDaoBase;
 
 @Component
 @Local(value=NetworkDetailsDao.class)

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2cac1aaa/engine/schema/src/com/cloud/service/dao/ServiceOfferingDetailsDao.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/service/dao/ServiceOfferingDetailsDao.java b/engine/schema/src/com/cloud/service/dao/ServiceOfferingDetailsDao.java
index 495ccd5..b377e6c 100644
--- a/engine/schema/src/com/cloud/service/dao/ServiceOfferingDetailsDao.java
+++ b/engine/schema/src/com/cloud/service/dao/ServiceOfferingDetailsDao.java
@@ -16,7 +16,8 @@
 // under the License.
 package com.cloud.service.dao;
 
-import com.cloud.dc.dao.ResourceDetailsDao;
+import org.apache.cloudstack.resourcedetail.ResourceDetailsDao;
+
 import com.cloud.service.ServiceOfferingDetailsVO;
 import com.cloud.utils.db.GenericDao;
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2cac1aaa/engine/schema/src/com/cloud/service/dao/ServiceOfferingDetailsDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/service/dao/ServiceOfferingDetailsDaoImpl.java b/engine/schema/src/com/cloud/service/dao/ServiceOfferingDetailsDaoImpl.java
index c059ca8..8a78b17 100644
--- a/engine/schema/src/com/cloud/service/dao/ServiceOfferingDetailsDaoImpl.java
+++ b/engine/schema/src/com/cloud/service/dao/ServiceOfferingDetailsDaoImpl.java
@@ -18,9 +18,9 @@ package com.cloud.service.dao;
 
 import javax.ejb.Local;
 
+import org.apache.cloudstack.resourcedetail.ResourceDetailsDaoBase;
 import org.springframework.stereotype.Component;
 
-import com.cloud.dc.dao.ResourceDetailsDaoBase;
 import com.cloud.service.ServiceOfferingDetailsVO;
 
 @Component

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2cac1aaa/engine/schema/src/com/cloud/storage/dao/StoragePoolDetailsDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/storage/dao/StoragePoolDetailsDaoImpl.java b/engine/schema/src/com/cloud/storage/dao/StoragePoolDetailsDaoImpl.java
index 8914732..3c177d0 100644
--- a/engine/schema/src/com/cloud/storage/dao/StoragePoolDetailsDaoImpl.java
+++ b/engine/schema/src/com/cloud/storage/dao/StoragePoolDetailsDaoImpl.java
@@ -21,10 +21,10 @@ import javax.ejb.Local;
 import org.apache.cloudstack.framework.config.ConfigKey;
 import org.apache.cloudstack.framework.config.ConfigKey.Scope;
 import org.apache.cloudstack.framework.config.ScopedConfigStorage;
+import org.apache.cloudstack.resourcedetail.ResourceDetailsDaoBase;
 import org.apache.cloudstack.storage.datastore.db.StoragePoolDetailVO;
 import org.apache.cloudstack.storage.datastore.db.StoragePoolDetailsDao;
 
-import com.cloud.dc.dao.ResourceDetailsDaoBase;
 
 @Local(value = StoragePoolDetailsDao.class)
 public class StoragePoolDetailsDaoImpl extends ResourceDetailsDaoBase<StoragePoolDetailVO> implements StoragePoolDetailsDao, ScopedConfigStorage {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2cac1aaa/engine/schema/src/com/cloud/storage/dao/VMTemplateDetailsDao.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/storage/dao/VMTemplateDetailsDao.java b/engine/schema/src/com/cloud/storage/dao/VMTemplateDetailsDao.java
index 818f9dd..e98f651 100644
--- a/engine/schema/src/com/cloud/storage/dao/VMTemplateDetailsDao.java
+++ b/engine/schema/src/com/cloud/storage/dao/VMTemplateDetailsDao.java
@@ -16,7 +16,8 @@
 // under the License.
 package com.cloud.storage.dao;
 
-import com.cloud.dc.dao.ResourceDetailsDao;
+import org.apache.cloudstack.resourcedetail.ResourceDetailsDao;
+
 import com.cloud.storage.VMTemplateDetailVO;
 import com.cloud.utils.db.GenericDao;
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2cac1aaa/engine/schema/src/com/cloud/storage/dao/VMTemplateDetailsDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/storage/dao/VMTemplateDetailsDaoImpl.java b/engine/schema/src/com/cloud/storage/dao/VMTemplateDetailsDaoImpl.java
index d4ca38e..e2f5abf 100644
--- a/engine/schema/src/com/cloud/storage/dao/VMTemplateDetailsDaoImpl.java
+++ b/engine/schema/src/com/cloud/storage/dao/VMTemplateDetailsDaoImpl.java
@@ -18,9 +18,9 @@ package com.cloud.storage.dao;
 
 import javax.ejb.Local;
 
+import org.apache.cloudstack.resourcedetail.ResourceDetailsDaoBase;
 import org.springframework.stereotype.Component;
 
-import com.cloud.dc.dao.ResourceDetailsDaoBase;
 import com.cloud.storage.VMTemplateDetailVO;
 
 @Component

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2cac1aaa/engine/schema/src/com/cloud/storage/dao/VolumeDetailsDao.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/storage/dao/VolumeDetailsDao.java b/engine/schema/src/com/cloud/storage/dao/VolumeDetailsDao.java
index a7c7013..a7cee81 100644
--- a/engine/schema/src/com/cloud/storage/dao/VolumeDetailsDao.java
+++ b/engine/schema/src/com/cloud/storage/dao/VolumeDetailsDao.java
@@ -16,7 +16,8 @@
 // under the License.
 package com.cloud.storage.dao;
 
-import com.cloud.dc.dao.ResourceDetailsDao;
+import org.apache.cloudstack.resourcedetail.ResourceDetailsDao;
+
 import com.cloud.storage.VolumeDetailVO;
 import com.cloud.utils.db.GenericDao;
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2cac1aaa/engine/schema/src/com/cloud/storage/dao/VolumeDetailsDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/storage/dao/VolumeDetailsDaoImpl.java b/engine/schema/src/com/cloud/storage/dao/VolumeDetailsDaoImpl.java
index 700be46..1afa6a2 100644
--- a/engine/schema/src/com/cloud/storage/dao/VolumeDetailsDaoImpl.java
+++ b/engine/schema/src/com/cloud/storage/dao/VolumeDetailsDaoImpl.java
@@ -18,9 +18,9 @@ package com.cloud.storage.dao;
 
 import javax.ejb.Local;
 
+import org.apache.cloudstack.resourcedetail.ResourceDetailsDaoBase;
 import org.springframework.stereotype.Component;
 
-import com.cloud.dc.dao.ResourceDetailsDaoBase;
 import com.cloud.storage.VolumeDetailVO;
 
 @Component

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2cac1aaa/engine/schema/src/com/cloud/vm/dao/NicDetailsDao.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/vm/dao/NicDetailsDao.java b/engine/schema/src/com/cloud/vm/dao/NicDetailsDao.java
index 3835ddc..2ca901f 100644
--- a/engine/schema/src/com/cloud/vm/dao/NicDetailsDao.java
+++ b/engine/schema/src/com/cloud/vm/dao/NicDetailsDao.java
@@ -16,7 +16,8 @@
 // under the License.
 package com.cloud.vm.dao;
 
-import com.cloud.dc.dao.ResourceDetailsDao;
+import org.apache.cloudstack.resourcedetail.ResourceDetailsDao;
+
 import com.cloud.utils.db.GenericDao;
 import com.cloud.vm.NicDetailVO;
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2cac1aaa/engine/schema/src/com/cloud/vm/dao/NicDetailsDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/vm/dao/NicDetailsDaoImpl.java b/engine/schema/src/com/cloud/vm/dao/NicDetailsDaoImpl.java
index 0775f7f..d442982 100644
--- a/engine/schema/src/com/cloud/vm/dao/NicDetailsDaoImpl.java
+++ b/engine/schema/src/com/cloud/vm/dao/NicDetailsDaoImpl.java
@@ -18,9 +18,9 @@ package com.cloud.vm.dao;
 
 import javax.ejb.Local;
 
+import org.apache.cloudstack.resourcedetail.ResourceDetailsDaoBase;
 import org.springframework.stereotype.Component;
 
-import com.cloud.dc.dao.ResourceDetailsDaoBase;
 import com.cloud.vm.NicDetailVO;
 
 @Component

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2cac1aaa/engine/schema/src/com/cloud/vm/dao/UserVmDetailsDao.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/vm/dao/UserVmDetailsDao.java b/engine/schema/src/com/cloud/vm/dao/UserVmDetailsDao.java
index c06e9bb..c22da6b 100644
--- a/engine/schema/src/com/cloud/vm/dao/UserVmDetailsDao.java
+++ b/engine/schema/src/com/cloud/vm/dao/UserVmDetailsDao.java
@@ -16,7 +16,8 @@
 // under the License.
 package com.cloud.vm.dao;
 
-import com.cloud.dc.dao.ResourceDetailsDao;
+import org.apache.cloudstack.resourcedetail.ResourceDetailsDao;
+
 import com.cloud.utils.db.GenericDao;
 import com.cloud.vm.UserVmDetailVO;
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2cac1aaa/engine/schema/src/com/cloud/vm/dao/UserVmDetailsDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/vm/dao/UserVmDetailsDaoImpl.java b/engine/schema/src/com/cloud/vm/dao/UserVmDetailsDaoImpl.java
index 45c33cd..0445419 100644
--- a/engine/schema/src/com/cloud/vm/dao/UserVmDetailsDaoImpl.java
+++ b/engine/schema/src/com/cloud/vm/dao/UserVmDetailsDaoImpl.java
@@ -18,9 +18,9 @@ package com.cloud.vm.dao;
 
 import javax.ejb.Local;
 
+import org.apache.cloudstack.resourcedetail.ResourceDetailsDaoBase;
 import org.springframework.stereotype.Component;
 
-import com.cloud.dc.dao.ResourceDetailsDaoBase;
 import com.cloud.vm.UserVmDetailVO;
 
 @Component

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2cac1aaa/engine/schema/src/org/apache/cloudstack/resourcedetail/ResourceDetailsDao.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/org/apache/cloudstack/resourcedetail/ResourceDetailsDao.java b/engine/schema/src/org/apache/cloudstack/resourcedetail/ResourceDetailsDao.java
new file mode 100644
index 0000000..043c833
--- /dev/null
+++ b/engine/schema/src/org/apache/cloudstack/resourcedetail/ResourceDetailsDao.java
@@ -0,0 +1,42 @@
+// 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.resourcedetail;
+
+import java.util.List;
+import java.util.Map;
+
+import org.apache.cloudstack.api.ResourceDetail;
+
+import com.cloud.utils.db.GenericDao;
+
+public interface ResourceDetailsDao<R extends ResourceDetail> extends GenericDao<R, Long>{
+    public R findDetail(long resourceId, String name);
+
+    public Map<String, String> findDetails(long resourceId);
+
+    public List<R> findDetailsList(long resourceId);
+
+    public void removeDetails(long resourceId);
+
+    public void removeDetail(long resourceId, String key);
+
+    public void addDetails(List<R> details);
+    
+    public void addDetail(R detail);
+    
+    public R createDetail(long resourceId, String key, String value);
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2cac1aaa/engine/schema/src/org/apache/cloudstack/resourcedetail/ResourceDetailsDaoBase.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/org/apache/cloudstack/resourcedetail/ResourceDetailsDaoBase.java b/engine/schema/src/org/apache/cloudstack/resourcedetail/ResourceDetailsDaoBase.java
new file mode 100644
index 0000000..a514b1e
--- /dev/null
+++ b/engine/schema/src/org/apache/cloudstack/resourcedetail/ResourceDetailsDaoBase.java
@@ -0,0 +1,116 @@
+// 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.resourcedetail;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.cloudstack.api.ResourceDetail;
+
+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 abstract class ResourceDetailsDaoBase<R extends ResourceDetail> extends GenericDaoBase<R, Long>{
+    private SearchBuilder<R> AllFieldsSearch;
+    
+    public ResourceDetailsDaoBase() {
+        AllFieldsSearch = createSearchBuilder();
+        AllFieldsSearch.and("resourceId", AllFieldsSearch.entity().getResourceId(), SearchCriteria.Op.EQ);
+        AllFieldsSearch.and("name", AllFieldsSearch.entity().getName(), SearchCriteria.Op.EQ);
+        AllFieldsSearch.done();
+    }
+
+    public R findDetail(long resourceId, String name) {
+        SearchCriteria<R> sc = AllFieldsSearch.create();
+        sc.setParameters("resourceId", resourceId);
+        sc.setParameters("name", name);
+        
+        return findOneBy(sc);
+    }
+
+
+    public Map<String, String> findDetails(long resourceId) {
+        SearchCriteria<R> sc = AllFieldsSearch.create();
+        sc.setParameters("resourceId", resourceId);
+        
+        List<R> results = search(sc, null);
+        Map<String, String> details = new HashMap<String, String>(results.size());
+        for (R result : results) {
+            details.put(result.getName(), result.getValue());
+        }
+        return details;
+    }
+
+    public List<R> findDetailsList(long resourceId) {
+        SearchCriteria<R> sc = AllFieldsSearch.create();
+        sc.setParameters("resourceId", resourceId);
+
+        List<R> results = search(sc, null);
+        return results;
+    }
+
+
+    public void removeDetails(long resourceId) {
+        SearchCriteria<R> sc = AllFieldsSearch.create();
+        sc.setParameters("resourceId", resourceId);
+        remove(sc);
+    }
+
+    
+    public void removeDetail(long resourceId, String key) {
+        if (key != null){
+            SearchCriteria<R> sc = AllFieldsSearch.create();
+            sc.setParameters("name", key);
+            remove(sc);
+        }
+    }
+
+
+    public void addDetails(List<R> details) {
+        if (details.isEmpty()) {
+            return;
+        }
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
+        txn.start();
+        SearchCriteria<R> sc = AllFieldsSearch.create();
+        sc.setParameters("resourceId", details.get(0).getResourceId());
+        expunge(sc);
+        
+        for (R detail : details) {
+            persist(detail);
+        }
+        
+        txn.commit();
+    }
+    
+
+    public void addDetail(R detail) {
+        if (detail == null) {
+            return;
+        }
+        R existingDetail = findDetail(detail.getResourceId(), detail.getName());
+        if (existingDetail != null) {
+            remove(existingDetail.getId());
+        }
+        persist(detail);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2cac1aaa/engine/schema/src/org/apache/cloudstack/resourcedetail/dao/FirewallRuleDetailsDao.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/org/apache/cloudstack/resourcedetail/dao/FirewallRuleDetailsDao.java b/engine/schema/src/org/apache/cloudstack/resourcedetail/dao/FirewallRuleDetailsDao.java
index eae1d10..9931aaa 100644
--- a/engine/schema/src/org/apache/cloudstack/resourcedetail/dao/FirewallRuleDetailsDao.java
+++ b/engine/schema/src/org/apache/cloudstack/resourcedetail/dao/FirewallRuleDetailsDao.java
@@ -17,8 +17,8 @@
 package org.apache.cloudstack.resourcedetail.dao;
 
 import org.apache.cloudstack.resourcedetail.FirewallRuleDetailVO;
+import org.apache.cloudstack.resourcedetail.ResourceDetailsDao;
 
-import com.cloud.dc.dao.ResourceDetailsDao;
 import com.cloud.utils.db.GenericDao;
 
 public interface FirewallRuleDetailsDao extends GenericDao<FirewallRuleDetailVO, Long>, ResourceDetailsDao<FirewallRuleDetailVO>{

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2cac1aaa/engine/schema/src/org/apache/cloudstack/resourcedetail/dao/FirewallRuleDetailsDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/org/apache/cloudstack/resourcedetail/dao/FirewallRuleDetailsDaoImpl.java b/engine/schema/src/org/apache/cloudstack/resourcedetail/dao/FirewallRuleDetailsDaoImpl.java
index b235ace..bff86db 100644
--- a/engine/schema/src/org/apache/cloudstack/resourcedetail/dao/FirewallRuleDetailsDaoImpl.java
+++ b/engine/schema/src/org/apache/cloudstack/resourcedetail/dao/FirewallRuleDetailsDaoImpl.java
@@ -19,9 +19,9 @@ package org.apache.cloudstack.resourcedetail.dao;
 import javax.ejb.Local;
 
 import org.apache.cloudstack.resourcedetail.FirewallRuleDetailVO;
+import org.apache.cloudstack.resourcedetail.ResourceDetailsDaoBase;
 import org.springframework.stereotype.Component;
 
-import com.cloud.dc.dao.ResourceDetailsDaoBase;
 
 @Component
 @Local (value={FirewallRuleDetailsDao.class})

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2cac1aaa/engine/schema/src/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDetailsDao.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDetailsDao.java b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDetailsDao.java
index 7b6d390..5bab460 100644
--- a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDetailsDao.java
+++ b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDetailsDao.java
@@ -16,7 +16,7 @@
 // under the License.
 package org.apache.cloudstack.storage.datastore.db;
 
-import com.cloud.dc.dao.ResourceDetailsDao;
+import org.apache.cloudstack.resourcedetail.ResourceDetailsDao;
 
 public interface PrimaryDataStoreDetailsDao extends ResourceDetailsDao<PrimaryDataStoreDetailVO> {
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2cac1aaa/engine/schema/src/org/apache/cloudstack/storage/datastore/db/StoragePoolDetailsDao.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/StoragePoolDetailsDao.java b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/StoragePoolDetailsDao.java
index 2ec04d5..114a5b7 100644
--- a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/StoragePoolDetailsDao.java
+++ b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/StoragePoolDetailsDao.java
@@ -16,7 +16,8 @@
 // under the License.
 package org.apache.cloudstack.storage.datastore.db;
 
-import com.cloud.dc.dao.ResourceDetailsDao;
+import org.apache.cloudstack.resourcedetail.ResourceDetailsDao;
+
 import com.cloud.utils.db.GenericDao;
 
 public interface StoragePoolDetailsDao extends GenericDao<StoragePoolDetailVO, Long>, ResourceDetailsDao<StoragePoolDetailVO> {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2cac1aaa/engine/storage/src/org/apache/cloudstack/storage/volume/db/PrimaryDataStoreDetailsDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/volume/db/PrimaryDataStoreDetailsDaoImpl.java b/engine/storage/src/org/apache/cloudstack/storage/volume/db/PrimaryDataStoreDetailsDaoImpl.java
index 5613931..61125f6 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/volume/db/PrimaryDataStoreDetailsDaoImpl.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/volume/db/PrimaryDataStoreDetailsDaoImpl.java
@@ -16,11 +16,11 @@
 // under the License.
 package org.apache.cloudstack.storage.volume.db;
 
+import org.apache.cloudstack.resourcedetail.ResourceDetailsDaoBase;
 import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDetailVO;
 import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDetailsDao;
 import org.springframework.stereotype.Component;
 
-import com.cloud.dc.dao.ResourceDetailsDaoBase;
 
 @Component
 public class PrimaryDataStoreDetailsDaoImpl extends ResourceDetailsDaoBase<PrimaryDataStoreDetailVO> implements

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2cac1aaa/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 1be6a21..aec25e5 100755
--- a/server/src/com/cloud/api/ApiDBUtils.java
+++ b/server/src/com/cloud/api/ApiDBUtils.java
@@ -59,6 +59,7 @@ import org.apache.cloudstack.framework.jobs.AsyncJob;
 import org.apache.cloudstack.framework.jobs.AsyncJobManager;
 import org.apache.cloudstack.framework.jobs.dao.AsyncJobDao;
 import org.apache.cloudstack.lb.dao.ApplicationLoadBalancerRuleDao;
+import org.apache.cloudstack.resourcedetail.ResourceDetailsDaoBase;
 import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
 import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
 
@@ -126,7 +127,6 @@ import com.cloud.dc.dao.ClusterDao;
 import com.cloud.dc.dao.DataCenterDao;
 import com.cloud.dc.dao.DataCenterDetailsDao;
 import com.cloud.dc.dao.HostPodDao;
-import com.cloud.dc.dao.ResourceDetailsDaoBase;
 import com.cloud.dc.dao.VlanDao;
 import com.cloud.domain.DomainVO;
 import com.cloud.domain.dao.DomainDao;

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2cac1aaa/server/src/com/cloud/metadata/ResourceMetaDataManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/metadata/ResourceMetaDataManagerImpl.java b/server/src/com/cloud/metadata/ResourceMetaDataManagerImpl.java
index 6d03b2a..ec5b7ea 100644
--- a/server/src/com/cloud/metadata/ResourceMetaDataManagerImpl.java
+++ b/server/src/com/cloud/metadata/ResourceMetaDataManagerImpl.java
@@ -26,13 +26,13 @@ import javax.inject.Inject;
 import javax.naming.ConfigurationException;
 
 import org.apache.cloudstack.api.ResourceDetail;
+import org.apache.cloudstack.resourcedetail.ResourceDetailsDao;
 import org.apache.cloudstack.resourcedetail.dao.FirewallRuleDetailsDao;
 import org.apache.cloudstack.storage.datastore.db.StoragePoolDetailsDao;
 import org.apache.log4j.Logger;
 import org.springframework.stereotype.Component;
 
 import com.cloud.dc.dao.DataCenterDetailsDao;
-import com.cloud.dc.dao.ResourceDetailsDao;
 import com.cloud.event.ActionEvent;
 import com.cloud.event.EventTypes;
 import com.cloud.exception.InvalidParameterValueException;