diff --git a/server/src/com/cloud/configuration/dao/ConfigurationDao.java b/server/src/com/cloud/configuration/dao/ConfigurationDao.java index 3786ccc483e..8c51eb9b694 100644 --- a/server/src/com/cloud/configuration/dao/ConfigurationDao.java +++ b/server/src/com/cloud/configuration/dao/ConfigurationDao.java @@ -69,4 +69,6 @@ public interface ConfigurationDao extends GenericDao { boolean isPremium(); ConfigurationVO findByName(String name); + + ConfigurationVO persistConfigValue(ConfigurationVO config); } diff --git a/server/src/com/cloud/configuration/dao/ConfigurationDaoImpl.java b/server/src/com/cloud/configuration/dao/ConfigurationDaoImpl.java index 1c6e7dede3b..e6505e55fee 100644 --- a/server/src/com/cloud/configuration/dao/ConfigurationDaoImpl.java +++ b/server/src/com/cloud/configuration/dao/ConfigurationDaoImpl.java @@ -26,10 +26,12 @@ import java.util.Map; import javax.ejb.Local; import javax.naming.ConfigurationException; +import javax.persistence.EntityExistsException; import org.apache.log4j.Logger; import com.cloud.configuration.ConfigurationVO; +import com.cloud.storage.DiskOfferingVO; import com.cloud.utils.db.DB; import com.cloud.utils.db.GenericDaoBase; import com.cloud.utils.db.SearchBuilder; @@ -194,5 +196,18 @@ public class ConfigurationDaoImpl extends GenericDaoBase sc = NameSearch.create(); sc.setParameters("name", name); return findOneIncludingRemovedBy(sc); + } + + @Override + public ConfigurationVO persistConfigValue(ConfigurationVO config) { + ConfigurationVO vo = findByName(config.getName()); + if (vo != null) { + return vo; + } + try { + return persist(config); + } catch (EntityExistsException e) { + return findByName(config.getName()); + } } } diff --git a/server/src/com/cloud/server/ConfigurationServerImpl.java b/server/src/com/cloud/server/ConfigurationServerImpl.java index a79800d7fa0..e8feae3ca22 100644 --- a/server/src/com/cloud/server/ConfigurationServerImpl.java +++ b/server/src/com/cloud/server/ConfigurationServerImpl.java @@ -27,8 +27,6 @@ import java.io.FileOutputStream; import java.io.IOException; import java.math.BigInteger; import java.net.InetAddress; -import java.net.NetworkInterface; -import java.net.SocketException; import java.net.UnknownHostException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; @@ -169,9 +167,9 @@ public class ConfigurationServerImpl implements ConfigurationServer { createServiceOffering(User.UID_SYSTEM, "Small Instance", 1, 512, 500, "Small Instance, $0.05 per hour", false, false, null); createServiceOffering(User.UID_SYSTEM, "Medium Instance", 1, 1024, 1000, "Medium Instance, $0.10 per hour", false, false, null); // Save default disk offerings - createDiskOffering(null, "Small", "Small Disk, 5 GB", 5, null); - createDiskOffering(null, "Medium", "Medium Disk, 20 GB", 20, null); - createDiskOffering(null, "Large", "Large Disk, 100 GB", 100, null); + createdefaultDiskOffering(null, "Small", "Small Disk, 5 GB", 5, null); + createdefaultDiskOffering(null, "Medium", "Medium Disk, 20 GB", 20, null); + createdefaultDiskOffering(null, "Large", "Large Disk, 100 GB", 100, null); // Save the mount parent to the configuration table String mountParent = getMountParent(); @@ -757,24 +755,23 @@ public class ConfigurationServerImpl implements ConfigurationServer { return pod; } - private DiskOfferingVO createDiskOffering(Long domainId, String name, String description, int numGibibytes, String tags) { + private DiskOfferingVO createdefaultDiskOffering(Long domainId, String name, String description, int numGibibytes, String tags) { long diskSize = numGibibytes; diskSize = diskSize * 1024 * 1024 * 1024; tags = cleanupTags(tags); DiskOfferingVO newDiskOffering = new DiskOfferingVO(domainId, name, description, diskSize,tags,false); - return _diskOfferingDao.persist(newDiskOffering); + newDiskOffering.setUniqueName("Cloud.Com-" + name); + newDiskOffering = _diskOfferingDao.persistDeafultDiskOffering(newDiskOffering); + return newDiskOffering; } private ServiceOfferingVO createServiceOffering(long userId, String name, int cpu, int ramSize, int speed, String displayText, boolean localStorageRequired, boolean offerHA, String tags) { tags = cleanupTags(tags); ServiceOfferingVO offering = new ServiceOfferingVO(name, cpu, ramSize, speed, null, null, offerHA, displayText, localStorageRequired, false, tags, false, null, false); - - if ((offering = _serviceOfferingDao.persist(offering)) != null) { - return offering; - } else { - return null; - } + offering.setUniqueName("Cloud.Com-" + name); + offering = _serviceOfferingDao.persistSystemServiceOffering(offering); + return offering; } private String cleanupTags(String tags) { diff --git a/server/src/com/cloud/service/dao/ServiceOfferingDao.java b/server/src/com/cloud/service/dao/ServiceOfferingDao.java index 6db9f2d1599..361448fe35b 100644 --- a/server/src/com/cloud/service/dao/ServiceOfferingDao.java +++ b/server/src/com/cloud/service/dao/ServiceOfferingDao.java @@ -31,5 +31,6 @@ public interface ServiceOfferingDao extends GenericDao ServiceOfferingVO persistSystemServiceOffering(ServiceOfferingVO vo); List findPublicServiceOfferings(); List findServiceOfferingByDomainId(Long domainId); - List findSystemOffering(Long domainId, Boolean isSystem, String vm_type); + List findSystemOffering(Long domainId, Boolean isSystem, String vm_type); + ServiceOfferingVO persistDeafultServiceOffering(ServiceOfferingVO offering); } diff --git a/server/src/com/cloud/service/dao/ServiceOfferingDaoImpl.java b/server/src/com/cloud/service/dao/ServiceOfferingDaoImpl.java index 6fcf6e5d899..5ab0151ad4f 100644 --- a/server/src/com/cloud/service/dao/ServiceOfferingDaoImpl.java +++ b/server/src/com/cloud/service/dao/ServiceOfferingDaoImpl.java @@ -126,5 +126,20 @@ public class ServiceOfferingDaoImpl extends GenericDaoBase sc = PublicServiceOfferingSearch.create(); sc.setParameters("system", false); return listBy(sc); + } + + @Override @DB + public ServiceOfferingVO persistDeafultServiceOffering(ServiceOfferingVO offering) { + assert offering.getUniqueName() != null : "unique name should be set for the service offering"; + ServiceOfferingVO vo = findByName(offering.getUniqueName()); + if (vo != null) { + return vo; + } + try { + return persist(offering); + } catch (EntityExistsException e) { + // Assume it's conflict on unique name + return findByName(offering.getUniqueName()); + } } } diff --git a/server/src/com/cloud/storage/dao/DiskOfferingDao.java b/server/src/com/cloud/storage/dao/DiskOfferingDao.java index 70646ec7337..1833940897c 100644 --- a/server/src/com/cloud/storage/dao/DiskOfferingDao.java +++ b/server/src/com/cloud/storage/dao/DiskOfferingDao.java @@ -27,5 +27,7 @@ public interface DiskOfferingDao extends GenericDao { List listByDomainId(long domainId); List findPrivateDiskOffering(); List findPublicDiskOfferings(); + DiskOfferingVO findByUniqueName(String uniqueName); + DiskOfferingVO persistDeafultDiskOffering(DiskOfferingVO offering); } diff --git a/server/src/com/cloud/storage/dao/DiskOfferingDaoImpl.java b/server/src/com/cloud/storage/dao/DiskOfferingDaoImpl.java index d536a663e1a..8341761eaaf 100644 --- a/server/src/com/cloud/storage/dao/DiskOfferingDaoImpl.java +++ b/server/src/com/cloud/storage/dao/DiskOfferingDaoImpl.java @@ -21,10 +21,10 @@ package com.cloud.storage.dao; import java.util.List; import javax.ejb.Local; +import javax.persistence.EntityExistsException; import org.apache.log4j.Logger; -import com.cloud.service.ServiceOfferingVO; import com.cloud.storage.DiskOfferingVO; import com.cloud.storage.DiskOfferingVO.Type; import com.cloud.utils.db.Attribute; @@ -41,6 +41,7 @@ public class DiskOfferingDaoImpl extends GenericDaoBase im private final SearchBuilder DomainIdSearch; private final SearchBuilder PrivateDiskOfferingSearch; private final SearchBuilder PublicDiskOfferingSearch; + protected final SearchBuilder UniqueNameSearch; private final Attribute _typeAttr; protected DiskOfferingDaoImpl() { @@ -57,6 +58,10 @@ public class DiskOfferingDaoImpl extends GenericDaoBase im PublicDiskOfferingSearch.and("system", PublicDiskOfferingSearch.entity().getSystemUse(), SearchCriteria.Op.EQ); PublicDiskOfferingSearch.done(); + UniqueNameSearch = createSearchBuilder(); + UniqueNameSearch.and("name", UniqueNameSearch.entity().getUniqueName(), SearchCriteria.Op.EQ); + UniqueNameSearch.done(); + _typeAttr = _allAttributes.get("type"); } @@ -105,5 +110,32 @@ public class DiskOfferingDaoImpl extends GenericDaoBase im SearchCriteria sc = PublicDiskOfferingSearch.create(); sc.setParameters("system", false); return listBy(sc); + } + + @Override + public DiskOfferingVO findByUniqueName(String uniqueName) { + SearchCriteria sc = UniqueNameSearch.create(); + sc.setParameters("name", uniqueName); + List vos = search(sc, null, null, false); + if (vos.size() == 0) { + return null; + } + + return vos.get(0); + } + + @Override + public DiskOfferingVO persistDeafultDiskOffering(DiskOfferingVO offering) { + assert offering.getUniqueName() != null : "unique name shouldn't be null for the disk offering"; + DiskOfferingVO vo = findByUniqueName(offering.getUniqueName()); + if (vo != null) { + return vo; + } + try { + return persist(offering); + } catch (EntityExistsException e) { + // Assume it's conflict on unique name + return findByUniqueName(offering.getUniqueName()); + } } }