Skip to content

Commit

Permalink
feat: DIREGAPIC initial implementation (#746)
Browse files Browse the repository at this point in the history
ntegration tests (compute_small) are not present in this commit, as they depend on #743 and #744. Also, as a prerequisite, at least a basic implementation of DIREGAPIC must be merged in gapic-generator-java, to integrate it with [googleapis-discovery](https://github.com/googleapis/googleapis-discovery) first (since integration test infra depends on the actual googleapis/googleapis-discovery targets). Please check vam-google@8983e23 to see how it would look like with compute integration tests not excluded.


`compliance.proto` is used as a basis for the REST composer tests. It was copied as is from [showcase/compliance.proto](https://github.com/googleapis/gapic-showcase/blob/master/schema/google/showcase/v1beta1/compliance.proto).

Changes in `WORKSPACE` and `repositories.bzl` are necessary to make this repo work with gax-java `1.63.0` and above (`gax-java` vs `gapic-generator-java` java dependencies imports precedence). The other dependencies changes are either to bring deps in sync with the actual ones in googleapis, or to fix a specific import precedence issue.

I also added (in a form of bazel rules) a proto descriptor dumper and a runner from the dumped file (for debugging purposes). Not technically required here (but was very helpful for debugging purposes, so hopefully we can preserve it).
  • Loading branch information
vam-google committed Jun 7, 2021
1 parent 72fa76f commit 81f6737
Show file tree
Hide file tree
Showing 45 changed files with 4,199 additions and 128 deletions.
60 changes: 39 additions & 21 deletions WORKSPACE
@@ -1,6 +1,7 @@
workspace(name = "gapic_generator_java")

load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
load("@bazel_tools//tools/build_defs/repo:jvm.bzl", "jvm_maven_import_external")

# DO NOT REMOVE.
# This is needed to clobber any transitively-pulled in versions of bazel_skylib so that packages
Expand All @@ -14,6 +15,36 @@ http_archive(
],
)

jvm_maven_import_external(
name = "google_java_format_all_deps",
artifact = "com.google.googlejavaformat:google-java-format:jar:all-deps:1.7",
server_urls = ["https://repo.maven.apache.org/maven2/", "http://repo1.maven.org/maven2/"],
licenses = ["notice", "reciprocal"]
)

# gax-java and its transitive dependencies must be imported before
# gapic-generator-java dependencies to match the order in googleapis repository,
# which in its turn, prioritizes actual generated clients runtime dependencies
# over the generator dependencies.
_gax_java_version = "1.64.0"

http_archive(
name = "com_google_api_gax_java",
strip_prefix = "gax-java-%s" % _gax_java_version,
urls = ["https://github.com/googleapis/gax-java/archive/v%s.zip" % _gax_java_version],
)

load("@com_google_api_gax_java//:repository_rules.bzl", "com_google_api_gax_java_properties")

com_google_api_gax_java_properties(
name = "com_google_api_gax_java_properties",
file = "@com_google_api_gax_java//:dependencies.properties",
)

load("@com_google_api_gax_java//:repositories.bzl", "com_google_api_gax_java_repositories")

com_google_api_gax_java_repositories()

load("//:repository_rules.bzl", "gapic_generator_java_properties")

gapic_generator_java_properties(
Expand All @@ -35,8 +66,8 @@ protobuf_deps()
# Import the monolith so we can transitively use its gapic rules for googleapis.
http_archive(
name = "com_google_api_codegen",
strip_prefix = "gapic-generator-2.4.6",
urls = ["https://github.com/googleapis/gapic-generator/archive/v2.4.6.zip"],
strip_prefix = "gapic-generator-2.11.1",
urls = ["https://github.com/googleapis/gapic-generator/archive/v2.11.1.zip"],
)

load("@com_google_googleapis//:repository_rules.bzl", "switched_rules_by_language")
Expand All @@ -48,25 +79,12 @@ switched_rules_by_language(
java = True,
)

_gax_java_version = PROPERTIES["version.com_google_gax_java"]

http_archive(
name = "com_google_api_gax_java",
strip_prefix = "gax-java-%s" % _gax_java_version,
urls = ["https://github.com/googleapis/gax-java/archive/v%s.zip" % _gax_java_version],
)

load("@com_google_api_gax_java//:repository_rules.bzl", "com_google_api_gax_java_properties")

com_google_api_gax_java_properties(
name = "com_google_api_gax_java_properties",
file = "@com_google_api_gax_java//:dependencies.properties",
)

load("@com_google_api_gax_java//:repositories.bzl", "com_google_api_gax_java_repositories")

com_google_api_gax_java_repositories()

load("@io_grpc_grpc_java//:repositories.bzl", "grpc_java_repositories")

grpc_java_repositories()

http_archive(
name = "com_google_disco_to_proto3_converter",
strip_prefix = "disco-to-proto3-converter-1839f6aca5e968e59b7acc03e7018b0fda8c480b",
urls = ["https://github.com/googleapis/disco-to-proto3-converter/archive/1839f6aca5e968e59b7acc03e7018b0fda8c480b.zip"],
)
5 changes: 2 additions & 3 deletions dependencies.properties
Expand Up @@ -7,11 +7,10 @@
# Target workspace name: com_google_api_codegen

# Versions only, for dependencies which actual artifacts differ between Bazel and Gradle
version.com_google_protobuf=3.13.0
version.com_google_protobuf=3.15.2
# Version of google-java-format is downgraded from 1.8 to 1.7, because 1.8 supports java 11 minimum, while our JRE is java 8.
version.google_java_format=1.7
version.com_google_api_common_java=1.9.3
version.com_google_gax_java=1.62.0
version.io_grpc_java=1.30.2

# Common deps.
Expand All @@ -20,7 +19,7 @@ maven.com_google_code_findbugs_jsr305=com.google.code.findbugs:jsr305:3.0.0
maven.com_google_auto_value_auto_value=com.google.auto.value:auto-value:1.7.2
maven.com_google_auto_value_auto_value_annotations=com.google.auto.value:auto-value-annotations:1.7.2
maven.com_google_code_gson=com.google.code.gson:gson:2.8.6
maven.com_google_protobuf_protobuf_java=com.google.protobuf:protobuf-java:3.12.2
maven.com_google_protobuf_protobuf_java=com.google.protobuf:protobuf-java:3.15.8
maven.io_github_java_diff_utils=io.github.java-diff-utils:java-diff-utils:4.0
maven.javax_annotation_javax_annotation_api=javax.annotation:javax.annotation-api:1.3.2
maven.javax_validation_javax_validation_api=javax.validation:validation-api:2.0.1.Final
Expand Down
46 changes: 36 additions & 10 deletions rules_java_gapic/java_gapic.bzl
Expand Up @@ -127,12 +127,17 @@ def java_gapic_library(
service_yaml = None,
deps = [],
test_deps = [],
# possible values are: "grpc", "rest", "grpc+rest"
transport = None,
# Can be used to provide a java_library with a customized generator,
# like the one which dumps descriptor to a file for future debugging.
_java_generator_name = "java_gapic",
**kwargs):
file_args_dict = {}

if grpc_service_config:
file_args_dict[grpc_service_config] = "grpc-service-config"
else:
elif transport != "rest":
for keyword in NO_GRPC_CONFIG_ALLOWLIST:
if keyword not in name:
fail("Missing a gRPC service config file")
Expand All @@ -157,12 +162,15 @@ def java_gapic_library(
srcjar_name = name + "_srcjar"
raw_srcjar_name = srcjar_name + "_raw"
output_suffix = ".srcjar"
opt_args = []

if transport:
opt_args.append("transport=%s" % transport)

# Produces the GAPIC metadata file if this flag is set. to any value.
# Protoc invocation: --java_gapic_opt=metadata
plugin_args = ["metadata"]

_java_generator_name = "java_gapic"
proto_custom_library(
name = raw_srcjar_name,
deps = srcs,
Expand All @@ -172,6 +180,7 @@ def java_gapic_library(
opt_file_args = file_args_dict,
output_type = _java_generator_name,
output_suffix = output_suffix,
opt_args = opt_args,
**kwargs
)

Expand Down Expand Up @@ -201,10 +210,7 @@ def java_gapic_library(
"@com_google_protobuf//:protobuf_java",
"@com_google_api_api_common//jar",
"@com_google_api_gax_java//gax:gax",
"@com_google_api_gax_java//gax-grpc:gax_grpc",
"@com_google_guava_guava//jar",
"@io_grpc_grpc_java//core:core",
"@io_grpc_grpc_java//protobuf:protobuf",
"@com_google_code_findbugs_jsr305//jar",
"@org_threeten_threetenbp//jar",
"@io_opencensus_opencensus_api//jar",
Expand All @@ -214,6 +220,17 @@ def java_gapic_library(
"@javax_annotation_javax_annotation_api//jar",
]

if transport == "rest":
actual_deps += [
"@com_google_api_gax_java//gax-httpjson:gax_httpjson",
]
else:
actual_deps += [
"@com_google_api_gax_java//gax-grpc:gax_grpc",
"@io_grpc_grpc_java//core:core",
"@io_grpc_grpc_java//protobuf:protobuf",
]

native.java_library(
name = name,
srcs = ["%s.srcjar" % srcjar_name],
Expand All @@ -224,15 +241,24 @@ def java_gapic_library(
# Test deps.
actual_test_deps = [
"@com_google_googleapis//google/type:type_java_proto", # Commonly used.
"@com_google_api_gax_java//gax-grpc:gax_grpc_testlib",
"@com_google_api_gax_java//gax:gax_testlib",
"@com_google_code_gson_gson//jar",
"@io_grpc_grpc_java//auth:auth",
"@io_grpc_grpc_netty_shaded//jar",
"@io_grpc_grpc_java//stub:stub",
"@io_opencensus_opencensus_contrib_grpc_metrics//jar",
"@junit_junit//jar",
]

if transport == "rest":
actual_test_deps += [
"@com_google_api_gax_java//gax-httpjson:gax_httpjson_testlib",
]
else:
actual_test_deps += [
"@com_google_api_gax_java//gax-grpc:gax_grpc_testlib",
"@io_grpc_grpc_java//auth:auth",
"@io_grpc_grpc_netty_shaded//jar",
"@io_grpc_grpc_java//stub:stub",
"@io_opencensus_opencensus_contrib_grpc_metrics//jar",
]

_append_dep_without_duplicates(actual_test_deps, test_deps)
_append_dep_without_duplicates(actual_test_deps, actual_deps)

Expand Down
8 changes: 7 additions & 1 deletion rules_java_gapic/java_gapic_pkg.bzl
Expand Up @@ -301,6 +301,7 @@ def java_gapic_assembly_gradle_pkg(
name,
deps,
assembly_name = None,
transport = None,
**kwargs):
package_dir = name
if assembly_name:
Expand Down Expand Up @@ -350,9 +351,14 @@ def java_gapic_assembly_gradle_pkg(
grpc_target_dep = ["%s" % grpc_target]

if client_deps:
if transport == "rest":
template_label = Label("//rules_java_gapic:resources/gradle/client_rest.gradle.tmpl")
else:
template_label = Label("//rules_java_gapic:resources/gradle/client_grpc.gradle.tmpl")

_java_gapic_gradle_pkg(
name = client_target,
template_label = Label("//rules_java_gapic:resources/gradle/client.gradle.tmpl"),
template_label = template_label,
deps = proto_target_dep + client_deps,
test_deps = grpc_target_dep + client_test_deps,
**kwargs
Expand Down
60 changes: 60 additions & 0 deletions rules_java_gapic/resources/gradle/client_rest.gradle.tmpl
@@ -0,0 +1,60 @@
buildscript {
repositories {
mavenCentral()
}
}

apply plugin: 'java'

description = 'GAPIC library for {{name}}'
group = 'com.google.cloud'
version = (findProperty('version') == 'unspecified') ? '0.0.0-SNAPSHOT' : version
sourceCompatibility = 1.7
targetCompatibility = 1.7

repositories {
mavenCentral()
mavenLocal()
}

compileJava.options.encoding = 'UTF-8'
javadoc.options.encoding = 'UTF-8'

dependencies {
compile 'com.google.api:gax:{{version.gax}}'
testCompile 'com.google.api:gax:{{version.gax}}:testlib'
compile 'com.google.api:gax-httpjson:{{version.gax_httpjson}}'
testCompile 'com.google.api:gax-httpjson:{{version.gax_httpjson}}:testlib'
testCompile '{{maven.junit_junit}}'
{{extra_deps}}
}

task smokeTest(type: Test) {
filter {
includeTestsMatching "*SmokeTest"
setFailOnNoMatchingTests false
}
}

test {
exclude "**/*SmokeTest*"
}

sourceSets {
main {
java {
srcDir 'src/main/java'
}
}
}

clean {
delete 'all-jars'
}

task allJars(type: Copy) {
dependsOn test, jar
into 'all-jars'
// Replace with `from configurations.testRuntime, jar` to include test dependencies
from configurations.runtime, jar
}
Expand Up @@ -21,6 +21,7 @@ java_library(
"//src/main/java/com/google/api/generator/gapic/composer/common",
"//src/main/java/com/google/api/generator/gapic/composer/defaultvalue",
"//src/main/java/com/google/api/generator/gapic/composer/grpc",
"//src/main/java/com/google/api/generator/gapic/composer/rest",
"//src/main/java/com/google/api/generator/gapic/composer/resourcename",
"//src/main/java/com/google/api/generator/gapic/composer/samplecode",
"//src/main/java/com/google/api/generator/gapic/composer/store",
Expand Down
Expand Up @@ -27,12 +27,15 @@
import com.google.api.generator.gapic.composer.grpc.ServiceSettingsClassComposer;
import com.google.api.generator.gapic.composer.grpc.ServiceStubSettingsClassComposer;
import com.google.api.generator.gapic.composer.resourcename.ResourceNameHelperClassComposer;
import com.google.api.generator.gapic.composer.rest.HttpJsonServiceCallableFactoryClassComposer;
import com.google.api.generator.gapic.composer.rest.HttpJsonServiceStubClassComposer;
import com.google.api.generator.gapic.model.GapicClass;
import com.google.api.generator.gapic.model.GapicClass.Kind;
import com.google.api.generator.gapic.model.GapicContext;
import com.google.api.generator.gapic.model.GapicPackageInfo;
import com.google.api.generator.gapic.model.ResourceName;
import com.google.api.generator.gapic.model.Service;
import com.google.api.generator.gapic.model.Transport;
import com.google.common.annotations.VisibleForTesting;
import java.util.ArrayList;
import java.util.List;
Expand Down Expand Up @@ -80,9 +83,20 @@ public static List<GapicClass> generateStubClasses(GapicContext context) {
.forEach(
s -> {
clazzes.add(ServiceStubClassComposer.instance().generate(context, s));
clazzes.add(ServiceStubSettingsClassComposer.instance().generate(context, s));
clazzes.add(GrpcServiceCallableFactoryClassComposer.instance().generate(context, s));
clazzes.add(GrpcServiceStubClassComposer.instance().generate(context, s));
if (context.transport() == Transport.REST) {
clazzes.add(
com.google.api.generator.gapic.composer.rest.ServiceStubSettingsClassComposer
.instance()
.generate(context, s));
clazzes.add(
HttpJsonServiceCallableFactoryClassComposer.instance().generate(context, s));
clazzes.add(HttpJsonServiceStubClassComposer.instance().generate(context, s));
} else {
clazzes.add(ServiceStubSettingsClassComposer.instance().generate(context, s));
clazzes.add(
GrpcServiceCallableFactoryClassComposer.instance().generate(context, s));
clazzes.add(GrpcServiceStubClassComposer.instance().generate(context, s));
}
});
return clazzes;
}
Expand All @@ -94,7 +108,14 @@ public static List<GapicClass> generateClientSettingsClasses(GapicContext contex
.forEach(
s -> {
clazzes.add(ServiceClientClassComposer.instance().generate(context, s));
clazzes.add(ServiceSettingsClassComposer.instance().generate(context, s));
if (context.transport() == Transport.REST) {
clazzes.add(
com.google.api.generator.gapic.composer.rest.ServiceSettingsClassComposer
.instance()
.generate(context, s));
} else {
clazzes.add(ServiceSettingsClassComposer.instance().generate(context, s));
}
});
return clazzes;
}
Expand All @@ -103,15 +124,28 @@ public static List<GapicClass> generateMockClasses(GapicContext context, List<Se
List<GapicClass> clazzes = new ArrayList<>();
services.forEach(
s -> {
clazzes.add(MockServiceClassComposer.instance().generate(context, s));
clazzes.add(MockServiceImplClassComposer.instance().generate(context, s));
if (context.transport() == Transport.REST) {
// REST transport tests donot not use mock services.
} else {
clazzes.add(MockServiceClassComposer.instance().generate(context, s));
clazzes.add(MockServiceImplClassComposer.instance().generate(context, s));
}
});
return clazzes;
}

public static List<GapicClass> generateTestClasses(GapicContext context) {
return context.services().stream()
.map(s -> ServiceClientTestClassComposer.instance().generate(context, s))
.map(
s -> {
if (context.transport() == Transport.REST) {
return com.google.api.generator.gapic.composer.rest.ServiceClientTestClassComposer
.instance()
.generate(context, s);
} else {
return ServiceClientTestClassComposer.instance().generate(context, s);
}
})
.collect(Collectors.toList());
}

Expand Down

0 comments on commit 81f6737

Please sign in to comment.