You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by al...@apache.org on 2013/10/22 23:14:41 UTC

[1/2] git commit: updated refs/heads/master to d79135f

Updated Branches:
  refs/heads/master 43b18025e -> d79135f4e


CLOUDSTACK-4649: addResourceDetail - added support for userVm resource. Now "hypervisortoolsversion" get stored in user_vm_details table, and being returned as a part of listVirtualMachines call ("details" parameter)

Conflicts:
	api/src/org/apache/cloudstack/api/response/UserVmResponse.java
	engine/schema/src/com/cloud/vm/dao/UserVmDetailsDao.java
	engine/schema/src/com/cloud/vm/dao/UserVmDetailsDaoImpl.java
	server/src/com/cloud/api/query/vo/UserVmJoinVO.java
	server/src/com/cloud/metadata/ResourceMetaDataManagerImpl.java


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

Branch: refs/heads/master
Commit: 3ec14c4baf423953a8c355187bb732258513577e
Parents: 43b1802
Author: Alena Prokharchyk <al...@citrix.com>
Authored: Tue Oct 22 13:28:14 2013 -0700
Committer: Alena Prokharchyk <al...@citrix.com>
Committed: Tue Oct 22 13:50:43 2013 -0700

----------------------------------------------------------------------
 api/src/com/cloud/vm/VmDetailConstants.java     |   1 +
 .../cloudstack/api/response/UserVmResponse.java |   9 +-
 .../src/com/cloud/vm/dao/UserVmDetailsDao.java  |   3 +-
 .../com/cloud/vm/dao/UserVmDetailsDaoImpl.java  |  13 +-
 .../cloud/api/query/dao/UserVmJoinDaoImpl.java  |  13 +-
 .../com/cloud/api/query/vo/UserVmJoinVO.java    |  15 ++
 .../metadata/ResourceMetaDataManagerImpl.java   |  38 ++--
 setup/db/db/schema-420to421.sql                 | 190 ++++++++++++++++++-
 8 files changed, 257 insertions(+), 25 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/3ec14c4b/api/src/com/cloud/vm/VmDetailConstants.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/vm/VmDetailConstants.java b/api/src/com/cloud/vm/VmDetailConstants.java
index 5ff3ce0..87f4b5d 100644
--- a/api/src/com/cloud/vm/VmDetailConstants.java
+++ b/api/src/com/cloud/vm/VmDetailConstants.java
@@ -21,4 +21,5 @@ public interface VmDetailConstants {
 	public static final String NIC_ADAPTER = "nicAdapter";
 	public static final String ROOK_DISK_CONTROLLER = "rootDiskController";
 	public static final String NESTED_VIRTUALIZATION_FLAG = "nestedVirtualizationFlag";
+	public static final String HYPERVISOR_TOOLS_VERSION  = "hypervisortoolsversion";
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/3ec14c4b/api/src/org/apache/cloudstack/api/response/UserVmResponse.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/response/UserVmResponse.java b/api/src/org/apache/cloudstack/api/response/UserVmResponse.java
index d9bb2a9..9a7f91c 100644
--- a/api/src/org/apache/cloudstack/api/response/UserVmResponse.java
+++ b/api/src/org/apache/cloudstack/api/response/UserVmResponse.java
@@ -18,6 +18,7 @@ package org.apache.cloudstack.api.response;
 
 import java.util.Date;
 import java.util.LinkedHashSet;
+import java.util.Map;
 import java.util.Set;
 
 import org.apache.cloudstack.affinity.AffinityGroupResponse;
@@ -177,6 +178,9 @@ public class UserVmResponse extends BaseResponse implements ControlledEntityResp
 
 	@SerializedName(ApiConstants.TAGS)  @Param(description="the list of resource tags associated with vm", responseObject = ResourceTagResponse.class)
 	private Set<ResourceTagResponse> tags;
+    
+    @SerializedName(ApiConstants.DETAILS) @Param(description="Template details in key/value pairs.", since="4.2.1")
+    private Map details;
 
 	@SerializedName(ApiConstants.SSH_KEYPAIR) @Param(description="ssh key-pair")
 	private String keyPairName;
@@ -653,5 +657,8 @@ public class UserVmResponse extends BaseResponse implements ControlledEntityResp
 	public void setServiceState(String state) {
 		this.serviceState = state;
 	}
-
+	
+    public void setDetails(Map details) {
+        this.details = details;
+    }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/3ec14c4b/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 e117f63..02e5563 100644
--- a/engine/schema/src/com/cloud/vm/dao/UserVmDetailsDao.java
+++ b/engine/schema/src/com/cloud/vm/dao/UserVmDetailsDao.java
@@ -34,5 +34,6 @@ public interface UserVmDetailsDao extends GenericDao<UserVmDetailVO, Long> {
 	void deleteDetails(long vmId);
 
     public void removeDetails(Long vmId, String key);
-
+	
+    void addVmDetail(Long vmId, String key, String value);
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/3ec14c4b/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 ce8dbd8..6156b52 100644
--- a/engine/schema/src/com/cloud/vm/dao/UserVmDetailsDaoImpl.java
+++ b/engine/schema/src/com/cloud/vm/dao/UserVmDetailsDaoImpl.java
@@ -22,7 +22,6 @@ import java.util.Map;
 
 import javax.ejb.Local;
 
-import com.cloud.vm.NicDetailVO;
 import org.springframework.stereotype.Component;
 
 import com.cloud.utils.db.GenericDaoBase;
@@ -119,5 +118,15 @@ public class UserVmDetailsDaoImpl extends GenericDaoBase<UserVmDetailVO, Long> i
 
     }
 
-
+    @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);
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/3ec14c4b/server/src/com/cloud/api/query/dao/UserVmJoinDaoImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/api/query/dao/UserVmJoinDaoImpl.java b/server/src/com/cloud/api/query/dao/UserVmJoinDaoImpl.java
index 7fe3c1d..799690e 100644
--- a/server/src/com/cloud/api/query/dao/UserVmJoinDaoImpl.java
+++ b/server/src/com/cloud/api/query/dao/UserVmJoinDaoImpl.java
@@ -19,8 +19,10 @@ package com.cloud.api.query.dao;
 import java.text.DecimalFormat;
 import java.util.ArrayList;
 import java.util.EnumSet;
+import java.util.HashMap;
 import java.util.Hashtable;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 
 import javax.ejb.Local;
@@ -45,8 +47,9 @@ import com.cloud.uservm.UserVm;
 import com.cloud.utils.db.GenericDaoBase;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
-import com.cloud.vm.VmStats;
 import com.cloud.vm.VirtualMachine.State;
+import com.cloud.vm.VmDetailConstants;
+import com.cloud.vm.VmStats;
 
 
 @Component
@@ -260,6 +263,14 @@ public class UserVmJoinDaoImpl extends GenericDaoBase<UserVmJoinVO, Long> implem
                 userVmResponse.addAffinityGroup(resp);
             }
         }
+        
+        // set resource details map
+        // only hypervisortoolsversion can be returned to the end user       }
+        if (userVm.getDetailName() != null && userVm.getDetailName().equalsIgnoreCase(VmDetailConstants.HYPERVISOR_TOOLS_VERSION)){
+            Map<String, String> resourceDetails = new HashMap<String, String>();
+            resourceDetails.put(userVm.getDetailName(), userVm.getDetailValue());
+            userVmResponse.setDetails(resourceDetails);
+        }
 
         userVmResponse.setObjectName(objectName);
         if (userVm.isDynamicallyScalable() == null) {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/3ec14c4b/server/src/com/cloud/api/query/vo/UserVmJoinVO.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/api/query/vo/UserVmJoinVO.java b/server/src/com/cloud/api/query/vo/UserVmJoinVO.java
index c9d5ddc..0d00b47 100644
--- a/server/src/com/cloud/api/query/vo/UserVmJoinVO.java
+++ b/server/src/com/cloud/api/query/vo/UserVmJoinVO.java
@@ -393,6 +393,12 @@ public class UserVmJoinVO extends BaseViewVO implements ControlledViewEntity {
 
     @Column(name="dynamically_scalable")
     private boolean isDynamicallyScalable;
+    
+    @Column(name="detail_name")
+    private String detailName;
+
+    @Column(name="detail_value")
+    private String detailValue;
 
     public UserVmJoinVO() {
     }
@@ -884,4 +890,13 @@ public class UserVmJoinVO extends BaseViewVO implements ControlledViewEntity {
     public Boolean isDynamicallyScalable() {
         return isDynamicallyScalable;
     }
+
+    public String getDetailName() {
+        return detailName;
+    }
+
+
+    public String getDetailValue() {
+        return detailValue;
+    }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/3ec14c4b/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 5481ebb..929a44d 100644
--- a/server/src/com/cloud/metadata/ResourceMetaDataManagerImpl.java
+++ b/server/src/com/cloud/metadata/ResourceMetaDataManagerImpl.java
@@ -23,23 +23,13 @@ import javax.ejb.Local;
 import javax.inject.Inject;
 import javax.naming.ConfigurationException;
 
-import com.cloud.dc.DcDetailVO;
-import com.cloud.dc.dao.DataCenterDao;
-import com.cloud.dc.dao.DcDetailsDao;
-import com.cloud.network.dao.NetworkDetailVO;
-import com.cloud.network.dao.NetworkDetailsDao;
-import com.cloud.server.ResourceMetaDataService;
-import com.cloud.storage.VolumeDetailVO;
-import com.cloud.storage.dao.VolumeDetailsDao;
-import com.cloud.vm.NicDetailVO;
-import com.cloud.vm.UserVmDetailVO;
-import com.cloud.vm.dao.NicDao;
-import com.cloud.vm.dao.NicDetailDao;
-import com.cloud.vm.dao.UserVmDetailsDao;
 import org.apache.log4j.Logger;
 import org.springframework.stereotype.Component;
 
 import com.cloud.api.query.dao.ResourceTagJoinDao;
+import com.cloud.dc.DcDetailVO;
+import com.cloud.dc.dao.DataCenterDao;
+import com.cloud.dc.dao.DcDetailsDao;
 import com.cloud.event.ActionEvent;
 import com.cloud.event.EventTypes;
 import com.cloud.exception.InvalidParameterValueException;
@@ -47,18 +37,24 @@ import com.cloud.network.dao.FirewallRulesDao;
 import com.cloud.network.dao.IPAddressDao;
 import com.cloud.network.dao.LoadBalancerDao;
 import com.cloud.network.dao.NetworkDao;
+import com.cloud.network.dao.NetworkDetailVO;
+import com.cloud.network.dao.NetworkDetailsDao;
 import com.cloud.network.dao.RemoteAccessVpnDao;
 import com.cloud.network.rules.dao.PortForwardingRulesDao;
 import com.cloud.network.security.dao.SecurityGroupDao;
 import com.cloud.network.vpc.dao.StaticRouteDao;
 import com.cloud.network.vpc.dao.VpcDao;
 import com.cloud.projects.dao.ProjectDao;
+import com.cloud.server.ResourceMetaDataService;
 import com.cloud.server.ResourceTag;
 import com.cloud.server.ResourceTag.TaggedResourceType;
 import com.cloud.server.TaggedResourceService;
+import com.cloud.storage.VolumeDetailVO;
 import com.cloud.storage.dao.SnapshotDao;
 import com.cloud.storage.dao.VMTemplateDao;
+import com.cloud.storage.dao.VMTemplateDetailsDao;
 import com.cloud.storage.dao.VolumeDao;
+import com.cloud.storage.dao.VolumeDetailsDao;
 import com.cloud.tags.dao.ResourceTagDao;
 import com.cloud.user.AccountManager;
 import com.cloud.user.DomainManager;
@@ -67,7 +63,11 @@ import com.cloud.utils.db.DB;
 import com.cloud.utils.db.GenericDao;
 import com.cloud.utils.db.Transaction;
 import com.cloud.uuididentity.dao.IdentityDao;
+import com.cloud.vm.NicDetailVO;
+import com.cloud.vm.dao.NicDao;
+import com.cloud.vm.dao.NicDetailDao;
 import com.cloud.vm.dao.UserVmDao;
+import com.cloud.vm.dao.UserVmDetailsDao;
 import com.cloud.vm.snapshot.dao.VMSnapshotDao;
 
 
@@ -136,7 +136,9 @@ public class ResourceMetaDataManagerImpl extends ManagerBase implements Resource
     @Inject
     TaggedResourceService _taggedResourceMgr;
     @Inject
-    UserVmDetailsDao _userVmDetail;
+    VMTemplateDetailsDao _templateDetailsDao;
+    @Inject
+    UserVmDetailsDao _userVmDetailsDao;
 
     @Override
     public boolean configure(String name, Map<String, Object> params) throws ConfigurationException {
@@ -217,19 +219,17 @@ public class ResourceMetaDataManagerImpl extends ManagerBase implements Resource
                 } else if (resourceType == TaggedResourceType.Nic){
                     NicDetailVO n = new NicDetailVO(id, key, value);
                     _nicDetailDao.persist(n);
-                }else if (resourceType == TaggedResourceType.UserVm){
-                    UserVmDetailVO userVmDetail = new UserVmDetailVO(id, key, value);
-                    _userVmDetailDao.persist(userVmDetail);
                 } else if (resourceType == TaggedResourceType.Zone){
                      DcDetailVO dataCenterDetail = new DcDetailVO(id, key, value);
                      _dcDetailsDao.persist(dataCenterDetail);
                 } else if (resourceType == TaggedResourceType.Network){
                     NetworkDetailVO networkDetail = new NetworkDetailVO(id, key, value);
                     _networkDetailsDao.persist(networkDetail);
-                } else {
+                } else if (resourceType == TaggedResourceType.UserVm) {
+                    _userVmDetailsDao.addVmDetail(id, key, value);
+                } else{
                     throw new InvalidParameterValueException("The resource type " + resourceType + " is not supported by the API yet");
                 }
-
         }
 
         txn.commit();

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/3ec14c4b/setup/db/db/schema-420to421.sql
----------------------------------------------------------------------
diff --git a/setup/db/db/schema-420to421.sql b/setup/db/db/schema-420to421.sql
index abe97a4..e72e1b2 100644
--- a/setup/db/db/schema-420to421.sql
+++ b/setup/db/db/schema-420to421.sql
@@ -27,4 +27,192 @@ INSERT IGNORE INTO `cloud`.`configuration` VALUES ("Storage", 'DEFAULT', 'manage
 
 -- Remove Windows Server 8 from guest_os_type dropdown to use Windows Server 2012
 DELETE FROM `cloud`.`guest_os_hypervisor` where guest_os_id=168;
-DELETE FROM `cloud`.`guest_os` where id=168;
\ No newline at end of file
+DELETE FROM `cloud`.`guest_os` where id=168;
+
+
+--Add details to the user_vm_view (CLOUDSTACK-4649 - xen and UI code needs to retrieve the value of "hypervisortoolsversion" detail)
+
+DROP VIEW IF EXISTS `cloud`.`user_vm_view`;
+CREATE VIEW `cloud`.`user_vm_view` AS
+    select
+        vm_instance.id id,
+        vm_instance.name name,
+        user_vm.display_name display_name,
+        user_vm.user_data user_data,
+        account.id account_id,
+        account.uuid account_uuid,
+        account.account_name account_name,
+        account.type account_type,
+        domain.id domain_id,
+        domain.uuid domain_uuid,
+        domain.name domain_name,
+        domain.path domain_path,
+        projects.id project_id,
+        projects.uuid project_uuid,
+        projects.name project_name,
+        instance_group.id instance_group_id,
+        instance_group.uuid instance_group_uuid,
+        instance_group.name instance_group_name,
+        vm_instance.uuid uuid,
+        vm_instance.last_host_id last_host_id,
+        vm_instance.vm_type type,
+        vm_instance.vnc_password vnc_password,
+        vm_instance.limit_cpu_use limit_cpu_use,
+        vm_instance.created created,
+        vm_instance.state state,
+        vm_instance.removed removed,
+        vm_instance.ha_enabled ha_enabled,
+        vm_instance.hypervisor_type hypervisor_type,
+        vm_instance.instance_name instance_name,
+        vm_instance.guest_os_id guest_os_id,
+        vm_instance.display_vm display_vm,
+        guest_os.uuid guest_os_uuid,
+        vm_instance.pod_id pod_id,
+        host_pod_ref.uuid pod_uuid,
+        vm_instance.private_ip_address private_ip_address,
+        vm_instance.private_mac_address private_mac_address,
+        vm_instance.vm_type vm_type,
+        data_center.id data_center_id,
+        data_center.uuid data_center_uuid,
+        data_center.name data_center_name,
+        data_center.is_security_group_enabled security_group_enabled,
+        data_center.networktype data_center_type,
+        host.id host_id,
+        host.uuid host_uuid,
+        host.name host_name,
+        vm_template.id template_id,
+        vm_template.uuid template_uuid,
+        vm_template.name template_name,
+        vm_template.display_text template_display_text,
+        vm_template.enable_password password_enabled,
+        iso.id iso_id,
+        iso.uuid iso_uuid,
+        iso.name iso_name,
+        iso.display_text iso_display_text,
+        service_offering.id service_offering_id,
+        disk_offering.uuid service_offering_uuid,
+        service_offering.cpu cpu,
+        service_offering.speed speed,
+        service_offering.ram_size ram_size,
+        disk_offering.name service_offering_name,
+        storage_pool.id pool_id,
+        storage_pool.uuid pool_uuid,
+        storage_pool.pool_type pool_type,
+        volumes.id volume_id,
+        volumes.uuid volume_uuid,
+        volumes.device_id volume_device_id,
+        volumes.volume_type volume_type,
+        security_group.id security_group_id,
+        security_group.uuid security_group_uuid,
+        security_group.name security_group_name,
+        security_group.description security_group_description,
+        nics.id nic_id,
+        nics.uuid nic_uuid,
+        nics.network_id network_id,
+        nics.ip4_address ip_address,
+        nics.ip6_address ip6_address,
+        nics.ip6_gateway ip6_gateway,
+        nics.ip6_cidr ip6_cidr,
+        nics.default_nic is_default_nic,
+        nics.gateway gateway,
+        nics.netmask netmask,
+        nics.mac_address mac_address,
+        nics.broadcast_uri broadcast_uri,
+        nics.isolation_uri isolation_uri,
+        vpc.id vpc_id,
+        vpc.uuid vpc_uuid,
+        networks.uuid network_uuid,
+        networks.name network_name,
+        networks.traffic_type traffic_type,
+        networks.guest_type guest_type,
+        user_ip_address.id public_ip_id,
+        user_ip_address.uuid public_ip_uuid,
+        user_ip_address.public_ip_address public_ip_address,
+        ssh_keypairs.keypair_name keypair_name,
+        resource_tags.id tag_id,
+        resource_tags.uuid tag_uuid,
+        resource_tags.key tag_key,
+        resource_tags.value tag_value,
+        resource_tags.domain_id tag_domain_id,
+        resource_tags.account_id tag_account_id,
+        resource_tags.resource_id tag_resource_id,
+        resource_tags.resource_uuid tag_resource_uuid,
+        resource_tags.resource_type tag_resource_type,
+        resource_tags.customer tag_customer,
+        async_job.id job_id,
+        async_job.uuid job_uuid,
+        async_job.job_status job_status,
+        async_job.account_id job_account_id,
+        affinity_group.id affinity_group_id,
+        affinity_group.uuid affinity_group_uuid,
+        affinity_group.name affinity_group_name,
+        affinity_group.description affinity_group_description,
+        vm_instance.dynamically_scalable dynamically_scalable,
+        all_details.name detail_name,
+        all_details.value detail_value
+
+    from
+        `cloud`.`user_vm`
+            inner join
+        `cloud`.`vm_instance` ON vm_instance.id = user_vm.id
+            and vm_instance.removed is NULL
+            inner join
+        `cloud`.`account` ON vm_instance.account_id = account.id
+            inner join
+        `cloud`.`domain` ON vm_instance.domain_id = domain.id
+            left join
+        `cloud`.`guest_os` ON vm_instance.guest_os_id = guest_os.id
+            left join
+        `cloud`.`host_pod_ref` ON vm_instance.pod_id = host_pod_ref.id
+            left join
+        `cloud`.`projects` ON projects.project_account_id = account.id
+            left join
+        `cloud`.`instance_group_vm_map` ON vm_instance.id = instance_group_vm_map.instance_id
+            left join
+        `cloud`.`instance_group` ON instance_group_vm_map.group_id = instance_group.id
+            left join
+        `cloud`.`data_center` ON vm_instance.data_center_id = data_center.id
+            left join
+        `cloud`.`host` ON vm_instance.host_id = host.id
+            left join
+        `cloud`.`vm_template` ON vm_instance.vm_template_id = vm_template.id
+            left join
+        `cloud`.`vm_template` iso ON iso.id = user_vm.iso_id
+            left join
+        `cloud`.`service_offering` ON vm_instance.service_offering_id = service_offering.id
+            left join
+        `cloud`.`disk_offering` ON vm_instance.service_offering_id = disk_offering.id
+            left join
+        `cloud`.`volumes` ON vm_instance.id = volumes.instance_id
+            left join
+        `cloud`.`storage_pool` ON volumes.pool_id = storage_pool.id
+            left join
+        `cloud`.`security_group_vm_map` ON vm_instance.id = security_group_vm_map.instance_id
+            left join
+        `cloud`.`security_group` ON security_group_vm_map.security_group_id = security_group.id
+            left join
+        `cloud`.`nics` ON vm_instance.id = nics.instance_id and nics.removed is null
+            left join
+        `cloud`.`networks` ON nics.network_id = networks.id
+            left join
+        `cloud`.`vpc` ON networks.vpc_id = vpc.id and vpc.removed is null
+            left join
+        `cloud`.`user_ip_address` ON user_ip_address.vm_id = vm_instance.id
+            left join
+        `cloud`.`user_vm_details` as ssh_details ON ssh_details.vm_id = vm_instance.id
+            and ssh_details.name = 'SSH.PublicKey'
+            left join
+        `cloud`.`ssh_keypairs` ON ssh_keypairs.public_key = ssh_details.value
+            left join
+        `cloud`.`resource_tags` ON resource_tags.resource_id = vm_instance.id
+            and resource_tags.resource_type = 'UserVm'
+            left join
+        `cloud`.`async_job` ON async_job.instance_id = vm_instance.id
+            and async_job.instance_type = 'VirtualMachine'
+            and async_job.job_status = 0
+            left join
+        `cloud`.`affinity_group_vm_map` ON vm_instance.id = affinity_group_vm_map.instance_id
+            left join
+        `cloud`.`affinity_group` ON affinity_group_vm_map.affinity_group_id = affinity_group.id
+            left join
+        `cloud`.`user_vm_details` as all_details ON all_details.vm_id = vm_instance.id;
\ No newline at end of file


[2/2] git commit: updated refs/heads/master to d79135f

Posted by al...@apache.org.
CLOUDSTACK-4649: allow to update template details with addResourceDetails API

Conflicts:
	server/src/com/cloud/metadata/ResourceMetaDataManagerImpl.java


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

Branch: refs/heads/master
Commit: d79135f4e650274fa3c20a6079f751398211a682
Parents: 3ec14c4
Author: Alena Prokharchyk <al...@citrix.com>
Authored: Tue Oct 22 10:26:37 2013 -0700
Committer: Alena Prokharchyk <al...@citrix.com>
Committed: Tue Oct 22 14:01:54 2013 -0700

----------------------------------------------------------------------
 .../src/com/cloud/storage/dao/VMTemplateDetailsDao.java |  2 ++
 .../com/cloud/storage/dao/VMTemplateDetailsDaoImpl.java | 12 ++++++++++++
 .../com/cloud/metadata/ResourceMetaDataManagerImpl.java |  4 +++-
 3 files changed, 17 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d79135f4/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 552f8f0..284380e 100644
--- a/engine/schema/src/com/cloud/storage/dao/VMTemplateDetailsDao.java
+++ b/engine/schema/src/com/cloud/storage/dao/VMTemplateDetailsDao.java
@@ -29,4 +29,6 @@ public interface VMTemplateDetailsDao extends GenericDao<VMTemplateDetailVO, Lon
     VMTemplateDetailVO findDetail(long templateId, String name);
 
     void deleteDetails(long vmId);
+    
+    void addTemplateDetail(Long templateId, String key, String value);
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d79135f4/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 33b96c4..5ebed53 100644
--- a/engine/schema/src/com/cloud/storage/dao/VMTemplateDetailsDaoImpl.java
+++ b/engine/schema/src/com/cloud/storage/dao/VMTemplateDetailsDaoImpl.java
@@ -96,4 +96,16 @@ public class VMTemplateDetailsDaoImpl extends GenericDaoBase<VMTemplateDetailVO,
         }
         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);
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d79135f4/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 929a44d..444650b 100644
--- a/server/src/com/cloud/metadata/ResourceMetaDataManagerImpl.java
+++ b/server/src/com/cloud/metadata/ResourceMetaDataManagerImpl.java
@@ -213,7 +213,7 @@ public class ResourceMetaDataManagerImpl extends ManagerBase implements Resource
                 }
 
                 // TODO - Have a better design here.
-                if(resourceType == TaggedResourceType.Volume){
+                if (resourceType == TaggedResourceType.Volume){
                     VolumeDetailVO v = new VolumeDetailVO(id, key, value);
                     _volumeDetailDao.persist(v);
                 } else if (resourceType == TaggedResourceType.Nic){
@@ -227,6 +227,8 @@ public class ResourceMetaDataManagerImpl extends ManagerBase implements Resource
                     _networkDetailsDao.persist(networkDetail);
                 } else if (resourceType == TaggedResourceType.UserVm) {
                     _userVmDetailsDao.addVmDetail(id, key, value);
+                } else if (resourceType == TaggedResourceType.Template) {
+                    _templateDetailsDao.addTemplateDetail(id, key, value);
                 } else{
                     throw new InvalidParameterValueException("The resource type " + resourceType + " is not supported by the API yet");
                 }