diff --git a/awx/main/tasks.py b/awx/main/tasks.py index cb6c3c76af..ffb646856a 100644 --- a/awx/main/tasks.py +++ b/awx/main/tasks.py @@ -1889,6 +1889,7 @@ class RunInventoryUpdate(BaseTask): group_patterns = '[]' group_prefix = 'foreman_' + want_hostcollections = 'False' foreman_opts = dict(inventory_update.source_vars_dict.items()) foreman_opts.setdefault('ssl_verify', 'False') for k, v in foreman_opts.items(): @@ -1896,6 +1897,8 @@ class RunInventoryUpdate(BaseTask): group_patterns = v elif k == 'satellite6_group_prefix' and isinstance(v, basestring): group_prefix = v + elif k == 'satellite6_want_hostcollections' and isinstance(v, bool): + want_hostcollections = v else: cp.set(section, k, six.text_type(v)) @@ -1908,6 +1911,7 @@ class RunInventoryUpdate(BaseTask): cp.add_section(section) cp.set(section, 'group_patterns', group_patterns) cp.set(section, 'want_facts', True) + cp.set(section, 'want_hostcollections', want_hostcollections) cp.set(section, 'group_prefix', group_prefix) section = 'cache' @@ -1946,12 +1950,17 @@ class RunInventoryUpdate(BaseTask): cp.set(section, 'group_by_resource_group', 'yes') cp.set(section, 'group_by_location', 'yes') cp.set(section, 'group_by_tag', 'yes') + if inventory_update.source_regions and 'all' not in inventory_update.source_regions: cp.set( section, 'locations', ','.join([x.strip() for x in inventory_update.source_regions.split(',')]) ) + azure_rm_opts = dict(inventory_update.source_vars_dict.items()) + for k,v in azure_rm_opts.items(): + cp.set(section, k, six.text_type(v)) + # Return INI content. if cp.sections(): f = cStringIO.StringIO() diff --git a/awx/main/tests/unit/test_tasks.py b/awx/main/tests/unit/test_tasks.py index c94c205b86..830c3577fd 100644 --- a/awx/main/tests/unit/test_tasks.py +++ b/awx/main/tests/unit/test_tasks.py @@ -1890,6 +1890,10 @@ class TestInventoryUpdateCredentials(TestJobExecution): ) return cred self.instance.get_cloud_credential = get_cred + self.instance.source_vars = { + 'include_powerstate': 'yes', + 'group_by_resource_group': 'no' + } def run_pexpect_side_effect(*args, **kwargs): args, cwd, env, stdout = args @@ -1902,8 +1906,9 @@ class TestInventoryUpdateCredentials(TestJobExecution): config = ConfigParser.ConfigParser() config.read(env['AZURE_INI_PATH']) assert config.get('azure', 'include_powerstate') == 'yes' - assert config.get('azure', 'group_by_resource_group') == 'yes' + assert config.get('azure', 'group_by_resource_group') == 'no' assert config.get('azure', 'group_by_location') == 'yes' + assert 'group_by_security_group' not in config.items('azure') assert config.get('azure', 'group_by_tag') == 'yes' assert config.get('azure', 'locations') == 'north,south,east,west' return ['successful', 0] @@ -1930,6 +1935,11 @@ class TestInventoryUpdateCredentials(TestJobExecution): ) return cred self.instance.get_cloud_credential = get_cred + self.instance.source_vars = { + 'include_powerstate': 'yes', + 'group_by_resource_group': 'no', + 'group_by_security_group': 'no' + } def run_pexpect_side_effect(*args, **kwargs): args, cwd, env, stdout = args @@ -1941,8 +1951,9 @@ class TestInventoryUpdateCredentials(TestJobExecution): config = ConfigParser.ConfigParser() config.read(env['AZURE_INI_PATH']) assert config.get('azure', 'include_powerstate') == 'yes' - assert config.get('azure', 'group_by_resource_group') == 'yes' + assert config.get('azure', 'group_by_resource_group') == 'no' assert config.get('azure', 'group_by_location') == 'yes' + assert config.get('azure', 'group_by_security_group') == 'no' assert config.get('azure', 'group_by_tag') == 'yes' assert 'locations' not in config.items('azure') return ['successful', 0] @@ -2055,7 +2066,7 @@ class TestInventoryUpdateCredentials(TestJobExecution): return cred self.instance.get_cloud_credential = get_cred - self.instance.source_vars = '{"satellite6_group_patterns": "[a,b,c]", "satellite6_group_prefix": "hey_"}' + self.instance.source_vars = '{"satellite6_group_patterns": "[a,b,c]", "satellite6_group_prefix": "hey_", "satellite6_want_hostcollections": True}' def run_pexpect_side_effect(*args, **kwargs): args, cwd, env, stdout = args @@ -2066,6 +2077,7 @@ class TestInventoryUpdateCredentials(TestJobExecution): assert config.get('foreman', 'password') == 'secret' assert config.get('ansible', 'group_patterns') == '[a,b,c]' assert config.get('ansible', 'group_prefix') == 'hey_' + assert config.get('ansible', 'want_hostcollections') == 'True' return ['successful', 0] self.run_pexpect.side_effect = run_pexpect_side_effect diff --git a/awx/ui/client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js b/awx/ui/client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js index 4415dc386d..f1515a81c9 100644 --- a/awx/ui/client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js +++ b/awx/ui/client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js @@ -164,7 +164,7 @@ export default ['$state', '$stateParams', '$scope', 'SourcesFormDefinition', else{ $scope.credentialBasePath = (source === 'ec2') ? GetBasePath('credentials') + '?kind=aws' : GetBasePath('credentials') + (source === '' ? '' : '?kind=' + (source)); } - if (source === 'ec2' || source === 'custom' || source === 'vmware' || source === 'openstack' || source === 'scm' || source === 'cloudforms' || source === "satellite6") { + if (source === 'ec2' || source === 'custom' || source === 'vmware' || source === 'openstack' || source === 'scm' || source === 'cloudforms' || source === "satellite6" || source === "azure_rm") { $scope.envParseType = 'yaml'; var varName; diff --git a/awx/ui/client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js b/awx/ui/client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js index eb3c083cd4..6f3997fea0 100644 --- a/awx/ui/client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js +++ b/awx/ui/client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js @@ -66,7 +66,7 @@ export default ['$state', '$stateParams', '$scope', 'ParseVariableString', if (source === 'ec2' || source === 'custom' || source === 'vmware' || source === 'openstack' || source === 'scm' || source === 'cloudforms' || - source === 'satellite6') { + source === 'satellite6' || source === 'azure_rm') { var varName; if (source === 'scm') { diff --git a/awx/ui/client/src/inventories-hosts/inventories/related/sources/sources.form.js b/awx/ui/client/src/inventories-hosts/inventories/related/sources/sources.form.js index bffc91e3d0..ec554a5225 100644 --- a/awx/ui/client/src/inventories-hosts/inventories/related/sources/sources.form.js +++ b/awx/ui/client/src/inventories-hosts/inventories/related/sources/sources.form.js @@ -303,6 +303,30 @@ return { dataContainer: 'body', subForm: 'sourceSubForm' }, + azure_rm_variables: { + id: 'azure_rm_variables', + label: i18n._('Source Variables'), //"{{vars_label}}" , + ngShow: "source && source.value == 'azure_rm'", + type: 'textarea', + class: 'Form-textAreaLabel Form-formGroup--fullWidth', + rows: 6, + 'default': '---', + parseTypeName: 'envParseType', + dataTitle: i18n._("Source Variables"), + dataPlacement: 'right', + awPopOver: "
" + i18n._("Override variables found in azure_rm.ini and used by the inventory update script. For a detailed description of these variables ") + + "" + + i18n._("view azure_rm.ini in the Ansible github repo.") + "
" + + "" + i18n._("Enter variables using either JSON or YAML syntax. Use the radio button to toggle between the two.") + "
" + + i18n._("JSON:") + "{\n" + + i18n._("YAML:") + "
\"somevar\": \"somevalue\",
\"password\": \"magic\"
}
---\n" + + "
somevar: somevalue
password: magic
" + i18n._("View JSON examples at ") + 'www.json.org
' + + "" + i18n._("View YAML examples at ") + 'docs.ansible.com
', + dataContainer: 'body', + subForm: 'sourceSubForm' + }, verbosity: { label: i18n._('Verbosity'), type: 'select', diff --git a/awx/ui/client/src/projects/projects.list.js b/awx/ui/client/src/projects/projects.list.js index 06fcd7d1d4..86547c8b66 100644 --- a/awx/ui/client/src/projects/projects.list.js +++ b/awx/ui/client/src/projects/projects.list.js @@ -56,8 +56,7 @@ export default ['i18n', function(i18n) { label: i18n._('Last Updated'), filter: "longDate", columnClass: "col-lg-3 hidden-md hidden-sm hidden-xs", - excludeModal: true, - nosort: true + excludeModal: true } }, diff --git a/tools/scripts/request_tower_configuration.ps1 b/tools/scripts/request_tower_configuration.ps1 index 17f1e91012..db18bfa6bd 100644 --- a/tools/scripts/request_tower_configuration.ps1 +++ b/tools/scripts/request_tower_configuration.ps1 @@ -1,7 +1,8 @@ Param( [string]$tower_url, [string]$host_config_key, - [string]$job_template_id + [string]$job_template_id, + [string]$extra_vars ) Set-StrictMode -Version 2 @@ -10,24 +11,36 @@ $ErrorActionPreference = "Stop" If(-not $tower_url -or -not $host_config_key -or -not $job_template_id) { Write-Host "Requests server configuration from Ansible Tower" - Write-Host "Usage: $($MyInvocation.MyCommand.Name)