Skip to content

Commit c76bfeb

Browse files
authored
Template creation using context (#14811)
* Template creation using context Signed-off-by: Mohit Godwani <[email protected]>
1 parent 1fe58b5 commit c76bfeb

File tree

13 files changed

+862
-43
lines changed

13 files changed

+862
-43
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
3131
- Create listener to refresh search thread resource usage ([#14832](https://github.com/opensearch-project/OpenSearch/pull/14832))
3232
- Add rest, transport layer changes for hot to warm tiering - dedicated setup (([#13980](https://github.com/opensearch-project/OpenSearch/pull/13980))
3333
- Optimize Cluster Stats Indices to precomute node level stats ([#14426](https://github.com/opensearch-project/OpenSearch/pull/14426))
34+
- Add logic to create index templates (v2) using context field ([#14811](https://github.com/opensearch-project/OpenSearch/pull/14811))
3435

3536
### Dependencies
3637
- Bump `org.gradle.test-retry` from 1.5.8 to 1.5.9 ([#13442](https://github.com/opensearch-project/OpenSearch/pull/13442))

server/src/main/java/org/opensearch/action/admin/indices/template/post/TransportSimulateIndexTemplateAction.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,8 @@ protected void clusterManagerOperation(
140140
MetadataIndexTemplateService.validateV2TemplateRequest(
141141
state.metadata(),
142142
simulateTemplateToAdd,
143-
request.getIndexTemplateRequest().indexTemplate()
143+
request.getIndexTemplateRequest().indexTemplate(),
144+
clusterService.getClusterSettings()
144145
);
145146
stateWithTemplate = indexTemplateService.addIndexTemplateV2(
146147
state,

server/src/main/java/org/opensearch/action/admin/indices/template/post/TransportSimulateTemplateAction.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,8 @@ protected void clusterManagerOperation(
134134
MetadataIndexTemplateService.validateV2TemplateRequest(
135135
state.metadata(),
136136
simulateTemplateToAdd,
137-
request.getIndexTemplateRequest().indexTemplate()
137+
request.getIndexTemplateRequest().indexTemplate(),
138+
clusterService.getClusterSettings()
138139
);
139140
stateWithTemplate = indexTemplateService.addIndexTemplateV2(
140141
state,

server/src/main/java/org/opensearch/cluster/applicationtemplates/SystemTemplateMetadata.java

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010

1111
import org.opensearch.common.annotation.ExperimentalApi;
1212

13+
import java.util.Objects;
14+
1315
/**
1416
* Metadata information about a template available in a template repository.
1517
*/
@@ -48,13 +50,14 @@ public long version() {
4850
* @return Metadata object based on name
4951
*/
5052
public static SystemTemplateMetadata fromComponentTemplate(String fullyQualifiedName) {
51-
assert fullyQualifiedName.length() > 1 : "System template name must have at least one component";
52-
assert fullyQualifiedName.substring(1, fullyQualifiedName.indexOf(DELIMITER, 1)).equals(COMPONENT_TEMPLATE_TYPE);
53+
assert fullyQualifiedName.length() > DELIMITER.length() * 3 + 2 + COMPONENT_TEMPLATE_TYPE.length()
54+
: "System template name must have all defined components";
55+
assert (DELIMITER + fullyQualifiedName.substring(1, fullyQualifiedName.indexOf(DELIMITER, 1))).equals(COMPONENT_TEMPLATE_TYPE);
5356

5457
return new SystemTemplateMetadata(
55-
Long.parseLong(fullyQualifiedName.substring(fullyQualifiedName.lastIndexOf(DELIMITER))),
58+
Long.parseLong(fullyQualifiedName.substring(fullyQualifiedName.lastIndexOf(DELIMITER) + 1)),
5659
COMPONENT_TEMPLATE_TYPE,
57-
fullyQualifiedName.substring(0, fullyQualifiedName.lastIndexOf(DELIMITER))
60+
fullyQualifiedName.substring(fullyQualifiedName.indexOf(DELIMITER, 2) + 1, fullyQualifiedName.lastIndexOf(DELIMITER))
5861
);
5962
}
6063

@@ -65,4 +68,22 @@ public static SystemTemplateMetadata fromComponentTemplateInfo(String name, long
6568
public final String fullyQualifiedName() {
6669
return type + DELIMITER + name + DELIMITER + version;
6770
}
71+
72+
@Override
73+
public boolean equals(Object o) {
74+
if (this == o) return true;
75+
if (o == null || getClass() != o.getClass()) return false;
76+
SystemTemplateMetadata that = (SystemTemplateMetadata) o;
77+
return version == that.version && Objects.equals(type, that.type) && Objects.equals(name, that.name);
78+
}
79+
80+
@Override
81+
public int hashCode() {
82+
return Objects.hash(version, type, name);
83+
}
84+
85+
@Override
86+
public String toString() {
87+
return "SystemTemplateMetadata{" + "version=" + version + ", type='" + type + '\'' + ", name='" + name + '\'' + '}';
88+
}
6889
}

server/src/main/java/org/opensearch/cluster/applicationtemplates/SystemTemplatesService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ void refreshTemplates(boolean verification) {
8585
int failedLoadingRepositories = 0;
8686
List<Exception> exceptions = new ArrayList<>();
8787

88-
if (loaded.compareAndSet(false, true) && enabledTemplates) {
88+
if ((verification || loaded.compareAndSet(false, true)) && enabledTemplates) {
8989
for (SystemTemplatesPlugin plugin : systemTemplatesPluginList) {
9090
try (SystemTemplateRepository repository = plugin.loadRepository()) {
9191

server/src/main/java/org/opensearch/cluster/applicationtemplates/TemplateRepositoryMetadata.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010

1111
import org.opensearch.common.annotation.ExperimentalApi;
1212

13+
import java.util.Objects;
14+
1315
/**
1416
* The information to uniquely identify a template repository.
1517
*/
@@ -31,4 +33,22 @@ public String id() {
3133
public long version() {
3234
return version;
3335
}
36+
37+
@Override
38+
public boolean equals(Object o) {
39+
if (this == o) return true;
40+
if (o == null || getClass() != o.getClass()) return false;
41+
TemplateRepositoryMetadata that = (TemplateRepositoryMetadata) o;
42+
return version == that.version && Objects.equals(id, that.id);
43+
}
44+
45+
@Override
46+
public int hashCode() {
47+
return Objects.hash(id, version);
48+
}
49+
50+
@Override
51+
public String toString() {
52+
return "TemplateRepositoryMetadata{" + "id='" + id + '\'' + ", version=" + version + '}';
53+
}
3454
}

server/src/main/java/org/opensearch/cluster/coordination/OpenSearchNodeCommand.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
import org.opensearch.cluster.ClusterName;
4848
import org.opensearch.cluster.ClusterState;
4949
import org.opensearch.cluster.Diff;
50+
import org.opensearch.cluster.metadata.ComponentTemplateMetadata;
5051
import org.opensearch.cluster.metadata.DataStreamMetadata;
5152
import org.opensearch.cluster.metadata.Metadata;
5253
import org.opensearch.common.collect.Tuple;
@@ -94,9 +95,10 @@ public abstract class OpenSearchNodeCommand extends EnvironmentAwareCommand {
9495
public <T, C> T parseNamedObject(Class<T> categoryClass, String name, XContentParser parser, C context) throws IOException {
9596
// Currently, two unknown top-level objects are present
9697
if (Metadata.Custom.class.isAssignableFrom(categoryClass)) {
97-
if (DataStreamMetadata.TYPE.equals(name)) {
98+
if (DataStreamMetadata.TYPE.equals(name) || ComponentTemplateMetadata.TYPE.equals(name)) {
9899
// DataStreamMetadata is used inside Metadata class for validation purposes and building the indicesLookup,
99-
// therefor even es node commands need to be able to parse it.
100+
// ComponentTemplateMetadata is used inside Metadata class for building the systemTemplatesLookup,
101+
// therefor even OpenSearch node commands need to be able to parse it.
100102
return super.parseNamedObject(categoryClass, name, parser, context);
101103
// TODO: Try to parse other named objects (e.g. stored scripts, ingest pipelines) that are part of core es as well?
102104
// Note that supporting PersistentTasksCustomMetadata is trickier, because PersistentTaskParams is a named object too.

server/src/main/java/org/opensearch/cluster/metadata/ComposableIndexTemplate.java

Lines changed: 41 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232

3333
package org.opensearch.cluster.metadata;
3434

35+
import org.opensearch.Version;
3536
import org.opensearch.cluster.AbstractDiffable;
3637
import org.opensearch.cluster.Diff;
3738
import org.opensearch.cluster.metadata.DataStream.TimestampField;
@@ -75,6 +76,7 @@ public class ComposableIndexTemplate extends AbstractDiffable<ComposableIndexTem
7576
private static final ParseField VERSION = new ParseField("version");
7677
private static final ParseField METADATA = new ParseField("_meta");
7778
private static final ParseField DATA_STREAM = new ParseField("data_stream");
79+
private static final ParseField CONTEXT = new ParseField("context");
7880

7981
@SuppressWarnings("unchecked")
8082
public static final ConstructingObjectParser<ComposableIndexTemplate, Void> PARSER = new ConstructingObjectParser<>(
@@ -87,7 +89,8 @@ public class ComposableIndexTemplate extends AbstractDiffable<ComposableIndexTem
8789
(Long) a[3],
8890
(Long) a[4],
8991
(Map<String, Object>) a[5],
90-
(DataStreamTemplate) a[6]
92+
(DataStreamTemplate) a[6],
93+
(Context) a[7]
9194
)
9295
);
9396

@@ -99,6 +102,7 @@ public class ComposableIndexTemplate extends AbstractDiffable<ComposableIndexTem
99102
PARSER.declareLong(ConstructingObjectParser.optionalConstructorArg(), VERSION);
100103
PARSER.declareObject(ConstructingObjectParser.optionalConstructorArg(), (p, c) -> p.map(), METADATA);
101104
PARSER.declareObject(ConstructingObjectParser.optionalConstructorArg(), DataStreamTemplate.PARSER, DATA_STREAM);
105+
PARSER.declareObject(ConstructingObjectParser.optionalConstructorArg(), Context.PARSER, CONTEXT);
102106
}
103107

104108
private final List<String> indexPatterns;
@@ -114,6 +118,8 @@ public class ComposableIndexTemplate extends AbstractDiffable<ComposableIndexTem
114118
private final Map<String, Object> metadata;
115119
@Nullable
116120
private final DataStreamTemplate dataStreamTemplate;
121+
@Nullable
122+
private final Context context;
117123

118124
static Diff<ComposableIndexTemplate> readITV2DiffFrom(StreamInput in) throws IOException {
119125
return AbstractDiffable.readDiffFrom(ComposableIndexTemplate::new, in);
@@ -131,7 +137,7 @@ public ComposableIndexTemplate(
131137
@Nullable Long version,
132138
@Nullable Map<String, Object> metadata
133139
) {
134-
this(indexPatterns, template, componentTemplates, priority, version, metadata, null);
140+
this(indexPatterns, template, componentTemplates, priority, version, metadata, null, null);
135141
}
136142

137143
public ComposableIndexTemplate(
@@ -142,6 +148,19 @@ public ComposableIndexTemplate(
142148
@Nullable Long version,
143149
@Nullable Map<String, Object> metadata,
144150
@Nullable DataStreamTemplate dataStreamTemplate
151+
) {
152+
this(indexPatterns, template, componentTemplates, priority, version, metadata, dataStreamTemplate, null);
153+
}
154+
155+
public ComposableIndexTemplate(
156+
List<String> indexPatterns,
157+
@Nullable Template template,
158+
@Nullable List<String> componentTemplates,
159+
@Nullable Long priority,
160+
@Nullable Long version,
161+
@Nullable Map<String, Object> metadata,
162+
@Nullable DataStreamTemplate dataStreamTemplate,
163+
@Nullable Context context
145164
) {
146165
this.indexPatterns = indexPatterns;
147166
this.template = template;
@@ -150,6 +169,7 @@ public ComposableIndexTemplate(
150169
this.version = version;
151170
this.metadata = metadata;
152171
this.dataStreamTemplate = dataStreamTemplate;
172+
this.context = context;
153173
}
154174

155175
public ComposableIndexTemplate(StreamInput in) throws IOException {
@@ -164,6 +184,11 @@ public ComposableIndexTemplate(StreamInput in) throws IOException {
164184
this.version = in.readOptionalVLong();
165185
this.metadata = in.readMap();
166186
this.dataStreamTemplate = in.readOptionalWriteable(DataStreamTemplate::new);
187+
if (in.getVersion().onOrAfter(Version.V_3_0_0)) {
188+
this.context = in.readOptionalWriteable(Context::new);
189+
} else {
190+
this.context = null;
191+
}
167192
}
168193

169194
public List<String> indexPatterns() {
@@ -205,6 +230,10 @@ public DataStreamTemplate getDataStreamTemplate() {
205230
return dataStreamTemplate;
206231
}
207232

233+
public Context context() {
234+
return context;
235+
}
236+
208237
@Override
209238
public void writeTo(StreamOutput out) throws IOException {
210239
out.writeStringCollection(this.indexPatterns);
@@ -219,6 +248,9 @@ public void writeTo(StreamOutput out) throws IOException {
219248
out.writeOptionalVLong(this.version);
220249
out.writeMap(this.metadata);
221250
out.writeOptionalWriteable(dataStreamTemplate);
251+
if (out.getVersion().onOrAfter(Version.V_3_0_0)) {
252+
out.writeOptionalWriteable(context);
253+
}
222254
}
223255

224256
@Override
@@ -243,6 +275,9 @@ public XContentBuilder toXContent(XContentBuilder builder, Params params) throws
243275
if (this.dataStreamTemplate != null) {
244276
builder.field(DATA_STREAM.getPreferredName(), dataStreamTemplate);
245277
}
278+
if (this.context != null) {
279+
builder.field(CONTEXT.getPreferredName(), context);
280+
}
246281
builder.endObject();
247282
return builder;
248283
}
@@ -256,7 +291,8 @@ public int hashCode() {
256291
this.priority,
257292
this.version,
258293
this.metadata,
259-
this.dataStreamTemplate
294+
this.dataStreamTemplate,
295+
this.context
260296
);
261297
}
262298

@@ -275,7 +311,8 @@ public boolean equals(Object obj) {
275311
&& Objects.equals(this.priority, other.priority)
276312
&& Objects.equals(this.version, other.version)
277313
&& Objects.equals(this.metadata, other.metadata)
278-
&& Objects.equals(this.dataStreamTemplate, other.dataStreamTemplate);
314+
&& Objects.equals(this.dataStreamTemplate, other.dataStreamTemplate)
315+
&& Objects.equals(this.context, other.context);
279316
}
280317

281318
@Override

0 commit comments

Comments
 (0)