2323import org .elasticsearch .action .support .PlainActionFuture ;
2424import org .elasticsearch .client .internal .Client ;
2525import org .elasticsearch .cluster .health .ClusterHealthStatus ;
26+ import org .elasticsearch .cluster .metadata .DataStream ;
2627import org .elasticsearch .cluster .metadata .IndexAbstraction ;
2728import org .elasticsearch .cluster .metadata .IndexMetadata ;
2829import org .elasticsearch .cluster .metadata .Metadata ;
8687import org .elasticsearch .xpack .core .security .authz .privilege .ApplicationPrivilegeTests ;
8788import org .elasticsearch .xpack .core .security .authz .privilege .ClusterPrivilegeResolver ;
8889import org .elasticsearch .xpack .core .security .authz .privilege .ConfigurableClusterPrivilege ;
90+ import org .elasticsearch .xpack .core .security .authz .privilege .IndexComponentSelectorPrivilege ;
8991import org .elasticsearch .xpack .core .security .authz .privilege .IndexPrivilege ;
9092import org .elasticsearch .xpack .core .security .authz .restriction .Workflow ;
9193import org .elasticsearch .xpack .core .security .authz .restriction .WorkflowResolver ;
@@ -1531,6 +1533,7 @@ public void testBuildRoleWithMultipleRemoteClusterMerged() {
15311533 }
15321534
15331535 public void testBuildRoleWithReadFailureStorePrivilegeOnly () {
1536+ assumeTrue ("requires failure store feature" , DataStream .isFailureStoreFeatureFlagEnabled ());
15341537 String indexPattern = randomAlphanumericOfLength (10 );
15351538 final Role role = buildRole (
15361539 roleDescriptorWithIndicesPrivileges (
@@ -1542,6 +1545,7 @@ public void testBuildRoleWithReadFailureStorePrivilegeOnly() {
15421545 }
15431546
15441547 public void testBuildRoleWithReadFailureStorePrivilegeDuplicatesMerged () {
1548+ assumeTrue ("requires failure store feature" , DataStream .isFailureStoreFeatureFlagEnabled ());
15451549 String indexPattern = randomAlphanumericOfLength (10 );
15461550 final Role role = buildRole (
15471551 roleDescriptorWithIndicesPrivileges (
@@ -1555,6 +1559,7 @@ public void testBuildRoleWithReadFailureStorePrivilegeDuplicatesMerged() {
15551559 }
15561560
15571561 public void testBuildRoleWithReadFailureStoreAndReadPrivilegeSplit () {
1562+ assumeTrue ("requires failure store feature" , DataStream .isFailureStoreFeatureFlagEnabled ());
15581563 String indexPattern = randomAlphanumericOfLength (10 );
15591564 final Role role = buildRole (
15601565 roleDescriptorWithIndicesPrivileges (
@@ -1571,6 +1576,7 @@ public void testBuildRoleWithReadFailureStoreAndReadPrivilegeSplit() {
15711576 }
15721577
15731578 public void testBuildRoleWithMultipleReadFailureStoreAndReadPrivilegeSplit () {
1579+ assumeTrue ("requires failure store feature" , DataStream .isFailureStoreFeatureFlagEnabled ());
15741580 String indexPattern = randomAlphanumericOfLength (10 );
15751581 final Role role = buildRole (
15761582 roleDescriptorWithIndicesPrivileges (
@@ -1588,6 +1594,7 @@ public void testBuildRoleWithMultipleReadFailureStoreAndReadPrivilegeSplit() {
15881594 }
15891595
15901596 public void testBuildRoleWithAllPrivilegeIsNeverSplit () {
1597+ assumeTrue ("requires failure store feature" , DataStream .isFailureStoreFeatureFlagEnabled ());
15911598 String indexPattern = randomAlphanumericOfLength (10 );
15921599 final Role role = buildRole (
15931600 roleDescriptorWithIndicesPrivileges (
@@ -1603,6 +1610,32 @@ public void testBuildRoleWithAllPrivilegeIsNeverSplit() {
16031610 );
16041611 }
16051612
1613+ public void testBuildRoleNeverSplitsWithoutFailureStoreRelatedPrivileges () {
1614+ String indexPattern = randomAlphanumericOfLength (10 );
1615+ List <String > nonFailurePrivileges = IndexPrivilege .names ()
1616+ .stream ()
1617+ .filter (p -> IndexPrivilege .getNamedOrNull (p ).getSelectorPrivilege () != IndexComponentSelectorPrivilege .FAILURES )
1618+ .toList ();
1619+ Set <String > usedPrivileges = new HashSet <>();
1620+
1621+ int n = randomIntBetween (1 , 5 );
1622+ IndicesPrivileges [] indicesPrivileges = new IndicesPrivileges [n ];
1623+ for (int i = 0 ; i < n ; i ++) {
1624+ IndicesPrivileges .Builder builder = IndicesPrivileges .builder ();
1625+ // TODO this is due to an unrelated bug in index collation logic
1626+ List <String > privileges = randomValueOtherThanMany (
1627+ p -> p .get (0 ).equals ("none" ),
1628+ () -> randomNonEmptySubsetOf (nonFailurePrivileges )
1629+ );
1630+ usedPrivileges .addAll (privileges );
1631+ indicesPrivileges [i ] = builder .indices (indexPattern ).privileges (privileges ).build ();
1632+ }
1633+
1634+ final Role role = buildRole (roleDescriptorWithIndicesPrivileges ("r1" , indicesPrivileges ));
1635+ final IndicesPermission actual = role .indices ();
1636+ assertHasIndexGroups (actual , indexGroup (IndexPrivilege .getSingleSelector (usedPrivileges ), false , indexPattern ));
1637+ }
1638+
16061639 public void testCustomRolesProviderFailures () throws Exception {
16071640 final FileRolesStore fileRolesStore = mock (FileRolesStore .class );
16081641 doCallRealMethod ().when (fileRolesStore ).accept (anySet (), anyActionListener ());
0 commit comments