Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

avoid persistent containers in attribute defaults #13488

Merged
merged 1 commit into from
Dec 9, 2015
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
11 changes: 11 additions & 0 deletions lib/ansible/playbook/attribute.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,17 @@ def __init__(self, isa=None, private=False, default=None, required=False, listof
self.priority = priority
self.always_post_validate = always_post_validate

# This is here to avoid `default=<container>` unwanted persistence across object instances
# We cannot rely on None as some fields use it to skip the code
# that would detect an empty container as a user error
if self.default == '_ansible_container':
if self.isa == 'list':
self.default = []
elif self.isa == 'dict':
self.default = {}
elif self.isa == 'set':
self.default = set()

def __eq__(self, other):
return other.priority == self.priority

Expand Down
6 changes: 3 additions & 3 deletions lib/ansible/playbook/block.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,9 @@

class Block(Base, Become, Conditional, Taggable):

_block = FieldAttribute(isa='list', default=[])
_rescue = FieldAttribute(isa='list', default=[])
_always = FieldAttribute(isa='list', default=[])
_block = FieldAttribute(isa='list', default='_ansible_container')
_rescue = FieldAttribute(isa='list', default='_ansible_container')
_always = FieldAttribute(isa='list', default='_ansible_container')
_delegate_to = FieldAttribute(isa='list')
_delegate_facts = FieldAttribute(isa='bool', default=False)

Expand Down
2 changes: 1 addition & 1 deletion lib/ansible/playbook/conditional.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ class Conditional:
to be run conditionally when a condition is met or skipped.
'''

_when = FieldAttribute(isa='list', default=[])
_when = FieldAttribute(isa='list', default='_ansible_container')

def __init__(self, loader=None):
# when used directly, this class needs a loader, but we want to
Expand Down
16 changes: 8 additions & 8 deletions lib/ansible/playbook/play.py
Original file line number Diff line number Diff line change
Expand Up @@ -64,22 +64,22 @@ class Play(Base, Taggable, Become):

# Connection
_gather_facts = FieldAttribute(isa='bool', default=None, always_post_validate=True)
_hosts = FieldAttribute(isa='list', default=[], required=True, listof=string_types, always_post_validate=True)
_hosts = FieldAttribute(isa='list', default='_ansible_container', required=True, listof=string_types, always_post_validate=True)
_name = FieldAttribute(isa='string', default='', always_post_validate=True)

# Variable Attributes
_vars_files = FieldAttribute(isa='list', default=[], priority=99)
_vars_prompt = FieldAttribute(isa='list', default=[], always_post_validate=True)
_vars_files = FieldAttribute(isa='list', default='_ansible_container', priority=99)
_vars_prompt = FieldAttribute(isa='list', default='_ansible_container', always_post_validate=True)
_vault_password = FieldAttribute(isa='string', always_post_validate=True)

# Role Attributes
_roles = FieldAttribute(isa='list', default=[], priority=90)
_roles = FieldAttribute(isa='list', default='_ansible_container', priority=90)

# Block (Task) Lists Attributes
_handlers = FieldAttribute(isa='list', default=[])
_pre_tasks = FieldAttribute(isa='list', default=[])
_post_tasks = FieldAttribute(isa='list', default=[])
_tasks = FieldAttribute(isa='list', default=[])
_handlers = FieldAttribute(isa='list', default='_ansible_container')
_pre_tasks = FieldAttribute(isa='list', default='_ansible_container')
_post_tasks = FieldAttribute(isa='list', default='_ansible_container')
_tasks = FieldAttribute(isa='list', default='_ansible_container')

# Flag/Setting Attributes
_any_errors_fatal = FieldAttribute(isa='bool', default=False, always_post_validate=True)
Expand Down
4 changes: 2 additions & 2 deletions lib/ansible/playbook/play_context.py
Original file line number Diff line number Diff line change
Expand Up @@ -171,8 +171,8 @@ class PlayContext(Base):

# general flags
_verbosity = FieldAttribute(isa='int', default=0)
_only_tags = FieldAttribute(isa='set', default=set())
_skip_tags = FieldAttribute(isa='set', default=set())
_only_tags = FieldAttribute(isa='set', default='_ansible_container')
_skip_tags = FieldAttribute(isa='set', default='_ansible_container')
_check_mode = FieldAttribute(isa='bool', default=False)
_force_handlers = FieldAttribute(isa='bool', default=False)
_start_at_task = FieldAttribute(isa='string')
Expand Down
2 changes: 1 addition & 1 deletion lib/ansible/playbook/playbook_include.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ class PlaybookInclude(Base, Conditional, Taggable):

_name = FieldAttribute(isa='string')
_include = FieldAttribute(isa='string')
_vars = FieldAttribute(isa='dict', default=dict())
_vars = FieldAttribute(isa='dict', default='_ansible_container')

@staticmethod
def load(data, basedir, variable_manager=None, loader=None):
Expand Down
2 changes: 1 addition & 1 deletion lib/ansible/playbook/role/metadata.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ class RoleMetadata(Base):
'''

_allow_duplicates = FieldAttribute(isa='bool', default=False)
_dependencies = FieldAttribute(isa='list', default=[])
_dependencies = FieldAttribute(isa='list', default='_ansible_container')
_galaxy_info = FieldAttribute(isa='GalaxyInfo')

def __init__(self, owner=None):
Expand Down
2 changes: 1 addition & 1 deletion lib/ansible/playbook/taggable.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@
class Taggable:

untagged = frozenset(['untagged'])
_tags = FieldAttribute(isa='list', default=[], listof=(string_types,int))
_tags = FieldAttribute(isa='list', default='_ansible_container', listof=(string_types,int))

def __init__(self):
super(Taggable, self).__init__()
Expand Down
2 changes: 1 addition & 1 deletion lib/ansible/playbook/task.py
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ class Task(Base, Conditional, Taggable, Become):
# will be used if defined
# might be possible to define others

_args = FieldAttribute(isa='dict', default=dict())
_args = FieldAttribute(isa='dict', default='_ansible_container')
_action = FieldAttribute(isa='string')

_any_errors_fatal = FieldAttribute(isa='bool')
Expand Down