diff --git a/AZ.Compute.Agent/AZ.Compute.Agent.csproj b/AZ.Compute.Agent/AZ.Compute.Agent.csproj new file mode 100644 index 0000000..ae63786 --- /dev/null +++ b/AZ.Compute.Agent/AZ.Compute.Agent.csproj @@ -0,0 +1,16 @@ + + + + Exe + net8.0 + enable + enable + + + + + + + + + diff --git a/AZ.Compute.Agent/App.cs b/AZ.Compute.Agent/App.cs new file mode 100644 index 0000000..ed25137 --- /dev/null +++ b/AZ.Compute.Agent/App.cs @@ -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."); + + } +} \ No newline at end of file diff --git a/AZ.Compute.Agent/Job.cs b/AZ.Compute.Agent/Job.cs new file mode 100644 index 0000000..859568b --- /dev/null +++ b/AZ.Compute.Agent/Job.cs @@ -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(); + } + + } +} diff --git a/AZ.Compute.Agent/Node.cs b/AZ.Compute.Agent/Node.cs new file mode 100644 index 0000000..dd26d2b --- /dev/null +++ b/AZ.Compute.Agent/Node.cs @@ -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 Compute(string fileName, string arguments) + { + var psi = new ProcessStartInfo() + { + FileName = fileName, + Arguments = arguments + }; + + var p = Process.Start(psi); + + var job = await Warehouse.New(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()); + } + } + } +} diff --git a/AZ.Compute.sln b/AZ.Compute.sln index c97c00c..39519b9 100644 --- a/AZ.Compute.sln +++ b/AZ.Compute.sln @@ -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 diff --git a/AZ.Compute/AZ.Compute.csproj b/AZ.Compute/AZ.Compute.csproj index 2150e37..2141a91 100644 --- a/AZ.Compute/AZ.Compute.csproj +++ b/AZ.Compute/AZ.Compute.csproj @@ -7,4 +7,15 @@ enable + + + + + + + + + + + diff --git a/AZ.Compute/App.cs b/AZ.Compute/App.cs index 3751555..caf9fd9 100644 --- a/AZ.Compute/App.cs +++ b/AZ.Compute/App.cs @@ -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("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"); + } +} \ No newline at end of file diff --git a/AZ.Compute/Properties/launchSettings.json b/AZ.Compute/Properties/launchSettings.json new file mode 100644 index 0000000..8170f16 --- /dev/null +++ b/AZ.Compute/Properties/launchSettings.json @@ -0,0 +1,8 @@ +{ + "profiles": { + "AZ.Compute": { + "commandName": "Project", + "workingDirectory": "." + } + } +} \ No newline at end of file diff --git a/AZ.Compute/Service.cs b/AZ.Compute/Service.cs new file mode 100644 index 0000000..5283c2e --- /dev/null +++ b/AZ.Compute/Service.cs @@ -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($"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); + + } + } +} diff --git a/AZ.Compute/Web/css/style.css b/AZ.Compute/Web/css/style.css new file mode 100644 index 0000000..5d1b35e --- /dev/null +++ b/AZ.Compute/Web/css/style.css @@ -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; +} \ No newline at end of file diff --git a/AZ.Compute/Web/img/coie.jpg b/AZ.Compute/Web/img/coie.jpg new file mode 100644 index 0000000..1b0d0f8 Binary files /dev/null and b/AZ.Compute/Web/img/coie.jpg differ diff --git a/AZ.Compute/Web/index.html b/AZ.Compute/Web/index.html new file mode 100644 index 0000000..5a61aec --- /dev/null +++ b/AZ.Compute/Web/index.html @@ -0,0 +1,112 @@ + + + + + + + + + + + + + + + + + + + + + + + + Esiur Demo + + + + + + + + + + + + + + + + + +
+ +

AZ Compute Engine

+

${FORMAT_CONNECTION_STATUS(d?.status ?? 0)}

+
+
+ +
+ Add Job + Add Agent +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
NodeIPStatusCPURAMNetworkJobs
${d.Id}${d.Ip}${d.Status}${d.Cpu}${d.Ram}${d.Network} + + + + + + + + + + + + + + + + + +
NameStartFinished
${d.Name}${d.Start.toLocaleTimeString()}${d.Finished}
+
+
+
+
+
+ + \ No newline at end of file diff --git a/AZ.Compute/Web/js/app.js b/AZ.Compute/Web/js/app.js new file mode 100644 index 0000000..f97824e --- /dev/null +++ b/AZ.Compute/Web/js/app.js @@ -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]; + + \ No newline at end of file diff --git a/AZ.Compute/Web/package-lock.json b/AZ.Compute/Web/package-lock.json new file mode 100644 index 0000000..a3a0039 --- /dev/null +++ b/AZ.Compute/Web/package-lock.json @@ -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 + } + } + } + } +} diff --git a/AZ.Compute/Web/package.json b/AZ.Compute/Web/package.json new file mode 100644 index 0000000..3e32fc5 --- /dev/null +++ b/AZ.Compute/Web/package.json @@ -0,0 +1,6 @@ +{ + "dependencies": { + "@esiur/iui": "^1.2.1", + "esiur": "^2.3.1" + } +} diff --git a/AZ.Compute/localhost_10001/AZ.Compute.Agent.Job.Generated.cs b/AZ.Compute/localhost_10001/AZ.Compute.Agent.Job.Generated.cs new file mode 100644 index 0000000..4b72103 --- /dev/null +++ b/AZ.Compute/localhost_10001/AZ.Compute.Agent.Job.Generated.cs @@ -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 Kill() { +var args = new Map(){}; +var rt = new AsyncReply(); +_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); +} + +} +} diff --git a/AZ.Compute/localhost_10001/AZ.Compute.Agent.Node.Generated.cs b/AZ.Compute/localhost_10001/AZ.Compute.Agent.Node.Generated.cs new file mode 100644 index 0000000..5be4e7e --- /dev/null +++ b/AZ.Compute/localhost_10001/AZ.Compute.Agent.Node.Generated.cs @@ -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 Compute(string fileName, string arguments) { +var args = new Map(){[0] = fileName, [1] = arguments}; +var rt = new AsyncReply(); +_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); +} + +} +} diff --git a/AZ.Compute/localhost_10001/Esiur.Generated.cs b/AZ.Compute/localhost_10001/Esiur.Generated.cs new file mode 100644 index 0000000..5f85bac --- /dev/null +++ b/AZ.Compute/localhost_10001/Esiur.Generated.cs @@ -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[] { }; + } +} \ No newline at end of file