From 57d2622c8cff37d3a61c3b6fc1d422c61695e2fb Mon Sep 17 00:00:00 2001 From: James Cammarata Date: Thu, 16 Oct 2014 12:08:33 -0700 Subject: [PATCH] Adding block code and tests --- v2/ansible/playbook/attribute.py | 2 - v2/ansible/playbook/base.py | 10 ++-- v2/ansible/playbook/block.py | 46 +++++++++++++++++-- v2/test/playbook/test_block.py | 79 ++++++++++++++++++++++++++++++++ 4 files changed, 126 insertions(+), 11 deletions(-) create mode 100644 v2/test/playbook/test_block.py diff --git a/v2/ansible/playbook/attribute.py b/v2/ansible/playbook/attribute.py index d28ba4cc855..ecafe653f08 100644 --- a/v2/ansible/playbook/attribute.py +++ b/v2/ansible/playbook/attribute.py @@ -19,8 +19,6 @@ from __future__ import (absolute_import, division, print_function) __metaclass__ = type -#from ansible.common.errors import AnsibleError - class Attribute: def __init__(self, isa=None, private=False, default=None): diff --git a/v2/ansible/playbook/base.py b/v2/ansible/playbook/base.py index cf075b020ea..08f4d519e6e 100644 --- a/v2/ansible/playbook/base.py +++ b/v2/ansible/playbook/base.py @@ -65,11 +65,11 @@ class Base: if isinstance(attribute, FieldAttribute): # copy the value over unless a _load_field method is defined - method = getattr(self, '_load_%s' % aname, None) - if method: - self._attributes[aname] = method(self, attribute) - else: - if aname in ds: + if aname in ds: + method = getattr(self, '_load_%s' % aname, None) + if method: + self._attributes[aname] = method(aname, ds[aname]) + else: self._attributes[aname] = ds[aname] # return the constructed object diff --git a/v2/ansible/playbook/block.py b/v2/ansible/playbook/block.py index 70af2159237..46b670b1685 100644 --- a/v2/ansible/playbook/block.py +++ b/v2/ansible/playbook/block.py @@ -19,10 +19,48 @@ from __future__ import (absolute_import, division, print_function) __metaclass__ = type -from v2.playbook.base import PlaybookBase +from ansible.playbook.base import Base +from ansible.playbook.task import Task +from ansible.playbook.attribute import Attribute, FieldAttribute -class Block(PlaybookBase): +class Block(Base): - def __init__(self): - pass + _begin = FieldAttribute(isa='list') + _rescue = FieldAttribute(isa='list') + _end = FieldAttribute(isa='list') + _otherwise = FieldAttribute(isa='list') + + def __init__(self, role=None): + self.role = role + super(Block, self).__init__() + + def get_variables(self): + # blocks do not (currently) store any variables directly, + # so we just return an empty dict here + return dict() + + @staticmethod + def load(data, role=None): + b = Block(role=role) + return b.load_data(data) + + def _load_list_of_tasks(self, ds): + assert type(ds) == list + task_list = [] + for task in ds: + t = Task.load(task) + task_list.append(t) + return task_list + + def _load_begin(self, attr, ds): + return self._load_list_of_tasks(ds) + + def _load_rescue(self, attr, ds): + return self._load_list_of_tasks(ds) + + def _load_end(self, attr, ds): + return self._load_list_of_tasks(ds) + + def _load_otherwise(self, attr, ds): + return self._load_list_of_tasks(ds) diff --git a/v2/test/playbook/test_block.py b/v2/test/playbook/test_block.py new file mode 100644 index 00000000000..a0da7f0e6af --- /dev/null +++ b/v2/test/playbook/test_block.py @@ -0,0 +1,79 @@ +# (c) 2012-2014, Michael DeHaan +# +# This file is part of Ansible +# +# Ansible is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Ansible is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Ansible. If not, see . + +# Make coding more python3-ish +from __future__ import (absolute_import, division, print_function) +__metaclass__ = type + +from ansible.playbook.block import Block +from ansible.playbook.task import Task +from .. compat import unittest + +class TestBlock(unittest.TestCase): + + def setUp(self): + pass + + def tearDown(self): + pass + + def test_construct_empty_block(self): + b = Block() + + def test_construct_block_with_role(self): + pass + + def test_block__load_list_of_tasks(self): + task = dict(action='test') + b = Block() + self.assertEqual(b._load_list_of_tasks([]), []) + res = b._load_list_of_tasks([task]) + self.assertEqual(len(res), 1) + assert isinstance(res[0], Task) + res = b._load_list_of_tasks([task,task,task]) + self.assertEqual(len(res), 3) + + def test_load_block_simple(self): + ds = dict( + begin = [], + rescue = [], + end = [], + otherwise = [], + ) + b = Block.load(ds) + self.assertEqual(b.begin, []) + self.assertEqual(b.rescue, []) + self.assertEqual(b.end, []) + self.assertEqual(b.otherwise, []) + + def test_load_block_with_tasks(self): + ds = dict( + begin = [dict(action='begin')], + rescue = [dict(action='rescue')], + end = [dict(action='end')], + otherwise = [dict(action='otherwise')], + ) + b = Block.load(ds) + self.assertEqual(len(b.begin), 1) + assert isinstance(b.begin[0], Task) + self.assertEqual(len(b.rescue), 1) + assert isinstance(b.rescue[0], Task) + self.assertEqual(len(b.end), 1) + assert isinstance(b.end[0], Task) + self.assertEqual(len(b.otherwise), 1) + assert isinstance(b.otherwise[0], Task) +