Skip to content

Commit 5a67667

Browse files
committed
Fixes #38191: Skip reassignment for multiCV in remove
1 parent 56d9f30 commit 5a67667

File tree

2 files changed

+87
-5
lines changed

2 files changed

+87
-5
lines changed

webpack/scenes/ContentViews/Details/Versions/Delete/RemoveSteps/CVEnvironmentSelectionForm.js

+39-3
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,40 @@
11
import React, { useContext, useState } from 'react';
2+
import { useSelector, useDispatch } from 'react-redux';
23
import useDeepCompareEffect from 'use-deep-compare-effect';
34
import { Alert, Checkbox, EmptyState, EmptyStateVariant, Title, EmptyStateBody, AlertActionCloseButton } from '@patternfly/react-core';
45
import { TableVariant, TableComposable, Thead, Tbody, Tr, Th, Td } from '@patternfly/react-table';
56
import { translate as __ } from 'foremanReact/common/I18n';
67
import DeleteContext from '../DeleteContext';
8+
import { selectCVHosts, selectCVActivationKeys } from '../../../ContentViewDetailSelectors';
9+
import { getHosts, getActivationKeys } from '../../../ContentViewDetailActions';
710

811
const CVEnvironmentSelectionForm = () => {
912
const [alertDismissed, setAlertDismissed] = useState(false);
1013
const {
14+
cvId,
1115
versionNameToRemove, versionEnvironments, selectedEnvSet,
1216
setAffectedActivationKeys, setAffectedHosts, deleteFlow,
1317
removeDeletionFlow, setRemoveDeletionFlow,
1418
} = useContext(DeleteContext);
1519

20+
const dispatch = useDispatch();
21+
const hostsResponse = useSelector(selectCVHosts);
22+
const activationKeysResponse = useSelector(selectCVActivationKeys);
23+
24+
useDeepCompareEffect(() => {
25+
const selectedEnv = versionEnvironments.filter(env => selectedEnvSet.has(env.id));
26+
27+
let cvQuery = `content_view_id=${cvId}`;
28+
const selectedEnvStringsForHosts = selectedEnv.map(env => `lifecycle_environment_id=${env.id}`).join(' OR ');
29+
if (selectedEnvStringsForHosts.length) cvQuery += ` AND (${selectedEnvStringsForHosts})`;
30+
dispatch(getHosts({ search: cvQuery }));
31+
32+
let akQuery = `content_view_id=${cvId}`;
33+
const selectedEnvStringsForAK = selectedEnv.map(env => `lifecycle_environment_id=${env.id}`).join(' OR ');
34+
if (selectedEnvStringsForAK.length) akQuery += ` AND (${selectedEnvStringsForAK})`;
35+
dispatch(getActivationKeys({ search: akQuery }));
36+
}, [dispatch, cvId, versionEnvironments, selectedEnvSet]);
37+
1638
const areAllSelected = () => versionEnvironments.every(env => selectedEnvSet.has(env.id));
1739

1840
const onSelect = (_event, isSelected, rowId) => {
@@ -26,10 +48,24 @@ const CVEnvironmentSelectionForm = () => {
2648
// Based on env selected for removal, decide if we need to reassign hosts and activation keys.
2749
useDeepCompareEffect(() => {
2850
const selectedEnv = versionEnvironments.filter(env => selectedEnvSet.has(env.id));
29-
setAffectedActivationKeys(!!(selectedEnv.filter(env => env.activation_key_count > 0).length));
30-
setAffectedHosts(!!(selectedEnv.filter(env => env.host_count > 0).length));
51+
52+
if (activationKeysResponse?.results?.length > 0 &&
53+
activationKeysResponse.results.every(key => key.multi_content_view_environment)) {
54+
setAffectedActivationKeys(false);
55+
} else {
56+
setAffectedActivationKeys(!!(selectedEnv.filter(env =>
57+
env.activation_key_count > 0).length));
58+
}
59+
if (hostsResponse?.results?.length > 0 &&
60+
hostsResponse.results.every(host =>
61+
host.content_facet_attributes?.multi_content_view_environment)) {
62+
setAffectedHosts(false);
63+
} else {
64+
setAffectedHosts(!!(selectedEnv.filter(env => env.host_count > 0).length));
65+
}
3166
}, [setAffectedActivationKeys, setAffectedHosts,
32-
versionEnvironments, selectedEnvSet, selectedEnvSet.size]);
67+
versionEnvironments, selectedEnvSet, selectedEnvSet.size,
68+
hostsResponse, activationKeysResponse]);
3369

3470
const onSelectAll = (event, isSelected) => {
3571
if (!isSelected) {

webpack/scenes/ContentViews/Details/Versions/Delete/__tests__/cvVersionRemove.test.js

+48-2
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,16 @@ test('Can open Remove wizard and remove version from simple environment', async
7676
.query(true)
7777
.reply(200, environmentPathsData);
7878

79+
const hostScope = nockInstance
80+
.get(hostURL)
81+
.query(true)
82+
.reply(200, affectedHostData);
83+
84+
const activationKeysScope = nockInstance
85+
.get(activationKeyURL)
86+
.query(true)
87+
.reply(200, affectedActivationKeysData);
88+
7989
const cvVersionRemoveParams = { id: 2, environment_ids: [4] };
8090

8191
const versionRemovalScope = nockInstance
@@ -115,13 +125,19 @@ test('Can open Remove wizard and remove version from simple environment', async
115125
assertNockRequest(scope);
116126
assertNockRequest(autocompleteScope);
117127
assertNockRequest(envPathRemovalScope);
128+
assertNockRequest(hostScope);
129+
assertNockRequest(activationKeysScope);
118130
assertNockRequest(versionRemovalScope, done);
119131
});
120132

121133
test('Can open Remove wizard and remove version from environment with hosts', async (done) => {
122134
const autocompleteScope = mockAutocomplete(nockInstance, autocompleteUrl);
123135
const hostAutocompleteUrl = '/hosts/auto_complete_search';
124136
const hostAutocompleteScope = mockForemanAutocomplete(nockInstance, hostAutocompleteUrl);
137+
const hostAutocompleteMock = nockInstance
138+
.get(foremanApi.getApiUrl(hostAutocompleteUrl))
139+
.query({ organization_id: '1', search: '' })
140+
.reply(200, { results: [] });
125141

126142
const scope = nockInstance
127143
.get(cvVersions)
@@ -133,11 +149,21 @@ test('Can open Remove wizard and remove version from environment with hosts', as
133149
.query(true)
134150
.reply(200, environmentPathsData);
135151

152+
const initialHostScope = nockInstance
153+
.get(hostURL)
154+
.query({ organization_id: '1', search: 'content_view_id=2' })
155+
.reply(200, { results: [] });
156+
136157
const hostScope = nockInstance
137158
.get(hostURL)
138-
.query(true)
159+
.query({ organization_id: '1', search: 'content_view_id=2 AND (lifecycle_environment_id=6)' })
139160
.reply(200, affectedHostData);
140161

162+
const activationKeysScope = nockInstance
163+
.get(activationKeyURL)
164+
.query(true)
165+
.reply(200, { results: [] });
166+
141167
const cVDropDownOptionsScope = nockInstance
142168
.get(cVDropDownOptionsPath)
143169
.reply(200, cVDropDownOptionsData);
@@ -199,7 +225,10 @@ test('Can open Remove wizard and remove version from environment with hosts', as
199225
assertNockRequest(scope);
200226
assertNockRequest(autocompleteScope);
201227
assertNockRequest(hostAutocompleteScope);
228+
assertNockRequest(hostAutocompleteMock);
229+
assertNockRequest(initialHostScope);
202230
assertNockRequest(hostScope);
231+
assertNockRequest(activationKeysScope);
203232
assertNockRequest(cVDropDownOptionsScope);
204233
assertNockRequest(envPathRemovalScope);
205234
assertNockRequest(versionRemovalScope, done);
@@ -209,6 +238,10 @@ test('Can open Remove wizard and remove version from environment with activation
209238
const autocompleteScope = mockAutocomplete(nockInstance, autocompleteUrl);
210239
const akAutocompleteUrl = '/activation_keys/auto_complete_search';
211240
const akAutocompleteScope = mockAutocomplete(nockInstance, akAutocompleteUrl);
241+
const activationKeysAutocompleteMock = nockInstance
242+
.get(api.getApiUrl(akAutocompleteUrl))
243+
.query({ organization_id: '1', search: '' })
244+
.reply(200, { results: [] });
212245

213246
const scope = nockInstance
214247
.get(cvVersions)
@@ -220,11 +253,21 @@ test('Can open Remove wizard and remove version from environment with activation
220253
.query(true)
221254
.reply(200, environmentPathsData);
222255

256+
const initialActivationKeyScope = nockInstance
257+
.get(activationKeyURL)
258+
.query({ organization_id: '1', search: 'content_view_id=2' })
259+
.reply(200, { results: [] });
260+
223261
const activationKeysScope = nockInstance
224262
.get(activationKeyURL)
225-
.query(true)
263+
.query({ organization_id: '1', search: 'content_view_id = 2 AND ( environment=test2 )' })
226264
.reply(200, affectedActivationKeysData);
227265

266+
const hostScope = nockInstance
267+
.get(hostURL)
268+
.query(true)
269+
.reply(200, { results: [] });
270+
228271
const cVDropDownOptionsScope = nockInstance
229272
.get(cVDropDownOptionsPath)
230273
.reply(200, cVDropDownOptionsData);
@@ -287,7 +330,10 @@ test('Can open Remove wizard and remove version from environment with activation
287330
assertNockRequest(scope);
288331
assertNockRequest(autocompleteScope);
289332
assertNockRequest(akAutocompleteScope);
333+
assertNockRequest(activationKeysAutocompleteMock);
334+
assertNockRequest(initialActivationKeyScope);
290335
assertNockRequest(activationKeysScope);
336+
assertNockRequest(hostScope);
291337
assertNockRequest(cVDropDownOptionsScope);
292338
assertNockRequest(envPathRemovalScope);
293339
assertNockRequest(versionRemovalScope, done);

0 commit comments

Comments
 (0)