From d91ff0db7464255f27dd4ed2c3e9dca1a0810b67 Mon Sep 17 00:00:00 2001 From: James Cammarata Date: Wed, 16 Sep 2015 09:29:16 -0400 Subject: [PATCH] Fixing parent block serialization for blocks Fixes #12395 --- lib/ansible/playbook/block.py | 19 ++++++++++++++----- samples/test_blocks_of_blocks.yml | 1 + 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/lib/ansible/playbook/block.py b/lib/ansible/playbook/block.py index 400b2e7b730..c0a9ca9bcde 100644 --- a/lib/ansible/playbook/block.py +++ b/lib/ansible/playbook/block.py @@ -144,7 +144,7 @@ class Block(Base, Become, Conditional, Taggable): # use_handlers=self._use_handlers, # ) - def copy(self, exclude_parent=False): + def copy(self, exclude_parent=False, exclude_tasks=False): def _dupe_task_list(task_list, new_block): new_task_list = [] for task in task_list: @@ -162,13 +162,14 @@ class Block(Base, Become, Conditional, Taggable): new_me._use_handlers = self._use_handlers new_me._dep_chain = self._dep_chain[:] - new_me.block = _dupe_task_list(self.block or [], new_me) - new_me.rescue = _dupe_task_list(self.rescue or [], new_me) - new_me.always = _dupe_task_list(self.always or [], new_me) + if not exclude_tasks: + new_me.block = _dupe_task_list(self.block or [], new_me) + new_me.rescue = _dupe_task_list(self.rescue or [], new_me) + new_me.always = _dupe_task_list(self.always or [], new_me) new_me._parent_block = None if self._parent_block and not exclude_parent: - new_me._parent_block = self._parent_block.copy() + new_me._parent_block = self._parent_block.copy(exclude_tasks=exclude_tasks) new_me._role = None if self._role: @@ -197,6 +198,8 @@ class Block(Base, Become, Conditional, Taggable): data['role'] = self._role.serialize() if self._task_include is not None: data['task_include'] = self._task_include.serialize() + if self._parent_block is not None: + data['parent_block'] = self._parent_block.copy(exclude_tasks=True).serialize() return data @@ -230,6 +233,12 @@ class Block(Base, Become, Conditional, Taggable): ti.deserialize(ti_data) self._task_include = ti + pb_data = data.get('parent_block') + if pb_data: + pb = Block() + pb.deserialize(pb_data) + self._parent_block = pb + def evaluate_conditional(self, templar, all_vars): if len(self._dep_chain): for dep in self._dep_chain: diff --git a/samples/test_blocks_of_blocks.yml b/samples/test_blocks_of_blocks.yml index 7933cb61833..2430ab0da09 100644 --- a/samples/test_blocks_of_blocks.yml +++ b/samples/test_blocks_of_blocks.yml @@ -11,3 +11,4 @@ - fail: rescue: - debug: msg="rescuing from the fail" + when: not skip_me|default(False)