package TestingSystem.Common; import Common.CommonConstants; import Common.Utils.CommonUtils; import Common_old.Constants; import Common_old.Current; import _VisualDVM.Global; import Common_old.Utils.Utils; import GlobalData.Machine.Machine; import GlobalData.Machine.MachineType; import GlobalData.User.User; import Repository.EmailMessage; import Repository.Server.ServerCode; import TestingSystem.Common.TestingPackage.TestingPackage; import TestingSystem.Common.TestingPackageToKill.TestingPackageToKill; import Repository.RepositoryClient; import Common.Utils.Loggable; import javafx.util.Pair; import org.apache.commons.io.FileUtils; import java.io.File; import java.util.Date; import java.util.Vector; public abstract class TestingPlanner
extends RepositoryClient { protected P testingPackage; protected File packageLocalWorkspace = null; protected String serverName = ""; protected File supervisorHome = null; protected Machine machine = null; protected User user = null; //---- protected void UpdatePackageState(TasksPackageState state_in) throws Exception { testingPackage.state = state_in; testingPackage.ChangeDate = new Date().getTime(); ServerCommand(ServerCode.EditObject, testingPackage); switch (testingPackage.state) { case Done: case DoneWithErrors: case Aborted: case CompilationExecution: case RunningExecution: EmailPackage(); break; } } protected void UpdatePackageState() throws Exception { testingPackage.ChangeDate = new Date().getTime(); ServerCommand(ServerCode.EditObject, testingPackage); switch (testingPackage.state) { case Done: case DoneWithErrors: case Aborted: case CompilationExecution: case RunningExecution: EmailPackage(); break; } } void UpdatePackage() throws Exception { testingPackage.ChangeDate = new Date().getTime(); ServerCommand(ServerCode.EditObject, testingPackage); } public abstract String packageDescription(); void EmailPackage() throws Exception { if (testingPackage.needsEmail == 1) { EmailMessage message = new EmailMessage(); message.subject = "Состояние пакета тестирования "+packageDescription()+ " "+ CommonUtils.Brackets(testingPackage.id) + " изменилось на " + CommonUtils.Brackets(testingPackage.state.getDescription()); message.text = testingPackage.description; message.targets.add(testingPackage.sender_address); ServerCommand(ServerCode.Email, message); } } //--- protected abstract ServerCode getActivePackagesCode(); protected abstract ServerCode getCheckIfNeedsKillCode(); protected abstract TasksPackageState getStateAfterStart(); protected void InitSessionCredentials() { } protected abstract void TestsSynchronize() throws Exception; protected abstract void PackageWorkspaceCreation() throws Exception; protected void AnalyseResults() throws Exception { UpdatePackageState(TasksPackageState.Done); }; protected abstract void PackageStart() throws Exception; protected abstract boolean CheckNextState() throws Exception; protected abstract void DownloadResults() throws Exception; protected abstract void Kill() throws Exception; protected boolean Connect() { return true; } protected void Disconnect() { } protected void MachineConnectionError() { } protected void PerformPackage(TestingPackage package_in) throws Exception { testingPackage = (P) package_in; //-- Print(testingPackage.id + ":" + testingPackage.state.getDescription()); //-- if (testingPackage.connectionErrosCount >= 10) { Print(testingPackage.id + " had 10 connection errors. stop"); UpdatePackageState(TasksPackageState.ConnectionError); MachineConnectionError(); } else { //-- InitSessionCredentials(); if (testingPackage.state.equals(TasksPackageState.Analysis)) { AnalyseResults(); //todo ввести состояние DoneWithErrors } else { try { if (Connect()) { int ptk_id = (int) ServerCommand(getCheckIfNeedsKillCode(), testingPackage.id); if (ptk_id != CommonConstants.Nan) { Print("package " + testingPackage.id + " NEEDS TO KILL"); Kill(); UpdatePackageState(TasksPackageState.Aborted); ServerCommand(ServerCode.DeleteObjectByPK, new Pair(TestingPackageToKill.class, ptk_id)); } else { //-- System.out.println(testingPackage.id+":"+testingPackage.state.getDescription()); switch (testingPackage.state) { case TestsSynchronize: TestsSynchronize(); UpdatePackageState(TasksPackageState.PackageWorkspaceCreation); break; case PackageWorkspaceCreation: PackageWorkspaceCreation(); UpdatePackageState(TasksPackageState.PackageStart); break; case PackageStart: PackageStart(); testingPackage.StartDate = new Date().getTime(); UpdatePackageState(getStateAfterStart()); break; case RunningEnd: DownloadResults(); UpdatePackageState(TasksPackageState.Analysis); break; default: if (CheckNextState()) UpdatePackage(); break; } //-- } } else { testingPackage.connectionErrosCount++; UpdatePackage(); } } catch (Exception ex) { Print("Ошибка сеанса. Соединение будет разорвано."); ex.printStackTrace(); Print(ex.getMessage()); // testingPackage.connectionErrosCount++; UpdatePackage(); } finally { Disconnect(); } } } //-- testingPackage.destructor(); testingPackage = null; System.gc(); //-- } @Override public void perform() throws Exception { testingPackage = null; Vector
activePackages = (Vector
) ServerCommand(getActivePackagesCode()); for (P activePackage : activePackages) PerformPackage(activePackage); } protected void Finalize(String reason) { Print(reason); File stateFile = new File(supervisorHome, Constants.ABORTED); try { FileUtils.writeStringToFile(stateFile, reason); } catch (Exception ex) { ex.printStackTrace(); } System.exit(0); } //--------------------------------------------- public String getPlanner() { return String.join("/", user.workspace, "modules", "planner"); } //--- public TestingPlanner(){} public TestingPlanner(String... args) { CommonUtils.isWindows = System.getProperty("os.name").startsWith("Windows"); //--- String machineAddress = args[0]; int machinePort = Integer.parseInt(args[1]); String userName = args[2]; String userPassword = args[3]; String userWorkspace = args[4]; String testingSystemRoot = args[5]; serverName = args[6]; supervisorHome = new File(CommonUtils.Home); //при инициализации это текущая папка. //--- CommonUtils.MainLog = new Loggable() { @Override public String getLogHomePath() { return supervisorHome.getAbsolutePath(); } @Override public String getLogName() { return Current.mode.toString(); } }; CommonUtils.MainLog.ClearLog(); //-- CommonUtils.Home = testingSystemRoot; Global.CheckTestingSystemDirectories(); //--- machine = new Machine(machineAddress, machineAddress, machinePort, MachineType.Server); user = new User(userName, userPassword, userWorkspace); //--- Print("machineAddress=" + CommonUtils.Brackets(machineAddress)); Print("machinePort=" + CommonUtils.Brackets(String.valueOf(machinePort))); Print("userName=" + CommonUtils.Brackets(userName)); Print("userPassword=" + CommonUtils.Brackets(userPassword)); Print("userWorkspace=" + CommonUtils.Brackets(userWorkspace)); Print("root=" + CommonUtils.Brackets(CommonUtils.Home)); Print("serverName=" + serverName); Print("====="); //---- Utils.createEmptyFile(Constants.STARTED); } /* void CheckLocal() { local = false; try { InetAddress address = InetAddress.getByName(machine.address); InetAddress localAddress = InetAddress.getByName("alex-freenas.ddns.net"); Print("machine ip=" + Utils.Brackets(address.getHostAddress())); Print("server ip=" + Utils.Brackets(localAddress.getHostAddress())); local = localAddress.getHostAddress().equals(address.getHostAddress()); //todo в этом случае отдельный режим без ssh } catch (Exception ex) { Global.Log.PrintException(ex); } } */ }