mirror of
https://github.com/apache/cloudstack.git
synced 2025-10-26 08:42:29 +01:00
added the concept of system integrity checking before a system starts
This commit is contained in:
parent
570c7c532e
commit
8bec1e0b9f
@ -75,6 +75,7 @@
|
|||||||
<property name="server.dir" location="${base.dir}/server" />
|
<property name="server.dir" location="${base.dir}/server" />
|
||||||
<property name="server.test.dir" location="${server.dir}/test" />
|
<property name="server.test.dir" location="${server.dir}/test" />
|
||||||
<property name="server.dist.dir" location="${dist.dir}/client" />
|
<property name="server.dist.dir" location="${dist.dir}/client" />
|
||||||
|
<property name="db.scripts.dir" location="${target.dir}/db"/>
|
||||||
|
|
||||||
<!-- directories for core code compilation-->
|
<!-- directories for core code compilation-->
|
||||||
<property name="core.dir" location="${base.dir}/core" />
|
<property name="core.dir" location="${base.dir}/core" />
|
||||||
@ -287,6 +288,13 @@
|
|||||||
<include name="*.xml" />
|
<include name="*.xml" />
|
||||||
</fileset>
|
</fileset>
|
||||||
</copy>
|
</copy>
|
||||||
|
|
||||||
|
<copy overwrite="true" todir="${db.scripts.dir}">
|
||||||
|
<fileset dir="${setup.db.dir}">
|
||||||
|
<include name="**/*"/>
|
||||||
|
<exclude name="**/override/*"/>
|
||||||
|
</fileset>
|
||||||
|
</copy>
|
||||||
</target>
|
</target>
|
||||||
|
|
||||||
<path id="console-common.classpath">
|
<path id="console-common.classpath">
|
||||||
|
|||||||
@ -3,7 +3,7 @@
|
|||||||
# major.minor.patch versioning scheme for vmops
|
# major.minor.patch versioning scheme for vmops
|
||||||
company.major.version=2
|
company.major.version=2
|
||||||
company.minor.version=2
|
company.minor.version=2
|
||||||
company.patch.version=1
|
company.patch.version=3
|
||||||
|
|
||||||
svn.revision=2
|
svn.revision=2
|
||||||
|
|
||||||
|
|||||||
@ -148,11 +148,12 @@
|
|||||||
</condition>
|
</condition>
|
||||||
<antcall target="unzip" inheritAll="true"/>
|
<antcall target="unzip" inheritAll="true"/>
|
||||||
<unwar overwrite="true" src="${deploy.work.dir}/client/client.war" dest="${server.deploy.to.dir}/webapps/client"/>
|
<unwar overwrite="true" src="${deploy.work.dir}/client/client.war" dest="${server.deploy.to.dir}/webapps/client"/>
|
||||||
<copy todir="${server.deploy.to.dir}/lib">
|
<!-- <copy todir="${server.deploy.to.dir}/lib">
|
||||||
<fileset dir="${deploy.work.dir}/client/lib/">
|
<fileset dir="${deploy.work.dir}/client/lib/">
|
||||||
<include name="*.jar"/>
|
<include name="*.jar"/>
|
||||||
</fileset>
|
</fileset>
|
||||||
</copy>
|
</copy>
|
||||||
|
-->
|
||||||
<touch file="${server.deploy.to.dir}/webapps/client/WEB-INF/lib/scripts/vm/hypervisor/xenserver/version"/>
|
<touch file="${server.deploy.to.dir}/webapps/client/WEB-INF/lib/scripts/vm/hypervisor/xenserver/version"/>
|
||||||
<echo file="${server.deploy.to.dir}/webapps/client/WEB-INF/lib/scripts/vm/hypervisor/xenserver/version" append="false" message="${version}.${build.number}"/>
|
<echo file="${server.deploy.to.dir}/webapps/client/WEB-INF/lib/scripts/vm/hypervisor/xenserver/version" append="false" message="${version}.${build.number}"/>
|
||||||
<copy overwrite="true" todir="${server.deploy.to.dir}/conf">
|
<copy overwrite="true" todir="${server.deploy.to.dir}/conf">
|
||||||
|
|||||||
@ -161,6 +161,9 @@
|
|||||||
<zipfileset dir="${scripts.target.dir}" prefix="WEB-INF/lib/scripts" filemode="555">
|
<zipfileset dir="${scripts.target.dir}" prefix="WEB-INF/lib/scripts" filemode="555">
|
||||||
<include name="**/*" />
|
<include name="**/*" />
|
||||||
</zipfileset>
|
</zipfileset>
|
||||||
|
<zipfileset dir="${db.scripts.dir}" prefix="WEB-INF/lib/db" filemode="555">
|
||||||
|
<include name="**/*"/>
|
||||||
|
</zipfileset>
|
||||||
</war>
|
</war>
|
||||||
</target>
|
</target>
|
||||||
|
|
||||||
|
|||||||
@ -18,6 +18,7 @@
|
|||||||
package com.cloud.configuration;
|
package com.cloud.configuration;
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
@ -132,6 +133,7 @@ import com.cloud.utils.component.ComponentLibrary;
|
|||||||
import com.cloud.utils.component.ComponentLibraryBase;
|
import com.cloud.utils.component.ComponentLibraryBase;
|
||||||
import com.cloud.utils.component.ComponentLocator.ComponentInfo;
|
import com.cloud.utils.component.ComponentLocator.ComponentInfo;
|
||||||
import com.cloud.utils.component.Manager;
|
import com.cloud.utils.component.Manager;
|
||||||
|
import com.cloud.utils.component.SystemIntegrityChecker;
|
||||||
import com.cloud.utils.db.GenericDao;
|
import com.cloud.utils.db.GenericDao;
|
||||||
import com.cloud.vm.ClusteredVirtualMachineManagerImpl;
|
import com.cloud.vm.ClusteredVirtualMachineManagerImpl;
|
||||||
import com.cloud.vm.ItWorkDaoImpl;
|
import com.cloud.vm.ItWorkDaoImpl;
|
||||||
@ -149,6 +151,13 @@ import com.cloud.vm.dao.VMInstanceDaoImpl;
|
|||||||
|
|
||||||
public class DefaultComponentLibrary extends ComponentLibraryBase implements ComponentLibrary {
|
public class DefaultComponentLibrary extends ComponentLibraryBase implements ComponentLibrary {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<SystemIntegrityChecker> getSystemIntegrityCheckers() {
|
||||||
|
ArrayList<SystemIntegrityChecker> checkers = new ArrayList<SystemIntegrityChecker>();
|
||||||
|
// checkers.add(new DatabaseUpgradeChecker());
|
||||||
|
return checkers;
|
||||||
|
}
|
||||||
|
|
||||||
protected void populateDaos() {
|
protected void populateDaos() {
|
||||||
addDao("StackMaidDao", StackMaidDaoImpl.class);
|
addDao("StackMaidDao", StackMaidDaoImpl.class);
|
||||||
addDao("VMTemplateZoneDao", VMTemplateZoneDaoImpl.class);
|
addDao("VMTemplateZoneDao", VMTemplateZoneDaoImpl.class);
|
||||||
|
|||||||
@ -47,6 +47,11 @@ public class Version {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static String trimToPatch(String version) {
|
||||||
|
String[] tokens = version.split("[.]");
|
||||||
|
return tokens[0] + "." + tokens[1]+ "." + tokens[2];
|
||||||
|
}
|
||||||
|
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
System.out.println("Result is " + compare(args[0], args[1]));
|
System.out.println("Result is " + compare(args[0], args[1]));
|
||||||
}
|
}
|
||||||
|
|||||||
@ -28,9 +28,9 @@ import java.util.List;
|
|||||||
|
|
||||||
import org.apache.log4j.Logger;
|
import org.apache.log4j.Logger;
|
||||||
|
|
||||||
import com.cloud.utils.PropertiesUtil;
|
|
||||||
import com.cloud.utils.exception.CloudRuntimeException;
|
import com.cloud.utils.exception.CloudRuntimeException;
|
||||||
import com.cloud.utils.net.NetUtils;
|
import com.cloud.utils.net.NetUtils;
|
||||||
|
import com.cloud.utils.script.Script;
|
||||||
|
|
||||||
public class Upgrade217to22 implements DbUpgrade {
|
public class Upgrade217to22 implements DbUpgrade {
|
||||||
final static Logger s_logger = Logger.getLogger(Upgrade217to22.class);
|
final static Logger s_logger = Logger.getLogger(Upgrade217to22.class);
|
||||||
@ -38,12 +38,12 @@ public class Upgrade217to22 implements DbUpgrade {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public File[] getPrepareScripts() {
|
public File[] getPrepareScripts() {
|
||||||
File file = PropertiesUtil.findConfigFile("schema-21to22.sql");
|
String file = Script.findScript("","db/schema-21to22.sql");
|
||||||
if (file == null) {
|
if (file == null) {
|
||||||
throw new CloudRuntimeException("Unable to find the upgrade script, schema-21to22.sql");
|
throw new CloudRuntimeException("Unable to find the upgrade script, schema-21to22.sql");
|
||||||
}
|
}
|
||||||
|
|
||||||
return new File[] {file};
|
return new File[] {new File(file)};
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void upgradeStoragePools(Connection conn) {
|
protected void upgradeStoragePools(Connection conn) {
|
||||||
@ -864,12 +864,12 @@ public class Upgrade217to22 implements DbUpgrade {
|
|||||||
public File[] getCleanupScripts() {
|
public File[] getCleanupScripts() {
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
// File file = PropertiesUtil.findConfigFile("schema-21to22-cleanup.sql");
|
// String file = Script.findScript("", "db/schema-21to22-cleanup.sql");
|
||||||
// if (file == null) {
|
// if (file == null) {
|
||||||
// throw new CloudRuntimeException("Unable to find the upgrade script, schema-21to22-cleanup.sql");
|
// throw new CloudRuntimeException("Unable to find the upgrade script, schema-21to22-cleanup.sql");
|
||||||
// }
|
// }
|
||||||
//
|
//
|
||||||
// return new File[] { file };
|
// return new File[] { new File(file) };
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@ -19,24 +19,20 @@ package com.cloud.upgrade.dao;
|
|||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.sql.Connection;
|
import java.sql.Connection;
|
||||||
import java.sql.PreparedStatement;
|
|
||||||
import java.sql.ResultSet;
|
|
||||||
import java.sql.SQLException;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
|
|
||||||
import com.cloud.utils.PropertiesUtil;
|
|
||||||
import com.cloud.utils.exception.CloudRuntimeException;
|
import com.cloud.utils.exception.CloudRuntimeException;
|
||||||
|
import com.cloud.utils.script.Script;
|
||||||
|
|
||||||
public class UpgradeSnapshot217to223 implements DbUpgrade {
|
public class UpgradeSnapshot217to223 implements DbUpgrade {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public File[] getPrepareScripts() {
|
public File[] getPrepareScripts() {
|
||||||
File file = PropertiesUtil.findConfigFile("schema-snapshot-217to223.sql");
|
String file = Script.findScript("", "db/schema-snapshot-217to223.sql");
|
||||||
if (file == null) {
|
if (file == null) {
|
||||||
throw new CloudRuntimeException("Unable to find the upgrade script, chema-snapshot-217to223.sql");
|
throw new CloudRuntimeException("Unable to find the upgrade script, chema-snapshot-217to223.sql");
|
||||||
}
|
}
|
||||||
|
|
||||||
return new File[] {file};
|
return new File[] { new File(file)};
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@ -17,8 +17,10 @@
|
|||||||
*/
|
*/
|
||||||
package com.cloud.upgrade.dao;
|
package com.cloud.upgrade.dao;
|
||||||
|
|
||||||
|
import com.cloud.upgrade.dao.VersionVO.Step;
|
||||||
import com.cloud.utils.db.GenericDao;
|
import com.cloud.utils.db.GenericDao;
|
||||||
|
|
||||||
public interface VersionDao extends GenericDao<VersionVO, Long> {
|
public interface VersionDao extends GenericDao<VersionVO, Long> {
|
||||||
|
VersionVO findByVersion(String version, Step step);
|
||||||
|
String getCurrentVersion();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -17,32 +17,21 @@
|
|||||||
*/
|
*/
|
||||||
package com.cloud.upgrade.dao;
|
package com.cloud.upgrade.dao;
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
import java.io.FileNotFoundException;
|
|
||||||
import java.io.FileReader;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.sql.Connection;
|
import java.sql.Connection;
|
||||||
import java.sql.PreparedStatement;
|
import java.sql.PreparedStatement;
|
||||||
import java.sql.ResultSet;
|
import java.sql.ResultSet;
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
import java.util.Date;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import javax.ejb.Local;
|
import javax.ejb.Local;
|
||||||
import javax.naming.ConfigurationException;
|
|
||||||
|
|
||||||
import org.apache.log4j.Logger;
|
import org.apache.log4j.Logger;
|
||||||
|
|
||||||
import com.cloud.maint.Version;
|
|
||||||
import com.cloud.upgrade.dao.VersionVO.Step;
|
import com.cloud.upgrade.dao.VersionVO.Step;
|
||||||
import com.cloud.utils.Pair;
|
|
||||||
import com.cloud.utils.db.DB;
|
import com.cloud.utils.db.DB;
|
||||||
import com.cloud.utils.db.Filter;
|
import com.cloud.utils.db.Filter;
|
||||||
import com.cloud.utils.db.GenericDaoBase;
|
import com.cloud.utils.db.GenericDaoBase;
|
||||||
import com.cloud.utils.db.GenericSearchBuilder;
|
import com.cloud.utils.db.GenericSearchBuilder;
|
||||||
import com.cloud.utils.db.ScriptRunner;
|
|
||||||
import com.cloud.utils.db.SearchBuilder;
|
import com.cloud.utils.db.SearchBuilder;
|
||||||
import com.cloud.utils.db.SearchCriteria;
|
import com.cloud.utils.db.SearchCriteria;
|
||||||
import com.cloud.utils.db.SearchCriteria.Func;
|
import com.cloud.utils.db.SearchCriteria.Func;
|
||||||
@ -54,16 +43,11 @@ import com.cloud.utils.exception.CloudRuntimeException;
|
|||||||
public class VersionDaoImpl extends GenericDaoBase<VersionVO, Long> implements VersionDao {
|
public class VersionDaoImpl extends GenericDaoBase<VersionVO, Long> implements VersionDao {
|
||||||
private static final Logger s_logger = Logger.getLogger(VersionDaoImpl.class);
|
private static final Logger s_logger = Logger.getLogger(VersionDaoImpl.class);
|
||||||
|
|
||||||
protected HashMap<Pair<String, String>, DbUpgrade[]> _upgradeMap = new HashMap<Pair<String, String>, DbUpgrade[]>();
|
|
||||||
|
|
||||||
String _dumpPath = null;
|
|
||||||
|
|
||||||
final GenericSearchBuilder<VersionVO, String> CurrentVersionSearch;
|
final GenericSearchBuilder<VersionVO, String> CurrentVersionSearch;
|
||||||
final SearchBuilder<VersionVO> AllFieldsSearch;
|
final SearchBuilder<VersionVO> AllFieldsSearch;
|
||||||
|
|
||||||
protected VersionDaoImpl() {
|
protected VersionDaoImpl() {
|
||||||
super();
|
super();
|
||||||
_upgradeMap.put(new Pair<String, String>("2.1.7", "2.2.3"), new DbUpgrade[] { new Upgrade217to22(), new UpgradeSnapshot217to223()});
|
|
||||||
|
|
||||||
CurrentVersionSearch = createSearchBuilder(String.class);
|
CurrentVersionSearch = createSearchBuilder(String.class);
|
||||||
CurrentVersionSearch.select(null, Func.FIRST, CurrentVersionSearch.entity().getVersion());
|
CurrentVersionSearch.select(null, Func.FIRST, CurrentVersionSearch.entity().getVersion());
|
||||||
@ -78,7 +62,7 @@ public class VersionDaoImpl extends GenericDaoBase<VersionVO, Long> implements V
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected VersionVO findByVersion(String version, Step step) {
|
public VersionVO findByVersion(String version, Step step) {
|
||||||
SearchCriteria<VersionVO> sc = AllFieldsSearch.create();
|
SearchCriteria<VersionVO> sc = AllFieldsSearch.create();
|
||||||
sc.setParameters("version", version);
|
sc.setParameters("version", version);
|
||||||
sc.setParameters("step", step);
|
sc.setParameters("step", step);
|
||||||
@ -86,14 +70,12 @@ public class VersionDaoImpl extends GenericDaoBase<VersionVO, Long> implements V
|
|||||||
return findOneBy(sc);
|
return findOneBy(sc);
|
||||||
}
|
}
|
||||||
|
|
||||||
@DB
|
public String getCurrentVersion() {
|
||||||
protected String getCurrentVersion() {
|
|
||||||
Transaction txn = Transaction.currentTxn();
|
|
||||||
Connection conn = null;
|
Connection conn = null;
|
||||||
try {
|
try {
|
||||||
s_logger.debug("Checking to see if the database is at a version before it was the version table is created");
|
s_logger.debug("Checking to see if the database is at a version before it was the version table is created");
|
||||||
|
|
||||||
conn = txn.getConnection();
|
conn = Transaction.getStandaloneConnection();
|
||||||
|
|
||||||
PreparedStatement pstmt = conn.prepareStatement("SHOW TABLES LIKE 'VERSION'");
|
PreparedStatement pstmt = conn.prepareStatement("SHOW TABLES LIKE 'VERSION'");
|
||||||
ResultSet rs = pstmt.executeQuery();
|
ResultSet rs = pstmt.executeQuery();
|
||||||
@ -116,6 +98,11 @@ public class VersionDaoImpl extends GenericDaoBase<VersionVO, Long> implements V
|
|||||||
}
|
}
|
||||||
} catch (SQLException e) {
|
} catch (SQLException e) {
|
||||||
throw new CloudRuntimeException("Unable to get the current version", e);
|
throw new CloudRuntimeException("Unable to get the current version", e);
|
||||||
|
} finally {
|
||||||
|
try {
|
||||||
|
conn.close();
|
||||||
|
} catch (SQLException e) {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SearchCriteria<String> sc = CurrentVersionSearch.create();
|
SearchCriteria<String> sc = CurrentVersionSearch.create();
|
||||||
@ -126,119 +113,4 @@ public class VersionDaoImpl extends GenericDaoBase<VersionVO, Long> implements V
|
|||||||
List<String> vers = customSearch(sc, filter);
|
List<String> vers = customSearch(sc, filter);
|
||||||
return vers.get(0);
|
return vers.get(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void runScript(File file) {
|
|
||||||
try {
|
|
||||||
FileReader reader = new FileReader(file);
|
|
||||||
Connection conn = Transaction.getStandaloneConnection();
|
|
||||||
ScriptRunner runner = new ScriptRunner(conn, false, true);
|
|
||||||
runner.runScript(reader);
|
|
||||||
} catch (FileNotFoundException e) {
|
|
||||||
throw new CloudRuntimeException("Unable to find upgrade script, schema-21to22.sql", e);
|
|
||||||
} catch (IOException e) {
|
|
||||||
throw new CloudRuntimeException("Unable to read upgrade script, schema-21to22.sql", e);
|
|
||||||
} catch (SQLException e) {
|
|
||||||
throw new CloudRuntimeException("Unable to execute upgrade script, schema-21to22.sql", e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@DB
|
|
||||||
protected void upgrade(String dbVersion, String currentVersion) throws ConfigurationException {
|
|
||||||
s_logger.info("Database upgrade must be performed from " + dbVersion + " to " + currentVersion);
|
|
||||||
|
|
||||||
DbUpgrade[] upgrades = _upgradeMap.get(new Pair<String, String>(dbVersion, currentVersion));
|
|
||||||
if (upgrades == null) {
|
|
||||||
throw new ConfigurationException("There is no upgrade path from " + dbVersion + " to " + currentVersion);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Version.compare(currentVersion, upgrades[upgrades.length - 1].getUpgradedVersion()) != 0) {
|
|
||||||
throw new ConfigurationException("The end upgrade version is actually at " + upgrades[upgrades.length - 1].getUpgradedVersion() + " but our management server code version is at " + currentVersion);
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean supportsRollingUpgrade = true;
|
|
||||||
for (DbUpgrade upgrade : upgrades) {
|
|
||||||
if (!upgrade.supportsRollingUpgrade()) {
|
|
||||||
supportsRollingUpgrade = false;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!supportsRollingUpgrade) {
|
|
||||||
// TODO: Check if the other management server is still running by looking at the database. If so, then throw an exception.
|
|
||||||
}
|
|
||||||
|
|
||||||
for (DbUpgrade upgrade : upgrades) {
|
|
||||||
s_logger.info("Running upgrade " + upgrade.getClass().getSimpleName() + " to upgrade from " + upgrade.getUpgradableVersionRange()[0] + "-" + upgrade.getUpgradableVersionRange()[1] + " to " + upgrade.getUpgradedVersion());
|
|
||||||
Transaction txn = Transaction.currentTxn();
|
|
||||||
txn.start();
|
|
||||||
Connection conn;
|
|
||||||
try {
|
|
||||||
conn = txn.getConnection();
|
|
||||||
} catch (SQLException e) {
|
|
||||||
throw new CloudRuntimeException("Unable to upgrade the database", e);
|
|
||||||
}
|
|
||||||
File[] scripts = upgrade.getPrepareScripts();
|
|
||||||
if (scripts != null) {
|
|
||||||
for (File script : scripts) {
|
|
||||||
runScript(script);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
upgrade.performDataMigration(conn);
|
|
||||||
VersionVO version = new VersionVO(upgrade.getUpgradedVersion());
|
|
||||||
persist(version);
|
|
||||||
txn.commit();
|
|
||||||
}
|
|
||||||
|
|
||||||
for (DbUpgrade upgrade : upgrades) {
|
|
||||||
s_logger.info("Cleanup upgrade " + upgrade.getClass().getSimpleName() + " to upgrade from " + upgrade.getUpgradableVersionRange()[0] + "-" + upgrade.getUpgradableVersionRange()[1] + " to " + upgrade.getUpgradedVersion());
|
|
||||||
VersionVO version = findByVersion(upgrade.getUpgradedVersion(), Step.Upgrade);
|
|
||||||
Transaction txn = Transaction.currentTxn();
|
|
||||||
txn.start();
|
|
||||||
File[] scripts = upgrade.getCleanupScripts();
|
|
||||||
if (scripts != null) {
|
|
||||||
for (File script : scripts) {
|
|
||||||
runScript(script);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
version.setStep(Step.Complete);
|
|
||||||
version.setUpdated(new Date());
|
|
||||||
update(version.getId(), version);
|
|
||||||
txn.commit();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean configure(String name, Map<String, Object> params) throws ConfigurationException {
|
|
||||||
super.configure(name, params);
|
|
||||||
|
|
||||||
_dumpPath = (String)params.get("upgrade.dump.path");
|
|
||||||
if (_dumpPath == null) {
|
|
||||||
_dumpPath = System.getenv("upgrade.dump.path");
|
|
||||||
if (_dumpPath == null) {
|
|
||||||
_dumpPath = "/var/log/";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
String dbVersion = getCurrentVersion();
|
|
||||||
String currentVersion = this.getClass().getPackage().getImplementationVersion();
|
|
||||||
if (currentVersion == null) {
|
|
||||||
currentVersion = this.getClass().getSuperclass().getPackage().getImplementationVersion();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (s_logger.isDebugEnabled()) {
|
|
||||||
s_logger.debug("DB version = " + dbVersion + " Code Version = " + currentVersion);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Version.compare(dbVersion, currentVersion) > 0) {
|
|
||||||
throw new ConfigurationException("Database version " + dbVersion + " is higher than management software version " + currentVersion);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Version.compare(dbVersion, currentVersion) == 0) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
upgrade(dbVersion, currentVersion);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -23,8 +23,6 @@ import java.sql.PreparedStatement;
|
|||||||
import java.sql.ResultSet;
|
import java.sql.ResultSet;
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
|
|
||||||
import javax.naming.ConfigurationException;
|
|
||||||
|
|
||||||
import junit.framework.TestCase;
|
import junit.framework.TestCase;
|
||||||
|
|
||||||
import org.apache.log4j.Logger;
|
import org.apache.log4j.Logger;
|
||||||
@ -61,16 +59,12 @@ public class AdvanceZone217To223UpgradeTest extends TestCase {
|
|||||||
PreparedStatement pstmt;
|
PreparedStatement pstmt;
|
||||||
|
|
||||||
VersionDaoImpl dao = ComponentLocator.inject(VersionDaoImpl.class);
|
VersionDaoImpl dao = ComponentLocator.inject(VersionDaoImpl.class);
|
||||||
|
DatabaseUpgradeChecker checker = ComponentLocator.inject(DatabaseUpgradeChecker.class);
|
||||||
|
|
||||||
String version = dao.getCurrentVersion();
|
String version = dao.getCurrentVersion();
|
||||||
assert version.equals("2.1.7") : "Version returned is not 2.1.7 but " + version;
|
assert version.equals("2.1.7") : "Version returned is not 2.1.7 but " + version;
|
||||||
|
|
||||||
try {
|
checker.upgrade("2.1.7", "2.2.3");
|
||||||
dao.upgrade("2.1.7", "2.2.3");
|
|
||||||
} catch (ConfigurationException e) {
|
|
||||||
s_logger.warn("Exception: ", e);
|
|
||||||
assert false : "The test failed. Check logs";
|
|
||||||
}
|
|
||||||
|
|
||||||
conn = Transaction.getStandaloneConnection();
|
conn = Transaction.getStandaloneConnection();
|
||||||
try {
|
try {
|
||||||
|
|||||||
@ -23,8 +23,6 @@ import java.sql.PreparedStatement;
|
|||||||
import java.sql.ResultSet;
|
import java.sql.ResultSet;
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
|
|
||||||
import javax.naming.ConfigurationException;
|
|
||||||
|
|
||||||
import junit.framework.TestCase;
|
import junit.framework.TestCase;
|
||||||
|
|
||||||
import org.apache.log4j.Logger;
|
import org.apache.log4j.Logger;
|
||||||
@ -61,6 +59,7 @@ public class BasicZone217To223UpgradeTest extends TestCase {
|
|||||||
PreparedStatement pstmt;
|
PreparedStatement pstmt;
|
||||||
|
|
||||||
VersionDaoImpl dao = ComponentLocator.inject(VersionDaoImpl.class);
|
VersionDaoImpl dao = ComponentLocator.inject(VersionDaoImpl.class);
|
||||||
|
DatabaseUpgradeChecker checker = ComponentLocator.inject(DatabaseUpgradeChecker.class);
|
||||||
|
|
||||||
String version = dao.getCurrentVersion();
|
String version = dao.getCurrentVersion();
|
||||||
|
|
||||||
@ -70,12 +69,7 @@ public class BasicZone217To223UpgradeTest extends TestCase {
|
|||||||
s_logger.debug("Basic zone test version is " + version);
|
s_logger.debug("Basic zone test version is " + version);
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
checker.upgrade("2.1.7", "2.2.3");
|
||||||
dao.upgrade("2.1.7", "2.2.3");
|
|
||||||
} catch (ConfigurationException e) {
|
|
||||||
s_logger.warn("Exception: ", e);
|
|
||||||
assert false : "The test failed. Check logs";
|
|
||||||
}
|
|
||||||
|
|
||||||
conn = Transaction.getStandaloneConnection();
|
conn = Transaction.getStandaloneConnection();
|
||||||
try {
|
try {
|
||||||
|
|||||||
@ -24,8 +24,6 @@ import java.sql.ResultSet;
|
|||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
|
||||||
import javax.naming.ConfigurationException;
|
|
||||||
|
|
||||||
import junit.framework.TestCase;
|
import junit.framework.TestCase;
|
||||||
|
|
||||||
import org.apache.log4j.Logger;
|
import org.apache.log4j.Logger;
|
||||||
@ -62,6 +60,7 @@ public class InstanceGroup217To223UpgradeTest extends TestCase {
|
|||||||
PreparedStatement pstmt;
|
PreparedStatement pstmt;
|
||||||
|
|
||||||
VersionDaoImpl dao = ComponentLocator.inject(VersionDaoImpl.class);
|
VersionDaoImpl dao = ComponentLocator.inject(VersionDaoImpl.class);
|
||||||
|
DatabaseUpgradeChecker checker = ComponentLocator.inject(DatabaseUpgradeChecker.class);
|
||||||
|
|
||||||
String version = dao.getCurrentVersion();
|
String version = dao.getCurrentVersion();
|
||||||
|
|
||||||
@ -71,12 +70,7 @@ public class InstanceGroup217To223UpgradeTest extends TestCase {
|
|||||||
s_logger.debug("Basic zone test version is " + version);
|
s_logger.debug("Basic zone test version is " + version);
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
checker.upgrade("2.1.7", "2.2.3");
|
||||||
dao.upgrade("2.1.7", "2.2.3");
|
|
||||||
} catch (ConfigurationException e) {
|
|
||||||
s_logger.warn("Exception: ", e);
|
|
||||||
assert false : "The test failed. Check logs";
|
|
||||||
}
|
|
||||||
|
|
||||||
conn = Transaction.getStandaloneConnection();
|
conn = Transaction.getStandaloneConnection();
|
||||||
try {
|
try {
|
||||||
|
|||||||
@ -34,6 +34,13 @@ import com.cloud.utils.db.GenericDao;
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public interface 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<SystemIntegrityChecker> getSystemIntegrityCheckers();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return all of the daos
|
* @return all of the daos
|
||||||
*/
|
*/
|
||||||
|
|||||||
@ -62,6 +62,7 @@ import org.xml.sax.helpers.DefaultHandler;
|
|||||||
|
|
||||||
import com.cloud.utils.Pair;
|
import com.cloud.utils.Pair;
|
||||||
import com.cloud.utils.PropertiesUtil;
|
import com.cloud.utils.PropertiesUtil;
|
||||||
|
import com.cloud.utils.Ternary;
|
||||||
import com.cloud.utils.db.DatabaseCallback;
|
import com.cloud.utils.db.DatabaseCallback;
|
||||||
import com.cloud.utils.db.DatabaseCallbackFilter;
|
import com.cloud.utils.db.DatabaseCallbackFilter;
|
||||||
import com.cloud.utils.db.GenericDao;
|
import com.cloud.utils.db.GenericDao;
|
||||||
@ -113,7 +114,7 @@ public class ComponentLocator implements ComponentLocatorMBean {
|
|||||||
return getLocatorName();
|
return getLocatorName();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected Pair<XmlHandler, HashMap<String, List<ComponentInfo<Adapter>>>> parse2(String filename) {
|
protected Ternary<XmlHandler, HashMap<String, List<ComponentInfo<Adapter>>>, List<SystemIntegrityChecker>> parse2(String filename) {
|
||||||
try {
|
try {
|
||||||
SAXParserFactory spfactory = SAXParserFactory.newInstance();
|
SAXParserFactory spfactory = SAXParserFactory.newInstance();
|
||||||
SAXParser saxParser = spfactory.newSAXParser();
|
SAXParser saxParser = spfactory.newSAXParser();
|
||||||
@ -147,6 +148,7 @@ public class ComponentLocator implements ComponentLocatorMBean {
|
|||||||
}
|
}
|
||||||
|
|
||||||
ComponentLibrary library = null;
|
ComponentLibrary library = null;
|
||||||
|
List<SystemIntegrityChecker> checkers = null;
|
||||||
if (handler.library != null) {
|
if (handler.library != null) {
|
||||||
Class<?> clazz = Class.forName(handler.library);
|
Class<?> clazz = Class.forName(handler.library);
|
||||||
library = (ComponentLibrary)clazz.newInstance();
|
library = (ComponentLibrary)clazz.newInstance();
|
||||||
@ -154,13 +156,14 @@ public class ComponentLocator implements ComponentLocatorMBean {
|
|||||||
_managerMap.putAll(library.getManagers());
|
_managerMap.putAll(library.getManagers());
|
||||||
adapters.putAll(library.getAdapters());
|
adapters.putAll(library.getAdapters());
|
||||||
_factories.putAll(library.getFactories());
|
_factories.putAll(library.getFactories());
|
||||||
|
checkers = library.getSystemIntegrityCheckers();
|
||||||
}
|
}
|
||||||
|
|
||||||
_daoMap.putAll(handler.daos);
|
_daoMap.putAll(handler.daos);
|
||||||
_managerMap.putAll(handler.managers);
|
_managerMap.putAll(handler.managers);
|
||||||
adapters.putAll(handler.adapters);
|
adapters.putAll(handler.adapters);
|
||||||
|
|
||||||
return new Pair<XmlHandler, HashMap<String, List<ComponentInfo<Adapter>>>>(handler, adapters);
|
return new Ternary<XmlHandler, HashMap<String, List<ComponentInfo<Adapter>>>, List<SystemIntegrityChecker>>(handler, adapters, checkers);
|
||||||
|
|
||||||
} catch (ParserConfigurationException e) {
|
} catch (ParserConfigurationException e) {
|
||||||
s_logger.error("Unable to load " + _serverName + " due to errors while parsing " + filename, e);
|
s_logger.error("Unable to load " + _serverName + " due to errors while parsing " + filename, e);
|
||||||
@ -182,7 +185,7 @@ public class ComponentLocator implements ComponentLocatorMBean {
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected void parse(String filename) {
|
protected void parse(String filename) {
|
||||||
Pair<XmlHandler, HashMap<String, List<ComponentInfo<Adapter>>>> result = parse2(filename);
|
Ternary<XmlHandler, HashMap<String, List<ComponentInfo<Adapter>>>, List<SystemIntegrityChecker>> result = parse2(filename);
|
||||||
if (result == null) {
|
if (result == null) {
|
||||||
s_logger.info("Skipping configuration using " + filename);
|
s_logger.info("Skipping configuration using " + filename);
|
||||||
return;
|
return;
|
||||||
@ -191,6 +194,11 @@ public class ComponentLocator implements ComponentLocatorMBean {
|
|||||||
XmlHandler handler = result.first();
|
XmlHandler handler = result.first();
|
||||||
HashMap<String, List<ComponentInfo<Adapter>>> adapters = result.second();
|
HashMap<String, List<ComponentInfo<Adapter>>> adapters = result.second();
|
||||||
try {
|
try {
|
||||||
|
if (result.third() != null) {
|
||||||
|
for (SystemIntegrityChecker checker : result.third()) {
|
||||||
|
checker.check();
|
||||||
|
}
|
||||||
|
}
|
||||||
startDaos(); // daos should not be using managers and adapters.
|
startDaos(); // daos should not be using managers and adapters.
|
||||||
instantiateAdapters(adapters);
|
instantiateAdapters(adapters);
|
||||||
instantiateManagers();
|
instantiateManagers();
|
||||||
@ -1019,7 +1027,7 @@ public class ComponentLocator implements ComponentLocatorMBean {
|
|||||||
itManagers.remove();
|
itManagers.remove();
|
||||||
if (manager.singleton == true) {
|
if (manager.singleton == true) {
|
||||||
Singleton singleton = s_singletons.get(manager.clazz);
|
Singleton singleton = s_singletons.get(manager.clazz);
|
||||||
if (singleton.state == Singleton.State.Started) {
|
if (singleton != null && singleton.state == Singleton.State.Started) {
|
||||||
s_logger.info("Asking Manager " + manager.getName() + " to shutdown.");
|
s_logger.info("Asking Manager " + manager.getName() + " to shutdown.");
|
||||||
manager.instance.stop();
|
manager.instance.stop();
|
||||||
singleton.state = Singleton.State.Stopped;
|
singleton.state = Singleton.State.Stopped;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user