Merge remote-tracking branch 'origin/master' into auditlog

* origin/master:
  AC-637 Credential now requires scm_key_unlock when saving encrypted ssh_key_data.
  AC-626 Removed support for prompting for password and ssh_key_unlock for scm/cloud credentials.
  AC-613 Change rackspace to rax for inventory source field value.
  AC-613 Change rackspace to rax for inventory source field value.
  AC-624 Fix options docs for project update view.
  AC-632 Fix escaping for ansible-playbook command line when also using ssh-agent.
  Update CONTRIBUTING.md
  AC-630 Expose cloud_credentials field for job template and job.
  AC-641 Added pattern to respond to key unlock prompt for project update.
  Updated all vendored third-party packages.
  AC-636 Fix existing projects with scm_type=null to always use empty string. Update validation and tests to ensure None gets automatically coerced to an empty string on saving a project.
  AC-633 js error fixed.
  AC-633 fixed a sort of unrelated js error. The capitalize filter directive attempted to act on a 'null' input error. Added a test to ignore empty/null input.
  AC-633 Fixed 'hast' typo.
  AC-617 changed callback generation icon to a magic wand, which will hopefully satiate jlaska.
  AC-627 Fixed password/ssh_password collision in Credentials.js form. This was also fixed in auditlog branch.
  AC-628 applied credential changes made in add controller to edit controller so that credential/cloud_credential lookups display context-aware  credential lists.
  Moved credentials in tab order. It now follows teams and precedes projects. Based on a suggestion from jlaska.
  AC-609 Fixed issue with help button not displaying correctly on 'select' pages where user can pick an existing object (i.e. users, credentials, etc) to add to a parent object.

Conflicts:
	awx/api/serializers.py
	awx/main/migrations/0025_v14_changes.py
This commit is contained in:
Matthew Jones
2013-11-18 09:18:37 -05:00
797 changed files with 46286 additions and 28659 deletions

View File

@@ -501,6 +501,7 @@ function JobTemplatesEdit ($scope, $rootScope, $compile, $location, $log, $route
});
LookUpInit({
url: GetBasePath('credentials') + '?kind=ssh',
scope: scope,
form: form,
current_item: data.credential,
@@ -508,11 +509,19 @@ function JobTemplatesEdit ($scope, $rootScope, $compile, $location, $log, $route
field: 'credential'
});
// Clone the CredentialList object for use with cloud_credential. Cloning
// and changing properties to avoid collision.
var CloudCredentialList = {};
jQuery.extend(true, CloudCredentialList, CredentialList);
CloudCredentialList.name = 'cloudcredentials',
CloudCredentialList.iterator = 'cloudcredential',
LookUpInit({
url: GetBasePath('credentials') + '?cloud=true',
scope: scope,
form: form,
current_item: data.cloud_credential,
list: CredentialList,
list: CloudCredentialList,
field: 'cloud_credential'
});

View File

@@ -126,7 +126,7 @@ angular.module('GroupFormDefinition', [])
label: 'Regions',
excludeModal: true,
type: 'text',
ngShow: "source.value == 'rackspace' || source.value == 'ec2'",
ngShow: "source.value == 'rax' || source.value == 'ec2'",
addRequired: false,
editRequired: false,
dataTitle: 'Source Regions',

View File

@@ -810,7 +810,7 @@ angular.module('GroupsHelper', [ 'RestServices', 'Utilities', 'ListGenerator', '
LookUpInit({
url: GetBasePath('credentials') +
'?cloud=true&kind=' + [(scope.source.value == 'rackspace') ? 'rax' : 'aws'],
'?cloud=true&kind=' + [(scope.source.value == 'rax') ? 'rax' : 'aws'],
scope: scope,
form: form,
list: CredentialList,
@@ -1008,7 +1008,7 @@ angular.module('GroupsHelper', [ 'RestServices', 'Utilities', 'ListGenerator', '
}
LookUpInit({
url: GetBasePath('credentials') +
'?cloud=true&kind=' + [(scope.source.value == 'rackspace') ? 'rax' : 'aws'],
'?cloud=true&kind=' + [(scope.source.value == 'rax') ? 'rax' : 'aws'],
scope: scope,
form: form,
list: CredentialList,

View File

@@ -30,7 +30,7 @@ angular.module('HostsHelper', [ 'RestServices', 'Utilities', 'ListGenerator', 'H
host.active_failures = 'n/a';
}
else if (host.has_active_failures == false && host.last_job !== null) {
hast.badgeToolTip = "Most recent job successful. Click to view jobs.";
host.badgeToolTip = "Most recent job successful. Click to view jobs.";
host.active_failures = 'success';
}
@@ -870,16 +870,6 @@ angular.module('HostsHelper', [ 'RestServices', 'Utilities', 'ListGenerator', 'H
scope.removeHostsReload = scope.$on('hostsReload', function() {
HostsReload(params);
});
// After the group record is loaded, retrieve any group variables
if (scope.hostLoadedRemove) {
scope.hostLoadedRemove();
}
scope.hostLoadedRemove = scope.$on('hostLoaded', function() {
});
if (!scope.$$phase) {
scope.$digest();

View File

@@ -78,7 +78,7 @@ angular.module('HomeGroupListDefinition', [])
searchOptions: [
{ name: "ec2", value: "ec2" },
{ name: "none", value: "" },
{ name: "rackspace", value: "rackspace" }],
{ name: "rax", value: "rax" }],
sourceModel: 'inventory_source',
sourceField: 'source',
searchOnly: true
@@ -86,7 +86,7 @@ angular.module('HomeGroupListDefinition', [])
has_external_source: {
label: 'Has external source?',
searchType: 'in',
searchValue: 'ec2,rackspace',
searchValue: 'ec2,rax',
searchOnly: true,
sourceModel: 'inventory_source',
sourceField: 'source'

View File

@@ -71,7 +71,7 @@ angular.module('InventorySummaryDefinition', [])
searchOptions: [
{ name: "ec2", value: "ec2" },
{ name: "none", value: "" },
{ name: "rackspace", value: "rackspace" }],
{ name: "rax", value: "rax" }],
sourceModel: 'inventory_source',
sourceField: 'source',
searchOnly: true
@@ -79,7 +79,7 @@ angular.module('InventorySummaryDefinition', [])
has_external_source: {
label: 'Has external source?',
searchType: 'in',
searchValue: 'ec2,rackspace',
searchValue: 'ec2,rax',
searchOnly: true,
sourceModel: 'inventory_source',
sourceField: 'source'

View File

@@ -134,7 +134,7 @@ angular.module('InventorySyncStatusWidget', ['RestServices', 'Utilities'])
{ hdr: 'Error!', msg: 'Failed to get ' + url + '. GET status: ' + status });
});
url = GetBasePath('inventory_sources') + '?source__in=ec2,rackspace&page=1';
url = GetBasePath('inventory_sources') + '?source__in=ec2,rax&page=1';
Rest.setUrl(url);
Rest.get()
.success( function(data, status, headers, config) {
@@ -146,7 +146,7 @@ angular.module('InventorySyncStatusWidget', ['RestServices', 'Utilities'])
{ hdr: 'Error!', msg: 'Failed to get ' + url + '. GET status: ' + status });
});
url = GetBasePath('inventory_sources') + '?status=failed&source__in=ec2,rackspace&page=1';
url = GetBasePath('inventory_sources') + '?status=failed&source__in=ec2,rax&page=1';
Rest.setUrl(url);
Rest.get()
.success( function(data, status, headers, config) {

View File

@@ -23,8 +23,8 @@ angular.module('ObjectCountWidget', ['RestServices', 'Utilities'])
scope.removeCountReady();
}
scope.removeCountReady = scope.$on('countReady', function(e, obj, count) {
var keys=[ 'organizations', 'users', 'teams', 'projects', 'inventory', 'groups', 'hosts',
'credentials', 'job_templates', 'jobs' ];
var keys=[ 'organizations', 'users', 'teams', 'credentials', 'projects', 'inventory', 'groups', 'hosts',
'job_templates', 'jobs' ];
var html, itm;
var cnt = 0;
for (itm in counts) {

View File

@@ -11,12 +11,14 @@ angular.module('AWFilters', [])
//
.filter('capitalize', function() {
return function(input) {
var values = input.replace(/\_/g,' ').split(" ");
var result = "";
for (i = 0; i < values.length; i++){
result += values[i].charAt(0).toUpperCase() + values[i].substr(1) + ' ';
if (input) {
var values = input.replace(/\_/g,' ').split(" ");
var result = "";
for (i = 0; i < values.length; i++){
result += values[i].charAt(0).toUpperCase() + values[i].substr(1) + ' ';
}
result = result.trim();
return result;
}
result = result.trim();
return result;
}
});

View File

@@ -525,7 +525,7 @@ angular.module('FormGenerator', ['GeneratorHelpers', 'ngCookies', 'Utilities'])
if (field.genMD5) {
html += "<span class=\"input-group-btn\"><button type=\"button\" class=\"btn btn-default\" ng-click=\"genMD5('" + fld + "')\" " +
"aw-tool-tip=\"Generate " + field.label + "\" data-placement=\"top\" id=\"" + this.form.name + "_" + fld + "_gen_btn\">" +
"<i class=\"icon-repeat\"></i></button></span>\n</div>\n";
"<i class=\"icon-magic\"></i></button></span>\n</div>\n";
}
// Add error messages

View File

@@ -239,8 +239,7 @@ angular.module('ListGenerator', ['GeneratorHelpers'])
}
}
}
html += "</div><!-- list-acitons -->\n";
//select instructions
if (options.mode == 'select' && list.selectInstructions) {
var btn = {
@@ -248,15 +247,16 @@ angular.module('ListGenerator', ['GeneratorHelpers'])
dataPlacement: 'left',
dataContainer: 'body',
icon: "icon-question-sign",
'class': 'btn-sm btn-help btn-info',
'class': 'btn-xs btn-help btn-info',
awToolTip: 'Click for help',
dataTitle: 'Help',
iconSize: 'large'
};
html += this.button(btn, 'select');
}
html += "</div><!-- list-acitons -->\n";
html += "</div><!-- col-lg-7 -->\n";
}
else {
html += "<div class=\"col-lg-7\"></div>\n";

View File

@@ -163,9 +163,9 @@
<li><a href="#organizations" id="main_organizations_tab" data-toggle="tab">Organizations</a></li>
<li><a href="#users" id="main_users_tab" data-toggle="tab">Users</a></li>
<li><a href="#teams" id="main_teams_tab" data-toggle="tab">Teams</a></li>
<li><a href="#credentials" id="main_credentials_tab" data-toggle="tab">Credentials</a></li>
<li><a href="#projects" id="main_projects_tab" data-toggle="tab">Projects</a></li>
<li><a href="#inventories" id="main_inventories_tab" data-toggle="tab">Inventories</a></li>
<li><a href="#credentials" id="main_credentials_tab" data-toggle="tab">Credentials</a></li>
<li><a href="#job_templates" id="main_job_templates_tab" data-toggle="tab">Job Templates</a></li>
<li><a href="#jobs" id="main_jobs_tab" data-toggle="tab">Jobs</a></li>
</ul>