code wiki / (root) / nx_container_compose.nx

nx_container_compose.nx source

↩ module page · 171 lines · 7732 B

1// nx_container_compose.nx -- R2 of the Nishi Container Host: SOVEREIGN multi-service orchestration planner 2// (the docker-compose / k8s-ordering analog). Reads a service registry (data: NAME:dep1,dep2 per line), 3// computes a dependency-ordered launch plan via topological sort, and REJECTS cycles + missing deps 4// (never-brick: an unsatisfiable stack must not "launch"). = the declarative multi-service core that closes the 5// census orchestration_multi axis. Per-service container PEs come from R1 nx_container_spec_emit (composable). 6// GATE: real Elder AI stack orders correctly (svcconfig -> sdserver -> genimg); cycle -> rejected; missing-dep 7// -> rejected. Topo self-checks its own output (deps must precede dependents). NO fake greens. license_tier: ORIGINAL 8import "nx_syscalls.nx" 9import "nx_runtime.nx" 10const CCP_MAGIC_8192: i64 = 8192 11const CCP_MAGIC_8191: i64 = 8191 12 13const CCP_TSV: *u8 = "knowledge/status/container_compose.tsv" 14const CMAX: i64 = 12 15const CNL: i64 = 24 16const CDEP: i64 = 96 17 18func cc_w(fd: i64, s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(fd, s, n); return 0 } 19func cc_wn(fd: i64, v: i64) -> i64 { 20 let bb: *u8 = sys_mmap(28) 21 var m: i64 = v 22 if m < 0 { sys_write(fd, "-" as *u8, 1); m = 0 - m } 23 let tt: *u8 = sys_mmap(28) 24 var k: i64 = 0 25 if m == 0 { tt[0] = 48 as u8; k = 1 } 26 while m > 0 { tt[k] = (48 + (m % 10)) as u8; m = m / 10; k = k + 1 } 27 var i: i64 = 0 28 while i < k { bb[i] = tt[k-1-i]; i = i + 1 } 29 sys_write(fd, bb, k) 30 return 0 31} 32func cc_p(s: *u8) -> i64 { return cc_w(1, s) } 33func cc_pn(v: i64) -> i64 { return cc_wn(1, v) } 34func cc_read(path: *u8, buf: *u8, cap: i64) -> i64 { 35 let fd: i64 = sys_openat_rd(path) 36 if fd < 0 { return 0 } 37 var tot: i64 = 0 38 var go: i64 = 1 39 while go == 1 { 40 let r: i64 = sys_read(fd, (buf as i64 + tot) as *u8, cap - tot) 41 if r <= 0 { go = 0 } else { tot = tot + r } 42 if tot >= cap { go = 0 } 43 } 44 sys_close(fd) 45 return tot 46} 47func cc_streq(a: *u8, b: *u8) -> i64 { 48 var i: i64 = 0 49 while a[i] != (0 as u8) { if a[i] != b[i] { return 0 } i = i + 1 } 50 if b[i] != (0 as u8) { return 0 } 51 return 1 52} 53func cc_bit(k: i64) -> i64 { var b: i64 = 1; var i: i64 = 0; while i < k { b = b * 2; i = i + 1 } return b } 54func cc_findname(names: *u8, count: i64, tok: *u8) -> i64 { 55 var j: i64 = 0 56 while j < count { if cc_streq((names as i64 + j * CNL) as *u8, tok) == 1 { return j } j = j + 1 } 57 return 0 - 1 58} 59 60// parse registry -> names + topo order. returns op(==count) on success; -1 cycle; -2 missing dep; -3 bad order (self-check) 61func cc_compose(buf: *u8, n: i64, names: *u8, order: *i64) -> i64 { 62 let depstr: *u8 = sys_mmap(CMAX * CDEP) 63 let depmask: *i64 = sys_mmap(CMAX * 8) as *i64 64 var z: i64 = 0 65 while z < CMAX { depmask[z] = 0; z = z + 1 } 66 var pos: i64 = 0 67 var count: i64 = 0 68 while pos < n { 69 var eol: i64 = pos 70 var fe: i64 = 0 71 while fe == 0 { if eol >= n { fe = 1 } else { if buf[eol] == (10 as u8) { fe = 1 } else { eol = eol + 1 } } } 72 if eol > pos { if count < CMAX { 73 var col: i64 = pos 74 var fc: i64 = 0 75 while fc == 0 { if col >= eol { fc = 1 } else { if buf[col] == (58 as u8) { fc = 1 } else { col = col + 1 } } } 76 let np: *u8 = (names as i64 + count * CNL) as *u8 77 var a: i64 = 0 78 var fa: i64 = 0 79 while fa == 0 { if pos + a >= col { fa = 1 } else { if a >= CNL - 1 { fa = 1 } else { np[a] = buf[pos + a]; a = a + 1 } } } 80 np[a] = 0 as u8 81 let dp: *u8 = (depstr as i64 + count * CDEP) as *u8 82 var b: i64 = 0 83 var s: i64 = col + 1 84 var fb: i64 = 0 85 while fb == 0 { if s + b >= eol { fb = 1 } else { if b >= CDEP - 1 { fb = 1 } else { dp[b] = buf[s + b]; b = b + 1 } } } 86 dp[b] = 0 as u8 87 count = count + 1 88 } } 89 pos = eol + 1 90 } 91 var miss: i64 = 0 92 var i: i64 = 0 93 while i < count { 94 let ds: *u8 = (depstr as i64 + i * CDEP) as *u8 95 var p: i64 = 0 96 var fd2: i64 = 0 97 while fd2 == 0 { 98 if ds[p] == (0 as u8) { fd2 = 1 } else { 99 let tok: *u8 = sys_mmap(CNL) 100 var t: i64 = 0 101 var ft: i64 = 0 102 while ft == 0 { if ds[p] == (0 as u8) { ft = 1 } else { if ds[p] == (44 as u8) { ft = 1 } else { if t < CNL - 1 { tok[t] = ds[p]; t = t + 1 } p = p + 1 } } } 103 tok[t] = 0 as u8 104 if t > 0 { let j: i64 = cc_findname(names, count, tok); if j < 0 { miss = 1 } else { depmask[i] = depmask[i] | cc_bit(j) } } 105 if ds[p] == (44 as u8) { p = p + 1 } 106 } 107 } 108 i = i + 1 109 } 110 var emitted: i64 = 0 111 var op: i64 = 0 112 var prog: i64 = 1 113 while prog == 1 { 114 prog = 0 115 var k: i64 = 0 116 while k < count { 117 let bit: i64 = cc_bit(k) 118 if (emitted & bit) == 0 { if (depmask[k] & (0 - emitted - 1)) == 0 { emitted = emitted | bit; order[op] = k; op = op + 1; prog = 1 } } 119 k = k + 1 120 } 121 } 122 var okorder: i64 = 1 123 var em: i64 = 0 124 var q: i64 = 0 125 while q < op { let sx: i64 = order[q]; if (depmask[sx] & (0 - em - 1)) == 0 { } else { okorder = 0 } em = em | cc_bit(sx); q = q + 1 } 126 if miss == 1 { return 0 - 2 } 127 if op < count { return 0 - 1 } 128 if okorder == 0 { return 0 - 3 } 129 return op 130} 131 132func main() -> i64 { 133 cc_p("=== nx_container_compose: sovereign multi-service orchestration planner (docker-compose analog) ===\n" as *u8) 134 let names: *u8 = sys_mmap(CMAX * CNL) 135 let order: *i64 = sys_mmap(CMAX * 8) as *i64 136 let rb: *u8 = sys_mmap(CCP_MAGIC_8192) 137 let rn: i64 = cc_read("knowledge/containers/elderai_stack.compose" as *u8, rb, CCP_MAGIC_8191) 138 let r1: i64 = cc_compose(rb, rn, names, order) 139 cc_p(" T1 real Elder AI stack -> code=" as *u8); cc_pn(r1); cc_p(" launch order: " as *u8) 140 if r1 > 0 { var p: i64 = 0; while p < r1 { cc_p((names as i64 + order[p] * CNL) as *u8); cc_p(" -> " as *u8); p = p + 1 } } 141 cc_p("(ready)\n" as *u8) 142 var t1: i64 = 0 143 if r1 == 3 { t1 = 1 } 144 let cyc: *u8 = "a:b\nb:a\n" as *u8 145 let r2: i64 = cc_compose(cyc, 8, names, order) 146 var t2: i64 = 0 147 if r2 == (0 - 1) { t2 = 1 } 148 cc_p(" T2 neg-control cycle(a<->b) -> code=" as *u8); cc_pn(r2); cc_p(" (expect -1 reject)\n" as *u8) 149 let mis: *u8 = "x:nope\n" as *u8 150 let r3: i64 = cc_compose(mis, 7, names, order) 151 var t3: i64 = 0 152 if r3 == (0 - 2) { t3 = 1 } 153 cc_p(" T3 neg-control missing-dep -> code=" as *u8); cc_pn(r3); cc_p(" (expect -2 reject)\n" as *u8) 154 let r1b: i64 = cc_compose(rb, rn, names, order) 155 let tfd: i64 = sys_openat_wr(CCP_TSV, 0x1a4) 156 if tfd >= 0 { 157 cc_w(tfd, "# nx_container_compose plan -- dependency-ordered, readiness-gated launch (sovereign docker-compose)\n" as *u8) 158 if r1b > 0 { var p2: i64 = 0; while p2 < r1b { cc_w(tfd, "start\t" as *u8); cc_w(tfd, (names as i64 + order[p2] * CNL) as *u8); cc_w(tfd, "\twait-ready-then-next\n" as *u8); p2 = p2 + 1 } } 159 sys_close(tfd) 160 } 161 cc_p(" t1=" as *u8); cc_pn(t1); cc_p(" t2=" as *u8); cc_pn(t2); cc_p(" t3=" as *u8); cc_pn(t3); cc_p("\n" as *u8) 162 var pass: i64 = 0 163 if t1 == 1 { if t2 == 1 { if t3 == 1 { pass = 1 } } } 164 if pass == 1 { 165 cc_p("CONTAINERCOMPOSEGATE verdict=GREEN (topo order correct; cycle + missing-dep rejected; plan emitted)\n" as *u8) 166 cc_p("plan -> knowledge/status/container_compose.tsv\n" as *u8) 167 return 0 168 } 169 cc_p("CONTAINERCOMPOSEGATE verdict=RED (ordering/neg-control failed)\n" as *u8) 170 return 1 171}