From 8bc38872e13ba8732c8baa2544447464cb95a54f Mon Sep 17 00:00:00 2001 From: nilaysundarkar <3598371+nilaysundarkar@users.noreply.github.com> Date: Wed, 10 Jul 2024 09:05:09 -0500 Subject: [PATCH 01/17] add gitignore --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..70a93c7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +target +/.idea/ +dependency-reduced-pom.xml From 5db7eacfc3b6565ed1a7c7e554a720a4c0f60e79 Mon Sep 17 00:00:00 2001 From: nilaysundarkar <3598371+nilaysundarkar@users.noreply.github.com> Date: Wed, 10 Jul 2024 09:05:45 -0500 Subject: [PATCH 02/17] add pom --- pom.xml | 227 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 227 insertions(+) create mode 100644 pom.xml diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..663e833 --- /dev/null +++ b/pom.xml @@ -0,0 +1,227 @@ + + + 4.0.0 + com.evernorth.mongo.kafka.connect.auth + mongo-kafka-credential-provider + Mongo Kafka Connect Assume Role Credential Provider + 1.0.0 + + + UTF-8 + UTF-8 + 1.8 + + + 3.2.0 + + 0.8.12 + 2.23.4 + 3.13.0 + 3.2.5 + 3.6.3 + 3.5.2 + 3.3.1 + 3.2.5 + 3.5.0 + 2.25.14 + + + + + software.amazon.awssdk + sts + ${aws-java-sdk.version} + + + + org.mongodb.kafka + mongo-kafka-connect + provided + 1.13.0 + + + + + + + + + src/main/resources + true + + + src/test/resources + true + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + ${java.version} + ${java.version} + + + + org.apache.maven.plugins + maven-javadoc-plugin + ${maven-javadoc-plugin.version} + + + org.apache.maven.plugins + maven-source-plugin + ${maven-source-plugin.version} + + + attach-sources + verify + + jar-no-fork + + + + + + org.apache.maven.plugins + maven-shade-plugin + ${maven-shade-plugin.version} + + + package + + shade + + + + + *:* + + + META-INF/*.SF + META-INF/*.DSA + META-INF/*.RSA + + + + + + + junit:* + jmock:* + mockito-all:* + + + commons-codec:* + commons-logging:* + org.apache.httpcomponents:* + org.apache.kafka:* + org.slf4j:* + + + + + + + + org.jacoco + jacoco-maven-plugin + ${jacoco-maven-plugin.version} + + + + prepare-agent + + + + report + prepare-package + + report + + + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + org.codehaus.mojo + exec-maven-plugin + ${exec-maven-plugin.version} + + + org.apache.maven.plugins + maven-source-plugin + + + org.apache.maven.plugins + maven-surefire-plugin + ${maven-surefire-plugin.version} + + + org.apache.maven.plugins + maven-failsafe-plugin + ${maven-failsafe-plugin.version} + + + org.apache.maven.plugins + maven-javadoc-plugin + + + org.jacoco + jacoco-maven-plugin + + + org.apache.maven.plugins + maven-shade-plugin + + + org.codehaus.mojo + templating-maven-plugin + 1.0.0 + + + filtering-java-templates + + filter-sources + + + + + + + + + Evernorth Health Services + https://www.evernorth.com + + + From 64c9eea4bb5a34eb1f64e5143f590c34b1205f23 Mon Sep 17 00:00:00 2001 From: nilaysundarkar <3598371+nilaysundarkar@users.noreply.github.com> Date: Wed, 10 Jul 2024 12:09:11 -0500 Subject: [PATCH 03/17] Added DefaultCredentialProvider class and tests --- pom.xml | 20 +---- .../auth/AwsAssumeRoleCredentialProvider.java | 73 +++++++++++++++++ .../evernorth/mongo/kafka/auth/Constants.java | 8 ++ .../AwsAssumeRoleCredentialProviderTests.java | 80 +++++++++++++++++++ 4 files changed, 165 insertions(+), 16 deletions(-) create mode 100644 src/main/java/com/evernorth/mongo/kafka/auth/AwsAssumeRoleCredentialProvider.java create mode 100644 src/main/java/com/evernorth/mongo/kafka/auth/Constants.java create mode 100644 src/test/java/AwsAssumeRoleCredentialProviderTests.java diff --git a/pom.xml b/pom.xml index 663e833..95baa20 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - com.evernorth.mongo.kafka.connect.auth + com.evernorth.mongo.kafka.auth mongo-kafka-credential-provider Mongo Kafka Connect Assume Role Credential Provider 1.0.0 @@ -15,7 +15,7 @@ 3.2.0 - + 4.12 0.8.12 2.23.4 3.13.0 @@ -34,29 +34,17 @@ sts ${aws-java-sdk.version} - + org.mongodb.kafka mongo-kafka-connect provided 1.13.0 - - diff --git a/src/main/java/com/evernorth/mongo/kafka/auth/AwsAssumeRoleCredentialProvider.java b/src/main/java/com/evernorth/mongo/kafka/auth/AwsAssumeRoleCredentialProvider.java new file mode 100644 index 0000000..aea64b5 --- /dev/null +++ b/src/main/java/com/evernorth/mongo/kafka/auth/AwsAssumeRoleCredentialProvider.java @@ -0,0 +1,73 @@ +package com.evernorth.mongo.kafka.auth; + +import com.mongodb.AwsCredential; +import com.mongodb.MongoCredential; +import com.mongodb.kafka.connect.util.custom.credentials.CustomCredentialProvider; +import org.apache.kafka.common.config.ConfigException; +import software.amazon.awssdk.auth.credentials.DefaultCredentialsProvider; +import software.amazon.awssdk.regions.Region; +import software.amazon.awssdk.services.sts.StsClient; +import software.amazon.awssdk.services.sts.model.AssumeRoleRequest; +import software.amazon.awssdk.services.sts.model.Credentials; + +import java.util.Map; +import java.util.UUID; +import java.util.function.Supplier; + +import static com.evernorth.mongo.kafka.auth.Constants.*; + +public class AwsAssumeRoleCredentialProvider implements CustomCredentialProvider { + + private StsClient stsClient; + private AssumeRoleRequest roleRequest; + + @Override + public MongoCredential getCustomCredential(Map configs) { + Supplier awsFreshCredentialSupplier = + () -> { + Credentials awsCredentials = stsClient.assumeRole(roleRequest).credentials(); + return new AwsCredential( + awsCredentials.accessKeyId(), + awsCredentials.secretAccessKey(), + awsCredentials.sessionToken()); + }; + return MongoCredential.createAwsCredential(null, null) + .withMechanismProperty( + MongoCredential.AWS_CREDENTIAL_PROVIDER_KEY, awsFreshCredentialSupplier); + } + + @Override + public void validate(Map configs) { + if (configs.containsKey(ROLE_ARN)) { + String roleArn = (String) configs.get(ROLE_ARN); + if (roleArn == null || roleArn.isEmpty()) { + throw new ConfigException("AWS Role ARN not provided."); + } + }else{ + throw new ConfigException("AWS Role ARN not provided."); + } + } + + @Override + public void init(Map configs) { + String roleArn = (String) configs.get(ROLE_ARN); + Region region; + if (configs.containsKey(REGION)) { + region = Region.of((String) configs.get(REGION)); + } else { + region = Region.US_EAST_1; + } + String sessionName; + if (configs.containsKey(SESSION_NAME)) { + sessionName = (String) configs.get(SESSION_NAME); + } else { + sessionName = "MONGO-CONNECTOR-SESSION-" + UUID.randomUUID(); + } + stsClient = + StsClient.builder() + .credentialsProvider(DefaultCredentialsProvider.create()) + .region(region) + .build(); + roleRequest = AssumeRoleRequest.builder().roleArn(roleArn).roleSessionName(sessionName).build(); + } +} diff --git a/src/main/java/com/evernorth/mongo/kafka/auth/Constants.java b/src/main/java/com/evernorth/mongo/kafka/auth/Constants.java new file mode 100644 index 0000000..488ea4a --- /dev/null +++ b/src/main/java/com/evernorth/mongo/kafka/auth/Constants.java @@ -0,0 +1,8 @@ +package com.evernorth.mongo.kafka.auth; + +public final class Constants { + public static final String ROLE_ARN = "mongodbaws.auth.mechanism.roleArn"; + public static final String REGION = "mongodbaws.auth.mechanism.region"; + public static final String SESSION_NAME = "mongodbaws.auth.mechanism.roleSessionName"; + +} diff --git a/src/test/java/AwsAssumeRoleCredentialProviderTests.java b/src/test/java/AwsAssumeRoleCredentialProviderTests.java new file mode 100644 index 0000000..e406693 --- /dev/null +++ b/src/test/java/AwsAssumeRoleCredentialProviderTests.java @@ -0,0 +1,80 @@ +import com.evernorth.mongo.kafka.auth.AwsAssumeRoleCredentialProvider; +import com.mongodb.AuthenticationMechanism; +import com.mongodb.AwsCredential; +import com.mongodb.MongoCredential; +import org.apache.kafka.common.config.ConfigException; +import org.junit.Assert; +import org.junit.Test; + +import java.util.HashMap; +import java.util.Map; +import java.util.function.Supplier; + +import static com.evernorth.mongo.kafka.auth.Constants.*; + +public class AwsAssumeRoleCredentialProviderTests { + @Test + public void testAwsAssumeRoleCredentialProvider(){ + Map configValues = new HashMap<>(); + configValues.put(ROLE_ARN, "arn:aws:iam::<>:role/<>"); + configValues.put(REGION, "us-east-1"); + configValues.put(SESSION_NAME, "test-session"); + AwsAssumeRoleCredentialProvider awsAssumeRoleCredentialProvider = new AwsAssumeRoleCredentialProvider(); + awsAssumeRoleCredentialProvider.validate(configValues); + awsAssumeRoleCredentialProvider.init(configValues); + MongoCredential credential = awsAssumeRoleCredentialProvider.getCustomCredential(configValues); + AuthenticationMechanism mechanism = credential.getAuthenticationMechanism(); + assert mechanism != null; + Assert.assertEquals("MONGODB-AWS",mechanism.getMechanismName()); + Assert.assertEquals("$external",credential.getSource()); + Supplier awsFreshCredentialSupplier = credential.getMechanismProperty("aws_credential_provider", null); + Assert.assertNotNull(awsFreshCredentialSupplier); + } + + @Test + public void testAwsAssumeRoleCredentialProviderWithDefaultValues(){ + Map configValues = new HashMap<>(); + configValues.put(ROLE_ARN, "arn:aws:iam::<>:role/<>"); + /*configValues.put(REGION, "us-east-1"); + configValues.put(SESSION_NAME, "test-session");*/ + AwsAssumeRoleCredentialProvider awsAssumeRoleCredentialProvider = new AwsAssumeRoleCredentialProvider(); + awsAssumeRoleCredentialProvider.validate(configValues); + awsAssumeRoleCredentialProvider.init(configValues); + MongoCredential credential = awsAssumeRoleCredentialProvider.getCustomCredential(configValues); + AuthenticationMechanism mechanism = credential.getAuthenticationMechanism(); + assert mechanism != null; + Assert.assertEquals("MONGODB-AWS",mechanism.getMechanismName()); + Assert.assertEquals("$external",credential.getSource()); + Supplier awsFreshCredentialSupplier = credential.getMechanismProperty("aws_credential_provider", null); + Assert.assertNotNull(awsFreshCredentialSupplier); + } + + @Test(expected = ConfigException.class) + public void testAwsAssumeRoleCredentialProviderWithoutRole(){ + Map configValues = new HashMap<>(); + configValues.put(REGION, "us-east-1"); + configValues.put(SESSION_NAME, "test-session"); + AwsAssumeRoleCredentialProvider awsAssumeRoleCredentialProvider = new AwsAssumeRoleCredentialProvider(); + awsAssumeRoleCredentialProvider.validate(configValues); + } + + @Test(expected = ConfigException.class) + public void testAwsAssumeRoleCredentialProviderWithEmptyRole(){ + Map configValues = new HashMap<>(); + configValues.put(REGION, "us-east-1"); + configValues.put(SESSION_NAME, "test-session"); + configValues.put(ROLE_ARN, ""); + AwsAssumeRoleCredentialProvider awsAssumeRoleCredentialProvider = new AwsAssumeRoleCredentialProvider(); + awsAssumeRoleCredentialProvider.validate(configValues); + } + + @Test(expected = ConfigException.class) + public void testAwsAssumeRoleCredentialProviderWithNullRole(){ + Map configValues = new HashMap<>(); + configValues.put(REGION, "us-east-1"); + configValues.put(SESSION_NAME, "test-session"); + configValues.put(ROLE_ARN, null); + AwsAssumeRoleCredentialProvider awsAssumeRoleCredentialProvider = new AwsAssumeRoleCredentialProvider(); + awsAssumeRoleCredentialProvider.validate(configValues); + } +} From 76f61b306b1536547f09c6457d9a7e3f008d664b Mon Sep 17 00:00:00 2001 From: nilaysundarkar <3598371+nilaysundarkar@users.noreply.github.com> Date: Wed, 10 Jul 2024 12:11:49 -0500 Subject: [PATCH 04/17] fixed package for junits --- .../kafka/auth}/AwsAssumeRoleCredentialProviderTests.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) rename src/test/java/{ => com/evernorth/mongo/kafka/auth}/AwsAssumeRoleCredentialProviderTests.java (98%) diff --git a/src/test/java/AwsAssumeRoleCredentialProviderTests.java b/src/test/java/com/evernorth/mongo/kafka/auth/AwsAssumeRoleCredentialProviderTests.java similarity index 98% rename from src/test/java/AwsAssumeRoleCredentialProviderTests.java rename to src/test/java/com/evernorth/mongo/kafka/auth/AwsAssumeRoleCredentialProviderTests.java index e406693..8b884bd 100644 --- a/src/test/java/AwsAssumeRoleCredentialProviderTests.java +++ b/src/test/java/com/evernorth/mongo/kafka/auth/AwsAssumeRoleCredentialProviderTests.java @@ -1,4 +1,5 @@ -import com.evernorth.mongo.kafka.auth.AwsAssumeRoleCredentialProvider; +package com.evernorth.mongo.kafka.auth; + import com.mongodb.AuthenticationMechanism; import com.mongodb.AwsCredential; import com.mongodb.MongoCredential; From 875e5036b700ac864b7671bef1f1498dd853b884 Mon Sep 17 00:00:00 2001 From: nilaysundarkar <3598371+nilaysundarkar@users.noreply.github.com> Date: Thu, 11 Jul 2024 07:08:36 -0500 Subject: [PATCH 05/17] added details to README --- CHANGELOG.md | 7 + CODE_OF_CONDUCT.md | 35 +++++ README.md | 62 +++++++- images/Design-Ec2.jpg | Bin 0 -> 61410 bytes ...m-credential-provider-sequence-diagram.jpg | Bin 0 -> 47183 bytes pom.xml | 135 +----------------- 6 files changed, 107 insertions(+), 132 deletions(-) create mode 100644 CHANGELOG.md create mode 100644 CODE_OF_CONDUCT.md create mode 100644 images/Design-Ec2.jpg create mode 100644 images/custom-credential-provider-sequence-diagram.jpg diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..f6ea1e8 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,7 @@ +All notable changes to this project will be documented in this file. +We follow the [Semantic Versioning 2.0.0](http://semver.org/) format. + + +## 1.0.0 - 2024-07-10 + +Initial release \ No newline at end of file diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..a8336c8 --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,35 @@ +### CODE OF CONDUCT +Evernorth Strategic Development, Inc. (“Evernorth”) welcomes contributions to our hosted open source projects. We have adopted this Code of Conduct (the “Code”) to facilitate your participation and to ensure our open source community remains a safe, harassment-free, and collaborative space. + +# Scope +This Code applies within all community spaces, and also applies when an individual is officially representing the community in public spaces. Examples of representing our community include using an official e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. + +# Our Standards +We strive to make participation in our open source projects open and enjoyable for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex, gender identity, level of experience, education, socio-economic status, nationality, personal appearance, race, caste, color, religion, or sexual orientation. + +Examples of behavior that contributes to a positive environment for our community include: +* Demonstrating empathy and kindness toward other people. +* Being respectful of differing opinions, viewpoints, and experiences. +* Giving and gracefully accepting constructive feedback. +* Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience. +* Focusing on what is best not just for us as individuals, but for the overall community. + +Examples of unacceptable behavior include: +* The use of sexualized language or imagery, and sexual attention or advances of any kind. +* Trolling, insulting or derogatory comments, and personal or political attacks. +* Public or private harassment. +* Publishing others’ private information, such as a physical or email address, without their explicit permission. +* Other conduct which could reasonably be considered inappropriate in a professional setting. + +# Enforcement +The Evernorth Open Source Leadership Group (the “Leadership Group”) is responsible for clarifying and enforcing this Code and will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful. +The Leadership Group has the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code, and will communicate reasons for moderation decisions when appropriate. + +# Reporting +Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the Leadership Group at [opensource@evernorth.io](mailto:opensource@evernorth.io). All complaints will be reviewed and investigated promptly and fairly, while respecting the privacy and security of the reporter. We will determine if and what response is appropriate, and every matter may not result in a direct response from us. +Consequences for inappropriate behavior may include: (1) a warning with consequences for continued behavior; (2) restricted or suspended access to certain projects or other community members for a specific period of time; (3) temporary suspensions from participation in the community; and (4) permanent bans from participating in the community. Factors that may be considered when imposing various consequences may include, but are not limited to, the seriousness or nature of the harm caused, repeated violations of this Code, and the impact of the activity on our broader open source community. + +# Attribution +This Code of Conduct is adapted from the [Contributor Covenant](https://contributor-covenant.org), version 2.0, available at [contributor-covenant.org/version/2/0/](https://www.contributor-covenant.org/version/2/0/code_of_conduct.html). + + diff --git a/README.md b/README.md index 4a3437a..1659cda 100644 --- a/README.md +++ b/README.md @@ -1 +1,61 @@ -# mongo-kafka-credential-provider \ No newline at end of file +# Mongo Kafka Credential Provider + +**Description**: This repo provides an implementation of the pluggable interface [CustomCredentialProvider](https://github.com/mongodb/mongo-kafka/blob/master/src/main/java/com/mongodb/kafka/connect/util/custom/credentials/CustomCredentialProvider.java) from the [mongo-kafka](https://github.com/mongodb/mongo-kafka/) repo. + +The [mongo-kafka connector](https://www.mongodb.com/docs/kafka-connector/current/) enabled a pluggable [interface](https://github.com/mongodb/mongo-kafka/commit/6e43b1d97f52be6d862328e442eea8ece5492d30) in release 1.13.0. +This was done to enable injection of a custom credential provider in the mongo client that gets created for both the sink and the source connectors. +The implementation of this interface is not provided in the mongo-kafka connector repo as it could have different variations (such as different credential providers from AWS) +or any other credential provider that can be injected in the MongoClient. +The kafka connect framework allows us to provide custom jars that can be made available on the class path by providing a plugin location. +This repo provides the means to build such external jar to provide the AWS authentication provider implementation. + +Below is a sequence diagram that explains the initialization sequence that takes place between the connector and the external jar. For more details on how to enable the +mongo kafka connector to use this, refer to instructions [here](https://github.com/mongodb/mongo-kafka?tab=readme-ov-file#custom-auth-provider-interface) + +Sequence Diagram + +## How to use this repo with mongo kafka connector + +1. Use ``mvn clean package`` generate a jar. +2. Add the compiled JAR to the classpath/plugin path for your Kafka workers. For more information about plugin paths, see the Confluent [documentation](https://docs.confluent.io/platform/current/connect/community.html). Refer to this [guide](https://docs.confluent.io/platform/current/connect/userguide.html#) for more information on kafka connect. + +## Technical Details + +**AwsAssumeRoleCredentialProvider** + +This class can be used with the mongo kafka connector hosted on confluent platform within an AWS container. It uses the ``DefaultCredentialsProvider`` from aws sdk to assume a role provided in configuration, use the session credentials from the assumed role and wrap a supplier lambda in the MongoCredential object that it returns to be wrapped in the MongoClient object. + +Example - + +Design Diagram + +- It uses the below properties to accept an AWS roleArn, an AWS region and an AWS session name. + ```` + mongodbaws.auth.mechanism.roleArn + mongodbaws.auth.mechanism.region + mongodbaws.auth.mechanism.roleSessionName + ```` +- It validates that the roleArn is always passed and defaults region (to us-east-1) and role session name to (MONGO-CONNECTOR-SESSION-) if they are not passed. + +## Tests and Coverage + +- Unit tests can be located at ``com.evernorth.mongo.kafka.auth.AwsAssumeRoleCredentialProviderTests`` +- Jacoco plugin is used for code coverage + +## Dependencies + +This repo uses the below jars + +| Dependency | jar | version | +|-----------------------|----------------------------------------|----------| +| AWS SDK | software.amazon.awssdk.sts | 2.25.14 | +| Mongo Kafka Connector | org.mongodb.kafka.mongo-kafka-connect | 1.13.0 | + +## Limitations + +The external jar that this repo produces has been tested with Confluent platform hosted on AWS EC2 instances. It has not been tested on confluent cloud. + +## License +Mongo Kafka Credential Provider is Open Source software released under the [Apache 2.0 license](https://www.apache.org/licenses/LICENSE-2.0.html). + +---- \ No newline at end of file diff --git a/images/Design-Ec2.jpg b/images/Design-Ec2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..04fbbd53e566da430dad24580cdd2dc49860e45a GIT binary patch literal 61410 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 X;JHqvPT|?Je&@Gy{_^L+p9cOPReR-? literal 0 HcmV?d00001 diff --git a/images/custom-credential-provider-sequence-diagram.jpg b/images/custom-credential-provider-sequence-diagram.jpg new file mode 100644 index 0000000000000000000000000000000000000000..23b846d6ec56e7fa333fec9640317b9b4a0f2db8 GIT binary patch literal 47183 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 UTF-8 UTF-8 - 1.8 - - - 3.2.0 - 4.12 + 11 + 4.13.1 0.8.12 - 2.23.4 - 3.13.0 - 3.2.5 - 3.6.3 - 3.5.2 - 3.3.1 - 3.2.5 - 3.5.0 2.25.14 + 1.13.0 @@ -43,7 +33,7 @@ org.mongodb.kafka mongo-kafka-connect provided - 1.13.0 + ${mongo-kafka-connect.version} @@ -58,81 +48,8 @@ true - - - - org.apache.maven.plugins - maven-compiler-plugin - ${maven-compiler-plugin.version} - - ${java.version} - ${java.version} - - - - org.apache.maven.plugins - maven-javadoc-plugin - ${maven-javadoc-plugin.version} - - - org.apache.maven.plugins - maven-source-plugin - ${maven-source-plugin.version} - - - attach-sources - verify - - jar-no-fork - - - - - - org.apache.maven.plugins - maven-shade-plugin - ${maven-shade-plugin.version} - - - package - - shade - - - - - *:* - - - META-INF/*.SF - META-INF/*.DSA - META-INF/*.RSA - - - - - - - junit:* - jmock:* - mockito-all:* - - - commons-codec:* - commons-logging:* - org.apache.httpcomponents:* - org.apache.kafka:* - org.slf4j:* - - - - - - org.jacoco jacoco-maven-plugin @@ -156,54 +73,10 @@ - - org.apache.maven.plugins - maven-compiler-plugin - - - org.codehaus.mojo - exec-maven-plugin - ${exec-maven-plugin.version} - - - org.apache.maven.plugins - maven-source-plugin - - - org.apache.maven.plugins - maven-surefire-plugin - ${maven-surefire-plugin.version} - - - org.apache.maven.plugins - maven-failsafe-plugin - ${maven-failsafe-plugin.version} - - - org.apache.maven.plugins - maven-javadoc-plugin - org.jacoco jacoco-maven-plugin - - org.apache.maven.plugins - maven-shade-plugin - - - org.codehaus.mojo - templating-maven-plugin - 1.0.0 - - - filtering-java-templates - - filter-sources - - - - From 100ee296227feb245a028db2592fe6eee85b8a6f Mon Sep 17 00:00:00 2001 From: nilaysundarkar <3598371+nilaysundarkar@users.noreply.github.com> Date: Thu, 11 Jul 2024 09:21:22 -0500 Subject: [PATCH 06/17] added required readme files --- CODEOWNERS | 2 + LICENSE | 201 +++++++++++++++++++++++++++++++++++++++++++++++++++++ NOTICE | 16 +++++ 3 files changed, 219 insertions(+) create mode 100644 CODEOWNERS create mode 100644 LICENSE create mode 100644 NOTICE diff --git a/CODEOWNERS b/CODEOWNERS new file mode 100644 index 0000000..acf7364 --- /dev/null +++ b/CODEOWNERS @@ -0,0 +1,2 @@ +# Global owners +* [@Evernorth/@nilaysundarkar] \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..7ee9c89 --- /dev/null +++ b/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + https://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright © 2022 Evernorth Strategic Development, Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/NOTICE b/NOTICE new file mode 100644 index 0000000..ba0f2cc --- /dev/null +++ b/NOTICE @@ -0,0 +1,16 @@ +[ Project Title ] + +Copyright (c) 2022 Evernorth Strategic Development, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + From 922ede881cebc3b5a6944435cb0d32019cbfa0b7 Mon Sep 17 00:00:00 2001 From: nilaysundarkar <3598371+nilaysundarkar@users.noreply.github.com> Date: Thu, 11 Jul 2024 09:27:47 -0500 Subject: [PATCH 07/17] added CONTRIBUTING.md --- CONTRIBUTING.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 CONTRIBUTING.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..636bffa --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,21 @@ +# Contributing + +Thanks for your interest in contributing to this project! + +We welcome any kind of contribution including: + +- Documentation +- Examples +- New features and feature requests +- Bug fixes + +Please open Pull Requests for small changes. + +For larger changes please submit and issue with additional details. + +This issue should outline the following: + +- The use case that your changes are applicable to. +- Steps to reproduce the issue(s) if applicable. +- Detailed description of what your changes would entail. +- Alternative solutions or approaches if applicable. \ No newline at end of file From c6b057f3174f63fe3895a2ca95318d2a1c46b32a Mon Sep 17 00:00:00 2001 From: nilaysundarkar <3598371+nilaysundarkar@users.noreply.github.com> Date: Thu, 11 Jul 2024 09:31:34 -0500 Subject: [PATCH 08/17] fixed CODEOWNERS --- CODEOWNERS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CODEOWNERS b/CODEOWNERS index acf7364..2ed5cec 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -1,2 +1,2 @@ # Global owners -* [@Evernorth/@nilaysundarkar] \ No newline at end of file +* @Evernorth/nilaysundarkar \ No newline at end of file From f0de5765ecdf3086e88908f5ee7cdb93f9e0c53a Mon Sep 17 00:00:00 2001 From: nilaysundarkar <3598371+nilaysundarkar@users.noreply.github.com> Date: Thu, 11 Jul 2024 09:36:32 -0500 Subject: [PATCH 09/17] fixed CODEOWNERS and NOTICE --- CODEOWNERS | 2 +- NOTICE | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CODEOWNERS b/CODEOWNERS index 2ed5cec..522a4a5 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -1,2 +1,2 @@ # Global owners -* @Evernorth/nilaysundarkar \ No newline at end of file +* @nilaysundarkar \ No newline at end of file diff --git a/NOTICE b/NOTICE index ba0f2cc..99ae637 100644 --- a/NOTICE +++ b/NOTICE @@ -1,4 +1,4 @@ -[ Project Title ] +Mongo Kafka Credential Provider Copyright (c) 2022 Evernorth Strategic Development, Inc. From cd99fed7d4389e5208130d280fa1cb44636ad446 Mon Sep 17 00:00:00 2001 From: nilaysundarkar <3598371+nilaysundarkar@users.noreply.github.com> Date: Thu, 11 Jul 2024 09:49:45 -0500 Subject: [PATCH 10/17] minor correction in README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 1659cda..4f3f7c5 100644 --- a/README.md +++ b/README.md @@ -35,7 +35,7 @@ Example - mongodbaws.auth.mechanism.region mongodbaws.auth.mechanism.roleSessionName ```` -- It validates that the roleArn is always passed and defaults region (to us-east-1) and role session name to (MONGO-CONNECTOR-SESSION-) if they are not passed. +- It validates that the roleArn is always passed and defaults region (to us-east-1) and role session name (to MONGO-CONNECTOR-SESSION-{random UUID}) if they are not passed. ## Tests and Coverage From 4c2a43b953a2e1c0c74f486f0c2e33eeb5514677 Mon Sep 17 00:00:00 2001 From: nilaysundarkar <3598371+nilaysundarkar@users.noreply.github.com> Date: Thu, 11 Jul 2024 09:50:50 -0500 Subject: [PATCH 11/17] minor correction in README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4f3f7c5..51f8106 100644 --- a/README.md +++ b/README.md @@ -53,7 +53,7 @@ This repo uses the below jars ## Limitations -The external jar that this repo produces has been tested with Confluent platform hosted on AWS EC2 instances. It has not been tested on confluent cloud. +The external (to the connector) jar that this repo produces has been tested with Confluent platform hosted on AWS EC2 instances. It has not been tested on confluent cloud. ## License Mongo Kafka Credential Provider is Open Source software released under the [Apache 2.0 license](https://www.apache.org/licenses/LICENSE-2.0.html). From 0db5221aec196a8181c2b9526e93cc03bf45cbc8 Mon Sep 17 00:00:00 2001 From: nilaysundarkar <3598371+nilaysundarkar@users.noreply.github.com> Date: Thu, 11 Jul 2024 10:53:39 -0500 Subject: [PATCH 12/17] minor correction in README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 51f8106..6942708 100644 --- a/README.md +++ b/README.md @@ -40,7 +40,7 @@ Example - ## Tests and Coverage - Unit tests can be located at ``com.evernorth.mongo.kafka.auth.AwsAssumeRoleCredentialProviderTests`` -- Jacoco plugin is used for code coverage +- Jacoco plugin is used for code coverage. ## Dependencies From be6922758ca0a4ac9a6f26c9a74db24178131e13 Mon Sep 17 00:00:00 2001 From: nilaysundarkar <3598371+nilaysundarkar@users.noreply.github.com> Date: Tue, 16 Jul 2024 04:56:39 -0500 Subject: [PATCH 13/17] incorporate changes for feedback --- CODE_OF_CONDUCT.md | 2 +- NOTICE | 4 ++-- README.md | 6 ++--- .../auth/AwsAssumeRoleCredentialProvider.java | 22 +++++++++++++++++++ 4 files changed, 28 insertions(+), 6 deletions(-) diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index a8336c8..d248e31 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -26,7 +26,7 @@ The Evernorth Open Source Leadership Group (the “Leadership Group”) is respo The Leadership Group has the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code, and will communicate reasons for moderation decisions when appropriate. # Reporting -Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the Leadership Group at [opensource@evernorth.io](mailto:opensource@evernorth.io). All complaints will be reviewed and investigated promptly and fairly, while respecting the privacy and security of the reporter. We will determine if and what response is appropriate, and every matter may not result in a direct response from us. +Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the Leadership Group at [opensource@evernorth.com](mailto:opensource@evernorth.com). All complaints will be reviewed and investigated promptly and fairly, while respecting the privacy and security of the reporter. We will determine if and what response is appropriate, and every matter may not result in a direct response from us. Consequences for inappropriate behavior may include: (1) a warning with consequences for continued behavior; (2) restricted or suspended access to certain projects or other community members for a specific period of time; (3) temporary suspensions from participation in the community; and (4) permanent bans from participating in the community. Factors that may be considered when imposing various consequences may include, but are not limited to, the seriousness or nature of the harm caused, repeated violations of this Code, and the impact of the activity on our broader open source community. # Attribution diff --git a/NOTICE b/NOTICE index 99ae637..cbc5fda 100644 --- a/NOTICE +++ b/NOTICE @@ -1,6 +1,6 @@ -Mongo Kafka Credential Provider +[mongo-kafka-credential-provider] -Copyright (c) 2022 Evernorth Strategic Development, Inc. +Copyright (c) 2024 Evernorth Strategic Development, Inc. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/README.md b/README.md index 6942708..49998f5 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ **Description**: This repo provides an implementation of the pluggable interface [CustomCredentialProvider](https://github.com/mongodb/mongo-kafka/blob/master/src/main/java/com/mongodb/kafka/connect/util/custom/credentials/CustomCredentialProvider.java) from the [mongo-kafka](https://github.com/mongodb/mongo-kafka/) repo. The [mongo-kafka connector](https://www.mongodb.com/docs/kafka-connector/current/) enabled a pluggable [interface](https://github.com/mongodb/mongo-kafka/commit/6e43b1d97f52be6d862328e442eea8ece5492d30) in release 1.13.0. -This was done to enable injection of a custom credential provider in the mongo client that gets created for both the sink and the source connectors. +This enhancement enabled injection of a custom credential provider in the mongo client that gets created for both the sink and the source connectors. The implementation of this interface is not provided in the mongo-kafka connector repo as it could have different variations (such as different credential providers from AWS) or any other credential provider that can be injected in the MongoClient. The kafka connect framework allows us to provide custom jars that can be made available on the class path by providing a plugin location. @@ -16,7 +16,7 @@ mongo kafka connector to use this, refer to instructions [here](https://github.c ## How to use this repo with mongo kafka connector -1. Use ``mvn clean package`` generate a jar. +1. Use ``mvn clean package`` to generate a jar. 2. Add the compiled JAR to the classpath/plugin path for your Kafka workers. For more information about plugin paths, see the Confluent [documentation](https://docs.confluent.io/platform/current/connect/community.html). Refer to this [guide](https://docs.confluent.io/platform/current/connect/userguide.html#) for more information on kafka connect. ## Technical Details @@ -35,7 +35,7 @@ Example - mongodbaws.auth.mechanism.region mongodbaws.auth.mechanism.roleSessionName ```` -- It validates that the roleArn is always passed and defaults region (to us-east-1) and role session name (to MONGO-CONNECTOR-SESSION-{random UUID}) if they are not passed. +- It validates that the roleArn is always passed as an argument. Region will default to us-east-1 and role session name defaults to MONGO-CONNECTOR-SESSION-{random UUID}) if not included as arguments. ## Tests and Coverage diff --git a/src/main/java/com/evernorth/mongo/kafka/auth/AwsAssumeRoleCredentialProvider.java b/src/main/java/com/evernorth/mongo/kafka/auth/AwsAssumeRoleCredentialProvider.java index aea64b5..5b0eda9 100644 --- a/src/main/java/com/evernorth/mongo/kafka/auth/AwsAssumeRoleCredentialProvider.java +++ b/src/main/java/com/evernorth/mongo/kafka/auth/AwsAssumeRoleCredentialProvider.java @@ -4,6 +4,8 @@ import com.mongodb.MongoCredential; import com.mongodb.kafka.connect.util.custom.credentials.CustomCredentialProvider; import org.apache.kafka.common.config.ConfigException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import software.amazon.awssdk.auth.credentials.DefaultCredentialsProvider; import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.sts.StsClient; @@ -21,10 +23,15 @@ public class AwsAssumeRoleCredentialProvider implements CustomCredentialProvider private StsClient stsClient; private AssumeRoleRequest roleRequest; + static final Logger LOGGER = LoggerFactory.getLogger(AwsAssumeRoleCredentialProvider.class); + @Override public MongoCredential getCustomCredential(Map configs) { Supplier awsFreshCredentialSupplier = () -> { + if(LOGGER.isDebugEnabled()){ + LOGGER.debug("Getting new AWS credentials"); + } Credentials awsCredentials = stsClient.assumeRole(roleRequest).credentials(); return new AwsCredential( awsCredentials.accessKeyId(), @@ -38,6 +45,9 @@ public MongoCredential getCustomCredential(Map configs) { @Override public void validate(Map configs) { + if(LOGGER.isDebugEnabled()){ + LOGGER.debug("Validating Role Arn"); + } if (configs.containsKey(ROLE_ARN)) { String roleArn = (String) configs.get(ROLE_ARN); if (roleArn == null || roleArn.isEmpty()) { @@ -53,14 +63,26 @@ public void init(Map configs) { String roleArn = (String) configs.get(ROLE_ARN); Region region; if (configs.containsKey(REGION)) { + if(LOGGER.isDebugEnabled()){ + LOGGER.debug("Region Provided in Config."); + } region = Region.of((String) configs.get(REGION)); } else { + if(LOGGER.isDebugEnabled()){ + LOGGER.debug("Defaulting to US EAST 1 Region."); + } region = Region.US_EAST_1; } String sessionName; if (configs.containsKey(SESSION_NAME)) { + if(LOGGER.isDebugEnabled()){ + LOGGER.debug("Session Name Provided in Config."); + } sessionName = (String) configs.get(SESSION_NAME); } else { + if(LOGGER.isDebugEnabled()){ + LOGGER.debug("Generating Session Name with random GUID with format MONGO-CONNECTOR-SESSION-GUID."); + } sessionName = "MONGO-CONNECTOR-SESSION-" + UUID.randomUUID(); } stsClient = From c41c0e3c413616363ea2f91b47377b05a4c8fbe4 Mon Sep 17 00:00:00 2001 From: nilaysundarkar <3598371+nilaysundarkar@users.noreply.github.com> Date: Wed, 17 Jul 2024 14:44:58 -0500 Subject: [PATCH 14/17] feedback changes, added maven plugins --- LICENSE | 4 +- NOTICE | 2 +- pom.xml | 123 +++++++++++++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 125 insertions(+), 4 deletions(-) diff --git a/LICENSE b/LICENSE index 7ee9c89..e2e29ab 100644 --- a/LICENSE +++ b/LICENSE @@ -1,5 +1,5 @@ Apache License - Version 2.0, January 2004 + Version 2.0, January 2024 https://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION @@ -186,7 +186,7 @@ same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright © 2022 Evernorth Strategic Development, Inc. + Copyright © 2024 Evernorth Strategic Development, Inc. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/NOTICE b/NOTICE index cbc5fda..23e3c82 100644 --- a/NOTICE +++ b/NOTICE @@ -1,4 +1,4 @@ -[mongo-kafka-credential-provider] +mongo-kafka-credential-provider Copyright (c) 2024 Evernorth Strategic Development, Inc. diff --git a/pom.xml b/pom.xml index 9880051..ea972b3 100644 --- a/pom.xml +++ b/pom.xml @@ -11,11 +11,18 @@ UTF-8 UTF-8 - 11 + 1.8 4.13.1 0.8.12 2.25.14 1.13.0 + 3.13.0 + 3.3.1 + 3.6.3 + 3.2.5 + 3.2.0 + 3.2.5 + 3.5.2 @@ -50,6 +57,76 @@ + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + ${java.version} + ${java.version} + + + + org.apache.maven.plugins + maven-javadoc-plugin + ${maven-javadoc-plugin.version} + + + org.apache.maven.plugins + maven-source-plugin + ${maven-source-plugin.version} + + + attach-sources + verify + + jar-no-fork + + + + + + org.apache.maven.plugins + maven-shade-plugin + ${maven-shade-plugin.version} + + + package + + shade + + + + + *:* + + + META-INF/*.SF + META-INF/*.DSA + META-INF/*.RSA + + + + + + + junit:* + jmock:* + mockito-all:* + + + commons-codec:* + commons-logging:* + org.apache.httpcomponents:* + org.apache.kafka:* + org.slf4j:* + + + + + + org.jacoco jacoco-maven-plugin @@ -73,10 +150,54 @@ + + org.apache.maven.plugins + maven-compiler-plugin + + + org.codehaus.mojo + exec-maven-plugin + ${exec-maven-plugin.version} + + + org.apache.maven.plugins + maven-source-plugin + + + org.apache.maven.plugins + maven-surefire-plugin + ${maven-surefire-plugin.version} + + + org.apache.maven.plugins + maven-failsafe-plugin + ${maven-failsafe-plugin.version} + + + org.apache.maven.plugins + maven-javadoc-plugin + org.jacoco jacoco-maven-plugin + + org.apache.maven.plugins + maven-shade-plugin + + + org.codehaus.mojo + templating-maven-plugin + 1.0.0 + + + filtering-java-templates + + filter-sources + + + + From 462f8e8fa048d4adfb1bac48fe640f12ba62f254 Mon Sep 17 00:00:00 2001 From: nilaysundarkar <3598371+nilaysundarkar@users.noreply.github.com> Date: Wed, 17 Jul 2024 16:27:47 -0500 Subject: [PATCH 15/17] corrected year on LICENSE --- .DS_Store | Bin 0 -> 6148 bytes LICENSE | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 .DS_Store diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..a2642c8fd79ed76c285d70e7fec747729309f37b GIT binary patch literal 6148 zcmeHKJ8r`;3?&<*2#_UXMqME{5RCK$xj;WovJ^1TxVxvGt4HhOXGq|5bB6|x0QDq_ zPlDcHnj)g@XSWqui^vjgC|@>A&GyYF_K*<;!g0nyhGTbrd+q!8N%rl4aUW%n7x|FW zCEqq^RDcRl0V+TRsKD$BWQkp_Wa?05%A_VeY*I zuvh?C6URVAU>a0lP&Hc&4Laf_^J?N47`>Hi$N9z6MQb2ODnJFU6 Date: Wed, 17 Jul 2024 16:30:18 -0500 Subject: [PATCH 16/17] removed IDE file --- .DS_Store | Bin 6148 -> 0 bytes .gitignore | 1 + 2 files changed, 1 insertion(+) delete mode 100644 .DS_Store diff --git a/.DS_Store b/.DS_Store deleted file mode 100644 index a2642c8fd79ed76c285d70e7fec747729309f37b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHKJ8r`;3?&<*2#_UXMqME{5RCK$xj;WovJ^1TxVxvGt4HhOXGq|5bB6|x0QDq_ zPlDcHnj)g@XSWqui^vjgC|@>A&GyYF_K*<;!g0nyhGTbrd+q!8N%rl4aUW%n7x|FW zCEqq^RDcRl0V+TRsKD$BWQkp_Wa?05%A_VeY*I zuvh?C6URVAU>a0lP&Hc&4Laf_^J?N47`>Hi$N9z6MQb2ODnJFU6 Date: Wed, 17 Jul 2024 17:56:59 -0500 Subject: [PATCH 17/17] modified README for java version limitation --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 49998f5..64df998 100644 --- a/README.md +++ b/README.md @@ -53,7 +53,8 @@ This repo uses the below jars ## Limitations -The external (to the connector) jar that this repo produces has been tested with Confluent platform hosted on AWS EC2 instances. It has not been tested on confluent cloud. +- The external (to the connector) jar that this repo produces has been tested with Confluent platform hosted on AWS EC2 instances. It has not been tested on confluent cloud. +- The mongo kafka connector needs external jars that are compiled using Java 8. Hence, we have the java version set to 1.8. ## License Mongo Kafka Credential Provider is Open Source software released under the [Apache 2.0 license](https://www.apache.org/licenses/LICENSE-2.0.html).