From 8d9460907c87b237fe0171202f14042addfb28df Mon Sep 17 00:00:00 2001 From: CD Cabrera Date: Wed, 16 Nov 2022 22:40:44 -0500 Subject: [PATCH] refactor(config): sw-690 rhel, satellite, openshift inventory (#1002) * config, rhel, openshift, satellite, inventory ids * locale, inventory strings * productView, allow updated hosts inventory * rhsmConstants, add missing sort types * rhsmTransformers, pass original props, number of guests --- public/locales/en-US.json | 5 ++ .../__tests__/__snapshots__/i18n.test.js.snap | 18 ++--- .../inventoryCardContext.test.js.snap | 34 +++++++++ .../__tests__/inventoryCardContext.test.js | 16 +++++ .../inventoryCard/inventoryCardContext.js | 65 +++++++++++++++++ .../inventoryCard/inventoryCardHosts.js | 13 ++-- .../productViewContext.test.js.snap | 14 ++-- src/components/productView/productView.js | 4 +- .../__snapshots__/redirect.test.js.snap | 24 +++---- .../product.openshiftContainer.test.js.snap | 52 +++++++------- .../product.openshiftDedicated.test.js.snap | 60 ++++++++-------- .../product.openshiftMetrics.test.js.snap | 48 ++++++------- .../__snapshots__/product.rhel.test.js.snap | 64 ++++++++--------- .../product.satellite.test.js.snap | 64 ++++++++--------- .../product.openshiftContainer.test.js | 31 ++++---- .../product.openshiftDedicated.test.js | 29 ++++---- .../product.openshiftMetrics.test.js | 25 ++++--- src/config/__tests__/product.rhel.test.js | 31 ++++---- .../__tests__/product.satellite.test.js | 33 +++++---- src/config/product.openshiftContainer.js | 26 ++++--- src/config/product.openshiftDedicated.js | 37 +++++----- src/config/product.openshiftMetrics.js | 24 ++++--- src/config/product.rhel.js | 50 +++++++------ src/config/product.satellite.js | 50 +++++++------ .../__snapshots__/rhsmConstants.test.js.snap | 48 +++++++++++++ .../rhsmTransformers.test.js.snap | 2 + src/services/rhsm/rhsmConstants.js | 72 ++++++++++++------- src/services/rhsm/rhsmTransformers.js | 2 + tests/__snapshots__/code.test.js.snap | 3 +- 29 files changed, 588 insertions(+), 356 deletions(-) diff --git a/public/locales/en-US.json b/public/locales/en-US.json index 61803b35c..24127a4a4 100644 --- a/public/locales/en-US.json +++ b/public/locales/en-US.json @@ -171,6 +171,8 @@ "tableSkeletonAriaLabel": "Loading", "label_has_infinite_quantity_cores": "Unlimited cores", "label_has_infinite_quantity_sockets": "Unlimited sockets", + "label_number_of_guests_one": "<0>{{count}} guest", + "label_number_of_guests_other": "<0>{{count}} guests", "label_numberOfGuests_one": "<0>{{count}} guest", "label_numberOfGuests_other": "<0>{{count}} guests", "label_subscription_type": "{{context}}", @@ -194,14 +196,17 @@ "header_cores_OpenShift-metrics": "Cores", "header_cores_OpenShift-dedicated-metrics": "Cores", "header_Cores": "vCPU hours", + "header_core_hours": "Core hours", "header_coreHours": "Core hours", "header_displayName": "Name", "header_display_name": "Name", "header_guestsDisplayName": "Guest name", "header_hardwareType": "Type", "header_instanceHours": "Instance hours", + "header_instance_hours": "Instance hours", "header_Instance-hours": "Instance hours", "header_measurementType": "Type", + "header_measurement_type": "Type", "header_inventoryId": "UUID", "header_sockets": "Subscribed sockets", "header_sockets_OpenShift Container Platform": "Sockets", diff --git a/src/components/i18n/__tests__/__snapshots__/i18n.test.js.snap b/src/components/i18n/__tests__/__snapshots__/i18n.test.js.snap index 85130bc50..16427babe 100644 --- a/src/components/i18n/__tests__/__snapshots__/i18n.test.js.snap +++ b/src/components/i18n/__tests__/__snapshots__/i18n.test.js.snap @@ -517,14 +517,6 @@ exports[`I18n Component should generate a predictable locale key output snapshot "key": "curiosity-inventory.label", "match": "translate('curiosity-inventory.label', { context: 'numberOfGuests', count: numberOfGuests.value }, [ ])", }, - { - "key": "curiosity-inventory.header", - "match": "translate('curiosity-inventory.header', { context: ['sockets', 'OpenShift Container Platform'] })", - }, - { - "key": "curiosity-inventory.header", - "match": "translate('curiosity-inventory.header', { context: ['cores', 'OpenShift Container Platform'] })", - }, { "key": "curiosity-inventory.header", "match": "translate('curiosity-inventory.header', { context: ['subscriptions', uom?.value] })", @@ -544,7 +536,7 @@ exports[`I18n Component should generate a predictable locale key output snapshot }, { "key": "curiosity-inventory.label", - "match": "translate('curiosity-inventory.label', { context: 'numberOfGuests', count: numberOfGuests.value }, [ ])", + "match": "translate( 'curiosity-inventory.label', { context: INVENTORY_TYPES.NUMBER_OF_GUESTS, count: numberOfGuests.value }, [] )", }, ], }, @@ -603,11 +595,11 @@ exports[`I18n Component should generate a predictable locale key output snapshot }, { "key": "curiosity-inventory.measurementType", - "match": "translate('curiosity-inventory.measurementType', { context: measurementType.value })", + "match": "translate('curiosity-inventory.measurementType', { context: measurementType?.value })", }, { "key": "curiosity-inventory.cloudProvider", - "match": "translate('curiosity-inventory.cloudProvider', { context: cloudProvider.value })", + "match": "translate('curiosity-inventory.cloudProvider', { context: cloudProvider?.value })", }, { "key": "curiosity-inventory.header", @@ -714,11 +706,11 @@ exports[`I18n Component should generate a predictable locale key output snapshot }, { "key": "curiosity-inventory.measurementType", - "match": "translate('curiosity-inventory.measurementType', { context: measurementType.value })", + "match": "translate('curiosity-inventory.measurementType', { context: measurementType?.value })", }, { "key": "curiosity-inventory.cloudProvider", - "match": "translate('curiosity-inventory.cloudProvider', { context: cloudProvider.value })", + "match": "translate('curiosity-inventory.cloudProvider', { context: cloudProvider?.value })", }, ], }, diff --git a/src/components/inventoryCard/__tests__/__snapshots__/inventoryCardContext.test.js.snap b/src/components/inventoryCard/__tests__/__snapshots__/inventoryCardContext.test.js.snap index 85f97a1cc..d7f16c638 100644 --- a/src/components/inventoryCard/__tests__/__snapshots__/inventoryCardContext.test.js.snap +++ b/src/components/inventoryCard/__tests__/__snapshots__/inventoryCardContext.test.js.snap @@ -57,6 +57,39 @@ exports[`InventoryCardContext should handle a store response with useGetInstance } `; +exports[`InventoryCardContext should handle an onColumnSort event for hosts: onColumnSort event, dispatch hosts 1`] = ` +[ + [ + [ + { + "dir": "desc", + "type": "SET_QUERY_RHSM_HOSTS_INVENTORY_dir", + "viewId": "lorem", + }, + { + "sort": "loremIpsumColumnOne", + "type": "SET_QUERY_RHSM_HOSTS_INVENTORY_sort", + "viewId": "lorem", + }, + ], + ], + [ + [ + { + "dir": "asc", + "type": "SET_QUERY_RHSM_HOSTS_INVENTORY_dir", + "viewId": "lorem", + }, + { + "sort": "loremIpsumColumnOne", + "type": "SET_QUERY_RHSM_HOSTS_INVENTORY_sort", + "viewId": "lorem", + }, + ], + ], +] +`; + exports[`InventoryCardContext should handle an onColumnSort event: onColumnSort event, dispatch 1`] = ` [ [ @@ -203,6 +236,7 @@ exports[`InventoryCardContext should return specific properties: specific proper { "useGetHostsInventory": [Function], "useGetInstancesInventory": [Function], + "useOnColumnSortHosts": [Function], "useOnColumnSortInstances": [Function], "useOnPageInstances": [Function], } diff --git a/src/components/inventoryCard/__tests__/inventoryCardContext.test.js b/src/components/inventoryCard/__tests__/inventoryCardContext.test.js index d4ad239d7..efeb552ae 100644 --- a/src/components/inventoryCard/__tests__/inventoryCardContext.test.js +++ b/src/components/inventoryCard/__tests__/inventoryCardContext.test.js @@ -3,6 +3,7 @@ import { useGetHostsInventory, useGetInstancesInventory, useOnPageInstances, + useOnColumnSortHosts, useOnColumnSortInstances } from '../inventoryCardContext'; import { @@ -205,6 +206,21 @@ describe('InventoryCardContext', () => { mockDispatch.mockClear(); }); + it('should handle an onColumnSort event for hosts', () => { + const mockDispatch = jest.fn(); + const onColumnSort = useOnColumnSortHosts({ + sortColumns: { LOREM_IPSUM_COLUMN_ONE: 'loremIpsumColumnOne' }, + useDispatch: () => mockDispatch, + useProduct: () => ({ productId: 'lorem' }) + }); + + onColumnSort(null, { direction: SORT_DIRECTION_TYPES.DESCENDING, id: 'loremIpsumColumnOne' }); + onColumnSort(null, { direction: SORT_DIRECTION_TYPES.ASCENDING, id: 'loremIpsumColumnOne' }); + + expect(mockDispatch.mock.calls).toMatchSnapshot('onColumnSort event, dispatch hosts'); + mockDispatch.mockClear(); + }); + it('should handle an onColumnSort event', () => { const mockDispatch = jest.fn(); const onColumnSort = useOnColumnSortInstances({ diff --git a/src/components/inventoryCard/inventoryCardContext.js b/src/components/inventoryCard/inventoryCardContext.js index daac7439e..d43436656 100644 --- a/src/components/inventoryCard/inventoryCardContext.js +++ b/src/components/inventoryCard/inventoryCardContext.js @@ -4,6 +4,7 @@ import { SortByDirection } from '@patternfly/react-table'; import { reduxActions, reduxTypes, storeHooks } from '../../redux'; import { useProduct, useProductInventoryHostsQuery } from '../productView/productViewContext'; import { + RHSM_API_QUERY_INVENTORY_HOSTS_SORT_TYPES as HOSTS_SORT_TYPES, RHSM_API_QUERY_INVENTORY_SORT_DIRECTION_TYPES as SORT_DIRECTION_TYPES, RHSM_API_QUERY_INVENTORY_SORT_TYPES as SORT_TYPES, RHSM_API_QUERY_SET_TYPES @@ -132,6 +133,68 @@ const useOnPageInstances = ({ }; }; +/** + * An onColumnSort callback for hosts inventory. + * + * @param {object} options + * @param {object} options.sortColumns + * @param {Function} options.useDispatch + * @param {Function} options.useProduct + * @returns {Function} + */ +const useOnColumnSortHosts = ({ + sortColumns = HOSTS_SORT_TYPES, + useDispatch: useAliasDispatch = storeHooks.reactRedux.useDispatch, + useProduct: useAliasProduct = useProduct +} = {}) => { + const { productId } = useAliasProduct(); + const dispatch = useAliasDispatch(); + + /** + * On event update state for hosts inventory. + * + * @event onColumnSort + * @param {*} _data + * @param {object} params + * @param {string} params.direction + * @param {string} params.id + * @returns {void} + */ + return (_data, { direction, id }) => { + const updatedSortColumn = Object.values(sortColumns).find(value => value === id || _camelCase(value) === id); + let updatedDirection; + + if (!updatedSortColumn) { + if (helpers.DEV_MODE || helpers.REVIEW_MODE) { + console.warn(`Sorting can only be performed on select fields, confirm field ${id} is allowed.`); + } + return; + } + + switch (direction) { + case SortByDirection.desc: + updatedDirection = SORT_DIRECTION_TYPES.DESCENDING; + break; + default: + updatedDirection = SORT_DIRECTION_TYPES.ASCENDING; + break; + } + + dispatch([ + { + type: reduxTypes.query.SET_QUERY_RHSM_HOSTS_INVENTORY_TYPES[RHSM_API_QUERY_SET_TYPES.DIRECTION], + viewId: productId, + [RHSM_API_QUERY_SET_TYPES.DIRECTION]: updatedDirection + }, + { + type: reduxTypes.query.SET_QUERY_RHSM_HOSTS_INVENTORY_TYPES[RHSM_API_QUERY_SET_TYPES.SORT], + viewId: productId, + [RHSM_API_QUERY_SET_TYPES.SORT]: updatedSortColumn + } + ]); + }; +}; + /** * An onColumnSort callback for instances inventory. * @@ -198,6 +261,7 @@ const context = { useGetHostsInventory, useGetInstancesInventory, useOnPageInstances, + useOnColumnSortHosts, useOnColumnSortInstances }; @@ -207,5 +271,6 @@ export { useGetHostsInventory, useGetInstancesInventory, useOnPageInstances, + useOnColumnSortHosts, useOnColumnSortInstances }; diff --git a/src/components/inventoryCard/inventoryCardHosts.js b/src/components/inventoryCard/inventoryCardHosts.js index a461225ec..a84bab6a5 100644 --- a/src/components/inventoryCard/inventoryCardHosts.js +++ b/src/components/inventoryCard/inventoryCardHosts.js @@ -1,6 +1,6 @@ import React from 'react'; import PropTypes from 'prop-types'; -import { useGetHostsInventory } from './inventoryCardContext'; +import { useGetHostsInventory, useOnColumnSortHosts } from './inventoryCardContext'; import InventoryCard from './inventoryCard'; import { helpers } from '../../common'; @@ -10,6 +10,7 @@ import { helpers } from '../../common'; * @param {object} props * @param {boolean} props.isDisabled * @param {Function} props.useGetInventory + * @param {Function} props.useOnColumnSort * @returns {React.ReactNode} */ const InventoryCardHosts = ({ ...props }) => ; @@ -17,21 +18,23 @@ const InventoryCardHosts = ({ ...props }) => ; /** * Prop types. * - * @type {{isDisabled: boolean, useGetInventory: Function}} + * @type {{isDisabled: boolean, useGetInventory: Function, useOnColumnSort: Function}} */ InventoryCardHosts.propTypes = { isDisabled: PropTypes.bool, - useGetInventory: PropTypes.func + useGetInventory: PropTypes.func, + useOnColumnSort: PropTypes.func }; /** * Default props. * - * @type {{isDisabled: boolean, useGetInventory: Function}} + * @type {{isDisabled: boolean, useGetInventory: Function, useOnColumnSort: Function}} */ InventoryCardHosts.defaultProps = { isDisabled: helpers.UI_DISABLED_TABLE_HOSTS, - useGetInventory: useGetHostsInventory + useGetInventory: useGetHostsInventory, + useOnColumnSort: useOnColumnSortHosts }; export { InventoryCardHosts as default, InventoryCardHosts }; diff --git a/src/components/productView/__tests__/__snapshots__/productViewContext.test.js.snap b/src/components/productView/__tests__/__snapshots__/productViewContext.test.js.snap index 240eb1ec1..7f261ae1c 100644 --- a/src/components/productView/__tests__/__snapshots__/productViewContext.test.js.snap +++ b/src/components/productView/__tests__/__snapshots__/productViewContext.test.js.snap @@ -63,12 +63,11 @@ exports[`ProductViewContext should apply a hook for retrieving product context: "initialInventoryFilters": [ { "cell": [Function], - "id": "displayName", + "id": "display_name", "isSortable": true, }, { "cellWidth": 15, - "header": [Function], "id": "cores", "isOptional": true, "isSortable": true, @@ -76,8 +75,8 @@ exports[`ProductViewContext should apply a hook for retrieving product context: }, { "cell": [Function], - "cellWidth": 25, - "id": "lastSeen", + "cellWidth": 20, + "id": "last_seen", "isSortable": true, "isWrappable": true, }, @@ -197,12 +196,11 @@ exports[`ProductViewContext should apply a hook for retrieving product context: "initialInventoryFilters": [ { "cell": [Function], - "id": "displayName", + "id": "display_name", "isSortable": true, }, { "cellWidth": 15, - "header": [Function], "id": "sockets", "isOptional": true, "isSortable": true, @@ -210,8 +208,8 @@ exports[`ProductViewContext should apply a hook for retrieving product context: }, { "cell": [Function], - "cellWidth": 25, - "id": "lastSeen", + "cellWidth": 20, + "id": "last_seen", "isSortable": true, "isWrappable": true, }, diff --git a/src/components/productView/productView.js b/src/components/productView/productView.js index db3f26fc5..fb49498cd 100644 --- a/src/components/productView/productView.js +++ b/src/components/productView/productView.js @@ -111,7 +111,7 @@ const ProductView = ({ t, toolbarGraph, toolbarGraphDescription, useRouteDetail: (!initialInventoryFilters && !initialSubscriptionsInventoryFilters) || helpers.UI_DISABLED_TABLE } > - {!helpers.UI_DISABLED_TABLE_HOSTS && productDisplay !== DISPLAY_TYPES.HOURLY && initialInventoryFilters && ( + {!helpers.UI_DISABLED_TABLE_HOSTS && productDisplay === DISPLAY_TYPES.LEGACY && initialInventoryFilters && ( )} {!helpers.UI_DISABLED_TABLE_HOSTS && - productDisplay !== DISPLAY_TYPES.DUAL_AXES && productDisplay !== DISPLAY_TYPES.LEGACY && productDisplay !== DISPLAY_TYPES.HOURLY && - productDisplay !== DISPLAY_TYPES.PARTIAL && initialInventoryFilters && ( { }); it('should apply hosts inventory configuration', () => { - const { initialInventoryFilters: initialFilters, inventoryHostsQuery: inventoryQuery } = config; + const { initialInventoryFilters: initialFilters, inventoryHostsQuery: inventoryQuery, productId } = config; const inventoryData = { - displayName: 'lorem', - inventoryId: 'lorem inventory id', - numberOfGuests: 3, - cores: 20, - sockets: 100, - lastSeen: '2022-01-01T00:00:00.000Z', + [INVENTORY_TYPES.DISPLAY_NAME]: 'lorem', + [INVENTORY_TYPES.INVENTORY_ID]: 'lorem inventory id', + [INVENTORY_TYPES.NUMBER_OF_GUESTS]: 3, + [INVENTORY_TYPES.CORES]: 20, + [INVENTORY_TYPES.SOCKETS]: 100, + [INVENTORY_TYPES.LAST_SEEN]: '2022-01-01T00:00:00.000Z', loremIpsum: 'hello world' }; const filteredInventoryData = parseRowCellsListData({ filters: initialFilters, - cellData: inventoryData + cellData: inventoryData, + productId }); expect(filteredInventoryData).toMatchSnapshot('filtered'); const fallbackInventoryData = { ...inventoryData, - inventoryId: null, - numberOfGuests: null, - cores: null, - sockets: null, - lastSeen: null + [INVENTORY_TYPES.INVENTORY_ID]: null, + [INVENTORY_TYPES.NUMBER_OF_GUESTS]: null, + [INVENTORY_TYPES.CORES]: null, + [INVENTORY_TYPES.SOCKETS]: null, + [INVENTORY_TYPES.LAST_SEEN]: null }; const fallbackFilteredInventoryData = parseRowCellsListData({ filters: initialFilters, - cellData: fallbackInventoryData + cellData: fallbackInventoryData, + productId }); expect(fallbackFilteredInventoryData).toMatchSnapshot('filtered, fallback display'); diff --git a/src/config/__tests__/product.openshiftDedicated.test.js b/src/config/__tests__/product.openshiftDedicated.test.js index 41ae02dd9..23e555456 100644 --- a/src/config/__tests__/product.openshiftDedicated.test.js +++ b/src/config/__tests__/product.openshiftDedicated.test.js @@ -4,7 +4,8 @@ import { parseRowCellsListData } from '../../components/inventoryCard/inventoryC import { RHSM_API_PATH_METRIC_TYPES, RHSM_API_QUERY_INVENTORY_SORT_DIRECTION_TYPES as SORT_DIRECTION_TYPES, - RHSM_API_QUERY_SET_TYPES + RHSM_API_QUERY_SET_TYPES, + RHSM_API_RESPONSE_HOSTS_DATA_TYPES as INVENTORY_TYPES } from '../../services/rhsm/rhsmConstants'; describe('Product OpenShift Dedicated config', () => { @@ -116,35 +117,37 @@ describe('Product OpenShift Dedicated config', () => { }); it('should apply hosts inventory configuration', () => { - const { initialInventoryFilters: initialFilters, inventoryHostsQuery: inventoryQuery } = config; + const { initialInventoryFilters: initialFilters, inventoryHostsQuery: inventoryQuery, productId } = config; const inventoryData = { - displayName: 'lorem', - inventoryId: 'lorem inventory id', - coreHours: 12.53, - instanceHours: 20.04, - lastSeen: '2022-01-01T00:00:00.000Z', + [INVENTORY_TYPES.DISPLAY_NAME]: 'lorem', + [INVENTORY_TYPES.INVENTORY_ID]: 'lorem inventory id', + [INVENTORY_TYPES.CORE_HOURS]: 12.53, + [INVENTORY_TYPES.INSTANCE_HOURS]: 20.04, + [INVENTORY_TYPES.LAST_SEEN]: '2022-01-01T00:00:00.000Z', loremIpsum: 'hello world' }; const filteredInventoryData = parseRowCellsListData({ filters: initialFilters, - cellData: inventoryData + cellData: inventoryData, + productId }); expect(filteredInventoryData).toMatchSnapshot('filtered'); const fallbackInventoryData = { ...inventoryData, - coreHours: null, - instanceHours: null, - inventoryId: null, - lastSeen: null + [INVENTORY_TYPES.INVENTORY_ID]: null, + [INVENTORY_TYPES.CORE_HOURS]: null, + [INVENTORY_TYPES.INSTANCE_HOURS]: null, + [INVENTORY_TYPES.LAST_SEEN]: null }; const fallbackFilteredInventoryData = parseRowCellsListData({ filters: initialFilters, - cellData: fallbackInventoryData + cellData: fallbackInventoryData, + productId }); expect(fallbackFilteredInventoryData).toMatchSnapshot('filtered, fallback display'); diff --git a/src/config/__tests__/product.openshiftMetrics.test.js b/src/config/__tests__/product.openshiftMetrics.test.js index b5b536834..c6cfa2177 100644 --- a/src/config/__tests__/product.openshiftMetrics.test.js +++ b/src/config/__tests__/product.openshiftMetrics.test.js @@ -4,7 +4,8 @@ import { parseRowCellsListData } from '../../components/inventoryCard/inventoryC import { RHSM_API_PATH_METRIC_TYPES, RHSM_API_QUERY_INVENTORY_SORT_DIRECTION_TYPES as SORT_DIRECTION_TYPES, - RHSM_API_QUERY_SET_TYPES + RHSM_API_QUERY_SET_TYPES, + RHSM_API_RESPONSE_HOSTS_DATA_TYPES as INVENTORY_TYPES } from '../../services/rhsm/rhsmConstants'; describe('Product OpenShift Metrics config', () => { @@ -116,33 +117,35 @@ describe('Product OpenShift Metrics config', () => { }); it('should apply hosts inventory configuration', () => { - const { initialInventoryFilters: initialFilters, inventoryHostsQuery: inventoryQuery } = config; + const { initialInventoryFilters: initialFilters, inventoryHostsQuery: inventoryQuery, productId } = config; const inventoryData = { - displayName: 'lorem', - inventoryId: 'lorem inventory id', - coreHours: 12.53, - lastSeen: '2022-01-01T00:00:00.000Z', + [INVENTORY_TYPES.DISPLAY_NAME]: 'lorem', + [INVENTORY_TYPES.INVENTORY_ID]: 'lorem inventory id', + [INVENTORY_TYPES.CORE_HOURS]: 12.53, + [INVENTORY_TYPES.LAST_SEEN]: '2022-01-01T00:00:00.000Z', loremIpsum: 'hello world' }; const filteredInventoryData = parseRowCellsListData({ filters: initialFilters, - cellData: inventoryData + cellData: inventoryData, + productId }); expect(filteredInventoryData).toMatchSnapshot('filtered'); const fallbackInventoryData = { ...inventoryData, - coreHours: null, - inventoryId: null, - lastSeen: null + [INVENTORY_TYPES.INVENTORY_ID]: null, + [INVENTORY_TYPES.CORE_HOURS]: null, + [INVENTORY_TYPES.LAST_SEEN]: null }; const fallbackFilteredInventoryData = parseRowCellsListData({ filters: initialFilters, - cellData: fallbackInventoryData + cellData: fallbackInventoryData, + productId }); expect(fallbackFilteredInventoryData).toMatchSnapshot('filtered, fallback display'); diff --git a/src/config/__tests__/product.rhel.test.js b/src/config/__tests__/product.rhel.test.js index 93b0e7868..a9098734d 100644 --- a/src/config/__tests__/product.rhel.test.js +++ b/src/config/__tests__/product.rhel.test.js @@ -4,6 +4,7 @@ import { parseRowCellsListData } from '../../components/inventoryCard/inventoryC import { RHSM_API_QUERY_INVENTORY_SORT_DIRECTION_TYPES as SORT_DIRECTION_TYPES, RHSM_API_QUERY_SET_TYPES, + RHSM_API_RESPONSE_HOSTS_DATA_TYPES as INVENTORY_TYPES, RHSM_API_RESPONSE_SUBSCRIPTIONS_DATA_TYPES as SUBSCRIPTIONS_INVENTORY_TYPES } from '../../services/rhsm/rhsmConstants'; @@ -16,37 +17,39 @@ describe('Product RHEL config', () => { }); it('should apply hosts inventory configuration', () => { - const { initialInventoryFilters: initialFilters, inventoryHostsQuery: inventoryQuery } = config; + const { initialInventoryFilters: initialFilters, inventoryHostsQuery: inventoryQuery, productId } = config; const inventoryData = { - displayName: 'lorem', - inventoryId: 'lorem inventory id', - hardwareType: 'ipsum', - measurementType: null, - numberOfGuests: 3, - sockets: 10, - cores: 12, - lastSeen: '2022-01-01T00:00:00.000Z', + [INVENTORY_TYPES.DISPLAY_NAME]: 'lorem', + [INVENTORY_TYPES.INVENTORY_ID]: 'lorem inventory id', + [INVENTORY_TYPES.HARDWARE_TYPE]: 'ipsum', + [INVENTORY_TYPES.MEASUREMENT_TYPE]: null, + [INVENTORY_TYPES.NUMBER_OF_GUESTS]: 3, + [INVENTORY_TYPES.SOCKETS]: 10, + [INVENTORY_TYPES.CORES]: 12, + [INVENTORY_TYPES.LAST_SEEN]: '2022-01-01T00:00:00.000Z', loremIpsum: 'hello world' }; const filteredInventoryData = parseRowCellsListData({ filters: initialFilters, - cellData: inventoryData + cellData: inventoryData, + productId }); expect(filteredInventoryData).toMatchSnapshot('filtered'); const fallbackInventoryData = { ...inventoryData, - inventoryId: null, - lastSeen: null, - cloudProvider: 'dolor sit' + [INVENTORY_TYPES.INVENTORY_ID]: null, + [INVENTORY_TYPES.LAST_SEEN]: null, + [INVENTORY_TYPES.CLOUD_PROVIDER]: 'dolor sit' }; const fallbackFilteredInventoryData = parseRowCellsListData({ filters: initialFilters, - cellData: fallbackInventoryData + cellData: fallbackInventoryData, + productId }); expect(fallbackFilteredInventoryData).toMatchSnapshot('filtered, fallback display'); diff --git a/src/config/__tests__/product.satellite.test.js b/src/config/__tests__/product.satellite.test.js index b83660a61..7096ecbad 100644 --- a/src/config/__tests__/product.satellite.test.js +++ b/src/config/__tests__/product.satellite.test.js @@ -3,7 +3,8 @@ import { generateChartSettings } from '../../components/graphCard/graphCardHelpe import { parseRowCellsListData } from '../../components/inventoryCard/inventoryCardHelpers'; import { RHSM_API_QUERY_INVENTORY_SORT_DIRECTION_TYPES as SORT_DIRECTION_TYPES, - RHSM_API_QUERY_SET_TYPES + RHSM_API_QUERY_SET_TYPES, + RHSM_API_RESPONSE_HOSTS_DATA_TYPES as INVENTORY_TYPES } from '../../services/rhsm/rhsmConstants'; describe('Product Satellite config', () => { @@ -15,37 +16,39 @@ describe('Product Satellite config', () => { }); it('should apply hosts inventory configuration', () => { - const { initialInventoryFilters: initialFilters, inventoryHostsQuery: inventoryQuery } = config; + const { initialInventoryFilters: initialFilters, inventoryHostsQuery: inventoryQuery, productId } = config; const inventoryData = { - displayName: 'lorem', - inventoryId: 'lorem inventory id', - hardwareType: 'ipsum', - measurementType: null, - numberOfGuests: 3, - sockets: 10, - cores: 12, - lastSeen: '2022-01-01T00:00:00.000Z', + [INVENTORY_TYPES.DISPLAY_NAME]: 'lorem', + [INVENTORY_TYPES.INVENTORY_ID]: 'lorem inventory id', + [INVENTORY_TYPES.HARDWARE_TYPE]: 'ipsum', + [INVENTORY_TYPES.MEASUREMENT_TYPE]: null, + [INVENTORY_TYPES.NUMBER_OF_GUESTS]: 3, + [INVENTORY_TYPES.SOCKETS]: 10, + [INVENTORY_TYPES.CORES]: 12, + [INVENTORY_TYPES.LAST_SEEN]: '2022-01-01T00:00:00.000Z', loremIpsum: 'hello world' }; const filteredInventoryData = parseRowCellsListData({ filters: initialFilters, - cellData: inventoryData + cellData: inventoryData, + productId }); expect(filteredInventoryData).toMatchSnapshot('filtered'); const fallbackInventoryData = { ...inventoryData, - inventoryId: null, - lastSeen: null, - cloudProvider: 'dolor sit' + [INVENTORY_TYPES.INVENTORY_ID]: null, + [INVENTORY_TYPES.LAST_SEEN]: null, + [INVENTORY_TYPES.CLOUD_PROVIDER]: 'dolor sit' }; const fallbackFilteredInventoryData = parseRowCellsListData({ filters: initialFilters, - cellData: fallbackInventoryData + cellData: fallbackInventoryData, + productId }); expect(fallbackFilteredInventoryData).toMatchSnapshot('filtered, fallback display'); diff --git a/src/config/product.openshiftContainer.js b/src/config/product.openshiftContainer.js index a810f1626..56a44fb57 100644 --- a/src/config/product.openshiftContainer.js +++ b/src/config/product.openshiftContainer.js @@ -15,6 +15,7 @@ import { RHSM_API_QUERY_INVENTORY_SUBSCRIPTIONS_SORT_TYPES as SUBSCRIPTIONS_SORT_TYPES, RHSM_API_QUERY_SET_TYPES, RHSM_API_QUERY_UOM_TYPES, + RHSM_API_RESPONSE_HOSTS_DATA_TYPES as INVENTORY_TYPES, RHSM_API_RESPONSE_SUBSCRIPTIONS_DATA_TYPES as SUBSCRIPTIONS_INVENTORY_TYPES, RHSM_INTERNAL_PRODUCT_DISPLAY_TYPES as DISPLAY_TYPES } from '../services/rhsm/rhsmConstants'; @@ -131,9 +132,15 @@ const config = { ], initialInventoryFilters: [ { - id: 'displayName', - cell: (data, session) => { - const { displayName = {}, inventoryId = {}, numberOfGuests = {} } = data; + id: INVENTORY_TYPES.DISPLAY_NAME, + cell: ( + { + [INVENTORY_TYPES.DISPLAY_NAME]: displayName = {}, + [INVENTORY_TYPES.INVENTORY_ID]: inventoryId = {}, + [INVENTORY_TYPES.NUMBER_OF_GUESTS]: numberOfGuests = {} + } = {}, + session + ) => { const { inventory: authorized } = session?.authorized || {}; if (!inventoryId.value) { @@ -169,27 +176,26 @@ const config = { isSortable: true }, { - id: 'sockets', - header: () => translate('curiosity-inventory.header', { context: ['sockets', 'OpenShift Container Platform'] }), + id: INVENTORY_TYPES.SOCKETS, isOptional: true, isSortable: true, isWrappable: true, cellWidth: 15 }, { - id: 'cores', - header: () => translate('curiosity-inventory.header', { context: ['cores', 'OpenShift Container Platform'] }), + id: INVENTORY_TYPES.CORES, isOptional: true, isSortable: true, isWrappable: true, cellWidth: 15 }, { - id: 'lastSeen', - cell: data => (data?.lastSeen?.value && ) || '', + id: INVENTORY_TYPES.LAST_SEEN, + cell: ({ [INVENTORY_TYPES.LAST_SEEN]: lastSeen } = {}) => + (lastSeen?.value && ) || '', isSortable: true, isWrappable: true, - cellWidth: 25 + cellWidth: 20 } ], initialInventorySettings: {}, diff --git a/src/config/product.openshiftDedicated.js b/src/config/product.openshiftDedicated.js index 3098d9aac..b78d99265 100644 --- a/src/config/product.openshiftDedicated.js +++ b/src/config/product.openshiftDedicated.js @@ -14,6 +14,7 @@ import { RHSM_API_QUERY_INVENTORY_SORT_DIRECTION_TYPES as SORT_DIRECTION_TYPES, RHSM_API_QUERY_INVENTORY_SORT_TYPES as INVENTORY_SORT_TYPES, RHSM_API_QUERY_SET_TYPES, + RHSM_API_RESPONSE_HOSTS_DATA_TYPES as INVENTORY_TYPES, RHSM_INTERNAL_PRODUCT_DISPLAY_TYPES as DISPLAY_TYPES } from '../services/rhsm/rhsmConstants'; import { ChartTypeVariant } from '../components/chart/chart'; @@ -87,10 +88,12 @@ const config = { }, initialInventoryFilters: [ { - id: 'displayName', - cell: (data = {}) => { - const { displayName = {}, inventoryId = {}, numberOfGuests = {} } = data; - + id: INVENTORY_TYPES.DISPLAY_NAME, + cell: ({ + [INVENTORY_TYPES.DISPLAY_NAME]: displayName = {}, + [INVENTORY_TYPES.INVENTORY_ID]: inventoryId = {}, + [INVENTORY_TYPES.NUMBER_OF_GUESTS]: numberOfGuests = {} + } = {}) => { if (!inventoryId.value) { return displayName.value; } @@ -101,9 +104,11 @@ const config = { {updatedDisplayName}{' '} {(numberOfGuests.value && - translate('curiosity-inventory.label', { context: 'numberOfGuests', count: numberOfGuests.value }, [ - - ])) || + translate( + 'curiosity-inventory.label', + { context: INVENTORY_TYPES.NUMBER_OF_GUESTS, count: numberOfGuests.value }, + [] + )) || ''} ); @@ -111,25 +116,25 @@ const config = { isSortable: true }, { - id: 'coreHours', - cell: data => - (typeof data?.coreHours?.value === 'number' && Number.parseFloat(data?.coreHours?.value).toFixed(2)) || `0.00`, + id: INVENTORY_TYPES.CORE_HOURS, + cell: ({ [INVENTORY_TYPES.CORE_HOURS]: coreHours }) => + (typeof coreHours?.value === 'number' && Number.parseFloat(coreHours?.value).toFixed(2)) || `0.00`, isSortable: true, isWrappable: true, cellWidth: 15 }, { - id: 'instanceHours', - cell: data => - (typeof data?.instanceHours?.value === 'number' && Number.parseFloat(data?.instanceHours?.value).toFixed(2)) || - `0.00`, + id: INVENTORY_TYPES.INSTANCE_HOURS, + cell: ({ [INVENTORY_TYPES.INSTANCE_HOURS]: instanceHours } = {}) => + (typeof instanceHours?.value === 'number' && Number.parseFloat(instanceHours?.value).toFixed(2)) || `0.00`, isSortable: true, isWrappable: true, cellWidth: 15 }, { - id: 'lastSeen', - cell: data => (data?.lastSeen?.value && ) || '', + id: INVENTORY_TYPES.LAST_SEEN, + cell: ({ [INVENTORY_TYPES.LAST_SEEN]: lastSeen } = {}) => + (lastSeen?.value && ) || '', isSortable: true, isWrappable: true, cellWidth: 15 diff --git a/src/config/product.openshiftMetrics.js b/src/config/product.openshiftMetrics.js index b3ab114b3..4a0a67620 100644 --- a/src/config/product.openshiftMetrics.js +++ b/src/config/product.openshiftMetrics.js @@ -12,6 +12,7 @@ import { RHSM_API_QUERY_INVENTORY_SORT_DIRECTION_TYPES as SORT_DIRECTION_TYPES, RHSM_API_QUERY_INVENTORY_SORT_TYPES as INVENTORY_SORT_TYPES, RHSM_API_QUERY_SET_TYPES, + RHSM_API_RESPONSE_HOSTS_DATA_TYPES as INVENTORY_TYPES, RHSM_INTERNAL_PRODUCT_DISPLAY_TYPES as DISPLAY_TYPES } from '../services/rhsm/rhsmConstants'; import { dateHelpers, helpers } from '../common'; @@ -74,10 +75,12 @@ const config = { }, initialInventoryFilters: [ { - id: 'displayName', - cell: (data = {}) => { - const { displayName = {}, inventoryId = {}, numberOfGuests = {} } = data; - + id: INVENTORY_TYPES.DISPLAY_NAME, + cell: ({ + [INVENTORY_TYPES.DISPLAY_NAME]: displayName = {}, + [INVENTORY_TYPES.INVENTORY_ID]: inventoryId = {}, + [INVENTORY_TYPES.NUMBER_OF_GUESTS]: numberOfGuests = {} + } = {}) => { if (!inventoryId.value) { return displayName.value; } @@ -98,19 +101,20 @@ const config = { isSortable: true }, { - id: 'coreHours', - cell: data => - (typeof data?.coreHours?.value === 'number' && Number.parseFloat(data?.coreHours?.value).toFixed(2)) || `0.00`, + id: INVENTORY_TYPES.CORE_HOURS, + cell: ({ [INVENTORY_TYPES.CORE_HOURS]: coreHours } = {}) => + (typeof coreHours?.value === 'number' && Number.parseFloat(coreHours?.value).toFixed(2)) || `0.00`, isSortable: true, isWrappable: true, cellWidth: 20 }, { - id: 'lastSeen', - cell: data => (data?.lastSeen?.value && ) || '', + id: INVENTORY_TYPES.LAST_SEEN, + cell: ({ [INVENTORY_TYPES.LAST_SEEN]: lastSeen } = {}) => + (lastSeen?.value && ) || '', isSortable: true, isWrappable: true, - cellWidth: 25 + cellWidth: 20 } ], initialToolbarFilters: undefined, diff --git a/src/config/product.rhel.js b/src/config/product.rhel.js index f2576e883..7bb594213 100644 --- a/src/config/product.rhel.js +++ b/src/config/product.rhel.js @@ -20,6 +20,7 @@ import { RHSM_API_QUERY_INVENTORY_SUBSCRIPTIONS_SORT_TYPES as SUBSCRIPTIONS_SORT_TYPES, RHSM_API_QUERY_SET_TYPES, RHSM_API_QUERY_UOM_TYPES, + RHSM_API_RESPONSE_HOSTS_DATA_TYPES as INVENTORY_TYPES, RHSM_API_RESPONSE_SUBSCRIPTIONS_DATA_TYPES as SUBSCRIPTIONS_INVENTORY_TYPES, RHSM_INTERNAL_PRODUCT_DISPLAY_TYPES as DISPLAY_TYPES } from '../services/rhsm/rhsmConstants'; @@ -142,9 +143,15 @@ const config = { ], initialInventoryFilters: [ { - id: 'displayName', - cell: (data, session) => { - const { displayName = {}, inventoryId = {}, numberOfGuests = {} } = data; + id: INVENTORY_TYPES.DISPLAY_NAME, + cell: ( + { + [INVENTORY_TYPES.DISPLAY_NAME]: displayName = {}, + [INVENTORY_TYPES.INVENTORY_ID]: inventoryId = {}, + [INVENTORY_TYPES.NUMBER_OF_GUESTS]: numberOfGuests = {} + } = {}, + session + ) => { const { inventory: authorized } = session?.authorized || {}; if (!inventoryId.value) { @@ -180,33 +187,34 @@ const config = { isSortable: true }, { - id: 'measurementType', - cell: (data = {}) => { - const { cloudProvider = {}, measurementType = {} } = data; - return ( - - {translate('curiosity-inventory.measurementType', { context: measurementType.value })}{' '} - {(cloudProvider.value && ( - - {translate('curiosity-inventory.cloudProvider', { context: cloudProvider.value })} - - )) || - ''} - - ); - }, + id: INVENTORY_TYPES.MEASUREMENT_TYPE, + cell: ({ + [INVENTORY_TYPES.CLOUD_PROVIDER]: cloudProvider, + [INVENTORY_TYPES.MEASUREMENT_TYPE]: measurementType + } = {}) => ( + + {translate('curiosity-inventory.measurementType', { context: measurementType?.value })}{' '} + {(cloudProvider?.value && ( + + {translate('curiosity-inventory.cloudProvider', { context: cloudProvider?.value })} + + )) || + ''} + + ), isSortable: true, cellWidth: 20 }, { - id: 'sockets', + id: INVENTORY_TYPES.SOCKETS, isSortable: true, isWrappable: true, cellWidth: 15 }, { - id: 'lastSeen', - cell: data => (data?.lastSeen?.value && ) || '', + id: INVENTORY_TYPES.LAST_SEEN, + cell: ({ [INVENTORY_TYPES.LAST_SEEN]: lastSeen } = {}) => + (lastSeen?.value && ) || '', isSortable: true, isWrappable: true, cellWidth: 15 diff --git a/src/config/product.satellite.js b/src/config/product.satellite.js index 86caae3f6..775d2df0c 100644 --- a/src/config/product.satellite.js +++ b/src/config/product.satellite.js @@ -18,6 +18,7 @@ import { RHSM_API_QUERY_INVENTORY_SORT_TYPES as INVENTORY_SORT_TYPES, RHSM_API_QUERY_INVENTORY_SUBSCRIPTIONS_SORT_TYPES as SUBSCRIPTIONS_SORT_TYPES, RHSM_API_QUERY_SET_TYPES, + RHSM_API_RESPONSE_HOSTS_DATA_TYPES as INVENTORY_TYPES, RHSM_INTERNAL_PRODUCT_DISPLAY_TYPES as DISPLAY_TYPES } from '../services/rhsm/rhsmConstants'; import { dateHelpers, helpers } from '../common'; @@ -131,9 +132,15 @@ const config = { ], initialInventoryFilters: [ { - id: 'displayName', - cell: (data, session) => { - const { displayName = {}, inventoryId = {}, numberOfGuests = {} } = data; + id: INVENTORY_TYPES.DISPLAY_NAME, + cell: ( + { + [INVENTORY_TYPES.DISPLAY_NAME]: displayName = {}, + [INVENTORY_TYPES.INVENTORY_ID]: inventoryId = {}, + [INVENTORY_TYPES.NUMBER_OF_GUESTS]: numberOfGuests = {} + } = {}, + session + ) => { const { inventory: authorized } = session?.authorized || {}; if (!inventoryId.value) { @@ -169,33 +176,34 @@ const config = { isSortable: true }, { - id: 'measurementType', - cell: (data = {}) => { - const { cloudProvider = {}, measurementType = {} } = data; - return ( - - {translate('curiosity-inventory.measurementType', { context: measurementType.value })}{' '} - {(cloudProvider.value && ( - - {translate('curiosity-inventory.cloudProvider', { context: cloudProvider.value })} - - )) || - ''} - - ); - }, + id: INVENTORY_TYPES.MEASUREMENT_TYPE, + cell: ({ + [INVENTORY_TYPES.CLOUD_PROVIDER]: cloudProvider, + [INVENTORY_TYPES.MEASUREMENT_TYPE]: measurementType + } = {}) => ( + + {translate('curiosity-inventory.measurementType', { context: measurementType?.value })}{' '} + {(cloudProvider?.value && ( + + {translate('curiosity-inventory.cloudProvider', { context: cloudProvider?.value })} + + )) || + ''} + + ), isSortable: true, cellWidth: 20 }, { - id: 'sockets', + id: INVENTORY_TYPES.SOCKETS, isSortable: true, isWrappable: true, cellWidth: 15 }, { - id: 'lastSeen', - cell: data => (data?.lastSeen?.value && ) || '', + id: INVENTORY_TYPES.LAST_SEEN, + cell: ({ [INVENTORY_TYPES.LAST_SEEN]: lastSeen }) => + (lastSeen?.value && ) || '', isSortable: true, isWrappable: true, cellWidth: 15 diff --git a/src/services/rhsm/__tests__/__snapshots__/rhsmConstants.test.js.snap b/src/services/rhsm/__tests__/__snapshots__/rhsmConstants.test.js.snap index 9d67513d6..30fdfb03c 100644 --- a/src/services/rhsm/__tests__/__snapshots__/rhsmConstants.test.js.snap +++ b/src/services/rhsm/__tests__/__snapshots__/rhsmConstants.test.js.snap @@ -47,6 +47,16 @@ exports[`RHSM Constants should have specific properties: all exported constants "QUARTERLY": "Quarterly", "WEEKLY": "Weekly", }, + "RHSM_API_QUERY_INVENTORY_HOSTS_SORT_TYPES": { + "CORES": "cores", + "CORE_HOURS": "core_hours", + "HARDWARE": "hardware_type", + "INSTANCE_HOURS": "instance_hours", + "LAST_SEEN": "last_seen", + "MEASUREMENT": "measurement_type", + "NAME": "display_name", + "SOCKETS": "sockets", + }, "RHSM_API_QUERY_INVENTORY_SORT_DIRECTION_TYPES": { "ASCENDING": "asc", "DESCENDING": "desc", @@ -161,8 +171,10 @@ exports[`RHSM Constants should have specific properties: all exported constants "RHSM_API_RESPONSE_HOSTS_DATA_TYPES": { "CLOUD_PROVIDER": "cloud_provider", "CORES": "cores", + "CORE_HOURS": "core_hours", "DISPLAY_NAME": "display_name", "HARDWARE_TYPE": "hardware_type", + "INSTANCE_HOURS": "instance_hours", "INVENTORY_ID": "inventory_id", "LAST_SEEN": "last_seen", "MEASUREMENT_TYPE": "measurement_type", @@ -304,6 +316,16 @@ exports[`RHSM Constants should have specific properties: all exported constants "QUARTERLY": "Quarterly", "WEEKLY": "Weekly", }, + "RHSM_API_QUERY_INVENTORY_HOSTS_SORT_TYPES": { + "CORES": "cores", + "CORE_HOURS": "core_hours", + "HARDWARE": "hardware_type", + "INSTANCE_HOURS": "instance_hours", + "LAST_SEEN": "last_seen", + "MEASUREMENT": "measurement_type", + "NAME": "display_name", + "SOCKETS": "sockets", + }, "RHSM_API_QUERY_INVENTORY_SORT_DIRECTION_TYPES": { "ASCENDING": "asc", "DESCENDING": "desc", @@ -418,8 +440,10 @@ exports[`RHSM Constants should have specific properties: all exported constants "RHSM_API_RESPONSE_HOSTS_DATA_TYPES": { "CLOUD_PROVIDER": "cloud_provider", "CORES": "cores", + "CORE_HOURS": "core_hours", "DISPLAY_NAME": "display_name", "HARDWARE_TYPE": "hardware_type", + "INSTANCE_HOURS": "instance_hours", "INVENTORY_ID": "inventory_id", "LAST_SEEN": "last_seen", "MEASUREMENT_TYPE": "measurement_type", @@ -562,6 +586,16 @@ exports[`RHSM Constants should have specific properties: all exported constants "QUARTERLY": "Quarterly", "WEEKLY": "Weekly", }, + "RHSM_API_QUERY_INVENTORY_HOSTS_SORT_TYPES": { + "CORES": "cores", + "CORE_HOURS": "core_hours", + "HARDWARE": "hardware_type", + "INSTANCE_HOURS": "instance_hours", + "LAST_SEEN": "last_seen", + "MEASUREMENT": "measurement_type", + "NAME": "display_name", + "SOCKETS": "sockets", + }, "RHSM_API_QUERY_INVENTORY_SORT_DIRECTION_TYPES": { "ASCENDING": "asc", "DESCENDING": "desc", @@ -676,8 +710,10 @@ exports[`RHSM Constants should have specific properties: all exported constants "RHSM_API_RESPONSE_HOSTS_DATA_TYPES": { "CLOUD_PROVIDER": "cloud_provider", "CORES": "cores", + "CORE_HOURS": "core_hours", "DISPLAY_NAME": "display_name", "HARDWARE_TYPE": "hardware_type", + "INSTANCE_HOURS": "instance_hours", "INVENTORY_ID": "inventory_id", "LAST_SEEN": "last_seen", "MEASUREMENT_TYPE": "measurement_type", @@ -824,6 +860,16 @@ exports[`RHSM Constants should have specific properties: specific constants 1`] "QUARTERLY": "Quarterly", "WEEKLY": "Weekly", }, + "RHSM_API_QUERY_INVENTORY_HOSTS_SORT_TYPES": { + "CORES": "cores", + "CORE_HOURS": "core_hours", + "HARDWARE": "hardware_type", + "INSTANCE_HOURS": "instance_hours", + "LAST_SEEN": "last_seen", + "MEASUREMENT": "measurement_type", + "NAME": "display_name", + "SOCKETS": "sockets", + }, "RHSM_API_QUERY_INVENTORY_SORT_DIRECTION_TYPES": { "ASCENDING": "asc", "DESCENDING": "desc", @@ -938,8 +984,10 @@ exports[`RHSM Constants should have specific properties: specific constants 1`] "RHSM_API_RESPONSE_HOSTS_DATA_TYPES": { "CLOUD_PROVIDER": "cloud_provider", "CORES": "cores", + "CORE_HOURS": "core_hours", "DISPLAY_NAME": "display_name", "HARDWARE_TYPE": "hardware_type", + "INSTANCE_HOURS": "instance_hours", "INVENTORY_ID": "inventory_id", "LAST_SEEN": "last_seen", "MEASUREMENT_TYPE": "measurement_type", diff --git a/src/services/rhsm/__tests__/__snapshots__/rhsmTransformers.test.js.snap b/src/services/rhsm/__tests__/__snapshots__/rhsmTransformers.test.js.snap index 520b47ffa..15ff25cb7 100644 --- a/src/services/rhsm/__tests__/__snapshots__/rhsmTransformers.test.js.snap +++ b/src/services/rhsm/__tests__/__snapshots__/rhsmTransformers.test.js.snap @@ -655,8 +655,10 @@ exports[`RHSM Transformers should attempt to parse an hosts response: hosts 1`] "data": [ { "numberOfGuests": 2, + "number_of_guests": 2, "sockets": 1000, "subscriptionManagerId": undefined, + "subscription_manager_id": undefined, }, ], "meta": { diff --git a/src/services/rhsm/rhsmConstants.js b/src/services/rhsm/rhsmConstants.js index 9ab38665c..eb41027e5 100644 --- a/src/services/rhsm/rhsmConstants.js +++ b/src/services/rhsm/rhsmConstants.js @@ -101,14 +101,17 @@ const RHSM_API_RESPONSE_ERRORS_CODE_TYPES = { /** * RHSM response Hosts DATA types. * - * @type {{MEASUREMENT_TYPE: string, CORES: string, HARDWARE_TYPE: string, SUBSCRIPTION_MANAGER_ID: string, SOCKETS: string, - * INVENTORY_ID: string, NUMBER_OF_GUESTS: string, DISPLAY_NAME: string, CLOUD_PROVIDER: string, LAST_SEEN: string}} + * @type {{MEASUREMENT_TYPE: string, CORES: string, CORE_HOURS: string, HARDWARE_TYPE: string, + * SUBSCRIPTION_MANAGER_ID: string, INSTANCE_HOURS: string, SOCKETS: string, INVENTORY_ID: string, NUMBER_OF_GUESTS: string, + * DISPLAY_NAME: string, CLOUD_PROVIDER: string, LAST_SEEN: string}} */ const RHSM_API_RESPONSE_HOSTS_DATA_TYPES = { + CORE_HOURS: 'core_hours', CORES: 'cores', CLOUD_PROVIDER: 'cloud_provider', DISPLAY_NAME: 'display_name', HARDWARE_TYPE: 'hardware_type', + INSTANCE_HOURS: 'instance_hours', INVENTORY_ID: 'inventory_id', LAST_SEEN: 'last_seen', MEASUREMENT_TYPE: 'measurement_type', @@ -326,16 +329,31 @@ const RHSM_API_QUERY_CATEGORY_TYPES = { const RHSM_API_QUERY_GRANULARITY_TYPES = RHSM_API_RESPONSE_GRANULARITY_TYPES; /** - * ToDo: Clean up sort params once hosts is fully deprecated - * These sort params are focused on the instances api NOT hosts. Since there - * are minor differences, hosts sort params are maintained in /types/rhsmApiTypes.js as - * we migrate towards hosts deprecation. Subscriptions sorts + * ToDo: Remove RHSM_API_QUERY_INVENTORY_HOSTS_SORT_TYPES once hosts is fully deprecated + * These sort params are focused on the hosts api. */ /** * RHSM API query/search parameter SORT type values for HOSTS. * - * @type {{CORES: string, STORAGE_GIBIBYTES: string, SOCKETS: string, INSTANCE_HOURS: string, - * TRANSFER_GIBIBYTES: string, BILLING_PROVIDER: string, CORE_SECONDS: string, LAST_SEEN: string, NAME: string}} + * @type {{CORES: string, CORE_HOURS: string, HARDWARE: string, INSTANCE_HOURS: string, SOCKETS: string, MEASUREMENT: string, + * LAST_SEEN: string, NAME: string}} + */ +const RHSM_API_QUERY_INVENTORY_HOSTS_SORT_TYPES = { + CORES: 'cores', + CORE_HOURS: 'core_hours', + HARDWARE: 'hardware_type', + INSTANCE_HOURS: 'instance_hours', + LAST_SEEN: 'last_seen', + MEASUREMENT: 'measurement_type', + NAME: 'display_name', + SOCKETS: 'sockets' +}; + +/** + * RHSM API query/search parameter SORT type values for general inventory displays. + * + * @type {{CORES: string, STORAGE_GIBIBYTES: string, SOCKETS: string, INSTANCE_HOURS: string, TRANSFER_GIBIBYTES: string, + * BILLING_PROVIDER: string, CORE_SECONDS: string, STORAGE_GIBIBYTE_MONTHS: string, LAST_SEEN: string, NAME: string}} */ const RHSM_API_QUERY_INVENTORY_SORT_TYPES = { ...RHSM_API_PATH_METRIC_TYPES, @@ -447,8 +465,9 @@ const RHSM_INTERNAL_PRODUCT_DISPLAY_TYPES = { * START_DATE: string, BILLING_PROVIDER: string}, RHSM_API_RESPONSE_DATA: string, * RHSM_API_RESPONSE_SUBSCRIPTIONS_META_TYPES: {PRODUCT: string, SUBSCRIPTION_TYPE: string, COUNT: string}, * RHSM_API_PATH_METRIC_TYPES: {CORES: string, STORAGE_GIBIBYTES: string, SOCKETS: string, INSTANCE_HOURS: string, - * TRANSFER_GIBIBYTES: string, CORE_SECONDS: string, STORAGE_GIBIBYTE_MONTHS: string}, RHSM_API_RESPONSE_TALLY_DATA_TYPES: {DATE: string, - * HAS_DATA: string, VALUE: string}, RHSM_API_RESPONSE_INSTANCES_META_TYPES: {MEASUREMENTS: string, PRODUCT: string, COUNT: string}, + * TRANSFER_GIBIBYTES: string, CORE_SECONDS: string, STORAGE_GIBIBYTE_MONTHS: string}, + * RHSM_API_RESPONSE_TALLY_DATA_TYPES: {DATE: string, HAS_DATA: string, VALUE: string}, + * RHSM_API_RESPONSE_INSTANCES_META_TYPES: {MEASUREMENTS: string, PRODUCT: string, COUNT: string}, * RHSM_API_RESPONSE_INSTANCES_DATA_TYPES: {MEASUREMENTS: string, BILLING_ACCOUNT_ID: string, SUBSCRIPTION_MANAGER_ID: string, * INVENTORY_ID: string, NUMBER_OF_GUESTS: string, BILLING_PROVIDER: string, DISPLAY_NAME: string, LAST_SEEN: string}, * RHSM_API_RESPONSE_SLA_TYPES: {PREMIUM: string, SELF: string, NONE: string, STANDARD: string}, @@ -463,20 +482,21 @@ const RHSM_INTERNAL_PRODUCT_DISPLAY_TYPES = { * LAST_SEEN: string}, RHSM_API_QUERY_INVENTORY_SORT_DIRECTION_TYPES: {ASCENDING: string, DESCENDING: string}, * RHSM_API_RESPONSE_SUBSCRIPTION_TYPES: {ANNUAL: string, ON_DEMAND: string}, RHSM_API_QUERY_INVENTORY_SORT_TYPES: {CORES: string, * STORAGE_GIBIBYTES: string, SOCKETS: string, INSTANCE_HOURS: string, TRANSFER_GIBIBYTES: string, BILLING_PROVIDER: string, - * CORE_SECONDS: string, LAST_SEEN: string, NAME: string}, RHSM_API_PATH_PRODUCT_TYPES: {RHEL_ARM: string, OPENSHIFT_METRICS: string, - * SATELLITE: string, RHEL_WORKSTATION: string, RHODS: string, RHOSAK: string, RHEL_COMPUTE_NODE: string, RHEL_X86: string, - * OPENSHIFT: string, SATELLITE_SERVER: string, OPENSHIFT_DEDICATED_METRICS: string, RHEL_DESKTOP: string, RHEL: string, - * SATELLITE_CAPSULE: string, RHEL_SERVER: string, RHEL_IBM_Z: string, RHACS: string, RHEL_IBM_POWER: string}, - * RHSM_API_RESPONSE_BILLING_PROVIDER_TYPES: {AZURE: string, GCP: string, RED_HAT: string, NONE: string, AWS: string, ORACLE: string}, - * RHSM_API_RESPONSE_ERRORS_TYPES: {CODE: string}, RHSM_API_QUERY_BILLING_PROVIDER_TYPES: {AZURE: string, GCP: string, RED_HAT: string, - * NONE: string, AWS: string, ORACLE: string}, RHSM_API_QUERY_CATEGORY_TYPES: {CLOUD: string, PHYSICAL: string, HYPERVISOR: string, - * VIRTUAL: string}, RHSM_API_QUERY_USAGE_TYPES: {UNSPECIFIED: string, DISASTER: string, DEVELOPMENT: string, PRODUCTION: string}, + * CORE_SECONDS: string, STORAGE_GIBIBYTE_MONTHS: string, LAST_SEEN: string, NAME: string}, + * RHSM_API_PATH_PRODUCT_TYPES: {RHEL_ARM: string, OPENSHIFT_METRICS: string, SATELLITE: string, RHEL_WORKSTATION: string, + * RHODS: string, RHOSAK: string, RHEL_COMPUTE_NODE: string, RHEL_X86: string, OPENSHIFT: string, SATELLITE_SERVER: string, + * OPENSHIFT_DEDICATED_METRICS: string, RHEL_DESKTOP: string, RHEL: string, SATELLITE_CAPSULE: string, RHEL_SERVER: string, + * RHEL_IBM_Z: string, RHACS: string, RHEL_IBM_POWER: string}, RHSM_API_RESPONSE_BILLING_PROVIDER_TYPES: {AZURE: string, + * GCP: string, RED_HAT: string, NONE: string, AWS: string, ORACLE: string}, RHSM_API_RESPONSE_ERRORS_TYPES: {CODE: string}, + * RHSM_API_QUERY_BILLING_PROVIDER_TYPES: {AZURE: string, GCP: string, RED_HAT: string, NONE: string, AWS: string, ORACLE: string}, + * RHSM_API_QUERY_CATEGORY_TYPES: {CLOUD: string, PHYSICAL: string, HYPERVISOR: string, VIRTUAL: string}, + * RHSM_API_QUERY_USAGE_TYPES: {UNSPECIFIED: string, DISASTER: string, DEVELOPMENT: string, PRODUCTION: string}, * RHSM_API_QUERY_SLA_TYPES: {PREMIUM: string, SELF: string, NONE: string, STANDARD: string}, * RHSM_API_QUERY_SET_INVENTORY_TYPES: {UOM: string, BILLING_ACCOUNT_ID: string, USAGE: string, DIRECTION: string, SORT: string, - * END_DATE: string, OFFSET: string, SLA: string, LIMIT: string, START_DATE: string, BILLING_PROVIDER: string, DISPLAY_NAME: string}, - * RHSM_API_RESPONSE_HOSTS_DATA_TYPES: {MEASUREMENT_TYPE: string, CORES: string, HARDWARE_TYPE: string, - * SUBSCRIPTION_MANAGER_ID: string, SOCKETS: string, INVENTORY_ID: string, NUMBER_OF_GUESTS: string, DISPLAY_NAME: string, - * CLOUD_PROVIDER: string, LAST_SEEN: string}, RHSM_API_RESPONSE_ERRORS: string, + * END_DATE: string, OFFSET: string, SLA: string, LIMIT: string, START_DATE: string, BILLING_PROVIDER: string, + * DISPLAY_NAME: string}, RHSM_API_RESPONSE_HOSTS_DATA_TYPES: {MEASUREMENT_TYPE: string, CORES: string, CORE_HOURS: string, + * HARDWARE_TYPE: string, SUBSCRIPTION_MANAGER_ID: string, INSTANCE_HOURS: string, SOCKETS: string, INVENTORY_ID: string, + * NUMBER_OF_GUESTS: string, DISPLAY_NAME: string, CLOUD_PROVIDER: string, LAST_SEEN: string}, RHSM_API_RESPONSE_ERRORS: string, * RHSM_API_RESPONSE_TALLY_META_TYPES: {TOTAL_MONTHLY: string, DATE: string, PRODUCT: string, HAS_CLOUDIGRADE_DATA: string, * HAS_CLOUDIGRADE_MISMATCH: string, HAS_DATA: string, METRIC_ID: string, COUNT: string, VALUE: string}, * RHSM_API_QUERY_UOM_TYPES: {CORES: string, SOCKETS: string}, RHSM_API_RESPONSE_META: string, @@ -485,8 +505,10 @@ const RHSM_INTERNAL_PRODUCT_DISPLAY_TYPES = { * OFFSET: string, SLA: string, LIMIT: string, START_DATE: string, DISPLAY_NAME: string}, * RHSM_API_QUERY_INVENTORY_SUBSCRIPTIONS_SORT_TYPES: {QUANTITY: string, USAGE: string, NEXT_EVENT_TYPE: string, * NEXT_EVENT_DATE: string, TOTAL_CAPACITY: string, PRODUCT_NAME: string, SKU: string, SERVICE_LEVEL: string}, - * RHSM_INTERNAL_PRODUCT_DISPLAY_TYPES: {DUAL_AXES: string, LEGACY: string, HOURLY: string}, - * RHSM_API_RESPONSE_USAGE_TYPES: {UNSPECIFIED: string, DISASTER: string, DEVELOPMENT: string, PRODUCTION: string}}} + * RHSM_INTERNAL_PRODUCT_DISPLAY_TYPES: {LEGACY: string, DUAL_AXES: string, PARTIAL: string, HOURLY: string}, + * RHSM_API_RESPONSE_USAGE_TYPES: {UNSPECIFIED: string, DISASTER: string, DEVELOPMENT: string, PRODUCTION: string}, + * RHSM_API_QUERY_INVENTORY_HOSTS_SORT_TYPES: {CORES: string, CORE_HOURS: string, HARDWARE: string, INSTANCE_HOURS: string, + * SOCKETS: string, MEASUREMENT: string, LAST_SEEN: string, NAME: string}}} */ const rhsmConstants = { RHSM_API_PATH_PRODUCT_TYPES, @@ -515,6 +537,7 @@ const rhsmConstants = { RHSM_API_RESPONSE_USAGE_TYPES, RHSM_API_QUERY_CATEGORY_TYPES, RHSM_API_QUERY_GRANULARITY_TYPES, + RHSM_API_QUERY_INVENTORY_HOSTS_SORT_TYPES, RHSM_API_QUERY_INVENTORY_SORT_TYPES, RHSM_API_QUERY_INVENTORY_SORT_DIRECTION_TYPES, RHSM_API_QUERY_INVENTORY_SUBSCRIPTIONS_SORT_TYPES, @@ -557,6 +580,7 @@ export { RHSM_API_RESPONSE_USAGE_TYPES, RHSM_API_QUERY_CATEGORY_TYPES, RHSM_API_QUERY_GRANULARITY_TYPES, + RHSM_API_QUERY_INVENTORY_HOSTS_SORT_TYPES, RHSM_API_QUERY_INVENTORY_SORT_TYPES, RHSM_API_QUERY_INVENTORY_SORT_DIRECTION_TYPES, RHSM_API_QUERY_INVENTORY_SUBSCRIPTIONS_SORT_TYPES, diff --git a/src/services/rhsm/rhsmTransformers.js b/src/services/rhsm/rhsmTransformers.js index 29469d1d2..4d8eb8ae2 100644 --- a/src/services/rhsm/rhsmTransformers.js +++ b/src/services/rhsm/rhsmTransformers.js @@ -104,6 +104,8 @@ const rhsmHosts = response => { [HOSTS_DATA_TYPES.SUBSCRIPTION_MANAGER_ID]: subscriptionManagerId, ...dataResponse }) => ({ + [HOSTS_DATA_TYPES.NUMBER_OF_GUESTS]: numberOfGuests, + [HOSTS_DATA_TYPES.SUBSCRIPTION_MANAGER_ID]: subscriptionManagerId, numberOfGuests, subscriptionManagerId, ...dataResponse diff --git a/tests/__snapshots__/code.test.js.snap b/tests/__snapshots__/code.test.js.snap index ece4cabae..da653fc1b 100644 --- a/tests/__snapshots__/code.test.js.snap +++ b/tests/__snapshots__/code.test.js.snap @@ -2,7 +2,8 @@ exports[`General code checks should only have specific console.[warn|log|info|error] methods: console methods 1`] = ` [ - "components/inventoryCard/inventoryCardContext.js:168: console.warn(\`Sorting can only be performed on select fields, confirm field \${id} is allowed.\`);", + "components/inventoryCard/inventoryCardContext.js:169: console.warn(\`Sorting can only be performed on select fields, confirm field \${id} is allowed.\`);", + "components/inventoryCard/inventoryCardContext.js:231: console.warn(\`Sorting can only be performed on select fields, confirm field \${id} is allowed.\`);", "components/inventoryCard/inventoryCardHelpers.js:87: console.warn(\`Warning: Filter "\${id}" not found in "table row" response data.\`, cellData);", "components/inventoryCard/inventoryList.deprecated.js:62: console.warn(\`Sorting can only be performed on select fields, confirm field \${id} is allowed.\`);", "components/inventoryCardSubscriptions/inventoryCardSubscriptionsContext.js:127: console.warn(\`Sorting can only be performed on select fields, confirm field \${id} is allowed.\`);",