/* * Created on Oct 28, 2003 by mschilli */ package alma.acs.commandcenter.engine; import java.util.Properties; import alma.acs.commandcenter.util.MiscUtils; import alma.acs.container.AcsContainer; import alma.acs.container.AcsEmbeddedContainerRunner; import alma.acs.container.corba.AcsCorba; import alma.acs.logging.AcsLogger; import alma.acs.util.AcsLocations; import alma.entity.xmlbinding.acscommandcentertools.Tool; /** * @author mschilli */ public class ExecuteContainer { protected AcsLogger log; protected AcsLogger acsCorbaLogger; /** */ public ExecuteContainer() { this.log = MiscUtils.getPackageLogger(this); } /** * @param acsCorbaLogger * @since ACS 5.0 */ public ExecuteContainer(AcsLogger acsCorbaLogger) { this.acsCorbaLogger = acsCorbaLogger; } // // ======================================================================================== // public String startLocalJavaPexpect = "components activated."; public String stopLocalJavaPexpect = "logged out."; public void startLocalJava(RunModel runModel, NativeCommand.Listener listener) { // note: this variant doesn't care for the containerType, it's always java final String contName = runModel.getContainerName(); final String managerHost = runModel.getContainerAgainstManagerHost(); final String managerPort = runModel.getContainerAgainstManagerPort(); final Integer orbport = Integer.valueOf(runModel.getContainerLocalJavaPort()); final String mgrLoc = AcsLocations.convertToManagerLocation(managerHost, managerPort); // set system properties Properties props = new DefaultProperties(); props.setProperty("ACS.manager", mgrLoc); // run in same vm Executor.localInProc(props, startLocalJavaPexpect, listener, new Executor.RunMain() { public void runMain() throws Throwable { if (acsCorba == null) { // determine acscorba logger if (acsCorbaLogger == null) { acsCorbaLogger = log; } // create acscorba acsCorba = new AcsCorba(acsCorbaLogger); acsCorba.initCorba(new String[]{}, orbport.intValue()); acsCorba.runCorba(); } // run container customAcsEmbeddedContainerRunner = new CustomAcsEmbeddedContainerRunner(); customAcsEmbeddedContainerRunner.run(acsCorba, contName, mgrLoc); } }); } private AcsCorba acsCorba; private CustomAcsEmbeddedContainerRunner customAcsEmbeddedContainerRunner; /** * Needed to gain access to the container instance held by the embedded container * runner. By this, we can invoke shutdown() on the container instance without * the need to go through ACS. */ private class CustomAcsEmbeddedContainerRunner extends AcsEmbeddedContainerRunner { AcsContainer theContainer() { return m_container; } } public void stopLocalJava(RunModel runModel) { NativeCommand.Listener listener = null; Properties props = new Properties(); Executor.localInProc(props, stopLocalJavaPexpect, listener, new Executor.RunMain() { public void runMain() { if (customAcsEmbeddedContainerRunner != null) { AcsContainer cont = customAcsEmbeddedContainerRunner.theContainer(); if (cont != null) { int action = 2 * 256 + 0; // hibyte: 2 (= EXIT), lobyte: 0 (exitcode towards the OS) cont.shutdown(action); } } /* msc(2005-07): no longer sure this is really needed if (localInProcThread != null) { localInProcThread.stop(); } */ } }); } // // ======================================================================================== // public void startLocalScript(RunModel runModel, NativeCommand.Listener listener) throws Throwable { Tool t = ToolManager.getBuiltinTool("Container_startLocalScript_" + runModel.getContainerType()); String command = ToolManager.generateCommand(t, runModel); Executor.localOutProc(command, true, t.getMaxStartupSeconds() * 1000, t.getExpectedOutput(), listener); } public void stopLocalScript(RunModel runModel, NativeCommand.Listener listener) throws Throwable { Tool t = ToolManager.getBuiltinTool("Container_stopLocalScript_" + runModel.getContainerType()); String command = ToolManager.generateCommand(t, runModel); Executor.localOutProc(command, true, t.getMaxStartupSeconds() * 1000, t.getExpectedOutput(), listener); } // // ======================================================================================== // public void startRemote(RunModel runModel, boolean nativeSSH, NativeCommand.Listener listener) throws Throwable { String host = runModel.getContainerRemoteHost(); String username = runModel.getContainerRemoteAccount(); String password = runModel.getContainerRemotePassword(); String toolname = "Container_startRemote_" + runModel.getContainerType(); // c++ container: special case if (runModel.getContainerType().equals("cpp") && !runModel.getContainerAgainstInterfaceRepository() .equals("")) { toolname = "Container_startRemote_cpp_intrep"; } Tool t = ToolManager.getBuiltinTool(toolname); String command = ToolManager.generateCommand(t, runModel); log.finer("generated remote command: " + command); Executor.remote(nativeSSH, username, password, command, t.getExpectedOutput(), listener, host); } public void stopRemote(RunModel runModel, boolean nativeSSH, NativeCommand.Listener listener) throws Throwable { String host = runModel.getContainerRemoteHost(); String username = runModel.getContainerRemoteAccount(); String password = runModel.getContainerRemotePassword(); Tool t = ToolManager.getBuiltinTool("Container_stopRemote_" + runModel.getContainerType()); String command = ToolManager.generateCommand(t, runModel); Executor.remote(nativeSSH, username, password, command, t.getExpectedOutput(), listener, host); } // // ======================================================================================== // /** * @return any exception while starting the Container, or {@code null} if all went well. */ public Exception startRemoteDemonic (RunModel runModel, NativeCommand.Listener listener) { String contHost = runModel.getContainerRemoteHost(); String contName = runModel.getContainerName(); String contType = runModel.getContainerType(); String[] contMods = runModel.getContainerTypeModifiers(); int instance = MiscUtils.parseInt(runModel.getContainerScriptBase()); String mgrHost = runModel.getContainerAgainstManagerHost(); String mgrPort = runModel.getContainerAgainstManagerPort(); String mgrLoc = AcsLocations.convertToManagerLocation(mgrHost, mgrPort); String cmdFlags = "-m "+mgrLoc; String contHeap = runModel.getContainerHeapSize(); if (contHeap != null) cmdFlags += " --passthroughProcessStart=\"-maxHeapSize="+contHeap+"m\""; boolean startStop = true; // (2008-08-05): we keep this for backward-compatibility (see COMP-1316 and COMP-1996) if ("archive".equals(contType)) { contType = "java"; contMods = new String[]{"archiveContainer"}; } return Executor.remoteDaemonForContainers(contHost, instance, startStop, contName, contType, contMods, cmdFlags, listener); } public void stopRemoteDemonic (RunModel runModel, NativeCommand.Listener listener) { String contHost = runModel.getContainerRemoteHost(); String contName = runModel.getContainerName(); String contType = runModel.getContainerType(); String[] contMods = runModel.getContainerTypeModifiers(); int instance = MiscUtils.parseInt(runModel.getContainerScriptBase()); String mgrHost = runModel.getContainerAgainstManagerHost(); String mgrPort = runModel.getContainerAgainstManagerPort(); String mgrLoc = AcsLocations.convertToManagerLocation(mgrHost, mgrPort); String cmdFlags = "-m "+mgrLoc; boolean startStop = false; Executor.remoteDaemonForContainers(contHost, instance, startStop, contName, contType, contMods, cmdFlags, listener); } }