launch 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. #!/usr/bin/env python3
  2. import argparse
  3. import os
  4. import shlex
  5. import subprocess
  6. import sys
  7. import threading
  8. import yaml
  9. sys.path.insert(0, os.getcwd())
  10. import mkconfig
  11. # The default manifest file
  12. MANIFEST = "manifest.yaml"
  13. # The default pubkeys file
  14. PUBKEYS = "pubkeys.yaml"
  15. # The TEEMS binary
  16. TEEMS = "./teems"
  17. def launch(node, manifest, config):
  18. manifestdata = manifest[node]
  19. cmdline = ''
  20. if 'launchprefix' in manifestdata:
  21. cmdline = manifestdata['launchprefix'] + ' '
  22. cmdline += TEEMS + " %s %s" % (manifestdata['sprvfile'], node)
  23. if 'args' in manifestdata:
  24. cmdline += ' ' + manifestdata['args']
  25. proc = subprocess.Popen(shlex.split(cmdline), stdin=subprocess.PIPE,
  26. stdout=subprocess.PIPE, stderr=subprocess.STDOUT, bufsize=0)
  27. proc.stdin.write(config.encode('utf-8'))
  28. while True:
  29. line = proc.stdout.readline()
  30. if not line:
  31. break
  32. print(node + ": " + line.decode('utf-8'), end='', flush=True)
  33. if __name__ == "__main__":
  34. aparse = argparse.ArgumentParser(
  35. description='Launch TEEMS nodes'
  36. )
  37. aparse.add_argument('-m', default=MANIFEST,
  38. help='manifest.yaml file')
  39. aparse.add_argument('-p', default=PUBKEYS,
  40. help='pubkeys.yaml file')
  41. aparse.add_argument('-z', default=None,
  42. help='override message size')
  43. aparse.add_argument('-u', default=None,
  44. help='override max number of users')
  45. aparse.add_argument('-B', default=None,
  46. help='override max number of outgoing private messages per user per epoch')
  47. aparse.add_argument('-b', default=None,
  48. help='override max number of incoming private messages per user per epoch')
  49. aparse.add_argument('-C', default=None,
  50. help='override max number of outgoing public messages per user per epoch')
  51. aparse.add_argument('-c', default=None,
  52. help='override max number of incoming public messages per user per epoch')
  53. aparse.add_argument('-n', nargs='*', help='nodes to include')
  54. aparse.add_argument('cmd', nargs='*', help='experiment to run')
  55. args = aparse.parse_args()
  56. with open(args.m) as mf:
  57. manifest = yaml.safe_load(mf)
  58. params_overrides = {
  59. 'msg_size': args.z,
  60. 'user_count': args.u,
  61. 'priv_out': args.B,
  62. 'priv_in': args.b,
  63. 'pub_out': args.C,
  64. 'pub_in': args.c,
  65. }
  66. config = mkconfig.create_json(args.m, args.p, args.n, params_overrides)
  67. # There must not be any newlines in the config json string
  68. if "\n" in config:
  69. print("Error: config.json must not contain embedded newlines")
  70. sys.exit(1)
  71. # Now add a trailing newline
  72. config += "\n"
  73. nodelist = args.n
  74. if nodelist is None or len(nodelist) == 0:
  75. nodelist = manifest.keys()
  76. threadlist = []
  77. for node in nodelist:
  78. if node == "params":
  79. continue
  80. thread = threading.Thread(target=launch,
  81. args=(node, manifest, config))
  82. thread.start()
  83. threadlist.append(thread)
  84. for thread in threadlist:
  85. thread.join()