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)
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
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
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
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
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
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
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
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'))
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
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)
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)
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")
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)
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)
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)
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))
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'))
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")
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'))
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)
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'))
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)
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")
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'))
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
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')
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
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))
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')
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
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)
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)
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)
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):
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)