From 1381c58fa1bb94400d9802aa6e643db05f98d509 Mon Sep 17 00:00:00 2001 From: frank Date: Wed, 27 Jul 2011 17:32:12 -0700 Subject: [PATCH] Bug 10860 - PremiumUpgrade is not run when upgrading to 2.2.8 Use a new target "system-integrity-checker" in components.xml/components-premium.xml. All checkers must be explicitly specified in XML file, they will execute before any components load status 10860: resolved fixed --- .../AgentComponentLibraryBase.java | 6 --- client/tomcatconf/components.xml.in | 7 ++- .../cloud/cluster/ManagementServerNode.java | 3 ++ .../ConfigurationCompoentLibrary.java | 47 ------------------- .../DefaultComponentLibrary.java | 9 ---- .../cloud/servlet/CloudStartupServlet.java | 10 ++-- .../cloud/upgrade/DatabaseUpgradeChecker.java | 3 ++ .../utils/component/ComponentLibrary.java | 9 +--- .../utils/component/ComponentLocator.java | 39 ++++++++++----- .../component/SystemIntegrityChecker.java | 2 + .../utils/component/MockComponentLocator.java | 13 ++--- 11 files changed, 55 insertions(+), 93 deletions(-) mode change 100644 => 100755 agent/src/com/cloud/agent/configuration/AgentComponentLibraryBase.java mode change 100644 => 100755 server/src/com/cloud/cluster/ManagementServerNode.java delete mode 100644 server/src/com/cloud/configuration/ConfigurationCompoentLibrary.java mode change 100644 => 100755 server/src/com/cloud/configuration/DefaultComponentLibrary.java mode change 100644 => 100755 server/src/com/cloud/servlet/CloudStartupServlet.java mode change 100644 => 100755 server/src/com/cloud/upgrade/DatabaseUpgradeChecker.java mode change 100644 => 100755 utils/src/com/cloud/utils/component/ComponentLibrary.java mode change 100644 => 100755 utils/src/com/cloud/utils/component/SystemIntegrityChecker.java mode change 100644 => 100755 utils/test/com/cloud/utils/component/MockComponentLocator.java diff --git a/agent/src/com/cloud/agent/configuration/AgentComponentLibraryBase.java b/agent/src/com/cloud/agent/configuration/AgentComponentLibraryBase.java old mode 100644 new mode 100755 index c7df72d4208..31e0f95145c --- a/agent/src/com/cloud/agent/configuration/AgentComponentLibraryBase.java +++ b/agent/src/com/cloud/agent/configuration/AgentComponentLibraryBase.java @@ -30,12 +30,6 @@ import com.cloud.utils.db.GenericDao; public class AgentComponentLibraryBase extends ComponentLibraryBase { - - @Override - public List getSystemIntegrityCheckers() { - return null; - } - @Override public Map>> getDaos() { return null; diff --git a/client/tomcatconf/components.xml.in b/client/tomcatconf/components.xml.in index 7d3e1772bca..e186de556fa 100755 --- a/client/tomcatconf/components.xml.in +++ b/client/tomcatconf/components.xml.in @@ -23,6 +23,11 @@ documented, please contact the author. --> + + + + + @@ -99,7 +104,7 @@ - + false diff --git a/server/src/com/cloud/cluster/ManagementServerNode.java b/server/src/com/cloud/cluster/ManagementServerNode.java old mode 100644 new mode 100755 index bb04fead6d0..8a47f2a4e5e --- a/server/src/com/cloud/cluster/ManagementServerNode.java +++ b/server/src/com/cloud/cluster/ManagementServerNode.java @@ -17,10 +17,13 @@ */ package com.cloud.cluster; +import javax.ejb.Local; + import com.cloud.utils.component.SystemIntegrityChecker; import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.utils.net.MacAddress; +@Local(value = {SystemIntegrityChecker.class}) public class ManagementServerNode implements SystemIntegrityChecker { private static final long s_nodeId = MacAddress.getMacAddress().toLong(); diff --git a/server/src/com/cloud/configuration/ConfigurationCompoentLibrary.java b/server/src/com/cloud/configuration/ConfigurationCompoentLibrary.java deleted file mode 100644 index 5d1b0cb07ec..00000000000 --- a/server/src/com/cloud/configuration/ConfigurationCompoentLibrary.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.cloud.configuration; - -import java.io.Serializable; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; - -import com.cloud.upgrade.DatabaseUpgradeChecker; -import com.cloud.utils.component.Adapter; -import com.cloud.utils.component.ComponentLibraryBase; -import com.cloud.utils.component.Manager; -import com.cloud.utils.component.SystemIntegrityChecker; -import com.cloud.utils.component.ComponentLocator.ComponentInfo; -import com.cloud.utils.db.GenericDao; - -public class ConfigurationCompoentLibrary extends ComponentLibraryBase { - - @Override - public List getSystemIntegrityCheckers() { - ArrayList checkers = new ArrayList(); - checkers.add(new DatabaseUpgradeChecker()); - return checkers; - } - - @Override - public Map>> getDaos() { - return new LinkedHashMap>>(0); - } - - @Override - public Map> getManagers() { - return new LinkedHashMap>(0); - } - - @Override - public Map>> getAdapters() { - return new LinkedHashMap>>(0); - } - - @Override - public Map, Class> getFactories() { - return new HashMap, Class>(0); - } - -} diff --git a/server/src/com/cloud/configuration/DefaultComponentLibrary.java b/server/src/com/cloud/configuration/DefaultComponentLibrary.java old mode 100644 new mode 100755 index be2c399bf51..748ab52769d --- a/server/src/com/cloud/configuration/DefaultComponentLibrary.java +++ b/server/src/com/cloud/configuration/DefaultComponentLibrary.java @@ -157,15 +157,6 @@ import com.cloud.vm.dao.UserVmDetailsDaoImpl; import com.cloud.vm.dao.VMInstanceDaoImpl; public class DefaultComponentLibrary extends ComponentLibraryBase implements ComponentLibrary { - - @Override - public List getSystemIntegrityCheckers() { - ArrayList checkers = new ArrayList(); - checkers.add(new ManagementServerNode()); - checkers.add(new DatabaseUpgradeChecker()); - return checkers; - } - protected void populateDaos() { addDao("StackMaidDao", StackMaidDaoImpl.class); addDao("VMTemplateZoneDao", VMTemplateZoneDaoImpl.class); diff --git a/server/src/com/cloud/servlet/CloudStartupServlet.java b/server/src/com/cloud/servlet/CloudStartupServlet.java old mode 100644 new mode 100755 index ab43b8c2d5f..dbb65fb988a --- a/server/src/com/cloud/servlet/CloudStartupServlet.java +++ b/server/src/com/cloud/servlet/CloudStartupServlet.java @@ -29,6 +29,8 @@ import com.cloud.server.ConfigurationServer; import com.cloud.server.ManagementServer; import com.cloud.utils.SerialVersionUID; import com.cloud.utils.component.ComponentLocator; +import com.cloud.utils.component.SystemIntegrityChecker; + import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; @@ -40,9 +42,11 @@ public class CloudStartupServlet extends HttpServlet implements ServletContextLi protected static ComponentLocator s_locator; @Override - public void init() throws ServletException { - // Save Configuration Values - //ComponentLocator loc = ComponentLocator.getLocator(ConfigurationServer.Name); + public void init() throws ServletException { + /* System Integrity checker will run before all components really loaded */ + ComponentLocator.getComponent(SystemIntegrityChecker.Name); + // Save Configuration Values + //ComponentLocator loc = ComponentLocator.getLocator(ConfigurationServer.Name); ConfigurationServer c = (ConfigurationServer)ComponentLocator.getComponent(ConfigurationServer.Name); //ConfigurationServer c = new ConfigurationServerImpl(); try { diff --git a/server/src/com/cloud/upgrade/DatabaseUpgradeChecker.java b/server/src/com/cloud/upgrade/DatabaseUpgradeChecker.java old mode 100644 new mode 100755 index 56e53ae3eed..967eb5de832 --- a/server/src/com/cloud/upgrade/DatabaseUpgradeChecker.java +++ b/server/src/com/cloud/upgrade/DatabaseUpgradeChecker.java @@ -31,6 +31,8 @@ import java.util.HashMap; import java.util.List; import java.util.TreeMap; +import javax.ejb.Local; + import org.apache.log4j.Logger; import com.cloud.cluster.ClusterManagerImpl; @@ -58,6 +60,7 @@ import com.cloud.utils.db.ScriptRunner; import com.cloud.utils.db.Transaction; import com.cloud.utils.exception.CloudRuntimeException; +@Local(value = {SystemIntegrityChecker.class}) public class DatabaseUpgradeChecker implements SystemIntegrityChecker { private final Logger s_logger = Logger.getLogger(DatabaseUpgradeChecker.class); diff --git a/utils/src/com/cloud/utils/component/ComponentLibrary.java b/utils/src/com/cloud/utils/component/ComponentLibrary.java old mode 100644 new mode 100755 index e6b91e5b539..18aed723996 --- a/utils/src/com/cloud/utils/component/ComponentLibrary.java +++ b/utils/src/com/cloud/utils/component/ComponentLibrary.java @@ -33,14 +33,7 @@ import com.cloud.utils.db.GenericDao; * within the components.xml overrides the one within ComponentLibrary. * */ -public interface ComponentLibrary { - /** - * @return a list of SytemIntegrityCheckers which is run before other - * components are started to check if the system are fit to check - * the system. - */ - List getSystemIntegrityCheckers(); - +public interface ComponentLibrary { /** * @return all of the daos */ diff --git a/utils/src/com/cloud/utils/component/ComponentLocator.java b/utils/src/com/cloud/utils/component/ComponentLocator.java index 8ac6dcc8eba..73060907722 100755 --- a/utils/src/com/cloud/utils/component/ComponentLocator.java +++ b/utils/src/com/cloud/utils/component/ComponentLocator.java @@ -94,6 +94,7 @@ public class ComponentLocator implements ComponentLocatorMBean { protected HashMap> _adapterMap; protected HashMap> _managerMap; + protected HashMap> _checkerMap; protected LinkedHashMap>> _daoMap; protected String _serverName; protected Object _component; @@ -123,12 +124,13 @@ public class ComponentLocator implements ComponentLocatorMBean { return getLocatorName(); } - protected Ternary>>, List> parse2(String filename) { + protected Pair>>> parse2(String filename) { try { SAXParserFactory spfactory = SAXParserFactory.newInstance(); SAXParser saxParser = spfactory.newSAXParser(); _daoMap = new LinkedHashMap>>(); _managerMap = new LinkedHashMap>(); + _checkerMap = new HashMap>(); _adapterMap = new HashMap>(); _factories = new HashMap, Class>(); File file = PropertiesUtil.findConfigFile(filename); @@ -157,7 +159,6 @@ public class ComponentLocator implements ComponentLocatorMBean { } ComponentLibrary library = null; - List checkers = null; if (handler.library != null) { Class clazz = Class.forName(handler.library); library = (ComponentLibrary)clazz.newInstance(); @@ -165,15 +166,14 @@ public class ComponentLocator implements ComponentLocatorMBean { _managerMap.putAll(library.getManagers()); adapters.putAll(library.getAdapters()); _factories.putAll(library.getFactories()); - checkers = library.getSystemIntegrityCheckers(); } _daoMap.putAll(handler.daos); _managerMap.putAll(handler.managers); + _checkerMap.putAll(handler.checkers); adapters.putAll(handler.adapters); - return new Ternary>>, List>(handler, adapters, checkers); - + return new Pair>>>(handler, adapters); } catch (ParserConfigurationException e) { s_logger.error("Unable to load " + _serverName + " due to errors while parsing " + filename, e); System.exit(1); @@ -194,7 +194,7 @@ public class ComponentLocator implements ComponentLocatorMBean { } protected void parse(String filename) { - Ternary>>, List> result = parse2(filename); + Pair>>> result = parse2(filename); if (result == null) { s_logger.info("Skipping configuration using " + filename); return; @@ -203,11 +203,7 @@ public class ComponentLocator implements ComponentLocatorMBean { XmlHandler handler = result.first(); HashMap>> adapters = result.second(); try { - if (result.third() != null) { - for (SystemIntegrityChecker checker : result.third()) { - checker.check(); - } - } + runCheckers(); startDaos(); // daos should not be using managers and adapters. instantiateAdapters(adapters); instantiateManagers(); @@ -227,6 +223,19 @@ public class ComponentLocator implements ComponentLocatorMBean { } } + protected void runCheckers() { + Set>> entries = _checkerMap.entrySet(); + for (Map.Entry> entry : entries) { + ComponentInfo info = entry.getValue(); + try { + info.instance = (SystemIntegrityChecker)createInstance(info.clazz, false, info.singleton); + info.instance.check(); + } catch (Exception e) { + s_logger.error("Problems with running checker:" + info.name, e); + System.exit(1); + } + } + } /** * Daos should not refer to any other components so it is safe to start them * here. @@ -848,6 +857,7 @@ public class ComponentLocator implements ComponentLocatorMBean { protected class XmlHandler extends DefaultHandler { public HashMap>> adapters; public HashMap> managers; + public HashMap> checkers; public LinkedHashMap>> daos; public String parent; public String library; @@ -865,6 +875,7 @@ public class ComponentLocator implements ComponentLocatorMBean { parse = false; adapters = new HashMap>>(); managers = new HashMap>(); + checkers = new HashMap>(); daos = new LinkedHashMap>>(); value = null; parent = null; @@ -966,6 +977,12 @@ public class ComponentLocator implements ComponentLocatorMBean { daos.put(key, info); } currentInfo = info; + } else if (qName.equals("checker")) { + ComponentInfo info = new ComponentInfo(); + fillInfo(atts, SystemIntegrityChecker.class, info); + checkers.put(info.name, info); + s_logger.info("Adding system integrity checker: " + info.name); + currentInfo = info; } else { // ignore } diff --git a/utils/src/com/cloud/utils/component/SystemIntegrityChecker.java b/utils/src/com/cloud/utils/component/SystemIntegrityChecker.java old mode 100644 new mode 100755 index c0a6275f4db..95af731e145 --- a/utils/src/com/cloud/utils/component/SystemIntegrityChecker.java +++ b/utils/src/com/cloud/utils/component/SystemIntegrityChecker.java @@ -24,5 +24,7 @@ package com.cloud.utils.component; * database upgrades and other verification to make sure it works. */ public interface SystemIntegrityChecker { + public static final String Name = "system-integrity-checker"; + void check(); } diff --git a/utils/test/com/cloud/utils/component/MockComponentLocator.java b/utils/test/com/cloud/utils/component/MockComponentLocator.java old mode 100644 new mode 100755 index 2e74bdbe7fc..a74b3833bd2 --- a/utils/test/com/cloud/utils/component/MockComponentLocator.java +++ b/utils/test/com/cloud/utils/component/MockComponentLocator.java @@ -29,6 +29,7 @@ import net.sf.cglib.proxy.NoOp; import com.cloud.utils.Pair; import com.cloud.utils.Ternary; +import com.cloud.utils.component.ComponentLocator.ComponentInfo; import com.cloud.utils.db.DatabaseCallback; import com.cloud.utils.db.DatabaseCallbackFilter; import com.cloud.utils.db.GenericDao; @@ -62,10 +63,11 @@ public class MockComponentLocator extends ComponentLocator { } @Override - protected Ternary>>, List> parse2(String filename) { - Ternary>>, List> result = new Ternary>>, List>(new XmlHandler("fake"), new HashMap>>(), new ArrayList()); + protected Pair>>> parse2(String filename) { + Pair>>> result = new Pair>>>(new XmlHandler("fake"), new HashMap>>()); _daoMap = new LinkedHashMap>>(); _managerMap = new LinkedHashMap>(); + _checkerMap = new HashMap>(); _adapterMap = new HashMap>(); _factories = new HashMap, Class>(); _daoMap.putAll(_library.getDaos()); @@ -88,12 +90,7 @@ public class MockComponentLocator extends ComponentLocator { } protected class MockComponentLibrary extends ComponentLibraryBase implements ComponentLibrary { - - @Override - public List getSystemIntegrityCheckers() { - return new ArrayList(); - } - + @Override public Map>> getAdapters() { return _adapters;