You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by ke...@apache.org on 2013/02/02 00:27:31 UTC
[23/50] [abbrv] Improve component lifecycle management with system
run-level concept
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/17652325/server/test/com/cloud/vpc/MockVpcManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/test/com/cloud/vpc/MockVpcManagerImpl.java b/server/test/com/cloud/vpc/MockVpcManagerImpl.java
index d024018..0a44a49 100644
--- a/server/test/com/cloud/vpc/MockVpcManagerImpl.java
+++ b/server/test/com/cloud/vpc/MockVpcManagerImpl.java
@@ -54,12 +54,13 @@ import com.cloud.user.Account;
import com.cloud.user.User;
import com.cloud.utils.Pair;
import com.cloud.utils.component.Manager;
+import com.cloud.utils.component.ManagerBase;
import com.cloud.vm.DomainRouterVO;
import com.cloud.vpc.dao.MockVpcDaoImpl;
@Component
@Local(value = { VpcManager.class, VpcService.class })
-public class MockVpcManagerImpl implements VpcManager, Manager{
+public class MockVpcManagerImpl extends ManagerBase implements VpcManager {
@Inject MockVpcDaoImpl _vpcDao;
/* (non-Javadoc)
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/17652325/server/test/com/cloud/vpc/MockVpcVirtualNetworkApplianceManager.java
----------------------------------------------------------------------
diff --git a/server/test/com/cloud/vpc/MockVpcVirtualNetworkApplianceManager.java b/server/test/com/cloud/vpc/MockVpcVirtualNetworkApplianceManager.java
index 0ea29d9..6d8531a 100644
--- a/server/test/com/cloud/vpc/MockVpcVirtualNetworkApplianceManager.java
+++ b/server/test/com/cloud/vpc/MockVpcVirtualNetworkApplianceManager.java
@@ -47,6 +47,7 @@ import com.cloud.user.Account;
import com.cloud.user.User;
import com.cloud.uservm.UserVm;
import com.cloud.utils.component.Manager;
+import com.cloud.utils.component.ManagerBase;
import com.cloud.vm.DomainRouterVO;
import com.cloud.vm.NicProfile;
import com.cloud.vm.VirtualMachineProfile;
@@ -54,8 +55,8 @@ import com.cloud.vm.VirtualMachineProfile.Param;
@Component
@Local(value = {VpcVirtualNetworkApplianceManager.class, VpcVirtualNetworkApplianceService.class})
-public class MockVpcVirtualNetworkApplianceManager implements VpcVirtualNetworkApplianceManager,
-VpcVirtualNetworkApplianceService, Manager {
+public class MockVpcVirtualNetworkApplianceManager extends ManagerBase implements VpcVirtualNetworkApplianceManager,
+VpcVirtualNetworkApplianceService {
/* (non-Javadoc)
* @see com.cloud.network.router.VirtualNetworkApplianceManager#sendSshKeysToHost(java.lang.Long, java.lang.String, java.lang.String)
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/17652325/usage/src/com/cloud/usage/UsageAlertManagerImpl.java
----------------------------------------------------------------------
diff --git a/usage/src/com/cloud/usage/UsageAlertManagerImpl.java b/usage/src/com/cloud/usage/UsageAlertManagerImpl.java
index f6e0374..a0765b2 100644
--- a/usage/src/com/cloud/usage/UsageAlertManagerImpl.java
+++ b/usage/src/com/cloud/usage/UsageAlertManagerImpl.java
@@ -40,6 +40,7 @@ import com.cloud.alert.AlertVO;
import com.cloud.alert.dao.AlertDao;
import com.cloud.configuration.dao.ConfigurationDao;
import com.cloud.utils.NumbersUtil;
+import com.cloud.utils.component.ManagerBase;
import com.sun.mail.smtp.SMTPMessage;
import com.sun.mail.smtp.SMTPSSLTransport;
@@ -47,18 +48,15 @@ import com.sun.mail.smtp.SMTPTransport;
@Component
@Local(value={AlertManager.class})
-public class UsageAlertManagerImpl implements AlertManager {
+public class UsageAlertManagerImpl extends ManagerBase implements AlertManager {
private static final Logger s_logger = Logger.getLogger(UsageAlertManagerImpl.class.getName());
- private String _name = null;
private EmailAlert _emailAlert;
@Inject private AlertDao _alertDao;
@Inject private ConfigurationDao _configDao;
@Override
public boolean configure(String name, Map<String, Object> params) throws ConfigurationException {
- _name = name;
-
Map<String, String> configs = _configDao.getConfiguration("management-server", params);
// set up the email system for alerts
@@ -86,21 +84,6 @@ public class UsageAlertManagerImpl implements AlertManager {
}
@Override
- public String getName() {
- return _name;
- }
-
- @Override
- public boolean start() {
- return true;
- }
-
- @Override
- public boolean stop() {
- return true;
- }
-
- @Override
public void clearAlert(short alertType, long dataCenterId, long podId) {
try {
if (_emailAlert != null) {
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/17652325/usage/src/com/cloud/usage/UsageManagerImpl.java
----------------------------------------------------------------------
diff --git a/usage/src/com/cloud/usage/UsageManagerImpl.java b/usage/src/com/cloud/usage/UsageManagerImpl.java
index 438ab72..3e143b1 100644
--- a/usage/src/com/cloud/usage/UsageManagerImpl.java
+++ b/usage/src/com/cloud/usage/UsageManagerImpl.java
@@ -69,6 +69,7 @@ import com.cloud.user.dao.AccountDao;
import com.cloud.user.dao.UserStatisticsDao;
+import com.cloud.utils.component.ManagerBase;
import com.cloud.utils.concurrency.NamedThreadFactory;
import com.cloud.utils.db.DB;
import com.cloud.utils.db.Filter;
@@ -78,7 +79,7 @@ import com.cloud.utils.db.Transaction;
import com.cloud.utils.exception.CloudRuntimeException;
@Local(value={UsageManager.class})
-public class UsageManagerImpl implements UsageManager, Runnable {
+public class UsageManagerImpl extends ManagerBase implements UsageManager, Runnable {
public static final Logger s_logger = Logger.getLogger(UsageManagerImpl.class.getName());
protected static final String DAILY = "DAILY";
@@ -109,7 +110,6 @@ public class UsageManagerImpl implements UsageManager, Runnable {
@Inject ConfigurationDao _configDao;
private String m_version = null;
- private String m_name = null;
private final Calendar m_jobExecTime = Calendar.getInstance();
private int m_aggregationDuration = 0;
private int m_sanityCheckInterval = 0;
@@ -152,8 +152,6 @@ public class UsageManagerImpl implements UsageManager, Runnable {
s_logger.info("Implementation Version is " + m_version);
}
- m_name = name;
-
Map<String, String> configs = _configDao.getConfiguration(params);
if (params != null) {
@@ -222,10 +220,6 @@ public class UsageManagerImpl implements UsageManager, Runnable {
return true;
}
- public String getName() {
- return m_name;
- }
-
public boolean start() {
if (s_logger.isInfoEnabled()) {
s_logger.info("Starting Usage Manager");
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/17652325/utils/src/com/cloud/utils/backoff/impl/ConstantTimeBackoff.java
----------------------------------------------------------------------
diff --git a/utils/src/com/cloud/utils/backoff/impl/ConstantTimeBackoff.java b/utils/src/com/cloud/utils/backoff/impl/ConstantTimeBackoff.java
index fb76234..976e369 100755
--- a/utils/src/com/cloud/utils/backoff/impl/ConstantTimeBackoff.java
+++ b/utils/src/com/cloud/utils/backoff/impl/ConstantTimeBackoff.java
@@ -25,6 +25,7 @@ import javax.ejb.Local;
import com.cloud.utils.NumbersUtil;
import com.cloud.utils.backoff.BackoffAlgorithm;
+import com.cloud.utils.component.AdapterBase;
/**
* Implementation of the Agent Manager. This class controls the connection
@@ -36,10 +37,9 @@ import com.cloud.utils.backoff.BackoffAlgorithm;
* }
**/
@Local(value={BackoffAlgorithm.class})
-public class ConstantTimeBackoff implements BackoffAlgorithm, ConstantTimeBackoffMBean {
+public class ConstantTimeBackoff extends AdapterBase implements BackoffAlgorithm, ConstantTimeBackoffMBean {
int _count = 0;
long _time;
- String _name;
ConcurrentHashMap<String, Thread> _asleep = new ConcurrentHashMap<String, Thread>();
@Override
@@ -63,17 +63,11 @@ public class ConstantTimeBackoff implements BackoffAlgorithm, ConstantTimeBackof
@Override
public boolean configure(String name, Map<String, Object> params) {
- _name = name;
_time = NumbersUtil.parseLong((String)params.get("seconds"), 5) * 1000;
return true;
}
@Override
- public String getName() {
- return _name;
- }
-
- @Override
public Collection<String> getWaiters() {
return _asleep.keySet();
}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/17652325/utils/src/com/cloud/utils/component/Adapter.java
----------------------------------------------------------------------
diff --git a/utils/src/com/cloud/utils/component/Adapter.java b/utils/src/com/cloud/utils/component/Adapter.java
index 66326df..ec03474 100755
--- a/utils/src/com/cloud/utils/component/Adapter.java
+++ b/utils/src/com/cloud/utils/component/Adapter.java
@@ -16,47 +16,9 @@
// under the License.
package com.cloud.utils.component;
-import java.util.Map;
-
-import javax.naming.ConfigurationException;
-
/**
* Adapter defines methods for pluggable code within the Cloud Stack. An
* Adapters are a departure from regular structured programming.
*/
-public interface Adapter {
-
- /**
- * configure is called when an adapter is initialized.
- *
- * @param name
- * The name of the adapter.
- * @param params
- * A map of configuration parameters.
- * @return Returning false means the configuration did not go well and the
- * adapter can not be used.
- */
- boolean configure(String name, Map<String, Object> params) throws ConfigurationException;
-
- /**
- *
- */
- String getName();
-
- /**
- * startAdapter() signals the adapter that it can start.
- *
- * @return true if the adapter can start, false otherwise.
- */
- boolean start();
-
- /**
- * stopAdapter() signals the adapter that it should be shutdown. Returns
- * false means that the adapter is not ready to be stopped and should be
- * called again.
- *
- * @return true if the adapter can stop, false indicates the adapter is not
- * ready to stop.
- */
- boolean stop();
+public interface Adapter extends ComponentLifecycle {
}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/17652325/utils/src/com/cloud/utils/component/AdapterBase.java
----------------------------------------------------------------------
diff --git a/utils/src/com/cloud/utils/component/AdapterBase.java b/utils/src/com/cloud/utils/component/AdapterBase.java
index 29f3c23..405762d 100644
--- a/utils/src/com/cloud/utils/component/AdapterBase.java
+++ b/utils/src/com/cloud/utils/component/AdapterBase.java
@@ -17,47 +17,18 @@
package com.cloud.utils.component;
import java.util.List;
-import java.util.Map;
-
-import javax.naming.ConfigurationException;
// Typical Adapter implementation.
-public class AdapterBase implements Adapter {
- protected String _name;
-
- @Override
- public boolean configure(String name, Map<String, Object> params) throws ConfigurationException {
- return true;
- }
-
- @Override
- public String getName() {
- if(_name == null)
- return this.getClass().getSimpleName();
-
- return _name;
- }
-
- public void setName(String name) {
- _name = name;
- }
+public class AdapterBase extends ComponentLifecycleBase implements Adapter {
- @Override
- public boolean start() {
- return true;
- }
-
- @Override
- public boolean stop() {
- return true;
- }
-
- public static <T extends Adapter> T getAdapterByName(List<T> adapters, String name) {
+ public AdapterBase() {
+ }
+
+ public static <T extends Adapter> T getAdapterByName(List<T> adapters, String name) {
for(T adapter : adapters) {
if(adapter.getName() != null && adapter.getName().equalsIgnoreCase(name))
return adapter;
}
return null;
}
-
}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/17652325/utils/src/com/cloud/utils/component/ComponentContext.java
----------------------------------------------------------------------
diff --git a/utils/src/com/cloud/utils/component/ComponentContext.java b/utils/src/com/cloud/utils/component/ComponentContext.java
index 9d5e9c4..1b15f00 100644
--- a/utils/src/com/cloud/utils/component/ComponentContext.java
+++ b/utils/src/com/cloud/utils/component/ComponentContext.java
@@ -17,13 +17,13 @@
package com.cloud.utils.component;
-import java.util.ArrayList;
-import java.util.Collection;
import java.util.HashMap;
-import java.util.List;
import java.util.Map;
-import javax.annotation.PostConstruct;
+import javax.management.InstanceAlreadyExistsException;
+import javax.management.MBeanRegistrationException;
+import javax.management.MalformedObjectNameException;
+import javax.management.NotCompliantMBeanException;
import javax.naming.ConfigurationException;
import org.apache.log4j.Logger;
@@ -38,8 +38,9 @@ import org.springframework.context.ApplicationContextAware;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Component;
-import com.cloud.utils.db.GenericDao;
import com.cloud.utils.db.TransactionContextBuilder;
+import com.cloud.utils.mgmt.JmxUtil;
+import com.cloud.utils.mgmt.ManagementBean;
/**
*
@@ -60,93 +61,87 @@ public class ComponentContext implements ApplicationContextAware {
public static ApplicationContext getApplicationContext() {
return s_appContext;
- }
+ }
public static void initComponentsLifeCycle() {
- @SuppressWarnings("rawtype")
- Collection<GenericDao> daos = ComponentContext.getApplicationContext().getBeansOfType(GenericDao.class).values();
- Collection<Manager> mgrs = ComponentContext.getApplicationContext().getBeansOfType(Manager.class).values();
- Collection<Adapter> adapters = ComponentContext.getApplicationContext().getBeansOfType(Adapter.class).values();
-
- Map<String, Object> params = new HashMap<String, Object>();
- for (GenericDao dao : daos) {
- try {
- s_logger.info("Configuring DAO: " + ComponentContext.getTargetClass(dao).getName());
- dao.configure(dao.getClass().getSimpleName(), params);
- } catch (ConfigurationException e) {
- s_logger.error("Unable to configure DAO: " + dao.getClass().getSimpleName(), e);
- System.exit(1);
- }
- }
-
- List<String> avoidMap = new ArrayList<String>();
- for (Manager manager : mgrs) {
- if (avoidMap.contains(manager.getName())) {
- s_logger.info("Skip manager: " + ComponentContext.getTargetClass(manager).getName() + " as it is already started");
- continue;
- }
-
- try {
- s_logger.info("Configuring manager: " + ComponentContext.getTargetClass(manager).getName() + "...");
- manager.configure(manager.getClass().getSimpleName(), params);
- avoidMap.add(manager.getName());
- } catch (Exception e) {
- s_logger.error("Problems to start manager:" + ComponentContext.getTargetClass(manager).getName(), e);
- System.exit(1);
- }
- }
-
- for (Adapter adapter : adapters) {
- if (avoidMap.contains(adapter.getName())) {
- s_logger.info("Skip adapter: " + ComponentContext.getTargetClass(adapter).getName() + " as it is already started");
- continue;
- }
-
- try {
- s_logger.info("Configuring adapter: " + ComponentContext.getTargetClass(adapter).getName() + "...");
- adapter.configure(adapter.getName(), params);
- avoidMap.add(adapter.getName());
- } catch (Exception e) {
- s_logger.error("Problems to start adapter:" + ComponentContext.getTargetClass(adapter).getName(), e);
- System.exit(1);
- }
- }
-
- avoidMap.clear();
-
- for (Manager manager : mgrs) {
- if (avoidMap.contains(manager.getName())) {
- s_logger.info("Skip start on manager: " + ComponentContext.getTargetClass(manager).getName() + " as it is already started");
- continue;
- }
-
- try {
- s_logger.info("Starting manager: " + ComponentContext.getTargetClass(manager).getName() + "...");
- manager.start();
- avoidMap.add(manager.getName());
- } catch (Exception e) {
- s_logger.error("Problems to start manager:" + ComponentContext.getTargetClass(manager).getName(), e);
- System.exit(1);
- }
- }
-
- for (Adapter adapter : adapters) {
- if (avoidMap.contains(adapter.getName())) {
- s_logger.info("Skip start on adapter: " + ComponentContext.getTargetClass(adapter).getName() + " as it is already started");
- continue;
- }
-
- try {
- s_logger.info("Startinging adapter: " + ComponentContext.getTargetClass(adapter).getName() + "...");
- adapter.start();
- avoidMap.add(adapter.getName());
- } catch (Exception e) {
- s_logger.error("Problems to start adapter:" + ComponentContext.getTargetClass(adapter).getName(), e);
- System.exit(1);
- }
+ Map<String, ComponentLifecycle> lifecyleComponents = getApplicationContext().getBeansOfType(ComponentLifecycle.class);
+
+ Map[] classifiedComponents = new Map[ComponentLifecycle.MAX_RUN_LEVELS];
+ for(int i = 0; i < ComponentLifecycle.MAX_RUN_LEVELS; i++) {
+ classifiedComponents[i] = new HashMap<String, ComponentLifecycle>();
+ }
+
+ for(Map.Entry<String, ComponentLifecycle> entry : lifecyleComponents.entrySet()) {
+ classifiedComponents[entry.getValue().getRunLevel()].put(entry.getKey(), entry.getValue());
+ }
+
+ // configuration phase
+ Map<String, String> avoidMap = new HashMap<String, String>();
+ for(int i = 0; i < ComponentLifecycle.MAX_RUN_LEVELS; i++) {
+ for(Map.Entry<String, ComponentLifecycle> entry : ((Map<String, ComponentLifecycle>)classifiedComponents[i]).entrySet()) {
+ ComponentLifecycle component = entry.getValue();
+ String implClassName = ComponentContext.getTargetClass(component).getName();
+ s_logger.info("Configuring " + implClassName);
+
+ if(avoidMap.containsKey(implClassName)) {
+ s_logger.info("Skip configuration of " + implClassName + " as it is already configured");
+ continue;
+ }
+
+ try {
+ component.configure(component.getName(), component.getConfigParams());
+ } catch (ConfigurationException e) {
+ s_logger.error("Unhandled exception", e);
+ throw new RuntimeException("Unable to configure " + implClassName, e);
+ }
+
+ avoidMap.put(implClassName, implClassName);
+ }
+ }
+
+ // starting phase
+ avoidMap.clear();
+ for(int i = 0; i < ComponentLifecycle.MAX_RUN_LEVELS; i++) {
+ for(Map.Entry<String, ComponentLifecycle> entry : ((Map<String, ComponentLifecycle>)classifiedComponents[i]).entrySet()) {
+ ComponentLifecycle component = entry.getValue();
+ String implClassName = ComponentContext.getTargetClass(component).getName();
+ s_logger.info("Starting " + implClassName);
+
+ if(avoidMap.containsKey(implClassName)) {
+ s_logger.info("Skip configuration of " + implClassName + " as it is already configured");
+ continue;
+ }
+
+ try {
+ component.start();
+
+ if(getTargetObject(component) instanceof ManagementBean)
+ registerMBean((ManagementBean)getTargetObject(component));
+ } catch (Exception e) {
+ s_logger.error("Unhandled exception", e);
+ throw new RuntimeException("Unable to start " + implClassName, e);
+ }
+
+ avoidMap.put(implClassName, implClassName);
+ }
+ }
+ }
+
+ static void registerMBean(ManagementBean mbean) {
+ try {
+ JmxUtil.registerMBean(mbean);
+ } catch (MalformedObjectNameException e) {
+ s_logger.warn("Unable to register MBean: " + mbean.getName(), e);
+ } catch (InstanceAlreadyExistsException e) {
+ s_logger.warn("Unable to register MBean: " + mbean.getName(), e);
+ } catch (MBeanRegistrationException e) {
+ s_logger.warn("Unable to register MBean: " + mbean.getName(), e);
+ } catch (NotCompliantMBeanException e) {
+ s_logger.warn("Unable to register MBean: " + mbean.getName(), e);
}
+ s_logger.info("Registered MBean: " + mbean.getName());
}
-
+
public static <T> T getComponent(String name) {
assert(s_appContext != null);
return (T)s_appContext.getBean(name);
@@ -182,37 +177,6 @@ public class ComponentContext implements ApplicationContextAware {
return s_appContext.getBeansOfType(beanType);
}
- public static <T> boolean isPrimary(Object instance, Class<T> 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) && intf != beanType) {
- componentType = intf;
- break;
- }
- }
-
- Map<String, T> matchedTypes = (Map<String, T>)ComponentContext.getComponentsOfType(componentType);
- if(matchedTypes.size() > 1) {
- Primary primary = targetClass.getAnnotation(Primary.class);
- 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;
- }
-
- return true;
- }
-
public static Class<?> getTargetClass(Object instance) {
while(instance instanceof Advised) {
try {
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/17652325/utils/src/com/cloud/utils/component/ComponentLifecycle.java
----------------------------------------------------------------------
diff --git a/utils/src/com/cloud/utils/component/ComponentLifecycle.java b/utils/src/com/cloud/utils/component/ComponentLifecycle.java
new file mode 100644
index 0000000..ea671af
--- /dev/null
+++ b/utils/src/com/cloud/utils/component/ComponentLifecycle.java
@@ -0,0 +1,58 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+package com.cloud.utils.component;
+
+import java.util.Map;
+
+import javax.naming.ConfigurationException;
+
+public interface ComponentLifecycle {
+ public static final int RUN_LEVEL_SYSTEM_BOOTSTRAP = 0; // for system level bootstrap components
+ public static final int RUN_LEVEL_SYSTEM = 1; // for system level service components (i.e., DAOs)
+ public static final int RUN_LEVEL_FRAMEWORK_BOOTSTRAP = 2; // for framework startup checkers (i.e., DB migration check)
+ public static final int RUN_LEVEL_FRAMEWORK = 3; // for framework bootstrap components(i.e., clustering management components)
+ public static final int RUN_LEVEL_COMPONENT_BOOTSTRAP = 4; // general manager components
+ public static final int RUN_LEVEL_COMPONENT = 5; // regular adapters, plugin components
+ public static final int RUN_LEVEL_APPLICATION_MAINLOOP = 6;
+ public static final int MAX_RUN_LEVELS = 7;
+
+
+ String getName();
+ void setName(String name);
+
+ void setConfigParams(Map<String, Object> params);
+ Map<String, Object> getConfigParams();
+
+ int getRunLevel();
+ void setRunLevel(int level);
+
+ public boolean configure(String name, Map<String, Object> params) throws ConfigurationException;
+
+ /**
+ * Start any background tasks.
+ *
+ * @return true if the tasks were started, false otherwise.
+ */
+ public boolean start();
+
+ /**
+ * Stop any background tasks.
+ *
+ * @return true background tasks were stopped, false otherwise.
+ */
+ public boolean stop();
+}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/17652325/utils/src/com/cloud/utils/component/ComponentLifecycleBase.java
----------------------------------------------------------------------
diff --git a/utils/src/com/cloud/utils/component/ComponentLifecycleBase.java b/utils/src/com/cloud/utils/component/ComponentLifecycleBase.java
new file mode 100644
index 0000000..8c7d09d
--- /dev/null
+++ b/utils/src/com/cloud/utils/component/ComponentLifecycleBase.java
@@ -0,0 +1,80 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+package com.cloud.utils.component;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.naming.ConfigurationException;
+
+public class ComponentLifecycleBase implements ComponentLifecycle {
+
+ protected String _name;
+ protected int _runLevel;
+ protected Map<String, Object> _configParams = new HashMap<String, Object>();
+
+ public ComponentLifecycleBase() {
+ _name = this.getClass().getSimpleName();
+ _runLevel = RUN_LEVEL_COMPONENT;
+ }
+
+ @Override
+ public String getName() {
+ return _name;
+ }
+
+ @Override
+ public void setName(String name) {
+ _name = name;
+ }
+
+ @Override
+ public void setConfigParams(Map<String, Object> params) {
+ _configParams = params;
+ }
+
+ @Override
+ public Map<String, Object> getConfigParams() {
+ return _configParams;
+ }
+
+ @Override
+ public int getRunLevel() {
+ return _runLevel;
+ }
+
+ @Override
+ public void setRunLevel(int level) {
+ _runLevel = level;
+ }
+
+ @Override
+ public boolean configure(String name, Map<String, Object> params)
+ throws ConfigurationException {
+ return true;
+ }
+
+ @Override
+ public boolean start() {
+ return true;
+ }
+
+ @Override
+ public boolean stop() {
+ return true;
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/17652325/utils/src/com/cloud/utils/component/Manager.java
----------------------------------------------------------------------
diff --git a/utils/src/com/cloud/utils/component/Manager.java b/utils/src/com/cloud/utils/component/Manager.java
index da55d06..d53d5ae 100755
--- a/utils/src/com/cloud/utils/component/Manager.java
+++ b/utils/src/com/cloud/utils/component/Manager.java
@@ -16,45 +16,9 @@
// under the License.
package com.cloud.utils.component;
-import java.util.Map;
-
-import javax.naming.ConfigurationException;
-
/**
*
* For now we only expose some simple methods. In the future, we can use this
**/
-public interface Manager {
- /**
- * Configuration with parameters. If there are background tasks, they
- * shouldn't be started yet. Wait for the start() call.
- *
- * @param name
- * The managers name.
- * @param params
- * Configuration parameters.
- * @return true if the configuration was successful, false otherwise.
- */
- public boolean configure(String name, Map<String, Object> params) throws ConfigurationException;
-
- /**
- * Start any background tasks.
- *
- * @return true if the tasks were started, false otherwise.
- */
- public boolean start();
-
- /**
- * Stop any background tasks.
- *
- * @return true background tasks were stopped, false otherwise.
- */
- public boolean stop();
-
- /**
- * Get the name of this manager.
- *
- * @return the name.
- */
- public String getName();
+public interface Manager extends ComponentLifecycle {
}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/17652325/utils/src/com/cloud/utils/component/ManagerBase.java
----------------------------------------------------------------------
diff --git a/utils/src/com/cloud/utils/component/ManagerBase.java b/utils/src/com/cloud/utils/component/ManagerBase.java
new file mode 100644
index 0000000..529ef62
--- /dev/null
+++ b/utils/src/com/cloud/utils/component/ManagerBase.java
@@ -0,0 +1,24 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+package com.cloud.utils.component;
+
+public class ManagerBase extends ComponentLifecycleBase {
+ public ManagerBase() {
+ // set default run level for manager components
+ setRunLevel(ComponentLifecycle.RUN_LEVEL_COMPONENT_BOOTSTRAP);
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/17652325/utils/src/com/cloud/utils/crypt/EncryptionSecretKeyChecker.java
----------------------------------------------------------------------
diff --git a/utils/src/com/cloud/utils/crypt/EncryptionSecretKeyChecker.java b/utils/src/com/cloud/utils/crypt/EncryptionSecretKeyChecker.java
index a9c670d..63f841d 100755
--- a/utils/src/com/cloud/utils/crypt/EncryptionSecretKeyChecker.java
+++ b/utils/src/com/cloud/utils/crypt/EncryptionSecretKeyChecker.java
@@ -35,11 +35,13 @@ import org.jasypt.encryption.pbe.StandardPBEStringEncryptor;
import org.jasypt.encryption.pbe.config.SimpleStringPBEConfig;
import com.cloud.utils.PropertiesUtil;
+import com.cloud.utils.component.AdapterBase;
+import com.cloud.utils.component.ComponentLifecycle;
import com.cloud.utils.component.SystemIntegrityChecker;
import com.cloud.utils.exception.CloudRuntimeException;
@Local(value = {SystemIntegrityChecker.class})
-public class EncryptionSecretKeyChecker implements SystemIntegrityChecker {
+public class EncryptionSecretKeyChecker extends AdapterBase implements SystemIntegrityChecker {
private static final Logger s_logger = Logger.getLogger(EncryptionSecretKeyChecker.class);
@@ -47,6 +49,10 @@ public class EncryptionSecretKeyChecker implements SystemIntegrityChecker {
private static final String s_envKey = "CLOUD_SECRET_KEY";
private static StandardPBEStringEncryptor s_encryptor = new StandardPBEStringEncryptor();
private static boolean s_useEncryption = false;
+
+ public EncryptionSecretKeyChecker() {
+ setRunLevel(ComponentLifecycle.RUN_LEVEL_FRAMEWORK_BOOTSTRAP);
+ }
@Override
public void check() {
@@ -144,4 +150,15 @@ public class EncryptionSecretKeyChecker implements SystemIntegrityChecker {
s_encryptor.setConfig(stringConfig);
s_useEncryption = true;
}
+
+ @Override
+ public boolean start() {
+ try {
+ check();
+ } catch (Exception e) {
+ s_logger.error("System integrity check exception", e);
+ System.exit(1);
+ }
+ return true;
+ }
}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/17652325/utils/src/com/cloud/utils/db/GenericDaoBase.java
----------------------------------------------------------------------
diff --git a/utils/src/com/cloud/utils/db/GenericDaoBase.java b/utils/src/com/cloud/utils/db/GenericDaoBase.java
index 5a166b2..623c349 100755
--- a/utils/src/com/cloud/utils/db/GenericDaoBase.java
+++ b/utils/src/com/cloud/utils/db/GenericDaoBase.java
@@ -68,6 +68,8 @@ import com.cloud.utils.DateUtil;
import com.cloud.utils.NumbersUtil;
import com.cloud.utils.Pair;
import com.cloud.utils.Ternary;
+import com.cloud.utils.component.ComponentLifecycle;
+import com.cloud.utils.component.ComponentLifecycleBase;
import com.cloud.utils.crypt.DBEncryptionUtil;
import com.cloud.utils.db.SearchCriteria.SelectType;
import com.cloud.utils.exception.CloudRuntimeException;
@@ -111,7 +113,7 @@ import edu.emory.mathcs.backport.java.util.Collections;
*
**/
@DB
-public abstract class GenericDaoBase<T, ID extends Serializable> implements GenericDao<T, ID> {
+public abstract class GenericDaoBase<T, ID extends Serializable> extends ComponentLifecycleBase implements GenericDao<T, ID> {
private final static Logger s_logger = Logger.getLogger(GenericDaoBase.class);
protected final static TimeZone s_gmtTimeZone = TimeZone.getTimeZone("GMT");
@@ -157,9 +159,6 @@ public abstract class GenericDaoBase<T, ID extends Serializable> implements Gene
protected static final SequenceFetcher s_seqFetcher = SequenceFetcher.getInstance();
- protected String _name;
- protected Map<String, Object> _configParams = new HashMap<String, Object>();
-
public static <J> GenericDaoBase<? extends J, ? extends Serializable> getDao(Class<J> entityType) {
@SuppressWarnings("unchecked")
GenericDaoBase<? extends J, ? extends Serializable> dao = (GenericDaoBase<? extends J, ? extends Serializable>)s_daoMaps.get(entityType);
@@ -181,14 +180,6 @@ public abstract class GenericDaoBase<T, ID extends Serializable> implements Gene
return _allAttributes;
}
- public void setConfigParams(Map<String, Object> params) {
- _configParams = params;
- }
-
- public Map<String, Object> getConfigParams() {
- return _configParams;
- }
-
@SuppressWarnings("unchecked")
protected GenericDaoBase() {
Type t = getClass().getGenericSuperclass();
@@ -278,6 +269,8 @@ public abstract class GenericDaoBase<T, ID extends Serializable> implements Gene
s_logger.trace(info.selectSql);
}
}
+
+ setRunLevel(ComponentLifecycle.RUN_LEVEL_SYSTEM);
}
@Override @DB(txn=false)
@@ -1767,11 +1760,6 @@ public abstract class GenericDaoBase<T, ID extends Serializable> implements Gene
}
@DB(txn=false)
- public String getName() {
- return _name;
- }
-
- @DB(txn=false)
public static <T> UpdateBuilder getUpdateBuilder(final T entityObject) {
final Factory factory = (Factory)entityObject;
assert(factory != null);
@@ -1880,5 +1868,4 @@ public abstract class GenericDaoBase<T, ID extends Serializable> implements Gene
return sql;
}
-
}