From cf5d935d81eda3283f65a8dc55b4d177834e058d Mon Sep 17 00:00:00 2001 From: Kelven Yang Date: Wed, 9 Jan 2013 14:34:43 -0800 Subject: [PATCH 1/3] Seperate configurable components out and let them be loaded from Spring configuration file --- .../org/apache/cloudstack/api/BaseCmd.java | 14 ++++++ client/tomcatconf/applicationContext.xml.in | 10 +++- .../cloud/agent/manager/AgentManagerImpl.java | 1 - .../manager/ClusteredAgentManagerImpl.java | 2 - .../ha/HighAvailabilityManagerExtImpl.java | 7 --- .../cloud/ha/HighAvailabilityManagerImpl.java | 5 -- .../com/cloud/network/NetworkManagerImpl.java | 2 - .../PremiumSecondaryStorageManagerImpl.java | 2 - .../cloud/server/ManagementServerExtImpl.java | 5 -- .../cloud/server/ManagementServerImpl.java | 47 +++++++++---------- .../SecondaryStorageManagerImpl.java | 5 -- .../ClusteredVirtualMachineManagerImpl.java | 5 -- .../cloud/vm/VirtualMachineManagerImpl.java | 1 - .../utils/component/ComponentContext.java | 26 +++++++--- 14 files changed, 63 insertions(+), 69 deletions(-) diff --git a/api/src/org/apache/cloudstack/api/BaseCmd.java b/api/src/org/apache/cloudstack/api/BaseCmd.java index fbbee50b578..22918ab3ce8 100644 --- a/api/src/org/apache/cloudstack/api/BaseCmd.java +++ b/api/src/org/apache/cloudstack/api/BaseCmd.java @@ -165,6 +165,7 @@ public abstract class BaseCmd { _autoScaleService = locator.getManager(AutoScaleService.class); _ravService = locator.getManager(RemoteAccessVpnService.class); _responseGenerator = generator; +<<<<<<< HEAD _bareMetalVmService = locator.getManager(BareMetalVmService.class); _projectService = locator.getManager(ProjectService.class); _firewallService = locator.getManager(FirewallService.class); @@ -177,6 +178,19 @@ public abstract class BaseCmd { _networkACLService = locator.getManager(NetworkACLService.class); _s2sVpnService = locator.getManager(Site2SiteVpnService.class); _queryService = locator.getManager(QueryService.class); +======= + //_bareMetalVmService = ComponentContext.getCompanent(BareMetalVmService.class); + _projectService = ComponentContext.getCompanent(ProjectService.class); + _firewallService = ComponentContext.getCompanent(FirewallService.class); + _domainService = ComponentContext.getCompanent(DomainService.class); + _resourceLimitService = ComponentContext.getCompanent(ResourceLimitService.class); + _identityService = ComponentContext.getCompanent(IdentityService.class); + _storageNetworkService = ComponentContext.getCompanent(StorageNetworkService.class); + _taggedResourceService = ComponentContext.getCompanent(TaggedResourceService.class); + _vpcService = ComponentContext.getCompanent(VpcService.class); + _networkACLService = ComponentContext.getCompanent(NetworkACLService.class); + _s2sVpnService = ComponentContext.getCompanent(Site2SiteVpnService.class); +>>>>>>> Seperate configurable components out and let them be loaded from Spring configuration file } public abstract void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException; diff --git a/client/tomcatconf/applicationContext.xml.in b/client/tomcatconf/applicationContext.xml.in index 07c9aeef873..ea671643a0d 100644 --- a/client/tomcatconf/applicationContext.xml.in +++ b/client/tomcatconf/applicationContext.xml.in @@ -58,6 +58,14 @@ + + - + + + + + diff --git a/server/src/com/cloud/agent/manager/AgentManagerImpl.java b/server/src/com/cloud/agent/manager/AgentManagerImpl.java index ee5971f51c7..8b458955b1b 100755 --- a/server/src/com/cloud/agent/manager/AgentManagerImpl.java +++ b/server/src/com/cloud/agent/manager/AgentManagerImpl.java @@ -139,7 +139,6 @@ import edu.emory.mathcs.backport.java.util.Collections; * ping.interval before announcing an agent has timed out | float | 2.0x || || router.stats.interval | interval to * report router statistics | seconds | 300s || * } **/ -@Component @Local(value = { AgentManager.class }) public class AgentManagerImpl implements AgentManager, HandlerFactory, Manager { private static final Logger s_logger = Logger.getLogger(AgentManagerImpl.class); diff --git a/server/src/com/cloud/agent/manager/ClusteredAgentManagerImpl.java b/server/src/com/cloud/agent/manager/ClusteredAgentManagerImpl.java index 6753b280961..35aa8843ea8 100755 --- a/server/src/com/cloud/agent/manager/ClusteredAgentManagerImpl.java +++ b/server/src/com/cloud/agent/manager/ClusteredAgentManagerImpl.java @@ -91,8 +91,6 @@ import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.utils.nio.Link; import com.cloud.utils.nio.Task; -@Component -@Primary @Local(value = { AgentManager.class, ClusteredAgentRebalanceService.class }) public class ClusteredAgentManagerImpl extends AgentManagerImpl implements ClusterManagerListener, ClusteredAgentRebalanceService { final static Logger s_logger = Logger.getLogger(ClusteredAgentManagerImpl.class); diff --git a/server/src/com/cloud/ha/HighAvailabilityManagerExtImpl.java b/server/src/com/cloud/ha/HighAvailabilityManagerExtImpl.java index 442cb911aa0..116f6114c03 100644 --- a/server/src/com/cloud/ha/HighAvailabilityManagerExtImpl.java +++ b/server/src/com/cloud/ha/HighAvailabilityManagerExtImpl.java @@ -24,18 +24,11 @@ import javax.ejb.Local; import javax.inject.Inject; import javax.naming.ConfigurationException; -import org.springframework.context.annotation.Primary; -import org.springframework.stereotype.Component; - import com.cloud.alert.AlertManager; import com.cloud.configuration.dao.ConfigurationDao; -import com.cloud.server.ManagementServer; import com.cloud.usage.dao.UsageJobDao; -import com.cloud.utils.component.ComponentLocator; import com.cloud.utils.db.Transaction; -@Component -@Primary @Local(value={HighAvailabilityManager.class}) public class HighAvailabilityManagerExtImpl extends HighAvailabilityManagerImpl { diff --git a/server/src/com/cloud/ha/HighAvailabilityManagerImpl.java b/server/src/com/cloud/ha/HighAvailabilityManagerImpl.java index 072d23788d8..58f428b7795 100755 --- a/server/src/com/cloud/ha/HighAvailabilityManagerImpl.java +++ b/server/src/com/cloud/ha/HighAvailabilityManagerImpl.java @@ -18,7 +18,6 @@ package com.cloud.ha; import java.util.ArrayList; import java.util.Date; -import java.util.Enumeration; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -32,7 +31,6 @@ import javax.naming.ConfigurationException; import org.apache.log4j.Logger; import org.apache.log4j.NDC; -import org.springframework.stereotype.Component; import com.cloud.agent.AgentManager; import com.cloud.alert.AlertManager; @@ -66,8 +64,6 @@ import com.cloud.storage.dao.GuestOSCategoryDao; import com.cloud.storage.dao.GuestOSDao; import com.cloud.user.AccountManager; import com.cloud.utils.NumbersUtil; -import com.cloud.utils.component.Adapters; -import com.cloud.utils.component.ComponentLocator; import com.cloud.utils.concurrency.NamedThreadFactory; import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.vm.VMInstanceVO; @@ -99,7 +95,6 @@ import com.cloud.vm.dao.VMInstanceDao; * ha.retry.wait | time to wait before retrying the work item | seconds | 120 || || stop.retry.wait | time to wait * before retrying the stop | seconds | 120 || * } **/ -@Component @Local(value = { HighAvailabilityManager.class }) public class HighAvailabilityManagerImpl implements HighAvailabilityManager, ClusterManagerListener { protected static final Logger s_logger = Logger.getLogger(HighAvailabilityManagerImpl.class); diff --git a/server/src/com/cloud/network/NetworkManagerImpl.java b/server/src/com/cloud/network/NetworkManagerImpl.java index 5b8109ff6db..68ddbc0b89f 100755 --- a/server/src/com/cloud/network/NetworkManagerImpl.java +++ b/server/src/com/cloud/network/NetworkManagerImpl.java @@ -46,7 +46,6 @@ import org.apache.cloudstack.api.command.admin.usage.ListTrafficTypeImplementors import org.apache.cloudstack.api.command.user.network.CreateNetworkCmd; import org.apache.cloudstack.api.command.user.network.RestartNetworkCmd; import org.apache.log4j.Logger; -import org.springframework.stereotype.Component; import org.apache.cloudstack.acl.ControlledEntity.ACLType; import org.apache.cloudstack.acl.SecurityChecker.AccessType; @@ -174,7 +173,6 @@ import java.util.*; /** * NetworkManagerImpl implements NetworkManager. */ -@Component @Local(value = { NetworkManager.class, NetworkService.class }) public class NetworkManagerImpl implements NetworkManager, NetworkService, Manager, Listener { private static final Logger s_logger = Logger.getLogger(NetworkManagerImpl.class); diff --git a/server/src/com/cloud/secstorage/PremiumSecondaryStorageManagerImpl.java b/server/src/com/cloud/secstorage/PremiumSecondaryStorageManagerImpl.java index d4f44541c85..73015c11464 100755 --- a/server/src/com/cloud/secstorage/PremiumSecondaryStorageManagerImpl.java +++ b/server/src/com/cloud/secstorage/PremiumSecondaryStorageManagerImpl.java @@ -49,8 +49,6 @@ import com.cloud.vm.SystemVmLoadScanner.AfterScanAction; import com.cloud.vm.VirtualMachine.State; import com.cloud.vm.dao.SecondaryStorageVmDao; -@Component -@Primary @Local(value = { SecondaryStorageVmManager.class }) public class PremiumSecondaryStorageManagerImpl extends SecondaryStorageManagerImpl { private static final Logger s_logger = Logger.getLogger(PremiumSecondaryStorageManagerImpl.class); diff --git a/server/src/com/cloud/server/ManagementServerExtImpl.java b/server/src/com/cloud/server/ManagementServerExtImpl.java index 5ab6d037d3c..5ec75f193fb 100644 --- a/server/src/com/cloud/server/ManagementServerExtImpl.java +++ b/server/src/com/cloud/server/ManagementServerExtImpl.java @@ -26,9 +26,6 @@ import java.util.TimeZone; import javax.annotation.PostConstruct; import javax.inject.Inject; -import org.springframework.context.annotation.Primary; -import org.springframework.stereotype.Component; - import com.cloud.api.commands.GenerateUsageRecordsCmd; import com.cloud.api.commands.GetUsageRecordsCmd; import com.cloud.domain.dao.DomainDao; @@ -49,8 +46,6 @@ import com.cloud.utils.db.Filter; import com.cloud.utils.db.SearchCriteria; import com.cloud.utils.db.Transaction; -@Component -@Primary public class ManagementServerExtImpl extends ManagementServerImpl implements ManagementServerExt { @Inject private AccountDao _accountDao; @Inject private DomainDao _domainDao; diff --git a/server/src/com/cloud/server/ManagementServerImpl.java b/server/src/com/cloud/server/ManagementServerImpl.java index 33153c361c1..95d96d09cc2 100755 --- a/server/src/com/cloud/server/ManagementServerImpl.java +++ b/server/src/com/cloud/server/ManagementServerImpl.java @@ -266,7 +266,6 @@ import com.cloud.vm.dao.VMInstanceDao; import edu.emory.mathcs.backport.java.util.Arrays; import edu.emory.mathcs.backport.java.util.Collections; -@Component public class ManagementServerImpl implements ManagementServer { public static final Logger s_logger = Logger.getLogger(ManagementServerImpl.class.getName()); @@ -463,20 +462,15 @@ public class ManagementServerImpl implements ManagementServer { } private void startManagers() { - @SuppressWarnings("rawtypes") - Map managers = ComponentContext.getApplicationContext().getBeansOfType( - Manager.class); - - Map params = new HashMap(); - for (Manager manager : managers.values()) { - s_logger.info("Start manager: " + ComponentContext.getTargetClass(manager).getName() + "..."); - try { - if (!ComponentContext.isPrimary(manager, Manager.class)) { - s_logger.error("Skip manager:" + ComponentContext.getTargetClass(manager).getName() + " as there are multiple matches"); - continue; - } - - if (!manager.configure(manager.getClass().getSimpleName(), params)) { + @SuppressWarnings("rawtypes") + Map managers = ComponentContext.getApplicationContext().getBeansOfType( + Manager.class); + + Map params = new HashMap(); + for(Manager manager : managers.values()) { + s_logger.info("Start manager: " + ComponentContext.getTargetClass(manager).getName() + "..."); + try { + if(!manager.configure(manager.getClass().getSimpleName(), params)) { throw new CloudRuntimeException("Failed to start manager: " + ComponentContext.getTargetClass(manager).getName()); } @@ -495,17 +489,18 @@ public class ManagementServerImpl implements ManagementServer { } private void startAdapters() { - @SuppressWarnings("rawtypes") - Map adapters = ComponentContext.getApplicationContext().getBeansOfType( - Adapter.class); - - Map params = new HashMap(); - for (Adapter adapter : adapters.values()) { - try { - if (!ComponentContext.isPrimary(adapter, Adapter.class)) - continue; - - if (!adapter.configure(adapter.getClass().getSimpleName(), params)) { + @SuppressWarnings("rawtypes") + Map adapters = ComponentContext.getApplicationContext().getBeansOfType( + Adapter.class); + + Map params = new HashMap(); + for(Adapter adapter : adapters.values()) { + try { + // we also skip Adapter class that is both a manager class and a adapter class + if(Manager.class.isAssignableFrom(ComponentContext.getTargetClass(adapter))) + continue; + + if(!adapter.configure(adapter.getClass().getSimpleName(), params)) { throw new CloudRuntimeException("Failed to start adapter: " + ComponentContext.getTargetClass(adapter).getName()); } if (!adapter.start()) { diff --git a/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java b/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java index 6afcf32d6ab..8638cf40932 100755 --- a/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java +++ b/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java @@ -21,7 +21,6 @@ import java.net.URISyntaxException; import java.util.ArrayList; import java.util.Collections; import java.util.Date; -import java.util.Enumeration; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -31,7 +30,6 @@ import javax.inject.Inject; import javax.naming.ConfigurationException; import org.apache.log4j.Logger; -import org.springframework.stereotype.Component; import com.cloud.agent.AgentManager; import com.cloud.agent.api.Answer; @@ -112,8 +110,6 @@ import com.cloud.user.UserContext; import com.cloud.utils.DateUtil; import com.cloud.utils.NumbersUtil; import com.cloud.utils.Pair; -import com.cloud.utils.component.Adapters; -import com.cloud.utils.component.ComponentLocator; import com.cloud.utils.db.GlobalLock; import com.cloud.utils.db.SearchCriteria.Op; import com.cloud.utils.db.SearchCriteria2; @@ -157,7 +153,6 @@ import com.cloud.vm.dao.VMInstanceDao; // Starting, HA, Migrating, Creating and Running state are all counted as "Open" for available capacity calculation // because sooner or later, it will be driven into Running state // -@Component @Local(value = { SecondaryStorageVmManager.class }) public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, VirtualMachineGuru, SystemVmLoadScanHandler, ResourceStateAdapter { private static final Logger s_logger = Logger.getLogger(SecondaryStorageManagerImpl.class); diff --git a/server/src/com/cloud/vm/ClusteredVirtualMachineManagerImpl.java b/server/src/com/cloud/vm/ClusteredVirtualMachineManagerImpl.java index 96c7446f8fd..dc51eab4fc7 100644 --- a/server/src/com/cloud/vm/ClusteredVirtualMachineManagerImpl.java +++ b/server/src/com/cloud/vm/ClusteredVirtualMachineManagerImpl.java @@ -22,14 +22,9 @@ import java.util.Map; import javax.ejb.Local; import javax.naming.ConfigurationException; -import org.springframework.context.annotation.Primary; -import org.springframework.stereotype.Component; - import com.cloud.cluster.ClusterManagerListener; import com.cloud.cluster.ManagementServerHostVO; -@Component -@Primary @Local(value=VirtualMachineManager.class) public class ClusteredVirtualMachineManagerImpl extends VirtualMachineManagerImpl implements ClusterManagerListener { diff --git a/server/src/com/cloud/vm/VirtualMachineManagerImpl.java b/server/src/com/cloud/vm/VirtualMachineManagerImpl.java index 2897a63afed..0b1e2da27da 100755 --- a/server/src/com/cloud/vm/VirtualMachineManagerImpl.java +++ b/server/src/com/cloud/vm/VirtualMachineManagerImpl.java @@ -158,7 +158,6 @@ import com.cloud.vm.dao.SecondaryStorageVmDao; import com.cloud.vm.dao.UserVmDao; import com.cloud.vm.dao.VMInstanceDao; -@Component @Local(value = VirtualMachineManager.class) public class VirtualMachineManagerImpl implements VirtualMachineManager, Listener { private static final Logger s_logger = Logger.getLogger(VirtualMachineManagerImpl.class); diff --git a/utils/src/com/cloud/utils/component/ComponentContext.java b/utils/src/com/cloud/utils/component/ComponentContext.java index ce464232417..ab049ee1a83 100644 --- a/utils/src/com/cloud/utils/component/ComponentContext.java +++ b/utils/src/com/cloud/utils/component/ComponentContext.java @@ -67,16 +67,22 @@ public class ComponentContext implements ApplicationContextAware { Map matchedTypes = getComponentsOfType(beanType); if(matchedTypes.size() > 0) { for(Map.Entry entry : matchedTypes.entrySet()) { - Primary primary = getTargetClass(entry).getAnnotation(Primary.class); + Primary primary = getTargetClass(entry.getValue()).getAnnotation(Primary.class); if(primary != null) return entry.getValue(); } - s_logger.warn("Unable to uniquely locate bean type " + beanType.getName()); + if(matchedTypes.size() > 1) { + s_logger.warn("Unable to uniquely locate bean type " + beanType.getName()); + for(Map.Entry entry : matchedTypes.entrySet()) { + s_logger.warn("Candidate " + getTargetClass(entry.getValue()).getName()); + } + } + return (T)matchedTypes.values().toArray()[0]; } } - throw new NoSuchBeanDefinitionException("Unable to resolve bean type " + beanType.getName()); + throw new NoSuchBeanDefinitionException(beanType.getName()); } public static Map getComponentsOfType(Class beanType) { @@ -84,13 +90,13 @@ public class ComponentContext implements ApplicationContextAware { } public static boolean isPrimary(Object instance, Class beanType) { - // we assume single line of interface inheritance of beanType Class componentType = beanType; Class targetClass = getTargetClass(instance); + Class interfaces[] = targetClass.getInterfaces(); for(Class intf : interfaces) { - if(beanType.isAssignableFrom(intf)) { + if(beanType.isAssignableFrom(intf) && intf != beanType) { componentType = intf; break; } @@ -99,9 +105,15 @@ public class ComponentContext implements ApplicationContextAware { Map matchedTypes = (Map)ComponentContext.getComponentsOfType(componentType); if(matchedTypes.size() > 1) { Primary primary = targetClass.getAnnotation(Primary.class); - if(primary != null) + if(primary != null) { + s_logger.info(targetClass.getName() + " is the primary component of " + componentType.getName()); return true; - + } + + s_logger.warn(targetClass.getName() + " is not the primary component of " + componentType.getName() + ", there are other candidates"); + for(T candidate : matchedTypes.values()) { + s_logger.warn("Candidate " + getTargetClass(candidate).getName()); + } return false; } From 0bcebd33b6032d392f46568203f3c2104723dda9 Mon Sep 17 00:00:00 2001 From: Kelven Yang Date: Wed, 9 Jan 2013 17:36:53 -0800 Subject: [PATCH 2/3] Fix problems after merge --- api/src/org/apache/cloudstack/api/BaseCmd.java | 14 -------------- client/tomcatconf/applicationContext.xml.in | 11 ----------- .../dao/NiciraNvpRouterMappingDaoImpl.java | 3 +++ .../network/guru/NiciraNvpGuestNetworkGuru.java | 2 ++ server/src/com/cloud/acl/DomainChecker.java | 1 + .../com/cloud/agent/manager/AgentManagerImpl.java | 1 + .../agent/manager/ClusteredAgentManagerImpl.java | 2 ++ .../cloud/api/query/dao/AccountJoinDaoImpl.java | 4 +++- .../cloud/api/query/dao/AsyncJobJoinDaoImpl.java | 4 +++- .../api/query/dao/DomainRouterJoinDaoImpl.java | 4 +++- .../com/cloud/api/query/dao/HostJoinDaoImpl.java | 4 +++- .../api/query/dao/InstanceGroupJoinDaoImpl.java | 2 ++ .../api/query/dao/ProjectAccountJoinDaoImpl.java | 2 ++ .../query/dao/ProjectInvitationJoinDaoImpl.java | 2 ++ .../cloud/api/query/dao/ProjectJoinDaoImpl.java | 3 +++ .../api/query/dao/ResourceTagJoinDaoImpl.java | 4 +++- .../api/query/dao/SecurityGroupJoinDaoImpl.java | 3 +++ .../api/query/dao/StoragePoolJoinDaoImpl.java | 2 ++ .../api/query/dao/UserAccountJoinDaoImpl.java | 2 ++ .../cloud/api/query/dao/UserVmJoinDaoImpl.java | 4 +++- .../cloud/api/query/dao/VolumeJoinDaoImpl.java | 2 ++ .../src/com/cloud/async/SyncQueueManagerImpl.java | 2 +- .../cloud/ha/HighAvailabilityManagerExtImpl.java | 5 +++++ .../com/cloud/ha/HighAvailabilityManagerImpl.java | 2 ++ .../src/com/cloud/network/NetworkManagerImpl.java | 15 +++------------ .../cloud/network/as/AutoScaleManagerImpl.java | 3 +++ .../dao/AutoScalePolicyConditionMapDaoImpl.java | 5 ++++- .../network/as/dao/AutoScalePolicyDaoImpl.java | 5 ++++- .../network/as/dao/AutoScaleVmGroupDaoImpl.java | 5 ++++- .../as/dao/AutoScaleVmGroupPolicyMapDaoImpl.java | 5 ++++- .../network/as/dao/AutoScaleVmProfileDaoImpl.java | 5 ++++- .../cloud/network/as/dao/ConditionDaoImpl.java | 3 +++ .../com/cloud/network/as/dao/CounterDaoImpl.java | 3 +++ .../src/com/cloud/network/dao/NetworkDaoImpl.java | 13 +++++++------ .../PremiumSecondaryStorageManagerImpl.java | 2 ++ .../com/cloud/server/ManagementServerExtImpl.java | 3 +++ .../com/cloud/server/ManagementServerImpl.java | 4 ++-- server/src/com/cloud/storage/dao/S3DaoImpl.java | 3 +++ .../cloud/storage/dao/VMTemplateS3DaoImpl.java | 4 ++++ .../src/com/cloud/storage/s3/S3ManagerImpl.java | 3 +++ .../secondary/SecondaryStorageManagerImpl.java | 12 ++++++++---- .../vm/ClusteredVirtualMachineManagerImpl.java | 5 +++++ server/src/com/cloud/vm/UserVmManagerImpl.java | 2 ++ .../com/cloud/vm/VirtualMachineManagerImpl.java | 1 + 44 files changed, 125 insertions(+), 61 deletions(-) diff --git a/api/src/org/apache/cloudstack/api/BaseCmd.java b/api/src/org/apache/cloudstack/api/BaseCmd.java index 22918ab3ce8..fbbee50b578 100644 --- a/api/src/org/apache/cloudstack/api/BaseCmd.java +++ b/api/src/org/apache/cloudstack/api/BaseCmd.java @@ -165,7 +165,6 @@ public abstract class BaseCmd { _autoScaleService = locator.getManager(AutoScaleService.class); _ravService = locator.getManager(RemoteAccessVpnService.class); _responseGenerator = generator; -<<<<<<< HEAD _bareMetalVmService = locator.getManager(BareMetalVmService.class); _projectService = locator.getManager(ProjectService.class); _firewallService = locator.getManager(FirewallService.class); @@ -178,19 +177,6 @@ public abstract class BaseCmd { _networkACLService = locator.getManager(NetworkACLService.class); _s2sVpnService = locator.getManager(Site2SiteVpnService.class); _queryService = locator.getManager(QueryService.class); -======= - //_bareMetalVmService = ComponentContext.getCompanent(BareMetalVmService.class); - _projectService = ComponentContext.getCompanent(ProjectService.class); - _firewallService = ComponentContext.getCompanent(FirewallService.class); - _domainService = ComponentContext.getCompanent(DomainService.class); - _resourceLimitService = ComponentContext.getCompanent(ResourceLimitService.class); - _identityService = ComponentContext.getCompanent(IdentityService.class); - _storageNetworkService = ComponentContext.getCompanent(StorageNetworkService.class); - _taggedResourceService = ComponentContext.getCompanent(TaggedResourceService.class); - _vpcService = ComponentContext.getCompanent(VpcService.class); - _networkACLService = ComponentContext.getCompanent(NetworkACLService.class); - _s2sVpnService = ComponentContext.getCompanent(Site2SiteVpnService.class); ->>>>>>> Seperate configurable components out and let them be loaded from Spring configuration file } public abstract void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException; diff --git a/client/tomcatconf/applicationContext.xml.in b/client/tomcatconf/applicationContext.xml.in index ea671643a0d..aabf9636d95 100644 --- a/client/tomcatconf/applicationContext.xml.in +++ b/client/tomcatconf/applicationContext.xml.in @@ -13,7 +13,6 @@ http://www.springframework.org/schema/context/spring-context-3.0.xsd"> - - - - - - - - diff --git a/plugins/network-elements/nicira-nvp/src/com/cloud/network/dao/NiciraNvpRouterMappingDaoImpl.java b/plugins/network-elements/nicira-nvp/src/com/cloud/network/dao/NiciraNvpRouterMappingDaoImpl.java index 091207c8896..d3192ec723f 100644 --- a/plugins/network-elements/nicira-nvp/src/com/cloud/network/dao/NiciraNvpRouterMappingDaoImpl.java +++ b/plugins/network-elements/nicira-nvp/src/com/cloud/network/dao/NiciraNvpRouterMappingDaoImpl.java @@ -18,12 +18,15 @@ package com.cloud.network.dao; import javax.ejb.Local; +import org.springframework.stereotype.Component; + import com.cloud.network.NiciraNvpRouterMappingVO; import com.cloud.utils.db.GenericDaoBase; import com.cloud.utils.db.SearchBuilder; import com.cloud.utils.db.SearchCriteria; import com.cloud.utils.db.SearchCriteria.Op; +@Component @Local(value=NiciraNvpRouterMappingDao.class) public class NiciraNvpRouterMappingDaoImpl extends GenericDaoBase implements NiciraNvpRouterMappingDao { diff --git a/plugins/network-elements/nicira-nvp/src/com/cloud/network/guru/NiciraNvpGuestNetworkGuru.java b/plugins/network-elements/nicira-nvp/src/com/cloud/network/guru/NiciraNvpGuestNetworkGuru.java index 4c1bee17c17..fa0667b02d3 100644 --- a/plugins/network-elements/nicira-nvp/src/com/cloud/network/guru/NiciraNvpGuestNetworkGuru.java +++ b/plugins/network-elements/nicira-nvp/src/com/cloud/network/guru/NiciraNvpGuestNetworkGuru.java @@ -24,6 +24,7 @@ import javax.ejb.Local; import javax.inject.Inject; import org.apache.log4j.Logger; +import org.springframework.stereotype.Component; import com.cloud.agent.AgentManager; import com.cloud.agent.api.CreateLogicalSwitchAnswer; @@ -66,6 +67,7 @@ import com.cloud.vm.ReservationContext; import com.cloud.vm.VirtualMachine; import com.cloud.vm.VirtualMachineProfile; +@Component @Local(value=NetworkGuru.class) public class NiciraNvpGuestNetworkGuru extends GuestNetworkGuru { private static final Logger s_logger = Logger.getLogger(NiciraNvpGuestNetworkGuru.class); diff --git a/server/src/com/cloud/acl/DomainChecker.java b/server/src/com/cloud/acl/DomainChecker.java index 40564fe2904..6166c1155ff 100755 --- a/server/src/com/cloud/acl/DomainChecker.java +++ b/server/src/com/cloud/acl/DomainChecker.java @@ -42,6 +42,7 @@ import com.cloud.user.User; import com.cloud.user.dao.AccountDao; import com.cloud.utils.component.AdapterBase; +@Component @Local(value = SecurityChecker.class) public class DomainChecker extends AdapterBase implements SecurityChecker { diff --git a/server/src/com/cloud/agent/manager/AgentManagerImpl.java b/server/src/com/cloud/agent/manager/AgentManagerImpl.java index 8b458955b1b..ee5971f51c7 100755 --- a/server/src/com/cloud/agent/manager/AgentManagerImpl.java +++ b/server/src/com/cloud/agent/manager/AgentManagerImpl.java @@ -139,6 +139,7 @@ import edu.emory.mathcs.backport.java.util.Collections; * ping.interval before announcing an agent has timed out | float | 2.0x || || router.stats.interval | interval to * report router statistics | seconds | 300s || * } **/ +@Component @Local(value = { AgentManager.class }) public class AgentManagerImpl implements AgentManager, HandlerFactory, Manager { private static final Logger s_logger = Logger.getLogger(AgentManagerImpl.class); diff --git a/server/src/com/cloud/agent/manager/ClusteredAgentManagerImpl.java b/server/src/com/cloud/agent/manager/ClusteredAgentManagerImpl.java index 35aa8843ea8..6753b280961 100755 --- a/server/src/com/cloud/agent/manager/ClusteredAgentManagerImpl.java +++ b/server/src/com/cloud/agent/manager/ClusteredAgentManagerImpl.java @@ -91,6 +91,8 @@ import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.utils.nio.Link; import com.cloud.utils.nio.Task; +@Component +@Primary @Local(value = { AgentManager.class, ClusteredAgentRebalanceService.class }) public class ClusteredAgentManagerImpl extends AgentManagerImpl implements ClusterManagerListener, ClusteredAgentRebalanceService { final static Logger s_logger = Logger.getLogger(ClusteredAgentManagerImpl.class); diff --git a/server/src/com/cloud/api/query/dao/AccountJoinDaoImpl.java b/server/src/com/cloud/api/query/dao/AccountJoinDaoImpl.java index 626872447e7..22b807c9d40 100644 --- a/server/src/com/cloud/api/query/dao/AccountJoinDaoImpl.java +++ b/server/src/com/cloud/api/query/dao/AccountJoinDaoImpl.java @@ -29,12 +29,14 @@ import com.cloud.api.query.vo.UserAccountJoinVO; import com.cloud.configuration.Resource.ResourceType; import org.apache.cloudstack.api.response.AccountResponse; import org.apache.cloudstack.api.response.UserResponse; +import org.springframework.stereotype.Component; + import com.cloud.user.Account; import com.cloud.utils.db.GenericDaoBase; import com.cloud.utils.db.SearchBuilder; import com.cloud.utils.db.SearchCriteria; - +@Component @Local(value={AccountJoinDao.class}) public class AccountJoinDaoImpl extends GenericDaoBase implements AccountJoinDao { public static final Logger s_logger = Logger.getLogger(AccountJoinDaoImpl.class); diff --git a/server/src/com/cloud/api/query/dao/AsyncJobJoinDaoImpl.java b/server/src/com/cloud/api/query/dao/AsyncJobJoinDaoImpl.java index bf1d15c4205..fb5695bebbb 100644 --- a/server/src/com/cloud/api/query/dao/AsyncJobJoinDaoImpl.java +++ b/server/src/com/cloud/api/query/dao/AsyncJobJoinDaoImpl.java @@ -29,11 +29,13 @@ import com.cloud.api.query.vo.AsyncJobJoinVO; import com.cloud.async.AsyncJob; import org.apache.cloudstack.api.ResponseObject; import org.apache.cloudstack.api.response.AsyncJobResponse; +import org.springframework.stereotype.Component; + import com.cloud.utils.db.GenericDaoBase; import com.cloud.utils.db.SearchBuilder; import com.cloud.utils.db.SearchCriteria; - +@Component @Local(value={AsyncJobJoinDao.class}) public class AsyncJobJoinDaoImpl extends GenericDaoBase implements AsyncJobJoinDao { public static final Logger s_logger = Logger.getLogger(AsyncJobJoinDaoImpl.class); diff --git a/server/src/com/cloud/api/query/dao/DomainRouterJoinDaoImpl.java b/server/src/com/cloud/api/query/dao/DomainRouterJoinDaoImpl.java index 94736cd7f90..cdfac3a8247 100644 --- a/server/src/com/cloud/api/query/dao/DomainRouterJoinDaoImpl.java +++ b/server/src/com/cloud/api/query/dao/DomainRouterJoinDaoImpl.java @@ -29,6 +29,8 @@ import com.cloud.configuration.dao.ConfigurationDao; import org.apache.cloudstack.api.response.DomainRouterResponse; import org.apache.cloudstack.api.response.NicResponse; +import org.springframework.stereotype.Component; + import com.cloud.network.Networks.TrafficType; import com.cloud.network.router.VirtualRouter; import com.cloud.user.Account; @@ -37,7 +39,7 @@ import com.cloud.utils.db.GenericDaoBase; import com.cloud.utils.db.SearchBuilder; import com.cloud.utils.db.SearchCriteria; - +@Component @Local(value={DomainRouterJoinDao.class}) public class DomainRouterJoinDaoImpl extends GenericDaoBase implements DomainRouterJoinDao { public static final Logger s_logger = Logger.getLogger(DomainRouterJoinDaoImpl.class); diff --git a/server/src/com/cloud/api/query/dao/HostJoinDaoImpl.java b/server/src/com/cloud/api/query/dao/HostJoinDaoImpl.java index e8423836004..9a7ba468227 100644 --- a/server/src/com/cloud/api/query/dao/HostJoinDaoImpl.java +++ b/server/src/com/cloud/api/query/dao/HostJoinDaoImpl.java @@ -36,13 +36,15 @@ import com.cloud.host.HostStats; import org.apache.cloudstack.api.ApiConstants.HostDetails; import org.apache.cloudstack.api.response.HostResponse; +import org.springframework.stereotype.Component; + import com.cloud.storage.StorageStats; import com.cloud.utils.component.Inject; import com.cloud.utils.db.GenericDaoBase; import com.cloud.utils.db.SearchBuilder; import com.cloud.utils.db.SearchCriteria; - +@Component @Local(value={HostJoinDao.class}) public class HostJoinDaoImpl extends GenericDaoBase implements HostJoinDao { public static final Logger s_logger = Logger.getLogger(HostJoinDaoImpl.class); diff --git a/server/src/com/cloud/api/query/dao/InstanceGroupJoinDaoImpl.java b/server/src/com/cloud/api/query/dao/InstanceGroupJoinDaoImpl.java index f83ef6cd8fd..b8404591581 100644 --- a/server/src/com/cloud/api/query/dao/InstanceGroupJoinDaoImpl.java +++ b/server/src/com/cloud/api/query/dao/InstanceGroupJoinDaoImpl.java @@ -26,6 +26,7 @@ import com.cloud.api.ApiResponseHelper; import com.cloud.api.query.vo.InstanceGroupJoinVO; import org.apache.cloudstack.api.response.InstanceGroupResponse; +import org.springframework.stereotype.Component; import com.cloud.utils.db.GenericDaoBase; import com.cloud.utils.db.SearchBuilder; @@ -33,6 +34,7 @@ import com.cloud.utils.db.SearchCriteria; import com.cloud.vm.InstanceGroup; +@Component @Local(value={InstanceGroupJoinDao.class}) public class InstanceGroupJoinDaoImpl extends GenericDaoBase implements InstanceGroupJoinDao { public static final Logger s_logger = Logger.getLogger(InstanceGroupJoinDaoImpl.class); diff --git a/server/src/com/cloud/api/query/dao/ProjectAccountJoinDaoImpl.java b/server/src/com/cloud/api/query/dao/ProjectAccountJoinDaoImpl.java index f808da0c5f1..1fb92236e24 100644 --- a/server/src/com/cloud/api/query/dao/ProjectAccountJoinDaoImpl.java +++ b/server/src/com/cloud/api/query/dao/ProjectAccountJoinDaoImpl.java @@ -23,6 +23,7 @@ import javax.ejb.Local; import org.apache.log4j.Logger; import org.apache.cloudstack.api.response.ProjectAccountResponse; +import org.springframework.stereotype.Component; import com.cloud.api.query.vo.ProjectAccountJoinVO; import com.cloud.projects.ProjectAccount; @@ -30,6 +31,7 @@ import com.cloud.utils.db.GenericDaoBase; import com.cloud.utils.db.SearchBuilder; import com.cloud.utils.db.SearchCriteria; +@Component @Local(value={ProjectAccountJoinDao.class}) public class ProjectAccountJoinDaoImpl extends GenericDaoBase implements ProjectAccountJoinDao { public static final Logger s_logger = Logger.getLogger(ProjectAccountJoinDaoImpl.class); diff --git a/server/src/com/cloud/api/query/dao/ProjectInvitationJoinDaoImpl.java b/server/src/com/cloud/api/query/dao/ProjectInvitationJoinDaoImpl.java index ebf64d1ce55..ca0f171dd1a 100644 --- a/server/src/com/cloud/api/query/dao/ProjectInvitationJoinDaoImpl.java +++ b/server/src/com/cloud/api/query/dao/ProjectInvitationJoinDaoImpl.java @@ -23,6 +23,7 @@ import javax.ejb.Local; import org.apache.log4j.Logger; import org.apache.cloudstack.api.response.ProjectInvitationResponse; +import org.springframework.stereotype.Component; import com.cloud.api.query.vo.ProjectInvitationJoinVO; import com.cloud.projects.ProjectInvitation; @@ -30,6 +31,7 @@ import com.cloud.utils.db.GenericDaoBase; import com.cloud.utils.db.SearchBuilder; import com.cloud.utils.db.SearchCriteria; +@Component @Local(value={ProjectInvitationJoinDao.class}) public class ProjectInvitationJoinDaoImpl extends GenericDaoBase implements ProjectInvitationJoinDao { public static final Logger s_logger = Logger.getLogger(ProjectInvitationJoinDaoImpl.class); diff --git a/server/src/com/cloud/api/query/dao/ProjectJoinDaoImpl.java b/server/src/com/cloud/api/query/dao/ProjectJoinDaoImpl.java index 15bff3677fe..77f930343bf 100644 --- a/server/src/com/cloud/api/query/dao/ProjectJoinDaoImpl.java +++ b/server/src/com/cloud/api/query/dao/ProjectJoinDaoImpl.java @@ -29,12 +29,15 @@ import com.cloud.api.query.vo.ResourceTagJoinVO; import com.cloud.configuration.dao.ConfigurationDao; import org.apache.cloudstack.api.response.ProjectResponse; +import org.springframework.stereotype.Component; + import com.cloud.projects.Project; import com.cloud.utils.component.Inject; import com.cloud.utils.db.GenericDaoBase; import com.cloud.utils.db.SearchBuilder; import com.cloud.utils.db.SearchCriteria; +@Component @Local(value={ProjectJoinDao.class}) public class ProjectJoinDaoImpl extends GenericDaoBase implements ProjectJoinDao { public static final Logger s_logger = Logger.getLogger(ProjectJoinDaoImpl.class); diff --git a/server/src/com/cloud/api/query/dao/ResourceTagJoinDaoImpl.java b/server/src/com/cloud/api/query/dao/ResourceTagJoinDaoImpl.java index 5adee9ee170..2d86ca03d7c 100644 --- a/server/src/com/cloud/api/query/dao/ResourceTagJoinDaoImpl.java +++ b/server/src/com/cloud/api/query/dao/ResourceTagJoinDaoImpl.java @@ -28,13 +28,15 @@ import com.cloud.api.query.vo.ResourceTagJoinVO; import com.cloud.configuration.dao.ConfigurationDao; import org.apache.cloudstack.api.response.ResourceTagResponse; +import org.springframework.stereotype.Component; + import com.cloud.server.ResourceTag; import com.cloud.utils.component.Inject; import com.cloud.utils.db.GenericDaoBase; import com.cloud.utils.db.SearchBuilder; import com.cloud.utils.db.SearchCriteria; - +@Component @Local(value={ResourceTagJoinDao.class}) public class ResourceTagJoinDaoImpl extends GenericDaoBase implements ResourceTagJoinDao { public static final Logger s_logger = Logger.getLogger(ResourceTagJoinDaoImpl.class); diff --git a/server/src/com/cloud/api/query/dao/SecurityGroupJoinDaoImpl.java b/server/src/com/cloud/api/query/dao/SecurityGroupJoinDaoImpl.java index c35c4aae297..f6847aa9d2b 100644 --- a/server/src/com/cloud/api/query/dao/SecurityGroupJoinDaoImpl.java +++ b/server/src/com/cloud/api/query/dao/SecurityGroupJoinDaoImpl.java @@ -31,6 +31,8 @@ import com.cloud.configuration.dao.ConfigurationDao; import org.apache.cloudstack.api.response.SecurityGroupResponse; import org.apache.cloudstack.api.response.SecurityGroupRuleResponse; +import org.springframework.stereotype.Component; + import com.cloud.network.security.SecurityGroup; import com.cloud.network.security.SecurityRule.SecurityRuleType; import com.cloud.user.Account; @@ -39,6 +41,7 @@ import com.cloud.utils.db.GenericDaoBase; import com.cloud.utils.db.SearchBuilder; import com.cloud.utils.db.SearchCriteria; +@Component @Local(value={SecurityGroupJoinDao.class}) public class SecurityGroupJoinDaoImpl extends GenericDaoBase implements SecurityGroupJoinDao { public static final Logger s_logger = Logger.getLogger(SecurityGroupJoinDaoImpl.class); diff --git a/server/src/com/cloud/api/query/dao/StoragePoolJoinDaoImpl.java b/server/src/com/cloud/api/query/dao/StoragePoolJoinDaoImpl.java index 44ed1303af5..53a0ffed445 100644 --- a/server/src/com/cloud/api/query/dao/StoragePoolJoinDaoImpl.java +++ b/server/src/com/cloud/api/query/dao/StoragePoolJoinDaoImpl.java @@ -26,6 +26,7 @@ import com.cloud.api.ApiDBUtils; import com.cloud.api.query.vo.StoragePoolJoinVO; import com.cloud.configuration.dao.ConfigurationDao; import org.apache.cloudstack.api.response.StoragePoolResponse; +import org.springframework.stereotype.Component; import com.cloud.storage.StoragePool; import com.cloud.storage.StorageStats; @@ -35,6 +36,7 @@ import com.cloud.utils.db.SearchBuilder; import com.cloud.utils.db.SearchCriteria; +@Component @Local(value={StoragePoolJoinDao.class}) public class StoragePoolJoinDaoImpl extends GenericDaoBase implements StoragePoolJoinDao { public static final Logger s_logger = Logger.getLogger(StoragePoolJoinDaoImpl.class); diff --git a/server/src/com/cloud/api/query/dao/UserAccountJoinDaoImpl.java b/server/src/com/cloud/api/query/dao/UserAccountJoinDaoImpl.java index b1f5dcafeb3..1bb3981cd72 100644 --- a/server/src/com/cloud/api/query/dao/UserAccountJoinDaoImpl.java +++ b/server/src/com/cloud/api/query/dao/UserAccountJoinDaoImpl.java @@ -29,6 +29,7 @@ import com.cloud.api.query.vo.UserAccountJoinVO; import org.apache.cloudstack.api.response.InstanceGroupResponse; import org.apache.cloudstack.api.response.UserResponse; +import org.springframework.stereotype.Component; import com.cloud.user.Account; import com.cloud.user.User; @@ -39,6 +40,7 @@ import com.cloud.utils.db.SearchCriteria; import com.cloud.vm.InstanceGroup; +@Component @Local(value={UserAccountJoinDao.class}) public class UserAccountJoinDaoImpl extends GenericDaoBase implements UserAccountJoinDao { public static final Logger s_logger = Logger.getLogger(UserAccountJoinDaoImpl.class); diff --git a/server/src/com/cloud/api/query/dao/UserVmJoinDaoImpl.java b/server/src/com/cloud/api/query/dao/UserVmJoinDaoImpl.java index 3310518ee79..ce3d8083767 100644 --- a/server/src/com/cloud/api/query/dao/UserVmJoinDaoImpl.java +++ b/server/src/com/cloud/api/query/dao/UserVmJoinDaoImpl.java @@ -36,9 +36,10 @@ import org.apache.cloudstack.api.ApiConstants.VMDetails; import org.apache.cloudstack.api.response.NicResponse; import org.apache.cloudstack.api.response.SecurityGroupResponse; import org.apache.cloudstack.api.response.UserVmResponse; +import org.springframework.stereotype.Component; + import com.cloud.user.Account; import com.cloud.uservm.UserVm; -import com.cloud.utils.component.ComponentLocator; import com.cloud.utils.component.Inject; import com.cloud.utils.db.GenericDaoBase; import com.cloud.utils.db.SearchBuilder; @@ -46,6 +47,7 @@ import com.cloud.utils.db.SearchCriteria; import com.cloud.vm.VmStats; +@Component @Local(value={UserVmJoinDao.class}) public class UserVmJoinDaoImpl extends GenericDaoBase implements UserVmJoinDao { public static final Logger s_logger = Logger.getLogger(UserVmJoinDaoImpl.class); diff --git a/server/src/com/cloud/api/query/dao/VolumeJoinDaoImpl.java b/server/src/com/cloud/api/query/dao/VolumeJoinDaoImpl.java index 35ba2eb4537..65ecd1bc57e 100644 --- a/server/src/com/cloud/api/query/dao/VolumeJoinDaoImpl.java +++ b/server/src/com/cloud/api/query/dao/VolumeJoinDaoImpl.java @@ -30,6 +30,7 @@ import com.cloud.api.query.vo.VolumeJoinVO; import com.cloud.configuration.dao.ConfigurationDao; import org.apache.cloudstack.api.response.VolumeResponse; +import org.springframework.stereotype.Component; import com.cloud.offering.ServiceOffering; import com.cloud.storage.Storage; @@ -44,6 +45,7 @@ import com.cloud.utils.db.SearchBuilder; import com.cloud.utils.db.SearchCriteria; +@Component @Local(value={VolumeJoinDao.class}) public class VolumeJoinDaoImpl extends GenericDaoBase implements VolumeJoinDao { public static final Logger s_logger = Logger.getLogger(VolumeJoinDaoImpl.class); diff --git a/server/src/com/cloud/async/SyncQueueManagerImpl.java b/server/src/com/cloud/async/SyncQueueManagerImpl.java index 5246e46c7b7..97ce8a6ccad 100644 --- a/server/src/com/cloud/async/SyncQueueManagerImpl.java +++ b/server/src/com/cloud/async/SyncQueueManagerImpl.java @@ -36,7 +36,7 @@ import com.cloud.utils.db.DB; import com.cloud.utils.db.Transaction; import com.cloud.utils.exception.CloudRuntimeException; - +@Component @Local(value={SyncQueueManager.class}) public class SyncQueueManagerImpl implements SyncQueueManager { public static final Logger s_logger = Logger.getLogger(SyncQueueManagerImpl.class.getName()); diff --git a/server/src/com/cloud/ha/HighAvailabilityManagerExtImpl.java b/server/src/com/cloud/ha/HighAvailabilityManagerExtImpl.java index 116f6114c03..09e65a02812 100644 --- a/server/src/com/cloud/ha/HighAvailabilityManagerExtImpl.java +++ b/server/src/com/cloud/ha/HighAvailabilityManagerExtImpl.java @@ -24,11 +24,16 @@ import javax.ejb.Local; import javax.inject.Inject; import javax.naming.ConfigurationException; +import org.springframework.context.annotation.Primary; +import org.springframework.stereotype.Component; + import com.cloud.alert.AlertManager; import com.cloud.configuration.dao.ConfigurationDao; import com.cloud.usage.dao.UsageJobDao; import com.cloud.utils.db.Transaction; +@Component +@Primary @Local(value={HighAvailabilityManager.class}) public class HighAvailabilityManagerExtImpl extends HighAvailabilityManagerImpl { diff --git a/server/src/com/cloud/ha/HighAvailabilityManagerImpl.java b/server/src/com/cloud/ha/HighAvailabilityManagerImpl.java index 58f428b7795..6df08229830 100755 --- a/server/src/com/cloud/ha/HighAvailabilityManagerImpl.java +++ b/server/src/com/cloud/ha/HighAvailabilityManagerImpl.java @@ -31,6 +31,7 @@ import javax.naming.ConfigurationException; import org.apache.log4j.Logger; import org.apache.log4j.NDC; +import org.springframework.stereotype.Component; import com.cloud.agent.AgentManager; import com.cloud.alert.AlertManager; @@ -95,6 +96,7 @@ import com.cloud.vm.dao.VMInstanceDao; * ha.retry.wait | time to wait before retrying the work item | seconds | 120 || || stop.retry.wait | time to wait * before retrying the stop | seconds | 120 || * } **/ +@Component @Local(value = { HighAvailabilityManager.class }) public class HighAvailabilityManagerImpl implements HighAvailabilityManager, ClusterManagerListener { protected static final Logger s_logger = Logger.getLogger(HighAvailabilityManagerImpl.class); diff --git a/server/src/com/cloud/network/NetworkManagerImpl.java b/server/src/com/cloud/network/NetworkManagerImpl.java index 68ddbc0b89f..84fcd329218 100755 --- a/server/src/com/cloud/network/NetworkManagerImpl.java +++ b/server/src/com/cloud/network/NetworkManagerImpl.java @@ -57,18 +57,15 @@ import com.cloud.alert.AlertManager; import com.cloud.api.ApiDBUtils; import org.apache.cloudstack.api.command.user.network.ListNetworksCmd; +import org.springframework.stereotype.Component; + import com.cloud.configuration.Config; import com.cloud.configuration.ConfigurationManager; import com.cloud.configuration.Resource.ResourceType; import com.cloud.configuration.dao.ConfigurationDao; import com.cloud.dc.*; import com.cloud.dc.DataCenter.NetworkType; -import com.cloud.dc.DataCenterVO; -import com.cloud.dc.Pod; -import com.cloud.dc.PodVlanMapVO; -import com.cloud.dc.Vlan; import com.cloud.dc.Vlan.VlanType; -import com.cloud.dc.VlanVO; import com.cloud.dc.dao.AccountVlanMapDao; import com.cloud.dc.dao.DataCenterDao; import com.cloud.dc.dao.PodVlanMapDao; @@ -111,13 +108,6 @@ import com.cloud.network.lb.LoadBalancingRule.LbStickinessPolicy; import com.cloud.network.lb.LoadBalancingRulesManager; import com.cloud.network.rules.*; import com.cloud.network.rules.FirewallRule.Purpose; -import com.cloud.network.rules.FirewallRuleVO; -import com.cloud.network.rules.PortForwardingRule; -import com.cloud.network.rules.PortForwardingRuleVO; -import com.cloud.network.rules.RulesManager; -import com.cloud.network.rules.StaticNat; -import com.cloud.network.rules.StaticNatRule; -import com.cloud.network.rules.StaticNatRuleImpl; import com.cloud.network.rules.dao.PortForwardingRulesDao; import com.cloud.network.vpc.NetworkACLManager; import com.cloud.network.vpc.PrivateIpVO; @@ -173,6 +163,7 @@ import java.util.*; /** * NetworkManagerImpl implements NetworkManager. */ +@Component @Local(value = { NetworkManager.class, NetworkService.class }) public class NetworkManagerImpl implements NetworkManager, NetworkService, Manager, Listener { private static final Logger s_logger = Logger.getLogger(NetworkManagerImpl.class); diff --git a/server/src/com/cloud/network/as/AutoScaleManagerImpl.java b/server/src/com/cloud/network/as/AutoScaleManagerImpl.java index 4c49914f11c..d49f4aa168e 100644 --- a/server/src/com/cloud/network/as/AutoScaleManagerImpl.java +++ b/server/src/com/cloud/network/as/AutoScaleManagerImpl.java @@ -42,6 +42,8 @@ import org.apache.cloudstack.api.command.user.autoscale.ListAutoScaleVmGroupsCmd import org.apache.cloudstack.api.command.user.autoscale.ListConditionsCmd; import org.apache.cloudstack.api.command.user.autoscale.UpdateAutoScalePolicyCmd; import org.apache.cloudstack.api.command.user.autoscale.UpdateAutoScaleVmProfileCmd; +import org.springframework.stereotype.Component; + import com.cloud.configuration.Config; import com.cloud.configuration.ConfigurationManager; import com.cloud.configuration.dao.ConfigurationDao; @@ -93,6 +95,7 @@ import com.cloud.utils.net.NetUtils; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; +@Component @Local(value = { AutoScaleService.class, AutoScaleManager.class }) public class AutoScaleManagerImpl implements AutoScaleManager, AutoScaleService, Manager { private static final Logger s_logger = Logger.getLogger(AutoScaleManagerImpl.class); diff --git a/server/src/com/cloud/network/as/dao/AutoScalePolicyConditionMapDaoImpl.java b/server/src/com/cloud/network/as/dao/AutoScalePolicyConditionMapDaoImpl.java index 84dd191b072..cacebf05f5f 100644 --- a/server/src/com/cloud/network/as/dao/AutoScalePolicyConditionMapDaoImpl.java +++ b/server/src/com/cloud/network/as/dao/AutoScalePolicyConditionMapDaoImpl.java @@ -19,11 +19,14 @@ package com.cloud.network.as.dao; import java.util.List; import javax.ejb.Local; + +import org.springframework.stereotype.Component; import com.cloud.network.as.AutoScalePolicyConditionMapVO; import com.cloud.utils.db.GenericDaoBase; import com.cloud.utils.db.SearchCriteria; - + +@Component @Local(value={AutoScalePolicyConditionMapDao.class}) public class AutoScalePolicyConditionMapDaoImpl extends GenericDaoBase implements AutoScalePolicyConditionMapDao { diff --git a/server/src/com/cloud/network/as/dao/AutoScalePolicyDaoImpl.java b/server/src/com/cloud/network/as/dao/AutoScalePolicyDaoImpl.java index f8f54915534..05dbf310418 100644 --- a/server/src/com/cloud/network/as/dao/AutoScalePolicyDaoImpl.java +++ b/server/src/com/cloud/network/as/dao/AutoScalePolicyDaoImpl.java @@ -17,11 +17,14 @@ package com.cloud.network.as.dao; import javax.ejb.Local; + +import org.springframework.stereotype.Component; import com.cloud.network.as.AutoScalePolicyVO; import com.cloud.utils.db.GenericDaoBase; import com.cloud.utils.db.SearchCriteria; - + +@Component @Local(value = { AutoScalePolicyDao.class }) public class AutoScalePolicyDaoImpl extends GenericDaoBase implements AutoScalePolicyDao { diff --git a/server/src/com/cloud/network/as/dao/AutoScaleVmGroupDaoImpl.java b/server/src/com/cloud/network/as/dao/AutoScaleVmGroupDaoImpl.java index 80f2bee7cbb..ae4ab2c7db9 100644 --- a/server/src/com/cloud/network/as/dao/AutoScaleVmGroupDaoImpl.java +++ b/server/src/com/cloud/network/as/dao/AutoScaleVmGroupDaoImpl.java @@ -19,13 +19,16 @@ package com.cloud.network.as.dao; import java.util.List; import javax.ejb.Local; + +import org.springframework.stereotype.Component; import com.cloud.network.as.AutoScaleVmGroupVO; import com.cloud.utils.db.GenericDaoBase; import com.cloud.utils.db.GenericSearchBuilder; import com.cloud.utils.db.SearchCriteria; import com.cloud.utils.db.SearchCriteria.Func; - + +@Component @Local(value = { AutoScaleVmGroupDao.class }) public class AutoScaleVmGroupDaoImpl extends GenericDaoBase implements AutoScaleVmGroupDao { diff --git a/server/src/com/cloud/network/as/dao/AutoScaleVmGroupPolicyMapDaoImpl.java b/server/src/com/cloud/network/as/dao/AutoScaleVmGroupPolicyMapDaoImpl.java index c33a55fe549..b0d064e1d20 100644 --- a/server/src/com/cloud/network/as/dao/AutoScaleVmGroupPolicyMapDaoImpl.java +++ b/server/src/com/cloud/network/as/dao/AutoScaleVmGroupPolicyMapDaoImpl.java @@ -19,13 +19,16 @@ package com.cloud.network.as.dao; import java.util.List; import javax.ejb.Local; + +import org.springframework.stereotype.Component; import com.cloud.network.as.AutoScaleVmGroupPolicyMapVO; import com.cloud.utils.db.GenericDaoBase; import com.cloud.utils.db.SearchBuilder; import com.cloud.utils.db.SearchCriteria; import com.cloud.utils.db.SearchCriteria.Op; - + +@Component @Local(value={AutoScaleVmGroupPolicyMapDao.class}) public class AutoScaleVmGroupPolicyMapDaoImpl extends GenericDaoBase implements AutoScaleVmGroupPolicyMapDao { diff --git a/server/src/com/cloud/network/as/dao/AutoScaleVmProfileDaoImpl.java b/server/src/com/cloud/network/as/dao/AutoScaleVmProfileDaoImpl.java index d2b162b5915..99c3cc2b70a 100644 --- a/server/src/com/cloud/network/as/dao/AutoScaleVmProfileDaoImpl.java +++ b/server/src/com/cloud/network/as/dao/AutoScaleVmProfileDaoImpl.java @@ -17,11 +17,14 @@ package com.cloud.network.as.dao; import javax.ejb.Local; + +import org.springframework.stereotype.Component; import com.cloud.network.as.AutoScaleVmProfileVO; import com.cloud.utils.db.GenericDaoBase; import com.cloud.utils.db.SearchCriteria; - + +@Component @Local(value = { AutoScaleVmProfileDao.class }) public class AutoScaleVmProfileDaoImpl extends GenericDaoBase implements AutoScaleVmProfileDao { diff --git a/server/src/com/cloud/network/as/dao/ConditionDaoImpl.java b/server/src/com/cloud/network/as/dao/ConditionDaoImpl.java index 4f71d451512..8235823dcfc 100644 --- a/server/src/com/cloud/network/as/dao/ConditionDaoImpl.java +++ b/server/src/com/cloud/network/as/dao/ConditionDaoImpl.java @@ -19,12 +19,15 @@ package com.cloud.network.as.dao; import javax.ejb.Local; +import org.springframework.stereotype.Component; + import com.cloud.network.as.ConditionVO; import com.cloud.utils.db.GenericDaoBase; import com.cloud.utils.db.SearchBuilder; import com.cloud.utils.db.SearchCriteria; import com.cloud.utils.db.SearchCriteria.Op; +@Component @Local(value = ConditionDao.class) public class ConditionDaoImpl extends GenericDaoBase implements ConditionDao { final SearchBuilder AllFieldsSearch; diff --git a/server/src/com/cloud/network/as/dao/CounterDaoImpl.java b/server/src/com/cloud/network/as/dao/CounterDaoImpl.java index 829d538140e..0abc3a003a4 100644 --- a/server/src/com/cloud/network/as/dao/CounterDaoImpl.java +++ b/server/src/com/cloud/network/as/dao/CounterDaoImpl.java @@ -21,6 +21,8 @@ import java.util.List; import javax.ejb.Local; +import org.springframework.stereotype.Component; + import com.cloud.network.as.CounterVO; import com.cloud.utils.db.Filter; import com.cloud.utils.db.GenericDaoBase; @@ -28,6 +30,7 @@ import com.cloud.utils.db.SearchBuilder; import com.cloud.utils.db.SearchCriteria; import com.cloud.utils.db.SearchCriteria.Op; +@Component @Local(value = CounterDao.class) public class CounterDaoImpl extends GenericDaoBase implements CounterDao { final SearchBuilder AllFieldsSearch; diff --git a/server/src/com/cloud/network/dao/NetworkDaoImpl.java b/server/src/com/cloud/network/dao/NetworkDaoImpl.java index c3559b6c67f..c6a65dd604f 100644 --- a/server/src/com/cloud/network/dao/NetworkDaoImpl.java +++ b/server/src/com/cloud/network/dao/NetworkDaoImpl.java @@ -22,6 +22,7 @@ import java.util.Random; import javax.annotation.PostConstruct; import javax.ejb.Local; +import javax.inject.Inject; import javax.persistence.TableGenerator; import org.apache.cloudstack.acl.ControlledEntity.ACLType; @@ -78,12 +79,12 @@ public class NetworkDaoImpl extends GenericDaoBase implements N GenericSearchBuilder VpcNetworksCount; SearchBuilder OfferingAccountNetworkSearch; - ResourceTagsDaoImpl _tagsDao = ComponentLocator.inject(ResourceTagsDaoImpl.class); - NetworkAccountDaoImpl _accountsDao = ComponentLocator.inject(NetworkAccountDaoImpl.class); - NetworkDomainDaoImpl _domainsDao = ComponentLocator.inject(NetworkDomainDaoImpl.class); - NetworkOpDaoImpl _opDao = ComponentLocator.inject(NetworkOpDaoImpl.class); - NetworkServiceMapDaoImpl _ntwkSvcMap = ComponentLocator.inject(NetworkServiceMapDaoImpl.class); - NetworkOfferingDaoImpl _ntwkOffDao = ComponentLocator.inject(NetworkOfferingDaoImpl.class); + @Inject ResourceTagsDaoImpl _tagsDao; + @Inject NetworkAccountDaoImpl _accountsDao; + @Inject NetworkDomainDaoImpl _domainsDao; + @Inject NetworkOpDaoImpl _opDao; + @Inject NetworkServiceMapDaoImpl _ntwkSvcMap; + @Inject NetworkOfferingDaoImpl _ntwkOffDao; TableGenerator _tgMacAddress; diff --git a/server/src/com/cloud/secstorage/PremiumSecondaryStorageManagerImpl.java b/server/src/com/cloud/secstorage/PremiumSecondaryStorageManagerImpl.java index 73015c11464..d4f44541c85 100755 --- a/server/src/com/cloud/secstorage/PremiumSecondaryStorageManagerImpl.java +++ b/server/src/com/cloud/secstorage/PremiumSecondaryStorageManagerImpl.java @@ -49,6 +49,8 @@ import com.cloud.vm.SystemVmLoadScanner.AfterScanAction; import com.cloud.vm.VirtualMachine.State; import com.cloud.vm.dao.SecondaryStorageVmDao; +@Component +@Primary @Local(value = { SecondaryStorageVmManager.class }) public class PremiumSecondaryStorageManagerImpl extends SecondaryStorageManagerImpl { private static final Logger s_logger = Logger.getLogger(PremiumSecondaryStorageManagerImpl.class); diff --git a/server/src/com/cloud/server/ManagementServerExtImpl.java b/server/src/com/cloud/server/ManagementServerExtImpl.java index 5ec75f193fb..03e50ebbe69 100644 --- a/server/src/com/cloud/server/ManagementServerExtImpl.java +++ b/server/src/com/cloud/server/ManagementServerExtImpl.java @@ -33,6 +33,8 @@ import com.cloud.exception.InvalidParameterValueException; import com.cloud.exception.PermissionDeniedException; import com.cloud.projects.Project; import org.apache.cloudstack.api.response.UsageTypeResponse; +import org.springframework.stereotype.Component; + import com.cloud.usage.UsageJobVO; import com.cloud.usage.UsageTypes; import com.cloud.usage.UsageVO; @@ -46,6 +48,7 @@ import com.cloud.utils.db.Filter; import com.cloud.utils.db.SearchCriteria; import com.cloud.utils.db.Transaction; +@Component public class ManagementServerExtImpl extends ManagementServerImpl implements ManagementServerExt { @Inject private AccountDao _accountDao; @Inject private DomainDao _domainDao; diff --git a/server/src/com/cloud/server/ManagementServerImpl.java b/server/src/com/cloud/server/ManagementServerImpl.java index 95d96d09cc2..60bab003d9e 100755 --- a/server/src/com/cloud/server/ManagementServerImpl.java +++ b/server/src/com/cloud/server/ManagementServerImpl.java @@ -381,8 +381,8 @@ public class ManagementServerImpl implements ManagementServer { S3Manager _s3Mgr; @Inject - ComponentContext _placeholder; - + ComponentContext _placeholder; // create a dependency to ComponentContext so that it can be loaded beforehead + private final ScheduledExecutorService _eventExecutor = Executors.newScheduledThreadPool(1, new NamedThreadFactory("EventChecker")); private KeystoreManager _ksMgr; diff --git a/server/src/com/cloud/storage/dao/S3DaoImpl.java b/server/src/com/cloud/storage/dao/S3DaoImpl.java index 6162e6ebf73..f0dd078d224 100644 --- a/server/src/com/cloud/storage/dao/S3DaoImpl.java +++ b/server/src/com/cloud/storage/dao/S3DaoImpl.java @@ -24,6 +24,9 @@ import com.cloud.utils.db.GenericDaoBase; import javax.ejb.Local; +import org.springframework.stereotype.Component; + +@Component @Local(S3Dao.class) public class S3DaoImpl extends GenericDaoBase implements S3Dao { diff --git a/server/src/com/cloud/storage/dao/VMTemplateS3DaoImpl.java b/server/src/com/cloud/storage/dao/VMTemplateS3DaoImpl.java index f23b803bf68..7cfd3b5937c 100644 --- a/server/src/com/cloud/storage/dao/VMTemplateS3DaoImpl.java +++ b/server/src/com/cloud/storage/dao/VMTemplateS3DaoImpl.java @@ -27,8 +27,12 @@ import com.cloud.utils.db.SearchBuilder; import com.cloud.utils.db.SearchCriteria; import javax.ejb.Local; + +import org.springframework.stereotype.Component; + import java.util.List; +@Component @Local(VMTemplateS3Dao.class) public class VMTemplateS3DaoImpl extends GenericDaoBase implements VMTemplateS3Dao { diff --git a/server/src/com/cloud/storage/s3/S3ManagerImpl.java b/server/src/com/cloud/storage/s3/S3ManagerImpl.java index 1db809b07b2..069edf37612 100644 --- a/server/src/com/cloud/storage/s3/S3ManagerImpl.java +++ b/server/src/com/cloud/storage/s3/S3ManagerImpl.java @@ -54,6 +54,8 @@ import com.cloud.agent.api.DownloadTemplateFromS3ToSecondaryStorageCommand; import com.cloud.agent.api.UploadTemplateToS3FromSecondaryStorageCommand; import com.cloud.agent.api.to.S3TO; import org.apache.cloudstack.api.command.admin.storage.ListS3sCmd; +import org.springframework.stereotype.Component; + import com.cloud.configuration.Config; import com.cloud.configuration.dao.ConfigurationDao; import com.cloud.dc.DataCenterVO; @@ -80,6 +82,7 @@ import com.cloud.utils.db.Filter; import com.cloud.utils.db.SearchCriteria; import com.cloud.utils.exception.CloudRuntimeException; +@Component @Local(value = { S3Manager.class }) public class S3ManagerImpl implements S3Manager { diff --git a/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java b/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java index 8638cf40932..81d8396bafa 100755 --- a/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java +++ b/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java @@ -30,6 +30,8 @@ import javax.inject.Inject; import javax.naming.ConfigurationException; import org.apache.log4j.Logger; +import org.springframework.context.annotation.Primary; +import org.springframework.stereotype.Component; import com.cloud.agent.AgentManager; import com.cloud.agent.api.Answer; @@ -153,6 +155,7 @@ import com.cloud.vm.dao.VMInstanceDao; // Starting, HA, Migrating, Creating and Running state are all counted as "Open" for available capacity calculation // because sooner or later, it will be driven into Running state // +@Component @Local(value = { SecondaryStorageVmManager.class }) public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, VirtualMachineGuru, SystemVmLoadScanHandler, ResourceStateAdapter { private static final Logger s_logger = Logger.getLogger(SecondaryStorageManagerImpl.class); @@ -217,7 +220,7 @@ public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, V UserVmDetailsDao _vmDetailsDao; @Inject protected ResourceManager _resourceMgr; - @Inject + //@Inject // TODO this is a very strange usage, a singleton class need to inject itself? protected SecondaryStorageVmManager _ssvmMgr; @Inject NetworkDao _networkDao; @@ -245,6 +248,10 @@ public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, V private final GlobalLock _allocLock = GlobalLock.getInternLock(getAllocLockName()); + public SecondaryStorageManagerImpl() { + _ssvmMgr = this; + } + @Override public SecondaryStorageVmVO startSecStorageVm(long secStorageVmId) { try { @@ -888,9 +895,6 @@ public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, V return true; } - protected SecondaryStorageManagerImpl() { - } - @Override public Long convertToId(String vmName) { if (!VirtualMachineName.isValidSystemVmName(vmName, _instance, "s")) { diff --git a/server/src/com/cloud/vm/ClusteredVirtualMachineManagerImpl.java b/server/src/com/cloud/vm/ClusteredVirtualMachineManagerImpl.java index dc51eab4fc7..96c7446f8fd 100644 --- a/server/src/com/cloud/vm/ClusteredVirtualMachineManagerImpl.java +++ b/server/src/com/cloud/vm/ClusteredVirtualMachineManagerImpl.java @@ -22,9 +22,14 @@ import java.util.Map; import javax.ejb.Local; import javax.naming.ConfigurationException; +import org.springframework.context.annotation.Primary; +import org.springframework.stereotype.Component; + import com.cloud.cluster.ClusterManagerListener; import com.cloud.cluster.ManagementServerHostVO; +@Component +@Primary @Local(value=VirtualMachineManager.class) public class ClusteredVirtualMachineManagerImpl extends VirtualMachineManagerImpl implements ClusterManagerListener { diff --git a/server/src/com/cloud/vm/UserVmManagerImpl.java b/server/src/com/cloud/vm/UserVmManagerImpl.java index d4fff18c847..55d0d4fe756 100755 --- a/server/src/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/com/cloud/vm/UserVmManagerImpl.java @@ -54,6 +54,7 @@ import org.apache.cloudstack.engine.cloud.entity.api.VirtualMachineEntity; import org.apache.cloudstack.engine.service.api.OrchestrationService; import org.apache.commons.codec.binary.Base64; import org.apache.log4j.Logger; +import org.springframework.stereotype.Component; import com.cloud.agent.AgentManager; import com.cloud.agent.api.Answer; @@ -236,6 +237,7 @@ import com.cloud.vm.dao.UserVmDao; import com.cloud.vm.dao.UserVmDetailsDao; import com.cloud.vm.dao.VMInstanceDao; +@Component @Local(value = { UserVmManager.class, UserVmService.class }) public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager { private static final Logger s_logger = Logger diff --git a/server/src/com/cloud/vm/VirtualMachineManagerImpl.java b/server/src/com/cloud/vm/VirtualMachineManagerImpl.java index 0b1e2da27da..2897a63afed 100755 --- a/server/src/com/cloud/vm/VirtualMachineManagerImpl.java +++ b/server/src/com/cloud/vm/VirtualMachineManagerImpl.java @@ -158,6 +158,7 @@ import com.cloud.vm.dao.SecondaryStorageVmDao; import com.cloud.vm.dao.UserVmDao; import com.cloud.vm.dao.VMInstanceDao; +@Component @Local(value = VirtualMachineManager.class) public class VirtualMachineManagerImpl implements VirtualMachineManager, Listener { private static final Logger s_logger = Logger.getLogger(VirtualMachineManagerImpl.class); From a03d83bba965a9d060c3a3ee8ad05dd08647e40d Mon Sep 17 00:00:00 2001 From: Edison Su Date: Thu, 10 Jan 2013 10:27:05 -0800 Subject: [PATCH 3/3] refactor the motion service api --- .../storage/image/TemplateObject.java | 2 +- .../image/driver/ImageDataStoreDriver.java | 4 +- .../driver/ImageDataStoreDriverImpl.java | 7 +- .../storage/image/store/ImageDataStore.java | 6 +- .../image/store/ImageDataStoreImpl.java | 61 ++++++++-- .../motion/DefaultImageMotionStrategy.java | 31 +++-- .../image/motion/ImageMotionServiceImpl.java | 38 ++---- .../image/motion/ImageMotionStrategy.java | 12 +- ...eToPrimaryStorageCmd.java => CopyCmd.java} | 8 +- .../CreateVolumeFromBaseImageCommand.java | 4 +- .../storage/datastore/DataStore.java | 17 +++ .../datastore/ObjectInDataStoreManager.java | 17 +++ .../ObjectInDataStoreManagerImpl.java | 65 +++++++++++ .../storage/datastore/PrimaryDataStore.java | 4 +- .../datastore/TemplateInDataStore.java | 42 +++++++ .../storage/db/ObjectInDataStoreDao.java | 9 ++ .../storage/db/ObjectInDataStoreDaoImpl.java | 20 ++++ .../storage/db/ObjectInDataStoreVO.java | 108 ++++++++++++++++++ .../storage/image/TemplateEntityImpl.java | 2 +- .../storage/image/TemplateInfo.java | 4 +- .../image/motion/ImageMotionService.java | 6 +- .../image/store/ImageDataStoreInfo.java | 4 +- .../cloudstack/storage/to/TemplateTO.java | 3 +- ...ava => ObjectInDataStoreStateMachine.java} | 2 +- .../db/TemplatePrimaryDataStoreDao.java | 4 +- .../db/TemplatePrimaryDataStoreDaoImpl.java | 8 +- .../volume/db/TemplatePrimaryDataStoreVO.java | 10 +- .../datastore/DefaultPrimaryDataStore.java | 50 +++++++- .../DefaultPrimaryDataStoreDriverImpl.java | 7 +- .../driver/PrimaryDataStoreDriver.java | 2 +- .../TemplateOnPrimaryDataStoreObject.java | 6 +- .../TemplatePrimaryDataStoreManager.java | 4 +- .../TemplatePrimaryDataStoreManagerImpl.java | 22 ++-- .../storage/volume/VolumeServiceImpl.java | 33 +++--- .../resource/XenServerStorageResource.java | 10 +- 35 files changed, 483 insertions(+), 149 deletions(-) rename engine/storage/src/org/apache/cloudstack/storage/command/{CopyTemplateToPrimaryStorageCmd.java => CopyCmd.java} (64%) create mode 100644 engine/storage/src/org/apache/cloudstack/storage/datastore/DataStore.java create mode 100644 engine/storage/src/org/apache/cloudstack/storage/datastore/ObjectInDataStoreManager.java create mode 100644 engine/storage/src/org/apache/cloudstack/storage/datastore/ObjectInDataStoreManagerImpl.java create mode 100644 engine/storage/src/org/apache/cloudstack/storage/datastore/TemplateInDataStore.java create mode 100644 engine/storage/src/org/apache/cloudstack/storage/db/ObjectInDataStoreDao.java create mode 100644 engine/storage/src/org/apache/cloudstack/storage/db/ObjectInDataStoreDaoImpl.java create mode 100644 engine/storage/src/org/apache/cloudstack/storage/db/ObjectInDataStoreVO.java rename engine/storage/src/org/apache/cloudstack/storage/volume/{TemplateOnPrimaryDataStoreStateMachine.java => ObjectInDataStoreStateMachine.java} (92%) diff --git a/engine/storage/image/src/org/apache/cloudstack/storage/image/TemplateObject.java b/engine/storage/image/src/org/apache/cloudstack/storage/image/TemplateObject.java index 5d65a3a13f7..367302d8445 100644 --- a/engine/storage/image/src/org/apache/cloudstack/storage/image/TemplateObject.java +++ b/engine/storage/image/src/org/apache/cloudstack/storage/image/TemplateObject.java @@ -33,7 +33,7 @@ public class TemplateObject implements TemplateInfo { } @Override - public ImageDataStoreInfo getImageDataStore() { + public ImageDataStoreInfo getDataStore() { return this.dataStore; } diff --git a/engine/storage/image/src/org/apache/cloudstack/storage/image/driver/ImageDataStoreDriver.java b/engine/storage/image/src/org/apache/cloudstack/storage/image/driver/ImageDataStoreDriver.java index 42e52e5eff4..a968c9c47a7 100644 --- a/engine/storage/image/src/org/apache/cloudstack/storage/image/driver/ImageDataStoreDriver.java +++ b/engine/storage/image/src/org/apache/cloudstack/storage/image/driver/ImageDataStoreDriver.java @@ -18,12 +18,14 @@ */ package org.apache.cloudstack.storage.image.driver; +import org.apache.cloudstack.storage.EndPoint; import org.apache.cloudstack.storage.image.TemplateInfo; +import org.apache.cloudstack.storage.image.TemplateObject; public interface ImageDataStoreDriver { boolean registerTemplate(TemplateInfo template); - String grantAccess(long templateId, long endPointId); + String grantAccess(TemplateObject template, EndPoint endPointId); boolean revokeAccess(long templateId, long endPointId); diff --git a/engine/storage/image/src/org/apache/cloudstack/storage/image/driver/ImageDataStoreDriverImpl.java b/engine/storage/image/src/org/apache/cloudstack/storage/image/driver/ImageDataStoreDriverImpl.java index e395cf13c2f..cae57c02401 100644 --- a/engine/storage/image/src/org/apache/cloudstack/storage/image/driver/ImageDataStoreDriverImpl.java +++ b/engine/storage/image/src/org/apache/cloudstack/storage/image/driver/ImageDataStoreDriverImpl.java @@ -18,7 +18,9 @@ */ package org.apache.cloudstack.storage.image.driver; +import org.apache.cloudstack.storage.EndPoint; import org.apache.cloudstack.storage.image.TemplateInfo; +import org.apache.cloudstack.storage.image.TemplateObject; public class ImageDataStoreDriverImpl implements ImageDataStoreDriver { @@ -32,9 +34,8 @@ public class ImageDataStoreDriverImpl implements ImageDataStoreDriver { } @Override - public String grantAccess(long templateId, long endPointId) { - // TODO Auto-generated method stub - return null; + public String grantAccess(TemplateObject template, EndPoint endPointId) { + return template.getPath(); } @Override diff --git a/engine/storage/image/src/org/apache/cloudstack/storage/image/store/ImageDataStore.java b/engine/storage/image/src/org/apache/cloudstack/storage/image/store/ImageDataStore.java index 4a9240e9b45..b1fabc704d7 100644 --- a/engine/storage/image/src/org/apache/cloudstack/storage/image/store/ImageDataStore.java +++ b/engine/storage/image/src/org/apache/cloudstack/storage/image/store/ImageDataStore.java @@ -18,15 +18,11 @@ */ package org.apache.cloudstack.storage.image.store; +import org.apache.cloudstack.storage.datastore.DataStore; import org.apache.cloudstack.storage.image.TemplateObject; public interface ImageDataStore extends ImageDataStoreInfo { TemplateObject registerTemplate(long templateId); - - String grantAccess(long templateId, long endPointId); - - boolean revokeAccess(long templateId, long endPointId); - boolean deleteTemplate(long templateId); boolean needDownloadToCacheStorage(); diff --git a/engine/storage/image/src/org/apache/cloudstack/storage/image/store/ImageDataStoreImpl.java b/engine/storage/image/src/org/apache/cloudstack/storage/image/store/ImageDataStoreImpl.java index 68ad317655e..355f7934469 100644 --- a/engine/storage/image/src/org/apache/cloudstack/storage/image/store/ImageDataStoreImpl.java +++ b/engine/storage/image/src/org/apache/cloudstack/storage/image/store/ImageDataStoreImpl.java @@ -20,11 +20,15 @@ package org.apache.cloudstack.storage.image.store; import javax.inject.Inject; +import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo; +import org.apache.cloudstack.storage.EndPoint; +import org.apache.cloudstack.storage.image.TemplateInfo; import org.apache.cloudstack.storage.image.TemplateObject; import org.apache.cloudstack.storage.image.db.ImageDataDao; import org.apache.cloudstack.storage.image.db.ImageDataStoreVO; import org.apache.cloudstack.storage.image.db.ImageDataVO; import org.apache.cloudstack.storage.image.driver.ImageDataStoreDriver; +import org.apache.cloudstack.storage.snapshot.SnapshotInfo; public class ImageDataStoreImpl implements ImageDataStore { @Inject @@ -47,18 +51,6 @@ public class ImageDataStoreImpl implements ImageDataStore { * } else { return null; } } */ - @Override - public String grantAccess(long templateId, long endPointId) { - ImageDataVO idv = imageDao.findById(templateId); - return idv.getUrl(); - } - - @Override - public boolean revokeAccess(long templateId, long endPointId) { - // TODO Auto-generated method stub - return false; - } - @Override public boolean deleteTemplate(long templateId) { // TODO Auto-generated method stub @@ -103,4 +95,49 @@ public class ImageDataStoreImpl implements ImageDataStore { return null; } + @Override + public String grantAccess(VolumeInfo volume, EndPoint ep) { + return null; + } + + @Override + public boolean revokeAccess(VolumeInfo volume, EndPoint ep) { + // TODO Auto-generated method stub + return false; + } + + @Override + public String grantAccess(TemplateInfo template, EndPoint ep) { + return this.driver.grantAccess((TemplateObject)template, ep); + } + + @Override + public boolean revokeAccess(TemplateInfo template, EndPoint ep) { + // TODO Auto-generated method stub + return false; + } + + @Override + public String grantAccess(SnapshotInfo snapshot, EndPoint ep) { + // TODO Auto-generated method stub + return null; + } + + @Override + public boolean revokeAccess(SnapshotInfo snapshot, EndPoint ep) { + // TODO Auto-generated method stub + return false; + } + + @Override + public String getRole() { + return "imageStore"; + } + + @Override + public long getId() { + // TODO Auto-generated method stub + return 0; + } + } diff --git a/engine/storage/imagemotion/src/org/apache/cloudstack/storage/image/motion/DefaultImageMotionStrategy.java b/engine/storage/imagemotion/src/org/apache/cloudstack/storage/image/motion/DefaultImageMotionStrategy.java index 91cacdb527d..fd6f1939c34 100644 --- a/engine/storage/imagemotion/src/org/apache/cloudstack/storage/image/motion/DefaultImageMotionStrategy.java +++ b/engine/storage/imagemotion/src/org/apache/cloudstack/storage/image/motion/DefaultImageMotionStrategy.java @@ -23,9 +23,10 @@ import org.apache.cloudstack.framework.async.AsyncCompletionCallback; import org.apache.cloudstack.framework.async.AsyncRpcConext; import org.apache.cloudstack.storage.EndPoint; import org.apache.cloudstack.storage.command.CommandResult; -import org.apache.cloudstack.storage.command.CopyTemplateToPrimaryStorageCmd; +import org.apache.cloudstack.storage.command.CopyCmd; import org.apache.cloudstack.storage.command.CopyTemplateToPrimaryStorageAnswer; import org.apache.cloudstack.storage.datastore.PrimaryDataStore; +import org.apache.cloudstack.storage.image.TemplateInfo; import org.apache.cloudstack.storage.to.ImageOnPrimayDataStoreTO; import org.apache.cloudstack.storage.volume.TemplateOnPrimaryDataStoreInfo; import org.springframework.stereotype.Component; @@ -36,24 +37,12 @@ import com.cloud.agent.api.Answer; public class DefaultImageMotionStrategy implements ImageMotionStrategy { @Override - public boolean canHandle(TemplateOnPrimaryDataStoreInfo templateStore) { + public boolean canHandle(TemplateInfo templateStore) { // TODO Auto-generated method stub return true; } - @Override - public EndPoint getEndPoint(TemplateOnPrimaryDataStoreInfo templateStore) { - PrimaryDataStore pdi = templateStore.getPrimaryDataStore(); - return pdi.getEndPoints().get(0); - } - @Override - public boolean copyTemplate(TemplateOnPrimaryDataStoreInfo templateStore, EndPoint ep) { - ImageOnPrimayDataStoreTO imageTo = new ImageOnPrimayDataStoreTO(templateStore); - CopyTemplateToPrimaryStorageCmd copyCommand = new CopyTemplateToPrimaryStorageCmd(imageTo); - ep.sendMessage(copyCommand); - return true; - } private class CreateTemplateContext extends AsyncRpcConext { private final TemplateOnPrimaryDataStoreInfo template; @@ -69,10 +58,10 @@ public class DefaultImageMotionStrategy implements ImageMotionStrategy { } @Override - public void copyTemplateAsync(TemplateOnPrimaryDataStoreInfo templateStore, EndPoint ep, AsyncCompletionCallback callback) { - ImageOnPrimayDataStoreTO imageTo = new ImageOnPrimayDataStoreTO(templateStore); - CopyTemplateToPrimaryStorageCmd copyCommand = new CopyTemplateToPrimaryStorageCmd(imageTo); - CreateTemplateContext context = new CreateTemplateContext(callback, templateStore); + public void copyTemplateAsync(String destUri, String srcUri, EndPoint ep, AsyncCompletionCallback callback) { + + CopyCmd copyCommand = new CopyCmd(destUri, srcUri); + CreateTemplateContext context = new CreateTemplateContext(callback, null); AsyncCallbackDispatcher caller = AsyncCallbackDispatcher.create(this); caller.setCallback(caller.getTarget().copyTemplateCallBack(null, null)) .setContext(context); @@ -98,4 +87,10 @@ public class DefaultImageMotionStrategy implements ImageMotionStrategy { return null; } + @Override + public EndPoint getEndPoint(TemplateInfo destTemplate, + TemplateInfo srcTemplate) { + return null; + } + } diff --git a/engine/storage/imagemotion/src/org/apache/cloudstack/storage/image/motion/ImageMotionServiceImpl.java b/engine/storage/imagemotion/src/org/apache/cloudstack/storage/image/motion/ImageMotionServiceImpl.java index feb98803dbc..0d007ed675d 100644 --- a/engine/storage/imagemotion/src/org/apache/cloudstack/storage/image/motion/ImageMotionServiceImpl.java +++ b/engine/storage/imagemotion/src/org/apache/cloudstack/storage/image/motion/ImageMotionServiceImpl.java @@ -25,6 +25,7 @@ import javax.inject.Inject; import org.apache.cloudstack.framework.async.AsyncCompletionCallback; import org.apache.cloudstack.storage.EndPoint; import org.apache.cloudstack.storage.command.CommandResult; +import org.apache.cloudstack.storage.db.ObjectInDataStoreVO; import org.apache.cloudstack.storage.image.ImageService; import org.apache.cloudstack.storage.image.TemplateInfo; import org.apache.cloudstack.storage.volume.TemplateOnPrimaryDataStoreInfo; @@ -48,11 +49,13 @@ public class ImageMotionServiceImpl implements ImageMotionService { return false; } + + @Override - public boolean copyTemplate(TemplateOnPrimaryDataStoreInfo templateStore) { + public void copyTemplateAsync(TemplateInfo destTemplate, TemplateInfo srcTemplate, AsyncCompletionCallback callback) { ImageMotionStrategy ims = null; for (ImageMotionStrategy strategy : motionStrategies) { - if (strategy.canHandle(templateStore)) { + if (strategy.canHandle(srcTemplate)) { ims = strategy; break; } @@ -62,34 +65,11 @@ public class ImageMotionServiceImpl implements ImageMotionService { throw new CloudRuntimeException("Can't find proper image motion strategy"); } - EndPoint ep = ims.getEndPoint(templateStore); - - volumeService.grantAccess(templateStore, ep); - TemplateInfo template = templateStore.getTemplate(); - imageService.grantTemplateAccess(template, ep); - return ims.copyTemplate(templateStore, ep); - } - - @Override - public void copyTemplateAsync(TemplateOnPrimaryDataStoreInfo templateStore, AsyncCompletionCallback callback) { - ImageMotionStrategy ims = null; - for (ImageMotionStrategy strategy : motionStrategies) { - if (strategy.canHandle(templateStore)) { - ims = strategy; - break; - } - } - - if (ims == null) { - throw new CloudRuntimeException("Can't find proper image motion strategy"); - } - - EndPoint ep = ims.getEndPoint(templateStore); - volumeService.grantAccess(templateStore, ep); - TemplateInfo template = templateStore.getTemplate(); - imageService.grantTemplateAccess(template, ep); + EndPoint ep = ims.getEndPoint(destTemplate, srcTemplate); + String srcUri = srcTemplate.getDataStore().grantAccess(srcTemplate, ep); + String destUri = destTemplate.getDataStore().grantAccess(destTemplate, ep); - ims.copyTemplateAsync(templateStore, ep, callback); + ims.copyTemplateAsync(destUri, srcUri, ep, callback); } diff --git a/engine/storage/imagemotion/src/org/apache/cloudstack/storage/image/motion/ImageMotionStrategy.java b/engine/storage/imagemotion/src/org/apache/cloudstack/storage/image/motion/ImageMotionStrategy.java index f1f4c7b8319..037005d7134 100644 --- a/engine/storage/imagemotion/src/org/apache/cloudstack/storage/image/motion/ImageMotionStrategy.java +++ b/engine/storage/imagemotion/src/org/apache/cloudstack/storage/image/motion/ImageMotionStrategy.java @@ -22,13 +22,11 @@ import org.apache.cloudstack.framework.async.AsyncCompletionCallback; import org.apache.cloudstack.storage.EndPoint; import org.apache.cloudstack.storage.volume.TemplateOnPrimaryDataStoreInfo; import org.apache.cloudstack.storage.command.CommandResult; +import org.apache.cloudstack.storage.datastore.DataStore; +import org.apache.cloudstack.storage.image.TemplateInfo; public interface ImageMotionStrategy { - public boolean canHandle(TemplateOnPrimaryDataStoreInfo templateStore); - - public EndPoint getEndPoint(TemplateOnPrimaryDataStoreInfo templateStore); - - public boolean copyTemplate(TemplateOnPrimaryDataStoreInfo templateStore, EndPoint ep); - - public void copyTemplateAsync(TemplateOnPrimaryDataStoreInfo templateStore, EndPoint ep, AsyncCompletionCallback callback); + public boolean canHandle(TemplateInfo templateStore); + public EndPoint getEndPoint(TemplateInfo destTemplate, TemplateInfo srcTemplate); + public void copyTemplateAsync(String destUri, String sourceUri, EndPoint ep, AsyncCompletionCallback callback); } diff --git a/engine/storage/src/org/apache/cloudstack/storage/command/CopyTemplateToPrimaryStorageCmd.java b/engine/storage/src/org/apache/cloudstack/storage/command/CopyCmd.java similarity index 64% rename from engine/storage/src/org/apache/cloudstack/storage/command/CopyTemplateToPrimaryStorageCmd.java rename to engine/storage/src/org/apache/cloudstack/storage/command/CopyCmd.java index dd2030d95ec..42eaa2fbce2 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/command/CopyTemplateToPrimaryStorageCmd.java +++ b/engine/storage/src/org/apache/cloudstack/storage/command/CopyCmd.java @@ -4,17 +4,17 @@ import org.apache.cloudstack.storage.to.ImageOnPrimayDataStoreTO; import com.cloud.agent.api.Command; -public class CopyTemplateToPrimaryStorageCmd extends Command implements StorageSubSystemCommand { +public class CopyCmd extends Command implements StorageSubSystemCommand { private ImageOnPrimayDataStoreTO imageTO; - protected CopyTemplateToPrimaryStorageCmd() { + protected CopyCmd() { super(); } - public CopyTemplateToPrimaryStorageCmd(ImageOnPrimayDataStoreTO image) { + public CopyCmd(String destUri, String srcUri) { super(); - this.imageTO = image; + // this.imageTO = image; } public ImageOnPrimayDataStoreTO getImage() { diff --git a/engine/storage/src/org/apache/cloudstack/storage/command/CreateVolumeFromBaseImageCommand.java b/engine/storage/src/org/apache/cloudstack/storage/command/CreateVolumeFromBaseImageCommand.java index 4780e00d00c..f4be0676b9b 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/command/CreateVolumeFromBaseImageCommand.java +++ b/engine/storage/src/org/apache/cloudstack/storage/command/CreateVolumeFromBaseImageCommand.java @@ -27,9 +27,9 @@ public class CreateVolumeFromBaseImageCommand extends Command implements Storage private final VolumeTO volume; private final ImageOnPrimayDataStoreTO image; - public CreateVolumeFromBaseImageCommand(VolumeTO volume, ImageOnPrimayDataStoreTO image) { + public CreateVolumeFromBaseImageCommand(VolumeTO volume, String image) { this.volume = volume; - this.image = image; + this.image = null; } public VolumeTO getVolume() { diff --git a/engine/storage/src/org/apache/cloudstack/storage/datastore/DataStore.java b/engine/storage/src/org/apache/cloudstack/storage/datastore/DataStore.java new file mode 100644 index 00000000000..df21b6e96a4 --- /dev/null +++ b/engine/storage/src/org/apache/cloudstack/storage/datastore/DataStore.java @@ -0,0 +1,17 @@ +package org.apache.cloudstack.storage.datastore; + +import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo; +import org.apache.cloudstack.storage.EndPoint; +import org.apache.cloudstack.storage.image.TemplateInfo; +import org.apache.cloudstack.storage.snapshot.SnapshotInfo; + +public interface DataStore { + String grantAccess(VolumeInfo volume, EndPoint ep); + boolean revokeAccess(VolumeInfo volume, EndPoint ep); + String grantAccess(TemplateInfo template, EndPoint ep); + boolean revokeAccess(TemplateInfo template, EndPoint ep); + String grantAccess(SnapshotInfo snapshot, EndPoint ep); + boolean revokeAccess(SnapshotInfo snapshot, EndPoint ep); + String getRole(); + long getId(); +} diff --git a/engine/storage/src/org/apache/cloudstack/storage/datastore/ObjectInDataStoreManager.java b/engine/storage/src/org/apache/cloudstack/storage/datastore/ObjectInDataStoreManager.java new file mode 100644 index 00000000000..7bca13b8587 --- /dev/null +++ b/engine/storage/src/org/apache/cloudstack/storage/datastore/ObjectInDataStoreManager.java @@ -0,0 +1,17 @@ +package org.apache.cloudstack.storage.datastore; + +import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo; +import org.apache.cloudstack.storage.db.ObjectInDataStoreVO; +import org.apache.cloudstack.storage.image.TemplateInfo; +import org.apache.cloudstack.storage.snapshot.SnapshotInfo; +import org.apache.cloudstack.storage.volume.ObjectInDataStoreStateMachine; + +public interface ObjectInDataStoreManager { + public TemplateInfo create(TemplateInfo template, DataStore dataStore); + public ObjectInDataStoreVO create(VolumeInfo volume, DataStore dataStore); + public ObjectInDataStoreVO create(SnapshotInfo snapshot, DataStore dataStore); + public TemplateInfo findTemplate(TemplateInfo template, DataStore dataStore); + public VolumeInfo findVolume(VolumeInfo volume, DataStore dataStore); + public SnapshotInfo findSnapshot(SnapshotInfo snapshot, DataStore dataStore); + public boolean update(TemplateInfo vo, ObjectInDataStoreStateMachine.Event event); +} diff --git a/engine/storage/src/org/apache/cloudstack/storage/datastore/ObjectInDataStoreManagerImpl.java b/engine/storage/src/org/apache/cloudstack/storage/datastore/ObjectInDataStoreManagerImpl.java new file mode 100644 index 00000000000..2cc72dd11b7 --- /dev/null +++ b/engine/storage/src/org/apache/cloudstack/storage/datastore/ObjectInDataStoreManagerImpl.java @@ -0,0 +1,65 @@ +package org.apache.cloudstack.storage.datastore; + +import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo; +import org.apache.cloudstack.storage.db.ObjectInDataStoreDao; +import org.apache.cloudstack.storage.db.ObjectInDataStoreVO; +import org.apache.cloudstack.storage.image.TemplateInfo; +import org.apache.cloudstack.storage.snapshot.SnapshotInfo; +import org.apache.cloudstack.storage.volume.ObjectInDataStoreStateMachine.Event; +import org.springframework.stereotype.Component; + +import com.cloud.utils.component.Inject; + +@Component +public class ObjectInDataStoreManagerImpl implements ObjectInDataStoreManager { + @Inject + ObjectInDataStoreDao objectDataStoreDao; + @Override + public TemplateInfo create(TemplateInfo template, DataStore dataStore) { + ObjectInDataStoreVO vo = new ObjectInDataStoreVO(); + vo.setDataStoreId(dataStore.getId()); + vo.setDataStoreType(dataStore.getRole()); + vo.setObjectId(template.getId()); + vo.setObjectType("template"); + vo = objectDataStoreDao.persist(vo); + TemplateInDataStore tmpl = new TemplateInDataStore(template, dataStore, vo); + return tmpl; + } + + @Override + public ObjectInDataStoreVO create(VolumeInfo volume, DataStore dataStore) { + // TODO Auto-generated method stub + return null; + } + + @Override + public ObjectInDataStoreVO create(SnapshotInfo snapshot, DataStore dataStore) { + // TODO Auto-generated method stub + return null; + } + + @Override + public TemplateInfo findTemplate(TemplateInfo template, DataStore dataStore) { + // TODO Auto-generated method stub + return null; + } + + @Override + public VolumeInfo findVolume(VolumeInfo volume, DataStore dataStore) { + // TODO Auto-generated method stub + return null; + } + + @Override + public SnapshotInfo findSnapshot(SnapshotInfo snapshot, DataStore dataStore) { + // TODO Auto-generated method stub + return null; + } + + @Override + public boolean update(TemplateInfo vo, Event event) { + // TODO Auto-generated method stub + return false; + } + +} diff --git a/engine/storage/src/org/apache/cloudstack/storage/datastore/PrimaryDataStore.java b/engine/storage/src/org/apache/cloudstack/storage/datastore/PrimaryDataStore.java index 51c8696b421..cf4f879a37c 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/datastore/PrimaryDataStore.java +++ b/engine/storage/src/org/apache/cloudstack/storage/datastore/PrimaryDataStore.java @@ -31,7 +31,7 @@ import org.apache.cloudstack.storage.to.PrimaryDataStoreTO; import org.apache.cloudstack.storage.to.VolumeTO; import org.apache.cloudstack.storage.volume.TemplateOnPrimaryDataStoreInfo; -public interface PrimaryDataStore extends PrimaryDataStoreInfo { +public interface PrimaryDataStore extends DataStore, PrimaryDataStoreInfo { VolumeInfo getVolume(long id); List getVolumes(); @@ -42,7 +42,7 @@ public interface PrimaryDataStore extends PrimaryDataStoreInfo { VolumeInfo createVoluemFromBaseImage(VolumeInfo volume, TemplateOnPrimaryDataStoreInfo templateStore); - void createVoluemFromBaseImageAsync(VolumeInfo volume, TemplateOnPrimaryDataStoreInfo templateStore, AsyncCompletionCallback callback); + void createVoluemFromBaseImageAsync(VolumeInfo volume, TemplateInfo templateStore, AsyncCompletionCallback callback); List getEndPoints(); diff --git a/engine/storage/src/org/apache/cloudstack/storage/datastore/TemplateInDataStore.java b/engine/storage/src/org/apache/cloudstack/storage/datastore/TemplateInDataStore.java new file mode 100644 index 00000000000..f3697cf5a96 --- /dev/null +++ b/engine/storage/src/org/apache/cloudstack/storage/datastore/TemplateInDataStore.java @@ -0,0 +1,42 @@ +package org.apache.cloudstack.storage.datastore; + +import org.apache.cloudstack.engine.subsystem.api.storage.disktype.VolumeDiskType; +import org.apache.cloudstack.storage.db.ObjectInDataStoreVO; +import org.apache.cloudstack.storage.image.TemplateInfo; +import org.apache.cloudstack.storage.image.store.ImageDataStoreInfo; + +public class TemplateInDataStore implements TemplateInfo { + public TemplateInDataStore(TemplateInfo template, DataStore dataStore, ObjectInDataStoreVO obj) { + + } + @Override + public ImageDataStoreInfo getDataStore() { + // TODO Auto-generated method stub + return null; + } + + @Override + public long getId() { + // TODO Auto-generated method stub + return 0; + } + + @Override + public VolumeDiskType getDiskType() { + // TODO Auto-generated method stub + return null; + } + + @Override + public String getPath() { + // TODO Auto-generated method stub + return null; + } + + @Override + public String getUuid() { + // TODO Auto-generated method stub + return null; + } + +} diff --git a/engine/storage/src/org/apache/cloudstack/storage/db/ObjectInDataStoreDao.java b/engine/storage/src/org/apache/cloudstack/storage/db/ObjectInDataStoreDao.java new file mode 100644 index 00000000000..13d8132da86 --- /dev/null +++ b/engine/storage/src/org/apache/cloudstack/storage/db/ObjectInDataStoreDao.java @@ -0,0 +1,9 @@ +package org.apache.cloudstack.storage.db; + +import org.apache.cloudstack.storage.volume.ObjectInDataStoreStateMachine; +import com.cloud.utils.db.GenericDao; +import com.cloud.utils.fsm.StateDao; + +public interface ObjectInDataStoreDao extends GenericDao, StateDao { + +} diff --git a/engine/storage/src/org/apache/cloudstack/storage/db/ObjectInDataStoreDaoImpl.java b/engine/storage/src/org/apache/cloudstack/storage/db/ObjectInDataStoreDaoImpl.java new file mode 100644 index 00000000000..9932b486b1f --- /dev/null +++ b/engine/storage/src/org/apache/cloudstack/storage/db/ObjectInDataStoreDaoImpl.java @@ -0,0 +1,20 @@ +package org.apache.cloudstack.storage.db; + + + +import org.apache.cloudstack.storage.volume.ObjectInDataStoreStateMachine.Event; +import org.apache.cloudstack.storage.volume.ObjectInDataStoreStateMachine.State; + +import com.cloud.utils.db.GenericDaoBase; + + +public class ObjectInDataStoreDaoImpl extends GenericDaoBase implements ObjectInDataStoreDao { + + @Override + public boolean updateState(State currentState, Event event, + State nextState, ObjectInDataStoreVO vo, Object data) { + // TODO Auto-generated method stub + return false; + } + +} diff --git a/engine/storage/src/org/apache/cloudstack/storage/db/ObjectInDataStoreVO.java b/engine/storage/src/org/apache/cloudstack/storage/db/ObjectInDataStoreVO.java new file mode 100644 index 00000000000..2b92f6df827 --- /dev/null +++ b/engine/storage/src/org/apache/cloudstack/storage/db/ObjectInDataStoreVO.java @@ -0,0 +1,108 @@ +package org.apache.cloudstack.storage.db; + +import java.util.Date; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; + +import com.cloud.storage.VMTemplateStorageResourceAssoc.Status; +import com.cloud.utils.db.GenericDaoBase; + +@Entity +@Table(name = "object_datastore_ref") +public class ObjectInDataStoreVO { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + long id; + + @Column(name = "datastore_id") + private long dataStoreId; + + @Column(name = "datastore_type") + private String dataStoreType; + + @Column(name = "ojbect_id") + long objectId; + + @Column(name = "object_type") + String objectType; + + @Column(name = GenericDaoBase.CREATED_COLUMN) + Date created = null; + + @Column(name = "last_updated") + @Temporal(value = TemporalType.TIMESTAMP) + Date lastUpdated = null; + + @Column(name = "download_pct") + int downloadPercent; + + @Column(name = "download_state") + @Enumerated(EnumType.STRING) + Status downloadState; + + @Column(name = "local_path") + String localDownloadPath; + + @Column(name = "error_str") + String errorString; + + @Column(name = "job_id") + String jobId; + + @Column(name = "install_path") + String installPath; + + @Column(name = "size") + long size; + + @Column(name = "state") + String state; + + @Column(name="update_count", updatable = true, nullable=false) + protected long updatedCount; + + public long getId() { + return this.id; + } + + public long getDataStoreId() { + return this.dataStoreId; + } + + public void setDataStoreId(long id) { + this.dataStoreId = id; + } + + public String getDataStoreType() { + return this.dataStoreType; + } + + public void setDataStoreType(String type) { + this.dataStoreType = type; + } + + public long getObjectId() { + return this.objectId; + } + + public void setObjectId(long id) { + this.objectId = id; + } + + public String getObjectType() { + return this.objectType; + } + + public void setObjectType(String type) { + this.objectType = type; + } +} diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/TemplateEntityImpl.java b/engine/storage/src/org/apache/cloudstack/storage/image/TemplateEntityImpl.java index d9eceb38440..a9998ae7869 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/image/TemplateEntityImpl.java +++ b/engine/storage/src/org/apache/cloudstack/storage/image/TemplateEntityImpl.java @@ -38,7 +38,7 @@ public class TemplateEntityImpl implements TemplateEntity { } public ImageDataStoreInfo getImageDataStore() { - return templateInfo.getImageDataStore(); + return (ImageDataStoreInfo)templateInfo.getDataStore(); } public long getImageDataStoreId() { diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/TemplateInfo.java b/engine/storage/src/org/apache/cloudstack/storage/image/TemplateInfo.java index 0e11f3eb358..45fb51578a5 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/image/TemplateInfo.java +++ b/engine/storage/src/org/apache/cloudstack/storage/image/TemplateInfo.java @@ -22,8 +22,8 @@ import org.apache.cloudstack.engine.subsystem.api.storage.disktype.VolumeDiskTyp import org.apache.cloudstack.storage.image.store.ImageDataStoreInfo; public interface TemplateInfo { - ImageDataStoreInfo getImageDataStore(); - + ImageDataStoreInfo getDataStore(); + long getId(); VolumeDiskType getDiskType(); diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/motion/ImageMotionService.java b/engine/storage/src/org/apache/cloudstack/storage/image/motion/ImageMotionService.java index 1f60e4a7ce7..89de552ba92 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/image/motion/ImageMotionService.java +++ b/engine/storage/src/org/apache/cloudstack/storage/image/motion/ImageMotionService.java @@ -20,11 +20,11 @@ package org.apache.cloudstack.storage.image.motion; import org.apache.cloudstack.framework.async.AsyncCompletionCallback; import org.apache.cloudstack.storage.command.CommandResult; +import org.apache.cloudstack.storage.db.ObjectInDataStoreVO; +import org.apache.cloudstack.storage.image.TemplateInfo; import org.apache.cloudstack.storage.volume.TemplateOnPrimaryDataStoreInfo; public interface ImageMotionService { - boolean copyTemplate(TemplateOnPrimaryDataStoreInfo templateStore); - - void copyTemplateAsync(TemplateOnPrimaryDataStoreInfo templateStore, AsyncCompletionCallback callback); + void copyTemplateAsync(TemplateInfo destTemplate, TemplateInfo srcTemplate, AsyncCompletionCallback callback); boolean copyIso(String isoUri, String destIsoUri); } diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/store/ImageDataStoreInfo.java b/engine/storage/src/org/apache/cloudstack/storage/image/store/ImageDataStoreInfo.java index 17564773ef1..4c55c081343 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/image/store/ImageDataStoreInfo.java +++ b/engine/storage/src/org/apache/cloudstack/storage/image/store/ImageDataStoreInfo.java @@ -18,7 +18,9 @@ */ package org.apache.cloudstack.storage.image.store; -public interface ImageDataStoreInfo { +import org.apache.cloudstack.storage.datastore.DataStore; + +public interface ImageDataStoreInfo extends DataStore { public long getImageDataStoreId(); public String getType(); public String getUri(); diff --git a/engine/storage/src/org/apache/cloudstack/storage/to/TemplateTO.java b/engine/storage/src/org/apache/cloudstack/storage/to/TemplateTO.java index f565712011d..e0d18dbdc48 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/to/TemplateTO.java +++ b/engine/storage/src/org/apache/cloudstack/storage/to/TemplateTO.java @@ -2,6 +2,7 @@ package org.apache.cloudstack.storage.to; import org.apache.cloudstack.engine.subsystem.api.storage.disktype.VolumeDiskType; import org.apache.cloudstack.storage.image.TemplateInfo; +import org.apache.cloudstack.storage.image.store.ImageDataStoreInfo; public class TemplateTO { private final String path; @@ -13,7 +14,7 @@ public class TemplateTO { this.path = template.getPath(); this.uuid = template.getUuid(); this.diskType = template.getDiskType(); - this.imageDataStore = new ImageDataStoreTO(template.getImageDataStore()); + this.imageDataStore = new ImageDataStoreTO((ImageDataStoreInfo)template.getDataStore()); } public String getPath() { diff --git a/engine/storage/src/org/apache/cloudstack/storage/volume/TemplateOnPrimaryDataStoreStateMachine.java b/engine/storage/src/org/apache/cloudstack/storage/volume/ObjectInDataStoreStateMachine.java similarity index 92% rename from engine/storage/src/org/apache/cloudstack/storage/volume/TemplateOnPrimaryDataStoreStateMachine.java rename to engine/storage/src/org/apache/cloudstack/storage/volume/ObjectInDataStoreStateMachine.java index 7f0cd9be5ee..11cf2ef928c 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/volume/TemplateOnPrimaryDataStoreStateMachine.java +++ b/engine/storage/src/org/apache/cloudstack/storage/volume/ObjectInDataStoreStateMachine.java @@ -20,7 +20,7 @@ package org.apache.cloudstack.storage.volume; import com.cloud.utils.fsm.StateObject; -public interface TemplateOnPrimaryDataStoreStateMachine extends StateObject { +public interface ObjectInDataStoreStateMachine extends StateObject { enum State { Allocated("The initial state"), Creating("The template is being downloading to data store"), diff --git a/engine/storage/src/org/apache/cloudstack/storage/volume/db/TemplatePrimaryDataStoreDao.java b/engine/storage/src/org/apache/cloudstack/storage/volume/db/TemplatePrimaryDataStoreDao.java index 3f8f71d35bb..45ff1ec2258 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/volume/db/TemplatePrimaryDataStoreDao.java +++ b/engine/storage/src/org/apache/cloudstack/storage/volume/db/TemplatePrimaryDataStoreDao.java @@ -18,12 +18,12 @@ */ package org.apache.cloudstack.storage.volume.db; -import org.apache.cloudstack.storage.volume.TemplateOnPrimaryDataStoreStateMachine; +import org.apache.cloudstack.storage.volume.ObjectInDataStoreStateMachine; import com.cloud.utils.db.GenericDao; import com.cloud.utils.fsm.StateDao; -public interface TemplatePrimaryDataStoreDao extends GenericDao, StateDao { +public interface TemplatePrimaryDataStoreDao extends GenericDao, StateDao { public TemplatePrimaryDataStoreVO findByTemplateIdAndPoolId(long templateId, long poolId); public TemplatePrimaryDataStoreVO findByTemplateIdAndPoolIdAndReady(long templateId, long poolId); } diff --git a/engine/storage/src/org/apache/cloudstack/storage/volume/db/TemplatePrimaryDataStoreDaoImpl.java b/engine/storage/src/org/apache/cloudstack/storage/volume/db/TemplatePrimaryDataStoreDaoImpl.java index 00732e13df8..b47f08881e1 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/volume/db/TemplatePrimaryDataStoreDaoImpl.java +++ b/engine/storage/src/org/apache/cloudstack/storage/volume/db/TemplatePrimaryDataStoreDaoImpl.java @@ -20,9 +20,9 @@ package org.apache.cloudstack.storage.volume.db; import java.util.Date; -import org.apache.cloudstack.storage.volume.TemplateOnPrimaryDataStoreStateMachine; -import org.apache.cloudstack.storage.volume.TemplateOnPrimaryDataStoreStateMachine.Event; -import org.apache.cloudstack.storage.volume.TemplateOnPrimaryDataStoreStateMachine.State; +import org.apache.cloudstack.storage.volume.ObjectInDataStoreStateMachine; +import org.apache.cloudstack.storage.volume.ObjectInDataStoreStateMachine.Event; +import org.apache.cloudstack.storage.volume.ObjectInDataStoreStateMachine.State; import org.apache.log4j.Logger; import org.springframework.stereotype.Component; @@ -58,7 +58,7 @@ public class TemplatePrimaryDataStoreDaoImpl extends GenericDaoBase sc = SearchCriteria2.create(TemplatePrimaryDataStoreVO.class); sc.addAnd(sc.getEntity().getTemplateId(), Op.EQ, templateId); sc.addAnd(sc.getEntity().getPoolId(), Op.EQ, poolId); - sc.addAnd(sc.getEntity().getState(), Op.EQ, TemplateOnPrimaryDataStoreStateMachine.State.Ready); + sc.addAnd(sc.getEntity().getState(), Op.EQ, ObjectInDataStoreStateMachine.State.Ready); return sc.find(); } diff --git a/engine/storage/src/org/apache/cloudstack/storage/volume/db/TemplatePrimaryDataStoreVO.java b/engine/storage/src/org/apache/cloudstack/storage/volume/db/TemplatePrimaryDataStoreVO.java index ffaa6f7f944..2d355df7e2a 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/volume/db/TemplatePrimaryDataStoreVO.java +++ b/engine/storage/src/org/apache/cloudstack/storage/volume/db/TemplatePrimaryDataStoreVO.java @@ -32,13 +32,13 @@ import javax.persistence.Temporal; import javax.persistence.TemporalType; import com.cloud.storage.VMTemplateStorageResourceAssoc.Status; -import org.apache.cloudstack.storage.volume.TemplateOnPrimaryDataStoreStateMachine; +import org.apache.cloudstack.storage.volume.ObjectInDataStoreStateMachine; import com.cloud.utils.db.GenericDaoBase; import com.cloud.utils.fsm.StateObject; @Entity @Table(name = "template_spool_ref") -public class TemplatePrimaryDataStoreVO implements StateObject { +public class TemplatePrimaryDataStoreVO implements StateObject { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) long id; @@ -83,7 +83,7 @@ public class TemplatePrimaryDataStoreVO implements StateObject callback) { + public void createVoluemFromBaseImageAsync(VolumeInfo volume, TemplateInfo templateStore, AsyncCompletionCallback callback) { VolumeObject vo = (VolumeObject) volume; - vo.setVolumeDiskType(templateStore.getTemplate().getDiskType()); - - this.driver.createVolumeFromBaseImageAsync(vo, templateStore, callback); + vo.setVolumeDiskType(templateStore.getDiskType()); + String templateUri = templateStore.getDataStore().grantAccess(templateStore, this.getEndPoints().get(0)); + this.driver.createVolumeFromBaseImageAsync(vo, templateUri, callback); } @Override @@ -264,5 +265,46 @@ public class DefaultPrimaryDataStore implements PrimaryDataStore { return this.provider; } + @Override + public String grantAccess(VolumeInfo volume, EndPoint ep) { + return this.driver.grantAccess((VolumeObject)volume, ep); + } + + @Override + public boolean revokeAccess(VolumeInfo volume, EndPoint ep) { + // TODO Auto-generated method stub + return false; + } + + @Override + public String grantAccess(TemplateInfo template, EndPoint ep) { + // TODO Auto-generated method stub + return null; + } + + @Override + public boolean revokeAccess(TemplateInfo template, EndPoint ep) { + // TODO Auto-generated method stub + return false; + } + + @Override + public String grantAccess(SnapshotInfo snapshot, EndPoint ep) { + // TODO Auto-generated method stub + return null; + } + + @Override + public boolean revokeAccess(SnapshotInfo snapshot, EndPoint ep) { + // TODO Auto-generated method stub + return false; + } + + @Override + public String getRole() { + // TODO Auto-generated method stub + return "volumeStore"; + } + } diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/driver/DefaultPrimaryDataStoreDriverImpl.java b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/driver/DefaultPrimaryDataStoreDriverImpl.java index 5567037501e..ee0bcc3a06d 100644 --- a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/driver/DefaultPrimaryDataStoreDriverImpl.java +++ b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/driver/DefaultPrimaryDataStoreDriverImpl.java @@ -134,11 +134,10 @@ public class DefaultPrimaryDataStoreDriverImpl implements PrimaryDataStoreDriver } @Override - public void createVolumeFromBaseImageAsync(VolumeObject volume, TemplateOnPrimaryDataStoreInfo template, AsyncCompletionCallback callback) { + public void createVolumeFromBaseImageAsync(VolumeObject volume, String template, AsyncCompletionCallback callback) { VolumeTO vol = this.dataStore.getVolumeTO(volume); - ImageOnPrimayDataStoreTO image = new ImageOnPrimayDataStoreTO(template); - CreateVolumeFromBaseImageCommand cmd = new CreateVolumeFromBaseImageCommand(vol, image); - List endPoints = template.getPrimaryDataStore().getEndPoints(); + CreateVolumeFromBaseImageCommand cmd = new CreateVolumeFromBaseImageCommand(vol, template); + List endPoints = this.dataStore.getEndPoints(); EndPoint ep = endPoints.get(0); CreateVolumeFromBaseImageContext context = new CreateVolumeFromBaseImageContext(callback, volume); diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/driver/PrimaryDataStoreDriver.java b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/driver/PrimaryDataStoreDriver.java index eca7d798cf6..57b3a3079d8 100644 --- a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/driver/PrimaryDataStoreDriver.java +++ b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/driver/PrimaryDataStoreDriver.java @@ -12,7 +12,7 @@ import org.apache.cloudstack.storage.volume.VolumeObject; public interface PrimaryDataStoreDriver { void createVolumeAsync(VolumeObject vol, AsyncCompletionCallback callback); - void createVolumeFromBaseImageAsync(VolumeObject volume, TemplateOnPrimaryDataStoreInfo template, AsyncCompletionCallback callback); + void createVolumeFromBaseImageAsync(VolumeObject volume, String template, AsyncCompletionCallback callback); void deleteVolumeAsync(VolumeObject vo, AsyncCompletionCallback callback); diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/TemplateOnPrimaryDataStoreObject.java b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/TemplateOnPrimaryDataStoreObject.java index 0ae45e37227..9221fb481ce 100644 --- a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/TemplateOnPrimaryDataStoreObject.java +++ b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/TemplateOnPrimaryDataStoreObject.java @@ -20,8 +20,8 @@ package org.apache.cloudstack.storage.volume; import org.apache.cloudstack.storage.datastore.PrimaryDataStore; import org.apache.cloudstack.storage.image.TemplateInfo; -import org.apache.cloudstack.storage.volume.TemplateOnPrimaryDataStoreStateMachine.Event; -import org.apache.cloudstack.storage.volume.TemplateOnPrimaryDataStoreStateMachine.State; +import org.apache.cloudstack.storage.volume.ObjectInDataStoreStateMachine.Event; +import org.apache.cloudstack.storage.volume.ObjectInDataStoreStateMachine.State; import org.apache.cloudstack.storage.volume.db.TemplatePrimaryDataStoreDao; import org.apache.cloudstack.storage.volume.db.TemplatePrimaryDataStoreVO; @@ -74,7 +74,7 @@ public class TemplateOnPrimaryDataStoreObject implements TemplateOnPrimaryDataSt vo = templateStoreDao.findById(vo.getId()); } - public void stateTransit(TemplateOnPrimaryDataStoreStateMachine.Event event) { + public void stateTransit(ObjectInDataStoreStateMachine.Event event) { try { this.stateMachine.transitTo(vo, event, null, templateStoreDao); vo = templateStoreDao.findById(vo.getId()); diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/TemplatePrimaryDataStoreManager.java b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/TemplatePrimaryDataStoreManager.java index 4c08fee29e4..59784249158 100644 --- a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/TemplatePrimaryDataStoreManager.java +++ b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/TemplatePrimaryDataStoreManager.java @@ -20,8 +20,8 @@ package org.apache.cloudstack.storage.volume; import org.apache.cloudstack.storage.datastore.PrimaryDataStore; import org.apache.cloudstack.storage.image.TemplateInfo; -import org.apache.cloudstack.storage.volume.TemplateOnPrimaryDataStoreStateMachine.Event; -import org.apache.cloudstack.storage.volume.TemplateOnPrimaryDataStoreStateMachine.State; +import org.apache.cloudstack.storage.volume.ObjectInDataStoreStateMachine.Event; +import org.apache.cloudstack.storage.volume.ObjectInDataStoreStateMachine.State; import org.apache.cloudstack.storage.volume.db.TemplatePrimaryDataStoreVO; import com.cloud.utils.fsm.StateMachine2; diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/TemplatePrimaryDataStoreManagerImpl.java b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/TemplatePrimaryDataStoreManagerImpl.java index d1cac977588..fc4e4fd2659 100644 --- a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/TemplatePrimaryDataStoreManagerImpl.java +++ b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/TemplatePrimaryDataStoreManagerImpl.java @@ -23,8 +23,8 @@ import javax.inject.Inject; import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreInfo; import org.apache.cloudstack.storage.datastore.PrimaryDataStore; import org.apache.cloudstack.storage.image.TemplateInfo; -import org.apache.cloudstack.storage.volume.TemplateOnPrimaryDataStoreStateMachine.Event; -import org.apache.cloudstack.storage.volume.TemplateOnPrimaryDataStoreStateMachine.State; +import org.apache.cloudstack.storage.volume.ObjectInDataStoreStateMachine.Event; +import org.apache.cloudstack.storage.volume.ObjectInDataStoreStateMachine.State; import org.apache.cloudstack.storage.volume.db.TemplatePrimaryDataStoreDao; import org.apache.cloudstack.storage.volume.db.TemplatePrimaryDataStoreVO; import org.springframework.stereotype.Component; @@ -45,14 +45,14 @@ public class TemplatePrimaryDataStoreManagerImpl implements TemplatePrimaryDataS protected StateMachine2 stateMachines; public TemplatePrimaryDataStoreManagerImpl() { stateMachines = new StateMachine2(); - stateMachines.addTransition(TemplateOnPrimaryDataStoreStateMachine.State.Allocated, Event.CreateRequested, TemplateOnPrimaryDataStoreStateMachine.State.Creating); - stateMachines.addTransition(TemplateOnPrimaryDataStoreStateMachine.State.Creating, Event.OperationSuccessed, TemplateOnPrimaryDataStoreStateMachine.State.Ready); - stateMachines.addTransition(TemplateOnPrimaryDataStoreStateMachine.State.Creating, Event.OperationFailed, TemplateOnPrimaryDataStoreStateMachine.State.Failed); - stateMachines.addTransition(TemplateOnPrimaryDataStoreStateMachine.State.Failed, Event.CreateRequested, TemplateOnPrimaryDataStoreStateMachine.State.Creating); - stateMachines.addTransition(TemplateOnPrimaryDataStoreStateMachine.State.Ready, Event.DestroyRequested, TemplateOnPrimaryDataStoreStateMachine.State.Destroying); - stateMachines.addTransition(TemplateOnPrimaryDataStoreStateMachine.State.Destroying, Event.OperationSuccessed, TemplateOnPrimaryDataStoreStateMachine.State.Destroyed); - stateMachines.addTransition(TemplateOnPrimaryDataStoreStateMachine.State.Destroying, Event.OperationFailed, TemplateOnPrimaryDataStoreStateMachine.State.Destroying); - stateMachines.addTransition(TemplateOnPrimaryDataStoreStateMachine.State.Destroying, Event.DestroyRequested, TemplateOnPrimaryDataStoreStateMachine.State.Destroying); + stateMachines.addTransition(ObjectInDataStoreStateMachine.State.Allocated, Event.CreateRequested, ObjectInDataStoreStateMachine.State.Creating); + stateMachines.addTransition(ObjectInDataStoreStateMachine.State.Creating, Event.OperationSuccessed, ObjectInDataStoreStateMachine.State.Ready); + stateMachines.addTransition(ObjectInDataStoreStateMachine.State.Creating, Event.OperationFailed, ObjectInDataStoreStateMachine.State.Failed); + stateMachines.addTransition(ObjectInDataStoreStateMachine.State.Failed, Event.CreateRequested, ObjectInDataStoreStateMachine.State.Creating); + stateMachines.addTransition(ObjectInDataStoreStateMachine.State.Ready, Event.DestroyRequested, ObjectInDataStoreStateMachine.State.Destroying); + stateMachines.addTransition(ObjectInDataStoreStateMachine.State.Destroying, Event.OperationSuccessed, ObjectInDataStoreStateMachine.State.Destroyed); + stateMachines.addTransition(ObjectInDataStoreStateMachine.State.Destroying, Event.OperationFailed, ObjectInDataStoreStateMachine.State.Destroying); + stateMachines.addTransition(ObjectInDataStoreStateMachine.State.Destroying, Event.DestroyRequested, ObjectInDataStoreStateMachine.State.Destroying); } private TemplatePrimaryDataStoreVO waitingForTemplateDownload(TemplateInfo template, PrimaryDataStoreInfo dataStore) { @@ -98,7 +98,7 @@ public class TemplatePrimaryDataStoreManagerImpl implements TemplatePrimaryDataS } //If it's not a fresh template downloading, waiting for other people downloading finished. - if (!freshNewTemplate && templateStoreVO.getState() != TemplateOnPrimaryDataStoreStateMachine.State.Ready) { + if (!freshNewTemplate && templateStoreVO.getState() != ObjectInDataStoreStateMachine.State.Ready) { templateStoreVO = waitingForTemplateDownload(template, dataStore); } diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java index fa047e840a2..afe985b369c 100644 --- a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java +++ b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java @@ -30,8 +30,10 @@ import org.apache.cloudstack.framework.async.AsyncCompletionCallback; import org.apache.cloudstack.framework.async.AsyncRpcConext; import org.apache.cloudstack.storage.EndPoint; import org.apache.cloudstack.storage.command.CommandResult; +import org.apache.cloudstack.storage.datastore.ObjectInDataStoreManager; import org.apache.cloudstack.storage.datastore.PrimaryDataStore; import org.apache.cloudstack.storage.datastore.manager.PrimaryDataStoreManager; +import org.apache.cloudstack.storage.db.ObjectInDataStoreVO; import org.apache.cloudstack.storage.image.TemplateInfo; import org.apache.cloudstack.storage.image.motion.ImageMotionService; import org.apache.cloudstack.storage.volume.VolumeService.VolumeApiResult; @@ -54,7 +56,7 @@ public class VolumeServiceImpl implements VolumeService { @Inject PrimaryDataStoreManager dataStoreMgr; @Inject - TemplatePrimaryDataStoreManager templatePrimaryStoreMgr; + ObjectInDataStoreManager objectInDataStoreMgr; @Inject ImageMotionService imageMotion; @@ -238,9 +240,9 @@ public class VolumeServiceImpl implements VolumeService { private class CreateBaseImageContext extends AsyncRpcConext { private final VolumeInfo volume; private final PrimaryDataStore dataStore; - private final TemplateOnPrimaryDataStoreObject template; + private final TemplateInfo template; private final AsyncCallFuture future; - public CreateBaseImageContext(AsyncCompletionCallback callback, VolumeInfo volume, PrimaryDataStore datastore, TemplateOnPrimaryDataStoreObject template, + public CreateBaseImageContext(AsyncCompletionCallback callback, VolumeInfo volume, PrimaryDataStore datastore, TemplateInfo template, AsyncCallFuture future) { super(callback); this.volume = volume; @@ -257,7 +259,7 @@ public class VolumeServiceImpl implements VolumeService { return this.dataStore; } - public TemplateOnPrimaryDataStoreObject getTemplate() { + public TemplateInfo getTemplate() { return this.template; } @@ -268,15 +270,15 @@ public class VolumeServiceImpl implements VolumeService { } @DB protected void createBaseImageAsync(VolumeInfo volume, PrimaryDataStore dataStore, TemplateInfo template, AsyncCallFuture future) { - TemplateOnPrimaryDataStoreObject templateOnPrimaryStoreObj = (TemplateOnPrimaryDataStoreObject) templatePrimaryStoreMgr.createTemplateOnPrimaryDataStore(template, dataStore); - templateOnPrimaryStoreObj.stateTransit(TemplateOnPrimaryDataStoreStateMachine.Event.CreateRequested); + TemplateInfo templateOnPrimaryStoreObj = objectInDataStoreMgr.create(template, dataStore); + /*templateOnPrimaryStoreObj.stateTransit(ObjectInDataStoreStateMachine.Event.CreateRequested); templateOnPrimaryStoreObj.updateStatus(Status.CREATING); try { dataStore.installTemplate(templateOnPrimaryStoreObj); templateOnPrimaryStoreObj.updateStatus(Status.CREATED); } catch (Exception e) { templateOnPrimaryStoreObj.updateStatus(Status.ABANDONED); - templateOnPrimaryStoreObj.stateTransit(TemplateOnPrimaryDataStoreStateMachine.Event.OperationFailed); + templateOnPrimaryStoreObj.stateTransit(ObjectInDataStoreStateMachine.Event.OperationFailed); VolumeApiResult result = new VolumeApiResult(volume); result.setResult(e.toString()); future.complete(result); @@ -284,29 +286,30 @@ public class VolumeServiceImpl implements VolumeService { } templateOnPrimaryStoreObj.updateStatus(Status.DOWNLOAD_IN_PROGRESS); - + */ CreateBaseImageContext context = new CreateBaseImageContext(null, volume, dataStore, templateOnPrimaryStoreObj, future); AsyncCallbackDispatcher caller = AsyncCallbackDispatcher.create(this); caller.setCallback(caller.getTarget().createBaseImageCallback(null, null)) .setContext(context); + + objectInDataStoreMgr.update(templateOnPrimaryStoreObj, ObjectInDataStoreStateMachine.Event.CreateRequested); - imageMotion.copyTemplateAsync(templateOnPrimaryStoreObj, caller); + imageMotion.copyTemplateAsync(templateOnPrimaryStoreObj, template, caller); } @DB protected Void createBaseImageCallback(AsyncCallbackDispatcher callback, CreateBaseImageContext context) { CommandResult result = callback.getResult(); - TemplateOnPrimaryDataStoreObject templateOnPrimaryStoreObj = context.getTemplate(); + TemplateInfo templateOnPrimaryStoreObj = context.getTemplate(); if (result.isSuccess()) { - templateOnPrimaryStoreObj.stateTransit(TemplateOnPrimaryDataStoreStateMachine.Event.OperationSuccessed); + objectInDataStoreMgr.update(templateOnPrimaryStoreObj, ObjectInDataStoreStateMachine.Event.OperationSuccessed); } else { - templateOnPrimaryStoreObj.stateTransit(TemplateOnPrimaryDataStoreStateMachine.Event.OperationFailed); + objectInDataStoreMgr.update(templateOnPrimaryStoreObj, ObjectInDataStoreStateMachine.Event.OperationFailed); } AsyncCallFuture future = context.getFuture(); VolumeInfo volume = context.getVolume(); PrimaryDataStore pd = context.getDataStore(); - createVolumeFromBaseImageAsync(volume, templateOnPrimaryStoreObj, pd, future); return null; } @@ -330,7 +333,7 @@ public class VolumeServiceImpl implements VolumeService { } @DB - protected void createVolumeFromBaseImageAsync(VolumeInfo volume, TemplateOnPrimaryDataStoreInfo templateOnPrimaryStore, PrimaryDataStore pd, AsyncCallFuture future) { + protected void createVolumeFromBaseImageAsync(VolumeInfo volume, TemplateInfo templateOnPrimaryStore, PrimaryDataStore pd, AsyncCallFuture future) { VolumeObject vo = (VolumeObject) volume; try { vo.stateTransit(Volume.Event.CreateRequested); @@ -379,7 +382,7 @@ public class VolumeServiceImpl implements VolumeService { return future; } - createVolumeFromBaseImageAsync(volume, templateOnPrimaryStore, pd, future); + createVolumeFromBaseImageAsync(volume, template, pd, future); return future; } diff --git a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServerStorageResource.java b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServerStorageResource.java index 7322e02808d..009ed7b1dc9 100644 --- a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServerStorageResource.java +++ b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServerStorageResource.java @@ -30,7 +30,7 @@ import java.util.UUID; import org.apache.cloudstack.storage.command.AttachPrimaryDataStoreAnswer; import org.apache.cloudstack.storage.command.AttachPrimaryDataStoreCmd; -import org.apache.cloudstack.storage.command.CopyTemplateToPrimaryStorageCmd; +import org.apache.cloudstack.storage.command.CopyCmd; import org.apache.cloudstack.storage.command.CopyTemplateToPrimaryStorageAnswer; import org.apache.cloudstack.storage.command.CreatePrimaryDataStoreCmd; import org.apache.cloudstack.storage.command.CreateVolumeAnswer; @@ -88,8 +88,8 @@ public class XenServerStorageResource { } public Answer handleStorageCommands(StorageSubSystemCommand command) { - if (command instanceof CopyTemplateToPrimaryStorageCmd) { - return this.execute((CopyTemplateToPrimaryStorageCmd)command); + if (command instanceof CopyCmd) { + return this.execute((CopyCmd)command); } else if (command instanceof AttachPrimaryDataStoreCmd) { return this.execute((AttachPrimaryDataStoreCmd)command); } else if (command instanceof CreatePrimaryDataStoreCmd) { @@ -472,7 +472,7 @@ public class XenServerStorageResource { } - protected Answer directDownloadHttpTemplate(CopyTemplateToPrimaryStorageCmd cmd, TemplateTO template, PrimaryDataStoreTO primarDataStore) { + protected Answer directDownloadHttpTemplate(CopyCmd cmd, TemplateTO template, PrimaryDataStoreTO primarDataStore) { String primaryStoreUuid = primarDataStore.getUuid(); Connection conn = hypervisorResource.getConnection(); SR poolsr = null; @@ -570,7 +570,7 @@ public class XenServerStorageResource { } } - protected Answer execute(CopyTemplateToPrimaryStorageCmd cmd) { + protected Answer execute(CopyCmd cmd) { ImageOnPrimayDataStoreTO imageTO = cmd.getImage(); TemplateTO template = imageTO.getTemplate(); if (template.getPath().startsWith("http")) {