bind10_control.py 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. from lettuce import *
  2. import subprocess
  3. def check_lines(output, lines):
  4. for line in lines:
  5. if output.find(line) != -1:
  6. return line
  7. @world.absorb
  8. def wait_for_output_lines_stdout(process_name, lines, examine_past = True):
  9. assert process_name in world.processes
  10. if examine_past:
  11. for output in world.processes_stdout[process_name]:
  12. for line in lines:
  13. if output.find(line) != -1:
  14. return line
  15. found = False
  16. while not found:
  17. output = world.processes[process_name].stdout.readline()
  18. # store any line, for examine_skipped
  19. world.processes_stdout[process_name].append(output)
  20. for line in lines:
  21. if output.find(line) != -1:
  22. return line
  23. @world.absorb
  24. def wait_for_output_lines_stderr(process_name, lines, examine_past = True):
  25. assert process_name in world.processes,\
  26. "No process named '" + process_name + "' known"
  27. if examine_past:
  28. for output in world.processes_stderr[process_name]:
  29. for line in lines:
  30. if output.find(line) != -1:
  31. return line
  32. found = False
  33. while not found:
  34. output = world.processes[process_name].stderr.readline()
  35. # store any line, for examine_skipped
  36. world.processes_stderr[process_name].append(output)
  37. for line in lines:
  38. if output.find(line) != -1:
  39. return line
  40. @step('start bind10(?: with configuration (\S+))?' +\
  41. '(?: with cmdctl port (\d+))?(?: as (\S+))?')
  42. def start_bind10(step, config_file, cmdctl_port, process_name):
  43. args = [ 'bind10', '-v' ]
  44. if config_file is not None:
  45. args.append('-p')
  46. args.append("configurations/")
  47. args.append('-c')
  48. args.append(config_file)
  49. if cmdctl_port is None:
  50. args.append('--cmdctl-port=47805')
  51. else:
  52. args.append('--cmdctl-port=' + cmdctl_port)
  53. if process_name is None:
  54. process_name = "bind10"
  55. else:
  56. args.append('-m')
  57. args.append(process_name + '_msgq.socket')
  58. assert process_name not in world.processes,\
  59. "There already seems to be a process named " + process_name
  60. world.processes[process_name] = subprocess.Popen(args, 1, None,
  61. subprocess.PIPE,
  62. subprocess.PIPE,
  63. subprocess.PIPE)
  64. world.processes_stdout[process_name] = []
  65. world.processes_stderr[process_name] = []
  66. # check output to know when startup has been completed
  67. # TODO what to do on failure?
  68. message = world.wait_for_output_lines_stderr(process_name,
  69. ["BIND10_STARTUP_COMPLETE",
  70. "BIND10_STARTUP_ERROR"])
  71. assert message == "BIND10_STARTUP_COMPLETE", "Got: " + message
  72. @step('wait for bind10 auth (?:of (\w+) )?to start')
  73. def wait_for_auth(step, process_name):
  74. if process_name is None:
  75. process_name = "bind10"
  76. world.wait_for_output_lines_stderr(process_name, ['AUTH_SERVER_STARTED'])
  77. @step('have bind10 running(?: with configuration ([\w.]+))?')
  78. def have_bind10_running(step, config_file):
  79. step.given('start bind10 with configuration ' + config_file)
  80. step.given('wait for bind10 auth to start')
  81. @step('set bind10 configuration (\S+) to (.*)')
  82. def set_config_command(step, name, value):
  83. args = ['bindctl', '-p', '47805']
  84. bindctl = subprocess.Popen(args, 1, None, subprocess.PIPE,
  85. subprocess.PIPE, None)
  86. bindctl.stdin.write("config set " + name + " " + value + "\n")
  87. bindctl.stdin.write("config commit\n")
  88. bindctl.stdin.write("quit\n")
  89. result = bindctl.wait()
  90. assert result == 0, "bindctl exit code: " + str(result)