mirror of
https://github.com/ansible/awx.git
synced 2026-01-13 19:10:07 -03:30
Merge pull request #11216 from AlexSCorey/11214-DisableDefaultInstanceDelete
Disable default instance delete
This commit is contained in:
commit
1fffeb430c
@ -31,24 +31,29 @@ function InstanceGroup({ setBreadcrumb }) {
|
||||
isLoading,
|
||||
error: contentError,
|
||||
request: fetchInstanceGroups,
|
||||
result: { instanceGroup, defaultControlPlane },
|
||||
result: { instanceGroup, defaultControlPlane, defaultExecution },
|
||||
} = useRequest(
|
||||
useCallback(async () => {
|
||||
const [
|
||||
{ data },
|
||||
{
|
||||
data: { DEFAULT_CONTROL_PLANE_QUEUE_NAME },
|
||||
data: {
|
||||
DEFAULT_CONTROL_PLANE_QUEUE_NAME,
|
||||
DEFAULT_EXECUTION_QUEUE_NAME,
|
||||
},
|
||||
},
|
||||
] = await Promise.all([
|
||||
InstanceGroupsAPI.readDetail(id),
|
||||
SettingsAPI.readAll(),
|
||||
]);
|
||||
|
||||
return {
|
||||
instanceGroup: data,
|
||||
defaultControlPlane: DEFAULT_CONTROL_PLANE_QUEUE_NAME,
|
||||
defaultExecution: DEFAULT_EXECUTION_QUEUE_NAME,
|
||||
};
|
||||
}, [id]),
|
||||
{ instanceGroup: null, defaultControlPlane: '' }
|
||||
{ instanceGroup: null, defaultControlPlane: '', defaultExecution: '' }
|
||||
);
|
||||
|
||||
useEffect(() => {
|
||||
@ -130,11 +135,13 @@ function InstanceGroup({ setBreadcrumb }) {
|
||||
<Route path="/instance_groups/:id/edit">
|
||||
<InstanceGroupEdit
|
||||
instanceGroup={instanceGroup}
|
||||
defaultExecution={defaultExecution}
|
||||
defaultControlPlane={defaultControlPlane}
|
||||
/>
|
||||
</Route>
|
||||
<Route path="/instance_groups/:id/details">
|
||||
<InstanceGroupDetails
|
||||
defaultExecution={defaultExecution}
|
||||
defaultControlPlane={defaultControlPlane}
|
||||
instanceGroup={instanceGroup}
|
||||
/>
|
||||
|
||||
@ -23,7 +23,11 @@ const Unavailable = styled.span`
|
||||
color: var(--pf-global--danger-color--200);
|
||||
`;
|
||||
|
||||
function InstanceGroupDetails({ instanceGroup, defaultControlPlane }) {
|
||||
function InstanceGroupDetails({
|
||||
instanceGroup,
|
||||
defaultControlPlane,
|
||||
defaultExecution,
|
||||
}) {
|
||||
const { id, name } = instanceGroup;
|
||||
|
||||
const history = useHistory();
|
||||
@ -42,7 +46,8 @@ function InstanceGroupDetails({ instanceGroup, defaultControlPlane }) {
|
||||
const { error, dismissError } = useDismissableError(deleteError);
|
||||
const deleteDetailsRequests =
|
||||
relatedResourceDeleteRequests.instanceGroup(instanceGroup);
|
||||
|
||||
const isDefaultInstanceGroup =
|
||||
name === defaultControlPlane || name === defaultExecution;
|
||||
return (
|
||||
<CardBody>
|
||||
<DetailList>
|
||||
@ -110,7 +115,7 @@ function InstanceGroupDetails({ instanceGroup, defaultControlPlane }) {
|
||||
{t`Edit`}
|
||||
</Button>
|
||||
)}
|
||||
{name !== defaultControlPlane &&
|
||||
{!isDefaultInstanceGroup &&
|
||||
instanceGroup.summary_fields.user_capabilities &&
|
||||
instanceGroup.summary_fields.user_capabilities.delete && (
|
||||
<DeleteButton
|
||||
|
||||
@ -5,7 +5,11 @@ import { CardBody } from 'components/Card';
|
||||
import { InstanceGroupsAPI } from 'api';
|
||||
import InstanceGroupForm from '../shared/InstanceGroupForm';
|
||||
|
||||
function InstanceGroupEdit({ instanceGroup, defaultControlPlane }) {
|
||||
function InstanceGroupEdit({
|
||||
instanceGroup,
|
||||
defaultControlPlane,
|
||||
defaultExecution,
|
||||
}) {
|
||||
const history = useHistory();
|
||||
const [submitError, setSubmitError] = useState(null);
|
||||
const detailsUrl = `/instance_groups/${instanceGroup.id}/details`;
|
||||
@ -28,6 +32,7 @@ function InstanceGroupEdit({ instanceGroup, defaultControlPlane }) {
|
||||
<InstanceGroupForm
|
||||
instanceGroup={instanceGroup}
|
||||
defaultControlPlane={defaultControlPlane}
|
||||
defaultExecution={defaultExecution}
|
||||
onSubmit={handleSubmit}
|
||||
submitError={submitError}
|
||||
onCancel={handleCancel}
|
||||
|
||||
@ -3,27 +3,42 @@ import { func, shape } from 'prop-types';
|
||||
import { Formik, useField } from 'formik';
|
||||
|
||||
import { t } from '@lingui/macro';
|
||||
import { Form } from '@patternfly/react-core';
|
||||
import { Form, Tooltip } from '@patternfly/react-core';
|
||||
|
||||
import FormField, { FormSubmitError } from 'components/FormField';
|
||||
import FormActionGroup from 'components/FormActionGroup';
|
||||
import { required, minMaxValue } from 'util/validators';
|
||||
import { FormColumnLayout } from 'components/FormLayout';
|
||||
|
||||
function InstanceGroupFormFields({ defaultControlPlane }) {
|
||||
const [instanceGroupNameField, ,] = useField('name');
|
||||
function InstanceGroupFormFields({ defaultControlPlane, defaultExecution }) {
|
||||
const [{ value }, ,] = useField('name');
|
||||
const isDisabled =
|
||||
value === defaultExecution || value === defaultControlPlane;
|
||||
|
||||
return (
|
||||
<>
|
||||
<FormField
|
||||
name="name"
|
||||
id="instance-group-name"
|
||||
label={t`Name`}
|
||||
type="text"
|
||||
validate={required(null)}
|
||||
isRequired
|
||||
isDisabled={instanceGroupNameField.value === defaultControlPlane}
|
||||
/>
|
||||
{isDisabled ? (
|
||||
<Tooltip content={t`Name cannot be changed on this Instance Group`}>
|
||||
<FormField
|
||||
name="name"
|
||||
id="instance-group-name"
|
||||
label={t`Name`}
|
||||
type="text"
|
||||
validate={required(null)}
|
||||
isRequired
|
||||
isDisabled={isDisabled}
|
||||
/>
|
||||
</Tooltip>
|
||||
) : (
|
||||
<FormField
|
||||
name="name"
|
||||
id="instance-group-name"
|
||||
label={t`Name`}
|
||||
type="text"
|
||||
validate={required(null)}
|
||||
isRequired
|
||||
/>
|
||||
)}
|
||||
<FormField
|
||||
id="instance-group-policy-instance-minimum"
|
||||
label={t`Policy instance minimum`}
|
||||
|
||||
@ -116,4 +116,44 @@ describe('<InstanceGroupForm/>', () => {
|
||||
wrapper.find('button[aria-label="Cancel"]').invoke('onClick')();
|
||||
expect(onCancel).toBeCalled();
|
||||
});
|
||||
|
||||
test('Name field should be disabled, default', async () => {
|
||||
let defaultInstanceGroupWrapper;
|
||||
await act(async () => {
|
||||
defaultInstanceGroupWrapper = mountWithContexts(
|
||||
<InstanceGroupForm
|
||||
onCancel={onCancel}
|
||||
onSubmit={onSubmit}
|
||||
defaultControlPlane="controlplane"
|
||||
defaultExecution="default"
|
||||
instanceGroup={{ ...instanceGroup, name: 'default' }}
|
||||
/>
|
||||
);
|
||||
});
|
||||
expect(
|
||||
defaultInstanceGroupWrapper
|
||||
.find('TextInput[name="name"]')
|
||||
.prop('isDisabled')
|
||||
).toBe(true);
|
||||
});
|
||||
|
||||
test('Name field should be disabled, controlplane', async () => {
|
||||
let defaultInstanceGroupWrapper;
|
||||
await act(async () => {
|
||||
defaultInstanceGroupWrapper = mountWithContexts(
|
||||
<InstanceGroupForm
|
||||
onCancel={onCancel}
|
||||
onSubmit={onSubmit}
|
||||
defaultControlPlane="controlplane"
|
||||
defaultExecution="default"
|
||||
instanceGroup={{ ...instanceGroup, name: 'controlplane' }}
|
||||
/>
|
||||
);
|
||||
});
|
||||
expect(
|
||||
defaultInstanceGroupWrapper
|
||||
.find('TextInput[name="name"]')
|
||||
.prop('isDisabled')
|
||||
).toBe(true);
|
||||
});
|
||||
});
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user