tangled
alpha
login
or
join now
lewis.moe
/
lewiscloud
0
fork
atom
Demonstrating core cloud concepts, starting with CaaS. Not for production use.
0
fork
atom
overview
issues
pulls
pipelines
Slightly better worker manager
lewis.moe
4 months ago
861139ae
a5fb0428
+255
-12
3 changed files
expand all
collapse all
unified
split
worker-plane
worker-manager
Cargo.lock
Cargo.toml
src
main.rs
+179
-3
worker-plane/worker-manager/Cargo.lock
···
446
]
447
448
[[package]]
0
0
0
0
0
0
0
0
0
449
name = "nu-ansi-term"
450
version = "0.50.3"
451
source = "registry+https://github.com/rust-lang/crates.io-index"
···
455
]
456
457
[[package]]
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
458
name = "once_cell"
459
version = "1.21.3"
460
source = "registry+https://github.com/rust-lang/crates.io-index"
···
524
"libc",
525
"redox_syscall",
526
"smallvec",
527
-
"windows-link",
528
]
529
530
[[package]]
···
818
]
819
820
[[package]]
0
0
0
0
0
0
0
0
0
0
0
0
0
0
821
name = "tempfile"
822
version = "3.23.0"
823
source = "registry+https://github.com/rust-lang/crates.io-index"
···
1068
]
1069
1070
[[package]]
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1071
name = "windows-link"
1072
version = "0.2.1"
1073
source = "registry+https://github.com/rust-lang/crates.io-index"
1074
checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5"
1075
1076
[[package]]
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1077
name = "windows-sys"
1078
version = "0.60.2"
1079
source = "registry+https://github.com/rust-lang/crates.io-index"
···
1088
source = "registry+https://github.com/rust-lang/crates.io-index"
1089
checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc"
1090
dependencies = [
1091
-
"windows-link",
1092
]
1093
1094
[[package]]
···
1097
source = "registry+https://github.com/rust-lang/crates.io-index"
1098
checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3"
1099
dependencies = [
1100
-
"windows-link",
1101
"windows_aarch64_gnullvm",
1102
"windows_aarch64_msvc",
1103
"windows_i686_gnu",
···
1106
"windows_x86_64_gnu",
1107
"windows_x86_64_gnullvm",
1108
"windows_x86_64_msvc",
0
0
0
0
0
0
0
0
0
1109
]
1110
1111
[[package]]
···
1170
"futures-util",
1171
"serde",
1172
"serde_json",
0
1173
"tokio",
1174
"tokio-tungstenite",
1175
"tracing",
···
446
]
447
448
[[package]]
449
+
name = "ntapi"
450
+
version = "0.4.1"
451
+
source = "registry+https://github.com/rust-lang/crates.io-index"
452
+
checksum = "e8a3895c6391c39d7fe7ebc444a87eb2991b2a0bc718fdabd071eec617fc68e4"
453
+
dependencies = [
454
+
"winapi",
455
+
]
456
+
457
+
[[package]]
458
name = "nu-ansi-term"
459
version = "0.50.3"
460
source = "registry+https://github.com/rust-lang/crates.io-index"
···
464
]
465
466
[[package]]
467
+
name = "objc2-core-foundation"
468
+
version = "0.3.2"
469
+
source = "registry+https://github.com/rust-lang/crates.io-index"
470
+
checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536"
471
+
dependencies = [
472
+
"bitflags",
473
+
]
474
+
475
+
[[package]]
476
+
name = "objc2-io-kit"
477
+
version = "0.3.2"
478
+
source = "registry+https://github.com/rust-lang/crates.io-index"
479
+
checksum = "33fafba39597d6dc1fb709123dfa8289d39406734be322956a69f0931c73bb15"
480
+
dependencies = [
481
+
"libc",
482
+
"objc2-core-foundation",
483
+
]
484
+
485
+
[[package]]
486
name = "once_cell"
487
version = "1.21.3"
488
source = "registry+https://github.com/rust-lang/crates.io-index"
···
552
"libc",
553
"redox_syscall",
554
"smallvec",
555
+
"windows-link 0.2.1",
556
]
557
558
[[package]]
···
846
]
847
848
[[package]]
849
+
name = "sysinfo"
850
+
version = "0.37.2"
851
+
source = "registry+https://github.com/rust-lang/crates.io-index"
852
+
checksum = "16607d5caffd1c07ce073528f9ed972d88db15dd44023fa57142963be3feb11f"
853
+
dependencies = [
854
+
"libc",
855
+
"memchr",
856
+
"ntapi",
857
+
"objc2-core-foundation",
858
+
"objc2-io-kit",
859
+
"windows",
860
+
]
861
+
862
+
[[package]]
863
name = "tempfile"
864
version = "3.23.0"
865
source = "registry+https://github.com/rust-lang/crates.io-index"
···
1110
]
1111
1112
[[package]]
1113
+
name = "winapi"
1114
+
version = "0.3.9"
1115
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1116
+
checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
1117
+
dependencies = [
1118
+
"winapi-i686-pc-windows-gnu",
1119
+
"winapi-x86_64-pc-windows-gnu",
1120
+
]
1121
+
1122
+
[[package]]
1123
+
name = "winapi-i686-pc-windows-gnu"
1124
+
version = "0.4.0"
1125
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1126
+
checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
1127
+
1128
+
[[package]]
1129
+
name = "winapi-x86_64-pc-windows-gnu"
1130
+
version = "0.4.0"
1131
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1132
+
checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
1133
+
1134
+
[[package]]
1135
+
name = "windows"
1136
+
version = "0.61.3"
1137
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1138
+
checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893"
1139
+
dependencies = [
1140
+
"windows-collections",
1141
+
"windows-core",
1142
+
"windows-future",
1143
+
"windows-link 0.1.3",
1144
+
"windows-numerics",
1145
+
]
1146
+
1147
+
[[package]]
1148
+
name = "windows-collections"
1149
+
version = "0.2.0"
1150
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1151
+
checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8"
1152
+
dependencies = [
1153
+
"windows-core",
1154
+
]
1155
+
1156
+
[[package]]
1157
+
name = "windows-core"
1158
+
version = "0.61.2"
1159
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1160
+
checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3"
1161
+
dependencies = [
1162
+
"windows-implement",
1163
+
"windows-interface",
1164
+
"windows-link 0.1.3",
1165
+
"windows-result",
1166
+
"windows-strings",
1167
+
]
1168
+
1169
+
[[package]]
1170
+
name = "windows-future"
1171
+
version = "0.2.1"
1172
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1173
+
checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e"
1174
+
dependencies = [
1175
+
"windows-core",
1176
+
"windows-link 0.1.3",
1177
+
"windows-threading",
1178
+
]
1179
+
1180
+
[[package]]
1181
+
name = "windows-implement"
1182
+
version = "0.60.2"
1183
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1184
+
checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf"
1185
+
dependencies = [
1186
+
"proc-macro2",
1187
+
"quote",
1188
+
"syn",
1189
+
]
1190
+
1191
+
[[package]]
1192
+
name = "windows-interface"
1193
+
version = "0.59.3"
1194
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1195
+
checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358"
1196
+
dependencies = [
1197
+
"proc-macro2",
1198
+
"quote",
1199
+
"syn",
1200
+
]
1201
+
1202
+
[[package]]
1203
+
name = "windows-link"
1204
+
version = "0.1.3"
1205
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1206
+
checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a"
1207
+
1208
+
[[package]]
1209
name = "windows-link"
1210
version = "0.2.1"
1211
source = "registry+https://github.com/rust-lang/crates.io-index"
1212
checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5"
1213
1214
[[package]]
1215
+
name = "windows-numerics"
1216
+
version = "0.2.0"
1217
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1218
+
checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1"
1219
+
dependencies = [
1220
+
"windows-core",
1221
+
"windows-link 0.1.3",
1222
+
]
1223
+
1224
+
[[package]]
1225
+
name = "windows-result"
1226
+
version = "0.3.4"
1227
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1228
+
checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6"
1229
+
dependencies = [
1230
+
"windows-link 0.1.3",
1231
+
]
1232
+
1233
+
[[package]]
1234
+
name = "windows-strings"
1235
+
version = "0.4.2"
1236
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1237
+
checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57"
1238
+
dependencies = [
1239
+
"windows-link 0.1.3",
1240
+
]
1241
+
1242
+
[[package]]
1243
name = "windows-sys"
1244
version = "0.60.2"
1245
source = "registry+https://github.com/rust-lang/crates.io-index"
···
1254
source = "registry+https://github.com/rust-lang/crates.io-index"
1255
checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc"
1256
dependencies = [
1257
+
"windows-link 0.2.1",
1258
]
1259
1260
[[package]]
···
1263
source = "registry+https://github.com/rust-lang/crates.io-index"
1264
checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3"
1265
dependencies = [
1266
+
"windows-link 0.2.1",
1267
"windows_aarch64_gnullvm",
1268
"windows_aarch64_msvc",
1269
"windows_i686_gnu",
···
1272
"windows_x86_64_gnu",
1273
"windows_x86_64_gnullvm",
1274
"windows_x86_64_msvc",
1275
+
]
1276
+
1277
+
[[package]]
1278
+
name = "windows-threading"
1279
+
version = "0.1.0"
1280
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1281
+
checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6"
1282
+
dependencies = [
1283
+
"windows-link 0.1.3",
1284
]
1285
1286
[[package]]
···
1345
"futures-util",
1346
"serde",
1347
"serde_json",
1348
+
"sysinfo",
1349
"tokio",
1350
"tokio-tungstenite",
1351
"tracing",
+1
worker-plane/worker-manager/Cargo.toml
···
8
futures-util = "0.3"
9
serde = { version = "1.0", features = ["derive"] }
10
serde_json = "1.0"
0
11
tokio = { version = "1", features = ["full"] }
12
tokio-tungstenite = { version = "0.21", features = ["native-tls"] }
13
tracing = "0.1"
···
8
futures-util = "0.3"
9
serde = { version = "1.0", features = ["derive"] }
10
serde_json = "1.0"
11
+
sysinfo = "0.37.2"
12
tokio = { version = "1", features = ["full"] }
13
tokio-tungstenite = { version = "0.21", features = ["native-tls"] }
14
tracing = "0.1"
+75
-9
worker-plane/worker-manager/src/main.rs
···
3
use serde::{Deserialize, Serialize};
4
use std::env;
5
use std::time::Duration;
0
6
use tokio_tungstenite::{connect_async, tungstenite::Message};
7
use tracing::{error, info, instrument};
8
use tracing_subscriber::FmtSubscriber;
···
36
BidResponse(Bid),
37
}
38
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
39
#[tokio::main]
40
#[instrument]
41
async fn main() {
···
44
.with_max_level(tracing::Level::INFO)
45
.init();
46
47
-
let server_url = env::var("CONTROL_PLANE_URL")
48
-
.unwrap_or_else(|_| "ws://127.0.0.1:8080".to_string());
49
-
50
info!("Attempting to connect to job board at {}", server_url);
51
52
let url = Url::parse(&server_url).expect("Failed to parse server URL");
···
64
Ok(server_msg) => match server_msg {
65
ServerMessage::PingForBids { job_id } => {
66
info!("Received bid request for job_id: {}", job_id);
0
67
let bid = Bid {
68
job_id: job_id.clone(),
69
-
available_cpu_cores: 8,
70
-
available_ram_mb: 16384,
71
-
available_storage_mb: 51200,
72
};
73
let response_msg = WorkerMessage::BidResponse(bid);
74
let response_json = serde_json::to_string(&response_msg)
75
.expect("Failed to serialize bid response");
76
77
-
if let Err(e) = write.send(Message::Text(response_json.clone())).await {
0
0
78
error!("Failed to send bid response: {}", e);
79
break;
80
}
81
info!("Sent bid for job_id: {}", job_id);
82
}
83
ServerMessage::AssignJob { job } => {
84
-
info!("Won bid! Assigned job: {:?}", job);
0
85
}
86
ServerMessage::Acknowledge => {
87
info!("Received Acknowledge from server.");
88
}
89
},
90
Err(e) => {
91
-
error!("Failed to deserialize server message: {}. Raw text: {}", e, text);
0
0
0
92
}
93
}
94
}
···
112
tokio::time::sleep(Duration::from_secs(5)).await;
113
}
114
}
0
···
3
use serde::{Deserialize, Serialize};
4
use std::env;
5
use std::time::Duration;
6
+
use sysinfo::{Disks, System};
7
use tokio_tungstenite::{connect_async, tungstenite::Message};
8
use tracing::{error, info, instrument};
9
use tracing_subscriber::FmtSubscriber;
···
37
BidResponse(Bid),
38
}
39
40
+
fn get_system_resources() -> (u32, u32, u32) {
41
+
let mut sys = System::new();
42
+
sys.refresh_cpu_all();
43
+
sys.refresh_memory();
44
+
45
+
let cpu_cores = sys.cpus().len() as u32;
46
+
let available_ram_mb = (sys.available_memory() / (1024 * 1024)) as u32;
47
+
let available_storage_mb: u32;
48
+
49
+
let disks = Disks::new_with_refreshed_list();
50
+
51
+
let exe_path = std::env::current_exe().unwrap_or_else(|_| std::path::PathBuf::from("/"));
52
+
53
+
let mut best_disk_mount: Option<&std::path::Path> = None;
54
+
let mut best_disk_space: u64 = 0;
55
+
56
+
for disk in disks.iter() {
57
+
let mount_point = disk.mount_point();
58
+
if exe_path.starts_with(mount_point) {
59
+
if best_disk_mount.is_none()
60
+
|| mount_point.as_os_str().len() > best_disk_mount.unwrap().as_os_str().len()
61
+
{
62
+
best_disk_mount = Some(mount_point);
63
+
best_disk_space = disk.available_space();
64
+
}
65
+
}
66
+
}
67
+
68
+
if best_disk_mount.is_some() {
69
+
available_storage_mb = (best_disk_space / (1024 * 1024)) as u32;
70
+
} else {
71
+
let mut total_space: u64 = 0;
72
+
for disk in disks.iter() {
73
+
match disk.kind() {
74
+
sysinfo::DiskKind::HDD | sysinfo::DiskKind::SSD => {
75
+
total_space += disk.available_space();
76
+
}
77
+
_ => {}
78
+
}
79
+
}
80
+
if total_space == 0 {
81
+
for disk in disks.iter() {
82
+
total_space += disk.available_space();
83
+
}
84
+
}
85
+
available_storage_mb = (total_space / (1024 * 1024)) as u32;
86
+
}
87
+
88
+
(cpu_cores, available_ram_mb, available_storage_mb)
89
+
}
90
+
91
+
async fn spin_up_job(job: Job) {
92
+
info!("Spinning up job: {}", job.id);
93
+
tokio::time::sleep(Duration::from_secs(5)).await;
94
+
info!("Job {} completed. Payload: {}", job.id, job.payload);
95
+
}
96
+
97
#[tokio::main]
98
#[instrument]
99
async fn main() {
···
102
.with_max_level(tracing::Level::INFO)
103
.init();
104
105
+
let server_url =
106
+
env::var("CONTROL_PLANE_URL").unwrap_or_else(|_| "ws://127.0.0.1:8080".to_string());
107
+
108
info!("Attempting to connect to job board at {}", server_url);
109
110
let url = Url::parse(&server_url).expect("Failed to parse server URL");
···
122
Ok(server_msg) => match server_msg {
123
ServerMessage::PingForBids { job_id } => {
124
info!("Received bid request for job_id: {}", job_id);
125
+
let (cpu, ram, storage) = get_system_resources();
126
let bid = Bid {
127
job_id: job_id.clone(),
128
+
available_cpu_cores: cpu,
129
+
available_ram_mb: ram,
130
+
available_storage_mb: storage,
131
};
132
let response_msg = WorkerMessage::BidResponse(bid);
133
let response_json = serde_json::to_string(&response_msg)
134
.expect("Failed to serialize bid response");
135
136
+
if let Err(e) =
137
+
write.send(Message::Text(response_json.clone())).await
138
+
{
139
error!("Failed to send bid response: {}", e);
140
break;
141
}
142
info!("Sent bid for job_id: {}", job_id);
143
}
144
ServerMessage::AssignJob { job } => {
145
+
info!("Won bid! Assigned job: {}", job.id);
146
+
tokio::spawn(spin_up_job(job));
147
}
148
ServerMessage::Acknowledge => {
149
info!("Received Acknowledge from server.");
150
}
151
},
152
Err(e) => {
153
+
error!(
154
+
"Failed to deserialize server message: {}. Raw text: {}",
155
+
e, text
156
+
);
157
}
158
}
159
}
···
177
tokio::time::sleep(Duration::from_secs(5)).await;
178
}
179
}
180
+