@@ -499,4 +499,105 @@ in {
499
499
# pprof type doesn't matter
500
500
'' ;
501
501
} ) ;
502
+ node-backport = let
503
+ networkName = "testnet" ;
504
+ networkName2 = "othernet" ;
505
+ testDomain = "cs" ;
506
+ in let
507
+ node = { token } :
508
+ { pkgs , ... } : {
509
+ imports = [
510
+ base
511
+ self . outputs . nixosModules . ${ system } . node
512
+ ] ;
513
+
514
+ networking . firewall . allowedTCPPorts = [ 39251 ] ;
515
+ qrystal . services . node = csConfig [ networkName networkName2 ] token ;
516
+ systemd . services . qrystal-node . wantedBy = [ ] ;
517
+ } ;
518
+ in lib . runTest ( {
519
+ name = "node-backport" ;
520
+ hostPkgs = pkgs ;
521
+ nodes = {
522
+ node1 = node { token = node1Token ; } ;
523
+ node2 = node { token = node2Token ; } ;
524
+ cs = { pkgs , ... } : {
525
+ imports = [ base self . outputs . nixosModules . ${ system } . cs ] ;
526
+
527
+ networking . firewall . allowedTCPPorts = [ 39252 ] ;
528
+ qrystal . services . cs = {
529
+ enable = true ;
530
+ config = {
531
+ tls = csTls ;
532
+ tokens = [
533
+ ( nodeToken "node1" node1Hash [ networkName networkName2 ] )
534
+ ( nodeToken "node2" node2Hash [ networkName networkName2 ] )
535
+ ] ;
536
+ central . networks . ${ networkName } = networkBase // {
537
+ peers . node1 = {
538
+ host = "node1:58120" ;
539
+ allowedIPs = [ "10.123.0.1/32" ] ;
540
+ canSee . only = [ "node2" ] ;
541
+ } ;
542
+ peers . node2 = {
543
+ host = "node2:58120" ;
544
+ allowedIPs = [ "10.123.0.2/32" ] ;
545
+ canSee . only = [ "node1" ] ;
546
+ } ;
547
+ } ;
548
+ central . networks . ${ networkName2 } = networkBase // {
549
+ keepalive = "10s" ;
550
+ listenPort = 58121 ;
551
+ ips = [ "10.45.0.1/16" ] ;
552
+ peers . node1 = {
553
+ host = "node1:58121" ;
554
+ allowedIPs = [ "10.45.0.1/32" ] ;
555
+ canSee . only = [ "node2" ] ;
556
+ } ;
557
+ peers . node2 = {
558
+ host = "node2:58121" ;
559
+ allowedIPs = [ "10.45.0.2/32" ] ;
560
+ canSee . only = [ "node1" ] ;
561
+ } ;
562
+ } ;
563
+ } ;
564
+ } ;
565
+ } ;
566
+ } ;
567
+ testScript = { nodes , ... } : ''
568
+ nodes = [node1, node2]
569
+ addrs = ["10.123.0.2", "10.123.0.1"]
570
+ cs.start()
571
+ cs.wait_for_unit("qrystal-cs.service")
572
+ for node in nodes:
573
+ node.start()
574
+ node.systemctl("start qrystal-node.service")
575
+ node.wait_for_unit("qrystal-node.service", timeout=20)
576
+ print("all nodes started")
577
+ # NOTE: there is a race condition where the peers' pubkeys could not be
578
+ # set yet when pinged (so that's why we're using wait_until_*
579
+ for i, node in enumerate(nodes):
580
+ print(node.wait_until_succeeds("wg show"))
581
+ print(node.wait_until_succeeds("wg show ${ networkName } "))
582
+ print(node.wait_until_succeeds("wg show ${ networkName2 } "))
583
+ print(node.execute("cat /etc/wireguard/${ networkName } .conf")[1])
584
+ print(node.execute("ip route show")[1])
585
+ for addr in addrs:
586
+ print(node.execute(f"ip route get {addr}")[1])
587
+ for i, node in enumerate(nodes):
588
+ print(node.execute(f"ping -c 1 {addrs[i]}")[1])
589
+ node.wait_until_succeeds(f"ping -c 1 {addrs[i]}")
590
+ cs.crash() # bye bye
591
+ # 1st, nodes must survive CS crashing
592
+ for i, node in enumerate(nodes):
593
+ print(node.execute(f"ping -c 1 {addrs[i]}")[1])
594
+ node.wait_until_succeeds(f"ping -c 1 {addrs[i]}")
595
+ # 2nd, nodes must survive CS crashing + restart
596
+ for i, node in enumerate(nodes):
597
+ node.systemctl("restart qrystal-node.service")
598
+ for i, node in enumerate(nodes):
599
+ print(node.execute(f"ping -c 1 {addrs[i]}")[1])
600
+ node.wait_until_succeeds(f"ping -c 1 {addrs[i]}")
601
+ '' ;
602
+ } ) ;
502
603
}
0 commit comments