Collated PEP8 fixes (#25293)

- Make PEP8 compliant
This commit is contained in:
Dag Wieers 2017-06-02 13:14:11 +02:00 committed by John R Barker
parent 2f33c1a1a1
commit 5553b20828
206 changed files with 1853 additions and 1870 deletions

View file

@ -20,25 +20,26 @@
from __future__ import (absolute_import, division, print_function) from __future__ import (absolute_import, division, print_function)
__metaclass__ = type __metaclass__ = type
import getpass
import operator import operator
import optparse import optparse
import os import os
import subprocess
import re
import sys import sys
import time import time
import yaml import yaml
import re
import getpass
import subprocess
from abc import ABCMeta, abstractmethod from abc import ABCMeta, abstractmethod
import ansible import ansible
from ansible.release import __version__
from ansible import constants as C from ansible import constants as C
from ansible.errors import AnsibleError, AnsibleOptionsError from ansible.errors import AnsibleError, AnsibleOptionsError
from ansible.inventory.manager import InventoryManager from ansible.inventory.manager import InventoryManager
from ansible.module_utils.six import with_metaclass, string_types from ansible.module_utils.six import with_metaclass, string_types
from ansible.module_utils._text import to_bytes, to_text from ansible.module_utils._text import to_bytes, to_text
from ansible.parsing.dataloader import DataLoader from ansible.parsing.dataloader import DataLoader
from ansible.release import __version__
from ansible.utils.path import unfrackpath from ansible.utils.path import unfrackpath
from ansible.utils.vars import load_extra_vars, load_options_vars from ansible.utils.vars import load_extra_vars, load_options_vars
from ansible.vars.manager import VariableManager from ansible.vars.manager import VariableManager
@ -93,6 +94,7 @@ class InvalidOptsParser(SortedOptParser):
except optparse.BadOptionError: except optparse.BadOptionError:
pass pass
class CLI(with_metaclass(ABCMeta, object)): class CLI(with_metaclass(ABCMeta, object)):
''' code behind bin/ansible* programs ''' ''' code behind bin/ansible* programs '''
@ -298,7 +300,8 @@ class CLI(with_metaclass(ABCMeta, object)):
if inventory_opts: if inventory_opts:
parser.add_option('-i', '--inventory', '--inventory-file', dest='inventory', action="append", parser.add_option('-i', '--inventory', '--inventory-file', dest='inventory', action="append",
help="specify inventory host path (default=[%s]) or comma separated host list. --inventory-file is deprecated" % C.DEFAULT_HOST_LIST) help="specify inventory host path (default=[%s]) or comma separated host list. "
"--inventory-file is deprecated" % C.DEFAULT_HOST_LIST)
parser.add_option('--list-hosts', dest='listhosts', action='store_true', parser.add_option('--list-hosts', dest='listhosts', action='store_true',
help='outputs a list of matching hosts; does not execute anything else') help='outputs a list of matching hosts; does not execute anything else')
parser.add_option('-l', '--limit', default=C.DEFAULT_SUBSET, dest='subset', parser.add_option('-l', '--limit', default=C.DEFAULT_SUBSET, dest='subset',
@ -380,7 +383,8 @@ class CLI(with_metaclass(ABCMeta, object)):
runas_group.add_option("-b", "--become", default=C.DEFAULT_BECOME, action="store_true", dest='become', runas_group.add_option("-b", "--become", default=C.DEFAULT_BECOME, action="store_true", dest='become',
help="run operations with become (does not imply password prompting)") help="run operations with become (does not imply password prompting)")
runas_group.add_option('--become-method', dest='become_method', default=C.DEFAULT_BECOME_METHOD, type='choice', choices=C.BECOME_METHODS, runas_group.add_option('--become-method', dest='become_method', default=C.DEFAULT_BECOME_METHOD, type='choice', choices=C.BECOME_METHODS,
help="privilege escalation method to use (default=%s), valid choices: [ %s ]" % (C.DEFAULT_BECOME_METHOD, ' | '.join(C.BECOME_METHODS))) help="privilege escalation method to use (default=%s), valid choices: [ %s ]" %
(C.DEFAULT_BECOME_METHOD, ' | '.join(C.BECOME_METHODS)))
runas_group.add_option('--become-user', default=None, dest='become_user', type='string', runas_group.add_option('--become-user', default=None, dest='become_user', type='string',
help='run operations as this user (default=%s)' % C.DEFAULT_BECOME_USER) help='run operations as this user (default=%s)' % C.DEFAULT_BECOME_USER)
@ -576,8 +580,7 @@ class CLI(with_metaclass(ABCMeta, object)):
offset = time.timezone offset = time.timezone
else: else:
offset = time.altzone offset = time.altzone
result = "({0} {1}) last updated {2} (GMT {3:+04d})".format(branch, commit, result = "({0} {1}) last updated {2} (GMT {3:+04d})".format(branch, commit, time.strftime("%Y/%m/%d %H:%M:%S", date), int(offset / -36))
time.strftime("%Y/%m/%d %H:%M:%S", date), int(offset / -36))
else: else:
result = '' result = ''
return result return result
@ -705,4 +708,3 @@ class CLI(with_metaclass(ABCMeta, object)):
variable_manager.options_vars = load_options_vars(options, CLI.version_info(gitinfo=False)) variable_manager.options_vars = load_options_vars(options, CLI.version_info(gitinfo=False))
return loader, inventory, variable_manager return loader, inventory, variable_manager

View file

@ -59,7 +59,7 @@ class ConsoleCLI(CLI, cmd.Cmd):
modules = [] modules = []
ARGUMENTS = {'host-pattern': 'A name of a group in the inventory, a shell-like glob ' ARGUMENTS = {'host-pattern': 'A name of a group in the inventory, a shell-like glob '
'selecting hosts in inventory or any combination of the two separated by commas.', } 'selecting hosts in inventory or any combination of the two separated by commas.'}
def __init__(self, args): def __init__(self, args):

View file

@ -21,8 +21,8 @@ __metaclass__ = type
import datetime import datetime
import os import os
import traceback
import textwrap import textwrap
import traceback
import yaml import yaml
from ansible import constants as C from ansible import constants as C
@ -66,7 +66,7 @@ class DocCLI(CLI):
self.parser.add_option("-a", "--all", action="store_true", default=False, dest='all_plugins', self.parser.add_option("-a", "--all", action="store_true", default=False, dest='all_plugins',
help='Show documentation for all plugins') help='Show documentation for all plugins')
self.parser.add_option("-t", "--type", action="store", default='module', dest='type', type='choice', self.parser.add_option("-t", "--type", action="store", default='module', dest='type', type='choice',
help='Choose which plugin type', choices=['module','cache', 'connection', 'callback', 'lookup', 'strategy', 'inventory']) help='Choose which plugin type', choices=['cache', 'callback', 'connection', 'inventory', 'lookup', 'module', 'strategy'])
super(DocCLI, self).parse() super(DocCLI, self).parse()

View file

@ -23,11 +23,11 @@ from __future__ import (absolute_import, division, print_function)
__metaclass__ = type __metaclass__ = type
import os.path import os.path
import sys
import yaml
import time
import re import re
import shutil import shutil
import sys
import time
import yaml
from jinja2 import Environment, FileSystemLoader from jinja2 import Environment, FileSystemLoader
@ -36,11 +36,11 @@ from ansible.cli import CLI
from ansible.errors import AnsibleError, AnsibleOptionsError from ansible.errors import AnsibleError, AnsibleOptionsError
from ansible.galaxy import Galaxy from ansible.galaxy import Galaxy
from ansible.galaxy.api import GalaxyAPI from ansible.galaxy.api import GalaxyAPI
from ansible.galaxy.role import GalaxyRole
from ansible.galaxy.login import GalaxyLogin from ansible.galaxy.login import GalaxyLogin
from ansible.galaxy.role import GalaxyRole
from ansible.galaxy.token import GalaxyToken from ansible.galaxy.token import GalaxyToken
from ansible.playbook.role.requirement import RoleRequirement
from ansible.module_utils._text import to_text from ansible.module_utils._text import to_text
from ansible.playbook.role.requirement import RoleRequirement
try: try:
from __main__ import display from __main__ import display
@ -64,7 +64,6 @@ class GalaxyCLI(CLI):
super(GalaxyCLI, self).set_action() super(GalaxyCLI, self).set_action()
# specific to actions # specific to actions
if self.action == "delete": if self.action == "delete":
self.parser.set_usage("usage: %prog delete [options] github_user github_repo") self.parser.set_usage("usage: %prog delete [options] github_user github_repo")
@ -297,7 +296,7 @@ class GalaxyCLI(CLI):
role_info.update(role_spec) role_info.update(role_spec)
data = self._display_role_info(role_info) data = self._display_role_info(role_info)
### FIXME: This is broken in both 1.9 and 2.0 as # FIXME: This is broken in both 1.9 and 2.0 as
# _display_role_info() always returns something # _display_role_info() always returns something
if not data: if not data:
data = u"\n- the role %s was not found" % role data = u"\n- the role %s was not found" % role
@ -692,4 +691,3 @@ class GalaxyCLI(CLI):
if os.pathsep in data: if os.pathsep in data:
data = data.split(os.pathsep)[0] data = data.split(os.pathsep)[0]
return data return data

View file

@ -36,13 +36,10 @@ except ImportError:
display = Display() display = Display()
#---------------------------------------------------------------------------------------------------
class PlaybookCLI(CLI): class PlaybookCLI(CLI):
''' the tool to run *Ansible playbooks*, which are a configuration and multinode deployment system. ''' the tool to run *Ansible playbooks*, which are a configuration and multinode deployment system.
See the project home page (https://docs.ansible.com) for more information. ''' See the project home page (https://docs.ansible.com) for more information. '''
def parse(self): def parse(self):
# create parser for CLI options # create parser for CLI options
@ -122,7 +119,6 @@ class PlaybookCLI(CLI):
# Invalid limit # Invalid limit
raise AnsibleError("Specified --limit does not match any hosts") raise AnsibleError("Specified --limit does not match any hosts")
# flush fact cache if requested # flush fact cache if requested
if self.options.flush_cache: if self.options.flush_cache:
self._flush_cache(inventory, variable_manager) self._flush_cache(inventory, variable_manager)

View file

@ -28,8 +28,8 @@ import socket
import sys import sys
import time import time
from ansible.errors import AnsibleOptionsError
from ansible.cli import CLI from ansible.cli import CLI
from ansible.errors import AnsibleOptionsError
from ansible.module_utils._text import to_native from ansible.module_utils._text import to_native
from ansible.plugins import module_loader from ansible.plugins import module_loader
from ansible.utils.cmd_functions import run_cmd from ansible.utils.cmd_functions import run_cmd
@ -59,7 +59,7 @@ class PullCLI(CLI):
DEFAULT_PLAYBOOK = 'local.yml' DEFAULT_PLAYBOOK = 'local.yml'
PLAYBOOK_ERRORS = { PLAYBOOK_ERRORS = {
1: 'File does not exist', 1: 'File does not exist',
2: 'File is not readable' 2: 'File is not readable',
} }
SUPPORTED_REPO_MODULES = ['git'] SUPPORTED_REPO_MODULES = ['git']
ARGUMENTS = {'playbook.yml': 'The name of one the YAML format files to run as an Ansible playbook.' ARGUMENTS = {'playbook.yml': 'The name of one the YAML format files to run as an Ansible playbook.'
@ -87,7 +87,8 @@ class PullCLI(CLI):
self.parser.add_option('-o', '--only-if-changed', dest='ifchanged', default=False, action='store_true', self.parser.add_option('-o', '--only-if-changed', dest='ifchanged', default=False, action='store_true',
help='only run the playbook if the repository has been updated') help='only run the playbook if the repository has been updated')
self.parser.add_option('-s', '--sleep', dest='sleep', default=None, self.parser.add_option('-s', '--sleep', dest='sleep', default=None,
help='sleep for random interval (between 0 and n number of seconds) before starting. This is a useful way to disperse git requests') help='sleep for random interval (between 0 and n number of seconds) before starting. '
'This is a useful way to disperse git requests')
self.parser.add_option('-f', '--force', dest='force', default=False, action='store_true', self.parser.add_option('-f', '--force', dest='force', default=False, action='store_true',
help='run the playbook even if the repository could not be updated') help='run the playbook even if the repository could not be updated')
self.parser.add_option('-d', '--directory', dest='dest', default=None, help='directory to checkout repository to') self.parser.add_option('-d', '--directory', dest='dest', default=None, help='directory to checkout repository to')

View file

@ -22,11 +22,11 @@ __metaclass__ = type
import os import os
import sys import sys
from ansible.cli import CLI
from ansible.errors import AnsibleError, AnsibleOptionsError from ansible.errors import AnsibleError, AnsibleOptionsError
from ansible.module_utils._text import to_text, to_bytes
from ansible.parsing.dataloader import DataLoader from ansible.parsing.dataloader import DataLoader
from ansible.parsing.vault import VaultEditor from ansible.parsing.vault import VaultEditor
from ansible.cli import CLI
from ansible.module_utils._text import to_text, to_bytes
try: try:
from __main__ import display from __main__ import display

View file

@ -176,15 +176,15 @@ BLACKLIST_EXTS = ('.pyc', '.pyo', '.swp', '.bak', '~', '.rpm', '.md', '.txt')
DEFAULT_COW_WHITELIST = ['bud-frogs', 'bunny', 'cheese', 'daemon', 'default', 'dragon', 'elephant-in-snake', 'elephant', DEFAULT_COW_WHITELIST = ['bud-frogs', 'bunny', 'cheese', 'daemon', 'default', 'dragon', 'elephant-in-snake', 'elephant',
'eyes', 'hellokitty', 'kitty', 'luke-koala', 'meow', 'milk', 'moofasa', 'moose', 'ren', 'sheep', 'eyes', 'hellokitty', 'kitty', 'luke-koala', 'meow', 'milk', 'moofasa', 'moose', 'ren', 'sheep',
'small', 'stegosaurus', 'stimpy', 'supermilker', 'three-eyes', 'turkey', 'turtle', 'tux', 'udder', 'small', 'stegosaurus', 'stimpy', 'supermilker', 'three-eyes', 'turkey', 'turtle', 'tux', 'udder',
'vader-koala', 'vader', 'www', ] 'vader-koala', 'vader', 'www']
# sections in config file # sections in config file
DEFAULTS = 'defaults' DEFAULTS = 'defaults'
#### DEPRECATED VARS ### # FIXME: add deprecation warning when these get set # DEPRECATED VARS # FIXME: add deprecation warning when these get set
# none left now # none left now
#### DEPRECATED FEATURE TOGGLES: these will eventually be removed as it becomes the standard #### # DEPRECATED FEATURE TOGGLES: these will eventually be removed as it becomes the standard
# If --tags or --skip-tags is given multiple times on the CLI and this is True, merge the lists of tags together. # If --tags or --skip-tags is given multiple times on the CLI and this is True, merge the lists of tags together.
# If False, let the last argument overwrite any previous ones. # If False, let the last argument overwrite any previous ones.
@ -194,7 +194,7 @@ MERGE_MULTIPLE_CLI_TAGS = get_config(p, DEFAULTS, 'merge_multiple_cli_tags', '
# Controls which 'precedence path' to take, remove when decide on which! # Controls which 'precedence path' to take, remove when decide on which!
SOURCE_OVER_GROUPS = get_config(p, 'vars', 'source_over_groups', 'ANSIBLE_SOURCE_OVER_GROUPS', True, value_type='boolean') SOURCE_OVER_GROUPS = get_config(p, 'vars', 'source_over_groups', 'ANSIBLE_SOURCE_OVER_GROUPS', True, value_type='boolean')
#### GENERALLY CONFIGURABLE THINGS #### # GENERALLY CONFIGURABLE THINGS ####
DEFAULT_DEBUG = get_config(p, DEFAULTS, 'debug', 'ANSIBLE_DEBUG', False, value_type='boolean') DEFAULT_DEBUG = get_config(p, DEFAULTS, 'debug', 'ANSIBLE_DEBUG', False, value_type='boolean')
DEFAULT_VERBOSITY = get_config(p, DEFAULTS, 'verbosity', 'ANSIBLE_VERBOSITY', 0, value_type='integer') DEFAULT_VERBOSITY = get_config(p, DEFAULTS, 'verbosity', 'ANSIBLE_VERBOSITY', 0, value_type='integer')
DEFAULT_ROLES_PATH = get_config(p, DEFAULTS, 'roles_path', 'ANSIBLE_ROLES_PATH', DEFAULT_ROLES_PATH = get_config(p, DEFAULTS, 'roles_path', 'ANSIBLE_ROLES_PATH',

View file

@ -20,8 +20,8 @@ from __future__ import (absolute_import, division, print_function)
__metaclass__ = type __metaclass__ = type
import os import os
import sys
import re import re
import sys
from ansible import constants as C from ansible import constants as C
from ansible.errors import AnsibleError from ansible.errors import AnsibleError
@ -39,6 +39,7 @@ except ImportError:
from ansible.utils.display import Display from ansible.utils.display import Display
display = Display() display = Display()
class InventoryData(object): class InventoryData(object):
""" """
Holds inventory data (host and group objects). Holds inventory data (host and group objects).
@ -103,7 +104,6 @@ class InventoryData(object):
return new_host return new_host
def _scan_groups_for_host(self, hostname, localhost=False): def _scan_groups_for_host(self, hostname, localhost=False):
''' in case something did not update inventory correctly, fallback to group scan ''' ''' in case something did not update inventory correctly, fallback to group scan '''
@ -121,7 +121,6 @@ class InventoryData(object):
return found return found
def reconcile_inventory(self): def reconcile_inventory(self):
''' Ensure inventory basic rules, run after updates ''' ''' Ensure inventory basic rules, run after updates '''
@ -190,7 +189,6 @@ class InventoryData(object):
return matching_host return matching_host
def add_group(self, group): def add_group(self, group):
''' adds a group to inventory if not there already ''' ''' adds a group to inventory if not there already '''
@ -238,7 +236,6 @@ class InventoryData(object):
self._groups_dict_cache = {} self._groups_dict_cache = {}
display.debug("Added host %s to group %s" % (host, group)) display.debug("Added host %s to group %s" % (host, group))
def set_variable(self, entity, varname, value): def set_variable(self, entity, varname, value):
''' sets a varible for an inventory object ''' ''' sets a varible for an inventory object '''
@ -252,7 +249,6 @@ class InventoryData(object):
inv_object.set_variable(varname, value) inv_object.set_variable(varname, value)
display.debug('set %s for %s' % (varname, entity)) display.debug('set %s for %s' % (varname, entity))
def add_child(self, group, child): def add_child(self, group, child):
''' Add host or group to group ''' ''' Add host or group to group '''
@ -278,4 +274,3 @@ class InventoryData(object):
self._groups_dict_cache[group_name] = [h.name for h in group.get_hosts()] self._groups_dict_cache[group_name] = [h.name for h in group.get_hosts()]
return self._groups_dict_cache return self._groups_dict_cache

View file

@ -20,6 +20,7 @@ __metaclass__ = type
from ansible.errors import AnsibleError from ansible.errors import AnsibleError
from ansible.utils.vars import combine_vars from ansible.utils.vars import combine_vars
class Group: class Group:
''' a group of ansible hosts ''' ''' a group of ansible hosts '''
@ -182,4 +183,3 @@ class Group:
except TypeError: except TypeError:
# FIXME: warn about invalid priority # FIXME: warn about invalid priority
pass pass

View file

@ -24,6 +24,7 @@ from ansible.utils.vars import combine_vars, get_unique_id
__all__ = ['Host'] __all__ = ['Host']
class Host: class Host:
''' a single ansible host ''' ''' a single ansible host '''
@ -100,7 +101,6 @@ class Host:
def get_name(self): def get_name(self):
return self.name return self.name
def populate_ancestors(self): def populate_ancestors(self):
# populate ancestors # populate ancestors
for group in self.groups: for group in self.groups:
@ -131,7 +131,6 @@ class Host:
else: else:
self.remove_group(oldg) self.remove_group(oldg)
def set_variable(self, key, value): def set_variable(self, key, value):
self.vars[key] = value self.vars[key] = value
@ -148,4 +147,3 @@ class Host:
def get_vars(self): def get_vars(self):
return combine_vars(self.vars, self.get_magic_vars()) return combine_vars(self.vars, self.get_magic_vars())

View file

@ -47,6 +47,7 @@ IGNORED_EXTS = [b'%s$' % to_bytes(re.escape(x)) for x in C.INVENTORY_IGNORE_EXTS
IGNORED = re.compile(b'|'.join(IGNORED_ALWAYS + IGNORED_PATTERNS + IGNORED_EXTS)) IGNORED = re.compile(b'|'.join(IGNORED_ALWAYS + IGNORED_PATTERNS + IGNORED_EXTS))
def order_patterns(patterns): def order_patterns(patterns):
''' takes a list of patterns and reorders them by modifier to apply them consistently ''' ''' takes a list of patterns and reorders them by modifier to apply them consistently '''
@ -114,6 +115,7 @@ def split_host_pattern(pattern):
return [p.strip() for p in patterns] return [p.strip() for p in patterns]
class InventoryManager(object): class InventoryManager(object):
''' Creates and manages inventory ''' ''' Creates and manages inventory '''
@ -365,7 +367,6 @@ class InventoryManager(object):
return hosts return hosts
def _evaluate_patterns(self, patterns): def _evaluate_patterns(self, patterns):
""" """
Takes a list of patterns and returns a list of matching host names, Takes a list of patterns and returns a list of matching host names,

View file

@ -44,6 +44,7 @@ AXAPI_VPORT_PROTOCOLS = {
'https': 12, 'https': 12,
} }
def a10_argument_spec(): def a10_argument_spec():
return dict( return dict(
host=dict(type='str', required=True), host=dict(type='str', required=True),
@ -52,11 +53,13 @@ def a10_argument_spec():
write_config=dict(type='bool', default=False) write_config=dict(type='bool', default=False)
) )
def axapi_failure(result): def axapi_failure(result):
if 'response' in result and result['response'].get('status') == 'fail': if 'response' in result and result['response'].get('status') == 'fail':
return True return True
return False return False
def axapi_call(module, url, post=None): def axapi_call(module, url, post=None):
''' '''
Returns a datastructure based on the result of the API call Returns a datastructure based on the result of the API call
@ -81,6 +84,7 @@ def axapi_call(module, url, post=None):
rsp.close() rsp.close()
return data return data
def axapi_authenticate(module, base_url, username, password): def axapi_authenticate(module, base_url, username, password):
url = '%s&method=authenticate&username=%s&password=%s' % (base_url, username, password) url = '%s&method=authenticate&username=%s&password=%s' % (base_url, username, password)
result = axapi_call(module, url) result = axapi_call(module, url)
@ -89,6 +93,7 @@ def axapi_authenticate(module, base_url, username, password):
sessid = result['session_id'] sessid = result['session_id']
return base_url + '&session_id=' + sessid return base_url + '&session_id=' + sessid
def axapi_authenticate_v3(module, base_url, username, password): def axapi_authenticate_v3(module, base_url, username, password):
url = base_url url = base_url
auth_payload = {"credentials": {"username": username, "password": password}} auth_payload = {"credentials": {"username": username, "password": password}}
@ -98,6 +103,7 @@ def axapi_authenticate_v3(module, base_url, username, password):
signature = result['authresponse']['signature'] signature = result['authresponse']['signature']
return signature return signature
def axapi_call_v3(module, url, method=None, body=None, signature=None): def axapi_call_v3(module, url, method=None, body=None, signature=None):
''' '''
Returns a datastructure based on the result of the API call Returns a datastructure based on the result of the API call
@ -126,6 +132,7 @@ def axapi_call_v3(module, url, method=None, body=None, signature=None):
rsp.close() rsp.close()
return data return data
def axapi_enabled_disabled(flag): def axapi_enabled_disabled(flag):
''' '''
The axapi uses 0/1 integer values for flags, rather than strings The axapi uses 0/1 integer values for flags, rather than strings
@ -137,8 +144,10 @@ def axapi_enabled_disabled(flag):
else: else:
return 0 return 0
def axapi_get_port_protocol(protocol): def axapi_get_port_protocol(protocol):
return AXAPI_PORT_PROTOCOLS.get(protocol.lower(), None) return AXAPI_PORT_PROTOCOLS.get(protocol.lower(), None)
def axapi_get_vport_protocol(protocol): def axapi_get_vport_protocol(protocol):
return AXAPI_VPORT_PROTOCOLS.get(protocol.lower(), None) return AXAPI_VPORT_PROTOCOLS.get(protocol.lower(), None)

View file

@ -37,8 +37,8 @@ from ansible.module_utils.aos import *
""" """
import json import json
from distutils.version import LooseVersion
from ansible.module_utils.pycompat24 import get_exception from ansible.module_utils.pycompat24 import get_exception
from distutils.version import LooseVersion
try: try:
import yaml import yaml
@ -53,6 +53,7 @@ try:
except ImportError: except ImportError:
HAS_AOS_PYEZ = False HAS_AOS_PYEZ = False
def check_aos_version(module, min=False): def check_aos_version(module, min=False):
""" """
Check if the library aos-pyez is present. Check if the library aos-pyez is present.
@ -71,6 +72,7 @@ def check_aos_version(module, min=False):
return True return True
def get_aos_session(module, auth): def get_aos_session(module, auth):
""" """
Resume an existing session and return an AOS object. Resume an existing session and return an AOS object.
@ -94,6 +96,7 @@ def get_aos_session(module, auth):
return aos return aos
def find_collection_item(collection, item_name=False, item_id=False): def find_collection_item(collection, item_name=False, item_id=False):
""" """
Find collection_item based on name or id from a collection object Find collection_item based on name or id from a collection object
@ -114,6 +117,7 @@ def find_collection_item(collection, item_name=False, item_id=False):
else: else:
return my_dict return my_dict
def content_to_dict(module, content): def content_to_dict(module, content):
""" """
Convert 'content' into a Python Dict based on 'content_format' Convert 'content' into a Python Dict based on 'content_format'
@ -144,12 +148,12 @@ def content_to_dict(module, content):
except: except:
module.fail_json(msg="Unable to convert 'content' to a dict, please check if valid") module.fail_json(msg="Unable to convert 'content' to a dict, please check if valid")
# replace the string with the dict # replace the string with the dict
module.params['content'] = content_dict module.params['content'] = content_dict
return content_dict return content_dict
def do_load_resource(module, collection, name): def do_load_resource(module, collection, name):
""" """
Create a new object (collection.item) by loading a datastructure directly Create a new object (collection.item) by loading a datastructure directly
@ -161,10 +165,7 @@ def do_load_resource(module, collection, name):
module.fail_json(msg="An error occurred while running 'find_collection_item'") module.fail_json(msg="An error occurred while running 'find_collection_item'")
if item.exists: if item.exists:
module.exit_json( changed=False, module.exit_json(changed=False, name=item.name, id=item.id, value=item.value)
name=item.name,
id=item.id,
value=item.value )
# If not in check mode, apply the changes # If not in check mode, apply the changes
if not module.check_mode: if not module.check_mode:
@ -175,7 +176,4 @@ def do_load_resource(module, collection, name):
e = get_exception() e = get_exception()
module.fail_json(msg="Unable to write item content : %r" % e) module.fail_json(msg="Unable to write item content : %r" % e)
module.exit_json( changed=True, module.exit_json(changed=True, name=item.name, id=item.id, value=item.value)
name=item.name,
id=item.id,
value=item.value )

View file

@ -40,6 +40,7 @@ The 'api' module provides the following common argument specs:
""" """
import time import time
def rate_limit_argument_spec(spec=None): def rate_limit_argument_spec(spec=None):
"""Creates an argument spec for working with rate limiting""" """Creates an argument spec for working with rate limiting"""
arg_spec = (dict( arg_spec = (dict(
@ -50,6 +51,7 @@ def rate_limit_argument_spec(spec=None):
arg_spec.update(spec) arg_spec.update(spec)
return arg_spec return arg_spec
def retry_argument_spec(spec=None): def retry_argument_spec(spec=None):
"""Creates an argument spec for working with retrying""" """Creates an argument spec for working with retrying"""
arg_spec = (dict( arg_spec = (dict(
@ -60,24 +62,28 @@ def retry_argument_spec(spec=None):
arg_spec.update(spec) arg_spec.update(spec)
return arg_spec return arg_spec
def basic_auth_argument_spec(spec=None): def basic_auth_argument_spec(spec=None):
arg_spec = (dict( arg_spec = (dict(
api_username=dict(type='str', required=False), api_username=dict(type='str'),
api_password=dict(type='str', required=False, no_log=True), api_password=dict(type='str', no_log=True),
api_url=dict(type='str', required=False), api_url=dict(type='str'),
validate_certs=dict(type='bool', default=True) validate_certs=dict(type='bool', default=True)
)) ))
if spec: if spec:
arg_spec.update(spec) arg_spec.update(spec)
return arg_spec return arg_spec
def rate_limit(rate=None, rate_limit=None): def rate_limit(rate=None, rate_limit=None):
"""rate limiting decorator""" """rate limiting decorator"""
minrate = None minrate = None
if rate is not None and rate_limit is not None: if rate is not None and rate_limit is not None:
minrate = float(rate_limit) / float(rate) minrate = float(rate_limit) / float(rate)
def wrapper(f): def wrapper(f):
last = [0.0] last = [0.0]
def ratelimited(*args, **kwargs): def ratelimited(*args, **kwargs):
if minrate is not None: if minrate is not None:
elapsed = time.clock() - last[0] elapsed = time.clock() - last[0]
@ -87,13 +93,16 @@ def rate_limit(rate=None, rate_limit=None):
last[0] = time.clock() last[0] = time.clock()
ret = f(*args, **kwargs) ret = f(*args, **kwargs)
return ret return ret
return ratelimited return ratelimited
return wrapper return wrapper
def retry(retries=None, retry_pause=1): def retry(retries=None, retry_pause=1):
"""Retry decorator""" """Retry decorator"""
def wrapper(f): def wrapper(f):
retry_count = 0 retry_count = 0
def retried(*args, **kwargs): def retried(*args, **kwargs):
if retries is not None: if retries is not None:
ret = None ret = None
@ -109,6 +118,6 @@ def retry(retries=None, retry_pause=1):
break break
time.sleep(retry_pause) time.sleep(retry_pause)
return ret return ret
return retried return retried
return wrapper return wrapper

View file

@ -25,7 +25,6 @@
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#
# This module initially matched the namespace of network module avi. However, # This module initially matched the namespace of network module avi. However,
# that causes namespace import error when other modules from avi namespaces # that causes namespace import error when other modules from avi namespaces
@ -40,8 +39,7 @@ HAS_AVI = True
try: try:
import avi.sdk import avi.sdk
sdk_version = getattr(avi.sdk, '__version__', None) sdk_version = getattr(avi.sdk, '__version__', None)
if ((sdk_version is None) or (sdk_version and if ((sdk_version is None) or (sdk_version and (parse_version(sdk_version) < parse_version('17.1')))):
(parse_version(sdk_version) < parse_version('17.1')))):
# It allows the __version__ to be '' as that value is used in development builds # It allows the __version__ to be '' as that value is used in development builds
raise ImportError raise ImportError
from avi.sdk.utils.ansible_utils import avi_ansible_api from avi.sdk.utils.ansible_utils import avi_ansible_api

View file

@ -1,4 +1,3 @@
#
# Copyright (c) 2016 Matt Davis, <mdavis@ansible.com> # Copyright (c) 2016 Matt Davis, <mdavis@ansible.com>
# Chris Houseknecht, <house@redhat.com> # Chris Houseknecht, <house@redhat.com>
# #
@ -16,7 +15,6 @@
# #
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with Ansible. If not, see <http://www.gnu.org/licenses/>. # along with Ansible. If not, see <http://www.gnu.org/licenses/>.
#
import json import json
import os import os
@ -102,6 +100,7 @@ except ImportError as exc:
HAS_AZURE_EXC = exc HAS_AZURE_EXC = exc
HAS_AZURE = False HAS_AZURE = False
def azure_id_to_dict(id): def azure_id_to_dict(id):
pieces = re.sub(r'^\/', '', id).split('/') pieces = re.sub(r'^\/', '', id).split('/')
result = {} result = {}
@ -121,6 +120,7 @@ AZURE_EXPECTED_VERSIONS = dict(
AZURE_MIN_RELEASE = '2.0.0rc5' AZURE_MIN_RELEASE = '2.0.0rc5'
class AzureRMModuleBase(object): class AzureRMModuleBase(object):
def __init__(self, derived_arg_spec, bypass_checks=False, no_log=False, def __init__(self, derived_arg_spec, bypass_checks=False, no_log=False,

View file

@ -32,7 +32,17 @@ BOOLEANS_TRUE = ['y', 'yes', 'on', '1', 'true', 1, True]
BOOLEANS_FALSE = ['n', 'no', 'off', '0', 'false', 0, False] BOOLEANS_FALSE = ['n', 'no', 'off', '0', 'false', 0, False]
BOOLEANS = BOOLEANS_TRUE + BOOLEANS_FALSE BOOLEANS = BOOLEANS_TRUE + BOOLEANS_FALSE
SIZE_RANGES = { 'Y': 1<<80, 'Z': 1<<70, 'E': 1<<60, 'P': 1<<50, 'T': 1<<40, 'G': 1<<30, 'M': 1<<20, 'K': 1<<10, 'B': 1 } SIZE_RANGES = {
'Y': 1 << 80,
'Z': 1 << 70,
'E': 1 << 60,
'P': 1 << 50,
'T': 1 << 40,
'G': 1 << 30,
'M': 1 << 20,
'K': 1 << 10,
'B': 1,
}
FILE_ATTRIBUTES = { FILE_ATTRIBUTES = {
'A': 'noatime', 'A': 'noatime',
@ -161,8 +171,16 @@ except ImportError:
pass pass
from ansible.module_utils.pycompat24 import get_exception, literal_eval from ansible.module_utils.pycompat24 import get_exception, literal_eval
from ansible.module_utils.six import (PY2, PY3, b, binary_type, integer_types, from ansible.module_utils.six import (
iteritems, text_type, string_types) PY2,
PY3,
b,
binary_type,
integer_types,
iteritems,
string_types,
text_type,
)
from ansible.module_utils.six.moves import map, reduce, shlex_quote from ansible.module_utils.six.moves import map, reduce, shlex_quote
from ansible.module_utils._text import to_native, to_bytes, to_text from ansible.module_utils._text import to_native, to_bytes, to_text
@ -242,6 +260,7 @@ def get_platform():
''' what's the platform? example: Linux is a platform. ''' ''' what's the platform? example: Linux is a platform. '''
return platform.system() return platform.system()
def get_distribution(): def get_distribution():
''' return the distribution name ''' ''' return the distribution name '''
if platform.system() == 'Linux': if platform.system() == 'Linux':
@ -261,6 +280,7 @@ def get_distribution():
distribution = None distribution = None
return distribution return distribution
def get_distribution_version(): def get_distribution_version():
''' return the distribution version ''' ''' return the distribution version '''
if platform.system() == 'Linux': if platform.system() == 'Linux':
@ -275,6 +295,7 @@ def get_distribution_version():
distribution_version = None distribution_version = None
return distribution_version return distribution_version
def get_all_subclasses(cls): def get_all_subclasses(cls):
''' '''
used by modules like Hardware or Network fact classes to retrieve all subclasses of a given class. used by modules like Hardware or Network fact classes to retrieve all subclasses of a given class.
@ -338,6 +359,7 @@ def json_dict_unicode_to_bytes(d, encoding='utf-8', errors='surrogate_or_strict'
else: else:
return d return d
def json_dict_bytes_to_unicode(d, encoding='utf-8', errors='surrogate_or_strict'): def json_dict_bytes_to_unicode(d, encoding='utf-8', errors='surrogate_or_strict'):
''' Recursively convert dict keys and values to byte str ''' Recursively convert dict keys and values to byte str
@ -357,6 +379,7 @@ def json_dict_bytes_to_unicode(d, encoding='utf-8', errors='surrogate_or_strict'
else: else:
return d return d
def return_values(obj): def return_values(obj):
""" Return native stringified values from datastructures. """ Return native stringified values from datastructures.
@ -381,6 +404,7 @@ def return_values(obj):
else: else:
raise TypeError('Unknown parameter type: %s, %s' % (type(obj), obj)) raise TypeError('Unknown parameter type: %s, %s' % (type(obj), obj))
def remove_values(value, no_log_strings): def remove_values(value, no_log_strings):
""" Remove strings in no_log_strings from value. If value is a container """ Remove strings in no_log_strings from value. If value is a container
type, then remove a lot more""" type, then remove a lot more"""
@ -489,6 +513,7 @@ def heuristic_log_sanitize(data, no_log_values=None):
output = remove_values(output, no_log_values) output = remove_values(output, no_log_values)
return output return output
def bytes_to_human(size, isbits=False, unit=None): def bytes_to_human(size, isbits=False, unit=None):
base = 'Bytes' base = 'Bytes'
@ -507,6 +532,7 @@ def bytes_to_human(size, isbits=False, unit=None):
return '%.2f %s' % (float(size) / limit, suffix) return '%.2f %s' % (float(size) / limit, suffix)
def human_to_bytes(number, default_unit=None, isbits=False): def human_to_bytes(number, default_unit=None, isbits=False):
''' '''
@ -555,6 +581,7 @@ def human_to_bytes(number, default_unit=None, isbits=False):
return int(round(num * limit)) return int(round(num * limit))
def is_executable(path): def is_executable(path):
'''is the given path executable? '''is the given path executable?
@ -568,6 +595,7 @@ def is_executable(path):
# execute bits are set. # execute bits are set.
return ((stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH) & os.stat(path)[stat.ST_MODE]) return ((stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH) & os.stat(path)[stat.ST_MODE])
def _load_params(): def _load_params():
''' read the modules parameters and store them globally. ''' read the modules parameters and store them globally.
@ -623,6 +651,7 @@ def _load_params():
'"failed": true}') '"failed": true}')
sys.exit(1) sys.exit(1)
def env_fallback(*args, **kwargs): def env_fallback(*args, **kwargs):
''' Load value from environment ''' ''' Load value from environment '''
for arg in args: for arg in args:
@ -631,6 +660,7 @@ def env_fallback(*args, **kwargs):
else: else:
raise AnsibleFallbackNotFound raise AnsibleFallbackNotFound
def _lenient_lowercase(lst): def _lenient_lowercase(lst):
"""Lowercase elements of a list. """Lowercase elements of a list.
@ -644,6 +674,7 @@ def _lenient_lowercase(lst):
lowered.append(value) lowered.append(value)
return lowered return lowered
def format_attributes(attributes): def format_attributes(attributes):
attribute_list = [] attribute_list = []
for attr in attributes: for attr in attributes:
@ -651,6 +682,7 @@ def format_attributes(attributes):
attribute_list.append(FILE_ATTRIBUTES[attr]) attribute_list.append(FILE_ATTRIBUTES[attr])
return attribute_list return attribute_list
def get_flags_from_attributes(attributes): def get_flags_from_attributes(attributes):
flags = [] flags = []
for key, attr in FILE_ATTRIBUTES.items(): for key, attr in FILE_ATTRIBUTES.items():
@ -658,6 +690,7 @@ def get_flags_from_attributes(attributes):
flags.append(key) flags.append(key)
return ''.join(flags) return ''.join(flags)
class AnsibleFallbackNotFound(Exception): class AnsibleFallbackNotFound(Exception):
pass pass
@ -834,7 +867,6 @@ class AnsibleModule(object):
selevel=selevel, secontext=secontext, attributes=attributes, selevel=selevel, secontext=secontext, attributes=attributes,
) )
# Detect whether using selinux that is MLS-aware. # Detect whether using selinux that is MLS-aware.
# While this means you can set the level/range with # While this means you can set the level/range with
# selinux.lsetfilecon(), it may or may not mean that you # selinux.lsetfilecon(), it may or may not mean that you
@ -1194,7 +1226,6 @@ class AnsibleModule(object):
pass pass
return output return output
def _symbolic_mode_to_octal(self, path_stat, symbolic_mode): def _symbolic_mode_to_octal(self, path_stat, symbolic_mode):
new_mode = stat.S_IMODE(path_stat.st_mode) new_mode = stat.S_IMODE(path_stat.st_mode)
@ -1247,13 +1278,13 @@ class AnsibleModule(object):
X_perms = { X_perms = {
'u': {'X': stat.S_IXUSR}, 'u': {'X': stat.S_IXUSR},
'g': {'X': stat.S_IXGRP}, 'g': {'X': stat.S_IXGRP},
'o': {'X': stat.S_IXOTH} 'o': {'X': stat.S_IXOTH},
} }
else: else:
X_perms = { X_perms = {
'u': {'X': 0}, 'u': {'X': 0},
'g': {'X': 0}, 'g': {'X': 0},
'o': {'X': 0} 'o': {'X': 0},
} }
user_perms_to_modes = { user_perms_to_modes = {
@ -1265,7 +1296,8 @@ class AnsibleModule(object):
't': 0, 't': 0,
'u': prev_mode & stat.S_IRWXU, 'u': prev_mode & stat.S_IRWXU,
'g': (prev_mode & stat.S_IRWXG) << 3, 'g': (prev_mode & stat.S_IRWXG) << 3,
'o': (prev_mode & stat.S_IRWXO) << 6 }, 'o': (prev_mode & stat.S_IRWXO) << 6,
},
'g': { 'g': {
'r': stat.S_IRGRP, 'r': stat.S_IRGRP,
'w': stat.S_IWGRP, 'w': stat.S_IWGRP,
@ -1274,7 +1306,8 @@ class AnsibleModule(object):
't': 0, 't': 0,
'u': (prev_mode & stat.S_IRWXU) >> 3, 'u': (prev_mode & stat.S_IRWXU) >> 3,
'g': prev_mode & stat.S_IRWXG, 'g': prev_mode & stat.S_IRWXG,
'o': (prev_mode & stat.S_IRWXO) << 3 }, 'o': (prev_mode & stat.S_IRWXO) << 3,
},
'o': { 'o': {
'r': stat.S_IROTH, 'r': stat.S_IROTH,
'w': stat.S_IWOTH, 'w': stat.S_IWOTH,
@ -1283,14 +1316,17 @@ class AnsibleModule(object):
't': stat.S_ISVTX, 't': stat.S_ISVTX,
'u': (prev_mode & stat.S_IRWXU) >> 6, 'u': (prev_mode & stat.S_IRWXU) >> 6,
'g': (prev_mode & stat.S_IRWXG) >> 3, 'g': (prev_mode & stat.S_IRWXG) >> 3,
'o': prev_mode & stat.S_IRWXO } 'o': prev_mode & stat.S_IRWXO,
}
} }
# Insert X_perms into user_perms_to_modes # Insert X_perms into user_perms_to_modes
for key, value in X_perms.items(): for key, value in X_perms.items():
user_perms_to_modes[key].update(value) user_perms_to_modes[key].update(value)
or_reduce = lambda mode, perm: mode | user_perms_to_modes[user][perm] def or_reduce(mode, perm):
return mode | user_perms_to_modes[user][perm]
return reduce(or_reduce, perms, 0) return reduce(or_reduce, perms, 0)
def set_fs_attributes_if_different(self, file_args, changed, diff=None, expand=True): def set_fs_attributes_if_different(self, file_args, changed, diff=None, expand=True):
@ -1703,14 +1739,12 @@ class AnsibleModule(object):
def _check_type_raw(self, value): def _check_type_raw(self, value):
return value return value
def _check_type_bytes(self, value): def _check_type_bytes(self, value):
try: try:
self.human_to_bytes(value) self.human_to_bytes(value)
except ValueError: except ValueError:
raise TypeError('%s cannot be converted to a Byte value' % type(value)) raise TypeError('%s cannot be converted to a Byte value' % type(value))
def _check_type_bits(self, value): def _check_type_bits(self, value):
try: try:
self.human_to_bytes(value, isbits=True) self.human_to_bytes(value, isbits=True)
@ -1773,7 +1807,7 @@ class AnsibleModule(object):
self.params[k] = default self.params[k] = default
def _set_fallbacks(self): def _set_fallbacks(self):
for k,v in self.argument_spec.items(): for (k, v) in self.argument_spec.items():
fallback = v.get('fallback', (None,)) fallback = v.get('fallback', (None,))
fallback_strategy = fallback[0] fallback_strategy = fallback[0]
fallback_args = [] fallback_args = []
@ -1863,9 +1897,7 @@ class AnsibleModule(object):
if self.boolean(no_log): if self.boolean(no_log):
log_args[param] = 'NOT_LOGGING_PARAMETER' log_args[param] = 'NOT_LOGGING_PARAMETER'
# try to capture all passwords/passphrase named fields missed by no_log # try to capture all passwords/passphrase named fields missed by no_log
elif PASSWORD_MATCH.search(param) and \ elif PASSWORD_MATCH.search(param) and arg_opts.get('type', 'str') != 'bool' and not arg_opts.get('choices', False):
arg_opts.get('type', 'str') != 'bool' and \
not arg_opts.get('choices', False):
# skip boolean and enums as they are about 'password' state # skip boolean and enums as they are about 'password' state
log_args[param] = 'NOT_LOGGING_PASSWORD' log_args[param] = 'NOT_LOGGING_PASSWORD'
self.warn('Module did not set no_log for %s' % param) self.warn('Module did not set no_log for %s' % param)
@ -1885,7 +1917,6 @@ class AnsibleModule(object):
self.log(msg, log_args=log_args) self.log(msg, log_args=log_args)
def _set_cwd(self): def _set_cwd(self):
try: try:
cwd = os.getcwd() cwd = os.getcwd()
@ -2011,7 +2042,7 @@ class AnsibleModule(object):
def exit_json(self, **kwargs): def exit_json(self, **kwargs):
''' return from the module, without error ''' ''' return from the module, without error '''
if not 'changed' in kwargs: if 'changed' not in kwargs:
kwargs['changed'] = False kwargs['changed'] = False
self.do_cleanup_files() self.do_cleanup_files()
@ -2024,7 +2055,7 @@ class AnsibleModule(object):
assert 'msg' in kwargs, "implementation error -- msg to explain the error is required" assert 'msg' in kwargs, "implementation error -- msg to explain the error is required"
kwargs['failed'] = True kwargs['failed'] = True
if not 'changed' in kwargs: if 'changed' not in kwargs:
kwargs['changed'] = False kwargs['changed'] = False
self.do_cleanup_files() self.do_cleanup_files()
@ -2261,7 +2292,6 @@ class AnsibleModule(object):
e = get_exception() e = get_exception()
self.fail_json(msg='Could not write data to file (%s) from (%s): %s' % (dest, src, e), exception=traceback.format_exc()) self.fail_json(msg='Could not write data to file (%s) from (%s): %s' % (dest, src, e), exception=traceback.format_exc())
def _read_from_pipes(self, rpipes, rfds, file_descriptor): def _read_from_pipes(self, rpipes, rfds, file_descriptor):
data = b('') data = b('')
if file_descriptor in rfds: if file_descriptor in rfds:
@ -2387,9 +2417,9 @@ class AnsibleModule(object):
# Clean out python paths set by ansiballz # Clean out python paths set by ansiballz
if 'PYTHONPATH' in os.environ: if 'PYTHONPATH' in os.environ:
pypaths = os.environ['PYTHONPATH'].split(':') pypaths = os.environ['PYTHONPATH'].split(':')
pypaths = [x for x in pypaths \ pypaths = [x for x in pypaths
if not x.endswith('/ansible_modlib.zip') \ if not x.endswith('/ansible_modlib.zip') and
and not x.endswith('/debug_dir')] not x.endswith('/debug_dir')]
os.environ['PYTHONPATH'] = ':'.join(pypaths) os.environ['PYTHONPATH'] = ':'.join(pypaths)
if not os.environ['PYTHONPATH']: if not os.environ['PYTHONPATH']:
del os.environ['PYTHONPATH'] del os.environ['PYTHONPATH']

View file

@ -25,9 +25,12 @@
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
import json import json
from ansible.module_utils.urls import fetch_url from ansible.module_utils.urls import fetch_url
class Response(object): class Response(object):
def __init__(self, resp, info): def __init__(self, resp, info):

View file

@ -25,18 +25,20 @@
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#
import signal
import socket import socket
import struct import struct
import signal
from ansible.module_utils.basic import get_exception from ansible.module_utils.basic import get_exception
from ansible.module_utils._text import to_bytes, to_native from ansible.module_utils._text import to_bytes, to_native
def send_data(s, data): def send_data(s, data):
packed_len = struct.pack('!Q', len(data)) packed_len = struct.pack('!Q', len(data))
return s.sendall(packed_len + data) return s.sendall(packed_len + data)
def recv_data(s): def recv_data(s):
header_len = 8 # size of a packed unsigned long long header_len = 8 # size of a packed unsigned long long
data = to_bytes("") data = to_bytes("")
@ -54,6 +56,7 @@ def recv_data(s):
data += d data += d
return data return data
def exec_command(module, command): def exec_command(module, command):
try: try:
sf = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) sf = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)

View file

@ -26,9 +26,11 @@
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
class SQLParseError(Exception): class SQLParseError(Exception):
pass pass
class UnclosedQuoteError(SQLParseError): class UnclosedQuoteError(SQLParseError):
pass pass
@ -38,6 +40,7 @@ class UnclosedQuoteError(SQLParseError):
_PG_IDENTIFIER_TO_DOT_LEVEL = dict(database=1, schema=2, table=3, column=4, role=1) _PG_IDENTIFIER_TO_DOT_LEVEL = dict(database=1, schema=2, table=3, column=4, role=1)
_MYSQL_IDENTIFIER_TO_DOT_LEVEL = dict(database=1, table=2, column=3, role=1, vars=1) _MYSQL_IDENTIFIER_TO_DOT_LEVEL = dict(database=1, table=2, column=3, role=1, vars=1)
def _find_end_quote(identifier, quote_char): def _find_end_quote(identifier, quote_char):
accumulate = 0 accumulate = 0
while True: while True:
@ -113,6 +116,7 @@ def pg_quote_identifier(identifier, id_type):
raise SQLParseError('PostgreSQL does not support %s with more than %i dots' % (id_type, _PG_IDENTIFIER_TO_DOT_LEVEL[id_type])) raise SQLParseError('PostgreSQL does not support %s with more than %i dots' % (id_type, _PG_IDENTIFIER_TO_DOT_LEVEL[id_type]))
return '.'.join(identifier_fragments) return '.'.join(identifier_fragments)
def mysql_quote_identifier(identifier, id_type): def mysql_quote_identifier(identifier, id_type):
identifier_fragments = _identifier_parse(identifier, quote_char='`') identifier_fragments = _identifier_parse(identifier, quote_char='`')
if len(identifier_fragments) > _MYSQL_IDENTIFIER_TO_DOT_LEVEL[id_type]: if len(identifier_fragments) > _MYSQL_IDENTIFIER_TO_DOT_LEVEL[id_type]:

View file

@ -327,11 +327,10 @@ class AnsibleDockerClient(Client):
def _handle_ssl_error(self, error): def _handle_ssl_error(self, error):
match = re.match(r"hostname.*doesn\'t match (\'.*\')", str(error)) match = re.match(r"hostname.*doesn\'t match (\'.*\')", str(error))
if match: if match:
msg = "You asked for verification that Docker host name matches %s. The actual hostname is %s. " \ self.fail("You asked for verification that Docker host name matches %s. The actual hostname is %s. "
"Most likely you need to set DOCKER_TLS_HOSTNAME or pass tls_hostname with a value of %s. " \ "Most likely you need to set DOCKER_TLS_HOSTNAME or pass tls_hostname with a value of %s. "
"You may also use TLS without verification by setting the tls parameter to true." \ "You may also use TLS without verification by setting the tls parameter to true."
% (self.auth_params['tls_hostname'], match.group(1), match.group(1)) % (self.auth_params['tls_hostname'], match.group(1), match.group(1)))
self.fail(msg)
self.fail("SSL Exception: %s" % (error)) self.fail("SSL Exception: %s" % (error))
def get_container(self, name=None): def get_container(self, name=None):
@ -448,5 +447,3 @@ class AnsibleDockerClient(Client):
new_tag = self.find_image(name, tag) new_tag = self.find_image(name, tag)
return new_tag, old_tag == new_tag return new_tag, old_tag == new_tag

View file

@ -54,6 +54,7 @@ except:
from ansible.module_utils.six import string_types, binary_type, text_type from ansible.module_utils.six import string_types, binary_type, text_type
class AnsibleAWSError(Exception): class AnsibleAWSError(Exception):
pass pass
@ -98,6 +99,7 @@ def boto3_conn(module, conn_type=None, resource=None, region=None, endpoint=None
module.fail_json(msg='There is an issue in the code of the module. You must specify either both, resource or client to the conn_type ' module.fail_json(msg='There is an issue in the code of the module. You must specify either both, resource or client to the conn_type '
'parameter in the boto3_conn function call') 'parameter in the boto3_conn function call')
def _boto3_conn(conn_type=None, resource=None, region=None, endpoint=None, **params): def _boto3_conn(conn_type=None, resource=None, region=None, endpoint=None, **params):
profile = params.pop('profile_name', None) profile = params.pop('profile_name', None)
@ -120,6 +122,7 @@ def _boto3_conn(conn_type=None, resource=None, region=None, endpoint=None, **par
boto3_inventory_conn = _boto3_conn boto3_inventory_conn = _boto3_conn
def aws_common_argument_spec(): def aws_common_argument_spec():
return dict( return dict(
ec2_url=dict(), ec2_url=dict(),
@ -291,6 +294,7 @@ def ec2_connect(module):
return ec2 return ec2
def paging(pause=0, marker_property='marker'): def paging(pause=0, marker_property='marker'):
""" Adds paging to boto retrieval functions that support a 'marker' """ Adds paging to boto retrieval functions that support a 'marker'
this is configurable as not all boto functions seem to use the this is configurable as not all boto functions seem to use the
@ -330,7 +334,6 @@ def camel_dict_to_snake_dict(camel_dict):
return all_cap_re.sub(r'\1_\2', s1).lower() return all_cap_re.sub(r'\1_\2', s1).lower()
def value_is_list(camel_list): def value_is_list(camel_list):
checked_list = [] checked_list = []
@ -344,7 +347,6 @@ def camel_dict_to_snake_dict(camel_dict):
return checked_list return checked_list
snake_dict = {} snake_dict = {}
for k, v in camel_dict.items(): for k, v in camel_dict.items():
if isinstance(v, dict): if isinstance(v, dict):
@ -491,7 +493,6 @@ def get_ec2_security_group_ids_from_names(sec_group_list, ec2_connection, vpc_id
else: else:
return sg.name return sg.name
def get_sg_id(sg, boto3): def get_sg_id(sg, boto3):
if boto3: if boto3:

View file

@ -56,7 +56,6 @@ def f5_argument_spec():
server_port=dict( server_port=dict(
type='int', type='int',
default=443, default=443,
required=False,
fallback=(env_fallback, ['F5_SERVER_PORT']) fallback=(env_fallback, ['F5_SERVER_PORT'])
), ),
state=dict( state=dict(
@ -80,7 +79,7 @@ def f5_parse_arguments(module):
import ssl import ssl
if not hasattr(ssl, 'SSLContext'): if not hasattr(ssl, 'SSLContext'):
module.fail_json( module.fail_json(
msg="bigsuds does not support verifying certificates with python < 2.7.9." \ msg="bigsuds does not support verifying certificates with python < 2.7.9."
"Either update python or set validate_certs=False on the task'") "Either update python or set validate_certs=False on the task'")
return ( return (
@ -135,13 +134,9 @@ def fq_list_names(partition,list_names):
return map(lambda x: fq_name(partition, x), list_names) return map(lambda x: fq_name(partition, x), list_names)
# New style # New style
from abc import ABCMeta, abstractproperty from abc import ABCMeta, abstractproperty
from ansible.module_utils.six import with_metaclass
from collections import defaultdict from collections import defaultdict
try: try:
@ -158,7 +153,7 @@ except ImportError:
from ansible.module_utils.basic import * from ansible.module_utils.basic import *
from ansible.module_utils.six import iteritems from ansible.module_utils.six import iteritems, with_metaclass
F5_COMMON_ARGS = dict( F5_COMMON_ARGS = dict(
@ -187,7 +182,6 @@ F5_COMMON_ARGS = dict(
server_port=dict( server_port=dict(
type='int', type='int',
default=443, default=443,
required=False,
fallback=(env_fallback, ['F5_SERVER_PORT']) fallback=(env_fallback, ['F5_SERVER_PORT'])
), ),
state=dict( state=dict(

View file

@ -48,7 +48,7 @@ fortios_argument_spec = dict(
username=dict(), username=dict(),
password=dict(type='str', no_log=True), password=dict(type='str', no_log=True),
timeout=dict(type='int', default=60), timeout=dict(type='int', default=60),
vdom = dict(type='str', default=None ), vdom=dict(type='str'),
backup=dict(type='bool', default=False), backup=dict(type='bool', default=False),
backup_path=dict(type='path'), backup_path=dict(type='path'),
backup_filename=dict(type='str'), backup_filename=dict(type='str'),
@ -91,8 +91,6 @@ def backup(module,running_config):
module.fail_json(msg="Can't create backup file {0} Permission denied ?".format(filename)) module.fail_json(msg="Can't create backup file {0} Permission denied ?".format(filename))
class AnsibleFortios(object): class AnsibleFortios(object):
def __init__(self, module): def __init__(self, module):
if not HAS_PYFG: if not HAS_PYFG:
@ -103,7 +101,6 @@ class AnsibleFortios(object):
} }
self.module = module self.module = module
def _connect(self): def _connect(self):
if self.module.params['file_mode']: if self.module.params['file_mode']:
self.forti_device = FortiOS('') self.forti_device = FortiOS('')
@ -122,7 +119,6 @@ class AnsibleFortios(object):
e = get_exception() e = get_exception()
self.module.fail_json(msg='Error connecting device. %s' % e) self.module.fail_json(msg='Error connecting device. %s' % e)
def load_config(self, path): def load_config(self, path):
self.path = path self.path = path
self._connect() self._connect()
@ -154,7 +150,6 @@ class AnsibleFortios(object):
if self.module.params['backup']: if self.module.params['backup']:
backup(self.module, self.forti_device.running_config.to_text()) backup(self.module, self.forti_device.running_config.to_text())
def apply_changes(self): def apply_changes(self):
change_string = self.forti_device.compare_config() change_string = self.forti_device.compare_config()
if change_string: if change_string:
@ -184,15 +179,12 @@ class AnsibleFortios(object):
self.forti_device.close() self.forti_device.close()
self.module.exit_json(**self.result) self.module.exit_json(**self.result)
def del_block(self, block_id): def del_block(self, block_id):
self.forti_device.candidate_config[self.path].del_block(block_id) self.forti_device.candidate_config[self.path].del_block(block_id)
def add_block(self, block_id, block): def add_block(self, block_id, block):
self.forti_device.candidate_config[self.path][block_id] = block self.forti_device.candidate_config[self.path][block_id] = block
def get_error_infos(self, cli_errors): def get_error_infos(self, cli_errors):
error_list = [] error_list = []
for errors in cli_errors.args: for errors in cli_errors.args:
@ -206,4 +198,3 @@ class AnsibleFortios(object):
def get_empty_configuration_block(self, block_name, block_type): def get_empty_configuration_block(self, block_name, block_type):
return FortiConfig(block_name, block_type) return FortiConfig(block_name, block_type)

View file

@ -27,9 +27,6 @@
# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# #
from ansible.module_utils.gcp import gcp_connect
from ansible.module_utils.gcp import unexpected_error_msg as gcp_error
try: try:
from libcloud.dns.types import Provider from libcloud.dns.types import Provider
from libcloud.dns.providers import get_driver from libcloud.dns.providers import get_driver
@ -37,9 +34,13 @@ try:
except ImportError: except ImportError:
HAS_LIBCLOUD_BASE = False HAS_LIBCLOUD_BASE = False
from ansible.module_utils.gcp import gcp_connect
from ansible.module_utils.gcp import unexpected_error_msg as gcp_error
USER_AGENT_PRODUCT = "Ansible-gcdns" USER_AGENT_PRODUCT = "Ansible-gcdns"
USER_AGENT_VERSION = "v1" USER_AGENT_VERSION = "v1"
def gcdns_connect(module, provider=None): def gcdns_connect(module, provider=None):
"""Return a GCP connection for Google Cloud DNS.""" """Return a GCP connection for Google Cloud DNS."""
if not HAS_LIBCLOUD_BASE: if not HAS_LIBCLOUD_BASE:
@ -48,6 +49,7 @@ def gcdns_connect(module, provider=None):
provider = provider or Provider.GOOGLE provider = provider or Provider.GOOGLE
return gcp_connect(module, provider, get_driver, USER_AGENT_PRODUCT, USER_AGENT_VERSION) return gcp_connect(module, provider, get_driver, USER_AGENT_PRODUCT, USER_AGENT_VERSION)
def unexpected_error_msg(error): def unexpected_error_msg(error):
"""Create an error string based on passed in error.""" """Create an error string based on passed in error."""
return gcp_error(error) return gcp_error(error)

View file

@ -25,10 +25,6 @@
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#
from ansible.module_utils.gcp import gcp_connect
from ansible.module_utils.gcp import unexpected_error_msg as gcp_error
try: try:
from libcloud.compute.types import Provider from libcloud.compute.types import Provider
@ -37,9 +33,13 @@ try:
except ImportError: except ImportError:
HAS_LIBCLOUD_BASE = False HAS_LIBCLOUD_BASE = False
from ansible.module_utils.gcp import gcp_connect
from ansible.module_utils.gcp import unexpected_error_msg as gcp_error
USER_AGENT_PRODUCT = "Ansible-gce" USER_AGENT_PRODUCT = "Ansible-gce"
USER_AGENT_VERSION = "v1" USER_AGENT_VERSION = "v1"
def gce_connect(module, provider=None): def gce_connect(module, provider=None):
"""Return a GCP connection for Google Compute Engine.""" """Return a GCP connection for Google Compute Engine."""
if not HAS_LIBCLOUD_BASE: if not HAS_LIBCLOUD_BASE:
@ -48,6 +48,7 @@ def gce_connect(module, provider=None):
return gcp_connect(module, provider, get_driver, USER_AGENT_PRODUCT, USER_AGENT_VERSION) return gcp_connect(module, provider, get_driver, USER_AGENT_PRODUCT, USER_AGENT_VERSION)
def unexpected_error_msg(error): def unexpected_error_msg(error):
"""Create an error string based on passed in error.""" """Create an error string based on passed in error."""
return gcp_error(error) return gcp_error(error)

View file

@ -502,8 +502,7 @@ class GCPUtils(object):
@staticmethod @staticmethod
def underscore_to_camel(txt): def underscore_to_camel(txt):
return txt.split('_')[0] + ''.join(x.capitalize() return txt.split('_')[0] + ''.join(x.capitalize() or '_' for x in txt.split('_')[1:])
or '_' for x in txt.split('_')[1:])
@staticmethod @staticmethod
def remove_non_gcp_params(params): def remove_non_gcp_params(params):
@ -626,7 +625,7 @@ class GCPUtils(object):
# TODO(supertom): Isolate 'build-new-request' stuff. # TODO(supertom): Isolate 'build-new-request' stuff.
resource_name_singular = GCPUtils.get_entity_name_from_resource_name( resource_name_singular = GCPUtils.get_entity_name_from_resource_name(
resource_name) resource_name)
if op_resp['operationType'] == 'insert' or not 'entity_name' in parsed_url: if op_resp['operationType'] == 'insert' or 'entity_name' not in parsed_url:
parsed_url['entity_name'] = GCPUtils.parse_gcp_url(op_resp['targetLink'])[ parsed_url['entity_name'] = GCPUtils.parse_gcp_url(op_resp['targetLink'])[
'entity_name'] 'entity_name']
args = {'project': project_id, args = {'project': project_id,

View file

@ -29,6 +29,7 @@ try:
except ImportError: except ImportError:
import simplejson as json import simplejson as json
# NB: a copy of this function exists in ../../modules/core/async_wrapper.py. Ensure any # NB: a copy of this function exists in ../../modules/core/async_wrapper.py. Ensure any
# changes are propagated there. # changes are propagated there.
def _filter_non_json_lines(data): def _filter_non_json_lines(data):

View file

@ -47,6 +47,7 @@ ARGS_DEFAULT_VALUE = {
'timeout': 10 'timeout': 10
} }
def check_args(module, warnings): def check_args(module, warnings):
provider = module.params['provider'] or {} provider = module.params['provider'] or {}
for key in junos_argument_spec: for key in junos_argument_spec:
@ -66,6 +67,7 @@ def check_args(module, warnings):
if provider.get(param): if provider.get(param):
module.no_log_values.update(return_values(provider[param])) module.no_log_values.update(return_values(provider[param]))
def _validate_rollback_id(module, value): def _validate_rollback_id(module, value):
try: try:
if not 0 <= int(value) <= 49: if not 0 <= int(value) <= 49:
@ -73,6 +75,7 @@ def _validate_rollback_id(module, value):
except ValueError: except ValueError:
module.fail_json(msg='rollback must be between 0 and 49') module.fail_json(msg='rollback must be between 0 and 49')
def load_configuration(module, candidate=None, action='merge', rollback=None, format='xml'): def load_configuration(module, candidate=None, action='merge', rollback=None, format='xml'):
if all((candidate is None, rollback is None)): if all((candidate is None, rollback is None)):
@ -117,6 +120,7 @@ def load_configuration(module, candidate=None, action='merge', rollback=None, fo
cfg.append(candidate) cfg.append(candidate)
return send_request(module, obj) return send_request(module, obj)
def get_configuration(module, compare=False, format='xml', rollback='0'): def get_configuration(module, compare=False, format='xml', rollback='0'):
if format not in CONFIG_FORMATS: if format not in CONFIG_FORMATS:
module.fail_json(msg='invalid config format specified') module.fail_json(msg='invalid config format specified')
@ -127,6 +131,7 @@ def get_configuration(module, compare=False, format='xml', rollback='0'):
xattrs['rollback'] = str(rollback) xattrs['rollback'] = str(rollback)
return send_request(module, Element('get-configuration', xattrs)) return send_request(module, Element('get-configuration', xattrs))
def commit_configuration(module, confirm=False, check=False, comment=None, confirm_timeout=None): def commit_configuration(module, confirm=False, check=False, comment=None, confirm_timeout=None):
obj = Element('commit-configuration') obj = Element('commit-configuration')
if confirm: if confirm:
@ -141,6 +146,7 @@ def commit_configuration(module, confirm=False, check=False, comment=None, confi
subele.text = str(confirm_timeout) subele.text = str(confirm_timeout)
return send_request(module, obj) return send_request(module, obj)
def command(module, command, format='text', rpc_only=False): def command(module, command, format='text', rpc_only=False):
xattrs = {'format': format} xattrs = {'format': format}
if rpc_only: if rpc_only:
@ -148,8 +154,14 @@ def command(module, command, format='text', rpc_only=False):
xattrs['format'] = 'text' xattrs['format'] = 'text'
return send_request(module, Element('command', xattrs, text=command)) return send_request(module, Element('command', xattrs, text=command))
lock_configuration = lambda x: send_request(x, Element('lock-configuration'))
unlock_configuration = lambda x: send_request(x, Element('unlock-configuration')) def lock_configuration(x):
return send_request(x, Element('lock-configuration'))
def unlock_configuration(x):
return send_request(x, Element('unlock-configuration'))
@contextmanager @contextmanager
def locked_config(module): def locked_config(module):
@ -159,6 +171,7 @@ def locked_config(module):
finally: finally:
unlock_configuration(module) unlock_configuration(module)
def get_diff(module): def get_diff(module):
reply = get_configuration(module, compare=True, format='text') reply = get_configuration(module, compare=True, format='text')
@ -166,6 +179,7 @@ def get_diff(module):
if output is not None: if output is not None:
return to_text(output.text, encoding='latin1').strip() return to_text(output.text, encoding='latin1').strip()
def load_config(module, candidate, warnings, action='merge', commit=False, format='xml', def load_config(module, candidate, warnings, action='merge', commit=False, format='xml',
comment=None, confirm=False, confirm_timeout=None): comment=None, confirm=False, confirm_timeout=None):
@ -192,5 +206,6 @@ def load_config(module, candidate, warnings, action='merge', commit=False, forma
return diff return diff
def get_param(module, key): def get_param(module, key):
return module.params[key] or module.params['provider'].get(key) return module.params[key] or module.params['provider'].get(key)

View file

@ -38,12 +38,14 @@ except ImportError:
# httplib/http.client connection using unix domain socket # httplib/http.client connection using unix domain socket
import socket import socket
import ssl import ssl
try: try:
from httplib import HTTPConnection, HTTPSConnection from httplib import HTTPConnection, HTTPSConnection
except ImportError: except ImportError:
# Python 3 # Python 3
from http.client import HTTPConnection, HTTPSConnection from http.client import HTTPConnection, HTTPSConnection
class UnixHTTPConnection(HTTPConnection): class UnixHTTPConnection(HTTPConnection):
def __init__(self, path): def __init__(self, path):
HTTPConnection.__init__(self, 'localhost') HTTPConnection.__init__(self, 'localhost')
@ -54,11 +56,13 @@ class UnixHTTPConnection(HTTPConnection):
sock.connect(self.path) sock.connect(self.path)
self.sock = sock self.sock = sock
class LXDClientException(Exception): class LXDClientException(Exception):
def __init__(self, msg, **kwargs): def __init__(self, msg, **kwargs):
self.msg = msg self.msg = msg
self.kwargs = kwargs self.kwargs = kwargs
class LXDClient(object): class LXDClient(object):
def __init__(self, url, key_file=None, cert_file=None, debug=False): def __init__(self, url, key_file=None, cert_file=None, debug=False):
"""LXD Client. """LXD Client.

View file

@ -35,6 +35,7 @@ try:
except ImportError: except ImportError:
mysqldb_found = False mysqldb_found = False
def mysql_connect(module, login_user=None, login_password=None, config_file='', ssl_cert=None, ssl_key=None, ssl_ca=None, db=None, cursor_class=None, def mysql_connect(module, login_user=None, login_password=None, config_file='', ssl_cert=None, ssl_key=None, ssl_ca=None, db=None, cursor_class=None,
connect_timeout=30): connect_timeout=30):
config = {} config = {}

View file

@ -92,13 +92,20 @@ class ConfigLine(object):
assert isinstance(obj, ConfigLine), 'child must be of type `ConfigLine`' assert isinstance(obj, ConfigLine), 'child must be of type `ConfigLine`'
self._children.append(obj) self._children.append(obj)
def ignore_line(text, tokens=None): def ignore_line(text, tokens=None):
for item in (tokens or DEFAULT_COMMENT_TOKENS): for item in (tokens or DEFAULT_COMMENT_TOKENS):
if text.startswith(item): if text.startswith(item):
return True return True
_obj_to_text = lambda x: [o.text for o in x]
_obj_to_raw = lambda x: [o.raw for o in x] def _obj_to_text(x):
return [o.text for o in x]
def _obj_to_raw(x):
return [o.raw for o in x]
def _obj_to_block(objects, visited=None): def _obj_to_block(objects, visited=None):
items = list() items = list()
@ -110,6 +117,7 @@ def _obj_to_block(objects, visited=None):
items.append(child) items.append(child)
return _obj_to_raw(items) return _obj_to_raw(items)
def dumps(objects, output='block', comments=False): def dumps(objects, output='block', comments=False):
if output == 'block': if output == 'block':
items = _obj_to_block(objects) items = _obj_to_block(objects)
@ -130,6 +138,7 @@ def dumps(objects, output='block', comments=False):
return '\n'.join(items) return '\n'.join(items)
class NetworkConfig(object): class NetworkConfig(object):
def __init__(self, indent=1, contents=None): def __init__(self, indent=1, contents=None):
@ -328,7 +337,7 @@ class NetworkConfig(object):
offset = 0 offset = 0
obj = None obj = None
## global config command # global config command
if not parents: if not parents:
for line in lines: for line in lines:
item = ConfigLine(line) item = ConfigLine(line)

View file

@ -24,17 +24,16 @@
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#
import re import re
import time
import shlex import shlex
import time
from ansible.module_utils.basic import BOOLEANS_TRUE, BOOLEANS_FALSE from ansible.module_utils.basic import BOOLEANS_TRUE, BOOLEANS_FALSE, get_exception
from ansible.module_utils.basic import get_exception
from ansible.module_utils.six import string_types, text_type from ansible.module_utils.six import string_types, text_type
from ansible.module_utils.six.moves import zip from ansible.module_utils.six.moves import zip
def to_list(val): def to_list(val):
if isinstance(val, (list, tuple)): if isinstance(val, (list, tuple)):
return list(val) return list(val)
@ -49,16 +48,19 @@ class FailedConditionsError(Exception):
super(FailedConditionsError, self).__init__(msg) super(FailedConditionsError, self).__init__(msg)
self.failed_conditions = failed_conditions self.failed_conditions = failed_conditions
class FailedConditionalError(Exception): class FailedConditionalError(Exception):
def __init__(self, msg, failed_conditional): def __init__(self, msg, failed_conditional):
super(FailedConditionalError, self).__init__(msg) super(FailedConditionalError, self).__init__(msg)
self.failed_conditional = failed_conditional self.failed_conditional = failed_conditional
class AddCommandError(Exception): class AddCommandError(Exception):
def __init__(self, msg, command): def __init__(self, msg, command):
super(AddCommandError, self).__init__(msg) super(AddCommandError, self).__init__(msg)
self.command = command self.command = command
class AddConditionError(Exception): class AddConditionError(Exception):
def __init__(self, msg, condition): def __init__(self, msg, condition):
super(AddConditionError, self).__init__(msg) super(AddConditionError, self).__init__(msg)
@ -105,6 +107,7 @@ class Cli(object):
return responses return responses
class Command(object): class Command(object):
def __init__(self, command, output=None, prompt=None, response=None, def __init__(self, command, output=None, prompt=None, response=None,
@ -122,6 +125,7 @@ class Command(object):
def __str__(self): def __str__(self):
return self.command_string return self.command_string
class CommandRunner(object): class CommandRunner(object):
def __init__(self, module): def __init__(self, module):

View file

@ -26,14 +26,13 @@
# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# #
from contextlib import contextmanager from contextlib import contextmanager
from xml.etree.ElementTree import Element, SubElement from xml.etree.ElementTree import Element, SubElement, fromstring, tostring
from xml.etree.ElementTree import tostring, fromstring
from ansible.module_utils.connection import exec_command from ansible.module_utils.connection import exec_command
NS_MAP = {'nc': "urn:ietf:params:xml:ns:netconf:base:1.0"} NS_MAP = {'nc': "urn:ietf:params:xml:ns:netconf:base:1.0"}
def send_request(module, obj, check_rc=True): def send_request(module, obj, check_rc=True):
request = tostring(obj) request = tostring(obj)
rc, out, err = exec_command(module, request) rc, out, err = exec_command(module, request)
@ -58,6 +57,7 @@ def send_request(module, obj, check_rc=True):
return warnings return warnings
return fromstring(out) return fromstring(out)
def children(root, iterable): def children(root, iterable):
for item in iterable: for item in iterable:
try: try:
@ -65,33 +65,40 @@ def children(root, iterable):
except NameError: except NameError:
ele = SubElement(root, item) ele = SubElement(root, item)
def lock(module, target='candidate'): def lock(module, target='candidate'):
obj = Element('lock') obj = Element('lock')
children(obj, ('target', target)) children(obj, ('target', target))
return send_request(module, obj) return send_request(module, obj)
def unlock(module, target='candidate'): def unlock(module, target='candidate'):
obj = Element('unlock') obj = Element('unlock')
children(obj, ('target', target)) children(obj, ('target', target))
return send_request(module, obj) return send_request(module, obj)
def commit(module): def commit(module):
return send_request(module, Element('commit')) return send_request(module, Element('commit'))
def discard_changes(module): def discard_changes(module):
return send_request(module, Element('discard-changes')) return send_request(module, Element('discard-changes'))
def validate(module): def validate(module):
obj = Element('validate') obj = Element('validate')
children(obj, ('source', 'candidate')) children(obj, ('source', 'candidate'))
return send_request(module, obj) return send_request(module, obj)
def get_config(module, source='running', filter=None): def get_config(module, source='running', filter=None):
obj = Element('get-config') obj = Element('get-config')
children(obj, ('source', source)) children(obj, ('source', source))
children(obj, ('filter', filter)) children(obj, ('filter', filter))
return send_request(module, obj) return send_request(module, obj)
@contextmanager @contextmanager
def locked_config(module): def locked_config(module):
try: try:

View file

@ -52,6 +52,7 @@ NET_CONNECTION_ARGS = dict()
NET_CONNECTIONS = dict() NET_CONNECTIONS = dict()
def _transitional_argument_spec(): def _transitional_argument_spec():
argument_spec = {} argument_spec = {}
for key, value in iteritems(NET_TRANSPORT_ARGS): for key, value in iteritems(NET_TRANSPORT_ARGS):
@ -59,6 +60,7 @@ def _transitional_argument_spec():
argument_spec[key] = value argument_spec[key] = value
return argument_spec return argument_spec
def to_list(val): def to_list(val):
if isinstance(val, (list, tuple)): if isinstance(val, (list, tuple)):
return list(val) return list(val)
@ -75,12 +77,14 @@ class ModuleStub(object):
self.params[key] = value.get('default') self.params[key] = value.get('default')
self.fail_json = fail_json self.fail_json = fail_json
class NetworkError(Exception): class NetworkError(Exception):
def __init__(self, msg, **kwargs): def __init__(self, msg, **kwargs):
super(NetworkError, self).__init__(msg) super(NetworkError, self).__init__(msg)
self.kwargs = kwargs self.kwargs = kwargs
class Config(object): class Config(object):
def __init__(self, connection): def __init__(self, connection):
@ -185,6 +189,7 @@ class NetworkModule(AnsibleModule):
exc = get_exception() exc = get_exception()
self.fail_json(msg=to_native(exc)) self.fail_json(msg=to_native(exc))
def register_transport(transport, default=False): def register_transport(transport, default=False):
def register(cls): def register(cls):
NET_CONNECTIONS[transport] = cls NET_CONNECTIONS[transport] = cls
@ -193,6 +198,6 @@ def register_transport(transport, default=False):
return cls return cls
return register return register
def add_argument(key, value): def add_argument(key, value):
NET_CONNECTION_ARGS[key] = value NET_CONNECTION_ARGS[key] = value

View file

@ -24,9 +24,10 @@
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#
from ansible.module_utils.six import iteritems
from ansible.module_utils.basic import AnsibleFallbackNotFound from ansible.module_utils.basic import AnsibleFallbackNotFound
from ansible.module_utils.six import iteritems
def to_list(val): def to_list(val):
if isinstance(val, (list, tuple, set)): if isinstance(val, (list, tuple, set)):
@ -36,6 +37,7 @@ def to_list(val):
else: else:
return list() return list()
class ComplexDict(object): class ComplexDict(object):
"""Transforms a dict to with an argument spec """Transforms a dict to with an argument spec
@ -88,7 +90,6 @@ class ComplexDict(object):
self_has_key = True self_has_key = True
attr['required'] = True attr['required'] = True
def _dict(self, value): def _dict(self, value):
obj = {} obj = {}
for name, attr in iteritems(self._attributes): for name, attr in iteritems(self._attributes):
@ -131,8 +132,7 @@ class ComplexDict(object):
if 'choices' in attr: if 'choices' in attr:
if value[name] not in attr['choices']: if value[name] not in attr['choices']:
raise ValueError('%s must be one of %s, got %s' % \ raise ValueError('%s must be one of %s, got %s' % (name, ', '.join(attr['choices']), value[name]))
(name, ', '.join(attr['choices']), value[name]))
if value[name] is not None: if value[name] is not None:
value_type = attr.get('type', 'str') value_type = attr.get('type', 'str')
@ -141,6 +141,7 @@ class ComplexDict(object):
return value return value
class ComplexList(ComplexDict): class ComplexList(ComplexDict):
"""Extends ```ComplexDict``` to handle a list of dicts """ """Extends ```ComplexDict``` to handle a list of dicts """
@ -148,4 +149,3 @@ class ComplexList(ComplexDict):
if not isinstance(values, (list, tuple)): if not isinstance(values, (list, tuple)):
raise TypeError('value must be an ordered iterable') raise TypeError('value must be an ordered iterable')
return [(super(ComplexList, self).__call__(v)) for v in values] return [(super(ComplexList, self).__call__(v)) for v in values]

View file

@ -30,6 +30,7 @@ import os
from ansible.module_utils.six import iteritems from ansible.module_utils.six import iteritems
def openstack_argument_spec(): def openstack_argument_spec():
# DEPRECATED: This argument spec is only used for the deprecated old # DEPRECATED: This argument spec is only used for the deprecated old
# OpenStack modules. It turns out that modern OpenStack auth is WAY # OpenStack modules. It turns out that modern OpenStack auth is WAY
@ -47,7 +48,7 @@ def openstack_argument_spec():
login_username=dict(default=OS_USERNAME), login_username=dict(default=OS_USERNAME),
auth_url=dict(default=OS_AUTH_URL), auth_url=dict(default=OS_AUTH_URL),
region_name=dict(default=OS_REGION_NAME), region_name=dict(default=OS_REGION_NAME),
availability_zone = dict(default=None), availability_zone=dict(),
) )
if OS_PASSWORD: if OS_PASSWORD:
spec['login_password'] = dict(default=OS_PASSWORD) spec['login_password'] = dict(default=OS_PASSWORD)
@ -59,6 +60,7 @@ def openstack_argument_spec():
spec['login_tenant_name'] = dict(required=True) spec['login_tenant_name'] = dict(required=True)
return spec return spec
def openstack_find_nova_addresses(addresses, ext_tag, key_name=None): def openstack_find_nova_addresses(addresses, ext_tag, key_name=None):
ret = [] ret = []
@ -71,6 +73,7 @@ def openstack_find_nova_addresses(addresses, ext_tag, key_name=None):
ret.append(interface_spec['addr']) ret.append(interface_spec['addr'])
return ret return ret
def openstack_full_argument_spec(**kwargs): def openstack_full_argument_spec(**kwargs):
spec = dict( spec = dict(
cloud=dict(default=None), cloud=dict(default=None),

View file

@ -37,6 +37,7 @@ from ansible.module_utils.urls import fetch_url, url_argument_spec
add_argument('use_ssl', dict(default=True, type='bool')) add_argument('use_ssl', dict(default=True, type='bool'))
add_argument('validate_certs', dict(default=True, type='bool')) add_argument('validate_certs', dict(default=True, type='bool'))
def get_opsidl(): def get_opsidl():
extschema = restparser.parseSchema(settings.get('ext_schema')) extschema = restparser.parseSchema(settings.get('ext_schema'))
ovsschema = settings.get('ovs_schema') ovsschema = settings.get('ovs_schema')
@ -129,7 +130,7 @@ class Rest(object):
def authorize(self, params, **kwargs): def authorize(self, params, **kwargs):
raise NotImplementedError raise NotImplementedError
### REST methods ### # REST methods
def _url_builder(self, path): def _url_builder(self, path):
if path[0] == '/': if path[0] == '/':
@ -160,12 +161,12 @@ class Rest(object):
def delete(self, path, data=None, headers=None): def delete(self, path, data=None, headers=None):
return self.request('DELETE', path, data, headers) return self.request('DELETE', path, data, headers)
### Command methods ### # Command methods
def run_commands(self, commands): def run_commands(self, commands):
raise NotImplementedError raise NotImplementedError
### Config methods ### # Config methods
def configure(self, commands): def configure(self, commands):
path = '/system/full-configuration' path = '/system/full-configuration'
@ -212,7 +213,7 @@ class Cli(CliBase):
NET_PASSWD_RE = re.compile(r"[\r\n]?password: $", re.I) NET_PASSWD_RE = re.compile(r"[\r\n]?password: $", re.I)
### Config methods ### # Config methods
def configure(self, commands, **kwargs): def configure(self, commands, **kwargs):
cmds = ['configure terminal'] cmds = ['configure terminal']

View file

@ -1,5 +1,6 @@
_DEVICE_CONFIGS = {} _DEVICE_CONFIGS = {}
def get_config(module, flags=[]): def get_config(module, flags=[]):
cmd = 'show running-config ' cmd = 'show running-config '
cmd += ' '.join(flags) cmd += ' '.join(flags)

View file

@ -504,7 +504,6 @@ class BaseModule(object):
after[k] = update[k] after[k] = update[k]
return after return after
def create( def create(
self, self,
entity=None, entity=None,
@ -579,9 +578,14 @@ class BaseModule(object):
# Wait for the entity to be created and to be in the defined state: # Wait for the entity to be created and to be in the defined state:
entity_service = self._service.service(entity.id) entity_service = self._service.service(entity.id)
state_condition = lambda entity: entity def state_condition(entity):
return entity
if result_state: if result_state:
state_condition = lambda entity: entity and entity.status == result_state
def state_condition(entity):
return entity and entity.status == result_state
wait( wait(
service=entity_service, service=entity_service,
condition=state_condition, condition=state_condition,

View file

@ -27,24 +27,21 @@
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# standard ansible imports
from ansible.module_utils.basic import get_exception
# standard PG imports
HAS_PSYCOPG2 = False
try: try:
import psycopg2 import psycopg2
import psycopg2.extras import psycopg2.extras
except ImportError:
pass
else:
HAS_PSYCOPG2 = True HAS_PSYCOPG2 = True
except ImportError:
HAS_PSYCOPG2 = False
from ansible.module_utils.basic import get_exception
from ansible.module_utils.six import iteritems from ansible.module_utils.six import iteritems
class LibraryError(Exception): class LibraryError(Exception):
pass pass
def ensure_libs(sslrootcert=None): def ensure_libs(sslrootcert=None):
if not HAS_PSYCOPG2: if not HAS_PSYCOPG2:
raise LibraryError('psycopg2 is not installed. we need psycopg2.') raise LibraryError('psycopg2 is not installed. we need psycopg2.')
@ -54,6 +51,7 @@ def ensure_libs(sslrootcert=None):
# no problems # no problems
return None return None
def postgres_common_argument_spec(): def postgres_common_argument_spec():
return dict( return dict(
login_user=dict(default='postgres'), login_user=dict(default='postgres'),
@ -62,6 +60,5 @@ def postgres_common_argument_spec():
login_unix_socket=dict(default=''), login_unix_socket=dict(default=''),
port=dict(type='int', default=5432), port=dict(type='int', default=5432),
ssl_mode=dict(default='prefer', choices=['disable', 'allow', 'prefer', 'require', 'verify-ca', 'verify-full']), ssl_mode=dict(default='prefer', choices=['disable', 'allow', 'prefer', 'require', 'verify-ca', 'verify-full']),
ssl_rootcert = dict(default=None), ssl_rootcert=dict(),
) )

View file

@ -25,10 +25,10 @@
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#
import sys import sys
def get_exception(): def get_exception():
"""Get the current exception. """Get the current exception.

View file

@ -277,4 +277,3 @@ class RhsmPools(object):
for product in self.products: for product in self.products:
if r.search(product._name): if r.search(product._name):
yield product yield product

View file

@ -25,20 +25,20 @@
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#
import os
import shlex
import subprocess
import glob import glob
import select import os
import pickle import pickle
import platform import platform
import select
import shlex
import subprocess
import traceback import traceback
from ansible.module_utils.six import PY2, b from ansible.module_utils.six import PY2, b
from ansible.module_utils._text import to_bytes, to_text from ansible.module_utils._text import to_bytes, to_text
def sysv_is_enabled(name): def sysv_is_enabled(name):
''' '''
This function will check if the service name supplied This function will check if the service name supplied
@ -48,6 +48,7 @@ def sysv_is_enabled(name):
''' '''
return bool(glob.glob('/etc/rc?.d/S??%s' % name)) return bool(glob.glob('/etc/rc?.d/S??%s' % name))
def get_sysv_script(name): def get_sysv_script(name):
''' '''
This function will return the expected path for an init script This function will return the expected path for an init script
@ -62,6 +63,7 @@ def get_sysv_script(name):
return result return result
def sysv_exists(name): def sysv_exists(name):
''' '''
This function will return True or False depending on This function will return True or False depending on
@ -71,6 +73,7 @@ def sysv_exists(name):
''' '''
return os.path.exists(get_sysv_script(name)) return os.path.exists(get_sysv_script(name))
def fail_if_missing(module, found, service, msg=''): def fail_if_missing(module, found, service, msg=''):
''' '''
This function will return an error or exit gracefully depending on check mode status This function will return an error or exit gracefully depending on check mode status
@ -87,6 +90,7 @@ def fail_if_missing(module, found, service, msg=''):
else: else:
module.fail_json(msg='Could not find the requested service %s: %s' % (service, msg)) module.fail_json(msg='Could not find the requested service %s: %s' % (service, msg))
def daemonize(module, cmd): def daemonize(module, cmd):
''' '''
Execute a command while detaching as a deamon, returns rc, stdout, and stderr. Execute a command while detaching as a deamon, returns rc, stdout, and stderr.
@ -207,6 +211,7 @@ def daemonize(module, cmd):
# py2 and py3) # py2 and py3)
return pickle.loads(to_bytes(return_data, errors=errors)) return pickle.loads(to_bytes(return_data, errors=errors))
def check_ps(module, pattern): def check_ps(module, pattern):
# Set ps flags # Set ps flags

View file

@ -281,5 +281,8 @@ class CliBase(object):
exc = get_exception() exc = get_exception()
raise NetworkError(to_native(exc)) raise NetworkError(to_native(exc))
run_commands = lambda self, x: self.execute(to_list(x)) def run_commands(self, x):
exec_command = lambda self, x: self.shell.send(self.to_command(x)) return self.execute(to_list(x))
def exec_command(self, x):
return self.shell.send(self.to_command(x))

View file

@ -26,6 +26,7 @@
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
def _get_quote_state(token, quote_char): def _get_quote_state(token, quote_char):
''' '''
the goal of this block is to determine if the quoted string the goal of this block is to determine if the quoted string
@ -45,6 +46,7 @@ def _get_quote_state(token, quote_char):
quote_char = cur_char quote_char = cur_char
return quote_char return quote_char
def _count_jinja2_blocks(token, cur_depth, open_token, close_token): def _count_jinja2_blocks(token, cur_depth, open_token, close_token):
''' '''
this function counts the number of opening/closing blocks for a this function counts the number of opening/closing blocks for a
@ -59,6 +61,7 @@ def _count_jinja2_blocks(token, cur_depth, open_token, close_token):
cur_depth = 0 cur_depth = 0
return cur_depth return cur_depth
def split_args(args): def split_args(args):
''' '''
Splits args on whitespace, but intelligently reassembles Splits args on whitespace, but intelligently reassembles
@ -201,12 +204,13 @@ def split_args(args):
return params return params
def is_quoted(data): def is_quoted(data):
return len(data) > 0 and (data[0] == '"' and data[-1] == '"' or data[0] == "'" and data[-1] == "'") return len(data) > 0 and (data[0] == '"' and data[-1] == '"' or data[0] == "'" and data[-1] == "'")
def unquote(data): def unquote(data):
''' removes first and last quotes from a string, if the string starts and ends with the same quotes ''' ''' removes first and last quotes from a string, if the string starts and ends with the same quotes '''
if is_quoted(data): if is_quoted(data):
return data[1:-1] return data[1:-1]
return data return data

View file

@ -118,7 +118,7 @@ def uldap():
base=base_dn(), base=base_dn(),
binddn=bind_dn, binddn=bind_dn,
bindpw=pwd, bindpw=pwd,
start_tls = 1 start_tls=1,
) )
return _singleton('uldap', construct) return _singleton('uldap', construct)

View file

@ -206,17 +206,14 @@ except ImportError:
HAS_MATCH_HOSTNAME = False HAS_MATCH_HOSTNAME = False
if not HAS_MATCH_HOSTNAME: if not HAS_MATCH_HOSTNAME:
### # The following block of code is under the terms and conditions of the
### The following block of code is under the terms and conditions of the # Python Software Foundation License
### Python Software Foundation License
###
"""The match_hostname() function from Python 3.4, essential when using SSL.""" """The match_hostname() function from Python 3.4, essential when using SSL."""
class CertificateError(ValueError): class CertificateError(ValueError):
pass pass
def _dnsname_match(dn, hostname, max_wildcards=1): def _dnsname_match(dn, hostname, max_wildcards=1):
"""Matching according to RFC 6125, section 6.4.3 """Matching according to RFC 6125, section 6.4.3
@ -269,7 +266,6 @@ if not HAS_MATCH_HOSTNAME:
pat = re.compile(r'\A' + r'\.'.join(pats) + r'\Z', re.IGNORECASE) pat = re.compile(r'\A' + r'\.'.join(pats) + r'\Z', re.IGNORECASE)
return pat.match(hostname) return pat.match(hostname)
def match_hostname(cert, hostname): def match_hostname(cert, hostname):
"""Verify that *cert* (in decoded format as returned by """Verify that *cert* (in decoded format as returned by
SSLSocket.getpeercert()) matches the *hostname*. RFC 2818 and RFC 6125 SSLSocket.getpeercert()) matches the *hostname*. RFC 2818 and RFC 6125
@ -299,20 +295,13 @@ if not HAS_MATCH_HOSTNAME:
return return
dnsnames.append(value) dnsnames.append(value)
if len(dnsnames) > 1: if len(dnsnames) > 1:
raise CertificateError("hostname %r " raise CertificateError("hostname %r " "doesn't match either of %s" % (hostname, ', '.join(map(repr, dnsnames))))
"doesn't match either of %s"
% (hostname, ', '.join(map(repr, dnsnames))))
elif len(dnsnames) == 1: elif len(dnsnames) == 1:
raise CertificateError("hostname %r " raise CertificateError("hostname %r doesn't match %r" % (hostname, dnsnames[0]))
"doesn't match %r"
% (hostname, dnsnames[0]))
else: else:
raise CertificateError("no appropriate commonName or " raise CertificateError("no appropriate commonName or subjectAltName fields were found")
"subjectAltName fields were found")
### # End of Python Software Foundation Licensed code
### End of Python Software Foundation Licensed code
###
HAS_MATCH_HOSTNAME = True HAS_MATCH_HOSTNAME = True
@ -552,8 +541,7 @@ def RedirectHandlerFactory(follow_redirects=None, validate_certs=True):
# be conciliant with URIs containing a space # be conciliant with URIs containing a space
newurl = newurl.replace(' ', '%20') newurl = newurl.replace(' ', '%20')
newheaders = dict((k, v) for k, v in req.headers.items() newheaders = dict((k, v) for k, v in req.headers.items()
if k.lower() not in ("content-length", "content-type") if k.lower() not in ("content-length", "content-type"))
)
try: try:
# Python 2-3.3 # Python 2-3.3
origin_req_host = req.get_origin_req_host() origin_req_host = req.get_origin_req_host()

View file

@ -15,6 +15,7 @@
# along with Ansible. If not, see <http://www.gnu.org/licenses/>. # along with Ansible. If not, see <http://www.gnu.org/licenses/>.
import os import os
try: try:
from pyvcloud.vcloudair import VCA from pyvcloud.vcloudair import VCA
HAS_PYVCLOUD = True HAS_PYVCLOUD = True
@ -29,12 +30,14 @@ LOGIN_HOST = {'vca': 'vca.vmware.com', 'vchs': 'vchs.vmware.com'}
DEFAULT_SERVICE_TYPE = 'vca' DEFAULT_SERVICE_TYPE = 'vca'
DEFAULT_VERSION = '5.7' DEFAULT_VERSION = '5.7'
class VcaError(Exception): class VcaError(Exception):
def __init__(self, msg, **kwargs): def __init__(self, msg, **kwargs):
self.kwargs = kwargs self.kwargs = kwargs
super(VcaError, self).__init__(msg) super(VcaError, self).__init__(msg)
def vca_argument_spec(): def vca_argument_spec():
return dict( return dict(
username=dict(type='str', aliases=['user'], required=True), username=dict(type='str', aliases=['user'], required=True),
@ -50,6 +53,7 @@ def vca_argument_spec():
verify_certs=dict(type='bool', default=True) verify_certs=dict(type='bool', default=True)
) )
class VcaAnsibleModule(AnsibleModule): class VcaAnsibleModule(AnsibleModule):
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
@ -193,7 +197,6 @@ class VcaAnsibleModule(AnsibleModule):
self.exit_json(**kwargs) self.exit_json(**kwargs)
# ------------------------------------------------------------- # -------------------------------------------------------------
# 9/18/2015 @privateip # 9/18/2015 @privateip
# All of the functions below here were migrated from the original # All of the functions below here were migrated from the original
@ -206,6 +209,7 @@ VCA_REQ_ARGS = ['instance_id', 'vdc_name']
VCHS_REQ_ARGS = ['service_id'] VCHS_REQ_ARGS = ['service_id']
VCD_REQ_ARGS = [] VCD_REQ_ARGS = []
def _validate_module(module): def _validate_module(module):
if not HAS_PYVCLOUD: if not HAS_PYVCLOUD:
module.fail_json(msg="python module pyvcloud is needed for this module") module.fail_json(msg="python module pyvcloud is needed for this module")
@ -237,6 +241,7 @@ def serialize_instances(instance_list):
instances.append(dict(apiUrl=i['apiUrl'], instance_id=i['id'])) instances.append(dict(apiUrl=i['apiUrl'], instance_id=i['id']))
return instances return instances
def _vca_login(vca, password, instance): def _vca_login(vca, password, instance):
if not vca.login(password=password): if not vca.login(password=password):
raise VcaError("Login Failed: Please check username or password", raise VcaError("Login Failed: Please check username or password",
@ -249,6 +254,7 @@ def _vca_login(vca, password, instance):
return vca return vca
def _vchs_login(vca, password, service, org): def _vchs_login(vca, password, service, org):
if not vca.login(password=password): if not vca.login(password=password):
raise VcaError("Login Failed: Please check username or password", raise VcaError("Login Failed: Please check username or password",
@ -272,6 +278,7 @@ def _vcd_login(vca, password, org):
if not vca.login(token=vca.token, org=org, org_url=vca.vcloud_session.org_url): if not vca.login(token=vca.token, org=org, org_url=vca.vcloud_session.org_url):
raise VcaError("Failed to login to org", error=vca.response.content) raise VcaError("Failed to login to org", error=vca.response.content)
def vca_login(module): def vca_login(module):
service_type = module.params.get('service_type') service_type = module.params.get('service_type')
username = module.params.get('username') username = module.params.get('username')
@ -323,8 +330,3 @@ def vca_login(module):
module.fail_json(msg=e.message, **e.kwargs) module.fail_json(msg=e.message, **e.kwargs)
return vca return vca

View file

@ -21,6 +21,7 @@ __metaclass__ = type
from copy import deepcopy from copy import deepcopy
class Attribute: class Attribute:
def __init__(self, isa=None, private=False, default=None, required=False, listof=None, priority=0, class_type=None, always_post_validate=False, def __init__(self, isa=None, private=False, default=None, required=False, listof=None, priority=0, class_type=None, always_post_validate=False,

View file

@ -441,7 +441,7 @@ class Base(with_metaclass(BaseMeta, object)):
except (TypeError, ValueError) as e: except (TypeError, ValueError) as e:
raise AnsibleParserError("the field '%s' has an invalid value (%s), and could not be converted to an %s. " raise AnsibleParserError("the field '%s' has an invalid value (%s), and could not be converted to an %s. "
" Error was: %s" % (name, value, attribute.isa, e), obj=self.get_ds()) "The error was: %s" % (name, value, attribute.isa, e), obj=self.get_ds())
except (AnsibleUndefinedVariable, UndefinedError) as e: except (AnsibleUndefinedVariable, UndefinedError) as e:
if templar._fail_on_undefined_errors and name != 'name': if templar._fail_on_undefined_errors and name != 'name':
raise AnsibleParserError("the field '%s' has an invalid value, which appears to include a variable that is undefined. " raise AnsibleParserError("the field '%s' has an invalid value, which appears to include a variable that is undefined. "

View file

@ -29,6 +29,7 @@ except ImportError:
from ansible.utils.display import Display from ansible.utils.display import Display
display = Display() display = Display()
class Become: class Become:
# Privilege escalation # Privilege escalation
@ -101,4 +102,3 @@ class Become:
become_method = C.DEFAULT_BECOME_METHOD become_method = C.DEFAULT_BECOME_METHOD
if become_user is None: if become_user is None:
become_user = C.DEFAULT_BECOME_USER become_user = C.DEFAULT_BECOME_USER

View file

@ -28,6 +28,7 @@ from ansible.playbook.helpers import load_list_of_tasks
from ansible.playbook.role import Role from ansible.playbook.role import Role
from ansible.playbook.taggable import Taggable from ansible.playbook.taggable import Taggable
class Block(Base, Become, Conditional, Taggable): class Block(Base, Become, Conditional, Taggable):
# main block fields containing the task lists # main block fields containing the task lists
@ -385,4 +386,3 @@ class Block(Base, Become, Conditional, Taggable):
return self._parent.all_parents_static() return self._parent.all_parents_static()
return True return True

View file

@ -41,6 +41,7 @@ DEFINED_REGEX = re.compile(r'(hostvars\[.+\]|[\w_]+)\s+(not\s+is|is|is\s+not)\s+
LOOKUP_REGEX = re.compile(r'lookup\s*\(') LOOKUP_REGEX = re.compile(r'lookup\s*\(')
VALID_VAR_REGEX = re.compile("^[_A-Za-z][_a-zA-Z0-9]*$") VALID_VAR_REGEX = re.compile("^[_A-Za-z][_a-zA-Z0-9]*$")
class Conditional: class Conditional:
''' '''
@ -234,7 +235,4 @@ class Conditional:
# trigger the AnsibleUndefinedVariable exception again below # trigger the AnsibleUndefinedVariable exception again below
raise raise
except Exception as new_e: except Exception as new_e:
raise AnsibleUndefinedVariable( raise AnsibleUndefinedVariable("error while evaluating conditional (%s): %s" % (original, e))
"error while evaluating conditional (%s): %s" % (original, e)
)

View file

@ -22,6 +22,7 @@ __metaclass__ = type
from ansible.playbook.attribute import FieldAttribute from ansible.playbook.attribute import FieldAttribute
from ansible.playbook.task import Task from ansible.playbook.task import Task
class Handler(Task): class Handler(Task):
_listen = FieldAttribute(isa='list') _listen = FieldAttribute(isa='list')

View file

@ -20,8 +20,9 @@ from __future__ import (absolute_import, division, print_function)
__metaclass__ = type __metaclass__ = type
# from ansible.inventory.host import Host # from ansible.inventory.host import Host
from ansible.playbook.task_include import TaskInclude
from ansible.playbook.handler import Handler from ansible.playbook.handler import Handler
from ansible.playbook.task_include import TaskInclude
class HandlerTaskInclude(Handler, TaskInclude): class HandlerTaskInclude(Handler, TaskInclude):
@ -29,4 +30,3 @@ class HandlerTaskInclude(Handler, TaskInclude):
def load(data, block=None, role=None, task_include=None, variable_manager=None, loader=None): def load(data, block=None, role=None, task_include=None, variable_manager=None, loader=None):
t = HandlerTaskInclude(block=block, role=role, task_include=task_include) t = HandlerTaskInclude(block=block, role=role, task_include=task_include)
return t.load_data(data, variable_manager=variable_manager, loader=loader) return t.load_data(data, variable_manager=variable_manager, loader=loader)

View file

@ -179,9 +179,9 @@ def load_list_of_tasks(ds, play, block=None, role=None, task_include=None, use_h
include_target = templar.template(t.args['_raw_params']) include_target = templar.template(t.args['_raw_params'])
except AnsibleUndefinedVariable: except AnsibleUndefinedVariable:
raise AnsibleParserError( raise AnsibleParserError(
"Error when evaluating variable in include name: %s.\n\n" \ "Error when evaluating variable in include name: %s.\n\n"
"When using static includes, ensure that any variables used in their names are defined in vars/vars_files\n" \ "When using static includes, ensure that any variables used in their names are defined in vars/vars_files\n"
"or extra-vars passed in from the command line. Static includes cannot use variables from inventory\n" \ "or extra-vars passed in from the command line. Static includes cannot use variables from inventory\n"
"sources like group or host vars." % t.args['_raw_params'], "sources like group or host vars." % t.args['_raw_params'],
obj=task_ds, obj=task_ds,
suppress_extended_error=True, suppress_extended_error=True,
@ -209,11 +209,11 @@ def load_list_of_tasks(ds, play, block=None, role=None, task_include=None, use_h
C.DEFAULT_HANDLER_INCLUDES_STATIC and use_handlers: C.DEFAULT_HANDLER_INCLUDES_STATIC and use_handlers:
raise raise
display.deprecated( display.deprecated(
"Included file '%s' not found, however since this include is not " \ "Included file '%s' not found, however since this include is not "
"explicitly marked as 'static: yes', we will try and include it dynamically " \ "explicitly marked as 'static: yes', we will try and include it dynamically "
"later. In the future, this will be an error unless 'static: no' is used " \ "later. In the future, this will be an error unless 'static: no' is used "
"on the include task. If you do not want missing includes to be considered " \ "on the include task. If you do not want missing includes to be considered "
"dynamic, use 'static: yes' on the include or set the global ansible.cfg " \ "dynamic, use 'static: yes' on the include or set the global ansible.cfg "
"options to make all inclues static for tasks and/or handlers" % include_file, version="2.7" "options to make all inclues static for tasks and/or handlers" % include_file, version="2.7"
) )
task_list.append(t) task_list.append(t)
@ -242,7 +242,7 @@ def load_list_of_tasks(ds, play, block=None, role=None, task_include=None, use_h
if len(tags) > 0: if len(tags) > 0:
if len(ti_copy.tags) > 0: if len(ti_copy.tags) > 0:
raise AnsibleParserError( raise AnsibleParserError(
"Include tasks should not specify tags in more than one way (both via args and directly on the task). " \ "Include tasks should not specify tags in more than one way (both via args and directly on the task). "
"Mixing styles in which tags are specified is prohibited for whole import hierarchy, not only for single import statement", "Mixing styles in which tags are specified is prohibited for whole import hierarchy, not only for single import statement",
obj=task_ds, obj=task_ds,
suppress_extended_error=True, suppress_extended_error=True,
@ -275,7 +275,7 @@ def load_list_of_tasks(ds, play, block=None, role=None, task_include=None, use_h
role=role, role=role,
task_include=None, task_include=None,
variable_manager=variable_manager, variable_manager=variable_manager,
loader=loader loader=loader,
) )
# 1. the user has set the 'static' option to false or true # 1. the user has set the 'static' option to false or true
@ -293,9 +293,11 @@ def load_list_of_tasks(ds, play, block=None, role=None, task_include=None, use_h
if not templar.is_template(ir.args[param]): if not templar.is_template(ir.args[param]):
needs_templating = True needs_templating = True
break break
is_static = C.DEFAULT_TASK_INCLUDES_STATIC or \ is_static = (
(use_handlers and C.DEFAULT_HANDLER_INCLUDES_STATIC) or \ C.DEFAULT_TASK_INCLUDES_STATIC or
(use_handlers and C.DEFAULT_HANDLER_INCLUDES_STATIC) or
(not needs_templating and ir.all_parents_static() and not ir.loop) (not needs_templating and ir.all_parents_static() and not ir.loop)
)
display.debug('Determined that if include_role static is %s' % str(is_static)) display.debug('Determined that if include_role static is %s' % str(is_static))
if is_static: if is_static:
# uses compiled list from object # uses compiled list from object
@ -331,4 +333,3 @@ def load_list_of_roles(ds, play, current_role_path=None, variable_manager=None,
roles.append(i) roles.append(i)
return roles return roles

View file

@ -30,6 +30,7 @@ except ImportError:
from ansible.utils.display import Display from ansible.utils.display import Display
display = Display() display = Display()
class IncludedFile: class IncludedFile:
def __init__(self, filename, args, task): def __init__(self, filename, args, task):

View file

@ -36,4 +36,3 @@ class LoopControl(Base):
def load(data, variable_manager=None, loader=None): def load(data, variable_manager=None, loader=None):
t = LoopControl() t = LoopControl()
return t.load_data(data, variable_manager=variable_manager, loader=loader) return t.load_data(data, variable_manager=variable_manager, loader=loader)

View file

@ -20,10 +20,8 @@ from __future__ import (absolute_import, division, print_function)
__metaclass__ = type __metaclass__ = type
from ansible import constants as C from ansible import constants as C
from ansible.errors import AnsibleParserError from ansible.errors import AnsibleParserError
from ansible.module_utils.six import string_types from ansible.module_utils.six import string_types
from ansible.playbook.attribute import FieldAttribute from ansible.playbook.attribute import FieldAttribute
from ansible.playbook.base import Base from ansible.playbook.base import Base
from ansible.playbook.become import Become from ansible.playbook.become import Become

View file

@ -155,6 +155,7 @@ RESET_VARS = (
'ansible_port', 'ansible_port',
) )
class PlayContext(Base): class PlayContext(Base):
''' '''
@ -243,7 +244,6 @@ class PlayContext(Base):
if play: if play:
self.set_play(play) self.set_play(play)
def set_play(self, play): def set_play(self, play):
''' '''
Configures this connection information instance with data from Configures this connection information instance with data from
@ -464,7 +464,6 @@ class PlayContext(Base):
if task.check_mode is not None: if task.check_mode is not None:
new_info.check_mode = task.check_mode new_info.check_mode = task.check_mode
return new_info return new_info
def make_become_cmd(self, cmd, executable=None): def make_become_cmd(self, cmd, executable=None):
@ -490,18 +489,22 @@ class PlayContext(Base):
command = success_cmd command = success_cmd
# set executable to use for the privilege escalation method, with various overrides # set executable to use for the privilege escalation method, with various overrides
exe = self.become_exe or \ exe = (
getattr(self, '%s_exe' % self.become_method, None) or \ self.become_exe or
C.DEFAULT_BECOME_EXE or \ getattr(self, '%s_exe' % self.become_method, None) or
getattr(C, 'DEFAULT_%s_EXE' % self.become_method.upper(), None) or \ C.DEFAULT_BECOME_EXE or
getattr(C, 'DEFAULT_%s_EXE' % self.become_method.upper(), None) or
self.become_method self.become_method
)
# set flags to use for the privilege escalation method, with various overrides # set flags to use for the privilege escalation method, with various overrides
flags = self.become_flags or \ flags = (
getattr(self, '%s_flags' % self.become_method, None) or \ self.become_flags or
C.DEFAULT_BECOME_FLAGS or \ getattr(self, '%s_flags' % self.become_method, None) or
getattr(C, 'DEFAULT_%s_FLAGS' % self.become_method.upper(), None) or \ C.DEFAULT_BECOME_FLAGS or
getattr(C, 'DEFAULT_%s_FLAGS' % self.become_method.upper(), None) or
'' ''
)
if self.become_method == 'sudo': if self.become_method == 'sudo':
# If we have a password, we run sudo with a randomly-generated # If we have a password, we run sudo with a randomly-generated
@ -521,7 +524,6 @@ class PlayContext(Base):
else: else:
becomecmd = '%s %s -u %s %s' % (exe, flags, self.become_user, command) becomecmd = '%s %s -u %s %s' % (exe, flags, self.become_user, command)
elif self.become_method == 'su': elif self.become_method == 'su':
# passing code ref to examine prompt as simple string comparisson isn't good enough with su # passing code ref to examine prompt as simple string comparisson isn't good enough with su
@ -645,4 +647,3 @@ class PlayContext(Base):
self.connection = conn_type self.connection = conn_type
return self._attributes['connection'] return self._attributes['connection']

View file

@ -152,4 +152,3 @@ class PlaybookInclude(Base, Conditional, Taggable):
if 'vars' in new_ds: if 'vars' in new_ds:
raise AnsibleParserError("include parameters cannot be mixed with 'vars' entries for include statements", obj=ds) raise AnsibleParserError("include parameters cannot be mixed with 'vars' entries for include statements", obj=ds)
new_ds['vars'] = params new_ds['vars'] = params

View file

@ -42,6 +42,7 @@ __all__ = ['Role', 'hash_params']
# in a static method. This is also used in the base class for # in a static method. This is also used in the base class for
# strategies (ansible/plugins/strategy/__init__.py) # strategies (ansible/plugins/strategy/__init__.py)
def hash_params(params): def hash_params(params):
""" """
Construct a data structure of parameters that is hashable. Construct a data structure of parameters that is hashable.
@ -286,7 +287,6 @@ class Role(Base, Become, Conditional, Taggable):
return deps return deps
#------------------------------------------------------------------------------
# other functions # other functions
def add_parent(self, parent_role): def add_parent(self, parent_role):
@ -488,4 +488,3 @@ class Role(Base, Become, Conditional, Taggable):
parent.set_loader(loader) parent.set_loader(loader)
for dep in self.get_direct_dependencies(): for dep in self.get_direct_dependencies():
dep.set_loader(loader) dep.set_loader(loader)

View file

@ -205,8 +205,8 @@ class RoleDefinition(Base, Become, Conditional, Taggable):
# remember to update it manually. # remember to update it manually.
if key not in base_attribute_names or key in ('connection', 'port', 'remote_user'): if key not in base_attribute_names or key in ('connection', 'port', 'remote_user'):
if key in ('connection', 'port', 'remote_user'): if key in ('connection', 'port', 'remote_user'):
display.deprecated("Using '%s' as a role param has been deprecated. " % key + \ display.deprecated("Using '%s' as a role param has been deprecated. " % key +
"In the future, these values should be entered in the `vars:` " + \ "In the future, these values should be entered in the `vars:` " +
"section for roles, but for now we'll store it as both a param and an attribute.", version="2.7") "section for roles, but for now we'll store it as both a param and an attribute.", version="2.7")
role_def[key] = value role_def[key] = value
# this key does not match a field attribute, so it must be a role param # this key does not match a field attribute, so it must be a role param

View file

@ -57,4 +57,3 @@ class RoleInclude(RoleDefinition):
ri = RoleInclude(play=play, role_basedir=current_role_path, variable_manager=variable_manager, loader=loader) ri = RoleInclude(play=play, role_basedir=current_role_path, variable_manager=variable_manager, loader=loader)
return ri.load_data(data, variable_manager=variable_manager, loader=loader) return ri.load_data(data, variable_manager=variable_manager, loader=loader)

View file

@ -46,6 +46,7 @@ except ImportError:
from ansible.utils.display import Display from ansible.utils.display import Display
display = Display() display = Display()
class RoleRequirement(RoleDefinition): class RoleRequirement(RoleDefinition):
""" """
@ -228,4 +229,3 @@ class RoleRequirement(RoleDefinition):
shutil.rmtree(tempdir, ignore_errors=True) shutil.rmtree(tempdir, ignore_errors=True)
return temp_file.name return temp_file.name

View file

@ -60,7 +60,6 @@ class IncludeRole(Task):
self._parent_role = role self._parent_role = role
self._role_name = None self._role_name = None
def get_block_list(self, play=None, variable_manager=None, loader=None): def get_block_list(self, play=None, variable_manager=None, loader=None):
# only need play passed in when dynamic # only need play passed in when dynamic
@ -99,7 +98,7 @@ class IncludeRole(Task):
ir = IncludeRole(block, role, task_include=task_include).load_data(data, variable_manager=variable_manager, loader=loader) ir = IncludeRole(block, role, task_include=task_include).load_data(data, variable_manager=variable_manager, loader=loader)
### Process options # Process options
# name is needed, or use role as alias # name is needed, or use role as alias
ir._role_name = ir.args.get('name', ir.args.get('role')) ir._role_name = ir.args.get('name', ir.args.get('role'))
if ir._role_name is None: if ir._role_name is None:

View file

@ -76,4 +76,3 @@ class TaskInclude(Task):
del all_vars['when'] del all_vars['when']
return all_vars return all_vars

View file

@ -271,7 +271,7 @@ class PluginLoader:
# HACK: We have no way of executing python byte # HACK: We have no way of executing python byte
# compiled files as ansible modules so specifically exclude them # compiled files as ansible modules so specifically exclude them
### FIXME: I believe this is only correct for modules and # FIXME: I believe this is only correct for modules and
# module_utils. For all other plugins we want .pyc and .pyo should # module_utils. For all other plugins we want .pyc and .pyo should
# bew valid # bew valid
if full_path.endswith(('.pyc', '.pyo')): if full_path.endswith(('.pyc', '.pyo')):
@ -550,4 +550,3 @@ vars_loader = PluginLoader(
C.DEFAULT_VARS_PLUGIN_PATH, C.DEFAULT_VARS_PLUGIN_PATH,
'vars_plugins', 'vars_plugins',
) )

View file

@ -309,8 +309,8 @@ class ActionBase(with_metaclass(ABCMeta, object)):
tmp_rm_data = self._parse_returned_data(tmp_rm_res) tmp_rm_data = self._parse_returned_data(tmp_rm_res)
if tmp_rm_data.get('rc', 0) != 0: if tmp_rm_data.get('rc', 0) != 0:
display.warning('Error deleting remote temporary files (rc: {0}, stderr: {1})'.format(tmp_rm_res.get('rc'), display.warning('Error deleting remote temporary files (rc: %s, stderr: %s})'
tmp_rm_res.get('stderr', 'No error string available.'))) % (tmp_rm_res.get('rc'), tmp_rm_res.get('stderr', 'No error string available.')))
def _transfer_file(self, local_path, remote_path): def _transfer_file(self, local_path, remote_path):
self._connection.put_file(local_path, remote_path) self._connection.put_file(local_path, remote_path)
@ -408,7 +408,7 @@ class ActionBase(with_metaclass(ABCMeta, object)):
setfacl_mode = 'r-x' setfacl_mode = 'r-x'
else: else:
chmod_mode = 'rX' chmod_mode = 'rX'
### Note: this form fails silently on freebsd. We currently # NOTE: this form fails silently on freebsd. We currently
# never call _fixup_perms2() with execute=False but if we # never call _fixup_perms2() with execute=False but if we
# start to we'll have to fix this. # start to we'll have to fix this.
setfacl_mode = 'r-X' setfacl_mode = 'r-X'
@ -440,8 +440,9 @@ class ActionBase(with_metaclass(ABCMeta, object)):
raise AnsibleError('Failed to set file mode on remote files (rc: {0}, err: {1})'.format(res['rc'], to_native(res['stderr']))) raise AnsibleError('Failed to set file mode on remote files (rc: {0}, err: {1})'.format(res['rc'], to_native(res['stderr'])))
else: else:
raise AnsibleError('Failed to set permissions on the temporary files Ansible needs to create when becoming an unprivileged user ' raise AnsibleError('Failed to set permissions on the temporary files Ansible needs to create when becoming an unprivileged user '
' (rc: {0}, err: {1}). For information on working around this,' '(rc: %s, err: %s}). For information on working around this, see '
' see https://docs.ansible.com/ansible/become.html#becoming-an-unprivileged-user'.format(res['rc'], to_native(res['stderr']))) 'https://docs.ansible.com/ansible/become.html#becoming-an-unprivileged-user'
% (res['rc'], to_native(res['stderr'])))
elif execute: elif execute:
# Can't depend on the file being transferred with execute permissions. # Can't depend on the file being transferred with execute permissions.
# Only need user perms because no become was used here # Only need user perms because no become was used here
@ -611,8 +612,6 @@ class ActionBase(with_metaclass(ABCMeta, object)):
# give the module the socket for persistent connections # give the module the socket for persistent connections
module_args['_ansible_socket'] = task_vars.get('ansible_socket') module_args['_ansible_socket'] = task_vars.get('ansible_socket')
def _execute_module(self, module_name=None, module_args=None, tmp=None, task_vars=None, persist_files=False, delete_remote_tmp=True, wrap_async=False): def _execute_module(self, module_name=None, module_args=None, tmp=None, task_vars=None, persist_files=False, delete_remote_tmp=True, wrap_async=False):
''' '''
Transfer and run a module along with its arguments. Transfer and run a module along with its arguments.
@ -641,7 +640,7 @@ class ActionBase(with_metaclass(ABCMeta, object)):
if not self._is_pipelining_enabled(module_style, wrap_async): if not self._is_pipelining_enabled(module_style, wrap_async):
# we might need remote tmp dir # we might need remote tmp dir
if not tmp or not 'tmp' in tmp: if not tmp or 'tmp' not in tmp:
tmp = self._make_tmp_path() tmp = self._make_tmp_path()
remote_module_filename = self._connection._shell.get_remote_filename(module_path) remote_module_filename = self._connection._shell.get_remote_filename(module_path)
@ -784,7 +783,6 @@ class ActionBase(with_metaclass(ABCMeta, object)):
if key in data and not data[key]: if key in data and not data[key]:
del data[key] del data[key]
def _clean_returned_data(self, data): def _clean_returned_data(self, data):
remove_keys = set() remove_keys = set()
fact_keys = set(data.keys()) fact_keys = set(data.keys())

View file

@ -22,7 +22,6 @@ __metaclass__ = type
from ansible.plugins.action import ActionBase from ansible.plugins.action import ActionBase
from ansible.plugins.action.net_config import ActionModule as NetActionModule from ansible.plugins.action.net_config import ActionModule as NetActionModule
class ActionModule(NetActionModule, ActionBase): class ActionModule(NetActionModule, ActionBase):
pass pass

View file

@ -22,5 +22,6 @@ __metaclass__ = type
from ansible.plugins.action import ActionBase from ansible.plugins.action import ActionBase
from ansible.plugins.action.net_template import ActionModule as NetActionModule from ansible.plugins.action.net_template import ActionModule as NetActionModule
class ActionModule(NetActionModule, ActionBase): class ActionModule(NetActionModule, ActionBase):
pass pass

View file

@ -27,6 +27,7 @@ import urlparse
from ansible.module_utils._text import to_text from ansible.module_utils._text import to_text
from ansible.plugins.action.eos import ActionModule as _ActionModule from ansible.plugins.action.eos import ActionModule as _ActionModule
class ActionModule(_ActionModule): class ActionModule(_ActionModule):
def run(self, tmp=None, task_vars=None): def run(self, tmp=None, task_vars=None):

View file

@ -23,7 +23,7 @@ from ansible.plugins.action import ActionBase
class ActionModule(ActionBase): class ActionModule(ActionBase):
''' Create inventory groups based on variables ''' ''' Create inventory groups based on variables '''
### We need to be able to modify the inventory # We need to be able to modify the inventory
TRANSFERS_FILES = False TRANSFERS_FILES = False
def run(self, tmp=None, task_vars=None): def run(self, tmp=None, task_vars=None):

View file

@ -27,6 +27,7 @@ import urlparse
from ansible.module_utils._text import to_text from ansible.module_utils._text import to_text
from ansible.plugins.action.ios import ActionModule as _ActionModule from ansible.plugins.action.ios import ActionModule as _ActionModule
class ActionModule(_ActionModule): class ActionModule(_ActionModule):
def run(self, tmp=None, task_vars=None): def run(self, tmp=None, task_vars=None):

View file

@ -27,6 +27,7 @@ import urlparse
from ansible.module_utils._text import to_text from ansible.module_utils._text import to_text
from ansible.plugins.action.iosxr import ActionModule as _ActionModule from ansible.plugins.action.iosxr import ActionModule as _ActionModule
class ActionModule(_ActionModule): class ActionModule(_ActionModule):
def run(self, tmp=None, task_vars=None): def run(self, tmp=None, task_vars=None):
@ -100,4 +101,3 @@ class ActionModule(_ActionModule):
searchpath.append(os.path.dirname(source)) searchpath.append(os.path.dirname(source))
self._templar.environment.loader.searchpath = searchpath self._templar.environment.loader.searchpath = searchpath
self._task.args['src'] = self._templar.template(template_data) self._task.args['src'] = self._templar.template(template_data)

View file

@ -27,6 +27,7 @@ import urlparse
from ansible.module_utils._text import to_text from ansible.module_utils._text import to_text
from ansible.plugins.action.junos import ActionModule as _ActionModule from ansible.plugins.action.junos import ActionModule as _ActionModule
class ActionModule(_ActionModule): class ActionModule(_ActionModule):
def run(self, tmp=None, task_vars=None): def run(self, tmp=None, task_vars=None):

View file

@ -27,6 +27,7 @@ import urlparse
from ansible.module_utils._text import to_text from ansible.module_utils._text import to_text
from ansible.plugins.action.nxos import ActionModule as _ActionModule from ansible.plugins.action.nxos import ActionModule as _ActionModule
class ActionModule(_ActionModule): class ActionModule(_ActionModule):
def run(self, tmp=None, task_vars=None): def run(self, tmp=None, task_vars=None):

View file

@ -22,7 +22,6 @@ __metaclass__ = type
from ansible.plugins.action import ActionBase from ansible.plugins.action import ActionBase
from ansible.plugins.action.net_config import ActionModule as NetActionModule from ansible.plugins.action.net_config import ActionModule as NetActionModule
class ActionModule(NetActionModule, ActionBase): class ActionModule(NetActionModule, ActionBase):
pass pass

View file

@ -48,5 +48,3 @@ class ActionModule(NetActionModule, ActionBase):
del result['_backup'] del result['_backup']
return result return result

View file

@ -163,7 +163,6 @@ class ActionModule(ActionBase):
else: else:
raise AnsibleError('user requested abort!') raise AnsibleError('user requested abort!')
except AnsibleTimeoutExceeded: except AnsibleTimeoutExceeded:
# this is the exception we expect when the alarm signal # this is the exception we expect when the alarm signal
# fires, so we simply ignore it to move into the cleanup # fires, so we simply ignore it to move into the cleanup

View file

@ -19,14 +19,14 @@
from __future__ import (absolute_import, division, print_function) from __future__ import (absolute_import, division, print_function)
__metaclass__ = type __metaclass__ = type
import glob
import os import os
import re import re
import time import time
import glob
from ansible.plugins.action.sros import ActionModule as _ActionModule
from ansible.module_utils._text import to_text
from ansible.module_utils.six.moves.urllib.parse import urlsplit from ansible.module_utils.six.moves.urllib.parse import urlsplit
from ansible.module_utils._text import to_text
from ansible.plugins.action.sros import ActionModule as _ActionModule
from ansible.utils.vars import merge_hash from ansible.utils.vars import merge_hash
PRIVATE_KEYS_RE = re.compile('__.+__') PRIVATE_KEYS_RE = re.compile('__.+__')
@ -110,4 +110,3 @@ class ActionModule(_ActionModule):
searchpath.append(os.path.dirname(source)) searchpath.append(os.path.dirname(source))
self._templar.environment.loader.searchpath = searchpath self._templar.environment.loader.searchpath = searchpath
self._task.args['src'] = self._templar.template(template_data) self._task.args['src'] = self._templar.template(template_data)

View file

@ -308,8 +308,7 @@ class ActionModule(ActionBase):
src = _tmp_args.get('src', None) src = _tmp_args.get('src', None)
dest = _tmp_args.get('dest', None) dest = _tmp_args.get('dest', None)
if src is None or dest is None: if src is None or dest is None:
return dict(failed=True, return dict(failed=True, msg="synchronize requires both src and dest parameters are set")
msg="synchronize requires both src and dest parameters are set")
if not dest_is_local: if not dest_is_local:
# Private key handling # Private key handling

View file

@ -23,11 +23,12 @@ from ansible import constants as C
from ansible.errors import AnsibleError from ansible.errors import AnsibleError
from ansible.module_utils._text import to_bytes, to_native, to_text from ansible.module_utils._text import to_bytes, to_native, to_text
from ansible.plugins.action import ActionBase from ansible.plugins.action import ActionBase
from ansible.utils.hashing import checksum_s
from ansible.template import generate_ansible_template_vars from ansible.template import generate_ansible_template_vars
from ansible.utils.hashing import checksum_s
boolean = C.mk_boolean boolean = C.mk_boolean
class ActionModule(ActionBase): class ActionModule(ActionBase):
TRANSFERS_FILES = True TRANSFERS_FILES = True

View file

@ -236,6 +236,7 @@ class BaseFileCacheModule(BaseCacheModule):
""" """
pass pass
class FactCache(MutableMapping): class FactCache(MutableMapping):
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
@ -247,7 +248,6 @@ class FactCache(MutableMapping):
# Backwards compat: self._display isn't really needed, just import the global display and use that. # Backwards compat: self._display isn't really needed, just import the global display and use that.
self._display = display self._display = display
def __getitem__(self, key): def __getitem__(self, key):
if not self._plugin.contains(key): if not self._plugin.contains(key):
raise KeyError raise KeyError

View file

@ -19,4 +19,3 @@ __metaclass__ = type
# moved actual classes to __init__ kept here for backward compat with 3rd parties # moved actual classes to __init__ kept here for backward compat with 3rd parties
from ansible.plugins.cache import BaseCacheModule, BaseFileCacheModule from ansible.plugins.cache import BaseCacheModule, BaseFileCacheModule

View file

@ -37,6 +37,7 @@ except ImportError:
from ansible.parsing.utils.jsonify import jsonify from ansible.parsing.utils.jsonify import jsonify
from ansible.plugins.cache import BaseFileCacheModule from ansible.plugins.cache import BaseFileCacheModule
class CacheModule(BaseFileCacheModule): class CacheModule(BaseFileCacheModule):
""" """
A caching module backed by json files. A caching module backed by json files.

View file

@ -30,6 +30,7 @@ __metaclass__ = type
from ansible.plugins.cache import BaseCacheModule from ansible.plugins.cache import BaseCacheModule
class CacheModule(BaseCacheModule): class CacheModule(BaseCacheModule):
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):

View file

@ -36,6 +36,7 @@ except ImportError:
from ansible.module_utils.six import PY3 from ansible.module_utils.six import PY3
from ansible.plugins.cache import BaseFileCacheModule from ansible.plugins.cache import BaseFileCacheModule
class CacheModule(BaseFileCacheModule): class CacheModule(BaseFileCacheModule):
""" """
A caching module backed by pickle files. A caching module backed by pickle files.

View file

@ -30,6 +30,7 @@ try:
except ImportError: except ImportError:
raise AnsibleError("The 'redis' python module is required for the redis fact cache, 'pip install redis'") raise AnsibleError("The 'redis' python module is required for the redis fact cache, 'pip install redis'")
class CacheModule(BaseCacheModule): class CacheModule(BaseCacheModule):
""" """
A caching module backed by redis. A caching module backed by redis.

View file

@ -37,6 +37,7 @@ from ansible.parsing.yaml.loader import AnsibleLoader
from ansible.parsing.yaml.dumper import AnsibleDumper from ansible.parsing.yaml.dumper import AnsibleDumper
from ansible.plugins.cache import BaseFileCacheModule from ansible.plugins.cache import BaseFileCacheModule
class CacheModule(BaseFileCacheModule): class CacheModule(BaseFileCacheModule):
""" """
A caching module backed by yaml files. A caching module backed by yaml files.

View file

@ -213,7 +213,6 @@ class CallbackBase:
if remove_key in result: if remove_key in result:
del result[remove_key] del result[remove_key]
def set_play_context(self, play_context): def set_play_context(self, play_context):
pass pass
@ -280,7 +279,7 @@ class CallbackBase:
def on_file_diff(self, host, diff): def on_file_diff(self, host, diff):
pass pass
####### V2 METHODS, by default they call v1 counterparts if possible ###### # V2 METHODS, by default they call v1 counterparts if possible
def v2_on_any(self, *args, **kwargs): def v2_on_any(self, *args, **kwargs):
self.on_any(args, kwargs) self.on_any(args, kwargs)

View file

@ -21,6 +21,7 @@ __metaclass__ = type
from ansible.plugins.callback.default import CallbackModule as CallbackModule_default from ansible.plugins.callback.default import CallbackModule as CallbackModule_default
class CallbackModule(CallbackModule_default): class CallbackModule(CallbackModule_default):
CALLBACK_VERSION = 2.0 CALLBACK_VERSION = 2.0
@ -76,4 +77,3 @@ class CallbackModule(CallbackModule_default):
def v2_runner_item_on_failed(self, result): def v2_runner_item_on_failed(self, result):
self.display_task_banner() self.display_task_banner()
self.super_ref.v2_runner_item_on_failed(result) self.super_ref.v2_runner_item_on_failed(result)

View file

@ -21,6 +21,7 @@ __metaclass__ = type
from ansible.plugins.callback import CallbackBase from ansible.plugins.callback import CallbackBase
class CallbackModule(CallbackBase): class CallbackModule(CallbackBase):
""" """
This is a very trivial example of how any callback function can get at play and task objects. This is a very trivial example of how any callback function can get at play and task objects.

View file

@ -30,6 +30,7 @@ from ansible import constants as C
from ansible.plugins.callback import CallbackBase from ansible.plugins.callback import CallbackBase
from ansible.utils.color import colorize, hostcolor from ansible.utils.color import colorize, hostcolor
class CallbackModule(CallbackBase): class CallbackModule(CallbackBase):
''' '''
@ -100,7 +101,7 @@ class CallbackModule(CallbackBase):
self._process_items(result) self._process_items(result)
else: else:
if (self._display.verbosity > 0 or '_ansible_verbose_always' in result._result) and not '_ansible_verbose_override' in result._result: if (self._display.verbosity > 0 or '_ansible_verbose_always' in result._result) and '_ansible_verbose_override' not in result._result:
msg += " => %s" % (self._dump_results(result._result),) msg += " => %s" % (self._dump_results(result._result),)
self._display.display(msg, color=color) self._display.display(msg, color=color)
@ -113,7 +114,7 @@ class CallbackModule(CallbackBase):
self._process_items(result) self._process_items(result)
else: else:
msg = "skipping: [%s]" % result._host.get_name() msg = "skipping: [%s]" % result._host.get_name()
if (self._display.verbosity > 0 or '_ansible_verbose_always' in result._result) and not '_ansible_verbose_override' in result._result: if (self._display.verbosity > 0 or '_ansible_verbose_always' in result._result) and '_ansible_verbose_override' not in result._result:
msg += " => %s" % self._dump_results(result._result) msg += " => %s" % self._dump_results(result._result)
self._display.display(msg, color=C.COLOR_SKIP) self._display.display(msg, color=C.COLOR_SKIP)
@ -209,7 +210,7 @@ class CallbackModule(CallbackBase):
msg += " => (item=%s)" % (self._get_item(result._result),) msg += " => (item=%s)" % (self._get_item(result._result),)
if (self._display.verbosity > 0 or '_ansible_verbose_always' in result._result) and not '_ansible_verbose_override' in result._result: if (self._display.verbosity > 0 or '_ansible_verbose_always' in result._result) and '_ansible_verbose_override' not in result._result:
msg += " => %s" % self._dump_results(result._result) msg += " => %s" % self._dump_results(result._result)
self._display.display(msg, color=color) self._display.display(msg, color=color)
@ -230,7 +231,7 @@ class CallbackModule(CallbackBase):
def v2_runner_item_on_skipped(self, result): def v2_runner_item_on_skipped(self, result):
if C.DISPLAY_SKIPPED_HOSTS: if C.DISPLAY_SKIPPED_HOSTS:
msg = "skipping: [%s] => (item=%s) " % (result._host.get_name(), self._get_item(result._result)) msg = "skipping: [%s] => (item=%s) " % (result._host.get_name(), self._get_item(result._result))
if (self._display.verbosity > 0 or '_ansible_verbose_always' in result._result) and not '_ansible_verbose_override' in result._result: if (self._display.verbosity > 0 or '_ansible_verbose_always' in result._result) and '_ansible_verbose_override' not in result._result:
msg += " => %s" % self._dump_results(result._result) msg += " => %s" % self._dump_results(result._result)
self._display.display(msg, color=C.COLOR_SKIP) self._display.display(msg, color=C.COLOR_SKIP)
@ -298,6 +299,6 @@ class CallbackModule(CallbackBase):
def v2_runner_retry(self, result): def v2_runner_retry(self, result):
task_name = result.task_name or result._task task_name = result.task_name or result._task
msg = "FAILED - RETRYING: %s (%d retries left)." % (task_name, result._result['retries'] - result._result['attempts']) msg = "FAILED - RETRYING: %s (%d retries left)." % (task_name, result._result['retries'] - result._result['attempts'])
if (self._display.verbosity > 2 or '_ansible_verbose_always' in result._result) and not '_ansible_verbose_override' in result._result: if (self._display.verbosity > 2 or '_ansible_verbose_always' in result._result) and '_ansible_verbose_override' not in result._result:
msg += "Result was: %s" % self._dump_results(result._result) msg += "Result was: %s" % self._dump_results(result._result)
self._display.display(msg, color=C.COLOR_DEBUG) self._display.display(msg, color=C.COLOR_DEBUG)

View file

@ -146,6 +146,7 @@ colors = dict(
states = ('skipped', 'ok', 'changed', 'failed', 'unreachable') states = ('skipped', 'ok', 'changed', 'failed', 'unreachable')
class CallbackModule_dense(CallbackModule_default): class CallbackModule_dense(CallbackModule_default):
''' '''
@ -156,7 +157,6 @@ class CallbackModule_dense(CallbackModule_default):
CALLBACK_TYPE = 'stdout' CALLBACK_TYPE = 'stdout'
CALLBACK_NAME = 'dense' CALLBACK_NAME = 'dense'
def __init__(self): def __init__(self):
# From CallbackModule # From CallbackModule

View file

@ -123,11 +123,17 @@ class CallbackModule(CallbackBase):
level = 'err' level = 'err'
else: else:
level = 'notice' if 'changed' in msg and msg['changed'] else 'info' level = 'notice' if 'changed' in msg and msg['changed'] else 'info'
logs.append({"log": { logs.append({
'sources': {'source': source}, "log": {
'messages': {'message': json.dumps(msg)}, 'sources': {
'source': source
},
'messages': {
'message': json.dumps(msg)
},
'level': level 'level': level
}}) }
})
return logs return logs
def send_reports(self, stats): def send_reports(self, stats):

View file

@ -94,4 +94,3 @@ class CallbackModule(CallbackBase):
else: else:
out = self.debug out = self.debug
self.send_msg("Great! \n Playbook %s completed:\n%s \n Last task debug:\n %s" % (name, s, out)) self.send_msg("Great! \n Playbook %s completed:\n%s \n Last task debug:\n %s" % (name, s, out))

View file

@ -33,6 +33,7 @@ except ImportError:
from ansible.plugins.callback import CallbackBase from ansible.plugins.callback import CallbackBase
class CallbackModule(CallbackBase): class CallbackModule(CallbackBase):
""" """
ansible logstash callback plugin ansible logstash callback plugin

Some files were not shown because too many files have changed in this diff Show more