web-interface.assets.bb8c8232-9201.254dbea333abf953c23e.js.map Maven / Gradle / Ivy
{"version":3,"file":"bb8c8232-9201.254dbea333abf953c23e.js","mappings":"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","sources":["webpack://graylog-web-interface/./src/components/common/PageNavigation.tsx","webpack://graylog-web-interface/./src/components/indices/IndexSetFieldTypeProfiles/hooks/useProfile.ts","webpack://graylog-web-interface/./src/components/indices/IndexSetFieldTypeProfiles/hooks/useProfileOptions.ts","webpack://graylog-web-interface/./src/components/indices/Types.ts","webpack://graylog-web-interface/./src/components/indices/helpers/isIndexFieldTypeChangeAllowed.ts","webpack://graylog-web-interface/./src/components/indices/IndexRangeSummary.jsx","webpack://graylog-web-interface/./src/components/indices/ClosedIndexDetails.jsx","webpack://graylog-web-interface/./src/stores/indices/IndexRangesStore.ts","webpack://graylog-web-interface/./src/components/indices/IndexDetails.tsx","webpack://graylog-web-interface/./src/components/indices/IndicesConfigurationDropdown.tsx","webpack://graylog-web-interface/./src/components/indices/hooks/useIndexDefaults.ts","webpack://graylog-web-interface/./src/components/indices/data-tiering/DataTieringConfiguration.tsx","webpack://graylog-web-interface/./src/components/indices/data-tiering/DataTieringSummary.tsx","webpack://graylog-web-interface/./src/components/indices/data-tiering/DataTieringVisualisation.tsx","webpack://graylog-web-interface/./src/components/indices/data-tiering/types.ts","webpack://graylog-web-interface/./src/components/indices/IndexSetProfileConfiguration.tsx","webpack://graylog-web-interface/./src/components/indices/hooks/useIndexSet.ts","webpack://graylog-web-interface/./src/components/indices/IndexSetConfigurationForm.tsx","webpack://graylog-web-interface/./src/components/indices/IndexSetDeletionForm.jsx","webpack://graylog-web-interface/./src/components/indices/StyledIndexSetDetailsRow.tsx","webpack://graylog-web-interface/./src/components/indices/IndexSetDetails.tsx","webpack://graylog-web-interface/./src/components/indices/IndexSetsComponent.tsx","webpack://graylog-web-interface/./src/components/indices/IndexSizeSummary.jsx","webpack://graylog-web-interface/./src/components/indices/IndexSummary.jsx","webpack://graylog-web-interface/./src/stores/indices/DeflectorStore.js","webpack://graylog-web-interface/./src/components/indices/IndicesMaintenanceDropdown.tsx","webpack://graylog-web-interface/./src/components/indices/IndicesOverview.tsx","webpack://graylog-web-interface/./src/components/indices/IndicesConfiguration.tsx","webpack://graylog-web-interface/./src/components/indices/IndicesPageNavigation.tsx","webpack://graylog-web-interface/./src/components/indices/ShardMeter.jsx","webpack://graylog-web-interface/./src/components/indices/ShardRouting.tsx","webpack://graylog-web-interface/./src/components/indices/ShardRoutingOverview.jsx","webpack://graylog-web-interface/./src/hooks/useHasTypeMappingPermission.ts","webpack://graylog-web-interface/./src/stores/indices/IndexSetsStore.ts"],"sourcesContent":["/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport * as React from 'react';\nimport styled, { css } from 'styled-components';\n\nimport { Button, ButtonToolbar } from 'components/bootstrap';\nimport { LinkContainer } from 'components/common/router';\nimport { IfPermitted } from 'components/common';\nimport NavItemStateIndicator, {\n hoverIndicatorStyles,\n activeIndicatorStyles,\n} from 'components/common/NavItemStateIndicator';\n\nconst Container = styled(ButtonToolbar)`\n margin-bottom: 10px;\n`;\n\nconst StyledButton = styled(Button)(({ theme }) => css`\n font-family: ${theme.fonts.family.navigation};\n font-size: ${theme.fonts.size.navigation};\n color: ${theme.colors.variant.darker.default};\n \n &:hover,\n &:focus {\n background: inherit;\n text-decoration: none;\n }\n\n &:hover {\n color: inherit;\n ${hoverIndicatorStyles(theme)}\n }\n\n &.active {\n color: ${theme.colors.global.textDefault};\n\n ${activeIndicatorStyles(theme)}\n\n &:hover,\n &:focus {\n ${activeIndicatorStyles(theme)}\n }\n`);\n\nStyledButton.displayName = 'Button';\n\ntype Props = {\n /**\n * List of nav items. Define permissions, if the item should only be displayed for users with specific permissions.\n * By default, an item is active if the current URL starts with the item URL.\n * If you only want to display an item as active only when its path matches exactly, set `exactPathMatch` to true.\n */\n items: Array<{\n title: string,\n path: string,\n permissions?: string | Array\n exactPathMatch?: boolean,\n }>\n}\n\n/**\n * Simple tab navigation to allow navigating to subareas of a page.\n */\nconst PageNavigation = ({ items }: Props) => (\n \n {items.map(({ path, title, permissions, exactPathMatch }) => {\n if (!path) {\n return null;\n }\n\n return (\n \n \n \n \n {title}\n \n \n \n \n );\n })}\n \n);\n\nexport default PageNavigation;\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport { useQuery } from '@tanstack/react-query';\n\nimport UserNotification from 'util/UserNotification';\nimport fetch from 'logic/rest/FetchProvider';\nimport { qualifyUrl } from 'util/URLUtils';\nimport type {\n IndexSetFieldTypeProfileJson,\n IndexSetFieldTypeProfile,\n} from 'components/indices/IndexSetFieldTypeProfiles/types';\n\nconst INITIAL_DATA: IndexSetFieldTypeProfile = {\n customFieldMappings: [],\n name: null,\n id: null,\n description: null,\n indexSetIds: [],\n};\n\nconst fetchIndexSetFieldTypeProfile = async (id: string) => {\n const url = qualifyUrl(`/system/indices/index_sets/profiles/${id}`);\n\n return fetch('GET', url).then((profile: IndexSetFieldTypeProfileJson) => ({\n id: profile.id,\n name: profile.name,\n description: profile.description,\n customFieldMappings: profile.custom_field_mappings,\n indexSetIds: profile.index_set_ids,\n }));\n};\n\nconst useProfile = (id: string): {\n data: IndexSetFieldTypeProfile,\n isFetched: boolean,\n isFetching: boolean,\n refetch: () => void,\n} => {\n const { data, isFetched, isFetching, refetch } = useQuery(\n ['indexSetFieldTypeProfile', id],\n () => fetchIndexSetFieldTypeProfile(id),\n {\n onError: (errorThrown) => {\n UserNotification.error(`Loading index field type profile failed with status: ${errorThrown}`,\n 'Could not load index field type profile');\n },\n keepPreviousData: true,\n enabled: !!id,\n },\n );\n\n return ({\n data: data ?? INITIAL_DATA,\n isFetched,\n isFetching,\n refetch,\n });\n};\n\nexport default useProfile;\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport { useQuery } from '@tanstack/react-query';\n\nimport { qualifyUrl } from 'util/URLUtils';\nimport fetch from 'logic/rest/FetchProvider';\nimport type { ProfileOptions } from 'components/indices/IndexSetFieldTypeProfiles/types';\nimport UserNotification from 'util/UserNotification';\n\nconst INITIAL_DATA = [];\n\nconst fetchProfileOptions = async () => {\n const url = qualifyUrl('/system/indices/index_sets/profiles/all');\n\n return fetch('GET', url).then((profiles: Array<{name: string, id: string }>) => profiles\n .map(({ name, id }) => ({ value: id, label: name })));\n};\n\nconst useProfileOptions = (): {\n options: ProfileOptions,\n isLoading: boolean,\n refetch: () => void,\n} => {\n const { data, isLoading, refetch } = useQuery(\n ['indexSetFieldTypeProfileOptions'],\n () => fetchProfileOptions(),\n {\n onError: (errorThrown) => {\n UserNotification.error(`Loading index field type profile options failed with status: ${errorThrown}`,\n 'Could not load index field type profile options');\n },\n keepPreviousData: true,\n },\n );\n\n return ({\n options: data ?? INITIAL_DATA,\n isLoading,\n refetch,\n });\n};\n\nexport default useProfileOptions;\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport PropTypes from 'prop-types';\n\nexport type MaintenanceOptions = {\n strategies: Array\n}\n\nexport type IndicesConfigurationActionsType = {\n loadRotationStrategies: () => Promise,\n loadRetentionStrategies: () => Promise,\n};\n\nexport interface RotationStrategyContext {\n time_size_optimizing_retention_fixed_leeway?: string,\n}\n\nexport type IndicesConfigurationStoreState = {\n activeRotationConfig: any,\n rotationStrategies: any,\n activeRetentionConfig: any,\n retentionStrategies: any,\n retentionStrategiesContext: RetentionStrategyContext,\n rotationStrategiesContext: RotationStrategyContext,\n}\nexport type SizeBasedRotationStrategyConfig = {\n type: string,\n max_size: number,\n}\nexport type MessageCountRotationStrategyConfig = {\n type: string,\n max_docs_per_index: number,\n}\nexport type TimeBasedRotationStrategyConfig = {\n type: string,\n rotation_period?: string,\n max_rotation_period?: string,\n rotate_empty_index_set?: boolean,\n}\nexport type TimeBasedSizeOptimizingRotationStrategyConfig = {\n type: string,\n index_lifetime_max?: string,\n index_lifetime_min?: string,\n}\nexport type RotationStrategyConfig =\n SizeBasedRotationStrategyConfig\n | MessageCountRotationStrategyConfig\n | TimeBasedRotationStrategyConfig;\nexport type RetentionStrategyConfig = {\n type?: string,\n max_number_of_indices?: number,\n index_action?: string,\n}\n\nexport interface JsonSchemaStringPropertyType {\n type: string,\n}\n\nexport interface JsonSchemaIndexActionPropertyType {\n type: string,\n\n enum: Array,\n}\n\nexport interface JsonSchemaBooleanPropertyType {\n type: string;\n}\n\nexport interface RotationProperties {\n rotation_period?: JsonSchemaStringPropertyType,\n\n max_rotation_period?: JsonSchemaStringPropertyType,\n\n type: JsonSchemaStringPropertyType,\n\n max_size?: JsonSchemaStringPropertyType,\n\n rotate_empty_index_set?: JsonSchemaBooleanPropertyType,\n\n index_lifetime_max?: JsonSchemaBooleanPropertyType,\n\n index_lifetime_min?: JsonSchemaBooleanPropertyType,\n}\n\nexport interface RotationJsonSchema {\n type: string,\n\n id: string,\n\n properties: RotationProperties,\n}\n\nexport interface RetentionProperties {\n max_number_of_indices: JsonSchemaStringPropertyType,\n\n type: JsonSchemaStringPropertyType,\n\n index_action?: JsonSchemaIndexActionPropertyType,\n}\n\nexport interface RetentionJsonSchema {\n type: string,\n\n id: string,\n\n properties: RetentionProperties,\n}\n\nexport interface RotationStrategy {\n type: string,\n\n default_config: RotationStrategyConfig,\n\n json_schema: RotationJsonSchema,\n}\n\nexport interface RetentionStrategy {\n type?: string,\n\n default_config?: RetentionStrategyConfig,\n\n json_schema?: RetentionJsonSchema,\n}\n\nexport interface RetentionStrategyContext {\n max_index_retention_period?: string,\n}\n\nexport interface RotationStrategyResponse {\n total: number,\n\n context: RotationStrategyContext,\n\n strategies: Array,\n}\n\nexport interface RetentionStrategyResponse {\n total: number,\n\n strategies: Array,\n\n context: RetentionStrategyContext,\n}\n\nexport type JsonSchema = RotationJsonSchema | RetentionJsonSchema\n\nexport type Strategy = RotationStrategy | RetentionStrategy\n\nexport type Strategies = Array\n\nexport type StrategyConfig = RotationStrategyConfig | RetentionStrategyConfig\n\nexport const RetentionStrategiesContextPropType = PropTypes.exact({\n max_index_retention_period: PropTypes.string,\n});\nexport const SizeBasedRotationStrategyConfigPropType = PropTypes.exact({\n type: PropTypes.string,\n max_size: PropTypes.number,\n});\nexport const MessageCountRotationStrategyConfigPropType = PropTypes.exact({\n type: PropTypes.string,\n max_docs_per_index: PropTypes.number,\n});\nexport const TimeBasedRotationStrategyConfigPropType = PropTypes.exact({\n type: PropTypes.string,\n rotation_period: PropTypes.string,\n max_rotation_period: PropTypes.string,\n rotate_empty_index_set: PropTypes.bool,\n});\n\nexport const TimeBasedSizePtimizingRotationStrategyConfigPropType = PropTypes.exact({\n type: PropTypes.string,\n index_lifetime_max: PropTypes.string,\n index_lifetime_min: PropTypes.string,\n});\nexport const RotationStrategyConfigPropType = PropTypes.oneOfType([\n SizeBasedRotationStrategyConfigPropType,\n MessageCountRotationStrategyConfigPropType,\n TimeBasedRotationStrategyConfigPropType,\n TimeBasedSizePtimizingRotationStrategyConfigPropType,\n]);\n\nexport const IndexActionPropType = PropTypes.string;\nexport const RetentionStrategyConfigPropType = PropTypes.shape({\n type: PropTypes.string.isRequired,\n max_number_of_indices: PropTypes.number,\n index_action: PropTypes.string,\n});\n\nexport const JsonSchemaStringPropertyTypePropType = PropTypes.exact({\n type: PropTypes.string.isRequired,\n});\nexport const JsonSchemaIndexActionPropertyTypePropType = PropTypes.exact({\n type: PropTypes.string.isRequired,\n enum: PropTypes.arrayOf(PropTypes.string).isRequired,\n});\nexport const RotationPropertiesPropType = PropTypes.exact({\n rotation_period: JsonSchemaStringPropertyTypePropType,\n max_rotation_period: JsonSchemaStringPropertyTypePropType,\n type: JsonSchemaStringPropertyTypePropType.isRequired,\n max_size: JsonSchemaStringPropertyTypePropType,\n max_docs_per_index: JsonSchemaStringPropertyTypePropType,\n rotate_empty_index_set: JsonSchemaStringPropertyTypePropType,\n index_lifetime_max: JsonSchemaStringPropertyTypePropType,\n index_lifetime_min: JsonSchemaStringPropertyTypePropType,\n});\nexport const RotationJsonSchemaPropType = PropTypes.exact({\n type: PropTypes.string.isRequired,\n id: PropTypes.string,\n properties: RotationPropertiesPropType.isRequired,\n});\nexport const RetentionPropertiesPropType = PropTypes.exact({\n max_number_of_indices: JsonSchemaStringPropertyTypePropType.isRequired,\n type: JsonSchemaStringPropertyTypePropType.isRequired,\n index_action: JsonSchemaIndexActionPropertyTypePropType,\n});\nexport const RetentionJsonSchemaPropType = PropTypes.exact({\n type: PropTypes.string.isRequired,\n id: PropTypes.string,\n properties: RetentionPropertiesPropType,\n});\nexport const RotationStrategyPropType = PropTypes.exact({\n type: PropTypes.string.isRequired,\n default_config: RotationStrategyConfigPropType.isRequired,\n json_schema: RotationJsonSchemaPropType.isRequired,\n});\nexport const RetentionStrategyPropType = PropTypes.exact({\n type: PropTypes.string.isRequired,\n default_config: RetentionStrategyConfigPropType.isRequired,\n json_schema: RetentionJsonSchemaPropType.isRequired,\n});\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\n\nimport type { IndexSet } from 'stores/indices/IndexSetsStore';\n\nconst TEMPLATE_TYPES = ['failures', 'events'];\nconst isIndexFieldTypeChangeAllowed = (indexSet: IndexSet) => !TEMPLATE_TYPES.includes(indexSet?.index_template_type);\n\nexport default isIndexFieldTypeChangeAllowed;\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport PropTypes from 'prop-types';\nimport React from 'react';\n\nimport RelativeTime from 'components/common/RelativeTime';\n\nclass IndexRangeSummary extends React.Component {\n static propTypes = {\n indexRange: PropTypes.object,\n };\n\n render() {\n const { indexRange } = this.props;\n\n if (!indexRange) {\n return No index range available.;\n }\n\n return (\n Range re-calculated{' '}\n {' '}\n in {indexRange.took_ms}ms.\n \n );\n }\n}\n\nexport default IndexRangeSummary;\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport PropTypes from 'prop-types';\nimport React from 'react';\n\nimport { Alert, Button } from 'components/bootstrap';\nimport IndexRangeSummary from 'components/indices/IndexRangeSummary';\nimport { IndicesActions } from 'stores/indices/IndicesStore';\n\nclass ClosedIndexDetails extends React.Component {\n static propTypes = {\n indexName: PropTypes.string.isRequired,\n indexRange: PropTypes.object,\n };\n\n _onReopen = () => {\n IndicesActions.reopen(this.props.indexName);\n };\n\n _onDeleteIndex = () => {\n if (window.confirm(`Really delete index ${this.props.indexName}?`)) {\n IndicesActions.delete(this.props.indexName);\n }\n };\n\n render() {\n const { indexRange } = this.props;\n\n return (\n \n \n \n This index is closed. Index information is not available{' '}\n at the moment, please reopen the index and try again.\n \n\n
\n\n {' '}\n \n \n );\n }\n}\n\nexport default ClosedIndexDetails;\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport Reflux from 'reflux';\n\nimport UserNotification from 'util/UserNotification';\nimport * as URLUtils from 'util/URLUtils';\nimport ApiRoutes from 'routing/ApiRoutes';\nimport fetch from 'logic/rest/FetchProvider';\nimport { singletonStore, singletonActions } from 'logic/singleton';\n\nexport type IndexRange = {\n index_name: string,\n begin: string,\n end: string,\n calculated_at: string,\n took_ms: number,\n};\n\ntype IndexRangesActionsType = {\n list: () => Promise,\n recalculate: (indexSetId: string) => Promise,\n recalculateIndex: (indexName: string) => Promise,\n}\nexport const IndexRangesActions = singletonActions(\n 'core.IndexRanges',\n () => Reflux.createActions({\n list: { asyncResult: true },\n recalculate: { asyncResult: true },\n recalculateIndex: { asyncResult: true },\n }),\n);\n\nexport const IndexRangesStore = singletonStore(\n 'core.IndexRanges',\n () => Reflux.createStore({\n listenables: [IndexRangesActions],\n indexRanges: undefined,\n\n getInitialState() {\n return { indexRanges: this.indexRanges };\n },\n init() {\n IndexRangesActions.list();\n },\n list() {\n const url = URLUtils.qualifyUrl(ApiRoutes.IndexRangesApiController.list().url);\n const promise = fetch('GET', url).then((response) => {\n this.indexRanges = response.ranges;\n\n this.trigger(this.getInitialState());\n });\n\n IndexRangesActions.list.promise(promise);\n },\n recalculate(indexSetId) {\n const url = URLUtils.qualifyUrl(ApiRoutes.IndexRangesApiController.rebuild(indexSetId).url);\n const promise = fetch('POST', url);\n\n promise\n .then(UserNotification.success('Index ranges will be recalculated shortly'))\n .catch((error) => {\n UserNotification.error(`Could not create a job to start index ranges recalculation, reason: ${error}`,\n 'Error starting index ranges recalculation');\n });\n\n IndexRangesActions.recalculate.promise(promise);\n },\n recalculateIndex(indexName) {\n const url = URLUtils.qualifyUrl(ApiRoutes.IndexRangesApiController.rebuildSingle(indexName).url);\n const promise = fetch('POST', url);\n\n promise\n .then(UserNotification.success(`Index ranges for ${indexName} will be recalculated shortly`))\n .catch((error) => {\n UserNotification.error(`Could not create a job to start index ranges recalculation for ${indexName}, reason: ${error}`,\n `Error starting index ranges recalculation for ${indexName}`);\n });\n\n IndexRangesActions.recalculateIndex.promise(promise);\n },\n }),\n);\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport PropTypes from 'prop-types';\nimport React, { useCallback, useEffect, useMemo } from 'react';\n\nimport HideOnCloud from 'util/conditional/HideOnCloud';\nimport NumberUtils from 'util/NumberUtils';\nimport { Col, Row, Button } from 'components/bootstrap';\nimport { Spinner } from 'components/common';\nimport { IndexRangeSummary, ShardMeter, ShardRoutingOverview } from 'components/indices';\nimport type { IndexInfo } from 'stores/indices/IndicesStore';\nimport type { IndexRange } from 'stores/indices/IndexRangesStore';\nimport { IndexRangesActions } from 'stores/indices/IndexRangesStore';\nimport { IndicesActions } from 'stores/indices/IndicesStore';\n\ntype Props = {\n index: IndexInfo,\n indexName: string,\n indexRange: IndexRange,\n indexSetId: string,\n isDeflector: boolean,\n};\n\nconst IndexDetails = ({ index, indexName, indexRange, indexSetId, isDeflector }: Props) => {\n useEffect(() => {\n IndicesActions.subscribe(indexName);\n\n return () => {\n IndicesActions.unsubscribe(indexName);\n };\n }, [indexName]);\n\n const _onRecalculateIndex = useCallback(() => {\n // eslint-disable-next-line no-alert\n if (window.confirm(`Really recalculate the index ranges for index ${indexName}?`)) {\n IndexRangesActions.recalculateIndex(indexName).then(() => {\n IndicesActions.list(indexSetId);\n });\n }\n }, [indexName, indexSetId]);\n\n const _onDeleteIndex = useCallback(() => {\n // eslint-disable-next-line no-alert\n if (window.confirm(`Really delete index ${indexName}?`)) {\n IndicesActions.delete(indexName).then(() => {\n IndicesActions.list(indexSetId);\n });\n }\n }, [indexName, indexSetId]);\n\n const actionButtons = useMemo(() => {\n if (isDeflector) {\n return (\n \n \n \n );\n }\n\n return (\n \n {' '}\n \n \n );\n }, [isDeflector, _onDeleteIndex, _onRecalculateIndex]);\n\n if (!index || !index.all_shards) {\n return ;\n }\n\n return (\n \n {' '}\n\n \n {NumberUtils.formatNumber(index.all_shards.segments)} segments,{' '}\n {NumberUtils.formatNumber(index.all_shards.open_search_contexts)} open search contexts,{' '}\n {NumberUtils.formatNumber(index.all_shards.documents.deleted)} deleted messages\n \n \n \n \n \n \n \n
\n \n \n
\n\n {actionButtons}\n \n );\n};\n\nIndexDetails.propTypes = {\n index: PropTypes.object.isRequired,\n indexName: PropTypes.string.isRequired,\n indexRange: PropTypes.object.isRequired,\n indexSetId: PropTypes.string.isRequired,\n isDeflector: PropTypes.bool.isRequired,\n};\n\nexport default IndexDetails;\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport React, { useCallback } from 'react';\n\nimport useHistory from 'routing/useHistory';\nimport { ButtonGroup, DropdownButton, MenuItem } from 'components/bootstrap';\nimport Routes from 'routing/Routes';\nimport useHasTypeMappingPermission from 'hooks/useHasTypeMappingPermission';\n\nconst IndicesConfigurationDropdown = ({ indexSetId }: { indexSetId: string }) => {\n const hasMappingPermission = useHasTypeMappingPermission();\n const history = useHistory();\n const onShowFieldTypes = useCallback(() => {\n history.push(Routes.SYSTEM.INDEX_SETS.FIELD_TYPES(indexSetId));\n }, [history, indexSetId]);\n\n if (!hasMappingPermission) return null;\n\n return (\n \n \n {hasMappingPermission && }\n \n \n );\n};\n\nexport default IndicesConfigurationDropdown;\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport { useQuery } from '@tanstack/react-query';\n\nimport UserNotification from 'util/UserNotification';\nimport fetch from 'logic/rest/FetchProvider';\nimport { qualifyUrl } from 'util/URLUtils';\nimport ApiRoutes from 'routing/ApiRoutes';\nimport type { IndexSetsDefaultConfiguration } from 'stores/indices/IndexSetsStore';\n\nconst fetchIndexDefaults: () => Promise = () => fetch('GET', qualifyUrl(`${ApiRoutes.ClusterConfigResource.config().url}/org.graylog2.configuration.IndexSetsDefaultConfiguration`));\n\nconst useIndexDefaults = () => {\n const { data, isLoading } = useQuery(\n ['index-defaults'],\n fetchIndexDefaults,\n {\n onError: (fetchError: Error) => {\n UserNotification.error(`Error fetching index defaults: ${fetchError.message}`);\n },\n retry: 1,\n },\n );\n\n return {\n loadingIndexDefaultsConfig: isLoading,\n indexDefaultsConfig: data,\n };\n};\n\nexport default useIndexDefaults;\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport React from 'react';\nimport moment from 'moment';\nimport { useFormikContext } from 'formik';\nimport { PluginStore } from 'graylog-web-plugin/plugin';\n\nimport type { IndexSet, IndexSetFormValues } from 'stores/indices/IndexSetsStore';\nimport { FormikFormGroup, FormikInput } from 'components/common';\nimport { Input } from 'components/bootstrap';\nimport { DATA_TIERING_TYPE } from 'components/indices/data-tiering';\n\nconst dayFields = ['index_lifetime_max', 'index_lifetime_min', 'index_hot_lifetime_min'];\nconst hotWarmOnlyFormFields = ['index_hot_lifetime_min', 'warm_tier_enabled', 'warm_tier_repository_name'];\n\nexport const durationToRoundedDays = (duration: string) => Math.round(moment.duration(duration).asDays());\n\nexport const prepareDataTieringInitialValues = (values: IndexSet) : IndexSetFormValues => {\n if (!values.data_tiering) return values as unknown as IndexSetFormValues;\n\n let { data_tiering } = values;\n\n dayFields.forEach((field) => {\n if (data_tiering[field]) {\n const numberValue = durationToRoundedDays(data_tiering[field]);\n data_tiering = { ...data_tiering, [field]: numberValue };\n }\n });\n\n return { ...values, data_tiering } as unknown as IndexSetFormValues;\n};\n\nexport const prepareDataTieringConfig = (values: IndexSetFormValues, pluginStore) : IndexSet => {\n if (!values.data_tiering) return values as unknown as IndexSet;\n\n const hotWarmDefaultValues = {\n archive_before_deletion: false,\n warm_tier_enabled: false,\n warm_tier_repository_name: null,\n };\n\n const dataTieringPlugin = pluginStore.exports('dataTiering').find((plugin) => (plugin.type === DATA_TIERING_TYPE.HOT_WARM));\n const dataTieringType = dataTieringPlugin?.type ?? DATA_TIERING_TYPE.HOT_ONLY;\n\n let { data_tiering } = values;\n\n if (dataTieringType === DATA_TIERING_TYPE.HOT_WARM) {\n data_tiering = { ...hotWarmDefaultValues, ...data_tiering };\n }\n\n if (dataTieringType === DATA_TIERING_TYPE.HOT_ONLY) {\n hotWarmOnlyFormFields.forEach((field) => {\n delete data_tiering[field];\n });\n }\n\n dayFields.forEach((field) => {\n if (data_tiering[field]) {\n data_tiering = { ...data_tiering, [field]: `P${data_tiering[field]}D` };\n }\n });\n\n data_tiering = { ...data_tiering, type: dataTieringType };\n\n return { ...values, data_tiering } as unknown as IndexSet;\n};\n\nconst DataTieringConfiguration = () => {\n const dataTieringPlugin = PluginStore.exports('dataTiering').find((plugin) => (plugin.type === 'hot_warm'));\n\n const { values } = useFormikContext();\n\n const validateMaxDaysInStorage = (value) => {\n if (value < 0) {\n return 'Negative numbers are not allowed.';\n }\n\n return '';\n };\n\n const validateMinDaysInStorage = (value) => {\n const errors = [];\n\n if (value < 0) {\n errors.push('Negative numbers are not allowed.');\n }\n\n if (value > values?.data_tiering?.index_lifetime_max) {\n errors.push('Min. days in storage needs to be smaller than max. days in storage.');\n }\n\n if (values?.data_tiering?.warm_tier_enabled && value < values?.data_tiering?.index_hot_lifetime_min) {\n errors.push('Min. days in storage needs to be bigger than min. days in hot tier.');\n }\n\n if (errors.length > 0) {\n return errors.join(' ');\n }\n\n return '';\n };\n\n return (\n <>\n \n \n\n {dataTieringPlugin && (\n <>\n \n \n \n \n >\n )}\n >\n );\n};\n\nexport default DataTieringConfiguration;\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport React from 'react';\n\nimport type { DataTieringConfig } from 'components/indices/data-tiering';\nimport { durationToRoundedDays } from 'components/indices/data-tiering';\n\ntype Props = {\n config: DataTieringConfig\n}\n\nconst DataTieringSummary = ({ config } : Props) => (\n \n \n - Rotation strategy:
\n - Data Tiering
\n - Max. in storage:
\n - {durationToRoundedDays(config.index_lifetime_max)} days
\n - Min. in storage:
\n - {durationToRoundedDays(config.index_lifetime_min)} days
\n
\n \n);\n\nexport default DataTieringSummary;\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport React, { useState } from 'react';\nimport styled, { css, useTheme } from 'styled-components';\n\nimport { Tooltip } from 'components/bootstrap';\n\ntype Props = {\n minDays?: number,\n maxDays?: number,\n minDaysInHot?: number,\n warmTierEnabled?: boolean,\n archiveData?: boolean,\n}\n\ntype BarProps = {\n value: number,\n color: string\n}\n\ntype LabelProps = {\n value: number,\n}\n\nconst VisualisationWrapper = styled.div(({ theme }) => css`\n padding-left: ${theme.spacings.md};\n padding-right: ${theme.spacings.md};\n display: flex;\n align-items: center;\n justify-content: space-between;\n`);\n\nconst BarWrapper = styled.div`\n overflow: hidden;\n width: 100%;\n`;\n\nconst MaxDaysLabel = styled.p(({ theme }) => css`\n margin-left: ${theme.spacings.sm};\n margin-bottom: 0;\n`);\n\nconst AnnotationBar = styled.div`\n position: relative;\n height: 60px;\n`;\n\nconst LifeCycleBar = styled.div(({ theme }) => css`\n height: 40px;\n background: ${theme.colors.variant.lighter.info};\n position: relative;\n`);\n\nconst Bar = styled.div(({ theme, value, color }) => css`\n height: 100%;\n font-size: ${theme.fonts.size.small};\n text-align: center;\n flex-shrink: 0;\n background-color: ${color};\n transition: width 500ms ease-in-out;\n position: absolute;\n left: 0;\n width: ${value}%;\n max-width: 100%;\n cursor: pointer;\n\n &::after {\n border-right: 1px solid ${theme.colors.variant.darkest.info};\n content: '';\n position: absolute;\n right: 0;\n bottom: 0;\n height: 60px;\n z-index: 1;\n }\n`);\n\nconst Label = styled.div(({ value }) => css`\n position: absolute;\n bottom: 25px;\n ${value > 3\n ? `right: ${100 - value}%;`\n : 'left: 0;'}\n`);\n\nconst StyledTooltip = styled(Tooltip)(({ value }) => css`\n position: absolute;\n top: 0;\n \n ${value > 12\n ? `\n right: ${100 - value}%;\n\n &.bottom > .tooltip-arrow {\n margin-left: -20px;\n }\n `\n : `\n left: 0;\n margin-left: 3px;\n `} \n`);\n\nconst DataTieringVisualisation = ({ archiveData, minDays, maxDays, minDaysInHot, warmTierEnabled }: Props) => {\n const [showMinDaysTooltip, setShowMinDaysTooltip] = useState(false);\n const [showMinDaysInHotTooltip, setShowMinDaysInHotTooltip] = useState(false);\n const theme = useTheme();\n\n const percentageFor = (days: number) => {\n if (days <= 0 || maxDays <= 0) return 0;\n\n return ((days / maxDays) * 100);\n };\n\n const minDaysPercentage = percentageFor(minDays);\n const minDaysInHotPercentage = percentageFor(minDaysInHot);\n\n const showHotTier = warmTierEnabled && minDaysInHotPercentage > 0;\n\n return (\n \n \n \n {minDaysPercentage > 0 && ()}\n {showHotTier && (minDaysInHotPercentage !== minDaysPercentage) && (\n \n )}\n \n\n \n setShowMinDaysTooltip(true)}\n onMouseLeave={() => setShowMinDaysTooltip(false)} />\n {showHotTier && (\n setShowMinDaysInHotTooltip(true)}\n onMouseLeave={() => setShowMinDaysInHotTooltip(false)} />\n )}\n \n \n {showHotTier && showMinDaysInHotTooltip && (\n minDaysInHotPercentage === minDaysPercentage ? (\n \n Min. # of days in Hot Tier and storage\n \n ) : (\n \n Min. # of days in Hot Tier\n \n )\n )}\n {minDaysPercentage > 0 && showMinDaysTooltip && (\n \n Min. # of days in storage\n \n )}\n \n \n {archiveData ? 'Archived and deleted' : 'Deleted'} after {maxDays} days \n \n );\n};\n\nexport default DataTieringVisualisation;\n\nDataTieringVisualisation.defaultProps = {\n minDays: 0,\n maxDays: 0,\n minDaysInHot: 0,\n warmTierEnabled: false,\n archiveData: false,\n};\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nexport const DATA_TIERING_TYPE = {\n HOT_ONLY: 'hot_only',\n HOT_WARM: 'hot_warm',\n} as const;\n\nexport type DataTieringType = typeof DATA_TIERING_TYPE[keyof typeof DATA_TIERING_TYPE];\n\nexport type DataTieringConfig = {\n type: DataTieringType\n index_lifetime_min: string,\n index_lifetime_max: string,\n index_hot_lifetime_min?: string,\n warm_tier_enabled?: boolean,\n archive_before_deletion?: boolean,\n warm_tier_repository_name?: string | null,\n}\n\nexport type DataTieringFormValues = {\n type: DataTieringType\n index_lifetime_min: number,\n index_lifetime_max: number,\n index_hot_lifetime_min?: number,\n warm_tier_enabled: boolean,\n archive_before_deletion: boolean,\n warm_tier_repository_name?: string | null,\n}\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport React from 'react';\nimport { styled } from 'styled-components';\n\nimport { Alert, Col, Input, Row } from 'components/bootstrap';\nimport { Select } from 'components/common';\nimport Routes from 'routing/Routes';\nimport { Link } from 'components/common/router';\nimport useProfileOptions from 'components/indices/IndexSetFieldTypeProfiles/hooks/useProfileOptions';\n\nconst StyledAlert = styled(Alert)`\n overflow: auto;\n margin-right: 15px;\n margin-left: 15px;\n`;\nconst StyledSelect = styled(Select)`\n margin-bottom: 10px;\n`;\nconst StyledH3 = styled.h3`\n margin-bottom: 10px;\n`;\n\nconst IndexSetProfileConfiguration = ({ value, onChange, name }: { name: string, value: string, onChange: (value: string | null) => void }) => {\n const { isLoading, options } = useProfileOptions();\n const _onChange = (val: string) => onChange(val || null);\n\n return (\n \n Index Set Profile \n \n With index set field type profiles you can bundle up custom field types into profiles.\n You can assign any profile to this index set. To see and use profile setting for index set, you have to rotate indices.\n \n \n \n \n \n \n \n
\n \n );\n};\n\nexport default IndexSetProfileConfiguration;\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\n\nimport { useEffect, useState } from 'react';\nimport type { Dispatch, SetStateAction } from 'react';\nimport moment from 'moment';\n\nimport useIndexDefaults from 'components/indices/hooks/useIndexDefaults';\nimport type { IndexSet } from 'stores/indices/IndexSetsStore';\nimport type {\n RotationStrategyConfig,\n RetentionStrategyConfig,\n} from 'components/indices/Types';\n\nconst useIndexSet = (initialIndexSet?: IndexSet) :[IndexSet, Dispatch>] => {\n const { loadingIndexDefaultsConfig, indexDefaultsConfig } = useIndexDefaults();\n const [indexSet, setIndexSet] = useState(initialIndexSet);\n\n useEffect(() => {\n if (loadingIndexDefaultsConfig || !indexDefaultsConfig) return;\n\n const defaultIndexSet: IndexSet = {\n title: '',\n description: '',\n index_prefix: indexDefaultsConfig.index_prefix,\n writable: true,\n can_be_default: true,\n shards: indexDefaultsConfig.shards,\n data_tiering: indexDefaultsConfig.data_tiering,\n replicas: indexDefaultsConfig.replicas,\n rotation_strategy_class: indexDefaultsConfig.rotation_strategy_class,\n rotation_strategy: indexDefaultsConfig.rotation_strategy_config as RotationStrategyConfig,\n retention_strategy_class: indexDefaultsConfig.retention_strategy_class,\n retention_strategy: indexDefaultsConfig.retention_strategy_config as RetentionStrategyConfig,\n index_analyzer: indexDefaultsConfig.index_analyzer,\n index_optimization_max_num_segments: indexDefaultsConfig.index_optimization_max_num_segments,\n index_optimization_disabled: indexDefaultsConfig.index_optimization_disabled,\n field_type_refresh_interval: moment.duration(indexDefaultsConfig.field_type_refresh_interval, indexDefaultsConfig.field_type_refresh_interval_unit).asMilliseconds(),\n };\n\n if (initialIndexSet) {\n const initialIndexWithoutNullValues = Object.fromEntries(Object.entries(initialIndexSet).filter(([_, v]) => v != null));\n setIndexSet({ ...defaultIndexSet, ...initialIndexWithoutNullValues });\n } else {\n setIndexSet({ ...defaultIndexSet });\n }\n }, [loadingIndexDefaultsConfig, indexDefaultsConfig, initialIndexSet]);\n\n return [indexSet, setIndexSet];\n};\n\nexport default useIndexSet;\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport React, { useState, useCallback } from 'react';\nimport type { Dispatch, SetStateAction } from 'react';\nimport PropTypes from 'prop-types';\nimport moment from 'moment';\nimport { Formik, Form, Field } from 'formik';\nimport styled, { css } from 'styled-components';\nimport { PluginStore } from 'graylog-web-plugin/plugin';\n\nimport AppConfig from 'util/AppConfig';\nimport { FormikFormGroup, FormikInput, FormSubmit, Spinner, TimeUnitInput } from 'components/common';\nimport useIndexDefaults from 'components/indices/hooks/useIndexDefaults';\nimport HideOnCloud from 'util/conditional/HideOnCloud';\nimport { Col, Row, Input, SegmentedControl } from 'components/bootstrap';\nimport IndexMaintenanceStrategiesConfiguration from 'components/indices/IndexMaintenanceStrategiesConfiguration';\nimport 'components/indices/rotation';\nimport 'components/indices/retention';\nimport { DataTieringConfiguration, DataTieringVisualisation, prepareDataTieringConfig, prepareDataTieringInitialValues } from 'components/indices/data-tiering';\nimport type { IndexSet, IndexSetFormValues } from 'stores/indices/IndexSetsStore';\nimport { IndexSetPropType } from 'stores/indices/IndexSetsStore';\nimport type {\n RotationStrategyConfig,\n RetentionStrategyConfig,\n RetentionStrategyContext,\n Strategies,\n} from 'components/indices/Types';\nimport IndexRetentionProvider from 'components/indices/contexts/IndexRetentionProvider';\nimport useHistory from 'routing/useHistory';\nimport IndexSetProfileConfiguration from 'components/indices/IndexSetProfileConfiguration';\nimport useFeature from 'hooks/useFeature';\nimport useIndexSet from 'components/indices/hooks/useIndexSet';\nimport isIndexFieldTypeChangeAllowed from 'components/indices/helpers/isIndexFieldTypeChangeAllowed';\n\ntype Props = {\n cancelLink: string,\n create?: boolean,\n indexSet?: IndexSet,\n onUpdate: (indexSet: IndexSet) => void,\n retentionStrategies: Strategies,\n retentionStrategiesContext: RetentionStrategyContext,\n rotationStrategies: Strategies,\n submitButtonText: string,\n submitLoadingText?: string,\n};\n\ntype RotationStrategiesProps = {\n rotationStrategies: Array,\n indexSetRotationStrategy: RotationStrategyConfig,\n indexSetRotationStrategyClass: string\n}\n\ntype RetentionConfigProps = {\n retentionStrategies: Array,\n retentionStrategiesContext: RetentionStrategyContext,\n indexSetRetentionStrategy: RetentionStrategyConfig,\n IndexSetRetentionStrategyClass: string\n}\n\ntype Unit = 'seconds' | 'minutes';\n\ntype RetentionConfigSegment = 'data_tiering' | 'legacy'\n\nconst StyledFormSubmit = styled(FormSubmit)`\n margin-left: 0;\n`;\n\nconst ConfigSegmentsTitle = styled.h2(({ theme }) => css`\n margin-bottom: ${theme.spacings.sm};\n`);\n\nconst ConfigSegment = styled.div(({ theme }) => css`\n margin-bottom: ${theme.spacings.xs};\n margin-top: ${theme.spacings.md};\n`);\n\nconst _validateIndexPrefix = (value: string) => {\n let error: string;\n\n if (value?.length === 0) {\n error = 'Invalid index prefix: cannot be empty';\n } else if (value?.indexOf('_') === 0 || value?.indexOf('-') === 0 || value?.indexOf('+') === 0) {\n error = 'Invalid index prefix: must start with a letter or number';\n } else if (value?.toLocaleLowerCase() !== value) {\n error = 'Invalid index prefix: must be lower case';\n } else if (!value?.match(/^[a-z0-9][a-z0-9_\\-+]*$/)) {\n error = 'Invalid index prefix: must only contain letters, numbers, \\'_\\', \\'-\\' and \\'+\\'';\n }\n\n return error;\n};\n\nconst _getRotationConfigState = (strategy: string, data: RotationStrategyConfig) => ({\n rotation_strategy_class: strategy,\n rotation_strategy: data,\n});\n\nconst _getRetentionConfigState = (strategy: string, data: RetentionStrategyConfig) => ({\n retention_strategy_class: strategy,\n retention_strategy: data,\n});\n\nconst RotationStrategies = ({ rotationStrategies, indexSetRotationStrategy, indexSetRotationStrategyClass }: RotationStrategiesProps) => {\n if (!rotationStrategies) return ;\n\n return (\n \n );\n};\n\nconst RetentionConfig = ({ retentionStrategies, retentionStrategiesContext, indexSetRetentionStrategy, IndexSetRetentionStrategyClass }: RetentionConfigProps) => {\n if (!retentionStrategies) return ;\n\n return (\n \n );\n};\n\nconst ReadOnlyConfig = () => {\n const indexPrefixHelp = (\n \n A unique prefix used in Elasticsearch indices belonging to this index set.\n The prefix must start with a letter or number, and can only contain letters, numbers, '_', '-' and '+'.\n \n );\n\n return (\n \n \n \n \n );\n};\n\nconst IndexSetConfigurationForm = ({\n indexSet: initialIndexSet,\n rotationStrategies,\n retentionStrategies,\n retentionStrategiesContext,\n create,\n onUpdate,\n cancelLink,\n submitButtonText,\n submitLoadingText,\n} : Props) => {\n const history = useHistory();\n\n const [fieldTypeRefreshIntervalUnit, setFieldTypeRefreshIntervalUnit] = useState('seconds');\n const { loadingIndexDefaultsConfig, indexDefaultsConfig } = useIndexDefaults();\n const [indexSet] = useIndexSet(initialIndexSet);\n const isCloud = AppConfig.isCloud();\n const enableDataTieringCloud = useFeature('data_tiering_cloud');\n\n const retentionConfigSegments: Array<{value: RetentionConfigSegment, label: string}> = [\n { value: 'data_tiering', label: 'Data Tiering' },\n { value: 'legacy', label: 'Legacy (Deprecated)' },\n ];\n\n const initialSegment = () : RetentionConfigSegment => {\n if (indexSet?.use_legacy_rotation) return 'legacy';\n\n return 'data_tiering';\n };\n\n const [selectedRetentionSegment, setSelectedRetentionSegment] = useState(initialSegment());\n\n const prepareRetentionConfigBeforeSubmit = useCallback((values: IndexSetFormValues) : IndexSet => {\n const legacyConfig = { ...values, data_tiering: indexDefaultsConfig.data_tiering, use_legacy_rotation: true };\n\n if (isCloud && !enableDataTieringCloud) {\n return legacyConfig;\n }\n\n if (selectedRetentionSegment === 'legacy') {\n return legacyConfig;\n }\n\n const configWithDataTiering = prepareDataTieringConfig(values, PluginStore);\n\n if (loadingIndexDefaultsConfig || !indexDefaultsConfig) return { ...configWithDataTiering, use_legacy_rotation: false };\n\n const legacyDefaultConfig = {\n rotation_strategy_class: indexDefaultsConfig.rotation_strategy_class,\n rotation_strategy: indexDefaultsConfig.rotation_strategy_config as RotationStrategyConfig,\n retention_strategy_class: indexDefaultsConfig.retention_strategy_class,\n retention_strategy: indexDefaultsConfig.retention_strategy_config as RetentionStrategyConfig,\n };\n\n return { ...configWithDataTiering, ...legacyDefaultConfig, use_legacy_rotation: false };\n }, [loadingIndexDefaultsConfig, indexDefaultsConfig, selectedRetentionSegment, enableDataTieringCloud, isCloud]);\n\n const saveConfiguration = (values: IndexSetFormValues) => onUpdate(prepareRetentionConfigBeforeSubmit(values));\n\n const onFieldTypeRefreshIntervalChange = (\n intervalValue: number,\n unit: Unit,\n name: string,\n onChange: (name: string, value: number) => void,\n setFieldValue: (key: string, value: number) => void) => {\n onChange(name, moment.duration(intervalValue, unit).asMilliseconds());\n setFieldValue(name, moment.duration(intervalValue, unit).asMilliseconds());\n setFieldTypeRefreshIntervalUnit(unit);\n };\n\n if (!indexSet) return null;\n\n const {\n rotation_strategy: indexSetRotationStrategy,\n rotation_strategy_class: indexSetRotationStrategyClass,\n retention_strategy: indexSetRetentionStrategy,\n retention_strategy_class: IndexSetRetentionStrategyClass,\n } = indexSet;\n\n const onCancel = () => history.push(cancelLink);\n\n if (loadingIndexDefaultsConfig) return ( );\n\n return (\n \n \n \n {({ isValid, setFieldValue, isSubmitting, values }) => (\n \n \n \n )}\n \n \n
\n );\n};\n\nIndexSetConfigurationForm.propTypes = {\n indexSet: IndexSetPropType,\n rotationStrategies: PropTypes.array.isRequired,\n retentionStrategies: PropTypes.array.isRequired,\n retentionStrategiesContext: PropTypes.shape({\n max_index_retention_period: PropTypes.string,\n }).isRequired,\n create: PropTypes.bool,\n onUpdate: PropTypes.func.isRequired,\n cancelLink: PropTypes.string.isRequired,\n submitButtonText: PropTypes.string.isRequired,\n submitLoadingText: PropTypes.string.isRequired,\n};\n\nIndexSetConfigurationForm.defaultProps = {\n create: false,\n indexSet: undefined,\n};\n\nexport default IndexSetConfigurationForm;\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport PropTypes from 'prop-types';\nimport React from 'react';\n\nimport { defaultCompare as naturalSort } from 'logic/DefaultCompare';\nimport { Spinner } from 'components/common';\nimport { Alert, Row, Col, Input } from 'components/bootstrap';\nimport BootstrapModalForm from 'components/bootstrap/BootstrapModalForm';\nimport { StreamsStore } from 'stores/streams/StreamsStore';\n\nclass IndexSetDeletionForm extends React.Component {\n static propTypes = {\n indexSet: PropTypes.object.isRequired,\n onDelete: PropTypes.func.isRequired,\n };\n\n constructor(props) {\n super(props);\n\n this.state = {\n showModal: false,\n assignedStreams: undefined,\n deleteIndices: true,\n };\n }\n\n _onModalOpen = () => {\n StreamsStore.load((streams) => {\n const assignedStreams = [];\n\n streams.forEach((stream) => {\n if (stream.index_set_id === this.props.indexSet.id) {\n assignedStreams.push({ id: stream.id, title: stream.title });\n }\n });\n\n this.setState({ assignedStreams: assignedStreams });\n });\n };\n\n // eslint-disable-next-line react/no-unused-class-component-methods\n open = () => {\n this.setState({ showModal: true }, this._onModalOpen);\n };\n\n close = () => {\n this.setState({ showModal: false });\n };\n\n _onRemoveClick = (e) => {\n this.setState({ deleteIndices: e.target.checked });\n };\n\n _isLoading = () => !this.state.assignedStreams;\n\n _isDeletable = () => !this._isLoading() && this.state.assignedStreams.length < 1 && !this.props.indexSet.default;\n\n _modalContent = () => {\n if (this._isLoading()) {\n return ;\n }\n\n if (this.props.indexSet.default) {\n return (\n \n \n \n Unable to delete the index set because it is the default index set!\n \n \n
\n );\n }\n\n if (!this._isDeletable()) {\n const assignedStreams = this.state.assignedStreams\n .sort((s1, s2) => naturalSort(s1.title, s2.title))\n .map((stream) => {stream.title} );\n\n return (\n \n \n \n \n Unable to delete the index set because it has assigned streams. Remove stream assignments to be able to delete this index set.\n \n \n
\n \n \n Assigned streams:
\n \n {assignedStreams}\n
\n \n
\n \n );\n }\n\n return (\n \n \n All indices related to this index set will be deleted from Elasticsearch.}\n checked={this.state.deleteIndices}\n onChange={this._onRemoveClick} />\n \n
\n );\n };\n\n _onDelete = (e) => {\n e.preventDefault();\n\n if (this._isDeletable()) {\n this.props.onDelete(this.props.indexSet, this.state.deleteIndices);\n this.close();\n }\n };\n\n render() {\n return (\n \n {this._modalContent()}\n \n );\n }\n}\n\nexport default IndexSetDeletionForm;\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport styled from 'styled-components';\n\nimport { Row } from 'components/bootstrap';\n\nconst StyledIndexSetDetailsRow = styled(Row)`\ndl {\n margin-bottom: 0;\n\n dt {\n float: left;\n width: 190px;\n overflow: hidden;\n clear: left;\n text-align: left;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n dd {\n margin-left: 180px;\n }\n}\n`;\n\nexport default StyledIndexSetDetailsRow;\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport PropTypes from 'prop-types';\nimport React from 'react';\n\nimport HideOnCloud from 'util/conditional/HideOnCloud';\nimport { Col } from 'components/bootstrap';\nimport { IndicesConfiguration } from 'components/indices';\nimport type { IndexSet } from 'stores/indices/IndexSetsStore';\nimport useProfile from 'components/indices/IndexSetFieldTypeProfiles/hooks/useProfile';\nimport { Link } from 'components/common/router';\nimport Routes from 'routing/Routes';\n\nimport StyledIndexSetDetailsRow from './StyledIndexSetDetailsRow';\n\ntype Props = {\n indexSet: IndexSet,\n};\n\nconst IndexSetDetails = ({ indexSet }: Props) => {\n const { data: { name: profileName }, isFetching } = useProfile(indexSet.field_type_profile);\n\n return (\n \n \n \n - Index prefix:
\n - {indexSet.index_prefix}
\n \n - Shards:
\n - {indexSet.shards}
\n - Replicas:
\n - {indexSet.replicas}
\n \n - Field type refresh interval:
\n - {indexSet.field_type_refresh_interval / 1000.0} seconds
\n - Field type profile:
\n {!isFetching && (\n - \n {indexSet.field_type_profile\n ? (\n \n {profileName}\n \n )\n : Not set}\n
\n )}\n
\n \n\n \n \n \n \n );\n};\n\nIndexSetDetails.propTypes = { indexSet: PropTypes.object.isRequired };\nexport default IndexSetDetails;\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport React, { useEffect, useState, useCallback, useRef } from 'react';\nimport styled, { css } from 'styled-components';\n\nimport type { PaginationQueryParameterResult } from 'hooks/usePaginationQueryParameter';\nimport ButtonToolbar from 'components/bootstrap/ButtonToolbar';\nimport { Link, LinkContainer } from 'components/common/router';\nimport { Button, Col, DropdownButton, Label, MenuItem, Row } from 'components/bootstrap';\nimport { EntityList, EntityListItem, PaginatedList, SearchForm, Spinner } from 'components/common';\nimport Routes from 'routing/Routes';\nimport StringUtils from 'util/StringUtils';\nimport NumberUtils from 'util/NumberUtils';\nimport { useStore } from 'stores/connect';\nimport { IndexSetDeletionForm, IndexSetDetails } from 'components/indices';\nimport usePaginationQueryParameter from 'hooks/usePaginationQueryParameter';\nimport type { IndexSetsStoreState, IndexSet, IndexSetStats } from 'stores/indices/IndexSetsStore';\nimport { IndexSetsActions, IndexSetsStore } from 'stores/indices/IndexSetsStore';\nimport { getPathnameWithoutId } from 'util/URLUtils';\nimport useSendTelemetry from 'logic/telemetry/useSendTelemetry';\nimport useLocation from 'routing/useLocation';\nimport { TELEMETRY_EVENT_TYPE } from 'logic/telemetry/Constants';\n\nconst Toolbar = styled(Row)(({ theme }) => css`\n border-bottom: 1px solid ${theme.colors.gray[90]};\n padding-bottom: ${theme.spacings.sm};\n`);\n\nconst GlobalStatsCol = styled(Col)(({ theme }) => css`\n display: flex;\n align-items: center;\n gap: ${theme.spacings.xs};\n`);\n\nconst GlobalStats = styled.p`\n margin-bottom: 0;\n`;\n\nconst StatsInfoText = styled.span`\n font-style: italic;\n`;\n\nconst formatStatsString = (stats: IndexSetStats) => {\n if (!stats) {\n return 'N/A';\n }\n\n const indices = `${NumberUtils.formatNumber(stats.indices)} ${StringUtils.pluralize(stats.indices, 'index', 'indices')}`;\n const documents = `${NumberUtils.formatNumber(stats.documents)} ${StringUtils.pluralize(stats.documents, 'document', 'documents')}`;\n const size = NumberUtils.formatBytes(stats.size);\n\n return `${indices}, ${documents}, ${size}`;\n};\n\nconst IndexSetsComponent = () => {\n const DEFAULT_PAGE_NUMBER = 1;\n const DEFAULT_PAGE_SIZE = 10;\n const SEARCH_MIN_TERM_LENGTH = 3;\n const { indexSetsCount, indexSets, indexSetStats, globalIndexSetStats } = useStore(IndexSetsStore);\n const { page, resetPage }: PaginationQueryParameterResult = usePaginationQueryParameter();\n const sendTelemetry = useSendTelemetry();\n const { pathname } = useLocation();\n\n const [statsEnabled, setStatsEnabled] = useState(false);\n const [searchTerm, setSearchTerm] = useState(undefined);\n\n const formsRef = useRef<{ [key: string]: { open:() => void } }>();\n\n const loadData = useCallback((pageNumber: number = DEFAULT_PAGE_NUMBER, limit: number = DEFAULT_PAGE_SIZE) => {\n if (searchTerm) {\n IndexSetsActions.searchPaginated(searchTerm, (pageNumber - 1) * limit, limit, statsEnabled);\n } else {\n IndexSetsActions.listPaginated((pageNumber - 1) * limit, limit, statsEnabled);\n }\n }, [statsEnabled, searchTerm]);\n\n useEffect(() => {\n loadData(page);\n }, [loadData, page]);\n\n useEffect(() => {\n if (statsEnabled) {\n IndexSetsActions.stats();\n }\n }, [statsEnabled]);\n\n const onSearch = (query) => {\n if (query && query.length >= SEARCH_MIN_TERM_LENGTH) {\n setSearchTerm(query);\n resetPage();\n } else if (!query || query.length === 0) {\n setSearchTerm(query);\n resetPage();\n }\n };\n\n const onSearchReset = () => {\n setSearchTerm(undefined);\n resetPage();\n };\n\n const onToggleStats = () => {\n setStatsEnabled(!statsEnabled);\n };\n\n const onSetDefault = (indexSet: IndexSet) => () => {\n sendTelemetry(TELEMETRY_EVENT_TYPE.INDICES.INDEX_SET_DEFAULT_SET, {\n app_pathname: getPathnameWithoutId(pathname),\n app_section: 'index-sets',\n app_action_value: 'set-default-index-set',\n });\n\n IndexSetsActions.setDefault(indexSet).then(() => loadData());\n };\n\n const onDelete = (indexSet: IndexSet) => () => {\n formsRef.current[`index-set-deletion-form-${indexSet.id}`].open();\n };\n\n const deleteIndexSet = (indexSet: IndexSet, deleteIndices: boolean) => {\n sendTelemetry(TELEMETRY_EVENT_TYPE.INDICES.INDEX_SET_DELETED, {\n app_pathname: getPathnameWithoutId(pathname),\n app_section: 'index-sets',\n app_action_value: 'delete-index-set',\n });\n\n IndexSetsActions.delete(indexSet, deleteIndices).then(() => {\n resetPage();\n loadData(page);\n });\n };\n\n const statsDisabledText = 'Stats are disabled by default';\n\n const formatIndexSet = (indexSet: IndexSet) => {\n const actions = (\n \n \n \n \n \n \n \n \n \n \n );\n\n const content = (\n \n \n\n {\n formsRef.current = { ...formsRef.current, [`index-set-deletion-form-${indexSet.id}`]: elem };\n }\n }\n indexSet={indexSet}\n onDelete={deleteIndexSet} />\n \n );\n\n const indexSetTitle = (\n \n {indexSet.title}\n \n );\n\n const isDefault = indexSet.default\n ? : '';\n const isReadOnly = !indexSet.writable\n ? : '';\n let { description } = indexSet;\n\n if (indexSet.default) {\n description += `${description.endsWith('.') ? '' : '.'} Graylog will use this index set by default.`;\n }\n\n let statsString;\n const stats = indexSetStats[indexSet.id];\n\n if (stats) {\n statsString = formatStatsString(stats);\n }\n\n return (\n {statsEnabled ? statsString\n : {statsDisabledText} } {isDefault} {isReadOnly}\n \n )}\n description={description}\n actions={actions}\n contentRow={content} />\n );\n };\n\n const isLoading = !indexSets;\n\n return (\n <>\n \n \n \n \n
\n \n \n Stats for all indices: {statsEnabled\n ? formatStatsString(globalIndexSetStats)\n : {statsDisabledText} }\n \n \n \n \n\n \n \n {isLoading\n ? : (\n\n \n formatIndexSet(indexSet))} />\n \n )}\n \n
\n >\n );\n};\n\nexport default IndexSetsComponent;\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport PropTypes from 'prop-types';\nimport React from 'react';\nimport numeral from 'numeral';\n\nimport NumberUtils from 'util/NumberUtils';\n\nclass IndexSizeSummary extends React.Component {\n static propTypes = {\n index: PropTypes.object.isRequired,\n };\n\n render() {\n const { index } = this.props;\n\n if (index.size) {\n return (\n ({NumberUtils.formatBytes(index.size.bytes)}{' '}\n / {numeral(index.size.events).format('0,0')} messages){' '}\n \n );\n }\n\n return ;\n }\n}\n\nexport default IndexSizeSummary;\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport PropTypes from 'prop-types';\nimport React from 'react';\n\nimport { Label } from 'components/bootstrap';\nimport { RelativeTime, Icon } from 'components/common';\nimport IndexSizeSummary from 'components/indices/IndexSizeSummary';\n\nclass IndexSummary extends React.Component {\n static propTypes = {\n children: PropTypes.node.isRequired,\n index: PropTypes.object.isRequired,\n indexRange: PropTypes.object,\n isDeflector: PropTypes.bool.isRequired,\n name: PropTypes.string.isRequired,\n };\n\n state = { showDetails: this.props.isDeflector };\n\n _formatLabels = (index) => {\n const labels = [];\n\n if (index.is_deflector) {\n labels.push();\n }\n\n if (index.is_closed) {\n labels.push();\n }\n\n if (index.is_reopened) {\n labels.push();\n }\n\n return {labels};\n };\n\n _formatIndexRange = () => {\n if (this.props.isDeflector) {\n return Contains messages up to ;\n }\n\n const sizes = this.props.index.size;\n\n if (sizes) {\n const count = sizes.events;\n const { deleted } = sizes;\n\n if (count === 0 || count - deleted === 0) {\n return 'Index does not contain any messages.';\n }\n }\n\n if (!this.props.indexRange) {\n return 'Time range of index is unknown, because index range is not available. Please recalculate index ranges manually.';\n }\n\n if (this.props.indexRange.begin === 0) {\n return Contains messages up to ;\n }\n\n return (\n \n Contains messages from up to{' '}\n \n \n );\n };\n\n _formatShowDetailsLink = () => {\n if (this.state.showDetails) {\n return Hide Details / Actions;\n }\n\n return Show Details / Actions;\n };\n\n _toggleShowDetails = (event) => {\n event.preventDefault();\n this.setState({ showDetails: !this.state.showDetails });\n };\n\n render() {\n const { index } = this.props;\n\n return (\n \n \n {this.props.name}{' '}\n\n \n {this._formatLabels(index)}{' '}\n {this._formatIndexRange(index)}{' '}\n\n \n\n {this._formatShowDetailsLink()}\n \n
\n\n \n {this.state.showDetails && this.props.children}\n \n \n );\n }\n}\n\nexport default IndexSummary;\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport Reflux from 'reflux';\n\nimport * as URLUtils from 'util/URLUtils';\nimport ApiRoutes from 'routing/ApiRoutes';\nimport fetch from 'logic/rest/FetchProvider';\nimport { singletonStore, singletonActions } from 'logic/singleton';\n\nexport const DeflectorActions = singletonActions(\n 'core.Deflector',\n () => Reflux.createActions({\n cycle: { asyncResult: true },\n list: { asyncResult: true },\n }),\n);\n\nexport const DeflectorStore = singletonStore(\n 'core.Deflector',\n () => Reflux.createStore({\n listenables: [DeflectorActions],\n deflector: {\n info: undefined,\n },\n getInitialState() {\n return { deflector: this.deflector };\n },\n cycle(indexSetId) {\n const url = URLUtils.qualifyUrl(ApiRoutes.DeflectorApiController.cycle(indexSetId).url);\n const promise = fetch('POST', url);\n\n DeflectorActions.cycle.promise(promise);\n },\n list(indexSetId) {\n const url = URLUtils.qualifyUrl(ApiRoutes.DeflectorApiController.list(indexSetId).url);\n const promise = fetch('GET', url).then((info) => {\n this.deflector.info = info;\n this.trigger({ deflector: this.deflector });\n });\n\n DeflectorActions.list.promise(promise);\n },\n }),\n);\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport PropTypes from 'prop-types';\nimport * as React from 'react';\nimport { useCallback, useMemo } from 'react';\n\nimport { ButtonGroup, DropdownButton, MenuItem } from 'components/bootstrap';\nimport { DeflectorActions } from 'stores/indices/DeflectorStore';\nimport { IndexRangesActions } from 'stores/indices/IndexRangesStore';\nimport type { IndexSet } from 'stores/indices/IndexSetsStore';\n\nconst _onRecalculateIndexRange = (indexSetId: string) => {\n // eslint-disable-next-line no-alert\n if (window.confirm('This will recalculate index ranges for this index set using a background system job. Do you want to proceed?')) {\n IndexRangesActions.recalculate(indexSetId);\n }\n};\n\nconst _onCycleDeflector = (indexSetId: string) => {\n // eslint-disable-next-line no-alert\n if (window.confirm('This will manually cycle the current active write index on this index set. Do you want to proceed?')) {\n DeflectorActions.cycle(indexSetId).then(() => {\n DeflectorActions.list(indexSetId);\n });\n }\n};\n\ntype Props = {\n indexSet: IndexSet,\n indexSetId: string,\n};\n\nconst IndicesMaintenanceDropdown = ({ indexSet, indexSetId }: Props) => {\n const onCycleDeflector = useCallback(() => _onCycleDeflector(indexSetId), [indexSetId]);\n const onRecalculateIndexRange = useCallback(() => _onRecalculateIndexRange(indexSetId), [indexSetId]);\n const cycleButton = useMemo(() => (indexSet?.writable ? : null), [indexSet?.writable, onCycleDeflector]);\n\n return (\n \n \n \n {cycleButton}\n \n \n );\n};\n\nIndicesMaintenanceDropdown.propTypes = {\n indexSetId: PropTypes.string.isRequired,\n indexSet: PropTypes.object.isRequired,\n};\n\nexport default IndicesMaintenanceDropdown;\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport PropTypes from 'prop-types';\nimport React from 'react';\n\nimport { Col, Row } from 'components/bootstrap';\nimport { ClosedIndexDetails, IndexDetails, IndexSummary } from 'components/indices';\nimport type { IndexInfo } from 'stores/indices/IndicesStore';\n\nconst Index = ({ index, indexDetails, indexSetId }: { index: IndexSummary, indexDetails: Array, indexSetId: string }) => {\n const indexRange = index && index.range ? index.range : null;\n const details = indexDetails.find(({ index_name }) => index_name === index.index_name);\n\n return (\n \n \n \n \n \n \n \n \n
\n );\n};\n\nconst ClosedIndex = ({ index }: { index: IndexSummary }) => {\n const indexRange = index.range;\n\n return (\n \n \n \n \n \n \n \n \n
\n );\n};\n\ntype Props = {\n indexDetails: Array,\n indices: Array\n indexSetId: string,\n}\n\nconst IndicesOverview = ({ indexDetails, indices, indexSetId }: Props) => (\n \n {indices.map((index) => (!index.is_closed\n ? \n : ),\n )}\n \n);\n\nIndicesOverview.propTypes = {\n indexDetails: PropTypes.array.isRequired,\n indices: PropTypes.array.isRequired,\n indexSetId: PropTypes.string.isRequired,\n};\n\nexport default IndicesOverview;\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport React from 'react';\nimport { PluginStore } from 'graylog-web-plugin/plugin';\n\nimport { Row, Col } from 'components/bootstrap';\nimport IndexMaintenanceStrategiesSummary from 'components/indices/IndexMaintenanceStrategiesSummary';\nimport { DataTieringSummary, DATA_TIERING_TYPE } from 'components/indices/data-tiering';\nimport type { IndexSet } from 'stores/indices/IndexSetsStore';\n\ntype Props = {\n indexSet: IndexSet\n}\n\nconst IndicesConfiguration = ({ indexSet } : Props) => {\n if (!indexSet.writable) {\n return (\n \n \n Index set is not writable and will not be included in index rotation and retention.\n It is also not possible to assign it to a stream.\n \n
\n );\n }\n\n const dataTieringConfig = indexSet.data_tiering;\n\n if (!dataTieringConfig) {\n const rotationConfig = {\n strategy: indexSet.rotation_strategy_class,\n config: indexSet.rotation_strategy,\n };\n\n const retentionConfig = {\n strategy: indexSet.retention_strategy_class,\n config: indexSet.retention_strategy,\n };\n\n return (\n \n \n \n \n \n \n \n
\n );\n }\n\n const dataTieringPlugin = PluginStore.exports('dataTiering').find((plugin) => (plugin.type === DATA_TIERING_TYPE.HOT_WARM));\n\n return (\n \n \n \n \n {dataTieringPlugin && (\n \n \n \n )}\n\n
\n );\n};\n\nexport default IndicesConfiguration;\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport * as React from 'react';\n\nimport PageNavigation from 'components/common/PageNavigation';\nimport Routes from 'routing/Routes';\nimport { Row } from 'components/bootstrap';\n\nconst NAV_ITEMS = [\n { title: 'Indices & Index Sets', path: Routes.SYSTEM.INDICES.LIST, exactPathMatch: true },\n { title: 'Field Type Profiles', path: Routes.SYSTEM.INDICES.FIELD_TYPE_PROFILES.OVERVIEW, exactPathMatch: false },\n];\n\nconst IndicesPageNavigation = () => (\n \n \n
\n);\n\nexport default IndicesPageNavigation;\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport PropTypes from 'prop-types';\nimport React from 'react';\nimport numeral from 'numeral';\nimport moment from 'moment';\n\nclass ShardMeter extends React.Component {\n static propTypes = {\n title: PropTypes.string.isRequired,\n shardMeter: PropTypes.object.isRequired,\n };\n\n _formatMeter = (meter) => {\n const value = {numeral(meter.total).format('0,0')} ops;\n\n if (meter.total > 0) {\n return {value} (took {moment.duration(meter.time_seconds, 'seconds').humanize()});\n }\n\n return value;\n };\n\n render() {\n const sm = this.props.shardMeter;\n\n return (\n \n {this.props.title}
\n \n - Index:
\n - {this._formatMeter(sm.index)}
\n\n - Flush:
\n - {this._formatMeter(sm.flush)}
\n\n - Merge:
\n - {this._formatMeter(sm.merge)}
\n\n - Query:
\n - {this._formatMeter(sm.search_query)}
\n\n - Fetch:
\n - {this._formatMeter(sm.search_fetch)}
\n\n - Get:
\n - {this._formatMeter(sm.get)}
\n\n - Refresh:
\n - {this._formatMeter(sm.refresh)}
\n
\n \n );\n }\n}\n\nexport default ShardMeter;\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport * as React from 'react';\nimport classNames from 'classnames';\n\nimport { OverlayTrigger } from 'components/common';\n\ntype Props = {\n route: {\n id: string,\n state: string,\n node_hostname: string,\n node_name: string,\n primary: boolean,\n }\n}\n\nconst ShardRouting = ({ route }: Props) => {\n const tooltip = <>State: {route.state} on {route.node_hostname} ({route.node_name})>;\n\n return (\n \n \n S{route.id}\n \n \n );\n};\n\nexport default ShardRouting;\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport PropTypes from 'prop-types';\nimport React from 'react';\nimport styled, { css } from 'styled-components';\n\nimport { defaultCompare as naturalSort } from 'logic/DefaultCompare';\nimport ShardRouting from 'components/indices/ShardRouting';\n\nconst ShardRoutingWrap = styled.div(({ theme }) => css`\n .shards {\n .shard {\n padding: 10px;\n margin: 5px;\n width: 50px;\n float: left;\n text-align: center;\n }\n\n .shard-started {\n background-color: ${theme.utils.colorLevel(theme.colors.variant.light.success, -2)};\n }\n\n .shard-relocating {\n background-color: ${theme.utils.colorLevel(theme.colors.variant.light.primary, -2)};\n }\n\n .shard-initializing {\n background-color: ${theme.utils.colorLevel(theme.colors.variant.light.warning, -5)};\n }\n\n .shard-unassigned {\n background-color: ${theme.utils.colorLevel(theme.colors.variant.light.default, -2)};\n }\n\n .shard-primary .id {\n font-weight: bold;\n margin-bottom: 3px;\n border-bottom: 1px solid ${theme.colors.gray[10]};\n }\n }\n\n .description {\n font-size: ${theme.fonts.size.small};\n margin-top: 2px;\n margin-left: 6px;\n }\n`);\n\nconst ShardRoutingOverview = ({ indexName, routing }) => (\n \n Shard routing
\n\n \n {routing\n .sort((shard1, shard2) => naturalSort(shard1.id, shard2.id))\n .map((route) => )}\n
\n
\n\n \n Bold shards are primaries, others are replicas. Replicas are elected to primaries automatically\n when primaries leave the cluster. Size and document counts only reflect primary shards and no\n possible replica duplication.\n \n \n);\n\nShardRoutingOverview.propTypes = {\n routing: PropTypes.array.isRequired,\n indexName: PropTypes.string.isRequired,\n};\n\nexport default ShardRoutingOverview;\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport useCurrentUser from 'hooks/useCurrentUser';\nimport { isPermitted } from 'util/PermissionsMixin';\n\nconst useHasTypeMappingPermission = () => {\n const currentUser = useCurrentUser();\n\n return isPermitted(currentUser.permissions, 'typemappings:edit');\n};\n\nexport default useHasTypeMappingPermission;\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport Reflux from 'reflux';\nimport PropTypes from 'prop-types';\nimport isArray from 'lodash/isArray';\n\nimport ApiRoutes from 'routing/ApiRoutes';\nimport fetch from 'logic/rest/FetchProvider';\nimport { qualifyUrl } from 'util/URLUtils';\nimport UserNotification from 'util/UserNotification';\nimport { singletonStore, singletonActions } from 'logic/singleton';\nimport type { RetentionStrategyConfig, RotationStrategyConfig } from 'components/indices/Types';\nimport { RetentionStrategyConfigPropType, RotationStrategyConfigPropType } from 'components/indices/Types';\nimport type { DataTieringConfig, DataTieringFormValues } from 'components/indices/data-tiering';\n\nexport const IndexSetPropType = PropTypes.shape({\n can_be_default: PropTypes.bool,\n id: PropTypes.string,\n title: PropTypes.string,\n description: PropTypes.string.isRequired,\n index_prefix: PropTypes.string.isRequired,\n shards: PropTypes.number.isRequired,\n replicas: PropTypes.number.isRequired,\n rotation_strategy_class: PropTypes.string.isRequired,\n rotation_strategy: RotationStrategyConfigPropType.isRequired,\n retention_strategy_class: PropTypes.string.isRequired,\n retention_strategy: RetentionStrategyConfigPropType.isRequired,\n creation_date: PropTypes.string,\n index_analyzer: PropTypes.string.isRequired,\n index_optimization_max_num_segments: PropTypes.number.isRequired,\n index_optimization_disabled: PropTypes.bool.isRequired,\n field_type_refresh_interval: PropTypes.number.isRequired,\n index_template_type: PropTypes.string,\n writable: PropTypes.bool.isRequired,\n default: PropTypes.bool.isRequired,\n});\n\ntype IndexSetConfig = {\n can_be_default?: boolean,\n id?: string,\n title: string,\n description: string,\n index_prefix: string,\n shards: number,\n replicas: number,\n rotation_strategy_class: string,\n rotation_strategy: RotationStrategyConfig,\n retention_strategy_class: string,\n retention_strategy: RetentionStrategyConfig,\n creation_date?: string,\n index_analyzer: string,\n index_optimization_max_num_segments: number,\n index_optimization_disabled: boolean,\n field_type_refresh_interval: number,\n field_type_profile?: string | null,\n index_template_type?: string,\n writable: boolean,\n default?: boolean,\n use_legacy_rotation?: boolean\n}\n\nexport type IndexSetsDefaultConfiguration = Pick & {\n rotation_strategy_config: RotationStrategyConfig,\n retention_strategy_config: RetentionStrategyConfig,\n field_type_refresh_interval_unit: 'seconds' | 'minutes',\n data_tiering: DataTieringConfig\n}\n\nexport type IndexSet = IndexSetConfig & { data_tiering?: DataTieringConfig };\n\nexport type IndexSetFormValues = IndexSetConfig & { data_tiering?: DataTieringFormValues };\n\nexport type IndexSetStats = {\n documents: number,\n indices: number,\n size: number,\n}\n\ntype IndexSetsStats = {\n [key: string]: IndexSetStats\n}\n\ntype IndexSetsResponseType = {\n total: number,\n index_sets: Array,\n stats: IndexSetsStats,\n};\n\nexport type IndexSetsStoreState = {\n indexSetsCount: number,\n indexSets: Array,\n indexSetStats: IndexSetsStats,\n indexSet: IndexSet,\n globalIndexSetStats: IndexSetStats\n}\n\ntype IndexSetsActionsType = {\n list: (stats: boolean) => Promise,\n listPaginated: (skip: number, limit: number, stats: boolean) => Promise,\n get: (indexSetId: string) => Promise,\n update: (indexSet: IndexSet) => Promise,\n create: (indexSet: IndexSet) => Promise,\n delete: (indexSet: IndexSet, deleteIndices: boolean) => Promise,\n searchPaginated: (searchTerm: string, skip: number, limit: number, stats: boolean) => Promise,\n setDefault: (indexSet: IndexSet) => Promise,\n stats: () => Promise,\n};\n\nexport const IndexSetsActions = singletonActions(\n 'core.IndexSets',\n () => Reflux.createActions({\n list: { asyncResult: true },\n listPaginated: { asyncResult: true },\n get: { asyncResult: true },\n update: { asyncResult: true },\n create: { asyncResult: true },\n delete: { asyncResult: true },\n searchPaginated: { asyncResult: true },\n setDefault: { asyncResult: true },\n stats: { asyncResult: true },\n }),\n);\n\nexport const IndexSetsStore = singletonStore(\n 'core.IndexSets',\n () => Reflux.createStore({\n listenables: [IndexSetsActions],\n indexSetsCount: undefined,\n indexSets: undefined,\n indexSetStats: undefined,\n indexSet: undefined,\n globalIndexSetStats: undefined,\n\n getInitialState() {\n return this.getState();\n },\n\n getState() {\n return {\n indexSetsCount: this.indexSetsCount,\n indexSets: this.indexSets,\n indexSetStats: this.indexSetStats,\n indexSet: this.indexSet,\n globalIndexSetStats: this.globalIndexSetStats,\n };\n },\n\n propagateChanges() {\n this.trigger(this.getState());\n },\n\n list(stats: boolean) {\n const url = qualifyUrl(ApiRoutes.IndexSetsApiController.list(stats).url);\n const promise = fetch('GET', url);\n\n promise\n .then(\n (response: IndexSetsResponseType) => {\n this.indexSetsCount = response.total;\n this.indexSets = response.index_sets;\n this.indexSetStats = response.stats;\n\n this.propagateChanges();\n\n return response;\n },\n (error) => {\n UserNotification.error(`Fetching index sets list failed: ${error.message}`,\n 'Could not retrieve index sets.');\n },\n );\n\n IndexSetsActions.list.promise(promise);\n },\n\n listPaginated(skip: number, limit: number, stats: boolean) {\n const url = qualifyUrl(ApiRoutes.IndexSetsApiController.listPaginated(skip, limit, stats).url);\n const promise = fetch('GET', url);\n\n promise\n .then(\n (response: IndexSetsResponseType) => {\n this.indexSetsCount = response.total;\n this.indexSets = response.index_sets;\n this.indexSetStats = response.stats;\n\n this.propagateChanges();\n\n return response;\n },\n (error) => {\n UserNotification.error(`Fetching index sets list failed: ${this._errorMessage(error)}`,\n 'Could not retrieve index sets.');\n },\n );\n\n IndexSetsActions.listPaginated.promise(promise);\n },\n\n searchPaginated(searchTerm: string, skip: number, limit: number, stats: boolean) {\n const url = qualifyUrl(ApiRoutes.IndexSetsApiController.searchPaginated(searchTerm, skip, limit, stats).url);\n const promise = fetch('GET', url);\n\n promise\n .then(\n (response: IndexSetsResponseType) => {\n this.indexSetsCount = response.total;\n this.indexSets = response.index_sets;\n this.indexSetStats = response.stats;\n\n this.propagateChanges();\n\n return response;\n },\n (error) => {\n UserNotification.error(`Fetching index sets list failed: ${this._errorMessage(error)}`,\n 'Could not retrieve index sets.');\n },\n );\n\n IndexSetsActions.searchPaginated.promise(promise);\n },\n\n get(indexSetId: string) {\n const url = qualifyUrl(ApiRoutes.IndexSetsApiController.get(indexSetId).url);\n const promise = fetch('GET', url);\n\n promise.then(\n (response: IndexSet) => {\n this.indexSet = response;\n\n this.propagateChanges();\n\n return response;\n },\n (error) => {\n UserNotification.error(`Fetching index set '${indexSetId}' failed with status: ${this._errorMessage(error)}`, 'Could not retrieve index set.');\n },\n );\n\n IndexSetsActions.get.promise(promise);\n },\n\n update(indexSet: IndexSet) {\n const url = qualifyUrl(ApiRoutes.IndexSetsApiController.get(indexSet.id).url);\n const promise = fetch('PUT', url, indexSet);\n\n promise.then(\n (response: IndexSet) => {\n UserNotification.success(`Successfully updated index set '${indexSet.title}'`, 'Success');\n\n this.indexSet = response;\n\n this.propagateChanges();\n\n return response;\n },\n (error) => {\n UserNotification.error(`Updating index set '${indexSet.title}' failed with status: ${this._errorMessage(error)}`, 'Could not update index set.');\n },\n );\n\n IndexSetsActions.update.promise(promise);\n },\n\n create(indexSet: IndexSet) {\n const url = qualifyUrl(ApiRoutes.IndexSetsApiController.create().url);\n const promise = fetch('POST', url, indexSet);\n\n promise.then(\n (response: IndexSet) => {\n UserNotification.success(`Successfully created index set '${indexSet.title}'`, 'Success');\n\n this.indexSet = response;\n\n this.propagateChanges();\n\n return response;\n },\n (error) => {\n UserNotification.error(`Creating index set '${indexSet.title}' failed with status: ${this._errorMessage(error)}`, 'Could not create index set.');\n },\n );\n\n IndexSetsActions.create.promise(promise);\n },\n\n delete(indexSet: IndexSet, deleteIndices: boolean) {\n const url = qualifyUrl(ApiRoutes.IndexSetsApiController.delete(indexSet.id, deleteIndices).url);\n const promise = fetch('DELETE', url);\n\n promise.then(\n () => {\n UserNotification.success(`Successfully deleted index set '${indexSet.title}'`, 'Success');\n },\n (error) => {\n UserNotification.error(`Deleting index set '${indexSet.title}' failed with status: ${this._errorMessage(error)}`, 'Could not delete index set.');\n },\n );\n\n IndexSetsActions.delete.promise(promise);\n },\n\n setDefault(indexSet: IndexSet) {\n const url = qualifyUrl(ApiRoutes.IndexSetsApiController.setDefault(indexSet.id).url);\n const promise = fetch('PUT', url);\n\n promise.then(\n () => {\n UserNotification.success(`Successfully set index set '${indexSet.title}' as default`, 'Success');\n },\n (error) => {\n UserNotification.error(`Setting index set '${indexSet.title}' as default failed with status: ${this._errorMessage(error)}`, 'Could not set default index set.');\n },\n );\n\n IndexSetsActions.setDefault.promise(promise);\n },\n\n stats() {\n const url = qualifyUrl(ApiRoutes.IndexSetsApiController.stats().url);\n const promise = fetch('GET', url);\n\n promise\n .then(\n (response) => {\n this.globalIndexSetStats = {\n indices: response.indices,\n documents: response.documents,\n size: response.size,\n };\n\n this.propagateChanges();\n\n return response;\n },\n (error) => {\n UserNotification.error(`Fetching global index stats failed: ${error.message}`,\n 'Could not retrieve global index stats.');\n },\n );\n\n IndexSetsActions.stats.promise(promise);\n },\n\n _errorMessage(error) {\n try {\n if (isArray(error.additional.body)) {\n return error.additional.body.map(({ message, path }) => `${path ?? ''} ${message}.`).join(' ');\n }\n\n return error.additional.body.message;\n } catch (e) {\n return error.message;\n }\n },\n }),\n);\n"],"names":["Container","StyledButton","theme","items","path","title","permissions","exactPathMatch","INITIAL_DATA","fetchIndexSetFieldTypeProfile","id","url","profile","data","isFetched","isFetching","refetch","errorThrown","fetchProfileOptions","profiles","name","isLoading","RetentionStrategiesContextPropType","SizeBasedRotationStrategyConfigPropType","MessageCountRotationStrategyConfigPropType","TimeBasedRotationStrategyConfigPropType","TimeBasedSizePtimizingRotationStrategyConfigPropType","RotationStrategyConfigPropType","IndexActionPropType","RetentionStrategyConfigPropType","JsonSchemaStringPropertyTypePropType","JsonSchemaIndexActionPropertyTypePropType","RotationPropertiesPropType","RotationJsonSchemaPropType","RetentionPropertiesPropType","RetentionJsonSchemaPropType","RotationStrategyPropType","RetentionStrategyPropType","TEMPLATE_TYPES","indexSet","IndexRangeSummary","indexRange","RelativeTime","ClosedIndexDetails","IndexRangesActions","singleton","IndexRangesStore","URLUtils","ApiRoutes","promise","response","indexSetId","UserNotification","error","indexName","IndexDetails","index","isDeflector","_onRecalculateIndex","_onDeleteIndex","actionButtons","HideOnCloud","NumberUtils","hasMappingPermission","useHasTypeMappingPermission","history","useHistory","onShowFieldTypes","Routes","fetchIndexDefaults","fetchError","dayFields","hotWarmOnlyFormFields","durationToRoundedDays","duration","prepareDataTieringInitialValues","values","data_tiering","field","numberValue","prepareDataTieringConfig","pluginStore","hotWarmDefaultValues","dataTieringPlugin","plugin","DATA_TIERING_TYPE","dataTieringType","validateMaxDaysInStorage","value","validateMinDaysInStorage","_a","errors","config","VisualisationWrapper","BarWrapper","MaxDaysLabel","AnnotationBar","LifeCycleBar","Bar","color","Label","StyledTooltip","DataTieringVisualisation","archiveData","minDays","maxDays","minDaysInHot","warmTierEnabled","showMinDaysTooltip","setShowMinDaysTooltip","showMinDaysInHotTooltip","setShowMinDaysInHotTooltip","percentageFor","days","minDaysPercentage","minDaysInHotPercentage","showHotTier","StyledAlert","StyledSelect","StyledH3","onChange","options","useProfileOptions","_onChange","val","initialIndexSet","loadingIndexDefaultsConfig","indexDefaultsConfig","setIndexSet","defaultIndexSet","initialIndexWithoutNullValues","_","v","StyledFormSubmit","ConfigSegmentsTitle","ConfigSegment","_validateIndexPrefix","_getRotationConfigState","strategy","_getRetentionConfigState","RotationStrategies","rotationStrategies","indexSetRotationStrategy","indexSetRotationStrategyClass","IndexMaintenanceStrategiesConfiguration","RetentionConfig","retentionStrategies","retentionStrategiesContext","indexSetRetentionStrategy","IndexSetRetentionStrategyClass","ReadOnlyConfig","indexPrefixHelp","IndexSetConfigurationForm","create","onUpdate","cancelLink","submitButtonText","submitLoadingText","fieldTypeRefreshIntervalUnit","setFieldTypeRefreshIntervalUnit","isCloud","AppConfig","enableDataTieringCloud","useFeature","retentionConfigSegments","initialSegment","selectedRetentionSegment","setSelectedRetentionSegment","prepareRetentionConfigBeforeSubmit","legacyConfig","configWithDataTiering","legacyDefaultConfig","saveConfiguration","onFieldTypeRefreshIntervalChange","intervalValue","unit","setFieldValue","onCancel","isValid","isSubmitting","IndexRetentionProvider","isIndexFieldTypeChangeAllowed","profileId","IndexSetDeletionForm","props","StreamsStore","streams","assignedStreams","stream","e","s1","s2","BootstrapModalForm","IndexSetDetails","profileName","useProfile","Toolbar","GlobalStatsCol","GlobalStats","StatsInfoText","formatStatsString","stats","indices","StringUtils","documents","size","indexSetsCount","indexSets","indexSetStats","globalIndexSetStats","IndexSetsStore","page","resetPage","usePaginationQueryParameter","sendTelemetry","useSendTelemetry","pathname","useLocation","statsEnabled","setStatsEnabled","searchTerm","setSearchTerm","formsRef","loadData","pageNumber","limit","onSearch","query","onSearchReset","onToggleStats","onSetDefault","onDelete","deleteIndexSet","deleteIndices","statsDisabledText","formatIndexSet","actions","ButtonToolbar","content","elem","indexSetTitle","isDefault","isReadOnly","description","statsString","IndexSizeSummary","IndexSummary","labels","sizes","count","deleted","event","DeflectorActions","DeflectorStore","info","_onRecalculateIndexRange","_onCycleDeflector","IndicesMaintenanceDropdown","onCycleDeflector","onRecalculateIndexRange","cycleButton","Index","indexDetails","details","index_name","ClosedIndex","IndicesOverview","dataTieringConfig","rotationConfig","retentionConfig","IndexMaintenanceStrategiesSummary","NAV_ITEMS","PageNavigation","ShardMeter","meter","sm","route","tooltip","ShardRoutingWrap","ShardRoutingOverview","routing","shard1","shard2","currentUser","IndexSetPropType","IndexSetsActions","skip","message"],"sourceRoot":""}
© 2015 - 2024 Weber Informatics LLC | Privacy Policy