update UI for max_forks and max_concurrent_jobs

This includes updates for container groups and instance groups.
Includes updates to ui test data with new fields
This commit is contained in:
Elijah DeLee
2022-10-26 22:05:34 -04:00
parent 1cdd2cad67
commit 4b7b3c7c7d
11 changed files with 101 additions and 2 deletions

View File

@@ -29,6 +29,10 @@ function ContainerGroupAdd() {
try { try {
const { data: response } = await InstanceGroupsAPI.create({ const { data: response } = await InstanceGroupsAPI.create({
name: values.name, name: values.name,
max_forks: values.max_forks ? values.max_forks : 0,
max_concurrent_jobs: values.max_concurrent_jobs
? values.max_concurrent_jobs
: 0,
credential: values?.credential?.id, credential: values?.credential?.id,
pod_spec_override: values.override pod_spec_override: values.override
? getPodSpecValue(values.pod_spec_override) ? getPodSpecValue(values.pod_spec_override)

View File

@@ -33,6 +33,8 @@ const initialPodSpec = {
const instanceGroupCreateData = { const instanceGroupCreateData = {
name: 'Fuz', name: 'Fuz',
credential: { id: 71, name: 'CG' }, credential: { id: 71, name: 'CG' },
max_concurrent_jobs: 0,
max_forks: 0,
pod_spec_override: pod_spec_override:
'apiVersion: v1\nkind: Pod\nmetadata:\n namespace: default\nspec:\n containers:\n - image: ansible/ansible-runner\n tty: true\n stdin: true\n imagePullPolicy: Always\n args:\n - sleep\n - infinity\n - test', 'apiVersion: v1\nkind: Pod\nmetadata:\n namespace: default\nspec:\n containers:\n - image: ansible/ansible-runner\n tty: true\n stdin: true\n imagePullPolicy: Always\n args:\n - sleep\n - infinity\n - test',
}; };

View File

@@ -9,7 +9,12 @@ import AlertModal from 'components/AlertModal';
import ErrorDetail from 'components/ErrorDetail'; import ErrorDetail from 'components/ErrorDetail';
import { CardBody, CardActionsRow } from 'components/Card'; import { CardBody, CardActionsRow } from 'components/Card';
import DeleteButton from 'components/DeleteButton'; import DeleteButton from 'components/DeleteButton';
import { Detail, DetailList, UserDateDetail } from 'components/DetailList'; import {
Detail,
DetailList,
UserDateDetail,
DetailBadge,
} from 'components/DetailList';
import useRequest, { useDismissableError } from 'hooks/useRequest'; import useRequest, { useDismissableError } from 'hooks/useRequest';
import { jsonToYaml, isJsonString } from 'util/yaml'; import { jsonToYaml, isJsonString } from 'util/yaml';
import { InstanceGroupsAPI } from 'api'; import { InstanceGroupsAPI } from 'api';
@@ -47,6 +52,20 @@ function ContainerGroupDetails({ instanceGroup }) {
value={t`Container group`} value={t`Container group`}
dataCy="container-group-type" dataCy="container-group-type"
/> />
<DetailBadge
label={t`Max concurrent jobs`}
dataCy="instance-group-max-concurrent-jobs"
helpText={t`Maximum number of jobs to run concurrently on this group.
Zero means no limit will be enforced.`}
content={instanceGroup.max_concurrent_jobs}
/>
<DetailBadge
label={t`Max forks`}
dataCy="instance-group-max-forks"
helpText={t`Maximum number of forks to allow across all jobs running concurrently on this group.
Zero means no limit will be enforced.`}
content={instanceGroup.max_forks}
/>
{instanceGroup.summary_fields.credential && ( {instanceGroup.summary_fields.credential && (
<Detail <Detail
label={t`Credential`} label={t`Credential`}

View File

@@ -23,6 +23,8 @@ const instanceGroup = {
created: '2020-09-03T18:26:47.113934Z', created: '2020-09-03T18:26:47.113934Z',
modified: '2020-09-03T19:34:23.244694Z', modified: '2020-09-03T19:34:23.244694Z',
capacity: 0, capacity: 0,
max_concurrent_jobs: 0,
max_forks: 0,
committed_capacity: 0, committed_capacity: 0,
consumed_capacity: 0, consumed_capacity: 0,
percent_capacity_remaining: 0.0, percent_capacity_remaining: 0.0,

View File

@@ -39,6 +39,10 @@ function ContainerGroupEdit({ instanceGroup }) {
name: values.name, name: values.name,
credential: values.credential ? values.credential.id : null, credential: values.credential ? values.credential.id : null,
pod_spec_override: values.override ? values.pod_spec_override : null, pod_spec_override: values.override ? values.pod_spec_override : null,
max_forks: values.max_forks ? values.max_forks : 0,
max_concurrent_jobs: values.max_concurrent_jobs
? values.max_concurrent_jobs
: 0,
is_container_group: true, is_container_group: true,
}); });
history.push(detailsIUrl); history.push(detailsIUrl);

View File

@@ -34,6 +34,8 @@ const instanceGroup = {
policy_instance_percentage: 0, policy_instance_percentage: 0,
policy_instance_minimum: 0, policy_instance_minimum: 0,
policy_instance_list: [], policy_instance_list: [],
max_concurrent_jobs: 0,
max_forks: 0,
pod_spec_override: '', pod_spec_override: '',
summary_fields: { summary_fields: {
credential: { credential: {
@@ -144,6 +146,8 @@ describe('<ContainerGroupEdit/>', () => {
...updatedInstanceGroup, ...updatedInstanceGroup,
credential: 12, credential: 12,
pod_spec_override: null, pod_spec_override: null,
max_concurrent_jobs: 0,
max_forks: 0,
is_container_group: true, is_container_group: true,
}); });
expect(history.location.pathname).toEqual( expect(history.location.pathname).toEqual(

View File

@@ -42,6 +42,8 @@ const instanceGroup = {
credential: null, credential: null,
policy_instance_percentage: 100, policy_instance_percentage: 100,
policy_instance_minimum: 0, policy_instance_minimum: 0,
max_concurrent_jobs: 0,
max_forks: 0,
policy_instance_list: ['receptor-1', 'receptor-2'], policy_instance_list: ['receptor-1', 'receptor-2'],
pod_spec_override: '', pod_spec_override: '',
summary_fields: { summary_fields: {

View File

@@ -73,6 +73,20 @@ function InstanceGroupDetails({ instanceGroup }) {
dataCy="instance-group-policy-instance-percentage" dataCy="instance-group-policy-instance-percentage"
content={`${instanceGroup.policy_instance_percentage} %`} content={`${instanceGroup.policy_instance_percentage} %`}
/> />
<DetailBadge
label={t`Max concurrent jobs`}
dataCy="instance-group-max-concurrent-jobs"
helpText={t`Maximum number of jobs to run concurrently on this group.
Zero means no limit will be enforced.`}
content={instanceGroup.max_concurrent_jobs}
/>
<DetailBadge
label={t`Max forks`}
dataCy="instance-group-max-forks"
helpText={t`Maximum number of forks to allow across all jobs running concurrently on this group.
Zero means no limit will be enforced.`}
content={instanceGroup.max_forks}
/>
{instanceGroup.capacity ? ( {instanceGroup.capacity ? (
<DetailBadge <DetailBadge
label={t`Used capacity`} label={t`Used capacity`}

View File

@@ -19,6 +19,8 @@ const instanceGroups = [
policy_instance_minimum: 10, policy_instance_minimum: 10,
policy_instance_percentage: 50, policy_instance_percentage: 50,
percent_capacity_remaining: 60, percent_capacity_remaining: 60,
max_concurrent_jobs: 0,
max_forks: 0,
is_container_group: false, is_container_group: false,
created: '2020-07-21T18:41:02.818081Z', created: '2020-07-21T18:41:02.818081Z',
modified: '2020-07-24T20:32:03.121079Z', modified: '2020-07-24T20:32:03.121079Z',
@@ -38,6 +40,8 @@ const instanceGroups = [
policy_instance_minimum: 0, policy_instance_minimum: 0,
policy_instance_percentage: 0, policy_instance_percentage: 0,
percent_capacity_remaining: 0, percent_capacity_remaining: 0,
max_concurrent_jobs: 0,
max_forks: 0,
is_container_group: true, is_container_group: true,
created: '2020-07-21T18:41:02.818081Z', created: '2020-07-21T18:41:02.818081Z',
modified: '2020-07-24T20:32:03.121079Z', modified: '2020-07-24T20:32:03.121079Z',

View File

@@ -11,7 +11,7 @@ import FormField, {
CheckboxField, CheckboxField,
} from 'components/FormField'; } from 'components/FormField';
import FormActionGroup from 'components/FormActionGroup'; import FormActionGroup from 'components/FormActionGroup';
import { required } from 'util/validators'; import { required, minMaxValue } from 'util/validators';
import { import {
FormColumnLayout, FormColumnLayout,
FormFullWidthLayout, FormFullWidthLayout,
@@ -57,6 +57,26 @@ function ContainerGroupFormFields({ instanceGroup }) {
tooltip={t`Credential to authenticate with Kubernetes or OpenShift. Must be of type "Kubernetes/OpenShift API Bearer Token". If left blank, the underlying Pod's service account will be used.`} tooltip={t`Credential to authenticate with Kubernetes or OpenShift. Must be of type "Kubernetes/OpenShift API Bearer Token". If left blank, the underlying Pod's service account will be used.`}
autoPopulate={!instanceGroup?.id} autoPopulate={!instanceGroup?.id}
/> />
<FormField
id="instance-group-max-concurrent-jobs"
label={t`Max concurrent jobs`}
name="max_concurrent_jobs"
type="number"
min="0"
validate={minMaxValue(0, 2147483647)}
tooltip={t`Maximum number of jobs to run concurrently on this group.
Zero means no limit will be enforced.`}
/>
<FormField
id="instance-group-max-forks"
label={t`Max forks`}
name="max_forks"
type="number"
min="0"
validate={minMaxValue(0, 2147483647)}
tooltip={t`Maximum number of forks to allow across all jobs running concurrently on this group.
Zero means no limit will be enforced.`}
/>
<FormGroup fieldId="container-groups-option-checkbox" label={t`Options`}> <FormGroup fieldId="container-groups-option-checkbox" label={t`Options`}>
<FormCheckboxLayout> <FormCheckboxLayout>
@@ -97,6 +117,8 @@ function ContainerGroupForm({
const initialValues = { const initialValues = {
name: instanceGroup?.name || '', name: instanceGroup?.name || '',
max_concurrent_jobs: instanceGroup.max_concurrent_jobs || 0,
max_forks: instanceGroup.max_forks || 0,
credential: instanceGroup?.summary_fields?.credential, credential: instanceGroup?.summary_fields?.credential,
pod_spec_override: isCheckboxChecked pod_spec_override: isCheckboxChecked
? instanceGroup?.pod_spec_override ? instanceGroup?.pod_spec_override

View File

@@ -42,6 +42,26 @@ function InstanceGroupFormFields() {
assigned to this group when new instances come online.`} assigned to this group when new instances come online.`}
validate={minMaxValue(0, 100)} validate={minMaxValue(0, 100)}
/> />
<FormField
id="instance-group-max-concurrent-jobs"
label={t`Max concurrent jobs`}
name="max_concurrent_jobs"
type="number"
min="0"
validate={minMaxValue(0, 2147483647)}
tooltip={t`Maximum number of jobs to run concurrently on this group.
Zero means no limit will be enforced.`}
/>
<FormField
id="instance-group-max-forks"
label={t`Max forks`}
name="max_forks"
type="number"
min="0"
validate={minMaxValue(0, 2147483647)}
tooltip={t`Maximum number of forks to allow across all jobs running concurrently on this group.
Zero means no limit will be enforced.`}
/>
</> </>
); );
} }
@@ -57,6 +77,8 @@ function InstanceGroupForm({
name: instanceGroup.name || '', name: instanceGroup.name || '',
policy_instance_minimum: instanceGroup.policy_instance_minimum || 0, policy_instance_minimum: instanceGroup.policy_instance_minimum || 0,
policy_instance_percentage: instanceGroup.policy_instance_percentage || 0, policy_instance_percentage: instanceGroup.policy_instance_percentage || 0,
max_concurrent_jobs: instanceGroup.max_concurrent_jobs || 0,
max_forks: instanceGroup.max_forks || 0,
}; };
return ( return (
<Formik <Formik