Example #1
0
    def test_serialize(self):

        fake_loader = DictDataLoader({
            "/etc/ansible/roles/foo_vars/defaults/main/foo/bar.yml": """
            foo: bar
            """,
            "/etc/ansible/roles/foo_vars/vars/main/bar/foo.yml": """
            foo: bam
            """,
        })

        mock_play = MagicMock()
        mock_play.ROLE_CACHE = {}

        i = RoleInclude.load('foo_vars', play=mock_play, loader=fake_loader)
        r = Role.load(i, play=mock_play)

        res = r.serialize()
        log.debug('res: %s', res)

        self.assertEqual(r._default_vars, dict(foo='bar'))
        self.assertEqual(r._role_vars, dict(foo='bam'))

        r2 = Role.load(i, play=mock_play)
        r2.deserialize(res)

        log.debug('r2: %s', r2)
Example #2
0
    def get_block_list(self, play=None, variable_manager=None, loader=None):

        # only need play passed in when dynamic
        if play is None:
            myplay = self._parent._play
        else:
            myplay = play

        ri = RoleInclude.load(self._role_name, play=myplay, variable_manager=variable_manager, loader=loader)
        ri.vars.update(self.vars)

        # build role
        actual_role = Role.load(ri, myplay, parent_role=self._parent_role, from_files=self._from_files)
        actual_role._metadata.allow_duplicates = self.allow_duplicates

        # save this for later use
        self._role_path = actual_role._role_path

        # compile role with parent roles as dependencies to ensure they inherit
        # variables
        if not self._parent_role:
            dep_chain = []
        else:
            dep_chain = list(self._parent_role._parents)
            dep_chain.append(self._parent_role)

        blocks = actual_role.compile(play=myplay, dep_chain=dep_chain)
        for b in blocks:
            b._parent = self

        # updated available handlers in play
        handlers = actual_role.get_handler_blocks(play=myplay)
        myplay.handlers = myplay.handlers + handlers
        return blocks, handlers
Example #3
0
    def _load_roles(self, attr, ds):
        '''
        Loads and returns a list of RoleInclude objects from the datastructure
        list of role definitions and creates the Role from those objects
        '''

        if ds is None:
            ds = []

        try:
            role_includes = load_list_of_roles(
                ds,
                play=self,
                variable_manager=self._variable_manager,
                loader=self._loader,
                collection_search_list=self.collections)
        except AssertionError as e:
            raise AnsibleParserError(
                "A malformed role declaration was encountered.",
                obj=self._ds,
                orig_exc=e)

        roles = []
        for ri in role_includes:
            roles.append(Role.load(ri, play=self))

        self.roles[:0] = roles

        return self.roles
Example #4
0
    def get_block_list(self, play=None, variable_manager=None, loader=None):

        # only need play passed in when dynamic
        if play is None:
            myplay =  self._parent._play
        else:
            myplay = play

        ri = RoleInclude.load(self._role_name, play=myplay, variable_manager=variable_manager, loader=loader)
        ri.vars.update(self.vars)

        # build role
        actual_role = Role.load(ri, myplay, parent_role=self._parent_role, from_files=self._from_files)
        actual_role._metadata.allow_duplicates = self.allow_duplicates

        # compile role
        blocks = actual_role.compile(play=myplay)

        # set parent to ensure proper inheritance
        for b in blocks:
            b._parent = self

        # updated available handlers in play
        myplay.handlers = myplay.handlers + actual_role.get_handler_blocks(play=myplay)

        return blocks
Example #5
0
    def get_block_list(self, play=None, variable_manager=None, loader=None):

        # only need play passed in when dynamic
        if play is None:
            myplay = self._parent._play
        else:
            myplay = play

        ri = RoleInclude.load(self._role_name,
                              play=myplay,
                              variable_manager=variable_manager,
                              loader=loader)
        ri.vars.update(self.vars)
        #ri._role_params.update(self.args) # jimi-c cant we avoid this?

        #build role
        actual_role = Role.load(ri,
                                myplay,
                                parent_role=self._parent_role,
                                from_files=self._from_files)

        # compile role
        blocks = actual_role.compile(play=myplay)

        # set parent to ensure proper inheritance
        for b in blocks:
            b._parent = self._parent

        # updated available handlers in play
        myplay.handlers = myplay.handlers + actual_role.get_handler_blocks(
            play=myplay)

        return blocks
Example #6
0
    def get_block_list(self, play=None, variable_manager=None, loader=None):

        # only need play passed in when dynamic
        if play is None:
            myplay = self._parent._play
        else:
            myplay = play

        ri = RoleInclude.load(self._role_name, play=myplay, variable_manager=variable_manager, loader=loader, collection_list=self.collections)
        ri.vars.update(self.vars)

        # build role
        actual_role = Role.load(ri, myplay, parent_role=self._parent_role, from_files=self._from_files,
                                from_include=True)
        # proxy allow_duplicates attribute to role if explicitly set
        if self.allow_duplicates is not None:
            actual_role._metadata.allow_duplicates = self.allow_duplicates
        # in any case sync allow_duplicates between the role and this include statement
        # This is the side effect if we didnt explicitly setted the allow_duplicates attribute
        # to fallback on the included role setting
        if self.allow_duplicates is None and actual_role._metadata:
            self.allow_duplicates = actual_role._metadata.allow_duplicates

        if self.statically_loaded or self.public:
            myplay.roles.append(actual_role)

        # save this for later use
        self._role_path = actual_role._role_path
        self._role = actual_role

        # compile role with parent roles as dependencies to ensure they inherit
        # variables
        if not self._parent_role:
            dep_chain = []
        else:
            dep_chain = list(self._parent_role._parents)
            dep_chain.append(self._parent_role)

        p_block = self.build_parent_block()

        # collections value is not inherited; override with the value we calculated during role setup
        p_block.collections = actual_role.collections

        blocks = actual_role.compile(play=myplay, dep_chain=dep_chain)
        for b in blocks:
            b._parent = p_block
            # HACK: parent inheritance doesn't seem to have a way to handle this intermediate override until squashed/finalized
            b.collections = actual_role.collections

        # updated available handlers in play
        handlers = actual_role.get_handler_blocks(play=myplay)
        for h in handlers:
            h._parent = p_block
        myplay.handlers = myplay.handlers + handlers
        return blocks, handlers
Example #7
0
    def get_block_list(self, play=None, variable_manager=None, loader=None):

        # only need play passed in when dynamic
        if play is None:
            myplay = self._parent._play
        else:
            myplay = play

        ri = RoleInclude.load(self._role_name, play=myplay, variable_manager=variable_manager, loader=loader, collection_list=self.collections)
        ri.vars.update(self.vars)

        if variable_manager is not None:
            available_variables = variable_manager.get_vars(play=myplay, task=self)
        else:
            available_variables = {}
        templar = Templar(loader=loader, variables=available_variables)
        from_files = templar.template(self._from_files)

        # build role
        actual_role = Role.load(ri, myplay, parent_role=self._parent_role, from_files=from_files,
                                from_include=True, validate=self.rolespec_validate)
        actual_role._metadata.allow_duplicates = self.allow_duplicates

        if self.statically_loaded or self.public:
            myplay.roles.append(actual_role)

        # save this for later use
        self._role_path = actual_role._role_path

        # compile role with parent roles as dependencies to ensure they inherit
        # variables
        if not self._parent_role:
            dep_chain = []
        else:
            dep_chain = list(self._parent_role._parents)
            dep_chain.append(self._parent_role)

        p_block = self.build_parent_block()

        # collections value is not inherited; override with the value we calculated during role setup
        p_block.collections = actual_role.collections

        blocks = actual_role.compile(play=myplay, dep_chain=dep_chain)
        for b in blocks:
            b._parent = p_block
            # HACK: parent inheritance doesn't seem to have a way to handle this intermediate override until squashed/finalized
            b.collections = actual_role.collections

        # updated available handlers in play
        handlers = actual_role.get_handler_blocks(play=myplay)
        for h in handlers:
            h._parent = p_block
        myplay.handlers = myplay.handlers + handlers
        return blocks, handlers
Example #8
0
    def _load_roles(self, attr, ds):
        '''
        Loads and returns a list of RoleInclude objects from the datastructure
        list of role definitions and creates the Role from those objects
        '''

        role_includes = load_list_of_roles(ds, variable_manager=self._variable_manager, loader=self._loader)

        roles = []
        for ri in role_includes:
            roles.append(Role.load(ri))
        return roles
Example #9
0
    def test_load_role_complex(self, _load_role_yaml, _get_role_path):

        _get_role_path.return_value = ('foo', '/etc/ansible/roles/foo')

        def fake_load_role_yaml(role_path, subdir):
            if role_path == '/etc/ansible/roles/foo':
                if subdir == 'tasks':
                    return [dict(shell='echo "hello world"')]
            return None

        _load_role_yaml.side_effect = fake_load_role_yaml

        r = Role.load(dict(role='foo'))
Example #10
0
    def _load_roles(self, attr, ds):
        '''
        Loads and returns a list of RoleInclude objects from the datastructure
        list of role definitions and creates the Role from those objects
        '''

        role_includes = load_list_of_roles(
            ds, variable_manager=self._variable_manager, loader=self._loader)

        roles = []
        for ri in role_includes:
            roles.append(Role.load(ri))
        return roles
Example #11
0
    def test_load_role_with_handlers(self):

        fake_loader = DictDataLoader({
            "/etc/ansible/roles/foo_handlers/handlers/main.yml": """
            - name: test handler
              shell: echo 'hello world'
            """,
        })

        i = RoleInclude.load('foo_handlers', loader=fake_loader)
        r = Role.load(i)

        self.assertEqual(len(r._handler_blocks), 1)
        assert isinstance(r._handler_blocks[0], Block)
Example #12
0
    def test_load_role_with_tasks(self):

        fake_loader = DictDataLoader({
            "/etc/ansible/roles/foo_tasks/tasks/main.yml": """
            - shell: echo 'hello world'
            """,
        })

        i = RoleInclude.load('foo_tasks', loader=fake_loader)
        r = Role.load(i)

        self.assertEqual(str(r), 'foo_tasks')
        self.assertEqual(len(r._task_blocks), 1)
        assert isinstance(r._task_blocks[0], Block)
Example #13
0
    def test_load_role_complex(self):

        # FIXME: add tests for the more complex uses of
        #        params and tags/when statements

        fake_loader = DictDataLoader({
            "/etc/ansible/roles/foo_complex/tasks/main.yml": """
            - shell: echo 'hello world'
            """,
        })

        i = RoleInclude.load(dict(role='foo_complex'), loader=fake_loader)
        r = Role.load(i)

        self.assertEqual(r.get_name(), "foo_complex")
Example #14
0
    def test_load_role_with_tasks(self, _load_role_yaml, _get_role_path):

        _get_role_path.return_value = ('foo', '/etc/ansible/roles/foo')

        def fake_load_role_yaml(role_path, subdir):
            if role_path == '/etc/ansible/roles/foo':
                if subdir == 'tasks':
                    return [dict(shell='echo "hello world"')]
            return None

        _load_role_yaml.side_effect = fake_load_role_yaml

        r = Role.load('foo')
        self.assertEqual(len(r.task_blocks), 1)
        assert isinstance(r.task_blocks[0], Block)
Example #15
0
    def test_load_role_with_handlers(self):

        fake_loader = DictDataLoader({
            "/etc/ansible/roles/foo/handlers/main.yml":
            """
            - name: test handler
              shell: echo 'hello world'
            """,
        })

        i = RoleInclude.load('foo', loader=fake_loader)
        r = Role.load(i)

        self.assertEqual(len(r._handler_blocks), 1)
        assert isinstance(r._handler_blocks[0], Block)
Example #16
0
    def test_load_role_with_tasks(self):

        fake_loader = DictDataLoader({
            "/etc/ansible/roles/foo/tasks/main.yml":
            """
            - shell: echo 'hello world'
            """,
        })

        i = RoleInclude.load('foo', loader=fake_loader)
        r = Role.load(i)

        self.assertEqual(str(r), 'foo')
        self.assertEqual(len(r._task_blocks), 1)
        assert isinstance(r._task_blocks[0], Block)
Example #17
0
    def test_load_role_with_metadata(self, _load_role_yaml, _get_role_path):

        _get_role_path.return_value = ('foo', '/etc/ansible/roles/foo')

        def fake_load_role_yaml(role_path, subdir):
            if role_path == '/etc/ansible/roles/foo':
                if subdir == 'meta':
                    return dict(dependencies=[], allow_duplicates=False)
            return None

        _load_role_yaml.side_effect = fake_load_role_yaml

        r = Role.load('foo')
        self.assertEqual(r.metadata,
                         dict(dependencies=[], allow_duplicates=False))
Example #18
0
    def test_load_role_with_vars(self):

        fake_loader = DictDataLoader({
            "/etc/ansible/roles/foo_vars/defaults/main.yml": """
            foo: bar
            """,
            "/etc/ansible/roles/foo_vars/vars/main.yml": """
            foo: bam
            """,
        })

        i = RoleInclude.load('foo_vars', loader=fake_loader)
        r = Role.load(i)

        self.assertEqual(r._default_vars, dict(foo='bar'))
        self.assertEqual(r._role_vars, dict(foo='bam'))
Example #19
0
    def test_load_role_complex(self):

        # FIXME: add tests for the more complex uses of
        #        params and tags/when statements

        fake_loader = DictDataLoader({
            "/etc/ansible/roles/foo/tasks/main.yml":
            """
            - shell: echo 'hello world'
            """,
        })

        i = RoleInclude.load(dict(role='foo'), loader=fake_loader)
        r = Role.load(i)

        self.assertEqual(r.get_name(), "foo")
Example #20
0
    def test_load_role_with_vars(self, _load_role_yaml, _get_role_path):

        _get_role_path.return_value = ('foo', '/etc/ansible/roles/foo')

        def fake_load_role_yaml(role_path, subdir):
            if role_path == '/etc/ansible/roles/foo':
                if subdir == 'defaults':
                    return dict(foo='bar')
                elif subdir == 'vars':
                    return dict(foo='bam')
            return None

        _load_role_yaml.side_effect = fake_load_role_yaml

        r = Role.load('foo')
        self.assertEqual(r.default_vars, dict(foo='bar'))
        self.assertEqual(r.role_vars, dict(foo='bam'))
Example #21
0
    def test_load_role_with_handlers(self):

        fake_loader = DictDataLoader({
            "/etc/ansible/roles/foo_handlers/handlers/main.yml": """
            - name: test handler
              shell: echo 'hello world'
            """,
        })

        mock_play = MagicMock()
        mock_play.ROLE_CACHE = {}

        i = RoleInclude.load('foo_handlers', play=mock_play, loader=fake_loader)
        r = Role.load(i, play=mock_play)

        self.assertEqual(len(r._handler_blocks), 1)
        assert isinstance(r._handler_blocks[0], Block)
Example #22
0
    def test_load_role_with_vars(self):

        fake_loader = DictDataLoader({
            "/etc/ansible/roles/foo/defaults/main.yml":
            """
            foo: bar
            """,
            "/etc/ansible/roles/foo/vars/main.yml":
            """
            foo: bam
            """,
        })

        i = RoleInclude.load('foo', loader=fake_loader)
        r = Role.load(i)

        self.assertEqual(r._default_vars, dict(foo='bar'))
        self.assertEqual(r._role_vars, dict(foo='bam'))
Example #23
0
    def test_load_role_with_tasks(self):

        fake_loader = DictDataLoader({
            "/etc/ansible/roles/foo_tasks/tasks/main.yml":
            """
            - shell: echo 'hello world'
            """,
        })

        mock_play = MagicMock()
        mock_play.ROLE_CACHE = {}

        i = RoleInclude.load('foo_tasks', loader=fake_loader)
        r = Role.load(i, play=mock_play)

        self.assertEqual(str(r), 'foo_tasks')
        self.assertEqual(len(r._task_blocks), 1)
        assert isinstance(r._task_blocks[0], Block)
Example #24
0
    def test_load_role_complex(self):

        # FIXME: add tests for the more complex uses of
        #        params and tags/when statements

        fake_loader = DictDataLoader({
            "/etc/ansible/roles/foo_complex/tasks/main.yml": """
            - shell: echo 'hello world'
            """,
        })

        mock_play = MagicMock()
        mock_play.ROLE_CACHE = {}

        i = RoleInclude.load(dict(role='foo_complex'), play=mock_play, loader=fake_loader)
        r = Role.load(i, play=mock_play)

        self.assertEqual(r.get_name(), "foo_complex")
Example #25
0
    def test_load_role_with_vars_dir_vs_file(self):

        fake_loader = DictDataLoader({
            "/etc/ansible/roles/foo_vars/vars/main/foo.yml": """
            foo: bar
            """,
            "/etc/ansible/roles/foo_vars/vars/main.yml": """
            foo: bam
            """,
        })

        mock_play = MagicMock()
        mock_play.ROLE_CACHE = {}

        i = RoleInclude.load('foo_vars', play=mock_play, loader=fake_loader)
        r = Role.load(i, play=mock_play)

        self.assertEqual(r._role_vars, dict(foo='bam'))
Example #26
0
    def _load_roles(self, attr, ds):
        '''
        Loads and returns a list of RoleInclude objects from the datastructure
        list of role definitions and creates the Role from those objects
        '''

        if ds is None:
            ds = []

        try:
            role_includes = load_list_of_roles(ds, play=self, variable_manager=self._variable_manager, loader=self._loader)
        except AssertionError:
            raise AnsibleParserError("A malformed role declaration was encountered.", obj=self._ds)

        roles = []
        for ri in role_includes:
            roles.append(Role.load(ri, play=self))
        return roles
Example #27
0
    def test_load_role_with_vars_dir_vs_file(self):

        fake_loader = DictDataLoader({
            "/etc/ansible/roles/foo_vars/vars/main/foo.yml": """
            foo: bar
            """,
            "/etc/ansible/roles/foo_vars/vars/main.yml": """
            foo: bam
            """,
        })

        mock_play = MagicMock()
        mock_play.ROLE_CACHE = {}

        i = RoleInclude.load('foo_vars', play=mock_play, loader=fake_loader)
        r = Role.load(i, play=mock_play)

        self.assertEqual(r._role_vars, dict(foo='bam'))
Example #28
0
    def test_load_role_with_tasks_dir_vs_file(self):

        fake_loader = DictDataLoader({
            "/etc/ansible/roles/foo_tasks/tasks/custom_main/foo.yml": """
            - command: bar
            """,
            "/etc/ansible/roles/foo_tasks/tasks/custom_main.yml": """
            - command: baz
            """,
        })

        mock_play = MagicMock()
        mock_play.ROLE_CACHE = {}

        i = RoleInclude.load('foo_tasks', play=mock_play, loader=fake_loader)
        r = Role.load(i, play=mock_play, from_files=dict(tasks='custom_main'))

        self.assertEqual(r._task_blocks[0]._ds[0]['command'], 'baz')
Example #29
0
    def load(data,
             block=None,
             role=None,
             task_include=None,
             variable_manager=None,
             loader=None):

        r = IncludeRole().load_data(data,
                                    variable_manager=variable_manager,
                                    loader=loader)
        args = r.preprocess_data(data).get('args', dict())

        ri = RoleInclude.load(args.get('name'),
                              play=block._play,
                              variable_manager=variable_manager,
                              loader=loader)
        ri.vars.update(r.vars)

        # build options for roles
        from_files = {}
        for key in ['tasks', 'vars', 'defaults']:
            from_key = key + '_from'
            if args.get(from_key):
                from_files[key] = basename(args.get(from_key))

        #build role
        actual_role = Role.load(ri,
                                block._play,
                                parent_role=role,
                                from_files=from_files)

        # compile role
        blocks = actual_role.compile(play=block._play)

        # set parent to ensure proper inheritance
        for b in blocks:
            b._parent = block

        # updated available handlers in play
        block._play.handlers = block._play.handlers + actual_role.get_handler_blocks(
            play=block._play)

        return blocks
Example #30
0
    def test_load_role_with_vars_nested_dirs_combined(self):

        fake_loader = DictDataLoader({
            "/etc/ansible/roles/foo_vars/defaults/main/foo/bar.yml": """
            foo: bar
            a: 1
            """,
            "/etc/ansible/roles/foo_vars/defaults/main/bar/foo.yml": """
            foo: bam
            b: 2
            """,
        })

        mock_play = MagicMock()
        mock_play.ROLE_CACHE = {}

        i = RoleInclude.load('foo_vars', play=mock_play, loader=fake_loader)
        r = Role.load(i, play=mock_play)

        self.assertEqual(r._default_vars, dict(foo='bar', a=1, b=2))
Example #31
0
    def test_load_role_with_metadata(self, _load_role_yaml, _get_role_path):
        def fake_get_role_path(role):
            if role == 'foo':
                return ('foo', '/etc/ansible/roles/foo')
            elif role == 'bar':
                return ('bar', '/etc/ansible/roles/bar')
            elif role == 'bad1':
                return ('bad1', '/etc/ansible/roles/bad1')
            elif role == 'bad2':
                return ('bad2', '/etc/ansible/roles/bad2')

        def fake_load_role_yaml(role_path, subdir):
            if role_path == '/etc/ansible/roles/foo':
                if subdir == 'meta':
                    return dict(dependencies=['bar'],
                                allow_duplicates=True,
                                galaxy_info=dict(a='1', b='2', c='3'))
            elif role_path == '/etc/ansible/roles/bar':
                if subdir == 'meta':
                    return dict()
            elif role_path == '/etc/ansible/roles/bad1':
                if subdir == 'meta':
                    return 1
            elif role_path == '/etc/ansible/roles/bad2':
                if subdir == 'meta':
                    return dict(foo='bar')
            return None

        _get_role_path.side_effect = fake_get_role_path
        _load_role_yaml.side_effect = fake_load_role_yaml

        r = Role.load('foo')
        self.assertEqual(len(r.dependencies), 1)
        self.assertEqual(type(r.dependencies[0]), Role)
        self.assertEqual(len(r.dependencies[0]._parents), 1)
        self.assertEqual(r.dependencies[0]._parents[0], r)
        self.assertEqual(r.allow_duplicates, True)
        self.assertEqual(r.galaxy_info, dict(a='1', b='2', c='3'))

        self.assertRaises(AnsibleParserError, Role.load, 'bad1')
        self.assertRaises(AnsibleParserError, Role.load, 'bad2')
Example #32
0
    def _compile_roles(self):
        '''
        Handles the role compilation step, returning a flat list of tasks
        with the lowest level dependencies first. For example, if a role R
        has a dependency D1, which also has a dependency D2, the tasks from
        D2 are merged first, followed by D1, and lastly by the tasks from
        the parent role R last. This is done for all roles in the Play.
        '''

        task_list = []

        if len(self.roles) > 0:
            for ri in self.roles:
                # The internal list of roles are actualy RoleInclude objects,
                # so we load the role from that now
                role = Role.load(ri)

                # FIXME: evauluate conditional of roles here?
                task_list.extend(role.compile())

        return task_list
Example #33
0
    def test_load_role_with_metadata(self):

        fake_loader = DictDataLoader(
            {
                "/etc/ansible/roles/foo/meta/main.yml": """
                allow_duplicates: true
                dependencies:
                  - bar
                galaxy_info:
                  a: 1
                  b: 2
                  c: 3
            """,
                "/etc/ansible/roles/bar/meta/main.yml": """
                dependencies:
                  - baz
            """,
                "/etc/ansible/roles/baz/meta/main.yml": """
                dependencies:
                  - bam
            """,
                "/etc/ansible/roles/bam/meta/main.yml": """
                dependencies: []
            """,
                "/etc/ansible/roles/bad1/meta/main.yml": """
                1
            """,
                "/etc/ansible/roles/bad2/meta/main.yml": """
                foo: bar
            """,
                "/etc/ansible/roles/recursive1/meta/main.yml": """
                dependencies: ['recursive2']
            """,
                "/etc/ansible/roles/recursive2/meta/main.yml": """
                dependencies: ['recursive1']
            """,
            }
        )

        i = RoleInclude.load("foo", loader=fake_loader)
        r = Role.load(i)

        role_deps = r.get_direct_dependencies()

        self.assertEqual(len(role_deps), 1)
        self.assertEqual(type(role_deps[0]), Role)
        self.assertEqual(len(role_deps[0].get_parents()), 1)
        self.assertEqual(role_deps[0].get_parents()[0], r)
        self.assertEqual(r._metadata.allow_duplicates, True)
        self.assertEqual(r._metadata.galaxy_info, dict(a=1, b=2, c=3))

        all_deps = r.get_all_dependencies()
        self.assertEqual(len(all_deps), 3)
        self.assertEqual(all_deps[0].get_name(), "bar")
        self.assertEqual(all_deps[1].get_name(), "baz")
        self.assertEqual(all_deps[2].get_name(), "bam")

        i = RoleInclude.load("bad1", loader=fake_loader)
        self.assertRaises(AnsibleParserError, Role.load, i)

        i = RoleInclude.load("bad2", loader=fake_loader)
        self.assertRaises(AnsibleParserError, Role.load, i)

        i = RoleInclude.load("recursive1", loader=fake_loader)
        self.assertRaises(AnsibleError, Role.load, i)
Example #34
0
    def test_load_role_with_metadata(self):

        fake_loader = DictDataLoader({
            '/etc/ansible/roles/foo_metadata/meta/main.yml': """
                allow_duplicates: true
                dependencies:
                  - bar_metadata
                galaxy_info:
                  a: 1
                  b: 2
                  c: 3
            """,
            '/etc/ansible/roles/bar_metadata/meta/main.yml': """
                dependencies:
                  - baz_metadata
            """,
            '/etc/ansible/roles/baz_metadata/meta/main.yml': """
                dependencies:
                  - bam_metadata
            """,
            '/etc/ansible/roles/bam_metadata/meta/main.yml': """
                dependencies: []
            """,
            '/etc/ansible/roles/bad1_metadata/meta/main.yml': """
                1
            """,
            '/etc/ansible/roles/bad2_metadata/meta/main.yml': """
                foo: bar
            """,
            '/etc/ansible/roles/recursive1_metadata/meta/main.yml': """
                dependencies: ['recursive2_metadata']
            """,
            '/etc/ansible/roles/recursive2_metadata/meta/main.yml': """
                dependencies: ['recursive1_metadata']
            """,
        })

        mock_play = MagicMock()
        mock_play.ROLE_CACHE = {}

        i = RoleInclude.load('foo_metadata', play=mock_play, loader=fake_loader)
        r = Role.load(i, play=mock_play)

        role_deps = r.get_direct_dependencies()

        self.assertEqual(len(role_deps), 1)
        self.assertEqual(type(role_deps[0]), Role)
        self.assertEqual(len(role_deps[0].get_parents()), 1)
        self.assertEqual(role_deps[0].get_parents()[0], r)
        self.assertEqual(r._metadata.allow_duplicates, True)
        self.assertEqual(r._metadata.galaxy_info, dict(a=1, b=2, c=3))

        all_deps = r.get_all_dependencies()
        self.assertEqual(len(all_deps), 3)
        self.assertEqual(all_deps[0].get_name(), 'bam_metadata')
        self.assertEqual(all_deps[1].get_name(), 'baz_metadata')
        self.assertEqual(all_deps[2].get_name(), 'bar_metadata')

        i = RoleInclude.load('bad1_metadata', play=mock_play, loader=fake_loader)
        self.assertRaises(AnsibleParserError, Role.load, i, play=mock_play)

        i = RoleInclude.load('bad2_metadata', play=mock_play, loader=fake_loader)
        self.assertRaises(AnsibleParserError, Role.load, i, play=mock_play)

        i = RoleInclude.load('recursive1_metadata', play=mock_play, loader=fake_loader)
        self.assertRaises(AnsibleError, Role.load, i, play=mock_play)
Example #35
0
    def test_load_role_with_metadata(self):

        fake_loader = DictDataLoader({
            '/etc/ansible/roles/foo/meta/main.yml':
            """
                allow_duplicates: true
                dependencies:
                  - bar
                galaxy_info:
                  a: 1
                  b: 2
                  c: 3
            """,
            '/etc/ansible/roles/bar/meta/main.yml':
            """
                dependencies:
                  - baz
            """,
            '/etc/ansible/roles/baz/meta/main.yml':
            """
                dependencies:
                  - bam
            """,
            '/etc/ansible/roles/bam/meta/main.yml':
            """
                dependencies: []
            """,
            '/etc/ansible/roles/bad1/meta/main.yml':
            """
                1
            """,
            '/etc/ansible/roles/bad2/meta/main.yml':
            """
                foo: bar
            """,
            '/etc/ansible/roles/recursive1/meta/main.yml':
            """
                dependencies: ['recursive2']
            """,
            '/etc/ansible/roles/recursive2/meta/main.yml':
            """
                dependencies: ['recursive1']
            """,
        })

        i = RoleInclude.load('foo', loader=fake_loader)
        r = Role.load(i)

        role_deps = r.get_direct_dependencies()

        self.assertEqual(len(role_deps), 1)
        self.assertEqual(type(role_deps[0]), Role)
        self.assertEqual(len(role_deps[0].get_parents()), 1)
        self.assertEqual(role_deps[0].get_parents()[0], r)
        self.assertEqual(r._metadata.allow_duplicates, True)
        self.assertEqual(r._metadata.galaxy_info, dict(a=1, b=2, c=3))

        all_deps = r.get_all_dependencies()
        self.assertEqual(len(all_deps), 3)
        self.assertEqual(all_deps[0].get_name(), 'bar')
        self.assertEqual(all_deps[1].get_name(), 'baz')
        self.assertEqual(all_deps[2].get_name(), 'bam')

        i = RoleInclude.load('bad1', loader=fake_loader)
        self.assertRaises(AnsibleParserError, Role.load, i)

        i = RoleInclude.load('bad2', loader=fake_loader)
        self.assertRaises(AnsibleParserError, Role.load, i)

        i = RoleInclude.load('recursive1', loader=fake_loader)
        self.assertRaises(AnsibleError, Role.load, i)
Example #36
0

def dump_task(t: Task) -> Dict[str, Any]:
    return {t.__class__.__name__ + ':' + t.action: t.args}


def dump(o: Base) -> Dict[str, Any]:
    if isinstance(o, Block):
        return dump_block(o)
    elif isinstance(o, Task):
        return dump_task(o)
    else:
        return {o.__class__.__name__: None}


role = Role.load(role_def, dummy_play)
pprint(recursive_dump(role.get_task_blocks()))
pprint(dump_blocks(role.get_task_blocks()))
# print('Serial')
# pprint(role.serialize())
pprint(role.get_vars())
pprint(role.get_inherited_vars())


def find_blocks(b: Any, cur_depth: int = 0) -> int:
    if isinstance(b, Block):
        cur_depth += 1
        if b.rescue:
            print(b.rescue)
        if cur_depth > 1:
            if b.block and isinstance(b.block[0], Task):
Example #37
0
    def test_load_role_with_metadata(self):

        fake_loader = DictDataLoader({
            '/etc/ansible/roles/foo_metadata/meta/main.yml': """
                allow_duplicates: true
                dependencies:
                  - bar_metadata
                galaxy_info:
                  a: 1
                  b: 2
                  c: 3
            """,
            '/etc/ansible/roles/bar_metadata/meta/main.yml': """
                dependencies:
                  - baz_metadata
            """,
            '/etc/ansible/roles/baz_metadata/meta/main.yml': """
                dependencies:
                  - bam_metadata
            """,
            '/etc/ansible/roles/bam_metadata/meta/main.yml': """
                dependencies: []
            """,
            '/etc/ansible/roles/bad1_metadata/meta/main.yml': """
                1
            """,
            '/etc/ansible/roles/bad2_metadata/meta/main.yml': """
                foo: bar
            """,
            '/etc/ansible/roles/recursive1_metadata/meta/main.yml': """
                dependencies: ['recursive2_metadata']
            """,
            '/etc/ansible/roles/recursive2_metadata/meta/main.yml': """
                dependencies: ['recursive1_metadata']
            """,
        })

        mock_play = MagicMock()
        mock_play.collections = None
        mock_play.ROLE_CACHE = {}

        i = RoleInclude.load('foo_metadata', play=mock_play, loader=fake_loader)
        r = Role.load(i, play=mock_play)

        role_deps = r.get_direct_dependencies()

        self.assertEqual(len(role_deps), 1)
        self.assertEqual(type(role_deps[0]), Role)
        self.assertEqual(len(role_deps[0].get_parents()), 1)
        self.assertEqual(role_deps[0].get_parents()[0], r)
        self.assertEqual(r._metadata.allow_duplicates, True)
        self.assertEqual(r._metadata.galaxy_info, dict(a=1, b=2, c=3))

        all_deps = r.get_all_dependencies()
        self.assertEqual(len(all_deps), 3)
        self.assertEqual(all_deps[0].get_name(), 'bam_metadata')
        self.assertEqual(all_deps[1].get_name(), 'baz_metadata')
        self.assertEqual(all_deps[2].get_name(), 'bar_metadata')

        i = RoleInclude.load('bad1_metadata', play=mock_play, loader=fake_loader)
        self.assertRaises(AnsibleParserError, Role.load, i, play=mock_play)

        i = RoleInclude.load('bad2_metadata', play=mock_play, loader=fake_loader)
        self.assertRaises(AnsibleParserError, Role.load, i, play=mock_play)