промежуточный. прописал для планировщиков общий класс-предок
This commit is contained in:
16
.idea/workspace.xml
generated
16
.idea/workspace.xml
generated
@@ -7,17 +7,23 @@
|
|||||||
</component>
|
</component>
|
||||||
<component name="ChangeListManager">
|
<component name="ChangeListManager">
|
||||||
<list default="true" id="e42177c3-2328-4b27-8a01-35779b2beb99" name="Default Changelist" comment="">
|
<list default="true" id="e42177c3-2328-4b27-8a01-35779b2beb99" name="Default Changelist" comment="">
|
||||||
<change afterPath="$PROJECT_DIR$/src/Visual_DVM_2021/Passes/All/StartDVMPackage.java" afterDir="false" />
|
<change afterPath="$PROJECT_DIR$/src/TestingSystem/Common/TestingPlanner_OLD.java" afterDir="false" />
|
||||||
|
<change afterPath="$PROJECT_DIR$/src/TestingSystem/DVM/DVMTestingPlanner.java" afterDir="false" />
|
||||||
|
<change afterPath="$PROJECT_DIR$/src/Visual_DVM_2021/Passes/All/DeleteDVMPackage.java" afterDir="false" />
|
||||||
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
|
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
|
||||||
<change beforePath="$PROJECT_DIR$/Packages/dvmpackage_1702385390/package_json" beforeDir="false" />
|
<change beforePath="$PROJECT_DIR$/Packages/dvmpackage_1702386255/package_json" beforeDir="false" />
|
||||||
<change beforePath="$PROJECT_DIR$/Packages/dvmpackage_1702385477/package_json" beforeDir="false" />
|
|
||||||
<change beforePath="$PROJECT_DIR$/src/Common/UI/Menus_2023/DVMPackagesBar/DVMPackagesBar.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/Common/UI/Menus_2023/DVMPackagesBar/DVMPackagesBar.java" afterDir="false" />
|
<change beforePath="$PROJECT_DIR$/src/Common/UI/Menus_2023/DVMPackagesBar/DVMPackagesBar.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/Common/UI/Menus_2023/DVMPackagesBar/DVMPackagesBar.java" afterDir="false" />
|
||||||
<change beforePath="$PROJECT_DIR$/src/Repository/Server/ServerCode.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/Repository/Server/ServerCode.java" afterDir="false" />
|
<change beforePath="$PROJECT_DIR$/src/Repository/Server/ServerCode.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/Repository/Server/ServerCode.java" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/src/TestingSystem/Common/TestingPackage/TestingPackage.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/TestingSystem/Common/TestingPackage/TestingPackage.java" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/src/TestingSystem/Common/TestingPlanner.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/TestingSystem/Common/TestingPlanner.java" afterDir="false" />
|
||||||
<change beforePath="$PROJECT_DIR$/src/TestingSystem/Common/TestingServer.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/TestingSystem/Common/TestingServer.java" afterDir="false" />
|
<change beforePath="$PROJECT_DIR$/src/TestingSystem/Common/TestingServer.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/TestingSystem/Common/TestingServer.java" afterDir="false" />
|
||||||
<change beforePath="$PROJECT_DIR$/src/TestingSystem/DVM/DVMPackage/DVMPackage_json.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/TestingSystem/DVM/DVMPackage/DVMPackage_json.java" afterDir="false" />
|
<change beforePath="$PROJECT_DIR$/src/TestingSystem/Common/TestsDatabase.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/TestingSystem/Common/TestsDatabase.java" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/src/TestingSystem/DVM/DVMPackage/DVMPackage.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/TestingSystem/DVM/DVMPackage/DVMPackage.java" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/src/TestingSystem/DVM/DVMPackage/DVMPackageDBTable.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/TestingSystem/DVM/DVMPackage/DVMPackageDBTable.java" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/src/TestingSystem/DVM/TestsSupervisor_2022.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/TestingSystem/DVM/TestsSupervisor_2022.java" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/src/TestingSystem/SAPFOR/SapforTasksPackageSupervisor/SapforTasksPackageSupervisor.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/TestingSystem/SAPFOR/SapforTasksPackageSupervisor/SapforTasksPackageSupervisor.java" afterDir="false" />
|
||||||
<change beforePath="$PROJECT_DIR$/src/Visual_DVM_2021/Passes/All/AddDVMPackage.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/Visual_DVM_2021/Passes/All/AddDVMPackage.java" afterDir="false" />
|
<change beforePath="$PROJECT_DIR$/src/Visual_DVM_2021/Passes/All/AddDVMPackage.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/Visual_DVM_2021/Passes/All/AddDVMPackage.java" afterDir="false" />
|
||||||
<change beforePath="$PROJECT_DIR$/src/Visual_DVM_2021/Passes/All/AddTasksToDVMPackage.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/Visual_DVM_2021/Passes/All/AddTasksToDVMPackage.java" afterDir="false" />
|
<change beforePath="$PROJECT_DIR$/src/Visual_DVM_2021/Passes/All/AddTasksToDVMPackage.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/Visual_DVM_2021/Passes/All/AddTasksToDVMPackage.java" afterDir="false" />
|
||||||
<change beforePath="$PROJECT_DIR$/src/Visual_DVM_2021/Passes/All/SynchronizeTests.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/Visual_DVM_2021/Passes/All/SynchronizeTests.java" afterDir="false" />
|
|
||||||
<change beforePath="$PROJECT_DIR$/src/Visual_DVM_2021/Passes/PassCode_2021.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/Visual_DVM_2021/Passes/PassCode_2021.java" afterDir="false" />
|
<change beforePath="$PROJECT_DIR$/src/Visual_DVM_2021/Passes/PassCode_2021.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/Visual_DVM_2021/Passes/PassCode_2021.java" afterDir="false" />
|
||||||
</list>
|
</list>
|
||||||
<option name="SHOW_DIALOG" value="false" />
|
<option name="SHOW_DIALOG" value="false" />
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -5,7 +5,8 @@ public class DVMPackagesBar extends DataMenuBar {
|
|||||||
public DVMPackagesBar() {
|
public DVMPackagesBar() {
|
||||||
super("пакеты задач DVM", PassCode_2021.AddDVMPackage,
|
super("пакеты задач DVM", PassCode_2021.AddDVMPackage,
|
||||||
PassCode_2021.AddTasksToDVMPackage,
|
PassCode_2021.AddTasksToDVMPackage,
|
||||||
PassCode_2021.StartDVMPackage
|
PassCode_2021.StartDVMPackage,
|
||||||
|
PassCode_2021.DeleteDVMPackage
|
||||||
// PassCode_2021.ExportTasksPackageToExcel,PassCode_2021.AbortTaskPackage, PassCode_2021.DeleteTasksPackage
|
// PassCode_2021.ExportTasksPackageToExcel,PassCode_2021.AbortTaskPackage, PassCode_2021.DeleteTasksPackage
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -84,6 +84,7 @@ public enum ServerCode {
|
|||||||
PublishObjects,
|
PublishObjects,
|
||||||
UpdateTestTasks,
|
UpdateTestTasks,
|
||||||
ActualizeSAPFORPackages,
|
ActualizeSAPFORPackages,
|
||||||
ActualizeDVMPackages
|
ActualizeDVMPackages,
|
||||||
// PublishTestProject
|
// PublishTestProject
|
||||||
|
GetFirstActiveDVMPackage;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,10 +1,8 @@
|
|||||||
package TestingSystem.Common.TestingPackage;
|
package TestingSystem.Common.TestingPackage;
|
||||||
import Common.Constants;
|
|
||||||
import Common.Database.DBObject;
|
import Common.Database.DBObject;
|
||||||
import Common.Database.rDBObject;
|
import Common.Database.riDBObject;
|
||||||
import TestingSystem.DVM.TasksPackage.TasksPackageState;
|
import TestingSystem.DVM.TasksPackage.TasksPackageState;
|
||||||
import com.sun.org.glassfish.gmbal.Description;
|
public class TestingPackage extends riDBObject {
|
||||||
public class TestingPackage extends rDBObject {
|
|
||||||
public int tasksCount = 0; //Общее число задач
|
public int tasksCount = 0; //Общее число задач
|
||||||
//--
|
//--
|
||||||
public int kernels = 1;
|
public int kernels = 1;
|
||||||
@@ -14,6 +12,8 @@ public class TestingPackage extends rDBObject {
|
|||||||
public String drv = ""; //пусть к исполняемому файлы тестируемого объекта
|
public String drv = ""; //пусть к исполняемому файлы тестируемого объекта
|
||||||
//--
|
//--
|
||||||
public int progress = 0; //прогресс выполнения
|
public int progress = 0; //прогресс выполнения
|
||||||
|
public long StartDate= 0;
|
||||||
|
public long ChangeDate =0;
|
||||||
public TasksPackageState state = TasksPackageState.Draft;
|
public TasksPackageState state = TasksPackageState.Draft;
|
||||||
//--
|
//--
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -1,61 +1,23 @@
|
|||||||
package TestingSystem.Common;
|
package TestingSystem.Common;
|
||||||
import Common.Global;
|
|
||||||
import Common.Utils.Utils;
|
import Common.Utils.Utils;
|
||||||
import GlobalData.Machine.Machine;
|
|
||||||
import GlobalData.User.User;
|
|
||||||
import Repository.EmailMessage;
|
import Repository.EmailMessage;
|
||||||
import Repository.Server.ServerCode;
|
import Repository.Server.ServerCode;
|
||||||
import Repository.Server.ServerExchangeUnit_2021;
|
import Repository.Server.ServerExchangeUnit_2021;
|
||||||
import TestingSystem.DVM.Tasks.TestCompilationTask;
|
import TestingSystem.Common.TestingPackage.TestingPackage;
|
||||||
import TestingSystem.DVM.TasksPackage.TasksPackage;
|
|
||||||
import TestingSystem.DVM.TasksPackage.TasksPackageState;
|
import TestingSystem.DVM.TasksPackage.TasksPackageState;
|
||||||
import TestingSystem.DVM.TestsSupervisor_2022;
|
|
||||||
import TestingSystem.DVM.UserConnection;
|
|
||||||
import TestingSystem.SAPFOR.SapforTasksPackage.SapforTasksPackage;
|
|
||||||
import TestingSystem.SAPFOR.SapforTasksPackageSupervisor.SapforTasksPackageSupervisor;
|
|
||||||
import Visual_DVM_2021.Passes.PassException;
|
import Visual_DVM_2021.Passes.PassException;
|
||||||
import Visual_DVM_2021.Passes.SSH.ConnectionPass;
|
|
||||||
import Visual_DVM_2021.Passes.Server.TestingSystemPass;
|
import Visual_DVM_2021.Passes.Server.TestingSystemPass;
|
||||||
import javafx.util.Pair;
|
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
import java.io.FileWriter;
|
import java.io.FileWriter;
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.LinkedHashMap;
|
public abstract class TestingPlanner<P extends TestingPackage> {
|
||||||
import java.util.Vector;
|
protected P testingPackage;
|
||||||
|
protected int getSleepMillis() {
|
||||||
import static Common.Constants.tests_db_name;
|
return 2000;
|
||||||
public class TestingPlanner {
|
|
||||||
public String email;
|
|
||||||
TasksPackage tasksPackage;
|
|
||||||
TestsSupervisor_2022 supervisor;
|
|
||||||
LinkedHashMap<String, Machine> machines = new LinkedHashMap<>();
|
|
||||||
LinkedHashMap<String, User> users = new LinkedHashMap<>();
|
|
||||||
protected Machine machine = null;
|
|
||||||
protected User user = null;
|
|
||||||
public LinkedHashMap<Long, TestCompilationTask> packageTasks = new LinkedHashMap<>();
|
|
||||||
//----------
|
|
||||||
SapforTasksPackage sapforTasksPackage = null;
|
|
||||||
//----------
|
|
||||||
public void UpdatePackage() throws Exception {
|
|
||||||
tasksPackage.ChangeDate = new Date().getTime();
|
|
||||||
ServerCommand(ServerCode.EditAccountObject, tasksPackage);
|
|
||||||
//---------------
|
|
||||||
if ((tasksPackage.needsEmail == 1) &&
|
|
||||||
(tasksPackage.state.equals(TasksPackageState.PackageStart) ||
|
|
||||||
(tasksPackage.state.equals(TasksPackageState.Done)) ||
|
|
||||||
(tasksPackage.state.equals(TasksPackageState.Aborted))
|
|
||||||
)) {
|
|
||||||
EmailMessage message = new EmailMessage();
|
|
||||||
message.subject = "Состояние пакета задач " + Utils.Brackets(tasksPackage.id) + " изменилось на " + Utils.Brackets(tasksPackage.state.getDescription());
|
|
||||||
message.text = tasksPackage.summary;
|
|
||||||
message.targets.add(email);
|
|
||||||
ServerCommand(ServerCode.Email, message);
|
|
||||||
}
|
}
|
||||||
}
|
//---
|
||||||
//-
|
protected Object ServerCommand(ServerCode code_in, String arg, Serializable object_in) throws Exception {
|
||||||
public Object ServerCommand(ServerCode code_in, String arg, Serializable object_in) throws Exception {
|
|
||||||
TestingSystemPass<Object> pass = new TestingSystemPass<Object>() {
|
TestingSystemPass<Object> pass = new TestingSystemPass<Object>() {
|
||||||
@Override
|
@Override
|
||||||
public String getDescription() {
|
public String getDescription() {
|
||||||
@@ -70,163 +32,132 @@ public class TestingPlanner {
|
|||||||
if (!pass.Do()) throw new PassException("Ошибка взаимодействия с сервером " + code_in);
|
if (!pass.Do()) throw new PassException("Ошибка взаимодействия с сервером " + code_in);
|
||||||
return pass.target;
|
return pass.target;
|
||||||
}
|
}
|
||||||
public Object ServerCommand(ServerCode code_in, Serializable object_in) throws Exception {
|
protected Object ServerCommand(ServerCode code_in, Serializable object_in) throws Exception {
|
||||||
return ServerCommand(code_in, email, object_in);
|
return ServerCommand(code_in, "", object_in);
|
||||||
}
|
}
|
||||||
Object ServerCommand(ServerCode code_in) throws Exception {
|
protected Object ServerCommand(ServerCode code_in) throws Exception {
|
||||||
return ServerCommand(code_in, email, null);
|
return ServerCommand(code_in, "", null);
|
||||||
}
|
}
|
||||||
//-
|
//---
|
||||||
boolean isPrintOn() {
|
protected boolean isPrintOn() {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
public void Print(String message) {
|
protected void Print(String message) {
|
||||||
try {
|
try {
|
||||||
|
if (isPrintOn()) {
|
||||||
FileWriter testLog = new FileWriter(getClass().getSimpleName() + "_Log.txt", true);
|
FileWriter testLog = new FileWriter(getClass().getSimpleName() + "_Log.txt", true);
|
||||||
String dmessage = Utils.Brackets(new Date()) + " " + message;
|
String dmessage = Utils.Brackets(new Date()) + " " + message;
|
||||||
if (isPrintOn())
|
|
||||||
System.out.println(dmessage);
|
System.out.println(dmessage);
|
||||||
testLog.write(dmessage + "\n");
|
testLog.write(dmessage + "\n");
|
||||||
testLog.close();
|
testLog.close();
|
||||||
|
}
|
||||||
} catch (Exception ex) {
|
} catch (Exception ex) {
|
||||||
ex.printStackTrace();
|
ex.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
boolean CheckConnection(Machine machine, User user) {
|
//---
|
||||||
//каждый раз соединяемся по новой. из за проблем с Exists.
|
void UpdatePackageState(TasksPackageState state_in) throws Exception {
|
||||||
// к тому же, теперь задачи гоняет модуль, тут только проверка
|
testingPackage.state = state_in;
|
||||||
//так что время на разрыв уже не критично.
|
testingPackage.ChangeDate = new Date().getTime();
|
||||||
try {
|
ServerCommand(ServerCode.EditObject, testingPackage);
|
||||||
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 UpdatePackage() throws Exception {
|
||||||
|
testingPackage.ChangeDate = new Date().getTime();
|
||||||
|
ServerCommand(ServerCode.EditObject, testingPackage);
|
||||||
}
|
}
|
||||||
//-
|
void EmailPackage() throws Exception {
|
||||||
|
EmailMessage message = new EmailMessage();
|
||||||
|
message.subject = "Состояние пакета задач " + Utils.Brackets(testingPackage) + " изменилось на " + Utils.Brackets(testingPackage.state.getDescription());
|
||||||
|
message.text = testingPackage.description;
|
||||||
|
message.targets.add(testingPackage.sender_address);
|
||||||
|
ServerCommand(ServerCode.Email, message);
|
||||||
|
}
|
||||||
|
//---
|
||||||
|
protected abstract ServerCode getActivePackageCode();
|
||||||
|
protected abstract ServerCode getCheckIfNeedsKillCode();
|
||||||
|
protected abstract TasksPackageState getStateAfterStart();
|
||||||
|
protected void InitSessionCredentials() {
|
||||||
|
}
|
||||||
|
protected abstract void TestsSynchronize();
|
||||||
|
protected abstract void PackageWorkspaceCreation();
|
||||||
|
protected abstract void AnalyseResults();
|
||||||
|
protected abstract void PackageStart();
|
||||||
|
protected abstract boolean CheckNextState();
|
||||||
|
protected abstract void DownloadResults();
|
||||||
|
protected abstract void Kill();
|
||||||
|
protected boolean Connect() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
protected void Disconnect() {
|
||||||
|
}
|
||||||
|
//---
|
||||||
|
//жизненный цикл планировщика
|
||||||
|
protected void Session() throws Exception {
|
||||||
|
switch (testingPackage.state) {
|
||||||
|
case TestsSynchronize:
|
||||||
|
TestsSynchronize();
|
||||||
|
UpdatePackageState(TasksPackageState.PackageWorkspaceCreation);
|
||||||
|
break;
|
||||||
|
case PackageWorkspaceCreation:
|
||||||
|
PackageWorkspaceCreation();
|
||||||
|
UpdatePackageState(TasksPackageState.PackageStart);
|
||||||
|
break;
|
||||||
|
case PackageStart:
|
||||||
|
PackageStart();
|
||||||
|
UpdatePackageState(getStateAfterStart());
|
||||||
|
EmailPackage();
|
||||||
|
break;
|
||||||
|
case CompilationWorkspacesCreation:
|
||||||
|
case CompilationPreparation:
|
||||||
|
case CompilationExecution:
|
||||||
|
case RunningWorkspacesCreation:
|
||||||
|
case RunningPreparation:
|
||||||
|
case RunningExecution:
|
||||||
|
if (CheckNextState()) UpdatePackage();
|
||||||
|
break;
|
||||||
|
case RunningEnd:
|
||||||
|
DownloadResults();
|
||||||
|
UpdatePackageState(TasksPackageState.Analysis);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// ---
|
||||||
public void Perform() {
|
public void Perform() {
|
||||||
Vector<String> emails = new Vector<>();
|
|
||||||
while (true) {
|
while (true) {
|
||||||
emails.clear();
|
|
||||||
try {
|
try {
|
||||||
File[] accountsBases_ = Global.DataDirectory.listFiles(pathname ->
|
testingPackage = (P) ServerCommand(getActivePackageCode());
|
||||||
pathname.isFile() &&
|
if (testingPackage != null) {
|
||||||
Utils.getExtension(pathname).equals("sqlite") &&
|
Print(testingPackage.id + ":" + testingPackage.state.getDescription());
|
||||||
!Utils.getNameWithoutExtension(pathname.getName()).isEmpty() &&
|
//--
|
||||||
!pathname.getName().equals(tests_db_name + ".sqlite")
|
InitSessionCredentials();
|
||||||
);
|
if (testingPackage.state.equals(TasksPackageState.Analysis)) {
|
||||||
if (accountsBases_ != null) {
|
AnalyseResults();
|
||||||
for (File accountBase : accountsBases_) {
|
UpdatePackageState(TasksPackageState.Done);
|
||||||
String fileName = accountBase.getName();
|
EmailPackage();
|
||||||
String account_email = accountBase.getName().substring(0, fileName.lastIndexOf('_'));
|
} else {
|
||||||
emails.add(account_email);
|
try {
|
||||||
|
if (Connect()) {
|
||||||
|
if ((boolean) ServerCommand(getCheckIfNeedsKillCode(), testingPackage.id)) {
|
||||||
|
Print("package " + testingPackage.id + " NEEDS TO KILL");
|
||||||
|
Kill();
|
||||||
|
UpdatePackageState(TasksPackageState.Aborted);
|
||||||
|
EmailPackage();
|
||||||
|
} else
|
||||||
|
Session();
|
||||||
|
}
|
||||||
|
} catch (Exception ex) {
|
||||||
|
Print("Ошибка сеанса.");
|
||||||
|
Print(ex.getMessage());
|
||||||
|
} finally {
|
||||||
|
Disconnect();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
for (String current_email : emails)
|
|
||||||
emailPass(current_email);
|
|
||||||
}
|
}
|
||||||
} catch (Exception ex) {
|
} catch (Exception ex) {
|
||||||
ex.printStackTrace();
|
ex.printStackTrace();
|
||||||
} finally {
|
} finally {
|
||||||
try {
|
|
||||||
Utils.sleep(getSleepMillis());
|
Utils.sleep(getSleepMillis());
|
||||||
} catch (Exception ignored) {
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
protected int getSleepMillis() {
|
|
||||||
return 2000;
|
|
||||||
}
|
|
||||||
void emailPass(String email_in) {
|
|
||||||
email = email_in;
|
|
||||||
try {
|
|
||||||
// System.out.println(email+" testing planner starts...");
|
|
||||||
Pair<TasksPackage, LinkedHashMap<Long, TestCompilationTask>> p = (Pair<TasksPackage, LinkedHashMap<Long, TestCompilationTask>>) ServerCommand(ServerCode.GetFirstActiveAccountPackage);
|
|
||||||
sapforTasksPackage = (SapforTasksPackage) ServerCommand(ServerCode.GetFirstActiveSapforTasksPackage);
|
|
||||||
tasksPackage = null;
|
|
||||||
packageTasks = null;
|
|
||||||
tasksPackage = p.getKey();
|
|
||||||
packageTasks = p.getValue();
|
|
||||||
if (tasksPackage != null) {
|
|
||||||
// System.out.println("found dvm package: "+sapforTasksPackage.id);
|
|
||||||
String machine_url = tasksPackage.machine_address + ":" + tasksPackage.machine_port;
|
|
||||||
if (!machines.containsKey(machine_url))
|
|
||||||
machines.put(machine_url, new Machine(
|
|
||||||
tasksPackage.machine_name,
|
|
||||||
tasksPackage.machine_address,
|
|
||||||
tasksPackage.machine_port,
|
|
||||||
tasksPackage.machine_type));
|
|
||||||
if (!users.containsKey(tasksPackage.user_name))
|
|
||||||
users.put(tasksPackage.user_name,
|
|
||||||
new User(tasksPackage.user_name, tasksPackage.user_password, tasksPackage.user_workspace));
|
|
||||||
machine = machines.get(machine_url);
|
|
||||||
//-->>
|
|
||||||
user = users.get(tasksPackage.user_name);
|
|
||||||
if (CheckConnection(machine, user)) {
|
|
||||||
try {
|
|
||||||
supervisor = new TestsSupervisor_2022(this, user.connection, tasksPackage, new Vector<>(packageTasks.values()));
|
|
||||||
supervisor.Perform();
|
|
||||||
} catch (Exception ex) {
|
|
||||||
Print("Ошибка сеанса.");
|
|
||||||
Print(ex.getMessage());
|
|
||||||
}
|
|
||||||
finally {
|
|
||||||
if (user.connection != null) {
|
|
||||||
user.connection.Disconnect();
|
|
||||||
user.connection = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (sapforTasksPackage != null) {
|
|
||||||
System.out.println("found sapfor package: " + sapforTasksPackage.id + " state = " + sapforTasksPackage.state);
|
|
||||||
try {
|
|
||||||
(new SapforTasksPackageSupervisor(this, sapforTasksPackage)).Perform();
|
|
||||||
} catch (Exception ex) {
|
|
||||||
Print("Исключение при тестировании SAPROR");
|
|
||||||
Print(ex.getMessage());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (Exception ex) {
|
|
||||||
Global.Log.PrintException(ex);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
public String getStarter() {
|
|
||||||
return String.join("/", user.workspace, ConnectionPass.modules, ConnectionPass.starter);
|
|
||||||
}
|
|
||||||
public String getLauncher() {
|
|
||||||
return String.join("/", user.workspace, ConnectionPass.modules, ConnectionPass.launcher);
|
|
||||||
}
|
|
||||||
public String getPlanner() {
|
|
||||||
return String.join("/", user.workspace, ConnectionPass.modules, ConnectionPass.planner);
|
|
||||||
}
|
|
||||||
//--
|
|
||||||
public void UpdateSapforPackage() throws Exception {
|
|
||||||
sapforTasksPackage.ChangeDate = new Date().getTime();
|
|
||||||
EmailMessage message = null;
|
|
||||||
ServerCommand(ServerCode.EditAccountObject, sapforTasksPackage);
|
|
||||||
if (sapforTasksPackage.needsEmail == 1) {
|
|
||||||
switch (sapforTasksPackage.state) {
|
|
||||||
case RunningExecution:
|
|
||||||
case Aborted:
|
|
||||||
case Done:
|
|
||||||
//результаты.
|
|
||||||
message = new EmailMessage();
|
|
||||||
message.subject = "Состояние пакета задач SAPFOR" + Utils.Brackets(sapforTasksPackage.id) + " изменилось на " + Utils.Brackets(sapforTasksPackage.state.getDescription());
|
|
||||||
message.text = sapforTasksPackage.summary;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (message != null) {
|
|
||||||
message.targets.add(email);
|
|
||||||
ServerCommand(ServerCode.Email, message);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
232
src/TestingSystem/Common/TestingPlanner_OLD.java
Normal file
232
src/TestingSystem/Common/TestingPlanner_OLD.java
Normal file
@@ -0,0 +1,232 @@
|
|||||||
|
package TestingSystem.Common;
|
||||||
|
import Common.Global;
|
||||||
|
import Common.Utils.Utils;
|
||||||
|
import GlobalData.Machine.Machine;
|
||||||
|
import GlobalData.User.User;
|
||||||
|
import Repository.EmailMessage;
|
||||||
|
import Repository.Server.ServerCode;
|
||||||
|
import Repository.Server.ServerExchangeUnit_2021;
|
||||||
|
import TestingSystem.DVM.Tasks.TestCompilationTask;
|
||||||
|
import TestingSystem.DVM.TasksPackage.TasksPackage;
|
||||||
|
import TestingSystem.DVM.TasksPackage.TasksPackageState;
|
||||||
|
import TestingSystem.DVM.TestsSupervisor_2022;
|
||||||
|
import TestingSystem.DVM.UserConnection;
|
||||||
|
import TestingSystem.SAPFOR.SapforTasksPackage.SapforTasksPackage;
|
||||||
|
import TestingSystem.SAPFOR.SapforTasksPackageSupervisor.SapforTasksPackageSupervisor;
|
||||||
|
import Visual_DVM_2021.Passes.PassException;
|
||||||
|
import Visual_DVM_2021.Passes.SSH.ConnectionPass;
|
||||||
|
import Visual_DVM_2021.Passes.Server.TestingSystemPass;
|
||||||
|
import javafx.util.Pair;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileWriter;
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.LinkedHashMap;
|
||||||
|
import java.util.Vector;
|
||||||
|
|
||||||
|
import static Common.Constants.tests_db_name;
|
||||||
|
public class TestingPlanner_OLD {
|
||||||
|
public String email;
|
||||||
|
TasksPackage tasksPackage;
|
||||||
|
TestsSupervisor_2022 supervisor;
|
||||||
|
LinkedHashMap<String, Machine> machines = new LinkedHashMap<>();
|
||||||
|
LinkedHashMap<String, User> users = new LinkedHashMap<>();
|
||||||
|
protected Machine machine = null;
|
||||||
|
protected User user = null;
|
||||||
|
public LinkedHashMap<Long, TestCompilationTask> packageTasks = new LinkedHashMap<>();
|
||||||
|
//----------
|
||||||
|
SapforTasksPackage sapforTasksPackage = null;
|
||||||
|
//----------
|
||||||
|
public void UpdatePackage() throws Exception {
|
||||||
|
tasksPackage.ChangeDate = new Date().getTime();
|
||||||
|
ServerCommand(ServerCode.EditAccountObject, tasksPackage);
|
||||||
|
//---------------
|
||||||
|
if ((tasksPackage.needsEmail == 1) &&
|
||||||
|
(tasksPackage.state.equals(TasksPackageState.PackageStart) ||
|
||||||
|
(tasksPackage.state.equals(TasksPackageState.Done)) ||
|
||||||
|
(tasksPackage.state.equals(TasksPackageState.Aborted))
|
||||||
|
)) {
|
||||||
|
EmailMessage message = new EmailMessage();
|
||||||
|
message.subject = "Состояние пакета задач " + Utils.Brackets(tasksPackage.id) + " изменилось на " + Utils.Brackets(tasksPackage.state.getDescription());
|
||||||
|
message.text = tasksPackage.summary;
|
||||||
|
message.targets.add(email);
|
||||||
|
ServerCommand(ServerCode.Email, message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//-
|
||||||
|
public Object ServerCommand(ServerCode code_in, String arg, Serializable object_in) throws Exception {
|
||||||
|
TestingSystemPass<Object> pass = new TestingSystemPass<Object>() {
|
||||||
|
@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;
|
||||||
|
}
|
||||||
|
public Object ServerCommand(ServerCode code_in, Serializable object_in) throws Exception {
|
||||||
|
return ServerCommand(code_in, email, object_in);
|
||||||
|
}
|
||||||
|
Object ServerCommand(ServerCode code_in) throws Exception {
|
||||||
|
return ServerCommand(code_in, email, null);
|
||||||
|
}
|
||||||
|
//-
|
||||||
|
boolean isPrintOn() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
public void Print(String message) {
|
||||||
|
try {
|
||||||
|
FileWriter testLog = new FileWriter(getClass().getSimpleName() + "_Log.txt", true);
|
||||||
|
String dmessage = Utils.Brackets(new Date()) + " " + message;
|
||||||
|
if (isPrintOn())
|
||||||
|
System.out.println(dmessage);
|
||||||
|
testLog.write(dmessage + "\n");
|
||||||
|
testLog.close();
|
||||||
|
} catch (Exception ex) {
|
||||||
|
ex.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
boolean CheckConnection(Machine machine, User user) {
|
||||||
|
//каждый раз соединяемся по новой. из за проблем с Exists.
|
||||||
|
// к тому же, теперь задачи гоняет модуль, тут только проверка
|
||||||
|
//так что время на разрыв уже не критично.
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
//-
|
||||||
|
public void Perform() {
|
||||||
|
Vector<String> emails = new Vector<>();
|
||||||
|
while (true) {
|
||||||
|
emails.clear();
|
||||||
|
try {
|
||||||
|
File[] accountsBases_ = Global.DataDirectory.listFiles(pathname ->
|
||||||
|
pathname.isFile() &&
|
||||||
|
Utils.getExtension(pathname).equals("sqlite") &&
|
||||||
|
!Utils.getNameWithoutExtension(pathname.getName()).isEmpty() &&
|
||||||
|
!pathname.getName().equals(tests_db_name + ".sqlite")
|
||||||
|
);
|
||||||
|
if (accountsBases_ != null) {
|
||||||
|
for (File accountBase : accountsBases_) {
|
||||||
|
String fileName = accountBase.getName();
|
||||||
|
String account_email = accountBase.getName().substring(0, fileName.lastIndexOf('_'));
|
||||||
|
emails.add(account_email);
|
||||||
|
}
|
||||||
|
for (String current_email : emails)
|
||||||
|
emailPass(current_email);
|
||||||
|
}
|
||||||
|
} catch (Exception ex) {
|
||||||
|
ex.printStackTrace();
|
||||||
|
} finally {
|
||||||
|
try {
|
||||||
|
Utils.sleep(getSleepMillis());
|
||||||
|
} catch (Exception ignored) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
protected int getSleepMillis() {
|
||||||
|
return 2000;
|
||||||
|
}
|
||||||
|
void emailPass(String email_in) {
|
||||||
|
email = email_in;
|
||||||
|
try {
|
||||||
|
// System.out.println(email+" testing planner starts...");
|
||||||
|
Pair<TasksPackage, LinkedHashMap<Long, TestCompilationTask>> p = (Pair<TasksPackage, LinkedHashMap<Long, TestCompilationTask>>) ServerCommand(ServerCode.GetFirstActiveAccountPackage);
|
||||||
|
sapforTasksPackage = (SapforTasksPackage) ServerCommand(ServerCode.GetFirstActiveSapforTasksPackage);
|
||||||
|
tasksPackage = null;
|
||||||
|
packageTasks = null;
|
||||||
|
tasksPackage = p.getKey();
|
||||||
|
packageTasks = p.getValue();
|
||||||
|
if (tasksPackage != null) {
|
||||||
|
// System.out.println("found dvm package: "+sapforTasksPackage.id);
|
||||||
|
String machine_url = tasksPackage.machine_address + ":" + tasksPackage.machine_port;
|
||||||
|
if (!machines.containsKey(machine_url))
|
||||||
|
machines.put(machine_url, new Machine(
|
||||||
|
tasksPackage.machine_name,
|
||||||
|
tasksPackage.machine_address,
|
||||||
|
tasksPackage.machine_port,
|
||||||
|
tasksPackage.machine_type));
|
||||||
|
if (!users.containsKey(tasksPackage.user_name))
|
||||||
|
users.put(tasksPackage.user_name,
|
||||||
|
new User(tasksPackage.user_name, tasksPackage.user_password, tasksPackage.user_workspace));
|
||||||
|
machine = machines.get(machine_url);
|
||||||
|
//-->>
|
||||||
|
user = users.get(tasksPackage.user_name);
|
||||||
|
if (CheckConnection(machine, user)) {
|
||||||
|
try {
|
||||||
|
supervisor = new TestsSupervisor_2022(this, user.connection, tasksPackage, new Vector<>(packageTasks.values()));
|
||||||
|
supervisor.Perform();
|
||||||
|
} catch (Exception ex) {
|
||||||
|
Print("Ошибка сеанса.");
|
||||||
|
Print(ex.getMessage());
|
||||||
|
}
|
||||||
|
finally {
|
||||||
|
if (user.connection != null) {
|
||||||
|
user.connection.Disconnect();
|
||||||
|
user.connection = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (sapforTasksPackage != null) {
|
||||||
|
System.out.println("found sapfor package: " + sapforTasksPackage.id + " state = " + sapforTasksPackage.state);
|
||||||
|
try {
|
||||||
|
(new SapforTasksPackageSupervisor(this, sapforTasksPackage)).Perform();
|
||||||
|
} catch (Exception ex) {
|
||||||
|
Print("Исключение при тестировании SAPROR");
|
||||||
|
Print(ex.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (Exception ex) {
|
||||||
|
Global.Log.PrintException(ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public String getStarter() {
|
||||||
|
return String.join("/", user.workspace, ConnectionPass.modules, ConnectionPass.starter);
|
||||||
|
}
|
||||||
|
public String getLauncher() {
|
||||||
|
return String.join("/", user.workspace, ConnectionPass.modules, ConnectionPass.launcher);
|
||||||
|
}
|
||||||
|
public String getPlanner() {
|
||||||
|
return String.join("/", user.workspace, ConnectionPass.modules, ConnectionPass.planner);
|
||||||
|
}
|
||||||
|
//--
|
||||||
|
public void UpdateSapforPackage() throws Exception {
|
||||||
|
sapforTasksPackage.ChangeDate = new Date().getTime();
|
||||||
|
EmailMessage message = null;
|
||||||
|
ServerCommand(ServerCode.EditAccountObject, sapforTasksPackage);
|
||||||
|
if (sapforTasksPackage.needsEmail == 1) {
|
||||||
|
switch (sapforTasksPackage.state) {
|
||||||
|
case RunningExecution:
|
||||||
|
case Aborted:
|
||||||
|
case Done:
|
||||||
|
//результаты.
|
||||||
|
message = new EmailMessage();
|
||||||
|
message.subject = "Состояние пакета задач SAPFOR" + Utils.Brackets(sapforTasksPackage.id) + " изменилось на " + Utils.Brackets(sapforTasksPackage.state.getDescription());
|
||||||
|
message.text = sapforTasksPackage.summary;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (message != null) {
|
||||||
|
message.targets.add(email);
|
||||||
|
ServerCommand(ServerCode.Email, message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -22,6 +22,7 @@ import TestingSystem.Common.TasksPackageToKill.TasksPackageToKill;
|
|||||||
import TestingSystem.Common.Test.Test;
|
import TestingSystem.Common.Test.Test;
|
||||||
import TestingSystem.Common.Test.TestType;
|
import TestingSystem.Common.Test.TestType;
|
||||||
import TestingSystem.DVM.DVMPackage.DVMPackage;
|
import TestingSystem.DVM.DVMPackage.DVMPackage;
|
||||||
|
import TestingSystem.DVM.DVMTestingPlanner;
|
||||||
import TestingSystem.DVM.Tasks.TestCompilationTask;
|
import TestingSystem.DVM.Tasks.TestCompilationTask;
|
||||||
import TestingSystem.DVM.Tasks.TestRunTask;
|
import TestingSystem.DVM.Tasks.TestRunTask;
|
||||||
import TestingSystem.DVM.Tasks.TestTask;
|
import TestingSystem.DVM.Tasks.TestTask;
|
||||||
@@ -102,9 +103,13 @@ public class TestingServer extends RepositoryServer<TestsDatabase> {
|
|||||||
@Override
|
@Override
|
||||||
protected void startAdditionalThreads() {
|
protected void startAdditionalThreads() {
|
||||||
testingThread.start();
|
testingThread.start();
|
||||||
|
testingThread_2023.start();
|
||||||
}
|
}
|
||||||
protected TestingPlanner testingPlanner = new TestingPlanner();
|
protected TestingPlanner_OLD testingPlannerOLD = new TestingPlanner_OLD();
|
||||||
protected Thread testingThread = new Thread(() -> testingPlanner.Perform());
|
protected Thread testingThread = new Thread(() -> testingPlannerOLD.Perform());
|
||||||
|
//---
|
||||||
|
protected DVMTestingPlanner DVMTestingPlanner_ = new DVMTestingPlanner();
|
||||||
|
protected Thread testingThread_2023 = new Thread(() -> DVMTestingPlanner_.Perform());
|
||||||
//------>>>
|
//------>>>
|
||||||
public static Timer checkTimer = null;
|
public static Timer checkTimer = null;
|
||||||
public static void TimerOn() {
|
public static void TimerOn() {
|
||||||
@@ -369,6 +374,11 @@ public class TestingServer extends RepositoryServer<TestsDatabase> {
|
|||||||
response = new ServerExchangeUnit_2021(ServerCode.OK);
|
response = new ServerExchangeUnit_2021(ServerCode.OK);
|
||||||
ActualizeSAPFORPackages();
|
ActualizeSAPFORPackages();
|
||||||
break;
|
break;
|
||||||
|
case GetFirstActiveDVMPackage:
|
||||||
|
Print("Получить первый активный пакет задач DVM");
|
||||||
|
response = new ServerExchangeUnit_2021(ServerCode.OK);
|
||||||
|
response.object = db.getFirstActiveDVMPackage();
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
throw new RepositoryRefuseException("Неподдерживаемый код: " + code);
|
throw new RepositoryRefuseException("Неподдерживаемый код: " + code);
|
||||||
}
|
}
|
||||||
@@ -529,13 +539,6 @@ public class TestingServer extends RepositoryServer<TestsDatabase> {
|
|||||||
} else if (object instanceof SapforTasksPackage) {
|
} else if (object instanceof SapforTasksPackage) {
|
||||||
SapforTasksPackage sapforTasksPackage = (SapforTasksPackage) object;
|
SapforTasksPackage sapforTasksPackage = (SapforTasksPackage) object;
|
||||||
sapforTasksPackage.id = db.IncKey(SettingName.SAPFORPackageId);
|
sapforTasksPackage.id = db.IncKey(SettingName.SAPFORPackageId);
|
||||||
}else if (object instanceof DVMPackage){
|
|
||||||
DVMPackage dvmPackage = (DVMPackage) object;
|
|
||||||
//--
|
|
||||||
dvmPackage.state = TasksPackageState.Queued;
|
|
||||||
Utils.CheckAndCleanDirectory(dvmPackage.getLocalWorkspace());
|
|
||||||
//--
|
|
||||||
dvmPackage.saveJson();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@Override
|
@Override
|
||||||
@@ -593,6 +596,14 @@ public class TestingServer extends RepositoryServer<TestsDatabase> {
|
|||||||
+ "\nТест будет удален"
|
+ "\nТест будет удален"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
}else if (object instanceof DVMPackage) {
|
||||||
|
DVMPackage dvmPackage = (DVMPackage) object;
|
||||||
|
//--
|
||||||
|
dvmPackage.state = TasksPackageState.Queued;
|
||||||
|
Utils.CheckAndCleanDirectory(dvmPackage.getLocalWorkspace());
|
||||||
|
//--
|
||||||
|
dvmPackage.saveJson();
|
||||||
|
dvmPackage.package_json = null; // объект больше не нужен.
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -2,15 +2,17 @@ package TestingSystem.Common;
|
|||||||
import Common.Constants;
|
import Common.Constants;
|
||||||
import Common.Database.SQLITE.SQLiteDatabase;
|
import Common.Database.SQLITE.SQLiteDatabase;
|
||||||
import GlobalData.Settings.SettingName;
|
import GlobalData.Settings.SettingName;
|
||||||
import TestingSystem.DVM.DVMPackage.DVMPackageDBTable;
|
|
||||||
import TestingSystem.SAPFOR.SapforConfiguration.SapforConfigurationDBTable;
|
|
||||||
import TestingSystem.SAPFOR.SapforConfigurationCommand.SapforConfigurationCommandsDBTable;
|
|
||||||
import TestingSystem.SAPFOR.ServerSapfor.ServerSapforsDBTable;
|
|
||||||
import TestingSystem.DVM.Configuration.ConfigurationDBTable;
|
|
||||||
import TestingSystem.Common.Group.GroupsDBTable;
|
import TestingSystem.Common.Group.GroupsDBTable;
|
||||||
import TestingSystem.Common.TSetting.TSetting;
|
import TestingSystem.Common.TSetting.TSetting;
|
||||||
import TestingSystem.Common.TSetting.TSettingsDBTable;
|
import TestingSystem.Common.TSetting.TSettingsDBTable;
|
||||||
import TestingSystem.Common.Test.TestDBTable;
|
import TestingSystem.Common.Test.TestDBTable;
|
||||||
|
import TestingSystem.DVM.Configuration.ConfigurationDBTable;
|
||||||
|
import TestingSystem.DVM.DVMPackage.DVMPackage;
|
||||||
|
import TestingSystem.DVM.DVMPackage.DVMPackageDBTable;
|
||||||
|
import TestingSystem.DVM.TasksPackage.TasksPackageState;
|
||||||
|
import TestingSystem.SAPFOR.SapforConfiguration.SapforConfigurationDBTable;
|
||||||
|
import TestingSystem.SAPFOR.SapforConfigurationCommand.SapforConfigurationCommandsDBTable;
|
||||||
|
import TestingSystem.SAPFOR.ServerSapfor.ServerSapforsDBTable;
|
||||||
import Visual_DVM_2021.Passes.PassCode_2021;
|
import Visual_DVM_2021.Passes.PassCode_2021;
|
||||||
|
|
||||||
import java.nio.file.Paths;
|
import java.nio.file.Paths;
|
||||||
@@ -59,11 +61,41 @@ public class TestsDatabase extends SQLiteDatabase {
|
|||||||
public PassCode_2021 getSynchronizePassCode() {
|
public PassCode_2021 getSynchronizePassCode() {
|
||||||
return PassCode_2021.SynchronizeTests;
|
return PassCode_2021.SynchronizeTests;
|
||||||
}
|
}
|
||||||
public long IncKey(SettingName settingName) throws Exception{
|
public long IncKey(SettingName settingName) throws Exception {
|
||||||
TSetting setting = settings.get(settingName);
|
TSetting setting = settings.get(settingName);
|
||||||
long res = setting.value;
|
long res = setting.value;
|
||||||
setting.value++;
|
setting.value++;
|
||||||
Update(setting);
|
Update(setting);
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
public DVMPackage getFirstActiveDVMPackage() {
|
||||||
|
DVMPackage first_active = null;
|
||||||
|
DVMPackage first_queued = null;
|
||||||
|
if (!dvmPackages.Data.isEmpty()) {
|
||||||
|
for (DVMPackage p : dvmPackages.Data.values()) {
|
||||||
|
switch (p.state) {
|
||||||
|
case Done:
|
||||||
|
case Aborted:
|
||||||
|
break;
|
||||||
|
case Queued:
|
||||||
|
if (first_queued == null) first_queued = p;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
if (first_active == null) first_active = p; //это и будет первый активный.
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (first_active != null) return first_active;
|
||||||
|
if (first_queued != null) {
|
||||||
|
first_queued.state = TasksPackageState.TestsSynchronize;
|
||||||
|
try {
|
||||||
|
Update(first_queued);
|
||||||
|
} catch (Exception ex) {
|
||||||
|
ex.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return first_queued;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ public class DVMPackage extends TestingPackage {
|
|||||||
user_password = tasksPackage.user_password;
|
user_password = tasksPackage.user_password;
|
||||||
}
|
}
|
||||||
public File getLocalWorkspace() {
|
public File getLocalWorkspace() {
|
||||||
return new File(Global.PackagesDirectory, id);
|
return new File(Global.PackagesDirectory, String.valueOf(id));
|
||||||
}
|
}
|
||||||
public File getJsonFile() {
|
public File getJsonFile() {
|
||||||
return new File(getLocalWorkspace(), "package_json");
|
return new File(getLocalWorkspace(), "package_json");
|
||||||
|
|||||||
@@ -10,9 +10,9 @@ import java.util.Date;
|
|||||||
import java.util.LinkedHashMap;
|
import java.util.LinkedHashMap;
|
||||||
|
|
||||||
import static Common.UI.Tables.TableRenderers.*;
|
import static Common.UI.Tables.TableRenderers.*;
|
||||||
public class DVMPackageDBTable extends DBTable<String, DVMPackage> {
|
public class DVMPackageDBTable extends iDBTable<DVMPackage> {
|
||||||
public DVMPackageDBTable() {
|
public DVMPackageDBTable() {
|
||||||
super(String.class, DVMPackage.class);
|
super(DVMPackage.class);
|
||||||
}
|
}
|
||||||
@Override
|
@Override
|
||||||
public Current CurrentName() {
|
public Current CurrentName() {
|
||||||
@@ -88,9 +88,9 @@ public class DVMPackageDBTable extends DBTable<String, DVMPackage> {
|
|||||||
case 8:
|
case 8:
|
||||||
return object.progress;
|
return object.progress;
|
||||||
case 9:
|
case 9:
|
||||||
return new Date(object.date);
|
return new Date(object.StartDate);
|
||||||
case 10:
|
case 10:
|
||||||
return new Date(object.change_date);
|
return new Date(object.ChangeDate);
|
||||||
case 11:
|
case 11:
|
||||||
return object.state;
|
return object.state;
|
||||||
default:
|
default:
|
||||||
|
|||||||
190
src/TestingSystem/DVM/DVMTestingPlanner.java
Normal file
190
src/TestingSystem/DVM/DVMTestingPlanner.java
Normal file
@@ -0,0 +1,190 @@
|
|||||||
|
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<String, Machine> machines = new LinkedHashMap<>();
|
||||||
|
//todo приделать к ним очередь? или сделать в бд тестирования список машин.
|
||||||
|
LinkedHashMap<String, User> 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<Object> pass = new TestingSystemPass<Object>() {
|
||||||
|
@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());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -6,7 +6,7 @@ import GlobalData.RemoteFile.RemoteFile;
|
|||||||
import GlobalData.Tasks.TaskState;
|
import GlobalData.Tasks.TaskState;
|
||||||
import Repository.Server.ServerCode;
|
import Repository.Server.ServerCode;
|
||||||
import TestingSystem.Common.Test.TestType;
|
import TestingSystem.Common.Test.TestType;
|
||||||
import TestingSystem.Common.TestingPlanner;
|
import TestingSystem.Common.TestingPlanner_OLD;
|
||||||
import TestingSystem.DVM.Tasks.TestCompilationTask;
|
import TestingSystem.DVM.Tasks.TestCompilationTask;
|
||||||
import TestingSystem.DVM.Tasks.TestRunTask;
|
import TestingSystem.DVM.Tasks.TestRunTask;
|
||||||
import TestingSystem.DVM.Tasks.TestTask;
|
import TestingSystem.DVM.Tasks.TestTask;
|
||||||
@@ -21,7 +21,7 @@ import java.nio.charset.Charset;
|
|||||||
import java.nio.file.Paths;
|
import java.nio.file.Paths;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
public class TestsSupervisor_2022 {
|
public class TestsSupervisor_2022 {
|
||||||
protected TestingPlanner planner; //планировщик.
|
protected TestingPlanner_OLD planner; //планировщик.
|
||||||
protected UserConnection connection;
|
protected UserConnection connection;
|
||||||
protected TasksPackage tasksPackage;
|
protected TasksPackage tasksPackage;
|
||||||
protected RemoteFile packageRemoteWorkspace;
|
protected RemoteFile packageRemoteWorkspace;
|
||||||
@@ -29,7 +29,7 @@ public class TestsSupervisor_2022 {
|
|||||||
protected Vector<TestCompilationTask> compilationTasks; //список задач на компиляцию
|
protected Vector<TestCompilationTask> compilationTasks; //список задач на компиляцию
|
||||||
protected int count = 0; //число активных задач.
|
protected int count = 0; //число активных задач.
|
||||||
//----
|
//----
|
||||||
public TestsSupervisor_2022(TestingPlanner planner_in, UserConnection connection_in, TasksPackage tasksPackage_in, Vector<TestCompilationTask> tasks_in) {
|
public TestsSupervisor_2022(TestingPlanner_OLD planner_in, UserConnection connection_in, TasksPackage tasksPackage_in, Vector<TestCompilationTask> tasks_in) {
|
||||||
planner = planner_in;
|
planner = planner_in;
|
||||||
connection = connection_in;
|
connection = connection_in;
|
||||||
tasksPackage = tasksPackage_in;
|
tasksPackage = tasksPackage_in;
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ import Common.GlobalProperties;
|
|||||||
import Common.Utils.Utils;
|
import Common.Utils.Utils;
|
||||||
import Repository.Server.ServerCode;
|
import Repository.Server.ServerCode;
|
||||||
import TestingSystem.Common.Test.Test;
|
import TestingSystem.Common.Test.Test;
|
||||||
import TestingSystem.Common.TestingPlanner;
|
import TestingSystem.Common.TestingPlanner_OLD;
|
||||||
import TestingSystem.DVM.TasksPackage.TasksPackageState;
|
import TestingSystem.DVM.TasksPackage.TasksPackageState;
|
||||||
import TestingSystem.SAPFOR.Json.SapforConfiguration_json;
|
import TestingSystem.SAPFOR.Json.SapforConfiguration_json;
|
||||||
import TestingSystem.SAPFOR.Json.SapforTasksPackage_json;
|
import TestingSystem.SAPFOR.Json.SapforTasksPackage_json;
|
||||||
@@ -23,9 +23,9 @@ import java.io.File;
|
|||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.Vector;
|
import java.util.Vector;
|
||||||
public class SapforTasksPackageSupervisor {
|
public class SapforTasksPackageSupervisor {
|
||||||
protected TestingPlanner planner; //планировщик.
|
protected TestingPlanner_OLD planner; //планировщик.
|
||||||
SapforTasksPackage sapforTasksPackage = null;
|
SapforTasksPackage sapforTasksPackage = null;
|
||||||
public SapforTasksPackageSupervisor(TestingPlanner planner_in, SapforTasksPackage sapforTasksPackage_in) {
|
public SapforTasksPackageSupervisor(TestingPlanner_OLD planner_in, SapforTasksPackage sapforTasksPackage_in) {
|
||||||
planner = planner_in;
|
planner = planner_in;
|
||||||
sapforTasksPackage = sapforTasksPackage_in;
|
sapforTasksPackage = sapforTasksPackage_in;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -53,8 +53,7 @@ public class AddDVMPackage extends AddObjectPass<DVMPackage> {
|
|||||||
}
|
}
|
||||||
//--
|
//--
|
||||||
target = new DVMPackage();
|
target = new DVMPackage();
|
||||||
target.genName();
|
target.id = Constants.Nan;
|
||||||
|
|
||||||
//-
|
//-
|
||||||
target.sender_name=Current.getAccount().name;
|
target.sender_name=Current.getAccount().name;
|
||||||
target.sender_address = Current.getAccount().email;
|
target.sender_address = Current.getAccount().email;
|
||||||
@@ -72,11 +71,13 @@ public class AddDVMPackage extends AddObjectPass<DVMPackage> {
|
|||||||
target.needsEmail = Global.properties.EmailOnTestingProgress ? 1 : 0;
|
target.needsEmail = Global.properties.EmailOnTestingProgress ? 1 : 0;
|
||||||
//--
|
//--
|
||||||
target.package_json = new DVMPackage_json();
|
target.package_json = new DVMPackage_json();
|
||||||
//Utils.CheckAndCleanDirectory(target.getLocalWorkspace());
|
|
||||||
//target.saveJson();
|
|
||||||
//--
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@Override
|
||||||
|
protected void body() throws Exception {
|
||||||
|
//черновик не вставляется в бд.
|
||||||
|
Global.testingServer.db.dvmPackages.Data.put(target.id, target);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -145,7 +145,7 @@ public class AddTasksToDVMPackage extends Pass_2021<DVMPackage> {
|
|||||||
return UI.Question("Будет добавлено " + tasks_count + " задач. Продолжить");
|
return UI.Question("Будет добавлено " + tasks_count + " задач. Продолжить");
|
||||||
}
|
}
|
||||||
//
|
//
|
||||||
return true;
|
return false;
|
||||||
}
|
}
|
||||||
@Override
|
@Override
|
||||||
protected void body() throws Exception {
|
protected void body() throws Exception {
|
||||||
|
|||||||
36
src/Visual_DVM_2021/Passes/All/DeleteDVMPackage.java
Normal file
36
src/Visual_DVM_2021/Passes/All/DeleteDVMPackage.java
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
package Visual_DVM_2021.Passes.All;
|
||||||
|
import Common.Global;
|
||||||
|
import Common.UI.UI;
|
||||||
|
import TestingSystem.Common.TestingServer;
|
||||||
|
import TestingSystem.DVM.DVMPackage.DVMPackage;
|
||||||
|
import TestingSystem.DVM.TasksPackage.TasksPackageState;
|
||||||
|
import Visual_DVM_2021.Passes.DeleteServerObjects;
|
||||||
|
public class DeleteDVMPackage extends DeleteServerObjects<TestingServer, DVMPackage> {
|
||||||
|
public DeleteDVMPackage() {
|
||||||
|
super(Global.testingServer, DVMPackage.class);
|
||||||
|
}
|
||||||
|
//---
|
||||||
|
public boolean checkActivity() {
|
||||||
|
/*
|
||||||
|
for (Object key : target) {
|
||||||
|
DVMPackage tasksPackage = server.db.dvmPackages.get(key);
|
||||||
|
if (!tasksPackage.state.equals(TasksPackageState.Done) &&
|
||||||
|
!tasksPackage.state.equals(TasksPackageState.Aborted)
|
||||||
|
) {
|
||||||
|
Log.Writeln_("Нельзя удалить активный пакет " + key + " !");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
protected boolean canStart(Object... args) throws Exception {
|
||||||
|
return super.canStart(args) && checkActivity();
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
protected void showPreparation() throws Exception {
|
||||||
|
UI.getMainWindow().getTestingWindow().DropTestRunTasksComparison();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@@ -312,12 +312,15 @@ public enum PassCode_2021 {
|
|||||||
AddDVMPackage,
|
AddDVMPackage,
|
||||||
AddTasksToDVMPackage,
|
AddTasksToDVMPackage,
|
||||||
StartDVMPackage,
|
StartDVMPackage,
|
||||||
|
DeleteDVMPackage,
|
||||||
//->
|
//->
|
||||||
TestPass;
|
TestPass;
|
||||||
public String getDescription() {
|
public String getDescription() {
|
||||||
switch (this) {
|
switch (this) {
|
||||||
case Undefined:
|
case Undefined:
|
||||||
return "?";
|
return "?";
|
||||||
|
case DeleteDVMPackage:
|
||||||
|
return "Удалить пакет задач DVM";
|
||||||
case StartDVMPackage:
|
case StartDVMPackage:
|
||||||
return "Запустить пакет задач DVM";
|
return "Запустить пакет задач DVM";
|
||||||
case AddTasksToDVMPackage:
|
case AddTasksToDVMPackage:
|
||||||
|
|||||||
Reference in New Issue
Block a user