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 org .elasticsearch .rest .RestRequest .Method .GET ;
2834
@@ -47,18 +53,43 @@ protected void documentation(StringBuilder sb) {
4753
4854 @ Override
4955 protected RestChannelConsumer doCatRequest (final RestRequest request , NodeClient client ) {
50- final String matchPattern = request .hasParam ("name" ) ? request .param ("name" ) : null ;
51- final ClusterStateRequest clusterStateRequest = new ClusterStateRequest ();
52- clusterStateRequest .clear ().metadata (true );
53- clusterStateRequest .local (request .paramAsBoolean ("local" , clusterStateRequest .local ()));
54- clusterStateRequest .masterNodeTimeout (request .paramAsTime ("master_timeout" , clusterStateRequest .masterNodeTimeout ()));
55-
56- return channel -> client .admin ().cluster ().state (clusterStateRequest , new RestResponseListener <ClusterStateResponse >(channel ) {
57- @ Override
58- public RestResponse buildResponse (ClusterStateResponse clusterStateResponse ) throws Exception {
59- return RestTable .buildResponse (buildTable (request , clusterStateResponse , matchPattern ), channel );
60- }
61- });
56+ final String [] templateNames = Strings .splitStringByCommaToArray (request .param ("name" , "" ));
57+
58+ final GetIndexTemplatesRequest getIndexTemplatesRequest = new GetIndexTemplatesRequest (templateNames );
59+ getIndexTemplatesRequest .local (request .paramAsBoolean ("local" , getIndexTemplatesRequest .local ()));
60+ getIndexTemplatesRequest .masterNodeTimeout (request .paramAsTime ("master_timeout" , getIndexTemplatesRequest .masterNodeTimeout ()));
61+
62+ final GetComposableIndexTemplateAction .Request getComposableTemplatesRequest
63+ = new GetComposableIndexTemplateAction .Request ();
64+ getComposableTemplatesRequest .local (request .paramAsBoolean ("local" , getComposableTemplatesRequest .local ()));
65+ getComposableTemplatesRequest .masterNodeTimeout (
66+ request .paramAsTime ("master_timeout" , getComposableTemplatesRequest .masterNodeTimeout ()));
67+
68+ return channel -> {
69+
70+ final StepListener <GetIndexTemplatesResponse > getIndexTemplatesStep = new StepListener <>();
71+ client .admin ().indices ().getTemplates (getIndexTemplatesRequest , getIndexTemplatesStep );
72+
73+ final StepListener <GetComposableIndexTemplateAction .Response > getComposableTemplatesStep = new StepListener <>();
74+ client .execute (GetComposableIndexTemplateAction .INSTANCE , getComposableTemplatesRequest , getComposableTemplatesStep );
75+
76+ final ActionListener <Table > tableListener = new RestResponseListener <>(channel ) {
77+ @ Override
78+ public RestResponse buildResponse (Table table ) throws Exception {
79+ return RestTable .buildResponse (table , channel );
80+ }
81+ };
82+
83+ getIndexTemplatesStep .whenComplete (getIndexTemplatesResponse ->
84+ getComposableTemplatesStep .whenComplete (getComposableIndexTemplatesResponse ->
85+ ActionListener .completeWith (tableListener , () -> buildTable (
86+ request ,
87+ getIndexTemplatesResponse ,
88+ getComposableIndexTemplatesResponse ,
89+ templateNames )
90+ ), tableListener ::onFailure
91+ ), tableListener ::onFailure );
92+ };
6293 }
6394
6495 @ Override
@@ -74,26 +105,30 @@ protected Table getTableWithHeader(RestRequest request) {
74105 return table ;
75106 }
76107
77- private Table buildTable (RestRequest request , ClusterStateResponse clusterStateResponse , String patternString ) {
78- Table table = getTableWithHeader (request );
79- Metadata metadata = clusterStateResponse .getState ().metadata ();
80- for (ObjectObjectCursor <String , IndexTemplateMetadata > entry : metadata .templates ()) {
81- IndexTemplateMetadata indexData = entry .value ;
82- if (patternString == null || Regex .simpleMatch (patternString , indexData .name ())) {
83- table .startRow ();
84- table .addCell (indexData .name ());
85- table .addCell ("[" + String .join (", " , indexData .patterns ()) + "]" );
86- table .addCell (indexData .getOrder ());
87- table .addCell (indexData .getVersion ());
88- table .addCell ("" );
89- table .endRow ();
90- }
108+ private Table buildTable (
109+ RestRequest request ,
110+ GetIndexTemplatesResponse getIndexTemplatesResponse ,
111+ GetComposableIndexTemplateAction .Response getComposableIndexTemplatesResponse ,
112+ String [] requestedNames
113+ ) {
114+ final Predicate <String > namePredicate = getNamePredicate (requestedNames );
115+
116+ final Table table = getTableWithHeader (request );
117+ for (IndexTemplateMetadata indexData : getIndexTemplatesResponse .getIndexTemplates ()) {
118+ assert namePredicate .test (indexData .getName ());
119+ table .startRow ();
120+ table .addCell (indexData .name ());
121+ table .addCell ("[" + String .join (", " , indexData .patterns ()) + "]" );
122+ table .addCell (indexData .getOrder ());
123+ table .addCell (indexData .getVersion ());
124+ table .addCell ("" );
125+ table .endRow ();
91126 }
92127
93- for (Map .Entry <String , ComposableIndexTemplate > entry : metadata . templatesV2 ().entrySet ()) {
94- String name = entry .getKey ();
95- ComposableIndexTemplate template = entry . getValue ();
96- if ( patternString == null || Regex . simpleMatch ( patternString , name )) {
128+ for (Map .Entry <String , ComposableIndexTemplate > entry : getComposableIndexTemplatesResponse . indexTemplates ().entrySet ()) {
129+ final String name = entry .getKey ();
130+ if ( namePredicate . test ( name )) {
131+ final ComposableIndexTemplate template = entry . getValue ();
97132 table .startRow ();
98133 table .addCell (name );
99134 table .addCell ("[" + String .join (", " , template .indexPatterns ()) + "]" );
@@ -103,6 +138,41 @@ private Table buildTable(RestRequest request, ClusterStateResponse clusterStateR
103138 table .endRow ();
104139 }
105140 }
141+
106142 return table ;
107143 }
144+
145+ private Predicate <String > getNamePredicate (String [] requestedNames ) {
146+ if (requestedNames .length == 0 ) {
147+ return name -> true ;
148+ }
149+
150+ final Set <String > exactMatches = new HashSet <>();
151+ final List <String > patterns = new ArrayList <>();
152+ for (String requestedName : requestedNames ) {
153+ if (Regex .isMatchAllPattern (requestedName )) {
154+ return name -> true ;
155+ } else if (Regex .isSimpleMatchPattern (requestedName )) {
156+ patterns .add (requestedName );
157+ } else {
158+ exactMatches .add (requestedName );
159+ }
160+ }
161+
162+ if (patterns .isEmpty ()) {
163+ return exactMatches ::contains ;
164+ }
165+
166+ return name -> {
167+ if (exactMatches .contains (name )) {
168+ return true ;
169+ }
170+ for (String pattern : patterns ) {
171+ if (Regex .simpleMatch (pattern , name )) {
172+ return true ;
173+ }
174+ }
175+ return false ;
176+ };
177+ }
108178}
0 commit comments