Example #1
0
    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)
Example #2
0
    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)
Example #3
0
 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)
Example #4
0
 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)
Example #5
0
 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)
Example #6
0
    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)
Example #7
0
    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
Example #8
0
    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