foreman_openscap 13.1.2 → 13.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/foreman_openscap/locale/de/foreman_openscap.js +5 -5
  3. data/app/assets/javascripts/foreman_openscap/locale/en/foreman_openscap.js +1 -1
  4. data/app/assets/javascripts/foreman_openscap/locale/en_GB/foreman_openscap.js +1 -1
  5. data/app/assets/javascripts/foreman_openscap/locale/es/foreman_openscap.js +1 -1
  6. data/app/assets/javascripts/foreman_openscap/locale/fr/foreman_openscap.js +26 -24
  7. data/app/assets/javascripts/foreman_openscap/locale/gl/foreman_openscap.js +1 -1
  8. data/app/assets/javascripts/foreman_openscap/locale/it/foreman_openscap.js +1 -1
  9. data/app/assets/javascripts/foreman_openscap/locale/ja/foreman_openscap.js +26 -28
  10. data/app/assets/javascripts/foreman_openscap/locale/ka/foreman_openscap.js +5 -5
  11. data/app/assets/javascripts/foreman_openscap/locale/ko/foreman_openscap.js +26 -28
  12. data/app/assets/javascripts/foreman_openscap/locale/pt_BR/foreman_openscap.js +1 -1
  13. data/app/assets/javascripts/foreman_openscap/locale/ru/foreman_openscap.js +1 -1
  14. data/app/assets/javascripts/foreman_openscap/locale/sv_SE/foreman_openscap.js +1 -1
  15. data/app/assets/javascripts/foreman_openscap/locale/zh_CN/foreman_openscap.js +22 -24
  16. data/app/assets/javascripts/foreman_openscap/locale/zh_TW/foreman_openscap.js +1 -1
  17. data/app/controllers/api/v2/compliance/hosts_bulk_actions_controller.rb +38 -1
  18. data/app/controllers/policies_controller.rb +1 -1
  19. data/app/models/concerns/foreman_openscap/host_extensions.rb +10 -4
  20. data/app/models/concerns/foreman_openscap/hostgroup_extensions.rb +7 -0
  21. data/app/models/foreman_openscap/asset.rb +21 -1
  22. data/app/models/foreman_openscap/compliance_status.rb +19 -7
  23. data/app/models/foreman_openscap/policy.rb +43 -3
  24. data/app/services/foreman_openscap/compliance_status_resetter.rb +26 -0
  25. data/config/routes.rb +2 -0
  26. data/lib/foreman_openscap/engine.rb +3 -1
  27. data/lib/foreman_openscap/version.rb +1 -1
  28. data/locale/de/LC_MESSAGES/foreman_openscap.mo +0 -0
  29. data/locale/de/foreman_openscap.po +5 -5
  30. data/locale/en/LC_MESSAGES/foreman_openscap.mo +0 -0
  31. data/locale/en/foreman_openscap.po +1 -1
  32. data/locale/en_GB/LC_MESSAGES/foreman_openscap.mo +0 -0
  33. data/locale/en_GB/foreman_openscap.po +1 -1
  34. data/locale/es/LC_MESSAGES/foreman_openscap.mo +0 -0
  35. data/locale/es/foreman_openscap.po +1 -1
  36. data/locale/foreman_openscap.pot +2 -2
  37. data/locale/fr/LC_MESSAGES/foreman_openscap.mo +0 -0
  38. data/locale/fr/foreman_openscap.po +26 -24
  39. data/locale/gl/LC_MESSAGES/foreman_openscap.mo +0 -0
  40. data/locale/gl/foreman_openscap.po +1 -1
  41. data/locale/it/LC_MESSAGES/foreman_openscap.mo +0 -0
  42. data/locale/it/foreman_openscap.po +1 -1
  43. data/locale/ja/LC_MESSAGES/foreman_openscap.mo +0 -0
  44. data/locale/ja/foreman_openscap.po +26 -28
  45. data/locale/ka/LC_MESSAGES/foreman_openscap.mo +0 -0
  46. data/locale/ka/foreman_openscap.po +5 -5
  47. data/locale/ko/LC_MESSAGES/foreman_openscap.mo +0 -0
  48. data/locale/ko/foreman_openscap.po +26 -28
  49. data/locale/pt_BR/LC_MESSAGES/foreman_openscap.mo +0 -0
  50. data/locale/pt_BR/foreman_openscap.po +1 -1
  51. data/locale/ru/LC_MESSAGES/foreman_openscap.mo +0 -0
  52. data/locale/ru/foreman_openscap.po +1 -1
  53. data/locale/sv_SE/LC_MESSAGES/foreman_openscap.mo +0 -0
  54. data/locale/sv_SE/foreman_openscap.po +1 -1
  55. data/locale/zh_CN/LC_MESSAGES/foreman_openscap.mo +0 -0
  56. data/locale/zh_CN/foreman_openscap.po +22 -24
  57. data/locale/zh_TW/LC_MESSAGES/foreman_openscap.mo +0 -0
  58. data/locale/zh_TW/foreman_openscap.po +1 -1
  59. data/test/functional/api/v2/compliance/hosts_bulk_actions_controller_test.rb +175 -1
  60. data/test/test_plugin_helper.rb +7 -0
  61. data/test/unit/compliance_status_resetter_test.rb +48 -0
  62. data/test/unit/compliance_status_test.rb +53 -4
  63. data/test/unit/concerns/host_extensions_test.rb +55 -0
  64. data/test/unit/concerns/hostgroup_extensions_test.rb +64 -0
  65. data/test/unit/policy_test.rb +90 -0
  66. data/webpack/components/BulkActions/compliancePolicy/BulkCompliancePolicyMenuItems.js +49 -0
  67. data/webpack/components/BulkActions/compliancePolicy/BulkCompliancePolicyModal.js +304 -0
  68. data/webpack/components/BulkActions/compliancePolicy/BulkCompliancePolicyModalScene.js +65 -0
  69. data/webpack/components/BulkActions/compliancePolicy/__tests__/actions.test.js +121 -0
  70. data/webpack/components/BulkActions/compliancePolicy/actions.js +32 -0
  71. data/webpack/components/BulkActions/compliancePolicy/constants.js +8 -0
  72. data/webpack/global_index.js +27 -1
  73. metadata +10 -1
@@ -0,0 +1,65 @@
1
+ import React, { useContext } from 'react';
2
+ import { ForemanActionsBarContext } from 'foremanReact/components/HostDetails/ActionsBar';
3
+ import { useBulkModalOpen } from 'foremanReact/common/BulkModalStateHelper';
4
+ import BulkCompliancePolicyModal from './BulkCompliancePolicyModal';
5
+ import { ASSIGN_POLICY_MODAL_ID, UNASSIGN_POLICY_MODAL_ID } from './constants';
6
+
7
+ export const BulkAssignPolicyModalScene = () => {
8
+ const {
9
+ selectAllHostsMode,
10
+ selectedCount,
11
+ fetchBulkParams,
12
+ organizationId,
13
+ locationId,
14
+ refreshTableData,
15
+ } = useContext(ForemanActionsBarContext) || {};
16
+
17
+ const { isOpen, close: closeModal } = useBulkModalOpen(
18
+ ASSIGN_POLICY_MODAL_ID
19
+ );
20
+
21
+ return (
22
+ <BulkCompliancePolicyModal
23
+ key="bulk-assign-compliance-policy-modal"
24
+ selectAllHostsMode={selectAllHostsMode}
25
+ selectedCount={selectedCount}
26
+ fetchBulkParams={fetchBulkParams}
27
+ organizationId={organizationId}
28
+ locationId={locationId}
29
+ isOpen={isOpen}
30
+ closeModal={closeModal}
31
+ mode="assign"
32
+ onSuccess={refreshTableData}
33
+ />
34
+ );
35
+ };
36
+
37
+ export const BulkUnassignPolicyModalScene = () => {
38
+ const {
39
+ selectAllHostsMode,
40
+ selectedCount,
41
+ fetchBulkParams,
42
+ organizationId,
43
+ locationId,
44
+ refreshTableData,
45
+ } = useContext(ForemanActionsBarContext) || {};
46
+
47
+ const { isOpen, close: closeModal } = useBulkModalOpen(
48
+ UNASSIGN_POLICY_MODAL_ID
49
+ );
50
+
51
+ return (
52
+ <BulkCompliancePolicyModal
53
+ key="bulk-unassign-compliance-policy-modal"
54
+ selectAllHostsMode={selectAllHostsMode}
55
+ selectedCount={selectedCount}
56
+ fetchBulkParams={fetchBulkParams}
57
+ organizationId={organizationId}
58
+ locationId={locationId}
59
+ isOpen={isOpen}
60
+ closeModal={closeModal}
61
+ mode="unassign"
62
+ onSuccess={refreshTableData}
63
+ />
64
+ );
65
+ };
@@ -0,0 +1,121 @@
1
+ import { APIActions } from 'foremanReact/redux/API';
2
+
3
+ import {
4
+ fetchPolicies,
5
+ bulkAssignPolicy,
6
+ bulkUnassignPolicy,
7
+ } from '../actions';
8
+ import {
9
+ POLICIES_KEY,
10
+ BULK_ASSIGN_POLICY_KEY,
11
+ BULK_UNASSIGN_POLICY_KEY,
12
+ } from '../constants';
13
+
14
+ jest.mock('foremanReact/redux/API', () => ({
15
+ APIActions: {
16
+ get: jest.fn(params => ({
17
+ type: 'API_GET',
18
+ params,
19
+ })),
20
+ put: jest.fn(params => ({
21
+ type: 'API_PUT',
22
+ params,
23
+ })),
24
+ },
25
+ }));
26
+
27
+ jest.mock('foremanReact/common/helpers', () => ({
28
+ foremanUrl: jest.fn(path => path),
29
+ }));
30
+
31
+ jest.mock('foremanReact/common/I18n', () => ({
32
+ translate: jest.fn(text => text),
33
+ }));
34
+
35
+ describe('Compliance Policy Actions', () => {
36
+ beforeEach(() => {
37
+ jest.clearAllMocks();
38
+ APIActions.put.mockReturnValue({ type: 'API_PUT' });
39
+ });
40
+
41
+ describe('fetchPolicies', () => {
42
+ it('dispatches GET request to compliance policies API', () => {
43
+ const action = fetchPolicies();
44
+
45
+ expect(APIActions.get).toHaveBeenCalledWith({
46
+ url: '/api/v2/compliance/policies',
47
+ key: POLICIES_KEY,
48
+ params: { per_page: 'all' },
49
+ });
50
+ expect(action.type).toBe('API_GET');
51
+ });
52
+ });
53
+
54
+ describe('bulkAssignPolicy', () => {
55
+ const requestBody = {
56
+ included: {
57
+ search: 'id ^ (1,2,3)',
58
+ },
59
+ policy_id: '5',
60
+ organization_id: 1,
61
+ location_id: 2,
62
+ };
63
+ const handleSuccess = jest.fn();
64
+ const handleError = jest.fn();
65
+
66
+ it('dispatches PUT request to assign policy endpoint', () => {
67
+ bulkAssignPolicy(requestBody, handleSuccess, handleError);
68
+
69
+ expect(APIActions.put).toHaveBeenCalledTimes(1);
70
+ const callArgs = APIActions.put.mock.calls[0][0];
71
+
72
+ expect(callArgs.key).toBe(BULK_ASSIGN_POLICY_KEY);
73
+ expect(callArgs.url).toContain(
74
+ '/api/v2/compliance/hosts/bulk/assign_compliance_policy'
75
+ );
76
+ expect(callArgs.params).toEqual(requestBody);
77
+ expect(callArgs.handleSuccess).toBe(handleSuccess);
78
+ expect(callArgs.handleError).toBe(handleError);
79
+ });
80
+
81
+ it('passes error handler callback', () => {
82
+ bulkAssignPolicy(requestBody, handleSuccess, handleError);
83
+ const callArgs = APIActions.put.mock.calls[0][0];
84
+ expect(callArgs.handleError).toBe(handleError);
85
+ });
86
+ });
87
+
88
+ describe('bulkUnassignPolicy', () => {
89
+ const requestBody = {
90
+ included: {
91
+ search: 'name ~ test',
92
+ },
93
+ policy_id: '3',
94
+ organization_id: 1,
95
+ location_id: 2,
96
+ };
97
+ const handleSuccess = jest.fn();
98
+ const handleError = jest.fn();
99
+
100
+ it('dispatches PUT request to unassign policy endpoint', () => {
101
+ bulkUnassignPolicy(requestBody, handleSuccess, handleError);
102
+
103
+ expect(APIActions.put).toHaveBeenCalledTimes(1);
104
+ const callArgs = APIActions.put.mock.calls[0][0];
105
+
106
+ expect(callArgs.key).toBe(BULK_UNASSIGN_POLICY_KEY);
107
+ expect(callArgs.url).toContain(
108
+ '/api/v2/compliance/hosts/bulk/unassign_compliance_policy'
109
+ );
110
+ expect(callArgs.params).toEqual(requestBody);
111
+ expect(callArgs.handleSuccess).toBe(handleSuccess);
112
+ expect(callArgs.handleError).toBe(handleError);
113
+ });
114
+
115
+ it('passes error handler callback', () => {
116
+ bulkUnassignPolicy(requestBody, handleSuccess, handleError);
117
+ const callArgs = APIActions.put.mock.calls[0][0];
118
+ expect(callArgs.handleError).toBe(handleError);
119
+ });
120
+ });
121
+ });
@@ -0,0 +1,32 @@
1
+ import { APIActions } from 'foremanReact/redux/API';
2
+ import { foremanUrl } from 'foremanReact/common/helpers';
3
+ import {
4
+ POLICIES_KEY,
5
+ BULK_ASSIGN_POLICY_KEY,
6
+ BULK_UNASSIGN_POLICY_KEY,
7
+ } from './constants';
8
+
9
+ export const fetchPolicies = () =>
10
+ APIActions.get({
11
+ url: foremanUrl('/api/v2/compliance/policies'),
12
+ key: POLICIES_KEY,
13
+ params: { per_page: 'all' },
14
+ });
15
+
16
+ export const bulkAssignPolicy = (params, handleSuccess, handleError) =>
17
+ APIActions.put({
18
+ url: foremanUrl('/api/v2/compliance/hosts/bulk/assign_compliance_policy'),
19
+ key: BULK_ASSIGN_POLICY_KEY,
20
+ params,
21
+ handleSuccess,
22
+ handleError,
23
+ });
24
+
25
+ export const bulkUnassignPolicy = (params, handleSuccess, handleError) =>
26
+ APIActions.put({
27
+ url: foremanUrl('/api/v2/compliance/hosts/bulk/unassign_compliance_policy'),
28
+ key: BULK_UNASSIGN_POLICY_KEY,
29
+ params,
30
+ handleSuccess,
31
+ handleError,
32
+ });
@@ -0,0 +1,8 @@
1
+ export const POLICIES_KEY = 'COMPLIANCE_POLICIES';
2
+ export const BULK_ASSIGN_POLICY_KEY = 'BULK_ASSIGN_COMPLIANCE_POLICY';
3
+ export const BULK_UNASSIGN_POLICY_KEY = 'BULK_UNASSIGN_COMPLIANCE_POLICY';
4
+
5
+ export const ASSIGN_POLICY_MODAL_ID = 'assign-compliance-policy-modal';
6
+ export const UNASSIGN_POLICY_MODAL_ID = 'unassign-compliance-policy-modal';
7
+
8
+ export const ASSIGN_POLICIES = 'assign_policies';
@@ -4,10 +4,15 @@ import HostKebabItems from './components/HostExtentions/HostKebabItems';
4
4
  import BulkChangeOpenscapProxyModalScene, {
5
5
  ChangeOpenscapProxyMenuItem,
6
6
  } from './components/HostsIndex/ChangeOpenscapProxyAction';
7
+ import BulkCompliancePolicyMenuItems from './components/BulkActions/compliancePolicy/BulkCompliancePolicyMenuItems';
8
+ import {
9
+ BulkAssignPolicyModalScene,
10
+ BulkUnassignPolicyModalScene,
11
+ } from './components/BulkActions/compliancePolicy/BulkCompliancePolicyModalScene';
7
12
 
8
13
  const HOST_ASSOCIATIONS_WEIGHT = 1212;
9
14
  const BULK_MODAL_WEIGHT = 100;
10
-
15
+ const BULK_POLICY_MODAL_WEIGHT = 200;
11
16
  const OPENSCAP_KEBAB_WEIGHT = 400;
12
17
 
13
18
  addGlobalFill(
@@ -30,3 +35,24 @@ addGlobalFill(
30
35
  <BulkChangeOpenscapProxyModalScene key="bulk-change-openscap-proxy-modal" />,
31
36
  BULK_MODAL_WEIGHT
32
37
  );
38
+
39
+ addGlobalFill(
40
+ '_host-associations',
41
+ 'compliance-policy-bulk-actions',
42
+ <BulkCompliancePolicyMenuItems key="compliance-policy-menu-items" />,
43
+ BULK_POLICY_MODAL_WEIGHT
44
+ );
45
+
46
+ addGlobalFill(
47
+ '_all-hosts-modals',
48
+ 'assign-compliance-policy-modal',
49
+ <BulkAssignPolicyModalScene key="bulk-assign-policy-modal" />,
50
+ BULK_POLICY_MODAL_WEIGHT
51
+ );
52
+
53
+ addGlobalFill(
54
+ '_all-hosts-modals',
55
+ 'unassign-compliance-policy-modal',
56
+ <BulkUnassignPolicyModalScene key="bulk-unassign-policy-modal" />,
57
+ BULK_POLICY_MODAL_WEIGHT
58
+ );
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: foreman_openscap
3
3
  version: !ruby/object:Gem::Version
4
- version: 13.1.2
4
+ version: 13.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - slukasik@redhat.com
@@ -106,6 +106,7 @@ files:
106
106
  - app/services/foreman_openscap/client_config/base.rb
107
107
  - app/services/foreman_openscap/client_config/manual.rb
108
108
  - app/services/foreman_openscap/client_config/puppet.rb
109
+ - app/services/foreman_openscap/compliance_status_resetter.rb
109
110
  - app/services/foreman_openscap/config_name_service.rb
110
111
  - app/services/foreman_openscap/host_report_dashboard/data.rb
111
112
  - app/services/foreman_openscap/hostgroup_overrider.rb
@@ -349,6 +350,7 @@ files:
349
350
  - test/test_plugin_helper.rb
350
351
  - test/unit/arf_report_status_calculator_test.rb
351
352
  - test/unit/arf_report_test.rb
353
+ - test/unit/compliance_status_resetter_test.rb
352
354
  - test/unit/compliance_status_test.rb
353
355
  - test/unit/concerns/bookmark_controller_validator_extensions_test.rb
354
356
  - test/unit/concerns/host_extensions_test.rb
@@ -364,6 +366,12 @@ files:
364
366
  - test/unit/services/lookup_key_overrider_test.rb
365
367
  - test/unit/services/report_dashboard/data_test.rb
366
368
  - test/unit/tailoring_file_test.rb
369
+ - webpack/components/BulkActions/compliancePolicy/BulkCompliancePolicyMenuItems.js
370
+ - webpack/components/BulkActions/compliancePolicy/BulkCompliancePolicyModal.js
371
+ - webpack/components/BulkActions/compliancePolicy/BulkCompliancePolicyModalScene.js
372
+ - webpack/components/BulkActions/compliancePolicy/__tests__/actions.test.js
373
+ - webpack/components/BulkActions/compliancePolicy/actions.js
374
+ - webpack/components/BulkActions/compliancePolicy/constants.js
367
375
  - webpack/components/EmptyState.js
368
376
  - webpack/components/HostExtentions/HostKebabItems.js
369
377
  - webpack/components/HostsIndex/BulkActions/changeOpenscapProxy/BulkChangeOpenscapProxyModal.js
@@ -457,6 +465,7 @@ test_files:
457
465
  - test/test_plugin_helper.rb
458
466
  - test/unit/arf_report_status_calculator_test.rb
459
467
  - test/unit/arf_report_test.rb
468
+ - test/unit/compliance_status_resetter_test.rb
460
469
  - test/unit/compliance_status_test.rb
461
470
  - test/unit/concerns/bookmark_controller_validator_extensions_test.rb
462
471
  - test/unit/concerns/host_extensions_test.rb