def start_cluster(self, reactor): # Destroy the box to begin, so that we are guaranteed # a clean build. yield run(reactor, ['vagrant', 'destroy', '-f'], path=self.vagrant_path.path) if self.package_source.version: env = extend_environ(FLOCKER_BOX_VERSION=vagrant_version( self.package_source.version)) else: env = os.environ # Boot the VMs yield run(reactor, ['vagrant', 'up'], path=self.vagrant_path.path, env=env) for node in self.NODE_ADDRESSES: yield remove_known_host(reactor, node) nodes = pvector( ManagedNode(address=address, distribution=self.distribution) for address in self.NODE_ADDRESSES) certificates = Certificates(self.certificates_path) cluster = Cluster(all_nodes=pvector(nodes), control_node=nodes[0], agent_nodes=nodes, dataset_backend=self.dataset_backend, certificates=certificates) returnValue(cluster)
def main(reactor, args, base_path, top_level): try: options = TestBrewOptions() try: options.parseOptions(args) except UsageError as e: sys.stderr.write("Error: {error}.\n".format(error=str(e))) sys.exit(1) eliot_to_stdout(MESSAGE_FORMATS, {}) recipe_url = options['recipe_url'] options['vmpath'] = FilePath(options['vmpath']) # Open the recipe URL just to validate and verify that it exists. # We do not need to read its content. urllib2.urlopen(recipe_url) yield run(reactor, [ "vmrun", "revertToSnapshot", options['vmpath'].path, options['vmsnapshot'], ]) yield run(reactor, [ "vmrun", "start", options['vmpath'].path, "nogui", ]) yield perform( make_dispatcher(reactor), run_remotely( username=options['vmuser'], address=options['vmhost'], commands=sequence([ task_configure_brew_path(), task_test_homebrew(recipe_url), ]), ), ) yield run(reactor, [ "vmrun", "stop", options['vmpath'].path, "hard", ]) print "Done." except ProcessTerminated as e: sys.stderr.write( ("Error: Command terminated with exit status {code}.\n").format( code=e.exitCode)) raise
def run_tests(reactor, cluster, trial_args): """ Run the acceptance tests. :param Cluster cluster: The cluster to run acceptance tests against. :param list trial_args: Arguments to pass to trial. If not provided, defaults to ``['flocker.acceptance']``. :return int: The exit-code of trial. """ if not trial_args: trial_args = ['--rterrors', 'flocker.acceptance'] def check_result(f): f.trap(ProcessTerminated) if f.value.exitCode is not None: return f.value.exitCode else: return f return run( reactor, ['trial'] + list(trial_args), env=extend_environ( **get_trial_environment(cluster) )).addCallbacks( callback=lambda _: 0, errback=check_result, )
def run_tests(reactor, cluster, trial_args): """ Run the acceptance tests. :param Cluster cluster: The cluster to run acceptance tests against. :param list trial_args: Arguments to pass to trial. If not provided, defaults to ``['flocker.acceptance']``. :return int: The exit-code of trial. """ if not trial_args: trial_args = ['--rterrors', 'flocker.acceptance'] def check_result(f): f.trap(ProcessTerminated) if f.value.exitCode is not None: return f.value.exitCode else: return f return run( reactor, ['trial'] + list(trial_args), env=extend_environ( **get_trial_environment(cluster) ) ).addCallbacks( callback=lambda _: 0, errback=check_result, )
def main(reactor, args, base_path, top_level): try: options = TestBrewOptions() try: options.parseOptions(args) except UsageError as e: sys.stderr.write("Error: {error}.\n".format(error=str(e))) sys.exit(1) add_destination(eliot_output) recipe_url = options['recipe_url'] options['vmpath'] = FilePath(options['vmpath']) # Open the recipe URL just to validate and verify that it exists. # We do not need to read its content. urllib2.urlopen(recipe_url) yield run(reactor, [ "vmrun", "revertToSnapshot", options['vmpath'].path, options['vmsnapshot'], ]) yield run(reactor, [ "vmrun", "start", options['vmpath'].path, "nogui", ]) yield perform( make_dispatcher(reactor), run_remotely( username=options['vmuser'], address=options['vmhost'], commands=sequence([ task_configure_brew_path(), task_test_homebrew(recipe_url), ]), ), ) yield run(reactor, [ "vmrun", "stop", options['vmpath'].path, "hard", ]) print "Done." except ProcessTerminated as e: sys.stderr.write( ( "Error: Command terminated with exit status {code}.\n" ).format(code=e.exitCode) ) raise
def remove_known_host(reactor, hostname): """ Remove all keys belonging to hostname from a known_hosts file. :param reactor: Reactor to use. :param bytes hostname: Remove all keys belonging to this hostname from known_hosts. """ return run(reactor, ['ssh-keygen', '-R', hostname])
def start_cluster(self, reactor): # Destroy the box to begin, so that we are guaranteed # a clean build. yield run( reactor, ['vagrant', 'destroy', '-f'], path=self.vagrant_path.path) if self.package_source.version: env = extend_environ( FLOCKER_BOX_VERSION=vagrant_version( self.package_source.version)) else: env = os.environ # Boot the VMs yield run( reactor, ['vagrant', 'up'], path=self.vagrant_path.path, env=env) for node in self.NODE_ADDRESSES: yield remove_known_host(reactor, node) nodes = pvector( ManagedNode(address=address, distribution=self.distribution) for address in self.NODE_ADDRESSES ) certificates = Certificates(self.certificates_path) # Default volume size is meaningless here as Vagrant only uses ZFS, and # not a block device backend. # XXX Change ``Cluster`` to not require default_volume_size default_volume_size = int(GiB(1).to_Byte().value) cluster = Cluster( all_nodes=pvector(nodes), control_node=nodes[0], agent_nodes=nodes, dataset_backend=self.dataset_backend, certificates=certificates, default_volume_size=default_volume_size, ) returnValue(cluster)
def start_cluster(self, reactor): # Destroy the box to begin, so that we are guaranteed # a clean build. yield run( reactor, ['vagrant', 'destroy', '-f'], path=self.vagrant_path.path) if self.package_source.version: env = extend_environ( FLOCKER_BOX_VERSION=vagrant_version( self.package_source.version)) else: env = os.environ # Boot the VMs yield run( reactor, ['vagrant', 'up'], path=self.vagrant_path.path, env=env) for node in self.NODE_ADDRESSES: yield remove_known_host(reactor, node) nodes = pvector( ManagedNode(address=address, distribution=self.distribution) for address in self.NODE_ADDRESSES ) certificates = Certificates(self.certificates_path) cluster = Cluster( all_nodes=pvector(nodes), control_node=nodes[0], agent_nodes=nodes, dataset_backend=self.dataset_backend, certificates=certificates ) returnValue(cluster)
def perform_packer_build(self, dispatcher, intent): """ Run ``packer build`` using the configuration in the supplied ``intent`` and parse its output. :returns: A ``Deferred`` which fires with a dict mapping the ID of the AMI published to each AWS region. """ command = [PACKER_PATH.path, 'build', '-machine-readable', intent.configuration_path.path] parser = _PackerOutputParser() def handle_stdout(line): parser.parse_line(line) self.sys_module.stderr.write(line + "\n") d = run(self.reactor, command, handle_stdout=handle_stdout) d.addCallback(lambda ignored: parser.packer_amis()) return d
def perform_packer_build(self, dispatcher, intent): """ Run ``packer build`` using the configuration in the supplied ``intent`` and parse its output. :returns: A ``Deferred`` which fires with a dict mapping the ID of the AMI published to each AWS region. """ command = [ PACKER_PATH.path, 'build', '-machine-readable', intent.configuration_path.path ] parser = _PackerOutputParser() def handle_stdout(line): parser.parse_line(line) self.sys_module.stderr.write(line + "\n") d = run(self.reactor, command, handle_stdout=handle_stdout) d.addCallback(lambda ignored: parser.packer_amis()) return d
def stop_cluster(self, reactor): return run( reactor, ['vagrant', 'destroy', '-f'], path=self.vagrant_path.path)