Skip to content

Commit b7b51bc

Browse files
committed
add s2a java client.
1 parent 8a21afc commit b7b51bc

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

53 files changed

+6498
-0
lines changed

MODULE.bazel

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,9 @@ IO_GRPC_GRPC_JAVA_ARTIFACTS = [
4141
"io.perfmark:perfmark-api:0.26.0",
4242
"junit:junit:4.13.2",
4343
"org.apache.tomcat:annotations-api:6.0.53",
44+
"org.checkerframework:checker-qual:3.12.0",
4445
"org.codehaus.mojo:animal-sniffer-annotations:1.23",
46+
"org.jcommander:jcommander:1.83",
4547
]
4648
# GRPC_DEPS_END
4749

repositories.bzl

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,9 @@ IO_GRPC_GRPC_JAVA_ARTIFACTS = [
4545
"io.perfmark:perfmark-api:0.26.0",
4646
"junit:junit:4.13.2",
4747
"org.apache.tomcat:annotations-api:6.0.53",
48+
"org.checkerframework:checker-qual:3.12.0",
4849
"org.codehaus.mojo:animal-sniffer-annotations:1.23",
50+
"org.jcommander:jcommander:1.83",
4951
]
5052
# GRPC_DEPS_END
5153

@@ -80,6 +82,7 @@ IO_GRPC_GRPC_JAVA_OVERRIDE_TARGETS = {
8082
"io.grpc:grpc-rls": "@io_grpc_grpc_java//rls",
8183
"io.grpc:grpc-services": "@io_grpc_grpc_java//services:services_maven",
8284
"io.grpc:grpc-stub": "@io_grpc_grpc_java//stub",
85+
"io.grpc:grpc-s2a": "@io_grpc_grpc_java//s2a",
8386
"io.grpc:grpc-testing": "@io_grpc_grpc_java//testing",
8487
"io.grpc:grpc-xds": "@io_grpc_grpc_java//xds:xds_maven",
8588
"io.grpc:grpc-util": "@io_grpc_grpc_java//util",

s2a/BUILD.bazel

Lines changed: 194 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,194 @@
1+
load("@rules_proto//proto:defs.bzl", "proto_library")
2+
load("//:java_grpc_library.bzl", "java_grpc_library")
3+
load("@rules_jvm_external//:defs.bzl", "artifact")
4+
5+
java_library(
6+
name = "s2a_channel_pool",
7+
srcs = glob([
8+
"src/main/java/io/grpc/s2a/channel/*.java",
9+
]),
10+
deps = [
11+
"//api",
12+
"//core",
13+
"//core:internal",
14+
"//netty",
15+
artifact("com.google.code.findbugs:jsr305"),
16+
artifact("com.google.errorprone:error_prone_annotations"),
17+
artifact("com.google.guava:guava"),
18+
artifact("org.checkerframework:checker-qual"),
19+
artifact("io.netty:netty-common"),
20+
artifact("io.netty:netty-transport"),
21+
],
22+
)
23+
24+
java_library(
25+
name = "s2a_identity",
26+
srcs = ["src/main/java/io/grpc/s2a/handshaker/S2AIdentity.java"],
27+
deps = [
28+
":common_java_proto",
29+
artifact("com.google.errorprone:error_prone_annotations"),
30+
artifact("com.google.guava:guava"),
31+
],
32+
)
33+
34+
java_library(
35+
name = "token_fetcher",
36+
srcs = ["src/main/java/io/grpc/s2a/handshaker/tokenmanager/TokenFetcher.java"],
37+
deps = [
38+
":s2a_identity",
39+
],
40+
)
41+
42+
java_library(
43+
name = "access_token_manager",
44+
srcs = [
45+
"src/main/java/io/grpc/s2a/handshaker/tokenmanager/AccessTokenManager.java",
46+
],
47+
deps = [
48+
":s2a_identity",
49+
":token_fetcher",
50+
artifact("com.google.code.findbugs:jsr305"),
51+
],
52+
)
53+
54+
java_library(
55+
name = "single_token_fetcher",
56+
srcs = [
57+
"src/main/java/io/grpc/s2a/handshaker/tokenmanager/SingleTokenFetcher.java",
58+
],
59+
deps = [
60+
":s2a_identity",
61+
":token_fetcher",
62+
artifact("org.jcommander:jcommander"),
63+
],
64+
)
65+
66+
java_library(
67+
name = "s2a_handshaker",
68+
srcs = [
69+
"src/main/java/io/grpc/s2a/handshaker/ConnectionIsClosedException.java",
70+
"src/main/java/io/grpc/s2a/handshaker/GetAuthenticationMechanisms.java",
71+
"src/main/java/io/grpc/s2a/handshaker/ProtoUtil.java",
72+
"src/main/java/io/grpc/s2a/handshaker/S2AConnectionException.java",
73+
"src/main/java/io/grpc/s2a/handshaker/S2APrivateKeyMethod.java",
74+
"src/main/java/io/grpc/s2a/handshaker/S2AProtocolNegotiatorFactory.java",
75+
"src/main/java/io/grpc/s2a/handshaker/S2AStub.java",
76+
"src/main/java/io/grpc/s2a/handshaker/S2ATrustManager.java",
77+
"src/main/java/io/grpc/s2a/handshaker/SslContextFactory.java",
78+
],
79+
deps = [
80+
":access_token_manager",
81+
":common_java_proto",
82+
":s2a_channel_pool",
83+
":s2a_identity",
84+
":s2a_java_proto",
85+
":s2a_java_grpc_proto",
86+
":single_token_fetcher",
87+
"//api",
88+
"//core:internal",
89+
"//netty",
90+
"//stub",
91+
artifact("com.google.code.findbugs:jsr305"),
92+
artifact("com.google.errorprone:error_prone_annotations"),
93+
artifact("com.google.guava:guava"),
94+
artifact("org.checkerframework:checker-qual"),
95+
"@com_google_protobuf//:protobuf_java",
96+
artifact("io.netty:netty-common"),
97+
artifact("io.netty:netty-handler"),
98+
artifact("io.netty:netty-transport"),
99+
],
100+
)
101+
102+
java_library(
103+
name = "s2av2_credentials",
104+
srcs = ["src/main/java/io/grpc/s2a/S2AChannelCredentials.java"],
105+
visibility = ["//visibility:public"],
106+
deps = [
107+
":s2a_channel_pool",
108+
":s2a_handshaker",
109+
":s2a_identity",
110+
"//api",
111+
"//core:internal",
112+
"//netty",
113+
artifact("com.google.code.findbugs:jsr305"),
114+
artifact("com.google.errorprone:error_prone_annotations"),
115+
artifact("com.google.guava:guava"),
116+
artifact("org.checkerframework:checker-qual"),
117+
],
118+
)
119+
120+
java_library(
121+
name = "mtls_to_s2av2_credentials",
122+
srcs = ["src/main/java/io/grpc/s2a/MtlsToS2AChannelCredentials.java"],
123+
visibility = ["//visibility:public"],
124+
deps = [
125+
":s2a_channel_pool",
126+
":s2av2_credentials",
127+
"//api",
128+
"//util",
129+
artifact("com.google.guava:guava"),
130+
],
131+
)
132+
133+
# bazel only accepts proto import with absolute path.
134+
genrule(
135+
name = "protobuf_imports",
136+
srcs = glob(["src/main/proto/grpc/gcp/*.proto"]),
137+
outs = [
138+
"protobuf_out/grpc/gcp/s2a.proto",
139+
"protobuf_out/grpc/gcp/s2a_context.proto",
140+
"protobuf_out/grpc/gcp/common.proto",
141+
],
142+
cmd = "for fname in $(SRCS); do " +
143+
"sed 's,import \",import \"s2a/protobuf_out/,g' $$fname > " +
144+
"$(@D)/protobuf_out/grpc/gcp/$$(basename $$fname); done",
145+
)
146+
147+
proto_library(
148+
name = "common_proto",
149+
srcs = [
150+
"protobuf_out/grpc/gcp/common.proto",
151+
],
152+
)
153+
154+
proto_library(
155+
name = "s2a_context_proto",
156+
srcs = [
157+
"protobuf_out/grpc/gcp/s2a_context.proto",
158+
],
159+
deps = [
160+
":common_proto",
161+
],
162+
)
163+
164+
proto_library(
165+
name = "s2a_proto",
166+
srcs = [
167+
"protobuf_out/grpc/gcp/s2a.proto",
168+
],
169+
deps = [
170+
":common_proto",
171+
":s2a_context_proto",
172+
],
173+
)
174+
175+
java_proto_library(
176+
name = "s2a_java_proto",
177+
deps = [":s2a_proto"],
178+
)
179+
180+
java_proto_library(
181+
name = "s2a_context_java_proto",
182+
deps = [":s2a_context_proto"],
183+
)
184+
185+
java_proto_library(
186+
name = "common_java_proto",
187+
deps = [":common_proto"],
188+
)
189+
190+
java_grpc_library(
191+
name = "s2a_java_grpc_proto",
192+
srcs = [":s2a_proto"],
193+
deps = [":s2a_java_proto"],
194+
)

s2a/build.gradle

Lines changed: 153 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,153 @@
1+
buildscript {
2+
dependencies {
3+
classpath 'com.google.gradle:osdetector-gradle-plugin:1.4.0'
4+
}
5+
}
6+
7+
plugins {
8+
id "java-library"
9+
id "maven-publish"
10+
11+
id "com.github.johnrengelman.shadow"
12+
id "com.google.protobuf"
13+
id "ru.vyarus.animalsniffer"
14+
}
15+
16+
description = "gRPC: S2A"
17+
18+
apply plugin: "com.google.osdetector"
19+
20+
dependencies {
21+
22+
api project(':grpc-api')
23+
implementation project(':grpc-stub'),
24+
project(':grpc-protobuf'),
25+
project(':grpc-core'),
26+
libraries.protobuf.java,
27+
libraries.conscrypt,
28+
libraries.guava.jre // JRE required by protobuf-java-util from grpclb
29+
compileOnly 'org.jcommander:jcommander:1.83'
30+
def nettyDependency = implementation project(':grpc-netty')
31+
compileOnly libraries.javax.annotation
32+
33+
shadow configurations.implementation.getDependencies().minus(nettyDependency)
34+
shadow project(path: ':grpc-netty-shaded', configuration: 'shadow')
35+
36+
testImplementation project(':grpc-benchmarks'),
37+
project(':grpc-testing'),
38+
project(':grpc-testing-proto'),
39+
testFixtures(project(':grpc-core')),
40+
libraries.guava,
41+
libraries.junit,
42+
libraries.mockito.core,
43+
libraries.truth,
44+
libraries.conscrypt,
45+
libraries.netty.transport.epoll
46+
47+
testImplementation 'org.jcommander:jcommander:1.83'
48+
testImplementation 'com.google.truth:truth:1.4.2'
49+
testImplementation 'com.google.truth.extensions:truth-proto-extension:1.4.2'
50+
testImplementation libraries.guava.testlib
51+
52+
testRuntimeOnly libraries.netty.tcnative,
53+
libraries.netty.tcnative.classes
54+
testRuntimeOnly (libraries.netty.tcnative) {
55+
artifact {
56+
classifier = "linux-x86_64"
57+
}
58+
}
59+
testRuntimeOnly (libraries.netty.tcnative) {
60+
artifact {
61+
classifier = "linux-aarch_64"
62+
}
63+
}
64+
testRuntimeOnly (libraries.netty.tcnative) {
65+
artifact {
66+
classifier = "osx-x86_64"
67+
}
68+
}
69+
testRuntimeOnly (libraries.netty.tcnative) {
70+
artifact {
71+
classifier = "osx-aarch_64"
72+
}
73+
}
74+
testRuntimeOnly (libraries.netty.tcnative) {
75+
artifact {
76+
classifier = "windows-x86_64"
77+
}
78+
}
79+
testRuntimeOnly (libraries.netty.transport.epoll) {
80+
artifact {
81+
classifier = "linux-x86_64"
82+
}
83+
}
84+
85+
signature libraries.signature.java
86+
}
87+
88+
tasks.named("compileJava") {
89+
dependsOn(tasks.named("generateProto"))
90+
//dependsOn(tasks.named("syncGeneratedSourcesmain"))
91+
}
92+
93+
94+
tasks.named("sourcesJar") {
95+
dependsOn(tasks.named("generateProto"))
96+
//dependsOn(tasks.named("syncGeneratedSourcesmain"))
97+
}
98+
99+
sourceSets {
100+
main {
101+
//java.srcDirs += "src/generated/main/java"
102+
//java.srcDirs += "src/generated/main/grpc"
103+
}
104+
}
105+
//println sourceSets.main.java.srcDirs
106+
//println sourceSets.test.resources.srcDirs
107+
108+
configureProtoCompilation()
109+
110+
tasks.named("javadoc").configure {
111+
exclude 'io/grpc/s2a/**'
112+
}
113+
114+
tasks.named("jar").configure {
115+
// Must use a different archiveClassifier to avoid conflicting with shadowJar
116+
archiveClassifier = 'original'
117+
manifest {
118+
attributes('Automatic-Module-Name': 'io.grpc.s2a')
119+
}
120+
}
121+
122+
// We want to use grpc-netty-shaded instead of grpc-netty. But we also want our
123+
// source to work with Bazel, so we rewrite the code as part of the build.
124+
tasks.named("shadowJar").configure {
125+
archiveClassifier = null
126+
dependencies {
127+
exclude(dependency {true})
128+
}
129+
relocate 'io.grpc.netty', 'io.grpc.netty.shaded.io.grpc.netty'
130+
relocate 'io.netty', 'io.grpc.netty.shaded.io.netty'
131+
}
132+
133+
publishing {
134+
publications {
135+
maven(MavenPublication) {
136+
// We want this to throw an exception if it isn't working
137+
def originalJar = artifacts.find { dep -> dep.classifier == 'original'}
138+
artifacts.remove(originalJar)
139+
140+
pom.withXml {
141+
def dependenciesNode = new Node(null, 'dependencies')
142+
project.configurations.shadow.allDependencies.each { dep ->
143+
def dependencyNode = dependenciesNode.appendNode('dependency')
144+
dependencyNode.appendNode('groupId', dep.group)
145+
dependencyNode.appendNode('artifactId', dep.name)
146+
dependencyNode.appendNode('version', dep.version)
147+
dependencyNode.appendNode('scope', 'compile')
148+
}
149+
asNode().dependencies[0].replaceNode(dependenciesNode)
150+
}
151+
}
152+
}
153+
}

0 commit comments

Comments
 (0)