diff --git a/api/src/org/apache/cloudstack/api/ResourceDetail.java b/api/src/org/apache/cloudstack/api/ResourceDetail.java index 0c5dcabe7dc..7a2570bd24f 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(); - + } diff --git a/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java b/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java index ce078c94422..0ff44463122 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 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())); diff --git a/engine/schema/src/com/cloud/dc/DataCenterDetailVO.java b/engine/schema/src/com/cloud/dc/DataCenterDetailVO.java index 4476a6fdecb..6771ef84521 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; } } diff --git a/engine/schema/src/com/cloud/dc/dao/DataCenterDaoImpl.java b/engine/schema/src/com/cloud/dc/dao/DataCenterDaoImpl.java index aaa372f23cc..9d902410ff7 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 implem if (details == null) { return; } - _detailsDao.persist(zone.getId(), details); + + List resourceDetails = new ArrayList(); + for (String key : details.keySet()) { + resourceDetails.add(new DataCenterDetailVO(zone.getId(), key, details.get(key))); + } + + _detailsDao.addDetails(resourceDetails); } @Override diff --git a/engine/schema/src/com/cloud/dc/dao/DataCenterDetailsDao.java b/engine/schema/src/com/cloud/dc/dao/DataCenterDetailsDao.java index 2cc7df8eecf..011aa733e95 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 { - Map findDetails(long dcId); - - void persist(long dcId, Map details); - - DataCenterDetailVO findDetail(long dcId, String name); - - void deleteDetails(long dcId); - - void removeDetails(long id, String key); - - List findDetailsList(long dcId); +public interface DataCenterDetailsDao extends GenericDao, ResourceDetailDao { } \ No newline at end of file diff --git a/engine/schema/src/com/cloud/dc/dao/DataCenterDetailsDaoImpl.java b/engine/schema/src/com/cloud/dc/dao/DataCenterDetailsDaoImpl.java index b8a36f06dee..b6949f55332 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 implements DataCenterDetailsDao, ScopedConfigStorage { - protected final SearchBuilder DcSearch; - protected final SearchBuilder DetailSearch; +public class DataCenterDetailsDaoImpl extends ResourceDetailDaoImpl 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 sc = DetailSearch.create(); - sc.setParameters("dcId", dcId); - sc.setParameters("name", name); - - return findOneIncludingRemovedBy(sc); - } - - @Override - public Map findDetails(long dcId) { - SearchCriteria sc = DcSearch.create(); - sc.setParameters("dcId", dcId); - - List results = search(sc, null); - Map details = new HashMap(results.size()); - for (DataCenterDetailVO result : results) { - details.put(result.getName(), result.getValue()); - } - return details; - } - - @Override - public List findDetailsList(long dcId) { - SearchCriteria sc = DcSearch.create(); - sc.setParameters("dcId", dcId); - - List results = search(sc, null); - return results; - } - - - @Override - public void deleteDetails(long dcId) { - SearchCriteria sc = DcSearch.create(); - sc.setParameters("dcId", dcId); - - List 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 details) { - TransactionLegacy txn = TransactionLegacy.currentTxn(); - txn.start(); - SearchCriteria sc = DcSearch.create(); - sc.setParameters("dcId", dcId); - expunge(sc); - - for (Map.Entry 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(); } 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 00000000000..85d2c78119e --- /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 extends GenericDao{ + public R findDetail(long resourceId, String name); + + public Map findDetails(long resourceId); + + public List findDetailsList(long resourceId); + + public void removeDetails(long resourceId); + + public void removeDetail(long resourceId, String key); + + public void addDetails(List details); + + public void addDetail(R detail); +} 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 00000000000..8819e4bf0cc --- /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 extends GenericDaoBase{ + private SearchBuilder 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 sc = AllFieldsSearch.create(); + sc.setParameters("resourceId", resourceId); + sc.setParameters("name", name); + + return findOneBy(sc); + } + + + public Map findDetails(long resourceId) { + SearchCriteria sc = AllFieldsSearch.create(); + sc.setParameters("resourceId", resourceId); + + List results = search(sc, null); + Map details = new HashMap(results.size()); + for (R result : results) { + details.put(result.getName(), result.getValue()); + } + return details; + } + + public List findDetailsList(long resourceId) { + SearchCriteria sc = AllFieldsSearch.create(); + sc.setParameters("resourceId", resourceId); + + List results = search(sc, null); + return results; + } + + + public void removeDetails(long resourceId) { + SearchCriteria sc = AllFieldsSearch.create(); + sc.setParameters("resourceId", resourceId); + remove(sc); + } + + + public void removeDetail(long resourceId, String key) { + if (key != null){ + SearchCriteria sc = AllFieldsSearch.create(); + sc.setParameters("name", key); + remove(sc); + } + } + + + public void addDetails(List details) { + TransactionLegacy txn = TransactionLegacy.currentTxn(); + txn.start(); + SearchCriteria 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); + } + +} diff --git a/engine/schema/src/com/cloud/network/dao/NetworkDetailVO.java b/engine/schema/src/com/cloud/network/dao/NetworkDetailVO.java index 62923974c8e..c7006c4aeb7 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; } - public long getId() { - return id; - } - - public long getNetworkId() { - return networkId; - } - - public String getName() { - return name; - } - - 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 getId() { + return id; + } + + @Override + public String getName() { + return name; + } + + @Override + public String getValue() { + return value; + } + + @Override + public long getResourceId() { + return resourceId; } } diff --git a/engine/schema/src/com/cloud/network/dao/NetworkDetailsDao.java b/engine/schema/src/com/cloud/network/dao/NetworkDetailsDao.java index 930e8f895c9..f79188848a9 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 { - List findDetails(long networkId); - - void persist(long networkId, Map details); - - NetworkDetailVO findDetail(long networkId, String name); - - void deleteDetails(long networkId); - - public void removeDetails(long networkId, String key); +public interface NetworkDetailsDao extends GenericDao, ResourceDetailDao { } \ No newline at end of file diff --git a/engine/schema/src/com/cloud/network/dao/NetworkDetailsDaoImpl.java b/engine/schema/src/com/cloud/network/dao/NetworkDetailsDaoImpl.java index 29bac958e48..76dc24a9a0a 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 implements NetworkDetailsDao { +public class NetworkDetailsDaoImpl extends ResourceDetailDaoImpl implements NetworkDetailsDao { - protected final SearchBuilder NetworkSearch; - protected final SearchBuilder 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 findDetails(long networkId) { - SearchCriteria sc = NetworkSearch.create(); - sc.setParameters("networkId", networkId); - - List results = search(sc, null); - return results; - } - - @Override - public void persist(long networkId, Map details) { - //To change body of implemented methods use File | Settings | File Templates. - } - - @Override - public NetworkDetailVO findDetail(long networkId, String name) { - SearchCriteria sc = DetailSearch.create(); - sc.setParameters("networkId", networkId); - sc.setParameters("name", name); - - return findOneBy(sc); } - - @Override - public void deleteDetails(long networkId) { - SearchCriteria sc = NetworkSearch.create(); - sc.setParameters("networkId", networkId); - - List results = search(sc, null); - for (NetworkDetailVO result : results) { - remove(result.getId()); - } - } - - @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); - } - } } diff --git a/engine/schema/src/com/cloud/service/ServiceOfferingDetailsVO.java b/engine/schema/src/com/cloud/service/ServiceOfferingDetailsVO.java index b005c738e82..8b70b775c75 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; } diff --git a/engine/schema/src/com/cloud/service/dao/ServiceOfferingDaoImpl.java b/engine/schema/src/com/cloud/service/dao/ServiceOfferingDaoImpl.java index b7890a41af9..648e4d0bb4d 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 details = serviceOffering.getDetails(); - if (details != null) { - detailsDao.persist(serviceOffering.getId(), details); + if (details == null) { + return; } + + List resourceDetails = new ArrayList(); + for (String key : details.keySet()) { + resourceDetails.add(new ServiceOfferingDetailsVO(serviceOffering.getId(), key, details.get(key))); + } + + detailsDao.addDetails(resourceDetails); } } diff --git a/engine/schema/src/com/cloud/service/dao/ServiceOfferingDetailsDao.java b/engine/schema/src/com/cloud/service/dao/ServiceOfferingDetailsDao.java index e6ff6e5e90a..ba753b7105f 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 { - Map findDetails(long serviceOfferingId); - void persist(long serviceOfferingId, Map details); - ServiceOfferingDetailsVO findDetail(long serviceOfferingId, String name); - void deleteDetails(long serviceOfferingId); - void removeDetails(long offId, String key); +public interface ServiceOfferingDetailsDao extends GenericDao, ResourceDetailDao { } \ No newline at end of file diff --git a/engine/schema/src/com/cloud/service/dao/ServiceOfferingDetailsDaoImpl.java b/engine/schema/src/com/cloud/service/dao/ServiceOfferingDetailsDaoImpl.java index de99cf29bfd..bf3cdcc2f83 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 +public class ServiceOfferingDetailsDaoImpl extends ResourceDetailDaoImpl implements ServiceOfferingDetailsDao { - protected final SearchBuilder ServiceOfferingSearch; - protected final SearchBuilder 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 sc = DetailSearch.create(); - sc.setParameters("serviceOfferingId", serviceOfferingId); - sc.setParameters("name", name); - ServiceOfferingDetailsVO detail = findOneIncludingRemovedBy(sc); - return detail; - } - - @Override - public Map findDetails(long serviceOfferingId) { - SearchCriteria sc = ServiceOfferingSearch.create(); - sc.setParameters("serviceOfferingId", serviceOfferingId); - List results = search(sc, null); - Map details = new HashMap(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 results = search(sc, null); - for (ServiceOfferingDetailsVO result : results) { - remove(result.getId()); - } - } - - @Override - public void persist(long serviceOfferingId, Map details) { - TransactionLegacy txn = TransactionLegacy.currentTxn(); - txn.start(); - SearchCriteria sc = ServiceOfferingSearch.create(); - sc.setParameters("serviceOfferingId", serviceOfferingId); - expunge(sc); - - for (Map.Entry 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); - } - } - } diff --git a/engine/schema/src/com/cloud/storage/VMTemplateDetailVO.java b/engine/schema/src/com/cloud/storage/VMTemplateDetailVO.java index 3d4c7ef30db..59b490b345d 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; - } } diff --git a/engine/schema/src/com/cloud/storage/VolumeDetailVO.java b/engine/schema/src/com/cloud/storage/VolumeDetailVO.java index 6d2a618abdd..499be86596e 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; } - public long getId() { - return id; - } - - public long getVolumeId() { - return volumeId; - } - - public String getName() { - return name; - } - - 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 getId() { + return id; + } + + @Override + public String getName() { + return name; + } + + @Override + public String getValue() { + return value; + } + + @Override + public long getResourceId() { + return resourceId; } } diff --git a/engine/schema/src/com/cloud/storage/dao/VMTemplateDaoImpl.java b/engine/schema/src/com/cloud/storage/dao/VMTemplateDaoImpl.java index 71ec6c72264..d4bb3676d45 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 implem @Override public void saveDetails(VMTemplateVO tmpl) { - Map details = tmpl.getDetails(); - if (details == null) { + Map detailsStr = tmpl.getDetails(); + if (detailsStr == null) { return; } - _templateDetailsDao.persist(tmpl.getId(), details); + List details = new ArrayList(); + 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 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 details = new ArrayList(); + 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()); diff --git a/engine/schema/src/com/cloud/storage/dao/VMTemplateDetailsDao.java b/engine/schema/src/com/cloud/storage/dao/VMTemplateDetailsDao.java index 3021b8f956f..aa7ce4ba539 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 { - Map findDetails(long templateId); - - void persist(long templateId, Map 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, ResourceDetailDao { + } diff --git a/engine/schema/src/com/cloud/storage/dao/VMTemplateDetailsDaoImpl.java b/engine/schema/src/com/cloud/storage/dao/VMTemplateDetailsDaoImpl.java index f1af0d05fec..007f9cab2bd 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 implements VMTemplateDetailsDao { - - protected final SearchBuilder TemplateSearch; - protected final SearchBuilder 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 sc = TemplateSearch.create(); - sc.setParameters("templateId", templateId); - - List results = search(sc, null); - for (VMTemplateDetailVO result : results) { - remove(result.getId()); - } - } - - @Override - public VMTemplateDetailVO findDetail(long templateId, String name) { - SearchCriteria sc = DetailSearch.create(); - sc.setParameters("templateId", templateId); - sc.setParameters("name", name); - - return findOneBy(sc); - } - - @Override - public Map findDetails(long templateId) { - SearchCriteria sc = TemplateSearch.create(); - sc.setParameters("templateId", templateId); - - List results = search(sc, null); - Map details = new HashMap(results.size()); - for (VMTemplateDetailVO result : results) { - details.put(result.getName(), result.getValue()); - } - - return details; - } - - @Override - public void persist(long templateId, Map details) { - TransactionLegacy txn = TransactionLegacy.currentTxn(); - txn.start(); - SearchCriteria sc = TemplateSearch.create(); - sc.setParameters("templateId", templateId); - expunge(sc); - - for (Map.Entry 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 implements VMTemplateDetailsDao { } diff --git a/engine/schema/src/com/cloud/storage/dao/VolumeDetailsDao.java b/engine/schema/src/com/cloud/storage/dao/VolumeDetailsDao.java index 4e786ba6255..635ca97bce3 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 { - List findDetails(long volumeId); +public interface VolumeDetailsDao extends GenericDao, ResourceDetailDao { - void persist(long vmId, Map details); - - VolumeDetailVO findDetail(long vmId, String name); - - void deleteDetails(long vmId); - - public void removeDetails(long volumeId, String key); - - } +} diff --git a/engine/schema/src/com/cloud/storage/dao/VolumeDetailsDaoImpl.java b/engine/schema/src/com/cloud/storage/dao/VolumeDetailsDaoImpl.java index 54158f5d9e2..d264394990f 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 implements VolumeDetailsDao { - protected final SearchBuilder VolumeSearch; - protected final SearchBuilder DetailSearch; - protected final SearchBuilder 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 sc = VolumeSearch.create(); - sc.setParameters("volumeId", volumeId); - - List results = search(sc, null); - for (VolumeDetailVO result : results) { - remove(result.getId()); - } - } - - @Override - public VolumeDetailVO findDetail(long volumeId, String name) { - SearchCriteria 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 findDetails(long volumeId) { - SearchCriteria sc = VolumeSearch.create(); - sc.setParameters("volumeId", volumeId); - - List results = search(sc, null); - return results; - } - - @Override - public void persist(long volumeId, Map details) { - TransactionLegacy txn = TransactionLegacy.currentTxn(); - txn.start(); - SearchCriteria sc = VolumeSearch.create(); - sc.setParameters("volumeId", volumeId); - expunge(sc); - - for (Map.Entry detail : details.entrySet()) { - VolumeDetailVO vo = new VolumeDetailVO(volumeId, detail.getKey(), detail.getValue()); - persist(vo); - } - txn.commit(); - } +public class VolumeDetailsDaoImpl extends ResourceDetailDaoImpl implements VolumeDetailsDao { } diff --git a/engine/schema/src/com/cloud/vm/NicDetailVO.java b/engine/schema/src/com/cloud/vm/NicDetailVO.java index 5d055018045..4be57236b43 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; } - public long getId() { - return id; - } - - public long getNicId() { - return nicId; - } - - public String getName() { - return name; - } - - 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 getId() { + return id; + } + + @Override + public String getName() { + return name; + } + + @Override + public String getValue() { + return value; + } + + @Override + public long getResourceId() { + return resourceId; } } diff --git a/engine/schema/src/com/cloud/vm/UserVmDetailVO.java b/engine/schema/src/com/cloud/vm/UserVmDetailVO.java index 5811ab48e98..62c924b2672 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; } } diff --git a/engine/schema/src/com/cloud/vm/dao/NicDetailDao.java b/engine/schema/src/com/cloud/vm/dao/NicDetailDao.java index 66bff167fbf..f960ecfe3d0 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 { - List findDetails(long nicId); - - void persist(long nicId, Map details); - - NicDetailVO findDetail(long nicId, String name); - - void deleteDetails(long nicId); - - void removeDetails(long nicId, String key); +public interface NicDetailDao extends GenericDao, ResourceDetailDao { } diff --git a/engine/schema/src/com/cloud/vm/dao/NicDetailDaoImpl.java b/engine/schema/src/com/cloud/vm/dao/NicDetailDaoImpl.java index 4c1d59cbd5e..65a327fc939 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 implements NicDetailDao { - protected final SearchBuilder NicSearch; - protected final SearchBuilder 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 sc = NicSearch.create(); - sc.setParameters("nicId", nicId); - - List results = search(sc, null); - for (NicDetailVO result : results) { - remove(result.getId()); - } - } - - @Override - public NicDetailVO findDetail(long nicId, String name) { - SearchCriteria sc = DetailSearch.create(); - sc.setParameters("nicId", nicId); - sc.setParameters("name", name); - - return findOneBy(sc); - } - - @Override - public List findDetails(long nicId) { - SearchCriteria sc = NicSearch.create(); - sc.setParameters("nicId", nicId); - - List results = search(sc, null); - return results; - } - - @Override - public void persist(long nicId, Map details) { - TransactionLegacy txn = TransactionLegacy.currentTxn(); - txn.start(); - SearchCriteria sc = NicSearch.create(); - sc.setParameters("nicId", nicId); - expunge(sc); - - for (Map.Entry 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 implements NicDetailDao { } diff --git a/engine/schema/src/com/cloud/vm/dao/UserVmDaoImpl.java b/engine/schema/src/com/cloud/vm/dao/UserVmDaoImpl.java index 70b04e3479e..1992ef471ef 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 implements Use @Override public void saveDetails(UserVmVO vm) { - Map details = vm.getDetails(); - if (details == null) { + Map detailsStr = vm.getDetails(); + if (detailsStr == null) { return; } - _detailsDao.persist(vm.getId(), details); + List details = new ArrayList(); + for (String key : detailsStr.keySet()) { + details.add(new UserVmDetailVO(vm.getId(), key, detailsStr.get(key))); + } + + _detailsDao.addDetails(details); } @Override diff --git a/engine/schema/src/com/cloud/vm/dao/UserVmDetailsDao.java b/engine/schema/src/com/cloud/vm/dao/UserVmDetailsDao.java index ce36c0bd823..a0249e64ddc 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 { - Map findDetails(long vmId); - - public List findDetailsList(long vmId); - - void persist(long vmId, Map 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, ResourceDetailDao { } diff --git a/engine/schema/src/com/cloud/vm/dao/UserVmDetailsDaoImpl.java b/engine/schema/src/com/cloud/vm/dao/UserVmDetailsDaoImpl.java index 67b7f81f5df..38b691da4cc 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 implements UserVmDetailsDao { - protected final SearchBuilder VmSearch; - protected final SearchBuilder DetailSearch; +public class UserVmDetailsDaoImpl extends ResourceDetailDaoImpl implements UserVmDetailsDao { - 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 sc = VmSearch.create(); - sc.setParameters("vmId", vmId); - - List results = search(sc, null); - for (UserVmDetailVO result : results) { - remove(result.getId()); - } - } - - @Override - public UserVmDetailVO findDetail(long vmId, String name) { - SearchCriteria sc = DetailSearch.create(); - sc.setParameters("vmId", vmId); - sc.setParameters("name", name); - - return findOneBy(sc); - } - - @Override - public Map findDetails(long vmId) { - SearchCriteria sc = VmSearch.create(); - sc.setParameters("vmId", vmId); - - List results = search(sc, null); - Map details = new HashMap(results.size()); - for (UserVmDetailVO result : results) { - details.put(result.getName(), result.getValue()); - } - - return details; - } - - @Override - public List findDetailsList(long vmId) { - SearchCriteria sc = VmSearch.create(); - sc.setParameters("vmId", vmId); - - List results = search(sc, null); - return results; - } - - @Override - public void persist(long vmId, Map details) { - TransactionLegacy txn = TransactionLegacy.currentTxn(); - txn.start(); - SearchCriteria sc = VmSearch.create(); - sc.setParameters("vmId", vmId); - expunge(sc); - - for (Map.Entry 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); - } - } - - @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); - } - } } diff --git a/server/src/com/cloud/api/ApiDBUtils.java b/server/src/com/cloud/api/ApiDBUtils.java index a14fdbac669..36fddf49331 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; diff --git a/server/src/com/cloud/api/query/QueryManagerImpl.java b/server/src/com/cloud/api/query/QueryManagerImpl.java index e92680f3eca..8cf09bfa7b0 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); } diff --git a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java index 84ea2d2beda..6af50df51a8 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 detailsVO = new ArrayList(); + 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; diff --git a/server/src/com/cloud/hypervisor/CloudZonesStartupProcessor.java b/server/src/com/cloud/hypervisor/CloudZonesStartupProcessor.java index c056c67383e..8761b6baba9 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); diff --git a/server/src/com/cloud/metadata/ResourceMetaDataManagerImpl.java b/server/src/com/cloud/metadata/ResourceMetaDataManagerImpl.java index 8fc7471cb7a..152e57fad72 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; diff --git a/server/src/com/cloud/template/TemplateManagerImpl.java b/server/src/com/cloud/template/TemplateManagerImpl.java index fb1bb272827..7a1b5aa5edc 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 detailsStr = cmd.getDetails(); + if (detailsStr != null) { + List details = new ArrayList(); + for (String key : detailsStr.keySet()) { + details.add(new VMTemplateDetailVO(template.getId(), key, detailsStr.get(key))); + } + _templateDetailsDao.addDetails(details); } _resourceLimitMgr.incrementResourceCount(templateOwner.getId(), ResourceType.template); diff --git a/server/test/com/cloud/metadata/ResourceMetaDataManagerTest.java b/server/test/com/cloud/metadata/ResourceMetaDataManagerTest.java index b0719553df1..ae3cae4f673 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 map = new HashedMap(); map.put("key","value"); _resourceMetaDataMgr.addResourceMetaData("1", ResourceTag.ResourceObjectType.Volume, map);