Skip to content

Commit b8c1aa5

Browse files
authored
s2a: Add gRPC S2A (#11113)
1 parent f3cf7c3 commit b8c1aa5

Some content is hidden

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

54 files changed

+6623
-1
lines changed

MODULE.bazel

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ IO_GRPC_GRPC_JAVA_ARTIFACTS = [
4141
"io.perfmark:perfmark-api:0.27.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.24",
4546
]
4647
# GRPC_DEPS_END

buildscripts/sync-protos.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ curl -Ls https://github.com/grpc/grpc-proto/archive/master.tar.gz | tar xz -C "$
88
base="$tmpdir/grpc-proto-master"
99

1010
# Copy protos in 'src/main/proto' from grpc-proto for these projects
11-
for project in alts grpclb services rls interop-testing; do
11+
for project in alts grpclb services s2a rls interop-testing; do
1212
while read -r proto; do
1313
[ -f "$base/$proto" ] && cp "$base/$proto" "$project/src/main/proto/$proto"
1414
echo "$proto"

repositories.bzl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ IO_GRPC_GRPC_JAVA_ARTIFACTS = [
4545
"io.perfmark:perfmark-api:0.27.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.24",
4950
]
5051
# GRPC_DEPS_END
@@ -80,6 +81,7 @@ IO_GRPC_GRPC_JAVA_OVERRIDE_TARGETS = {
8081
"io.grpc:grpc-rls": "@io_grpc_grpc_java//rls",
8182
"io.grpc:grpc-services": "@io_grpc_grpc_java//services:services_maven",
8283
"io.grpc:grpc-stub": "@io_grpc_grpc_java//stub",
84+
"io.grpc:grpc-s2a": "@io_grpc_grpc_java//s2a",
8385
"io.grpc:grpc-testing": "@io_grpc_grpc_java//testing",
8486
"io.grpc:grpc-xds": "@io_grpc_grpc_java//xds:xds_maven",
8587
"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("com.google.guava:guava"),
63+
],
64+
)
65+
66+
java_library(
67+
name = "s2a_handshaker",
68+
srcs = [
69+
"src/main/java/io/grpc/s2a/handshaker/ConnectionClosedException.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/s2a/*.proto"]),
137+
outs = [
138+
"protobuf_out/grpc/gcp/s2a/s2a.proto",
139+
"protobuf_out/grpc/gcp/s2a/s2a_context.proto",
140+
"protobuf_out/grpc/gcp/s2a/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/s2a/$$(basename $$fname); done",
145+
)
146+
147+
proto_library(
148+
name = "common_proto",
149+
srcs = [
150+
"protobuf_out/grpc/gcp/s2a/common.proto",
151+
],
152+
)
153+
154+
proto_library(
155+
name = "s2a_context_proto",
156+
srcs = [
157+
"protobuf_out/grpc/gcp/s2a/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/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: 151 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,151 @@
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+
def nettyDependency = implementation project(':grpc-netty')
30+
compileOnly libraries.javax.annotation
31+
32+
shadow configurations.implementation.getDependencies().minus(nettyDependency)
33+
shadow project(path: ':grpc-netty-shaded', configuration: 'shadow')
34+
35+
testImplementation project(':grpc-benchmarks'),
36+
project(':grpc-testing'),
37+
project(':grpc-testing-proto'),
38+
testFixtures(project(':grpc-core')),
39+
libraries.guava,
40+
libraries.junit,
41+
libraries.mockito.core,
42+
libraries.truth,
43+
libraries.conscrypt,
44+
libraries.netty.transport.epoll
45+
46+
testImplementation 'com.google.truth:truth:1.4.2'
47+
testImplementation 'com.google.truth.extensions:truth-proto-extension:1.4.2'
48+
testImplementation libraries.guava.testlib
49+
50+
testRuntimeOnly libraries.netty.tcnative,
51+
libraries.netty.tcnative.classes
52+
testRuntimeOnly (libraries.netty.tcnative) {
53+
artifact {
54+
classifier = "linux-x86_64"
55+
}
56+
}
57+
testRuntimeOnly (libraries.netty.tcnative) {
58+
artifact {
59+
classifier = "linux-aarch_64"
60+
}
61+
}
62+
testRuntimeOnly (libraries.netty.tcnative) {
63+
artifact {
64+
classifier = "osx-x86_64"
65+
}
66+
}
67+
testRuntimeOnly (libraries.netty.tcnative) {
68+
artifact {
69+
classifier = "osx-aarch_64"
70+
}
71+
}
72+
testRuntimeOnly (libraries.netty.tcnative) {
73+
artifact {
74+
classifier = "windows-x86_64"
75+
}
76+
}
77+
testRuntimeOnly (libraries.netty.transport.epoll) {
78+
artifact {
79+
classifier = "linux-x86_64"
80+
}
81+
}
82+
83+
signature libraries.signature.java
84+
}
85+
86+
tasks.named("compileJava") {
87+
dependsOn(tasks.named("generateProto"))
88+
//dependsOn(tasks.named("syncGeneratedSourcesmain"))
89+
}
90+
91+
92+
tasks.named("sourcesJar") {
93+
dependsOn(tasks.named("generateProto"))
94+
//dependsOn(tasks.named("syncGeneratedSourcesmain"))
95+
}
96+
97+
sourceSets {
98+
main {
99+
//java.srcDirs += "src/generated/main/java"
100+
//java.srcDirs += "src/generated/main/grpc"
101+
}
102+
}
103+
//println sourceSets.main.java.srcDirs
104+
//println sourceSets.test.resources.srcDirs
105+
106+
configureProtoCompilation()
107+
108+
tasks.named("javadoc").configure {
109+
exclude 'io/grpc/s2a/**'
110+
}
111+
112+
tasks.named("jar").configure {
113+
// Must use a different archiveClassifier to avoid conflicting with shadowJar
114+
archiveClassifier = 'original'
115+
manifest {
116+
attributes('Automatic-Module-Name': 'io.grpc.s2a')
117+
}
118+
}
119+
120+
// We want to use grpc-netty-shaded instead of grpc-netty. But we also want our
121+
// source to work with Bazel, so we rewrite the code as part of the build.
122+
tasks.named("shadowJar").configure {
123+
archiveClassifier = null
124+
dependencies {
125+
exclude(dependency {true})
126+
}
127+
relocate 'io.grpc.netty', 'io.grpc.netty.shaded.io.grpc.netty'
128+
relocate 'io.netty', 'io.grpc.netty.shaded.io.netty'
129+
}
130+
131+
publishing {
132+
publications {
133+
maven(MavenPublication) {
134+
// We want this to throw an exception if it isn't working
135+
def originalJar = artifacts.find { dep -> dep.classifier == 'original'}
136+
artifacts.remove(originalJar)
137+
138+
pom.withXml {
139+
def dependenciesNode = new Node(null, 'dependencies')
140+
project.configurations.shadow.allDependencies.each { dep ->
141+
def dependencyNode = dependenciesNode.appendNode('dependency')
142+
dependencyNode.appendNode('groupId', dep.group)
143+
dependencyNode.appendNode('artifactId', dep.name)
144+
dependencyNode.appendNode('version', dep.version)
145+
dependencyNode.appendNode('scope', 'compile')
146+
}
147+
asNode().dependencies[0].replaceNode(dependenciesNode)
148+
}
149+
}
150+
}
151+
}

0 commit comments

Comments
 (0)