From ed31497188be6675cebeae257510464779486bc6 Mon Sep 17 00:00:00 2001 From: Alex Huang Date: Tue, 16 Nov 2010 04:27:47 -0800 Subject: [PATCH] ComponentLocator changes --- client/tomcatconf/components.xml.in | 208 +-------- .../src/com/cloud/storage/DiskTemplateVO.java | 107 ----- .../cloud/storage/dao/DiskTemplateDao.java | 26 -- .../storage/dao/DiskTemplateDaoImpl.java | 53 --- .../storage/template/DownloadManagerImpl.java | 13 +- .../storage/template/QCOW2Processor.java | 4 +- .../storage/template/UploadManagerImpl.java | 16 - .../cloud/storage/template/VhdProcessor.java | 4 +- .../cloud/storage/template/VmdkProcessor.java | 4 +- .../com/cloud/api/commands/DestroyVm2Cmd.java | 2 +- .../DefaultComponentLibrary.java | 148 ++++--- .../consoleproxy/ConsoleProxyManagerImpl.java | 8 +- .../com/cloud/network/NetworkManagerImpl.java | 9 +- .../router/DomainRouterManagerImpl.java | 2 - .../com/cloud/server/ManagementServer.java | 9 +- .../cloud/server/ManagementServerImpl.java | 15 +- .../src/com/cloud/vm/UserVmManagerImpl.java | 2 - setup/db/create-index-fk.sql | 3 - setup/db/create-schema.sql | 14 - .../com/cloud/utils/component/Adapters.java | 18 +- .../utils/component/ComponentLocator.java | 409 ++++++++++++------ 21 files changed, 398 insertions(+), 676 deletions(-) delete mode 100755 core/src/com/cloud/storage/DiskTemplateVO.java delete mode 100755 core/src/com/cloud/storage/dao/DiskTemplateDao.java delete mode 100755 core/src/com/cloud/storage/dao/DiskTemplateDaoImpl.java diff --git a/client/tomcatconf/components.xml.in b/client/tomcatconf/components.xml.in index 87f9dcaf4f4..a8f823af9d7 100755 --- a/client/tomcatconf/components.xml.in +++ b/client/tomcatconf/components.xml.in @@ -23,214 +23,10 @@ documented, please contact the author. --> - - - - - - - - - 50 - -1 - - - 50 - -1 - - - 50 - -1 - - - 50 - -1 - - - - - - - - - - 5000 - 300 - - - - 50 - -1 - - - - - - - - - - - - - - - - - - - - - - - - - - 50 - -1 - routing - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - < adapter name="Storage" class="com.cloud.storage.allocator.FirstFitStoragePoolAllocator"/ > - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - false - - - - - 50 - -1 - - - + diff --git a/core/src/com/cloud/storage/DiskTemplateVO.java b/core/src/com/cloud/storage/DiskTemplateVO.java deleted file mode 100755 index 8685ecf221a..00000000000 --- a/core/src/com/cloud/storage/DiskTemplateVO.java +++ /dev/null @@ -1,107 +0,0 @@ -/** - * Copyright (C) 2010 Cloud.com, Inc. All rights reserved. - * - * This software is licensed under the GNU General Public License v3 or later. - * - * It is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or any later version. - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -package com.cloud.storage; - - -import java.util.Date; - -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.Table; - -import com.cloud.utils.db.GenericDao; - -/** - * @author ahuang - * - */ -@Entity -@Table(name="disk_template_ref") -public class DiskTemplateVO { - @Id - @GeneratedValue(strategy=GenerationType.IDENTITY) - @Column(name="id") - Long id; - - @Column(name="description") - String description; - - @Column(name="host") - String host; - - @Column(name="path") - String path; - - @Column(name="size") - long size; - - @Column(name="type") - String type; - - @Column(name=GenericDao.CREATED_COLUMN) - Date created; - - @Column(name=GenericDao.REMOVED_COLUMN) - Date removed; - - public DiskTemplateVO(Long id, String description, String path, long size, String type) { - this.id = id; - this.description = description; - this.path = path; - this.size = size; - this.type = type; - } - - public Long getId() { - return id; - } - - public String getDescription() { - return description; - } - - public String getHost() { - return host; - } - - public String getPath() { - return path; - } - - public long getSize() { - return size; - } - - public String getType() { - return type; - } - - public Date getCreated() { - return created; - } - - public Date getRemoved() { - return removed; - } - - protected DiskTemplateVO() { - } -} diff --git a/core/src/com/cloud/storage/dao/DiskTemplateDao.java b/core/src/com/cloud/storage/dao/DiskTemplateDao.java deleted file mode 100755 index 523155d589a..00000000000 --- a/core/src/com/cloud/storage/dao/DiskTemplateDao.java +++ /dev/null @@ -1,26 +0,0 @@ -/** - * Copyright (C) 2010 Cloud.com, Inc. All rights reserved. - * - * This software is licensed under the GNU General Public License v3 or later. - * - * It is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or any later version. - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -package com.cloud.storage.dao; - -import com.cloud.storage.DiskTemplateVO; -import com.cloud.utils.db.GenericDao; - -public interface DiskTemplateDao extends GenericDao { - public DiskTemplateVO findByTypeAndSize(String type, long size); - -} diff --git a/core/src/com/cloud/storage/dao/DiskTemplateDaoImpl.java b/core/src/com/cloud/storage/dao/DiskTemplateDaoImpl.java deleted file mode 100755 index 7e0f68e75cf..00000000000 --- a/core/src/com/cloud/storage/dao/DiskTemplateDaoImpl.java +++ /dev/null @@ -1,53 +0,0 @@ -/** - * Copyright (C) 2010 Cloud.com, Inc. All rights reserved. - * - * This software is licensed under the GNU General Public License v3 or later. - * - * It is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or any later version. - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -package com.cloud.storage.dao; - -import java.util.List; - -import javax.ejb.Local; - -import com.cloud.storage.DiskTemplateVO; -import com.cloud.utils.db.GenericDaoBase; -import com.cloud.utils.db.SearchBuilder; -import com.cloud.utils.db.SearchCriteria; - -@Local(value={DiskTemplateDao.class}) -public class DiskTemplateDaoImpl extends GenericDaoBase implements DiskTemplateDao { - - protected SearchBuilder TypeSizeSearch; - - protected static final String BY_TYPE_AND_SIZE_CLAUSE = "type = ? AND size = ?"; - - protected DiskTemplateDaoImpl() { - super(); - - TypeSizeSearch = createSearchBuilder(); - TypeSizeSearch.and("type", TypeSizeSearch.entity().getType(), SearchCriteria.Op.EQ); - TypeSizeSearch.and("size", TypeSizeSearch.entity().getSize(), SearchCriteria.Op.EQ); - } - - public DiskTemplateVO findByTypeAndSize(String type, long size) { - SearchCriteria sc = TypeSizeSearch.create(); - sc.setParameters("type", type); - sc.setParameters("size", size); - - List vos = listBy(sc); - assert(vos.size() <= 1); // Should only have one. If more than one something is wrong. - return vos.size() == 0 ? null : vos.get(0); - } -} diff --git a/core/src/com/cloud/storage/template/DownloadManagerImpl.java b/core/src/com/cloud/storage/template/DownloadManagerImpl.java index af82c10077e..ef7ce156e83 100644 --- a/core/src/com/cloud/storage/template/DownloadManagerImpl.java +++ b/core/src/com/cloud/storage/template/DownloadManagerImpl.java @@ -52,8 +52,10 @@ import com.cloud.storage.template.Processor.FormatInfo; import com.cloud.storage.template.TemplateDownloader.DownloadCompleteCallback; import com.cloud.storage.template.TemplateDownloader.Status; import com.cloud.utils.NumbersUtil; +import com.cloud.utils.component.Adapter; import com.cloud.utils.component.Adapters; import com.cloud.utils.component.ComponentLocator; +import com.cloud.utils.component.ComponentLocator.ComponentInfo; import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.utils.script.OutputInterpreter; import com.cloud.utils.script.Script; @@ -770,24 +772,23 @@ public class DownloadManagerImpl implements DownloadManager { } s_logger.info("createtmplt.sh found in " + createTmpltScr); - List processors = new ArrayList(); + List> processors = new ArrayList>(); Processor processor = new VhdProcessor(); - processor.configure("VHD Processor", params); - processors.add(processor); + processors.add(new ComponentInfo("VHD Processor", VhdProcessor.class, processor)); processor = new IsoProcessor(); processor.configure("ISO Processor", params); - processors.add(processor); + processors.add(new ComponentInfo("ISO Processor", IsoProcessor.class, processor)); processor = new QCOW2Processor(); processor.configure("QCOW2 Processor", params); - processors.add(processor); + processors.add(new ComponentInfo("QCOW2 Processor", QCOW2Processor.class, processor)); processor = new VmdkProcessor(); processor.configure("VMDK Processor", params); - processors.add(processor); + processors.add(new ComponentInfo("VMDK Processor", VmdkProcessor.class, processor)); _processors = new Adapters("processors", processors); // Add more processors here. diff --git a/core/src/com/cloud/storage/template/QCOW2Processor.java b/core/src/com/cloud/storage/template/QCOW2Processor.java index 6c7fbc6a3e2..b9679cc3dcd 100644 --- a/core/src/com/cloud/storage/template/QCOW2Processor.java +++ b/core/src/com/cloud/storage/template/QCOW2Processor.java @@ -23,14 +23,16 @@ import java.io.FileInputStream; import java.io.IOException; import java.util.Map; +import javax.ejb.Local; import javax.naming.ConfigurationException; import org.apache.log4j.Logger; -import com.cloud.storage.StorageLayer; import com.cloud.storage.Storage.ImageFormat; +import com.cloud.storage.StorageLayer; import com.cloud.utils.NumbersUtil; +@Local(value=Processor.class) public class QCOW2Processor implements Processor { private static final Logger s_logger = Logger.getLogger(QCOW2Processor.class); String _name; diff --git a/core/src/com/cloud/storage/template/UploadManagerImpl.java b/core/src/com/cloud/storage/template/UploadManagerImpl.java index 7a791e78c94..ea335a6ebae 100755 --- a/core/src/com/cloud/storage/template/UploadManagerImpl.java +++ b/core/src/com/cloud/storage/template/UploadManagerImpl.java @@ -4,9 +4,7 @@ import java.io.File; import java.net.URI; import java.net.URISyntaxException; import java.text.SimpleDateFormat; -import java.util.ArrayList; import java.util.Date; -import java.util.List; import java.util.Map; import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; @@ -457,20 +455,6 @@ public class UploadManagerImpl implements UploadManager { scriptsDir = "scripts/storage/secondary"; } - List processors = new ArrayList(); - _processors = new Adapters("processors", processors); - Processor processor = new VhdProcessor(); - - processor.configure("VHD Processor", params); - processors.add(processor); - - processor = new IsoProcessor(); - processor.configure("ISO Processor", params); - processors.add(processor); - - processor = new QCOW2Processor(); - processor.configure("QCOW2 Processor", params); - processors.add(processor); // Add more processors here. threadPool = Executors.newFixedThreadPool(numInstallThreads); diff --git a/core/src/com/cloud/storage/template/VhdProcessor.java b/core/src/com/cloud/storage/template/VhdProcessor.java index 6ed4752903a..ededa4028ce 100644 --- a/core/src/com/cloud/storage/template/VhdProcessor.java +++ b/core/src/com/cloud/storage/template/VhdProcessor.java @@ -23,13 +23,14 @@ import java.io.IOException; import java.util.Arrays; import java.util.Map; +import javax.ejb.Local; import javax.naming.ConfigurationException; import org.apache.log4j.Logger; import com.cloud.exception.InternalErrorException; -import com.cloud.storage.StorageLayer; import com.cloud.storage.Storage.ImageFormat; +import com.cloud.storage.StorageLayer; import com.cloud.utils.NumbersUtil; /** @@ -38,6 +39,7 @@ import com.cloud.utils.NumbersUtil; * into the VHD format. * */ +@Local(value=Processor.class) public class VhdProcessor implements Processor { private static final Logger s_logger = Logger.getLogger(VhdProcessor.class); diff --git a/core/src/com/cloud/storage/template/VmdkProcessor.java b/core/src/com/cloud/storage/template/VmdkProcessor.java index ff748b919d9..52e41bcb3e1 100644 --- a/core/src/com/cloud/storage/template/VmdkProcessor.java +++ b/core/src/com/cloud/storage/template/VmdkProcessor.java @@ -3,15 +3,17 @@ package com.cloud.storage.template; import java.io.File; import java.util.Map; +import javax.ejb.Local; import javax.naming.ConfigurationException; import org.apache.log4j.Logger; import com.cloud.exception.InternalErrorException; -import com.cloud.storage.StorageLayer; import com.cloud.storage.Storage.ImageFormat; +import com.cloud.storage.StorageLayer; import com.cloud.utils.script.Script; +@Local(value=Processor.class) public class VmdkProcessor implements Processor { private static final Logger s_logger = Logger.getLogger(VmdkProcessor.class); diff --git a/server/src/com/cloud/api/commands/DestroyVm2Cmd.java b/server/src/com/cloud/api/commands/DestroyVm2Cmd.java index d0e066bd3a6..2d164154069 100644 --- a/server/src/com/cloud/api/commands/DestroyVm2Cmd.java +++ b/server/src/com/cloud/api/commands/DestroyVm2Cmd.java @@ -37,7 +37,7 @@ import com.cloud.exception.ResourceUnavailableException; import com.cloud.user.Account; import com.cloud.uservm.UserVm; -@Implementation(description="Destroys a virtual machine. Once destroyed, only the administrator can recover it.") +@Implementation(description="Destroys a virtual machine. Once destroyed, only the administrator can recover it.", responseObject=UserVmResponse.class) public class DestroyVm2Cmd extends BaseAsyncCmd { public static final Logger s_logger = Logger.getLogger(DestroyVm2Cmd.class.getName()); diff --git a/server/src/com/cloud/configuration/DefaultComponentLibrary.java b/server/src/com/cloud/configuration/DefaultComponentLibrary.java index 54dc4f3f61a..21c67a5197f 100644 --- a/server/src/com/cloud/configuration/DefaultComponentLibrary.java +++ b/server/src/com/cloud/configuration/DefaultComponentLibrary.java @@ -24,6 +24,8 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import com.cloud.acl.DomainChecker; +import com.cloud.acl.SecurityChecker; import com.cloud.agent.manager.AgentManagerImpl; import com.cloud.agent.manager.allocator.HostAllocator; import com.cloud.agent.manager.allocator.PodAllocator; @@ -54,11 +56,14 @@ import com.cloud.dc.dao.DataCenterIpAddressDaoImpl; import com.cloud.dc.dao.HostPodDaoImpl; import com.cloud.dc.dao.PodVlanMapDaoImpl; import com.cloud.dc.dao.VlanDaoImpl; +import com.cloud.deploy.DeploymentPlanner; import com.cloud.deploy.SimplePlanner; import com.cloud.domain.dao.DomainDaoImpl; import com.cloud.event.dao.EventDaoImpl; import com.cloud.ha.CheckOnAgentInvestigator; +import com.cloud.ha.FenceBuilder; import com.cloud.ha.HighAvailabilityManagerImpl; +import com.cloud.ha.Investigator; import com.cloud.ha.InvestigatorImpl; import com.cloud.ha.StorageFence; import com.cloud.ha.XenServerInvestigator; @@ -72,9 +77,11 @@ import com.cloud.maid.dao.StackMaidDaoImpl; import com.cloud.maint.UpgradeManagerImpl; import com.cloud.maint.dao.AgentUpgradeDaoImpl; import com.cloud.network.ExteralIpAddressAllocator; +import com.cloud.network.IpAddrAllocator; import com.cloud.network.NetworkManagerImpl; import com.cloud.network.configuration.ControlNetworkGuru; import com.cloud.network.configuration.GuestNetworkGuru; +import com.cloud.network.configuration.NetworkGuru; import com.cloud.network.configuration.PodBasedNetworkGuru; import com.cloud.network.configuration.PublicNetworkGuru; import com.cloud.network.dao.FirewallRulesDaoImpl; @@ -94,7 +101,9 @@ import com.cloud.network.security.dao.NetworkGroupVMMapDaoImpl; import com.cloud.network.security.dao.NetworkGroupWorkDaoImpl; import com.cloud.network.security.dao.VmRulesetLogDaoImpl; import com.cloud.offerings.dao.NetworkOfferingDaoImpl; +import com.cloud.resource.Discoverer; import com.cloud.server.auth.MD5UserAuthenticator; +import com.cloud.server.auth.UserAuthenticator; import com.cloud.service.dao.ServiceOfferingDaoImpl; import com.cloud.storage.StorageManagerImpl; import com.cloud.storage.allocator.FirstFitStoragePoolAllocator; @@ -102,7 +111,6 @@ import com.cloud.storage.allocator.GarbageCollectingStoragePoolAllocator; import com.cloud.storage.allocator.LocalStoragePoolAllocator; import com.cloud.storage.allocator.StoragePoolAllocator; import com.cloud.storage.dao.DiskOfferingDaoImpl; -import com.cloud.storage.dao.DiskTemplateDaoImpl; import com.cloud.storage.dao.GuestOSCategoryDaoImpl; import com.cloud.storage.dao.GuestOSDaoImpl; import com.cloud.storage.dao.LaunchPermissionDaoImpl; @@ -121,6 +129,7 @@ import com.cloud.storage.download.DownloadMonitorImpl; import com.cloud.storage.preallocatedlun.dao.PreallocatedLunDaoImpl; import com.cloud.storage.secondary.SecondaryStorageDiscoverer; import com.cloud.storage.secondary.SecondaryStorageManagerImpl; +import com.cloud.storage.secondary.SecondaryStorageVmAllocator; import com.cloud.storage.secondary.SecondaryStorageVmDefaultAllocator; import com.cloud.storage.snapshot.SnapshotManagerImpl; import com.cloud.storage.snapshot.SnapshotSchedulerImpl; @@ -137,6 +146,7 @@ import com.cloud.utils.component.ComponentLibrary; import com.cloud.utils.component.ComponentLocator.ComponentInfo; import com.cloud.utils.component.Manager; import com.cloud.utils.db.GenericDao; +import com.cloud.vm.ItWorkDaoImpl; import com.cloud.vm.MauriceMoss; import com.cloud.vm.UserVmManagerImpl; import com.cloud.vm.dao.ConsoleProxyDaoImpl; @@ -152,38 +162,47 @@ public class DefaultComponentLibrary implements ComponentLibrary { protected final Map>> _daos = new LinkedHashMap>>(); - protected void addDao(String name, Class> clazz) { - addDao(name, clazz, null, true); + protected ComponentInfo> addDao(String name, Class> clazz) { + return addDao(name, clazz, new ArrayList>(), true); } - protected void addDao(String name, Class> clazz, List> params, - boolean singleton) { - ComponentInfo> ComponentInfo = new ComponentInfo>(name, clazz, params, singleton); - for (String key : ComponentInfo.getKeys()) { - _daos.put(key, ComponentInfo); + protected ComponentInfo> addDao(String name, Class> clazz, List> params, boolean singleton) { + ComponentInfo> componentInfo = new ComponentInfo>(name, clazz, params, singleton); + for (String key : componentInfo.getKeys()) { + _daos.put(key, componentInfo); } + return componentInfo; } - protected void addDaos() { + protected void populateDaos() { addDao("StackMaidDao", StackMaidDaoImpl.class); addDao("VMTemplateZoneDao", VMTemplateZoneDaoImpl.class); addDao("DomainRouterDao", DomainRouterDaoImpl.class); addDao("HostDao", HostDaoImpl.class); addDao("VMInstanceDao", VMInstanceDaoImpl.class); addDao("UserVmDao", UserVmDaoImpl.class); - addDao("ServiceOfferingDao", ServiceOfferingDaoImpl.class); - addDao("DiskOfferingDao", DiskOfferingDaoImpl.class); - addDao("DataCenterDao", DataCenterDaoImpl.class); - addDao("HostPodDao", HostPodDaoImpl.class); + ComponentInfo> info = addDao("ServiceOfferingDao", ServiceOfferingDaoImpl.class); + info.addParameter("cache.size", "50"); + info.addParameter("cache.time.to.live", "600"); + info = addDao("DiskOfferingDao", DiskOfferingDaoImpl.class); + info.addParameter("cache.size", "50"); + info.addParameter("cache.time.to.live", "600"); + info = addDao("DataCenterDao", DataCenterDaoImpl.class); + info.addParameter("cache.size", "50"); + info.addParameter("cache.time.to.live", "600"); + info = addDao("HostPodDao", HostPodDaoImpl.class); + info.addParameter("cache.size", "50"); + info.addParameter("cache.time.to.live", "600"); addDao("IPAddressDao", IPAddressDaoImpl.class); addDao("VlanDao", VlanDaoImpl.class); addDao("PodVlanMapDao", PodVlanMapDaoImpl.class); addDao("AccountVlanMapDao", AccountVlanMapDaoImpl.class); addDao("VolumeDao", VolumeDaoImpl.class); addDao("EventDao", EventDaoImpl.class); - addDao("UserDao", UserDaoImpl.class); + info = addDao("UserDao", UserDaoImpl.class); + info.addParameter("cache.size", "5000"); + info.addParameter("cache.time.to.live", "300"); addDao("UserStatisticsDao", UserStatisticsDaoImpl.class); - addDao("DiskTemplateDao", DiskTemplateDaoImpl.class); addDao("FirewallRulesDao", FirewallRulesDaoImpl.class); addDao("LoadBalancerDao", LoadBalancerDaoImpl.class); addDao("NetworkRuleConfigDao", NetworkRuleConfigDaoImpl.class); @@ -207,7 +226,10 @@ public class DefaultComponentLibrary implements ComponentLibrary { addDao("VMTemplatePoolDao", VMTemplatePoolDaoImpl.class); addDao("LaunchPermissionDao", LaunchPermissionDaoImpl.class); addDao("ConfigurationDao", ConfigurationDaoImpl.class); - addDao("VMTemplateDao", VMTemplateDaoImpl.class); + info = addDao("VMTemplateDao", VMTemplateDaoImpl.class); + info.addParameter("cache.size", "100"); + info.addParameter("cache.time.to.live", "600"); + info.addParameter("routing.uniquename", "routing"); addDao("HighAvailabilityDao", HighAvailabilityDaoImpl.class); addDao("ConsoleProxyDao", ConsoleProxyDaoImpl.class); addDao("SecondaryStorageVmDao", SecondaryStorageVmDaoImpl.class); @@ -234,6 +256,7 @@ public class DefaultComponentLibrary implements ComponentLibrary { addDao("InstanceGroupVMMapDao", InstanceGroupVMMapDaoImpl.class); addDao("RemoteAccessVpnDao", RemoteAccessVpnDaoImpl.class); addDao("VpnUserDao", VpnUserDaoImpl.class); + addDao("ItWorkDao", ItWorkDaoImpl.class); } Map> _managers = new HashMap>(); @@ -242,23 +265,24 @@ public class DefaultComponentLibrary implements ComponentLibrary { @Override public synchronized Map>> getDaos() { if (_daos.size() == 0) { - addDaos(); + populateDaos(); } return _daos; } - protected void addManager(String name, Class clazz, List> params, boolean singleton) { - ComponentInfo ComponentInfo = new ComponentInfo(name, clazz, params, singleton); - for (String key : ComponentInfo.getKeys()) { - _managers.put(key, ComponentInfo); + protected ComponentInfo addManager(String name, Class clazz, List> params, boolean singleton) { + ComponentInfo info = new ComponentInfo(name, clazz, params, singleton); + for (String key : info.getKeys()) { + _managers.put(key, info); } + return info; } - protected void addManager(String name, Class clazz) { - addManager(name, clazz, null, true); + protected ComponentInfo addManager(String name, Class clazz) { + return addManager(name, clazz, new ArrayList>(), true); } - protected void addManagers() { + protected void populateManagers() { addManager("StackMaidManager", StackMaidManagerImpl.class); addManager("agent manager", AgentManagerImpl.class); addManager("account manager", AccountManagerImpl.class); @@ -285,7 +309,7 @@ public class DefaultComponentLibrary implements ComponentLibrary { addManager("DomainRouterManager", DomainRouterManagerImpl.class); } - protected void addAdapterChain(Class interphace, List>> adapters) { + protected List> addAdapterChain(Class interphace, List>> adapters) { ArrayList> lst = new ArrayList>(adapters.size()); for (Pair> adapter : adapters) { @SuppressWarnings("unchecked") @@ -293,17 +317,24 @@ public class DefaultComponentLibrary implements ComponentLibrary { lst.add(new ComponentInfo(adapter.first(), clazz)); } _adapters.put(interphace.getName(), lst); + return lst; + } + + protected void addOneAdapter(Class interphace, String name, Class adapterClass) { + List>> adapters = new ArrayList>>(); + adapters.add(new Pair>(name, adapterClass)); + addAdapterChain(interphace, adapters); } @Override public synchronized Map> getManagers() { if (_managers.size() == 0) { - addManagers(); + populateManagers(); } return _managers; } - public void addAllAdapters() { + protected void populateAdapters() { List>> hostAllocators = new ArrayList>>(); hostAllocators.add(new Pair>("FirstFitRouting", RecreateHostAllocator.class)); @@ -317,51 +348,42 @@ public class DefaultComponentLibrary implements ComponentLibrary { poolAllocators.add(new Pair>("GarbageCollecting", GarbageCollectingStoragePoolAllocator.class)); addAdapterChain(StoragePoolAllocator.class, poolAllocators); - List>> podAllocators = new ArrayList>>(); - podAllocators.add(new Pair>("User First", UserConcentratedAllocator.class)); - addAdapterChain(PodAllocator.class, podAllocators); - - List>> proxyAllocators = new ArrayList>>(); - proxyAllocators.add(new Pair>("Balance", ConsoleProxyBalanceAllocator.class)); - addAdapterChain(ConsoleProxyAllocator.class, proxyAllocators); - - // NetworkGuru - addAdapterChain("GuestNetworkGuru", GuestNetworkGuru.class); - addAdapterChain("PublicNetworkGuru", PublicNetworkGuru.class); - addAdapterChain("PodBasedNetworkGuru", PodBasedNetworkGuru.class); - addAdapterChain("ControlNetworkGuru", ControlNetworkGuru.class); - - // Secondary Storage Vm Allocator - addAdapterChain("Balance", SecondaryStorageVmDefaultAllocator.class); + List>> networkGurus = new ArrayList>>(); + networkGurus.add(new Pair>("GuestNetworkGuru", GuestNetworkGuru.class)); + networkGurus.add(new Pair>("PublicNetworkGuru", PublicNetworkGuru.class)); + networkGurus.add(new Pair>("PodBasedNetworkGuru", PodBasedNetworkGuru.class)); + networkGurus.add(new Pair>("ControlNetworkGuru", ControlNetworkGuru.class)); + addAdapterChain(NetworkGuru.class, networkGurus); - // Ip Address Allocator - addAdapterChain("Basic", ExteralIpAddressAllocator.class); - + addOneAdapter(PodAllocator.class, "UserConcentratedPodAllocator", UserConcentratedAllocator.class); + addOneAdapter(ConsoleProxyAllocator.class, "ConsoleProxyBalanceAllocator", ConsoleProxyBalanceAllocator.class); + addOneAdapter(SecondaryStorageVmAllocator.class, "SecondaryStorageVmDefaultBalance", SecondaryStorageVmDefaultAllocator.class); + addOneAdapter(IpAddrAllocator.class, "BasicExternalIpAddressAllocator", ExteralIpAddressAllocator.class); + addOneAdapter(UserAuthenticator.class, "MD5UserAuthenticator", MD5UserAuthenticator.class); - // User Authenticator - addAdapterChain("MD5", MD5UserAuthenticator.class); - // HA Investigator - addAdapterChain("SimpleInvestigator", CheckOnAgentInvestigator.class); - addAdapterChain("XenServerInvestigator", XenServerInvestigator.class); - addAdapterChain("PingInvestigator", InvestigatorImpl.class); + List>> investigators = new ArrayList>>(); + investigators.add(new Pair>("SimpleInvestigator", CheckOnAgentInvestigator.class)); + investigators.add(new Pair>("XenServerInvestigator", XenServerInvestigator.class)); + investigators.add(new Pair>("PingInvestigator", InvestigatorImpl.class)); + addAdapterChain(Investigator.class, investigators); + + addOneAdapter(FenceBuilder.class, "StorageFenceBuilder", StorageFence.class); + + List>> discovers = new ArrayList>>(); + discovers.add(new Pair>("XCP Agent", XcpServerDiscoverer.class)); + discovers.add(new Pair>("SecondaryStorage", SecondaryStorageDiscoverer.class)); + discovers.add(new Pair>("KVM Agent", KvmServerDiscoverer.class)); + addAdapterChain(Discoverer.class, discovers); - // HA Fence Builder - addAdapterChain("StorageFenceBuilder", StorageFence.class); - - // Discoverer - addAdapterChain("XCP Agent", XcpServerDiscoverer.class); - addAdapterChain("SecondaryStorage", SecondaryStorageDiscoverer.class); - addAdapterChain("KVM Agent", KvmServerDiscoverer.class); - - // Deployment Planner - addAdapterChain("Simple", SimplePlanner.class); + addOneAdapter(SecurityChecker.class, "DomainChecker", DomainChecker.class); + addOneAdapter(DeploymentPlanner.class, "SimpleDeploymentPlanner", SimplePlanner.class); } @Override public synchronized Map>> getAdapters() { if (_adapters.size() == 0) { - addAdapters(); + populateAdapters(); } return _adapters; } diff --git a/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java b/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java index 0059424e9ef..9031386bfbd 100644 --- a/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java +++ b/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java @@ -531,7 +531,7 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, VirtualMach @Override public ConsoleProxyVO startProxy(long proxyVmId, long startEventId) { try { - return start2(proxyVmId, startEventId); + return start(proxyVmId, startEventId); } catch (StorageUnavailableException e) { s_logger.warn("Exception while trying to start console proxy", e); return null; @@ -881,7 +881,7 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, VirtualMach if (s_logger.isDebugEnabled()) s_logger.debug("Assign console proxy from a newly started instance for request from data center : " + dataCenterId); - Map context = createProxyInstance2(dataCenterId); + Map context = createProxyInstance(dataCenterId); long proxyVmId = (Long) context.get("proxyVmId"); if (proxyVmId == 0) { @@ -921,7 +921,7 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, VirtualMach if (s_logger.isDebugEnabled()) s_logger.debug("Assign console proxy from a newly started instance for request from data center : " + dataCenterId); - Map context = createProxyInstance2(dataCenterId); + Map context = createProxyInstance(dataCenterId); long proxyVmId = (Long) context.get("proxyVmId"); if (proxyVmId == 0) { @@ -1468,7 +1468,7 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, VirtualMach try { if (proxyLock.lock(ACQUIRE_GLOBAL_LOCK_TIMEOUT_FOR_SYNC)) { try { - readyProxy = start2(readyProxy.getId(), 0); + readyProxy = start(readyProxy.getId(), 0); } finally { proxyLock.unlock(); } diff --git a/server/src/com/cloud/network/NetworkManagerImpl.java b/server/src/com/cloud/network/NetworkManagerImpl.java index 8f8ad2b5253..22b06f3165a 100755 --- a/server/src/com/cloud/network/NetworkManagerImpl.java +++ b/server/src/com/cloud/network/NetworkManagerImpl.java @@ -49,13 +49,11 @@ import com.cloud.api.ServerApiException; import com.cloud.api.commands.AddVpnUserCmd; import com.cloud.api.commands.AssignToLoadBalancerRuleCmd; import com.cloud.api.commands.AssociateIPAddrCmd; -import com.cloud.api.commands.CreateIpForwardingRuleCmd; -import com.cloud.api.commands.CreatePortForwardingRuleCmd; import com.cloud.api.commands.CreateLoadBalancerRuleCmd; +import com.cloud.api.commands.CreatePortForwardingRuleCmd; import com.cloud.api.commands.CreateRemoteAccessVpnCmd; -import com.cloud.api.commands.DeleteIpForwardingRuleCmd; -import com.cloud.api.commands.DeletePortForwardingRuleCmd; import com.cloud.api.commands.DeleteLoadBalancerRuleCmd; +import com.cloud.api.commands.DeletePortForwardingRuleCmd; import com.cloud.api.commands.DeleteRemoteAccessVpnCmd; import com.cloud.api.commands.DisassociateIPAddrCmd; import com.cloud.api.commands.ListPortForwardingRulesCmd; @@ -125,7 +123,6 @@ import com.cloud.resource.Resource.ReservationStrategy; import com.cloud.service.ServiceOfferingVO; import com.cloud.service.dao.ServiceOfferingDao; import com.cloud.storage.StorageManager; -import com.cloud.storage.dao.DiskTemplateDao; import com.cloud.storage.dao.GuestOSDao; import com.cloud.storage.dao.StoragePoolDao; import com.cloud.storage.dao.VMTemplateDao; @@ -167,7 +164,6 @@ import com.cloud.vm.UserVmVO; import com.cloud.vm.VMInstanceVO; import com.cloud.vm.VirtualMachine; import com.cloud.vm.VirtualMachineProfile; -import com.cloud.vm.dao.DomainRouterDao; import com.cloud.vm.dao.NicDao; import com.cloud.vm.dao.UserVmDao; @@ -186,7 +182,6 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag @Inject LoadBalancerVMMapDao _loadBalancerVMMapDao = null; @Inject IPAddressDao _ipAddressDao = null; @Inject VMTemplateDao _templateDao = null; - @Inject DiskTemplateDao _diskDao = null; @Inject UserDao _userDao = null; @Inject AccountDao _accountDao = null; @Inject DomainDao _domainDao = null; diff --git a/server/src/com/cloud/network/router/DomainRouterManagerImpl.java b/server/src/com/cloud/network/router/DomainRouterManagerImpl.java index f0bb926b5d8..0afd68fe3b7 100644 --- a/server/src/com/cloud/network/router/DomainRouterManagerImpl.java +++ b/server/src/com/cloud/network/router/DomainRouterManagerImpl.java @@ -134,7 +134,6 @@ import com.cloud.storage.StorageManager; import com.cloud.storage.StoragePoolVO; import com.cloud.storage.VMTemplateVO; import com.cloud.storage.VolumeVO; -import com.cloud.storage.dao.DiskTemplateDao; import com.cloud.storage.dao.GuestOSDao; import com.cloud.storage.dao.StoragePoolDao; import com.cloud.storage.dao.VMTemplateDao; @@ -195,7 +194,6 @@ public class DomainRouterManagerImpl implements DomainRouterManager, DomainRoute @Inject LoadBalancerVMMapDao _loadBalancerVMMapDao = null; @Inject IPAddressDao _ipAddressDao = null; @Inject VMTemplateDao _templateDao = null; - @Inject DiskTemplateDao _diskDao = null; @Inject DomainRouterDao _routerDao = null; @Inject UserDao _userDao = null; @Inject AccountDao _accountDao = null; diff --git a/server/src/com/cloud/server/ManagementServer.java b/server/src/com/cloud/server/ManagementServer.java index 5eb61d01842..a7c3ecb95b4 100755 --- a/server/src/com/cloud/server/ManagementServer.java +++ b/server/src/com/cloud/server/ManagementServer.java @@ -75,9 +75,9 @@ import com.cloud.api.commands.StartSystemVm2Cmd; import com.cloud.api.commands.StopSystemVm2Cmd; import com.cloud.api.commands.StopSystemVmCmd; import com.cloud.api.commands.UpdateDomainCmd; -import com.cloud.api.commands.UpdatePortForwardingRuleCmd; import com.cloud.api.commands.UpdateIsoCmd; import com.cloud.api.commands.UpdateIsoPermissionsCmd; +import com.cloud.api.commands.UpdatePortForwardingRuleCmd; import com.cloud.api.commands.UpdateTemplateCmd; import com.cloud.api.commands.UpdateTemplatePermissionsCmd; import com.cloud.api.commands.UpdateVMGroupCmd; @@ -111,7 +111,6 @@ import com.cloud.network.VpnUserVO; import com.cloud.network.security.NetworkGroupVO; import com.cloud.service.ServiceOfferingVO; import com.cloud.storage.DiskOfferingVO; -import com.cloud.storage.DiskTemplateVO; import com.cloud.storage.GuestOSCategoryVO; import com.cloud.storage.GuestOSVO; import com.cloud.storage.SnapshotPolicyVO; @@ -642,12 +641,6 @@ public interface ManagementServer { List searchForUsage(Criteria c); */ - /** - * Obtains a list of all active DiskTemplates. - * @return list of DiskTemplates - */ - List listAllActiveDiskTemplates(); - /** * Obtains a list of all templates. * @return list of VMTemplates diff --git a/server/src/com/cloud/server/ManagementServerImpl.java b/server/src/com/cloud/server/ManagementServerImpl.java index 0f2119fa6aa..e70ada86097 100755 --- a/server/src/com/cloud/server/ManagementServerImpl.java +++ b/server/src/com/cloud/server/ManagementServerImpl.java @@ -162,7 +162,7 @@ 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.DataCenterIpAddressDaoImpl; +import com.cloud.dc.dao.DataCenterIpAddressDao; import com.cloud.dc.dao.HostPodDao; import com.cloud.dc.dao.PodVlanMapDao; import com.cloud.dc.dao.VlanDao; @@ -212,7 +212,6 @@ import com.cloud.server.auth.UserAuthenticator; import com.cloud.service.ServiceOfferingVO; import com.cloud.service.dao.ServiceOfferingDao; import com.cloud.storage.DiskOfferingVO; -import com.cloud.storage.DiskTemplateVO; import com.cloud.storage.GuestOSCategoryVO; import com.cloud.storage.GuestOSVO; import com.cloud.storage.LaunchPermissionVO; @@ -237,7 +236,6 @@ import com.cloud.storage.Volume.VolumeType; import com.cloud.storage.VolumeStats; import com.cloud.storage.VolumeVO; import com.cloud.storage.dao.DiskOfferingDao; -import com.cloud.storage.dao.DiskTemplateDao; import com.cloud.storage.dao.GuestOSCategoryDao; import com.cloud.storage.dao.GuestOSDao; import com.cloud.storage.dao.LaunchPermissionDao; @@ -316,7 +314,7 @@ public class ManagementServerImpl implements ManagementServer { private final NetworkGroupDao _networkSecurityGroupDao; private final LoadBalancerDao _loadBalancerDao; private final IPAddressDao _publicIpAddressDao; - private final DataCenterIpAddressDaoImpl _privateIpAddressDao; + private final DataCenterIpAddressDao _privateIpAddressDao; private final LoadBalancerVMMapDao _loadBalancerVMMapDao; private final DomainRouterDao _routerDao; private final ConsoleProxyDao _consoleProxyDao; @@ -359,7 +357,6 @@ public class ManagementServerImpl implements ManagementServer { private final UserStatisticsDao _userStatsDao; private final VMInstanceDao _vmInstanceDao; private final VolumeDao _volumeDao; - private final DiskTemplateDao _diskTemplateDao; private final AlertManager _alertMgr; private final AsyncJobDao _jobDao; private final AsyncJobManager _asyncMgr; @@ -425,7 +422,7 @@ public class ManagementServerImpl implements ManagementServer { _networkSecurityGroupDao = locator.getDao(NetworkGroupDao.class); _loadBalancerDao = locator.getDao(LoadBalancerDao.class); _publicIpAddressDao = locator.getDao(IPAddressDao.class); - _privateIpAddressDao = locator.getDao(DataCenterIpAddressDaoImpl.class); + _privateIpAddressDao = locator.getDao(DataCenterIpAddressDao.class); _loadBalancerVMMapDao = locator.getDao(LoadBalancerVMMapDao.class); _consoleProxyDao = locator.getDao(ConsoleProxyDao.class); _secStorageVmDao = locator.getDao(SecondaryStorageVmDao.class); @@ -458,7 +455,6 @@ public class ManagementServerImpl implements ManagementServer { _userStatsDao = locator.getDao(UserStatisticsDao.class); _vmInstanceDao = locator.getDao(VMInstanceDao.class); _volumeDao = locator.getDao(VolumeDao.class); - _diskTemplateDao = locator.getDao(DiskTemplateDao.class); _alertMgr = locator.getManager(AlertManager.class); _asyncMgr = locator.getManager(AsyncJobManager.class); _tmpltMgr = locator.getManager(TemplateManager.class); @@ -3195,11 +3191,6 @@ public class ManagementServerImpl implements ManagementServer { return _publicIpAddressDao.search(sc, searchFilter); } - @Override - public List listAllActiveDiskTemplates() { - return _diskTemplateDao.listAll(); - } - @Override public UserAccount authenticateUser(String username, String password, Long domainId, Map requestParameters) { UserAccount user = null; diff --git a/server/src/com/cloud/vm/UserVmManagerImpl.java b/server/src/com/cloud/vm/UserVmManagerImpl.java index 3405bf5755f..2fb1d60f451 100755 --- a/server/src/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/com/cloud/vm/UserVmManagerImpl.java @@ -161,7 +161,6 @@ import com.cloud.storage.Volume; import com.cloud.storage.Volume.VolumeType; import com.cloud.storage.VolumeVO; import com.cloud.storage.dao.DiskOfferingDao; -import com.cloud.storage.dao.DiskTemplateDao; import com.cloud.storage.dao.GuestOSCategoryDao; import com.cloud.storage.dao.GuestOSDao; import com.cloud.storage.dao.SnapshotDao; @@ -218,7 +217,6 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, VirtualM @Inject UserStatisticsDao _userStatsDao = null; @Inject VMTemplateDao _templateDao = null; @Inject VMTemplateHostDao _templateHostDao = null; - @Inject DiskTemplateDao _diskDao = null; @Inject DomainDao _domainDao = null; @Inject ResourceLimitDao _limitDao = null; @Inject UserVmDao _vmDao = null; diff --git a/setup/db/create-index-fk.sql b/setup/db/create-index-fk.sql index fa5dd50dce9..812160bffea 100755 --- a/setup/db/create-index-fk.sql +++ b/setup/db/create-index-fk.sql @@ -1,6 +1,3 @@ -ALTER TABLE `cloud`.`disk_template_ref` ADD INDEX `i_disk_template_ref__removed`(`removed`); -ALTER TABLE `cloud`.`disk_template_ref` ADD INDEX `i_disk_template_ref__type__size`(`type`, `size`); - ALTER TABLE `cloud`.`volumes` ADD INDEX `i_volumes__removed`(`removed`); ALTER TABLE `cloud`.`volumes` ADD INDEX `i_volumes__pod_id`(`pod_id`); ALTER TABLE `cloud`.`volumes` ADD INDEX `i_volumes__data_center_id`(`data_center_id`); diff --git a/setup/db/create-schema.sql b/setup/db/create-schema.sql index 4602ff830f4..c3f375c5440 100755 --- a/setup/db/create-schema.sql +++ b/setup/db/create-schema.sql @@ -18,7 +18,6 @@ DROP TABLE IF EXISTS `cloud`.`host_zone_ref`; DROP TABLE IF EXISTS `cloud`.`data_ceneter`; DROP TABLE IF EXISTS `cloud`.`volumes`; DROP TABLE IF EXISTS `cloud`.`storage`; -DROP TABLE IF EXISTS `cloud`.`disk_template_ref`; DROP TABLE IF EXISTS `cloud`.`data_center`; DROP TABLE IF EXISTS `cloud`.`pricing`; DROP TABLE IF EXISTS `cloud`.`sequence`; @@ -278,19 +277,6 @@ INSERT INTO `cloud`.`sequence` (name, value) VALUES ('storage_pool_seq', 200); INSERT INTO `cloud`.`sequence` (name, value) VALUES ('volume_seq', 1); INSERT INTO `cloud`.`sequence` (name, value) VALUES ('network_configuration_seq', 1); -CREATE TABLE `cloud`.`disk_template_ref` ( - `id` bigint unsigned NOT NULL auto_increment, - `description` varchar(255) NOT NULL, - `host` varchar(255) NOT NULL COMMENT 'host on which the server exists', - `parent` varchar(255) NOT NULL COMMENT 'parent path', - `path` varchar(255) NOT NULL, - `size` int(10) unsigned NOT NULL COMMENT 'size of the disk', - `type` varchar(255) NOT NULL COMMENT 'file system type', - `created` datetime NOT NULL COMMENT 'Date created', - `removed` datetime COMMENT 'Date removed if not null', - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - CREATE TABLE `cloud`.`volumes` ( `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'Primary Key', `account_id` bigint unsigned NOT NULL COMMENT 'owner. foreign key to account table', diff --git a/utils/src/com/cloud/utils/component/Adapters.java b/utils/src/com/cloud/utils/component/Adapters.java index 86b06b85a5e..04cad7df26c 100755 --- a/utils/src/com/cloud/utils/component/Adapters.java +++ b/utils/src/com/cloud/utils/component/Adapters.java @@ -25,6 +25,7 @@ import java.util.List; import java.util.Map; import com.cloud.utils.EnumerationImpl; +import com.cloud.utils.component.ComponentLocator.ComponentInfo; /** * Adapters is a simple wrapper around the list of adapters. The reason is @@ -34,11 +35,13 @@ import com.cloud.utils.EnumerationImpl; * the iterator even during dynamic reloading. * **/ -public class Adapters implements Iterable { - private Map _map; +public class Adapters implements Iterable { + protected Map _map; + protected List> _infos; + protected String _name; - public Adapters(String name, List adapters) { + public Adapters(String name, List> adapters) { _name = name; set(adapters); } @@ -65,12 +68,15 @@ public class Adapters implements Iterable { return _map.values(); } - protected void set(List adapters) { + protected void set(List> adapters) { HashMap map = new HashMap(adapters.size()); - for (T adapter : adapters) { - map.put(adapter.getName(), adapter); + for (ComponentInfo adapter : adapters) { + @SuppressWarnings("unchecked") + T t = (T)adapter.instance; + map.put(adapter.getName(), t); } this._map = map; + this._infos = adapters; } public T get(String name) { diff --git a/utils/src/com/cloud/utils/component/ComponentLocator.java b/utils/src/com/cloud/utils/component/ComponentLocator.java index 5ad8b8d630d..d913d540e28 100755 --- a/utils/src/com/cloud/utils/component/ComponentLocator.java +++ b/utils/src/com/cloud/utils/component/ComponentLocator.java @@ -32,6 +32,7 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; import javax.ejb.Local; import javax.management.InstanceAlreadyExistsException; @@ -72,55 +73,38 @@ import com.cloud.utils.mgmt.ManagementBean; * **/ @SuppressWarnings("unchecked") -public class ComponentLocator extends Thread implements ComponentLocatorMBean { +public class ComponentLocator implements ComponentLocatorMBean { protected static final Logger s_logger = Logger.getLogger(ComponentLocator.class); - protected static HashMap s_singletons = new HashMap(111); + protected static ConcurrentHashMap, Singleton> s_singletons = new ConcurrentHashMap, Singleton>(111); + static HashMap s_locators = new HashMap(); private static boolean s_doOnce = false; protected static final Callback[] s_callbacks = new Callback[] { NoOp.INSTANCE, new DatabaseCallback() }; protected static final CallbackFilter s_callbackFilter = new DatabaseCallbackFilter(); protected static final HashMap, InjectInfo> s_factories = new HashMap, InjectInfo>(); - protected static HashMap s_locatorMap = new HashMap(); - protected static HashMap _componentMap = new HashMap(); - protected static HashMap _implementationClassMap = new HashMap(); - protected HashMap> _adapterMap; - protected HashMap> _managerMap; - protected LinkedHashMap>> _daoMap; - protected ComponentLocator _parentLocator; - protected String _serverName; + protected HashMap> _adapterMap; + protected HashMap> _managerMap; + protected LinkedHashMap>> _daoMap; + protected ComponentLocator _parentLocator; + protected String _serverName; + protected Object _component; public ComponentLocator(String server) { _parentLocator = null; _serverName = server; - Runtime.getRuntime().addShutdownHook(this); } public String getLocatorName() { return _serverName; } - + @Override - public synchronized void run() { - Iterator> itAdapters = _adapterMap.values().iterator(); - while (itAdapters.hasNext()) { - Adapters adapters = itAdapters.next(); - itAdapters.remove(); - Enumeration it = adapters.enumeration(); - while (it.hasMoreElements()) { - Adapter adapter = it.nextElement(); - adapter.stop(); - } - } - - Iterator> itManagers = _managerMap.values().iterator(); - while (itManagers.hasNext()) { - ComponentInfo manager = itManagers.next(); - itManagers.remove(); - manager.instance.stop(); - } + public String getName() { + return getLocatorName(); } + protected void parse(String filename, String log4jFile) { try { SAXParserFactory spfactory = SAXParserFactory.newInstance(); @@ -139,31 +123,43 @@ public class ComponentLocator extends Thread implements ComponentLocatorMBean { XmlHandler handler = new XmlHandler(_serverName); saxParser.parse(file, handler); - if (handler.parent != null) { - _parentLocator = getLocatorInternal(handler.parent, false, filename, log4jFile); - } - _daoMap = new LinkedHashMap>>(); _managerMap = new LinkedHashMap>(); _adapterMap = new HashMap>(); - if (handler.library != null) { - Class clazz = Class.forName(handler.library); - ComponentLibrary library = (ComponentLibrary)clazz.newInstance(); - _managerMap.putAll(library.getManagers()); - _daoMap.putAll(library.getDaos()); - createAdaptersMap(library.getAdapters()); + if (handler.parent != null) { + synchronized(s_locators) { + _parentLocator = s_locators.get(handler.parent); + if (_parentLocator == null) { + _parentLocator = new ComponentLocator(handler.parent); + s_locators.put(handler.parent, _parentLocator); + _parentLocator.parse(filename, log4jFile); + } + } } - _managerMap.putAll(handler.managers); - _daoMap.putAll(handler.daos); + ComponentLibrary library = null; + if (handler.library != null) { + Class clazz = Class.forName(handler.library); + library = (ComponentLibrary)clazz.newInstance(); + _daoMap.putAll(library.getDaos()); + _managerMap.putAll(library.getManagers()); + } + _daoMap.putAll(handler.daos); + _managerMap.putAll(handler.managers); + startDaos(); // daos should not be using managers and adapters. - createAdaptersMap(handler.adapters); - instantiateManagers(); + if (library != null) { + instantiateAdapters(library.getAdapters()); + } instantiateAdapters(handler.adapters); + instantiateManagers(); + _component = createInstance(handler.componentClass, true, true); configureManagers(); + configureAdapters(); startManagers(); startAdapters(); + } catch (ParserConfigurationException e) { s_logger.error("Unable to load " + _serverName + " due to errors while parsing " + filename, e); @@ -192,13 +188,29 @@ public class ComponentLocator extends Thread implements ComponentLocatorMBean { for (Map.Entry>> entry : entries) { ComponentInfo> info = entry.getValue(); - s_logger.info("Starting DAO: " + info.name); try { info.instance = (GenericDao)createInstance(info.clazz, true, info.singleton); - inject(info.clazz, info.instance); - if (!info.instance.configure(info.name, info.params)) { - s_logger.error("Unable to configure DAO: " + info.name); - System.exit(1); + if (info.singleton) { + s_logger.info("Starting singleton DAO: " + info.name); + Singleton singleton = s_singletons.get(info.clazz); + if (singleton.state == Singleton.State.Instantiated) { + inject(info.clazz, info.instance); + singleton.state = Singleton.State.Injected; + } + if (singleton.state == Singleton.State.Injected) { + if (!info.instance.configure(info.name, info.params)) { + s_logger.error("Unable to configure DAO: " + info.name); + System.exit(1); + } + singleton.state = Singleton.State.Started; + } + } else { + s_logger.info("Starting DAO: " + info.name); + inject(info.clazz, info.instance); + if (!info.instance.configure(info.name, info.params)) { + s_logger.error("Unable to configure DAO: " + info.name); + System.exit(1); + } } } catch (ConfigurationException e) { s_logger.error("Unable to configure DAO: " + info.name, e); @@ -215,13 +227,13 @@ public class ComponentLocator extends Thread implements ComponentLocatorMBean { private static Object createInstance(Class clazz, boolean inject, boolean singleton, Object... args) { Factory factory = null; - Object entity = null; + Singleton entity = null; synchronized(s_factories) { if (singleton) { - entity = s_singletons.get(clazz.toString()); + entity = s_singletons.get(clazz); if (entity != null) { s_logger.debug("Found singleton instantiation for " + clazz.toString()); - return entity; + return entity.singleton; } } InjectInfo info = s_factories.get(clazz); @@ -263,22 +275,23 @@ public class ComponentLocator extends Thread implements ComponentLocatorMBean { throw new CloudRuntimeException("Unable to find constructor to match parameters given: " + clazz.getName()); } - entity = factory.newInstance(argTypes, args, s_callbacks); + entity = new Singleton(factory.newInstance(argTypes, args, s_callbacks)); } else { - entity = factory.newInstance(s_callbacks); + entity = new Singleton(factory.newInstance(s_callbacks)); } if (inject) { - inject(clazz, entity); + inject(clazz, entity.singleton); + entity.state = Singleton.State.Injected; } if (singleton) { synchronized(s_factories) { - s_singletons.put(clazz.toString(), entity); + s_singletons.put(clazz, entity); } } - return entity; + return entity.singleton; } @@ -293,50 +306,22 @@ public class ComponentLocator extends Thread implements ComponentLocatorMBean { } if (info == null) { - return null; + throw new CloudRuntimeException("Unable to find DAO " + name); } _daoMap.put(name, info); return info; } - private static synchronized Object getComponent(Class clazz) { - String name = clazz.getName(); - try { - Object component = _componentMap.get(name); - if (component == null) { - Class impl = Class.forName(name); - component = createInstance(impl, true, true); - _componentMap.put(name, component); - } - return component; - } catch (ClassNotFoundException e) { - s_logger.error("Unable to load " + name + " due to ", e); - System.exit(1); - } - return null; - } - public static synchronized Object getComponent(String componentName) { ComponentLocator locator = s_locators.get(componentName); if (locator == null) { - ComponentLocator.getLocator(componentName); + locator = ComponentLocator.getLocator(componentName); } - String implementationClass = _implementationClassMap.get(componentName); - if (implementationClass != null) { - try { - Class clazz = Class.forName(implementationClass); - return getComponent(clazz); - } catch (Exception ex) { - s_logger.error("Failed to get component " + componentName + ", caused by exception " + ex, ex); - } - } else { - s_logger.warn("Unable to find component with name: " + componentName); - } - return null; + return locator._component; } - public > T getDao(Class clazz) { + public > T getDao(Class clazz) { ComponentInfo> info = getDao(clazz.getName()); return info != null ? (T)info.instance : null; } @@ -356,17 +341,40 @@ public class ComponentLocator extends Thread implements ComponentLocatorMBean { Set>> entries = _managerMap.entrySet(); for (Map.Entry> entry : entries) { ComponentInfo info = entry.getValue(); - s_logger.info("Injecting Manager: " + info.name); - inject(info.clazz, info.instance); + if (info.singleton) { + Singleton s = s_singletons.get(info.clazz); + if (s.state == Singleton.State.Instantiated) { + s_logger.info("Injecting singleton Manager: " + info.name); + inject(info.clazz, info.instance); + s.state = Singleton.State.Injected; + } + } else { + s_logger.info("Injecting Manager: " + info.name); + inject(info.clazz, info.instance); + } } for (Map.Entry> entry : entries) { ComponentInfo info = entry.getValue(); - s_logger.info("Configuring Manager: " + info.name); - try { - info.instance.configure(info.name, info.params); - } catch (ConfigurationException e) { - s_logger.error("Unable to configure manager: " + info.name, e); - System.exit(1); + if (info.singleton) { + Singleton s = s_singletons.get(info.clazz); + if (s.state == Singleton.State.Injected) { + s_logger.info("Configuring singleton Manager: " + info.name); + try { + info.instance.configure(info.name, info.params); + } catch (ConfigurationException e) { + s_logger.error("Unable to configure manager: " + info.name, e); + System.exit(1); + } + s.state = Singleton.State.Configured; + } + } else { + s_logger.info("Configuring Manager: " + info.name); + try { + info.instance.configure(info.name, info.params); + } catch (ConfigurationException e) { + s_logger.error("Unable to configure manager: " + info.name, e); + System.exit(1); + } } } } @@ -384,12 +392,16 @@ public class ComponentLocator extends Thread implements ComponentLocatorMBean { Class fc = field.getType(); Object instance = null; if (Manager.class.isAssignableFrom(fc)) { + s_logger.trace("Manager: " + fc.getName()); instance = locator.getManager(fc); } else if (GenericDao.class.isAssignableFrom(fc)) { - instance = locator.getDao((Class>)fc); + s_logger.trace("Dao:" + fc.getName()); + instance = locator.getDao((Class>)fc); } else if (Adapters.class.isAssignableFrom(fc)) { + s_logger.trace("Adapter" + fc.getName()); instance = locator.getAdapters(inject.adapter()); } else { + s_logger.trace("Other:" + fc.getName()); instance = locator.getManager(fc); } @@ -414,14 +426,29 @@ public class ComponentLocator extends Thread implements ComponentLocatorMBean { Set>> entries = _managerMap.entrySet(); for (Map.Entry> entry : entries) { ComponentInfo info = entry.getValue(); - s_logger.info("Starting Manager: " + info.name); - if (!info.instance.start()) { - throw new CloudRuntimeException("Incorrect Configuration: " + info.name); + if (info.singleton) { + Singleton s = s_singletons.get(info.clazz); + if (s.state == Singleton.State.Configured) { + s_logger.info("Starting singleton Manager: " + info.name); + if (!info.instance.start()) { + throw new CloudRuntimeException("Incorrect Configuration: " + info.name); + } + if (info.instance instanceof ManagementBean) { + registerMBean((ManagementBean) info.instance); + } + s_logger.info("Started Manager: " + info.name); + s.state = Singleton.State.Started; + } + } else { + s_logger.info("Starting Manager: " + info.name); + if (!info.instance.start()) { + throw new CloudRuntimeException("Incorrect Configuration: " + info.name); + } + if (info.instance instanceof ManagementBean) { + registerMBean((ManagementBean) info.instance); + } + s_logger.info("Started Manager: " + info.name); } - if (info.instance instanceof ManagementBean) { - registerMBean((ManagementBean) info.instance); - } - s_logger.info("Started Manager: " + info.name); } } @@ -468,19 +495,35 @@ public class ComponentLocator extends Thread implements ComponentLocatorMBean { } return (T)info.instance; } - - protected void instantiateAdapters(Map>> map) { - Set>>> entries = map.entrySet(); - for (Map.Entry>> entry : entries) { - Adapters adapters = (Adapters)_adapterMap.get(entry.getKey()); - List lst = new ArrayList(); - for (ComponentInfo info : entry.getValue()) { - s_logger.info("Instantiating Adapter: " + info.name); - info.instance = (Adapter)createInstance(info.clazz, true, info.singleton); + + protected void configureAdapters() { + for (Adapters adapters : _adapterMap.values()) { + List> infos = adapters._infos; + for (ComponentInfo info : infos) { try { - if (!info.instance.configure(info.name, info.params)) { - s_logger.error("Unable to configure adapter: " + info.name); - System.exit(1); + if (info.singleton) { + Singleton singleton = s_singletons.get(info.clazz); + if (singleton.state == Singleton.State.Instantiated) { + s_logger.info("Injecting singleton Adapter: " + info.getName()); + inject(info.clazz, info.instance); + singleton.state = Singleton.State.Injected; + } + if (singleton.state == Singleton.State.Injected) { + s_logger.info("Configuring singleton Adapter: " + info.getName()); + if (!info.instance.configure(info.name, info.params)) { + s_logger.error("Unable to configure adapter: " + info.name); + System.exit(1); + } + singleton.state = Singleton.State.Configured; + } + } else { + s_logger.info("Injecting Adapter: " + info.getName()); + inject(info.clazz, info.instance); + s_logger.info("Configuring singleton Adapter: " + info.getName()); + if (!info.instance.configure(info.name, info.params)) { + s_logger.error("Unable to configure adapter: " + info.name); + System.exit(1); + } } } catch (ConfigurationException e) { s_logger.error("Unable to configure adapter: " + info.name, e); @@ -489,32 +532,48 @@ public class ComponentLocator extends Thread implements ComponentLocatorMBean { s_logger.error("Unable to configure adapter: " + info.name, e); System.exit(1); } - lst.add(info.instance); - s_logger.info("Instantiated Adapter: " + info.name); - } - adapters.set(lst); + } } } - protected void createAdaptersMap(Map>> map) { + protected void instantiateAdapters(Map>> map) { Set>>> entries = map.entrySet(); for (Map.Entry>> entry : entries) { - List lst = new ArrayList(entry.getValue().size()); - _adapterMap.put(entry.getKey(), new Adapters(entry.getKey(), lst)); + for (ComponentInfo info : entry.getValue()) { + s_logger.info("Instantiating Adapter: " + info.name); + info.instance = (Adapter)createInstance(info.clazz, false, info.singleton); + } + Adapters adapters = new Adapters(entry.getKey(), entry.getValue()); + _adapterMap.put(entry.getKey(), adapters); } } protected void startAdapters() { for (Map.Entry> entry : _adapterMap.entrySet()) { - for (Adapter adapter : entry.getValue().get()) { - s_logger.info("Starting Adapter: " + adapter.getName()); - if (!adapter.start()) { - throw new CloudRuntimeException("Unable to start adapter: " + adapter.getName()); + for (ComponentInfo adapter : entry.getValue()._infos) { + if (adapter.singleton) { + Singleton s = s_singletons.get(adapter.clazz); + if (s.state == Singleton.State.Configured) { + s_logger.info("Starting singleton Adapter: " + adapter.getName()); + if (!adapter.instance.start()) { + throw new CloudRuntimeException("Unable to start adapter: " + adapter.getName()); + } + if (adapter.instance instanceof ManagementBean) { + registerMBean((ManagementBean)adapter.instance); + } + s_logger.info("Started Adapter: " + adapter.instance.getName()); + } + s.state = Singleton.State.Started; + } else { + s_logger.info("Starting Adapter: " + adapter.getName()); + if (!adapter.instance.start()) { + throw new CloudRuntimeException("Unable to start adapter: " + adapter.getName()); + } + if (adapter.instance instanceof ManagementBean) { + registerMBean((ManagementBean)adapter.instance); + } + s_logger.info("Started Adapter: " + adapter.instance.getName()); } - if (adapter instanceof ManagementBean) { - registerMBean((ManagementBean)adapter); - } - s_logger.info("Started Adapter: " + adapter.getName()); } } } @@ -589,10 +648,9 @@ public class ComponentLocator extends Thread implements ComponentLocatorMBean { return adapters; } } - return new Adapters(key, new ArrayList()); + return new Adapters(key, new ArrayList>()); } - static HashMap s_locators = new HashMap(); protected static ComponentLocator getLocatorInternal(String server, boolean setInThreadLocal, String configFileName, String log4jFile) { // init log4j based on the passed in configuration if (s_doOnce == false) { @@ -605,6 +663,7 @@ public class ComponentLocator extends Thread implements ComponentLocatorMBean { PropertyConfigurator.configureAndWatch(file.getAbsolutePath()); } } + Runtime.getRuntime().addShutdownHook(new CleanupThread()); s_doOnce = true; } @@ -669,6 +728,11 @@ public class ComponentLocator extends Thread implements ComponentLocatorMBean { this(name, clazz, new ArrayList>(0)); } + public ComponentInfo(String name, Class clazz, T instance) { + this(name, clazz); + this.instance = instance; + } + public ComponentInfo(String name, Class clazz, List> params) { this(name, clazz, params, true); } @@ -705,6 +769,10 @@ public class ComponentLocator extends Thread implements ComponentLocatorMBean { } } } + + public void addParameter(String name, String value) { + params.put(name, value); + } } /** @@ -723,7 +791,8 @@ public class ComponentLocator extends Thread implements ComponentLocatorMBean { StringBuilder value; String serverName; boolean parse; - ComponentInfo currentInfo; + ComponentInfo currentInfo; + Class componentClass; public XmlHandler(String serverName) { this.serverName = serverName; @@ -770,8 +839,10 @@ public class ComponentLocator extends Thread implements ComponentLocatorMBean { parent = getAttribute(atts, "extends"); String implementationClass = getAttribute(atts, "class"); - if (implementationClass != null) { - _implementationClassMap.put(_serverName, implementationClass); + try { + componentClass = Class.forName(implementationClass); + } catch (ClassNotFoundException e) { + throw new CloudRuntimeException("Unable to find " + implementationClass, e); } library = getAttribute(atts, "library"); @@ -860,4 +931,68 @@ public class ComponentLocator extends Thread implements ComponentLocatorMBean { this.enhancer = enhancer; } } + + protected static class CleanupThread extends Thread { + @Override + public synchronized void run() { + for (ComponentLocator locator : s_locators.values()) { + Iterator> itAdapters = locator._adapterMap.values().iterator(); + while (itAdapters.hasNext()) { + Adapters adapters = itAdapters.next(); + itAdapters.remove(); + for (ComponentInfo adapter : adapters._infos) { + if (adapter.singleton) { + Singleton singleton = s_singletons.get(adapter.clazz); + if (singleton.state == Singleton.State.Started) { + s_logger.info("Asking " + adapter.getName() + " to shutdown."); + adapter.instance.stop(); + singleton.state = Singleton.State.Stopped; + } else { + s_logger.debug("Skippng " + adapter.getName() + " because it has already stopped"); + } + } else { + s_logger.info("Asking " + adapter.getName() + " to shutdown."); + adapter.instance.stop(); + } + } + } + } + + for (ComponentLocator locator : s_locators.values()) { + Iterator> itManagers = locator._managerMap.values().iterator(); + while (itManagers.hasNext()) { + ComponentInfo manager = itManagers.next(); + itManagers.remove(); + if (manager.singleton == true) { + Singleton singleton = s_singletons.get(manager.clazz); + if (singleton.state == Singleton.State.Started) { + s_logger.info("Asking Manager " + manager.getName() + " to shutdown."); + manager.instance.stop(); + singleton.state = Singleton.State.Stopped; + } else { + s_logger.info("Skipping Manager " + manager.getName() + " because it is not in a state to shutdown."); + } + } + } + } + } + } + + static class Singleton { + public enum State { + Instantiated, + Injected, + Configured, + Started, + Stopped + } + + public Object singleton; + public State state; + + public Singleton(Object singleton) { + this.singleton = singleton; + this.state = State.Instantiated; + } + } }