mirror of
https://github.com/ansible-collections/community.general.git
synced 2024-09-14 20:13:21 +02:00
test/: PEP8 compliancy (#24803)
* test/: PEP8 compliancy - Make PEP8 compliant * Python3 chokes on casting int to bytes (#24952) But if we tell the formatter that the var is a number, it works
This commit is contained in:
parent
31c59ad5f9
commit
4efec414e7
110 changed files with 1702 additions and 1547 deletions
8
setup.py
8
setup.py
|
@ -8,15 +8,15 @@ try:
|
||||||
from setuptools import setup, find_packages
|
from setuptools import setup, find_packages
|
||||||
except ImportError:
|
except ImportError:
|
||||||
print("Ansible now needs setuptools in order to build. Install it using"
|
print("Ansible now needs setuptools in order to build. Install it using"
|
||||||
" your package manager (usually python-setuptools) or via pip (pip"
|
" your package manager (usually python-setuptools) or via pip (pip"
|
||||||
" install setuptools).")
|
" install setuptools).")
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
with open('requirements.txt') as requirements_file:
|
with open('requirements.txt') as requirements_file:
|
||||||
install_requirements = requirements_file.read().splitlines()
|
install_requirements = requirements_file.read().splitlines()
|
||||||
if not install_requirements:
|
if not install_requirements:
|
||||||
print("Unable to read requirements from the requirements.txt file"
|
print("Unable to read requirements from the requirements.txt file"
|
||||||
"That indicates this copy of the source code is incomplete.")
|
"That indicates this copy of the source code is incomplete.")
|
||||||
sys.exit(2)
|
sys.exit(2)
|
||||||
|
|
||||||
SYMLINKS = {'ansible': frozenset(('ansible-console',
|
SYMLINKS = {'ansible': frozenset(('ansible-console',
|
||||||
|
@ -49,7 +49,7 @@ setup(
|
||||||
# Ansible will also make use of a system copy of python-six and
|
# Ansible will also make use of a system copy of python-six and
|
||||||
# python-selectors2 if installed but use a Bundled copy if it's not.
|
# python-selectors2 if installed but use a Bundled copy if it's not.
|
||||||
install_requires=install_requirements,
|
install_requires=install_requirements,
|
||||||
package_dir={ '': 'lib' },
|
package_dir={'': 'lib'},
|
||||||
packages=find_packages('lib'),
|
packages=find_packages('lib'),
|
||||||
package_data={
|
package_data={
|
||||||
'': [
|
'': [
|
||||||
|
|
|
@ -1 +0,0 @@
|
||||||
|
|
|
@ -4,15 +4,16 @@ Find and delete AWS resources matching the provided --match string. Unless
|
||||||
Please use caution, you can easily delete you're *ENTIRE* EC2 infrastructure.
|
Please use caution, you can easily delete you're *ENTIRE* EC2 infrastructure.
|
||||||
'''
|
'''
|
||||||
|
|
||||||
|
import boto
|
||||||
|
import boto.ec2.elb
|
||||||
|
import optparse
|
||||||
import os
|
import os
|
||||||
|
import os.path
|
||||||
import re
|
import re
|
||||||
import sys
|
import sys
|
||||||
import boto
|
|
||||||
import optparse
|
|
||||||
import yaml
|
|
||||||
import os.path
|
|
||||||
import boto.ec2.elb
|
|
||||||
import time
|
import time
|
||||||
|
import yaml
|
||||||
|
|
||||||
|
|
||||||
def delete_aws_resources(get_func, attr, opts):
|
def delete_aws_resources(get_func, attr, opts):
|
||||||
for item in get_func():
|
for item in get_func():
|
||||||
|
@ -20,6 +21,7 @@ def delete_aws_resources(get_func, attr, opts):
|
||||||
if re.search(opts.match_re, val):
|
if re.search(opts.match_re, val):
|
||||||
prompt_and_delete(item, "Delete matching %s? [y/n]: " % (item,), opts.assumeyes)
|
prompt_and_delete(item, "Delete matching %s? [y/n]: " % (item,), opts.assumeyes)
|
||||||
|
|
||||||
|
|
||||||
def delete_autoscaling_group(get_func, attr, opts):
|
def delete_autoscaling_group(get_func, attr, opts):
|
||||||
assumeyes = opts.assumeyes
|
assumeyes = opts.assumeyes
|
||||||
group_name = None
|
group_name = None
|
||||||
|
@ -49,7 +51,8 @@ def delete_autoscaling_group(get_func, attr, opts):
|
||||||
group.delete()
|
group.delete()
|
||||||
while len(asg.get_all_groups(names=[group_name])):
|
while len(asg.get_all_groups(names=[group_name])):
|
||||||
time.sleep(5)
|
time.sleep(5)
|
||||||
print ("Terminated ASG: %s" % group_name)
|
print("Terminated ASG: %s" % group_name)
|
||||||
|
|
||||||
|
|
||||||
def delete_aws_eips(get_func, attr, opts):
|
def delete_aws_eips(get_func, attr, opts):
|
||||||
|
|
||||||
|
@ -65,22 +68,25 @@ def delete_aws_eips(get_func, attr, opts):
|
||||||
if val in eip_log:
|
if val in eip_log:
|
||||||
prompt_and_delete(item, "Delete matching %s? [y/n]: " % (item,), opts.assumeyes)
|
prompt_and_delete(item, "Delete matching %s? [y/n]: " % (item,), opts.assumeyes)
|
||||||
|
|
||||||
|
|
||||||
def delete_aws_instances(reservation, opts):
|
def delete_aws_instances(reservation, opts):
|
||||||
for list in reservation:
|
for list in reservation:
|
||||||
for item in list.instances:
|
for item in list.instances:
|
||||||
prompt_and_delete(item, "Delete matching %s? [y/n]: " % (item,), opts.assumeyes)
|
prompt_and_delete(item, "Delete matching %s? [y/n]: " % (item,), opts.assumeyes)
|
||||||
|
|
||||||
|
|
||||||
def prompt_and_delete(item, prompt, assumeyes):
|
def prompt_and_delete(item, prompt, assumeyes):
|
||||||
if not assumeyes:
|
if not assumeyes:
|
||||||
assumeyes = raw_input(prompt).lower() == 'y'
|
assumeyes = raw_input(prompt).lower() == 'y'
|
||||||
assert hasattr(item, 'delete') or hasattr(item, 'terminate') , "Class <%s> has no delete or terminate attribute" % item.__class__
|
assert hasattr(item, 'delete') or hasattr(item, 'terminate'), "Class <%s> has no delete or terminate attribute" % item.__class__
|
||||||
if assumeyes:
|
if assumeyes:
|
||||||
if hasattr(item, 'delete'):
|
if hasattr(item, 'delete'):
|
||||||
item.delete()
|
item.delete()
|
||||||
print ("Deleted %s" % item)
|
print("Deleted %s" % item)
|
||||||
if hasattr(item, 'terminate'):
|
if hasattr(item, 'terminate'):
|
||||||
item.terminate()
|
item.terminate()
|
||||||
print ("Terminated %s" % item)
|
print("Terminated %s" % item)
|
||||||
|
|
||||||
|
|
||||||
def parse_args():
|
def parse_args():
|
||||||
# Load details from credentials.yml
|
# Load details from credentials.yml
|
||||||
|
@ -94,45 +100,61 @@ def parse_args():
|
||||||
if default_aws_secret_key is None:
|
if default_aws_secret_key is None:
|
||||||
default_aws_secret_key = credentials['ec2_secret_key']
|
default_aws_secret_key = credentials['ec2_secret_key']
|
||||||
|
|
||||||
parser = optparse.OptionParser(usage="%s [options]" % (sys.argv[0],),
|
parser = optparse.OptionParser(
|
||||||
description=__doc__)
|
usage="%s [options]" % (sys.argv[0], ),
|
||||||
parser.add_option("--access",
|
description=__doc__
|
||||||
|
)
|
||||||
|
parser.add_option(
|
||||||
|
"--access",
|
||||||
action="store", dest="ec2_access_key",
|
action="store", dest="ec2_access_key",
|
||||||
default=default_aws_access_key,
|
default=default_aws_access_key,
|
||||||
help="Amazon ec2 access id. Can use EC2_ACCESS_KEY environment variable, or a values from credentials.yml.")
|
help="Amazon ec2 access id. Can use EC2_ACCESS_KEY environment variable, or a values from credentials.yml."
|
||||||
parser.add_option("--secret",
|
)
|
||||||
|
parser.add_option(
|
||||||
|
"--secret",
|
||||||
action="store", dest="ec2_secret_key",
|
action="store", dest="ec2_secret_key",
|
||||||
default=default_aws_secret_key,
|
default=default_aws_secret_key,
|
||||||
help="Amazon ec2 secret key. Can use EC2_SECRET_KEY environment variable, or a values from credentials.yml.")
|
help="Amazon ec2 secret key. Can use EC2_SECRET_KEY environment variable, or a values from credentials.yml."
|
||||||
parser.add_option("--eip-log",
|
)
|
||||||
|
parser.add_option(
|
||||||
|
"--eip-log",
|
||||||
action="store", dest="eip_log",
|
action="store", dest="eip_log",
|
||||||
default = None,
|
default=None,
|
||||||
help = "Path to log of EIPs created during test.")
|
help="Path to log of EIPs created during test."
|
||||||
parser.add_option("--integration-config",
|
)
|
||||||
|
parser.add_option(
|
||||||
|
"--integration-config",
|
||||||
action="store", dest="int_config",
|
action="store", dest="int_config",
|
||||||
default = "integration_config.yml",
|
default="integration_config.yml",
|
||||||
help = "path to integration config")
|
help="path to integration config"
|
||||||
parser.add_option("--credentials", "-c",
|
)
|
||||||
|
parser.add_option(
|
||||||
|
"--credentials", "-c",
|
||||||
action="store", dest="credential_file",
|
action="store", dest="credential_file",
|
||||||
default="credentials.yml",
|
default="credentials.yml",
|
||||||
help="YAML file to read cloud credentials (default: %default)")
|
help="YAML file to read cloud credentials (default: %default)"
|
||||||
parser.add_option("--yes", "-y",
|
)
|
||||||
|
parser.add_option(
|
||||||
|
"--yes", "-y",
|
||||||
action="store_true", dest="assumeyes",
|
action="store_true", dest="assumeyes",
|
||||||
default=False,
|
default=False,
|
||||||
help="Don't prompt for confirmation")
|
help="Don't prompt for confirmation"
|
||||||
parser.add_option("--match",
|
)
|
||||||
|
parser.add_option(
|
||||||
|
"--match",
|
||||||
action="store", dest="match_re",
|
action="store", dest="match_re",
|
||||||
default="^ansible-testing-",
|
default="^ansible-testing-",
|
||||||
help="Regular expression used to find AWS resources (default: %default)")
|
help="Regular expression used to find AWS resources (default: %default)"
|
||||||
|
)
|
||||||
|
|
||||||
(opts, args) = parser.parse_args()
|
(opts, args) = parser.parse_args()
|
||||||
for required in ['ec2_access_key', 'ec2_secret_key']:
|
for required in ['ec2_access_key', 'ec2_secret_key']:
|
||||||
if getattr(opts, required) is None:
|
if getattr(opts, required) is None:
|
||||||
parser.error("Missing required parameter: --%s" % required)
|
parser.error("Missing required parameter: --%s" % required)
|
||||||
|
|
||||||
|
|
||||||
return (opts, args)
|
return (opts, args)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
|
|
||||||
(opts, args) = parse_args()
|
(opts, args) = parse_args()
|
||||||
|
@ -140,17 +162,17 @@ if __name__ == '__main__':
|
||||||
int_config = yaml.load(open(opts.int_config).read())
|
int_config = yaml.load(open(opts.int_config).read())
|
||||||
if not opts.eip_log:
|
if not opts.eip_log:
|
||||||
output_dir = os.path.expanduser(int_config["output_dir"])
|
output_dir = os.path.expanduser(int_config["output_dir"])
|
||||||
opts.eip_log = output_dir + '/' + opts.match_re.replace('^','') + '-eip_integration_tests.log'
|
opts.eip_log = output_dir + '/' + opts.match_re.replace('^', '') + '-eip_integration_tests.log'
|
||||||
|
|
||||||
# Connect to AWS
|
# Connect to AWS
|
||||||
aws = boto.connect_ec2(aws_access_key_id=opts.ec2_access_key,
|
aws = boto.connect_ec2(aws_access_key_id=opts.ec2_access_key,
|
||||||
aws_secret_access_key=opts.ec2_secret_key)
|
aws_secret_access_key=opts.ec2_secret_key)
|
||||||
|
|
||||||
elb = boto.connect_elb(aws_access_key_id=opts.ec2_access_key,
|
elb = boto.connect_elb(aws_access_key_id=opts.ec2_access_key,
|
||||||
aws_secret_access_key=opts.ec2_secret_key)
|
aws_secret_access_key=opts.ec2_secret_key)
|
||||||
|
|
||||||
asg = boto.connect_autoscale(aws_access_key_id=opts.ec2_access_key,
|
asg = boto.connect_autoscale(aws_access_key_id=opts.ec2_access_key,
|
||||||
aws_secret_access_key=opts.ec2_secret_key)
|
aws_secret_access_key=opts.ec2_secret_key)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
# Delete matching keys
|
# Delete matching keys
|
||||||
|
@ -172,7 +194,7 @@ if __name__ == '__main__':
|
||||||
delete_aws_eips(aws.get_all_addresses, 'public_ip', opts)
|
delete_aws_eips(aws.get_all_addresses, 'public_ip', opts)
|
||||||
|
|
||||||
# Delete temporary instances
|
# Delete temporary instances
|
||||||
filters = {"tag:Name":opts.match_re.replace('^',''), "instance-state-name": ['running', 'pending', 'stopped' ]}
|
filters = {"tag:Name": opts.match_re.replace('^', ''), "instance-state-name": ['running', 'pending', 'stopped']}
|
||||||
delete_aws_instances(aws.get_all_instances(filters=filters), opts)
|
delete_aws_instances(aws.get_all_instances(filters=filters), opts)
|
||||||
|
|
||||||
except KeyboardInterrupt as e:
|
except KeyboardInterrupt as e:
|
||||||
|
|
|
@ -4,21 +4,25 @@ Find and delete GCE resources matching the provided --match string. Unless
|
||||||
Please use caution, you can easily delete your *ENTIRE* GCE infrastructure.
|
Please use caution, you can easily delete your *ENTIRE* GCE infrastructure.
|
||||||
'''
|
'''
|
||||||
|
|
||||||
|
import optparse
|
||||||
import os
|
import os
|
||||||
import re
|
import re
|
||||||
import sys
|
import sys
|
||||||
import optparse
|
|
||||||
import yaml
|
import yaml
|
||||||
|
|
||||||
try:
|
try:
|
||||||
from libcloud.compute.types import Provider
|
from libcloud.common.google import (
|
||||||
|
GoogleBaseError,
|
||||||
|
QuotaExceededError,
|
||||||
|
ResourceExistsError,
|
||||||
|
ResourceInUseError,
|
||||||
|
ResourceNotFoundError,
|
||||||
|
)
|
||||||
from libcloud.compute.providers import get_driver
|
from libcloud.compute.providers import get_driver
|
||||||
from libcloud.common.google import GoogleBaseError, QuotaExceededError, \
|
from libcloud.compute.types import Provider
|
||||||
ResourceExistsError, ResourceInUseError, ResourceNotFoundError
|
|
||||||
_ = Provider.GCE
|
_ = Provider.GCE
|
||||||
except ImportError:
|
except ImportError:
|
||||||
print("failed=True " + \
|
print("failed=True msg='libcloud with GCE support (0.13.3+) required for this module'")
|
||||||
"msg='libcloud with GCE support (0.13.3+) required for this module'")
|
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
import gce_credentials
|
import gce_credentials
|
||||||
|
@ -30,26 +34,34 @@ def delete_gce_resources(get_func, attr, opts):
|
||||||
if re.search(opts.match_re, val, re.IGNORECASE):
|
if re.search(opts.match_re, val, re.IGNORECASE):
|
||||||
prompt_and_delete(item, "Delete matching %s? [y/n]: " % (item,), opts.assumeyes)
|
prompt_and_delete(item, "Delete matching %s? [y/n]: " % (item,), opts.assumeyes)
|
||||||
|
|
||||||
|
|
||||||
def prompt_and_delete(item, prompt, assumeyes):
|
def prompt_and_delete(item, prompt, assumeyes):
|
||||||
if not assumeyes:
|
if not assumeyes:
|
||||||
assumeyes = raw_input(prompt).lower() == 'y'
|
assumeyes = raw_input(prompt).lower() == 'y'
|
||||||
assert hasattr(item, 'destroy'), "Class <%s> has no delete attribute" % item.__class__
|
assert hasattr(item, 'destroy'), "Class <%s> has no delete attribute" % item.__class__
|
||||||
if assumeyes:
|
if assumeyes:
|
||||||
item.destroy()
|
item.destroy()
|
||||||
print ("Deleted %s" % item)
|
print("Deleted %s" % item)
|
||||||
|
|
||||||
|
|
||||||
def parse_args():
|
def parse_args():
|
||||||
parser = optparse.OptionParser(usage="%s [options]" % (sys.argv[0],),
|
parser = optparse.OptionParser(
|
||||||
description=__doc__)
|
usage="%s [options]" % sys.argv[0],
|
||||||
|
description=__doc__
|
||||||
|
)
|
||||||
gce_credentials.add_credentials_options(parser)
|
gce_credentials.add_credentials_options(parser)
|
||||||
parser.add_option("--yes", "-y",
|
parser.add_option(
|
||||||
|
"--yes", "-y",
|
||||||
action="store_true", dest="assumeyes",
|
action="store_true", dest="assumeyes",
|
||||||
default=False,
|
default=False,
|
||||||
help="Don't prompt for confirmation")
|
help="Don't prompt for confirmation"
|
||||||
parser.add_option("--match",
|
)
|
||||||
|
parser.add_option(
|
||||||
|
"--match",
|
||||||
action="store", dest="match_re",
|
action="store", dest="match_re",
|
||||||
default="^ansible-testing-",
|
default="^ansible-testing-",
|
||||||
help="Regular expression used to find GCE resources (default: %default)")
|
help="Regular expression used to find GCE resources (default: %default)"
|
||||||
|
)
|
||||||
|
|
||||||
(opts, args) = parser.parse_args()
|
(opts, args) = parser.parse_args()
|
||||||
gce_credentials.check_required(opts, parser)
|
gce_credentials.check_required(opts, parser)
|
||||||
|
@ -65,6 +77,7 @@ if __name__ == '__main__':
|
||||||
try:
|
try:
|
||||||
# Delete matching instances
|
# Delete matching instances
|
||||||
delete_gce_resources(gce.list_nodes, 'name', opts)
|
delete_gce_resources(gce.list_nodes, 'name', opts)
|
||||||
|
|
||||||
# Delete matching snapshots
|
# Delete matching snapshots
|
||||||
def get_snapshots():
|
def get_snapshots():
|
||||||
for volume in gce.list_volumes():
|
for volume in gce.list_volumes():
|
||||||
|
|
|
@ -55,19 +55,19 @@ def prompt_and_delete(item, prompt, assumeyes):
|
||||||
if not assumeyes:
|
if not assumeyes:
|
||||||
assumeyes = raw_input(prompt).lower() == 'y'
|
assumeyes = raw_input(prompt).lower() == 'y'
|
||||||
assert hasattr(item, 'delete') or hasattr(item, 'terminate'), \
|
assert hasattr(item, 'delete') or hasattr(item, 'terminate'), \
|
||||||
"Class <%s> has no delete or terminate attribute" % item.__class__
|
"Class <%s> has no delete or terminate attribute" % item.__class__
|
||||||
if assumeyes:
|
if assumeyes:
|
||||||
if hasattr(item, 'delete'):
|
if hasattr(item, 'delete'):
|
||||||
item.delete()
|
item.delete()
|
||||||
print ("Deleted %s" % item)
|
print("Deleted %s" % item)
|
||||||
if hasattr(item, 'terminate'):
|
if hasattr(item, 'terminate'):
|
||||||
item.terminate()
|
item.terminate()
|
||||||
print ("Terminated %s" % item)
|
print("Terminated %s" % item)
|
||||||
|
|
||||||
|
|
||||||
def delete_rax(args):
|
def delete_rax(args):
|
||||||
"""Function for deleting CloudServers"""
|
"""Function for deleting CloudServers"""
|
||||||
print ("--- Cleaning CloudServers matching '%s'" % args.match_re)
|
print("--- Cleaning CloudServers matching '%s'" % args.match_re)
|
||||||
search_opts = dict(name='^%s' % args.match_re)
|
search_opts = dict(name='^%s' % args.match_re)
|
||||||
for region in pyrax.identity.services.compute.regions:
|
for region in pyrax.identity.services.compute.regions:
|
||||||
cs = pyrax.connect_to_cloudservers(region=region)
|
cs = pyrax.connect_to_cloudservers(region=region)
|
||||||
|
@ -80,7 +80,7 @@ def delete_rax(args):
|
||||||
|
|
||||||
def delete_rax_clb(args):
|
def delete_rax_clb(args):
|
||||||
"""Function for deleting Cloud Load Balancers"""
|
"""Function for deleting Cloud Load Balancers"""
|
||||||
print ("--- Cleaning Cloud Load Balancers matching '%s'" % args.match_re)
|
print("--- Cleaning Cloud Load Balancers matching '%s'" % args.match_re)
|
||||||
for region in pyrax.identity.services.load_balancer.regions:
|
for region in pyrax.identity.services.load_balancer.regions:
|
||||||
clb = pyrax.connect_to_cloud_loadbalancers(region=region)
|
clb = pyrax.connect_to_cloud_loadbalancers(region=region)
|
||||||
for lb in rax_list_iterator(clb):
|
for lb in rax_list_iterator(clb):
|
||||||
|
@ -92,7 +92,7 @@ def delete_rax_clb(args):
|
||||||
|
|
||||||
def delete_rax_keypair(args):
|
def delete_rax_keypair(args):
|
||||||
"""Function for deleting Rackspace Key pairs"""
|
"""Function for deleting Rackspace Key pairs"""
|
||||||
print ("--- Cleaning Key Pairs matching '%s'" % args.match_re)
|
print("--- Cleaning Key Pairs matching '%s'" % args.match_re)
|
||||||
for region in pyrax.identity.services.compute.regions:
|
for region in pyrax.identity.services.compute.regions:
|
||||||
cs = pyrax.connect_to_cloudservers(region=region)
|
cs = pyrax.connect_to_cloudservers(region=region)
|
||||||
for keypair in cs.keypairs.list():
|
for keypair in cs.keypairs.list():
|
||||||
|
@ -104,7 +104,7 @@ def delete_rax_keypair(args):
|
||||||
|
|
||||||
def delete_rax_network(args):
|
def delete_rax_network(args):
|
||||||
"""Function for deleting Cloud Networks"""
|
"""Function for deleting Cloud Networks"""
|
||||||
print ("--- Cleaning Cloud Networks matching '%s'" % args.match_re)
|
print("--- Cleaning Cloud Networks matching '%s'" % args.match_re)
|
||||||
for region in pyrax.identity.services.network.regions:
|
for region in pyrax.identity.services.network.regions:
|
||||||
cnw = pyrax.connect_to_cloud_networks(region=region)
|
cnw = pyrax.connect_to_cloud_networks(region=region)
|
||||||
for network in cnw.list():
|
for network in cnw.list():
|
||||||
|
@ -116,7 +116,7 @@ def delete_rax_network(args):
|
||||||
|
|
||||||
def delete_rax_cbs(args):
|
def delete_rax_cbs(args):
|
||||||
"""Function for deleting Cloud Networks"""
|
"""Function for deleting Cloud Networks"""
|
||||||
print ("--- Cleaning Cloud Block Storage matching '%s'" % args.match_re)
|
print("--- Cleaning Cloud Block Storage matching '%s'" % args.match_re)
|
||||||
for region in pyrax.identity.services.network.regions:
|
for region in pyrax.identity.services.network.regions:
|
||||||
cbs = pyrax.connect_to_cloud_blockstorage(region=region)
|
cbs = pyrax.connect_to_cloud_blockstorage(region=region)
|
||||||
for volume in cbs.list():
|
for volume in cbs.list():
|
||||||
|
@ -128,7 +128,7 @@ def delete_rax_cbs(args):
|
||||||
|
|
||||||
def delete_rax_cdb(args):
|
def delete_rax_cdb(args):
|
||||||
"""Function for deleting Cloud Databases"""
|
"""Function for deleting Cloud Databases"""
|
||||||
print ("--- Cleaning Cloud Databases matching '%s'" % args.match_re)
|
print("--- Cleaning Cloud Databases matching '%s'" % args.match_re)
|
||||||
for region in pyrax.identity.services.database.regions:
|
for region in pyrax.identity.services.database.regions:
|
||||||
cdb = pyrax.connect_to_cloud_databases(region=region)
|
cdb = pyrax.connect_to_cloud_databases(region=region)
|
||||||
for db in rax_list_iterator(cdb):
|
for db in rax_list_iterator(cdb):
|
||||||
|
@ -146,7 +146,7 @@ def _force_delete_rax_scaling_group(manager):
|
||||||
|
|
||||||
def delete_rax_scaling_group(args):
|
def delete_rax_scaling_group(args):
|
||||||
"""Function for deleting Autoscale Groups"""
|
"""Function for deleting Autoscale Groups"""
|
||||||
print ("--- Cleaning Autoscale Groups matching '%s'" % args.match_re)
|
print("--- Cleaning Autoscale Groups matching '%s'" % args.match_re)
|
||||||
for region in pyrax.identity.services.autoscale.regions:
|
for region in pyrax.identity.services.autoscale.regions:
|
||||||
asg = pyrax.connect_to_autoscale(region=region)
|
asg = pyrax.connect_to_autoscale(region=region)
|
||||||
for group in rax_list_iterator(asg):
|
for group in rax_list_iterator(asg):
|
||||||
|
@ -170,11 +170,11 @@ def main():
|
||||||
try:
|
try:
|
||||||
func(args)
|
func(args)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print ("---- %s failed (%s)" % (func.__name__, e.message))
|
print("---- %s failed (%s)" % (func.__name__, e.message))
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
try:
|
try:
|
||||||
main()
|
main()
|
||||||
except KeyboardInterrupt:
|
except KeyboardInterrupt:
|
||||||
print ('\nExiting...')
|
print('\nExiting...')
|
||||||
|
|
|
@ -8,8 +8,7 @@ try:
|
||||||
from libcloud.compute.providers import get_driver
|
from libcloud.compute.providers import get_driver
|
||||||
_ = Provider.GCE
|
_ = Provider.GCE
|
||||||
except ImportError:
|
except ImportError:
|
||||||
print("failed=True " + \
|
print("failed=True msg='libcloud with GCE support (0.13.3+) required for this module'")
|
||||||
"msg='libcloud with GCE support (0.13.3+) required for this module'")
|
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -7,19 +7,22 @@ ${prefix}-snapshot. prefix will be forced to lowercase, to ensure the names are
|
||||||
legal GCE resource names.
|
legal GCE resource names.
|
||||||
'''
|
'''
|
||||||
|
|
||||||
import sys
|
|
||||||
import optparse
|
|
||||||
|
|
||||||
import gce_credentials
|
import gce_credentials
|
||||||
|
import optparse
|
||||||
|
import sys
|
||||||
|
|
||||||
|
|
||||||
def parse_args():
|
def parse_args():
|
||||||
parser = optparse.OptionParser(
|
parser = optparse.OptionParser(
|
||||||
usage="%s [options] <prefix>" % (sys.argv[0],), description=__doc__)
|
usage="%s [options] <prefix>" % (sys.argv[0],), description=__doc__
|
||||||
|
)
|
||||||
gce_credentials.add_credentials_options(parser)
|
gce_credentials.add_credentials_options(parser)
|
||||||
parser.add_option("--prefix",
|
parser.add_option(
|
||||||
action="store", dest="prefix",
|
"--prefix",
|
||||||
help="String used to prefix GCE resource names (default: %default)")
|
action="store",
|
||||||
|
dest="prefix",
|
||||||
|
help="String used to prefix GCE resource names (default: %default)"
|
||||||
|
)
|
||||||
|
|
||||||
(opts, args) = parser.parse_args()
|
(opts, args) = parser.parse_args()
|
||||||
gce_credentials.check_required(opts, parser)
|
gce_credentials.check_required(opts, parser)
|
||||||
|
@ -27,6 +30,7 @@ def parse_args():
|
||||||
parser.error("Missing required argument: name prefix")
|
parser.error("Missing required argument: name prefix")
|
||||||
return (opts, args)
|
return (opts, args)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
|
|
||||||
(opts, args) = parse_args()
|
(opts, args) = parse_args()
|
||||||
|
@ -34,9 +38,8 @@ if __name__ == '__main__':
|
||||||
prefix = args[0].lower()
|
prefix = args[0].lower()
|
||||||
try:
|
try:
|
||||||
base_volume = gce.create_volume(
|
base_volume = gce.create_volume(
|
||||||
size=10, name=prefix+'-base', location='us-central1-a')
|
size=10, name=prefix + '-base', location='us-central1-a')
|
||||||
gce.create_volume_snapshot(base_volume, name=prefix+'-snapshot')
|
gce.create_volume_snapshot(base_volume, name=prefix + '-snapshot')
|
||||||
gce.create_volume(
|
gce.create_volume(size=10, name=prefix + '-extra', location='us-central1-a')
|
||||||
size=10, name=prefix+'-extra', location='us-central1-a')
|
|
||||||
except KeyboardInterrupt as e:
|
except KeyboardInterrupt as e:
|
||||||
print("\nExiting on user command.")
|
print("\nExiting on user command.")
|
||||||
|
|
|
@ -1,7 +1,9 @@
|
||||||
import sys
|
|
||||||
import json
|
import json
|
||||||
|
import sys
|
||||||
|
|
||||||
from ansible.module_utils.basic import AnsibleModule
|
from ansible.module_utils.basic import AnsibleModule
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
if "--interactive" in sys.argv:
|
if "--interactive" in sys.argv:
|
||||||
import ansible.module_utils.basic
|
import ansible.module_utils.basic
|
||||||
|
@ -11,8 +13,9 @@ def main():
|
||||||
)
|
)
|
||||||
))
|
))
|
||||||
|
|
||||||
module = AnsibleModule(argument_spec = dict(
|
module = AnsibleModule(
|
||||||
fail_mode = dict(type='list', default=['success'])
|
argument_spec=dict(
|
||||||
|
fail_mode=dict(type='list', default=['success'])
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -14,4 +14,3 @@ if __name__ == '__main__':
|
||||||
mimetypes.add_type('application/json', '.json')
|
mimetypes.add_type('application/json', '.json')
|
||||||
import SimpleHTTPServer
|
import SimpleHTTPServer
|
||||||
SimpleHTTPServer.test()
|
SimpleHTTPServer.test()
|
||||||
|
|
||||||
|
|
|
@ -81,6 +81,7 @@ class Role(object):
|
||||||
for dep in self.dependencies:
|
for dep in self.dependencies:
|
||||||
f.write('- { role: %s }\n' % dep)
|
f.write('- { role: %s }\n' % dep)
|
||||||
|
|
||||||
|
|
||||||
class DynamicInventory(object):
|
class DynamicInventory(object):
|
||||||
BASESCRIPT = '''#!/usr/bin/python
|
BASESCRIPT = '''#!/usr/bin/python
|
||||||
import json
|
import json
|
||||||
|
@ -140,13 +141,12 @@ print(json.dumps(data, indent=2, sort_keys=True))
|
||||||
'hosts': [xhost],
|
'hosts': [xhost],
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
def write_script(self):
|
def write_script(self):
|
||||||
fdir = os.path.join(TESTDIR, 'inventory')
|
fdir = os.path.join(TESTDIR, 'inventory')
|
||||||
if not os.path.isdir(fdir):
|
if not os.path.isdir(fdir):
|
||||||
os.makedirs(fdir)
|
os.makedirs(fdir)
|
||||||
fpath = os.path.join(fdir, 'hosts')
|
fpath = os.path.join(fdir, 'hosts')
|
||||||
#fpath = os.path.join(TESTDIR, 'inventory')
|
# fpath = os.path.join(TESTDIR, 'inventory')
|
||||||
self.fpath = fpath
|
self.fpath = fpath
|
||||||
|
|
||||||
data = json.dumps(self.inventory)
|
data = json.dumps(self.inventory)
|
||||||
|
@ -414,22 +414,22 @@ def main():
|
||||||
features = [
|
features = [
|
||||||
'extra_vars',
|
'extra_vars',
|
||||||
'include_params',
|
'include_params',
|
||||||
#'role_params', # FIXME: we don't yet validate tasks within a role
|
# 'role_params', # FIXME: we don't yet validate tasks within a role
|
||||||
'set_fact',
|
'set_fact',
|
||||||
#'registered_vars', # FIXME: hard to simulate
|
# 'registered_vars', # FIXME: hard to simulate
|
||||||
'include_vars',
|
'include_vars',
|
||||||
#'role_dep_params',
|
# 'role_dep_params',
|
||||||
'task_vars',
|
'task_vars',
|
||||||
'block_vars',
|
'block_vars',
|
||||||
'role_var',
|
'role_var',
|
||||||
'vars_file',
|
'vars_file',
|
||||||
'play_var',
|
'play_var',
|
||||||
#'host_facts', # FIXME: hard to simulate
|
# 'host_facts', # FIXME: hard to simulate
|
||||||
'pb_host_vars_file',
|
'pb_host_vars_file',
|
||||||
'ini_host_vars_file',
|
'ini_host_vars_file',
|
||||||
'ini_host',
|
'ini_host',
|
||||||
'pb_group_vars_file_child',
|
'pb_group_vars_file_child',
|
||||||
#'ini_group_vars_file_child', #FIXME: this contradicts documented precedence pb group vars files should override inventory ones
|
# 'ini_group_vars_file_child', #FIXME: this contradicts documented precedence pb group vars files should override inventory ones
|
||||||
'pb_group_vars_file_parent',
|
'pb_group_vars_file_parent',
|
||||||
'ini_group_vars_file_parent',
|
'ini_group_vars_file_parent',
|
||||||
'pb_group_vars_file_all',
|
'pb_group_vars_file_all',
|
||||||
|
@ -489,7 +489,7 @@ def main():
|
||||||
dinv = options.use_dynamic_inventory
|
dinv = options.use_dynamic_inventory
|
||||||
if dinv:
|
if dinv:
|
||||||
# some features are specific to ini, so swap those
|
# some features are specific to ini, so swap those
|
||||||
for idx,x in enumerate(features):
|
for (idx, x) in enumerate(features):
|
||||||
if x.startswith('ini_') and 'vars_file' not in x:
|
if x.startswith('ini_') and 'vars_file' not in x:
|
||||||
features[idx] = x.replace('ini_', 'script_')
|
features[idx] = x.replace('ini_', 'script_')
|
||||||
|
|
||||||
|
|
|
@ -821,110 +821,3 @@ lib/ansible/utils/path.py
|
||||||
lib/ansible/utils/ssh_functions.py
|
lib/ansible/utils/ssh_functions.py
|
||||||
lib/ansible/utils/vars.py
|
lib/ansible/utils/vars.py
|
||||||
lib/ansible/vars/manager.py
|
lib/ansible/vars/manager.py
|
||||||
setup.py
|
|
||||||
test/integration/cleanup_azure.py
|
|
||||||
test/integration/cleanup_ec2.py
|
|
||||||
test/integration/cleanup_gce.py
|
|
||||||
test/integration/cleanup_rax.py
|
|
||||||
test/integration/gce_credentials.py
|
|
||||||
test/integration/setup_gce.py
|
|
||||||
test/integration/targets/async/library/async_test.py
|
|
||||||
test/integration/targets/uri/files/testserver.py
|
|
||||||
test/sanity/code-smell/ansible-var-precedence-check.py
|
|
||||||
test/units/cli/test_galaxy.py
|
|
||||||
test/units/contrib/inventory/test_vmware_inventory.py
|
|
||||||
test/units/errors/test_errors.py
|
|
||||||
test/units/executor/module_common/test_recursive_finder.py
|
|
||||||
test/units/executor/test_play_iterator.py
|
|
||||||
test/units/executor/test_playbook_executor.py
|
|
||||||
test/units/executor/test_task_executor.py
|
|
||||||
test/units/executor/test_task_result.py
|
|
||||||
test/units/inventory/test_inventory.py
|
|
||||||
test/units/mock/generator.py
|
|
||||||
test/units/mock/loader.py
|
|
||||||
test/units/module_utils/basic/test__log_invocation.py
|
|
||||||
test/units/module_utils/basic/test_deprecate_warn.py
|
|
||||||
test/units/module_utils/basic/test_exit_json.py
|
|
||||||
test/units/module_utils/basic/test_heuristic_log_sanitize.py
|
|
||||||
test/units/module_utils/basic/test_log.py
|
|
||||||
test/units/module_utils/basic/test_no_log.py
|
|
||||||
test/units/module_utils/basic/test_run_command.py
|
|
||||||
test/units/module_utils/basic/test_safe_eval.py
|
|
||||||
test/units/module_utils/basic/test_set_mode_if_different.py
|
|
||||||
test/units/module_utils/ec2/test_aws.py
|
|
||||||
test/units/module_utils/json_utils/test_filter_non_json_lines.py
|
|
||||||
test/units/module_utils/test_basic.py
|
|
||||||
test/units/module_utils/test_distribution_version.py
|
|
||||||
test/units/module_utils/test_facts.py
|
|
||||||
test/units/module_utils/test_postgresql.py
|
|
||||||
test/units/module_utils/test_text.py
|
|
||||||
test/units/modules/cloud/amazon/test_ec2_vpc_nat_gateway.py
|
|
||||||
test/units/modules/cloud/amazon/test_lambda.py
|
|
||||||
test/units/modules/cloud/amazon/test_s3.py
|
|
||||||
test/units/modules/cloud/docker/test_docker.py
|
|
||||||
test/units/modules/cloud/google/test_gce_tag.py
|
|
||||||
test/units/modules/cloud/openstack/test_os_server.py
|
|
||||||
test/units/modules/network/cumulus/test_nclu.py
|
|
||||||
test/units/modules/network/eos/eos_module.py
|
|
||||||
test/units/modules/network/eos/test_eos_command.py
|
|
||||||
test/units/modules/network/eos/test_eos_config.py
|
|
||||||
test/units/modules/network/eos/test_eos_system.py
|
|
||||||
test/units/modules/network/eos/test_eos_user.py
|
|
||||||
test/units/modules/network/ios/ios_module.py
|
|
||||||
test/units/modules/network/ios/test_ios_banner.py
|
|
||||||
test/units/modules/network/ios/test_ios_command.py
|
|
||||||
test/units/modules/network/ios/test_ios_config.py
|
|
||||||
test/units/modules/network/ios/test_ios_system.py
|
|
||||||
test/units/modules/network/ios/test_ios_template.py
|
|
||||||
test/units/modules/network/ios/test_ios_vrf.py
|
|
||||||
test/units/modules/network/iosxr/iosxr_module.py
|
|
||||||
test/units/modules/network/iosxr/test_iosxr_config.py
|
|
||||||
test/units/modules/network/iosxr/test_iosxr_facts.py
|
|
||||||
test/units/modules/network/iosxr/test_iosxr_system.py
|
|
||||||
test/units/modules/network/nxos/nxos_module.py
|
|
||||||
test/units/modules/network/nxos/test_nxos_command.py
|
|
||||||
test/units/modules/network/nxos/test_nxos_config.py
|
|
||||||
test/units/modules/network/nxos/test_nxos_evpn_global.py
|
|
||||||
test/units/modules/network/nxos/test_nxos_system.py
|
|
||||||
test/units/modules/network/vyos/test_vyos_command.py
|
|
||||||
test/units/modules/network/vyos/vyos_module.py
|
|
||||||
test/units/modules/packaging/os/test_apt.py
|
|
||||||
test/units/parsing/test_dataloader.py
|
|
||||||
test/units/parsing/test_mod_args.py
|
|
||||||
test/units/parsing/utils/test_addresses.py
|
|
||||||
test/units/parsing/utils/test_jsonify.py
|
|
||||||
test/units/parsing/vault/test_vault.py
|
|
||||||
test/units/parsing/vault/test_vault_editor.py
|
|
||||||
test/units/parsing/yaml/test_dumper.py
|
|
||||||
test/units/parsing/yaml/test_loader.py
|
|
||||||
test/units/parsing/yaml/test_objects.py
|
|
||||||
test/units/playbook/role/test_role.py
|
|
||||||
test/units/playbook/test_attribute.py
|
|
||||||
test/units/playbook/test_base.py
|
|
||||||
test/units/playbook/test_block.py
|
|
||||||
test/units/playbook/test_conditional.py
|
|
||||||
test/units/playbook/test_helpers.py
|
|
||||||
test/units/playbook/test_play_context.py
|
|
||||||
test/units/playbook/test_playbook.py
|
|
||||||
test/units/playbook/test_taggable.py
|
|
||||||
test/units/playbook/test_task.py
|
|
||||||
test/units/plugins/action/test_action.py
|
|
||||||
test/units/plugins/action/test_raw.py
|
|
||||||
test/units/plugins/action/test_synchronize.py
|
|
||||||
test/units/plugins/connection/test_connection.py
|
|
||||||
test/units/plugins/connection/test_netconf.py
|
|
||||||
test/units/plugins/connection/test_network_cli.py
|
|
||||||
test/units/plugins/connection/test_ssh.py
|
|
||||||
test/units/plugins/lookup/test_ini.py
|
|
||||||
test/units/plugins/lookup/test_password.py
|
|
||||||
test/units/plugins/strategy/test_strategy_base.py
|
|
||||||
test/units/plugins/test_plugins.py
|
|
||||||
test/units/template/test_safe_eval.py
|
|
||||||
test/units/template/test_templar.py
|
|
||||||
test/units/template/test_template_utilities.py
|
|
||||||
test/units/template/test_vars.py
|
|
||||||
test/units/test_constants.py
|
|
||||||
test/units/utils/test_helpers.py
|
|
||||||
test/units/utils/test_shlex.py
|
|
||||||
test/units/utils/test_vars.py
|
|
||||||
test/units/vars/test_variable_manager.py
|
|
||||||
|
|
|
@ -19,20 +19,19 @@
|
||||||
from __future__ import (absolute_import, division, print_function)
|
from __future__ import (absolute_import, division, print_function)
|
||||||
__metaclass__ = type
|
__metaclass__ = type
|
||||||
|
|
||||||
|
import ansible
|
||||||
import os
|
import os
|
||||||
import shutil
|
import shutil
|
||||||
import tarfile
|
import tarfile
|
||||||
import tempfile
|
import tempfile
|
||||||
import yaml
|
import yaml
|
||||||
|
|
||||||
|
from ansible.cli.galaxy import GalaxyCLI
|
||||||
from ansible.compat.tests import unittest
|
from ansible.compat.tests import unittest
|
||||||
from ansible.compat.tests.mock import call, patch
|
from ansible.compat.tests.mock import call, patch
|
||||||
|
from ansible.errors import AnsibleError, AnsibleOptionsError
|
||||||
from ansible.module_utils.six import PY3
|
from ansible.module_utils.six import PY3
|
||||||
|
|
||||||
import ansible
|
|
||||||
from ansible.errors import AnsibleError, AnsibleOptionsError
|
|
||||||
|
|
||||||
from ansible.cli.galaxy import GalaxyCLI
|
|
||||||
|
|
||||||
class TestGalaxy(unittest.TestCase):
|
class TestGalaxy(unittest.TestCase):
|
||||||
@classmethod
|
@classmethod
|
||||||
|
@ -72,7 +71,7 @@ class TestGalaxy(unittest.TestCase):
|
||||||
try:
|
try:
|
||||||
tar = tarfile.open(output_file, "w:gz")
|
tar = tarfile.open(output_file, "w:gz")
|
||||||
tar.add(source_dir, arcname=os.path.basename(source_dir))
|
tar.add(source_dir, arcname=os.path.basename(source_dir))
|
||||||
except AttributeError: # tarfile obj. has no attribute __exit__ prior to python 2. 7
|
except AttributeError: # tarfile obj. has no attribute __exit__ prior to python 2. 7
|
||||||
pass
|
pass
|
||||||
finally: # ensuring closure of tarfile obj
|
finally: # ensuring closure of tarfile obj
|
||||||
tar.close()
|
tar.close()
|
||||||
|
@ -101,7 +100,7 @@ class TestGalaxy(unittest.TestCase):
|
||||||
gc = GalaxyCLI(args=self.default_args)
|
gc = GalaxyCLI(args=self.default_args)
|
||||||
role_info = {'name': 'some_role_name'}
|
role_info = {'name': 'some_role_name'}
|
||||||
display_result = gc._display_role_info(role_info)
|
display_result = gc._display_role_info(role_info)
|
||||||
self.assertTrue(display_result.find('some_role_name') >-1)
|
self.assertTrue(display_result.find('some_role_name') > -1)
|
||||||
|
|
||||||
def test_display_galaxy_info(self):
|
def test_display_galaxy_info(self):
|
||||||
gc = GalaxyCLI(args=self.default_args)
|
gc = GalaxyCLI(args=self.default_args)
|
||||||
|
@ -330,7 +329,7 @@ class ValidRoleTests(object):
|
||||||
self.assertTrue(os.path.isdir(os.path.join(self.role_dir, d)), msg="Expected role subdirectory {0} doesn't exist".format(d))
|
self.assertTrue(os.path.isdir(os.path.join(self.role_dir, d)), msg="Expected role subdirectory {0} doesn't exist".format(d))
|
||||||
|
|
||||||
def test_travis_yml(self):
|
def test_travis_yml(self):
|
||||||
with open(os.path.join(self.role_dir,'.travis.yml'), 'r') as f:
|
with open(os.path.join(self.role_dir, '.travis.yml'), 'r') as f:
|
||||||
contents = f.read()
|
contents = f.read()
|
||||||
|
|
||||||
with open(os.path.join(self.role_skeleton_path, '.travis.yml'), 'r') as f:
|
with open(os.path.join(self.role_skeleton_path, '.travis.yml'), 'r') as f:
|
||||||
|
@ -378,7 +377,7 @@ class TestGalaxyInitContainerEnabled(unittest.TestCase, ValidRoleTests):
|
||||||
def test_metadata_container_tag(self):
|
def test_metadata_container_tag(self):
|
||||||
with open(os.path.join(self.role_dir, 'meta', 'main.yml'), 'r') as mf:
|
with open(os.path.join(self.role_dir, 'meta', 'main.yml'), 'r') as mf:
|
||||||
metadata = yaml.safe_load(mf)
|
metadata = yaml.safe_load(mf)
|
||||||
self.assertIn('container', metadata.get('galaxy_info', dict()).get('galaxy_tags',[]), msg='container tag not set in role metadata')
|
self.assertIn('container', metadata.get('galaxy_info', dict()).get('galaxy_tags', []), msg='container tag not set in role metadata')
|
||||||
|
|
||||||
def test_metadata_contents(self):
|
def test_metadata_contents(self):
|
||||||
with open(os.path.join(self.role_dir, 'meta', 'main.yml'), 'r') as mf:
|
with open(os.path.join(self.role_dir, 'meta', 'main.yml'), 'r') as mf:
|
||||||
|
|
|
@ -10,8 +10,6 @@ except ImportError:
|
||||||
from nose.plugins.skip import SkipTest
|
from nose.plugins.skip import SkipTest
|
||||||
raise SkipTest("test_vmware_inventory.py requires the python module 'vmware_inventory'")
|
raise SkipTest("test_vmware_inventory.py requires the python module 'vmware_inventory'")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# contrib's dirstruct doesn't contain __init__.py files
|
# contrib's dirstruct doesn't contain __init__.py files
|
||||||
checkout_path = os.path.dirname(__file__)
|
checkout_path = os.path.dirname(__file__)
|
||||||
checkout_path = checkout_path.replace('/test/units/contrib/inventory', '')
|
checkout_path = checkout_path.replace('/test/units/contrib/inventory', '')
|
||||||
|
@ -21,15 +19,19 @@ sys.path.append(os.path.abspath(inventory_dir))
|
||||||
# cleanup so that nose's path is not polluted with other inv scripts
|
# cleanup so that nose's path is not polluted with other inv scripts
|
||||||
sys.path.remove(os.path.abspath(inventory_dir))
|
sys.path.remove(os.path.abspath(inventory_dir))
|
||||||
|
|
||||||
|
BASICINVENTORY = {
|
||||||
|
'all': {
|
||||||
|
'hosts': ['foo', 'bar']
|
||||||
|
},
|
||||||
|
'_meta': {
|
||||||
|
'hostvars': {
|
||||||
|
'foo': {'hostname': 'foo'},
|
||||||
|
'bar': {'hostname': 'bar'}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
BASICINVENTORY = {'all': {'hosts': ['foo', 'bar']},
|
|
||||||
'_meta': { 'hostvars': { 'foo': {'hostname': 'foo'},
|
|
||||||
'bar': {'hostname': 'bar'}}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class FakeArgs(object):
|
class FakeArgs(object):
|
||||||
debug = False
|
debug = False
|
||||||
write_dumpfile = None
|
write_dumpfile = None
|
||||||
|
@ -37,6 +39,7 @@ class FakeArgs(object):
|
||||||
host = False
|
host = False
|
||||||
list = True
|
list = True
|
||||||
|
|
||||||
|
|
||||||
class TestVMWareInventory(unittest.TestCase):
|
class TestVMWareInventory(unittest.TestCase):
|
||||||
|
|
||||||
def test_host_info_returns_single_host(self):
|
def test_host_info_returns_single_host(self):
|
||||||
|
@ -61,7 +64,7 @@ class TestVMWareInventory(unittest.TestCase):
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
assert serializable
|
assert serializable
|
||||||
#import epdb; epdb.st()
|
# import epdb; epdb.st()
|
||||||
|
|
||||||
def test_show_list_returns_serializable_data(self):
|
def test_show_list_returns_serializable_data(self):
|
||||||
fakeargs = FakeArgs()
|
fakeargs = FakeArgs()
|
||||||
|
@ -78,7 +81,7 @@ class TestVMWareInventory(unittest.TestCase):
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
assert serializable
|
assert serializable
|
||||||
#import epdb; epdb.st()
|
# import epdb; epdb.st()
|
||||||
|
|
||||||
def test_show_list_returns_all_data(self):
|
def test_show_list_returns_all_data(self):
|
||||||
fakeargs = FakeArgs()
|
fakeargs = FakeArgs()
|
||||||
|
@ -105,7 +108,7 @@ class TestVMWareInventory(unittest.TestCase):
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
assert serializable
|
assert serializable
|
||||||
#import epdb; epdb.st()
|
# import epdb; epdb.st()
|
||||||
|
|
||||||
def test_show_host_returns_just_host(self):
|
def test_show_host_returns_just_host(self):
|
||||||
fakeargs = FakeArgs()
|
fakeargs = FakeArgs()
|
||||||
|
@ -117,5 +120,5 @@ class TestVMWareInventory(unittest.TestCase):
|
||||||
showdata = vmw.show()
|
showdata = vmw.show()
|
||||||
expected = BASICINVENTORY['_meta']['hostvars']['foo']
|
expected = BASICINVENTORY['_meta']['hostvars']['foo']
|
||||||
expected = json.dumps(expected, indent=2)
|
expected = json.dumps(expected, indent=2)
|
||||||
#import epdb; epdb.st()
|
# import epdb; epdb.st()
|
||||||
assert showdata == expected
|
assert showdata == expected
|
||||||
|
|
|
@ -19,13 +19,12 @@
|
||||||
from __future__ import (absolute_import, division, print_function)
|
from __future__ import (absolute_import, division, print_function)
|
||||||
__metaclass__ = type
|
__metaclass__ = type
|
||||||
|
|
||||||
from ansible.compat.tests import unittest
|
|
||||||
|
|
||||||
from ansible.parsing.yaml.objects import AnsibleBaseYAMLObject
|
from ansible.compat.tests import BUILTINS, unittest
|
||||||
from ansible.errors import AnsibleError
|
|
||||||
|
|
||||||
from ansible.compat.tests import BUILTINS
|
|
||||||
from ansible.compat.tests.mock import mock_open, patch
|
from ansible.compat.tests.mock import mock_open, patch
|
||||||
|
from ansible.errors import AnsibleError
|
||||||
|
from ansible.parsing.yaml.objects import AnsibleBaseYAMLObject
|
||||||
|
|
||||||
|
|
||||||
class TestErrors(unittest.TestCase):
|
class TestErrors(unittest.TestCase):
|
||||||
|
|
||||||
|
|
|
@ -20,13 +20,13 @@ from __future__ import (absolute_import, division, print_function)
|
||||||
__metaclass__ = type
|
__metaclass__ = type
|
||||||
|
|
||||||
import imp
|
import imp
|
||||||
|
import pytest
|
||||||
import zipfile
|
import zipfile
|
||||||
|
|
||||||
from collections import namedtuple
|
from collections import namedtuple
|
||||||
from functools import partial
|
from functools import partial
|
||||||
from io import BytesIO, StringIO
|
from io import BytesIO, StringIO
|
||||||
|
|
||||||
import pytest
|
|
||||||
|
|
||||||
import ansible.errors
|
import ansible.errors
|
||||||
|
|
||||||
from ansible.executor.module_common import recursive_finder
|
from ansible.executor.module_common import recursive_finder
|
||||||
|
@ -42,12 +42,12 @@ def finder_containers():
|
||||||
FinderContainers = namedtuple('FinderContainers', ['py_module_names', 'py_module_cache', 'zf'])
|
FinderContainers = namedtuple('FinderContainers', ['py_module_names', 'py_module_cache', 'zf'])
|
||||||
|
|
||||||
py_module_names = set()
|
py_module_names = set()
|
||||||
#py_module_cache = {('__init__',): b''}
|
# py_module_cache = {('__init__',): b''}
|
||||||
py_module_cache = {}
|
py_module_cache = {}
|
||||||
|
|
||||||
zipoutput = BytesIO()
|
zipoutput = BytesIO()
|
||||||
zf = zipfile.ZipFile(zipoutput, mode='w', compression=zipfile.ZIP_STORED)
|
zf = zipfile.ZipFile(zipoutput, mode='w', compression=zipfile.ZIP_STORED)
|
||||||
#zf.writestr('ansible/__init__.py', b'')
|
# zf.writestr('ansible/__init__.py', b'')
|
||||||
|
|
||||||
return FinderContainers(py_module_names, py_module_cache, zf)
|
return FinderContainers(py_module_names, py_module_cache, zf)
|
||||||
|
|
||||||
|
@ -79,7 +79,7 @@ class TestRecursiveFinder(object):
|
||||||
else:
|
else:
|
||||||
module_utils_data = StringIO(u'# License\ndef do_something():\n pass\n')
|
module_utils_data = StringIO(u'# License\ndef do_something():\n pass\n')
|
||||||
mocker.patch('imp.find_module', side_effect=partial(find_package_foo, module_utils_data))
|
mocker.patch('imp.find_module', side_effect=partial(find_package_foo, module_utils_data))
|
||||||
mocker.patch('ansible.executor.module_common._slurp', side_effect= lambda x: b'# License\ndef do_something():\n pass\n')
|
mocker.patch('ansible.executor.module_common._slurp', side_effect=lambda x: b'# License\ndef do_something():\n pass\n')
|
||||||
|
|
||||||
name = 'ping'
|
name = 'ping'
|
||||||
data = b'#!/usr/bin/python\nfrom ansible.module_utils import foo'
|
data = b'#!/usr/bin/python\nfrom ansible.module_utils import foo'
|
||||||
|
|
|
@ -57,10 +57,9 @@ class TestPlayIterator(unittest.TestCase):
|
||||||
|
|
||||||
new_hs = hs.copy()
|
new_hs = hs.copy()
|
||||||
|
|
||||||
|
|
||||||
@patch('ansible.playbook.role.definition.unfrackpath', mock_unfrackpath_noop)
|
@patch('ansible.playbook.role.definition.unfrackpath', mock_unfrackpath_noop)
|
||||||
def test_play_iterator(self):
|
def test_play_iterator(self):
|
||||||
#import epdb; epdb.st()
|
# import epdb; epdb.st()
|
||||||
fake_loader = DictDataLoader({
|
fake_loader = DictDataLoader({
|
||||||
"test_play.yml": """
|
"test_play.yml": """
|
||||||
- hosts: all
|
- hosts: all
|
||||||
|
@ -191,11 +190,11 @@ class TestPlayIterator(unittest.TestCase):
|
||||||
self.assertEqual(task.name, "role always task")
|
self.assertEqual(task.name, "role always task")
|
||||||
self.assertIsNotNone(task._role)
|
self.assertIsNotNone(task._role)
|
||||||
# role include task
|
# role include task
|
||||||
#(host_state, task) = itr.get_next_task_for_host(hosts[0])
|
# (host_state, task) = itr.get_next_task_for_host(hosts[0])
|
||||||
#self.assertIsNotNone(task)
|
# self.assertIsNotNone(task)
|
||||||
#self.assertEqual(task.action, 'debug')
|
# self.assertEqual(task.action, 'debug')
|
||||||
#self.assertEqual(task.name, "role included task")
|
# self.assertEqual(task.name, "role included task")
|
||||||
#self.assertIsNotNone(task._role)
|
# self.assertIsNotNone(task._role)
|
||||||
# role task after include
|
# role task after include
|
||||||
(host_state, task) = itr.get_next_task_for_host(hosts[0])
|
(host_state, task) = itr.get_next_task_for_host(hosts[0])
|
||||||
self.assertIsNotNone(task)
|
self.assertIsNotNone(task)
|
||||||
|
@ -427,7 +426,7 @@ class TestPlayIterator(unittest.TestCase):
|
||||||
)
|
)
|
||||||
|
|
||||||
# test the high-level add_tasks() method
|
# test the high-level add_tasks() method
|
||||||
s = HostState(blocks=[0,1,2])
|
s = HostState(blocks=[0, 1, 2])
|
||||||
itr._insert_tasks_into_state = MagicMock(return_value=s)
|
itr._insert_tasks_into_state = MagicMock(return_value=s)
|
||||||
itr.add_tasks(hosts[0], [MagicMock(), MagicMock(), MagicMock()])
|
itr.add_tasks(hosts[0], [MagicMock(), MagicMock(), MagicMock()])
|
||||||
self.assertEqual(itr._host_states[hosts[0].name], s)
|
self.assertEqual(itr._host_states[hosts[0].name], s)
|
||||||
|
|
|
@ -21,13 +21,13 @@ __metaclass__ = type
|
||||||
|
|
||||||
from ansible.compat.tests import unittest
|
from ansible.compat.tests import unittest
|
||||||
from ansible.compat.tests.mock import MagicMock
|
from ansible.compat.tests.mock import MagicMock
|
||||||
|
|
||||||
from ansible.executor.playbook_executor import PlaybookExecutor
|
from ansible.executor.playbook_executor import PlaybookExecutor
|
||||||
from ansible.playbook import Playbook
|
from ansible.playbook import Playbook
|
||||||
from ansible.template import Templar
|
from ansible.template import Templar
|
||||||
|
|
||||||
from units.mock.loader import DictDataLoader
|
from units.mock.loader import DictDataLoader
|
||||||
|
|
||||||
|
|
||||||
class TestPlaybookExecutor(unittest.TestCase):
|
class TestPlaybookExecutor(unittest.TestCase):
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
|
@ -96,46 +96,55 @@ class TestPlaybookExecutor(unittest.TestCase):
|
||||||
playbook = Playbook.load(pbe._playbooks[0], variable_manager=mock_var_manager, loader=fake_loader)
|
playbook = Playbook.load(pbe._playbooks[0], variable_manager=mock_var_manager, loader=fake_loader)
|
||||||
play = playbook.get_plays()[0]
|
play = playbook.get_plays()[0]
|
||||||
play.post_validate(templar)
|
play.post_validate(templar)
|
||||||
mock_inventory.get_hosts.return_value = ['host0','host1','host2','host3','host4','host5','host6','host7','host8','host9']
|
mock_inventory.get_hosts.return_value = ['host0', 'host1', 'host2', 'host3', 'host4', 'host5', 'host6', 'host7', 'host8', 'host9']
|
||||||
self.assertEqual(pbe._get_serialized_batches(play), [['host0','host1','host2','host3','host4','host5','host6','host7','host8','host9']])
|
self.assertEqual(pbe._get_serialized_batches(play), [['host0', 'host1', 'host2', 'host3', 'host4', 'host5', 'host6', 'host7', 'host8', 'host9']])
|
||||||
|
|
||||||
playbook = Playbook.load(pbe._playbooks[1], variable_manager=mock_var_manager, loader=fake_loader)
|
playbook = Playbook.load(pbe._playbooks[1], variable_manager=mock_var_manager, loader=fake_loader)
|
||||||
play = playbook.get_plays()[0]
|
play = playbook.get_plays()[0]
|
||||||
play.post_validate(templar)
|
play.post_validate(templar)
|
||||||
mock_inventory.get_hosts.return_value = ['host0','host1','host2','host3','host4','host5','host6','host7','host8','host9']
|
mock_inventory.get_hosts.return_value = ['host0', 'host1', 'host2', 'host3', 'host4', 'host5', 'host6', 'host7', 'host8', 'host9']
|
||||||
self.assertEqual(pbe._get_serialized_batches(play), [['host0','host1'],['host2','host3'],['host4','host5'],['host6','host7'],['host8','host9']])
|
self.assertEqual(
|
||||||
|
pbe._get_serialized_batches(play),
|
||||||
|
[['host0', 'host1'], ['host2', 'host3'], ['host4', 'host5'], ['host6', 'host7'], ['host8', 'host9']]
|
||||||
|
)
|
||||||
|
|
||||||
playbook = Playbook.load(pbe._playbooks[2], variable_manager=mock_var_manager, loader=fake_loader)
|
playbook = Playbook.load(pbe._playbooks[2], variable_manager=mock_var_manager, loader=fake_loader)
|
||||||
play = playbook.get_plays()[0]
|
play = playbook.get_plays()[0]
|
||||||
play.post_validate(templar)
|
play.post_validate(templar)
|
||||||
mock_inventory.get_hosts.return_value = ['host0','host1','host2','host3','host4','host5','host6','host7','host8','host9']
|
mock_inventory.get_hosts.return_value = ['host0', 'host1', 'host2', 'host3', 'host4', 'host5', 'host6', 'host7', 'host8', 'host9']
|
||||||
self.assertEqual(pbe._get_serialized_batches(play), [['host0','host1'],['host2','host3'],['host4','host5'],['host6','host7'],['host8','host9']])
|
self.assertEqual(
|
||||||
|
pbe._get_serialized_batches(play),
|
||||||
|
[['host0', 'host1'], ['host2', 'host3'], ['host4', 'host5'], ['host6', 'host7'], ['host8', 'host9']]
|
||||||
|
)
|
||||||
|
|
||||||
playbook = Playbook.load(pbe._playbooks[3], variable_manager=mock_var_manager, loader=fake_loader)
|
playbook = Playbook.load(pbe._playbooks[3], variable_manager=mock_var_manager, loader=fake_loader)
|
||||||
play = playbook.get_plays()[0]
|
play = playbook.get_plays()[0]
|
||||||
play.post_validate(templar)
|
play.post_validate(templar)
|
||||||
mock_inventory.get_hosts.return_value = ['host0','host1','host2','host3','host4','host5','host6','host7','host8','host9']
|
mock_inventory.get_hosts.return_value = ['host0', 'host1', 'host2', 'host3', 'host4', 'host5', 'host6', 'host7', 'host8', 'host9']
|
||||||
self.assertEqual(pbe._get_serialized_batches(play), [['host0'],['host1','host2'],['host3','host4','host5'],['host6','host7','host8'],['host9']])
|
self.assertEqual(
|
||||||
|
pbe._get_serialized_batches(play),
|
||||||
|
[['host0'], ['host1', 'host2'], ['host3', 'host4', 'host5'], ['host6', 'host7', 'host8'], ['host9']]
|
||||||
|
)
|
||||||
|
|
||||||
playbook = Playbook.load(pbe._playbooks[4], variable_manager=mock_var_manager, loader=fake_loader)
|
playbook = Playbook.load(pbe._playbooks[4], variable_manager=mock_var_manager, loader=fake_loader)
|
||||||
play = playbook.get_plays()[0]
|
play = playbook.get_plays()[0]
|
||||||
play.post_validate(templar)
|
play.post_validate(templar)
|
||||||
mock_inventory.get_hosts.return_value = ['host0','host1','host2','host3','host4','host5','host6','host7','host8','host9']
|
mock_inventory.get_hosts.return_value = ['host0', 'host1', 'host2', 'host3', 'host4', 'host5', 'host6', 'host7', 'host8', 'host9']
|
||||||
self.assertEqual(pbe._get_serialized_batches(play), [['host0'],['host1','host2'],['host3','host4','host5','host6','host7','host8','host9']])
|
self.assertEqual(pbe._get_serialized_batches(play), [['host0'], ['host1', 'host2'], ['host3', 'host4', 'host5', 'host6', 'host7', 'host8', 'host9']])
|
||||||
|
|
||||||
# Test when serial percent is under 1.0
|
# Test when serial percent is under 1.0
|
||||||
playbook = Playbook.load(pbe._playbooks[2], variable_manager=mock_var_manager, loader=fake_loader)
|
playbook = Playbook.load(pbe._playbooks[2], variable_manager=mock_var_manager, loader=fake_loader)
|
||||||
play = playbook.get_plays()[0]
|
play = playbook.get_plays()[0]
|
||||||
play.post_validate(templar)
|
play.post_validate(templar)
|
||||||
mock_inventory.get_hosts.return_value = ['host0','host1','host2']
|
mock_inventory.get_hosts.return_value = ['host0', 'host1', 'host2']
|
||||||
self.assertEqual(pbe._get_serialized_batches(play), [['host0'],['host1'],['host2']])
|
self.assertEqual(pbe._get_serialized_batches(play), [['host0'], ['host1'], ['host2']])
|
||||||
|
|
||||||
# Test when there is a remainder for serial as a percent
|
# Test when there is a remainder for serial as a percent
|
||||||
playbook = Playbook.load(pbe._playbooks[2], variable_manager=mock_var_manager, loader=fake_loader)
|
playbook = Playbook.load(pbe._playbooks[2], variable_manager=mock_var_manager, loader=fake_loader)
|
||||||
play = playbook.get_plays()[0]
|
play = playbook.get_plays()[0]
|
||||||
play.post_validate(templar)
|
play.post_validate(templar)
|
||||||
mock_inventory.get_hosts.return_value = ['host0','host1','host2','host3','host4','host5','host6','host7','host8','host9','host10']
|
mock_inventory.get_hosts.return_value = ['host0', 'host1', 'host2', 'host3', 'host4', 'host5', 'host6', 'host7', 'host8', 'host9', 'host10']
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
pbe._get_serialized_batches(play),
|
pbe._get_serialized_batches(play),
|
||||||
[['host0','host1'],['host2','host3'],['host4','host5'],['host6','host7'],['host8','host9'],['host10']]
|
[['host0', 'host1'], ['host2', 'host3'], ['host4', 'host5'], ['host6', 'host7'], ['host8', 'host9'], ['host10']]
|
||||||
)
|
)
|
||||||
|
|
|
@ -21,7 +21,6 @@ __metaclass__ = type
|
||||||
|
|
||||||
from ansible.compat.tests import unittest
|
from ansible.compat.tests import unittest
|
||||||
from ansible.compat.tests.mock import patch, MagicMock
|
from ansible.compat.tests.mock import patch, MagicMock
|
||||||
|
|
||||||
from ansible.errors import AnsibleError, AnsibleParserError
|
from ansible.errors import AnsibleError, AnsibleParserError
|
||||||
from ansible.executor.task_executor import TaskExecutor
|
from ansible.executor.task_executor import TaskExecutor
|
||||||
from ansible.playbook.play_context import PlayContext
|
from ansible.playbook.play_context import PlayContext
|
||||||
|
@ -30,6 +29,7 @@ from ansible.parsing.yaml.objects import AnsibleUnicode
|
||||||
|
|
||||||
from units.mock.loader import DictDataLoader
|
from units.mock.loader import DictDataLoader
|
||||||
|
|
||||||
|
|
||||||
class TestTaskExecutor(unittest.TestCase):
|
class TestTaskExecutor(unittest.TestCase):
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
|
@ -48,14 +48,14 @@ class TestTaskExecutor(unittest.TestCase):
|
||||||
job_vars = dict()
|
job_vars = dict()
|
||||||
mock_queue = MagicMock()
|
mock_queue = MagicMock()
|
||||||
te = TaskExecutor(
|
te = TaskExecutor(
|
||||||
host = mock_host,
|
host=mock_host,
|
||||||
task = mock_task,
|
task=mock_task,
|
||||||
job_vars = job_vars,
|
job_vars=job_vars,
|
||||||
play_context = mock_play_context,
|
play_context=mock_play_context,
|
||||||
new_stdin = new_stdin,
|
new_stdin=new_stdin,
|
||||||
loader = fake_loader,
|
loader=fake_loader,
|
||||||
shared_loader_obj = mock_shared_loader,
|
shared_loader_obj=mock_shared_loader,
|
||||||
rslt_q = mock_queue,
|
rslt_q=mock_queue,
|
||||||
)
|
)
|
||||||
|
|
||||||
def test_task_executor_run(self):
|
def test_task_executor_run(self):
|
||||||
|
@ -75,14 +75,14 @@ class TestTaskExecutor(unittest.TestCase):
|
||||||
job_vars = dict()
|
job_vars = dict()
|
||||||
|
|
||||||
te = TaskExecutor(
|
te = TaskExecutor(
|
||||||
host = mock_host,
|
host=mock_host,
|
||||||
task = mock_task,
|
task=mock_task,
|
||||||
job_vars = job_vars,
|
job_vars=job_vars,
|
||||||
play_context = mock_play_context,
|
play_context=mock_play_context,
|
||||||
new_stdin = new_stdin,
|
new_stdin=new_stdin,
|
||||||
loader = fake_loader,
|
loader=fake_loader,
|
||||||
shared_loader_obj = mock_shared_loader,
|
shared_loader_obj=mock_shared_loader,
|
||||||
rslt_q = mock_queue,
|
rslt_q=mock_queue,
|
||||||
)
|
)
|
||||||
|
|
||||||
te._get_loop_items = MagicMock(return_value=None)
|
te._get_loop_items = MagicMock(return_value=None)
|
||||||
|
@ -92,7 +92,7 @@ class TestTaskExecutor(unittest.TestCase):
|
||||||
te._get_loop_items = MagicMock(return_value=[])
|
te._get_loop_items = MagicMock(return_value=[])
|
||||||
res = te.run()
|
res = te.run()
|
||||||
|
|
||||||
te._get_loop_items = MagicMock(return_value=['a','b','c'])
|
te._get_loop_items = MagicMock(return_value=['a', 'b', 'c'])
|
||||||
te._run_loop = MagicMock(return_value=[dict(item='a', changed=True), dict(item='b', failed=True), dict(item='c')])
|
te._run_loop = MagicMock(return_value=[dict(item='a', changed=True), dict(item='b', failed=True), dict(item='c')])
|
||||||
res = te.run()
|
res = te.run()
|
||||||
|
|
||||||
|
@ -119,14 +119,14 @@ class TestTaskExecutor(unittest.TestCase):
|
||||||
mock_queue = MagicMock()
|
mock_queue = MagicMock()
|
||||||
|
|
||||||
te = TaskExecutor(
|
te = TaskExecutor(
|
||||||
host = mock_host,
|
host=mock_host,
|
||||||
task = mock_task,
|
task=mock_task,
|
||||||
job_vars = job_vars,
|
job_vars=job_vars,
|
||||||
play_context = mock_play_context,
|
play_context=mock_play_context,
|
||||||
new_stdin = new_stdin,
|
new_stdin=new_stdin,
|
||||||
loader = fake_loader,
|
loader=fake_loader,
|
||||||
shared_loader_obj = mock_shared_loader,
|
shared_loader_obj=mock_shared_loader,
|
||||||
rslt_q = mock_queue,
|
rslt_q=mock_queue,
|
||||||
)
|
)
|
||||||
|
|
||||||
items = te._get_loop_items()
|
items = te._get_loop_items()
|
||||||
|
@ -155,14 +155,14 @@ class TestTaskExecutor(unittest.TestCase):
|
||||||
job_vars = dict()
|
job_vars = dict()
|
||||||
|
|
||||||
te = TaskExecutor(
|
te = TaskExecutor(
|
||||||
host = mock_host,
|
host=mock_host,
|
||||||
task = mock_task,
|
task=mock_task,
|
||||||
job_vars = job_vars,
|
job_vars=job_vars,
|
||||||
play_context = mock_play_context,
|
play_context=mock_play_context,
|
||||||
new_stdin = new_stdin,
|
new_stdin=new_stdin,
|
||||||
loader = fake_loader,
|
loader=fake_loader,
|
||||||
shared_loader_obj = mock_shared_loader,
|
shared_loader_obj=mock_shared_loader,
|
||||||
rslt_q = mock_queue,
|
rslt_q=mock_queue,
|
||||||
)
|
)
|
||||||
|
|
||||||
def _execute(variables):
|
def _execute(variables):
|
||||||
|
@ -201,51 +201,49 @@ class TestTaskExecutor(unittest.TestCase):
|
||||||
job_vars = dict(pkg_mgr='yum')
|
job_vars = dict(pkg_mgr='yum')
|
||||||
|
|
||||||
te = TaskExecutor(
|
te = TaskExecutor(
|
||||||
host = mock_host,
|
host=mock_host,
|
||||||
task = mock_task,
|
task=mock_task,
|
||||||
job_vars = job_vars,
|
job_vars=job_vars,
|
||||||
play_context = mock_play_context,
|
play_context=mock_play_context,
|
||||||
new_stdin = new_stdin,
|
new_stdin=new_stdin,
|
||||||
loader = fake_loader,
|
loader=fake_loader,
|
||||||
shared_loader_obj = mock_shared_loader,
|
shared_loader_obj=mock_shared_loader,
|
||||||
rslt_q = mock_queue,
|
rslt_q=mock_queue,
|
||||||
)
|
)
|
||||||
|
|
||||||
#
|
|
||||||
# No replacement
|
# No replacement
|
||||||
#
|
|
||||||
mock_task.action = 'yum'
|
mock_task.action = 'yum'
|
||||||
new_items = te._squash_items(items=items, loop_var='item', variables=job_vars)
|
new_items = te._squash_items(items=items, loop_var='item', variables=job_vars)
|
||||||
self.assertEqual(new_items, ['a', 'b', 'c'])
|
self.assertEqual(new_items, ['a', 'b', 'c'])
|
||||||
self.assertIsInstance(mock_task.args, MagicMock)
|
self.assertIsInstance(mock_task.args, MagicMock)
|
||||||
|
|
||||||
mock_task.action = 'foo'
|
mock_task.action = 'foo'
|
||||||
mock_task.args={'name': '{{item}}'}
|
mock_task.args = {'name': '{{item}}'}
|
||||||
new_items = te._squash_items(items=items, loop_var='item', variables=job_vars)
|
new_items = te._squash_items(items=items, loop_var='item', variables=job_vars)
|
||||||
self.assertEqual(new_items, ['a', 'b', 'c'])
|
self.assertEqual(new_items, ['a', 'b', 'c'])
|
||||||
self.assertEqual(mock_task.args, {'name': '{{item}}'})
|
self.assertEqual(mock_task.args, {'name': '{{item}}'})
|
||||||
|
|
||||||
mock_task.action = 'yum'
|
mock_task.action = 'yum'
|
||||||
mock_task.args={'name': 'static'}
|
mock_task.args = {'name': 'static'}
|
||||||
new_items = te._squash_items(items=items, loop_var='item', variables=job_vars)
|
new_items = te._squash_items(items=items, loop_var='item', variables=job_vars)
|
||||||
self.assertEqual(new_items, ['a', 'b', 'c'])
|
self.assertEqual(new_items, ['a', 'b', 'c'])
|
||||||
self.assertEqual(mock_task.args, {'name': 'static'})
|
self.assertEqual(mock_task.args, {'name': 'static'})
|
||||||
|
|
||||||
mock_task.action = 'yum'
|
mock_task.action = 'yum'
|
||||||
mock_task.args={'name': '{{pkg_mgr}}'}
|
mock_task.args = {'name': '{{pkg_mgr}}'}
|
||||||
new_items = te._squash_items(items=items, loop_var='item', variables=job_vars)
|
new_items = te._squash_items(items=items, loop_var='item', variables=job_vars)
|
||||||
self.assertEqual(new_items, ['a', 'b', 'c'])
|
self.assertEqual(new_items, ['a', 'b', 'c'])
|
||||||
self.assertEqual(mock_task.args, {'name': '{{pkg_mgr}}'})
|
self.assertEqual(mock_task.args, {'name': '{{pkg_mgr}}'})
|
||||||
|
|
||||||
mock_task.action = '{{unknown}}'
|
mock_task.action = '{{unknown}}'
|
||||||
mock_task.args={'name': '{{item}}'}
|
mock_task.args = {'name': '{{item}}'}
|
||||||
new_items = te._squash_items(items=items, loop_var='item', variables=job_vars)
|
new_items = te._squash_items(items=items, loop_var='item', variables=job_vars)
|
||||||
self.assertEqual(new_items, ['a', 'b', 'c'])
|
self.assertEqual(new_items, ['a', 'b', 'c'])
|
||||||
self.assertEqual(mock_task.args, {'name': '{{item}}'})
|
self.assertEqual(mock_task.args, {'name': '{{item}}'})
|
||||||
|
|
||||||
# Could do something like this to recover from bad deps in a package
|
# Could do something like this to recover from bad deps in a package
|
||||||
job_vars = dict(pkg_mgr='yum', packages=['a', 'b'])
|
job_vars = dict(pkg_mgr='yum', packages=['a', 'b'])
|
||||||
items = [ 'absent', 'latest' ]
|
items = ['absent', 'latest']
|
||||||
mock_task.action = 'yum'
|
mock_task.action = 'yum'
|
||||||
mock_task.args = {'name': '{{ packages }}', 'state': '{{ item }}'}
|
mock_task.args = {'name': '{{ packages }}', 'state': '{{ item }}'}
|
||||||
new_items = te._squash_items(items=items, loop_var='item', variables=job_vars)
|
new_items = te._squash_items(items=items, loop_var='item', variables=job_vars)
|
||||||
|
@ -261,7 +259,7 @@ class TestTaskExecutor(unittest.TestCase):
|
||||||
# an error later. If so, we can throw it now instead.
|
# an error later. If so, we can throw it now instead.
|
||||||
# Squashing in this case would not be intuitive as the user is being
|
# Squashing in this case would not be intuitive as the user is being
|
||||||
# explicit in using each list entry as a key.
|
# explicit in using each list entry as a key.
|
||||||
job_vars = dict(pkg_mgr='yum', packages={ "a": "foo", "b": "bar", "foo": "baz", "bar": "quux" })
|
job_vars = dict(pkg_mgr='yum', packages={"a": "foo", "b": "bar", "foo": "baz", "bar": "quux"})
|
||||||
items = [['a', 'b'], ['foo', 'bar']]
|
items = [['a', 'b'], ['foo', 'bar']]
|
||||||
mock_task.action = 'yum'
|
mock_task.action = 'yum'
|
||||||
mock_task.args = {'name': '{{ packages[item] }}'}
|
mock_task.args = {'name': '{{ packages[item] }}'}
|
||||||
|
@ -269,21 +267,19 @@ class TestTaskExecutor(unittest.TestCase):
|
||||||
self.assertEqual(new_items, items)
|
self.assertEqual(new_items, items)
|
||||||
self.assertEqual(mock_task.args, {'name': '{{ packages[item] }}'})
|
self.assertEqual(mock_task.args, {'name': '{{ packages[item] }}'})
|
||||||
|
|
||||||
#
|
|
||||||
# Replaces
|
# Replaces
|
||||||
#
|
|
||||||
items = ['a', 'b', 'c']
|
items = ['a', 'b', 'c']
|
||||||
mock_task.action = 'yum'
|
mock_task.action = 'yum'
|
||||||
mock_task.args={'name': '{{item}}'}
|
mock_task.args = {'name': '{{item}}'}
|
||||||
new_items = te._squash_items(items=items, loop_var='item', variables=job_vars)
|
|
||||||
self.assertEqual(new_items, [['a','c']])
|
|
||||||
self.assertEqual(mock_task.args, {'name': ['a','c']})
|
|
||||||
|
|
||||||
mock_task.action = '{{pkg_mgr}}'
|
|
||||||
mock_task.args={'name': '{{item}}'}
|
|
||||||
new_items = te._squash_items(items=items, loop_var='item', variables=job_vars)
|
new_items = te._squash_items(items=items, loop_var='item', variables=job_vars)
|
||||||
self.assertEqual(new_items, [['a', 'c']])
|
self.assertEqual(new_items, [['a', 'c']])
|
||||||
self.assertEqual(mock_task.args, {'name': ['a','c']})
|
self.assertEqual(mock_task.args, {'name': ['a', 'c']})
|
||||||
|
|
||||||
|
mock_task.action = '{{pkg_mgr}}'
|
||||||
|
mock_task.args = {'name': '{{item}}'}
|
||||||
|
new_items = te._squash_items(items=items, loop_var='item', variables=job_vars)
|
||||||
|
self.assertEqual(new_items, [['a', 'c']])
|
||||||
|
self.assertEqual(mock_task.args, {'name': ['a', 'c']})
|
||||||
|
|
||||||
# New loop_var
|
# New loop_var
|
||||||
mock_task.action = 'yum'
|
mock_task.action = 'yum'
|
||||||
|
@ -292,7 +288,7 @@ class TestTaskExecutor(unittest.TestCase):
|
||||||
loop_var = 'a_loop_var_item'
|
loop_var = 'a_loop_var_item'
|
||||||
new_items = te._squash_items(items=items, loop_var='a_loop_var_item', variables=job_vars)
|
new_items = te._squash_items(items=items, loop_var='a_loop_var_item', variables=job_vars)
|
||||||
self.assertEqual(new_items, [['a', 'c']])
|
self.assertEqual(new_items, [['a', 'c']])
|
||||||
self.assertEqual(mock_task.args, {'name': ['a','c']})
|
self.assertEqual(mock_task.args, {'name': ['a', 'c']})
|
||||||
loop_var = 'item'
|
loop_var = 'item'
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -307,8 +303,8 @@ class TestTaskExecutor(unittest.TestCase):
|
||||||
mock_task.action = 'yum'
|
mock_task.action = 'yum'
|
||||||
mock_task.args = {'name': '{{ item }}'}
|
mock_task.args = {'name': '{{ item }}'}
|
||||||
new_items = te._squash_items(items=items, loop_var='item', variables=job_vars)
|
new_items = te._squash_items(items=items, loop_var='item', variables=job_vars)
|
||||||
#self.assertEqual(new_items, [['a', 'b', 'foo', 'bar']])
|
# self.assertEqual(new_items, [['a', 'b', 'foo', 'bar']])
|
||||||
#self.assertEqual(mock_task.args, {'name': ['a', 'b', 'foo', 'bar']})
|
# self.assertEqual(mock_task.args, {'name': ['a', 'b', 'foo', 'bar']})
|
||||||
self.assertEqual(new_items, items)
|
self.assertEqual(new_items, items)
|
||||||
self.assertEqual(mock_task.args, {'name': '{{ item }}'})
|
self.assertEqual(mock_task.args, {'name': '{{ item }}'})
|
||||||
|
|
||||||
|
@ -317,8 +313,8 @@ class TestTaskExecutor(unittest.TestCase):
|
||||||
mock_task.action = 'yum'
|
mock_task.action = 'yum'
|
||||||
mock_task.args = {'name': '{{ packages[item] }}'}
|
mock_task.args = {'name': '{{ packages[item] }}'}
|
||||||
new_items = te._squash_items(items=items, loop_var='item', variables=job_vars)
|
new_items = te._squash_items(items=items, loop_var='item', variables=job_vars)
|
||||||
#self.assertEqual(new_items, [['foo', 'baz']])
|
# self.assertEqual(new_items, [['foo', 'baz']])
|
||||||
#self.assertEqual(mock_task.args, {'name': ['foo', 'baz']})
|
# self.assertEqual(mock_task.args, {'name': ['foo', 'baz']})
|
||||||
self.assertEqual(new_items, items)
|
self.assertEqual(new_items, items)
|
||||||
self.assertEqual(mock_task.args, {'name': '{{ packages[item] }}'})
|
self.assertEqual(mock_task.args, {'name': '{{ packages[item] }}'})
|
||||||
|
|
||||||
|
@ -328,35 +324,38 @@ class TestTaskExecutor(unittest.TestCase):
|
||||||
mock_task.action = 'yum'
|
mock_task.action = 'yum'
|
||||||
mock_task.args = {'name': '{{ item["package"] }}'}
|
mock_task.args = {'name': '{{ item["package"] }}'}
|
||||||
new_items = te._squash_items(items=items, loop_var='item', variables=job_vars)
|
new_items = te._squash_items(items=items, loop_var='item', variables=job_vars)
|
||||||
#self.assertEqual(new_items, [['foo', 'bar']])
|
# self.assertEqual(new_items, [['foo', 'bar']])
|
||||||
#self.assertEqual(mock_task.args, {'name': ['foo', 'bar']})
|
# self.assertEqual(mock_task.args, {'name': ['foo', 'bar']})
|
||||||
self.assertEqual(new_items, items)
|
self.assertEqual(new_items, items)
|
||||||
self.assertEqual(mock_task.args, {'name': '{{ item["package"] }}'})
|
self.assertEqual(mock_task.args, {'name': '{{ item["package"] }}'})
|
||||||
|
|
||||||
items = [dict(name='a', state='present'),
|
items = [
|
||||||
dict(name='b', state='present'),
|
dict(name='a', state='present'),
|
||||||
dict(name='c', state='present')]
|
dict(name='b', state='present'),
|
||||||
|
dict(name='c', state='present'),
|
||||||
|
]
|
||||||
mock_task.action = 'yum'
|
mock_task.action = 'yum'
|
||||||
mock_task.args={'name': '{{item.name}}', 'state': '{{item.state}}'}
|
mock_task.args = {'name': '{{item.name}}', 'state': '{{item.state}}'}
|
||||||
new_items = te._squash_items(items=items, loop_var='item', variables=job_vars)
|
new_items = te._squash_items(items=items, loop_var='item', variables=job_vars)
|
||||||
#self.assertEqual(new_items, [dict(name=['a', 'b', 'c'], state='present')])
|
# self.assertEqual(new_items, [dict(name=['a', 'b', 'c'], state='present')])
|
||||||
#self.assertEqual(mock_task.args, {'name': ['a', 'b', 'c'], 'state': 'present'})
|
# self.assertEqual(mock_task.args, {'name': ['a', 'b', 'c'], 'state': 'present'})
|
||||||
self.assertEqual(new_items, items)
|
self.assertEqual(new_items, items)
|
||||||
self.assertEqual(mock_task.args, {'name': '{{item.name}}', 'state': '{{item.state}}'})
|
self.assertEqual(mock_task.args, {'name': '{{item.name}}', 'state': '{{item.state}}'})
|
||||||
|
|
||||||
items = [dict(name='a', state='present'),
|
items = [
|
||||||
dict(name='b', state='present'),
|
dict(name='a', state='present'),
|
||||||
dict(name='c', state='absent')]
|
dict(name='b', state='present'),
|
||||||
|
dict(name='c', state='absent'),
|
||||||
|
]
|
||||||
mock_task.action = 'yum'
|
mock_task.action = 'yum'
|
||||||
mock_task.args={'name': '{{item.name}}', 'state': '{{item.state}}'}
|
mock_task.args = {'name': '{{item.name}}', 'state': '{{item.state}}'}
|
||||||
new_items = te._squash_items(items=items, loop_var='item', variables=job_vars)
|
new_items = te._squash_items(items=items, loop_var='item', variables=job_vars)
|
||||||
#self.assertEqual(new_items, [dict(name=['a', 'b'], state='present'),
|
# self.assertEqual(new_items, [dict(name=['a', 'b'], state='present'),
|
||||||
# dict(name='c', state='absent')])
|
# dict(name='c', state='absent')])
|
||||||
#self.assertEqual(mock_task.args, {'name': '{{item.name}}', 'state': '{{item.state}}'})
|
# self.assertEqual(mock_task.args, {'name': '{{item.name}}', 'state': '{{item.state}}'})
|
||||||
self.assertEqual(new_items, items)
|
self.assertEqual(new_items, items)
|
||||||
self.assertEqual(mock_task.args, {'name': '{{item.name}}', 'state': '{{item.state}}'})
|
self.assertEqual(mock_task.args, {'name': '{{item.name}}', 'state': '{{item.state}}'})
|
||||||
|
|
||||||
|
|
||||||
def test_task_executor_execute(self):
|
def test_task_executor_execute(self):
|
||||||
fake_loader = DictDataLoader({})
|
fake_loader = DictDataLoader({})
|
||||||
|
|
||||||
|
@ -394,14 +393,14 @@ class TestTaskExecutor(unittest.TestCase):
|
||||||
job_vars = dict(omit="XXXXXXXXXXXXXXXXXXX")
|
job_vars = dict(omit="XXXXXXXXXXXXXXXXXXX")
|
||||||
|
|
||||||
te = TaskExecutor(
|
te = TaskExecutor(
|
||||||
host = mock_host,
|
host=mock_host,
|
||||||
task = mock_task,
|
task=mock_task,
|
||||||
job_vars = job_vars,
|
job_vars=job_vars,
|
||||||
play_context = mock_play_context,
|
play_context=mock_play_context,
|
||||||
new_stdin = new_stdin,
|
new_stdin=new_stdin,
|
||||||
loader = fake_loader,
|
loader=fake_loader,
|
||||||
shared_loader_obj = shared_loader,
|
shared_loader_obj=shared_loader,
|
||||||
rslt_q = mock_queue,
|
rslt_q=mock_queue,
|
||||||
)
|
)
|
||||||
|
|
||||||
te._get_connection = MagicMock(return_value=mock_connection)
|
te._get_connection = MagicMock(return_value=mock_connection)
|
||||||
|
@ -433,7 +432,7 @@ class TestTaskExecutor(unittest.TestCase):
|
||||||
|
|
||||||
mock_task = MagicMock()
|
mock_task = MagicMock()
|
||||||
mock_task.async = 0.1
|
mock_task.async = 0.1
|
||||||
mock_task.poll = 0.05
|
mock_task.poll = 0.05
|
||||||
|
|
||||||
mock_play_context = MagicMock()
|
mock_play_context = MagicMock()
|
||||||
|
|
||||||
|
@ -449,14 +448,14 @@ class TestTaskExecutor(unittest.TestCase):
|
||||||
job_vars = dict(omit="XXXXXXXXXXXXXXXXXXX")
|
job_vars = dict(omit="XXXXXXXXXXXXXXXXXXX")
|
||||||
|
|
||||||
te = TaskExecutor(
|
te = TaskExecutor(
|
||||||
host = mock_host,
|
host=mock_host,
|
||||||
task = mock_task,
|
task=mock_task,
|
||||||
job_vars = job_vars,
|
job_vars=job_vars,
|
||||||
play_context = mock_play_context,
|
play_context=mock_play_context,
|
||||||
new_stdin = new_stdin,
|
new_stdin=new_stdin,
|
||||||
loader = fake_loader,
|
loader=fake_loader,
|
||||||
shared_loader_obj = shared_loader,
|
shared_loader_obj=shared_loader,
|
||||||
rslt_q = mock_queue,
|
rslt_q=mock_queue,
|
||||||
)
|
)
|
||||||
|
|
||||||
te._connection = MagicMock()
|
te._connection = MagicMock()
|
||||||
|
@ -485,4 +484,3 @@ class TestTaskExecutor(unittest.TestCase):
|
||||||
mock_templar = MagicMock()
|
mock_templar = MagicMock()
|
||||||
res = te._poll_async_result(result=dict(ansible_job_id=1), templar=mock_templar)
|
res = te._poll_async_result(result=dict(ansible_job_id=1), templar=mock_templar)
|
||||||
self.assertEqual(res, dict(finished=1))
|
self.assertEqual(res, dict(finished=1))
|
||||||
|
|
||||||
|
|
|
@ -24,6 +24,7 @@ from ansible.compat.tests.mock import patch, MagicMock
|
||||||
|
|
||||||
from ansible.executor.task_result import TaskResult
|
from ansible.executor.task_result import TaskResult
|
||||||
|
|
||||||
|
|
||||||
class TestTaskResult(unittest.TestCase):
|
class TestTaskResult(unittest.TestCase):
|
||||||
def test_task_result_basic(self):
|
def test_task_result_basic(self):
|
||||||
mock_host = MagicMock()
|
mock_host = MagicMock()
|
||||||
|
|
|
@ -29,6 +29,7 @@ from ansible.vars.manager import VariableManager
|
||||||
|
|
||||||
from units.mock.loader import DictDataLoader
|
from units.mock.loader import DictDataLoader
|
||||||
|
|
||||||
|
|
||||||
class TestInventory(unittest.TestCase):
|
class TestInventory(unittest.TestCase):
|
||||||
|
|
||||||
patterns = {
|
patterns = {
|
||||||
|
@ -38,7 +39,7 @@ class TestInventory(unittest.TestCase):
|
||||||
' a,b ,c[1:2] ': ['a', 'b', 'c[1:2]'],
|
' a,b ,c[1:2] ': ['a', 'b', 'c[1:2]'],
|
||||||
'9a01:7f8:191:7701::9': ['9a01:7f8:191:7701::9'],
|
'9a01:7f8:191:7701::9': ['9a01:7f8:191:7701::9'],
|
||||||
'9a01:7f8:191:7701::9,9a01:7f8:191:7701::9': ['9a01:7f8:191:7701::9', '9a01:7f8:191:7701::9'],
|
'9a01:7f8:191:7701::9,9a01:7f8:191:7701::9': ['9a01:7f8:191:7701::9', '9a01:7f8:191:7701::9'],
|
||||||
'9a01:7f8:191:7701::9,9a01:7f8:191:7701::9,foo': ['9a01:7f8:191:7701::9', '9a01:7f8:191:7701::9','foo'],
|
'9a01:7f8:191:7701::9,9a01:7f8:191:7701::9,foo': ['9a01:7f8:191:7701::9', '9a01:7f8:191:7701::9', 'foo'],
|
||||||
'foo[1:2]': ['foo[1:2]'],
|
'foo[1:2]': ['foo[1:2]'],
|
||||||
'a::b': ['a::b'],
|
'a::b': ['a::b'],
|
||||||
'a:b': ['a', 'b'],
|
'a:b': ['a', 'b'],
|
||||||
|
@ -51,7 +52,7 @@ class TestInventory(unittest.TestCase):
|
||||||
[['a', 'b'], ['a', 'b']],
|
[['a', 'b'], ['a', 'b']],
|
||||||
[['a, b'], ['a', 'b']],
|
[['a, b'], ['a', 'b']],
|
||||||
[['9a01:7f8:191:7701::9', '9a01:7f8:191:7701::9,foo'],
|
[['9a01:7f8:191:7701::9', '9a01:7f8:191:7701::9,foo'],
|
||||||
['9a01:7f8:191:7701::9', '9a01:7f8:191:7701::9','foo']]
|
['9a01:7f8:191:7701::9', '9a01:7f8:191:7701::9', 'foo']]
|
||||||
]
|
]
|
||||||
|
|
||||||
# pattern_string: [ ('base_pattern', (a,b)), ['x','y','z'] ]
|
# pattern_string: [ ('base_pattern', (a,b)), ['x','y','z'] ]
|
||||||
|
@ -59,7 +60,7 @@ class TestInventory(unittest.TestCase):
|
||||||
# when applied to string.ascii_letters.
|
# when applied to string.ascii_letters.
|
||||||
|
|
||||||
subscripts = {
|
subscripts = {
|
||||||
'a': [('a',None), list(string.ascii_letters)],
|
'a': [('a', None), list(string.ascii_letters)],
|
||||||
'a[0]': [('a', (0, None)), ['a']],
|
'a[0]': [('a', (0, None)), ['a']],
|
||||||
'a[1]': [('a', (1, None)), ['b']],
|
'a[1]': [('a', (1, None)), ['b']],
|
||||||
'a[2:3]': [('a', (2, 3)), ['c', 'd']],
|
'a[2:3]': [('a', (2, 3)), ['c', 'd']],
|
||||||
|
@ -143,9 +144,9 @@ class InventoryDefaultGroup(unittest.TestCase):
|
||||||
|
|
||||||
def _get_inventory(self, inventory_content):
|
def _get_inventory(self, inventory_content):
|
||||||
|
|
||||||
fake_loader = DictDataLoader({ __file__: inventory_content})
|
fake_loader = DictDataLoader({__file__: inventory_content})
|
||||||
|
|
||||||
return InventoryManager(loader=fake_loader, sources=[__file__])
|
return InventoryManager(loader=fake_loader, sources=[__file__])
|
||||||
|
|
||||||
def _test_default_groups(self, inventory_content):
|
def _test_default_groups(self, inventory_content):
|
||||||
inventory = self._get_inventory(inventory_content)
|
inventory = self._get_inventory(inventory_content)
|
||||||
|
|
|
@ -21,6 +21,7 @@ __metaclass__ = type
|
||||||
|
|
||||||
from collections import Mapping
|
from collections import Mapping
|
||||||
|
|
||||||
|
|
||||||
def make_method(func, args, kwargs):
|
def make_method(func, args, kwargs):
|
||||||
|
|
||||||
def test_method(self):
|
def test_method(self):
|
||||||
|
|
|
@ -70,7 +70,7 @@ class DictDataLoader(DataLoader):
|
||||||
self._known_directories.append(directory)
|
self._known_directories.append(directory)
|
||||||
|
|
||||||
def _build_known_directories(self):
|
def _build_known_directories(self):
|
||||||
self._known_directories = []
|
self._known_directories = []
|
||||||
for path in self._file_mapping:
|
for path in self._file_mapping:
|
||||||
dirname = os.path.dirname(path)
|
dirname = os.path.dirname(path)
|
||||||
while dirname not in ('/', ''):
|
while dirname not in ('/', ''):
|
||||||
|
|
|
@ -20,8 +20,8 @@
|
||||||
from __future__ import (absolute_import, division)
|
from __future__ import (absolute_import, division)
|
||||||
__metaclass__ = type
|
__metaclass__ = type
|
||||||
|
|
||||||
import sys
|
|
||||||
import json
|
import json
|
||||||
|
import sys
|
||||||
|
|
||||||
from units.mock.procenv import swap_stdin_and_argv
|
from units.mock.procenv import swap_stdin_and_argv
|
||||||
|
|
||||||
|
@ -31,23 +31,21 @@ from ansible.compat.tests.mock import MagicMock
|
||||||
|
|
||||||
class TestModuleUtilsBasic(unittest.TestCase):
|
class TestModuleUtilsBasic(unittest.TestCase):
|
||||||
def test_module_utils_basic__log_invocation(self):
|
def test_module_utils_basic__log_invocation(self):
|
||||||
with swap_stdin_and_argv(stdin_data=json.dumps(
|
with swap_stdin_and_argv(stdin_data=json.dumps(dict(
|
||||||
dict(
|
ANSIBLE_MODULE_ARGS=dict(foo=False, bar=[1, 2, 3], bam="bam", baz=u'baz')),
|
||||||
ANSIBLE_MODULE_ARGS=dict(
|
)):
|
||||||
foo=False, bar=[1,2,3], bam="bam", baz=u'baz'),
|
|
||||||
))):
|
|
||||||
from ansible.module_utils import basic
|
from ansible.module_utils import basic
|
||||||
|
|
||||||
# test basic log invocation
|
# test basic log invocation
|
||||||
basic._ANSIBLE_ARGS = None
|
basic._ANSIBLE_ARGS = None
|
||||||
am = basic.AnsibleModule(
|
am = basic.AnsibleModule(
|
||||||
argument_spec=dict(
|
argument_spec=dict(
|
||||||
foo = dict(default=True, type='bool'),
|
foo=dict(default=True, type='bool'),
|
||||||
bar = dict(default=[], type='list'),
|
bar=dict(default=[], type='list'),
|
||||||
bam = dict(default="bam"),
|
bam=dict(default="bam"),
|
||||||
baz = dict(default=u"baz"),
|
baz=dict(default=u"baz"),
|
||||||
password = dict(default=True),
|
password=dict(default=True),
|
||||||
no_log = dict(default="you shouldn't see me", no_log=True),
|
no_log=dict(default="you shouldn't see me", no_log=True),
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -73,13 +71,14 @@ class TestModuleUtilsBasic(unittest.TestCase):
|
||||||
self.assertIn(' password=NOT_LOGGING_PASSWORD', message)
|
self.assertIn(' password=NOT_LOGGING_PASSWORD', message)
|
||||||
|
|
||||||
kwargs = am.log.call_args[1]
|
kwargs = am.log.call_args[1]
|
||||||
self.assertEqual(kwargs,
|
self.assertEqual(
|
||||||
dict(log_args={
|
kwargs,
|
||||||
'foo': 'False',
|
dict(log_args={
|
||||||
'bar': '[1, 2, 3]',
|
'foo': 'False',
|
||||||
'bam': 'bam',
|
'bar': '[1, 2, 3]',
|
||||||
'baz': 'baz',
|
'bam': 'bam',
|
||||||
'password': 'NOT_LOGGING_PASSWORD',
|
'baz': 'baz',
|
||||||
'no_log': 'NOT_LOGGING_PARAMETER',
|
'password': 'NOT_LOGGING_PASSWORD',
|
||||||
})
|
'no_log': 'NOT_LOGGING_PARAMETER',
|
||||||
)
|
})
|
||||||
|
)
|
||||||
|
|
|
@ -34,7 +34,7 @@ class TestAnsibleModuleWarnDeprecate(unittest.TestCase):
|
||||||
|
|
||||||
ansible.module_utils.basic._ANSIBLE_ARGS = None
|
ansible.module_utils.basic._ANSIBLE_ARGS = None
|
||||||
am = ansible.module_utils.basic.AnsibleModule(
|
am = ansible.module_utils.basic.AnsibleModule(
|
||||||
argument_spec = dict(),
|
argument_spec=dict(),
|
||||||
)
|
)
|
||||||
am._name = 'unittest'
|
am._name = 'unittest'
|
||||||
|
|
||||||
|
@ -51,7 +51,7 @@ class TestAnsibleModuleWarnDeprecate(unittest.TestCase):
|
||||||
|
|
||||||
ansible.module_utils.basic._ANSIBLE_ARGS = None
|
ansible.module_utils.basic._ANSIBLE_ARGS = None
|
||||||
am = ansible.module_utils.basic.AnsibleModule(
|
am = ansible.module_utils.basic.AnsibleModule(
|
||||||
argument_spec = dict(),
|
argument_spec=dict(),
|
||||||
)
|
)
|
||||||
am._name = 'unittest'
|
am._name = 'unittest'
|
||||||
|
|
||||||
|
@ -76,7 +76,7 @@ class TestAnsibleModuleWarnDeprecate(unittest.TestCase):
|
||||||
|
|
||||||
ansible.module_utils.basic._ANSIBLE_ARGS = None
|
ansible.module_utils.basic._ANSIBLE_ARGS = None
|
||||||
am = ansible.module_utils.basic.AnsibleModule(
|
am = ansible.module_utils.basic.AnsibleModule(
|
||||||
argument_spec = dict(),
|
argument_spec=dict(),
|
||||||
)
|
)
|
||||||
am._name = 'unittest'
|
am._name = 'unittest'
|
||||||
|
|
||||||
|
|
|
@ -25,13 +25,13 @@ import json
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
from ansible.compat.tests import unittest
|
from ansible.compat.tests import unittest
|
||||||
from units.mock.procenv import swap_stdin_and_argv, swap_stdout
|
|
||||||
|
|
||||||
from ansible.module_utils import basic
|
from ansible.module_utils import basic
|
||||||
|
from units.mock.procenv import swap_stdin_and_argv, swap_stdout
|
||||||
|
|
||||||
|
|
||||||
empty_invocation = {u'module_args': {}}
|
empty_invocation = {u'module_args': {}}
|
||||||
|
|
||||||
|
|
||||||
class TestAnsibleModuleExitJson(unittest.TestCase):
|
class TestAnsibleModuleExitJson(unittest.TestCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
args = json.dumps(dict(ANSIBLE_MODULE_ARGS={}))
|
args = json.dumps(dict(ANSIBLE_MODULE_ARGS={}))
|
||||||
|
@ -89,31 +89,35 @@ class TestAnsibleModuleExitJson(unittest.TestCase):
|
||||||
return_val = json.loads(self.fake_stream.getvalue())
|
return_val = json.loads(self.fake_stream.getvalue())
|
||||||
self.assertEquals(return_val, dict(changed=True, msg='success', invocation=empty_invocation))
|
self.assertEquals(return_val, dict(changed=True, msg='success', invocation=empty_invocation))
|
||||||
|
|
||||||
|
|
||||||
class TestAnsibleModuleExitValuesRemoved(unittest.TestCase):
|
class TestAnsibleModuleExitValuesRemoved(unittest.TestCase):
|
||||||
OMIT = 'VALUE_SPECIFIED_IN_NO_LOG_PARAMETER'
|
OMIT = 'VALUE_SPECIFIED_IN_NO_LOG_PARAMETER'
|
||||||
dataset = (
|
dataset = (
|
||||||
(dict(username='person', password='$ecret k3y'),
|
(
|
||||||
dict(one=1, pwd='$ecret k3y', url='https://username:password12345@foo.com/login/',
|
dict(username='person', password='$ecret k3y'),
|
||||||
not_secret='following the leader', msg='here'),
|
dict(one=1, pwd='$ecret k3y', url='https://username:password12345@foo.com/login/',
|
||||||
dict(one=1, pwd=OMIT, url='https://username:password12345@foo.com/login/',
|
not_secret='following the leader', msg='here'),
|
||||||
not_secret='following the leader', changed=False, msg='here',
|
dict(one=1, pwd=OMIT, url='https://username:password12345@foo.com/login/',
|
||||||
invocation=dict(module_args=dict(password=OMIT, token=None, username='person'))),
|
not_secret='following the leader', changed=False, msg='here',
|
||||||
),
|
invocation=dict(module_args=dict(password=OMIT, token=None, username='person'))),
|
||||||
(dict(username='person', password='password12345'),
|
),
|
||||||
dict(one=1, pwd='$ecret k3y', url='https://username:password12345@foo.com/login/',
|
(
|
||||||
not_secret='following the leader', msg='here'),
|
dict(username='person', password='password12345'),
|
||||||
dict(one=1, pwd='$ecret k3y', url='https://username:********@foo.com/login/',
|
dict(one=1, pwd='$ecret k3y', url='https://username:password12345@foo.com/login/',
|
||||||
not_secret='following the leader', changed=False, msg='here',
|
not_secret='following the leader', msg='here'),
|
||||||
invocation=dict(module_args=dict(password=OMIT, token=None, username='person'))),
|
dict(one=1, pwd='$ecret k3y', url='https://username:********@foo.com/login/',
|
||||||
),
|
not_secret='following the leader', changed=False, msg='here',
|
||||||
(dict(username='person', password='$ecret k3y'),
|
invocation=dict(module_args=dict(password=OMIT, token=None, username='person'))),
|
||||||
dict(one=1, pwd='$ecret k3y', url='https://username:$ecret k3y@foo.com/login/',
|
),
|
||||||
not_secret='following the leader', msg='here'),
|
(
|
||||||
dict(one=1, pwd=OMIT, url='https://username:********@foo.com/login/',
|
dict(username='person', password='$ecret k3y'),
|
||||||
not_secret='following the leader', changed=False, msg='here',
|
dict(one=1, pwd='$ecret k3y', url='https://username:$ecret k3y@foo.com/login/',
|
||||||
invocation=dict(module_args=dict(password=OMIT, token=None, username='person'))),
|
not_secret='following the leader', msg='here'),
|
||||||
),
|
dict(one=1, pwd=OMIT, url='https://username:********@foo.com/login/',
|
||||||
)
|
not_secret='following the leader', changed=False, msg='here',
|
||||||
|
invocation=dict(module_args=dict(password=OMIT, token=None, username='person'))),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
def test_exit_json_removes_values(self):
|
def test_exit_json_removes_values(self):
|
||||||
self.maxDiff = None
|
self.maxDiff = None
|
||||||
|
@ -125,12 +129,12 @@ class TestAnsibleModuleExitValuesRemoved(unittest.TestCase):
|
||||||
with swap_stdout():
|
with swap_stdout():
|
||||||
basic._ANSIBLE_ARGS = None
|
basic._ANSIBLE_ARGS = None
|
||||||
module = basic.AnsibleModule(
|
module = basic.AnsibleModule(
|
||||||
argument_spec = dict(
|
argument_spec=dict(
|
||||||
username=dict(),
|
username=dict(),
|
||||||
password=dict(no_log=True),
|
password=dict(no_log=True),
|
||||||
token=dict(no_log=True),
|
token=dict(no_log=True),
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
with self.assertRaises(SystemExit) as ctx:
|
with self.assertRaises(SystemExit) as ctx:
|
||||||
self.assertEquals(module.exit_json(**return_val), expected)
|
self.assertEquals(module.exit_json(**return_val), expected)
|
||||||
self.assertEquals(json.loads(sys.stdout.getvalue()), expected)
|
self.assertEquals(json.loads(sys.stdout.getvalue()), expected)
|
||||||
|
@ -147,12 +151,12 @@ class TestAnsibleModuleExitValuesRemoved(unittest.TestCase):
|
||||||
with swap_stdout():
|
with swap_stdout():
|
||||||
basic._ANSIBLE_ARGS = None
|
basic._ANSIBLE_ARGS = None
|
||||||
module = basic.AnsibleModule(
|
module = basic.AnsibleModule(
|
||||||
argument_spec = dict(
|
argument_spec=dict(
|
||||||
username=dict(),
|
username=dict(),
|
||||||
password=dict(no_log=True),
|
password=dict(no_log=True),
|
||||||
token=dict(no_log=True),
|
token=dict(no_log=True),
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
with self.assertRaises(SystemExit) as ctx:
|
with self.assertRaises(SystemExit) as ctx:
|
||||||
self.assertEquals(module.fail_json(**return_val), expected)
|
self.assertEquals(module.fail_json(**return_val), expected)
|
||||||
self.assertEquals(json.loads(sys.stdout.getvalue()), expected)
|
self.assertEquals(json.loads(sys.stdout.getvalue()), expected)
|
||||||
|
|
|
@ -25,9 +25,9 @@ import syslog
|
||||||
|
|
||||||
from ansible.compat.tests import unittest
|
from ansible.compat.tests import unittest
|
||||||
from ansible.compat.tests.mock import patch, MagicMock
|
from ansible.compat.tests.mock import patch, MagicMock
|
||||||
|
|
||||||
from ansible.module_utils.basic import heuristic_log_sanitize
|
from ansible.module_utils.basic import heuristic_log_sanitize
|
||||||
|
|
||||||
|
|
||||||
class TestHeuristicLogSanitize(unittest.TestCase):
|
class TestHeuristicLogSanitize(unittest.TestCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
self.URL_SECRET = 'http://username:pas:word@foo.com/data'
|
self.URL_SECRET = 'http://username:pas:word@foo.com/data'
|
||||||
|
@ -39,13 +39,16 @@ class TestHeuristicLogSanitize(unittest.TestCase):
|
||||||
def _gen_data(self, records, per_rec, top_level, secret_text):
|
def _gen_data(self, records, per_rec, top_level, secret_text):
|
||||||
hostvars = {'hostvars': {}}
|
hostvars = {'hostvars': {}}
|
||||||
for i in range(1, records, 1):
|
for i in range(1, records, 1):
|
||||||
host_facts = {'host%s' % i:
|
host_facts = {
|
||||||
{'pstack':
|
'host%s' % i: {
|
||||||
{'running': '875.1',
|
'pstack': {
|
||||||
'symlinked': '880.0',
|
'running': '875.1',
|
||||||
'tars': [],
|
'symlinked': '880.0',
|
||||||
'versions': ['885.0']},
|
'tars': [],
|
||||||
}}
|
'versions': ['885.0']
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
if per_rec:
|
if per_rec:
|
||||||
host_facts['host%s' % i]['secret'] = secret_text
|
host_facts['host%s' % i]['secret'] = secret_text
|
||||||
hostvars['hostvars'].update(host_facts)
|
hostvars['hostvars'].update(host_facts)
|
||||||
|
|
|
@ -51,7 +51,7 @@ class TestAnsibleModuleSysLogSmokeTest(unittest.TestCase):
|
||||||
|
|
||||||
ansible.module_utils.basic._ANSIBLE_ARGS = None
|
ansible.module_utils.basic._ANSIBLE_ARGS = None
|
||||||
self.am = ansible.module_utils.basic.AnsibleModule(
|
self.am = ansible.module_utils.basic.AnsibleModule(
|
||||||
argument_spec = dict(),
|
argument_spec=dict(),
|
||||||
)
|
)
|
||||||
self.am._name = 'unittest'
|
self.am._name = 'unittest'
|
||||||
|
|
||||||
|
@ -89,7 +89,7 @@ class TestAnsibleModuleJournaldSmokeTest(unittest.TestCase):
|
||||||
|
|
||||||
ansible.module_utils.basic._ANSIBLE_ARGS = None
|
ansible.module_utils.basic._ANSIBLE_ARGS = None
|
||||||
self.am = ansible.module_utils.basic.AnsibleModule(
|
self.am = ansible.module_utils.basic.AnsibleModule(
|
||||||
argument_spec = dict(),
|
argument_spec=dict(),
|
||||||
)
|
)
|
||||||
self.am._name = 'unittest'
|
self.am._name = 'unittest'
|
||||||
|
|
||||||
|
@ -120,7 +120,7 @@ class TestAnsibleModuleLogSyslog(unittest.TestCase):
|
||||||
b'Byte string': b'Byte string',
|
b'Byte string': b'Byte string',
|
||||||
u'Toshio くらとみ non-ascii test'.encode('utf-8'): u'Toshio くらとみ non-ascii test'.encode('utf-8'),
|
u'Toshio くらとみ non-ascii test'.encode('utf-8'): u'Toshio くらとみ non-ascii test'.encode('utf-8'),
|
||||||
b'non-utf8 :\xff: test': b'non-utf8 :\xff: test'.decode('utf-8', 'replace').encode('utf-8'),
|
b'non-utf8 :\xff: test': b'non-utf8 :\xff: test'.decode('utf-8', 'replace').encode('utf-8'),
|
||||||
}
|
}
|
||||||
|
|
||||||
py3_output_data = {
|
py3_output_data = {
|
||||||
u'Text string': u'Text string',
|
u'Text string': u'Text string',
|
||||||
|
@ -128,7 +128,7 @@ class TestAnsibleModuleLogSyslog(unittest.TestCase):
|
||||||
b'Byte string': u'Byte string',
|
b'Byte string': u'Byte string',
|
||||||
u'Toshio くらとみ non-ascii test'.encode('utf-8'): u'Toshio くらとみ non-ascii test',
|
u'Toshio くらとみ non-ascii test'.encode('utf-8'): u'Toshio くらとみ non-ascii test',
|
||||||
b'non-utf8 :\xff: test': b'non-utf8 :\xff: test'.decode('utf-8', 'replace')
|
b'non-utf8 :\xff: test': b'non-utf8 :\xff: test'.decode('utf-8', 'replace')
|
||||||
}
|
}
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
args = json.dumps(dict(ANSIBLE_MODULE_ARGS={}))
|
args = json.dumps(dict(ANSIBLE_MODULE_ARGS={}))
|
||||||
|
@ -138,7 +138,7 @@ class TestAnsibleModuleLogSyslog(unittest.TestCase):
|
||||||
|
|
||||||
ansible.module_utils.basic._ANSIBLE_ARGS = None
|
ansible.module_utils.basic._ANSIBLE_ARGS = None
|
||||||
self.am = ansible.module_utils.basic.AnsibleModule(
|
self.am = ansible.module_utils.basic.AnsibleModule(
|
||||||
argument_spec = dict(),
|
argument_spec=dict(),
|
||||||
)
|
)
|
||||||
self.am._name = 'unittest'
|
self.am._name = 'unittest'
|
||||||
|
|
||||||
|
@ -189,7 +189,7 @@ class TestAnsibleModuleLogJournal(unittest.TestCase):
|
||||||
b'Byte string': u'Byte string',
|
b'Byte string': u'Byte string',
|
||||||
u'Toshio くらとみ non-ascii test'.encode('utf-8'): u'Toshio くらとみ non-ascii test',
|
u'Toshio くらとみ non-ascii test'.encode('utf-8'): u'Toshio くらとみ non-ascii test',
|
||||||
b'non-utf8 :\xff: test': b'non-utf8 :\xff: test'.decode('utf-8', 'replace')
|
b'non-utf8 :\xff: test': b'non-utf8 :\xff: test'.decode('utf-8', 'replace')
|
||||||
}
|
}
|
||||||
|
|
||||||
# overriding run lets us use context managers for setup/teardown-esque behavior
|
# overriding run lets us use context managers for setup/teardown-esque behavior
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
|
@ -200,7 +200,7 @@ class TestAnsibleModuleLogJournal(unittest.TestCase):
|
||||||
|
|
||||||
ansible.module_utils.basic._ANSIBLE_ARGS = None
|
ansible.module_utils.basic._ANSIBLE_ARGS = None
|
||||||
self.am = ansible.module_utils.basic.AnsibleModule(
|
self.am = ansible.module_utils.basic.AnsibleModule(
|
||||||
argument_spec = dict(),
|
argument_spec=dict(),
|
||||||
)
|
)
|
||||||
self.am._name = 'unittest'
|
self.am._name = 'unittest'
|
||||||
|
|
||||||
|
@ -270,4 +270,3 @@ class TestAnsibleModuleLogJournal(unittest.TestCase):
|
||||||
# We added this journal field
|
# We added this journal field
|
||||||
self.assertIn('TEST', mock_func.call_args[1])
|
self.assertIn('TEST', mock_func.call_args[1])
|
||||||
self.assertIn('log unittest', mock_func.call_args[1]['TEST'])
|
self.assertIn('log unittest', mock_func.call_args[1]['TEST'])
|
||||||
|
|
||||||
|
|
|
@ -42,10 +42,21 @@ class TestReturnValues(unittest.TestCase):
|
||||||
(['1', '2', '3'], frozenset(['1', '2', '3'])),
|
(['1', '2', '3'], frozenset(['1', '2', '3'])),
|
||||||
(('1', '2', '3'), frozenset(['1', '2', '3'])),
|
(('1', '2', '3'), frozenset(['1', '2', '3'])),
|
||||||
({'one': 1, 'two': 'dos'}, frozenset(['1', 'dos'])),
|
({'one': 1, 'two': 'dos'}, frozenset(['1', 'dos'])),
|
||||||
({'one': 1, 'two': 'dos',
|
(
|
||||||
'three': ['amigos', 'musketeers', None,
|
{
|
||||||
{'ping': 'pong', 'base': ('balls', 'raquets')}]},
|
'one': 1,
|
||||||
frozenset(['1', 'dos', 'amigos', 'musketeers', 'pong', 'balls', 'raquets'])),
|
'two': 'dos',
|
||||||
|
'three': [
|
||||||
|
'amigos', 'musketeers', None, {
|
||||||
|
'ping': 'pong',
|
||||||
|
'base': (
|
||||||
|
'balls', 'raquets'
|
||||||
|
)
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
frozenset(['1', 'dos', 'amigos', 'musketeers', 'pong', 'balls', 'raquets'])
|
||||||
|
),
|
||||||
(u'Toshio くらとみ', frozenset(['Toshio くらとみ'])),
|
(u'Toshio くらとみ', frozenset(['Toshio くらとみ'])),
|
||||||
('Toshio くらとみ', frozenset(['Toshio くらとみ'])),
|
('Toshio くらとみ', frozenset(['Toshio くらとみ'])),
|
||||||
)
|
)
|
||||||
|
@ -67,13 +78,22 @@ class TestRemoveValues(unittest.TestCase):
|
||||||
(1.0, frozenset(['4321'])),
|
(1.0, frozenset(['4321'])),
|
||||||
(['string', 'strang', 'strung'], frozenset(['nope'])),
|
(['string', 'strang', 'strung'], frozenset(['nope'])),
|
||||||
({'one': 1, 'two': 'dos', 'secret': 'key'}, frozenset(['nope'])),
|
({'one': 1, 'two': 'dos', 'secret': 'key'}, frozenset(['nope'])),
|
||||||
({'one': 1, 'two': 'dos',
|
(
|
||||||
'three': ['amigos', 'musketeers', None,
|
{
|
||||||
{'ping': 'pong', 'base': ['balls', 'raquets']}]},
|
'one': 1,
|
||||||
frozenset(['nope'])),
|
'two': 'dos',
|
||||||
|
'three': [
|
||||||
|
'amigos', 'musketeers', None, {
|
||||||
|
'ping': 'pong', 'base': ['balls', 'raquets']
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
frozenset(['nope'])
|
||||||
|
),
|
||||||
('Toshio くら', frozenset(['とみ'])),
|
('Toshio くら', frozenset(['とみ'])),
|
||||||
(u'Toshio くら', frozenset(['とみ'])),
|
(u'Toshio くら', frozenset(['とみ'])),
|
||||||
)
|
)
|
||||||
|
|
||||||
dataset_remove = (
|
dataset_remove = (
|
||||||
('string', frozenset(['string']), OMIT),
|
('string', frozenset(['string']), OMIT),
|
||||||
(1234, frozenset(['1234']), OMIT),
|
(1234, frozenset(['1234']), OMIT),
|
||||||
|
@ -84,23 +104,43 @@ class TestRemoveValues(unittest.TestCase):
|
||||||
(('string', 'strang', 'strung'), frozenset(['string', 'strung']), [OMIT, 'strang', OMIT]),
|
(('string', 'strang', 'strung'), frozenset(['string', 'strung']), [OMIT, 'strang', OMIT]),
|
||||||
((1234567890, 345678, 987654321), frozenset(['1234567890']), [OMIT, 345678, 987654321]),
|
((1234567890, 345678, 987654321), frozenset(['1234567890']), [OMIT, 345678, 987654321]),
|
||||||
((1234567890, 345678, 987654321), frozenset(['345678']), [OMIT, OMIT, 987654321]),
|
((1234567890, 345678, 987654321), frozenset(['345678']), [OMIT, OMIT, 987654321]),
|
||||||
({'one': 1, 'two': 'dos', 'secret': 'key'}, frozenset(['key']),
|
({'one': 1, 'two': 'dos', 'secret': 'key'}, frozenset(['key']), {'one': 1, 'two': 'dos', 'secret': OMIT}),
|
||||||
{'one': 1, 'two': 'dos', 'secret': OMIT}),
|
({'one': 1, 'two': 'dos', 'secret': 'key'}, frozenset(['key', 'dos', '1']), {'one': OMIT, 'two': OMIT, 'secret': OMIT}),
|
||||||
({'one': 1, 'two': 'dos', 'secret': 'key'}, frozenset(['key', 'dos', '1']),
|
({'one': 1, 'two': 'dos', 'secret': 'key'}, frozenset(['key', 'dos', '1']), {'one': OMIT, 'two': OMIT, 'secret': OMIT}),
|
||||||
{'one': OMIT, 'two': OMIT, 'secret': OMIT}),
|
(
|
||||||
({'one': 1, 'two': 'dos', 'secret': 'key'}, frozenset(['key', 'dos', '1']),
|
{
|
||||||
{'one': OMIT, 'two': OMIT, 'secret': OMIT}),
|
'one': 1,
|
||||||
({'one': 1, 'two': 'dos', 'three': ['amigos', 'musketeers', None,
|
'two': 'dos',
|
||||||
{'ping': 'pong', 'base': ['balls', 'raquets']}]},
|
'three': [
|
||||||
frozenset(['balls', 'base', 'pong', 'amigos']),
|
'amigos', 'musketeers', None, {
|
||||||
{'one': 1, 'two': 'dos', 'three': [OMIT, 'musketeers',
|
'ping': 'pong', 'base': [
|
||||||
None, {'ping': OMIT, 'base': [OMIT, 'raquets']}]}),
|
'balls', 'raquets'
|
||||||
('This sentence has an enigma wrapped in a mystery inside of a secret. - mr mystery',
|
]
|
||||||
frozenset(['enigma', 'mystery', 'secret']),
|
}
|
||||||
'This sentence has an ******** wrapped in a ******** inside of a ********. - mr ********'),
|
]
|
||||||
|
},
|
||||||
|
frozenset(['balls', 'base', 'pong', 'amigos']),
|
||||||
|
{
|
||||||
|
'one': 1,
|
||||||
|
'two': 'dos',
|
||||||
|
'three': [
|
||||||
|
OMIT, 'musketeers', None, {
|
||||||
|
'ping': OMIT,
|
||||||
|
'base': [
|
||||||
|
OMIT, 'raquets'
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
),
|
||||||
|
(
|
||||||
|
'This sentence has an enigma wrapped in a mystery inside of a secret. - mr mystery',
|
||||||
|
frozenset(['enigma', 'mystery', 'secret']),
|
||||||
|
'This sentence has an ******** wrapped in a ******** inside of a ********. - mr ********'
|
||||||
|
),
|
||||||
('Toshio くらとみ', frozenset(['くらとみ']), 'Toshio ********'),
|
('Toshio くらとみ', frozenset(['くらとみ']), 'Toshio ********'),
|
||||||
(u'Toshio くらとみ', frozenset(['くらとみ']), u'Toshio ********'),
|
(u'Toshio くらとみ', frozenset(['くらとみ']), u'Toshio ********'),
|
||||||
)
|
)
|
||||||
|
|
||||||
def test_no_removal(self):
|
def test_no_removal(self):
|
||||||
for value, no_log_strings in self.dataset_no_remove:
|
for value, no_log_strings in self.dataset_no_remove:
|
||||||
|
@ -112,5 +152,3 @@ class TestRemoveValues(unittest.TestCase):
|
||||||
|
|
||||||
def test_unknown_type(self):
|
def test_unknown_type(self):
|
||||||
self.assertRaises(TypeError, remove_values, object(), frozenset())
|
self.assertRaises(TypeError, remove_values, object(), frozenset())
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -27,13 +27,13 @@ from io import BytesIO, StringIO
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
from ansible.module_utils.six import PY3
|
|
||||||
from ansible.compat.tests import unittest
|
from ansible.compat.tests import unittest
|
||||||
from ansible.compat.tests.mock import call, MagicMock, Mock, patch, sentinel
|
from ansible.compat.tests.mock import call, MagicMock, Mock, patch, sentinel
|
||||||
|
from ansible.module_utils.six import PY3
|
||||||
|
import ansible.module_utils.basic
|
||||||
|
|
||||||
from units.mock.procenv import swap_stdin_and_argv
|
from units.mock.procenv import swap_stdin_and_argv
|
||||||
|
|
||||||
import ansible.module_utils.basic
|
|
||||||
|
|
||||||
class OpenBytesIO(BytesIO):
|
class OpenBytesIO(BytesIO):
|
||||||
"""BytesIO with dummy close() method
|
"""BytesIO with dummy close() method
|
||||||
|
@ -68,7 +68,7 @@ class TestAnsibleModuleRunCommand(unittest.TestCase):
|
||||||
if path.startswith('/'):
|
if path.startswith('/'):
|
||||||
return path
|
return path
|
||||||
else:
|
else:
|
||||||
return self.os.getcwd.return_value + '/' + path
|
return self.os.getcwd.return_value + '/' + path
|
||||||
|
|
||||||
args = json.dumps(dict(ANSIBLE_MODULE_ARGS={}))
|
args = json.dumps(dict(ANSIBLE_MODULE_ARGS={}))
|
||||||
# unittest doesn't have a clean place to use a context manager, so we have to enter/exit manually
|
# unittest doesn't have a clean place to use a context manager, so we have to enter/exit manually
|
||||||
|
@ -207,4 +207,3 @@ class TestAnsibleModuleRunCommand(unittest.TestCase):
|
||||||
else:
|
else:
|
||||||
self.assertEqual(stdout.decode('utf-8'), u'Žarn§')
|
self.assertEqual(stdout.decode('utf-8'), u'Žarn§')
|
||||||
self.assertEqual(stderr.decode('utf-8'), u'لرئيسية')
|
self.assertEqual(stderr.decode('utf-8'), u'لرئيسية')
|
||||||
|
|
||||||
|
|
|
@ -36,12 +36,12 @@ VALID_STRINGS = (
|
||||||
[("True", True)],
|
[("True", True)],
|
||||||
[("False", False)],
|
[("False", False)],
|
||||||
[("{}", {})],
|
[("{}", {})],
|
||||||
)
|
)
|
||||||
|
|
||||||
# Passing things that aren't strings should just return the object
|
# Passing things that aren't strings should just return the object
|
||||||
NONSTRINGS = (
|
NONSTRINGS = (
|
||||||
[({'a':1}, {'a':1})],
|
[({'a': 1}, {'a': 1})],
|
||||||
)
|
)
|
||||||
|
|
||||||
# These strings are not basic types. For security, these should not be
|
# These strings are not basic types. For security, these should not be
|
||||||
# executed. We return the same string and get an exception for some
|
# executed. We return the same string and get an exception for some
|
||||||
|
@ -50,25 +50,29 @@ INVALID_STRINGS = (
|
||||||
[("a.foo()", "a.foo()", None)],
|
[("a.foo()", "a.foo()", None)],
|
||||||
[("import foo", "import foo", None)],
|
[("import foo", "import foo", None)],
|
||||||
[("__import__('foo')", "__import__('foo')", ValueError)],
|
[("__import__('foo')", "__import__('foo')", ValueError)],
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
def _check_simple_types(self, code, expected):
|
def _check_simple_types(self, code, expected):
|
||||||
# test some basic usage for various types
|
# test some basic usage for various types
|
||||||
self.assertEqual(self.am.safe_eval(code), expected)
|
self.assertEqual(self.am.safe_eval(code), expected)
|
||||||
|
|
||||||
|
|
||||||
def _check_simple_types_with_exceptions(self, code, expected):
|
def _check_simple_types_with_exceptions(self, code, expected):
|
||||||
# Test simple types with exceptions requested
|
# Test simple types with exceptions requested
|
||||||
self.assertEqual(self.am.safe_eval(code, include_exceptions=True), (expected, None))
|
self.assertEqual(self.am.safe_eval(code, include_exceptions=True), (expected, None))
|
||||||
|
|
||||||
|
|
||||||
def _check_invalid_strings(self, code, expected):
|
def _check_invalid_strings(self, code, expected):
|
||||||
self.assertEqual(self.am.safe_eval(code), expected)
|
self.assertEqual(self.am.safe_eval(code), expected)
|
||||||
|
|
||||||
|
|
||||||
def _check_invalid_strings_with_exceptions(self, code, expected, exception):
|
def _check_invalid_strings_with_exceptions(self, code, expected, exception):
|
||||||
res = self.am.safe_eval("a=1", include_exceptions=True)
|
res = self.am.safe_eval("a=1", include_exceptions=True)
|
||||||
self.assertEqual(res[0], "a=1")
|
self.assertEqual(res[0], "a=1")
|
||||||
self.assertEqual(type(res[1]), SyntaxError)
|
self.assertEqual(type(res[1]), SyntaxError)
|
||||||
|
|
||||||
|
|
||||||
@add_method(_check_simple_types, *VALID_STRINGS)
|
@add_method(_check_simple_types, *VALID_STRINGS)
|
||||||
@add_method(_check_simple_types, *NONSTRINGS)
|
@add_method(_check_simple_types, *NONSTRINGS)
|
||||||
@add_method(_check_simple_types_with_exceptions, *VALID_STRINGS)
|
@add_method(_check_simple_types_with_exceptions, *VALID_STRINGS)
|
||||||
|
|
|
@ -35,6 +35,7 @@ from ansible.module_utils import known_hosts
|
||||||
from units.mock.procenv import ModuleTestCase
|
from units.mock.procenv import ModuleTestCase
|
||||||
from units.mock.generator import add_method
|
from units.mock.generator import add_method
|
||||||
|
|
||||||
|
|
||||||
class TestSetModeIfDifferentBase(ModuleTestCase):
|
class TestSetModeIfDifferentBase(ModuleTestCase):
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
|
@ -49,7 +50,7 @@ class TestSetModeIfDifferentBase(ModuleTestCase):
|
||||||
basic._ANSIBLE_ARGS = None
|
basic._ANSIBLE_ARGS = None
|
||||||
|
|
||||||
self.am = basic.AnsibleModule(
|
self.am = basic.AnsibleModule(
|
||||||
argument_spec = dict(),
|
argument_spec=dict(),
|
||||||
)
|
)
|
||||||
|
|
||||||
def tearDown(self):
|
def tearDown(self):
|
||||||
|
@ -60,8 +61,10 @@ class TestSetModeIfDifferentBase(ModuleTestCase):
|
||||||
|
|
||||||
def _check_no_mode_given_returns_previous_changes(self, previous_changes=True):
|
def _check_no_mode_given_returns_previous_changes(self, previous_changes=True):
|
||||||
with patch('os.lstat', side_effect=[self.mock_stat1]):
|
with patch('os.lstat', side_effect=[self.mock_stat1]):
|
||||||
|
|
||||||
self.assertEqual(self.am.set_mode_if_different('/path/to/file', None, previous_changes), previous_changes)
|
self.assertEqual(self.am.set_mode_if_different('/path/to/file', None, previous_changes), previous_changes)
|
||||||
|
|
||||||
|
|
||||||
def _check_mode_changed_to_0660(self, mode):
|
def _check_mode_changed_to_0660(self, mode):
|
||||||
# Note: This is for checking that all the different ways of specifying
|
# Note: This is for checking that all the different ways of specifying
|
||||||
# 0660 mode work. It cannot be used to check that setting a mode that is
|
# 0660 mode work. It cannot be used to check that setting a mode that is
|
||||||
|
@ -71,6 +74,7 @@ def _check_mode_changed_to_0660(self, mode):
|
||||||
self.assertEqual(self.am.set_mode_if_different('/path/to/file', mode, False), True)
|
self.assertEqual(self.am.set_mode_if_different('/path/to/file', mode, False), True)
|
||||||
m_lchmod.assert_called_with(b'/path/to/file', 0o660)
|
m_lchmod.assert_called_with(b'/path/to/file', 0o660)
|
||||||
|
|
||||||
|
|
||||||
def _check_mode_unchanged_when_already_0660(self, mode):
|
def _check_mode_unchanged_when_already_0660(self, mode):
|
||||||
# Note: This is for checking that all the different ways of specifying
|
# Note: This is for checking that all the different ways of specifying
|
||||||
# 0660 mode work. It cannot be used to check that setting a mode that is
|
# 0660 mode work. It cannot be used to check that setting a mode that is
|
||||||
|
@ -83,18 +87,12 @@ SYNONYMS_0660 = (
|
||||||
[[0o660]],
|
[[0o660]],
|
||||||
[['0o660']],
|
[['0o660']],
|
||||||
[['660']],
|
[['660']],
|
||||||
)
|
)
|
||||||
|
|
||||||
@add_method(_check_no_mode_given_returns_previous_changes,
|
|
||||||
[dict(previous_changes=True)],
|
@add_method(_check_no_mode_given_returns_previous_changes, [dict(previous_changes=True)], [dict(previous_changes=False)], )
|
||||||
[dict(previous_changes=False)],
|
@add_method(_check_mode_changed_to_0660, *SYNONYMS_0660)
|
||||||
)
|
@add_method(_check_mode_unchanged_when_already_0660, *SYNONYMS_0660)
|
||||||
@add_method(_check_mode_changed_to_0660,
|
|
||||||
*SYNONYMS_0660
|
|
||||||
)
|
|
||||||
@add_method(_check_mode_unchanged_when_already_0660,
|
|
||||||
*SYNONYMS_0660
|
|
||||||
)
|
|
||||||
class TestSetModeIfDifferent(TestSetModeIfDifferentBase):
|
class TestSetModeIfDifferent(TestSetModeIfDifferentBase):
|
||||||
def test_module_utils_basic_ansible_module_set_mode_if_different(self):
|
def test_module_utils_basic_ansible_module_set_mode_if_different(self):
|
||||||
with patch('os.lstat') as m:
|
with patch('os.lstat') as m:
|
||||||
|
@ -105,6 +103,7 @@ class TestSetModeIfDifferent(TestSetModeIfDifferentBase):
|
||||||
self.am.set_mode_if_different('/path/to/file', 'o+w,g+w,a-r', False)
|
self.am.set_mode_if_different('/path/to/file', 'o+w,g+w,a-r', False)
|
||||||
|
|
||||||
original_hasattr = hasattr
|
original_hasattr = hasattr
|
||||||
|
|
||||||
def _hasattr(obj, name):
|
def _hasattr(obj, name):
|
||||||
if obj == os and name == 'lchmod':
|
if obj == os and name == 'lchmod':
|
||||||
return False
|
return False
|
||||||
|
@ -131,16 +130,10 @@ def _check_knows_to_change_to_0660_in_check_mode(self, mode):
|
||||||
with patch('os.lstat', side_effect=[self.mock_stat1, self.mock_stat2, self.mock_stat2]) as m_lstat:
|
with patch('os.lstat', side_effect=[self.mock_stat1, self.mock_stat2, self.mock_stat2]) as m_lstat:
|
||||||
self.assertEqual(self.am.set_mode_if_different('/path/to/file', mode, False), True)
|
self.assertEqual(self.am.set_mode_if_different('/path/to/file', mode, False), True)
|
||||||
|
|
||||||
@add_method(_check_no_mode_given_returns_previous_changes,
|
|
||||||
[dict(previous_changes=True)],
|
@add_method(_check_no_mode_given_returns_previous_changes, [dict(previous_changes=True)], [dict(previous_changes=False)],)
|
||||||
[dict(previous_changes=False)],
|
@add_method(_check_knows_to_change_to_0660_in_check_mode, *SYNONYMS_0660)
|
||||||
)
|
@add_method(_check_mode_unchanged_when_already_0660, *SYNONYMS_0660)
|
||||||
@add_method(_check_knows_to_change_to_0660_in_check_mode,
|
|
||||||
*SYNONYMS_0660
|
|
||||||
)
|
|
||||||
@add_method(_check_mode_unchanged_when_already_0660,
|
|
||||||
*SYNONYMS_0660
|
|
||||||
)
|
|
||||||
class TestSetModeIfDifferentWithCheckMode(TestSetModeIfDifferentBase):
|
class TestSetModeIfDifferentWithCheckMode(TestSetModeIfDifferentBase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
super(TestSetModeIfDifferentWithCheckMode, self).setUp()
|
super(TestSetModeIfDifferentWithCheckMode, self).setUp()
|
||||||
|
|
|
@ -69,7 +69,7 @@ class RetryTestCase(unittest.TestCase):
|
||||||
self.counter += 1
|
self.counter += 1
|
||||||
raise botocore.exceptions.ClientError(err_msg, 'toooo fast!!')
|
raise botocore.exceptions.ClientError(err_msg, 'toooo fast!!')
|
||||||
|
|
||||||
#with self.assertRaises(botocore.exceptions.ClientError):
|
# with self.assertRaises(botocore.exceptions.ClientError):
|
||||||
try:
|
try:
|
||||||
fail()
|
fail()
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
|
@ -85,7 +85,7 @@ class RetryTestCase(unittest.TestCase):
|
||||||
self.counter += 1
|
self.counter += 1
|
||||||
raise botocore.exceptions.ClientError(err_msg, 'unexpected error')
|
raise botocore.exceptions.ClientError(err_msg, 'unexpected error')
|
||||||
|
|
||||||
#with self.assertRaises(botocore.exceptions.ClientError):
|
# with self.assertRaises(botocore.exceptions.ClientError):
|
||||||
try:
|
try:
|
||||||
raise_unexpected_error()
|
raise_unexpected_error()
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
|
|
|
@ -22,11 +22,12 @@ __metaclass__ = type
|
||||||
|
|
||||||
import json
|
import json
|
||||||
|
|
||||||
from ansible.compat.tests import unittest
|
|
||||||
from nose.tools import eq_, raises
|
from nose.tools import eq_, raises
|
||||||
|
|
||||||
|
from ansible.compat.tests import unittest
|
||||||
from ansible.module_utils.json_utils import _filter_non_json_lines
|
from ansible.module_utils.json_utils import _filter_non_json_lines
|
||||||
|
|
||||||
|
|
||||||
class TestAnsibleModuleExitJson(unittest.TestCase):
|
class TestAnsibleModuleExitJson(unittest.TestCase):
|
||||||
single_line_json_dict = u"""{"key": "value", "olá": "mundo"}"""
|
single_line_json_dict = u"""{"key": "value", "olá": "mundo"}"""
|
||||||
single_line_json_array = u"""["a","b","c"]"""
|
single_line_json_array = u"""["a","b","c"]"""
|
||||||
|
@ -38,10 +39,12 @@ class TestAnsibleModuleExitJson(unittest.TestCase):
|
||||||
"b",
|
"b",
|
||||||
"c"]"""
|
"c"]"""
|
||||||
|
|
||||||
all_inputs = [single_line_json_dict,
|
all_inputs = [
|
||||||
single_line_json_array,
|
single_line_json_dict,
|
||||||
multi_line_json_dict,
|
single_line_json_array,
|
||||||
multi_line_json_array]
|
multi_line_json_dict,
|
||||||
|
multi_line_json_array
|
||||||
|
]
|
||||||
|
|
||||||
junk = [u"single line of junk", u"line 1/2 of junk\nline 2/2 of junk"]
|
junk = [u"single line of junk", u"line 1/2 of junk\nline 2/2 of junk"]
|
||||||
|
|
||||||
|
@ -51,7 +54,7 @@ class TestAnsibleModuleExitJson(unittest.TestCase):
|
||||||
u'{"No json": "ending"',
|
u'{"No json": "ending"',
|
||||||
u'{"wrong": "ending"]',
|
u'{"wrong": "ending"]',
|
||||||
u'["wrong": "ending"}',
|
u'["wrong": "ending"}',
|
||||||
)
|
)
|
||||||
|
|
||||||
def test_just_json(self):
|
def test_just_json(self):
|
||||||
for i in self.all_inputs:
|
for i in self.all_inputs:
|
||||||
|
@ -82,7 +85,8 @@ class TestAnsibleModuleExitJson(unittest.TestCase):
|
||||||
|
|
||||||
def test_unparsable_filter_non_json_lines(self):
|
def test_unparsable_filter_non_json_lines(self):
|
||||||
for i in self.unparsable_cases:
|
for i in self.unparsable_cases:
|
||||||
self.assertRaises(ValueError,
|
self.assertRaises(
|
||||||
|
ValueError,
|
||||||
lambda data: _filter_non_json_lines(data),
|
lambda data: _filter_non_json_lines(data),
|
||||||
data=i
|
data=i
|
||||||
)
|
)
|
||||||
|
|
|
@ -35,6 +35,7 @@ from ansible.module_utils.six.moves import builtins
|
||||||
|
|
||||||
realimport = builtins.__import__
|
realimport = builtins.__import__
|
||||||
|
|
||||||
|
|
||||||
class TestModuleUtilsBasic(ModuleTestCase):
|
class TestModuleUtilsBasic(ModuleTestCase):
|
||||||
|
|
||||||
def clear_modules(self, mods):
|
def clear_modules(self, mods):
|
||||||
|
@ -95,10 +96,10 @@ class TestModuleUtilsBasic(ModuleTestCase):
|
||||||
mod = builtins.__import__('ansible.module_utils.basic')
|
mod = builtins.__import__('ansible.module_utils.basic')
|
||||||
|
|
||||||
# FIXME: doesn't work yet
|
# FIXME: doesn't work yet
|
||||||
#@patch.object(builtins, 'bytes')
|
# @patch.object(builtins, 'bytes')
|
||||||
#def test_module_utils_basic_bytes(self, mock_bytes):
|
# def test_module_utils_basic_bytes(self, mock_bytes):
|
||||||
# mock_bytes.side_effect = NameError()
|
# mock_bytes.side_effect = NameError()
|
||||||
# from ansible.module_utils import basic
|
# from ansible.module_utils import basic
|
||||||
|
|
||||||
@patch.object(builtins, '__import__')
|
@patch.object(builtins, '__import__')
|
||||||
@unittest.skipIf(sys.version_info[0] >= 3, "literal_eval is available in every version of Python3")
|
@unittest.skipIf(sys.version_info[0] >= 3, "literal_eval is available in every version of Python3")
|
||||||
|
@ -118,12 +119,12 @@ class TestModuleUtilsBasic(ModuleTestCase):
|
||||||
self.assertEqual(mod.module_utils.basic.literal_eval("'1'"), "1")
|
self.assertEqual(mod.module_utils.basic.literal_eval("'1'"), "1")
|
||||||
self.assertEqual(mod.module_utils.basic.literal_eval("1"), 1)
|
self.assertEqual(mod.module_utils.basic.literal_eval("1"), 1)
|
||||||
self.assertEqual(mod.module_utils.basic.literal_eval("-1"), -1)
|
self.assertEqual(mod.module_utils.basic.literal_eval("-1"), -1)
|
||||||
self.assertEqual(mod.module_utils.basic.literal_eval("(1,2,3)"), (1,2,3))
|
self.assertEqual(mod.module_utils.basic.literal_eval("(1,2,3)"), (1, 2, 3))
|
||||||
self.assertEqual(mod.module_utils.basic.literal_eval("[1]"), [1])
|
self.assertEqual(mod.module_utils.basic.literal_eval("[1]"), [1])
|
||||||
self.assertEqual(mod.module_utils.basic.literal_eval("True"), True)
|
self.assertEqual(mod.module_utils.basic.literal_eval("True"), True)
|
||||||
self.assertEqual(mod.module_utils.basic.literal_eval("False"), False)
|
self.assertEqual(mod.module_utils.basic.literal_eval("False"), False)
|
||||||
self.assertEqual(mod.module_utils.basic.literal_eval("None"), None)
|
self.assertEqual(mod.module_utils.basic.literal_eval("None"), None)
|
||||||
#self.assertEqual(mod.module_utils.basic.literal_eval('{"a": 1}'), dict(a=1))
|
# self.assertEqual(mod.module_utils.basic.literal_eval('{"a": 1}'), dict(a=1))
|
||||||
self.assertRaises(ValueError, mod.module_utils.basic.literal_eval, "asdfasdfasdf")
|
self.assertRaises(ValueError, mod.module_utils.basic.literal_eval, "asdfasdfasdf")
|
||||||
|
|
||||||
@patch.object(builtins, '__import__')
|
@patch.object(builtins, '__import__')
|
||||||
|
@ -162,13 +163,13 @@ class TestModuleUtilsBasic(ModuleTestCase):
|
||||||
self.assertEqual(get_distribution(), "Foo")
|
self.assertEqual(get_distribution(), "Foo")
|
||||||
|
|
||||||
with patch('os.path.isfile', return_value=True):
|
with patch('os.path.isfile', return_value=True):
|
||||||
with patch('platform.linux_distribution', side_effect=[("AmazonFooBar",)]):
|
with patch('platform.linux_distribution', side_effect=[("AmazonFooBar", )]):
|
||||||
self.assertEqual(get_distribution(), "Amazonfoobar")
|
self.assertEqual(get_distribution(), "Amazonfoobar")
|
||||||
|
|
||||||
with patch('platform.linux_distribution', side_effect=(("",), ("AmazonFooBam",))):
|
with patch('platform.linux_distribution', side_effect=(("", ), ("AmazonFooBam",))):
|
||||||
self.assertEqual(get_distribution(), "Amazon")
|
self.assertEqual(get_distribution(), "Amazon")
|
||||||
|
|
||||||
with patch('platform.linux_distribution', side_effect=[("",),("",)]):
|
with patch('platform.linux_distribution', side_effect=[("", ), ("", )]):
|
||||||
self.assertEqual(get_distribution(), "OtherLinux")
|
self.assertEqual(get_distribution(), "OtherLinux")
|
||||||
|
|
||||||
def _dist(distname='', version='', id='', supported_dists=(), full_distribution_name=1):
|
def _dist(distname='', version='', id='', supported_dists=(), full_distribution_name=1):
|
||||||
|
@ -241,11 +242,11 @@ class TestModuleUtilsBasic(ModuleTestCase):
|
||||||
from ansible.module_utils.basic import json_dict_unicode_to_bytes, json_dict_bytes_to_unicode
|
from ansible.module_utils.basic import json_dict_unicode_to_bytes, json_dict_bytes_to_unicode
|
||||||
|
|
||||||
test_data = dict(
|
test_data = dict(
|
||||||
item1 = u"Fóo",
|
item1=u"Fóo",
|
||||||
item2 = [u"Bár", u"Bam"],
|
item2=[u"Bár", u"Bam"],
|
||||||
item3 = dict(sub1=u"Súb"),
|
item3=dict(sub1=u"Súb"),
|
||||||
item4 = (u"föo", u"bär", u"©"),
|
item4=(u"föo", u"bär", u"©"),
|
||||||
item5 = 42,
|
item5=42,
|
||||||
)
|
)
|
||||||
res = json_dict_unicode_to_bytes(test_data)
|
res = json_dict_unicode_to_bytes(test_data)
|
||||||
res2 = json_dict_bytes_to_unicode(res)
|
res2 = json_dict_bytes_to_unicode(res)
|
||||||
|
@ -265,10 +266,10 @@ class TestModuleUtilsBasic(ModuleTestCase):
|
||||||
)
|
)
|
||||||
|
|
||||||
arg_spec = dict(
|
arg_spec = dict(
|
||||||
foo = dict(required=True),
|
foo=dict(required=True),
|
||||||
bar = dict(),
|
bar=dict(),
|
||||||
bam = dict(),
|
bam=dict(),
|
||||||
baz = dict(),
|
baz=dict(),
|
||||||
)
|
)
|
||||||
mut_ex = (('bar', 'bam'),)
|
mut_ex = (('bar', 'bam'),)
|
||||||
req_to = (('bam', 'baz'),)
|
req_to = (('bam', 'baz'),)
|
||||||
|
@ -279,9 +280,9 @@ class TestModuleUtilsBasic(ModuleTestCase):
|
||||||
with swap_stdin_and_argv(stdin_data=args):
|
with swap_stdin_and_argv(stdin_data=args):
|
||||||
basic._ANSIBLE_ARGS = None
|
basic._ANSIBLE_ARGS = None
|
||||||
am = basic.AnsibleModule(
|
am = basic.AnsibleModule(
|
||||||
argument_spec = arg_spec,
|
argument_spec=arg_spec,
|
||||||
mutually_exclusive = mut_ex,
|
mutually_exclusive=mut_ex,
|
||||||
required_together = req_to,
|
required_together=req_to,
|
||||||
no_log=True,
|
no_log=True,
|
||||||
check_invalid_arguments=False,
|
check_invalid_arguments=False,
|
||||||
add_file_common_args=True,
|
add_file_common_args=True,
|
||||||
|
@ -298,9 +299,9 @@ class TestModuleUtilsBasic(ModuleTestCase):
|
||||||
self.assertRaises(
|
self.assertRaises(
|
||||||
SystemExit,
|
SystemExit,
|
||||||
basic.AnsibleModule,
|
basic.AnsibleModule,
|
||||||
argument_spec = arg_spec,
|
argument_spec=arg_spec,
|
||||||
mutually_exclusive = mut_ex,
|
mutually_exclusive=mut_ex,
|
||||||
required_together = req_to,
|
required_together=req_to,
|
||||||
no_log=True,
|
no_log=True,
|
||||||
check_invalid_arguments=False,
|
check_invalid_arguments=False,
|
||||||
add_file_common_args=True,
|
add_file_common_args=True,
|
||||||
|
@ -308,16 +309,16 @@ class TestModuleUtilsBasic(ModuleTestCase):
|
||||||
)
|
)
|
||||||
|
|
||||||
# fail because of mutually exclusive parameters
|
# fail because of mutually exclusive parameters
|
||||||
args = json.dumps(dict(ANSIBLE_MODULE_ARGS={"foo":"hello", "bar": "bad", "bam": "bad"}))
|
args = json.dumps(dict(ANSIBLE_MODULE_ARGS={"foo": "hello", "bar": "bad", "bam": "bad"}))
|
||||||
|
|
||||||
with swap_stdin_and_argv(stdin_data=args):
|
with swap_stdin_and_argv(stdin_data=args):
|
||||||
basic._ANSIBLE_ARGS = None
|
basic._ANSIBLE_ARGS = None
|
||||||
self.assertRaises(
|
self.assertRaises(
|
||||||
SystemExit,
|
SystemExit,
|
||||||
basic.AnsibleModule,
|
basic.AnsibleModule,
|
||||||
argument_spec = arg_spec,
|
argument_spec=arg_spec,
|
||||||
mutually_exclusive = mut_ex,
|
mutually_exclusive=mut_ex,
|
||||||
required_together = req_to,
|
required_together=req_to,
|
||||||
no_log=True,
|
no_log=True,
|
||||||
check_invalid_arguments=False,
|
check_invalid_arguments=False,
|
||||||
add_file_common_args=True,
|
add_file_common_args=True,
|
||||||
|
@ -332,9 +333,9 @@ class TestModuleUtilsBasic(ModuleTestCase):
|
||||||
self.assertRaises(
|
self.assertRaises(
|
||||||
SystemExit,
|
SystemExit,
|
||||||
basic.AnsibleModule,
|
basic.AnsibleModule,
|
||||||
argument_spec = arg_spec,
|
argument_spec=arg_spec,
|
||||||
mutually_exclusive = mut_ex,
|
mutually_exclusive=mut_ex,
|
||||||
required_together = req_to,
|
required_together=req_to,
|
||||||
no_log=True,
|
no_log=True,
|
||||||
check_invalid_arguments=False,
|
check_invalid_arguments=False,
|
||||||
add_file_common_args=True,
|
add_file_common_args=True,
|
||||||
|
@ -345,26 +346,26 @@ class TestModuleUtilsBasic(ModuleTestCase):
|
||||||
from ansible.module_utils import basic
|
from ansible.module_utils import basic
|
||||||
|
|
||||||
arg_spec = dict(
|
arg_spec = dict(
|
||||||
foo = dict(type='float'),
|
foo=dict(type='float'),
|
||||||
foo2 = dict(type='float'),
|
foo2=dict(type='float'),
|
||||||
foo3 = dict(type='float'),
|
foo3=dict(type='float'),
|
||||||
bar = dict(type='int'),
|
bar=dict(type='int'),
|
||||||
bar2 = dict(type='int'),
|
bar2=dict(type='int'),
|
||||||
)
|
)
|
||||||
|
|
||||||
# should test ok
|
# should test ok
|
||||||
args = json.dumps(dict(ANSIBLE_MODULE_ARGS={
|
args = json.dumps(dict(ANSIBLE_MODULE_ARGS={
|
||||||
"foo": 123.0, # float
|
"foo": 123.0, # float
|
||||||
"foo2": 123, # int
|
"foo2": 123, # int
|
||||||
"foo3": "123", # string
|
"foo3": "123", # string
|
||||||
"bar": 123, # int
|
"bar": 123, # int
|
||||||
"bar2": "123", # string
|
"bar2": "123", # string
|
||||||
}))
|
}))
|
||||||
|
|
||||||
with swap_stdin_and_argv(stdin_data=args):
|
with swap_stdin_and_argv(stdin_data=args):
|
||||||
basic._ANSIBLE_ARGS = None
|
basic._ANSIBLE_ARGS = None
|
||||||
am = basic.AnsibleModule(
|
am = basic.AnsibleModule(
|
||||||
argument_spec = arg_spec,
|
argument_spec=arg_spec,
|
||||||
no_log=True,
|
no_log=True,
|
||||||
check_invalid_arguments=False,
|
check_invalid_arguments=False,
|
||||||
add_file_common_args=True,
|
add_file_common_args=True,
|
||||||
|
@ -379,7 +380,7 @@ class TestModuleUtilsBasic(ModuleTestCase):
|
||||||
self.assertRaises(
|
self.assertRaises(
|
||||||
SystemExit,
|
SystemExit,
|
||||||
basic.AnsibleModule,
|
basic.AnsibleModule,
|
||||||
argument_spec = arg_spec,
|
argument_spec=arg_spec,
|
||||||
no_log=True,
|
no_log=True,
|
||||||
check_invalid_arguments=False,
|
check_invalid_arguments=False,
|
||||||
add_file_common_args=True,
|
add_file_common_args=True,
|
||||||
|
@ -391,7 +392,7 @@ class TestModuleUtilsBasic(ModuleTestCase):
|
||||||
basic._ANSIBLE_ARGS = None
|
basic._ANSIBLE_ARGS = None
|
||||||
|
|
||||||
am = basic.AnsibleModule(
|
am = basic.AnsibleModule(
|
||||||
argument_spec = dict(),
|
argument_spec=dict(),
|
||||||
)
|
)
|
||||||
|
|
||||||
am.selinux_mls_enabled = MagicMock()
|
am.selinux_mls_enabled = MagicMock()
|
||||||
|
@ -404,25 +405,25 @@ class TestModuleUtilsBasic(ModuleTestCase):
|
||||||
self.assertEqual(res, dict())
|
self.assertEqual(res, dict())
|
||||||
|
|
||||||
base_params = dict(
|
base_params = dict(
|
||||||
path = '/path/to/file',
|
path='/path/to/file',
|
||||||
mode = 0o600,
|
mode=0o600,
|
||||||
owner = 'root',
|
owner='root',
|
||||||
group = 'root',
|
group='root',
|
||||||
seuser = '_default',
|
seuser='_default',
|
||||||
serole = '_default',
|
serole='_default',
|
||||||
setype = '_default',
|
setype='_default',
|
||||||
selevel = '_default',
|
selevel='_default',
|
||||||
)
|
)
|
||||||
|
|
||||||
extended_params = base_params.copy()
|
extended_params = base_params.copy()
|
||||||
extended_params.update(dict(
|
extended_params.update(dict(
|
||||||
follow = True,
|
follow=True,
|
||||||
foo = 'bar',
|
foo='bar',
|
||||||
))
|
))
|
||||||
|
|
||||||
final_params = base_params.copy()
|
final_params = base_params.copy()
|
||||||
final_params.update(dict(
|
final_params.update(dict(
|
||||||
path = '/path/to/real_file',
|
path='/path/to/real_file',
|
||||||
secontext=['unconfined_u', 'object_r', 'default_t', 's0'],
|
secontext=['unconfined_u', 'object_r', 'default_t', 's0'],
|
||||||
attributes=None,
|
attributes=None,
|
||||||
))
|
))
|
||||||
|
@ -441,7 +442,7 @@ class TestModuleUtilsBasic(ModuleTestCase):
|
||||||
basic._ANSIBLE_ARGS = None
|
basic._ANSIBLE_ARGS = None
|
||||||
|
|
||||||
am = basic.AnsibleModule(
|
am = basic.AnsibleModule(
|
||||||
argument_spec = dict(),
|
argument_spec=dict(),
|
||||||
)
|
)
|
||||||
|
|
||||||
basic.HAVE_SELINUX = False
|
basic.HAVE_SELINUX = False
|
||||||
|
@ -461,7 +462,7 @@ class TestModuleUtilsBasic(ModuleTestCase):
|
||||||
basic._ANSIBLE_ARGS = None
|
basic._ANSIBLE_ARGS = None
|
||||||
|
|
||||||
am = basic.AnsibleModule(
|
am = basic.AnsibleModule(
|
||||||
argument_spec = dict(),
|
argument_spec=dict(),
|
||||||
)
|
)
|
||||||
|
|
||||||
am.selinux_mls_enabled = MagicMock()
|
am.selinux_mls_enabled = MagicMock()
|
||||||
|
@ -475,7 +476,7 @@ class TestModuleUtilsBasic(ModuleTestCase):
|
||||||
basic._ANSIBLE_ARGS = None
|
basic._ANSIBLE_ARGS = None
|
||||||
|
|
||||||
am = basic.AnsibleModule(
|
am = basic.AnsibleModule(
|
||||||
argument_spec = dict(),
|
argument_spec=dict(),
|
||||||
)
|
)
|
||||||
|
|
||||||
# we first test the cases where the python selinux lib is
|
# we first test the cases where the python selinux lib is
|
||||||
|
@ -486,7 +487,7 @@ class TestModuleUtilsBasic(ModuleTestCase):
|
||||||
am.get_bin_path = MagicMock()
|
am.get_bin_path = MagicMock()
|
||||||
am.get_bin_path.return_value = '/path/to/selinuxenabled'
|
am.get_bin_path.return_value = '/path/to/selinuxenabled'
|
||||||
am.run_command = MagicMock()
|
am.run_command = MagicMock()
|
||||||
am.run_command.return_value=(0, '', '')
|
am.run_command.return_value = (0, '', '')
|
||||||
self.assertRaises(SystemExit, am.selinux_enabled)
|
self.assertRaises(SystemExit, am.selinux_enabled)
|
||||||
am.get_bin_path.return_value = None
|
am.get_bin_path.return_value = None
|
||||||
self.assertEqual(am.selinux_enabled(), False)
|
self.assertEqual(am.selinux_enabled(), False)
|
||||||
|
@ -507,7 +508,7 @@ class TestModuleUtilsBasic(ModuleTestCase):
|
||||||
basic._ANSIBLE_ARGS = None
|
basic._ANSIBLE_ARGS = None
|
||||||
|
|
||||||
am = basic.AnsibleModule(
|
am = basic.AnsibleModule(
|
||||||
argument_spec = dict(),
|
argument_spec=dict(),
|
||||||
)
|
)
|
||||||
|
|
||||||
am.selinux_initial_context = MagicMock(return_value=[None, None, None, None])
|
am.selinux_initial_context = MagicMock(return_value=[None, None, None, None])
|
||||||
|
@ -543,7 +544,7 @@ class TestModuleUtilsBasic(ModuleTestCase):
|
||||||
basic._ANSIBLE_ARGS = None
|
basic._ANSIBLE_ARGS = None
|
||||||
|
|
||||||
am = basic.AnsibleModule(
|
am = basic.AnsibleModule(
|
||||||
argument_spec = dict(),
|
argument_spec=dict(),
|
||||||
)
|
)
|
||||||
|
|
||||||
am.selinux_initial_context = MagicMock(return_value=[None, None, None, None])
|
am.selinux_initial_context = MagicMock(return_value=[None, None, None, None])
|
||||||
|
@ -588,7 +589,7 @@ class TestModuleUtilsBasic(ModuleTestCase):
|
||||||
with swap_stdin_and_argv(stdin_data=args):
|
with swap_stdin_and_argv(stdin_data=args):
|
||||||
basic._ANSIBLE_ARGS = None
|
basic._ANSIBLE_ARGS = None
|
||||||
am = basic.AnsibleModule(
|
am = basic.AnsibleModule(
|
||||||
argument_spec = dict(),
|
argument_spec=dict(),
|
||||||
)
|
)
|
||||||
|
|
||||||
def _mock_find_mount_point(path):
|
def _mock_find_mount_point(path):
|
||||||
|
@ -628,7 +629,7 @@ class TestModuleUtilsBasic(ModuleTestCase):
|
||||||
basic._ANSIBLE_ARGS = None
|
basic._ANSIBLE_ARGS = None
|
||||||
|
|
||||||
am = basic.AnsibleModule(
|
am = basic.AnsibleModule(
|
||||||
argument_spec = dict(),
|
argument_spec=dict(),
|
||||||
)
|
)
|
||||||
|
|
||||||
mock_stat = MagicMock()
|
mock_stat = MagicMock()
|
||||||
|
@ -643,7 +644,7 @@ class TestModuleUtilsBasic(ModuleTestCase):
|
||||||
basic._ANSIBLE_ARGS = None
|
basic._ANSIBLE_ARGS = None
|
||||||
|
|
||||||
am = basic.AnsibleModule(
|
am = basic.AnsibleModule(
|
||||||
argument_spec = dict(),
|
argument_spec=dict(),
|
||||||
)
|
)
|
||||||
|
|
||||||
def _mock_ismount(path):
|
def _mock_ismount(path):
|
||||||
|
@ -669,7 +670,7 @@ class TestModuleUtilsBasic(ModuleTestCase):
|
||||||
basic._ANSIBLE_ARGS = None
|
basic._ANSIBLE_ARGS = None
|
||||||
|
|
||||||
am = basic.AnsibleModule(
|
am = basic.AnsibleModule(
|
||||||
argument_spec = dict(),
|
argument_spec=dict(),
|
||||||
)
|
)
|
||||||
|
|
||||||
basic.HAVE_SELINUX = False
|
basic.HAVE_SELINUX = False
|
||||||
|
@ -714,7 +715,7 @@ class TestModuleUtilsBasic(ModuleTestCase):
|
||||||
basic._ANSIBLE_ARGS = None
|
basic._ANSIBLE_ARGS = None
|
||||||
|
|
||||||
am = basic.AnsibleModule(
|
am = basic.AnsibleModule(
|
||||||
argument_spec = dict(),
|
argument_spec=dict(),
|
||||||
)
|
)
|
||||||
|
|
||||||
self.assertEqual(am.set_owner_if_different('/path/to/file', None, True), True)
|
self.assertEqual(am.set_owner_if_different('/path/to/file', None, True), True)
|
||||||
|
@ -753,7 +754,7 @@ class TestModuleUtilsBasic(ModuleTestCase):
|
||||||
basic._ANSIBLE_ARGS = None
|
basic._ANSIBLE_ARGS = None
|
||||||
|
|
||||||
am = basic.AnsibleModule(
|
am = basic.AnsibleModule(
|
||||||
argument_spec = dict(),
|
argument_spec=dict(),
|
||||||
)
|
)
|
||||||
|
|
||||||
self.assertEqual(am.set_group_if_different('/path/to/file', None, True), True)
|
self.assertEqual(am.set_group_if_different('/path/to/file', None, True), True)
|
||||||
|
@ -824,7 +825,7 @@ class TestModuleUtilsBasic(ModuleTestCase):
|
||||||
basic._ANSIBLE_ARGS = None
|
basic._ANSIBLE_ARGS = None
|
||||||
|
|
||||||
am = basic.AnsibleModule(
|
am = basic.AnsibleModule(
|
||||||
argument_spec = dict(),
|
argument_spec=dict(),
|
||||||
)
|
)
|
||||||
|
|
||||||
environ = dict()
|
environ = dict()
|
||||||
|
@ -885,7 +886,7 @@ class TestModuleUtilsBasic(ModuleTestCase):
|
||||||
stat1.st_mode = 0o0644
|
stat1.st_mode = 0o0644
|
||||||
stat1.st_uid = 0
|
stat1.st_uid = 0
|
||||||
stat1.st_gid = 0
|
stat1.st_gid = 0
|
||||||
_os_stat.side_effect = [stat1,]
|
_os_stat.side_effect = [stat1, ]
|
||||||
am.selinux_enabled.return_value = False
|
am.selinux_enabled.return_value = False
|
||||||
_os_chmod.reset_mock()
|
_os_chmod.reset_mock()
|
||||||
_os_chown.reset_mock()
|
_os_chown.reset_mock()
|
||||||
|
@ -904,7 +905,7 @@ class TestModuleUtilsBasic(ModuleTestCase):
|
||||||
stat1.st_mode = 0o0644
|
stat1.st_mode = 0o0644
|
||||||
stat1.st_uid = 0
|
stat1.st_uid = 0
|
||||||
stat1.st_gid = 0
|
stat1.st_gid = 0
|
||||||
_os_stat.side_effect = [stat1,]
|
_os_stat.side_effect = [stat1, ]
|
||||||
mock_context = MagicMock()
|
mock_context = MagicMock()
|
||||||
am.selinux_context.return_value = mock_context
|
am.selinux_context.return_value = mock_context
|
||||||
am.selinux_enabled.return_value = True
|
am.selinux_enabled.return_value = True
|
||||||
|
@ -1000,7 +1001,7 @@ class TestModuleUtilsBasic(ModuleTestCase):
|
||||||
basic._ANSIBLE_ARGS = None
|
basic._ANSIBLE_ARGS = None
|
||||||
|
|
||||||
am = basic.AnsibleModule(
|
am = basic.AnsibleModule(
|
||||||
argument_spec = dict(),
|
argument_spec=dict(),
|
||||||
)
|
)
|
||||||
|
|
||||||
mock_stat = MagicMock()
|
mock_stat = MagicMock()
|
||||||
|
|
|
@ -41,125 +41,134 @@ TESTSETS = [
|
||||||
"centos",
|
"centos",
|
||||||
"7.2.1511",
|
"7.2.1511",
|
||||||
"Core"
|
"Core"
|
||||||
],
|
],
|
||||||
"input": {
|
"input": {
|
||||||
"/etc/redhat-release": "CentOS Linux release 7.2.1511 (Core) \n",
|
"/etc/redhat-release": "CentOS Linux release 7.2.1511 (Core) \n",
|
||||||
"/etc/os-release": ("NAME=\"CentOS Linux\"\nVERSION=\"7 (Core)\"\nID=\"centos\"\nID_LIKE=\"rhel fedora\"\nVERSION_ID=\"7\"\n"
|
"/etc/os-release": (
|
||||||
"PRETTY_NAME=\"CentOS Linux 7 (Core)\"\nANSI_COLOR=\"0;31\"\nCPE_NAME=\"cpe:/o:centos:centos:7\"\n"
|
"NAME=\"CentOS Linux\"\nVERSION=\"7 (Core)\"\nID=\"centos\"\nID_LIKE=\"rhel fedora\"\nVERSION_ID=\"7\"\n"
|
||||||
"HOME_URL=\"https://www.centos.org/\"\nBUG_REPORT_URL=\"https://bugs.centos.org/\"\n\nCENTOS_MANTISBT_PROJECT=\"CentOS-7\"\n"
|
"PRETTY_NAME=\"CentOS Linux 7 (Core)\"\nANSI_COLOR=\"0;31\"\nCPE_NAME=\"cpe:/o:centos:centos:7\"\n"
|
||||||
"CENTOS_MANTISBT_PROJECT_VERSION=\"7\"\nREDHAT_SUPPORT_PRODUCT=\"centos\"\nREDHAT_SUPPORT_PRODUCT_VERSION=\"7\"\n\n"),
|
"HOME_URL=\"https://www.centos.org/\"\nBUG_REPORT_URL=\"https://bugs.centos.org/\"\n\nCENTOS_MANTISBT_PROJECT=\"CentOS-7\"\n"
|
||||||
|
"CENTOS_MANTISBT_PROJECT_VERSION=\"7\"\nREDHAT_SUPPORT_PRODUCT=\"centos\"\nREDHAT_SUPPORT_PRODUCT_VERSION=\"7\"\n\n"
|
||||||
|
),
|
||||||
"/etc/system-release": "CentOS Linux release 7.2.1511 (Core) \n"
|
"/etc/system-release": "CentOS Linux release 7.2.1511 (Core) \n"
|
||||||
},
|
},
|
||||||
"name": "CentOS 7.2.1511",
|
"name": "CentOS 7.2.1511",
|
||||||
"result": {
|
"result": {
|
||||||
"distribution_release": "Core",
|
"distribution_release": "Core",
|
||||||
"distribution": "CentOS",
|
"distribution": "CentOS",
|
||||||
"distribution_major_version": "7",
|
"distribution_major_version": "7",
|
||||||
"os_family": "RedHat",
|
"os_family": "RedHat",
|
||||||
"distribution_version": "7.2.1511"
|
"distribution_version": "7.2.1511",
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "CentOS 6.7",
|
"name": "CentOS 6.7",
|
||||||
"platform.dist": [
|
"platform.dist": [
|
||||||
"centos",
|
"centos",
|
||||||
"6.7",
|
"6.7",
|
||||||
"Final"
|
"Final"
|
||||||
],
|
],
|
||||||
"input": {
|
"input": {
|
||||||
"/etc/redhat-release": "CentOS release 6.7 (Final)\n",
|
"/etc/redhat-release": "CentOS release 6.7 (Final)\n",
|
||||||
"/etc/lsb-release": ("LSB_VERSION=base-4.0-amd64:base-4.0-noarch:core-4.0-amd64:core-4.0-noarch:graphics-4.0-amd64:graphics-4.0-noarch:"
|
"/etc/lsb-release": (
|
||||||
"printing-4.0-amd64:printing-4.0-noarch\n"),
|
"LSB_VERSION=base-4.0-amd64:base-4.0-noarch:core-4.0-amd64:core-4.0-noarch:graphics-4.0-amd64:graphics-4.0-noarch:"
|
||||||
|
"printing-4.0-amd64:printing-4.0-noarch\n"
|
||||||
|
),
|
||||||
"/etc/system-release": "CentOS release 6.7 (Final)\n"
|
"/etc/system-release": "CentOS release 6.7 (Final)\n"
|
||||||
},
|
},
|
||||||
"result": {
|
"result": {
|
||||||
"distribution_release": "Final",
|
"distribution_release": "Final",
|
||||||
"distribution": "CentOS",
|
"distribution": "CentOS",
|
||||||
"distribution_major_version": "6",
|
"distribution_major_version": "6",
|
||||||
"os_family": "RedHat",
|
"os_family": "RedHat",
|
||||||
"distribution_version": "6.7"
|
"distribution_version": "6.7"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "RedHat 7.2",
|
"name": "RedHat 7.2",
|
||||||
"platform.dist": [
|
"platform.dist": [
|
||||||
"redhat",
|
"redhat",
|
||||||
"7.2",
|
"7.2",
|
||||||
"Maipo"
|
"Maipo"
|
||||||
],
|
],
|
||||||
"input": {
|
"input": {
|
||||||
"/etc/redhat-release": "Red Hat Enterprise Linux Server release 7.2 (Maipo)\n",
|
"/etc/redhat-release": "Red Hat Enterprise Linux Server release 7.2 (Maipo)\n",
|
||||||
"/etc/os-release": ("NAME=\"Red Hat Enterprise Linux Server\"\nVERSION=\"7.2 (Maipo)\"\nID=\"rhel\"\nID_LIKE=\"fedora\"\nVERSION_ID=\"7.2\"\n"
|
"/etc/os-release": (
|
||||||
"PRETTY_NAME=\"Red Hat Enterprise Linux Server 7.2 (Maipo)\"\nANSI_COLOR=\"0;31\"\n"
|
"NAME=\"Red Hat Enterprise Linux Server\"\nVERSION=\"7.2 (Maipo)\"\nID=\"rhel\"\nID_LIKE=\"fedora\"\nVERSION_ID=\"7.2\"\n"
|
||||||
"CPE_NAME=\"cpe:/o:redhat:enterprise_linux:7.2:GA:server\"\nHOME_URL=\"https://www.redhat.com/\"\n"
|
"PRETTY_NAME=\"Red Hat Enterprise Linux Server 7.2 (Maipo)\"\nANSI_COLOR=\"0;31\"\n"
|
||||||
"BUG_REPORT_URL=\"https://bugzilla.redhat.com/\"\n\nREDHAT_BUGZILLA_PRODUCT=\"Red Hat Enterprise Linux 7\"\n"
|
"CPE_NAME=\"cpe:/o:redhat:enterprise_linux:7.2:GA:server\"\nHOME_URL=\"https://www.redhat.com/\"\n"
|
||||||
"REDHAT_BUGZILLA_PRODUCT_VERSION=7.2\nREDHAT_SUPPORT_PRODUCT=\"Red Hat Enterprise Linux\"\n"
|
"BUG_REPORT_URL=\"https://bugzilla.redhat.com/\"\n\nREDHAT_BUGZILLA_PRODUCT=\"Red Hat Enterprise Linux 7\"\n"
|
||||||
"REDHAT_SUPPORT_PRODUCT_VERSION=\"7.2\"\n"),
|
"REDHAT_BUGZILLA_PRODUCT_VERSION=7.2\nREDHAT_SUPPORT_PRODUCT=\"Red Hat Enterprise Linux\"\n"
|
||||||
|
"REDHAT_SUPPORT_PRODUCT_VERSION=\"7.2\"\n"
|
||||||
|
),
|
||||||
"/etc/system-release": "Red Hat Enterprise Linux Server release 7.2 (Maipo)\n"
|
"/etc/system-release": "Red Hat Enterprise Linux Server release 7.2 (Maipo)\n"
|
||||||
},
|
},
|
||||||
"result": {
|
"result": {
|
||||||
"distribution_release": "Maipo",
|
"distribution_release": "Maipo",
|
||||||
"distribution": "RedHat",
|
"distribution": "RedHat",
|
||||||
"distribution_major_version": "7",
|
"distribution_major_version": "7",
|
||||||
"os_family": "RedHat",
|
"os_family": "RedHat",
|
||||||
"distribution_version": "7.2"
|
"distribution_version": "7.2"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "RedHat 6.7",
|
"name": "RedHat 6.7",
|
||||||
"platform.dist": [
|
"platform.dist": [
|
||||||
"redhat",
|
"redhat",
|
||||||
"6.7",
|
"6.7",
|
||||||
"Santiago"
|
"Santiago"
|
||||||
],
|
],
|
||||||
"input": {
|
"input": {
|
||||||
"/etc/redhat-release": "Red Hat Enterprise Linux Server release 6.7 (Santiago)\n",
|
"/etc/redhat-release": "Red Hat Enterprise Linux Server release 6.7 (Santiago)\n",
|
||||||
"/etc/lsb-release": ("LSB_VERSION=base-4.0-amd64:base-4.0-noarch:core-4.0-amd64:core-4.0-noarch:graphics-4.0-amd64:graphics-4.0-noarch:"
|
"/etc/lsb-release": (
|
||||||
"printing-4.0-amd64:printing-4.0-noarch\n"),
|
"LSB_VERSION=base-4.0-amd64:base-4.0-noarch:core-4.0-amd64:core-4.0-noarch:graphics-4.0-amd64:graphics-4.0-noarch:"
|
||||||
|
"printing-4.0-amd64:printing-4.0-noarch\n"
|
||||||
|
),
|
||||||
"/etc/system-release": "Red Hat Enterprise Linux Server release 6.7 (Santiago)\n"
|
"/etc/system-release": "Red Hat Enterprise Linux Server release 6.7 (Santiago)\n"
|
||||||
},
|
},
|
||||||
"result": {
|
"result": {
|
||||||
"distribution_release": "Santiago",
|
"distribution_release": "Santiago",
|
||||||
"distribution": "RedHat",
|
"distribution": "RedHat",
|
||||||
"distribution_major_version": "6",
|
"distribution_major_version": "6",
|
||||||
"os_family": "RedHat",
|
"os_family": "RedHat",
|
||||||
"distribution_version": "6.7"
|
"distribution_version": "6.7"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Virtuozzo 7.3",
|
"name": "Virtuozzo 7.3",
|
||||||
"platform.dist": [
|
"platform.dist": [
|
||||||
"redhat",
|
"redhat",
|
||||||
"7.3",
|
"7.3",
|
||||||
""
|
""
|
||||||
],
|
],
|
||||||
"input": {
|
"input": {
|
||||||
"/etc/redhat-release": "Virtuozzo Linux release 7.3\n",
|
"/etc/redhat-release": "Virtuozzo Linux release 7.3\n",
|
||||||
"/etc/os-release": ("NAME=\"Virtuozzo\"\n"
|
"/etc/os-release": (
|
||||||
"VERSION=\"7.0.3\"\n"
|
"NAME=\"Virtuozzo\"\n"
|
||||||
"ID=\"virtuozzo\"\n"
|
"VERSION=\"7.0.3\"\n"
|
||||||
"ID_LIKE=\"rhel fedora\"\n"
|
"ID=\"virtuozzo\"\n"
|
||||||
"VERSION_ID=\"7\"\n"
|
"ID_LIKE=\"rhel fedora\"\n"
|
||||||
"PRETTY_NAME=\"Virtuozzo release 7.0.3\"\n"
|
"VERSION_ID=\"7\"\n"
|
||||||
"ANSI_COLOR=\"0;31\"\n"
|
"PRETTY_NAME=\"Virtuozzo release 7.0.3\"\n"
|
||||||
"CPE_NAME=\"cpe:/o:virtuozzoproject:vz:7\"\n"
|
"ANSI_COLOR=\"0;31\"\n"
|
||||||
"HOME_URL=\"http://www.virtuozzo.com\"\n"
|
"CPE_NAME=\"cpe:/o:virtuozzoproject:vz:7\"\n"
|
||||||
"BUG_REPORT_URL=\"https://bugs.openvz.org/\"\n"),
|
"HOME_URL=\"http://www.virtuozzo.com\"\n"
|
||||||
|
"BUG_REPORT_URL=\"https://bugs.openvz.org/\"\n"
|
||||||
|
),
|
||||||
"/etc/system-release": "Virtuozzo release 7.0.3 (640)\n"
|
"/etc/system-release": "Virtuozzo release 7.0.3 (640)\n"
|
||||||
},
|
},
|
||||||
"result": {
|
"result": {
|
||||||
"distribution_release": "NA",
|
"distribution_release": "NA",
|
||||||
"distribution": "Virtuozzo",
|
"distribution": "Virtuozzo",
|
||||||
"distribution_major_version": "7",
|
"distribution_major_version": "7",
|
||||||
"os_family": "RedHat",
|
"os_family": "RedHat",
|
||||||
"distribution_version": "7.3"
|
"distribution_version": "7.3"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name" : "openSUSE Leap 42.1",
|
"name": "openSUSE Leap 42.1",
|
||||||
"input": {
|
"input": {
|
||||||
"/etc/os-release":
|
"/etc/os-release": """
|
||||||
"""
|
|
||||||
NAME="openSUSE Leap"
|
NAME="openSUSE Leap"
|
||||||
VERSION="42.1"
|
VERSION="42.1"
|
||||||
VERSION_ID="42.1"
|
VERSION_ID="42.1"
|
||||||
|
@ -170,16 +179,16 @@ CPE_NAME="cpe:/o:opensuse:opensuse:42.1"
|
||||||
BUG_REPORT_URL="https://bugs.opensuse.org"
|
BUG_REPORT_URL="https://bugs.opensuse.org"
|
||||||
HOME_URL="https://opensuse.org/"
|
HOME_URL="https://opensuse.org/"
|
||||||
ID_LIKE="suse"
|
ID_LIKE="suse"
|
||||||
""",
|
""",
|
||||||
"/etc/SuSE-release":"""
|
"/etc/SuSE-release": """
|
||||||
openSUSE 42.1 (x86_64)
|
openSUSE 42.1 (x86_64)
|
||||||
VERSION = 42.1
|
VERSION = 42.1
|
||||||
CODENAME = Malachite
|
CODENAME = Malachite
|
||||||
# /etc/SuSE-release is deprecated and will be removed in the future, use /etc/os-release instead
|
# /etc/SuSE-release is deprecated and will be removed in the future, use /etc/os-release instead
|
||||||
"""
|
"""
|
||||||
},
|
},
|
||||||
"platform.dist": ['SuSE', '42.1', 'x86_64'],
|
"platform.dist": ['SuSE', '42.1', 'x86_64'],
|
||||||
"result":{
|
"result": {
|
||||||
"distribution": "openSUSE Leap",
|
"distribution": "openSUSE Leap",
|
||||||
"distribution_major_version": "42",
|
"distribution_major_version": "42",
|
||||||
"distribution_release": "1",
|
"distribution_release": "1",
|
||||||
|
@ -189,12 +198,13 @@ CODENAME = Malachite
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
'name': 'openSUSE 13.2',
|
'name': 'openSUSE 13.2',
|
||||||
'input': {'/etc/SuSE-release': """openSUSE 13.2 (x86_64)
|
'input': {
|
||||||
|
'/etc/SuSE-release': """openSUSE 13.2 (x86_64)
|
||||||
VERSION = 13.2
|
VERSION = 13.2
|
||||||
CODENAME = Harlequin
|
CODENAME = Harlequin
|
||||||
# /etc/SuSE-release is deprecated and will be removed in the future, use /etc/os-release instead
|
# /etc/SuSE-release is deprecated and will be removed in the future, use /etc/os-release instead
|
||||||
""",
|
""",
|
||||||
'/etc/os-release': """NAME=openSUSE
|
'/etc/os-release': """NAME=openSUSE
|
||||||
VERSION="13.2 (Harlequin)"
|
VERSION="13.2 (Harlequin)"
|
||||||
VERSION_ID="13.2"
|
VERSION_ID="13.2"
|
||||||
PRETTY_NAME="openSUSE 13.2 (Harlequin) (x86_64)"
|
PRETTY_NAME="openSUSE 13.2 (Harlequin) (x86_64)"
|
||||||
|
@ -204,13 +214,16 @@ CPE_NAME="cpe:/o:opensuse:opensuse:13.2"
|
||||||
BUG_REPORT_URL="https://bugs.opensuse.org"
|
BUG_REPORT_URL="https://bugs.opensuse.org"
|
||||||
HOME_URL="https://opensuse.org/"
|
HOME_URL="https://opensuse.org/"
|
||||||
ID_LIKE="suse"
|
ID_LIKE="suse"
|
||||||
"""},
|
"""
|
||||||
|
},
|
||||||
'platform.dist': ('SuSE', '13.2', 'x86_64'),
|
'platform.dist': ('SuSE', '13.2', 'x86_64'),
|
||||||
'result': {'distribution': u'openSUSE',
|
'result': {
|
||||||
'distribution_major_version': u'13',
|
'distribution': u'openSUSE',
|
||||||
'distribution_release': u'2',
|
'distribution_major_version': u'13',
|
||||||
'os_family': u'Suse',
|
'distribution_release': u'2',
|
||||||
'distribution_version': u'13.2'}
|
'os_family': u'Suse',
|
||||||
|
'distribution_version': u'13.2'
|
||||||
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"platform.dist": [
|
"platform.dist": [
|
||||||
|
@ -219,9 +232,11 @@ ID_LIKE="suse"
|
||||||
""
|
""
|
||||||
],
|
],
|
||||||
"input": {
|
"input": {
|
||||||
"/etc/os-release": ("NAME=\"openSUSE Tumbleweed\"\n# VERSION=\"20160917\"\nID=opensuse\nID_LIKE=\"suse\"\nVERSION_ID=\"20160917\"\n"
|
"/etc/os-release": (
|
||||||
"PRETTY_NAME=\"openSUSE Tumbleweed\"\nANSI_COLOR=\"0;32\"\nCPE_NAME=\"cpe:/o:opensuse:tumbleweed:20160917\"\n"
|
"NAME=\"openSUSE Tumbleweed\"\n# VERSION=\"20160917\"\nID=opensuse\nID_LIKE=\"suse\"\nVERSION_ID=\"20160917\"\n"
|
||||||
"BUG_REPORT_URL=\"https://bugs.opensuse.org\"\nHOME_URL=\"https://www.opensuse.org/\"\n")
|
"PRETTY_NAME=\"openSUSE Tumbleweed\"\nANSI_COLOR=\"0;32\"\nCPE_NAME=\"cpe:/o:opensuse:tumbleweed:20160917\"\n"
|
||||||
|
"BUG_REPORT_URL=\"https://bugs.opensuse.org\"\nHOME_URL=\"https://www.opensuse.org/\"\n"
|
||||||
|
)
|
||||||
},
|
},
|
||||||
"name": "openSUSE Tumbleweed 20160917",
|
"name": "openSUSE Tumbleweed 20160917",
|
||||||
"result": {
|
"result": {
|
||||||
|
@ -235,14 +250,14 @@ ID_LIKE="suse"
|
||||||
{ # see https://github.com/ansible/ansible/issues/14837
|
{ # see https://github.com/ansible/ansible/issues/14837
|
||||||
"name": "SLES 11.3",
|
"name": "SLES 11.3",
|
||||||
"input": {
|
"input": {
|
||||||
"/etc/SuSE-release":"""
|
"/etc/SuSE-release": """
|
||||||
SUSE Linux Enterprise Server 11 (x86_64)
|
SUSE Linux Enterprise Server 11 (x86_64)
|
||||||
VERSION = 11
|
VERSION = 11
|
||||||
PATCHLEVEL = 3
|
PATCHLEVEL = 3
|
||||||
"""
|
"""
|
||||||
},
|
},
|
||||||
"platform.dist": ['SuSE', '11', 'x86_64'],
|
"platform.dist": ['SuSE', '11', 'x86_64'],
|
||||||
"result":{
|
"result": {
|
||||||
"distribution": "SLES",
|
"distribution": "SLES",
|
||||||
"distribution_major_version": "11",
|
"distribution_major_version": "11",
|
||||||
"distribution_release": "3",
|
"distribution_release": "3",
|
||||||
|
@ -253,12 +268,12 @@ PATCHLEVEL = 3
|
||||||
{ # see https://github.com/ansible/ansible/issues/14837
|
{ # see https://github.com/ansible/ansible/issues/14837
|
||||||
"name": "SLES 11.4",
|
"name": "SLES 11.4",
|
||||||
"input": {
|
"input": {
|
||||||
"/etc/SuSE-release":"""
|
"/etc/SuSE-release": """
|
||||||
SUSE Linux Enterprise Server 11 (x86_64)
|
SUSE Linux Enterprise Server 11 (x86_64)
|
||||||
VERSION = 11
|
VERSION = 11
|
||||||
PATCHLEVEL = 4
|
PATCHLEVEL = 4
|
||||||
""",
|
""",
|
||||||
"/etc/os-release":"""
|
"/etc/os-release": """
|
||||||
NAME="SLES"
|
NAME="SLES"
|
||||||
VERSION="11.4"
|
VERSION="11.4"
|
||||||
VERSION_ID="11.4"
|
VERSION_ID="11.4"
|
||||||
|
@ -266,7 +281,7 @@ PRETTY_NAME="SUSE Linux Enterprise Server 11 SP4"
|
||||||
ID="sles"
|
ID="sles"
|
||||||
ANSI_COLOR="0;32"
|
ANSI_COLOR="0;32"
|
||||||
CPE_NAME="cpe:/o:suse:sles:11:4"
|
CPE_NAME="cpe:/o:suse:sles:11:4"
|
||||||
""",
|
""",
|
||||||
},
|
},
|
||||||
"platform.dist": ['SuSE', '11', 'x86_64'],
|
"platform.dist": ['SuSE', '11', 'x86_64'],
|
||||||
"result":{
|
"result":{
|
||||||
|
@ -280,14 +295,14 @@ CPE_NAME="cpe:/o:suse:sles:11:4"
|
||||||
{ # see https://github.com/ansible/ansible/issues/14837
|
{ # see https://github.com/ansible/ansible/issues/14837
|
||||||
"name": "SLES 12 SP0",
|
"name": "SLES 12 SP0",
|
||||||
"input": {
|
"input": {
|
||||||
"/etc/SuSE-release":"""
|
"/etc/SuSE-release": """
|
||||||
SUSE Linux Enterprise Server 12 (x86_64)
|
SUSE Linux Enterprise Server 12 (x86_64)
|
||||||
VERSION = 12
|
VERSION = 12
|
||||||
PATCHLEVEL = 0
|
PATCHLEVEL = 0
|
||||||
# This file is deprecated and will be removed in a future service pack or release.
|
# This file is deprecated and will be removed in a future service pack or release.
|
||||||
# Please check /etc/os-release for details about this release.
|
# Please check /etc/os-release for details about this release.
|
||||||
""",
|
""",
|
||||||
"/etc/os-release":"""
|
"/etc/os-release": """
|
||||||
NAME="SLES"
|
NAME="SLES"
|
||||||
VERSION="12"
|
VERSION="12"
|
||||||
VERSION_ID="12"
|
VERSION_ID="12"
|
||||||
|
@ -295,10 +310,10 @@ PRETTY_NAME="SUSE Linux Enterprise Server 12"
|
||||||
ID="sles"
|
ID="sles"
|
||||||
ANSI_COLOR="0;32"
|
ANSI_COLOR="0;32"
|
||||||
CPE_NAME="cpe:/o:suse:sles:12"
|
CPE_NAME="cpe:/o:suse:sles:12"
|
||||||
""",
|
""",
|
||||||
},
|
},
|
||||||
"platform.dist": ['SuSE', '12', 'x86_64'],
|
"platform.dist": ['SuSE', '12', 'x86_64'],
|
||||||
"result":{
|
"result": {
|
||||||
"distribution": "SLES",
|
"distribution": "SLES",
|
||||||
"distribution_major_version": "12",
|
"distribution_major_version": "12",
|
||||||
"distribution_release": "0",
|
"distribution_release": "0",
|
||||||
|
@ -306,18 +321,17 @@ CPE_NAME="cpe:/o:suse:sles:12"
|
||||||
"distribution_version": "12",
|
"distribution_version": "12",
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
{ # see https://github.com/ansible/ansible/issues/14837
|
{ # see https://github.com/ansible/ansible/issues/14837
|
||||||
"name": "SLES 12 SP1",
|
"name": "SLES 12 SP1",
|
||||||
"input": {
|
"input": {
|
||||||
"/etc/SuSE-release":"""
|
"/etc/SuSE-release": """
|
||||||
SUSE Linux Enterprise Server 12 (x86_64)
|
SUSE Linux Enterprise Server 12 (x86_64)
|
||||||
VERSION = 12
|
VERSION = 12
|
||||||
PATCHLEVEL = 0
|
PATCHLEVEL = 0
|
||||||
# This file is deprecated and will be removed in a future service pack or release.
|
# This file is deprecated and will be removed in a future service pack or release.
|
||||||
# Please check /etc/os-release for details about this release.
|
# Please check /etc/os-release for details about this release.
|
||||||
""",
|
""",
|
||||||
"/etc/os-release":"""
|
"/etc/os-release": """
|
||||||
NAME="SLES"
|
NAME="SLES"
|
||||||
VERSION="12-SP1"
|
VERSION="12-SP1"
|
||||||
VERSION_ID="12.1"
|
VERSION_ID="12.1"
|
||||||
|
@ -340,20 +354,20 @@ CPE_NAME="cpe:/o:suse:sles:12:sp1"
|
||||||
{
|
{
|
||||||
"name": "Debian stretch/sid",
|
"name": "Debian stretch/sid",
|
||||||
"input": {
|
"input": {
|
||||||
"/etc/os-release":"""
|
"/etc/os-release": """
|
||||||
PRETTY_NAME="Debian GNU/Linux stretch/sid"
|
PRETTY_NAME="Debian GNU/Linux stretch/sid"
|
||||||
NAME="Debian GNU/Linux"
|
NAME="Debian GNU/Linux"
|
||||||
ID=debian
|
ID=debian
|
||||||
HOME_URL="https://www.debian.org/"
|
HOME_URL="https://www.debian.org/"
|
||||||
SUPPORT_URL="https://www.debian.org/support"
|
SUPPORT_URL="https://www.debian.org/support"
|
||||||
BUG_REPORT_URL="https://bugs.debian.org/"
|
BUG_REPORT_URL="https://bugs.debian.org/"
|
||||||
""",
|
""",
|
||||||
"/etc/debian_version":"""
|
"/etc/debian_version": """
|
||||||
stretch/sid
|
stretch/sid
|
||||||
""",
|
""",
|
||||||
},
|
},
|
||||||
"platform.dist": ('debian', 'stretch/sid', ''),
|
"platform.dist": ('debian', 'stretch/sid', ''),
|
||||||
"result":{
|
"result": {
|
||||||
"distribution": "Debian",
|
"distribution": "Debian",
|
||||||
"distribution_major_version": "stretch/sid",
|
"distribution_major_version": "stretch/sid",
|
||||||
"distribution_release": "NA",
|
"distribution_release": "NA",
|
||||||
|
@ -363,7 +377,8 @@ BUG_REPORT_URL="https://bugs.debian.org/"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
'name': "Debian 7.9",
|
'name': "Debian 7.9",
|
||||||
'input': {'/etc/os-release': """PRETTY_NAME="Debian GNU/Linux 7 (wheezy)"
|
'input': {
|
||||||
|
'/etc/os-release': """PRETTY_NAME="Debian GNU/Linux 7 (wheezy)"
|
||||||
NAME="Debian GNU/Linux"
|
NAME="Debian GNU/Linux"
|
||||||
VERSION_ID="7"
|
VERSION_ID="7"
|
||||||
VERSION="7 (wheezy)"
|
VERSION="7 (wheezy)"
|
||||||
|
@ -372,13 +387,16 @@ ANSI_COLOR="1;31"
|
||||||
HOME_URL="http://www.debian.org/"
|
HOME_URL="http://www.debian.org/"
|
||||||
SUPPORT_URL="http://www.debian.org/support/"
|
SUPPORT_URL="http://www.debian.org/support/"
|
||||||
BUG_REPORT_URL="http://bugs.debian.org/"
|
BUG_REPORT_URL="http://bugs.debian.org/"
|
||||||
"""},
|
"""
|
||||||
|
},
|
||||||
'platform.dist': ('debian', '7.9', ''),
|
'platform.dist': ('debian', '7.9', ''),
|
||||||
'result': {'distribution': u'Debian',
|
'result': {
|
||||||
'distribution_major_version': u'7',
|
'distribution': u'Debian',
|
||||||
'distribution_release': u'wheezy',
|
'distribution_major_version': u'7',
|
||||||
"os_family": "Debian",
|
'distribution_release': u'wheezy',
|
||||||
'distribution_version': u'7.9'}
|
"os_family": "Debian",
|
||||||
|
'distribution_version': u'7.9'
|
||||||
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"platform.dist": [
|
"platform.dist": [
|
||||||
|
@ -387,9 +405,11 @@ BUG_REPORT_URL="http://bugs.debian.org/"
|
||||||
"xenial"
|
"xenial"
|
||||||
],
|
],
|
||||||
"input": {
|
"input": {
|
||||||
"/etc/os-release": ("NAME=\"Ubuntu\"\nVERSION=\"16.04 LTS (Xenial Xerus)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 16.04 LTS\"\n"
|
"/etc/os-release": (
|
||||||
"VERSION_ID=\"16.04\"\nHOME_URL=\"http://www.ubuntu.com/\"\nSUPPORT_URL=\"http://help.ubuntu.com/\"\n"
|
"NAME=\"Ubuntu\"\nVERSION=\"16.04 LTS (Xenial Xerus)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 16.04 LTS\"\n"
|
||||||
"BUG_REPORT_URL=\"http://bugs.launchpad.net/ubuntu/\"\nUBUNTU_CODENAME=xenial\n"),
|
"VERSION_ID=\"16.04\"\nHOME_URL=\"http://www.ubuntu.com/\"\nSUPPORT_URL=\"http://help.ubuntu.com/\"\n"
|
||||||
|
"BUG_REPORT_URL=\"http://bugs.launchpad.net/ubuntu/\"\nUBUNTU_CODENAME=xenial\n"
|
||||||
|
),
|
||||||
"/etc/lsb-release": "DISTRIB_ID=Ubuntu\nDISTRIB_RELEASE=16.04\nDISTRIB_CODENAME=xenial\nDISTRIB_DESCRIPTION=\"Ubuntu 16.04 LTS\"\n"
|
"/etc/lsb-release": "DISTRIB_ID=Ubuntu\nDISTRIB_RELEASE=16.04\nDISTRIB_CODENAME=xenial\nDISTRIB_DESCRIPTION=\"Ubuntu 16.04 LTS\"\n"
|
||||||
},
|
},
|
||||||
"name": "Ubuntu 16.04",
|
"name": "Ubuntu 16.04",
|
||||||
|
@ -403,12 +423,13 @@ BUG_REPORT_URL="http://bugs.debian.org/"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
'name': "Ubuntu 14.04",
|
'name': "Ubuntu 14.04",
|
||||||
'input': {'/etc/lsb-release': """DISTRIB_ID=Ubuntu
|
'input': {
|
||||||
|
'/etc/lsb-release': """DISTRIB_ID=Ubuntu
|
||||||
DISTRIB_RELEASE=14.04
|
DISTRIB_RELEASE=14.04
|
||||||
DISTRIB_CODENAME=trusty
|
DISTRIB_CODENAME=trusty
|
||||||
DISTRIB_DESCRIPTION="Ubuntu 14.04.4 LTS"
|
DISTRIB_DESCRIPTION="Ubuntu 14.04.4 LTS"
|
||||||
""",
|
""",
|
||||||
'/etc/os-release': """NAME="Ubuntu"
|
'/etc/os-release': """NAME="Ubuntu"
|
||||||
VERSION="14.04.4 LTS, Trusty Tahr"
|
VERSION="14.04.4 LTS, Trusty Tahr"
|
||||||
ID=ubuntu
|
ID=ubuntu
|
||||||
ID_LIKE=debian
|
ID_LIKE=debian
|
||||||
|
@ -417,13 +438,16 @@ VERSION_ID="14.04"
|
||||||
HOME_URL="http://www.ubuntu.com/"
|
HOME_URL="http://www.ubuntu.com/"
|
||||||
SUPPORT_URL="http://help.ubuntu.com/"
|
SUPPORT_URL="http://help.ubuntu.com/"
|
||||||
BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"
|
BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"
|
||||||
"""},
|
"""
|
||||||
|
},
|
||||||
'platform.dist': ('Ubuntu', '14.04', 'trusty'),
|
'platform.dist': ('Ubuntu', '14.04', 'trusty'),
|
||||||
'result': {'distribution': u'Ubuntu',
|
'result': {
|
||||||
'distribution_major_version': u'14',
|
'distribution': u'Ubuntu',
|
||||||
'distribution_release': u'trusty',
|
'distribution_major_version': u'14',
|
||||||
"os_family": "Debian",
|
'distribution_release': u'trusty',
|
||||||
'distribution_version': u'14.04'}
|
"os_family": "Debian",
|
||||||
|
'distribution_version': u'14.04'
|
||||||
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
'name': "Ubuntu 12.04",
|
'name': "Ubuntu 12.04",
|
||||||
|
@ -470,7 +494,7 @@ VERSION_ID="12.04"
|
||||||
{
|
{
|
||||||
'name': 'Core OS',
|
'name': 'Core OS',
|
||||||
'input': {
|
'input': {
|
||||||
'/etc/os-release':"""
|
'/etc/os-release': """
|
||||||
NAME=CoreOS
|
NAME=CoreOS
|
||||||
ID=coreos
|
ID=coreos
|
||||||
VERSION=976.0.0
|
VERSION=976.0.0
|
||||||
|
@ -480,15 +504,15 @@ PRETTY_NAME="CoreOS 976.0.0 (Coeur Rouge)"
|
||||||
ANSI_COLOR="1;32"
|
ANSI_COLOR="1;32"
|
||||||
HOME_URL="https://coreos.com/"
|
HOME_URL="https://coreos.com/"
|
||||||
BUG_REPORT_URL="https://github.com/coreos/bugs/issues"
|
BUG_REPORT_URL="https://github.com/coreos/bugs/issues"
|
||||||
""",
|
""",
|
||||||
'/etc/lsb-release':"""DISTRIB_ID=CoreOS
|
'/etc/lsb-release': """DISTRIB_ID=CoreOS
|
||||||
DISTRIB_RELEASE=976.0.0
|
DISTRIB_RELEASE=976.0.0
|
||||||
DISTRIB_CODENAME="Coeur Rouge"
|
DISTRIB_CODENAME="Coeur Rouge"
|
||||||
DISTRIB_DESCRIPTION="CoreOS 976.0.0 (Coeur Rouge)"
|
DISTRIB_DESCRIPTION="CoreOS 976.0.0 (Coeur Rouge)"
|
||||||
""",
|
""",
|
||||||
},
|
},
|
||||||
'platform.dist': ('', '', ''),
|
'platform.dist': ('', '', ''),
|
||||||
'result' : {
|
'result': {
|
||||||
"distribution": "CoreOS",
|
"distribution": "CoreOS",
|
||||||
"distribution_major_version": "NA",
|
"distribution_major_version": "NA",
|
||||||
"distribution_release": "NA",
|
"distribution_release": "NA",
|
||||||
|
@ -679,87 +703,90 @@ DISTRIB_DESCRIPTION="CoreOS 976.0.0 (Coeur Rouge)"
|
||||||
},
|
},
|
||||||
"platform.system": "SunOS"
|
"platform.system": "SunOS"
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
"name": "Solaris 11.3",
|
"name": "Solaris 11.3",
|
||||||
"platform.dist": [
|
"platform.dist": [
|
||||||
"",
|
"",
|
||||||
"",
|
"",
|
||||||
""
|
""
|
||||||
],
|
],
|
||||||
"input": {
|
"input": {
|
||||||
"/etc/release": (" Oracle Solaris 11.3 X86\n Copyright (c) 1983, 2015, Oracle and/or its affiliates. "
|
"/etc/release": (
|
||||||
"All rights reserved.\n Assembled 06 October 2015\n")
|
" Oracle Solaris 11.3 X86\n Copyright (c) 1983, 2015, Oracle and/or its affiliates. "
|
||||||
},
|
"All rights reserved.\n Assembled 06 October 2015\n"
|
||||||
|
)
|
||||||
|
},
|
||||||
"platform.system": "SunOS",
|
"platform.system": "SunOS",
|
||||||
"result": {
|
"result": {
|
||||||
"distribution_release": "Oracle Solaris 11.3 X86",
|
"distribution_release": "Oracle Solaris 11.3 X86",
|
||||||
"distribution": "Solaris",
|
"distribution": "Solaris",
|
||||||
"os_family": "Solaris",
|
"os_family": "Solaris",
|
||||||
"distribution_version": "11.3"
|
"distribution_version": "11.3"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
"name": "Solaris 10",
|
"name": "Solaris 10",
|
||||||
"platform.dist": [
|
"platform.dist": [
|
||||||
"",
|
"",
|
||||||
"",
|
"",
|
||||||
""
|
""
|
||||||
],
|
],
|
||||||
"input": {
|
"input": {
|
||||||
"/etc/release": (" Oracle Solaris 10 1/13 s10x_u11wos_24a X86\n Copyright (c) 1983, 2013, Oracle and/or its affiliates. "
|
"/etc/release": (" Oracle Solaris 10 1/13 s10x_u11wos_24a X86\n Copyright (c) 1983, 2013, Oracle and/or its affiliates. "
|
||||||
"All rights reserved.\n Assembled 17 January 2013\n")
|
"All rights reserved.\n Assembled 17 January 2013\n")
|
||||||
},
|
},
|
||||||
"platform.system": "SunOS",
|
"platform.system": "SunOS",
|
||||||
"result": {
|
"result": {
|
||||||
"distribution_release": "Oracle Solaris 10 1/13 s10x_u11wos_24a X86",
|
"distribution_release": "Oracle Solaris 10 1/13 s10x_u11wos_24a X86",
|
||||||
"distribution": "Solaris",
|
"distribution": "Solaris",
|
||||||
"os_family": "Solaris",
|
"os_family": "Solaris",
|
||||||
"distribution_version": "10"
|
"distribution_version": "10"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
"name": "Fedora 22",
|
"name": "Fedora 22",
|
||||||
"platform.dist": [
|
"platform.dist": [
|
||||||
"fedora",
|
"fedora",
|
||||||
"22",
|
"22",
|
||||||
"Twenty Two"
|
"Twenty Two"
|
||||||
],
|
],
|
||||||
"input": {
|
"input": {
|
||||||
"/etc/redhat-release": "Fedora release 22 (Twenty Two)\n",
|
"/etc/redhat-release": "Fedora release 22 (Twenty Two)\n",
|
||||||
"/etc/os-release": ("NAME=Fedora\nVERSION=\"22 (Twenty Two)\"\nID=fedora\nVERSION_ID=22\nPRETTY_NAME=\"Fedora 22 (Twenty Two)\"\n"
|
"/etc/os-release": (
|
||||||
"ANSI_COLOR=\"0;34\"\nCPE_NAME=\"cpe:/o:fedoraproject:fedora:22\"\nHOME_URL=\"https://fedoraproject.org/\"\n"
|
"NAME=Fedora\nVERSION=\"22 (Twenty Two)\"\nID=fedora\nVERSION_ID=22\nPRETTY_NAME=\"Fedora 22 (Twenty Two)\"\n"
|
||||||
"BUG_REPORT_URL=\"https://bugzilla.redhat.com/\"\nREDHAT_BUGZILLA_PRODUCT=\"Fedora\"\nREDHAT_BUGZILLA_PRODUCT_VERSION=22\n"
|
"ANSI_COLOR=\"0;34\"\nCPE_NAME=\"cpe:/o:fedoraproject:fedora:22\"\nHOME_URL=\"https://fedoraproject.org/\"\n"
|
||||||
"REDHAT_SUPPORT_PRODUCT=\"Fedora\"\nREDHAT_SUPPORT_PRODUCT_VERSION=22\n"
|
"BUG_REPORT_URL=\"https://bugzilla.redhat.com/\"\nREDHAT_BUGZILLA_PRODUCT=\"Fedora\"\nREDHAT_BUGZILLA_PRODUCT_VERSION=22\n"
|
||||||
"PRIVACY_POLICY_URL=https://fedoraproject.org/wiki/Legal:PrivacyPolicy\n"),
|
"REDHAT_SUPPORT_PRODUCT=\"Fedora\"\nREDHAT_SUPPORT_PRODUCT_VERSION=22\n"
|
||||||
|
"PRIVACY_POLICY_URL=https://fedoraproject.org/wiki/Legal:PrivacyPolicy\n"
|
||||||
|
),
|
||||||
"/etc/system-release": "Fedora release 22 (Twenty Two)\n"
|
"/etc/system-release": "Fedora release 22 (Twenty Two)\n"
|
||||||
},
|
},
|
||||||
"result": {
|
"result": {
|
||||||
"distribution_release": "Twenty Two",
|
"distribution_release": "Twenty Two",
|
||||||
"distribution": "Fedora",
|
"distribution": "Fedora",
|
||||||
"distribution_major_version": "22",
|
"distribution_major_version": "22",
|
||||||
"os_family": "RedHat",
|
"os_family": "RedHat",
|
||||||
"distribution_version": "22"
|
"distribution_version": "22"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"platform.dist": [
|
"platform.dist": [
|
||||||
"fedora",
|
"fedora",
|
||||||
"25",
|
"25",
|
||||||
"Rawhide"
|
"Rawhide"
|
||||||
],
|
],
|
||||||
"input": {
|
"input": {
|
||||||
"/etc/redhat-release": "Fedora release 25 (Rawhide)\n",
|
"/etc/redhat-release": "Fedora release 25 (Rawhide)\n",
|
||||||
"/etc/os-release": ("NAME=Fedora\nVERSION=\"25 (Workstation Edition)\"\nID=fedora\nVERSION_ID=25\n"
|
"/etc/os-release": (
|
||||||
"PRETTY_NAME=\"Fedora 25 (Workstation Edition)\"\nANSI_COLOR=\"0;34\"\nCPE_NAME=\"cpe:/o:fedoraproject:fedora:25\"\n"
|
"NAME=Fedora\nVERSION=\"25 (Workstation Edition)\"\nID=fedora\nVERSION_ID=25\n"
|
||||||
"HOME_URL=\"https://fedoraproject.org/\"\nBUG_REPORT_URL=\"https://bugzilla.redhat.com/\"\n"
|
"PRETTY_NAME=\"Fedora 25 (Workstation Edition)\"\nANSI_COLOR=\"0;34\"\nCPE_NAME=\"cpe:/o:fedoraproject:fedora:25\"\n"
|
||||||
"REDHAT_BUGZILLA_PRODUCT=\"Fedora\"\nREDHAT_BUGZILLA_PRODUCT_VERSION=rawhide\nREDHAT_SUPPORT_PRODUCT=\"Fedora\"\n"
|
"HOME_URL=\"https://fedoraproject.org/\"\nBUG_REPORT_URL=\"https://bugzilla.redhat.com/\"\n"
|
||||||
"REDHAT_SUPPORT_PRODUCT_VERSION=rawhide\nPRIVACY_POLICY_URL=https://fedoraproject.org/wiki/Legal:PrivacyPolicy\n"
|
"REDHAT_BUGZILLA_PRODUCT=\"Fedora\"\nREDHAT_BUGZILLA_PRODUCT_VERSION=rawhide\nREDHAT_SUPPORT_PRODUCT=\"Fedora\"\n"
|
||||||
"VARIANT=\"Workstation Edition\"\nVARIANT_ID=workstation\n"),
|
"REDHAT_SUPPORT_PRODUCT_VERSION=rawhide\nPRIVACY_POLICY_URL=https://fedoraproject.org/wiki/Legal:PrivacyPolicy\n"
|
||||||
|
"VARIANT=\"Workstation Edition\"\nVARIANT_ID=workstation\n"
|
||||||
|
),
|
||||||
"/etc/system-release": "Fedora release 25 (Rawhide)\n"
|
"/etc/system-release": "Fedora release 25 (Rawhide)\n"
|
||||||
},
|
},
|
||||||
"name": "Fedora 25",
|
"name": "Fedora 25",
|
||||||
"result": {
|
"result": {
|
||||||
"distribution_release": "Rawhide",
|
"distribution_release": "Rawhide",
|
||||||
|
@ -767,9 +794,8 @@ DISTRIB_DESCRIPTION="CoreOS 976.0.0 (Coeur Rouge)"
|
||||||
"distribution_major_version": "25",
|
"distribution_major_version": "25",
|
||||||
"os_family": "RedHat",
|
"os_family": "RedHat",
|
||||||
"distribution_version": "25"
|
"distribution_version": "25"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
"platform.dist": [
|
"platform.dist": [
|
||||||
"",
|
"",
|
||||||
|
@ -787,9 +813,8 @@ DISTRIB_DESCRIPTION="CoreOS 976.0.0 (Coeur Rouge)"
|
||||||
"distribution_major_version": "NA",
|
"distribution_major_version": "NA",
|
||||||
"os_family": "SMGL",
|
"os_family": "SMGL",
|
||||||
"distribution_version": "NA"
|
"distribution_version": "NA"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
|
@ -815,6 +840,7 @@ def test_distribution_version(testcase):
|
||||||
|
|
||||||
_test_one_distribution(facts, module, testcase)
|
_test_one_distribution(facts, module, testcase)
|
||||||
|
|
||||||
|
|
||||||
def _test_one_distribution(facts, module, testcase):
|
def _test_one_distribution(facts, module, testcase):
|
||||||
"""run the test on one distribution testcase
|
"""run the test on one distribution testcase
|
||||||
|
|
||||||
|
@ -828,7 +854,7 @@ def _test_one_distribution(facts, module, testcase):
|
||||||
data = default
|
data = default
|
||||||
if fname in testcase['input']:
|
if fname in testcase['input']:
|
||||||
# for debugging
|
# for debugging
|
||||||
print('faked '+fname+' for '+testcase['name'])
|
print('faked %s for %s' % (fname, testcase['name']))
|
||||||
data = testcase['input'][fname].strip()
|
data = testcase['input'][fname].strip()
|
||||||
if strip and data is not None:
|
if strip and data is not None:
|
||||||
data = data.strip()
|
data = data.strip()
|
||||||
|
|
|
@ -189,7 +189,7 @@ LSBLK_OUTPUT = b"""
|
||||||
/dev/mapper/docker-253:1-1050967-pool
|
/dev/mapper/docker-253:1-1050967-pool
|
||||||
"""
|
"""
|
||||||
|
|
||||||
LSBLK_OUTPUT_2 = b"""
|
LSBLK_OUTPUT_2 = b"""
|
||||||
/dev/sda
|
/dev/sda
|
||||||
/dev/sda1 32caaec3-ef40-4691-a3b6-438c3f9bc1c0
|
/dev/sda1 32caaec3-ef40-4691-a3b6-438c3f9bc1c0
|
||||||
/dev/sda2 66Ojcd-ULtu-1cZa-Tywo-mx0d-RF4O-ysA9jK
|
/dev/sda2 66Ojcd-ULtu-1cZa-Tywo-mx0d-RF4O-ysA9jK
|
||||||
|
@ -244,166 +244,213 @@ grimlock.g.a:path_with'single_quotes /home/adrian/sshfs-grimlock-single-quote-2
|
||||||
grimlock.g.a:/mnt/data/foto's /home/adrian/fotos fuse.sshfs rw,nosuid,nodev,relatime,user_id=1000,group_id=1000 0 0
|
grimlock.g.a:/mnt/data/foto's /home/adrian/fotos fuse.sshfs rw,nosuid,nodev,relatime,user_id=1000,group_id=1000 0 0
|
||||||
"""
|
"""
|
||||||
|
|
||||||
MTAB_ENTRIES = \
|
MTAB_ENTRIES = [
|
||||||
[
|
[
|
||||||
['sysfs',
|
'sysfs',
|
||||||
'/sys',
|
'/sys',
|
||||||
'sysfs',
|
'sysfs',
|
||||||
'rw,seclabel,nosuid,nodev,noexec,relatime',
|
'rw,seclabel,nosuid,nodev,noexec,relatime',
|
||||||
'0',
|
'0',
|
||||||
'0'],
|
'0'
|
||||||
['proc', '/proc', 'proc', 'rw,nosuid,nodev,noexec,relatime', '0', '0'],
|
],
|
||||||
['devtmpfs',
|
['proc', '/proc', 'proc', 'rw,nosuid,nodev,noexec,relatime', '0', '0'],
|
||||||
'/dev',
|
[
|
||||||
'devtmpfs',
|
'devtmpfs',
|
||||||
'rw,seclabel,nosuid,size=8044400k,nr_inodes=2011100,mode=755',
|
'/dev',
|
||||||
'0',
|
'devtmpfs',
|
||||||
'0'],
|
'rw,seclabel,nosuid,size=8044400k,nr_inodes=2011100,mode=755',
|
||||||
['securityfs',
|
'0',
|
||||||
'/sys/kernel/security',
|
'0'
|
||||||
'securityfs',
|
],
|
||||||
'rw,nosuid,nodev,noexec,relatime',
|
[
|
||||||
'0',
|
'securityfs',
|
||||||
'0'],
|
'/sys/kernel/security',
|
||||||
['tmpfs', '/dev/shm', 'tmpfs', 'rw,seclabel,nosuid,nodev', '0', '0'],
|
'securityfs',
|
||||||
['devpts',
|
'rw,nosuid,nodev,noexec,relatime',
|
||||||
'/dev/pts',
|
'0',
|
||||||
'devpts',
|
'0'
|
||||||
'rw,seclabel,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000',
|
],
|
||||||
'0',
|
['tmpfs', '/dev/shm', 'tmpfs', 'rw,seclabel,nosuid,nodev', '0', '0'],
|
||||||
'0'],
|
[
|
||||||
['tmpfs', '/run', 'tmpfs', 'rw,seclabel,nosuid,nodev,mode=755', '0', '0'],
|
'devpts',
|
||||||
['tmpfs',
|
'/dev/pts',
|
||||||
'/sys/fs/cgroup',
|
'devpts',
|
||||||
'tmpfs',
|
'rw,seclabel,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000',
|
||||||
'ro,seclabel,nosuid,nodev,noexec,mode=755',
|
'0',
|
||||||
'0',
|
'0'
|
||||||
'0'],
|
],
|
||||||
['cgroup',
|
['tmpfs', '/run', 'tmpfs', 'rw,seclabel,nosuid,nodev,mode=755', '0', '0'],
|
||||||
'/sys/fs/cgroup/systemd',
|
[
|
||||||
'cgroup',
|
'tmpfs',
|
||||||
'rw,nosuid,nodev,noexec,relatime,xattr,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd',
|
'/sys/fs/cgroup',
|
||||||
'0',
|
'tmpfs',
|
||||||
'0'],
|
'ro,seclabel,nosuid,nodev,noexec,mode=755',
|
||||||
['pstore',
|
'0',
|
||||||
'/sys/fs/pstore',
|
'0'
|
||||||
'pstore',
|
],
|
||||||
'rw,seclabel,nosuid,nodev,noexec,relatime',
|
[
|
||||||
'0',
|
'cgroup',
|
||||||
'0'],
|
'/sys/fs/cgroup/systemd',
|
||||||
['cgroup',
|
'cgroup',
|
||||||
'/sys/fs/cgroup/devices',
|
'rw,nosuid,nodev,noexec,relatime,xattr,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd',
|
||||||
'cgroup',
|
'0',
|
||||||
'rw,nosuid,nodev,noexec,relatime,devices',
|
'0'
|
||||||
'0',
|
],
|
||||||
'0'],
|
[
|
||||||
['cgroup',
|
'pstore',
|
||||||
|
'/sys/fs/pstore',
|
||||||
|
'pstore',
|
||||||
|
'rw,seclabel,nosuid,nodev,noexec,relatime',
|
||||||
|
'0',
|
||||||
|
'0'
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'cgroup',
|
||||||
|
'/sys/fs/cgroup/devices',
|
||||||
|
'cgroup',
|
||||||
|
'rw,nosuid,nodev,noexec,relatime,devices',
|
||||||
|
'0',
|
||||||
|
'0'
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'cgroup',
|
||||||
'/sys/fs/cgroup/freezer',
|
'/sys/fs/cgroup/freezer',
|
||||||
'cgroup',
|
'cgroup',
|
||||||
'rw,nosuid,nodev,noexec,relatime,freezer',
|
'rw,nosuid,nodev,noexec,relatime,freezer',
|
||||||
'0',
|
'0',
|
||||||
'0'],
|
'0'
|
||||||
['cgroup',
|
],
|
||||||
|
[
|
||||||
|
'cgroup',
|
||||||
'/sys/fs/cgroup/memory',
|
'/sys/fs/cgroup/memory',
|
||||||
'cgroup',
|
'cgroup',
|
||||||
'rw,nosuid,nodev,noexec,relatime,memory',
|
'rw,nosuid,nodev,noexec,relatime,memory',
|
||||||
'0',
|
'0',
|
||||||
'0'],
|
'0'
|
||||||
['cgroup',
|
],
|
||||||
|
[
|
||||||
|
'cgroup',
|
||||||
'/sys/fs/cgroup/pids',
|
'/sys/fs/cgroup/pids',
|
||||||
'cgroup',
|
'cgroup',
|
||||||
'rw,nosuid,nodev,noexec,relatime,pids',
|
'rw,nosuid,nodev,noexec,relatime,pids',
|
||||||
'0',
|
'0',
|
||||||
'0'],
|
'0'
|
||||||
['cgroup',
|
],
|
||||||
|
[
|
||||||
|
'cgroup',
|
||||||
'/sys/fs/cgroup/blkio',
|
'/sys/fs/cgroup/blkio',
|
||||||
'cgroup',
|
'cgroup',
|
||||||
'rw,nosuid,nodev,noexec,relatime,blkio',
|
'rw,nosuid,nodev,noexec,relatime,blkio',
|
||||||
'0',
|
'0',
|
||||||
'0'],
|
'0'
|
||||||
['cgroup',
|
],
|
||||||
|
[
|
||||||
|
'cgroup',
|
||||||
'/sys/fs/cgroup/cpuset',
|
'/sys/fs/cgroup/cpuset',
|
||||||
'cgroup',
|
'cgroup',
|
||||||
'rw,nosuid,nodev,noexec,relatime,cpuset',
|
'rw,nosuid,nodev,noexec,relatime,cpuset',
|
||||||
'0',
|
'0',
|
||||||
'0'],
|
'0'
|
||||||
['cgroup',
|
],
|
||||||
|
[
|
||||||
|
'cgroup',
|
||||||
'/sys/fs/cgroup/cpu,cpuacct',
|
'/sys/fs/cgroup/cpu,cpuacct',
|
||||||
'cgroup',
|
'cgroup',
|
||||||
'rw,nosuid,nodev,noexec,relatime,cpu,cpuacct',
|
'rw,nosuid,nodev,noexec,relatime,cpu,cpuacct',
|
||||||
'0',
|
'0',
|
||||||
'0'],
|
'0'
|
||||||
['cgroup',
|
],
|
||||||
|
[
|
||||||
|
'cgroup',
|
||||||
'/sys/fs/cgroup/hugetlb',
|
'/sys/fs/cgroup/hugetlb',
|
||||||
'cgroup',
|
'cgroup',
|
||||||
'rw,nosuid,nodev,noexec,relatime,hugetlb',
|
'rw,nosuid,nodev,noexec,relatime,hugetlb',
|
||||||
'0',
|
'0',
|
||||||
'0'],
|
'0'
|
||||||
['cgroup',
|
],
|
||||||
|
[
|
||||||
|
'cgroup',
|
||||||
'/sys/fs/cgroup/perf_event',
|
'/sys/fs/cgroup/perf_event',
|
||||||
'cgroup',
|
'cgroup',
|
||||||
'rw,nosuid,nodev,noexec,relatime,perf_event',
|
'rw,nosuid,nodev,noexec,relatime,perf_event',
|
||||||
'0',
|
'0',
|
||||||
'0'],
|
'0'
|
||||||
['cgroup',
|
],
|
||||||
|
[
|
||||||
|
'cgroup',
|
||||||
'/sys/fs/cgroup/net_cls,net_prio',
|
'/sys/fs/cgroup/net_cls,net_prio',
|
||||||
'cgroup',
|
'cgroup',
|
||||||
'rw,nosuid,nodev,noexec,relatime,net_cls,net_prio',
|
'rw,nosuid,nodev,noexec,relatime,net_cls,net_prio',
|
||||||
'0',
|
'0',
|
||||||
'0'],
|
'0'
|
||||||
['configfs', '/sys/kernel/config', 'configfs', 'rw,relatime', '0', '0'],
|
],
|
||||||
['/dev/mapper/fedora_dhcp129--186-root',
|
['configfs', '/sys/kernel/config', 'configfs', 'rw,relatime', '0', '0'],
|
||||||
|
[
|
||||||
|
'/dev/mapper/fedora_dhcp129--186-root',
|
||||||
'/',
|
'/',
|
||||||
'ext4',
|
'ext4',
|
||||||
'rw,seclabel,relatime,data=ordered',
|
'rw,seclabel,relatime,data=ordered',
|
||||||
'0',
|
'0',
|
||||||
'0'],
|
'0'
|
||||||
['selinuxfs', '/sys/fs/selinux', 'selinuxfs', 'rw,relatime', '0', '0'],
|
],
|
||||||
['systemd-1',
|
['selinuxfs', '/sys/fs/selinux', 'selinuxfs', 'rw,relatime', '0', '0'],
|
||||||
|
[
|
||||||
|
'systemd-1',
|
||||||
'/proc/sys/fs/binfmt_misc',
|
'/proc/sys/fs/binfmt_misc',
|
||||||
'autofs',
|
'autofs',
|
||||||
'rw,relatime,fd=24,pgrp=1,timeout=0,minproto=5,maxproto=5,direct',
|
'rw,relatime,fd=24,pgrp=1,timeout=0,minproto=5,maxproto=5,direct',
|
||||||
'0',
|
'0',
|
||||||
'0'],
|
'0'
|
||||||
['debugfs', '/sys/kernel/debug', 'debugfs', 'rw,seclabel,relatime', '0', '0'],
|
],
|
||||||
['hugetlbfs',
|
['debugfs', '/sys/kernel/debug', 'debugfs', 'rw,seclabel,relatime', '0', '0'],
|
||||||
|
[
|
||||||
|
'hugetlbfs',
|
||||||
'/dev/hugepages',
|
'/dev/hugepages',
|
||||||
'hugetlbfs',
|
'hugetlbfs',
|
||||||
'rw,seclabel,relatime',
|
'rw,seclabel,relatime',
|
||||||
'0',
|
'0',
|
||||||
'0'],
|
'0'
|
||||||
['tmpfs', '/tmp', 'tmpfs', 'rw,seclabel', '0', '0'],
|
],
|
||||||
['mqueue', '/dev/mqueue', 'mqueue', 'rw,seclabel,relatime', '0', '0'],
|
['tmpfs', '/tmp', 'tmpfs', 'rw,seclabel', '0', '0'],
|
||||||
['/dev/loop0',
|
['mqueue', '/dev/mqueue', 'mqueue', 'rw,seclabel,relatime', '0', '0'],
|
||||||
|
[
|
||||||
|
'/dev/loop0',
|
||||||
'/var/lib/machines',
|
'/var/lib/machines',
|
||||||
'btrfs',
|
'btrfs',
|
||||||
'rw,seclabel,relatime,space_cache,subvolid=5,subvol=/',
|
'rw,seclabel,relatime,space_cache,subvolid=5,subvol=/',
|
||||||
'0',
|
'0',
|
||||||
'0'],
|
'0'
|
||||||
['/dev/sda1', '/boot', 'ext4', 'rw,seclabel,relatime,data=ordered', '0', '0'],
|
],
|
||||||
# A 'none' fstype
|
['/dev/sda1', '/boot', 'ext4', 'rw,seclabel,relatime,data=ordered', '0', '0'],
|
||||||
['/dev/sdz3', '/not/a/real/device', 'none', 'rw,seclabel,relatime,data=ordered', '0', '0'],
|
# A 'none' fstype
|
||||||
# lets assume this is a bindmount
|
['/dev/sdz3', '/not/a/real/device', 'none', 'rw,seclabel,relatime,data=ordered', '0', '0'],
|
||||||
['/dev/sdz4', '/not/a/real/bind_mount', 'ext4', 'rw,seclabel,relatime,data=ordered', '0', '0'],
|
# lets assume this is a bindmount
|
||||||
['/dev/mapper/fedora_dhcp129--186-home',
|
['/dev/sdz4', '/not/a/real/bind_mount', 'ext4', 'rw,seclabel,relatime,data=ordered', '0', '0'],
|
||||||
|
[
|
||||||
|
'/dev/mapper/fedora_dhcp129--186-home',
|
||||||
'/home',
|
'/home',
|
||||||
'ext4',
|
'ext4',
|
||||||
'rw,seclabel,relatime,data=ordered',
|
'rw,seclabel,relatime,data=ordered',
|
||||||
'0',
|
'0',
|
||||||
'0'],
|
'0'
|
||||||
['tmpfs',
|
],
|
||||||
|
[
|
||||||
|
'tmpfs',
|
||||||
'/run/user/1000',
|
'/run/user/1000',
|
||||||
'tmpfs',
|
'tmpfs',
|
||||||
'rw,seclabel,nosuid,nodev,relatime,size=1611044k,mode=700,uid=1000,gid=1000',
|
'rw,seclabel,nosuid,nodev,relatime,size=1611044k,mode=700,uid=1000,gid=1000',
|
||||||
'0',
|
'0',
|
||||||
'0'],
|
'0'
|
||||||
['gvfsd-fuse',
|
],
|
||||||
|
[
|
||||||
|
'gvfsd-fuse',
|
||||||
'/run/user/1000/gvfs',
|
'/run/user/1000/gvfs',
|
||||||
'fuse.gvfsd-fuse',
|
'fuse.gvfsd-fuse',
|
||||||
'rw,nosuid,nodev,relatime,user_id=1000,group_id=1000',
|
'rw,nosuid,nodev,relatime,user_id=1000,group_id=1000',
|
||||||
'0',
|
'0',
|
||||||
'0'],
|
'0'
|
||||||
['fusectl', '/sys/fs/fuse/connections', 'fusectl', 'rw,relatime', '0', '0']]
|
],
|
||||||
|
['fusectl', '/sys/fs/fuse/connections', 'fusectl', 'rw,relatime', '0', '0']]
|
||||||
|
|
||||||
BIND_MOUNTS = ['/not/a/real/bind_mount']
|
BIND_MOUNTS = ['/not/a/real/bind_mount']
|
||||||
|
|
||||||
|
@ -481,7 +528,7 @@ class TestFactsLinuxHardwareGetMountFacts(unittest.TestCase):
|
||||||
self.assertIsInstance(bind_mounts, set)
|
self.assertIsInstance(bind_mounts, set)
|
||||||
self.assertEqual(len(bind_mounts), 0)
|
self.assertEqual(len(bind_mounts), 0)
|
||||||
|
|
||||||
@patch('ansible.module_utils.facts.LinuxHardware._run_lsblk', return_value=(0, LSBLK_OUTPUT,''))
|
@patch('ansible.module_utils.facts.LinuxHardware._run_lsblk', return_value=(0, LSBLK_OUTPUT, ''))
|
||||||
def test_lsblk_uuid(self, mock_run_lsblk):
|
def test_lsblk_uuid(self, mock_run_lsblk):
|
||||||
module = Mock()
|
module = Mock()
|
||||||
lh = facts.LinuxHardware(module=module, load_on_init=False)
|
lh = facts.LinuxHardware(module=module, load_on_init=False)
|
||||||
|
@ -492,7 +539,7 @@ class TestFactsLinuxHardwareGetMountFacts(unittest.TestCase):
|
||||||
self.assertIn(b'/dev/sda1', lsblk_uuids)
|
self.assertIn(b'/dev/sda1', lsblk_uuids)
|
||||||
self.assertEquals(lsblk_uuids[b'/dev/sda1'], b'32caaec3-ef40-4691-a3b6-438c3f9bc1c0')
|
self.assertEquals(lsblk_uuids[b'/dev/sda1'], b'32caaec3-ef40-4691-a3b6-438c3f9bc1c0')
|
||||||
|
|
||||||
@patch('ansible.module_utils.facts.LinuxHardware._run_lsblk', return_value=(37, LSBLK_OUTPUT,''))
|
@patch('ansible.module_utils.facts.LinuxHardware._run_lsblk', return_value=(37, LSBLK_OUTPUT, ''))
|
||||||
def test_lsblk_uuid_non_zero(self, mock_run_lsblk):
|
def test_lsblk_uuid_non_zero(self, mock_run_lsblk):
|
||||||
module = Mock()
|
module = Mock()
|
||||||
lh = facts.LinuxHardware(module=module, load_on_init=False)
|
lh = facts.LinuxHardware(module=module, load_on_init=False)
|
||||||
|
@ -510,7 +557,7 @@ class TestFactsLinuxHardwareGetMountFacts(unittest.TestCase):
|
||||||
self.assertIsInstance(lsblk_uuids, dict)
|
self.assertIsInstance(lsblk_uuids, dict)
|
||||||
self.assertEquals(len(lsblk_uuids), 0)
|
self.assertEquals(len(lsblk_uuids), 0)
|
||||||
|
|
||||||
@patch('ansible.module_utils.facts.LinuxHardware._run_lsblk', return_value=(0, LSBLK_OUTPUT_2,''))
|
@patch('ansible.module_utils.facts.LinuxHardware._run_lsblk', return_value=(0, LSBLK_OUTPUT_2, ''))
|
||||||
def test_lsblk_uuid_dev_with_space_in_name(self, mock_run_lsblk):
|
def test_lsblk_uuid_dev_with_space_in_name(self, mock_run_lsblk):
|
||||||
module = Mock()
|
module = Mock()
|
||||||
lh = facts.LinuxHardware(module=module, load_on_init=False)
|
lh = facts.LinuxHardware(module=module, load_on_init=False)
|
||||||
|
|
|
@ -28,50 +28,73 @@ from units.mock.procenv import swap_stdin_and_argv
|
||||||
|
|
||||||
class TestAnsibleModuleKnownHosts(unittest.TestCase):
|
class TestAnsibleModuleKnownHosts(unittest.TestCase):
|
||||||
urls = {
|
urls = {
|
||||||
'ssh://one.example.org/example.git':
|
'ssh://one.example.org/example.git': {
|
||||||
{'is_ssh_url': True, 'get_fqdn': 'one.example.org',
|
'is_ssh_url': True,
|
||||||
'add_host_key_cmd': " -t rsa one.example.org",
|
'get_fqdn': 'one.example.org',
|
||||||
'port': None},
|
'add_host_key_cmd': " -t rsa one.example.org",
|
||||||
'ssh+git://two.example.org/example.git':
|
'port': None,
|
||||||
{'is_ssh_url': True, 'get_fqdn': 'two.example.org',
|
},
|
||||||
'add_host_key_cmd': " -t rsa two.example.org",
|
'ssh+git://two.example.org/example.git': {
|
||||||
'port': None},
|
'is_ssh_url': True,
|
||||||
'rsync://three.example.org/user/example.git':
|
'get_fqdn': 'two.example.org',
|
||||||
{'is_ssh_url': False, 'get_fqdn': 'three.example.org',
|
'add_host_key_cmd': " -t rsa two.example.org",
|
||||||
'add_host_key_cmd': None, # not called for non-ssh urls
|
'port': None,
|
||||||
'port': None},
|
},
|
||||||
'git@four.example.org:user/example.git':
|
'rsync://three.example.org/user/example.git': {
|
||||||
{'is_ssh_url': True, 'get_fqdn': 'four.example.org',
|
'is_ssh_url': False,
|
||||||
'add_host_key_cmd': " -t rsa four.example.org",
|
'get_fqdn': 'three.example.org',
|
||||||
'port': None},
|
'add_host_key_cmd': None, # not called for non-ssh urls
|
||||||
'git+ssh://five.example.org/example.git':
|
'port': None,
|
||||||
{'is_ssh_url': True, 'get_fqdn': 'five.example.org',
|
},
|
||||||
'add_host_key_cmd': " -t rsa five.example.org",
|
'git@four.example.org:user/example.git': {
|
||||||
'port': None},
|
'is_ssh_url': True,
|
||||||
'ssh://six.example.org:21/example.org': # ssh on FTP Port?
|
'get_fqdn': 'four.example.org',
|
||||||
{'is_ssh_url': True, 'get_fqdn': 'six.example.org',
|
'add_host_key_cmd': " -t rsa four.example.org",
|
||||||
'add_host_key_cmd': " -t rsa -p 21 six.example.org",
|
'port': None,
|
||||||
'port': '21'},
|
},
|
||||||
'ssh://[2001:DB8::abcd:abcd]/example.git':
|
'git+ssh://five.example.org/example.git': {
|
||||||
{'is_ssh_url': True, 'get_fqdn': '[2001:DB8::abcd:abcd]',
|
'is_ssh_url': True,
|
||||||
'add_host_key_cmd': " -t rsa [2001:DB8::abcd:abcd]",
|
'get_fqdn': 'five.example.org',
|
||||||
'port': None},
|
'add_host_key_cmd': " -t rsa five.example.org",
|
||||||
'ssh://[2001:DB8::abcd:abcd]:22/example.git':
|
'port': None,
|
||||||
{'is_ssh_url': True, 'get_fqdn': '[2001:DB8::abcd:abcd]',
|
},
|
||||||
'add_host_key_cmd': " -t rsa -p 22 [2001:DB8::abcd:abcd]",
|
'ssh://six.example.org:21/example.org': {
|
||||||
'port': '22'},
|
# ssh on FTP Port?
|
||||||
'username@[2001:DB8::abcd:abcd]/example.git':
|
'is_ssh_url': True,
|
||||||
{'is_ssh_url': True, 'get_fqdn': '[2001:DB8::abcd:abcd]',
|
'get_fqdn': 'six.example.org',
|
||||||
'add_host_key_cmd': " -t rsa [2001:DB8::abcd:abcd]",
|
'add_host_key_cmd': " -t rsa -p 21 six.example.org",
|
||||||
'port': None},
|
'port': '21',
|
||||||
'username@[2001:DB8::abcd:abcd]:path/example.git':
|
},
|
||||||
{'is_ssh_url': True, 'get_fqdn': '[2001:DB8::abcd:abcd]',
|
'ssh://[2001:DB8::abcd:abcd]/example.git': {
|
||||||
'add_host_key_cmd': " -t rsa [2001:DB8::abcd:abcd]",
|
'is_ssh_url': True,
|
||||||
'port': None},
|
'get_fqdn': '[2001:DB8::abcd:abcd]',
|
||||||
'ssh://internal.git.server:7999/repos/repo.git':
|
'add_host_key_cmd': " -t rsa [2001:DB8::abcd:abcd]",
|
||||||
{'is_ssh_url': True, 'get_fqdn': 'internal.git.server',
|
'port': None,
|
||||||
'add_host_key_cmd': " -t rsa -p 7999 internal.git.server",
|
},
|
||||||
'port': '7999'}
|
'ssh://[2001:DB8::abcd:abcd]:22/example.git': {
|
||||||
|
'is_ssh_url': True,
|
||||||
|
'get_fqdn': '[2001:DB8::abcd:abcd]',
|
||||||
|
'add_host_key_cmd': " -t rsa -p 22 [2001:DB8::abcd:abcd]",
|
||||||
|
'port': '22',
|
||||||
|
},
|
||||||
|
'username@[2001:DB8::abcd:abcd]/example.git': {
|
||||||
|
'is_ssh_url': True,
|
||||||
|
'get_fqdn': '[2001:DB8::abcd:abcd]',
|
||||||
|
'add_host_key_cmd': " -t rsa [2001:DB8::abcd:abcd]",
|
||||||
|
'port': None,
|
||||||
|
},
|
||||||
|
'username@[2001:DB8::abcd:abcd]:path/example.git': {
|
||||||
|
'is_ssh_url': True,
|
||||||
|
'get_fqdn': '[2001:DB8::abcd:abcd]',
|
||||||
|
'add_host_key_cmd': " -t rsa [2001:DB8::abcd:abcd]",
|
||||||
|
'port': None,
|
||||||
|
},
|
||||||
|
'ssh://internal.git.server:7999/repos/repo.git': {
|
||||||
|
'is_ssh_url': True,
|
||||||
|
'get_fqdn': 'internal.git.server',
|
||||||
|
'add_host_key_cmd': " -t rsa -p 7999 internal.git.server",
|
||||||
|
'port': '7999',
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
def test_is_ssh_url(self):
|
def test_is_ssh_url(self):
|
||||||
|
|
|
@ -14,6 +14,7 @@ import pprint
|
||||||
|
|
||||||
realimport = builtins.__import__
|
realimport = builtins.__import__
|
||||||
|
|
||||||
|
|
||||||
class TestPostgres(unittest.TestCase):
|
class TestPostgres(unittest.TestCase):
|
||||||
def clear_modules(self, mods):
|
def clear_modules(self, mods):
|
||||||
for mod in mods:
|
for mod in mods:
|
||||||
|
@ -72,4 +73,3 @@ class TestPostgres(unittest.TestCase):
|
||||||
with self.assertRaises(mod.module_utils.postgres.LibraryError) as context:
|
with self.assertRaises(mod.module_utils.postgres.LibraryError) as context:
|
||||||
mod.module_utils.postgres.ensure_libs(sslrootcert='yes')
|
mod.module_utils.postgres.ensure_libs(sslrootcert='yes')
|
||||||
self.assertIn('psycopg2 must be at least 2.4.3 in order to use', to_native(context.exception))
|
self.assertIn('psycopg2 must be at least 2.4.3 in order to use', to_native(context.exception))
|
||||||
|
|
||||||
|
|
|
@ -37,16 +37,19 @@ VALID_STRINGS = (
|
||||||
# u'くらとみ'
|
# u'くらとみ'
|
||||||
(b'\xe3\x81\x8f\xe3\x82\x89\xe3\x81\xa8\xe3\x81\xbf', u'\u304f\u3089\u3068\u307f', 'utf-8'),
|
(b'\xe3\x81\x8f\xe3\x82\x89\xe3\x81\xa8\xe3\x81\xbf', u'\u304f\u3089\u3068\u307f', 'utf-8'),
|
||||||
(b'\x82\xad\x82\xe7\x82\xc6\x82\xdd', u'\u304f\u3089\u3068\u307f', 'shift-jis'),
|
(b'\x82\xad\x82\xe7\x82\xc6\x82\xdd', u'\u304f\u3089\u3068\u307f', 'shift-jis'),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
def _check_to_text(self, in_string, encoding, expected):
|
def _check_to_text(self, in_string, encoding, expected):
|
||||||
"""test happy path of decoding to text"""
|
"""test happy path of decoding to text"""
|
||||||
self.assertEqual(to_text(in_string, encoding), expected)
|
self.assertEqual(to_text(in_string, encoding), expected)
|
||||||
|
|
||||||
|
|
||||||
def _check_to_bytes(self, in_string, encoding, expected):
|
def _check_to_bytes(self, in_string, encoding, expected):
|
||||||
"""test happy path of encoding to bytes"""
|
"""test happy path of encoding to bytes"""
|
||||||
self.assertEqual(to_bytes(in_string, encoding), expected)
|
self.assertEqual(to_bytes(in_string, encoding), expected)
|
||||||
|
|
||||||
|
|
||||||
def _check_to_native(self, in_string, encoding, py2_expected, py3_expected):
|
def _check_to_native(self, in_string, encoding, py2_expected, py3_expected):
|
||||||
"""test happy path of encoding to native strings"""
|
"""test happy path of encoding to native strings"""
|
||||||
if PY3:
|
if PY3:
|
||||||
|
|
|
@ -1,9 +1,6 @@
|
||||||
import pytest
|
import pytest
|
||||||
import unittest
|
import unittest
|
||||||
|
|
||||||
boto3 = pytest.importorskip("boto3")
|
|
||||||
botocore = pytest.importorskip("botocore")
|
|
||||||
|
|
||||||
from collections import namedtuple
|
from collections import namedtuple
|
||||||
from ansible.parsing.dataloader import DataLoader
|
from ansible.parsing.dataloader import DataLoader
|
||||||
from ansible.vars.manager import VariableManager
|
from ansible.vars.manager import VariableManager
|
||||||
|
@ -13,6 +10,10 @@ from ansible.executor.task_queue_manager import TaskQueueManager
|
||||||
|
|
||||||
import ansible.modules.cloud.amazon.ec2_vpc_nat_gateway as ng
|
import ansible.modules.cloud.amazon.ec2_vpc_nat_gateway as ng
|
||||||
|
|
||||||
|
|
||||||
|
boto3 = pytest.importorskip("boto3")
|
||||||
|
botocore = pytest.importorskip("botocore")
|
||||||
|
|
||||||
Options = (
|
Options = (
|
||||||
namedtuple(
|
namedtuple(
|
||||||
'Options', [
|
'Options', [
|
||||||
|
@ -44,6 +45,7 @@ aws_region = 'us-west-2'
|
||||||
inventory = InventoryManager(loader=loader)
|
inventory = InventoryManager(loader=loader)
|
||||||
variable_manager.set_inventory(inventory)
|
variable_manager.set_inventory(inventory)
|
||||||
|
|
||||||
|
|
||||||
def run(play):
|
def run(play):
|
||||||
tqm = None
|
tqm = None
|
||||||
results = None
|
results = None
|
||||||
|
@ -62,14 +64,15 @@ def run(play):
|
||||||
tqm.cleanup()
|
tqm.cleanup()
|
||||||
return tqm, results
|
return tqm, results
|
||||||
|
|
||||||
|
|
||||||
class AnsibleVpcNatGatewayTasks(unittest.TestCase):
|
class AnsibleVpcNatGatewayTasks(unittest.TestCase):
|
||||||
|
|
||||||
def test_create_gateway_using_allocation_id(self):
|
def test_create_gateway_using_allocation_id(self):
|
||||||
play_source = dict(
|
play_source = dict(
|
||||||
name = "Create new nat gateway with eip allocation-id",
|
name="Create new nat gateway with eip allocation-id",
|
||||||
hosts = 'localhost',
|
hosts='localhost',
|
||||||
gather_facts = 'no',
|
gather_facts='no',
|
||||||
tasks = [
|
tasks=[
|
||||||
dict(
|
dict(
|
||||||
action=dict(
|
action=dict(
|
||||||
module='ec2_vpc_nat_gateway',
|
module='ec2_vpc_nat_gateway',
|
||||||
|
@ -98,11 +101,11 @@ class AnsibleVpcNatGatewayTasks(unittest.TestCase):
|
||||||
self.failUnless(tqm._stats.changed['localhost'] == 1)
|
self.failUnless(tqm._stats.changed['localhost'] == 1)
|
||||||
|
|
||||||
def test_create_gateway_using_allocation_id_idempotent(self):
|
def test_create_gateway_using_allocation_id_idempotent(self):
|
||||||
play_source = dict(
|
play_source = dict(
|
||||||
name = "Create new nat gateway with eip allocation-id",
|
name="Create new nat gateway with eip allocation-id",
|
||||||
hosts = 'localhost',
|
hosts='localhost',
|
||||||
gather_facts = 'no',
|
gather_facts='no',
|
||||||
tasks = [
|
tasks=[
|
||||||
dict(
|
dict(
|
||||||
action=dict(
|
action=dict(
|
||||||
module='ec2_vpc_nat_gateway',
|
module='ec2_vpc_nat_gateway',
|
||||||
|
@ -131,11 +134,11 @@ class AnsibleVpcNatGatewayTasks(unittest.TestCase):
|
||||||
self.assertFalse('localhost' in tqm._stats.changed)
|
self.assertFalse('localhost' in tqm._stats.changed)
|
||||||
|
|
||||||
def test_create_gateway_using_eip_address(self):
|
def test_create_gateway_using_eip_address(self):
|
||||||
play_source = dict(
|
play_source = dict(
|
||||||
name = "Create new nat gateway with eip address",
|
name="Create new nat gateway with eip address",
|
||||||
hosts = 'localhost',
|
hosts='localhost',
|
||||||
gather_facts = 'no',
|
gather_facts='no',
|
||||||
tasks = [
|
tasks=[
|
||||||
dict(
|
dict(
|
||||||
action=dict(
|
action=dict(
|
||||||
module='ec2_vpc_nat_gateway',
|
module='ec2_vpc_nat_gateway',
|
||||||
|
@ -164,11 +167,11 @@ class AnsibleVpcNatGatewayTasks(unittest.TestCase):
|
||||||
self.failUnless(tqm._stats.changed['localhost'] == 1)
|
self.failUnless(tqm._stats.changed['localhost'] == 1)
|
||||||
|
|
||||||
def test_create_gateway_using_eip_address_idempotent(self):
|
def test_create_gateway_using_eip_address_idempotent(self):
|
||||||
play_source = dict(
|
play_source = dict(
|
||||||
name = "Create new nat gateway with eip address",
|
name="Create new nat gateway with eip address",
|
||||||
hosts = 'localhost',
|
hosts='localhost',
|
||||||
gather_facts = 'no',
|
gather_facts='no',
|
||||||
tasks = [
|
tasks=[
|
||||||
dict(
|
dict(
|
||||||
action=dict(
|
action=dict(
|
||||||
module='ec2_vpc_nat_gateway',
|
module='ec2_vpc_nat_gateway',
|
||||||
|
@ -197,11 +200,11 @@ class AnsibleVpcNatGatewayTasks(unittest.TestCase):
|
||||||
self.assertFalse('localhost' in tqm._stats.changed)
|
self.assertFalse('localhost' in tqm._stats.changed)
|
||||||
|
|
||||||
def test_create_gateway_in_subnet_only_if_one_does_not_exist_already(self):
|
def test_create_gateway_in_subnet_only_if_one_does_not_exist_already(self):
|
||||||
play_source = dict(
|
play_source = dict(
|
||||||
name = "Create new nat gateway only if one does not exist already",
|
name="Create new nat gateway only if one does not exist already",
|
||||||
hosts = 'localhost',
|
hosts='localhost',
|
||||||
gather_facts = 'no',
|
gather_facts='no',
|
||||||
tasks = [
|
tasks=[
|
||||||
dict(
|
dict(
|
||||||
action=dict(
|
action=dict(
|
||||||
module='ec2_vpc_nat_gateway',
|
module='ec2_vpc_nat_gateway',
|
||||||
|
@ -230,11 +233,11 @@ class AnsibleVpcNatGatewayTasks(unittest.TestCase):
|
||||||
self.assertFalse('localhost' in tqm._stats.changed)
|
self.assertFalse('localhost' in tqm._stats.changed)
|
||||||
|
|
||||||
def test_delete_gateway(self):
|
def test_delete_gateway(self):
|
||||||
play_source = dict(
|
play_source = dict(
|
||||||
name = "Delete Nat Gateway",
|
name="Delete Nat Gateway",
|
||||||
hosts = 'localhost',
|
hosts='localhost',
|
||||||
gather_facts = 'no',
|
gather_facts='no',
|
||||||
tasks = [
|
tasks=[
|
||||||
dict(
|
dict(
|
||||||
action=dict(
|
action=dict(
|
||||||
module='ec2_vpc_nat_gateway',
|
module='ec2_vpc_nat_gateway',
|
||||||
|
@ -262,6 +265,7 @@ class AnsibleVpcNatGatewayTasks(unittest.TestCase):
|
||||||
self.failUnless(tqm._stats.ok['localhost'] == 2)
|
self.failUnless(tqm._stats.ok['localhost'] == 2)
|
||||||
self.assertTrue('localhost' in tqm._stats.changed)
|
self.assertTrue('localhost' in tqm._stats.changed)
|
||||||
|
|
||||||
|
|
||||||
class AnsibleEc2VpcNatGatewayFunctions(unittest.TestCase):
|
class AnsibleEc2VpcNatGatewayFunctions(unittest.TestCase):
|
||||||
|
|
||||||
def test_get_nat_gateways(self):
|
def test_get_nat_gateways(self):
|
||||||
|
@ -326,7 +330,7 @@ class AnsibleEc2VpcNatGatewayFunctions(unittest.TestCase):
|
||||||
client = boto3.client('ec2', region_name=aws_region)
|
client = boto3.client('ec2', region_name=aws_region)
|
||||||
gws, err_msg = (
|
gws, err_msg = (
|
||||||
ng.gateway_in_subnet_exists(
|
ng.gateway_in_subnet_exists(
|
||||||
client, 'subnet-123456789', check_mode=True
|
client, 'subnet-123456789', check_mode=True
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
should_return = ng.DRY_RUN_GATEWAYS
|
should_return = ng.DRY_RUN_GATEWAYS
|
||||||
|
@ -336,7 +340,7 @@ class AnsibleEc2VpcNatGatewayFunctions(unittest.TestCase):
|
||||||
client = boto3.client('ec2', region_name=aws_region)
|
client = boto3.client('ec2', region_name=aws_region)
|
||||||
allocation_id, _ = (
|
allocation_id, _ = (
|
||||||
ng.get_eip_allocation_id_by_address(
|
ng.get_eip_allocation_id_by_address(
|
||||||
client, '55.55.55.55', check_mode=True
|
client, '55.55.55.55', check_mode=True
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
should_return = 'eipalloc-1234567'
|
should_return = 'eipalloc-1234567'
|
||||||
|
@ -346,7 +350,7 @@ class AnsibleEc2VpcNatGatewayFunctions(unittest.TestCase):
|
||||||
client = boto3.client('ec2', region_name=aws_region)
|
client = boto3.client('ec2', region_name=aws_region)
|
||||||
allocation_id, err_msg = (
|
allocation_id, err_msg = (
|
||||||
ng.get_eip_allocation_id_by_address(
|
ng.get_eip_allocation_id_by_address(
|
||||||
client, '52.52.52.52', check_mode=True
|
client, '52.52.52.52', check_mode=True
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
self.assertEqual(err_msg, 'EIP 52.52.52.52 does not exist')
|
self.assertEqual(err_msg, 'EIP 52.52.52.52 does not exist')
|
||||||
|
|
|
@ -19,42 +19,45 @@
|
||||||
# Make coding more python3-ish
|
# Make coding more python3-ish
|
||||||
from __future__ import (absolute_import, division, print_function)
|
from __future__ import (absolute_import, division, print_function)
|
||||||
|
|
||||||
import pytest
|
|
||||||
boto3 = pytest.importorskip("boto3")
|
|
||||||
|
|
||||||
import json
|
|
||||||
import copy
|
import copy
|
||||||
from ansible.module_utils._text import to_bytes
|
import json
|
||||||
from ansible.module_utils import basic
|
import pytest
|
||||||
|
|
||||||
from ansible.compat.tests.mock import MagicMock, Mock, patch
|
from ansible.compat.tests.mock import MagicMock, Mock, patch
|
||||||
|
from ansible.module_utils import basic
|
||||||
|
from ansible.module_utils._text import to_bytes
|
||||||
|
|
||||||
|
|
||||||
|
boto3 = pytest.importorskip("boto3")
|
||||||
|
|
||||||
# lambda is a keyword so we have to hack this.
|
# lambda is a keyword so we have to hack this.
|
||||||
_temp = __import__("ansible.modules.cloud.amazon.lambda")
|
_temp = __import__("ansible.modules.cloud.amazon.lambda")
|
||||||
lda = getattr(_temp.modules.cloud.amazon,"lambda")
|
lda = getattr(_temp.modules.cloud.amazon, "lambda")
|
||||||
|
|
||||||
|
|
||||||
def set_module_args(args):
|
def set_module_args(args):
|
||||||
args = json.dumps({'ANSIBLE_MODULE_ARGS': args})
|
args = json.dumps({'ANSIBLE_MODULE_ARGS': args})
|
||||||
basic._ANSIBLE_ARGS = to_bytes(args)
|
basic._ANSIBLE_ARGS = to_bytes(args)
|
||||||
|
|
||||||
base_lambda_config={
|
base_lambda_config = {
|
||||||
'FunctionName' : 'lambda_name',
|
'FunctionName': 'lambda_name',
|
||||||
'Role' : 'arn:aws:iam::987654321012:role/lambda_basic_execution',
|
'Role': 'arn:aws:iam::987654321012:role/lambda_basic_execution',
|
||||||
'Handler' : 'lambda_python.my_handler',
|
'Handler': 'lambda_python.my_handler',
|
||||||
'Description' : 'this that the other',
|
'Description': 'this that the other',
|
||||||
'Timeout' : 3,
|
'Timeout': 3,
|
||||||
'MemorySize' : 128,
|
'MemorySize': 128,
|
||||||
'Runtime' : 'python2.7',
|
'Runtime': 'python2.7',
|
||||||
'CodeSha256' : 'AqMZ+xptM7aC9VXu+5jyp1sqO+Nj4WFMNzQxtPMP2n8=',
|
'CodeSha256': 'AqMZ+xptM7aC9VXu+5jyp1sqO+Nj4WFMNzQxtPMP2n8=',
|
||||||
}
|
}
|
||||||
|
|
||||||
one_change_lambda_config=copy.copy(base_lambda_config)
|
one_change_lambda_config = copy.copy(base_lambda_config)
|
||||||
one_change_lambda_config['Timeout']=4
|
one_change_lambda_config['Timeout'] = 4
|
||||||
two_change_lambda_config=copy.copy(one_change_lambda_config)
|
two_change_lambda_config = copy.copy(one_change_lambda_config)
|
||||||
two_change_lambda_config['Role']='arn:aws:iam::987654321012:role/lambda_advanced_execution'
|
two_change_lambda_config['Role'] = 'arn:aws:iam::987654321012:role/lambda_advanced_execution'
|
||||||
code_change_lambda_config=copy.copy(base_lambda_config)
|
code_change_lambda_config = copy.copy(base_lambda_config)
|
||||||
code_change_lambda_config['CodeSha256']='P+Zy8U4T4RiiHWElhL10VBKj9jw4rSJ5bm/TiW+4Rts='
|
code_change_lambda_config['CodeSha256'] = 'P+Zy8U4T4RiiHWElhL10VBKj9jw4rSJ5bm/TiW+4Rts='
|
||||||
|
|
||||||
base_module_args={
|
base_module_args = {
|
||||||
"region": "us-west-1",
|
"region": "us-west-1",
|
||||||
"name": "lambda_name",
|
"name": "lambda_name",
|
||||||
"state": "present",
|
"state": "present",
|
||||||
|
@ -62,10 +65,10 @@ base_module_args={
|
||||||
"runtime": 'python2.7',
|
"runtime": 'python2.7',
|
||||||
"role": 'arn:aws:iam::987654321012:role/lambda_basic_execution',
|
"role": 'arn:aws:iam::987654321012:role/lambda_basic_execution',
|
||||||
"memory_size": 128,
|
"memory_size": 128,
|
||||||
"timeout" : 3,
|
"timeout": 3,
|
||||||
"handler": 'lambda_python.my_handler'
|
"handler": 'lambda_python.my_handler'
|
||||||
}
|
}
|
||||||
module_args_with_environment=dict(base_module_args, environment_variables={
|
module_args_with_environment = dict(base_module_args, environment_variables={
|
||||||
"variable_name": "variable_value"
|
"variable_name": "variable_value"
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@ -78,26 +81,27 @@ def make_mock_no_connection_connection(config):
|
||||||
)
|
)
|
||||||
lambda_client_double.update_function_configuration.configure_mock(
|
lambda_client_double.update_function_configuration.configure_mock(
|
||||||
return_value={
|
return_value={
|
||||||
'Version' : 1
|
'Version': 1
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
fake_boto3_conn=Mock(return_value=lambda_client_double)
|
fake_boto3_conn = Mock(return_value=lambda_client_double)
|
||||||
return (fake_boto3_conn, lambda_client_double)
|
return (fake_boto3_conn, lambda_client_double)
|
||||||
|
|
||||||
|
|
||||||
def make_mock_connection(config):
|
def make_mock_connection(config):
|
||||||
"""return a mock of ansible's boto3_conn ready to return a mock AWS API client"""
|
"""return a mock of ansible's boto3_conn ready to return a mock AWS API client"""
|
||||||
lambda_client_double = MagicMock()
|
lambda_client_double = MagicMock()
|
||||||
lambda_client_double.get_function.configure_mock(
|
lambda_client_double.get_function.configure_mock(
|
||||||
return_value={
|
return_value={
|
||||||
'Configuration' : config
|
'Configuration': config
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
lambda_client_double.update_function_configuration.configure_mock(
|
lambda_client_double.update_function_configuration.configure_mock(
|
||||||
return_value={
|
return_value={
|
||||||
'Version' : 1
|
'Version': 1
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
fake_boto3_conn=Mock(return_value=lambda_client_double)
|
fake_boto3_conn = Mock(return_value=lambda_client_double)
|
||||||
return (fake_boto3_conn, lambda_client_double)
|
return (fake_boto3_conn, lambda_client_double)
|
||||||
|
|
||||||
|
|
||||||
|
@ -111,13 +115,13 @@ def fail_json_double(*args, **kwargs):
|
||||||
raise AnsibleFailJson(kwargs)
|
raise AnsibleFailJson(kwargs)
|
||||||
|
|
||||||
|
|
||||||
#TODO: def test_handle_different_types_in_config_params():
|
# TODO: def test_handle_different_types_in_config_params():
|
||||||
|
|
||||||
|
|
||||||
def test_create_lambda_if_not_exist():
|
def test_create_lambda_if_not_exist():
|
||||||
|
|
||||||
set_module_args(base_module_args)
|
set_module_args(base_module_args)
|
||||||
(boto3_conn_double, lambda_client_double)=make_mock_no_connection_connection(code_change_lambda_config)
|
(boto3_conn_double, lambda_client_double) = make_mock_no_connection_connection(code_change_lambda_config)
|
||||||
|
|
||||||
with patch.object(lda, 'boto3_conn', boto3_conn_double):
|
with patch.object(lda, 'boto3_conn', boto3_conn_double):
|
||||||
try:
|
try:
|
||||||
|
@ -133,7 +137,7 @@ def test_create_lambda_if_not_exist():
|
||||||
"update lambda function code when function should have been created only"
|
"update lambda function code when function should have been created only"
|
||||||
assert(len(lambda_client_double.create_function.mock_calls) > 0), \
|
assert(len(lambda_client_double.create_function.mock_calls) > 0), \
|
||||||
"failed to call create_function "
|
"failed to call create_function "
|
||||||
(create_args, create_kwargs)=lambda_client_double.create_function.call_args
|
(create_args, create_kwargs) = lambda_client_double.create_function.call_args
|
||||||
assert (len(create_kwargs) > 0), "expected create called with keyword args, none found"
|
assert (len(create_kwargs) > 0), "expected create called with keyword args, none found"
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
@ -143,12 +147,13 @@ def test_create_lambda_if_not_exist():
|
||||||
create_kwargs["Environment"]
|
create_kwargs["Environment"]
|
||||||
raise(Exception("Environment sent to boto when none expected"))
|
raise(Exception("Environment sent to boto when none expected"))
|
||||||
except KeyError:
|
except KeyError:
|
||||||
pass #We are happy, no environment is fine
|
pass # We are happy, no environment is fine
|
||||||
|
|
||||||
|
|
||||||
def test_update_lambda_if_code_changed():
|
def test_update_lambda_if_code_changed():
|
||||||
|
|
||||||
set_module_args(base_module_args)
|
set_module_args(base_module_args)
|
||||||
(boto3_conn_double, lambda_client_double)=make_mock_connection(code_change_lambda_config)
|
(boto3_conn_double, lambda_client_double) = make_mock_connection(code_change_lambda_config)
|
||||||
|
|
||||||
with patch.object(lda, 'boto3_conn', boto3_conn_double):
|
with patch.object(lda, 'boto3_conn', boto3_conn_double):
|
||||||
try:
|
try:
|
||||||
|
@ -169,10 +174,11 @@ def test_update_lambda_if_code_changed():
|
||||||
assert(len(lambda_client_double.update_function_code.mock_calls) < 3), \
|
assert(len(lambda_client_double.update_function_code.mock_calls) < 3), \
|
||||||
"lambda function code update called multiple times when only one time should be needed"
|
"lambda function code update called multiple times when only one time should be needed"
|
||||||
|
|
||||||
|
|
||||||
def test_update_lambda_if_config_changed():
|
def test_update_lambda_if_config_changed():
|
||||||
|
|
||||||
set_module_args(base_module_args)
|
set_module_args(base_module_args)
|
||||||
(boto3_conn_double,lambda_client_double)=make_mock_connection(two_change_lambda_config)
|
(boto3_conn_double, lambda_client_double) = make_mock_connection(two_change_lambda_config)
|
||||||
|
|
||||||
with patch.object(lda, 'boto3_conn', boto3_conn_double):
|
with patch.object(lda, 'boto3_conn', boto3_conn_double):
|
||||||
try:
|
try:
|
||||||
|
@ -189,10 +195,11 @@ def test_update_lambda_if_config_changed():
|
||||||
assert(len(lambda_client_double.update_function_code.mock_calls) == 0), \
|
assert(len(lambda_client_double.update_function_code.mock_calls) == 0), \
|
||||||
"updated lambda code when no change should have happened"
|
"updated lambda code when no change should have happened"
|
||||||
|
|
||||||
|
|
||||||
def test_update_lambda_if_only_one_config_item_changed():
|
def test_update_lambda_if_only_one_config_item_changed():
|
||||||
|
|
||||||
set_module_args(base_module_args)
|
set_module_args(base_module_args)
|
||||||
(boto3_conn_double,lambda_client_double)=make_mock_connection(one_change_lambda_config)
|
(boto3_conn_double, lambda_client_double) = make_mock_connection(one_change_lambda_config)
|
||||||
|
|
||||||
with patch.object(lda, 'boto3_conn', boto3_conn_double):
|
with patch.object(lda, 'boto3_conn', boto3_conn_double):
|
||||||
try:
|
try:
|
||||||
|
@ -209,10 +216,11 @@ def test_update_lambda_if_only_one_config_item_changed():
|
||||||
assert(len(lambda_client_double.update_function_code.mock_calls) == 0), \
|
assert(len(lambda_client_double.update_function_code.mock_calls) == 0), \
|
||||||
"updated lambda code when no change should have happened"
|
"updated lambda code when no change should have happened"
|
||||||
|
|
||||||
|
|
||||||
def test_update_lambda_if_added_environment_variable():
|
def test_update_lambda_if_added_environment_variable():
|
||||||
|
|
||||||
set_module_args(module_args_with_environment)
|
set_module_args(module_args_with_environment)
|
||||||
(boto3_conn_double,lambda_client_double)=make_mock_connection(base_lambda_config)
|
(boto3_conn_double, lambda_client_double) = make_mock_connection(base_lambda_config)
|
||||||
|
|
||||||
with patch.object(lda, 'boto3_conn', boto3_conn_double):
|
with patch.object(lda, 'boto3_conn', boto3_conn_double):
|
||||||
try:
|
try:
|
||||||
|
@ -229,14 +237,14 @@ def test_update_lambda_if_added_environment_variable():
|
||||||
assert(len(lambda_client_double.update_function_code.mock_calls) == 0), \
|
assert(len(lambda_client_double.update_function_code.mock_calls) == 0), \
|
||||||
"updated lambda code when no change should have happened"
|
"updated lambda code when no change should have happened"
|
||||||
|
|
||||||
(update_args, update_kwargs)=lambda_client_double.update_function_configuration.call_args
|
(update_args, update_kwargs) = lambda_client_double.update_function_configuration.call_args
|
||||||
assert (len(update_kwargs) > 0), "expected update configuration called with keyword args, none found"
|
assert (len(update_kwargs) > 0), "expected update configuration called with keyword args, none found"
|
||||||
assert update_kwargs['Environment']['Variables'] == module_args_with_environment['environment_variables']
|
assert update_kwargs['Environment']['Variables'] == module_args_with_environment['environment_variables']
|
||||||
|
|
||||||
def test_dont_update_lambda_if_nothing_changed():
|
|
||||||
|
|
||||||
|
def test_dont_update_lambda_if_nothing_changed():
|
||||||
set_module_args(base_module_args)
|
set_module_args(base_module_args)
|
||||||
(boto3_conn_double,lambda_client_double)=make_mock_connection(base_lambda_config)
|
(boto3_conn_double, lambda_client_double) = make_mock_connection(base_lambda_config)
|
||||||
|
|
||||||
with patch.object(lda, 'boto3_conn', boto3_conn_double):
|
with patch.object(lda, 'boto3_conn', boto3_conn_double):
|
||||||
try:
|
try:
|
||||||
|
@ -248,9 +256,10 @@ def test_dont_update_lambda_if_nothing_changed():
|
||||||
assert(len(boto3_conn_double.mock_calls) == 1), "multiple boto connections used unexpectedly"
|
assert(len(boto3_conn_double.mock_calls) == 1), "multiple boto connections used unexpectedly"
|
||||||
assert(len(lambda_client_double.update_function_configuration.mock_calls) == 0), \
|
assert(len(lambda_client_double.update_function_configuration.mock_calls) == 0), \
|
||||||
"updated lambda function when no configuration changed"
|
"updated lambda function when no configuration changed"
|
||||||
assert(len(lambda_client_double.update_function_code.mock_calls) == 0 ), \
|
assert(len(lambda_client_double.update_function_code.mock_calls) == 0), \
|
||||||
"updated lambda code when no change should have happened"
|
"updated lambda code when no change should have happened"
|
||||||
|
|
||||||
|
|
||||||
def test_warn_region_not_specified():
|
def test_warn_region_not_specified():
|
||||||
|
|
||||||
set_module_args({
|
set_module_args({
|
||||||
|
@ -263,7 +272,7 @@ def test_warn_region_not_specified():
|
||||||
"role": 'arn:aws:iam::987654321012:role/lambda_basic_execution',
|
"role": 'arn:aws:iam::987654321012:role/lambda_basic_execution',
|
||||||
"handler": 'lambda_python.my_handler'})
|
"handler": 'lambda_python.my_handler'})
|
||||||
|
|
||||||
get_aws_connection_info_double=Mock(return_value=(None,None,None))
|
get_aws_connection_info_double = Mock(return_value=(None, None, None))
|
||||||
|
|
||||||
with patch.object(lda, 'get_aws_connection_info', get_aws_connection_info_double):
|
with patch.object(lda, 'get_aws_connection_info', get_aws_connection_info_double):
|
||||||
with patch.object(basic.AnsibleModule, 'fail_json', fail_json_double):
|
with patch.object(basic.AnsibleModule, 'fail_json', fail_json_double):
|
||||||
|
|
|
@ -1,10 +1,12 @@
|
||||||
import pytest
|
import pytest
|
||||||
boto = pytest.importorskip("boto")
|
|
||||||
|
|
||||||
import unittest
|
import unittest
|
||||||
|
|
||||||
import ansible.modules.cloud.amazon.s3 as s3
|
import ansible.modules.cloud.amazon.s3 as s3
|
||||||
from ansible.module_utils.six.moves.urllib.parse import urlparse
|
from ansible.module_utils.six.moves.urllib.parse import urlparse
|
||||||
|
|
||||||
|
boto = pytest.importorskip("boto")
|
||||||
|
|
||||||
|
|
||||||
class TestUrlparse(unittest.TestCase):
|
class TestUrlparse(unittest.TestCase):
|
||||||
|
|
||||||
def test_urlparse(self):
|
def test_urlparse(self):
|
||||||
|
@ -19,16 +21,16 @@ class TestUrlparse(unittest.TestCase):
|
||||||
|
|
||||||
def test_is_walrus(self):
|
def test_is_walrus(self):
|
||||||
actual = s3.is_walrus("trulywalrus_but_invalid_url")
|
actual = s3.is_walrus("trulywalrus_but_invalid_url")
|
||||||
#I don't know if this makes sense, but this is the current behaviour...
|
# I don't know if this makes sense, but this is the current behaviour...
|
||||||
self.assertEqual(True, actual)
|
self.assertEqual(True, actual)
|
||||||
actual = s3.is_walrus("http://notwalrus.amazonaws.com")
|
actual = s3.is_walrus("http://notwalrus.amazonaws.com")
|
||||||
self.assertEqual(False, actual)
|
self.assertEqual(False, actual)
|
||||||
|
|
||||||
def test_get_s3_connection(self):
|
def test_get_s3_connection(self):
|
||||||
aws_connect_kwargs = dict(aws_access_key_id="access_key",
|
aws_connect_kwargs = dict(aws_access_key_id="access_key",
|
||||||
aws_secret_access_key="secret_key")
|
aws_secret_access_key="secret_key")
|
||||||
location=None
|
location = None
|
||||||
rgw=True
|
rgw = True
|
||||||
s3_url="http://bla.blubb"
|
s3_url = "http://bla.blubb"
|
||||||
actual = s3.get_s3_connection(aws_connect_kwargs, location, rgw, s3_url)
|
actual = s3.get_s3_connection(aws_connect_kwargs, location, rgw, s3_url)
|
||||||
self.assertEqual("bla.blubb", actual.host)
|
self.assertEqual("bla.blubb", actual.host)
|
||||||
|
|
|
@ -4,6 +4,7 @@ import unittest
|
||||||
|
|
||||||
from ansible.modules.cloud.docker._docker import get_split_image_tag
|
from ansible.modules.cloud.docker._docker import get_split_image_tag
|
||||||
|
|
||||||
|
|
||||||
class DockerSplitImageTagTestCase(unittest.TestCase):
|
class DockerSplitImageTagTestCase(unittest.TestCase):
|
||||||
|
|
||||||
def test_trivial(self):
|
def test_trivial(self):
|
||||||
|
|
|
@ -2,6 +2,7 @@ import unittest
|
||||||
|
|
||||||
from ansible.modules.cloud.google.gce_tag import _get_changed_items, _intersect_items, _union_items
|
from ansible.modules.cloud.google.gce_tag import _get_changed_items, _intersect_items, _union_items
|
||||||
|
|
||||||
|
|
||||||
class TestGCETag(unittest.TestCase):
|
class TestGCETag(unittest.TestCase):
|
||||||
"""Unit tests for gce_tag module."""
|
"""Unit tests for gce_tag module."""
|
||||||
|
|
||||||
|
@ -29,7 +30,7 @@ class TestGCETag(unittest.TestCase):
|
||||||
# tags removed
|
# tags removed
|
||||||
new_tags = ['one', 'two']
|
new_tags = ['one', 'two']
|
||||||
existing_tags = ['two']
|
existing_tags = ['two']
|
||||||
want = ['two'] # only remove the tag that was present
|
want = ['two'] # only remove the tag that was present
|
||||||
got = _intersect_items(existing_tags, new_tags)
|
got = _intersect_items(existing_tags, new_tags)
|
||||||
self.assertEqual(want, got)
|
self.assertEqual(want, got)
|
||||||
|
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
|
import collections
|
||||||
|
import inspect
|
||||||
import mock
|
import mock
|
||||||
import pytest
|
import pytest
|
||||||
import yaml
|
import yaml
|
||||||
import inspect
|
|
||||||
import collections
|
|
||||||
|
|
||||||
from ansible.module_utils.six import string_types
|
from ansible.module_utils.six import string_types
|
||||||
from ansible.modules.cloud.openstack import os_server
|
from ansible.modules.cloud.openstack import os_server
|
||||||
|
@ -188,12 +188,9 @@ class TestCreateServer(object):
|
||||||
os_server._create_server(self.module, self.cloud)
|
os_server._create_server(self.module, self.cloud)
|
||||||
|
|
||||||
assert(self.cloud.create_server.call_count == 1)
|
assert(self.cloud.create_server.call_count == 1)
|
||||||
assert(self.cloud.create_server.call_args[1]['image']
|
assert(self.cloud.create_server.call_args[1]['image'] == self.cloud.get_image_id('cirros'))
|
||||||
== self.cloud.get_image_id('cirros'))
|
assert(self.cloud.create_server.call_args[1]['flavor'] == self.cloud.get_flavor('m1.tiny')['id'])
|
||||||
assert(self.cloud.create_server.call_args[1]['flavor']
|
assert(self.cloud.create_server.call_args[1]['nics'][0]['net-id'] == self.cloud.get_network('network1')['id'])
|
||||||
== self.cloud.get_flavor('m1.tiny')['id'])
|
|
||||||
assert(self.cloud.create_server.call_args[1]['nics'][0]['net-id']
|
|
||||||
== self.cloud.get_network('network1')['id'])
|
|
||||||
|
|
||||||
def test_create_server_bad_flavor(self):
|
def test_create_server_bad_flavor(self):
|
||||||
'''
|
'''
|
||||||
|
|
|
@ -14,13 +14,12 @@
|
||||||
# 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 unittest
|
|
||||||
from ansible.modules.network.cumulus import nclu
|
|
||||||
|
|
||||||
import sys
|
import sys
|
||||||
import time
|
import time
|
||||||
from ansible.module_utils.basic import *
|
import unittest
|
||||||
|
|
||||||
|
from ansible.module_utils.basic import *
|
||||||
|
from ansible.modules.network.cumulus import nclu
|
||||||
|
|
||||||
|
|
||||||
class FakeModule(object):
|
class FakeModule(object):
|
||||||
|
@ -172,7 +171,6 @@ class TestNclu(unittest.TestCase):
|
||||||
self.assertEqual(module.fail_code, {})
|
self.assertEqual(module.fail_code, {})
|
||||||
self.assertEqual(changed, True)
|
self.assertEqual(changed, True)
|
||||||
|
|
||||||
|
|
||||||
def test_command_atomic(self):
|
def test_command_atomic(self):
|
||||||
module = FakeModule()
|
module = FakeModule()
|
||||||
changed, output = nclu.run_nclu(module,
|
changed, output = nclu.run_nclu(module,
|
||||||
|
|
|
@ -19,8 +19,8 @@
|
||||||
from __future__ import (absolute_import, division, print_function)
|
from __future__ import (absolute_import, division, print_function)
|
||||||
__metaclass__ = type
|
__metaclass__ = type
|
||||||
|
|
||||||
import os
|
|
||||||
import json
|
import json
|
||||||
|
import os
|
||||||
|
|
||||||
from ansible.compat.tests import unittest
|
from ansible.compat.tests import unittest
|
||||||
from ansible.compat.tests.mock import patch
|
from ansible.compat.tests.mock import patch
|
||||||
|
@ -35,6 +35,7 @@ def set_module_args(args):
|
||||||
fixture_path = os.path.join(os.path.dirname(__file__), 'fixtures')
|
fixture_path = os.path.join(os.path.dirname(__file__), 'fixtures')
|
||||||
fixture_data = {}
|
fixture_data = {}
|
||||||
|
|
||||||
|
|
||||||
def load_fixture(name):
|
def load_fixture(name):
|
||||||
path = os.path.join(fixture_path, name)
|
path = os.path.join(fixture_path, name)
|
||||||
|
|
||||||
|
@ -56,13 +57,14 @@ def load_fixture(name):
|
||||||
class AnsibleExitJson(Exception):
|
class AnsibleExitJson(Exception):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
class AnsibleFailJson(Exception):
|
class AnsibleFailJson(Exception):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
class TestEosModule(unittest.TestCase):
|
class TestEosModule(unittest.TestCase):
|
||||||
|
|
||||||
def execute_module(self, failed=False, changed=False, commands=None,
|
def execute_module(self, failed=False, changed=False, commands=None, sort=True, defaults=False, transport='cli'):
|
||||||
sort=True, defaults=False, transport='cli'):
|
|
||||||
|
|
||||||
self.load_fixtures(commands, transport=transport)
|
self.load_fixtures(commands, transport=transport)
|
||||||
|
|
||||||
|
@ -110,4 +112,3 @@ class TestEosModule(unittest.TestCase):
|
||||||
|
|
||||||
def load_fixtures(self, commands=None, transport='cli'):
|
def load_fixtures(self, commands=None, transport='cli'):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
|
@ -25,6 +25,7 @@ from ansible.compat.tests.mock import patch
|
||||||
from ansible.modules.network.eos import eos_command
|
from ansible.modules.network.eos import eos_command
|
||||||
from .eos_module import TestEosModule, load_fixture, set_module_args
|
from .eos_module import TestEosModule, load_fixture, set_module_args
|
||||||
|
|
||||||
|
|
||||||
class TestEosCommandModule(TestEosModule):
|
class TestEosCommandModule(TestEosModule):
|
||||||
|
|
||||||
module = eos_command
|
module = eos_command
|
||||||
|
|
|
@ -71,7 +71,7 @@ class TestEosConfigModule(TestEosModule):
|
||||||
|
|
||||||
def test_eos_config_before(self):
|
def test_eos_config_before(self):
|
||||||
args = dict(lines=['hostname switch01', 'ip domain-name eng.ansible.com'],
|
args = dict(lines=['hostname switch01', 'ip domain-name eng.ansible.com'],
|
||||||
before=['before command'])
|
before=['before command'])
|
||||||
|
|
||||||
set_module_args(args)
|
set_module_args(args)
|
||||||
|
|
||||||
|
@ -83,7 +83,7 @@ class TestEosConfigModule(TestEosModule):
|
||||||
|
|
||||||
def test_eos_config_after(self):
|
def test_eos_config_after(self):
|
||||||
args = dict(lines=['hostname switch01', 'ip domain-name eng.ansible.com'],
|
args = dict(lines=['hostname switch01', 'ip domain-name eng.ansible.com'],
|
||||||
after=['after command'])
|
after=['after command'])
|
||||||
|
|
||||||
set_module_args(args)
|
set_module_args(args)
|
||||||
|
|
||||||
|
|
|
@ -25,6 +25,7 @@ from ansible.compat.tests.mock import patch
|
||||||
from ansible.modules.network.eos import eos_system
|
from ansible.modules.network.eos import eos_system
|
||||||
from .eos_module import TestEosModule, load_fixture, set_module_args
|
from .eos_module import TestEosModule, load_fixture, set_module_args
|
||||||
|
|
||||||
|
|
||||||
class TestEosSystemModule(TestEosModule):
|
class TestEosSystemModule(TestEosModule):
|
||||||
|
|
||||||
module = eos_system
|
module = eos_system
|
||||||
|
@ -75,20 +76,20 @@ class TestEosSystemModule(TestEosModule):
|
||||||
'ip domain lookup source-interface Ethernet1']
|
'ip domain lookup source-interface Ethernet1']
|
||||||
self.execute_module(changed=True, commands=commands)
|
self.execute_module(changed=True, commands=commands)
|
||||||
|
|
||||||
#def test_eos_system_name_servers(self):
|
# def test_eos_system_name_servers(self):
|
||||||
# name_servers = ['8.8.8.8', '8.8.4.4']
|
# name_servers = ['8.8.8.8', '8.8.4.4']
|
||||||
# set_module_args(dict(name_servers=name_servers))
|
# set_module_args(dict(name_servers=name_servers))
|
||||||
# commands = ['ip name-server 8.8.4.4',
|
# commands = ['ip name-server 8.8.4.4',
|
||||||
# 'no ip name-server vrf mgmt 8.8.4.4']
|
# 'no ip name-server vrf mgmt 8.8.4.4']
|
||||||
# self.execute_module(changed=True, commands=commands)
|
# self.execute_module(changed=True, commands=commands)
|
||||||
|
|
||||||
#def rest_eos_system_name_servers_complex(self):
|
# def rest_eos_system_name_servers_complex(self):
|
||||||
# name_servers = dict(server='8.8.8.8', vrf='test')
|
# name_servers = dict(server='8.8.8.8', vrf='test')
|
||||||
# set_module_args(dict(name_servers=name_servers))
|
# set_module_args(dict(name_servers=name_servers))
|
||||||
# commands = ['ip name-server vrf test 8.8.8.8',
|
# commands = ['ip name-server vrf test 8.8.8.8',
|
||||||
# 'no ip name-server vrf default 8.8.8.8',
|
# 'no ip name-server vrf default 8.8.8.8',
|
||||||
# 'no ip name-server vrf mgmt 8.8.4.4']
|
# 'no ip name-server vrf mgmt 8.8.4.4']
|
||||||
# self.execute_module(changed=True, commands=commands)
|
# self.execute_module(changed=True, commands=commands)
|
||||||
|
|
||||||
def test_eos_system_state_absent(self):
|
def test_eos_system_state_absent(self):
|
||||||
set_module_args(dict(state='absent'))
|
set_module_args(dict(state='absent'))
|
||||||
|
@ -104,4 +105,3 @@ class TestEosSystemModule(TestEosModule):
|
||||||
name_servers = dict(server='8.8.8.8', vrf='missing')
|
name_servers = dict(server='8.8.8.8', vrf='missing')
|
||||||
set_module_args(dict(name_servers=name_servers))
|
set_module_args(dict(name_servers=name_servers))
|
||||||
result = self.execute_module(failed=True)
|
result = self.execute_module(failed=True)
|
||||||
|
|
||||||
|
|
|
@ -95,5 +95,3 @@ class TestEosUserModule(TestEosModule):
|
||||||
set_module_args(dict(username='ansible', password='test', update_password='always'))
|
set_module_args(dict(username='ansible', password='test', update_password='always'))
|
||||||
commands = ['username ansible secret test']
|
commands = ['username ansible secret test']
|
||||||
self.execute_module(changed=True, commands=commands)
|
self.execute_module(changed=True, commands=commands)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -35,6 +35,7 @@ def set_module_args(args):
|
||||||
fixture_path = os.path.join(os.path.dirname(__file__), 'fixtures')
|
fixture_path = os.path.join(os.path.dirname(__file__), 'fixtures')
|
||||||
fixture_data = {}
|
fixture_data = {}
|
||||||
|
|
||||||
|
|
||||||
def load_fixture(name):
|
def load_fixture(name):
|
||||||
path = os.path.join(fixture_path, name)
|
path = os.path.join(fixture_path, name)
|
||||||
|
|
||||||
|
@ -56,13 +57,14 @@ def load_fixture(name):
|
||||||
class AnsibleExitJson(Exception):
|
class AnsibleExitJson(Exception):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
class AnsibleFailJson(Exception):
|
class AnsibleFailJson(Exception):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
class TestIosModule(unittest.TestCase):
|
class TestIosModule(unittest.TestCase):
|
||||||
|
|
||||||
def execute_module(self, failed=False, changed=False, commands=None,
|
def execute_module(self, failed=False, changed=False, commands=None, sort=True, defaults=False):
|
||||||
sort=True, defaults=False):
|
|
||||||
|
|
||||||
self.load_fixtures(commands)
|
self.load_fixtures(commands)
|
||||||
|
|
||||||
|
@ -110,4 +112,3 @@ class TestIosModule(unittest.TestCase):
|
||||||
|
|
||||||
def load_fixtures(self, commands=None):
|
def load_fixtures(self, commands=None):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
|
@ -40,8 +40,7 @@ class TestIosBannerModule(TestIosModule):
|
||||||
self.mock_load_config.stop()
|
self.mock_load_config.stop()
|
||||||
|
|
||||||
def load_fixtures(self, commands=None):
|
def load_fixtures(self, commands=None):
|
||||||
self.exec_command.return_value = (0,
|
self.exec_command.return_value = (0, load_fixture('ios_banner_show_banner.txt').strip(), None)
|
||||||
load_fixture('ios_banner_show_banner.txt').strip(), None)
|
|
||||||
self.load_config.return_value = dict(diff=None, session='session')
|
self.load_config.return_value = dict(diff=None, session='session')
|
||||||
|
|
||||||
def test_ios_banner_create(self):
|
def test_ios_banner_create(self):
|
||||||
|
|
|
@ -25,6 +25,7 @@ from ansible.compat.tests.mock import patch
|
||||||
from ansible.modules.network.ios import ios_command
|
from ansible.modules.network.ios import ios_command
|
||||||
from .ios_module import TestIosModule, load_fixture, set_module_args
|
from .ios_module import TestIosModule, load_fixture, set_module_args
|
||||||
|
|
||||||
|
|
||||||
class TestIosCommandModule(TestIosModule):
|
class TestIosCommandModule(TestIosModule):
|
||||||
|
|
||||||
module = ios_command
|
module = ios_command
|
||||||
|
|
|
@ -89,19 +89,19 @@ class TestIosConfigModule(TestIosModule):
|
||||||
self.execute_module(changed=True, commands=commands)
|
self.execute_module(changed=True, commands=commands)
|
||||||
|
|
||||||
def test_ios_config_before(self):
|
def test_ios_config_before(self):
|
||||||
set_module_args(dict(lines=['hostname foo'], before=['test1','test2']))
|
set_module_args(dict(lines=['hostname foo'], before=['test1', 'test2']))
|
||||||
commands = ['test1', 'test2', 'hostname foo']
|
commands = ['test1', 'test2', 'hostname foo']
|
||||||
self.execute_module(changed=True, commands=commands, sort=False)
|
self.execute_module(changed=True, commands=commands, sort=False)
|
||||||
|
|
||||||
def test_ios_config_after(self):
|
def test_ios_config_after(self):
|
||||||
set_module_args(dict(lines=['hostname foo'], after=['test1','test2']))
|
set_module_args(dict(lines=['hostname foo'], after=['test1', 'test2']))
|
||||||
commands = ['hostname foo', 'test1', 'test2']
|
commands = ['hostname foo', 'test1', 'test2']
|
||||||
self.execute_module(changed=True, commands=commands, sort=False)
|
self.execute_module(changed=True, commands=commands, sort=False)
|
||||||
|
|
||||||
def test_ios_config_before_after_no_change(self):
|
def test_ios_config_before_after_no_change(self):
|
||||||
set_module_args(dict(lines=['hostname router'],
|
set_module_args(dict(lines=['hostname router'],
|
||||||
before=['test1', 'test2'],
|
before=['test1', 'test2'],
|
||||||
after=['test3','test4']))
|
after=['test3', 'test4']))
|
||||||
self.execute_module()
|
self.execute_module()
|
||||||
|
|
||||||
def test_ios_config_config(self):
|
def test_ios_config_config(self):
|
||||||
|
|
|
@ -51,7 +51,6 @@ class TestIosSystemModule(TestIosModule):
|
||||||
commands = ['hostname foo']
|
commands = ['hostname foo']
|
||||||
self.execute_module(changed=True, commands=commands)
|
self.execute_module(changed=True, commands=commands)
|
||||||
|
|
||||||
|
|
||||||
def test_ios_system_domain_name(self):
|
def test_ios_system_domain_name(self):
|
||||||
set_module_args(dict(domain_name=['test.com']))
|
set_module_args(dict(domain_name=['test.com']))
|
||||||
commands = ['ip domain name test.com',
|
commands = ['ip domain name test.com',
|
||||||
|
@ -120,4 +119,3 @@ class TestIosSystemModule(TestIosModule):
|
||||||
name_servers = dict(server='8.8.8.8', vrf='missing')
|
name_servers = dict(server='8.8.8.8', vrf='missing')
|
||||||
set_module_args(dict(name_servers=name_servers))
|
set_module_args(dict(name_servers=name_servers))
|
||||||
self.execute_module(failed=True)
|
self.execute_module(failed=True)
|
||||||
|
|
||||||
|
|
|
@ -26,6 +26,7 @@ from ansible.compat.tests.mock import patch
|
||||||
from ansible.modules.network.ios import _ios_template
|
from ansible.modules.network.ios import _ios_template
|
||||||
from .ios_module import TestIosModule, load_fixture, set_module_args
|
from .ios_module import TestIosModule, load_fixture, set_module_args
|
||||||
|
|
||||||
|
|
||||||
class TestIosTemplateModule(TestIosModule):
|
class TestIosTemplateModule(TestIosModule):
|
||||||
|
|
||||||
module = _ios_template
|
module = _ios_template
|
||||||
|
|
|
@ -122,5 +122,3 @@ class TestIosVrfModule(TestIosModule):
|
||||||
commands = ['no vrf definition test_1', 'vrf definition test_2',
|
commands = ['no vrf definition test_1', 'vrf definition test_2',
|
||||||
'description test string']
|
'description test string']
|
||||||
self.execute_module(changed=True, commands=commands, sort=False)
|
self.execute_module(changed=True, commands=commands, sort=False)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -35,6 +35,7 @@ def set_module_args(args):
|
||||||
fixture_path = os.path.join(os.path.dirname(__file__), 'fixtures')
|
fixture_path = os.path.join(os.path.dirname(__file__), 'fixtures')
|
||||||
fixture_data = {}
|
fixture_data = {}
|
||||||
|
|
||||||
|
|
||||||
def load_fixture(name):
|
def load_fixture(name):
|
||||||
path = os.path.join(fixture_path, name)
|
path = os.path.join(fixture_path, name)
|
||||||
|
|
||||||
|
@ -56,13 +57,14 @@ def load_fixture(name):
|
||||||
class AnsibleExitJson(Exception):
|
class AnsibleExitJson(Exception):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
class AnsibleFailJson(Exception):
|
class AnsibleFailJson(Exception):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
class TestIosxrModule(unittest.TestCase):
|
class TestIosxrModule(unittest.TestCase):
|
||||||
|
|
||||||
def execute_module(self, failed=False, changed=False, commands=None,
|
def execute_module(self, failed=False, changed=False, commands=None, sort=True, defaults=False):
|
||||||
sort=True, defaults=False):
|
|
||||||
|
|
||||||
self.load_fixtures(commands)
|
self.load_fixtures(commands)
|
||||||
|
|
||||||
|
@ -110,4 +112,3 @@ class TestIosxrModule(unittest.TestCase):
|
||||||
|
|
||||||
def load_fixtures(self, commands=None):
|
def load_fixtures(self, commands=None):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
|
@ -26,6 +26,7 @@ from ansible.compat.tests.mock import patch
|
||||||
from ansible.modules.network.iosxr import iosxr_config
|
from ansible.modules.network.iosxr import iosxr_config
|
||||||
from .iosxr_module import TestIosxrModule, load_fixture, set_module_args
|
from .iosxr_module import TestIosxrModule, load_fixture, set_module_args
|
||||||
|
|
||||||
|
|
||||||
class TestIosxrConfigModule(TestIosxrModule):
|
class TestIosxrConfigModule(TestIosxrModule):
|
||||||
|
|
||||||
module = iosxr_config
|
module = iosxr_config
|
||||||
|
@ -73,19 +74,19 @@ class TestIosxrConfigModule(TestIosxrModule):
|
||||||
self.execute_module(changed=True, commands=commands)
|
self.execute_module(changed=True, commands=commands)
|
||||||
|
|
||||||
def test_iosxr_config_before(self):
|
def test_iosxr_config_before(self):
|
||||||
set_module_args(dict(lines=['hostname foo'], before=['test1','test2']))
|
set_module_args(dict(lines=['hostname foo'], before=['test1', 'test2']))
|
||||||
commands = ['test1', 'test2', 'hostname foo']
|
commands = ['test1', 'test2', 'hostname foo']
|
||||||
self.execute_module(changed=True, commands=commands, sort=False)
|
self.execute_module(changed=True, commands=commands, sort=False)
|
||||||
|
|
||||||
def test_iosxr_config_after(self):
|
def test_iosxr_config_after(self):
|
||||||
set_module_args(dict(lines=['hostname foo'], after=['test1','test2']))
|
set_module_args(dict(lines=['hostname foo'], after=['test1', 'test2']))
|
||||||
commands = ['hostname foo', 'test1', 'test2']
|
commands = ['hostname foo', 'test1', 'test2']
|
||||||
self.execute_module(changed=True, commands=commands, sort=False)
|
self.execute_module(changed=True, commands=commands, sort=False)
|
||||||
|
|
||||||
def test_iosxr_config_before_after_no_change(self):
|
def test_iosxr_config_before_after_no_change(self):
|
||||||
set_module_args(dict(lines=['hostname router'],
|
set_module_args(dict(lines=['hostname router'],
|
||||||
before=['test1', 'test2'],
|
before=['test1', 'test2'],
|
||||||
after=['test3','test4']))
|
after=['test3', 'test4']))
|
||||||
self.execute_module()
|
self.execute_module()
|
||||||
|
|
||||||
def test_iosxr_config_config(self):
|
def test_iosxr_config_config(self):
|
||||||
|
|
|
@ -66,8 +66,7 @@ class TestIosxrFacts(TestIosxrModule):
|
||||||
self.assertIn('interfaces', ansible_facts['ansible_net_gather_subset'])
|
self.assertIn('interfaces', ansible_facts['ansible_net_gather_subset'])
|
||||||
self.assertEquals('iosxr01', ansible_facts['ansible_net_hostname'])
|
self.assertEquals('iosxr01', ansible_facts['ansible_net_hostname'])
|
||||||
self.assertEquals(['disk0:', 'flash0:'], ansible_facts['ansible_net_filesystems'])
|
self.assertEquals(['disk0:', 'flash0:'], ansible_facts['ansible_net_filesystems'])
|
||||||
self.assertIn('GigabitEthernet0/0/0/0',
|
self.assertIn('GigabitEthernet0/0/0/0', ansible_facts['ansible_net_interfaces'].keys())
|
||||||
ansible_facts['ansible_net_interfaces'].keys())
|
|
||||||
self.assertEquals('3095', ansible_facts['ansible_net_memtotal_mb'])
|
self.assertEquals('3095', ansible_facts['ansible_net_memtotal_mb'])
|
||||||
self.assertEquals('1499', ansible_facts['ansible_net_memfree_mb'])
|
self.assertEquals('1499', ansible_facts['ansible_net_memfree_mb'])
|
||||||
|
|
||||||
|
|
|
@ -57,7 +57,7 @@ class TestIosxrSystemModule(TestIosxrModule):
|
||||||
|
|
||||||
def test_iosxr_system_domain_search(self):
|
def test_iosxr_system_domain_search(self):
|
||||||
set_module_args(dict(domain_search=['ansible.com', 'redhat.com']))
|
set_module_args(dict(domain_search=['ansible.com', 'redhat.com']))
|
||||||
commands=['domain list ansible.com', 'no domain list cisco.com']
|
commands = ['domain list ansible.com', 'no domain list cisco.com']
|
||||||
self.execute_module(changed=True, commands=commands)
|
self.execute_module(changed=True, commands=commands)
|
||||||
|
|
||||||
def test_iosxr_system_lookup_source(self):
|
def test_iosxr_system_lookup_source(self):
|
||||||
|
@ -78,14 +78,18 @@ class TestIosxrSystemModule(TestIosxrModule):
|
||||||
|
|
||||||
def test_iosxr_system_state_absent(self):
|
def test_iosxr_system_state_absent(self):
|
||||||
set_module_args(dict(state='absent'))
|
set_module_args(dict(state='absent'))
|
||||||
commands = ['no hostname', 'no domain name',
|
commands = [
|
||||||
'no domain lookup disable',
|
'no hostname',
|
||||||
'no domain lookup source-interface MgmtEth0/0/CPU0/0',
|
'no domain name',
|
||||||
'no domain list redhat.com', 'no domain list cisco.com',
|
'no domain lookup disable',
|
||||||
'no domain name-server 8.8.8.8', 'no domain name-server 8.8.4.4']
|
'no domain lookup source-interface MgmtEth0/0/CPU0/0',
|
||||||
|
'no domain list redhat.com',
|
||||||
|
'no domain list cisco.com',
|
||||||
|
'no domain name-server 8.8.8.8',
|
||||||
|
'no domain name-server 8.8.4.4'
|
||||||
|
]
|
||||||
self.execute_module(changed=True, commands=commands)
|
self.execute_module(changed=True, commands=commands)
|
||||||
|
|
||||||
def test_iosxr_system_no_change(self):
|
def test_iosxr_system_no_change(self):
|
||||||
set_module_args(dict(hostname='iosxr01', domain_name='eng.ansible.com'))
|
set_module_args(dict(hostname='iosxr01', domain_name='eng.ansible.com'))
|
||||||
self.execute_module()
|
self.execute_module()
|
||||||
|
|
||||||
|
|
|
@ -35,6 +35,7 @@ def set_module_args(args):
|
||||||
fixture_path = os.path.join(os.path.dirname(__file__), 'fixtures')
|
fixture_path = os.path.join(os.path.dirname(__file__), 'fixtures')
|
||||||
fixture_data = {}
|
fixture_data = {}
|
||||||
|
|
||||||
|
|
||||||
def load_fixture(name):
|
def load_fixture(name):
|
||||||
path = os.path.join(fixture_path, name)
|
path = os.path.join(fixture_path, name)
|
||||||
|
|
||||||
|
@ -56,13 +57,14 @@ def load_fixture(name):
|
||||||
class AnsibleExitJson(Exception):
|
class AnsibleExitJson(Exception):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
class AnsibleFailJson(Exception):
|
class AnsibleFailJson(Exception):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
class TestNxosModule(unittest.TestCase):
|
class TestNxosModule(unittest.TestCase):
|
||||||
|
|
||||||
def execute_module(self, failed=False, changed=False, commands=None,
|
def execute_module(self, failed=False, changed=False, commands=None, sort=True, defaults=False):
|
||||||
sort=True, defaults=False):
|
|
||||||
|
|
||||||
self.load_fixtures(commands)
|
self.load_fixtures(commands)
|
||||||
|
|
||||||
|
@ -110,4 +112,3 @@ class TestNxosModule(unittest.TestCase):
|
||||||
|
|
||||||
def load_fixtures(self, commands=None):
|
def load_fixtures(self, commands=None):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
|
@ -25,6 +25,7 @@ from ansible.compat.tests.mock import patch
|
||||||
from ansible.modules.network.nxos import nxos_command
|
from ansible.modules.network.nxos import nxos_command
|
||||||
from .nxos_module import TestNxosModule, load_fixture, set_module_args
|
from .nxos_module import TestNxosModule, load_fixture, set_module_args
|
||||||
|
|
||||||
|
|
||||||
class TestNxosCommandModule(TestNxosModule):
|
class TestNxosCommandModule(TestNxosModule):
|
||||||
|
|
||||||
module = nxos_command
|
module = nxos_command
|
||||||
|
|
|
@ -73,7 +73,7 @@ class TestNxosConfigModule(TestNxosModule):
|
||||||
|
|
||||||
def test_nxos_config_before(self):
|
def test_nxos_config_before(self):
|
||||||
args = dict(lines=['hostname switch01', 'ip domain-name eng.ansible.com'],
|
args = dict(lines=['hostname switch01', 'ip domain-name eng.ansible.com'],
|
||||||
before=['before command'])
|
before=['before command'])
|
||||||
|
|
||||||
set_module_args(args)
|
set_module_args(args)
|
||||||
|
|
||||||
|
@ -85,7 +85,7 @@ class TestNxosConfigModule(TestNxosModule):
|
||||||
|
|
||||||
def test_nxos_config_after(self):
|
def test_nxos_config_after(self):
|
||||||
args = dict(lines=['hostname switch01', 'ip domain-name eng.ansible.com'],
|
args = dict(lines=['hostname switch01', 'ip domain-name eng.ansible.com'],
|
||||||
after=['after command'])
|
after=['after command'])
|
||||||
|
|
||||||
set_module_args(args)
|
set_module_args(args)
|
||||||
|
|
||||||
|
@ -134,6 +134,3 @@ class TestNxosConfigModule(TestNxosModule):
|
||||||
set_module_args(args)
|
set_module_args(args)
|
||||||
result = self.execute_module()
|
result = self.execute_module()
|
||||||
self.assertIn('__backup__', result)
|
self.assertIn('__backup__', result)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -61,4 +61,3 @@ class TestNxosEvpnGlobalModule(TestNxosModule):
|
||||||
set_module_args(dict(nv_overlay_evpn=False))
|
set_module_args(dict(nv_overlay_evpn=False))
|
||||||
commands = ['no nv overlay evpn']
|
commands = ['no nv overlay evpn']
|
||||||
self.start_configured(changed=True, commands=commands)
|
self.start_configured(changed=True, commands=commands)
|
||||||
|
|
||||||
|
|
|
@ -126,5 +126,3 @@ class TestNxosSystemModule(TestNxosModule):
|
||||||
'vrf context management', 'no ip name-server 172.26.1.1', 'exit',
|
'vrf context management', 'no ip name-server 172.26.1.1', 'exit',
|
||||||
'no system jumbomtu']
|
'no system jumbomtu']
|
||||||
self.execute_module(changed=True, commands=commands)
|
self.execute_module(changed=True, commands=commands)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -25,6 +25,7 @@ from ansible.compat.tests.mock import patch
|
||||||
from ansible.modules.network.vyos import vyos_command
|
from ansible.modules.network.vyos import vyos_command
|
||||||
from .vyos_module import TestVyosModule, load_fixture, set_module_args
|
from .vyos_module import TestVyosModule, load_fixture, set_module_args
|
||||||
|
|
||||||
|
|
||||||
class TestVyosCommandModule(TestVyosModule):
|
class TestVyosCommandModule(TestVyosModule):
|
||||||
|
|
||||||
module = vyos_command
|
module = vyos_command
|
||||||
|
|
|
@ -35,6 +35,7 @@ def set_module_args(args):
|
||||||
fixture_path = os.path.join(os.path.dirname(__file__), 'fixtures')
|
fixture_path = os.path.join(os.path.dirname(__file__), 'fixtures')
|
||||||
fixture_data = {}
|
fixture_data = {}
|
||||||
|
|
||||||
|
|
||||||
def load_fixture(name):
|
def load_fixture(name):
|
||||||
path = os.path.join(fixture_path, name)
|
path = os.path.join(fixture_path, name)
|
||||||
|
|
||||||
|
@ -56,14 +57,14 @@ def load_fixture(name):
|
||||||
class AnsibleExitJson(Exception):
|
class AnsibleExitJson(Exception):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
class AnsibleFailJson(Exception):
|
class AnsibleFailJson(Exception):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
class TestVyosModule(unittest.TestCase):
|
class TestVyosModule(unittest.TestCase):
|
||||||
|
|
||||||
def execute_module(self, failed=False, changed=False, commands=None,
|
def execute_module(self, failed=False, changed=False, commands=None, sort=True, defaults=False):
|
||||||
sort=True, defaults=False):
|
|
||||||
|
|
||||||
self.load_fixtures(commands)
|
self.load_fixtures(commands)
|
||||||
|
|
||||||
if failed:
|
if failed:
|
||||||
|
@ -110,4 +111,3 @@ class TestVyosModule(unittest.TestCase):
|
||||||
|
|
||||||
def load_fixtures(self, commands=None):
|
def load_fixtures(self, commands=None):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
|
@ -20,9 +20,10 @@ class AptExpandPkgspecTestCase(unittest.TestCase):
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
FakePackage = collections.namedtuple("Package", ("name",))
|
FakePackage = collections.namedtuple("Package", ("name",))
|
||||||
self.fake_cache = [ FakePackage("apt"),
|
self.fake_cache = [
|
||||||
FakePackage("apt-utils"),
|
FakePackage("apt"),
|
||||||
FakePackage("not-selected"),
|
FakePackage("apt-utils"),
|
||||||
|
FakePackage("not-selected"),
|
||||||
]
|
]
|
||||||
|
|
||||||
def test_trivial(self):
|
def test_trivial(self):
|
||||||
|
|
|
@ -36,11 +36,8 @@ class KnownHostsDiffTestCase(unittest.TestCase):
|
||||||
self.assertEqual(diff, {
|
self.assertEqual(diff, {
|
||||||
'before_header': path,
|
'before_header': path,
|
||||||
'after_header': path,
|
'after_header': path,
|
||||||
'before':
|
'before': 'two.example.com ssh-rsa BBBBetc\n',
|
||||||
'two.example.com ssh-rsa BBBBetc\n',
|
'after': 'two.example.com ssh-rsa BBBBetc\none.example.com ssh-rsa AAAAetc\n',
|
||||||
'after':
|
|
||||||
'two.example.com ssh-rsa BBBBetc\n'
|
|
||||||
'one.example.com ssh-rsa AAAAetc\n',
|
|
||||||
})
|
})
|
||||||
|
|
||||||
def test_no_change(self):
|
def test_no_change(self):
|
||||||
|
@ -53,12 +50,8 @@ class KnownHostsDiffTestCase(unittest.TestCase):
|
||||||
self.assertEqual(diff, {
|
self.assertEqual(diff, {
|
||||||
'before_header': path,
|
'before_header': path,
|
||||||
'after_header': path,
|
'after_header': path,
|
||||||
'before':
|
'before': 'one.example.com ssh-rsa AAAAetc\ntwo.example.com ssh-rsa BBBBetc\n',
|
||||||
'one.example.com ssh-rsa AAAAetc\n'
|
'after': 'one.example.com ssh-rsa AAAAetc\ntwo.example.com ssh-rsa BBBBetc\n',
|
||||||
'two.example.com ssh-rsa BBBBetc\n',
|
|
||||||
'after':
|
|
||||||
'one.example.com ssh-rsa AAAAetc\n'
|
|
||||||
'two.example.com ssh-rsa BBBBetc\n',
|
|
||||||
})
|
})
|
||||||
|
|
||||||
def test_key_change(self):
|
def test_key_change(self):
|
||||||
|
@ -71,12 +64,8 @@ class KnownHostsDiffTestCase(unittest.TestCase):
|
||||||
self.assertEqual(diff, {
|
self.assertEqual(diff, {
|
||||||
'before_header': path,
|
'before_header': path,
|
||||||
'after_header': path,
|
'after_header': path,
|
||||||
'before':
|
'before': 'one.example.com ssh-rsa AAAaetc\ntwo.example.com ssh-rsa BBBBetc\n',
|
||||||
'one.example.com ssh-rsa AAAaetc\n'
|
'after': 'two.example.com ssh-rsa BBBBetc\none.example.com ssh-rsa AAAAetc\n',
|
||||||
'two.example.com ssh-rsa BBBBetc\n',
|
|
||||||
'after':
|
|
||||||
'two.example.com ssh-rsa BBBBetc\n'
|
|
||||||
'one.example.com ssh-rsa AAAAetc\n',
|
|
||||||
})
|
})
|
||||||
|
|
||||||
def test_key_removal(self):
|
def test_key_removal(self):
|
||||||
|
@ -89,11 +78,8 @@ class KnownHostsDiffTestCase(unittest.TestCase):
|
||||||
self.assertEqual(diff, {
|
self.assertEqual(diff, {
|
||||||
'before_header': path,
|
'before_header': path,
|
||||||
'after_header': path,
|
'after_header': path,
|
||||||
'before':
|
'before': 'one.example.com ssh-rsa AAAAetc\ntwo.example.com ssh-rsa BBBBetc\n',
|
||||||
'one.example.com ssh-rsa AAAAetc\n'
|
'after': 'two.example.com ssh-rsa BBBBetc\n',
|
||||||
'two.example.com ssh-rsa BBBBetc\n',
|
|
||||||
'after':
|
|
||||||
'two.example.com ssh-rsa BBBBetc\n',
|
|
||||||
})
|
})
|
||||||
|
|
||||||
def test_key_removal_no_change(self):
|
def test_key_removal_no_change(self):
|
||||||
|
@ -105,8 +91,6 @@ class KnownHostsDiffTestCase(unittest.TestCase):
|
||||||
self.assertEqual(diff, {
|
self.assertEqual(diff, {
|
||||||
'before_header': path,
|
'before_header': path,
|
||||||
'after_header': path,
|
'after_header': path,
|
||||||
'before':
|
'before': 'two.example.com ssh-rsa BBBBetc\n',
|
||||||
'two.example.com ssh-rsa BBBBetc\n',
|
'after': 'two.example.com ssh-rsa BBBBetc\n',
|
||||||
'after':
|
|
||||||
'two.example.com ssh-rsa BBBBetc\n',
|
|
||||||
})
|
})
|
||||||
|
|
|
@ -21,12 +21,11 @@ __metaclass__ = type
|
||||||
|
|
||||||
from ansible.compat.tests import unittest
|
from ansible.compat.tests import unittest
|
||||||
from ansible.compat.tests.mock import patch, mock_open
|
from ansible.compat.tests.mock import patch, mock_open
|
||||||
from ansible.errors import AnsibleParserError
|
from ansible.errors import AnsibleParserError, yaml_strings
|
||||||
from ansible.errors import yaml_strings
|
|
||||||
from ansible.module_utils.six import PY3
|
from ansible.module_utils.six import PY3
|
||||||
|
|
||||||
from ansible.parsing.dataloader import DataLoader
|
from ansible.parsing.dataloader import DataLoader
|
||||||
|
|
||||||
|
|
||||||
class TestDataLoader(unittest.TestCase):
|
class TestDataLoader(unittest.TestCase):
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
|
@ -39,7 +38,7 @@ class TestDataLoader(unittest.TestCase):
|
||||||
def test_parse_json_from_file(self, mock_def):
|
def test_parse_json_from_file(self, mock_def):
|
||||||
mock_def.return_value = (b"""{"a": 1, "b": 2, "c": 3}""", True)
|
mock_def.return_value = (b"""{"a": 1, "b": 2, "c": 3}""", True)
|
||||||
output = self._loader.load_from_file('dummy_json.txt')
|
output = self._loader.load_from_file('dummy_json.txt')
|
||||||
self.assertEqual(output, dict(a=1,b=2,c=3))
|
self.assertEqual(output, dict(a=1, b=2, c=3))
|
||||||
|
|
||||||
@patch.object(DataLoader, '_get_file_contents')
|
@patch.object(DataLoader, '_get_file_contents')
|
||||||
def test_parse_yaml_from_file(self, mock_def):
|
def test_parse_yaml_from_file(self, mock_def):
|
||||||
|
@ -49,7 +48,7 @@ class TestDataLoader(unittest.TestCase):
|
||||||
c: 3
|
c: 3
|
||||||
""", True)
|
""", True)
|
||||||
output = self._loader.load_from_file('dummy_yaml.txt')
|
output = self._loader.load_from_file('dummy_yaml.txt')
|
||||||
self.assertEqual(output, dict(a=1,b=2,c=3))
|
self.assertEqual(output, dict(a=1, b=2, c=3))
|
||||||
|
|
||||||
@patch.object(DataLoader, '_get_file_contents')
|
@patch.object(DataLoader, '_get_file_contents')
|
||||||
def test_parse_fail_from_file(self, mock_def):
|
def test_parse_fail_from_file(self, mock_def):
|
||||||
|
|
|
@ -19,10 +19,10 @@
|
||||||
from __future__ import (absolute_import, division, print_function)
|
from __future__ import (absolute_import, division, print_function)
|
||||||
__metaclass__ = type
|
__metaclass__ = type
|
||||||
|
|
||||||
from ansible.parsing.mod_args import ModuleArgsParser
|
|
||||||
from ansible.errors import AnsibleParserError
|
|
||||||
|
|
||||||
from ansible.compat.tests import unittest
|
from ansible.compat.tests import unittest
|
||||||
|
from ansible.errors import AnsibleParserError
|
||||||
|
from ansible.parsing.mod_args import ModuleArgsParser
|
||||||
|
|
||||||
|
|
||||||
class TestModArgsDwim(unittest.TestCase):
|
class TestModArgsDwim(unittest.TestCase):
|
||||||
|
|
||||||
|
@ -47,9 +47,9 @@ class TestModArgsDwim(unittest.TestCase):
|
||||||
self._debug(mod, args, to)
|
self._debug(mod, args, to)
|
||||||
self.assertEqual(mod, 'command')
|
self.assertEqual(mod, 'command')
|
||||||
self.assertEqual(args, dict(
|
self.assertEqual(args, dict(
|
||||||
_raw_params = 'echo hi',
|
_raw_params='echo hi',
|
||||||
_uses_shell = True,
|
_uses_shell=True,
|
||||||
))
|
))
|
||||||
self.assertIsNone(to)
|
self.assertIsNone(to)
|
||||||
|
|
||||||
def test_basic_command(self):
|
def test_basic_command(self):
|
||||||
|
@ -58,8 +58,8 @@ class TestModArgsDwim(unittest.TestCase):
|
||||||
self._debug(mod, args, to)
|
self._debug(mod, args, to)
|
||||||
self.assertEqual(mod, 'command')
|
self.assertEqual(mod, 'command')
|
||||||
self.assertEqual(args, dict(
|
self.assertEqual(args, dict(
|
||||||
_raw_params = 'echo hi',
|
_raw_params='echo hi',
|
||||||
))
|
))
|
||||||
self.assertIsNone(to)
|
self.assertIsNone(to)
|
||||||
|
|
||||||
def test_shell_with_modifiers(self):
|
def test_shell_with_modifiers(self):
|
||||||
|
@ -68,11 +68,11 @@ class TestModArgsDwim(unittest.TestCase):
|
||||||
self._debug(mod, args, to)
|
self._debug(mod, args, to)
|
||||||
self.assertEqual(mod, 'command')
|
self.assertEqual(mod, 'command')
|
||||||
self.assertEqual(args, dict(
|
self.assertEqual(args, dict(
|
||||||
creates = '/tmp/baz',
|
creates='/tmp/baz',
|
||||||
removes = '/tmp/bleep',
|
removes='/tmp/bleep',
|
||||||
_raw_params = '/bin/foo',
|
_raw_params='/bin/foo',
|
||||||
_uses_shell = True,
|
_uses_shell=True,
|
||||||
))
|
))
|
||||||
self.assertIsNone(to)
|
self.assertIsNone(to)
|
||||||
|
|
||||||
def test_normal_usage(self):
|
def test_normal_usage(self):
|
||||||
|
@ -127,4 +127,3 @@ class TestModArgsDwim(unittest.TestCase):
|
||||||
|
|
||||||
m = ModuleArgsParser(dict(ping='data=hi', shell='echo hi'))
|
m = ModuleArgsParser(dict(ping='data=hi', shell='echo hi'))
|
||||||
self.assertRaises(AnsibleParserError, m.parse)
|
self.assertRaises(AnsibleParserError, m.parse)
|
||||||
|
|
||||||
|
|
|
@ -4,6 +4,7 @@ import unittest
|
||||||
|
|
||||||
from ansible.parsing.utils.addresses import parse_address
|
from ansible.parsing.utils.addresses import parse_address
|
||||||
|
|
||||||
|
|
||||||
class TestParseAddress(unittest.TestCase):
|
class TestParseAddress(unittest.TestCase):
|
||||||
|
|
||||||
tests = {
|
tests = {
|
||||||
|
|
|
@ -22,6 +22,7 @@ __metaclass__ = type
|
||||||
from ansible.compat.tests import unittest
|
from ansible.compat.tests import unittest
|
||||||
from ansible.parsing.utils.jsonify import jsonify
|
from ansible.parsing.utils.jsonify import jsonify
|
||||||
|
|
||||||
|
|
||||||
class TestJsonify(unittest.TestCase):
|
class TestJsonify(unittest.TestCase):
|
||||||
def test_jsonify_simple(self):
|
def test_jsonify_simple(self):
|
||||||
self.assertEqual(jsonify(dict(a=1, b=2, c=3)), '{"a": 1, "b": 2, "c": 3}')
|
self.assertEqual(jsonify(dict(a=1, b=2, c=3)), '{"a": 1, "b": 2, "c": 3}')
|
||||||
|
|
|
@ -77,11 +77,11 @@ class TestVaultIsEncrypted(unittest.TestCase):
|
||||||
self.assertTrue(vault.is_encrypted(b_data))
|
self.assertTrue(vault.is_encrypted(b_data))
|
||||||
|
|
||||||
def test_invalid_text_not_ascii(self):
|
def test_invalid_text_not_ascii(self):
|
||||||
data = u"$ANSIBLE_VAULT;9.9;TEST\n%s"% u"ァ ア ィ イ ゥ ウ ェ エ ォ オ カ ガ キ ギ ク グ ケ "
|
data = u"$ANSIBLE_VAULT;9.9;TEST\n%s" % u"ァ ア ィ イ ゥ ウ ェ エ ォ オ カ ガ キ ギ ク グ ケ "
|
||||||
self.assertFalse(vault.is_encrypted(data))
|
self.assertFalse(vault.is_encrypted(data))
|
||||||
|
|
||||||
def test_invalid_bytes_not_ascii(self):
|
def test_invalid_bytes_not_ascii(self):
|
||||||
data = u"$ANSIBLE_VAULT;9.9;TEST\n%s"% u"ァ ア ィ イ ゥ ウ ェ エ ォ オ カ ガ キ ギ ク グ ケ "
|
data = u"$ANSIBLE_VAULT;9.9;TEST\n%s" % u"ァ ア ィ イ ゥ ウ ェ エ ォ オ カ ガ キ ギ ク グ ケ "
|
||||||
b_data = to_bytes(data, encoding='utf-8')
|
b_data = to_bytes(data, encoding='utf-8')
|
||||||
self.assertFalse(vault.is_encrypted(b_data))
|
self.assertFalse(vault.is_encrypted(b_data))
|
||||||
|
|
||||||
|
|
|
@ -74,7 +74,7 @@ class TestVaultEditor(unittest.TestCase):
|
||||||
def tearDown(self):
|
def tearDown(self):
|
||||||
if self._test_dir:
|
if self._test_dir:
|
||||||
pass
|
pass
|
||||||
#shutil.rmtree(self._test_dir)
|
# shutil.rmtree(self._test_dir)
|
||||||
self._test_dir = None
|
self._test_dir = None
|
||||||
|
|
||||||
def test_methods_exist(self):
|
def test_methods_exist(self):
|
||||||
|
@ -361,7 +361,7 @@ class TestVaultEditor(unittest.TestCase):
|
||||||
|
|
||||||
self.assertEqual(src_file_plaintext, new_src_contents)
|
self.assertEqual(src_file_plaintext, new_src_contents)
|
||||||
|
|
||||||
#self.assertEqual(src_file_plaintext, new_src_contents,
|
# self.assertEqual(src_file_plaintext, new_src_contents,
|
||||||
# 'The decrypted plaintext of the editted file is not the expected contents.')
|
# 'The decrypted plaintext of the editted file is not the expected contents.')
|
||||||
|
|
||||||
@patch('ansible.parsing.vault.call')
|
@patch('ansible.parsing.vault.call')
|
||||||
|
|
|
@ -26,15 +26,14 @@ try:
|
||||||
except ImportError:
|
except ImportError:
|
||||||
from yaml.parser import ParserError
|
from yaml.parser import ParserError
|
||||||
|
|
||||||
from ansible.parsing.yaml import dumper
|
from ansible.compat.tests import unittest
|
||||||
|
from ansible.parsing import vault
|
||||||
|
from ansible.parsing.yaml import dumper, objects
|
||||||
from ansible.parsing.yaml.loader import AnsibleLoader
|
from ansible.parsing.yaml.loader import AnsibleLoader
|
||||||
|
|
||||||
from ansible.compat.tests import unittest
|
|
||||||
from ansible.parsing.yaml import objects
|
|
||||||
from ansible.parsing import vault
|
|
||||||
|
|
||||||
from units.mock.yaml_helper import YamlTestUtils
|
from units.mock.yaml_helper import YamlTestUtils
|
||||||
|
|
||||||
|
|
||||||
class TestAnsibleDumper(unittest.TestCase, YamlTestUtils):
|
class TestAnsibleDumper(unittest.TestCase, YamlTestUtils):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
self.vault_password = "hunter42"
|
self.vault_password = "hunter42"
|
||||||
|
@ -43,7 +42,7 @@ class TestAnsibleDumper(unittest.TestCase, YamlTestUtils):
|
||||||
self.stream = self._build_stream()
|
self.stream = self._build_stream()
|
||||||
self.dumper = dumper.AnsibleDumper
|
self.dumper = dumper.AnsibleDumper
|
||||||
|
|
||||||
def _build_stream(self,yaml_text=None):
|
def _build_stream(self, yaml_text=None):
|
||||||
text = yaml_text or u''
|
text = yaml_text or u''
|
||||||
stream = io.StringIO(text)
|
stream = io.StringIO(text)
|
||||||
return stream
|
return stream
|
||||||
|
|
|
@ -341,16 +341,17 @@ class TestAnsibleLoaderPlay(unittest.TestCase):
|
||||||
self.assertEqual(self.data[0][u'vars'][u'number'], 1)
|
self.assertEqual(self.data[0][u'vars'][u'number'], 1)
|
||||||
self.assertEqual(self.data[0][u'vars'][u'string'], u'Ansible')
|
self.assertEqual(self.data[0][u'vars'][u'string'], u'Ansible')
|
||||||
self.assertEqual(self.data[0][u'vars'][u'utf8_string'], u'Cafè Eñyei')
|
self.assertEqual(self.data[0][u'vars'][u'utf8_string'], u'Cafè Eñyei')
|
||||||
self.assertEqual(self.data[0][u'vars'][u'dictionary'],
|
self.assertEqual(self.data[0][u'vars'][u'dictionary'], {
|
||||||
{u'webster': u'daniel',
|
u'webster': u'daniel',
|
||||||
u'oed': u'oxford'})
|
u'oed': u'oxford'
|
||||||
|
})
|
||||||
self.assertEqual(self.data[0][u'vars'][u'list'], [u'a', u'b', 1, 2])
|
self.assertEqual(self.data[0][u'vars'][u'list'], [u'a', u'b', 1, 2])
|
||||||
|
|
||||||
self.assertEqual(self.data[0][u'tasks'],
|
self.assertEqual(self.data[0][u'tasks'], [
|
||||||
[{u'name': u'Test case', u'ping': {u'data': u'{{ utf8_string }}'}},
|
{u'name': u'Test case', u'ping': {u'data': u'{{ utf8_string }}'}},
|
||||||
{u'name': u'Test 2', u'ping': {u'data': u'Cafè Eñyei'}},
|
{u'name': u'Test 2', u'ping': {u'data': u'Cafè Eñyei'}},
|
||||||
{u'name': u'Test 3', u'command': u'printf \'Cafè Eñyei\n\''},
|
{u'name': u'Test 3', u'command': u'printf \'Cafè Eñyei\n\''},
|
||||||
])
|
])
|
||||||
|
|
||||||
def walk(self, data):
|
def walk(self, data):
|
||||||
# Make sure there's no str in the data
|
# Make sure there's no str in the data
|
||||||
|
|
|
@ -104,22 +104,22 @@ class TestAnsibleVaultEncryptedUnicode(unittest.TestCase, YamlTestUtils):
|
||||||
def test_empty_string_init_from_plaintext(self):
|
def test_empty_string_init_from_plaintext(self):
|
||||||
seq = ''
|
seq = ''
|
||||||
avu = self._from_plaintext(seq)
|
avu = self._from_plaintext(seq)
|
||||||
self.assert_values(avu,seq)
|
self.assert_values(avu, seq)
|
||||||
|
|
||||||
def test_empty_unicode_init_from_plaintext(self):
|
def test_empty_unicode_init_from_plaintext(self):
|
||||||
seq = u''
|
seq = u''
|
||||||
avu = self._from_plaintext(seq)
|
avu = self._from_plaintext(seq)
|
||||||
self.assert_values(avu,seq)
|
self.assert_values(avu, seq)
|
||||||
|
|
||||||
def test_string_from_plaintext(self):
|
def test_string_from_plaintext(self):
|
||||||
seq = 'some letters'
|
seq = 'some letters'
|
||||||
avu = self._from_plaintext(seq)
|
avu = self._from_plaintext(seq)
|
||||||
self.assert_values(avu,seq)
|
self.assert_values(avu, seq)
|
||||||
|
|
||||||
def test_unicode_from_plaintext(self):
|
def test_unicode_from_plaintext(self):
|
||||||
seq = u'some letters'
|
seq = u'some letters'
|
||||||
avu = self._from_plaintext(seq)
|
avu = self._from_plaintext(seq)
|
||||||
self.assert_values(avu,seq)
|
self.assert_values(avu, seq)
|
||||||
|
|
||||||
def test_unicode_from_plaintext_encode(self):
|
def test_unicode_from_plaintext_encode(self):
|
||||||
seq = u'some text here'
|
seq = u'some text here'
|
||||||
|
|
|
@ -274,4 +274,3 @@ class TestRole(unittest.TestCase):
|
||||||
r = Role.load(i, play=mock_play)
|
r = Role.load(i, play=mock_play)
|
||||||
|
|
||||||
self.assertEqual(r.get_name(), "foo_complex")
|
self.assertEqual(r.get_name(), "foo_complex")
|
||||||
|
|
||||||
|
|
|
@ -52,4 +52,3 @@ class TestAttribute(unittest.TestCase):
|
||||||
self.assertTrue(self.one >= self.one)
|
self.assertTrue(self.one >= self.one)
|
||||||
self.assertFalse(self.one >= self.two)
|
self.assertFalse(self.one >= self.two)
|
||||||
self.assertTrue(self.two >= self.one)
|
self.assertTrue(self.two >= self.one)
|
||||||
|
|
||||||
|
|
|
@ -114,7 +114,7 @@ class TestBase(unittest.TestCase):
|
||||||
data = {'no_log': False,
|
data = {'no_log': False,
|
||||||
'remote_user': None,
|
'remote_user': None,
|
||||||
'vars': self.assorted_vars,
|
'vars': self.assorted_vars,
|
||||||
#'check_mode': False,
|
# 'check_mode': False,
|
||||||
'always_run': False,
|
'always_run': False,
|
||||||
'environment': [],
|
'environment': [],
|
||||||
'run_once': False,
|
'run_once': False,
|
||||||
|
@ -340,8 +340,7 @@ class BaseSubClass(base.Base):
|
||||||
_test_attr_unknown_isa = FieldAttribute(isa='not_a_real_isa', always_post_validate=True)
|
_test_attr_unknown_isa = FieldAttribute(isa='not_a_real_isa', always_post_validate=True)
|
||||||
_test_attr_example = FieldAttribute(isa='string', default='the_default',
|
_test_attr_example = FieldAttribute(isa='string', default='the_default',
|
||||||
always_post_validate=True)
|
always_post_validate=True)
|
||||||
_test_attr_none = FieldAttribute(isa='string',
|
_test_attr_none = FieldAttribute(isa='string', always_post_validate=True)
|
||||||
always_post_validate=True)
|
|
||||||
_test_attr_preprocess = FieldAttribute(isa='string', default='the default for preprocess')
|
_test_attr_preprocess = FieldAttribute(isa='string', default='the default for preprocess')
|
||||||
_test_attr_method = FieldAttribute(isa='string', default='some attr with a getter',
|
_test_attr_method = FieldAttribute(isa='string', default='some attr with a getter',
|
||||||
always_post_validate=True)
|
always_post_validate=True)
|
||||||
|
|
|
@ -19,9 +19,10 @@
|
||||||
from __future__ import (absolute_import, division, print_function)
|
from __future__ import (absolute_import, division, print_function)
|
||||||
__metaclass__ = type
|
__metaclass__ = type
|
||||||
|
|
||||||
|
from ansible.compat.tests import unittest
|
||||||
from ansible.playbook.block import Block
|
from ansible.playbook.block import Block
|
||||||
from ansible.playbook.task import Task
|
from ansible.playbook.task import Task
|
||||||
from ansible.compat.tests import unittest
|
|
||||||
|
|
||||||
class TestBlock(unittest.TestCase):
|
class TestBlock(unittest.TestCase):
|
||||||
|
|
||||||
|
@ -39,24 +40,24 @@ class TestBlock(unittest.TestCase):
|
||||||
|
|
||||||
def test_load_block_simple(self):
|
def test_load_block_simple(self):
|
||||||
ds = dict(
|
ds = dict(
|
||||||
block = [],
|
block=[],
|
||||||
rescue = [],
|
rescue=[],
|
||||||
always = [],
|
always=[],
|
||||||
#otherwise = [],
|
# otherwise=[],
|
||||||
)
|
)
|
||||||
b = Block.load(ds)
|
b = Block.load(ds)
|
||||||
self.assertEqual(b.block, [])
|
self.assertEqual(b.block, [])
|
||||||
self.assertEqual(b.rescue, [])
|
self.assertEqual(b.rescue, [])
|
||||||
self.assertEqual(b.always, [])
|
self.assertEqual(b.always, [])
|
||||||
# not currently used
|
# not currently used
|
||||||
#self.assertEqual(b.otherwise, [])
|
# self.assertEqual(b.otherwise, [])
|
||||||
|
|
||||||
def test_load_block_with_tasks(self):
|
def test_load_block_with_tasks(self):
|
||||||
ds = dict(
|
ds = dict(
|
||||||
block = [dict(action='block')],
|
block=[dict(action='block')],
|
||||||
rescue = [dict(action='rescue')],
|
rescue=[dict(action='rescue')],
|
||||||
always = [dict(action='always')],
|
always=[dict(action='always')],
|
||||||
#otherwise = [dict(action='otherwise')],
|
# otherwise=[dict(action='otherwise')],
|
||||||
)
|
)
|
||||||
b = Block.load(ds)
|
b = Block.load(ds)
|
||||||
self.assertEqual(len(b.block), 1)
|
self.assertEqual(len(b.block), 1)
|
||||||
|
@ -66,8 +67,8 @@ class TestBlock(unittest.TestCase):
|
||||||
self.assertEqual(len(b.always), 1)
|
self.assertEqual(len(b.always), 1)
|
||||||
self.assertIsInstance(b.always[0], Task)
|
self.assertIsInstance(b.always[0], Task)
|
||||||
# not currently used
|
# not currently used
|
||||||
#self.assertEqual(len(b.otherwise), 1)
|
# self.assertEqual(len(b.otherwise), 1)
|
||||||
#self.assertIsInstance(b.otherwise[0], Task)
|
# self.assertIsInstance(b.otherwise[0], Task)
|
||||||
|
|
||||||
def test_load_implicit_block(self):
|
def test_load_implicit_block(self):
|
||||||
ds = [dict(action='foo')]
|
ds = [dict(action='foo')]
|
||||||
|
@ -77,12 +78,11 @@ class TestBlock(unittest.TestCase):
|
||||||
|
|
||||||
def test_deserialize(self):
|
def test_deserialize(self):
|
||||||
ds = dict(
|
ds = dict(
|
||||||
block = [dict(action='block')],
|
block=[dict(action='block')],
|
||||||
rescue = [dict(action='rescue')],
|
rescue=[dict(action='rescue')],
|
||||||
always = [dict(action='always')],
|
always=[dict(action='always')],
|
||||||
)
|
)
|
||||||
b = Block.load(ds)
|
b = Block.load(ds)
|
||||||
data = dict(parent = ds, parent_type = 'Block')
|
data = dict(parent=ds, parent_type='Block')
|
||||||
b.deserialize(data)
|
b.deserialize(data)
|
||||||
self.assertIsInstance(b._parent, Block)
|
self.assertIsInstance(b._parent, Block)
|
||||||
|
|
||||||
|
|
|
@ -97,11 +97,11 @@ class TestConditional(unittest.TestCase):
|
||||||
}
|
}
|
||||||
|
|
||||||
when = [u"some_dict.some_dict_key1 == hostvars['host3']"]
|
when = [u"some_dict.some_dict_key1 == hostvars['host3']"]
|
||||||
#self._eval_con(when, variables)
|
# self._eval_con(when, variables)
|
||||||
self.assertRaisesRegexp(errors.AnsibleError,
|
self.assertRaisesRegexp(errors.AnsibleError,
|
||||||
"The conditional check 'some_dict.some_dict_key1 == hostvars\['host3'\]' failed",
|
"The conditional check 'some_dict.some_dict_key1 == hostvars\['host3'\]' failed",
|
||||||
#"The conditional check 'some_dict.some_dict_key1 == hostvars['host3']' failed",
|
# "The conditional check 'some_dict.some_dict_key1 == hostvars['host3']' failed",
|
||||||
#"The conditional check 'some_dict.some_dict_key1 == hostvars['host3']' failed.",
|
# "The conditional check 'some_dict.some_dict_key1 == hostvars['host3']' failed.",
|
||||||
self._eval_con,
|
self._eval_con,
|
||||||
when, variables)
|
when, variables)
|
||||||
|
|
||||||
|
|
|
@ -222,7 +222,7 @@ class TestLoadListOfTasks(unittest.TestCase, MixinForMocks):
|
||||||
# TODO/FIXME: do this non deprecated way
|
# TODO/FIXME: do this non deprecated way
|
||||||
def test_one_parent_include_tags(self):
|
def test_one_parent_include_tags(self):
|
||||||
ds = [{'include': '/dev/null/includes/test_include.yml',
|
ds = [{'include': '/dev/null/includes/test_include.yml',
|
||||||
#'vars': {'tags': ['test_one_parent_include_tags_tag1', 'and_another_tag2']}
|
# 'vars': {'tags': ['test_one_parent_include_tags_tag1', 'and_another_tag2']}
|
||||||
'tags': ['test_one_parent_include_tags_tag1', 'and_another_tag2']
|
'tags': ['test_one_parent_include_tags_tag1', 'and_another_tag2']
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
@ -281,7 +281,7 @@ class TestLoadListOfTasks(unittest.TestCase, MixinForMocks):
|
||||||
'include': '/dev/null/includes/static_test_include.yml',
|
'include': '/dev/null/includes/static_test_include.yml',
|
||||||
'static': False
|
'static': False
|
||||||
}]
|
}]
|
||||||
#a_block = Block()
|
# a_block = Block()
|
||||||
ti_ds = {'include': '/dev/null/includes/ssdftatic_test_include.yml'}
|
ti_ds = {'include': '/dev/null/includes/ssdftatic_test_include.yml'}
|
||||||
a_task_include = TaskInclude()
|
a_task_include = TaskInclude()
|
||||||
ti = a_task_include.load(ti_ds)
|
ti = a_task_include.load(ti_ds)
|
||||||
|
|
|
@ -21,30 +21,30 @@ __metaclass__ = type
|
||||||
|
|
||||||
import os
|
import os
|
||||||
|
|
||||||
from ansible.compat.tests import unittest
|
|
||||||
from ansible.compat.tests.mock import patch, MagicMock
|
|
||||||
|
|
||||||
from ansible import constants as C
|
from ansible import constants as C
|
||||||
from ansible.cli import CLI
|
from ansible.cli import CLI
|
||||||
|
from ansible.compat.tests import unittest
|
||||||
|
from ansible.compat.tests.mock import patch, MagicMock
|
||||||
from ansible.errors import AnsibleError, AnsibleParserError
|
from ansible.errors import AnsibleError, AnsibleParserError
|
||||||
from ansible.module_utils.six.moves import shlex_quote
|
from ansible.module_utils.six.moves import shlex_quote
|
||||||
from ansible.playbook.play_context import PlayContext
|
from ansible.playbook.play_context import PlayContext
|
||||||
|
|
||||||
from units.mock.loader import DictDataLoader
|
from units.mock.loader import DictDataLoader
|
||||||
|
|
||||||
|
|
||||||
class TestPlayContext(unittest.TestCase):
|
class TestPlayContext(unittest.TestCase):
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
self._parser = CLI.base_parser(
|
self._parser = CLI.base_parser(
|
||||||
runas_opts = True,
|
runas_opts=True,
|
||||||
meta_opts = True,
|
meta_opts=True,
|
||||||
runtask_opts = True,
|
runtask_opts=True,
|
||||||
vault_opts = True,
|
vault_opts=True,
|
||||||
async_opts = True,
|
async_opts=True,
|
||||||
connect_opts = True,
|
connect_opts=True,
|
||||||
subset_opts = True,
|
subset_opts=True,
|
||||||
check_opts = True,
|
check_opts=True,
|
||||||
inventory_opts = True,
|
inventory_opts=True,
|
||||||
)
|
)
|
||||||
|
|
||||||
def tearDown(self):
|
def tearDown(self):
|
||||||
|
@ -66,13 +66,13 @@ class TestPlayContext(unittest.TestCase):
|
||||||
self.assertEqual(play_context.no_log, None)
|
self.assertEqual(play_context.no_log, None)
|
||||||
|
|
||||||
mock_play = MagicMock()
|
mock_play = MagicMock()
|
||||||
mock_play.connection = 'mock'
|
mock_play.connection = 'mock'
|
||||||
mock_play.remote_user = 'mock'
|
mock_play.remote_user = 'mock'
|
||||||
mock_play.port = 1234
|
mock_play.port = 1234
|
||||||
mock_play.become = True
|
mock_play.become = True
|
||||||
mock_play.become_method = 'mock'
|
mock_play.become_method = 'mock'
|
||||||
mock_play.become_user = 'mockroot'
|
mock_play.become_user = 'mockroot'
|
||||||
mock_play.no_log = True
|
mock_play.no_log = True
|
||||||
|
|
||||||
play_context = PlayContext(play=mock_play, options=options)
|
play_context = PlayContext(play=mock_play, options=options)
|
||||||
self.assertEqual(play_context.connection, 'mock')
|
self.assertEqual(play_context.connection, 'mock')
|
||||||
|
@ -84,19 +84,19 @@ class TestPlayContext(unittest.TestCase):
|
||||||
self.assertEqual(play_context.become_user, "mockroot")
|
self.assertEqual(play_context.become_user, "mockroot")
|
||||||
|
|
||||||
mock_task = MagicMock()
|
mock_task = MagicMock()
|
||||||
mock_task.connection = 'mocktask'
|
mock_task.connection = 'mocktask'
|
||||||
mock_task.remote_user = 'mocktask'
|
mock_task.remote_user = 'mocktask'
|
||||||
mock_task.no_log = mock_play.no_log
|
mock_task.no_log = mock_play.no_log
|
||||||
mock_task.become = True
|
mock_task.become = True
|
||||||
mock_task.become_method = 'mocktask'
|
mock_task.become_method = 'mocktask'
|
||||||
mock_task.become_user = 'mocktaskroot'
|
mock_task.become_user = 'mocktaskroot'
|
||||||
mock_task.become_pass = 'mocktaskpass'
|
mock_task.become_pass = 'mocktaskpass'
|
||||||
mock_task._local_action = False
|
mock_task._local_action = False
|
||||||
mock_task.delegate_to = None
|
mock_task.delegate_to = None
|
||||||
|
|
||||||
all_vars = dict(
|
all_vars = dict(
|
||||||
ansible_connection = 'mock_inventory',
|
ansible_connection='mock_inventory',
|
||||||
ansible_ssh_port = 4321,
|
ansible_ssh_port=4321,
|
||||||
)
|
)
|
||||||
|
|
||||||
mock_templar = MagicMock()
|
mock_templar = MagicMock()
|
||||||
|
@ -112,7 +112,7 @@ class TestPlayContext(unittest.TestCase):
|
||||||
self.assertEqual(play_context.become_user, "mocktaskroot")
|
self.assertEqual(play_context.become_user, "mocktaskroot")
|
||||||
self.assertEqual(play_context.become_pass, "mocktaskpass")
|
self.assertEqual(play_context.become_pass, "mocktaskpass")
|
||||||
|
|
||||||
mock_task.no_log = False
|
mock_task.no_log = False
|
||||||
play_context = play_context.set_task_and_variable_override(task=mock_task, variables=all_vars, templar=mock_templar)
|
play_context = play_context.set_task_and_variable_override(task=mock_task, variables=all_vars, templar=mock_templar)
|
||||||
self.assertEqual(play_context.no_log, False)
|
self.assertEqual(play_context.no_log, False)
|
||||||
|
|
||||||
|
@ -122,19 +122,19 @@ class TestPlayContext(unittest.TestCase):
|
||||||
|
|
||||||
default_cmd = "/bin/foo"
|
default_cmd = "/bin/foo"
|
||||||
default_exe = "/bin/bash"
|
default_exe = "/bin/bash"
|
||||||
sudo_exe = C.DEFAULT_SUDO_EXE or 'sudo'
|
sudo_exe = C.DEFAULT_SUDO_EXE or 'sudo'
|
||||||
sudo_flags = C.DEFAULT_SUDO_FLAGS
|
sudo_flags = C.DEFAULT_SUDO_FLAGS
|
||||||
su_exe = C.DEFAULT_SU_EXE or 'su'
|
su_exe = C.DEFAULT_SU_EXE or 'su'
|
||||||
su_flags = C.DEFAULT_SU_FLAGS or ''
|
su_flags = C.DEFAULT_SU_FLAGS or ''
|
||||||
pbrun_exe = 'pbrun'
|
pbrun_exe = 'pbrun'
|
||||||
pbrun_flags = ''
|
pbrun_flags = ''
|
||||||
pfexec_exe = 'pfexec'
|
pfexec_exe = 'pfexec'
|
||||||
pfexec_flags = ''
|
pfexec_flags = ''
|
||||||
doas_exe = 'doas'
|
doas_exe = 'doas'
|
||||||
doas_flags = ' -n -u foo '
|
doas_flags = ' -n -u foo '
|
||||||
ksu_exe = 'ksu'
|
ksu_exe = 'ksu'
|
||||||
ksu_flags = ''
|
ksu_flags = ''
|
||||||
dzdo_exe = 'dzdo'
|
dzdo_exe = 'dzdo'
|
||||||
|
|
||||||
cmd = play_context.make_become_cmd(cmd=default_cmd, executable=default_exe)
|
cmd = play_context.make_become_cmd(cmd=default_cmd, executable=default_exe)
|
||||||
self.assertEqual(cmd, default_cmd)
|
self.assertEqual(cmd, default_cmd)
|
||||||
|
@ -152,7 +152,7 @@ class TestPlayContext(unittest.TestCase):
|
||||||
cmd = play_context.make_become_cmd(cmd=default_cmd, executable=default_exe)
|
cmd = play_context.make_become_cmd(cmd=default_cmd, executable=default_exe)
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
cmd,
|
cmd,
|
||||||
"""%s %s -p "%s" -u %s %s -c 'echo %s; %s'""" % (sudo_exe, sudo_flags.replace('-n',''), play_context.prompt, play_context.become_user, default_exe,
|
"""%s %s -p "%s" -u %s %s -c 'echo %s; %s'""" % (sudo_exe, sudo_flags.replace('-n', ''), play_context.prompt, play_context.become_user, default_exe,
|
||||||
play_context.success_key, default_cmd)
|
play_context.success_key, default_cmd)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -207,103 +207,129 @@ class TestPlayContext(unittest.TestCase):
|
||||||
class TestTaskAndVariableOverrride(unittest.TestCase):
|
class TestTaskAndVariableOverrride(unittest.TestCase):
|
||||||
|
|
||||||
inventory_vars = (
|
inventory_vars = (
|
||||||
('preferred_names',
|
(
|
||||||
dict(ansible_connection='local',
|
'preferred_names',
|
||||||
ansible_user='ansibull',
|
dict(
|
||||||
ansible_become_user='ansibull',
|
ansible_connection='local',
|
||||||
ansible_become_method='su',
|
ansible_user='ansibull',
|
||||||
ansible_become_pass='ansibullwuzhere',),
|
ansible_become_user='ansibull',
|
||||||
dict(connection='local',
|
ansible_become_method='su',
|
||||||
remote_user='ansibull',
|
ansible_become_pass='ansibullwuzhere',
|
||||||
become_user='ansibull',
|
|
||||||
become_method='su',
|
|
||||||
become_pass='ansibullwuzhere',)
|
|
||||||
),
|
),
|
||||||
('alternate_names',
|
dict(
|
||||||
dict(ansible_become_password='ansibullwuzhere',),
|
connection='local',
|
||||||
dict(become_pass='ansibullwuzhere',)
|
remote_user='ansibull',
|
||||||
|
become_user='ansibull',
|
||||||
|
become_method='su',
|
||||||
|
become_pass='ansibullwuzhere',
|
||||||
|
)
|
||||||
|
),
|
||||||
|
(
|
||||||
|
'alternate_names',
|
||||||
|
dict(ansible_become_password='ansibullwuzhere',),
|
||||||
|
dict(become_pass='ansibullwuzhere',)
|
||||||
|
),
|
||||||
|
(
|
||||||
|
'deprecated_names',
|
||||||
|
dict(
|
||||||
|
ansible_ssh_user='ansibull',
|
||||||
|
ansible_sudo_user='ansibull',
|
||||||
|
ansible_sudo_pass='ansibullwuzhere',
|
||||||
),
|
),
|
||||||
('deprecated_names',
|
dict(
|
||||||
dict(ansible_ssh_user='ansibull',
|
remote_user='ansibull',
|
||||||
ansible_sudo_user='ansibull',
|
become_method='sudo',
|
||||||
ansible_sudo_pass='ansibullwuzhere',),
|
become_user='ansibull',
|
||||||
dict(remote_user='ansibull',
|
become_pass='ansibullwuzhere',
|
||||||
become_method='sudo',
|
)
|
||||||
become_user='ansibull',
|
),
|
||||||
become_pass='ansibullwuzhere',)
|
(
|
||||||
|
'deprecated_names2',
|
||||||
|
dict(
|
||||||
|
ansible_ssh_user='ansibull',
|
||||||
|
ansible_su_user='ansibull',
|
||||||
|
ansible_su_pass='ansibullwuzhere',
|
||||||
),
|
),
|
||||||
('deprecated_names2',
|
dict(
|
||||||
dict(ansible_ssh_user='ansibull',
|
remote_user='ansibull',
|
||||||
ansible_su_user='ansibull',
|
become_method='su',
|
||||||
ansible_su_pass='ansibullwuzhere',),
|
become_user='ansibull',
|
||||||
dict(remote_user='ansibull',
|
become_pass='ansibullwuzhere',
|
||||||
become_method='su',
|
)
|
||||||
become_user='ansibull',
|
),
|
||||||
become_pass='ansibullwuzhere',)
|
(
|
||||||
),
|
'deprecated_alt_names',
|
||||||
('deprecated_alt_names',
|
dict(ansible_sudo_password='ansibullwuzhere',),
|
||||||
dict(ansible_sudo_password='ansibullwuzhere',),
|
dict(
|
||||||
dict(become_method='sudo',
|
become_method='sudo',
|
||||||
become_pass='ansibullwuzhere',)
|
become_pass='ansibullwuzhere',
|
||||||
),
|
)
|
||||||
('deprecated_alt_names2',
|
),
|
||||||
dict(ansible_su_password='ansibullwuzhere',),
|
(
|
||||||
dict(become_method='su',
|
'deprecated_alt_names2',
|
||||||
become_pass='ansibullwuzhere',)
|
dict(ansible_su_password='ansibullwuzhere',),
|
||||||
),
|
dict(
|
||||||
('deprecated_and_preferred_names',
|
become_method='su',
|
||||||
dict(ansible_user='ansibull',
|
become_pass='ansibullwuzhere',
|
||||||
ansible_ssh_user='badbull',
|
)
|
||||||
ansible_become_user='ansibull',
|
),
|
||||||
ansible_sudo_user='badbull',
|
(
|
||||||
ansible_become_method='su',
|
'deprecated_and_preferred_names',
|
||||||
ansible_become_pass='ansibullwuzhere',
|
dict(
|
||||||
ansible_sudo_pass='badbull',
|
ansible_user='ansibull',
|
||||||
),
|
ansible_ssh_user='badbull',
|
||||||
dict(connection='local',
|
ansible_become_user='ansibull',
|
||||||
remote_user='ansibull',
|
ansible_sudo_user='badbull',
|
||||||
become_user='ansibull',
|
ansible_become_method='su',
|
||||||
become_method='su',
|
ansible_become_pass='ansibullwuzhere',
|
||||||
become_pass='ansibullwuzhere',)
|
ansible_sudo_pass='badbull',
|
||||||
),
|
),
|
||||||
|
dict(
|
||||||
|
connection='local',
|
||||||
|
remote_user='ansibull',
|
||||||
|
become_user='ansibull',
|
||||||
|
become_method='su',
|
||||||
|
become_pass='ansibullwuzhere',
|
||||||
|
)
|
||||||
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
parser = CLI.base_parser(
|
parser = CLI.base_parser(
|
||||||
runas_opts = True,
|
runas_opts=True,
|
||||||
meta_opts = True,
|
meta_opts=True,
|
||||||
runtask_opts = True,
|
runtask_opts=True,
|
||||||
vault_opts = True,
|
vault_opts=True,
|
||||||
async_opts = True,
|
async_opts=True,
|
||||||
connect_opts = True,
|
connect_opts=True,
|
||||||
subset_opts = True,
|
subset_opts=True,
|
||||||
check_opts = True,
|
check_opts=True,
|
||||||
inventory_opts = True,
|
inventory_opts=True,
|
||||||
)
|
)
|
||||||
|
|
||||||
(options, args) = parser.parse_args(['-vv', '--check'])
|
(options, args) = parser.parse_args(['-vv', '--check'])
|
||||||
|
|
||||||
mock_play = MagicMock()
|
mock_play = MagicMock()
|
||||||
mock_play.connection = 'mock'
|
mock_play.connection = 'mock'
|
||||||
mock_play.remote_user = 'mock'
|
mock_play.remote_user = 'mock'
|
||||||
mock_play.port = 1234
|
mock_play.port = 1234
|
||||||
mock_play.become = True
|
mock_play.become = True
|
||||||
mock_play.become_method = 'mock'
|
mock_play.become_method = 'mock'
|
||||||
mock_play.become_user = 'mockroot'
|
mock_play.become_user = 'mockroot'
|
||||||
mock_play.no_log = True
|
mock_play.no_log = True
|
||||||
|
|
||||||
self.play_context = PlayContext(play=mock_play, options=options)
|
self.play_context = PlayContext(play=mock_play, options=options)
|
||||||
|
|
||||||
mock_task = MagicMock()
|
mock_task = MagicMock()
|
||||||
mock_task.connection = mock_play.connection
|
mock_task.connection = mock_play.connection
|
||||||
mock_task.remote_user = mock_play.remote_user
|
mock_task.remote_user = mock_play.remote_user
|
||||||
mock_task.no_log = mock_play.no_log
|
mock_task.no_log = mock_play.no_log
|
||||||
mock_task.become = mock_play.become
|
mock_task.become = mock_play.become
|
||||||
mock_task.become_method = mock_play.becom_method
|
mock_task.become_method = mock_play.becom_method
|
||||||
mock_task.become_user = mock_play.become_user
|
mock_task.become_user = mock_play.become_user
|
||||||
mock_task.become_pass = 'mocktaskpass'
|
mock_task.become_pass = 'mocktaskpass'
|
||||||
mock_task._local_action = False
|
mock_task._local_action = False
|
||||||
mock_task.delegate_to = None
|
mock_task.delegate_to = None
|
||||||
|
|
||||||
self.mock_task = mock_task
|
self.mock_task = mock_task
|
||||||
|
|
||||||
|
@ -322,19 +348,19 @@ class TestTaskAndVariableOverrride(unittest.TestCase):
|
||||||
self.assertEqual(play_context.become_user, "mocktaskroot")
|
self.assertEqual(play_context.become_user, "mocktaskroot")
|
||||||
self.assertEqual(play_context.become_pass, "mocktaskpass")
|
self.assertEqual(play_context.become_pass, "mocktaskpass")
|
||||||
|
|
||||||
mock_task.no_log = False
|
mock_task.no_log = False
|
||||||
play_context = play_context.set_task_and_variable_override(task=mock_task, variables=all_vars, templar=mock_templar)
|
play_context = play_context.set_task_and_variable_override(task=mock_task, variables=all_vars, templar=mock_templar)
|
||||||
self.assertEqual(play_context.no_log, False)
|
self.assertEqual(play_context.no_log, False)
|
||||||
|
|
||||||
def test_override_magic_variables(self):
|
def test_override_magic_variables(self):
|
||||||
play_context = play_context.set_task_and_variable_override(task=self.mock_task, variables=all_vars, templar=self.mock_templar)
|
play_context = play_context.set_task_and_variable_override(task=self.mock_task, variables=all_vars, templar=self.mock_templar)
|
||||||
|
|
||||||
mock_play.connection = 'mock'
|
mock_play.connection = 'mock'
|
||||||
mock_play.remote_user = 'mock'
|
mock_play.remote_user = 'mock'
|
||||||
mock_play.port = 1234
|
mock_play.port = 1234
|
||||||
mock_play.become_method = 'mock'
|
mock_play.become_method = 'mock'
|
||||||
mock_play.become_user = 'mockroot'
|
mock_play.become_user = 'mockroot'
|
||||||
mock_task.become_pass = 'mocktaskpass'
|
mock_task.become_pass = 'mocktaskpass'
|
||||||
# Inventory vars override things set from cli vars (--become, -user,
|
# Inventory vars override things set from cli vars (--become, -user,
|
||||||
# etc... [notably, not --extravars])
|
# etc... [notably, not --extravars])
|
||||||
for test_name, all_vars, expected in self.inventory_vars:
|
for test_name, all_vars, expected in self.inventory_vars:
|
||||||
|
|
|
@ -21,13 +21,13 @@ __metaclass__ = type
|
||||||
|
|
||||||
from ansible.compat.tests import unittest
|
from ansible.compat.tests import unittest
|
||||||
from ansible.compat.tests.mock import patch, MagicMock
|
from ansible.compat.tests.mock import patch, MagicMock
|
||||||
|
|
||||||
from ansible.errors import AnsibleError, AnsibleParserError
|
from ansible.errors import AnsibleError, AnsibleParserError
|
||||||
from ansible.playbook import Playbook
|
from ansible.playbook import Playbook
|
||||||
from ansible.vars.manager import VariableManager
|
from ansible.vars.manager import VariableManager
|
||||||
|
|
||||||
from units.mock.loader import DictDataLoader
|
from units.mock.loader import DictDataLoader
|
||||||
|
|
||||||
|
|
||||||
class TestPlaybook(unittest.TestCase):
|
class TestPlaybook(unittest.TestCase):
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
|
@ -42,7 +42,7 @@ class TestPlaybook(unittest.TestCase):
|
||||||
|
|
||||||
def test_basic_playbook(self):
|
def test_basic_playbook(self):
|
||||||
fake_loader = DictDataLoader({
|
fake_loader = DictDataLoader({
|
||||||
"test_file.yml":"""
|
"test_file.yml": """
|
||||||
- hosts: all
|
- hosts: all
|
||||||
""",
|
""",
|
||||||
})
|
})
|
||||||
|
|
|
@ -23,6 +23,7 @@ from ansible.compat.tests import unittest
|
||||||
from ansible.playbook.taggable import Taggable
|
from ansible.playbook.taggable import Taggable
|
||||||
from units.mock.loader import DictDataLoader
|
from units.mock.loader import DictDataLoader
|
||||||
|
|
||||||
|
|
||||||
class TaggableTestObj(Taggable):
|
class TaggableTestObj(Taggable):
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
|
|
|
@ -19,18 +19,20 @@
|
||||||
from __future__ import (absolute_import, division, print_function)
|
from __future__ import (absolute_import, division, print_function)
|
||||||
__metaclass__ = type
|
__metaclass__ = type
|
||||||
|
|
||||||
from ansible.playbook.task import Task
|
|
||||||
from ansible.compat.tests import unittest
|
from ansible.compat.tests import unittest
|
||||||
|
from ansible.playbook.task import Task
|
||||||
|
|
||||||
|
|
||||||
basic_shell_task = dict(
|
basic_shell_task = dict(
|
||||||
name = 'Test Task',
|
name='Test Task',
|
||||||
shell = 'echo hi'
|
shell='echo hi'
|
||||||
)
|
)
|
||||||
|
|
||||||
kv_shell_task = dict(
|
kv_shell_task = dict(
|
||||||
action = 'shell echo hi'
|
action='shell echo hi'
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
class TestTask(unittest.TestCase):
|
class TestTask(unittest.TestCase):
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
|
@ -66,7 +68,7 @@ class TestTask(unittest.TestCase):
|
||||||
def test_task_auto_name(self):
|
def test_task_auto_name(self):
|
||||||
assert 'name' not in kv_shell_task
|
assert 'name' not in kv_shell_task
|
||||||
t = Task.load(kv_shell_task)
|
t = Task.load(kv_shell_task)
|
||||||
#self.assertEqual(t.name, 'shell echo hi')
|
# self.assertEqual(t.name, 'shell echo hi')
|
||||||
|
|
||||||
def test_task_auto_name_with_role(self):
|
def test_task_auto_name_with_role(self):
|
||||||
pass
|
pass
|
||||||
|
|
|
@ -436,10 +436,19 @@ class TestActionBase(unittest.TestCase):
|
||||||
action_base._make_tmp_path.return_value = '/the/tmp/path'
|
action_base._make_tmp_path.return_value = '/the/tmp/path'
|
||||||
action_base._low_level_execute_command.return_value = dict(stdout='{"rc": 0, "stdout": "ok"}')
|
action_base._low_level_execute_command.return_value = dict(stdout='{"rc": 0, "stdout": "ok"}')
|
||||||
self.assertEqual(action_base._execute_module(module_name=None, module_args=None), dict(_ansible_parsed=True, rc=0, stdout="ok", stdout_lines=['ok']))
|
self.assertEqual(action_base._execute_module(module_name=None, module_args=None), dict(_ansible_parsed=True, rc=0, stdout="ok", stdout_lines=['ok']))
|
||||||
self.assertEqual(action_base._execute_module(module_name='foo',
|
self.assertEqual(
|
||||||
module_args=dict(z=9, y=8, x=7), task_vars=dict(a=1)),
|
action_base._execute_module(
|
||||||
dict(_ansible_parsed=True, rc=0, stdout="ok",
|
module_name='foo',
|
||||||
stdout_lines=['ok']))
|
module_args=dict(z=9, y=8, x=7),
|
||||||
|
task_vars=dict(a=1)
|
||||||
|
),
|
||||||
|
dict(
|
||||||
|
_ansible_parsed=True,
|
||||||
|
rc=0,
|
||||||
|
stdout="ok",
|
||||||
|
stdout_lines=['ok'],
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
# test with needing/removing a remote tmp path
|
# test with needing/removing a remote tmp path
|
||||||
action_base._configure_module.return_value = ('old', '#!/usr/bin/python', 'this is the module data', 'path')
|
action_base._configure_module.return_value = ('old', '#!/usr/bin/python', 'this is the module data', 'path')
|
||||||
|
@ -525,9 +534,9 @@ class TestActionBaseCleanReturnedData(unittest.TestCase):
|
||||||
|
|
||||||
mock_shared_loader_obj.connection_loader = mock_connection_loader
|
mock_shared_loader_obj.connection_loader = mock_connection_loader
|
||||||
mock_connection = MagicMock()
|
mock_connection = MagicMock()
|
||||||
#mock_connection._shell.env_prefix.side_effect = env_prefix
|
# mock_connection._shell.env_prefix.side_effect = env_prefix
|
||||||
|
|
||||||
#action_base = DerivedActionBase(mock_task, mock_connection, play_context, None, None, None)
|
# action_base = DerivedActionBase(mock_task, mock_connection, play_context, None, None, None)
|
||||||
action_base = DerivedActionBase(task=None,
|
action_base = DerivedActionBase(task=None,
|
||||||
connection=mock_connection,
|
connection=mock_connection,
|
||||||
play_context=None,
|
play_context=None,
|
||||||
|
@ -535,7 +544,7 @@ class TestActionBaseCleanReturnedData(unittest.TestCase):
|
||||||
templar=None,
|
templar=None,
|
||||||
shared_loader_obj=mock_shared_loader_obj)
|
shared_loader_obj=mock_shared_loader_obj)
|
||||||
data = {'ansible_playbook_python': '/usr/bin/python',
|
data = {'ansible_playbook_python': '/usr/bin/python',
|
||||||
#'ansible_rsync_path': '/usr/bin/rsync',
|
# 'ansible_rsync_path': '/usr/bin/rsync',
|
||||||
'ansible_python_interpreter': '/usr/bin/python',
|
'ansible_python_interpreter': '/usr/bin/python',
|
||||||
'ansible_ssh_some_var': 'whatever',
|
'ansible_ssh_some_var': 'whatever',
|
||||||
'ansible_ssh_host_key_somehost': 'some key here',
|
'ansible_ssh_host_key_somehost': 'some key here',
|
||||||
|
@ -592,7 +601,7 @@ class TestActionBaseParseReturnedData(unittest.TestCase):
|
||||||
'stdout_lines': stdout.splitlines(),
|
'stdout_lines': stdout.splitlines(),
|
||||||
'stderr': err}
|
'stderr': err}
|
||||||
res = action_base._parse_returned_data(returned_data)
|
res = action_base._parse_returned_data(returned_data)
|
||||||
del res['_ansible_parsed'] # we always have _ansible_parsed
|
del res['_ansible_parsed'] # we always have _ansible_parsed
|
||||||
self.assertEqual(len(res), 0)
|
self.assertEqual(len(res), 0)
|
||||||
self.assertFalse(res)
|
self.assertFalse(res)
|
||||||
|
|
||||||
|
@ -610,7 +619,7 @@ class TestActionBaseParseReturnedData(unittest.TestCase):
|
||||||
self.assertTrue(res['ansible_facts'])
|
self.assertTrue(res['ansible_facts'])
|
||||||
self.assertIn('ansible_blip', res['ansible_facts'])
|
self.assertIn('ansible_blip', res['ansible_facts'])
|
||||||
# TODO: Should this be an AnsibleUnsafe?
|
# TODO: Should this be an AnsibleUnsafe?
|
||||||
#self.assertIsInstance(res['ansible_facts'], AnsibleUnsafe)
|
# self.assertIsInstance(res['ansible_facts'], AnsibleUnsafe)
|
||||||
|
|
||||||
def test_json_facts_add_host(self):
|
def test_json_facts_add_host(self):
|
||||||
action_base = self._action_base()
|
action_base = self._action_base()
|
||||||
|
@ -630,4 +639,4 @@ class TestActionBaseParseReturnedData(unittest.TestCase):
|
||||||
self.assertIn('ansible_blip', res['ansible_facts'])
|
self.assertIn('ansible_blip', res['ansible_facts'])
|
||||||
self.assertIn('add_host', res)
|
self.assertIn('add_host', res)
|
||||||
# TODO: Should this be an AnsibleUnsafe?
|
# TODO: Should this be an AnsibleUnsafe?
|
||||||
#self.assertIsInstance(res['ansible_facts'], AnsibleUnsafe)
|
# self.assertIsInstance(res['ansible_facts'], AnsibleUnsafe)
|
||||||
|
|
|
@ -24,6 +24,7 @@ from ansible.compat.tests.mock import patch, MagicMock, Mock
|
||||||
from ansible.plugins.action.raw import ActionModule
|
from ansible.plugins.action.raw import ActionModule
|
||||||
from ansible.playbook.task import Task
|
from ansible.playbook.task import Task
|
||||||
|
|
||||||
|
|
||||||
class TestCopyResultExclude(unittest.TestCase):
|
class TestCopyResultExclude(unittest.TestCase):
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
|
@ -38,7 +39,6 @@ class TestCopyResultExclude(unittest.TestCase):
|
||||||
# Issue: https://github.com/ansible/ansible/issues/16054
|
# Issue: https://github.com/ansible/ansible/issues/16054
|
||||||
# PR: https://github.com/ansible/ansible/pull/16085
|
# PR: https://github.com/ansible/ansible/pull/16085
|
||||||
|
|
||||||
|
|
||||||
def test_raw_executable_is_not_empty_string(self):
|
def test_raw_executable_is_not_empty_string(self):
|
||||||
|
|
||||||
play_context = Mock()
|
play_context = Mock()
|
||||||
|
@ -50,7 +50,7 @@ class TestCopyResultExclude(unittest.TestCase):
|
||||||
play_context.check_mode = False
|
play_context.check_mode = False
|
||||||
|
|
||||||
self.mock_am = ActionModule(task, connection, play_context, loader=None, templar=None, shared_loader_obj=None)
|
self.mock_am = ActionModule(task, connection, play_context, loader=None, templar=None, shared_loader_obj=None)
|
||||||
self.mock_am._low_level_execute_command = Mock(return_value = {})
|
self.mock_am._low_level_execute_command = Mock(return_value={})
|
||||||
self.mock_am.display = Mock()
|
self.mock_am.display = Mock()
|
||||||
|
|
||||||
self.mock_am.run()
|
self.mock_am.run()
|
||||||
|
@ -83,7 +83,7 @@ class TestCopyResultExclude(unittest.TestCase):
|
||||||
play_context.check_mode = False
|
play_context.check_mode = False
|
||||||
|
|
||||||
self.mock_am = ActionModule(task, connection, play_context, loader=None, templar=None, shared_loader_obj=None)
|
self.mock_am = ActionModule(task, connection, play_context, loader=None, templar=None, shared_loader_obj=None)
|
||||||
self.mock_am._low_level_execute_command = Mock(return_value = {})
|
self.mock_am._low_level_execute_command = Mock(return_value={})
|
||||||
self.mock_am.display = Mock()
|
self.mock_am.display = Mock()
|
||||||
|
|
||||||
self.assertEqual(task.environment, None)
|
self.assertEqual(task.environment, None)
|
||||||
|
@ -100,10 +100,8 @@ class TestCopyResultExclude(unittest.TestCase):
|
||||||
play_context.check_mode = False
|
play_context.check_mode = False
|
||||||
|
|
||||||
self.mock_am = ActionModule(task, connection, play_context, loader=None, templar=None, shared_loader_obj=None)
|
self.mock_am = ActionModule(task, connection, play_context, loader=None, templar=None, shared_loader_obj=None)
|
||||||
self.mock_am._low_level_execute_command = Mock(return_value = {})
|
self.mock_am._low_level_execute_command = Mock(return_value={})
|
||||||
self.mock_am.display = Mock()
|
self.mock_am.display = Mock()
|
||||||
|
|
||||||
self.mock_am.run(task_vars={'a': 'b'})
|
self.mock_am.run(task_vars={'a': 'b'})
|
||||||
self.assertEqual(task.environment, None)
|
self.assertEqual(task.environment, None)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -17,11 +17,12 @@ import unittest
|
||||||
import yaml
|
import yaml
|
||||||
|
|
||||||
from pprint import pprint
|
from pprint import pprint
|
||||||
from ansible import plugins
|
|
||||||
import ansible.plugins
|
import ansible.plugins
|
||||||
from ansible.compat.tests.mock import patch, MagicMock
|
from ansible.compat.tests.mock import patch, MagicMock
|
||||||
from ansible.plugins.action.synchronize import ActionModule
|
from ansible.plugins.action.synchronize import ActionModule
|
||||||
|
|
||||||
|
|
||||||
# Getting the incoming and outgoing task vars from the plugin's run method
|
# Getting the incoming and outgoing task vars from the plugin's run method
|
||||||
|
|
||||||
'''
|
'''
|
||||||
|
@ -41,8 +42,6 @@ with open('task_vars.json', 'wb') as f:
|
||||||
'''
|
'''
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class TaskMock(object):
|
class TaskMock(object):
|
||||||
args = {'src': u'/tmp/deleteme',
|
args = {'src': u'/tmp/deleteme',
|
||||||
'dest': '/tmp/deleteme',
|
'dest': '/tmp/deleteme',
|
||||||
|
@ -52,16 +51,19 @@ class TaskMock(object):
|
||||||
become_user = None
|
become_user = None
|
||||||
become_method = None
|
become_method = None
|
||||||
|
|
||||||
|
|
||||||
class StdinMock(object):
|
class StdinMock(object):
|
||||||
shell = None
|
shell = None
|
||||||
|
|
||||||
|
|
||||||
class ConnectionMock(object):
|
class ConnectionMock(object):
|
||||||
ismock = True
|
ismock = True
|
||||||
_play_context = None
|
_play_context = None
|
||||||
#transport = 'ssh'
|
# transport = 'ssh'
|
||||||
transport = None
|
transport = None
|
||||||
_new_stdin = StdinMock()
|
_new_stdin = StdinMock()
|
||||||
|
|
||||||
|
|
||||||
class PlayContextMock(object):
|
class PlayContextMock(object):
|
||||||
shell = None
|
shell = None
|
||||||
private_key_file = None
|
private_key_file = None
|
||||||
|
@ -75,13 +77,16 @@ class PlayContextMock(object):
|
||||||
remote_user = None
|
remote_user = None
|
||||||
password = None
|
password = None
|
||||||
|
|
||||||
|
|
||||||
class ModuleLoaderMock(object):
|
class ModuleLoaderMock(object):
|
||||||
def find_plugin(self, module_name, mod_type):
|
def find_plugin(self, module_name, mod_type):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
class SharedLoaderMock(object):
|
class SharedLoaderMock(object):
|
||||||
module_loader = ModuleLoaderMock()
|
module_loader = ModuleLoaderMock()
|
||||||
|
|
||||||
|
|
||||||
class SynchronizeTester(object):
|
class SynchronizeTester(object):
|
||||||
|
|
||||||
''' A wrapper for mocking out synchronize environments '''
|
''' A wrapper for mocking out synchronize environments '''
|
||||||
|
@ -96,7 +101,6 @@ class SynchronizeTester(object):
|
||||||
final_task_vars = None
|
final_task_vars = None
|
||||||
execute_called = False
|
execute_called = False
|
||||||
|
|
||||||
|
|
||||||
def _execute_module(self, module_name, module_args=None, task_vars=None):
|
def _execute_module(self, module_name, module_args=None, task_vars=None):
|
||||||
self.execute_called = True
|
self.execute_called = True
|
||||||
self.final_module_args = module_args
|
self.final_module_args = module_args
|
||||||
|
@ -114,7 +118,7 @@ class SynchronizeTester(object):
|
||||||
if '_play_context' in test_meta:
|
if '_play_context' in test_meta:
|
||||||
if test_meta['_play_context']:
|
if test_meta['_play_context']:
|
||||||
self.task.args = {}
|
self.task.args = {}
|
||||||
for k,v in test_meta['_play_context'].items():
|
for (k, v) in test_meta['_play_context'].items():
|
||||||
if v == 'None':
|
if v == 'None':
|
||||||
v = None
|
v = None
|
||||||
setattr(self._play_context, k, v)
|
setattr(self._play_context, k, v)
|
||||||
|
@ -123,8 +127,8 @@ class SynchronizeTester(object):
|
||||||
if '_task' in test_meta:
|
if '_task' in test_meta:
|
||||||
if test_meta['_task']:
|
if test_meta['_task']:
|
||||||
self.task.args = {}
|
self.task.args = {}
|
||||||
for k,v in test_meta['_task'].items():
|
for (k, v) in test_meta['_task'].items():
|
||||||
#import epdb; epdb.st()
|
# import epdb; epdb.st()
|
||||||
if v == 'None':
|
if v == 'None':
|
||||||
v = None
|
v = None
|
||||||
setattr(self.task, k, v)
|
setattr(self.task, k, v)
|
||||||
|
@ -133,32 +137,30 @@ class SynchronizeTester(object):
|
||||||
if 'task_args' in test_meta:
|
if 'task_args' in test_meta:
|
||||||
if test_meta['task_args']:
|
if test_meta['task_args']:
|
||||||
self.task.args = {}
|
self.task.args = {}
|
||||||
for k,v in test_meta['task_args'].items():
|
for (k, v) in test_meta['task_args'].items():
|
||||||
self.task.args[k] = v
|
self.task.args[k] = v
|
||||||
|
|
||||||
# load inital task vars
|
# load inital task vars
|
||||||
invarspath = os.path.join(fixturepath,
|
invarspath = os.path.join(fixturepath, test_meta.get('fixtures', {}).get('taskvars_in', 'taskvars_in.json'))
|
||||||
test_meta.get('fixtures', {}).get('taskvars_in', 'taskvars_in.json'))
|
|
||||||
with open(invarspath, 'rb') as f:
|
with open(invarspath, 'rb') as f:
|
||||||
fdata = f.read()
|
fdata = f.read()
|
||||||
fdata = fdata.decode("utf-8")
|
fdata = fdata.decode("utf-8")
|
||||||
in_task_vars = json.loads(fdata)
|
in_task_vars = json.loads(fdata)
|
||||||
|
|
||||||
# load expected final task vars
|
# load expected final task vars
|
||||||
outvarspath = os.path.join(fixturepath,
|
outvarspath = os.path.join(fixturepath, test_meta.get('fixtures', {}).get('taskvars_out', 'taskvars_out.json'))
|
||||||
test_meta.get('fixtures', {}).get('taskvars_out', 'taskvars_out.json'))
|
|
||||||
with open(outvarspath, 'rb') as f:
|
with open(outvarspath, 'rb') as f:
|
||||||
fdata = f.read()
|
fdata = f.read()
|
||||||
fdata = fdata.decode("utf-8")
|
fdata = fdata.decode("utf-8")
|
||||||
out_task_vars = json.loads(fdata)
|
out_task_vars = json.loads(fdata)
|
||||||
|
|
||||||
# fixup the connection
|
# fixup the connection
|
||||||
for k,v in test_meta['connection'].items():
|
for (k, v) in test_meta['connection'].items():
|
||||||
setattr(self.connection, k, v)
|
setattr(self.connection, k, v)
|
||||||
|
|
||||||
# fixup the hostvars
|
# fixup the hostvars
|
||||||
if test_meta['hostvars']:
|
if test_meta['hostvars']:
|
||||||
for k,v in test_meta['hostvars'].items():
|
for (k, v) in test_meta['hostvars'].items():
|
||||||
in_task_vars['hostvars'][k] = v
|
in_task_vars['hostvars'][k] = v
|
||||||
|
|
||||||
# initalize and run the module
|
# initalize and run the module
|
||||||
|
@ -170,9 +172,9 @@ class SynchronizeTester(object):
|
||||||
# run assertions
|
# run assertions
|
||||||
for check in test_meta['asserts']:
|
for check in test_meta['asserts']:
|
||||||
value = eval(check)
|
value = eval(check)
|
||||||
#if not value:
|
# if not value:
|
||||||
# print(check, value)
|
# print(check, value)
|
||||||
# import epdb; epdb.st()
|
# import epdb; epdb.st()
|
||||||
assert value, check
|
assert value, check
|
||||||
|
|
||||||
|
|
||||||
|
@ -190,54 +192,52 @@ class FakePluginLoader(object):
|
||||||
|
|
||||||
class TestSynchronizeAction(unittest.TestCase):
|
class TestSynchronizeAction(unittest.TestCase):
|
||||||
|
|
||||||
|
|
||||||
fixturedir = os.path.dirname(__file__)
|
fixturedir = os.path.dirname(__file__)
|
||||||
fixturedir = os.path.join(fixturedir, 'fixtures', 'synchronize')
|
fixturedir = os.path.join(fixturedir, 'fixtures', 'synchronize')
|
||||||
#print(basedir)
|
# print(basedir)
|
||||||
|
|
||||||
|
|
||||||
@patch('ansible.plugins.action.synchronize.connection_loader', FakePluginLoader)
|
@patch('ansible.plugins.action.synchronize.connection_loader', FakePluginLoader)
|
||||||
def test_basic(self):
|
def test_basic(self):
|
||||||
x = SynchronizeTester()
|
x = SynchronizeTester()
|
||||||
x.runtest(fixturepath=os.path.join(self.fixturedir,'basic'))
|
x.runtest(fixturepath=os.path.join(self.fixturedir, 'basic'))
|
||||||
|
|
||||||
@patch('ansible.plugins.action.synchronize.connection_loader', FakePluginLoader)
|
@patch('ansible.plugins.action.synchronize.connection_loader', FakePluginLoader)
|
||||||
def test_basic_become(self):
|
def test_basic_become(self):
|
||||||
x = SynchronizeTester()
|
x = SynchronizeTester()
|
||||||
x.runtest(fixturepath=os.path.join(self.fixturedir,'basic_become'))
|
x.runtest(fixturepath=os.path.join(self.fixturedir, 'basic_become'))
|
||||||
|
|
||||||
@patch('ansible.plugins.action.synchronize.connection_loader', FakePluginLoader)
|
@patch('ansible.plugins.action.synchronize.connection_loader', FakePluginLoader)
|
||||||
def test_basic_become_cli(self):
|
def test_basic_become_cli(self):
|
||||||
# --become on the cli sets _play_context.become
|
# --become on the cli sets _play_context.become
|
||||||
x = SynchronizeTester()
|
x = SynchronizeTester()
|
||||||
x.runtest(fixturepath=os.path.join(self.fixturedir,'basic_become_cli'))
|
x.runtest(fixturepath=os.path.join(self.fixturedir, 'basic_become_cli'))
|
||||||
|
|
||||||
@patch('ansible.plugins.action.synchronize.connection_loader', FakePluginLoader)
|
@patch('ansible.plugins.action.synchronize.connection_loader', FakePluginLoader)
|
||||||
def test_basic_vagrant(self):
|
def test_basic_vagrant(self):
|
||||||
# simple vagrant example
|
# simple vagrant example
|
||||||
x = SynchronizeTester()
|
x = SynchronizeTester()
|
||||||
x.runtest(fixturepath=os.path.join(self.fixturedir,'basic_vagrant'))
|
x.runtest(fixturepath=os.path.join(self.fixturedir, 'basic_vagrant'))
|
||||||
|
|
||||||
@patch('ansible.plugins.action.synchronize.connection_loader', FakePluginLoader)
|
@patch('ansible.plugins.action.synchronize.connection_loader', FakePluginLoader)
|
||||||
def test_basic_vagrant_sudo(self):
|
def test_basic_vagrant_sudo(self):
|
||||||
# vagrant plus sudo
|
# vagrant plus sudo
|
||||||
x = SynchronizeTester()
|
x = SynchronizeTester()
|
||||||
x.runtest(fixturepath=os.path.join(self.fixturedir,'basic_vagrant_sudo'))
|
x.runtest(fixturepath=os.path.join(self.fixturedir, 'basic_vagrant_sudo'))
|
||||||
|
|
||||||
@patch('ansible.plugins.action.synchronize.connection_loader', FakePluginLoader)
|
@patch('ansible.plugins.action.synchronize.connection_loader', FakePluginLoader)
|
||||||
def test_basic_vagrant_become_cli(self):
|
def test_basic_vagrant_become_cli(self):
|
||||||
# vagrant plus sudo
|
# vagrant plus sudo
|
||||||
x = SynchronizeTester()
|
x = SynchronizeTester()
|
||||||
x.runtest(fixturepath=os.path.join(self.fixturedir,'basic_vagrant_become_cli'))
|
x.runtest(fixturepath=os.path.join(self.fixturedir, 'basic_vagrant_become_cli'))
|
||||||
|
|
||||||
@patch('ansible.plugins.action.synchronize.connection_loader', FakePluginLoader)
|
@patch('ansible.plugins.action.synchronize.connection_loader', FakePluginLoader)
|
||||||
def test_delegate_remote(self):
|
def test_delegate_remote(self):
|
||||||
# delegate to other remote host
|
# delegate to other remote host
|
||||||
x = SynchronizeTester()
|
x = SynchronizeTester()
|
||||||
x.runtest(fixturepath=os.path.join(self.fixturedir,'delegate_remote'))
|
x.runtest(fixturepath=os.path.join(self.fixturedir, 'delegate_remote'))
|
||||||
|
|
||||||
@patch('ansible.plugins.action.synchronize.connection_loader', FakePluginLoader)
|
@patch('ansible.plugins.action.synchronize.connection_loader', FakePluginLoader)
|
||||||
def test_delegate_remote_su(self):
|
def test_delegate_remote_su(self):
|
||||||
# delegate to other remote host with su enabled
|
# delegate to other remote host with su enabled
|
||||||
x = SynchronizeTester()
|
x = SynchronizeTester()
|
||||||
x.runtest(fixturepath=os.path.join(self.fixturedir,'delegate_remote_su'))
|
x.runtest(fixturepath=os.path.join(self.fixturedir, 'delegate_remote_su'))
|
||||||
|
|
|
@ -25,19 +25,18 @@ from ansible.compat.tests import mock
|
||||||
from ansible.compat.tests import unittest
|
from ansible.compat.tests import unittest
|
||||||
from ansible.errors import AnsibleError
|
from ansible.errors import AnsibleError
|
||||||
from ansible.playbook.play_context import PlayContext
|
from ansible.playbook.play_context import PlayContext
|
||||||
|
|
||||||
from ansible.plugins.connection import ConnectionBase
|
from ansible.plugins.connection import ConnectionBase
|
||||||
#from ansible.plugins.connection.accelerate import Connection as AccelerateConnection
|
# from ansible.plugins.connection.accelerate import Connection as AccelerateConnection
|
||||||
#from ansible.plugins.connection.chroot import Connection as ChrootConnection
|
# from ansible.plugins.connection.chroot import Connection as ChrootConnection
|
||||||
#from ansible.plugins.connection.funcd import Connection as FuncdConnection
|
# from ansible.plugins.connection.funcd import Connection as FuncdConnection
|
||||||
#from ansible.plugins.connection.jail import Connection as JailConnection
|
# from ansible.plugins.connection.jail import Connection as JailConnection
|
||||||
#from ansible.plugins.connection.libvirt_lxc import Connection as LibvirtLXCConnection
|
# from ansible.plugins.connection.libvirt_lxc import Connection as LibvirtLXCConnection
|
||||||
from ansible.plugins.connection.lxc import Connection as LxcConnection
|
from ansible.plugins.connection.lxc import Connection as LxcConnection
|
||||||
from ansible.plugins.connection.local import Connection as LocalConnection
|
from ansible.plugins.connection.local import Connection as LocalConnection
|
||||||
from ansible.plugins.connection.paramiko_ssh import Connection as ParamikoConnection
|
from ansible.plugins.connection.paramiko_ssh import Connection as ParamikoConnection
|
||||||
from ansible.plugins.connection.ssh import Connection as SSHConnection
|
from ansible.plugins.connection.ssh import Connection as SSHConnection
|
||||||
from ansible.plugins.connection.docker import Connection as DockerConnection
|
from ansible.plugins.connection.docker import Connection as DockerConnection
|
||||||
#from ansible.plugins.connection.winrm import Connection as WinRmConnection
|
# from ansible.plugins.connection.winrm import Connection as WinRmConnection
|
||||||
from ansible.plugins.connection.network_cli import Connection as NetworkCliConnection
|
from ansible.plugins.connection.network_cli import Connection as NetworkCliConnection
|
||||||
|
|
||||||
|
|
||||||
|
@ -68,19 +67,26 @@ class TestConnectionBaseClass(unittest.TestCase):
|
||||||
|
|
||||||
def test_subclass_success(self):
|
def test_subclass_success(self):
|
||||||
class ConnectionModule3(ConnectionBase):
|
class ConnectionModule3(ConnectionBase):
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def transport(self):
|
def transport(self):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def _connect(self):
|
def _connect(self):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def exec_command(self):
|
def exec_command(self):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def put_file(self):
|
def put_file(self):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def fetch_file(self):
|
def fetch_file(self):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def close(self):
|
def close(self):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
self.assertIsInstance(ConnectionModule3(self.play_context, self.in_stream), ConnectionModule3)
|
self.assertIsInstance(ConnectionModule3(self.play_context, self.in_stream), ConnectionModule3)
|
||||||
|
|
||||||
# def test_accelerate_connection_module(self):
|
# def test_accelerate_connection_module(self):
|
||||||
|
@ -190,17 +196,23 @@ debug1: Sending command: /bin/sh -c 'sudo -H -S -p "[sudo via ansible, key=ouzm
|
||||||
'''
|
'''
|
||||||
|
|
||||||
class ConnectionFoo(ConnectionBase):
|
class ConnectionFoo(ConnectionBase):
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def transport(self):
|
def transport(self):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def _connect(self):
|
def _connect(self):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def exec_command(self):
|
def exec_command(self):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def put_file(self):
|
def put_file(self):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def fetch_file(self):
|
def fetch_file(self):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def close(self):
|
def close(self):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
|
@ -28,7 +28,6 @@ from io import StringIO
|
||||||
|
|
||||||
from ansible.compat.tests import unittest
|
from ansible.compat.tests import unittest
|
||||||
from ansible.compat.tests.mock import patch, MagicMock, PropertyMock
|
from ansible.compat.tests.mock import patch, MagicMock, PropertyMock
|
||||||
|
|
||||||
from ansible.errors import AnsibleConnectionFailure
|
from ansible.errors import AnsibleConnectionFailure
|
||||||
from ansible.playbook.play_context import PlayContext
|
from ansible.playbook.play_context import PlayContext
|
||||||
|
|
||||||
|
@ -38,6 +37,7 @@ builtin_import = __import__
|
||||||
|
|
||||||
mock_ncclient = MagicMock(name='ncclient')
|
mock_ncclient = MagicMock(name='ncclient')
|
||||||
|
|
||||||
|
|
||||||
def import_mock(name, *args):
|
def import_mock(name, *args):
|
||||||
if name.startswith('ncclient'):
|
if name.startswith('ncclient'):
|
||||||
return mock_ncclient
|
return mock_ncclient
|
||||||
|
@ -50,6 +50,7 @@ else:
|
||||||
with patch('__builtin__.__import__', side_effect=import_mock):
|
with patch('__builtin__.__import__', side_effect=import_mock):
|
||||||
from ansible.plugins.connection import netconf
|
from ansible.plugins.connection import netconf
|
||||||
|
|
||||||
|
|
||||||
class TestNetconfConnectionClass(unittest.TestCase):
|
class TestNetconfConnectionClass(unittest.TestCase):
|
||||||
|
|
||||||
def test_netconf_init(self):
|
def test_netconf_init(self):
|
||||||
|
@ -117,5 +118,3 @@ class TestNetconfConnectionClass(unittest.TestCase):
|
||||||
self.assertEqual(1, rc)
|
self.assertEqual(1, rc)
|
||||||
self.assertEqual('', out)
|
self.assertEqual('', out)
|
||||||
self.assertEqual('unable to parse request', err)
|
self.assertEqual('unable to parse request', err)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -143,7 +143,6 @@ class TestConnectionClass(unittest.TestCase):
|
||||||
self.assertFalse(mock_open_shell.called)
|
self.assertFalse(mock_open_shell.called)
|
||||||
mock_send.assert_called_with({'command': b'command'})
|
mock_send.assert_called_with({'command': b'command'})
|
||||||
|
|
||||||
|
|
||||||
def test_network_cli_send(self):
|
def test_network_cli_send(self):
|
||||||
pc = PlayContext()
|
pc = PlayContext()
|
||||||
new_stdin = StringIO()
|
new_stdin = StringIO()
|
||||||
|
|
|
@ -21,19 +21,18 @@ from __future__ import (absolute_import, division, print_function)
|
||||||
__metaclass__ = type
|
__metaclass__ = type
|
||||||
|
|
||||||
from io import StringIO
|
from io import StringIO
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
from ansible.compat.tests import unittest
|
|
||||||
from ansible.compat.tests.mock import patch, MagicMock, PropertyMock
|
|
||||||
|
|
||||||
from ansible import constants as C
|
from ansible import constants as C
|
||||||
from ansible.compat.selectors import SelectorKey, EVENT_READ
|
from ansible.compat.selectors import SelectorKey, EVENT_READ
|
||||||
|
from ansible.compat.tests import unittest
|
||||||
|
from ansible.compat.tests.mock import patch, MagicMock, PropertyMock
|
||||||
from ansible.errors import AnsibleError, AnsibleConnectionFailure, AnsibleFileNotFound
|
from ansible.errors import AnsibleError, AnsibleConnectionFailure, AnsibleFileNotFound
|
||||||
from ansible.module_utils.six.moves import shlex_quote
|
from ansible.module_utils.six.moves import shlex_quote
|
||||||
|
from ansible.module_utils._text import to_bytes
|
||||||
from ansible.playbook.play_context import PlayContext
|
from ansible.playbook.play_context import PlayContext
|
||||||
from ansible.plugins.connection import ssh
|
from ansible.plugins.connection import ssh
|
||||||
from ansible.module_utils._text import to_bytes
|
|
||||||
|
|
||||||
|
|
||||||
class TestConnectionBaseClass(unittest.TestCase):
|
class TestConnectionBaseClass(unittest.TestCase):
|
||||||
|
@ -91,10 +90,10 @@ class TestConnectionBaseClass(unittest.TestCase):
|
||||||
|
|
||||||
conn = ssh.Connection(pc, new_stdin)
|
conn = ssh.Connection(pc, new_stdin)
|
||||||
|
|
||||||
conn.check_password_prompt = MagicMock()
|
conn.check_password_prompt = MagicMock()
|
||||||
conn.check_become_success = MagicMock()
|
conn.check_become_success = MagicMock()
|
||||||
conn.check_incorrect_password = MagicMock()
|
conn.check_incorrect_password = MagicMock()
|
||||||
conn.check_missing_password = MagicMock()
|
conn.check_missing_password = MagicMock()
|
||||||
|
|
||||||
def _check_password_prompt(line):
|
def _check_password_prompt(line):
|
||||||
if b'foo' in line:
|
if b'foo' in line:
|
||||||
|
@ -116,17 +115,17 @@ class TestConnectionBaseClass(unittest.TestCase):
|
||||||
return True
|
return True
|
||||||
return False
|
return False
|
||||||
|
|
||||||
conn.check_password_prompt.side_effect = _check_password_prompt
|
conn.check_password_prompt.side_effect = _check_password_prompt
|
||||||
conn.check_become_success.side_effect = _check_become_success
|
conn.check_become_success.side_effect = _check_become_success
|
||||||
conn.check_incorrect_password.side_effect = _check_incorrect_password
|
conn.check_incorrect_password.side_effect = _check_incorrect_password
|
||||||
conn.check_missing_password.side_effect = _check_missing_password
|
conn.check_missing_password.side_effect = _check_missing_password
|
||||||
|
|
||||||
# test examining output for prompt
|
# test examining output for prompt
|
||||||
conn._flags = dict(
|
conn._flags = dict(
|
||||||
become_prompt = False,
|
become_prompt=False,
|
||||||
become_success = False,
|
become_success=False,
|
||||||
become_error = False,
|
become_error=False,
|
||||||
become_nopasswd_error = False,
|
become_nopasswd_error=False,
|
||||||
)
|
)
|
||||||
|
|
||||||
pc.prompt = True
|
pc.prompt = True
|
||||||
|
@ -140,10 +139,10 @@ class TestConnectionBaseClass(unittest.TestCase):
|
||||||
|
|
||||||
# test examining output for become prompt
|
# test examining output for become prompt
|
||||||
conn._flags = dict(
|
conn._flags = dict(
|
||||||
become_prompt = False,
|
become_prompt=False,
|
||||||
become_success = False,
|
become_success=False,
|
||||||
become_error = False,
|
become_error=False,
|
||||||
become_nopasswd_error = False,
|
become_nopasswd_error=False,
|
||||||
)
|
)
|
||||||
|
|
||||||
pc.prompt = False
|
pc.prompt = False
|
||||||
|
@ -158,10 +157,10 @@ class TestConnectionBaseClass(unittest.TestCase):
|
||||||
|
|
||||||
# test examining output for become failure
|
# test examining output for become failure
|
||||||
conn._flags = dict(
|
conn._flags = dict(
|
||||||
become_prompt = False,
|
become_prompt=False,
|
||||||
become_success = False,
|
become_success=False,
|
||||||
become_error = False,
|
become_error=False,
|
||||||
become_nopasswd_error = False,
|
become_nopasswd_error=False,
|
||||||
)
|
)
|
||||||
|
|
||||||
pc.prompt = False
|
pc.prompt = False
|
||||||
|
@ -176,10 +175,10 @@ class TestConnectionBaseClass(unittest.TestCase):
|
||||||
|
|
||||||
# test examining output for missing password
|
# test examining output for missing password
|
||||||
conn._flags = dict(
|
conn._flags = dict(
|
||||||
become_prompt = False,
|
become_prompt=False,
|
||||||
become_success = False,
|
become_success=False,
|
||||||
become_error = False,
|
become_error=False,
|
||||||
become_nopasswd_error = False,
|
become_nopasswd_error=False,
|
||||||
)
|
)
|
||||||
|
|
||||||
pc.prompt = False
|
pc.prompt = False
|
||||||
|
@ -236,8 +235,8 @@ class TestConnectionBaseClass(unittest.TestCase):
|
||||||
conn._run.assert_called_with('some command to run', expected_in_data, checkrc=False)
|
conn._run.assert_called_with('some command to run', expected_in_data, checkrc=False)
|
||||||
|
|
||||||
expected_in_data = b' '.join((b'put',
|
expected_in_data = b' '.join((b'put',
|
||||||
to_bytes(shlex_quote('/path/to/in/file/with/unicode-fö〩')),
|
to_bytes(shlex_quote('/path/to/in/file/with/unicode-fö〩')),
|
||||||
to_bytes(shlex_quote('/path/to/dest/file/with/unicode-fö〩')))) + b'\n'
|
to_bytes(shlex_quote('/path/to/dest/file/with/unicode-fö〩')))) + b'\n'
|
||||||
conn.put_file(u'/path/to/in/file/with/unicode-fö〩', u'/path/to/dest/file/with/unicode-fö〩')
|
conn.put_file(u'/path/to/in/file/with/unicode-fö〩', u'/path/to/dest/file/with/unicode-fö〩')
|
||||||
conn._run.assert_called_with('some command to run', expected_in_data, checkrc=False)
|
conn._run.assert_called_with('some command to run', expected_in_data, checkrc=False)
|
||||||
|
|
||||||
|
@ -292,8 +291,8 @@ class TestConnectionBaseClass(unittest.TestCase):
|
||||||
conn._run.assert_called_with('some command to run', expected_in_data, checkrc=False)
|
conn._run.assert_called_with('some command to run', expected_in_data, checkrc=False)
|
||||||
|
|
||||||
expected_in_data = b' '.join((b'get',
|
expected_in_data = b' '.join((b'get',
|
||||||
to_bytes(shlex_quote('/path/to/in/file/with/unicode-fö〩')),
|
to_bytes(shlex_quote('/path/to/in/file/with/unicode-fö〩')),
|
||||||
to_bytes(shlex_quote('/path/to/dest/file/with/unicode-fö〩')))) + b'\n'
|
to_bytes(shlex_quote('/path/to/dest/file/with/unicode-fö〩')))) + b'\n'
|
||||||
conn.fetch_file(u'/path/to/in/file/with/unicode-fö〩', u'/path/to/dest/file/with/unicode-fö〩')
|
conn.fetch_file(u'/path/to/in/file/with/unicode-fö〩', u'/path/to/dest/file/with/unicode-fö〩')
|
||||||
conn._run.assert_called_with('some command to run', expected_in_data, checkrc=False)
|
conn._run.assert_called_with('some command to run', expected_in_data, checkrc=False)
|
||||||
|
|
||||||
|
|
|
@ -29,26 +29,31 @@ class TestINILookup(unittest.TestCase):
|
||||||
# Currently there isn't a new-style
|
# Currently there isn't a new-style
|
||||||
old_style_params_data = (
|
old_style_params_data = (
|
||||||
# Simple case
|
# Simple case
|
||||||
dict(term=u'keyA section=sectionA file=/path/to/file',
|
dict(
|
||||||
expected=[u'keyA', u'section=sectionA', u'file=/path/to/file'],
|
term=u'keyA section=sectionA file=/path/to/file',
|
||||||
),
|
expected=[u'keyA', u'section=sectionA', u'file=/path/to/file'],
|
||||||
dict(term=u'keyB section=sectionB with space file=/path/with/embedded spaces and/file',
|
),
|
||||||
expected=[u'keyB', u'section=sectionB with space', u'file=/path/with/embedded spaces and/file'],
|
dict(
|
||||||
),
|
term=u'keyB section=sectionB with space file=/path/with/embedded spaces and/file',
|
||||||
dict(term=u'keyC section=sectionC file=/path/with/equals/cn=com.ansible',
|
expected=[u'keyB', u'section=sectionB with space', u'file=/path/with/embedded spaces and/file'],
|
||||||
expected=[u'keyC', u'section=sectionC', u'file=/path/with/equals/cn=com.ansible'],
|
),
|
||||||
),
|
dict(
|
||||||
dict(term=u'keyD section=sectionD file=/path/with space and/equals/cn=com.ansible',
|
term=u'keyC section=sectionC file=/path/with/equals/cn=com.ansible',
|
||||||
expected=[u'keyD', u'section=sectionD', u'file=/path/with space and/equals/cn=com.ansible'],
|
expected=[u'keyC', u'section=sectionC', u'file=/path/with/equals/cn=com.ansible'],
|
||||||
),
|
),
|
||||||
dict(term=u'keyE section=sectionE file=/path/with/unicode/くらとみ/file',
|
dict(
|
||||||
expected=[u'keyE', u'section=sectionE', u'file=/path/with/unicode/くらとみ/file'],
|
term=u'keyD section=sectionD file=/path/with space and/equals/cn=com.ansible',
|
||||||
),
|
expected=[u'keyD', u'section=sectionD', u'file=/path/with space and/equals/cn=com.ansible'],
|
||||||
dict(term=u'keyF section=sectionF file=/path/with/utf 8 and spaces/くらとみ/file',
|
),
|
||||||
expected=[u'keyF', u'section=sectionF', u'file=/path/with/utf 8 and spaces/くらとみ/file'],
|
dict(
|
||||||
),
|
term=u'keyE section=sectionE file=/path/with/unicode/くらとみ/file',
|
||||||
)
|
expected=[u'keyE', u'section=sectionE', u'file=/path/with/unicode/くらとみ/file'],
|
||||||
|
),
|
||||||
|
dict(
|
||||||
|
term=u'keyF section=sectionF file=/path/with/utf 8 and spaces/くらとみ/file',
|
||||||
|
expected=[u'keyF', u'section=sectionF', u'file=/path/with/utf 8 and spaces/くらとみ/file'],
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
pass
|
pass
|
||||||
|
@ -58,6 +63,6 @@ class TestINILookup(unittest.TestCase):
|
||||||
|
|
||||||
def test_parse_parameters(self):
|
def test_parse_parameters(self):
|
||||||
for testcase in self.old_style_params_data:
|
for testcase in self.old_style_params_data:
|
||||||
#print(testcase)
|
# print(testcase)
|
||||||
params = _parse_params(testcase['term'])
|
params = _parse_params(testcase['term'])
|
||||||
self.assertEqual(params, testcase['expected'])
|
self.assertEqual(params, testcase['expected'])
|
||||||
|
|
|
@ -22,6 +22,7 @@ __metaclass__ = type
|
||||||
|
|
||||||
import passlib
|
import passlib
|
||||||
from passlib.handlers import pbkdf2
|
from passlib.handlers import pbkdf2
|
||||||
|
from units.mock.loader import DictDataLoader
|
||||||
|
|
||||||
from ansible.compat.tests import unittest
|
from ansible.compat.tests import unittest
|
||||||
from ansible.compat.tests.mock import mock_open, patch
|
from ansible.compat.tests.mock import mock_open, patch
|
||||||
|
@ -29,11 +30,8 @@ from ansible.errors import AnsibleError
|
||||||
from ansible.module_utils.six import text_type
|
from ansible.module_utils.six import text_type
|
||||||
from ansible.module_utils.six.moves import builtins
|
from ansible.module_utils.six.moves import builtins
|
||||||
from ansible.plugins import PluginLoader
|
from ansible.plugins import PluginLoader
|
||||||
from ansible.utils import encrypt
|
|
||||||
|
|
||||||
from units.mock.loader import DictDataLoader
|
|
||||||
|
|
||||||
from ansible.plugins.lookup import password
|
from ansible.plugins.lookup import password
|
||||||
|
from ansible.utils import encrypt
|
||||||
|
|
||||||
|
|
||||||
DEFAULT_CHARS = sorted([u'ascii_letters', u'digits', u".,:-_"])
|
DEFAULT_CHARS = sorted([u'ascii_letters', u'digits', u".,:-_"])
|
||||||
|
@ -42,128 +40,149 @@ DEFAULT_CANDIDATE_CHARS = u'.,:-_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTU
|
||||||
# Currently there isn't a new-style
|
# Currently there isn't a new-style
|
||||||
old_style_params_data = (
|
old_style_params_data = (
|
||||||
# Simple case
|
# Simple case
|
||||||
dict(term=u'/path/to/file',
|
dict(
|
||||||
filename=u'/path/to/file',
|
term=u'/path/to/file',
|
||||||
params=dict(length=password.DEFAULT_LENGTH, encrypt=None, chars=DEFAULT_CHARS),
|
filename=u'/path/to/file',
|
||||||
candidate_chars=DEFAULT_CANDIDATE_CHARS,
|
params=dict(length=password.DEFAULT_LENGTH, encrypt=None, chars=DEFAULT_CHARS),
|
||||||
),
|
candidate_chars=DEFAULT_CANDIDATE_CHARS,
|
||||||
|
),
|
||||||
|
|
||||||
# Special characters in path
|
# Special characters in path
|
||||||
dict(term=u'/path/with/embedded spaces and/file',
|
dict(
|
||||||
filename=u'/path/with/embedded spaces and/file',
|
term=u'/path/with/embedded spaces and/file',
|
||||||
params=dict(length=password.DEFAULT_LENGTH, encrypt=None, chars=DEFAULT_CHARS),
|
filename=u'/path/with/embedded spaces and/file',
|
||||||
candidate_chars=DEFAULT_CANDIDATE_CHARS,
|
params=dict(length=password.DEFAULT_LENGTH, encrypt=None, chars=DEFAULT_CHARS),
|
||||||
),
|
candidate_chars=DEFAULT_CANDIDATE_CHARS,
|
||||||
dict(term=u'/path/with/equals/cn=com.ansible',
|
),
|
||||||
filename=u'/path/with/equals/cn=com.ansible',
|
dict(
|
||||||
params=dict(length=password.DEFAULT_LENGTH, encrypt=None, chars=DEFAULT_CHARS),
|
term=u'/path/with/equals/cn=com.ansible',
|
||||||
candidate_chars=DEFAULT_CANDIDATE_CHARS,
|
filename=u'/path/with/equals/cn=com.ansible',
|
||||||
),
|
params=dict(length=password.DEFAULT_LENGTH, encrypt=None, chars=DEFAULT_CHARS),
|
||||||
dict(term=u'/path/with/unicode/くらとみ/file',
|
candidate_chars=DEFAULT_CANDIDATE_CHARS,
|
||||||
filename=u'/path/with/unicode/くらとみ/file',
|
),
|
||||||
params=dict(length=password.DEFAULT_LENGTH, encrypt=None, chars=DEFAULT_CHARS),
|
dict(
|
||||||
candidate_chars=DEFAULT_CANDIDATE_CHARS,
|
term=u'/path/with/unicode/くらとみ/file',
|
||||||
),
|
filename=u'/path/with/unicode/くらとみ/file',
|
||||||
|
params=dict(length=password.DEFAULT_LENGTH, encrypt=None, chars=DEFAULT_CHARS),
|
||||||
|
candidate_chars=DEFAULT_CANDIDATE_CHARS,
|
||||||
|
),
|
||||||
# Mix several special chars
|
# Mix several special chars
|
||||||
dict(term=u'/path/with/utf 8 and spaces/くらとみ/file',
|
dict(
|
||||||
filename=u'/path/with/utf 8 and spaces/くらとみ/file',
|
term=u'/path/with/utf 8 and spaces/くらとみ/file',
|
||||||
params=dict(length=password.DEFAULT_LENGTH, encrypt=None, chars=DEFAULT_CHARS),
|
filename=u'/path/with/utf 8 and spaces/くらとみ/file',
|
||||||
candidate_chars=DEFAULT_CANDIDATE_CHARS,
|
params=dict(length=password.DEFAULT_LENGTH, encrypt=None, chars=DEFAULT_CHARS),
|
||||||
),
|
candidate_chars=DEFAULT_CANDIDATE_CHARS,
|
||||||
dict(term=u'/path/with/encoding=unicode/くらとみ/file',
|
),
|
||||||
filename=u'/path/with/encoding=unicode/くらとみ/file',
|
dict(
|
||||||
params=dict(length=password.DEFAULT_LENGTH, encrypt=None, chars=DEFAULT_CHARS),
|
term=u'/path/with/encoding=unicode/くらとみ/file',
|
||||||
candidate_chars=DEFAULT_CANDIDATE_CHARS,
|
filename=u'/path/with/encoding=unicode/くらとみ/file',
|
||||||
),
|
params=dict(length=password.DEFAULT_LENGTH, encrypt=None, chars=DEFAULT_CHARS),
|
||||||
dict(term=u'/path/with/encoding=unicode/くらとみ/and spaces file',
|
candidate_chars=DEFAULT_CANDIDATE_CHARS,
|
||||||
filename=u'/path/with/encoding=unicode/くらとみ/and spaces file',
|
),
|
||||||
params=dict(length=password.DEFAULT_LENGTH, encrypt=None, chars=DEFAULT_CHARS),
|
dict(
|
||||||
candidate_chars=DEFAULT_CANDIDATE_CHARS,
|
term=u'/path/with/encoding=unicode/くらとみ/and spaces file',
|
||||||
),
|
filename=u'/path/with/encoding=unicode/くらとみ/and spaces file',
|
||||||
|
params=dict(length=password.DEFAULT_LENGTH, encrypt=None, chars=DEFAULT_CHARS),
|
||||||
|
candidate_chars=DEFAULT_CANDIDATE_CHARS,
|
||||||
|
),
|
||||||
|
|
||||||
# Simple parameters
|
# Simple parameters
|
||||||
dict(term=u'/path/to/file length=42',
|
dict(
|
||||||
filename=u'/path/to/file',
|
term=u'/path/to/file length=42',
|
||||||
params=dict(length=42, encrypt=None, chars=DEFAULT_CHARS),
|
filename=u'/path/to/file',
|
||||||
candidate_chars=DEFAULT_CANDIDATE_CHARS,
|
params=dict(length=42, encrypt=None, chars=DEFAULT_CHARS),
|
||||||
),
|
candidate_chars=DEFAULT_CANDIDATE_CHARS,
|
||||||
dict(term=u'/path/to/file encrypt=pbkdf2_sha256',
|
),
|
||||||
filename=u'/path/to/file',
|
dict(
|
||||||
params=dict(length=password.DEFAULT_LENGTH, encrypt='pbkdf2_sha256', chars=DEFAULT_CHARS),
|
term=u'/path/to/file encrypt=pbkdf2_sha256',
|
||||||
candidate_chars=DEFAULT_CANDIDATE_CHARS,
|
filename=u'/path/to/file',
|
||||||
),
|
params=dict(length=password.DEFAULT_LENGTH, encrypt='pbkdf2_sha256', chars=DEFAULT_CHARS),
|
||||||
dict(term=u'/path/to/file chars=abcdefghijklmnop',
|
candidate_chars=DEFAULT_CANDIDATE_CHARS,
|
||||||
|
),
|
||||||
|
dict(
|
||||||
|
term=u'/path/to/file chars=abcdefghijklmnop',
|
||||||
filename=u'/path/to/file',
|
filename=u'/path/to/file',
|
||||||
params=dict(length=password.DEFAULT_LENGTH, encrypt=None, chars=[u'abcdefghijklmnop']),
|
params=dict(length=password.DEFAULT_LENGTH, encrypt=None, chars=[u'abcdefghijklmnop']),
|
||||||
candidate_chars=u'abcdefghijklmnop',
|
candidate_chars=u'abcdefghijklmnop',
|
||||||
),
|
),
|
||||||
dict(term=u'/path/to/file chars=digits,abc,def',
|
dict(
|
||||||
|
term=u'/path/to/file chars=digits,abc,def',
|
||||||
filename=u'/path/to/file',
|
filename=u'/path/to/file',
|
||||||
params=dict(length=password.DEFAULT_LENGTH, encrypt=None, chars=sorted([u'digits', u'abc', u'def'])),
|
params=dict(length=password.DEFAULT_LENGTH, encrypt=None, chars=sorted([u'digits', u'abc', u'def'])),
|
||||||
candidate_chars=u'abcdef0123456789',
|
candidate_chars=u'abcdef0123456789',
|
||||||
),
|
),
|
||||||
|
|
||||||
# Including comma in chars
|
# Including comma in chars
|
||||||
dict(term=u'/path/to/file chars=abcdefghijklmnop,,digits',
|
dict(
|
||||||
filename=u'/path/to/file',
|
term=u'/path/to/file chars=abcdefghijklmnop,,digits',
|
||||||
params=dict(length=password.DEFAULT_LENGTH, encrypt=None, chars=sorted([u'abcdefghijklmnop', u',', u'digits'])),
|
filename=u'/path/to/file',
|
||||||
candidate_chars = u',abcdefghijklmnop0123456789',
|
params=dict(length=password.DEFAULT_LENGTH, encrypt=None, chars=sorted([u'abcdefghijklmnop', u',', u'digits'])),
|
||||||
),
|
candidate_chars=u',abcdefghijklmnop0123456789',
|
||||||
dict(term=u'/path/to/file chars=,,',
|
),
|
||||||
filename=u'/path/to/file',
|
dict(
|
||||||
params=dict(length=password.DEFAULT_LENGTH, encrypt=None, chars=[u',']),
|
term=u'/path/to/file chars=,,',
|
||||||
candidate_chars=u',',
|
filename=u'/path/to/file',
|
||||||
),
|
params=dict(length=password.DEFAULT_LENGTH, encrypt=None, chars=[u',']),
|
||||||
|
candidate_chars=u',',
|
||||||
|
),
|
||||||
|
|
||||||
# Including = in chars
|
# Including = in chars
|
||||||
dict(term=u'/path/to/file chars=digits,=,,',
|
dict(
|
||||||
filename=u'/path/to/file',
|
term=u'/path/to/file chars=digits,=,,',
|
||||||
params=dict(length=password.DEFAULT_LENGTH, encrypt=None, chars=sorted([u'digits', u'=', u','])),
|
filename=u'/path/to/file',
|
||||||
candidate_chars=u',=0123456789',
|
params=dict(length=password.DEFAULT_LENGTH, encrypt=None, chars=sorted([u'digits', u'=', u','])),
|
||||||
),
|
candidate_chars=u',=0123456789',
|
||||||
dict(term=u'/path/to/file chars=digits,abc=def',
|
),
|
||||||
filename=u'/path/to/file',
|
dict(
|
||||||
params=dict(length=password.DEFAULT_LENGTH, encrypt=None, chars=sorted([u'digits', u'abc=def'])),
|
term=u'/path/to/file chars=digits,abc=def',
|
||||||
candidate_chars=u'abc=def0123456789',
|
filename=u'/path/to/file',
|
||||||
),
|
params=dict(length=password.DEFAULT_LENGTH, encrypt=None, chars=sorted([u'digits', u'abc=def'])),
|
||||||
|
candidate_chars=u'abc=def0123456789',
|
||||||
|
),
|
||||||
|
|
||||||
# Including unicode in chars
|
# Including unicode in chars
|
||||||
dict(term=u'/path/to/file chars=digits,くらとみ,,',
|
dict(
|
||||||
filename=u'/path/to/file',
|
term=u'/path/to/file chars=digits,くらとみ,,',
|
||||||
params=dict(length=password.DEFAULT_LENGTH, encrypt=None, chars=sorted([u'digits', u'くらとみ', u','])),
|
filename=u'/path/to/file',
|
||||||
candidate_chars=u',0123456789くらとみ',
|
params=dict(length=password.DEFAULT_LENGTH, encrypt=None, chars=sorted([u'digits', u'くらとみ', u','])),
|
||||||
),
|
candidate_chars=u',0123456789くらとみ',
|
||||||
|
),
|
||||||
# Including only unicode in chars
|
# Including only unicode in chars
|
||||||
dict(term=u'/path/to/file chars=くらとみ',
|
dict(
|
||||||
filename=u'/path/to/file',
|
term=u'/path/to/file chars=くらとみ',
|
||||||
params=dict(length=password.DEFAULT_LENGTH, encrypt=None, chars=sorted([u'くらとみ'])),
|
filename=u'/path/to/file',
|
||||||
candidate_chars=u'くらとみ',
|
params=dict(length=password.DEFAULT_LENGTH, encrypt=None, chars=sorted([u'くらとみ'])),
|
||||||
),
|
candidate_chars=u'くらとみ',
|
||||||
|
),
|
||||||
|
|
||||||
# Include ':' in path
|
# Include ':' in path
|
||||||
dict(term=u'/path/to/file_with:colon chars=ascii_letters,digits',
|
dict(
|
||||||
filename=u'/path/to/file_with:colon',
|
term=u'/path/to/file_with:colon chars=ascii_letters,digits',
|
||||||
params=dict(length=password.DEFAULT_LENGTH, encrypt=None, chars=sorted([u'ascii_letters', u'digits'])),
|
filename=u'/path/to/file_with:colon',
|
||||||
candidate_chars=u'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789',
|
params=dict(length=password.DEFAULT_LENGTH, encrypt=None, chars=sorted([u'ascii_letters', u'digits'])),
|
||||||
),
|
candidate_chars=u'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789',
|
||||||
|
),
|
||||||
|
|
||||||
# Including special chars in both path and chars
|
# Including special chars in both path and chars
|
||||||
# Special characters in path
|
# Special characters in path
|
||||||
dict(term=u'/path/with/embedded spaces and/file chars=abc=def',
|
dict(
|
||||||
filename=u'/path/with/embedded spaces and/file',
|
term=u'/path/with/embedded spaces and/file chars=abc=def',
|
||||||
params=dict(length=password.DEFAULT_LENGTH, encrypt=None, chars=[u'abc=def']),
|
filename=u'/path/with/embedded spaces and/file',
|
||||||
candidate_chars=u'abc=def',
|
params=dict(length=password.DEFAULT_LENGTH, encrypt=None, chars=[u'abc=def']),
|
||||||
),
|
candidate_chars=u'abc=def',
|
||||||
dict(term=u'/path/with/equals/cn=com.ansible chars=abc=def',
|
),
|
||||||
filename=u'/path/with/equals/cn=com.ansible',
|
dict(
|
||||||
params=dict(length=password.DEFAULT_LENGTH, encrypt=None, chars=[u'abc=def']),
|
term=u'/path/with/equals/cn=com.ansible chars=abc=def',
|
||||||
candidate_chars=u'abc=def',
|
filename=u'/path/with/equals/cn=com.ansible',
|
||||||
),
|
params=dict(length=password.DEFAULT_LENGTH, encrypt=None, chars=[u'abc=def']),
|
||||||
dict(term=u'/path/with/unicode/くらとみ/file chars=くらとみ',
|
candidate_chars=u'abc=def',
|
||||||
filename=u'/path/with/unicode/くらとみ/file',
|
),
|
||||||
params=dict(length=password.DEFAULT_LENGTH, encrypt=None, chars=[u'くらとみ']),
|
dict(
|
||||||
candidate_chars=u'くらとみ',
|
term=u'/path/with/unicode/くらとみ/file chars=くらとみ',
|
||||||
),
|
filename=u'/path/with/unicode/くらとみ/file',
|
||||||
|
params=dict(length=password.DEFAULT_LENGTH, encrypt=None, chars=[u'くらとみ']),
|
||||||
|
candidate_chars=u'くらとみ',
|
||||||
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -306,27 +325,26 @@ class TestFormatContent(unittest.TestCase):
|
||||||
def test_no_encrypt(self):
|
def test_no_encrypt(self):
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
password._format_content(password=u'hunter42',
|
password._format_content(password=u'hunter42',
|
||||||
salt=u'87654321',
|
salt=u'87654321',
|
||||||
encrypt=False),
|
encrypt=False),
|
||||||
u'hunter42 salt=87654321')
|
u'hunter42 salt=87654321')
|
||||||
|
|
||||||
def test_no_encrypt_no_salt(self):
|
def test_no_encrypt_no_salt(self):
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
password._format_content(password=u'hunter42',
|
password._format_content(password=u'hunter42',
|
||||||
salt=None,
|
salt=None,
|
||||||
encrypt=False),
|
encrypt=False),
|
||||||
u'hunter42')
|
u'hunter42')
|
||||||
|
|
||||||
def test_encrypt(self):
|
def test_encrypt(self):
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
password._format_content(password=u'hunter42',
|
password._format_content(password=u'hunter42',
|
||||||
salt=u'87654321',
|
salt=u'87654321',
|
||||||
encrypt='pbkdf2_sha256'),
|
encrypt='pbkdf2_sha256'),
|
||||||
u'hunter42 salt=87654321')
|
u'hunter42 salt=87654321')
|
||||||
|
|
||||||
def test_encrypt_no_salt(self):
|
def test_encrypt_no_salt(self):
|
||||||
self.assertRaises(AssertionError, password._format_content,
|
self.assertRaises(AssertionError, password._format_content, u'hunter42', None, 'pbkdf2_sha256')
|
||||||
u'hunter42', None, 'pbkdf2_sha256')
|
|
||||||
|
|
||||||
|
|
||||||
class TestWritePasswordFile(unittest.TestCase):
|
class TestWritePasswordFile(unittest.TestCase):
|
||||||
|
@ -351,13 +369,13 @@ class TestWritePasswordFile(unittest.TestCase):
|
||||||
|
|
||||||
class TestLookupModule(unittest.TestCase):
|
class TestLookupModule(unittest.TestCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
self.fake_loader = DictDataLoader({'/path/to/somewhere':'sdfsdf'})
|
self.fake_loader = DictDataLoader({'/path/to/somewhere': 'sdfsdf'})
|
||||||
self.password_lookup = password.LookupModule(loader=self.fake_loader)
|
self.password_lookup = password.LookupModule(loader=self.fake_loader)
|
||||||
self.os_path_exists = password.os.path.exists
|
self.os_path_exists = password.os.path.exists
|
||||||
|
|
||||||
# Different releases of passlib default to a different number of rounds
|
# Different releases of passlib default to a different number of rounds
|
||||||
self.sha256 = passlib.registry.get_crypt_handler('pbkdf2_sha256')
|
self.sha256 = passlib.registry.get_crypt_handler('pbkdf2_sha256')
|
||||||
sha256_for_tests = pbkdf2.create_pbkdf2_hash("sha256", 32, 20000)
|
sha256_for_tests = pbkdf2.create_pbkdf2_hash("sha256", 32, 20000)
|
||||||
passlib.registry.register_crypt_handler(sha256_for_tests, force=True)
|
passlib.registry.register_crypt_handler(sha256_for_tests, force=True)
|
||||||
|
|
||||||
def tearDown(self):
|
def tearDown(self):
|
||||||
|
@ -369,8 +387,7 @@ class TestLookupModule(unittest.TestCase):
|
||||||
def test_no_encrypt(self, mock_get_paths, mock_write_file):
|
def test_no_encrypt(self, mock_get_paths, mock_write_file):
|
||||||
mock_get_paths.return_value = ['/path/one', '/path/two', '/path/three']
|
mock_get_paths.return_value = ['/path/one', '/path/two', '/path/three']
|
||||||
|
|
||||||
results = self.password_lookup.run([u'/path/to/somewhere'],
|
results = self.password_lookup.run([u'/path/to/somewhere'], None)
|
||||||
None)
|
|
||||||
|
|
||||||
# FIXME: assert something useful
|
# FIXME: assert something useful
|
||||||
for result in results:
|
for result in results:
|
||||||
|
@ -382,8 +399,7 @@ class TestLookupModule(unittest.TestCase):
|
||||||
def test_encrypt(self, mock_get_paths, mock_write_file):
|
def test_encrypt(self, mock_get_paths, mock_write_file):
|
||||||
mock_get_paths.return_value = ['/path/one', '/path/two', '/path/three']
|
mock_get_paths.return_value = ['/path/one', '/path/two', '/path/three']
|
||||||
|
|
||||||
results = self.password_lookup.run([u'/path/to/somewhere encrypt=pbkdf2_sha256'],
|
results = self.password_lookup.run([u'/path/to/somewhere encrypt=pbkdf2_sha256'], None)
|
||||||
None)
|
|
||||||
|
|
||||||
# pbkdf2 format plus hash
|
# pbkdf2 format plus hash
|
||||||
expected_password_length = 76
|
expected_password_length = 76
|
||||||
|
@ -412,8 +428,7 @@ class TestLookupModule(unittest.TestCase):
|
||||||
password.os.path.exists = lambda x: True
|
password.os.path.exists = lambda x: True
|
||||||
|
|
||||||
with patch.object(builtins, 'open', mock_open(read_data=b'hunter42 salt=87654321\n')) as m:
|
with patch.object(builtins, 'open', mock_open(read_data=b'hunter42 salt=87654321\n')) as m:
|
||||||
results = self.password_lookup.run([u'/path/to/somewhere chars=anything encrypt=pbkdf2_sha256'],
|
results = self.password_lookup.run([u'/path/to/somewhere chars=anything encrypt=pbkdf2_sha256'], None)
|
||||||
None)
|
|
||||||
for result in results:
|
for result in results:
|
||||||
self.assertEqual(result, u'$pbkdf2-sha256$20000$ODc2NTQzMjE$Uikde0cv0BKaRaAXMrUQB.zvG4GmnjClwjghwIRf2gU')
|
self.assertEqual(result, u'$pbkdf2-sha256$20000$ODc2NTQzMjE$Uikde0cv0BKaRaAXMrUQB.zvG4GmnjClwjghwIRf2gU')
|
||||||
|
|
||||||
|
@ -424,8 +439,7 @@ class TestLookupModule(unittest.TestCase):
|
||||||
password.os.path.exists = lambda x: True
|
password.os.path.exists = lambda x: True
|
||||||
|
|
||||||
with patch.object(builtins, 'open', mock_open(read_data=b'hunter42 salt=87654321\n')) as m:
|
with patch.object(builtins, 'open', mock_open(read_data=b'hunter42 salt=87654321\n')) as m:
|
||||||
results = self.password_lookup.run([u'/path/to/somewhere chars=anything'],
|
results = self.password_lookup.run([u'/path/to/somewhere chars=anything'], None)
|
||||||
None)
|
|
||||||
|
|
||||||
for result in results:
|
for result in results:
|
||||||
self.assertEqual(result, u'hunter42')
|
self.assertEqual(result, u'hunter42')
|
||||||
|
@ -435,7 +449,6 @@ class TestLookupModule(unittest.TestCase):
|
||||||
def test_only_a(self, mock_get_paths, mock_write_file):
|
def test_only_a(self, mock_get_paths, mock_write_file):
|
||||||
mock_get_paths.return_value = ['/path/one', '/path/two', '/path/three']
|
mock_get_paths.return_value = ['/path/one', '/path/two', '/path/three']
|
||||||
|
|
||||||
results = self.password_lookup.run([u'/path/to/somewhere chars=a'],
|
results = self.password_lookup.run([u'/path/to/somewhere chars=a'], None)
|
||||||
None)
|
|
||||||
for result in results:
|
for result in results:
|
||||||
self.assertEquals(result, u'a' * password.DEFAULT_LENGTH)
|
self.assertEquals(result, u'a' * password.DEFAULT_LENGTH)
|
||||||
|
|
|
@ -19,11 +19,11 @@
|
||||||
from __future__ import (absolute_import, division, print_function)
|
from __future__ import (absolute_import, division, print_function)
|
||||||
__metaclass__ = type
|
__metaclass__ = type
|
||||||
|
|
||||||
|
from units.mock.loader import DictDataLoader
|
||||||
import uuid
|
import uuid
|
||||||
|
|
||||||
from ansible.compat.tests import unittest
|
from ansible.compat.tests import unittest
|
||||||
from ansible.compat.tests.mock import patch, MagicMock
|
from ansible.compat.tests.mock import patch, MagicMock
|
||||||
|
|
||||||
from ansible.errors import AnsibleError, AnsibleParserError
|
from ansible.errors import AnsibleError, AnsibleParserError
|
||||||
from ansible.executor.process.worker import WorkerProcess
|
from ansible.executor.process.worker import WorkerProcess
|
||||||
from ansible.executor.task_queue_manager import TaskQueueManager
|
from ansible.executor.task_queue_manager import TaskQueueManager
|
||||||
|
@ -34,7 +34,6 @@ from ansible.playbook.block import Block
|
||||||
from ansible.playbook.handler import Handler
|
from ansible.playbook.handler import Handler
|
||||||
from ansible.plugins.strategy import StrategyBase
|
from ansible.plugins.strategy import StrategyBase
|
||||||
|
|
||||||
from units.mock.loader import DictDataLoader
|
|
||||||
|
|
||||||
class TestStrategyBase(unittest.TestCase):
|
class TestStrategyBase(unittest.TestCase):
|
||||||
|
|
||||||
|
@ -46,13 +45,16 @@ class TestStrategyBase(unittest.TestCase):
|
||||||
|
|
||||||
def test_strategy_base_init(self):
|
def test_strategy_base_init(self):
|
||||||
queue_items = []
|
queue_items = []
|
||||||
|
|
||||||
def _queue_empty(*args, **kwargs):
|
def _queue_empty(*args, **kwargs):
|
||||||
return len(queue_items) == 0
|
return len(queue_items) == 0
|
||||||
|
|
||||||
def _queue_get(*args, **kwargs):
|
def _queue_get(*args, **kwargs):
|
||||||
if len(queue_items) == 0:
|
if len(queue_items) == 0:
|
||||||
raise Queue.Empty
|
raise Queue.Empty
|
||||||
else:
|
else:
|
||||||
return queue_items.pop()
|
return queue_items.pop()
|
||||||
|
|
||||||
def _queue_put(item, *args, **kwargs):
|
def _queue_put(item, *args, **kwargs):
|
||||||
queue_items.append(item)
|
queue_items.append(item)
|
||||||
|
|
||||||
|
@ -71,13 +73,16 @@ class TestStrategyBase(unittest.TestCase):
|
||||||
|
|
||||||
def test_strategy_base_run(self):
|
def test_strategy_base_run(self):
|
||||||
queue_items = []
|
queue_items = []
|
||||||
|
|
||||||
def _queue_empty(*args, **kwargs):
|
def _queue_empty(*args, **kwargs):
|
||||||
return len(queue_items) == 0
|
return len(queue_items) == 0
|
||||||
|
|
||||||
def _queue_get(*args, **kwargs):
|
def _queue_get(*args, **kwargs):
|
||||||
if len(queue_items) == 0:
|
if len(queue_items) == 0:
|
||||||
raise Queue.Empty
|
raise Queue.Empty
|
||||||
else:
|
else:
|
||||||
return queue_items.pop()
|
return queue_items.pop()
|
||||||
|
|
||||||
def _queue_put(item, *args, **kwargs):
|
def _queue_put(item, *args, **kwargs):
|
||||||
queue_items.append(item)
|
queue_items.append(item)
|
||||||
|
|
||||||
|
@ -96,7 +101,7 @@ class TestStrategyBase(unittest.TestCase):
|
||||||
for attr in ('RUN_OK', 'RUN_ERROR', 'RUN_FAILED_HOSTS', 'RUN_UNREACHABLE_HOSTS'):
|
for attr in ('RUN_OK', 'RUN_ERROR', 'RUN_FAILED_HOSTS', 'RUN_UNREACHABLE_HOSTS'):
|
||||||
setattr(mock_tqm, attr, getattr(TaskQueueManager, attr))
|
setattr(mock_tqm, attr, getattr(TaskQueueManager, attr))
|
||||||
|
|
||||||
mock_iterator = MagicMock()
|
mock_iterator = MagicMock()
|
||||||
mock_iterator._play = MagicMock()
|
mock_iterator._play = MagicMock()
|
||||||
mock_iterator._play.handlers = []
|
mock_iterator._play.handlers = []
|
||||||
|
|
||||||
|
@ -124,13 +129,16 @@ class TestStrategyBase(unittest.TestCase):
|
||||||
|
|
||||||
def test_strategy_base_get_hosts(self):
|
def test_strategy_base_get_hosts(self):
|
||||||
queue_items = []
|
queue_items = []
|
||||||
|
|
||||||
def _queue_empty(*args, **kwargs):
|
def _queue_empty(*args, **kwargs):
|
||||||
return len(queue_items) == 0
|
return len(queue_items) == 0
|
||||||
|
|
||||||
def _queue_get(*args, **kwargs):
|
def _queue_get(*args, **kwargs):
|
||||||
if len(queue_items) == 0:
|
if len(queue_items) == 0:
|
||||||
raise Queue.Empty
|
raise Queue.Empty
|
||||||
else:
|
else:
|
||||||
return queue_items.pop()
|
return queue_items.pop()
|
||||||
|
|
||||||
def _queue_put(item, *args, **kwargs):
|
def _queue_put(item, *args, **kwargs):
|
||||||
queue_items.append(item)
|
queue_items.append(item)
|
||||||
|
|
||||||
|
@ -142,7 +150,7 @@ class TestStrategyBase(unittest.TestCase):
|
||||||
mock_hosts = []
|
mock_hosts = []
|
||||||
for i in range(0, 5):
|
for i in range(0, 5):
|
||||||
mock_host = MagicMock()
|
mock_host = MagicMock()
|
||||||
mock_host.name = "host%02d" % (i+1)
|
mock_host.name = "host%02d" % (i + 1)
|
||||||
mock_host.has_hostkey = True
|
mock_host.has_hostkey = True
|
||||||
mock_hosts.append(mock_host)
|
mock_hosts.append(mock_host)
|
||||||
|
|
||||||
|
@ -156,7 +164,7 @@ class TestStrategyBase(unittest.TestCase):
|
||||||
mock_tqm.get_inventory.return_value = mock_inventory
|
mock_tqm.get_inventory.return_value = mock_inventory
|
||||||
|
|
||||||
mock_play = MagicMock()
|
mock_play = MagicMock()
|
||||||
mock_play.hosts = ["host%02d" % (i+1) for i in range(0, 5)]
|
mock_play.hosts = ["host%02d" % (i + 1) for i in range(0, 5)]
|
||||||
|
|
||||||
strategy_base = StrategyBase(tqm=mock_tqm)
|
strategy_base = StrategyBase(tqm=mock_tqm)
|
||||||
|
|
||||||
|
@ -213,7 +221,6 @@ class TestStrategyBase(unittest.TestCase):
|
||||||
finally:
|
finally:
|
||||||
tqm.cleanup()
|
tqm.cleanup()
|
||||||
|
|
||||||
|
|
||||||
def test_strategy_base_process_pending_results(self):
|
def test_strategy_base_process_pending_results(self):
|
||||||
mock_tqm = MagicMock()
|
mock_tqm = MagicMock()
|
||||||
mock_tqm._terminated = False
|
mock_tqm._terminated = False
|
||||||
|
@ -224,13 +231,16 @@ class TestStrategyBase(unittest.TestCase):
|
||||||
mock_tqm._listening_handlers = {}
|
mock_tqm._listening_handlers = {}
|
||||||
|
|
||||||
queue_items = []
|
queue_items = []
|
||||||
|
|
||||||
def _queue_empty(*args, **kwargs):
|
def _queue_empty(*args, **kwargs):
|
||||||
return len(queue_items) == 0
|
return len(queue_items) == 0
|
||||||
|
|
||||||
def _queue_get(*args, **kwargs):
|
def _queue_get(*args, **kwargs):
|
||||||
if len(queue_items) == 0:
|
if len(queue_items) == 0:
|
||||||
raise Queue.Empty
|
raise Queue.Empty
|
||||||
else:
|
else:
|
||||||
return queue_items.pop()
|
return queue_items.pop()
|
||||||
|
|
||||||
def _queue_put(item, *args, **kwargs):
|
def _queue_put(item, *args, **kwargs):
|
||||||
queue_items.append(item)
|
queue_items.append(item)
|
||||||
|
|
||||||
|
@ -290,6 +300,7 @@ class TestStrategyBase(unittest.TestCase):
|
||||||
if host_name == 'test01':
|
if host_name == 'test01':
|
||||||
return mock_host
|
return mock_host
|
||||||
return None
|
return None
|
||||||
|
|
||||||
def _get_group(group_name):
|
def _get_group(group_name):
|
||||||
if group_name in ('all', 'foo'):
|
if group_name in ('all', 'foo'):
|
||||||
return mock_group
|
return mock_group
|
||||||
|
@ -341,8 +352,8 @@ class TestStrategyBase(unittest.TestCase):
|
||||||
self.assertEqual(results[0], task_result)
|
self.assertEqual(results[0], task_result)
|
||||||
self.assertEqual(strategy_base._pending_results, 0)
|
self.assertEqual(strategy_base._pending_results, 0)
|
||||||
self.assertNotIn('test01', strategy_base._blocked_hosts)
|
self.assertNotIn('test01', strategy_base._blocked_hosts)
|
||||||
#self.assertIn('test01', mock_tqm._failed_hosts)
|
# self.assertIn('test01', mock_tqm._failed_hosts)
|
||||||
#del mock_tqm._failed_hosts['test01']
|
# del mock_tqm._failed_hosts['test01']
|
||||||
mock_iterator.is_failed.return_value = False
|
mock_iterator.is_failed.return_value = False
|
||||||
|
|
||||||
task_result = TaskResult(host=mock_host.name, task=mock_task._uuid, return_data='{"unreachable": true}')
|
task_result = TaskResult(host=mock_host.name, task=mock_task._uuid, return_data='{"unreachable": true}')
|
||||||
|
@ -393,18 +404,18 @@ class TestStrategyBase(unittest.TestCase):
|
||||||
self.assertIn(mock_handler_task._uuid, strategy_base._notified_handlers)
|
self.assertIn(mock_handler_task._uuid, strategy_base._notified_handlers)
|
||||||
self.assertIn(mock_host, strategy_base._notified_handlers[mock_handler_task._uuid])
|
self.assertIn(mock_host, strategy_base._notified_handlers[mock_handler_task._uuid])
|
||||||
|
|
||||||
#queue_items.append(('set_host_var', mock_host, mock_task, None, 'foo', 'bar'))
|
# queue_items.append(('set_host_var', mock_host, mock_task, None, 'foo', 'bar'))
|
||||||
#results = strategy_base._process_pending_results(iterator=mock_iterator)
|
# results = strategy_base._process_pending_results(iterator=mock_iterator)
|
||||||
#self.assertEqual(len(results), 0)
|
# self.assertEqual(len(results), 0)
|
||||||
#self.assertEqual(strategy_base._pending_results, 1)
|
# self.assertEqual(strategy_base._pending_results, 1)
|
||||||
|
|
||||||
#queue_items.append(('set_host_facts', mock_host, mock_task, None, 'foo', dict()))
|
# queue_items.append(('set_host_facts', mock_host, mock_task, None, 'foo', dict()))
|
||||||
#results = strategy_base._process_pending_results(iterator=mock_iterator)
|
# results = strategy_base._process_pending_results(iterator=mock_iterator)
|
||||||
#self.assertEqual(len(results), 0)
|
# self.assertEqual(len(results), 0)
|
||||||
#self.assertEqual(strategy_base._pending_results, 1)
|
# self.assertEqual(strategy_base._pending_results, 1)
|
||||||
|
|
||||||
#queue_items.append(('bad'))
|
# queue_items.append(('bad'))
|
||||||
#self.assertRaises(AnsibleError, strategy_base._process_pending_results, iterator=mock_iterator)
|
# self.assertRaises(AnsibleError, strategy_base._process_pending_results, iterator=mock_iterator)
|
||||||
strategy_base.cleanup()
|
strategy_base.cleanup()
|
||||||
|
|
||||||
def test_strategy_base_load_included_file(self):
|
def test_strategy_base_load_included_file(self):
|
||||||
|
@ -417,13 +428,16 @@ class TestStrategyBase(unittest.TestCase):
|
||||||
})
|
})
|
||||||
|
|
||||||
queue_items = []
|
queue_items = []
|
||||||
|
|
||||||
def _queue_empty(*args, **kwargs):
|
def _queue_empty(*args, **kwargs):
|
||||||
return len(queue_items) == 0
|
return len(queue_items) == 0
|
||||||
|
|
||||||
def _queue_get(*args, **kwargs):
|
def _queue_get(*args, **kwargs):
|
||||||
if len(queue_items) == 0:
|
if len(queue_items) == 0:
|
||||||
raise Queue.Empty
|
raise Queue.Empty
|
||||||
else:
|
else:
|
||||||
return queue_items.pop()
|
return queue_items.pop()
|
||||||
|
|
||||||
def _queue_put(item, *args, **kwargs):
|
def _queue_put(item, *args, **kwargs):
|
||||||
queue_items.append(item)
|
queue_items.append(item)
|
||||||
|
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue