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 {
const { data: response } = await InstanceGroupsAPI.create({
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,
pod_spec_override: values.override
? getPodSpecValue(values.pod_spec_override)

View File

@ -33,6 +33,8 @@ const initialPodSpec = {
const instanceGroupCreateData = {
name: 'Fuz',
credential: { id: 71, name: 'CG' },
max_concurrent_jobs: 0,
max_forks: 0,
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',
};

View File

@ -9,7 +9,12 @@ import AlertModal from 'components/AlertModal';
import ErrorDetail from 'components/ErrorDetail';
import { CardBody, CardActionsRow } from 'components/Card';
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 { jsonToYaml, isJsonString } from 'util/yaml';
import { InstanceGroupsAPI } from 'api';
@ -47,6 +52,20 @@ function ContainerGroupDetails({ instanceGroup }) {
value={t`Container group`}
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 && (
<Detail
label={t`Credential`}

View File

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

View File

@ -39,6 +39,10 @@ function ContainerGroupEdit({ instanceGroup }) {
name: values.name,
credential: values.credential ? values.credential.id : 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,
});
history.push(detailsIUrl);

View File

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

View File

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

View File

@ -73,6 +73,20 @@ function InstanceGroupDetails({ instanceGroup }) {
dataCy="instance-group-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 ? (
<DetailBadge
label={t`Used capacity`}

View File

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

View File

@ -11,7 +11,7 @@ import FormField, {
CheckboxField,
} from 'components/FormField';
import FormActionGroup from 'components/FormActionGroup';
import { required } from 'util/validators';
import { required, minMaxValue } from 'util/validators';
import {
FormColumnLayout,
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.`}
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`}>
<FormCheckboxLayout>
@ -97,6 +117,8 @@ function ContainerGroupForm({
const initialValues = {
name: instanceGroup?.name || '',
max_concurrent_jobs: instanceGroup.max_concurrent_jobs || 0,
max_forks: instanceGroup.max_forks || 0,
credential: instanceGroup?.summary_fields?.credential,
pod_spec_override: isCheckboxChecked
? instanceGroup?.pod_spec_override

View File

@ -42,6 +42,26 @@ function InstanceGroupFormFields() {
assigned to this group when new instances come online.`}
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 || '',
policy_instance_minimum: instanceGroup.policy_instance_minimum || 0,
policy_instance_percentage: instanceGroup.policy_instance_percentage || 0,
max_concurrent_jobs: instanceGroup.max_concurrent_jobs || 0,
max_forks: instanceGroup.max_forks || 0,
};
return (
<Formik