package TestingSystem.DVM; import Common.Global; import Common.Utils.Utils; import GlobalData.Machine.Machine; import GlobalData.Machine.MachineType; import GlobalData.User.User; import Repository.EmailMessage; import Repository.Server.ServerCode; import Repository.Server.ServerExchangeUnit_2021; import TestingSystem.Common.TestingPackage.TestingPackage; import TestingSystem.DVM.DVMPackage.DVMPackage; import TestingSystem.DVM.TasksPackage.TasksPackageState; import TestingSystem.DVM.UserConnection; import Visual_DVM_2021.Passes.PassException; import Visual_DVM_2021.Passes.Server.TestingSystemPass; import java.io.FileWriter; import java.io.Serializable; import java.util.Date; import java.util.LinkedHashMap; public class DVMTestingPlanner { //---- LinkedHashMap machines = new LinkedHashMap<>(); //todo приделать к ним очередь? или сделать в бд тестирования список машин. LinkedHashMap users = new LinkedHashMap<>(); //-- текущие машина и пользователь. Machine machine = null; User user = null; //---- DVMPackage dvmPackage; // текущий активный пакет тестирования DVM int getSleepMillis() { return 2000; } //--- Object ServerCommand(ServerCode code_in, String arg, Serializable object_in) throws Exception { TestingSystemPass pass = new TestingSystemPass() { @Override public String getDescription() { return ""; } @Override protected void ServerAction() throws Exception { Command(new ServerExchangeUnit_2021(code_in, arg, object_in)); target = response.object; } }; if (!pass.Do()) throw new PassException("Ошибка взаимодействия с сервером " + code_in); return pass.target; } Object ServerCommand(ServerCode code_in, Serializable object_in) throws Exception { return ServerCommand(code_in, "", object_in); } Object ServerCommand(ServerCode code_in) throws Exception { return ServerCommand(code_in, "", null); } //--- boolean isPrintOn() { return true; } public void Print(String message) { try { if (isPrintOn()) { FileWriter testLog = new FileWriter(getClass().getSimpleName() + "_Log.txt", true); String dmessage = Utils.Brackets(new Date()) + " " + message; System.out.println(dmessage); testLog.write(dmessage + "\n"); testLog.close(); } } catch (Exception ex) { ex.printStackTrace(); } } //--- void CheckMachineAndUser() { String machine_url = dvmPackage.machine_address + ":" + dvmPackage.machine_port; if (!machines.containsKey(machine_url)) machines.put(machine_url, new Machine( dvmPackage.machine_name, dvmPackage.machine_address, dvmPackage.machine_port, MachineType.Server)); if (!users.containsKey(dvmPackage.user_name)) users.put(dvmPackage.user_name, new User(dvmPackage.user_name, dvmPackage.user_password, dvmPackage.user_workspace)); //-->> machine = machines.get(machine_url); user = users.get(dvmPackage.user_name); //-- } boolean CheckConnection(Machine machine, User user) { //каждый раз соединяемся по новой. из за проблем с Exists. // к тому же, теперь задачи гоняет модуль, тут только проверка //так что время на разрыв уже не критично. //todo попробовать все же вариант с постоянным соединением. try { user.connection = null; user.connection = new UserConnection(machine, user); Print("Соединение c " + machine.getURL() + " " + user.login + " успешно установлено."); user.connection.ShellCommand("ulimit -s unlimited"); // нужно, для запуска сишной части. } catch (Exception ex) { Global.Log.PrintException(ex); user.connection = null; Print("Не удалось установить соединение."); } return user.connection != null; } //-- void EmailPackage(TestingPackage package_in) throws Exception{ EmailMessage message = new EmailMessage(); message.subject = "Состояние пакета задач " + Utils.Brackets(package_in) + " изменилось на " + Utils.Brackets(package_in.state.getDescription()); message.text = package_in.description; message.targets.add(package_in.sender_address); ServerCommand(ServerCode.Email, message); } void UpdatePackage(TestingPackage package_in){ } // состояния пакета. void AnalyseResults() { } //--- public void Perform() { /* while (true) { try { dvmPackage = (DVMPackage) ServerCommand(ServerCode.GetFirstActiveDVMPackage); if (dvmPackage != null) { System.out.println(dvmPackage.id + " " + dvmPackage.state.getDescription()); //-- CheckMachineAndUser(); if (dvmPackage.state.equals(TasksPackageState.Analysis)) { AnalyseResults(); //на анализ уже не нужно соединение. dvmPackage.state = TasksPackageState.Done; UpdateDVMPackage(); } else { if (CheckConnection(machine, user)) { try { switch (dvmPackage.state){ case TestsSynchronize: TestsSynchronize(); dvmPackage.state = TasksPackageState.PackageWorkspaceCreation; UpdateDVMPackage(); break; case PackageWorkspaceCreation: PackageWorkspaceCreation(); tasksPackage.state = TasksPackageState.PackageStart; UpdateDVMPackage(); break; case PackageStart: PackageStart(); tasksPackage.state = TasksPackageState.CompilationWorkspacesCreation; UpdateDVMPackage(); break; case CompilationWorkspacesCreation: case CompilationPreparation: case CompilationExecution: case RunningWorkspacesCreation: case RunningPreparation: case RunningExecution: checkNextState(); break; case RunningEnd: DownloadResults(); dvmPackage.state = TasksPackageState.Analysis; planner.UpdatePackage(); break; } } catch (Exception ex) { Print("Ошибка сеанса."); Print(ex.getMessage()); } finally { if (user.connection != null) { user.connection.Disconnect(); user.connection = null; } } } } } } catch (Exception ex) { ex.printStackTrace(); } finally { Utils.sleep(getSleepMillis()); } } */ } }