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}