diff --git a/backend/dataall/base/api/__init__.py b/backend/dataall/base/api/__init__.py index 4aef8e332..36f7a275a 100644 --- a/backend/dataall/base/api/__init__.py +++ b/backend/dataall/base/api/__init__.py @@ -12,6 +12,7 @@ from dataall.base.api import gql from dataall.base.api.constants import GraphQLEnumMapper +from dataall.base.api.queries import enumsQuery def bootstrap(): diff --git a/backend/dataall/base/api/queries.py b/backend/dataall/base/api/queries.py new file mode 100644 index 000000000..6401fff0b --- /dev/null +++ b/backend/dataall/base/api/queries.py @@ -0,0 +1,11 @@ +from dataall.base.api import gql +from dataall.base.api.resolvers import enum_resolver +from dataall.base.api.types import EnumResult + +enumsQuery = gql.QueryField( + name='queryEnums', + args=[gql.Argument(name='enums_names', type=gql.ArrayType(gql.String))], + type=gql.ArrayType(EnumResult), + resolver=enum_resolver, + test_scope='Enums', +) diff --git a/backend/dataall/base/api/resolvers.py b/backend/dataall/base/api/resolvers.py new file mode 100644 index 000000000..e59165d46 --- /dev/null +++ b/backend/dataall/base/api/resolvers.py @@ -0,0 +1,14 @@ +from dataall.base.api.constants import GraphQLEnumMapper + + +def enum_resolver(context, source, enums_names): + result = [] + for enum_class in GraphQLEnumMapper.__subclasses__(): + if enum_class.__name__ in enums_names: + result.append( + { + 'name': enum_class.__name__, + 'items': [{'name': item.name, 'value': str(item.value)} for item in enum_class], + } + ) + return result diff --git a/backend/dataall/base/api/types.py b/backend/dataall/base/api/types.py new file mode 100644 index 000000000..8d0236d64 --- /dev/null +++ b/backend/dataall/base/api/types.py @@ -0,0 +1,17 @@ +from dataall.base.api import gql + +EnumItem = gql.ObjectType( + name='EnumItem', + fields=[ + gql.Field(name='name', type=gql.String), + gql.Field(name='value', type=gql.String), + ], +) + +EnumResult = gql.ObjectType( + name='EnumResult', + fields=[ + gql.Field(name='name', type=gql.String), + gql.Field(name='items', type=gql.ArrayType(EnumItem)), + ], +) diff --git a/frontend/src/modules/Maintenance/components/MaintenanceViewer.js b/frontend/src/modules/Maintenance/components/MaintenanceViewer.js index 8fcf252f0..a4048dba9 100644 --- a/frontend/src/modules/Maintenance/components/MaintenanceViewer.js +++ b/frontend/src/modules/Maintenance/components/MaintenanceViewer.js @@ -27,16 +27,11 @@ import { startMaintenanceWindow, startReindexCatalog } from '../services'; -import { useClient } from 'services'; +import { useClient, fetchEnums } from 'services'; import { SET_ERROR, useDispatch } from 'globalErrors'; import { useSnackbar } from 'notistack'; import { ModuleNames, isModuleEnabled } from 'utils'; -const maintenanceModes = [ - { value: 'READ-ONLY', label: 'Read-Only' }, - { value: 'NO-ACCESS', label: 'No-Access' } -]; - const START_MAINTENANCE = 'Start Maintenance'; const END_MAINTENANCE = 'End Maintenance'; export const PENDING_STATUS = 'PENDING'; @@ -314,11 +309,25 @@ export const MaintenanceViewer = () => { useState(START_MAINTENANCE); const [maintenanceWindowStatus, setMaintenanceWindowStatus] = useState(INACTIVE_STATUS); + const [maintenanceModes, setMaintenanceModes] = useState([]); const [dropDownStatus, setDropDownStatus] = useState(false); const [refreshingTimer, setRefreshingTimer] = useState(''); const { enqueueSnackbar, closeSnackbar } = useSnackbar(); const dispatch = useDispatch(); + const fetchMaintenanceModes = async () => { + const maintenanceModesEnum = await fetchEnums(client, ['MaintenanceModes']); + if (maintenanceModesEnum['MaintenanceModes'].length > 0) { + setMaintenanceModes( + maintenanceModesEnum['MaintenanceModes'].map((elem) => { + return { label: elem.value, value: elem.name }; + }) + ); + } else { + dispatch({ type: SET_ERROR, error: 'Could not fetch maintenance modes' }); + } + }; + const refreshMaintenanceView = async () => { setUpdating(true); setRefreshing(true); @@ -468,6 +477,9 @@ export const MaintenanceViewer = () => { initializeMaintenanceView().catch((e) => dispatch({ type: SET_ERROR, e }) ); + fetchMaintenanceModes().catch((e) => + dispatch({ type: SET_ERROR, error: e.message }) + ); const setTimer = setInterval(() => { refreshStatus().catch((e) => dispatch({ type: SET_ERROR, error: e.message }) diff --git a/frontend/src/services/graphql/Shared/getEnumByName.js b/frontend/src/services/graphql/Shared/getEnumByName.js new file mode 100644 index 000000000..a24742df4 --- /dev/null +++ b/frontend/src/services/graphql/Shared/getEnumByName.js @@ -0,0 +1,36 @@ +import { gql } from 'apollo-boost'; + +const getEnumByName = ({ enum_names }) => ({ + variables: { + enum_names: enum_names + }, + query: gql` + query queryEnums($enum_names: [String]) { + queryEnums(enums_names: $enum_names) { + name + items { + name + value + } + } + } + ` +}); + +/// function to fetch multiple enums +/// output -- dictionary +// { +// 'enumName': [{name: '...', value: '..'}] +// } +export const fetchEnums = async (client, enum_names) => { + const response = await client.query( + getEnumByName({ enum_names: enum_names }) + ); + if (!response.errors && response.data.queryEnums != null) { + return Object.assign( + {}, + ...response.data.queryEnums.map((x) => ({ [x.name]: x.items })) + ); + } + return {}; +}; diff --git a/frontend/src/services/graphql/Shared/index.js b/frontend/src/services/graphql/Shared/index.js new file mode 100644 index 000000000..af6921f17 --- /dev/null +++ b/frontend/src/services/graphql/Shared/index.js @@ -0,0 +1 @@ +export * from './getEnumByName'; diff --git a/frontend/src/services/graphql/index.js b/frontend/src/services/graphql/index.js index ce1c3fba2..144c217fe 100644 --- a/frontend/src/services/graphql/index.js +++ b/frontend/src/services/graphql/index.js @@ -13,6 +13,7 @@ export * from './Notification'; export * from './Organization'; export * from './Principal'; export * from './SavedQuery'; +export * from './Shared'; export * from './Search'; export * from './ShareObject'; export * from './Stack';