1313import org .elasticsearch .action .ActionType ;
1414import org .elasticsearch .action .admin .indices .template .put .PutComponentTemplateAction ;
1515import org .elasticsearch .action .admin .indices .template .put .PutComposableIndexTemplateAction ;
16+ import org .elasticsearch .action .ingest .PutPipelineAction ;
1617import org .elasticsearch .action .support .master .AcknowledgedResponse ;
1718import org .elasticsearch .cluster .ClusterChangedEvent ;
1819import org .elasticsearch .cluster .ClusterName ;
2728import org .elasticsearch .cluster .service .ClusterService ;
2829import org .elasticsearch .common .TriFunction ;
2930import org .elasticsearch .common .settings .Settings ;
31+ import org .elasticsearch .ingest .IngestMetadata ;
32+ import org .elasticsearch .ingest .PipelineConfiguration ;
3033import org .elasticsearch .test .ClusterServiceUtils ;
3134import org .elasticsearch .test .ESTestCase ;
3235import org .elasticsearch .test .client .NoOpClient ;
4548import org .elasticsearch .xpack .core .ilm .LifecyclePolicyMetadata ;
4649import org .elasticsearch .xpack .core .ilm .OperationMode ;
4750import org .elasticsearch .xpack .core .ilm .action .PutLifecycleAction ;
51+ import org .elasticsearch .xpack .core .template .IngestPipelineConfig ;
4852import org .junit .After ;
4953import org .junit .Before ;
5054
@@ -190,10 +194,40 @@ public void testPolicyAlreadyExists() {
190194 return null ;
191195 });
192196
193- ClusterChangedEvent event = createClusterChangedEvent (Collections .emptyMap (), policyMap , nodes );
197+ ClusterChangedEvent event = createClusterChangedEvent (Collections .emptyMap (), policyMap , nodes , true );
194198 registry .clusterChanged (event );
195199 }
196200
201+ public void testThatRequiredPipelinesAreAdded () throws Exception {
202+ DiscoveryNode node = TestDiscoveryNode .create ("node" );
203+ DiscoveryNodes nodes = DiscoveryNodes .builder ().localNodeId ("node" ).masterNodeId ("node" ).add (node ).build ();
204+
205+ AtomicInteger calledTimes = new AtomicInteger (0 );
206+ client .setVerifier ((action , request , listener ) -> {
207+ if (action instanceof PutPipelineAction ) {
208+ calledTimes .incrementAndGet ();
209+ return AcknowledgedResponse .TRUE ;
210+ }
211+ if (action instanceof PutComponentTemplateAction ) {
212+ // Ignore this, it's verified in another test
213+ return AcknowledgedResponse .TRUE ;
214+ } else if (action instanceof PutLifecycleAction ) {
215+ // Ignore this, it's verified in another test
216+ return AcknowledgedResponse .TRUE ;
217+ } else if (action instanceof PutComposableIndexTemplateAction ) {
218+ // Ignore this, it's verified in another test
219+ return AcknowledgedResponse .TRUE ;
220+ } else {
221+ fail ("client called with unexpected request: " + request .toString ());
222+ }
223+ return null ;
224+ });
225+
226+ ClusterChangedEvent event = createInitialClusterChangedEvent (nodes );
227+ registry .clusterChanged (event );
228+ assertBusy (() -> assertThat (calledTimes .get (), equalTo (registry .getIngestPipelines ().size ())));
229+ }
230+
197231 public void testPolicyAlreadyExistsButDiffers () throws IOException {
198232 DiscoveryNode node = TestDiscoveryNode .create ("node" );
199233 DiscoveryNodes nodes = DiscoveryNodes .builder ().localNodeId ("node" ).masterNodeId ("node" ).add (node ).build ();
@@ -235,7 +269,7 @@ public void testPolicyAlreadyExistsButDiffers() throws IOException {
235269 ) {
236270 LifecyclePolicy different = LifecyclePolicy .parse (parser , policies .get (0 ).getName ());
237271 policyMap .put (policies .get (0 ).getName (), different );
238- ClusterChangedEvent event = createClusterChangedEvent (Collections .emptyMap (), policyMap , nodes );
272+ ClusterChangedEvent event = createClusterChangedEvent (Collections .emptyMap (), policyMap , nodes , true );
239273 registry .clusterChanged (event );
240274 }
241275 }
@@ -442,7 +476,6 @@ private ActionResponse verifyComponentTemplateInstalled(
442476 ) {
443477 if (action instanceof PutComponentTemplateAction ) {
444478 calledTimes .incrementAndGet ();
445- assertThat (action , instanceOf (PutComponentTemplateAction .class ));
446479 assertThat (request , instanceOf (PutComponentTemplateAction .Request .class ));
447480 final PutComponentTemplateAction .Request putRequest = (PutComponentTemplateAction .Request ) request ;
448481 assertThat (putRequest .componentTemplate ().version (), equalTo ((long ) StackTemplateRegistry .REGISTRY_VERSION ));
@@ -461,15 +494,20 @@ private ActionResponse verifyComponentTemplateInstalled(
461494 }
462495
463496 private ClusterChangedEvent createClusterChangedEvent (Map <String , Integer > existingTemplates , DiscoveryNodes nodes ) {
464- return createClusterChangedEvent (existingTemplates , Collections .emptyMap (), nodes );
497+ return createClusterChangedEvent (existingTemplates , Collections .emptyMap (), nodes , true );
498+ }
499+
500+ private ClusterChangedEvent createInitialClusterChangedEvent (DiscoveryNodes nodes ) {
501+ return createClusterChangedEvent (Collections .emptyMap (), Collections .emptyMap (), nodes , false );
465502 }
466503
467504 private ClusterChangedEvent createClusterChangedEvent (
468505 Map <String , Integer > existingTemplates ,
469506 Map <String , LifecyclePolicy > existingPolicies ,
470- DiscoveryNodes nodes
507+ DiscoveryNodes nodes ,
508+ boolean addRegistryPipelines
471509 ) {
472- ClusterState cs = createClusterState (Settings .EMPTY , existingTemplates , existingPolicies , nodes );
510+ ClusterState cs = createClusterState (Settings .EMPTY , existingTemplates , existingPolicies , nodes , addRegistryPipelines );
473511 ClusterChangedEvent realEvent = new ClusterChangedEvent (
474512 "created-from-test" ,
475513 cs ,
@@ -485,7 +523,8 @@ private ClusterState createClusterState(
485523 Settings nodeSettings ,
486524 Map <String , Integer > existingComponentTemplates ,
487525 Map <String , LifecyclePolicy > existingPolicies ,
488- DiscoveryNodes nodes
526+ DiscoveryNodes nodes ,
527+ boolean addRegistryPipelines
489528 ) {
490529 Map <String , ComponentTemplate > componentTemplates = new HashMap <>();
491530 for (Map .Entry <String , Integer > template : existingComponentTemplates .entrySet ()) {
@@ -499,12 +538,26 @@ private ClusterState createClusterState(
499538 .collect (Collectors .toMap (Map .Entry ::getKey , e -> new LifecyclePolicyMetadata (e .getValue (), Collections .emptyMap (), 1 , 1 )));
500539 IndexLifecycleMetadata ilmMeta = new IndexLifecycleMetadata (existingILMMeta , OperationMode .RUNNING );
501540
541+ // adding the registry pipelines, as they may be dependencies for index templates
542+ Map <String , PipelineConfiguration > ingestPipelines = new HashMap <>();
543+ if (addRegistryPipelines ) {
544+ for (IngestPipelineConfig ingestPipelineConfig : registry .getIngestPipelines ()) {
545+ // we cannot mock PipelineConfiguration as it is a final class
546+ ingestPipelines .put (
547+ ingestPipelineConfig .getId (),
548+ new PipelineConfiguration (ingestPipelineConfig .getId (), ingestPipelineConfig .loadConfig (), XContentType .JSON )
549+ );
550+ }
551+ }
552+ IngestMetadata ingestMetadata = new IngestMetadata (ingestPipelines );
553+
502554 return ClusterState .builder (new ClusterName ("test" ))
503555 .metadata (
504556 Metadata .builder ()
505557 .componentTemplates (componentTemplates )
506558 .transientSettings (nodeSettings )
507559 .putCustom (IndexLifecycleMetadata .TYPE , ilmMeta )
560+ .putCustom (IngestMetadata .TYPE , ingestMetadata )
508561 .build ()
509562 )
510563 .blocks (new ClusterBlocks .Builder ().build ())
0 commit comments