up
This commit is contained in:
parent
ce48d72209
commit
66d94ced8a
16
AZ.Compute.Agent/AZ.Compute.Agent.csproj
Normal file
16
AZ.Compute.Agent/AZ.Compute.Agent.csproj
Normal file
@ -0,0 +1,16 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<OutputType>Exe</OutputType>
|
||||
<TargetFramework>net8.0</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Esiur" Version="2.4.1" />
|
||||
<PackageReference Include="System.Diagnostics.PerformanceCounter" Version="8.0.0" />
|
||||
<PackageReference Include="System.Management" Version="8.0.0" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
28
AZ.Compute.Agent/App.cs
Normal file
28
AZ.Compute.Agent/App.cs
Normal file
@ -0,0 +1,28 @@
|
||||
|
||||
using AZ.Compute.Agent;
|
||||
using Esiur.Net.IIP;
|
||||
using Esiur.Resource;
|
||||
using Esiur.Stores;
|
||||
|
||||
internal class App
|
||||
{
|
||||
|
||||
|
||||
private static async Task Main(string[] args)
|
||||
{
|
||||
// Create a store to keep objects.
|
||||
var system = await Warehouse.Put("sys", new MemoryStore());
|
||||
// Create a distibuted server
|
||||
var esiurServer = await Warehouse.Put("sys/server", new DistributedServer() { Port = 10001});
|
||||
|
||||
// Add your object to the store
|
||||
var service = await Warehouse.Put("sys/agent", new Node());
|
||||
|
||||
|
||||
// Start your server
|
||||
await Warehouse.Open();
|
||||
|
||||
Console.WriteLine("AZ Compute Agent is running.");
|
||||
|
||||
}
|
||||
}
|
53
AZ.Compute.Agent/Job.cs
Normal file
53
AZ.Compute.Agent/Job.cs
Normal file
@ -0,0 +1,53 @@
|
||||
using Esiur.Resource;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace AZ.Compute.Agent
|
||||
{
|
||||
[Resource]
|
||||
public partial class Job
|
||||
{
|
||||
[Export] int id;
|
||||
[Export] string name;
|
||||
[Export] string command;
|
||||
[Export] DateTime start = DateTime.Now;
|
||||
[Export] DateTime finish;
|
||||
[Export] bool finished;
|
||||
[Export] object results;
|
||||
|
||||
[Export] float cpu;
|
||||
[Export] float ram;
|
||||
|
||||
Process process;
|
||||
|
||||
public Process Process
|
||||
{
|
||||
get => process;
|
||||
set
|
||||
{
|
||||
process = value;
|
||||
Name = process.ProcessName;
|
||||
Command = process.StartInfo.Arguments;
|
||||
Id = process.Id;
|
||||
process.Exited += Process_Exited;
|
||||
}
|
||||
}
|
||||
|
||||
private void Process_Exited(object? sender, EventArgs e)
|
||||
{
|
||||
finished = true;
|
||||
finish = DateTime.Now;
|
||||
}
|
||||
|
||||
[Export]
|
||||
public void Kill()
|
||||
{
|
||||
process?.Kill();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
122
AZ.Compute.Agent/Node.cs
Normal file
122
AZ.Compute.Agent/Node.cs
Normal file
@ -0,0 +1,122 @@
|
||||
using Esiur.Core;
|
||||
using Esiur.Data;
|
||||
using Esiur.Resource;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.Linq;
|
||||
using System.Management;
|
||||
using System.Net.NetworkInformation;
|
||||
using System.Net.Sockets;
|
||||
using System.Text;
|
||||
using System.Timers;
|
||||
|
||||
namespace AZ.Compute.Agent
|
||||
{
|
||||
[Resource]
|
||||
public partial class Node
|
||||
{
|
||||
|
||||
System.Timers.Timer timer;
|
||||
PerformanceCounter cpuCounter;
|
||||
PerformanceCounter ramCounter;
|
||||
NetworkInterface nic;
|
||||
ulong totalNetworkBytes;
|
||||
|
||||
|
||||
[Export] string id;
|
||||
[Export] string ip;
|
||||
|
||||
[Export] float cpu;
|
||||
[Export] float ram;
|
||||
[Export] float network;
|
||||
|
||||
[Export] uint tasks;
|
||||
|
||||
[Export] uint cpuClock;
|
||||
[Export] uint cpuMaxClock;
|
||||
|
||||
[Export] float networkSpeed;
|
||||
|
||||
[Export] Job[] jobs=new Job[0];
|
||||
|
||||
|
||||
[Export]
|
||||
public async AsyncReply<Job> Compute(string fileName, string arguments)
|
||||
{
|
||||
var psi = new ProcessStartInfo()
|
||||
{
|
||||
FileName = fileName,
|
||||
Arguments = arguments
|
||||
};
|
||||
|
||||
var p = Process.Start(psi);
|
||||
|
||||
var job = await Warehouse.New<Job>(fileName, null, this);
|
||||
job.Process = p;
|
||||
|
||||
|
||||
Jobs = jobs.Append(job).ToArray();
|
||||
|
||||
return job;
|
||||
}
|
||||
|
||||
public Node()
|
||||
{
|
||||
|
||||
Id = System.Environment.MachineName;
|
||||
|
||||
nic = NetworkInterface.GetAllNetworkInterfaces().Where(x => x.OperationalStatus == OperationalStatus.Up).First();
|
||||
networkSpeed = (float)(nic.Speed / 1048576.0);
|
||||
|
||||
totalNetworkBytes = (ulong)nic.GetIPv4Statistics().BytesReceived + (ulong)nic.GetIPv4Statistics().BytesSent;
|
||||
|
||||
Ip = nic.GetIPProperties().UnicastAddresses.First(x=> x.Address.AddressFamily == AddressFamily.InterNetwork).Address.ToString();
|
||||
|
||||
|
||||
using (ManagementObject Mo = new ManagementObject("Win32_Processor.DeviceID='CPU0'"))
|
||||
{
|
||||
cpuClock = (uint)(Mo["CurrentClockSpeed"]);
|
||||
cpuMaxClock = (uint)(Mo["MaxClockSpeed"]);
|
||||
}
|
||||
|
||||
//foreach (ManagementObject obj in new ManagementObjectSearcher("SELECT *, Name FROM Win32_Processor").Get())
|
||||
//{
|
||||
// double maxSpeed = Convert.ToDouble(obj["MaxClockSpeed"]) / 1000;
|
||||
// double turboSpeed = maxSpeed * cpuValue / 100;
|
||||
// return string.Format("{0} Running at {1:0.00}Ghz, Turbo Speed: {2:0.00}Ghz", obj["Name"], maxSpeed, turboSpeed);
|
||||
//}
|
||||
|
||||
cpuCounter = new PerformanceCounter("Processor", "% Processor Time", "_Total");
|
||||
ramCounter = new PerformanceCounter("Memory", "Available MBytes");
|
||||
|
||||
timer = new System.Timers.Timer();
|
||||
timer.Elapsed += Timer_Elapsed;
|
||||
timer.Interval = 5000;
|
||||
timer.Start();
|
||||
}
|
||||
|
||||
private void Timer_Elapsed(object? sender, ElapsedEventArgs e)
|
||||
{
|
||||
try
|
||||
{
|
||||
|
||||
var ntb = (ulong)nic.GetIPv4Statistics().BytesReceived + (ulong)nic.GetIPv4Statistics().BytesSent;
|
||||
|
||||
network = (float)(((ntb - totalNetworkBytes) / 5.0) / nic.Speed);
|
||||
|
||||
Cpu = cpuCounter.NextValue();
|
||||
Ram = ramCounter.NextValue();
|
||||
|
||||
foreach (Job job in jobs)
|
||||
{
|
||||
job.Ram = (float)(job.Process.PeakWorkingSet64 / 1048576.0);
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine(ex.ToString());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -3,13 +3,15 @@ Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio Version 17
|
||||
VisualStudioVersion = 17.9.34714.143
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AZ.Compute", "AZ.Compute\AZ.Compute.csproj", "{6AA91B86-D066-4ADF-81E6-97A483ECBE25}"
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AZ.Compute", "AZ.Compute\AZ.Compute.csproj", "{6AA91B86-D066-4ADF-81E6-97A483ECBE25}"
|
||||
EndProject
|
||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{8BA307C4-5641-405A-9B5B-36954FB53621}"
|
||||
ProjectSection(SolutionItems) = preProject
|
||||
.gitignore = .gitignore
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AZ.Compute.Agent", "AZ.Compute.Agent\AZ.Compute.Agent.csproj", "{19B16887-A64F-4B55-8FE6-39F3E2C0DFF6}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
@ -20,6 +22,10 @@ Global
|
||||
{6AA91B86-D066-4ADF-81E6-97A483ECBE25}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{6AA91B86-D066-4ADF-81E6-97A483ECBE25}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{6AA91B86-D066-4ADF-81E6-97A483ECBE25}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{19B16887-A64F-4B55-8FE6-39F3E2C0DFF6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{19B16887-A64F-4B55-8FE6-39F3E2C0DFF6}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{19B16887-A64F-4B55-8FE6-39F3E2C0DFF6}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{19B16887-A64F-4B55-8FE6-39F3E2C0DFF6}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
|
@ -7,4 +7,15 @@
|
||||
<Nullable>enable</Nullable>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<None Include="Web\node_modules\.bin\esiur" />
|
||||
<None Include="Web\node_modules\.bin\esiur.cmd" />
|
||||
<None Include="Web\node_modules\.bin\esiur.ps1" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Esiur" Version="2.4.1" />
|
||||
<PackageReference Include="Microsoft.AspNetCore.StaticFiles" Version="2.2.0" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
|
@ -1,2 +1,58 @@
|
||||
// See https://aka.ms/new-console-template for more information
|
||||
Console.WriteLine("Hello, World!");
|
||||
|
||||
using AZ.Compute;
|
||||
using Esiur.Net.HTTP;
|
||||
using Esiur.Net.IIP;
|
||||
using Esiur.Resource;
|
||||
using Esiur.Stores;
|
||||
using Microsoft.AspNetCore.StaticFiles;
|
||||
|
||||
internal class Program
|
||||
{
|
||||
|
||||
static FileExtensionContentTypeProvider MIMEProvider = new FileExtensionContentTypeProvider();
|
||||
|
||||
private static async Task Main(string[] args)
|
||||
{
|
||||
// Create a store to keep objects.
|
||||
var system = await Warehouse.Put("sys", new MemoryStore());
|
||||
// Create a distibuted server
|
||||
var esiurServer = await Warehouse.Put("sys/server", new DistributedServer());
|
||||
// Add your object to the store
|
||||
var service = await Warehouse.Put("sys/service", new Service());
|
||||
|
||||
var http = await Warehouse.Put<HTTPServer>("sys/http", new HTTPServer() { Port = 8888 });
|
||||
|
||||
|
||||
http.MapGet("{url}", (string url, HTTPConnection sender) =>
|
||||
{
|
||||
var fn = "Web/" + (sender.Request.Filename == "/" ? "/index.html" : sender.Request.Filename);
|
||||
|
||||
if (File.Exists(fn))
|
||||
{
|
||||
|
||||
string contentType;
|
||||
|
||||
if (!MIMEProvider.TryGetContentType(fn, out contentType))
|
||||
contentType = "application/octet-stream";
|
||||
|
||||
sender.Response.Headers["Content-Type"] = contentType;
|
||||
sender.SendFile(fn).Wait(20000);
|
||||
}
|
||||
else
|
||||
{
|
||||
sender.Response.Number = Esiur.Net.Packets.HTTP.HTTPResponseCode.NotFound;
|
||||
sender.Send("`" + fn + "` Not Found");
|
||||
sender.Close();
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
|
||||
// Start your server
|
||||
await Warehouse.Open();
|
||||
|
||||
|
||||
Console.WriteLine("AZ Compute Engine is running... ");
|
||||
Console.WriteLine("Web: http://localhost:8888");
|
||||
}
|
||||
}
|
8
AZ.Compute/Properties/launchSettings.json
Normal file
8
AZ.Compute/Properties/launchSettings.json
Normal file
@ -0,0 +1,8 @@
|
||||
{
|
||||
"profiles": {
|
||||
"AZ.Compute": {
|
||||
"commandName": "Project",
|
||||
"workingDirectory": "."
|
||||
}
|
||||
}
|
||||
}
|
33
AZ.Compute/Service.cs
Normal file
33
AZ.Compute/Service.cs
Normal file
@ -0,0 +1,33 @@
|
||||
|
||||
using AZ.Compute.Agent;
|
||||
using Esiur.Resource;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace AZ.Compute
|
||||
{
|
||||
[Resource]
|
||||
public partial class Service
|
||||
{
|
||||
[Export]
|
||||
Node[] agents = new Node[0];
|
||||
|
||||
[Export]
|
||||
public async void AddAgent(string ip)
|
||||
{
|
||||
var agent = await Warehouse.Get<Node>($"iip://{ip}:10001/sys/agent", new { AutoReconnect = true });
|
||||
|
||||
Agents = agents.Append(agent).ToArray();
|
||||
}
|
||||
|
||||
[Export]
|
||||
public void Compute(string fileName, string arguments)
|
||||
{
|
||||
Agents.First().Compute(fileName, arguments);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
501
AZ.Compute/Web/css/style.css
Normal file
501
AZ.Compute/Web/css/style.css
Normal file
@ -0,0 +1,501 @@
|
||||
|
||||
@font-face {
|
||||
font-family: def;
|
||||
src: url(/font/Catamaran/Catamaran-Regular.ttf);
|
||||
}
|
||||
|
||||
html {
|
||||
font-family: def;
|
||||
}
|
||||
body {
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
i-router {
|
||||
height: 100vh;
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
i-app {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.logo {
|
||||
height: 50px;
|
||||
}
|
||||
|
||||
.label {
|
||||
padding: 10;
|
||||
margin: 10;
|
||||
border: 1px solid #7b7b7b;
|
||||
border-radius: 10px;
|
||||
color: #000000;
|
||||
background: #e3e3e3;
|
||||
font-size: 32px;
|
||||
width: calc(100% - 50px);
|
||||
}
|
||||
|
||||
canvas {
|
||||
border: 1px solid #b5b5b5;
|
||||
height: 320px;
|
||||
width: 400px;
|
||||
margin: 10px;
|
||||
}
|
||||
|
||||
i-router {
|
||||
padding: 10px 35px;
|
||||
height: calc(100vh - 150px);
|
||||
overflow: auto;
|
||||
}
|
||||
|
||||
.content {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
padding: 8px;
|
||||
}
|
||||
|
||||
.iui-error {
|
||||
display: none;
|
||||
}
|
||||
|
||||
/* row */
|
||||
.row label {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.row-wrap {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
.row-wrap > .row {
|
||||
flex-grow: 1;
|
||||
}
|
||||
|
||||
.row-wrap > .row > div {
|
||||
flex-grow: 1;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.row-wrap > .row > div > * {
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
.row-center {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
}
|
||||
|
||||
.row > div:last-child {
|
||||
border-left: 0;
|
||||
}
|
||||
|
||||
.row, .row-slim {
|
||||
border: 1px solid #ddd;
|
||||
display: flex;
|
||||
}
|
||||
|
||||
|
||||
.row-slim > div, .row-slim > div {
|
||||
border-left: 1px solid #ddd;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.row > div, .row > span {
|
||||
border-left: 1px solid #ddd;
|
||||
padding: 5px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.row > .column, .column > .row {
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.row > span, .column > span {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
/* column */
|
||||
.column > div, .column > span {
|
||||
border-bottom: 1px solid #ddd;
|
||||
padding: 5px;
|
||||
display: flex;
|
||||
}
|
||||
|
||||
.column {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.column > div:last-child {
|
||||
border-bottom: 0;
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
|
||||
.table-form {
|
||||
width: 100%;
|
||||
border-collapse: collapse;
|
||||
}
|
||||
|
||||
.table-form > tbody > tr > td:nth-child(1) {
|
||||
/*background-color: #4ebeec; */
|
||||
/* color: white; */
|
||||
font-weight: bold;
|
||||
padding: 8px;
|
||||
width: 120px;
|
||||
}
|
||||
|
||||
|
||||
/* table-list */
|
||||
.table-list {
|
||||
width: 100%;
|
||||
border-collapse: collapse;
|
||||
}
|
||||
|
||||
.table-list td, .table-form > tbody > tr > td {
|
||||
border: 1px solid #ddd;
|
||||
padding: 8px;
|
||||
}
|
||||
|
||||
.table-list tr:nth-child(even) {
|
||||
background-color: #f2f2f2;
|
||||
}
|
||||
|
||||
.table-list tbody > tr:hover {
|
||||
background-color: #ddd;
|
||||
}
|
||||
|
||||
.table-list thead {
|
||||
font-weight: bold;
|
||||
padding-top: 12px;
|
||||
padding-bottom: 12px;
|
||||
background-color: #4ebeec;
|
||||
color: white;
|
||||
}
|
||||
|
||||
.table-list td > img {
|
||||
max-height: 36px;
|
||||
max-width: 36px;
|
||||
}
|
||||
|
||||
/* table-print */
|
||||
|
||||
.table-print {
|
||||
border-collapse: collapse;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.table-print > thead {
|
||||
font-weight: bold;
|
||||
text-align: center;
|
||||
background: #e2e2e2;
|
||||
}
|
||||
|
||||
.table-print > tbody > tr > td:first-child {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.table-print > tfoot {
|
||||
background: #e2e2e2;
|
||||
}
|
||||
|
||||
.table-print td {
|
||||
padding: 2px;
|
||||
border: 1px solid #ddd;
|
||||
}
|
||||
|
||||
/* actions */
|
||||
|
||||
.actions {
|
||||
padding: 7px 8px;
|
||||
background-color: #f1f1f1;
|
||||
border-bottom-left-radius: 10px;
|
||||
border-bottom-right-radius: 10px;
|
||||
display: flex;
|
||||
gap: 3px;
|
||||
}
|
||||
|
||||
.footer {
|
||||
height: 42px;
|
||||
text-align: center;
|
||||
background: linear-gradient(0deg, #c3c3c3, #f7f7f7);
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
bottom: 0;
|
||||
}
|
||||
|
||||
.loading-panel {
|
||||
position: absolute;
|
||||
z-index: 1001;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background: #545454;
|
||||
align-items: center;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
font-size: 12px;
|
||||
box-shadow: inset 0px 0px 9vh 5vh #3e3e3e;
|
||||
color: #9c9c9c;
|
||||
transition: all ease-out .5s .2s;
|
||||
}
|
||||
|
||||
.loading-panel-hidden {
|
||||
opacity: 0;
|
||||
visibility: hidden;
|
||||
transition: all ease-out .5s .2s;
|
||||
}
|
||||
|
||||
|
||||
.title-bar {
|
||||
display: flex;
|
||||
background-color: #66788600;
|
||||
color: black;
|
||||
height: 60px;
|
||||
align-items: center;
|
||||
box-shadow: 0px 1px 3px 1px #dedede;
|
||||
background: #fff;
|
||||
margin: 10px;
|
||||
padding: 5px;
|
||||
}
|
||||
|
||||
.title-bar h1 {
|
||||
flex-grow: 1;
|
||||
font-size: 24px;
|
||||
margin: 9px;
|
||||
color: #4ebeec;
|
||||
}
|
||||
|
||||
i-router {
|
||||
padding: 10px 35px;
|
||||
height: calc(100vh - 150px);
|
||||
overflow: auto;
|
||||
}
|
||||
|
||||
.loading {
|
||||
margin: 15vh auto;
|
||||
display: flex;
|
||||
font-weight: bold;
|
||||
/*color: #303030;*/
|
||||
align-items: center;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
|
||||
.app {
|
||||
transition: margin-left .5s;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.app-shrunk {
|
||||
margin-left: 250px;
|
||||
}
|
||||
|
||||
.side-bar {
|
||||
height: calc(100% - 132px);
|
||||
width: 0;
|
||||
position: fixed;
|
||||
z-index: 1;
|
||||
top: 81px;
|
||||
left: 10px;
|
||||
background-color: #efefef;
|
||||
transition: 0.5s;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
box-shadow: inset -6px 0px 4px 2px #dfdfdf;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
html[dir='rtl'] .side-bar {
|
||||
box-shadow: inset 6px 0px 4px 2px #dfdfdf;
|
||||
}
|
||||
|
||||
.side-bar i-link {
|
||||
padding: 4px 8px 4px 4px;
|
||||
text-decoration: none;
|
||||
font-size: 15px;
|
||||
color: #818181;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
height: 27px;
|
||||
}
|
||||
|
||||
.side-bar span {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
|
||||
.side-bar i-link:hover {
|
||||
color: #4ebeec;
|
||||
background-color: #f8f8f8;
|
||||
}
|
||||
|
||||
.side-bar i-link[selected]:hover {
|
||||
background-color: #4ebeec;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.side-bar-visible {
|
||||
width: 240px;
|
||||
}
|
||||
|
||||
|
||||
i-modellist > i-repeat {
|
||||
max-height: 260px;
|
||||
overflow-y: scroll;
|
||||
display: block;
|
||||
box-shadow: 1px 1px 2px 2px #d4d4d4;
|
||||
border: white 1px solid;
|
||||
padding: 10px;
|
||||
margin: 5px;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.connection-0 {
|
||||
background: red;
|
||||
}
|
||||
|
||||
|
||||
.connection-1 {
|
||||
background: yellow;
|
||||
transition: background 2s;
|
||||
}
|
||||
|
||||
|
||||
.connection-2 {
|
||||
background: #5de198;
|
||||
transition: background 2s;
|
||||
}
|
||||
|
||||
.navbar-item img {
|
||||
height: 20px;
|
||||
width: 20px;
|
||||
padding: 0px 6px 0px 4px;
|
||||
}
|
||||
|
||||
.link {
|
||||
display: flex;
|
||||
}
|
||||
|
||||
|
||||
input[type=radio] {
|
||||
display: none;
|
||||
}
|
||||
|
||||
input[type=radio]:checked + label span {
|
||||
transform: scale(1.25);
|
||||
}
|
||||
|
||||
input[type=radio]:checked + label .red {
|
||||
border: 2px solid #711313;
|
||||
}
|
||||
|
||||
input[type=radio]:checked + label .orange {
|
||||
border: 2px solid #873a08;
|
||||
}
|
||||
|
||||
input[type=radio]:checked + label .yellow {
|
||||
border: 2px solid #816102;
|
||||
}
|
||||
|
||||
input[type=radio]:checked + label .olive {
|
||||
border: 2px solid #505a0b;
|
||||
}
|
||||
|
||||
input[type=radio]:checked + label .green {
|
||||
border: 2px solid #0e4e1d;
|
||||
}
|
||||
|
||||
input[type=radio]:checked + label .teal {
|
||||
border: 2px solid #003633;
|
||||
}
|
||||
|
||||
input[type=radio]:checked + label .blue {
|
||||
border: 2px solid #103f62;
|
||||
}
|
||||
|
||||
input[type=radio]:checked + label .violet {
|
||||
border: 2px solid #321a64;
|
||||
}
|
||||
|
||||
input[type=radio]:checked + label .purple {
|
||||
border: 2px solid #501962;
|
||||
}
|
||||
|
||||
input[type=radio]:checked + label .pink {
|
||||
border: 2px solid #851554;
|
||||
}
|
||||
|
||||
label {
|
||||
display: inline-block;
|
||||
width: 25px;
|
||||
height: 25px;
|
||||
margin-right: 10px;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
label:hover span {
|
||||
transform: scale(1.25);
|
||||
}
|
||||
|
||||
label span {
|
||||
display: block;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
transition: transform 0.2s ease-in-out;
|
||||
}
|
||||
|
||||
label span.black {
|
||||
background: #000000;
|
||||
}
|
||||
|
||||
label span.white {
|
||||
background: #ffffff;
|
||||
}
|
||||
|
||||
label span.red {
|
||||
background: #DB2828;
|
||||
}
|
||||
|
||||
label span.orange {
|
||||
background: #F2711C;
|
||||
}
|
||||
|
||||
label span.yellow {
|
||||
background: #FBBD08;
|
||||
}
|
||||
|
||||
label span.olive {
|
||||
background: #B5CC18;
|
||||
}
|
||||
|
||||
label span.green {
|
||||
background: #21BA45;
|
||||
}
|
||||
|
||||
label span.teal {
|
||||
background: #00B5AD;
|
||||
}
|
||||
|
||||
label span.blue {
|
||||
background: #2185D0;
|
||||
}
|
||||
|
||||
label span.violet {
|
||||
background: #6435C9;
|
||||
}
|
||||
|
||||
label span.purple {
|
||||
background: #A333C8;
|
||||
}
|
||||
|
||||
label span.pink {
|
||||
background: #E03997;
|
||||
}
|
BIN
AZ.Compute/Web/img/coie.jpg
Normal file
BIN
AZ.Compute/Web/img/coie.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 14 KiB |
112
AZ.Compute/Web/index.html
Normal file
112
AZ.Compute/Web/index.html
Normal file
@ -0,0 +1,112 @@
|
||||
|
||||
<html lang="ar-iq">
|
||||
<head>
|
||||
|
||||
<base href="/" target="_blank">
|
||||
|
||||
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
|
||||
<meta name="apple-mobile-web-app-capable" content="yes">
|
||||
<meta charset="utf-8">
|
||||
|
||||
<link rel="apple-touch-icon" sizes="180x180" href="img/fi/apple-touch-icon.png">
|
||||
<link rel="icon" type="image/png" sizes="32x32" href="img/fi/favicon-32x32.png">
|
||||
<link rel="icon" type="image/png" sizes="16x16" href="img/fi/favicon-16x16.png">
|
||||
<link rel="manifest" href="img/fi/site.webmanifest">
|
||||
<link rel="mask-icon" href="img/fi/safari-pinned-tab.svg" color="#5bbad5">
|
||||
<meta name="msapplication-TileColor" content="#da532c">
|
||||
<meta name="theme-color" content="#ffffff">
|
||||
|
||||
<script src="node_modules/esiur/src/esiur.js" type="module"></script>
|
||||
<script src="node_modules/@esiur/iui/src/iui.js" type="module"></script>
|
||||
|
||||
|
||||
<title>Esiur Demo</title>
|
||||
|
||||
<script src="js/app.js"></script>
|
||||
<script src="js/formats.js"></script>
|
||||
|
||||
<!--IUI 2.0 -->
|
||||
<link href="node_modules/@esiur/iui/css/iui.css" rel="stylesheet" />
|
||||
<link href="css/style.css" rel="stylesheet" />
|
||||
|
||||
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
<i-app onload="init()">
|
||||
|
||||
<div class="footer">
|
||||
Esiur Foundation
|
||||
<br />
|
||||
Nahrain University, College of Information Technology Engineering
|
||||
</div>
|
||||
|
||||
<div class="title-bar" >
|
||||
<img src="img/coie.jpg" class="logo desktop">
|
||||
<h1 class="desktop">AZ Compute Engine</h1>
|
||||
<h3 class="desktop">${FORMAT_CONNECTION_STATUS(d?.status ?? 0)}</h3>
|
||||
<div ::class="`logo connection-${(d?.status ?? 0)}`"></div>
|
||||
</div>
|
||||
|
||||
<div class="actions">
|
||||
<i-button onclick="addJob()">Add Job</i-button>
|
||||
<i-button onclick="addAgent()">Add Agent</i-button>
|
||||
</div>
|
||||
|
||||
<div class="content" async:data="d?.get('sys/service')">
|
||||
|
||||
<i-repeat :data="d?.Agents">
|
||||
<table class="table-list">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Node</th>
|
||||
<th>IP</th>
|
||||
<th>Status</th>
|
||||
<th>CPU</th>
|
||||
<th>RAM</th>
|
||||
<th>Network</th>
|
||||
<th>Jobs</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr repeat>
|
||||
<td>${d.Id}</td>
|
||||
<td>${d.Ip}</td>
|
||||
<td>${d.Status}</td>
|
||||
<td>${d.Cpu}</td>
|
||||
<td>${d.Ram}</td>
|
||||
<td>${d.Network}</td>
|
||||
<td>
|
||||
<i-repeat :data="d?.Jobs">
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Name</th>
|
||||
<th>Start</th>
|
||||
<th>Finished</th>
|
||||
<!-- <th>Command</th>
|
||||
<th>Start</th>
|
||||
<th>CPU</th>
|
||||
<th>RAM</th>-->
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr repeat>
|
||||
<td>${d.Name}</td>
|
||||
<td>${d.Start.toLocaleTimeString()}</td>
|
||||
<td>${d.Finished}</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</i-repeat>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</i-repeat>
|
||||
</div>
|
||||
</i-app>
|
||||
</body>
|
||||
</html>
|
48
AZ.Compute/Web/js/app.js
Normal file
48
AZ.Compute/Web/js/app.js
Normal file
@ -0,0 +1,48 @@
|
||||
|
||||
async function init() {
|
||||
try {
|
||||
|
||||
connection = await wh.get(`iip://${window.location.hostname}`, {
|
||||
autoReconnect: true
|
||||
});
|
||||
|
||||
window.service = await connection.get("sys/service");
|
||||
|
||||
await app.setData(connection);
|
||||
console.log(connection);
|
||||
|
||||
|
||||
}
|
||||
catch (ex)
|
||||
{
|
||||
alert(ex);
|
||||
}
|
||||
}
|
||||
|
||||
async function addJob() {
|
||||
let cmd = prompt("Job command", "");
|
||||
|
||||
if (cmd != null) {
|
||||
try {
|
||||
await service.Compute(cmd, "");
|
||||
} catch (ex) {
|
||||
alert(ex);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
async function addAgent() {
|
||||
let ip = prompt("Agent IP or hostname", "");
|
||||
|
||||
if (ip != null) {
|
||||
try {
|
||||
await service.AddAgent(ip);
|
||||
} catch (ex) {
|
||||
alert(ex);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const FORMAT_CONNECTION_STATUS = (x) => ["Offline", "Connecting...", "Online"][x];
|
||||
|
||||
|
252
AZ.Compute/Web/package-lock.json
generated
Normal file
252
AZ.Compute/Web/package-lock.json
generated
Normal file
@ -0,0 +1,252 @@
|
||||
{
|
||||
"name": "Web",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"dependencies": {
|
||||
"@esiur/iui": "^1.2.1",
|
||||
"esiur": "^2.3.1"
|
||||
}
|
||||
},
|
||||
"node_modules/@babel/runtime": {
|
||||
"version": "7.24.7",
|
||||
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.7.tgz",
|
||||
"integrity": "sha512-UwgBRMjJP+xv857DCngvqXI3Iq6J4v0wXmwc6sapg+zyhbwmQX67LUEFrkK5tbyJ30jGuG3ZvWpBiB9LCy1kWw==",
|
||||
"dependencies": {
|
||||
"regenerator-runtime": "^0.14.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=6.9.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@esiur/iui": {
|
||||
"version": "1.2.1",
|
||||
"resolved": "https://registry.npmjs.org/@esiur/iui/-/iui-1.2.1.tgz",
|
||||
"integrity": "sha512-+fa/rzEBwcDK5J+HFDhLVOMtXqCSoYKXcHQHAqCdcFbhz6xFFeULVPKcBN1K3e8+4N6OEe53tr/Lneu3cX/xeA=="
|
||||
},
|
||||
"node_modules/bl": {
|
||||
"version": "2.2.1",
|
||||
"resolved": "https://registry.npmjs.org/bl/-/bl-2.2.1.tgz",
|
||||
"integrity": "sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g==",
|
||||
"dependencies": {
|
||||
"readable-stream": "^2.3.5",
|
||||
"safe-buffer": "^5.1.1"
|
||||
}
|
||||
},
|
||||
"node_modules/bson": {
|
||||
"version": "1.1.6",
|
||||
"resolved": "https://registry.npmjs.org/bson/-/bson-1.1.6.tgz",
|
||||
"integrity": "sha512-EvVNVeGo4tHxwi8L6bPj3y3itEvStdwvvlojVxxbyYfoaxJ6keLgrTuKdyfEAszFK+H3olzBuafE0yoh0D1gdg==",
|
||||
"engines": {
|
||||
"node": ">=0.6.19"
|
||||
}
|
||||
},
|
||||
"node_modules/core-util-is": {
|
||||
"version": "1.0.3",
|
||||
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
|
||||
"integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="
|
||||
},
|
||||
"node_modules/denque": {
|
||||
"version": "1.5.1",
|
||||
"resolved": "https://registry.npmjs.org/denque/-/denque-1.5.1.tgz",
|
||||
"integrity": "sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw==",
|
||||
"engines": {
|
||||
"node": ">=0.10"
|
||||
}
|
||||
},
|
||||
"node_modules/esiur": {
|
||||
"version": "2.3.1",
|
||||
"resolved": "https://registry.npmjs.org/esiur/-/esiur-2.3.1.tgz",
|
||||
"integrity": "sha512-FHZg32FfpuD6a6qgV/TLrs1GTriXE4i6oMWu8oIoe/P6swgeI52LHF3o1qIgTupCtVl3IAo8IUG0itWAFooRrA==",
|
||||
"dependencies": {
|
||||
"@babel/runtime": "^7.20.7",
|
||||
"mongodb": "^3.6.9",
|
||||
"ws": "^7.5.0"
|
||||
},
|
||||
"bin": {
|
||||
"esiur": "bin/esiur.cjs"
|
||||
}
|
||||
},
|
||||
"node_modules/inherits": {
|
||||
"version": "2.0.4",
|
||||
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
|
||||
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
|
||||
},
|
||||
"node_modules/isarray": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
|
||||
"integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="
|
||||
},
|
||||
"node_modules/memory-pager": {
|
||||
"version": "1.5.0",
|
||||
"resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz",
|
||||
"integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==",
|
||||
"optional": true
|
||||
},
|
||||
"node_modules/mongodb": {
|
||||
"version": "3.7.4",
|
||||
"resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.7.4.tgz",
|
||||
"integrity": "sha512-K5q8aBqEXMwWdVNh94UQTwZ6BejVbFhh1uB6c5FKtPE9eUMZPUO3sRZdgIEcHSrAWmxzpG/FeODDKL388sqRmw==",
|
||||
"dependencies": {
|
||||
"bl": "^2.2.1",
|
||||
"bson": "^1.1.4",
|
||||
"denque": "^1.4.1",
|
||||
"optional-require": "^1.1.8",
|
||||
"safe-buffer": "^5.1.2"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=4"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"saslprep": "^1.0.0"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"aws4": {
|
||||
"optional": true
|
||||
},
|
||||
"bson-ext": {
|
||||
"optional": true
|
||||
},
|
||||
"kerberos": {
|
||||
"optional": true
|
||||
},
|
||||
"mongodb-client-encryption": {
|
||||
"optional": true
|
||||
},
|
||||
"mongodb-extjson": {
|
||||
"optional": true
|
||||
},
|
||||
"snappy": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/optional-require": {
|
||||
"version": "1.1.8",
|
||||
"resolved": "https://registry.npmjs.org/optional-require/-/optional-require-1.1.8.tgz",
|
||||
"integrity": "sha512-jq83qaUb0wNg9Krv1c5OQ+58EK+vHde6aBPzLvPPqJm89UQWsvSuFy9X/OSNJnFeSOKo7btE0n8Nl2+nE+z5nA==",
|
||||
"dependencies": {
|
||||
"require-at": "^1.0.6"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=4"
|
||||
}
|
||||
},
|
||||
"node_modules/process-nextick-args": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
|
||||
"integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
|
||||
},
|
||||
"node_modules/readable-stream": {
|
||||
"version": "2.3.8",
|
||||
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
|
||||
"integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
|
||||
"dependencies": {
|
||||
"core-util-is": "~1.0.0",
|
||||
"inherits": "~2.0.3",
|
||||
"isarray": "~1.0.0",
|
||||
"process-nextick-args": "~2.0.0",
|
||||
"safe-buffer": "~5.1.1",
|
||||
"string_decoder": "~1.1.1",
|
||||
"util-deprecate": "~1.0.1"
|
||||
}
|
||||
},
|
||||
"node_modules/readable-stream/node_modules/safe-buffer": {
|
||||
"version": "5.1.2",
|
||||
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
|
||||
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
|
||||
},
|
||||
"node_modules/regenerator-runtime": {
|
||||
"version": "0.14.1",
|
||||
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
|
||||
"integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw=="
|
||||
},
|
||||
"node_modules/require-at": {
|
||||
"version": "1.0.6",
|
||||
"resolved": "https://registry.npmjs.org/require-at/-/require-at-1.0.6.tgz",
|
||||
"integrity": "sha512-7i1auJbMUrXEAZCOQ0VNJgmcT2VOKPRl2YGJwgpHpC9CE91Mv4/4UYIUm4chGJaI381ZDq1JUicFii64Hapd8g==",
|
||||
"engines": {
|
||||
"node": ">=4"
|
||||
}
|
||||
},
|
||||
"node_modules/safe-buffer": {
|
||||
"version": "5.2.1",
|
||||
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
|
||||
"integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
|
||||
"funding": [
|
||||
{
|
||||
"type": "github",
|
||||
"url": "https://github.com/sponsors/feross"
|
||||
},
|
||||
{
|
||||
"type": "patreon",
|
||||
"url": "https://www.patreon.com/feross"
|
||||
},
|
||||
{
|
||||
"type": "consulting",
|
||||
"url": "https://feross.org/support"
|
||||
}
|
||||
]
|
||||
},
|
||||
"node_modules/saslprep": {
|
||||
"version": "1.0.3",
|
||||
"resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz",
|
||||
"integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==",
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"sparse-bitfield": "^3.0.3"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=6"
|
||||
}
|
||||
},
|
||||
"node_modules/sparse-bitfield": {
|
||||
"version": "3.0.3",
|
||||
"resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz",
|
||||
"integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==",
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"memory-pager": "^1.0.2"
|
||||
}
|
||||
},
|
||||
"node_modules/string_decoder": {
|
||||
"version": "1.1.1",
|
||||
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
|
||||
"integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
|
||||
"dependencies": {
|
||||
"safe-buffer": "~5.1.0"
|
||||
}
|
||||
},
|
||||
"node_modules/string_decoder/node_modules/safe-buffer": {
|
||||
"version": "5.1.2",
|
||||
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
|
||||
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
|
||||
},
|
||||
"node_modules/util-deprecate": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
|
||||
"integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
|
||||
},
|
||||
"node_modules/ws": {
|
||||
"version": "7.5.10",
|
||||
"resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz",
|
||||
"integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==",
|
||||
"engines": {
|
||||
"node": ">=8.3.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"bufferutil": "^4.0.1",
|
||||
"utf-8-validate": "^5.0.2"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"bufferutil": {
|
||||
"optional": true
|
||||
},
|
||||
"utf-8-validate": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
6
AZ.Compute/Web/package.json
Normal file
6
AZ.Compute/Web/package.json
Normal file
@ -0,0 +1,6 @@
|
||||
{
|
||||
"dependencies": {
|
||||
"@esiur/iui": "^1.2.1",
|
||||
"esiur": "^2.3.1"
|
||||
}
|
||||
}
|
67
AZ.Compute/localhost_10001/AZ.Compute.Agent.Job.Generated.cs
Normal file
67
AZ.Compute/localhost_10001/AZ.Compute.Agent.Job.Generated.cs
Normal file
@ -0,0 +1,67 @@
|
||||
using System;
|
||||
using Esiur.Resource;
|
||||
using Esiur.Core;
|
||||
using Esiur.Data;
|
||||
using Esiur.Net.IIP;
|
||||
namespace AZ.Compute.Agent {
|
||||
[ClassId("2e7cea0b000aab7ee0f0e98a60298a53")]
|
||||
public class Job : DistributedResource {
|
||||
public Job(DistributedConnection connection, uint instanceId, ulong age, string link) : base(connection, instanceId, age, link) {}
|
||||
public Job() {}
|
||||
[Annotation("() -> Void")]
|
||||
[Export] public AsyncReply<object> Kill() {
|
||||
var args = new Map<byte, object>(){};
|
||||
var rt = new AsyncReply<object>();
|
||||
_Invoke(0, args)
|
||||
.Then(x => rt.Trigger((object)x))
|
||||
.Error(x => rt.TriggerError(x))
|
||||
.Chunk(x => rt.TriggerChunk(x));
|
||||
return rt; }
|
||||
[Annotation("String")]
|
||||
[Export] public string Command {
|
||||
get => (string)properties[0];
|
||||
set => _SetSync(0, value);
|
||||
}
|
||||
[Annotation("Single")]
|
||||
[Export] public float Cpu {
|
||||
get => (float)properties[1];
|
||||
set => _SetSync(1, value);
|
||||
}
|
||||
[Annotation("DateTime")]
|
||||
[Export] public DateTime Finish {
|
||||
get => (DateTime)properties[2];
|
||||
set => _SetSync(2, value);
|
||||
}
|
||||
[Annotation("Boolean")]
|
||||
[Export] public bool Finished {
|
||||
get => (bool)properties[3];
|
||||
set => _SetSync(3, value);
|
||||
}
|
||||
[Annotation("Int32")]
|
||||
[Export] public int Id {
|
||||
get => (int)properties[4];
|
||||
set => _SetSync(4, value);
|
||||
}
|
||||
[Annotation("String")]
|
||||
[Export] public string Name {
|
||||
get => (string)properties[5];
|
||||
set => _SetSync(5, value);
|
||||
}
|
||||
[Annotation("Single")]
|
||||
[Export] public float Ram {
|
||||
get => (float)properties[6];
|
||||
set => _SetSync(6, value);
|
||||
}
|
||||
[Annotation("Object")]
|
||||
[Export] public object Results {
|
||||
get => (object)properties[7];
|
||||
set => _SetSync(7, value);
|
||||
}
|
||||
[Annotation("DateTime")]
|
||||
[Export] public DateTime Start {
|
||||
get => (DateTime)properties[8];
|
||||
set => _SetSync(8, value);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
@ -0,0 +1,72 @@
|
||||
using System;
|
||||
using Esiur.Resource;
|
||||
using Esiur.Core;
|
||||
using Esiur.Data;
|
||||
using Esiur.Net.IIP;
|
||||
namespace AZ.Compute.Agent {
|
||||
[ClassId("2f73616a78827890a18fddec371f2217")]
|
||||
public class Node : DistributedResource {
|
||||
public Node(DistributedConnection connection, uint instanceId, ulong age, string link) : base(connection, instanceId, age, link) {}
|
||||
public Node() {}
|
||||
[Annotation("([String] fileName,[String] arguments) -> AsyncReply`1")]
|
||||
[Export] public AsyncReply<AZ.Compute.Agent.Job> Compute(string fileName, string arguments) {
|
||||
var args = new Map<byte, object>(){[0] = fileName, [1] = arguments};
|
||||
var rt = new AsyncReply<AZ.Compute.Agent.Job>();
|
||||
_Invoke(0, args)
|
||||
.Then(x => rt.Trigger((AZ.Compute.Agent.Job)x))
|
||||
.Error(x => rt.TriggerError(x))
|
||||
.Chunk(x => rt.TriggerChunk(x));
|
||||
return rt; }
|
||||
[Annotation("Single")]
|
||||
[Export] public float Cpu {
|
||||
get => (float)properties[0];
|
||||
set => _SetSync(0, value);
|
||||
}
|
||||
[Annotation("UInt32")]
|
||||
[Export] public uint CpuClock {
|
||||
get => (uint)properties[1];
|
||||
set => _SetSync(1, value);
|
||||
}
|
||||
[Annotation("UInt32")]
|
||||
[Export] public uint CpuMaxClock {
|
||||
get => (uint)properties[2];
|
||||
set => _SetSync(2, value);
|
||||
}
|
||||
[Annotation("String")]
|
||||
[Export] public string Id {
|
||||
get => (string)properties[3];
|
||||
set => _SetSync(3, value);
|
||||
}
|
||||
[Annotation("String")]
|
||||
[Export] public string Ip {
|
||||
get => (string)properties[4];
|
||||
set => _SetSync(4, value);
|
||||
}
|
||||
[Annotation("Job[]")]
|
||||
[Export] public AZ.Compute.Agent.Job[] Jobs {
|
||||
get => (AZ.Compute.Agent.Job[])properties[5];
|
||||
set => _SetSync(5, value);
|
||||
}
|
||||
[Annotation("Single")]
|
||||
[Export] public float Network {
|
||||
get => (float)properties[6];
|
||||
set => _SetSync(6, value);
|
||||
}
|
||||
[Annotation("Single")]
|
||||
[Export] public float NetworkSpeed {
|
||||
get => (float)properties[7];
|
||||
set => _SetSync(7, value);
|
||||
}
|
||||
[Annotation("Single")]
|
||||
[Export] public float Ram {
|
||||
get => (float)properties[8];
|
||||
set => _SetSync(8, value);
|
||||
}
|
||||
[Annotation("UInt32")]
|
||||
[Export] public uint Tasks {
|
||||
get => (uint)properties[9];
|
||||
set => _SetSync(9, value);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
8
AZ.Compute/localhost_10001/Esiur.Generated.cs
Normal file
8
AZ.Compute/localhost_10001/Esiur.Generated.cs
Normal file
@ -0,0 +1,8 @@
|
||||
using System;
|
||||
namespace Esiur {
|
||||
public static class Generated {
|
||||
public static Type[] Resources {get;} = new Type[] {};
|
||||
public static Type[] Records { get; } = new Type[] { };
|
||||
public static Type[] Enums { get; } = new Type[] { };
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user