Skip to content

Commit ec486c1

Browse files
committed
Add target index settings to rollup
Signed-off-by: Aleksandr Tuliakov <[email protected]>
1 parent e7f0b10 commit ec486c1

File tree

8 files changed

+140
-24
lines changed

8 files changed

+140
-24
lines changed

models/interfaces.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77

88
import { long } from "@opensearch-project/opensearch/api/types";
99
import { ActionType } from "../public/pages/VisualCreatePolicy/utils/constants";
10-
import { IndicesUpdateMode } from "../public/utils/constants";
1110

1211
export interface ManagedIndexMetaData {
1312
index: string;
@@ -490,6 +489,7 @@ export interface Rollup {
490489
schema_version: number;
491490
source_index: string;
492491
target_index: string;
492+
target_index_settings: Map<string, any> | null;
493493
roles: string[];
494494
}
495495

public/pages/CreateRollup/components/JobNameAndIndices/JobNameAndIndices.tsx

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,17 @@
55

66
import React, { Component } from "react";
77
import { EuiFlexGrid, EuiSpacer, EuiFlexItem, EuiText, EuiFlexGroup, EuiHorizontalRule, EuiPanel, EuiTitle } from "@elastic/eui";
8-
import { ContentPanel, ContentPanelActions } from "../../../../components/ContentPanel";
8+
import { ContentPanelActions } from "../../../../components/ContentPanel";
99
import { ModalConsumer } from "../../../../components/Modal";
1010
import { IndexItem } from "../../../../../models/interfaces";
11+
import { getOrderedJson } from "../../../../../utils/helper";
1112

1213
interface JobNameAndIndicesProps {
1314
rollupId: string;
1415
description: string;
1516
sourceIndex: { label: string; value?: IndexItem }[];
1617
targetIndex: { label: string; value?: IndexItem }[];
18+
targetIndexSettings: Pick<IndexItem, "settings"> | null;
1719
onChangeStep: (step: number) => void;
1820
}
1921

@@ -23,7 +25,7 @@ export default class JobNameAndIndices extends Component<JobNameAndIndicesProps>
2325
}
2426

2527
render() {
26-
const { rollupId, description, onChangeStep, sourceIndex, targetIndex } = this.props;
28+
const { rollupId, description, onChangeStep, sourceIndex, targetIndex, targetIndexSettings } = this.props;
2729

2830
return (
2931
<EuiPanel>
@@ -72,6 +74,14 @@ export default class JobNameAndIndices extends Component<JobNameAndIndicesProps>
7274
<dd>{targetIndex[0].label}</dd>
7375
</EuiText>
7476
</EuiFlexItem>
77+
{targetIndexSettings && (
78+
<EuiFlexItem>
79+
<EuiText size="s">
80+
<dt>Target index Settings</dt>
81+
<dd>{JSON.stringify(getOrderedJson(targetIndexSettings || {}), null, 2)}</dd>
82+
</EuiText>
83+
</EuiFlexItem>
84+
)}
7585
<EuiFlexItem>
7686
<EuiText size="s">
7787
<dt>Description</dt>

public/pages/CreateRollup/components/RollupIndices/RollupIndices.tsx

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,15 +22,21 @@ import { IndexItem } from "../../../../../models/interfaces";
2222
import IndexService from "../../../../services/IndexService";
2323
import { CoreServicesContext } from "../../../../components/core_services";
2424
import { wildcardOption } from "../../../../utils/helpers";
25+
import AdvancedSettings from "../../../../components/AdvancedSettings";
26+
import flat from "flat";
27+
import { INDEX_SETTINGS_URL } from "../../../../utils/constants";
2528

2629
interface RollupIndicesProps {
2730
indexService: IndexService;
2831
sourceIndex: { label: string; value?: IndexItem }[];
2932
sourceIndexError: string;
3033
targetIndex: { label: string; value?: IndexItem }[];
3134
targetIndexError: string;
35+
targetIndexSettings: Pick<IndexItem, "settings"> | null;
36+
targetIndexSettingsError: string;
3237
onChangeSourceIndex: (options: EuiComboBoxOptionOption<IndexItem>[]) => void;
3338
onChangeTargetIndex: (options: EuiComboBoxOptionOption<IndexItem>[]) => void;
39+
onChangeTargetIndexSettings: (settings: Pick<IndexItem, "settings"> | null) => void;
3440
hasAggregation: boolean;
3541
}
3642

@@ -124,8 +130,11 @@ export default class RollupIndices extends Component<RollupIndicesProps, RollupI
124130
sourceIndexError,
125131
targetIndex,
126132
targetIndexError,
133+
targetIndexSettings,
134+
targetIndexSettingsError,
127135
onChangeSourceIndex,
128136
onChangeTargetIndex,
137+
onChangeTargetIndexSettings,
129138
hasAggregation,
130139
} = this.props;
131140
const { isLoading, indexOptions, targetIndexOptions } = this.state;
@@ -209,6 +218,66 @@ export default class RollupIndices extends Component<RollupIndicesProps, RollupI
209218
data-test-subj="targetIndexCombobox"
210219
/>
211220
</EuiCompressedFormRow>
221+
222+
<EuiCompressedFormRow
223+
error={targetIndexSettingsError}
224+
isInvalid={targetIndexSettingsError != ""}
225+
helpText={
226+
<EuiText size={"xs"}>
227+
{"Optional. The target index settings will be apply only if target index will be created during the rollup."}
228+
{
229+
<EuiLink external href={ROLLUP_RESULTS_HELP_TEXT_LINK} target={"_blank"} rel="noopener noreferrer">
230+
Learn more
231+
</EuiLink>
232+
}
233+
</EuiText>
234+
}
235+
>
236+
<AdvancedSettings
237+
value={targetIndexSettings || {}}
238+
onChange={(val) => {
239+
if (Object.keys(val).length === 0) {
240+
onChangeTargetIndexSettings(null);
241+
} else {
242+
onChangeTargetIndexSettings(val);
243+
}
244+
}}
245+
accordionProps={{
246+
initialIsOpen: false,
247+
id: "accordionForCreateRollupTargetIndexSettings",
248+
buttonContent: <h3>Target index settings</h3>,
249+
}}
250+
editorProps={{
251+
disabled: false,
252+
width: "100%",
253+
formatValue: flat,
254+
}}
255+
rowProps={{
256+
fullWidth: true,
257+
label: "Specify advanced index settings",
258+
helpText: (
259+
<>
260+
<p>
261+
Specify a comma-delimited list of settings.{" "}
262+
<EuiLink href={INDEX_SETTINGS_URL} target="_blank" external>
263+
View index settings
264+
</EuiLink>
265+
</p>
266+
<p>
267+
All the settings will be handled in flat structure.{" "}
268+
<EuiLink
269+
href="https://opensearch.org/docs/latest/api-reference/index-apis/get-index/#query-parameters"
270+
external
271+
target="_blank"
272+
>
273+
Learn more
274+
</EuiLink>
275+
</p>
276+
</>
277+
),
278+
}}
279+
/>
280+
</EuiCompressedFormRow>
212281
</EuiPanel>
213282
);
214283
}

public/pages/CreateRollup/containers/CreateRollup/CreateRollup.tsx

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,16 @@
33
* SPDX-License-Identifier: Apache-2.0
44
*/
55

6-
import React, { ChangeEvent, Component, useContext } from "react";
7-
import { EuiSpacer, EuiTitle, EuiFlexGroup, EuiFlexItem, EuiComboBoxOptionOption, EuiText } from "@elastic/eui";
6+
import React, { ChangeEvent, Component } from "react";
7+
import { EuiSpacer, EuiFlexGroup, EuiFlexItem, EuiComboBoxOptionOption, EuiText } from "@elastic/eui";
88
import { RouteComponentProps } from "react-router-dom";
99
import { RollupService } from "../../../../services";
1010
import ConfigureRollup from "../../components/ConfigureRollup";
1111
import RollupIndices from "../../components/RollupIndices";
1212
import CreateRollupSteps from "../../components/CreateRollupSteps";
1313
import IndexService from "../../../../services/IndexService";
1414
import { IndexItem } from "../../../../../models/interfaces";
15-
import { DataSourceMenuContext, DataSourceMenuProperties } from "../../../../services/DataSourceMenuContext";
15+
import { DataSourceMenuProperties } from "../../../../services/DataSourceMenuContext";
1616

1717
interface CreateRollupProps extends RouteComponentProps, DataSourceMenuProperties {
1818
rollupService: RollupService;
@@ -27,10 +27,13 @@ interface CreateRollupProps extends RouteComponentProps, DataSourceMenuPropertie
2727
sourceIndexError: string;
2828
targetIndex: { label: string; value?: IndexItem }[];
2929
targetIndexError: string;
30+
targetIndexSettings: Pick<IndexItem, "settings"> | null;
31+
targetIndexSettingsError: string;
3032
onChangeName: (e: ChangeEvent<HTMLInputElement>) => void;
3133
onChangeDescription: (value: ChangeEvent<HTMLTextAreaElement>) => void;
3234
onChangeSourceIndex: (options: EuiComboBoxOptionOption<IndexItem>[]) => void;
3335
onChangeTargetIndex: (options: EuiComboBoxOptionOption<IndexItem>[]) => void;
36+
onChangeTargetIndexSettings: (settings: Pick<IndexItem, "settings"> | null) => void;
3437
currentStep: number;
3538
hasAggregation: boolean;
3639
useNewUX: boolean;

public/pages/CreateRollup/containers/CreateRollupForm/CreateRollupForm.tsx

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
import React, { ChangeEvent, Component, useContext } from "react";
77
import { EuiSmallButton, EuiSmallButtonEmpty, EuiComboBoxOptionOption, EuiFlexGroup, EuiFlexItem } from "@elastic/eui";
8-
import { RouteComponentProps, useHistory } from "react-router-dom";
8+
import { RouteComponentProps } from "react-router-dom";
99
import moment from "moment";
1010
import { RollupService } from "../../../../services";
1111
import { BREADCRUMBS, ROUTES } from "../../../../utils/constants";
@@ -24,7 +24,6 @@ import { CoreServicesContext } from "../../../../components/core_services";
2424
import {
2525
DataSourceMenuContext,
2626
DataSourceMenuProperties,
27-
DataSourceMenuReadOnlyContext,
2827
DataSourceMenuReadOnlyProperties,
2928
} from "../../../../services/DataSourceMenuContext";
3029
import { useUpdateUrlWithDataSourceProperties } from "../../../../components/MDSEnabledComponent";
@@ -53,6 +52,8 @@ interface CreateRollupFormState {
5352
sourceIndexError: string;
5453
targetIndex: { label: string; value?: IndexItem }[];
5554
targetIndexError: string;
55+
targetIndexSettings: Pick<IndexItem, "settings"> | null;
56+
targetIndexSettingsError: string;
5657

5758
mappings: any;
5859
allMappings: FieldItem[][];
@@ -115,6 +116,8 @@ export class CreateRollupForm extends Component<CreateRollupFormProps, CreateRol
115116
sourceIndexError: "",
116117
targetIndex: [],
117118
targetIndexError: "",
119+
targetIndexSettings: null,
120+
targetIndexSettingsError: "",
118121

119122
timestamp: [],
120123
timestampError: "",
@@ -333,6 +336,12 @@ export class CreateRollupForm extends Component<CreateRollupFormProps, CreateRol
333336
this.setState({ targetIndex: options, rollupJSON: newJSON, targetIndexError: targetIndexError });
334337
};
335338

339+
onChangeTargetIndexSettings = (settings: Pick<IndexItem, "settings"> | null): void => {
340+
let newJSON = this.state.rollupJSON;
341+
newJSON.rollup.target_index_settings = settings;
342+
this.setState({ targetIndexSettings: settings, rollupJSON: newJSON });
343+
};
344+
336345
onChangeIntervalType = (intervalType: string): void => {
337346
this.setState({ intervalType, timeunit: "h" });
338347
};
@@ -573,6 +582,8 @@ export class CreateRollupForm extends Component<CreateRollupFormProps, CreateRol
573582
sourceIndexError,
574583
targetIndex,
575584
targetIndexError,
585+
targetIndexSettings,
586+
targetIndexSettingsError,
576587
currentStep,
577588

578589
timestamp,
@@ -614,10 +625,13 @@ export class CreateRollupForm extends Component<CreateRollupFormProps, CreateRol
614625
sourceIndexError={sourceIndexError}
615626
targetIndex={targetIndex}
616627
targetIndexError={targetIndexError}
628+
targetIndexSettings={targetIndexSettings}
629+
targetIndexSettingsError={targetIndexSettingsError}
617630
onChangeName={this.onChangeName}
618631
onChangeDescription={this.onChangeDescription}
619632
onChangeSourceIndex={this.onChangeSourceIndex}
620633
onChangeTargetIndex={this.onChangeTargetIndex}
634+
onChangeTargetIndexSettings={this.onChangeTargetIndexSettings}
621635
currentStep={this.state.currentStep}
622636
hasAggregation={selectedDimensionField.length != 0 || selectedMetrics.length != 0}
623637
useNewUX={useNewUX}
@@ -677,6 +691,7 @@ export class CreateRollupForm extends Component<CreateRollupFormProps, CreateRol
677691
description={description}
678692
sourceIndex={sourceIndex}
679693
targetIndex={targetIndex}
694+
targetIndexSettings={targetIndexSettings}
680695
intervalType={intervalType}
681696
intervalValue={intervalValue}
682697
timestamp={timestamp}

public/pages/CreateRollup/containers/CreateRollupStep4/CreateRollupStep4.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
*/
55

66
import React, { Component } from "react";
7-
import { EuiSpacer, EuiTitle, EuiFlexGroup, EuiFlexItem, EuiComboBoxOptionOption, EuiCallOut, EuiText } from "@elastic/eui";
7+
import { EuiSpacer, EuiFlexGroup, EuiFlexItem, EuiComboBoxOptionOption, EuiCallOut, EuiText } from "@elastic/eui";
88
import { RouteComponentProps } from "react-router-dom";
99
import { RollupService } from "../../../../services";
1010
import { BREADCRUMBS, ROUTES } from "../../../../utils/constants";
@@ -24,6 +24,7 @@ interface CreateRollupProps extends RouteComponentProps {
2424
description: string;
2525
sourceIndex: { label: string; value?: IndexItem }[];
2626
targetIndex: { label: string; value?: IndexItem }[];
27+
targetIndexSettings: Pick<IndexItem, "settings"> | null;
2728

2829
timestamp: EuiComboBoxOptionOption<String>[];
2930
intervalType: string;

public/pages/RollupDetails/components/GeneralInformation/GeneralInformation.tsx

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,15 @@
55

66
import React, { Component } from "react";
77
import { EuiFlexGrid, EuiSpacer, EuiFlexItem, EuiText, EuiFlexGroup, EuiHorizontalRule, EuiPanel, EuiTitle } from "@elastic/eui";
8-
import { ContentPanel, ContentPanelActions } from "../../../../components/ContentPanel";
8+
import { ContentPanelActions } from "../../../../components/ContentPanel";
99
import { ModalConsumer } from "../../../../components/Modal";
1010

1111
interface GeneralInformationProps {
1212
rollupId: string;
1313
description: string;
1414
sourceIndex: string;
1515
targetIndex: string;
16+
targetIndexSettings: string | null;
1617
scheduleText: string;
1718
pageSize: number;
1819
lastUpdated: string;
@@ -26,11 +27,23 @@ export default class GeneralInformation extends Component<GeneralInformationProp
2627
}
2728

2829
render() {
29-
const { rollupId, description, onEdit, sourceIndex, targetIndex, scheduleText, pageSize, lastUpdated, useNewUX } = this.props;
30+
const {
31+
rollupId,
32+
description,
33+
onEdit,
34+
sourceIndex,
35+
targetIndex,
36+
targetIndexSettings,
37+
scheduleText,
38+
pageSize,
39+
lastUpdated,
40+
useNewUX,
41+
} = this.props;
3042
const infoItems = [
3143
{ term: "Name", value: rollupId },
3244
{ term: "Source index", value: sourceIndex },
3345
{ term: "Target index", value: targetIndex },
46+
{ term: "Target index settings", value: targetIndexSettings },
3447
{ term: "Schedule", value: scheduleText },
3548
{ term: "Description", value: description || "-" },
3649
{ term: "Last updated", value: lastUpdated },
@@ -61,14 +74,16 @@ export default class GeneralInformation extends Component<GeneralInformationProp
6174
<EuiHorizontalRule margin={"xs"} />
6275
<div>
6376
<EuiFlexGrid columns={4}>
64-
{infoItems.map((item) => (
65-
<EuiFlexItem key={`${item.term}#${item.value}`}>
66-
<EuiText size="s">
67-
<dt>{item.term}</dt>
68-
<dd>{item.value}</dd>
69-
</EuiText>
70-
</EuiFlexItem>
71-
))}
77+
{infoItems
78+
.filter((v) => v.value != null)
79+
.map((item) => (
80+
<EuiFlexItem key={`${item.term}#${item.value}`}>
81+
<EuiText size="s">
82+
<dt>{item.term}</dt>
83+
<dd>{item.value}</dd>
84+
</EuiText>
85+
</EuiFlexItem>
86+
))}
7287
</EuiFlexGrid>
7388
<EuiSpacer size="s" />
7489
</div>

0 commit comments

Comments
 (0)