Skip to content
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
import org.elasticsearch.cluster.metadata.ProjectId;
import org.elasticsearch.cluster.metadata.ProjectMetadata;
import org.elasticsearch.core.CheckedRunnable;
import org.elasticsearch.core.FixForMultiProject;

import java.util.Collection;
import java.util.Objects;
Expand Down Expand Up @@ -94,6 +95,7 @@ default Collection<ProjectId> getProjectIds(ClusterState clusterState) {
/**
* Returns a client that executes every request in the context of the given project.
*/
@FixForMultiProject(description = "This recreates a client on every invocation. We should optimize this to be less wasteful")
default Client projectClient(Client baseClient, ProjectId projectId) {
// We only take the shortcut when the given project ID matches the "current" project ID. If it doesn't, we'll let #executeOnProject
// take care of error handling.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ public boolean supportsMultipleProjects() {
public static ProjectResolver mustExecuteFirst() {
return new ProjectResolver() {

private ProjectId enforceProjectId = null;
private volatile ProjectId enforceProjectId = null;

@Override
public ProjectId getProjectId() {
Expand All @@ -81,14 +81,16 @@ public Collection<ProjectId> getProjectIds(ClusterState clusterState) {

@Override
public <E extends Exception> void executeOnProject(ProjectId projectId, CheckedRunnable<E> body) throws E {
if (enforceProjectId != null) {
throw new IllegalStateException("Cannot nest calls to executeOnProject");
}
try {
enforceProjectId = projectId;
body.run();
} finally {
enforceProjectId = null;
synchronized (this) {
if (enforceProjectId != null) {
throw new IllegalStateException("Cannot nest calls to executeOnProject");
}
try {
enforceProjectId = projectId;
body.run();
} finally {
enforceProjectId = null;
}
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2817,16 +2817,12 @@ protected void assertEmptyProject(String projectId) throws IOException {
if (indexTemplates != null) {
var templateNames = indexTemplates.keySet().stream().filter(name -> isXPackTemplate(name) == false).toList();
assertThat("Project [" + projectId + "] should not have index templates", templateNames, empty());
} else if (projectId.equals(Metadata.DEFAULT_PROJECT_ID.id())) {
fail("Expected default project to have standard templates, but was null");
}

final Map<String, Object> componentTemplates = state.evaluate("metadata.component_template.component_template");
if (componentTemplates != null) {
var templateNames = componentTemplates.keySet().stream().filter(name -> isXPackTemplate(name) == false).toList();
assertThat("Project [" + projectId + "] should not have component templates", templateNames, empty());
} else if (projectId.equals(Metadata.DEFAULT_PROJECT_ID.id())) {
fail("Expected default project to have standard component templates, but was null");
}

final List<Map<String, ?>> pipelines = state.evaluate("metadata.ingest.pipeline");
Expand All @@ -2836,8 +2832,6 @@ protected void assertEmptyProject(String projectId) throws IOException {
.filter(id -> isXPackIngestPipeline(id) == false)
.toList();
assertThat("Project [" + projectId + "] should not have ingest pipelines", pipelineNames, empty());
} else if (projectId.equals(Metadata.DEFAULT_PROJECT_ID.id())) {
fail("Expected default project to have standard ingest pipelines, but was null");
}

if (has(ProductFeature.ILM)) {
Expand All @@ -2846,8 +2840,6 @@ protected void assertEmptyProject(String projectId) throws IOException {
var policyNames = new HashSet<>(ilmPolicies.keySet());
policyNames.removeAll(preserveILMPolicyIds());
assertThat("Project [" + projectId + "] should not have ILM Policies", policyNames, empty());
} else if (projectId.equals(Metadata.DEFAULT_PROJECT_ID.id())) {
fail("Expected default project to have standard ILM policies, but was null");
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
package org.elasticsearch.xpack.apmdata;

import org.elasticsearch.client.internal.Client;
import org.elasticsearch.cluster.project.ProjectResolver;
import org.elasticsearch.cluster.service.ClusterService;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.threadpool.ThreadPool;
Expand All @@ -32,15 +33,17 @@ public APMIndexTemplateRegistry(
ClusterService clusterService,
ThreadPool threadPool,
Client client,
NamedXContentRegistry xContentRegistry
NamedXContentRegistry xContentRegistry,
ProjectResolver projectResolver
) {
super(
nodeSettings,
clusterService,
threadPool,
client,
xContentRegistry,
templateFilter(isDataStreamsLifecycleOnlyMode(clusterService.getSettings()))
templateFilter(isDataStreamsLifecycleOnlyMode(clusterService.getSettings())),
projectResolver
);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,14 @@ public Collection<?> createComponents(PluginServices services) {
Settings settings = services.environment().settings();
ClusterService clusterService = services.clusterService();
registry.set(
new APMIndexTemplateRegistry(settings, clusterService, services.threadPool(), services.client(), services.xContentRegistry())
new APMIndexTemplateRegistry(
settings,
clusterService,
services.threadPool(),
services.client(),
services.xContentRegistry(),
services.projectResolver()
)
);
if (enabled) {
APMIndexTemplateRegistry registryInstance = registry.get();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import org.elasticsearch.cluster.metadata.DataStreamLifecycle;
import org.elasticsearch.cluster.node.DiscoveryNode;
import org.elasticsearch.cluster.node.DiscoveryNodeUtils;
import org.elasticsearch.cluster.project.TestProjectResolvers;
import org.elasticsearch.cluster.service.ClusterService;
import org.elasticsearch.common.settings.ClusterSettings;
import org.elasticsearch.common.settings.Settings;
Expand Down Expand Up @@ -59,7 +60,8 @@ public void createRegistryAndClient() {
clusterService,
threadPool,
client,
NamedXContentRegistry.EMPTY
NamedXContentRegistry.EMPTY,
TestProjectResolvers.mustExecuteFirst()
);
apmIndexTemplateRegistry.setEnabled(true);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@
import org.elasticsearch.cluster.node.DiscoveryNode;
import org.elasticsearch.cluster.node.DiscoveryNodeUtils;
import org.elasticsearch.cluster.node.DiscoveryNodes;
import org.elasticsearch.cluster.project.ProjectResolver;
import org.elasticsearch.cluster.project.TestProjectResolvers;
import org.elasticsearch.cluster.service.ClusterService;
import org.elasticsearch.common.settings.ClusterSettings;
import org.elasticsearch.common.settings.Settings;
Expand Down Expand Up @@ -89,16 +91,18 @@ public void createRegistryAndClient() {
threadPool = new TestThreadPool(this.getClass().getName());
client = new VerifyingClient(threadPool);
ClusterService clusterService = ClusterServiceUtils.createClusterService(threadPool, clusterSettings);
ProjectResolver projectResolver = TestProjectResolvers.mustExecuteFirst();
stackTemplateRegistryAccessor = new StackTemplateRegistryAccessor(
new StackTemplateRegistry(Settings.EMPTY, clusterService, threadPool, client, NamedXContentRegistry.EMPTY)
new StackTemplateRegistry(Settings.EMPTY, clusterService, threadPool, client, NamedXContentRegistry.EMPTY, projectResolver)
);

apmIndexTemplateRegistry = new APMIndexTemplateRegistry(
Settings.EMPTY,
clusterService,
threadPool,
client,
NamedXContentRegistry.EMPTY
NamedXContentRegistry.EMPTY,
projectResolver
);
apmIndexTemplateRegistry.setEnabled(true);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
import org.elasticsearch.cluster.ClusterChangedEvent;
import org.elasticsearch.cluster.ClusterState;
import org.elasticsearch.cluster.metadata.DataStream;
import org.elasticsearch.cluster.project.TestProjectResolvers;
import org.elasticsearch.cluster.service.ClusterService;
import org.elasticsearch.datastreams.DataStreamsPlugin;
import org.elasticsearch.index.mapper.DateFieldMapper;
Expand Down Expand Up @@ -58,7 +59,8 @@ public void setup() {
clusterService.threadPool(),
client,
xContentRegistry(),
3L
3L,
TestProjectResolvers.mustExecuteFirst()
);
registry.initialize();
ensureGreen();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@

import org.elasticsearch.client.internal.Client;
import org.elasticsearch.cluster.metadata.ComposableIndexTemplate;
import org.elasticsearch.cluster.project.ProjectResolver;
import org.elasticsearch.cluster.service.ClusterService;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.threadpool.ThreadPool;
Expand All @@ -28,9 +29,10 @@ public RolloverEnabledTestTemplateRegistry(
ThreadPool threadPool,
Client client,
NamedXContentRegistry xContentRegistry,
long version
long version,
ProjectResolver projectResolver
) {
super(nodeSettings, clusterService, threadPool, client, xContentRegistry);
super(nodeSettings, clusterService, threadPool, client, xContentRegistry, projectResolver);
this.version = version;
}

Expand Down
Loading