Merge pull request #11216 from AlexSCorey/11214-DisableDefaultInstanceDelete

Disable default instance delete
This commit is contained in:
Kersom 2021-10-08 12:48:23 -04:00 committed by GitHub
commit 1fffeb430c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 91 additions and 19 deletions

View File

@ -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}
/>

View File

@ -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

View File

@ -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}

View File

@ -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`}

View File

@ -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);
});
});