diff --git a/awx/ui/src/components/LaunchButton/LaunchButton.js b/awx/ui/src/components/LaunchButton/LaunchButton.js
index be6d444fc5..12889ae51b 100644
--- a/awx/ui/src/components/LaunchButton/LaunchButton.js
+++ b/awx/ui/src/components/LaunchButton/LaunchButton.js
@@ -24,6 +24,12 @@ function canLaunchWithoutPrompt(launchData) {
!launchData.ask_variables_on_launch &&
!launchData.ask_limit_on_launch &&
!launchData.ask_scm_branch_on_launch &&
+ !launchData.ask_execution_environment_on_launch &&
+ !launchData.ask_labels_on_launch &&
+ !launchData.ask_forks_on_launch &&
+ !launchData.ask_job_slicing_on_launch &&
+ !launchData.ask_timeout_on_launch &&
+ !launchData.ask_instance_groups_on_launch &&
!launchData.survey_enabled &&
(!launchData.passwords_needed_to_start ||
launchData.passwords_needed_to_start.length === 0) &&
diff --git a/awx/ui/src/components/LaunchPrompt/steps/ExecutionEnvironmentStep.js b/awx/ui/src/components/LaunchPrompt/steps/ExecutionEnvironmentStep.js
new file mode 100644
index 0000000000..14ad54c9a3
--- /dev/null
+++ b/awx/ui/src/components/LaunchPrompt/steps/ExecutionEnvironmentStep.js
@@ -0,0 +1,116 @@
+import React, { useCallback, useEffect } from 'react';
+import { useHistory } from 'react-router-dom';
+import { t } from '@lingui/macro';
+import { useField } from 'formik';
+import { ExecutionEnvironmentsAPI } from 'api';
+import { getSearchableKeys } from 'components/PaginatedTable';
+import { getQSConfig, parseQueryString } from 'util/qs';
+import useRequest from 'hooks/useRequest';
+import OptionsList from '../../OptionsList';
+import ContentLoading from '../../ContentLoading';
+import ContentError from '../../ContentError';
+
+const QS_CONFIG = getQSConfig('execution_environment', {
+ page: 1,
+ page_size: 5,
+});
+
+function ExecutionEnvironmentStep() {
+ const [field, , helpers] = useField('execution_environment');
+
+ const history = useHistory();
+
+ const {
+ isLoading,
+ error,
+ result: {
+ execution_environments,
+ count,
+ relatedSearchableKeys,
+ searchableKeys,
+ },
+ request: fetchExecutionEnvironments,
+ } = useRequest(
+ useCallback(async () => {
+ const params = parseQueryString(QS_CONFIG, history.location.search);
+ const [{ data }, actionsResponse] = await Promise.all([
+ ExecutionEnvironmentsAPI.read(params),
+ ExecutionEnvironmentsAPI.readOptions(),
+ ]);
+ return {
+ execution_environments: data.results,
+ count: data.count,
+ relatedSearchableKeys: (
+ actionsResponse?.data?.related_search_fields || []
+ ).map((val) => val.slice(0, -8)),
+ searchableKeys: getSearchableKeys(actionsResponse.data.actions?.GET),
+ };
+ }, [history.location]),
+ {
+ count: 0,
+ execution_environments: [],
+ relatedSearchableKeys: [],
+ searchableKeys: [],
+ }
+ );
+
+ useEffect(() => {
+ fetchExecutionEnvironments();
+ }, [fetchExecutionEnvironments]);
+
+ if (isLoading) {
+ return ;
+ }
+ if (error) {
+ return ;
+ }
+
+ return (
+ field.onChange(null)}
+ />
+ );
+}
+
+export default ExecutionEnvironmentStep;
diff --git a/awx/ui/src/components/LaunchPrompt/steps/OtherPromptsStep.js b/awx/ui/src/components/LaunchPrompt/steps/OtherPromptsStep.js
index 2e771299b2..623464c4f9 100644
--- a/awx/ui/src/components/LaunchPrompt/steps/OtherPromptsStep.js
+++ b/awx/ui/src/components/LaunchPrompt/steps/OtherPromptsStep.js
@@ -29,6 +29,23 @@ function OtherPromptsStep({ launchConfig, variablesMode, onVarModeChange }) {
}}
>
{launchConfig.ask_job_type_on_launch && }
+ {launchConfig.ask_scm_branch_on_launch && (
+
+ )}
+ {launchConfig.ask_forks_on_launch && (
+
+ )}
{launchConfig.ask_limit_on_launch && (
)}
- {launchConfig.ask_scm_branch_on_launch && (
+ {launchConfig.ask_verbosity_on_launch && }
+ {launchConfig.ask_job_slicing_on_launch && (
+ )}
+ {launchConfig.ask_timeout_on_launch && (
+
)}
- {launchConfig.ask_verbosity_on_launch && }
{launchConfig.ask_diff_mode_on_launch && }
{launchConfig.ask_tags_on_launch && (
{
+ setFieldTouched('execution_environment', true, false);
+ },
+ validate: () => {},
+ };
+}
+function getStep(launchConfig) {
+ if (!launchConfig.ask_inventory_on_launch) {
+ return null;
+ }
+ return {
+ id: STEP_ID,
+ name: (
+
+ {t`Execution Environment`}
+
+ ),
+ component: ,
+ enableNext: true,
+ };
+}
+
+function getInitialValues(launchConfig, resource) {
+ if (!launchConfig.ask_execution_environment_on_launch) {
+ return {};
+ }
+
+ return {
+ inventory: resource?.summary_fields?.execution_environment || null,
+ };
+}
diff --git a/awx/ui/src/components/LaunchPrompt/steps/useOtherPromptsStep.js b/awx/ui/src/components/LaunchPrompt/steps/useOtherPromptsStep.js
index ede4ae8231..4e3205e323 100644
--- a/awx/ui/src/components/LaunchPrompt/steps/useOtherPromptsStep.js
+++ b/awx/ui/src/components/LaunchPrompt/steps/useOtherPromptsStep.js
@@ -27,6 +27,10 @@ const FIELD_NAMES = [
'job_tags',
'skip_tags',
'extra_vars',
+ 'labels',
+ 'timeout',
+ 'job_slice_count',
+ 'forks',
];
export default function useOtherPromptsStep(launchConfig, resource) {
@@ -105,7 +109,11 @@ function shouldShowPrompt(launchConfig) {
launchConfig.ask_skip_tags_on_launch ||
launchConfig.ask_variables_on_launch ||
launchConfig.ask_scm_branch_on_launch ||
- launchConfig.ask_diff_mode_on_launch
+ launchConfig.ask_diff_mode_on_launch ||
+ launchConfig.ask_labels_on_launch ||
+ launchConfig.ask_forks_on_launch ||
+ launchConfig.ask_job_slicing_on_launch ||
+ launchConfig.ask_timeout_on_launch
);
}
@@ -140,5 +148,14 @@ function getInitialValues(launchConfig, resource) {
if (launchConfig.ask_diff_mode_on_launch) {
initialValues.diff_mode = resource?.diff_mode || false;
}
+ if (launchConfig.ask_forks_on_launch) {
+ initialValues.forks = resource?.forks || 0;
+ }
+ if (launchConfig.ask_job_slicing_on_launch) {
+ initialValues.job_slice_count = resource?.job_slice_count || 1;
+ }
+ if (launchConfig.ask_timeout_on_launch) {
+ initialValues.timeout = resource?.timeout || 0;
+ }
return initialValues;
}
diff --git a/awx/ui/src/components/LaunchPrompt/useLaunchSteps.js b/awx/ui/src/components/LaunchPrompt/useLaunchSteps.js
index 3d993162f9..a129143ae1 100644
--- a/awx/ui/src/components/LaunchPrompt/useLaunchSteps.js
+++ b/awx/ui/src/components/LaunchPrompt/useLaunchSteps.js
@@ -3,6 +3,7 @@ import { useFormikContext } from 'formik';
import useInventoryStep from './steps/useInventoryStep';
import useCredentialsStep from './steps/useCredentialsStep';
import useCredentialPasswordsStep from './steps/useCredentialPasswordsStep';
+import useExecutionEnvironmentStep from './steps/useExecutionEnvironmentStep';
import useOtherPromptsStep from './steps/useOtherPromptsStep';
import useSurveyStep from './steps/useSurveyStep';
import usePreviewStep from './steps/usePreviewStep';
@@ -56,6 +57,7 @@ export default function useLaunchSteps(launchConfig, surveyConfig, resource) {
showCredentialPasswordsStep(launchConfig, formikValues.credentials),
visited
),
+ useExecutionEnvironmentStep(launchConfig, resource),
useOtherPromptsStep(launchConfig, resource),
useSurveyStep(launchConfig, surveyConfig, resource, visited),
];
@@ -143,6 +145,7 @@ export default function useLaunchSteps(launchConfig, surveyConfig, resource) {
inventory: true,
credentials: true,
credentialPasswords: true,
+ executionEnvironment: true,
other: true,
survey: true,
preview: true,
diff --git a/awx/ui/src/components/Lookup/ExecutionEnvironmentLookup.js b/awx/ui/src/components/Lookup/ExecutionEnvironmentLookup.js
index bfd47ea40a..42767dcd85 100644
--- a/awx/ui/src/components/Lookup/ExecutionEnvironmentLookup.js
+++ b/awx/ui/src/components/Lookup/ExecutionEnvironmentLookup.js
@@ -10,9 +10,9 @@ import { getQSConfig, parseQueryString, mergeParams } from 'util/qs';
import useRequest from 'hooks/useRequest';
import Popover from '../Popover';
import OptionsList from '../OptionsList';
-
import Lookup from './Lookup';
import LookupErrorMessage from './shared/LookupErrorMessage';
+import FieldWithPrompt from '../FieldWithPrompt';
const QS_CONFIG = getQSConfig('execution_environments', {
page: 1,
@@ -36,6 +36,9 @@ function ExecutionEnvironmentLookup({
value,
fieldName,
overrideLabel,
+ isPromptableField,
+ promptId,
+ promptName,
}) {
const location = useLocation();
const {
@@ -150,49 +153,52 @@ function ExecutionEnvironmentLookup({
}, [fetchExecutionEnvironments]);
const renderLookup = () => (
- (
- dispatch({ type: 'SELECT_ITEM', item })}
- deselectItem={(item) => dispatch({ type: 'DESELECT_ITEM', item })}
- />
- )}
- />
+ <>
+ (
+ dispatch({ type: 'SELECT_ITEM', item })}
+ deselectItem={(item) => dispatch({ type: 'DESELECT_ITEM', item })}
+ />
+ )}
+ />
+
+ >
);
const renderLabel = () => {
@@ -202,7 +208,21 @@ function ExecutionEnvironmentLookup({
return t`Execution Environment`;
};
- return (
+ return isPromptableField ? (
+
+ {tooltip && isDisabled ? (
+ {renderLookup()}
+ ) : (
+ renderLookup()
+ )}
+
+ ) : (
}
- fieldId="org-instance-groups"
- >
+ const renderLookup = () => (
+ <>
+ >
+ );
+
+ return isPromptableField ? (
+
+ {renderLookup()}
+
+ ) : (
+ }
+ fieldId={id}
+ >
+ {renderLookup()}
);
}
InstanceGroupsLookup.propTypes = {
+ id: string,
value: arrayOf(InstanceGroup).isRequired,
tooltip: string,
onChange: func.isRequired,
@@ -148,6 +169,7 @@ InstanceGroupsLookup.propTypes = {
};
InstanceGroupsLookup.defaultProps = {
+ id: 'org-instance-groups',
tooltip: '',
className: '',
required: false,
diff --git a/awx/ui/src/components/PromptDetail/PromptDetail.js b/awx/ui/src/components/PromptDetail/PromptDetail.js
index 742e4caf86..6e44968349 100644
--- a/awx/ui/src/components/PromptDetail/PromptDetail.js
+++ b/awx/ui/src/components/PromptDetail/PromptDetail.js
@@ -71,7 +71,13 @@ function hasPromptData(launchData) {
launchData.ask_skip_tags_on_launch ||
launchData.ask_tags_on_launch ||
launchData.ask_variables_on_launch ||
- launchData.ask_verbosity_on_launch
+ launchData.ask_verbosity_on_launch ||
+ launchData.ask_execution_environment_on_launch ||
+ launchData.ask_labels_on_launch ||
+ launchData.ask_forks_on_launch ||
+ launchData.ask_job_slicing_on_launch ||
+ launchData.ask_timeout_on_launch ||
+ launchData.ask_instance_groups_on_launch
);
}
@@ -206,6 +212,36 @@ function PromptDetail({
value={overrides.inventory?.name}
/>
)}
+ {launchConfig.ask_execution_environment_on_launch && (
+
+ )}
+ {launchConfig.ask_instance_groups_on_launch && (
+
+ {overrides.instance_groups.map((instance_group) => (
+
+ {instance_group.name}
+
+ ))}
+
+ }
+ />
+ )}
{launchConfig.ask_scm_branch_on_launch && (
)}
+ {launchConfig.ask_labels_on_launch && (
+
+ {overrides.labels.map((label) => (
+
+ {label.name}
+
+ ))}
+
+ }
+ isEmpty={overrides.labels.length === 0}
+ />
+ )}
+ {launchConfig.ask_forks_on_launch && (
+
+ )}
+ {launchConfig.ask_job_slicing_on_launch && (
+
+ )}
+ {launchConfig.ask_timeout_on_launch && (
+
+ )}
{launchConfig.ask_diff_mode_on_launch && (
0;
+ const showForksDetail = ask_forks_on_launch;
+ const showJobSlicingDetail = ask_job_slicing_on_launch;
+ const showTimeoutDetail = ask_timeout_on_launch;
const showPromptedFields =
showCredentialsDetail ||
@@ -250,7 +266,12 @@ function ScheduleDetail({ hasDaysToKeepField, schedule, surveyConfig }) {
showSkipTagsDetail ||
showTagsDetail ||
showVerbosityDetail ||
- showVariablesDetail;
+ showVariablesDetail ||
+ showExecutionEnvironmentDetail ||
+ showLabelsDetail ||
+ showForksDetail ||
+ showJobSlicingDetail ||
+ showTimeoutDetail;
if (isLoading) {
return ;
@@ -402,11 +423,20 @@ function ScheduleDetail({ hasDaysToKeepField, schedule, surveyConfig }) {
dataCy="schedule-inventory"
/>
)}
- {ask_verbosity_on_launch && (
+ {showExecutionEnvironmentDetail && (
+ {summary_fields?.execution_environment?.name}
+
+ ) : (
+ ' '
+ )
+ }
/>
)}
{ask_scm_branch_on_launch && (
@@ -419,6 +449,18 @@ function ScheduleDetail({ hasDaysToKeepField, schedule, surveyConfig }) {
{ask_limit_on_launch && (
)}
+ {ask_forks_on_launch && }
+ {ask_limit_on_launch && }
+ {ask_verbosity_on_launch && (
+
+ )}
+ {ask_timeout_on_launch && (
+
+ )}
{showDiffModeDetail && (
)}
+ {ask_job_slicing_on_launch && (
+
+ )}
{showCredentialsDetail && (
)}
+ {showLabelsDetail && (
+
+ {summary_fields.labels.results.map((l) => (
+
+ {l.name}
+
+ ))}
+
+ }
+ isEmpty={summary_fields.labels.results.length === 0}
+ />
+ )}
{showTagsDetail && (
0)
diff --git a/awx/ui/src/screens/Template/WorkflowJobTemplateVisualizer/Modals/NodeModals/NodeViewModal.js b/awx/ui/src/screens/Template/WorkflowJobTemplateVisualizer/Modals/NodeModals/NodeViewModal.js
index da77f8d14c..90a6790cce 100644
--- a/awx/ui/src/screens/Template/WorkflowJobTemplateVisualizer/Modals/NodeModals/NodeViewModal.js
+++ b/awx/ui/src/screens/Template/WorkflowJobTemplateVisualizer/Modals/NodeModals/NodeViewModal.js
@@ -1,12 +1,10 @@
import React, { useContext, useEffect, useCallback } from 'react';
-
import { t } from '@lingui/macro';
import { Button, Modal } from '@patternfly/react-core';
import {
WorkflowDispatchContext,
WorkflowStateContext,
} from 'contexts/Workflow';
-
import ContentError from 'components/ContentError';
import ContentLoading from 'components/ContentLoading';
import PromptDetail from 'components/PromptDetail';
@@ -157,6 +155,22 @@ function NodeViewModal({ readOnly }) {
if (launchConfig.ask_inventory_on_launch) {
overrides.inventory = originalNodeObject.summary_fields.inventory;
}
+ if (launchConfig.ask_execution_environment_on_launch) {
+ overrides.execution_environment =
+ originalNodeObject.summary_fields.execution_environment;
+ }
+ if (launchConfig.ask_labels_on_launch) {
+ overrides.labels = originalNodeObject.labels;
+ }
+ if (launchConfig.ask_forks_on_launch) {
+ overrides.forks = originalNodeObject.forks;
+ }
+ if (launchConfig.ask_job_slicing_on_launch) {
+ overrides.job_slice_count = originalNodeObject.job_slice_count;
+ }
+ if (launchConfig.ask_timeout_on_launch) {
+ overrides.timeout = originalNodeObject.timeout;
+ }
if (launchConfig.ask_scm_branch_on_launch) {
overrides.scm_branch = originalNodeObject.scm_branch;
}
diff --git a/awx/ui/src/screens/Template/WorkflowJobTemplateVisualizer/Modals/NodeModals/useWorkflowNodeSteps.js b/awx/ui/src/screens/Template/WorkflowJobTemplateVisualizer/Modals/NodeModals/useWorkflowNodeSteps.js
index c7baafa3ed..91af7e6e27 100644
--- a/awx/ui/src/screens/Template/WorkflowJobTemplateVisualizer/Modals/NodeModals/useWorkflowNodeSteps.js
+++ b/awx/ui/src/screens/Template/WorkflowJobTemplateVisualizer/Modals/NodeModals/useWorkflowNodeSteps.js
@@ -3,6 +3,7 @@ import { useFormikContext } from 'formik';
import { t } from '@lingui/macro';
import useInventoryStep from 'components/LaunchPrompt/steps/useInventoryStep';
import useCredentialsStep from 'components/LaunchPrompt/steps/useCredentialsStep';
+import useExecutionEnvironmentStep from 'components/LaunchPrompt/steps/useExecutionEnvironmentStep';
import useOtherPromptsStep from 'components/LaunchPrompt/steps/useOtherPromptsStep';
import useSurveyStep from 'components/LaunchPrompt/steps/useSurveyStep';
import usePreviewStep from 'components/LaunchPrompt/steps/usePreviewStep';
@@ -26,6 +27,12 @@ function showPreviewStep(nodeType, launchConfig) {
launchConfig.ask_variables_on_launch ||
launchConfig.ask_limit_on_launch ||
launchConfig.ask_scm_branch_on_launch ||
+ launchConfig.ask_execution_environment_on_launch ||
+ launchConfig.ask_labels_on_launch ||
+ launchConfig.ask_forks_on_launch ||
+ launchConfig.ask_job_slicing_on_launch ||
+ launchConfig.ask_timeout_on_launch ||
+ launchConfig.ask_instance_groups_on_launch ||
launchConfig.survey_enabled ||
(launchConfig.variables_needed_to_start &&
launchConfig.variables_needed_to_start.length > 0)
@@ -129,6 +136,20 @@ const getNodeToEditDefaultValues = (
}
}
+ if (launchConfig.ask_execution_environment_on_launch) {
+ if (nodeToEdit?.promptValues) {
+ initialValues.execution_environment =
+ nodeToEdit?.promptValues?.execution_environment;
+ } else if (
+ nodeToEdit?.originalNodeObject?.summary_fields?.execution_environment
+ ) {
+ initialValues.execution_environment =
+ nodeToEdit?.originalNodeObject?.summary_fields?.execution_environment;
+ } else {
+ initialValues.execution_environment = null;
+ }
+ }
+
if (launchConfig.ask_credential_on_launch) {
if (nodeToEdit?.promptValues?.credentials) {
initialValues.credentials = nodeToEdit?.promptValues?.credentials;
@@ -197,6 +218,15 @@ const getNodeToEditDefaultValues = (
if (launchConfig.ask_diff_mode_on_launch) {
initialValues.diff_mode = sourceOfValues?.diff_mode || false;
}
+ if (launchConfig.ask_forks_on_launch) {
+ initialValues.forks = sourceOfValues?.forks || 0;
+ }
+ if (launchConfig.ask_job_slicing_on_launch) {
+ initialValues.job_slice_count = sourceOfValues?.job_slice_count || 1;
+ }
+ if (launchConfig.ask_timeout_on_launch) {
+ initialValues.timeout = sourceOfValues?.timeout || 0;
+ }
if (launchConfig.ask_variables_on_launch) {
const newExtraData = { ...sourceOfValues.extra_data };
@@ -258,6 +288,7 @@ export default function useWorkflowNodeSteps(
useDaysToKeepStep(),
useInventoryStep(launchConfig, resource, visited),
useCredentialsStep(launchConfig, resource, resourceDefaultCredentials),
+ useExecutionEnvironmentStep(launchConfig, resource),
useOtherPromptsStep(launchConfig, resource),
useSurveyStep(launchConfig, surveyConfig, resource, visited),
];
@@ -348,6 +379,7 @@ export default function useWorkflowNodeSteps(
setVisited({
inventory: true,
credentials: true,
+ executionEnvironment: true,
other: true,
survey: true,
preview: true,
diff --git a/awx/ui/src/screens/Template/shared/JobTemplate.helptext.js b/awx/ui/src/screens/Template/shared/JobTemplate.helptext.js
index 4d7ce59c47..e1b6e589ff 100644
--- a/awx/ui/src/screens/Template/shared/JobTemplate.helptext.js
+++ b/awx/ui/src/screens/Template/shared/JobTemplate.helptext.js
@@ -6,7 +6,7 @@ const jtHelpTextStrings = () => ({
jobType: t`For job templates, select run to execute the playbook. Select check to only check playbook syntax, test environment setup, and report problems without executing the playbook.`,
inventory: t`Select the inventory containing the hosts you want this job to manage.`,
project: t`Select the project containing the playbook you want this job to execute.`,
- executionEnvironmentForm: t`Select the execution environment for this job template.`,
+ executionEnvironmentForm: t`The container image to be used for execution.`,
executionEnvironmentDetail: t`The execution environment that will be used when launching this job template. The resolved execution environment can be overridden by explicitly assigning a different one to this job template.`,
playbook: t`Select the playbook to be executed by this job.`,
credentials: t`Select credentials for accessing the nodes this job will be ran against. You can only select one credential of each type. For machine credentials (SSH), checking "Prompt on launch" without selecting credentials will require you to select a machine credential at run time. If you select credentials and check "Prompt on launch", the selected credential(s) become the defaults that can be updated at run time.`,
@@ -24,7 +24,7 @@ const jtHelpTextStrings = () => ({
webhookURL: t`Webhook services can launch jobs with this workflow job template by making a POST request to this URL.`,
webhookKey: t`Webhook services can use this as a shared secret.`,
webhookCredential: t`Optionally select the credential to use to send status updates back to the webhook service.`,
- sourceControlBranch: t`Select a branch for the workflow. This branch is applied to all job template nodes that prompt for a branch.`,
+ sourceControlBranch: t`Branch to use in job run. Project default used if blank. Only allowed if project allow_override field is set to true.`,
provisioningCallbacks: (brandName = '') =>
t`Enables creation of a provisioning callback URL. Using the URL a host can contact ${brandName} and request a configuration update using this job template.`,
privilegeEscalation: t`If enabled, run this playbook as an administrator.`,
diff --git a/awx/ui/src/screens/Template/shared/JobTemplateForm.js b/awx/ui/src/screens/Template/shared/JobTemplateForm.js
index 2bf799c8d7..f8aebf8ced 100644
--- a/awx/ui/src/screens/Template/shared/JobTemplateForm.js
+++ b/awx/ui/src/screens/Template/shared/JobTemplateForm.js
@@ -1,6 +1,5 @@
import React, { useState, useEffect, useCallback } from 'react';
import PropTypes from 'prop-types';
-
import { t } from '@lingui/macro';
import { withFormik, useField } from 'formik';
import {
@@ -87,6 +86,10 @@ function JobTemplateForm({
const [credentialField, , credentialHelpers] = useField('credentials');
const [labelsField, , labelsHelpers] = useField('labels');
const [limitField, limitMeta, limitHelpers] = useField('limit');
+ const [forksField, forksMeta, forksHelpers] = useField('forks');
+ const [jobSliceCountField, jobSliceCountMeta, jobSliceCountHelpers] =
+ useField('job_slice_count');
+ const [timeoutField, timeoutMeta, timeoutHelpers] = useField('timeout');
const [diffModeField, , diffModeHelpers] = useField('diff_mode');
const [instanceGroupsField, , instanceGroupsHelpers] =
useField('instanceGroups');
@@ -321,6 +324,9 @@ function JobTemplateForm({
globallyAvailable
isDisabled={!projectField.value?.id}
projectId={projectField.value?.id}
+ promptId="template-ask-execution-environment-on-launch"
+ promptName="ask_execution_environment_on_launch"
+ isPromptableField
/>
{projectField.value?.allow_override && (
@@ -376,10 +382,12 @@ function JobTemplateForm({
onError={setContentError}
/>
- }
+
-
+
-
+ >
+ {
+ forksHelpers.setValue(value);
+ }}
+ type="number"
+ min="0"
+ />
+
-
-
+ {
+ jobSliceCountHelpers.setValue(value);
+ }}
+ type="number"
+ min="1"
+ />
+
+
+ >
+ {
+ timeoutHelpers.setValue(value);
+ }}
+ type="number"
+ min="0"
+ />
+
instanceGroupsHelpers.setValue(value)}
tooltip={helpText.instanceGroups}
fieldName="instanceGroups"
+ promptId="template-ask-instance-groups-on-launch"
+ promptName="ask_instance_groups_on_launch"
+ isPromptableField
/>
- }
+
-
+