Skip to content

Commit

Permalink
Updating Role class for new DataLoader stuff
Browse files Browse the repository at this point in the history
  • Loading branch information
jimi-c committed Oct 26, 2014
1 parent 7cb489e commit 44afa7f
Show file tree
Hide file tree
Showing 3 changed files with 110 additions and 13 deletions.
2 changes: 1 addition & 1 deletion v2/ansible/playbook/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ class Base:
def __init__(self, loader=DataLoader):

# the data loader class is used to parse data from strings and files
self._loader = loader
self._loader = loader()

# each class knows attributes set upon it, see Task.py for example
self._attributes = dict()
Expand Down
13 changes: 6 additions & 7 deletions v2/ansible/playbook/role.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,16 +38,15 @@ class Role(Base):
_src = FieldAttribute(isa='string')
_scm = FieldAttribute(isa='string')
_version = FieldAttribute(isa='string')
_params = FieldAttribute(isa='dict', default=dict())
_metadata = FieldAttribute(isa='dict', default=dict())
_task_blocks = FieldAttribute(isa='list', default=[])
_handler_blocks = FieldAttribute(isa='list', default=[])
_params = FieldAttribute(isa='dict', default=dict())
_metadata = FieldAttribute(isa='dict', default=dict())
_default_vars = FieldAttribute(isa='dict', default=dict())
_role_vars = FieldAttribute(isa='dict', default=dict())

def __init__(self, vault_password=None, loader=DataLoader):
def __init__(self, loader=DataLoader):
self._role_path = None
self._vault_password = vault_password
super(Role, self).__init__(loader=loader)

def __repr__(self):
Expand All @@ -57,9 +56,9 @@ def get_name(self):
return self._attributes['role_name']

@staticmethod
def load(data, vault_password=None):
def load(data):
assert isinstance(data, string_types) or isinstance(data, dict)
r = Role(vault_password=vault_password)
r = Role()
r.load_data(data)
return r

Expand Down Expand Up @@ -116,7 +115,7 @@ def _load_role_yaml(self, role_path, subdir):
if os.path.exists(file_path) and os.path.isdir(file_path):
main_file = self._resolve_main(file_path)
if os.path.exists(main_file):
return load_data_from_file(main_file, self._vault_password)
return self._loader.load_from_file(main_file)
return None

def _resolve_main(self, basepath):
Expand Down
108 changes: 103 additions & 5 deletions v2/test/playbook/test_role.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,14 @@
from __future__ import (absolute_import, division, print_function)
__metaclass__ = type

from ansible.compat.tests import unittest
from ansible.compat.tests.mock import patch, MagicMock

from ansible.playbook.block import Block
from ansible.playbook.role import Role
from ansible.playbook.task import Task
from ansible.compat.tests import unittest

from ansible.parsing.yaml import DataLoader

class TestRole(unittest.TestCase):

Expand All @@ -35,6 +39,15 @@ def tearDown(self):
def test_construct_empty_block(self):
r = Role()

@patch.object(DataLoader, 'load_from_file')
def test__load_role_yaml(self, _load_from_file):
_load_from_file.return_value = dict(foo='bar')
r = Role()
with patch('os.path.exists', return_value=True):
with patch('os.path.isdir', return_value=True):
res = r._load_role_yaml('/fake/path', 'some_subdir')
self.assertEqual(res, dict(foo='bar'))

def test_role__load_list_of_blocks(self):
task = dict(action='test')
r = Role()
Expand All @@ -45,8 +58,93 @@ def test_role__load_list_of_blocks(self):
res = r._load_list_of_blocks([task,task,task])
self.assertEqual(len(res), 3)

def test_load_role_simple(self):
pass
@patch.object(Role, '_get_role_path')
@patch.object(Role, '_load_role_yaml')
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)

@patch.object(Role, '_get_role_path')
@patch.object(Role, '_load_role_yaml')
def test_load_role_with_handlers(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 == 'handlers':
return [dict(name='test handler', shell='echo "hello world"')]
return None

_load_role_yaml.side_effect = fake_load_role_yaml

r = Role.load('foo')
self.assertEqual(len(r.handler_blocks), 1)
assert isinstance(r.handler_blocks[0], Block)

@patch.object(Role, '_get_role_path')
@patch.object(Role, '_load_role_yaml')
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'))

@patch.object(Role, '_get_role_path')
@patch.object(Role, '_load_role_yaml')
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))

@patch.object(Role, '_get_role_path')
@patch.object(Role, '_load_role_yaml')
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 test_load_role_complex(self):
pass

0 comments on commit 44afa7f

Please sign in to comment.