def test_op_line_numbers(self): inventory = make_inventory() state = State(inventory, Config()) connect_all(state) # Add op to both hosts add_op(state, server.shell, 'echo "hi"') pyinfra.is_cli = True # Add op to just the second host - using the pseudo modules such that # it replicates a deploy file. pseudo_state.set(state) pseudo_host.set(inventory['anotherhost']) first_pseudo_hash = server.user('anotherhost_user').hash first_pseudo_call_line = getframeinfo(currentframe()).lineno - 1 # Add op to just the first host - using the pseudo modules such that # it replicates a deploy file. pseudo_state.set(state) pseudo_host.set(inventory['somehost']) second_pseudo_hash = server.user('somehost_user').hash second_pseudo_call_line = getframeinfo(currentframe()).lineno - 1 pseudo_state.reset() pseudo_host.reset() pyinfra.is_cli = False # Ensure there are two ops op_order = state.get_op_order() assert len(op_order) == 3 # And that the two ops above were called in the expected order assert op_order[1] == first_pseudo_hash assert op_order[2] == second_pseudo_hash # And that they have the expected line numbers assert state.op_line_numbers_to_hash.get( (0, first_pseudo_call_line)) == first_pseudo_hash assert state.op_line_numbers_to_hash.get( (0, second_pseudo_call_line)) == second_pseudo_hash # Ensure somehost has two ops and anotherhost only has the one assert len(state.ops[inventory.get_host('somehost')]) == 2 assert len(state.ops[inventory.get_host('anotherhost')]) == 2
def test_pseudo_host_class_attr(self): host = _create_host() pseudo_host.set(host) assert pseudo_host.isset() is True with self.assertRaises(AttributeError): host.hello setattr(Host, 'hello', 'class_world') setattr(host, 'hello', 'instance_world') assert pseudo_host.hello == host.hello # Reset and check fallback to class variable pseudo_host.reset() assert pseudo_host.isset() is False assert pseudo_host.hello == 'class_world'
def load_deploy_file(state, filename): state.current_deploy_filename = filename # Copy the inventory hosts (some might be removed during deploy) hosts = list(state.inventory.iter_active_hosts()) for host in hosts: pseudo_host.set(host) exec_file(filename) logger.info('{0}{1} {2}'.format( host.print_prefix, click.style('Ready:', 'green'), click.style(filename, bold=True), )) # Remove any pseudo host pseudo_host.reset()
def load_deploy_file(state, filename): # Copy the inventory hosts (some might be removed during deploy) hosts = list(state.inventory) for host in hosts: if not state.is_host_in_limit(host): continue pseudo_host.set(host) exec_file(filename) logger.info('{0}{1} {2}'.format( host.print_prefix, click.style('Ready:', 'green'), click.style(filename, bold=True), )) # Remove any pseudo host pseudo_host.reset()
def load_deploy_file(state, filename, progress): for host in state.inventory: pseudo_host.set(host) exec_file(filename) state.ready_host(host) progress() logger.info('{0} {1} {2}'.format( '[{}]'.format(click.style(host.name, bold=True)), click.style('Ready:', 'green'), click.style(filename, bold=True), )) # Remove any pseudo host pseudo_host.reset() # Un-ready the hosts - this is so that any hooks or callbacks during the # deploy can still use facts as expected. state.ready_host_names = set()
def load_deploy_file(state, filename): # Copy the inventory hosts (some might be removed during deploy) hosts = list(state.inventory) for host in hosts: # Don't load for anything within our (top level, --limit) limit if (isinstance(state.limit_hosts, list) and host not in state.limit_hosts): continue pseudo_host.set(host) exec_file(filename) logger.info('{0}{1} {2}'.format( host.print_prefix, click.style('Ready:', 'green'), click.style(filename, bold=True), )) # Remove any pseudo host pseudo_host.reset()
if arguments['su_user']: config.SU_USER = arguments['su_user'] if arguments['parallel']: config.PARALLEL = arguments['parallel'] # If --debug-data dump & exit if arguments['debug_data']: print_data(inventory) _exit() # Load any hooks/config from the deploy file w/fake state & host pseudo_state.set(FakeState()) pseudo_host.set(FakeHost()) load_deploy_config(arguments['deploy'], config) pseudo_host.reset() pseudo_state.reset() # Create/set the state state = State(inventory, config) state.is_cli = True state.deploy_dir = deploy_dir # Setup printing on the new state print_output = arguments['verbose'] > 0 if arguments['deploy'] is None and arguments['op'] is None: print_fact_output = print_output else: print_fact_output = arguments['verbose'] > 1 state.print_output = print_output # -v