diff --git a/rules_bazel/java/integration_test.bzl b/rules_bazel/java/integration_test.bzl index 16c267cb59..6dff72b9ca 100644 --- a/rules_bazel/java/integration_test.bzl +++ b/rules_bazel/java/integration_test.bzl @@ -19,7 +19,7 @@ def _diff_integration_goldens_impl(ctx): unzip -j {input_test} -d codegen_tmp cd codegen_tmp # Remove unneeded non-Java files, like MANIFEST - rm -rf $(find . -type f ! -name "*.java") + rm -rf $(find ./ -type f ! -name '*.java' -a ! -name '*gapic_metadata.json') cd .. diff codegen_tmp test/integration/goldens/{api_name}/ > {diff_output} # Bash `diff` command will return exit code 1 when there are differences between the two @@ -119,7 +119,7 @@ def _overwrite_golden_impl(ctx): unzip -j {input_test} -d codegen_tmp cd codegen_tmp # Remove unneeded non-Java files, like MANIFEST - rm -rf $(find . -type f ! -name "*.java") + rm -rf $(find ./ -type f ! -name '*.java' -a ! -name '*gapic_metadata.json') zip -r ../{goldens_output_zip} . """.format( goldens_output_zip = goldens_output_zip.path, @@ -142,6 +142,7 @@ def _overwrite_golden_impl(ctx): golden_update_script_content = """ cd ${{BUILD_WORKSPACE_DIRECTORY}} rm -r test/integration/goldens/{api_name}/*.java + rm -r test/integration/goldens/{api_name}/gapic_metadata.json unzip -ao {goldens_output_zip} -d test/integration/goldens/{api_name} """.format( goldens_output_zip = goldens_output_zip.path, diff --git a/src/main/java/com/google/api/generator/gapic/Generator.java b/src/main/java/com/google/api/generator/gapic/Generator.java index 0b7268010f..d8ac662cc9 100644 --- a/src/main/java/com/google/api/generator/gapic/Generator.java +++ b/src/main/java/com/google/api/generator/gapic/Generator.java @@ -30,7 +30,8 @@ public static CodeGeneratorResponse generateGapic(CodeGeneratorRequest request) List clazzes = Composer.composeServiceClasses(context); GapicPackageInfo packageInfo = Composer.composePackageInfo(context); String outputFilename = "temp-codegen.srcjar"; - CodeGeneratorResponse response = Writer.writeCode(clazzes, packageInfo, outputFilename); + CodeGeneratorResponse response = + Writer.write(clazzes, packageInfo, context.gapicMetadata(), outputFilename); return response; } } diff --git a/src/main/java/com/google/api/generator/gapic/composer/BUILD.bazel b/src/main/java/com/google/api/generator/gapic/composer/BUILD.bazel index c36330db97..58993a3eae 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/BUILD.bazel +++ b/src/main/java/com/google/api/generator/gapic/composer/BUILD.bazel @@ -30,6 +30,7 @@ java_library( "@com_google_api_gax_java//gax", "@com_google_api_gax_java//gax-grpc:gax_grpc", "@com_google_code_findbugs_jsr305//jar", + "@com_google_googleapis//gapic/metadata:metadata_java_proto", "@com_google_googleapis//google/api:api_java_proto", "@com_google_googleapis//google/longrunning:longrunning_java_proto", "@com_google_googleapis//google/rpc:rpc_java_proto", diff --git a/src/main/java/com/google/api/generator/gapic/composer/Composer.java b/src/main/java/com/google/api/generator/gapic/composer/Composer.java index 4220e94e7e..6126859a25 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/Composer.java +++ b/src/main/java/com/google/api/generator/gapic/composer/Composer.java @@ -63,7 +63,7 @@ public static List generateServiceClasses( List clazzes = new ArrayList<>(); clazzes.addAll( generateStubClasses(service, context.serviceConfig(), context.messages(), resourceNames)); - clazzes.addAll(generateClientSettingsClasses(service, context.messages(), resourceNames)); + clazzes.addAll(generateClientSettingsClasses(service, context, resourceNames)); clazzes.addAll(generateMockClasses(service, resourceNames, context.messages())); clazzes.addAll(generateTestClasses(service, context, resourceNames)); // TODO(miraleung): Generate test classes. @@ -93,11 +93,10 @@ public static List generateStubClasses( } public static List generateClientSettingsClasses( - Service service, Map messageTypes, Map resourceNames) { + Service service, GapicContext context, Map resourceNames) { List clazzes = new ArrayList<>(); - clazzes.add( - ServiceClientClassComposer.instance().generate(service, messageTypes, resourceNames)); - clazzes.add(ServiceSettingsClassComposer.instance().generate(service, messageTypes)); + clazzes.add(ServiceClientClassComposer.instance().generate(service, context, resourceNames)); + clazzes.add(ServiceSettingsClassComposer.instance().generate(service, context.messages())); return clazzes; } diff --git a/src/main/java/com/google/api/generator/gapic/composer/ServiceClientClassComposer.java b/src/main/java/com/google/api/generator/gapic/composer/ServiceClientClassComposer.java index 6c658a0a2e..12e1d3b799 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/ServiceClientClassComposer.java +++ b/src/main/java/com/google/api/generator/gapic/composer/ServiceClientClassComposer.java @@ -62,6 +62,7 @@ import com.google.api.generator.gapic.model.Field; 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.LongrunningOperation; import com.google.api.generator.gapic.model.Message; import com.google.api.generator.gapic.model.Method; @@ -76,6 +77,7 @@ import com.google.common.base.Preconditions; import com.google.common.base.Strings; import com.google.common.util.concurrent.MoreExecutors; +import com.google.gapic.metadata.GapicMetadata; import com.google.longrunning.Operation; import com.google.rpc.Status; import java.io.IOException; @@ -120,13 +122,16 @@ public static ServiceClientClassComposer instance() { } public GapicClass generate( - Service service, Map messageTypes, Map resourceNames) { + Service service, GapicContext context, Map resourceNames) { + Map messageTypes = context.messages(); TypeStore typeStore = createTypes(service, messageTypes); String className = ClassNames.getServiceClientClassName(service); GapicClass.Kind kind = Kind.MAIN; String pakkage = service.pakkage(); boolean hasLroClient = hasLroMethods(service); + Map> grpcRpcsToJavaMethodNames = new HashMap<>(); + ClassDefinition classDef = ClassDefinition.builder() .setHeaderCommentStatements( @@ -138,9 +143,17 @@ public GapicClass generate( .setImplementsTypes(createClassImplements(typeStore)) .setStatements(createFieldDeclarations(service, typeStore, hasLroClient)) .setMethods( - createClassMethods(service, messageTypes, typeStore, resourceNames, hasLroClient)) + createClassMethods( + service, + messageTypes, + typeStore, + resourceNames, + hasLroClient, + grpcRpcsToJavaMethodNames)) .setNestedClasses(createNestedPagingClasses(service, messageTypes, typeStore)) .build(); + + updateGapicMetadata(context, service, className, grpcRpcsToJavaMethodNames); return GapicClass.create(kind, classDef); } @@ -186,12 +199,15 @@ private static List createClassMethods( Map messageTypes, TypeStore typeStore, Map resourceNames, - boolean hasLroClient) { + boolean hasLroClient, + Map> grpcRpcToJavaMethodMetadata) { List methods = new ArrayList<>(); methods.addAll(createStaticCreatorMethods(service, typeStore)); methods.addAll(createConstructorMethods(service, typeStore, hasLroClient)); methods.addAll(createGetterMethods(service, typeStore, hasLroClient)); - methods.addAll(createServiceMethods(service, messageTypes, typeStore, resourceNames)); + methods.addAll( + createServiceMethods( + service, messageTypes, typeStore, resourceNames, grpcRpcToJavaMethodMetadata)); methods.addAll(createBackgroundResourceMethods(service, typeStore)); return methods; } @@ -511,35 +527,56 @@ private static List createServiceMethods( Service service, Map messageTypes, TypeStore typeStore, - Map resourceNames) { + Map resourceNames, + Map> grpcRpcToJavaMethodMetadata) { List javaMethods = new ArrayList<>(); + Function javaMethodNameFn = m -> m.methodIdentifier().name(); for (Method method : service.methods()) { + if (!grpcRpcToJavaMethodMetadata.containsKey(method.name())) { + grpcRpcToJavaMethodMetadata.put(method.name(), new ArrayList<>()); + } if (method.stream().equals(Stream.NONE)) { - javaMethods.addAll( + List generatedMethods = createMethodVariants( method, ClassNames.getServiceClientClassName(service), messageTypes, typeStore, - resourceNames)); - javaMethods.add( + resourceNames); + grpcRpcToJavaMethodMetadata + .get(method.name()) + .addAll( + generatedMethods.stream() + .map(m -> javaMethodNameFn.apply(m)) + .collect(Collectors.toList())); + javaMethods.addAll(generatedMethods); + + MethodDefinition generatedMethod = createMethodDefaultMethod( method, ClassNames.getServiceClientClassName(service), messageTypes, typeStore, - resourceNames)); + resourceNames); + grpcRpcToJavaMethodMetadata.get(method.name()).add(javaMethodNameFn.apply(generatedMethod)); + javaMethods.add(generatedMethod); } if (method.hasLro()) { - javaMethods.add( - createLroCallableMethod(service, method, typeStore, messageTypes, resourceNames)); + MethodDefinition generatedMethod = + createLroCallableMethod(service, method, typeStore, messageTypes, resourceNames); + grpcRpcToJavaMethodMetadata.get(method.name()).add(javaMethodNameFn.apply(generatedMethod)); + javaMethods.add(generatedMethod); } if (method.isPaged()) { - javaMethods.add( - createPagedCallableMethod(service, method, typeStore, messageTypes, resourceNames)); + MethodDefinition generatedMethod = + createPagedCallableMethod(service, method, typeStore, messageTypes, resourceNames); + grpcRpcToJavaMethodMetadata.get(method.name()).add(javaMethodNameFn.apply(generatedMethod)); + javaMethods.add(generatedMethod); } - javaMethods.add( - createCallableMethod(service, method, typeStore, messageTypes, resourceNames)); + MethodDefinition generatedMethod = + createCallableMethod(service, method, typeStore, messageTypes, resourceNames); + grpcRpcToJavaMethodMetadata.get(method.name()).add(javaMethodNameFn.apply(generatedMethod)); + javaMethods.add(generatedMethod); } return javaMethods; } @@ -1667,4 +1704,49 @@ private static boolean isProtoEmptyType(TypeNode type) { return type.reference().pakkage().equals("com.google.protobuf") && type.reference().name().equals("Empty"); } + + private static void updateGapicMetadata( + GapicContext context, String protoPackage, String javaPackage) { + context.updateGapicMetadata( + context + .gapicMetadata() + .toBuilder() + .setProtoPackage(protoPackage) + .setLibraryPackage(javaPackage) + .build()); + } + + private static void updateGapicMetadata( + GapicContext context, + Service service, + String clientClassName, + Map> grpcRpcToJavaMethodNames) { + GapicMetadata.Builder metadataBuilder = context.gapicMetadata().toBuilder(); + metadataBuilder = + metadataBuilder + .setProtoPackage(service.protoPakkage()) + .setLibraryPackage(service.pakkage()); + + GapicMetadata.ServiceAsClient.Builder serviceClientProtoBuilder = + GapicMetadata.ServiceAsClient.newBuilder().setLibraryClient(clientClassName); + + // Sort for deterministic tests. + List sortedRpcNames = new ArrayList<>(grpcRpcToJavaMethodNames.keySet()); + Collections.sort(sortedRpcNames); + for (String rpcName : sortedRpcNames) { + GapicMetadata.MethodList methodList = + GapicMetadata.MethodList.newBuilder() + .addAllMethods(grpcRpcToJavaMethodNames.get(rpcName)) + .build(); + serviceClientProtoBuilder.putRpcs(rpcName, methodList); + } + + metadataBuilder = + metadataBuilder.putServices( + service.name(), + GapicMetadata.ServiceForTransport.newBuilder() + .putClients("grpc", serviceClientProtoBuilder.build()) + .build()); + context.updateGapicMetadata(metadataBuilder.build()); + } } diff --git a/src/main/java/com/google/api/generator/gapic/model/BUILD.bazel b/src/main/java/com/google/api/generator/gapic/model/BUILD.bazel index 63684561aa..20e53981ca 100644 --- a/src/main/java/com/google/api/generator/gapic/model/BUILD.bazel +++ b/src/main/java/com/google/api/generator/gapic/model/BUILD.bazel @@ -21,6 +21,7 @@ java_library( "@com_google_auto_value_auto_value//jar", "@com_google_auto_value_auto_value_annotations//jar", "@com_google_code_findbugs_jsr305//jar", + "@com_google_googleapis//gapic/metadata:metadata_java_proto", "@com_google_googleapis//google/api:api_java_proto", "@com_google_googleapis//google/rpc:rpc_java_proto", "@com_google_guava_guava//jar", diff --git a/src/main/java/com/google/api/generator/gapic/model/GapicContext.java b/src/main/java/com/google/api/generator/gapic/model/GapicContext.java index 1ae68af314..c9d7729757 100644 --- a/src/main/java/com/google/api/generator/gapic/model/GapicContext.java +++ b/src/main/java/com/google/api/generator/gapic/model/GapicContext.java @@ -18,6 +18,7 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; +import com.google.gapic.metadata.GapicMetadata; import java.util.Collections; import java.util.List; import java.util.Map; @@ -26,6 +27,10 @@ @AutoValue public abstract class GapicContext { + // Keep a non-AutoValue reference to GapicMetadata, since we need to update + // it iteratively as we generate client methods. + private GapicMetadata gapicMetadata = defaultGapicMetadata(); + // Maps the message name (as it appears in the protobuf) to Messages. public abstract ImmutableMap messages(); @@ -39,6 +44,10 @@ public abstract class GapicContext { public abstract ImmutableSet helperResourceNames(); + public GapicMetadata gapicMetadata() { + return gapicMetadata; + } + @Nullable public abstract GapicServiceConfig serviceConfig(); @@ -49,6 +58,21 @@ public boolean hasServiceYamlProto() { return serviceYamlProto() != null; } + public void updateGapicMetadata(GapicMetadata newMetadata) { + gapicMetadata = newMetadata; + } + + static GapicMetadata defaultGapicMetadata() { + return GapicMetadata.newBuilder() + .setSchema("1.0") + .setComment( + "This file maps proto services/RPCs to the corresponding library clients/methods") + .setLanguage("java") + .build(); + } + + public abstract Builder toBuilder(); + public static Builder builder() { return new AutoValue_GapicContext.Builder().setMixinServices(Collections.emptyList()); } diff --git a/src/main/java/com/google/api/generator/gapic/protowriter/BUILD.bazel b/src/main/java/com/google/api/generator/gapic/protowriter/BUILD.bazel index 3094cc5fa3..7eac16a597 100644 --- a/src/main/java/com/google/api/generator/gapic/protowriter/BUILD.bazel +++ b/src/main/java/com/google/api/generator/gapic/protowriter/BUILD.bazel @@ -16,6 +16,8 @@ java_library( "//src/main/java/com/google/api/generator/engine/ast", "//src/main/java/com/google/api/generator/engine/writer", "//src/main/java/com/google/api/generator/gapic/model", + "@com_google_googleapis//gapic/metadata:metadata_java_proto", "@com_google_protobuf//:protobuf_java", + "@com_google_protobuf//:protobuf_java_util", ], ) diff --git a/src/main/java/com/google/api/generator/gapic/protowriter/Writer.java b/src/main/java/com/google/api/generator/gapic/protowriter/Writer.java index fdbcbe2ba7..ba7e7ee471 100644 --- a/src/main/java/com/google/api/generator/gapic/protowriter/Writer.java +++ b/src/main/java/com/google/api/generator/gapic/protowriter/Writer.java @@ -19,8 +19,10 @@ import com.google.api.generator.engine.writer.JavaWriterVisitor; import com.google.api.generator.gapic.model.GapicClass; import com.google.api.generator.gapic.model.GapicPackageInfo; +import com.google.gapic.metadata.GapicMetadata; import com.google.protobuf.ByteString; import com.google.protobuf.compiler.PluginProtos.CodeGeneratorResponse; +import com.google.protobuf.util.JsonFormat; import java.io.IOException; import java.util.List; import java.util.jar.JarEntry; @@ -33,8 +35,11 @@ public GapicWriterException(String errorMessage) { } } - public static CodeGeneratorResponse writeCode( - List clazzes, GapicPackageInfo gapicPackageInfo, String outputFilePath) { + public static CodeGeneratorResponse write( + List clazzes, + GapicPackageInfo gapicPackageInfo, + GapicMetadata gapicMetadata, + String outputFilePath) { ByteString.Output output = ByteString.newOutput(); JavaWriterVisitor codeWriter = new JavaWriterVisitor(); JarOutputStream jos = null; @@ -80,6 +85,15 @@ public static CodeGeneratorResponse writeCode( throw new GapicWriterException("Could not write code for package-info.java"); } + // Write the mdatadata file. + jarEntry = new JarEntry(String.format("%s/gapic_metadata.json", path)); + try { + jos.putNextEntry(jarEntry); + jos.write(JsonFormat.printer().print(gapicMetadata).getBytes()); + } catch (IOException e) { + throw new GapicWriterException("Could not write gapic_metadata.json"); + } + try { jos.finish(); jos.flush(); diff --git a/src/test/java/com/google/api/generator/gapic/composer/ServiceClientClassComposerTest.java b/src/test/java/com/google/api/generator/gapic/composer/ServiceClientClassComposerTest.java index 6b43bb3204..3b4bbfa436 100644 --- a/src/test/java/com/google/api/generator/gapic/composer/ServiceClientClassComposerTest.java +++ b/src/test/java/com/google/api/generator/gapic/composer/ServiceClientClassComposerTest.java @@ -20,6 +20,7 @@ import com.google.api.generator.engine.writer.JavaWriterVisitor; import com.google.api.generator.gapic.composer.constants.ComposerConstants; import com.google.api.generator.gapic.model.GapicClass; +import com.google.api.generator.gapic.model.GapicContext; import com.google.api.generator.gapic.model.Message; import com.google.api.generator.gapic.model.ResourceName; import com.google.api.generator.gapic.model.Service; @@ -52,10 +53,18 @@ public void generateServiceClasses() { Parser.parseService( echoFileDescriptor, messageTypes, resourceNames, Optional.empty(), outputResourceNames); + GapicContext gapicContext = + GapicContext.builder() + .setMessages(messageTypes) + .setResourceNames(resourceNames) + .setServices(services) + .setHelperResourceNames(outputResourceNames) + .build(); + Service echoProtoService = services.get(0); GapicClass clazz = ServiceClientClassComposer.instance() - .generate(echoProtoService, messageTypes, resourceNames); + .generate(echoProtoService, gapicContext, resourceNames); JavaWriterVisitor visitor = new JavaWriterVisitor(); clazz.classDefinition().accept(visitor); @@ -77,9 +86,16 @@ public void generateServiceClasses_methodSignatureHasNestedFields() { Parser.parseService( fileDescriptor, messageTypes, resourceNames, Optional.empty(), outputResourceNames); + GapicContext gapicContext = + GapicContext.builder() + .setMessages(messageTypes) + .setResourceNames(resourceNames) + .setServices(services) + .setHelperResourceNames(outputResourceNames) + .build(); Service protoService = services.get(0); GapicClass clazz = - ServiceClientClassComposer.instance().generate(protoService, messageTypes, resourceNames); + ServiceClientClassComposer.instance().generate(protoService, gapicContext, resourceNames); JavaWriterVisitor visitor = new JavaWriterVisitor(); clazz.classDefinition().accept(visitor); diff --git a/test/integration/goldens/asset/BUILD.bazel b/test/integration/goldens/asset/BUILD.bazel index 0b74aed56b..667772f01b 100644 --- a/test/integration/goldens/asset/BUILD.bazel +++ b/test/integration/goldens/asset/BUILD.bazel @@ -2,5 +2,8 @@ package(default_visibility = ["//visibility:public"]) filegroup( name = "goldens_files", - srcs = glob(["*.java"]), + srcs = glob([ + "*.java", + "gapic_metadata.json", + ]), ) diff --git a/test/integration/goldens/asset/gapic_metadata.json b/test/integration/goldens/asset/gapic_metadata.json new file mode 100644 index 0000000000..d2c1608bb4 --- /dev/null +++ b/test/integration/goldens/asset/gapic_metadata.json @@ -0,0 +1,51 @@ +{ + "schema": "1.0", + "comment": "This file maps proto services/RPCs to the corresponding library clients/methods", + "language": "java", + "protoPackage": "google.cloud.asset.v1", + "libraryPackage": "com.google.cloud.asset.v1", + "services": { + "AssetService": { + "clients": { + "grpc": { + "libraryClient": "AssetServiceClient", + "rpcs": { + "AnalyzeIamPolicy": { + "methods": ["analyzeIamPolicy", "analyzeIamPolicyCallable"] + }, + "AnalyzeIamPolicyLongrunning": { + "methods": ["analyzeIamPolicyLongrunningAsync", "analyzeIamPolicyLongrunningOperationCallable", "analyzeIamPolicyLongrunningCallable"] + }, + "BatchGetAssetsHistory": { + "methods": ["batchGetAssetsHistory", "batchGetAssetsHistoryCallable"] + }, + "CreateFeed": { + "methods": ["createFeed", "createFeed", "createFeedCallable"] + }, + "DeleteFeed": { + "methods": ["deleteFeed", "deleteFeed", "deleteFeed", "deleteFeedCallable"] + }, + "ExportAssets": { + "methods": ["exportAssetsAsync", "exportAssetsOperationCallable", "exportAssetsCallable"] + }, + "GetFeed": { + "methods": ["getFeed", "getFeed", "getFeed", "getFeedCallable"] + }, + "ListFeeds": { + "methods": ["listFeeds", "listFeeds", "listFeedsCallable"] + }, + "SearchAllIamPolicies": { + "methods": ["searchAllIamPolicies", "searchAllIamPolicies", "searchAllIamPoliciesPagedCallable", "searchAllIamPoliciesCallable"] + }, + "SearchAllResources": { + "methods": ["searchAllResources", "searchAllResources", "searchAllResourcesPagedCallable", "searchAllResourcesCallable"] + }, + "UpdateFeed": { + "methods": ["updateFeed", "updateFeed", "updateFeedCallable"] + } + } + } + } + } + } +} \ No newline at end of file diff --git a/test/integration/goldens/credentials/BUILD.bazel b/test/integration/goldens/credentials/BUILD.bazel index 0b74aed56b..667772f01b 100644 --- a/test/integration/goldens/credentials/BUILD.bazel +++ b/test/integration/goldens/credentials/BUILD.bazel @@ -2,5 +2,8 @@ package(default_visibility = ["//visibility:public"]) filegroup( name = "goldens_files", - srcs = glob(["*.java"]), + srcs = glob([ + "*.java", + "gapic_metadata.json", + ]), ) diff --git a/test/integration/goldens/credentials/gapic_metadata.json b/test/integration/goldens/credentials/gapic_metadata.json new file mode 100644 index 0000000000..dbf8e3463f --- /dev/null +++ b/test/integration/goldens/credentials/gapic_metadata.json @@ -0,0 +1,30 @@ +{ + "schema": "1.0", + "comment": "This file maps proto services/RPCs to the corresponding library clients/methods", + "language": "java", + "protoPackage": "google.iam.credentials.v1", + "libraryPackage": "com.google.cloud.iam.credentials.v1", + "services": { + "IAMCredentials": { + "clients": { + "grpc": { + "libraryClient": "IamCredentialsClient", + "rpcs": { + "GenerateAccessToken": { + "methods": ["generateAccessToken", "generateAccessToken", "generateAccessToken", "generateAccessTokenCallable"] + }, + "GenerateIdToken": { + "methods": ["generateIdToken", "generateIdToken", "generateIdToken", "generateIdTokenCallable"] + }, + "SignBlob": { + "methods": ["signBlob", "signBlob", "signBlob", "signBlobCallable"] + }, + "SignJwt": { + "methods": ["signJwt", "signJwt", "signJwt", "signJwtCallable"] + } + } + } + } + } + } +} \ No newline at end of file diff --git a/test/integration/goldens/kms/BUILD.bazel b/test/integration/goldens/kms/BUILD.bazel index 0b74aed56b..667772f01b 100644 --- a/test/integration/goldens/kms/BUILD.bazel +++ b/test/integration/goldens/kms/BUILD.bazel @@ -2,5 +2,8 @@ package(default_visibility = ["//visibility:public"]) filegroup( name = "goldens_files", - srcs = glob(["*.java"]), + srcs = glob([ + "*.java", + "gapic_metadata.json", + ]), ) diff --git a/test/integration/goldens/kms/KeyManagementServiceStubSettings.java b/test/integration/goldens/kms/KeyManagementServiceStubSettings.java index d139077679..f36350a7ce 100644 --- a/test/integration/goldens/kms/KeyManagementServiceStubSettings.java +++ b/test/integration/goldens/kms/KeyManagementServiceStubSettings.java @@ -718,9 +718,7 @@ public static class Builder "retry_policy_1_codes", ImmutableSet.copyOf( Lists.newArrayList( - StatusCode.Code.INTERNAL, - StatusCode.Code.UNAVAILABLE, - StatusCode.Code.DEADLINE_EXCEEDED))); + StatusCode.Code.UNAVAILABLE, StatusCode.Code.DEADLINE_EXCEEDED))); definitions.put( "no_retry_0_codes", ImmutableSet.copyOf(Lists.newArrayList())); RETRYABLE_CODE_DEFINITIONS = definitions.build(); diff --git a/test/integration/goldens/kms/gapic_metadata.json b/test/integration/goldens/kms/gapic_metadata.json new file mode 100644 index 0000000000..e34e14ad07 --- /dev/null +++ b/test/integration/goldens/kms/gapic_metadata.json @@ -0,0 +1,96 @@ +{ + "schema": "1.0", + "comment": "This file maps proto services/RPCs to the corresponding library clients/methods", + "language": "java", + "protoPackage": "google.cloud.kms.v1", + "libraryPackage": "com.google.cloud.kms.v1", + "services": { + "KeyManagementService": { + "clients": { + "grpc": { + "libraryClient": "KeyManagementServiceClient", + "rpcs": { + "AsymmetricDecrypt": { + "methods": ["asymmetricDecrypt", "asymmetricDecrypt", "asymmetricDecrypt", "asymmetricDecryptCallable"] + }, + "AsymmetricSign": { + "methods": ["asymmetricSign", "asymmetricSign", "asymmetricSign", "asymmetricSignCallable"] + }, + "CreateCryptoKey": { + "methods": ["createCryptoKey", "createCryptoKey", "createCryptoKey", "createCryptoKeyCallable"] + }, + "CreateCryptoKeyVersion": { + "methods": ["createCryptoKeyVersion", "createCryptoKeyVersion", "createCryptoKeyVersion", "createCryptoKeyVersionCallable"] + }, + "CreateImportJob": { + "methods": ["createImportJob", "createImportJob", "createImportJob", "createImportJobCallable"] + }, + "CreateKeyRing": { + "methods": ["createKeyRing", "createKeyRing", "createKeyRing", "createKeyRingCallable"] + }, + "Decrypt": { + "methods": ["decrypt", "decrypt", "decrypt", "decryptCallable"] + }, + "DestroyCryptoKeyVersion": { + "methods": ["destroyCryptoKeyVersion", "destroyCryptoKeyVersion", "destroyCryptoKeyVersion", "destroyCryptoKeyVersionCallable"] + }, + "Encrypt": { + "methods": ["encrypt", "encrypt", "encrypt", "encryptCallable"] + }, + "GetCryptoKey": { + "methods": ["getCryptoKey", "getCryptoKey", "getCryptoKey", "getCryptoKeyCallable"] + }, + "GetCryptoKeyVersion": { + "methods": ["getCryptoKeyVersion", "getCryptoKeyVersion", "getCryptoKeyVersion", "getCryptoKeyVersionCallable"] + }, + "GetIamPolicy": { + "methods": ["getIamPolicy", "getIamPolicyCallable"] + }, + "GetImportJob": { + "methods": ["getImportJob", "getImportJob", "getImportJob", "getImportJobCallable"] + }, + "GetKeyRing": { + "methods": ["getKeyRing", "getKeyRing", "getKeyRing", "getKeyRingCallable"] + }, + "GetPublicKey": { + "methods": ["getPublicKey", "getPublicKey", "getPublicKey", "getPublicKeyCallable"] + }, + "ImportCryptoKeyVersion": { + "methods": ["importCryptoKeyVersion", "importCryptoKeyVersionCallable"] + }, + "ListCryptoKeyVersions": { + "methods": ["listCryptoKeyVersions", "listCryptoKeyVersions", "listCryptoKeyVersions", "listCryptoKeyVersionsPagedCallable", "listCryptoKeyVersionsCallable"] + }, + "ListCryptoKeys": { + "methods": ["listCryptoKeys", "listCryptoKeys", "listCryptoKeys", "listCryptoKeysPagedCallable", "listCryptoKeysCallable"] + }, + "ListImportJobs": { + "methods": ["listImportJobs", "listImportJobs", "listImportJobs", "listImportJobsPagedCallable", "listImportJobsCallable"] + }, + "ListKeyRings": { + "methods": ["listKeyRings", "listKeyRings", "listKeyRings", "listKeyRingsPagedCallable", "listKeyRingsCallable"] + }, + "RestoreCryptoKeyVersion": { + "methods": ["restoreCryptoKeyVersion", "restoreCryptoKeyVersion", "restoreCryptoKeyVersion", "restoreCryptoKeyVersionCallable"] + }, + "SetIamPolicy": { + "methods": ["setIamPolicy", "setIamPolicyCallable"] + }, + "TestIamPermissions": { + "methods": ["testIamPermissions", "testIamPermissionsCallable"] + }, + "UpdateCryptoKey": { + "methods": ["updateCryptoKey", "updateCryptoKey", "updateCryptoKeyCallable"] + }, + "UpdateCryptoKeyPrimaryVersion": { + "methods": ["updateCryptoKeyPrimaryVersion", "updateCryptoKeyPrimaryVersion", "updateCryptoKeyPrimaryVersion", "updateCryptoKeyPrimaryVersionCallable"] + }, + "UpdateCryptoKeyVersion": { + "methods": ["updateCryptoKeyVersion", "updateCryptoKeyVersion", "updateCryptoKeyVersionCallable"] + } + } + } + } + } + } +} \ No newline at end of file diff --git a/test/integration/goldens/library/BUILD.bazel b/test/integration/goldens/library/BUILD.bazel index 0b74aed56b..667772f01b 100644 --- a/test/integration/goldens/library/BUILD.bazel +++ b/test/integration/goldens/library/BUILD.bazel @@ -2,5 +2,8 @@ package(default_visibility = ["//visibility:public"]) filegroup( name = "goldens_files", - srcs = glob(["*.java"]), + srcs = glob([ + "*.java", + "gapic_metadata.json", + ]), ) diff --git a/test/integration/goldens/library/gapic_metadata.json b/test/integration/goldens/library/gapic_metadata.json new file mode 100644 index 0000000000..412c5f19c7 --- /dev/null +++ b/test/integration/goldens/library/gapic_metadata.json @@ -0,0 +1,51 @@ +{ + "schema": "1.0", + "comment": "This file maps proto services/RPCs to the corresponding library clients/methods", + "language": "java", + "protoPackage": "google.example.library.v1", + "libraryPackage": "com.google.cloud.example.library.v1", + "services": { + "LibraryService": { + "clients": { + "grpc": { + "libraryClient": "LibraryServiceClient", + "rpcs": { + "CreateBook": { + "methods": ["createBook", "createBook", "createBook", "createBookCallable"] + }, + "CreateShelf": { + "methods": ["createShelf", "createShelf", "createShelfCallable"] + }, + "DeleteBook": { + "methods": ["deleteBook", "deleteBookCallable"] + }, + "DeleteShelf": { + "methods": ["deleteShelf", "deleteShelf", "deleteShelf", "deleteShelfCallable"] + }, + "GetBook": { + "methods": ["getBook", "getBook", "getBook", "getBookCallable"] + }, + "GetShelf": { + "methods": ["getShelf", "getShelf", "getShelf", "getShelfCallable"] + }, + "ListBooks": { + "methods": ["listBooks", "listBooks", "listBooks", "listBooksPagedCallable", "listBooksCallable"] + }, + "ListShelves": { + "methods": ["listShelves", "listShelvesPagedCallable", "listShelvesCallable"] + }, + "MergeShelves": { + "methods": ["mergeShelves", "mergeShelves", "mergeShelves", "mergeShelves", "mergeShelves", "mergeShelvesCallable"] + }, + "MoveBook": { + "methods": ["moveBook", "moveBook", "moveBook", "moveBook", "moveBook", "moveBookCallable"] + }, + "UpdateBook": { + "methods": ["updateBook", "updateBook", "updateBookCallable"] + } + } + } + } + } + } +} \ No newline at end of file diff --git a/test/integration/goldens/logging/BUILD.bazel b/test/integration/goldens/logging/BUILD.bazel index 0b74aed56b..667772f01b 100644 --- a/test/integration/goldens/logging/BUILD.bazel +++ b/test/integration/goldens/logging/BUILD.bazel @@ -2,5 +2,8 @@ package(default_visibility = ["//visibility:public"]) filegroup( name = "goldens_files", - srcs = glob(["*.java"]), + srcs = glob([ + "*.java", + "gapic_metadata.json", + ]), ) diff --git a/test/integration/goldens/logging/gapic_metadata.json b/test/integration/goldens/logging/gapic_metadata.json new file mode 100644 index 0000000000..19d23c6761 --- /dev/null +++ b/test/integration/goldens/logging/gapic_metadata.json @@ -0,0 +1,138 @@ +{ + "schema": "1.0", + "comment": "This file maps proto services/RPCs to the corresponding library clients/methods", + "language": "java", + "protoPackage": "google.logging.v2", + "libraryPackage": "com.google.cloud.logging.v2", + "services": { + "LoggingServiceV2": { + "clients": { + "grpc": { + "libraryClient": "LoggingClient", + "rpcs": { + "DeleteLog": { + "methods": ["deleteLog", "deleteLog", "deleteLog", "deleteLogCallable"] + }, + "ListLogEntries": { + "methods": ["listLogEntries", "listLogEntries", "listLogEntriesPagedCallable", "listLogEntriesCallable"] + }, + "ListLogs": { + "methods": ["listLogs", "listLogs", "listLogs", "listLogs", "listLogs", "listLogs", "listLogsPagedCallable", "listLogsCallable"] + }, + "ListMonitoredResourceDescriptors": { + "methods": ["listMonitoredResourceDescriptors", "listMonitoredResourceDescriptorsPagedCallable", "listMonitoredResourceDescriptorsCallable"] + }, + "TailLogEntries": { + "methods": ["tailLogEntriesCallable"] + }, + "WriteLogEntries": { + "methods": ["writeLogEntries", "writeLogEntries", "writeLogEntries", "writeLogEntriesCallable"] + } + } + } + } + }, + "ConfigServiceV2": { + "clients": { + "grpc": { + "libraryClient": "ConfigClient", + "rpcs": { + "CreateBucket": { + "methods": ["createBucket", "createBucketCallable"] + }, + "CreateExclusion": { + "methods": ["createExclusion", "createExclusion", "createExclusion", "createExclusion", "createExclusion", "createExclusion", "createExclusionCallable"] + }, + "CreateSink": { + "methods": ["createSink", "createSink", "createSink", "createSink", "createSink", "createSink", "createSinkCallable"] + }, + "CreateView": { + "methods": ["createView", "createViewCallable"] + }, + "DeleteBucket": { + "methods": ["deleteBucket", "deleteBucketCallable"] + }, + "DeleteExclusion": { + "methods": ["deleteExclusion", "deleteExclusion", "deleteExclusion", "deleteExclusionCallable"] + }, + "DeleteSink": { + "methods": ["deleteSink", "deleteSink", "deleteSink", "deleteSinkCallable"] + }, + "DeleteView": { + "methods": ["deleteView", "deleteViewCallable"] + }, + "GetBucket": { + "methods": ["getBucket", "getBucketCallable"] + }, + "GetCmekSettings": { + "methods": ["getCmekSettings", "getCmekSettingsCallable"] + }, + "GetExclusion": { + "methods": ["getExclusion", "getExclusion", "getExclusion", "getExclusionCallable"] + }, + "GetSink": { + "methods": ["getSink", "getSink", "getSink", "getSinkCallable"] + }, + "GetView": { + "methods": ["getView", "getViewCallable"] + }, + "ListBuckets": { + "methods": ["listBuckets", "listBuckets", "listBuckets", "listBuckets", "listBuckets", "listBuckets", "listBucketsPagedCallable", "listBucketsCallable"] + }, + "ListExclusions": { + "methods": ["listExclusions", "listExclusions", "listExclusions", "listExclusions", "listExclusions", "listExclusions", "listExclusionsPagedCallable", "listExclusionsCallable"] + }, + "ListSinks": { + "methods": ["listSinks", "listSinks", "listSinks", "listSinks", "listSinks", "listSinks", "listSinksPagedCallable", "listSinksCallable"] + }, + "ListViews": { + "methods": ["listViews", "listViews", "listViewsPagedCallable", "listViewsCallable"] + }, + "UndeleteBucket": { + "methods": ["undeleteBucket", "undeleteBucketCallable"] + }, + "UpdateBucket": { + "methods": ["updateBucket", "updateBucketCallable"] + }, + "UpdateCmekSettings": { + "methods": ["updateCmekSettings", "updateCmekSettingsCallable"] + }, + "UpdateExclusion": { + "methods": ["updateExclusion", "updateExclusion", "updateExclusion", "updateExclusionCallable"] + }, + "UpdateSink": { + "methods": ["updateSink", "updateSink", "updateSink", "updateSink", "updateSink", "updateSinkCallable"] + }, + "UpdateView": { + "methods": ["updateView", "updateViewCallable"] + } + } + } + } + }, + "MetricsServiceV2": { + "clients": { + "grpc": { + "libraryClient": "MetricsClient", + "rpcs": { + "CreateLogMetric": { + "methods": ["createLogMetric", "createLogMetric", "createLogMetric", "createLogMetricCallable"] + }, + "DeleteLogMetric": { + "methods": ["deleteLogMetric", "deleteLogMetric", "deleteLogMetric", "deleteLogMetricCallable"] + }, + "GetLogMetric": { + "methods": ["getLogMetric", "getLogMetric", "getLogMetric", "getLogMetricCallable"] + }, + "ListLogMetrics": { + "methods": ["listLogMetrics", "listLogMetrics", "listLogMetrics", "listLogMetricsPagedCallable", "listLogMetricsCallable"] + }, + "UpdateLogMetric": { + "methods": ["updateLogMetric", "updateLogMetric", "updateLogMetric", "updateLogMetricCallable"] + } + } + } + } + } + } +} \ No newline at end of file diff --git a/test/integration/goldens/redis/BUILD.bazel b/test/integration/goldens/redis/BUILD.bazel index 0b74aed56b..667772f01b 100644 --- a/test/integration/goldens/redis/BUILD.bazel +++ b/test/integration/goldens/redis/BUILD.bazel @@ -2,5 +2,8 @@ package(default_visibility = ["//visibility:public"]) filegroup( name = "goldens_files", - srcs = glob(["*.java"]), + srcs = glob([ + "*.java", + "gapic_metadata.json", + ]), ) diff --git a/test/integration/goldens/redis/gapic_metadata.json b/test/integration/goldens/redis/gapic_metadata.json new file mode 100644 index 0000000000..4d1492fff3 --- /dev/null +++ b/test/integration/goldens/redis/gapic_metadata.json @@ -0,0 +1,45 @@ +{ + "schema": "1.0", + "comment": "This file maps proto services/RPCs to the corresponding library clients/methods", + "language": "java", + "protoPackage": "google.cloud.redis.v1beta1", + "libraryPackage": "com.google.cloud.redis.v1beta1", + "services": { + "CloudRedis": { + "clients": { + "grpc": { + "libraryClient": "CloudRedisClient", + "rpcs": { + "CreateInstance": { + "methods": ["createInstanceAsync", "createInstanceAsync", "createInstanceAsync", "createInstanceOperationCallable", "createInstanceCallable"] + }, + "DeleteInstance": { + "methods": ["deleteInstanceAsync", "deleteInstanceAsync", "deleteInstanceAsync", "deleteInstanceOperationCallable", "deleteInstanceCallable"] + }, + "ExportInstance": { + "methods": ["exportInstanceAsync", "exportInstanceAsync", "exportInstanceOperationCallable", "exportInstanceCallable"] + }, + "FailoverInstance": { + "methods": ["failoverInstanceAsync", "failoverInstanceAsync", "failoverInstanceAsync", "failoverInstanceOperationCallable", "failoverInstanceCallable"] + }, + "GetInstance": { + "methods": ["getInstance", "getInstance", "getInstance", "getInstanceCallable"] + }, + "ImportInstance": { + "methods": ["importInstanceAsync", "importInstanceAsync", "importInstanceOperationCallable", "importInstanceCallable"] + }, + "ListInstances": { + "methods": ["listInstances", "listInstances", "listInstances", "listInstancesPagedCallable", "listInstancesCallable"] + }, + "UpdateInstance": { + "methods": ["updateInstanceAsync", "updateInstanceAsync", "updateInstanceOperationCallable", "updateInstanceCallable"] + }, + "UpgradeInstance": { + "methods": ["upgradeInstanceAsync", "upgradeInstanceAsync", "upgradeInstanceAsync", "upgradeInstanceOperationCallable", "upgradeInstanceCallable"] + } + } + } + } + } + } +} \ No newline at end of file