-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+ {{vm.strings.get('container.BADGE_TEXT') }}
+
+
+
+
+
+
+ {{vm.strings.get('instance.BADGE_TEXT') }}
+
+
+
+
+
+
-
-
diff --git a/awx/ui/client/src/instance-groups/main.js b/awx/ui/client/src/instance-groups/main.js
index bfd33a9c55..78858592f1 100644
--- a/awx/ui/client/src/instance-groups/main.js
+++ b/awx/ui/client/src/instance-groups/main.js
@@ -1,5 +1,10 @@
-import { templateUrl } from '../shared/template-url/template-url.factory';
+import {
+ templateUrl
+} from '../shared/template-url/template-url.factory';
import CapacityAdjuster from './capacity-adjuster/capacity-adjuster.directive';
+import AddContainerGroup from './container-groups/add-container-group.view.html';
+import EditContainerGroupController from './container-groups/edit-container-group.controller';
+import AddContainerGroupController from './container-groups/add-container-group.controller';
import CapacityBar from './capacity-bar/capacity-bar.directive';
import instanceGroupsMultiselect from '../shared/instance-groups-multiselect/instance-groups.directive';
import instanceGroupsModal from '../shared/instance-groups-multiselect/instance-groups-modal/instance-groups-modal.directive';
@@ -25,34 +30,55 @@ import InstanceGroupsStrings from './instance-groups.strings';
import instanceGroupJobsRoute from '~features/jobs/routes/instanceGroupJobs.route.js';
import instanceJobsRoute from '~features/jobs/routes/instanceJobs.route.js';
+
const MODULE_NAME = 'instanceGroups';
-function InstanceGroupsResolve ($q, $stateParams, InstanceGroup, Instance, ProcessErrors, strings) {
+function InstanceGroupsResolve($q, $stateParams, InstanceGroup, Credential, Instance, ProcessErrors, strings) {
const instanceGroupId = $stateParams.instance_group_id;
const instanceId = $stateParams.instance_id;
let promises = {};
if (!instanceGroupId && !instanceId) {
promises.instanceGroup = new InstanceGroup(['get', 'options']);
+ promises.credential = new Credential(['get', 'options']);
return $q.all(promises);
}
if (instanceGroupId && instanceId) {
promises.instance = new Instance(['get', 'options'], [instanceId, instanceId])
- .then((instance) => instance.extend('get', 'jobs', {params: {page_size: "10", order_by: "-finished"}}));
+ .then((instance) => instance.extend('get', 'jobs', {
+ params: {
+ page_size: "10",
+ order_by: "-finished"
+ }
+ }));
return $q.all(promises);
}
promises.instanceGroup = new InstanceGroup(['get', 'options'], [instanceGroupId, instanceGroupId])
- .then((instanceGroup) => instanceGroup.extend('get', 'jobs', {params: {page_size: "10", order_by: "-finished"}}))
- .then((instanceGroup) => instanceGroup.extend('get', 'instances'));
+ .then((instanceGroup) => instanceGroup.extend('get', 'jobs', {
+ params: {
+ page_size: "10",
+ order_by: "-finished"
+ }
+ }))
+ .then((instanceGroup) => instanceGroup.extend('get', 'instances'));
+
+ promises.credential = new Credential();
return $q.all(promises)
.then(models => models)
- .catch(({ data, status, config }) => {
+ .catch(({
+ data,
+ status,
+ config
+ }) => {
ProcessErrors(null, data, status, null, {
hdr: strings.get('error.HEADER'),
- msg: strings.get('error.CALL', { path: `${config.url}`, status })
+ msg: strings.get('error.CALL', {
+ path: `${config.url}`,
+ status
+ })
});
return $q.reject();
});
@@ -62,12 +88,13 @@ InstanceGroupsResolve.$inject = [
'$q',
'$stateParams',
'InstanceGroupModel',
+ 'CredentialModel',
'InstanceModel',
'ProcessErrors',
'InstanceGroupsStrings'
];
-function InstanceGroupsRun ($stateExtender, strings) {
+function InstanceGroupsRun($stateExtender, strings) {
$stateExtender.addState({
name: 'instanceGroups',
url: '/instance_groups',
@@ -100,7 +127,7 @@ function InstanceGroupsRun ($stateExtender, strings) {
resolve: {
resolvedModels: InstanceGroupsResolve,
Dataset: ['InstanceGroupList', 'QuerySet', '$stateParams', 'GetBasePath',
- function(list, qs, $stateParams, GetBasePath) {
+ function (list, qs, $stateParams, GetBasePath) {
let path = GetBasePath(list.basePath) || GetBasePath(list.name);
return qs.search(path, $stateParams[`${list.iterator}_search`]);
}
@@ -143,6 +170,165 @@ function InstanceGroupsRun ($stateExtender, strings) {
]
}
});
+ $stateExtender.addState({
+ name: 'instanceGroups.addContainerGroup',
+ url: '/container_group',
+ views: {
+ 'addContainerGroup@instanceGroups': {
+ templateUrl: AddContainerGroup,
+ controller: AddContainerGroupController,
+ controllerAs: 'vm'
+ }
+ },
+ resolve: {
+ resolvedModels: InstanceGroupsResolve,
+ DataSet: ['Rest', 'GetBasePath', (Rest, GetBasePath) => {
+ Rest.setUrl(`${GetBasePath('instance_groups')}`);
+ return Rest.options();
+ }]
+ },
+ ncyBreadcrumb: {
+ label: strings.get('state.ADD_CONTAINER_GROUP_BREADCRUMB_LABEL')
+ },
+ });
+
+ $stateExtender.addState({
+ name: 'instanceGroups.addContainerGroup.credentials',
+ url: '/credential?selected',
+ searchPrefix: 'credential',
+ params: {
+ credential_search: {
+ value: {
+ order_by: 'name',
+ page_size: 5,
+ },
+ dynamic: true,
+ squash: ''
+ }
+ },
+ data: {
+ basePath: 'credentials',
+ formChildState: true
+ },
+ ncyBreadcrumb: {
+ skip: true
+ },
+ views: {
+ 'credentials@instanceGroups.addContainerGroup': {
+ templateProvider: (ListDefinition, generateList) => {
+ const html = generateList.build({
+ mode: 'lookup',
+ list: ListDefinition,
+ input_type: 'radio'
+ });
+ return `
${html}`;
+ }
+ }
+ },
+ resolve: {
+ ListDefinition: ['CredentialList', list => list],
+ Dataset: ['ListDefinition', 'QuerySet', '$stateParams', 'GetBasePath', (list, qs, $stateParams, GetBasePath) => {
+ const params = {
+ credential_type__kind: 'kubernetes',
+ };
+ const searchPath = GetBasePath('credentials');
+ return qs.search(
+ searchPath, params,
+ $stateParams[`${list.iterator}_search`]
+ );
+ }]
+ },
+ onExit ($state) {
+ if ($state.transition) {
+ $('#form-modal').modal('hide');
+ $('.modal-backdrop').remove();
+ $('body').removeClass('modal-open');
+ }
+ }
+ });
+
+
+
+
+ $stateExtender.addState({
+ name: 'instanceGroups.editContainerGroup',
+ url: '/container_group/edit/:instance_group_id',
+ views: {
+ 'editContainerGroup@instanceGroups': {
+ templateUrl: AddContainerGroup,
+ controller: EditContainerGroupController,
+ controllerAs: 'vm'
+ }
+ },
+ resolve: {
+ resolvedModels: InstanceGroupsResolve,
+ EditContainerGroupDataset: ['GetBasePath', 'QuerySet', '$stateParams',
+ function (GetBasePath, qs, $stateParams) {
+ let path = `${GetBasePath('instance_groups')}${$stateParams.instance_group_id}`;
+ return qs.search(path, $stateParams);
+ }
+ ],
+ },
+ ncyBreadcrumb: {
+ label: '{{breadcrumb.instance_group_name}}'
+ },
+ });
+
+ $stateExtender.addState({
+ name: 'instanceGroups.editContainerGroup.credentials',
+ url: '/credential?selected',
+ searchPrefix: 'credential',
+ params: {
+ credential_search: {
+ value: {
+ order_by: 'name',
+ page_size: 5,
+ },
+ dynamic: true,
+ squash: ''
+ }
+ },
+ data: {
+ basePath: 'credentials',
+ formChildState: true
+ },
+ views: {
+ 'credentials@instanceGroups.editContainerGroup': {
+ templateProvider: (ListDefinition, generateList) => {
+ const html = generateList.build({
+ mode: 'lookup',
+ list: ListDefinition,
+ input_type: 'radio'
+ });
+ return `
${html}`;
+ }
+ }
+ },
+ resolve: {
+ ListDefinition: ['CredentialList', list => list],
+ Dataset: ['ListDefinition', 'QuerySet', '$stateParams', 'GetBasePath', (list, qs, $stateParams, GetBasePath) => {
+ const params = {
+ credential_type__kind: 'kubernetes',
+ };
+ const searchPath = GetBasePath('credentials');
+ return qs.search(
+ searchPath, params,
+ $stateParams[`${list.iterator}_search`]
+ );
+ }]
+ },
+ onExit ($state) {
+ if ($state.transition) {
+ $('#form-modal').modal('hide');
+ $('.modal-backdrop').remove();
+ $('body').removeClass('modal-open');
+ }
+ }
+ });
+
+
+
+
$stateExtender.addState({
name: 'instanceGroups.edit',
@@ -207,7 +393,7 @@ function InstanceGroupsRun ($stateExtender, strings) {
resolve: {
resolvedModels: InstanceGroupsResolve,
Dataset: ['GetBasePath', 'QuerySet', '$stateParams',
- function(GetBasePath, qs, $stateParams) {
+ function (GetBasePath, qs, $stateParams) {
let path = `${GetBasePath('instance_groups')}${$stateParams.instance_group_id}/instances`;
return qs.search(path, $stateParams[`instance_search`]);
}
@@ -255,7 +441,7 @@ function InstanceGroupsRun ($stateExtender, strings) {
resolve: {
resolvedModels: InstanceGroupsResolve,
Dataset: ['GetBasePath', 'QuerySet', '$stateParams',
- function(GetBasePath, qs, $stateParams) {
+ function (GetBasePath, qs, $stateParams) {
let path = `${GetBasePath('instances')}`;
return qs.search(path, $stateParams[`add_instance_search`]);
}
@@ -269,7 +455,8 @@ function InstanceGroupsRun ($stateExtender, strings) {
InstanceGroupsRun.$inject = [
'$stateExtender',
- 'InstanceGroupsStrings'
+ 'InstanceGroupsStrings',
+ 'Rest'
];
angular.module(MODULE_NAME, [])
diff --git a/awx/ui/client/src/shared/lookup/lookup-modal.directive.js b/awx/ui/client/src/shared/lookup/lookup-modal.directive.js
index bfc362a257..cee16d2e1c 100644
--- a/awx/ui/client/src/shared/lookup/lookup-modal.directive.js
+++ b/awx/ui/client/src/shared/lookup/lookup-modal.directive.js
@@ -74,7 +74,7 @@ export default ['templateUrl', 'i18n', function(templateUrl, i18n) {
}
}
- $scope.saveForm = function() {
+ $scope.saveForm = function () {
eventService.remove(listeners);
let list = $scope.list;
if($scope.currentSelection.name !== null) {
@@ -89,7 +89,7 @@ export default ['templateUrl', 'i18n', function(templateUrl, i18n) {
$state.go('^');
};
- $scope.toggle_row = function(selectedRow) {
+ $scope.toggle_row = function (selectedRow) {
let list = $scope.list;
let count = 0;
$scope[list.name].forEach(function(row) {