def execute(self): if self.static: self.disabled('test') command_args, args = utilities.remove_args(self.command_args, self.args, ['--destroy']) for task in self.molecule._config.config['molecule']['test'][ 'sequence']: command = getattr(sys.modules[__name__], task.capitalize()) c = command(command_args, args) status, output = c.execute(exit=False) if self.args.get('--destroy') == 'always': c = Destroy(command_args, args) c.execute() return None, None if self.args.get('--destroy') == 'never': return None, None # passing (default) if status is None: c = Destroy(command_args, args) c.execute() return None, None # error encountered during test sys.exit(status)
def execute(self): if self.static: self.disabled('test') command_args, args = utilities.remove_args(self.command_args, self.args, ['--destroy']) for task in self.molecule._config.config['molecule']['test']['sequence']: command = getattr(sys.modules[__name__], task.capitalize()) c = command(command_args, args) status, output = c.execute(exit=False) if self.args.get('--destroy') == 'always': c = Destroy(command_args, args) c.execute() return None, None if self.args.get('--destroy') == 'never': return None, None # passing (default) if status is None: c = Destroy(command_args, args) c.execute() return None, None # error encountered during test sys.exit(status)
def test_remove_args(self): test_list = ['tags', 'molecule1', 'platform', 'ubuntu', 'tags', 'molecule2'] test_dict = {'tags': 'molecule1', 'platform': 'ubuntu'} expected_list = ['platform', 'ubuntu'] expected_dict = {'platform': 'ubuntu'} actual_list, actual_dict = utilities.remove_args(test_list, test_dict, ['tags']) self.assertEqual(actual_list, expected_list) self.assertEqual(actual_dict, expected_dict)
def test_remove_args(self): test_list = ["tags", "molecule1", "platform", "ubuntu", "tags", "molecule2"] test_dict = {"tags": "molecule1", "platform": "ubuntu"} expected_list = ["platform", "ubuntu"] expected_dict = {"platform": "ubuntu"} actual_list, actual_dict = utilities.remove_args(test_list, test_dict, ["tags"]) self.assertEqual(actual_list, expected_list) self.assertEqual(actual_dict, expected_dict)
def execute(self): if self.static: self.disabled('test') command_args, args = utilities.remove_args( self.command_args, self.args, self.command_args) for task in self.molecule._config.config['molecule']['test'][ 'sequence']: command_module = getattr(molecule.commands, task) command = getattr(command_module, task.capitalize()) c = command(command_args, args) for argument in self.command_args: if argument in c.args: c.args[argument] = self.args[argument] status, output = c.execute(exit=False) # Fail fast if status is not 0 and status is not None: utilities.logger.error(output) utilities.sysexit(status) if self.args.get('--destroy') == 'always': c = molecule.commands.destroy.Destroy(command_args, args) c.execute() return None, None if self.args.get('--destroy') == 'never': return None, None # passing (default) if status is None: c = molecule.commands.destroy.Destroy(command_args, args) c.execute() return None, None # error encountered during test utilities.sysexit(status)
def execute(self, idempotent=False, create_instances=True, create_inventory=True, exit=True, hide_errors=True): """ :param idempotent: Optionally provision servers quietly so output can be parsed for idempotence :param create_inventory: Toggle inventory creation :param create_instances: Toggle instance creation :return: Provisioning output """ if self.molecule._state.get('created'): create_instances = False if self.molecule._state.get('converged'): create_inventory = False if self.static: create_instances = False create_inventory = False if create_instances and not idempotent: command_args, args = utilities.remove_args(self.command_args, self.args, ['--tags']) c = Create(command_args, args, self.molecule) c.execute() if create_inventory: self.molecule._create_inventory_file() # install role dependencies only during `molecule converge` if not idempotent and 'requirements_file' in self.molecule._config.config[ 'ansible']: print('{}Installing role dependencies ...{}'.format( colorama.Fore.CYAN, colorama.Fore.RESET)) galaxy_install = AnsibleGalaxyInstall(self.molecule._config.config[ 'ansible']['requirements_file']) galaxy_install.add_env_arg( 'ANSIBLE_CONFIG', self.molecule._config.config['ansible']['config_file']) galaxy_install.bake() output = galaxy_install.execute() ansible = AnsiblePlaybook(self.molecule._config.config['ansible']) # params to work with provisioner for k, v in self.molecule._provisioner.ansible_connection_params.items( ): ansible.add_cli_arg(k, v) # target tags passed in via CLI if self.molecule._args.get('--tags'): ansible.add_cli_arg('tags', self.molecule._args['--tags'].pop(0)) if idempotent: ansible.remove_cli_arg('_out') ansible.remove_cli_arg('_err') ansible.add_env_arg('ANSIBLE_NOCOLOR', 'true') ansible.add_env_arg('ANSIBLE_FORCE_COLOR', 'false') # Save the previous callback plugin if any. callback_plugin = ansible.env.get('ANSIBLE_CALLBACK_PLUGINS', '') # Set the idempotence plugin. if callback_plugin: ansible.add_env_arg( 'ANSIBLE_CALLBACK_PLUGINS', callback_plugin + ':' + os.path.join( sys.prefix, 'share/molecule/ansible/plugins/callback/idempotence')) else: ansible.add_env_arg('ANSIBLE_CALLBACK_PLUGINS', os.path.join( sys.prefix, 'share/molecule/ansible/plugins/callback/idempotence')) ansible.bake() if self.molecule._args.get('--debug'): ansible_env = {k: v for (k, v) in ansible.env.items() if 'ANSIBLE' in k} other_env = {k: v for (k, v) in ansible.env.items() if 'ANSIBLE' not in k} utilities.debug('OTHER ENVIRONMENT', yaml.dump(other_env, default_flow_style=False, indent=2)) utilities.debug('ANSIBLE ENVIRONMENT', yaml.dump(ansible_env, default_flow_style=False, indent=2)) utilities.debug('ANSIBLE PLAYBOOK', str(ansible.ansible)) status, output = ansible.execute(hide_errors=hide_errors) if status is not None: if exit: sys.exit(status) return status, None if not self.molecule._state.get('converged'): self.molecule._state['converged'] = True self.molecule._write_state_file() return None, output
def execute(self, idempotent=False, create_instances=True, create_inventory=True, exit=True, hide_errors=True): """ :param idempotent: Optionally provision servers quietly so output can be parsed for idempotence :param create_inventory: Toggle inventory creation :param create_instances: Toggle instance creation :return: Provisioning output """ if self.molecule._state.get('created'): create_instances = False if self.molecule._state.get('converged'): create_inventory = False if self.static: create_instances = False create_inventory = False if create_instances and not idempotent: command_args, args = utilities.remove_args(self.command_args, self.args, ['--tags']) c = Create(command_args, args, self.molecule) c.execute() if create_inventory: self.molecule._create_inventory_file() # install role dependencies only during `molecule converge` if not idempotent and 'requirements_file' in self.molecule._config.config[ 'ansible']: print('{}Installing role dependencies ...{}'.format( Fore.CYAN, Fore.RESET)) galaxy_install = AnsibleGalaxyInstall( self.molecule._config.config['ansible']['requirements_file']) galaxy_install.add_env_arg( 'ANSIBLE_CONFIG', self.molecule._config.config['ansible']['config_file']) galaxy_install.bake() output = galaxy_install.execute() ansible = AnsiblePlaybook(self.molecule._config.config['ansible']) # target tags passed in via CLI if self.molecule._args.get('--tags'): ansible.add_cli_arg('tags', self.molecule._args['--tags'].pop(0)) if idempotent: ansible.remove_cli_arg('_out') ansible.remove_cli_arg('_err') ansible.add_env_arg('ANSIBLE_NOCOLOR', 'true') ansible.add_env_arg('ANSIBLE_FORCE_COLOR', 'false') # Save the previous callback plugin if any. callback_plugin = ansible.env.get('ANSIBLE_CALLBACK_PLUGINS', '') # Set the idempotence plugin. if callback_plugin: ansible.add_env_arg( 'ANSIBLE_CALLBACK_PLUGINS', callback_plugin + ':' + os.path.join( sys.prefix, 'share/molecule/ansible/plugins/callback/idempotence')) else: ansible.add_env_arg( 'ANSIBLE_CALLBACK_PLUGINS', os.path.join( sys.prefix, 'share/molecule/ansible/plugins/callback/idempotence')) ansible.bake() if self.molecule._args.get('--debug'): ansible_env = { k: v for (k, v) in ansible.env.items() if 'ANSIBLE' in k } other_env = { k: v for (k, v) in ansible.env.items() if 'ANSIBLE' not in k } utilities.debug( 'OTHER ENVIRONMENT', yaml.dump(other_env, default_flow_style=False, indent=2)) utilities.debug( 'ANSIBLE ENVIRONMENT', yaml.dump(ansible_env, default_flow_style=False, indent=2)) utilities.debug('ANSIBLE PLAYBOOK', str(ansible.ansible)) status, output = ansible.execute(hide_errors=hide_errors) if status is not None: if exit: sys.exit(status) return status, None if not self.molecule._state.get('converged'): self.molecule._state['converged'] = True self.molecule._write_state_file() return None, output