code wiki / _hdl_build / nx_consul_dns_test.nx
nx_consul_dns_test.nx source
↩ module page · 71 lines · 4805 B
1// nx_consul_dns_test.nx -- CDNSGATE: proves the sovereign service-DNS interface. Same registry as CONSUL-001
2// (web: addr10 PASSING / addr11 CRITICAL / addr12 PASSING; db addr20 PASSING; cache addr30 WARNING). GREEN iff:
3// resolve(web) returns exactly the 2 healthy A-records {10,12} (the CRITICAL 11 is NEVER in DNS); resolve(db)
4// returns its 1 addr; unknown service returns 0 A-records; the FQDN suffix gate accepts *.service.nishi and
5// rejects others; resolution is DYNAMIC (an instance going CRITICAL drops from the A-records); deregistering
6// the last healthy instance yields 0 A-records (NXDOMAIN). exit 0 on 7/7.
7import "nx_consul_dns.nx"
8import "nx_syscalls.nx"
9
10func dg_puts(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(1, s, n); return 0 }
11func dg_num(v: i64) -> i64 { let b: *u8 = sys_mmap(28); var m: i64=v; if m<0 {m=0-m;sys_write(1,"-" as *u8,1)}; let t: *u8 = sys_mmap(28); var k: i64=0; if m==0 {t[0]=48;k=1}; while m>0 {t[k]=48+(m%10); m=m/10; k=k+1}; var i: i64=0; while i<k {b[i]=t[k-1-i]; i=i+1}; sys_write(1,b,k); return 0 }
12
13func main() -> i64 {
14 dg_puts("=== SOVEREIGN SERVICE-DNS (<svc>.service.nishi -> healthy A-records) ===\n" as *u8)
15 let n: i64 = 5
16 let reg: *i64 = sys_mmap(40) as *i64
17 let names: *i64 = sys_mmap(40) as *i64
18 let addrs: *i64 = sys_mmap(40) as *i64
19 let healths: *i64 = sys_mmap(40) as *i64
20 reg[0]=1; names[0]=100; addrs[0]=10; healths[0]=SVC_PASSING
21 reg[1]=1; names[1]=100; addrs[1]=11; healths[1]=SVC_CRITICAL
22 reg[2]=1; names[2]=100; addrs[2]=12; healths[2]=SVC_PASSING
23 reg[3]=1; names[3]=200; addrs[3]=20; healths[3]=SVC_PASSING
24 reg[4]=1; names[4]=300; addrs[4]=30; healths[4]=SVC_WARNING
25
26 let outw: *i64 = sys_mmap(64) as *i64
27 let cweb: i64 = csd_resolve(reg, names, addrs, healths, n, 100, outw)
28 // the two A-records must be 10 and 12 (sum 22), and 11 must NOT appear
29 var sumw: i64 = 0; var has11: i64 = 0; var k: i64 = 0
30 while k < cweb { sumw = sumw + outw[k]; if outw[k] == 11 { has11 = 1 } k = k + 1 }
31
32 let outd: *i64 = sys_mmap(64) as *i64
33 let cdb: i64 = csd_resolve(reg, names, addrs, healths, n, 200, outd)
34 let outu: *i64 = sys_mmap(64) as *i64
35 let cunk: i64 = csd_resolve(reg, names, addrs, healths, n, 999, outu)
36
37 let fqdn_ok: i64 = csd_is_service_fqdn("web.service.nishi" as *u8, 17)
38 let fqdn_bad: i64 = csd_is_service_fqdn("web.example.com" as *u8, 15)
39
40 // dynamic: addr10 (idx0) goes CRITICAL -> web A-records drop to {12}
41 healths[0] = SVC_CRITICAL
42 let outw2: *i64 = sys_mmap(64) as *i64
43 let cweb2: i64 = csd_resolve(reg, names, addrs, healths, n, 100, outw2)
44 // deregister the last healthy web instance (idx2, addr12) -> web resolves to 0 (NXDOMAIN)
45 cs_deregister(reg, 2)
46 let outw3: *i64 = sys_mmap(64) as *i64
47 let cweb3: i64 = csd_resolve(reg, names, addrs, healths, n, 100, outw3)
48
49 dg_puts(" web A-records=" as *u8); dg_num(cweb); dg_puts(" sum=" as *u8); dg_num(sumw); dg_puts(" has_critical_11=" as *u8); dg_num(has11)
50 dg_puts(" | db=" as *u8); dg_num(cdb); dg_puts(" unknown=" as *u8); dg_num(cunk)
51 dg_puts(" | fqdn ok=" as *u8); dg_num(fqdn_ok); dg_puts(" bad=" as *u8); dg_num(fqdn_bad)
52 dg_puts(" | after-crit web=" as *u8); dg_num(cweb2); dg_puts(" after-dereg web=" as *u8); dg_num(cweb3); dg_puts("\n" as *u8)
53
54 let r: *i64 = sys_mmap(8*8) as *i64
55 r[0] = 0; if cweb == 2 { if sumw == 22 { if has11 == 0 { r[0] = 1 } } } // 2 healthy A-records {10,12}, critical excluded
56 r[1] = 0; if cdb == 1 { if outd[0] == 20 { r[1] = 1 } } // db resolves to its addr
57 r[2] = 0; if cunk == 0 { r[2] = 1 } // unknown service -> 0 A-records
58 r[3] = 0; if fqdn_ok == 1 { if fqdn_bad == 0 { r[3] = 1 } } // FQDN suffix gate
59 r[4] = 0; if cweb2 == 1 { if outw2[0] == 12 { r[4] = 1 } } // dynamic: critical drops from DNS
60 r[5] = 0; if cweb3 == 0 { r[5] = 1 } // deregister last -> NXDOMAIN
61 r[6] = 0; if csd_is_service_fqdn("x" as *u8, 1) == 0 { r[6] = 1 } // too-short query not a service FQDN
62
63 var pass: i64 = 0; var i: i64 = 0
64 while i < 7 { pass = pass + r[i]; i = i + 1 }
65 dg_puts("----\n passed " as *u8); dg_num(pass); dg_puts("/7\n" as *u8)
66 if pass == 7 {
67 dg_puts("CDNSGATE service_dns=1 healthy_a_records_only=1 critical_never_in_dns=1 dynamic_on_health=1 dynamic_on_deregister=1 fqdn_suffix_gate=1 exceed[sovereign Consul service-DNS = name->healthy-A-records, health-gated + dynamic; frontends nx_dns_authoritative; bits-up] verdict=GREEN\n" as *u8)
68 sys_exit(0); return 0
69 }
70 dg_puts("CDNSGATE verdict=RED\n" as *u8); sys_exit(1); return 1
71}