88
99package org .elasticsearch .rest .action .cat ;
1010
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 ;
1416import org .elasticsearch .client .node .NodeClient ;
15- import org .elasticsearch .cluster .metadata .IndexTemplateMetadata ;
1617import 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 ;
1820import org .elasticsearch .common .Table ;
1921import org .elasticsearch .common .regex .Regex ;
2022import org .elasticsearch .rest .RestRequest ;
2123import org .elasticsearch .rest .RestResponse ;
2224import org .elasticsearch .rest .action .RestResponseListener ;
2325
26+ import java .util .ArrayList ;
27+ import java .util .HashSet ;
2428import java .util .List ;
2529import java .util .Map ;
30+ import java .util .Set ;
31+ import java .util .function .Predicate ;
2632
2733import static java .util .Arrays .asList ;
2834import static java .util .Collections .unmodifiableList ;
@@ -49,18 +55,43 @@ protected void documentation(StringBuilder sb) {
4955
5056 @ Override
5157 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+ };
6495 }
6596
6697 @ Override
@@ -76,26 +107,30 @@ protected Table getTableWithHeader(RestRequest request) {
76107 return table ;
77108 }
78109
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 ();
93128 }
94129
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 ();
99134 table .startRow ();
100135 table .addCell (name );
101136 table .addCell ("[" + String .join (", " , template .indexPatterns ()) + "]" );
@@ -105,6 +140,41 @@ private Table buildTable(RestRequest request, ClusterStateResponse clusterStateR
105140 table .endRow ();
106141 }
107142 }
143+
108144 return table ;
109145 }
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+ }
110180}
0 commit comments