FIX #1608 - Fix bot being used in pipelines and workflows (#21446)

Co-authored-by: Mohit Yadav <105265192+mohityadav766@users.noreply.github.com>
This commit is contained in:
Pere Miquel Brull 2025-06-03 12:04:24 +02:00 committed by GitHub
parent a084b6090a
commit b0091f7271
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 60 additions and 7 deletions

View File

@ -85,7 +85,7 @@ public class WorkflowResource extends EntityResource<Workflow, WorkflowRepositor
static final String FIELDS = "owners"; static final String FIELDS = "owners";
private WorkflowMapper mapper; private WorkflowMapper mapper;
private PipelineServiceClientInterface pipelineServiceClient; private PipelineServiceClientInterface pipelineServiceClient;
private OpenMetadataConnectionBuilder openMetadataConnectionBuilder; private OpenMetadataApplicationConfig openMetadataApplicationConfig;
public WorkflowResource(Authorizer authorizer, Limits limits) { public WorkflowResource(Authorizer authorizer, Limits limits) {
super(Entity.WORKFLOW, authorizer, limits); super(Entity.WORKFLOW, authorizer, limits);
@ -93,11 +93,11 @@ public class WorkflowResource extends EntityResource<Workflow, WorkflowRepositor
@Override @Override
public void initialize(OpenMetadataApplicationConfig config) { public void initialize(OpenMetadataApplicationConfig config) {
this.openMetadataApplicationConfig = config;
this.mapper = new WorkflowMapper(); this.mapper = new WorkflowMapper();
this.pipelineServiceClient = this.pipelineServiceClient =
PipelineServiceClientFactory.createPipelineServiceClient( PipelineServiceClientFactory.createPipelineServiceClient(
config.getPipelineServiceClientConfiguration()); config.getPipelineServiceClientConfiguration());
openMetadataConnectionBuilder = new OpenMetadataConnectionBuilder(config);
} }
public static class WorkflowList extends ResultList<Workflow> { public static class WorkflowList extends ResultList<Workflow> {
@ -359,7 +359,8 @@ public class WorkflowResource extends EntityResource<Workflow, WorkflowRepositor
@Context SecurityContext securityContext) { @Context SecurityContext securityContext) {
EntityUtil.Fields fields = getFields(FIELD_OWNERS); EntityUtil.Fields fields = getFields(FIELD_OWNERS);
Workflow workflow = repository.get(uriInfo, id, fields); Workflow workflow = repository.get(uriInfo, id, fields);
workflow.setOpenMetadataServerConnection(openMetadataConnectionBuilder.build()); workflow.setOpenMetadataServerConnection(
new OpenMetadataConnectionBuilder(openMetadataApplicationConfig).build());
/* /*
We will send the encrypted Workflow to the Pipeline Service Client We will send the encrypted Workflow to the Pipeline Service Client
It will be fetched from the API from there, since we are It will be fetched from the API from there, since we are
@ -594,7 +595,8 @@ public class WorkflowResource extends EntityResource<Workflow, WorkflowRepositor
return workflowConverted; return workflowConverted;
} }
Workflow workflowDecrypted = secretsManager.decryptWorkflow(workflow); Workflow workflowDecrypted = secretsManager.decryptWorkflow(workflow);
OpenMetadataConnection openMetadataServerConnection = openMetadataConnectionBuilder.build(); OpenMetadataConnection openMetadataServerConnection =
new OpenMetadataConnectionBuilder(openMetadataApplicationConfig).build();
workflowDecrypted.setOpenMetadataServerConnection( workflowDecrypted.setOpenMetadataServerConnection(
secretsManager.encryptOpenMetadataConnection(openMetadataServerConnection, false)); secretsManager.encryptOpenMetadataConnection(openMetadataServerConnection, false));
if (authorizer.shouldMaskPasswords(securityContext)) { if (authorizer.shouldMaskPasswords(securityContext)) {

View File

@ -166,9 +166,6 @@ public class OpenMetadataConnectionBuilder {
} }
public OpenMetadataConnection build() { public OpenMetadataConnection build() {
// Initialize the bot user while building to update any
// changes done on the bot like updating jwt token
initializeBotUser(Entity.INGESTION_BOT_NAME);
return new OpenMetadataConnection() return new OpenMetadataConnection()
.withAuthProvider(authProvider) .withAuthProvider(authProvider)
.withHostPort(openMetadataURL) .withHostPort(openMetadataURL)

View File

@ -0,0 +1,54 @@
package org.openmetadata.service.util;
import com.auth0.jwt.JWT;
import com.auth0.jwt.interfaces.DecodedJWT;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.openmetadata.schema.api.configuration.pipelineServiceClient.PipelineServiceClientConfiguration;
import org.openmetadata.schema.security.secrets.SecretsManagerClientLoader;
import org.openmetadata.schema.security.secrets.SecretsManagerConfiguration;
import org.openmetadata.schema.security.secrets.SecretsManagerProvider;
import org.openmetadata.schema.security.ssl.VerifySSL;
import org.openmetadata.schema.services.connections.metadata.OpenMetadataConnection;
import org.openmetadata.service.OpenMetadataApplicationConfig;
import org.openmetadata.service.OpenMetadataApplicationTest;
import org.openmetadata.service.secrets.SecretsManagerFactory;
@Slf4j
public class OpenMetadataConnectionBuilderTest extends OpenMetadataApplicationTest {
private static SecretsManagerConfiguration config;
static final String CLUSTER_NAME = "test";
@BeforeAll
static void setUp() {
config = new SecretsManagerConfiguration();
config.setSecretsManager(SecretsManagerProvider.DB);
SecretsManagerFactory.createSecretsManager(config, CLUSTER_NAME);
}
@Test
void testOpenMetadataConnectionBuilder() {
OpenMetadataApplicationConfig openMetadataApplicationConfig =
new OpenMetadataApplicationConfig();
openMetadataApplicationConfig.setClusterName(CLUSTER_NAME);
openMetadataApplicationConfig.setPipelineServiceClientConfiguration(
new PipelineServiceClientConfiguration()
.withMetadataApiEndpoint("http://localhost:8585/api")
.withVerifySSL(VerifySSL.NO_SSL)
.withSecretsManagerLoader(SecretsManagerClientLoader.ENV));
String botName =
"autoClassification-bot"; // Whichever bot other than the ingestion-bot, which is the
// default
OpenMetadataConnection openMetadataServerConnection =
new OpenMetadataConnectionBuilder(openMetadataApplicationConfig, botName).build();
// The OM Connection passes the right JWT based on the incoming bot
DecodedJWT jwt = JWT.decode(openMetadataServerConnection.getSecurityConfig().getJwtToken());
Assertions.assertEquals("autoclassification-bot", jwt.getClaim("sub").asString());
}
}