From 9a0363d9131b49d05ec6b67024ea4686542bc328 Mon Sep 17 00:00:00 2001
From: Jared Tabor
Date: Mon, 11 Apr 2016 12:09:33 -0700
Subject: [PATCH 1/3] Sat6, CloudForms, Network, and Azure_rm to the UI
Adding UI changes for RH Satellite6, RH CloudForms, Azure RM, and the new Network credentials and inventory sources.
Network Inventory on the UI
making host required for cloudforms and sat6
first commit of azure_rm
More Azure Credential form elements
Fixes to azure_rm after API merges
fixing network credential and new azure inv source
---
awx/ui/client/src/controllers/Credentials.js | 4 +-
awx/ui/client/src/forms/Credentials.js | 99 ++++++++++++++------
awx/ui/client/src/forms/Groups.js | 2 +-
awx/ui/client/src/helpers/Credentials.js | 34 ++++++-
awx/ui/client/src/helpers/Groups.js | 7 +-
5 files changed, 112 insertions(+), 34 deletions(-)
diff --git a/awx/ui/client/src/controllers/Credentials.js b/awx/ui/client/src/controllers/Credentials.js
index 2ed862b4c9..f7115aafb5 100644
--- a/awx/ui/client/src/controllers/Credentials.js
+++ b/awx/ui/client/src/controllers/Credentials.js
@@ -519,8 +519,8 @@ export function CredentialsEdit($scope, $rootScope, $compile, $location, $log,
$scope.project = data.project;
break;
case 'azure':
- $scope.subscription_id = data.username;
-
+ $scope.subscription = data.username;
+ break;
}
$scope.credential_obj = data;
diff --git a/awx/ui/client/src/forms/Credentials.js b/awx/ui/client/src/forms/Credentials.js
index 7865383ad3..d96ef6d594 100644
--- a/awx/ui/client/src/forms/Credentials.js
+++ b/awx/ui/client/src/forms/Credentials.js
@@ -141,7 +141,7 @@ export default
"host": {
labelBind: 'hostLabel',
type: 'text',
- ngShow: "kind.value == 'vmware' || kind.value == 'openstack'",
+ ngShow: "kind.value == 'vmware' || kind.value == 'openstack' || kind.value === 'foreman' || kind.value === 'cloudforms'",
awPopOverWatch: "hostPopOver",
awPopOver: "set in helpers/credentials",
dataTitle: 'Host',
@@ -154,6 +154,23 @@ export default
},
subForm: 'credentialSubForm'
},
+ "subscription": {
+ label: "Subscription ID",
+ type: 'text',
+ ngShow: "kind.value == 'azure' || kind.value == 'azure_rm'",
+ awRequiredWhen: {
+ reqExpression: 'subscription_required',
+ init: false
+ },
+ addRequired: false,
+ editRequired: false,
+ autocomplete: false,
+ awPopOver: 'Subscription ID is an Azure construct, which is mapped to a username.
',
+ dataTitle: 'Subscription ID',
+ dataPlacement: 'right',
+ dataContainer: "body",
+ subForm: 'credentialSubForm'
+ },
"username": {
labelBind: 'usernameLabel',
type: 'text',
@@ -181,23 +198,6 @@ export default
dataContainer: "body",
subForm: 'credentialSubForm'
},
- "subscription_id": {
- labelBind: "usernameLabel",
- type: 'text',
- ngShow: "kind.value == 'azure'",
- awRequiredWhen: {
- reqExpression: 'subscription_required',
- init: false
- },
- addRequired: false,
- editRequired: false,
- autocomplete: false,
- awPopOver: 'Subscription ID is an Azure construct, which is mapped to a username.
',
- dataTitle: 'Subscription ID',
- dataPlacement: 'right',
- dataContainer: "body",
- subForm: 'credentialSubForm'
- },
"api_key": {
label: 'API Key',
type: 'sensitive',
@@ -215,9 +215,7 @@ export default
"password": {
labelBind: 'passwordLabel',
type: 'sensitive',
- ngShow: "kind.value == 'scm' || kind.value == 'vmware' || kind.value == 'openstack'",
- addRequired: false,
- editRequired: false,
+ ngShow: "kind.value == 'scm' || kind.value == 'vmware' || kind.value == 'openstack'|| kind.value == 'foreman'|| kind.value == 'cloudforms'|| kind.value == 'net' || kind.value == 'azure_rm'",
ask: false,
clear: false,
autocomplete: false,
@@ -229,7 +227,7 @@ export default
subForm: "credentialSubForm"
},
"ssh_password": {
- label: 'Password', // formally 'SSH Password'
+ label: 'Password',
type: 'sensitive',
ngShow: "kind.value == 'ssh'",
addRequired: false,
@@ -243,7 +241,7 @@ export default
labelBind: 'sshKeyDataLabel',
type: 'textarea',
ngShow: "kind.value == 'ssh' || kind.value == 'scm' || " +
- "kind.value == 'gce' || kind.value == 'azure'",
+ "kind.value == 'gce' || kind.value == 'azure' || kind.value == 'net'",
awRequiredWhen: {
reqExpression: 'key_required',
init: true
@@ -288,18 +286,18 @@ export default
subForm: 'credentialSubForm'
},
"become_username": {
- label: 'Privilege Escalation Username',
+ labelBind: 'becomeUsernameLabel',
type: 'text',
- ngShow: "kind.value == 'ssh' && (become_method && become_method.value)",
+ ngShow: "(kind.value == 'ssh' && (become_method && become_method.value)) ",
addRequired: false,
editRequired: false,
autocomplete: false,
subForm: 'credentialSubForm'
},
"become_password": {
- label: 'Privilege Escalation Password',
+ labelBind: 'becomePasswordLabel',
type: 'sensitive',
- ngShow: "kind.value == 'ssh' && (become_method && become_method.value)",
+ ngShow: "(kind.value == 'ssh' && (become_method && become_method.value)) ",
addRequired: false,
editRequired: false,
ask: true,
@@ -307,6 +305,53 @@ export default
autocomplete: false,
subForm: 'credentialSubForm'
},
+ client:{
+ type: 'text',
+ label: 'Client ID',
+ awRequiredWhen: {
+ reqExpression: "azure_rm_required",
+ init: false
+ },
+ subForm: 'credentialSubForm',
+ ngShow: "kind.value === 'azure_rm'"
+ },
+ secret:{
+ type: 'sensitive',
+ hasShowInputButton: true,
+ autocomplete: false,
+ label: 'Client Secret',
+ awRequiredWhen: {
+ reqExpression: "azure_rm_required",
+ init: false
+ },
+ subForm: 'credentialSubForm',
+ ngShow: "kind.value === 'azure_rm'"
+ },
+ tenant: {
+ type: 'text',
+ label: 'Tenent ID',
+ awRequiredWhen: {
+ reqExpression: "azure_rm_required",
+ init: false
+ },
+ subForm: 'credentialSubForm',
+ ngShow: "kind.value === 'azure_rm'"
+ },
+ authorize: {
+ label: 'Authorize',
+ type: 'checkbox',
+ ngChange: "toggleCallback('host_config_key')",
+ subForm: 'credentialSubForm',
+ ngShow: "kind.value === 'net'"
+ },
+ authorize_password: {
+ label: 'Authorize Password',
+ type: 'sensitive',
+ hasShowInputButton: true,
+ autocomplete: false,
+ subForm: 'credentialSubForm',
+ ngShow: "authorize && authorize !== 'false'",
+ },
"project": {
labelBind: 'projectLabel',
type: 'text',
diff --git a/awx/ui/client/src/forms/Groups.js b/awx/ui/client/src/forms/Groups.js
index ec1de91ddb..3b8940de66 100644
--- a/awx/ui/client/src/forms/Groups.js
+++ b/awx/ui/client/src/forms/Groups.js
@@ -91,7 +91,7 @@ export default
type: 'select',
ngOptions: 'source.label for source in source_region_choices track by source.value',
multiSelect: true,
- ngShow: "source && (source.value == 'rax' || source.value == 'ec2' || source.value == 'gce' || source.value == 'azure')",
+ ngShow: "source && (source.value == 'rax' || source.value == 'ec2' || source.value == 'gce' || source.value == 'azure' || source.value == 'azure_rm')",
addRequired: false,
editRequired: false,
dataTitle: 'Source Regions',
diff --git a/awx/ui/client/src/helpers/Credentials.js b/awx/ui/client/src/helpers/Credentials.js
index 7aa615f86d..03f0254acd 100644
--- a/awx/ui/client/src/helpers/Credentials.js
+++ b/awx/ui/client/src/helpers/Credentials.js
@@ -88,6 +88,8 @@ angular.module('CredentialsHelper', ['Utilities'])
break;
case 'ssh':
scope.usernameLabel = 'Username'; //formally 'SSH Username'
+ scope.becomeUsernameLabel = 'Privilege Escalation Username';
+ scope.becomePasswordLabel = 'Privilege Escalation Password';
break;
case 'scm':
scope.sshKeyDataLabel = 'SCM Private Key';
@@ -109,13 +111,20 @@ angular.module('CredentialsHelper', ['Utilities'])
"as:
adjective-noun-000
";
break;
case 'azure':
- scope.usernameLabel = "Subscription ID";
scope.sshKeyDataLabel = 'Management Certificate';
scope.subscription_required = true;
scope.key_required = true;
scope.key_description = "Paste the contents of the PEM file that corresponds to the certificate you uploaded in the Microsoft Azure console.";
scope.key_hint= "drag and drop a management certificate file on the field below";
break;
+ case 'azure_rm':
+ scope.usernameLabel = "Username";
+ scope.subscription_required = true;
+ scope.username_required = true;
+ scope.password_required = true;
+ scope.passwordLabel = 'Password';
+ scope.azure_rm_required = true;
+ break;
case 'vmware':
scope.username_required = true;
scope.host_required = true;
@@ -137,6 +146,27 @@ angular.module('CredentialsHelper', ['Utilities'])
scope.hostPopOver = "The host to authenticate with." +
"
For example, https://openstack.business.com/v2.0/";
break;
+ case 'foreman':
+ scope.username_required = true;
+ scope.password_required = true;
+ scope.passwordLabel = 'Password';
+ scope.host_required = true;
+ scope.hostLabel = "Satellite 6 Host";
+ break;
+ case 'cloudforms':
+ scope.username_required = true;
+ scope.password_required = true;
+ scope.passwordLabel = 'Password';
+ scope.host_required = true;
+ scope.hostLabel = "CloudForms Host";
+ break;
+ case 'net':
+ scope.username_required = true;
+ scope.password_required = true;
+ scope.passwordLabel = 'Password';
+ scope.sshKeyDataLabel = 'SSH Key';
+ scope.key_required = true;
+ break;
}
}
@@ -238,7 +268,7 @@ angular.module('CredentialsHelper', ['Utilities'])
data.project = scope.project;
break;
case 'azure':
- data.username = scope.subscription_id;
+ data.username = scope.subscription;
}
Wait('start');
diff --git a/awx/ui/client/src/helpers/Groups.js b/awx/ui/client/src/helpers/Groups.js
index 33fe69cf3d..a9320aaf91 100644
--- a/awx/ui/client/src/helpers/Groups.js
+++ b/awx/ui/client/src/helpers/Groups.js
@@ -281,7 +281,7 @@ angular.module('GroupsHelper', [ 'RestServices', 'Utilities', listGenerator.name
CreateSelect2({
element: '#source_source_regions'
});
- } else if (scope.source.value === 'azure') {
+ } else if (scope.source.value === 'azure' || scope.source.value === 'azure_rm') {
scope.source_region_choices = scope.azure_regions;
$('#source_form').addClass('squeeze');
CreateSelect2({
@@ -312,8 +312,11 @@ angular.module('GroupsHelper', [ 'RestServices', 'Utilities', listGenerator.name
}
if (scope.source.value === 'rax' ||
scope.source.value === 'ec2' ||
- scope.source.value==='gce' ||
+ scope.source.value ==='gce' ||
+ scope.source.value === 'foreman' ||
+ scope.source.value ==='cloudforms' ||
scope.source.value === 'azure' ||
+ scope.source.value === 'azure_rm' ||
scope.source.value === 'vmware' ||
scope.source.value === 'openstack') {
if (scope.source.value === 'ec2') {
From 3d1efea86243d5b47b82f9af44609f7eae981c2b Mon Sep 17 00:00:00 2001
From: Jared Tabor
Date: Fri, 22 Apr 2016 14:32:30 -0700
Subject: [PATCH 2/3] Making network credential ssh-key optional
---
awx/ui/client/src/helpers/Credentials.js | 1 -
1 file changed, 1 deletion(-)
diff --git a/awx/ui/client/src/helpers/Credentials.js b/awx/ui/client/src/helpers/Credentials.js
index 03f0254acd..0afd7bbbcc 100644
--- a/awx/ui/client/src/helpers/Credentials.js
+++ b/awx/ui/client/src/helpers/Credentials.js
@@ -165,7 +165,6 @@ angular.module('CredentialsHelper', ['Utilities'])
scope.password_required = true;
scope.passwordLabel = 'Password';
scope.sshKeyDataLabel = 'SSH Key';
- scope.key_required = true;
break;
}
}
From 46614371283661ddba73af73f4533620fdad7d9b Mon Sep 17 00:00:00 2001
From: Jared Tabor
Date: Mon, 25 Apr 2016 09:21:50 -0700
Subject: [PATCH 3/3] inventory source id parsing on edit
---
.../directive/manage-groups.directive.controller.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/awx/ui/client/src/inventories/manage/manage-groups/directive/manage-groups.directive.controller.js b/awx/ui/client/src/inventories/manage/manage-groups/directive/manage-groups.directive.controller.js
index 0b57ddbf1e..a22f80e608 100644
--- a/awx/ui/client/src/inventories/manage/manage-groups/directive/manage-groups.directive.controller.js
+++ b/awx/ui/client/src/inventories/manage/manage-groups/directive/manage-groups.directive.controller.js
@@ -37,7 +37,6 @@ function manageGroupsDirectiveController($filter, $location, $log,
Rest.get()
.success(function(data) {
group = data;
- $scope.source_id = data.related.inventory_source.split('/')[4];
for (var fld in form.fields) {
if (data[fld]) {
$scope[fld] = data[fld];
@@ -47,6 +46,7 @@ function manageGroupsDirectiveController($filter, $location, $log,
if(mode === 'edit') {
$scope.variable_url = data.related.variable_data;
$scope.source_url = data.related.inventory_source;
+ $scope.source_id = data.related.inventory_source.split('/')[4];
$scope.$emit('LoadSourceData');
}
})