@@ -233,6 +233,7 @@ ClusterState addComponentTemplate(final ClusterState currentState, final boolean
233
233
final Template finalTemplate = new Template (finalSettings ,
234
234
stringMappings == null ? null : new CompressedXContent (stringMappings ), template .template ().aliases ());
235
235
final ComponentTemplate finalComponentTemplate = new ComponentTemplate (finalTemplate , template .version (), template .metadata ());
236
+ validate (name , finalComponentTemplate );
236
237
logger .info ("adding component template [{}]" , name );
237
238
return ClusterState .builder (currentState )
238
239
.metadata (Metadata .builder (currentState .metadata ()).put (name , finalComponentTemplate ))
@@ -402,6 +403,7 @@ public ClusterState addIndexTemplateV2(final ClusterState currentState, final bo
402
403
template .priority (), template .version (), template .metadata ());
403
404
}
404
405
406
+ validate (name , finalIndexTemplate );
405
407
logger .info ("adding index template [{}]" , name );
406
408
return ClusterState .builder (currentState )
407
409
.metadata (Metadata .builder (currentState .metadata ()).put (name , finalIndexTemplate ))
@@ -922,70 +924,126 @@ private static void validateTemplate(Settings validateSettings, String mappings,
922
924
}
923
925
}
924
926
925
- private void validate (PutRequest request ) {
927
+ private void validate (String name , ComponentTemplate template ) {
928
+ validate (name ,
929
+ template .template ().settings (),
930
+ Collections .emptyList (),
931
+ Optional .ofNullable (template .template ().aliases ())
932
+ .map (aliases -> aliases .values ().stream ()
933
+ .map (aliasMeta -> {
934
+ Alias a = new Alias (aliasMeta .alias ());
935
+ if (aliasMeta .filter () != null ) {
936
+ a .filter (aliasMeta .filter ().string ());
937
+ }
938
+ a .searchRouting (aliasMeta .searchRouting ());
939
+ a .indexRouting (aliasMeta .indexRouting ());
940
+ a .isHidden (aliasMeta .isHidden ());
941
+ a .writeIndex (aliasMeta .writeIndex ());
942
+ return a ;
943
+ })
944
+ .collect (Collectors .toList ()))
945
+ .orElse (Collections .emptyList ()));
946
+ }
947
+
948
+ private void validate (String name , IndexTemplateV2 template ) {
949
+ Optional <Template > maybeTemplate = Optional .ofNullable (template .template ());
950
+ validate (name ,
951
+ maybeTemplate .map (Template ::settings ).orElse (Settings .EMPTY ),
952
+ template .indexPatterns (),
953
+ maybeTemplate
954
+ .map (Template ::aliases )
955
+ .map (aliasMap -> aliasMap .values ().stream ()
956
+ .map (aliasMeta -> {
957
+ Alias a = new Alias (aliasMeta .alias ());
958
+ if (aliasMeta .filter () != null ) {
959
+ a .filter (aliasMeta .filter ().string ());
960
+ }
961
+ a .searchRouting (aliasMeta .searchRouting ());
962
+ a .indexRouting (aliasMeta .indexRouting ());
963
+ a .isHidden (aliasMeta .isHidden ());
964
+ a .writeIndex (aliasMeta .writeIndex ());
965
+ return a ;
966
+ })
967
+ .collect (Collectors .toList ()))
968
+ .orElse (Collections .emptyList ()));
969
+ }
970
+
971
+ private void validate (PutRequest putRequest ) {
972
+ validate (putRequest .name , putRequest .settings , putRequest .indexPatterns , putRequest .aliases );
973
+ }
974
+
975
+ private void validate (String name , @ Nullable Settings settings , List <String > indexPatterns , List <Alias > aliases ) {
926
976
List <String > validationErrors = new ArrayList <>();
927
- if (request . name .contains (" " )) {
977
+ if (name .contains (" " )) {
928
978
validationErrors .add ("name must not contain a space" );
929
979
}
930
- if (request . name .contains ("," )) {
980
+ if (name .contains ("," )) {
931
981
validationErrors .add ("name must not contain a ','" );
932
982
}
933
- if (request . name .contains ("#" )) {
983
+ if (name .contains ("#" )) {
934
984
validationErrors .add ("name must not contain a '#'" );
935
985
}
936
- if (request .name .startsWith ("_" )) {
986
+ if (name .contains ("*" )) {
987
+ validationErrors .add ("name must not contain a '*'" );
988
+ }
989
+ if (name .startsWith ("_" )) {
937
990
validationErrors .add ("name must not start with '_'" );
938
991
}
939
- if (! request . name .toLowerCase (Locale .ROOT ).equals (request . name )) {
992
+ if (name .toLowerCase (Locale .ROOT ).equals (name ) == false ) {
940
993
validationErrors .add ("name must be lower cased" );
941
994
}
942
- for (String indexPattern : request . indexPatterns ) {
995
+ for (String indexPattern : indexPatterns ) {
943
996
if (indexPattern .contains (" " )) {
944
- validationErrors .add ("template must not contain a space" );
997
+ validationErrors .add ("index_patterns [" + indexPattern + "] must not contain a space" );
945
998
}
946
999
if (indexPattern .contains ("," )) {
947
- validationErrors .add ("template must not contain a ','" );
1000
+ validationErrors .add ("index_pattern [" + indexPattern + "] must not contain a ','" );
948
1001
}
949
1002
if (indexPattern .contains ("#" )) {
950
- validationErrors .add ("template must not contain a '#'" );
1003
+ validationErrors .add ("index_pattern [" + indexPattern + "] must not contain a '#'" );
951
1004
}
952
1005
if (indexPattern .startsWith ("_" )) {
953
- validationErrors .add ("template must not start with '_'" );
1006
+ validationErrors .add ("index_pattern [" + indexPattern + "] must not start with '_'" );
954
1007
}
955
- if (!Strings .validFileNameExcludingAstrix (indexPattern )) {
956
- validationErrors .add ("template must not contain the following characters " + Strings .INVALID_FILENAME_CHARS );
1008
+ if (Strings .validFileNameExcludingAstrix (indexPattern ) == false ) {
1009
+ validationErrors .add ("index_pattern [" + indexPattern + "] must not contain the following characters " +
1010
+ Strings .INVALID_FILENAME_CHARS );
957
1011
}
958
1012
}
959
1013
960
- try {
961
- indexScopedSettings .validate (request .settings , true ); // templates must be consistent with regards to dependencies
962
- } catch (IllegalArgumentException iae ) {
963
- validationErrors .add (iae .getMessage ());
964
- for (Throwable t : iae .getSuppressed ()) {
965
- validationErrors .add (t .getMessage ());
1014
+
1015
+ if (settings != null ) {
1016
+ try {
1017
+ // templates must be consistent with regards to dependencies
1018
+ indexScopedSettings .validate (settings , true );
1019
+ } catch (IllegalArgumentException iae ) {
1020
+ validationErrors .add (iae .getMessage ());
1021
+ for (Throwable t : iae .getSuppressed ()) {
1022
+ validationErrors .add (t .getMessage ());
1023
+ }
966
1024
}
1025
+ List <String > indexSettingsValidation = metadataCreateIndexService .getIndexSettingsValidationErrors (settings , true );
1026
+ validationErrors .addAll (indexSettingsValidation );
967
1027
}
968
- List <String > indexSettingsValidation = metadataCreateIndexService .getIndexSettingsValidationErrors (request .settings , true );
969
- validationErrors .addAll (indexSettingsValidation );
970
1028
971
- if (request . indexPatterns .stream ().anyMatch (Regex ::isMatchAllPattern )) {
972
- if (IndexMetadata .INDEX_HIDDEN_SETTING .exists (request . settings )) {
1029
+ if (indexPatterns .stream ().anyMatch (Regex ::isMatchAllPattern )) {
1030
+ if (settings != null && IndexMetadata .INDEX_HIDDEN_SETTING .exists (settings )) {
973
1031
validationErrors .add ("global templates may not specify the setting " + IndexMetadata .INDEX_HIDDEN_SETTING .getKey ());
974
1032
}
975
1033
}
976
1034
977
- if (! validationErrors .isEmpty () ) {
1035
+ if (validationErrors .size () > 0 ) {
978
1036
ValidationException validationException = new ValidationException ();
979
1037
validationException .addValidationErrors (validationErrors );
980
- throw new InvalidIndexTemplateException (request . name , validationException .getMessage ());
1038
+ throw new InvalidIndexTemplateException (name , validationException .getMessage ());
981
1039
}
982
1040
983
- for (Alias alias : request . aliases ) {
984
- //we validate the alias only partially, as we don't know yet to which index it'll get applied to
1041
+ for (Alias alias : aliases ) {
1042
+ // we validate the alias only partially, as we don't know yet to which index it'll get applied to
985
1043
aliasValidator .validateAliasStandalone (alias );
986
- if (request . indexPatterns .contains (alias .name ())) {
987
- throw new IllegalArgumentException ("Alias [" + alias .name () +
988
- "] cannot be the same as any pattern in [" + String .join (", " , request . indexPatterns ) + "]" );
1044
+ if (indexPatterns .contains (alias .name ())) {
1045
+ throw new IllegalArgumentException ("alias [" + alias .name () +
1046
+ "] cannot be the same as any pattern in [" + String .join (", " , indexPatterns ) + "]" );
989
1047
}
990
1048
}
991
1049
}
0 commit comments