8
8
9
9
package org .elasticsearch .rest .action .cat ;
10
10
11
- import com .carrotsearch .hppc .cursors .ObjectObjectCursor ;
12
- import org .elasticsearch .action .admin .cluster .state .ClusterStateRequest ;
13
- import org .elasticsearch .action .admin .cluster .state .ClusterStateResponse ;
11
+ import org .elasticsearch .action .ActionListener ;
12
+ import org .elasticsearch .action .StepListener ;
13
+ import org .elasticsearch .action .admin .indices .template .get .GetComposableIndexTemplateAction ;
14
+ import org .elasticsearch .action .admin .indices .template .get .GetIndexTemplatesRequest ;
15
+ import org .elasticsearch .action .admin .indices .template .get .GetIndexTemplatesResponse ;
14
16
import org .elasticsearch .client .node .NodeClient ;
15
- import org .elasticsearch .cluster .metadata .IndexTemplateMetadata ;
16
17
import org .elasticsearch .cluster .metadata .ComposableIndexTemplate ;
17
- import org .elasticsearch .cluster .metadata .Metadata ;
18
+ import org .elasticsearch .cluster .metadata .IndexTemplateMetadata ;
19
+ import org .elasticsearch .common .Strings ;
18
20
import org .elasticsearch .common .Table ;
19
21
import org .elasticsearch .common .regex .Regex ;
20
22
import org .elasticsearch .rest .RestRequest ;
21
23
import org .elasticsearch .rest .RestResponse ;
22
24
import org .elasticsearch .rest .action .RestResponseListener ;
23
25
26
+ import java .util .ArrayList ;
27
+ import java .util .HashSet ;
24
28
import java .util .List ;
25
29
import java .util .Map ;
30
+ import java .util .Set ;
31
+ import java .util .function .Predicate ;
26
32
27
33
import static java .util .Arrays .asList ;
28
34
import static java .util .Collections .unmodifiableList ;
@@ -49,18 +55,43 @@ protected void documentation(StringBuilder sb) {
49
55
50
56
@ Override
51
57
protected RestChannelConsumer doCatRequest (final RestRequest request , NodeClient client ) {
52
- final String matchPattern = request .hasParam ("name" ) ? request .param ("name" ) : null ;
53
- final ClusterStateRequest clusterStateRequest = new ClusterStateRequest ();
54
- clusterStateRequest .clear ().metadata (true );
55
- clusterStateRequest .local (request .paramAsBoolean ("local" , clusterStateRequest .local ()));
56
- clusterStateRequest .masterNodeTimeout (request .paramAsTime ("master_timeout" , clusterStateRequest .masterNodeTimeout ()));
57
-
58
- return channel -> client .admin ().cluster ().state (clusterStateRequest , new RestResponseListener <ClusterStateResponse >(channel ) {
59
- @ Override
60
- public RestResponse buildResponse (ClusterStateResponse clusterStateResponse ) throws Exception {
61
- return RestTable .buildResponse (buildTable (request , clusterStateResponse , matchPattern ), channel );
62
- }
63
- });
58
+ final String [] templateNames = Strings .splitStringByCommaToArray (request .param ("name" , "" ));
59
+
60
+ final GetIndexTemplatesRequest getIndexTemplatesRequest = new GetIndexTemplatesRequest (templateNames );
61
+ getIndexTemplatesRequest .local (request .paramAsBoolean ("local" , getIndexTemplatesRequest .local ()));
62
+ getIndexTemplatesRequest .masterNodeTimeout (request .paramAsTime ("master_timeout" , getIndexTemplatesRequest .masterNodeTimeout ()));
63
+
64
+ final GetComposableIndexTemplateAction .Request getComposableTemplatesRequest
65
+ = new GetComposableIndexTemplateAction .Request ();
66
+ getComposableTemplatesRequest .local (request .paramAsBoolean ("local" , getComposableTemplatesRequest .local ()));
67
+ getComposableTemplatesRequest .masterNodeTimeout (
68
+ request .paramAsTime ("master_timeout" , getComposableTemplatesRequest .masterNodeTimeout ()));
69
+
70
+ return channel -> {
71
+
72
+ final StepListener <GetIndexTemplatesResponse > getIndexTemplatesStep = new StepListener <>();
73
+ client .admin ().indices ().getTemplates (getIndexTemplatesRequest , getIndexTemplatesStep );
74
+
75
+ final StepListener <GetComposableIndexTemplateAction .Response > getComposableTemplatesStep = new StepListener <>();
76
+ client .execute (GetComposableIndexTemplateAction .INSTANCE , getComposableTemplatesRequest , getComposableTemplatesStep );
77
+
78
+ final ActionListener <Table > tableListener = new RestResponseListener <Table >(channel ) {
79
+ @ Override
80
+ public RestResponse buildResponse (Table table ) throws Exception {
81
+ return RestTable .buildResponse (table , channel );
82
+ }
83
+ };
84
+
85
+ getIndexTemplatesStep .whenComplete (getIndexTemplatesResponse ->
86
+ getComposableTemplatesStep .whenComplete (getComposableIndexTemplatesResponse ->
87
+ ActionListener .completeWith (tableListener , () -> buildTable (
88
+ request ,
89
+ getIndexTemplatesResponse ,
90
+ getComposableIndexTemplatesResponse ,
91
+ templateNames )
92
+ ), tableListener ::onFailure
93
+ ), tableListener ::onFailure );
94
+ };
64
95
}
65
96
66
97
@ Override
@@ -76,26 +107,30 @@ protected Table getTableWithHeader(RestRequest request) {
76
107
return table ;
77
108
}
78
109
79
- private Table buildTable (RestRequest request , ClusterStateResponse clusterStateResponse , String patternString ) {
80
- Table table = getTableWithHeader (request );
81
- Metadata metadata = clusterStateResponse .getState ().metadata ();
82
- for (ObjectObjectCursor <String , IndexTemplateMetadata > entry : metadata .templates ()) {
83
- IndexTemplateMetadata indexData = entry .value ;
84
- if (patternString == null || Regex .simpleMatch (patternString , indexData .name ())) {
85
- table .startRow ();
86
- table .addCell (indexData .name ());
87
- table .addCell ("[" + String .join (", " , indexData .patterns ()) + "]" );
88
- table .addCell (indexData .getOrder ());
89
- table .addCell (indexData .getVersion ());
90
- table .addCell ("" );
91
- table .endRow ();
92
- }
110
+ private Table buildTable (
111
+ RestRequest request ,
112
+ GetIndexTemplatesResponse getIndexTemplatesResponse ,
113
+ GetComposableIndexTemplateAction .Response getComposableIndexTemplatesResponse ,
114
+ String [] requestedNames
115
+ ) {
116
+ final Predicate <String > namePredicate = getNamePredicate (requestedNames );
117
+
118
+ final Table table = getTableWithHeader (request );
119
+ for (IndexTemplateMetadata indexData : getIndexTemplatesResponse .getIndexTemplates ()) {
120
+ assert namePredicate .test (indexData .getName ());
121
+ table .startRow ();
122
+ table .addCell (indexData .name ());
123
+ table .addCell ("[" + String .join (", " , indexData .patterns ()) + "]" );
124
+ table .addCell (indexData .getOrder ());
125
+ table .addCell (indexData .getVersion ());
126
+ table .addCell ("" );
127
+ table .endRow ();
93
128
}
94
129
95
- for (Map .Entry <String , ComposableIndexTemplate > entry : metadata . templatesV2 ().entrySet ()) {
96
- String name = entry .getKey ();
97
- ComposableIndexTemplate template = entry . getValue ();
98
- if ( patternString == null || Regex . simpleMatch ( patternString , name )) {
130
+ for (Map .Entry <String , ComposableIndexTemplate > entry : getComposableIndexTemplatesResponse . indexTemplates ().entrySet ()) {
131
+ final String name = entry .getKey ();
132
+ if ( namePredicate . test ( name )) {
133
+ final ComposableIndexTemplate template = entry . getValue ();
99
134
table .startRow ();
100
135
table .addCell (name );
101
136
table .addCell ("[" + String .join (", " , template .indexPatterns ()) + "]" );
@@ -105,6 +140,41 @@ private Table buildTable(RestRequest request, ClusterStateResponse clusterStateR
105
140
table .endRow ();
106
141
}
107
142
}
143
+
108
144
return table ;
109
145
}
146
+
147
+ private Predicate <String > getNamePredicate (String [] requestedNames ) {
148
+ if (requestedNames .length == 0 ) {
149
+ return name -> true ;
150
+ }
151
+
152
+ final Set <String > exactMatches = new HashSet <>();
153
+ final List <String > patterns = new ArrayList <>();
154
+ for (String requestedName : requestedNames ) {
155
+ if (Regex .isMatchAllPattern (requestedName )) {
156
+ return name -> true ;
157
+ } else if (Regex .isSimpleMatchPattern (requestedName )) {
158
+ patterns .add (requestedName );
159
+ } else {
160
+ exactMatches .add (requestedName );
161
+ }
162
+ }
163
+
164
+ if (patterns .isEmpty ()) {
165
+ return exactMatches ::contains ;
166
+ }
167
+
168
+ return name -> {
169
+ if (exactMatches .contains (name )) {
170
+ return true ;
171
+ }
172
+ for (String pattern : patterns ) {
173
+ if (Regex .simpleMatch (pattern , name )) {
174
+ return true ;
175
+ }
176
+ }
177
+ return false ;
178
+ };
179
+ }
110
180
}
0 commit comments