Skip to content

Commit f1412cd

Browse files
committed
Fix cluster default initialization #1
1 parent 26b224f commit f1412cd

21 files changed

+1902
-150
lines changed
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
/*
2+
* Copyright OpenSearch Contributors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*
5+
* The OpenSearch Contributors require contributions made to
6+
* this file be licensed under the Apache-2.0 license or a
7+
* compatible open source license.
8+
*
9+
*/
10+
package org.opensearch.security;
11+
12+
import java.io.IOException;
13+
import java.nio.file.Path;
14+
import java.util.Map;
15+
import java.util.concurrent.TimeUnit;
16+
17+
import com.carrotsearch.randomizedtesting.annotations.ThreadLeakScope;
18+
import org.apache.commons.io.FileUtils;
19+
import org.awaitility.Awaitility;
20+
import org.junit.AfterClass;
21+
import org.junit.Test;
22+
import org.junit.runner.RunWith;
23+
24+
import org.opensearch.security.state.SecurityMetadata;
25+
import org.opensearch.test.framework.cluster.LocalCluster;
26+
import org.opensearch.test.framework.cluster.TestRestClient;
27+
28+
import static org.hamcrest.MatcherAssert.assertThat;
29+
import static org.hamcrest.Matchers.aMapWithSize;
30+
import static org.hamcrest.Matchers.allOf;
31+
import static org.hamcrest.Matchers.equalTo;
32+
import static org.hamcrest.Matchers.hasKey;
33+
import static org.junit.Assert.assertNotNull;
34+
import static org.junit.Assert.assertTrue;
35+
36+
@RunWith(com.carrotsearch.randomizedtesting.RandomizedRunner.class)
37+
@ThreadLeakScope(ThreadLeakScope.Scope.NONE)
38+
public abstract class AbstractDefaultConfigurationTests {
39+
public final static Path configurationFolder = ConfigurationFiles.createConfigurationDirectory();
40+
public static final String ADMIN_USER_NAME = "admin";
41+
public static final String DEFAULT_PASSWORD = "secret";
42+
public static final String NEW_USER = "new-user";
43+
public static final String LIMITED_USER = "limited-user";
44+
45+
private final LocalCluster cluster;
46+
47+
protected AbstractDefaultConfigurationTests(LocalCluster cluster) {
48+
this.cluster = cluster;
49+
}
50+
51+
@AfterClass
52+
public static void cleanConfigurationDirectory() throws IOException {
53+
FileUtils.deleteDirectory(configurationFolder.toFile());
54+
}
55+
56+
@Test
57+
public void shouldLoadDefaultConfiguration() throws IOException {
58+
try (TestRestClient client = cluster.getRestClient(NEW_USER, DEFAULT_PASSWORD)) {
59+
Awaitility.waitAtMost(10, TimeUnit.SECONDS)
60+
.await("Load default configuration")
61+
.until(() -> client.getAuthInfo().getStatusCode(), equalTo(200));
62+
}
63+
64+
try (TestRestClient client = cluster.getRestClient(ADMIN_USER_NAME, DEFAULT_PASSWORD)) {
65+
client.confirmCorrectCredentials(ADMIN_USER_NAME);
66+
TestRestClient.HttpResponse response = client.get("_plugins/_security/api/internalusers");
67+
response.assertStatusCode(200);
68+
Map<String, Object> users = response.getBodyAs(Map.class);
69+
assertThat(users, allOf(aMapWithSize(3), hasKey(ADMIN_USER_NAME), hasKey(NEW_USER), hasKey(LIMITED_USER)));
70+
assertClusterState(client);
71+
}
72+
}
73+
74+
void assertClusterState(final TestRestClient client) {
75+
if (cluster.node().settings().getAsBoolean("plugins.security.allow_default_init_securityindex.use_cluster_state", false)) {
76+
final TestRestClient.HttpResponse response = client.get("_cluster/state");
77+
response.assertStatusCode(200);
78+
final var clusterState = response.getBodyAs(Map.class);
79+
assertTrue(response.getBody(), clusterState.containsKey(SecurityMetadata.TYPE));
80+
@SuppressWarnings("unchecked")
81+
final var securityClusterState = (Map<String, Object>) clusterState.get(SecurityMetadata.TYPE);
82+
@SuppressWarnings("unchecked")
83+
final var securityConfiguration = (Map<String, Object>) ((Map<?, ?>) clusterState.get(SecurityMetadata.TYPE)).get(
84+
"configuration"
85+
);
86+
assertTrue(response.getBody(), securityClusterState.containsKey("created"));
87+
assertNotNull(response.getBody(), securityClusterState.get("created"));
88+
89+
for (final var k : securityConfiguration.keySet()) {
90+
@SuppressWarnings("unchecked")
91+
final var sc = (Map<String, Object>) securityConfiguration.get(k);
92+
assertTrue(response.getBody(), sc.containsKey("hash"));
93+
assertTrue(response.getBody(), sc.containsKey("last_modified"));
94+
}
95+
}
96+
}
97+
98+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
/*
2+
* Copyright OpenSearch Contributors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*
5+
* The OpenSearch Contributors require contributions made to
6+
* this file be licensed under the Apache-2.0 license or a
7+
* compatible open source license.
8+
*
9+
*/
10+
package org.opensearch.security;
11+
12+
import java.util.List;
13+
import java.util.Map;
14+
15+
import org.junit.ClassRule;
16+
17+
import org.opensearch.test.framework.cluster.ClusterManager;
18+
import org.opensearch.test.framework.cluster.LocalCluster;
19+
20+
public class DefaultConfigurationMultiNodeClusterTests extends AbstractDefaultConfigurationTests {
21+
22+
@ClassRule
23+
public static LocalCluster cluster = new LocalCluster.Builder().clusterManager(ClusterManager.THREE_CLUSTER_MANAGERS)
24+
.nodeSettings(
25+
Map.of(
26+
"plugins.security.allow_default_init_securityindex",
27+
true,
28+
"plugins.security.restapi.roles_enabled",
29+
List.of("user_admin__all_access")
30+
)
31+
)
32+
.defaultConfigurationInitDirectory(configurationFolder.toString())
33+
.loadConfigurationIntoIndex(false)
34+
.build();
35+
36+
public DefaultConfigurationMultiNodeClusterTests() {
37+
super(cluster);
38+
}
39+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
/*
2+
* Copyright OpenSearch Contributors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*
5+
* The OpenSearch Contributors require contributions made to
6+
* this file be licensed under the Apache-2.0 license or a
7+
* compatible open source license.
8+
*
9+
*/
10+
package org.opensearch.security;
11+
12+
import java.util.List;
13+
import java.util.Map;
14+
15+
import org.junit.ClassRule;
16+
17+
import org.opensearch.test.framework.cluster.ClusterManager;
18+
import org.opensearch.test.framework.cluster.LocalCluster;
19+
20+
public class DefaultConfigurationMultiNodeClusterUseClusterStateTests extends AbstractDefaultConfigurationTests {
21+
22+
@ClassRule
23+
public static LocalCluster cluster = new LocalCluster.Builder().clusterManager(ClusterManager.THREE_CLUSTER_MANAGERS)
24+
.nodeSettings(
25+
Map.of(
26+
"plugins.security.allow_default_init_securityindex",
27+
true,
28+
"plugins.security.allow_default_init_securityindex.use_cluster_state",
29+
true,
30+
"plugins.security.restapi.roles_enabled",
31+
List.of("user_admin__all_access")
32+
)
33+
)
34+
.defaultConfigurationInitDirectory(configurationFolder.toString())
35+
.loadConfigurationIntoIndex(false)
36+
.build();
37+
38+
public DefaultConfigurationMultiNodeClusterUseClusterStateTests() {
39+
super(cluster);
40+
}
41+
42+
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
/*
2+
* Copyright OpenSearch Contributors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*
5+
* The OpenSearch Contributors require contributions made to
6+
* this file be licensed under the Apache-2.0 license or a
7+
* compatible open source license.
8+
*
9+
*/
10+
package org.opensearch.security;
11+
12+
import java.util.List;
13+
import java.util.Map;
14+
15+
import com.carrotsearch.randomizedtesting.annotations.ThreadLeakScope;
16+
import org.junit.ClassRule;
17+
import org.junit.runner.RunWith;
18+
19+
import org.opensearch.test.framework.cluster.ClusterManager;
20+
import org.opensearch.test.framework.cluster.LocalCluster;
21+
22+
@RunWith(com.carrotsearch.randomizedtesting.RandomizedRunner.class)
23+
@ThreadLeakScope(ThreadLeakScope.Scope.NONE)
24+
public class DefaultConfigurationSingleNodeClusterTests extends AbstractDefaultConfigurationTests {
25+
26+
@ClassRule
27+
public static LocalCluster cluster = new LocalCluster.Builder().clusterManager(ClusterManager.SINGLENODE)
28+
.nodeSettings(
29+
Map.of(
30+
"plugins.security.allow_default_init_securityindex",
31+
true,
32+
"plugins.security.restapi.roles_enabled",
33+
List.of("user_admin__all_access")
34+
)
35+
)
36+
.defaultConfigurationInitDirectory(configurationFolder.toString())
37+
.loadConfigurationIntoIndex(false)
38+
.build();
39+
40+
public DefaultConfigurationSingleNodeClusterTests() {
41+
super(cluster);
42+
}
43+
44+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
/*
2+
* Copyright OpenSearch Contributors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*
5+
* The OpenSearch Contributors require contributions made to
6+
* this file be licensed under the Apache-2.0 license or a
7+
* compatible open source license.
8+
*
9+
*/
10+
package org.opensearch.security;
11+
12+
import java.util.List;
13+
import java.util.Map;
14+
15+
import org.junit.ClassRule;
16+
17+
import org.opensearch.test.framework.cluster.ClusterManager;
18+
import org.opensearch.test.framework.cluster.LocalCluster;
19+
20+
public class DefaultConfigurationSingleNodeClusterUseClusterStateTests extends AbstractDefaultConfigurationTests {
21+
22+
@ClassRule
23+
public static LocalCluster cluster = new LocalCluster.Builder().clusterManager(ClusterManager.SINGLENODE)
24+
.nodeSettings(
25+
Map.of(
26+
"plugins.security.allow_default_init_securityindex",
27+
true,
28+
"plugins.security.allow_default_init_securityindex.use_cluster_state",
29+
true,
30+
"plugins.security.restapi.roles_enabled",
31+
List.of("user_admin__all_access")
32+
)
33+
)
34+
.defaultConfigurationInitDirectory(configurationFolder.toString())
35+
.loadConfigurationIntoIndex(false)
36+
.build();
37+
38+
public DefaultConfigurationSingleNodeClusterUseClusterStateTests() {
39+
super(cluster);
40+
}
41+
42+
}

src/integrationTest/java/org/opensearch/security/DefaultConfigurationTests.java

Lines changed: 0 additions & 78 deletions
This file was deleted.

src/integrationTest/java/org/opensearch/security/SecurityConfigurationBootstrapTests.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,7 @@ public void shouldStillLoadSecurityConfigDuringBootstrapAndActiveConfigUpdateReq
124124
.put("action_groups.yml", CType.ACTIONGROUPS)
125125
.put("config.yml", CType.CONFIG)
126126
.put("roles.yml", CType.ROLES)
127+
.put("roles_mapping.yml", CType.ROLESMAPPING)
127128
.put("tenants.yml", CType.TENANTS)
128129
.build();
129130

@@ -146,7 +147,7 @@ public void shouldStillLoadSecurityConfigDuringBootstrapAndActiveConfigUpdateReq
146147
// After the configuration has been loaded, the rest clients should be able to connect successfully
147148
cluster.triggerConfigurationReloadForCTypes(
148149
internalNodeClient,
149-
List.of(CType.ACTIONGROUPS, CType.CONFIG, CType.ROLES, CType.TENANTS),
150+
List.of(CType.ACTIONGROUPS, CType.CONFIG, CType.ROLES, CType.ROLESMAPPING, CType.TENANTS),
150151
true
151152
);
152153
try (final TestRestClient freshClient = cluster.getRestClient(USER_ADMIN)) {

0 commit comments

Comments
 (0)