From 4ad2273eb61de9c7f8921f8d4df425947a4be93a Mon Sep 17 00:00:00 2001 From: Shahid Date: Thu, 26 Dec 2019 15:21:59 +0530 Subject: [PATCH 01/28] Create build_artifact_node_s390x.sh --- .../artifacts/build_artifact_node_s390x.sh | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 packages/grpc-native-core/tools/run_tests/artifacts/build_artifact_node_s390x.sh diff --git a/packages/grpc-native-core/tools/run_tests/artifacts/build_artifact_node_s390x.sh b/packages/grpc-native-core/tools/run_tests/artifacts/build_artifact_node_s390x.sh new file mode 100644 index 00000000..05ea8b44 --- /dev/null +++ b/packages/grpc-native-core/tools/run_tests/artifacts/build_artifact_node_s390x.sh @@ -0,0 +1,37 @@ +#!/bin/bash +# Copyright 2017 gRPC authors. +# +# 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. + +set -ex + +# https://github.com/mapbox/node-pre-gyp/issues/362 +npm install -g node-gyp + +cd $(dirname $0)/../../.. + +rm -rf build || true + +mkdir -p "${ARTIFACTS_OUT}" + +npm update + +node_versions=( 4.0.0 5.0.0 6.0.0 7.0.0 8.0.0 9.0.0 10.0.0 11.0.0 12.0.0 13.0.0 ) + +for version in ${node_versions[@]} +do + # Cross compile for s390x on x64 + # Requires debian or ubuntu packages "g++-s390x-linux-gnu". + CC=s390x-linux-gnu-gcc CXX=s390x-linux-gnu-g++ LD=s390x-linux-gnu-g++ ./node_modules/.bin/node-pre-gyp configure rebuild package testpackage --target=$version --target_arch=s390x + cp -r build/stage/* "${ARTIFACTS_OUT}"/ +done From 4d1e4c9ae7e26b5aa46c71289f88e40d82a491bb Mon Sep 17 00:00:00 2001 From: Shahid Date: Thu, 26 Dec 2019 15:23:22 +0530 Subject: [PATCH 02/28] Update build_all_linux_artifacts.sh --- .../run_tests/artifacts/build_all_linux_artifacts.sh | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/packages/grpc-native-core/tools/run_tests/artifacts/build_all_linux_artifacts.sh b/packages/grpc-native-core/tools/run_tests/artifacts/build_all_linux_artifacts.sh index 26df28bd..e9aecfe4 100755 --- a/packages/grpc-native-core/tools/run_tests/artifacts/build_all_linux_artifacts.sh +++ b/packages/grpc-native-core/tools/run_tests/artifacts/build_all_linux_artifacts.sh @@ -69,8 +69,13 @@ if [ "$DO_NATIVE" = "true" ] ; then fi if [ "$DO_CROSS" = "true" ] ; then - $tool_dir/build_artifact_node_arm.sh - docker build -t alpine_node_artifact $base_dir/tools/docker/alpine_artifact + + # Cross build for arm + $tool_dir/build_artifact_node_arm.sh + docker run -e JOBS=8 -e ARTIFACTS_OUT=/var/grpc/artifacts -v $base_dir:/var/grpc alpine_node_artifact /var/grpc/tools/run_tests/artifacts/build_artifact_node.sh --with-alpine + + # Cross build for s390x + $tool_dir/build_artifact_node_s390x.sh docker run -e JOBS=8 -e ARTIFACTS_OUT=/var/grpc/artifacts -v $base_dir:/var/grpc alpine_node_artifact /var/grpc/tools/run_tests/artifacts/build_artifact_node.sh --with-alpine fi From ec0093211fab6db3e3dfa6e8ae4a9a8f22fa6b5d Mon Sep 17 00:00:00 2001 From: Shahid Date: Thu, 26 Dec 2019 15:24:46 +0530 Subject: [PATCH 03/28] Update Dockerfile --- tools/release/cross/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/release/cross/Dockerfile b/tools/release/cross/Dockerfile index 7dabff9a..1e931250 100644 --- a/tools/release/cross/Dockerfile +++ b/tools/release/cross/Dockerfile @@ -2,7 +2,7 @@ FROM debian:stretch RUN dpkg --add-architecture i386 RUN apt-get update -RUN apt-get install -y curl build-essential g++-aarch64-linux-gnu g++-arm-linux-gnueabihf python libc6-dev:i386 lib32stdc++-6-dev +RUN apt-get install -y curl build-essential g++-aarch64-linux-gnu g++-arm-linux-gnueabihf g++-s390x-linux-gnu python libc6-dev:i386 lib32stdc++-6-dev RUN curl -fsSL get.docker.com | bash RUN mkdir /usr/local/nvm From a92005a4de064736da287659f781e39e2cc9ee0a Mon Sep 17 00:00:00 2001 From: Shahid Date: Thu, 2 Jan 2020 15:47:56 +0530 Subject: [PATCH 04/28] Update build_all_linux_artifacts.sh --- .../artifacts/build_all_linux_artifacts.sh | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/packages/grpc-native-core/tools/run_tests/artifacts/build_all_linux_artifacts.sh b/packages/grpc-native-core/tools/run_tests/artifacts/build_all_linux_artifacts.sh index e9aecfe4..e6be7967 100755 --- a/packages/grpc-native-core/tools/run_tests/artifacts/build_all_linux_artifacts.sh +++ b/packages/grpc-native-core/tools/run_tests/artifacts/build_all_linux_artifacts.sh @@ -1,17 +1,4 @@ #!/bin/bash -# Copyright 2017 gRPC authors. -# -# 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. [ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" nvm install 10 From da545c9eb34840e87071846712d3035b0b9aefa3 Mon Sep 17 00:00:00 2001 From: Shahid Date: Thu, 2 Jan 2020 15:48:40 +0530 Subject: [PATCH 05/28] Update build_artifact_node_s390x.sh --- .../artifacts/build_artifact_node_s390x.sh | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/packages/grpc-native-core/tools/run_tests/artifacts/build_artifact_node_s390x.sh b/packages/grpc-native-core/tools/run_tests/artifacts/build_artifact_node_s390x.sh index 05ea8b44..818d9663 100644 --- a/packages/grpc-native-core/tools/run_tests/artifacts/build_artifact_node_s390x.sh +++ b/packages/grpc-native-core/tools/run_tests/artifacts/build_artifact_node_s390x.sh @@ -1,17 +1,4 @@ #!/bin/bash -# Copyright 2017 gRPC authors. -# -# 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. set -ex From a69cb45aa5714e1b13b06e28544926a09727863f Mon Sep 17 00:00:00 2001 From: Shahid Date: Fri, 3 Jan 2020 18:56:49 +0530 Subject: [PATCH 06/28] Update build_all_linux_artifacts.sh --- .../artifacts/build_all_linux_artifacts.sh | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/packages/grpc-native-core/tools/run_tests/artifacts/build_all_linux_artifacts.sh b/packages/grpc-native-core/tools/run_tests/artifacts/build_all_linux_artifacts.sh index e6be7967..e9aecfe4 100755 --- a/packages/grpc-native-core/tools/run_tests/artifacts/build_all_linux_artifacts.sh +++ b/packages/grpc-native-core/tools/run_tests/artifacts/build_all_linux_artifacts.sh @@ -1,4 +1,17 @@ #!/bin/bash +# Copyright 2017 gRPC authors. +# +# 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. [ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" nvm install 10 From f03f1b52f3505b40f4570afea0e836efda8cee8b Mon Sep 17 00:00:00 2001 From: murgatroid99 Date: Tue, 7 Jan 2020 16:25:17 -0800 Subject: [PATCH 07/28] Add test for waitForReady on both implementations --- test/api/connectivity_test.js | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/test/api/connectivity_test.js b/test/api/connectivity_test.js index 042c136b..1cf6d3ff 100644 --- a/test/api/connectivity_test.js +++ b/test/api/connectivity_test.js @@ -59,6 +59,29 @@ const serviceImpl = { }; describe(`${anyGrpc.clientName} client -> ${anyGrpc.serverName} server`, function() { + it('client should not wait for ready by default', function(done) { + this.timeout(15000); + const disconnectedClient = new TestServiceClient('foo.test.google.com:50051', grpc.credentials.createInsecure()); + const deadline = new Date(); + deadline.setSeconds(deadline.getSeconds() + 10); + disconnectedClient.unary({}, {deadline: deadline}, (error, value) =>{ + assert(error); + assert.strictEqual(error.code, grpc.status.UNAVAILABLE); + done(); + }); + }); + it('client should wait for a connection with waitForReady on', function(done) { + this.timeout(15000); + const disconnectedClient = new TestServiceClient('foo.test.google.com:50051', grpc.credentials.createInsecure()); + const metadata = new grpc.Metadata({waitForReady: true}); + const deadline = new Date(); + deadline.setSeconds(deadline.getSeconds() + 10); + disconnectedClient.unary({}, metadata, {deadline: deadline}, (error, value) =>{ + assert(error); + assert.strictEqual(error.code, grpc.status.DEADLINE_EXCEEDED); + done(); + }); + }); describe('Reconnection', function() { let server1; let server2; From 94cdec3e73aba407c29abc059517307e0a0f5adb Mon Sep 17 00:00:00 2001 From: murgatroid99 Date: Tue, 7 Jan 2020 17:54:50 -0800 Subject: [PATCH 08/28] Fix grpc reference in tests --- test/api/connectivity_test.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/api/connectivity_test.js b/test/api/connectivity_test.js index 1cf6d3ff..a515f882 100644 --- a/test/api/connectivity_test.js +++ b/test/api/connectivity_test.js @@ -61,7 +61,7 @@ const serviceImpl = { describe(`${anyGrpc.clientName} client -> ${anyGrpc.serverName} server`, function() { it('client should not wait for ready by default', function(done) { this.timeout(15000); - const disconnectedClient = new TestServiceClient('foo.test.google.com:50051', grpc.credentials.createInsecure()); + const disconnectedClient = new TestServiceClient('foo.test.google.com:50051', clientGrpc.credentials.createInsecure()); const deadline = new Date(); deadline.setSeconds(deadline.getSeconds() + 10); disconnectedClient.unary({}, {deadline: deadline}, (error, value) =>{ @@ -72,7 +72,7 @@ describe(`${anyGrpc.clientName} client -> ${anyGrpc.serverName} server`, functio }); it('client should wait for a connection with waitForReady on', function(done) { this.timeout(15000); - const disconnectedClient = new TestServiceClient('foo.test.google.com:50051', grpc.credentials.createInsecure()); + const disconnectedClient = new TestServiceClient('foo.test.google.com:50051', clientGrpc.credentials.createInsecure()); const metadata = new grpc.Metadata({waitForReady: true}); const deadline = new Date(); deadline.setSeconds(deadline.getSeconds() + 10); From e11587c69d05a96110eb1b4c98e731d7e02b65ee Mon Sep 17 00:00:00 2001 From: Shahid Date: Wed, 8 Jan 2020 21:14:50 +0530 Subject: [PATCH 09/28] Incorporating review comments --- .../run_tests/artifacts/build_all_linux_artifacts.sh | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/packages/grpc-native-core/tools/run_tests/artifacts/build_all_linux_artifacts.sh b/packages/grpc-native-core/tools/run_tests/artifacts/build_all_linux_artifacts.sh index e9aecfe4..1700f393 100755 --- a/packages/grpc-native-core/tools/run_tests/artifacts/build_all_linux_artifacts.sh +++ b/packages/grpc-native-core/tools/run_tests/artifacts/build_all_linux_artifacts.sh @@ -69,13 +69,9 @@ if [ "$DO_NATIVE" = "true" ] ; then fi if [ "$DO_CROSS" = "true" ] ; then - docker build -t alpine_node_artifact $base_dir/tools/docker/alpine_artifact - - # Cross build for arm $tool_dir/build_artifact_node_arm.sh - docker run -e JOBS=8 -e ARTIFACTS_OUT=/var/grpc/artifacts -v $base_dir:/var/grpc alpine_node_artifact /var/grpc/tools/run_tests/artifacts/build_artifact_node.sh --with-alpine - - # Cross build for s390x $tool_dir/build_artifact_node_s390x.sh + + docker build -t alpine_node_artifact $base_dir/tools/docker/alpine_artifact docker run -e JOBS=8 -e ARTIFACTS_OUT=/var/grpc/artifacts -v $base_dir:/var/grpc alpine_node_artifact /var/grpc/tools/run_tests/artifacts/build_artifact_node.sh --with-alpine fi From 3a1470ed80451f27f2cb992d19de8c384f65a1b6 Mon Sep 17 00:00:00 2001 From: murgatroid99 Date: Wed, 8 Jan 2020 09:43:10 -0800 Subject: [PATCH 10/28] Fix other references --- test/api/connectivity_test.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/api/connectivity_test.js b/test/api/connectivity_test.js index a515f882..b5d31943 100644 --- a/test/api/connectivity_test.js +++ b/test/api/connectivity_test.js @@ -66,19 +66,19 @@ describe(`${anyGrpc.clientName} client -> ${anyGrpc.serverName} server`, functio deadline.setSeconds(deadline.getSeconds() + 10); disconnectedClient.unary({}, {deadline: deadline}, (error, value) =>{ assert(error); - assert.strictEqual(error.code, grpc.status.UNAVAILABLE); + assert.strictEqual(error.code, clientGrpc.status.UNAVAILABLE); done(); }); }); it('client should wait for a connection with waitForReady on', function(done) { this.timeout(15000); const disconnectedClient = new TestServiceClient('foo.test.google.com:50051', clientGrpc.credentials.createInsecure()); - const metadata = new grpc.Metadata({waitForReady: true}); + const metadata = new clientGrpc.Metadata({waitForReady: true}); const deadline = new Date(); deadline.setSeconds(deadline.getSeconds() + 10); disconnectedClient.unary({}, metadata, {deadline: deadline}, (error, value) =>{ assert(error); - assert.strictEqual(error.code, grpc.status.DEADLINE_EXCEEDED); + assert.strictEqual(error.code, clientGrpc.status.DEADLINE_EXCEEDED); done(); }); }); From 596232675e2e1bd845bcc3b282bd516f95299de1 Mon Sep 17 00:00:00 2001 From: murgatroid99 Date: Wed, 8 Jan 2020 16:32:50 -0800 Subject: [PATCH 11/28] Copy options when cloning metadata --- packages/grpc-js/src/metadata.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/grpc-js/src/metadata.ts b/packages/grpc-js/src/metadata.ts index 4b41aa25..630fb99a 100644 --- a/packages/grpc-js/src/metadata.ts +++ b/packages/grpc-js/src/metadata.ts @@ -174,7 +174,7 @@ export class Metadata { * @return The newly cloned object. */ clone(): Metadata { - const newMetadata = new Metadata(); + const newMetadata = new Metadata(this.options); const newInternalRepr = newMetadata.internalRepr; this.internalRepr.forEach((value, key) => { From 01a16846985677e1df2116135408b02313f35c71 Mon Sep 17 00:00:00 2001 From: root Date: Thu, 9 Jan 2020 01:49:37 -0800 Subject: [PATCH 12/28] Make build_artifact_node_s390x.sh executable. --- .../tools/run_tests/artifacts/build_artifact_node_s390x.sh | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 packages/grpc-native-core/tools/run_tests/artifacts/build_artifact_node_s390x.sh diff --git a/packages/grpc-native-core/tools/run_tests/artifacts/build_artifact_node_s390x.sh b/packages/grpc-native-core/tools/run_tests/artifacts/build_artifact_node_s390x.sh old mode 100644 new mode 100755 From ec30a63794e69a700439ceef69491dc101ba31d7 Mon Sep 17 00:00:00 2001 From: shahidhs-ibm Date: Thu, 9 Jan 2020 02:47:08 -0800 Subject: [PATCH 13/28] Revert "Make build_artifact_node_s390x.sh executable." This reverts commit 01a16846985677e1df2116135408b02313f35c71. --- .../tools/run_tests/artifacts/build_artifact_node_s390x.sh | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 packages/grpc-native-core/tools/run_tests/artifacts/build_artifact_node_s390x.sh diff --git a/packages/grpc-native-core/tools/run_tests/artifacts/build_artifact_node_s390x.sh b/packages/grpc-native-core/tools/run_tests/artifacts/build_artifact_node_s390x.sh old mode 100755 new mode 100644 From 43d7bc734f7c84bad926894d3cb5487cb4039719 Mon Sep 17 00:00:00 2001 From: shahidhs-ibm Date: Thu, 9 Jan 2020 02:49:31 -0800 Subject: [PATCH 14/28] Make build_artifact_node_s390x.sh executable. --- .../tools/run_tests/artifacts/build_artifact_node_s390x.sh | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 packages/grpc-native-core/tools/run_tests/artifacts/build_artifact_node_s390x.sh diff --git a/packages/grpc-native-core/tools/run_tests/artifacts/build_artifact_node_s390x.sh b/packages/grpc-native-core/tools/run_tests/artifacts/build_artifact_node_s390x.sh old mode 100644 new mode 100755 From 57c18382d8769a1c9eee4d0d22006828e32d6899 Mon Sep 17 00:00:00 2001 From: murgatroid99 Date: Wed, 29 Jan 2020 09:42:13 -0800 Subject: [PATCH 15/28] grpc-js: Use an object to represent subchannel addresses --- packages/grpc-js/src/channel.ts | 3 +- .../grpc-js/src/load-balancer-pick-first.ts | 6 +- .../grpc-js/src/load-balancer-round-robin.ts | 4 +- packages/grpc-js/src/load-balancer.ts | 6 +- packages/grpc-js/src/resolver-dns.ts | 27 ++++--- packages/grpc-js/src/resolver-uds.ts | 5 +- packages/grpc-js/src/resolver.ts | 3 +- .../grpc-js/src/resolving-load-balancer.ts | 9 ++- packages/grpc-js/src/subchannel-pool.ts | 73 +++++++++---------- packages/grpc-js/src/subchannel.ts | 61 +++++++++++++--- packages/grpc-js/test/test-resolver.ts | 37 +++++----- 11 files changed, 136 insertions(+), 98 deletions(-) diff --git a/packages/grpc-js/src/channel.ts b/packages/grpc-js/src/channel.ts index 6cf987cb..a19cc217 100644 --- a/packages/grpc-js/src/channel.ts +++ b/packages/grpc-js/src/channel.ts @@ -38,6 +38,7 @@ import { getDefaultAuthority } from './resolver'; import { LoadBalancingConfig } from './load-balancing-config'; import { ServiceConfig, validateServiceConfig } from './service-config'; import { trace } from './logging'; +import { SubchannelAddress } from './subchannel'; export enum ConnectivityState { CONNECTING, @@ -145,7 +146,7 @@ export class ChannelImplementation implements Channel { this.subchannelPool = getSubchannelPool((options['grpc.use_local_subchannel_pool'] ?? 0) === 0); const channelControlHelper: ChannelControlHelper = { createSubchannel: ( - subchannelAddress: string, + subchannelAddress: SubchannelAddress, subchannelArgs: ChannelOptions ) => { return this.subchannelPool.getOrCreateSubchannel( diff --git a/packages/grpc-js/src/load-balancer-pick-first.ts b/packages/grpc-js/src/load-balancer-pick-first.ts index a5fbf0fa..fffb2a2a 100644 --- a/packages/grpc-js/src/load-balancer-pick-first.ts +++ b/packages/grpc-js/src/load-balancer-pick-first.ts @@ -30,7 +30,7 @@ import { UnavailablePicker, } from './picker'; import { LoadBalancingConfig } from './load-balancing-config'; -import { Subchannel, ConnectivityStateListener } from './subchannel'; +import { Subchannel, ConnectivityStateListener, SubchannelAddress } from './subchannel'; import * as logging from './logging'; import { LogVerbosity } from './constants'; @@ -76,7 +76,7 @@ export class PickFirstLoadBalancer implements LoadBalancer { /** * The list of backend addresses most recently passed to `updateAddressList`. */ - private latestAddressList: string[] = []; + private latestAddressList: SubchannelAddress[] = []; /** * The list of subchannels this load balancer is currently attempting to * connect to. @@ -369,7 +369,7 @@ export class PickFirstLoadBalancer implements LoadBalancer { } updateAddressList( - addressList: string[], + addressList: SubchannelAddress[], lbConfig: LoadBalancingConfig | null ): void { // lbConfig has no useful information for pick first load balancing diff --git a/packages/grpc-js/src/load-balancer-round-robin.ts b/packages/grpc-js/src/load-balancer-round-robin.ts index e3eedfe5..2aeda430 100644 --- a/packages/grpc-js/src/load-balancer-round-robin.ts +++ b/packages/grpc-js/src/load-balancer-round-robin.ts @@ -30,7 +30,7 @@ import { UnavailablePicker, } from './picker'; import { LoadBalancingConfig } from './load-balancing-config'; -import { Subchannel, ConnectivityStateListener } from './subchannel'; +import { Subchannel, ConnectivityStateListener, SubchannelAddress } from './subchannel'; const TYPE_NAME = 'round_robin'; @@ -168,7 +168,7 @@ export class RoundRobinLoadBalancer implements LoadBalancer { } updateAddressList( - addressList: string[], + addressList: SubchannelAddress[], lbConfig: LoadBalancingConfig | null ): void { this.resetSubchannelList(); diff --git a/packages/grpc-js/src/load-balancer.ts b/packages/grpc-js/src/load-balancer.ts index 69114521..5fa4bdc5 100644 --- a/packages/grpc-js/src/load-balancer.ts +++ b/packages/grpc-js/src/load-balancer.ts @@ -16,7 +16,7 @@ */ import { ChannelOptions } from './channel-options'; -import { Subchannel } from './subchannel'; +import { Subchannel, SubchannelAddress } from './subchannel'; import { ConnectivityState } from './channel'; import { Picker } from './picker'; import { LoadBalancingConfig } from './load-balancing-config'; @@ -34,7 +34,7 @@ export interface ChannelControlHelper { * @param subchannelArgs Extra channel arguments specified by the load balancer */ createSubchannel( - subchannelAddress: string, + subchannelAddress: SubchannelAddress, subchannelArgs: ChannelOptions ): Subchannel; /** @@ -66,7 +66,7 @@ export interface LoadBalancer { * if one was provided */ updateAddressList( - addressList: string[], + addressList: SubchannelAddress[], lbConfig: LoadBalancingConfig | null ): void; /** diff --git a/packages/grpc-js/src/resolver-dns.ts b/packages/grpc-js/src/resolver-dns.ts index 9f91d70a..9d357996 100644 --- a/packages/grpc-js/src/resolver-dns.ts +++ b/packages/grpc-js/src/resolver-dns.ts @@ -30,6 +30,7 @@ import { StatusObject } from './call-stream'; import { Metadata } from './metadata'; import * as logging from './logging'; import { LogVerbosity } from './constants'; +import { SubchannelAddress } from './subchannel'; const TRACER_NAME = 'dns_resolver'; @@ -112,7 +113,7 @@ const dnsLookupPromise = util.promisify(dns.lookup); * @param target * @return An "IP:port" string in an array if parsing was successful, `null` otherwise */ -function parseIP(target: string): string[] | null { +function parseIP(target: string): SubchannelAddress[] | null { /* These three regular expressions are all mutually exclusive, so we just * want the first one that matches the target string, if any do. */ const ipv4Match = IPV4_REGEX.exec(target); @@ -123,14 +124,14 @@ function parseIP(target: string): string[] | null { } // ipv6 addresses should be bracketed - const addr = ipv4Match ? match[1] : `[${match[1]}]`; + const addr = match[1]; let port: string; if (match[2]) { port = match[2]; } else { port = DEFAULT_PORT; } - return [`${addr}:${port}`]; + return [{host: addr, port: +port}]; } /** @@ -161,7 +162,7 @@ function mergeArrays(...arrays: T[][]): T[] { * Resolver implementation that handles DNS names and IP addresses. */ class DnsResolver implements Resolver { - private readonly ipResult: string[] | null; + private readonly ipResult: SubchannelAddress[] | null; private readonly dnsHostname: string | null; private readonly port: string | null; /* The promise results here contain, in order, the A record, the AAAA record, @@ -222,23 +223,21 @@ class DnsResolver implements Resolver { this.pendingResultPromise.then( ([addressList, txtRecord]) => { this.pendingResultPromise = null; - const ip4Addresses: string[] = addressList - .filter(addr => addr.family === 4) - .map(addr => `${addr.address}:${this.port}`); - let ip6Addresses: string[]; + const ip4Addresses: dns.LookupAddress[] = addressList + .filter(addr => addr.family === 4); + let ip6Addresses: dns.LookupAddress[]; if (semver.satisfies(process.version, IPV6_SUPPORT_RANGE)) { - ip6Addresses = addressList - .filter(addr => addr.family === 6) - .map(addr => `[${addr.address}]:${this.port}`); + ip6Addresses = addressList.filter(addr => addr.family === 6); } else { ip6Addresses = []; } - const allAddresses: string[] = mergeArrays( + const allAddresses: SubchannelAddress[] = mergeArrays( ip4Addresses, ip6Addresses - ); + ).map(addr => {return {host: addr.address, port: +this.port!};}); + const allAddressesString: string = '[' + allAddresses.map(addr => addr.host + ':' + addr.port).join(',') + ']'; trace( - 'Resolved addresses for target ' + this.target + ': ' + allAddresses + 'Resolved addresses for target ' + this.target + ': ' + allAddressesString ); if (allAddresses.length === 0) { this.listener.onError(this.defaultResolutionError); diff --git a/packages/grpc-js/src/resolver-uds.ts b/packages/grpc-js/src/resolver-uds.ts index 536a018b..64c628f3 100644 --- a/packages/grpc-js/src/resolver-uds.ts +++ b/packages/grpc-js/src/resolver-uds.ts @@ -20,6 +20,7 @@ import { registerResolver, registerDefaultResolver, } from './resolver'; +import { SubchannelAddress } from './subchannel'; function getUdsName(target: string): string { /* Due to how this resolver is registered, it should only be constructed @@ -34,9 +35,9 @@ function getUdsName(target: string): string { } class UdsResolver implements Resolver { - private addresses: string[] = []; + private addresses: SubchannelAddress[] = []; constructor(target: string, private listener: ResolverListener) { - this.addresses = [getUdsName(target)]; + this.addresses = [{path: getUdsName(target)}]; } updateResolution(): void { process.nextTick( diff --git a/packages/grpc-js/src/resolver.ts b/packages/grpc-js/src/resolver.ts index 3af5da9c..b2be310f 100644 --- a/packages/grpc-js/src/resolver.ts +++ b/packages/grpc-js/src/resolver.ts @@ -20,6 +20,7 @@ import { ServiceConfig } from './service-config'; import * as resolver_dns from './resolver-dns'; import * as resolver_uds from './resolver-uds'; import { StatusObject } from './call-stream'; +import { SubchannelAddress } from './subchannel'; /** * A listener object passed to the resolver's constructor that provides name @@ -36,7 +37,7 @@ export interface ResolverListener { * service configuration was invalid */ onSuccessfulResolution( - addressList: string[], + addressList: SubchannelAddress[], serviceConfig: ServiceConfig | null, serviceConfigError: StatusObject | null ): void; diff --git a/packages/grpc-js/src/resolving-load-balancer.ts b/packages/grpc-js/src/resolving-load-balancer.ts index 496e1345..a9ba0594 100644 --- a/packages/grpc-js/src/resolving-load-balancer.ts +++ b/packages/grpc-js/src/resolving-load-balancer.ts @@ -34,6 +34,7 @@ import { StatusObject } from './call-stream'; import { Metadata } from './metadata'; import * as logging from './logging'; import { LogVerbosity } from './constants'; +import { SubchannelAddress } from './subchannel'; const TRACER_NAME = 'resolving_load_balancer'; @@ -132,7 +133,7 @@ export class ResolvingLoadBalancer implements LoadBalancer { this.updateState(ConnectivityState.IDLE, new QueuePicker(this)); this.innerResolver = createResolver(target, { onSuccessfulResolution: ( - addressList: string[], + addressList: SubchannelAddress[], serviceConfig: ServiceConfig | null, serviceConfigError: ServiceError | null ) => { @@ -243,7 +244,7 @@ export class ResolvingLoadBalancer implements LoadBalancer { this.innerChannelControlHelper = { createSubchannel: ( - subchannelAddress: string, + subchannelAddress: SubchannelAddress, subchannelArgs: ChannelOptions ) => { return this.channelControlHelper.createSubchannel( @@ -289,7 +290,7 @@ export class ResolvingLoadBalancer implements LoadBalancer { this.replacementChannelControlHelper = { createSubchannel: ( - subchannelAddress: string, + subchannelAddress: SubchannelAddress, subchannelArgs: ChannelOptions ) => { return this.channelControlHelper.createSubchannel( @@ -409,7 +410,7 @@ export class ResolvingLoadBalancer implements LoadBalancer { } updateAddressList( - addressList: string[], + addressList: SubchannelAddress[], lbConfig: LoadBalancingConfig | null ) { throw new Error('updateAddressList not supported on ResolvingLoadBalancer'); diff --git a/packages/grpc-js/src/subchannel-pool.ts b/packages/grpc-js/src/subchannel-pool.ts index 009141e3..3a49295b 100644 --- a/packages/grpc-js/src/subchannel-pool.ts +++ b/packages/grpc-js/src/subchannel-pool.ts @@ -16,7 +16,7 @@ */ import { ChannelOptions, channelOptionsEqual } from './channel-options'; -import { Subchannel } from './subchannel'; +import { Subchannel, SubchannelAddress, subchannelAddressEqual } from './subchannel'; import { ChannelCredentials } from './channel-credentials'; // 10 seconds in milliseconds. This value is arbitrary. @@ -28,13 +28,12 @@ const REF_CHECK_INTERVAL = 10_000; export class SubchannelPool { private pool: { - [channelTarget: string]: { - [subchannelTarget: string]: Array<{ - channelArguments: ChannelOptions; - channelCredentials: ChannelCredentials; - subchannel: Subchannel; - }>; - }; + [channelTarget: string]: Array<{ + subchannelAddress: SubchannelAddress; + channelArguments: ChannelOptions; + channelCredentials: ChannelCredentials; + subchannel: Subchannel; + }>; } = Object.create(null); /** @@ -62,23 +61,20 @@ export class SubchannelPool { * do not need to be filtered */ // tslint:disable-next-line:forin for (const channelTarget in this.pool) { - // tslint:disable-next-line:forin - for (const subchannelTarget in this.pool[channelTarget]) { - const subchannelObjArray = this.pool[channelTarget][subchannelTarget]; + const subchannelObjArray = this.pool[channelTarget]; - const refedSubchannels = subchannelObjArray.filter( - value => !value.subchannel.unrefIfOneRef() - ); + const refedSubchannels = subchannelObjArray.filter( + value => !value.subchannel.unrefIfOneRef() + ); - if (refedSubchannels.length > 0) { - allSubchannelsUnrefed = false; - } - - /* For each subchannel in the pool, try to unref it if it has - * exactly one ref (which is the ref from the pool itself). If that - * does happen, remove the subchannel from the pool */ - this.pool[channelTarget][subchannelTarget] = refedSubchannels; + if (refedSubchannels.length > 0) { + allSubchannelsUnrefed = false; } + + /* For each subchannel in the pool, try to unref it if it has + * exactly one ref (which is the ref from the pool itself). If that + * does happen, remove the subchannel from the pool */ + this.pool[channelTarget] = refedSubchannels; } /* Currently we do not delete keys with empty values. If that results * in significant memory usage we should change it. */ @@ -114,25 +110,24 @@ export class SubchannelPool { */ getOrCreateSubchannel( channelTarget: string, - subchannelTarget: string, + subchannelTarget: SubchannelAddress, channelArguments: ChannelOptions, channelCredentials: ChannelCredentials ): Subchannel { this.ensureCleanupTask(); if (channelTarget in this.pool) { - if (subchannelTarget in this.pool[channelTarget]) { - const subchannelObjArray = this.pool[channelTarget][subchannelTarget]; - for (const subchannelObj of subchannelObjArray) { - if ( - channelOptionsEqual( - channelArguments, - subchannelObj.channelArguments - ) && - channelCredentials._equals(subchannelObj.channelCredentials) - ) { - return subchannelObj.subchannel; - } + const subchannelObjArray = this.pool[channelTarget]; + for (const subchannelObj of subchannelObjArray) { + if ( + subchannelAddressEqual(subchannelTarget, subchannelObj.subchannelAddress) && + channelOptionsEqual( + channelArguments, + subchannelObj.channelArguments + ) && + channelCredentials._equals(subchannelObj.channelCredentials) + ) { + return subchannelObj.subchannel; } } } @@ -144,12 +139,10 @@ export class SubchannelPool { channelCredentials ); if (!(channelTarget in this.pool)) { - this.pool[channelTarget] = Object.create(null); + this.pool[channelTarget] = []; } - if (!(subchannelTarget in this.pool[channelTarget])) { - this.pool[channelTarget][subchannelTarget] = []; - } - this.pool[channelTarget][subchannelTarget].push({ + this.pool[channelTarget].push({ + subchannelAddress: subchannelTarget, channelArguments, channelCredentials, subchannel, diff --git a/packages/grpc-js/src/subchannel.ts b/packages/grpc-js/src/subchannel.ts index b6b282d5..2a123f04 100644 --- a/packages/grpc-js/src/subchannel.ts +++ b/packages/grpc-js/src/subchannel.ts @@ -20,12 +20,13 @@ import { ChannelCredentials } from './channel-credentials'; import { Metadata } from './metadata'; import { Http2CallStream } from './call-stream'; import { ChannelOptions } from './channel-options'; -import { PeerCertificate, checkServerIdentity } from 'tls'; +import { PeerCertificate, checkServerIdentity, TLSSocket } from 'tls'; import { ConnectivityState } from './channel'; import { BackoffTimeout, BackoffOptions } from './backoff-timeout'; import { getDefaultAuthority } from './resolver'; import * as logging from './logging'; import { LogVerbosity } from './constants'; +import { SocketConnectOpts } from 'net'; const { version: clientVersion } = require('../../package.json'); @@ -73,6 +74,22 @@ function uniformRandom(min: number, max: number) { const tooManyPingsData: Buffer = Buffer.from('too_many_pings', 'ascii'); +/** + * This represents a single backend address to connect to. This interface is a + * subset of net.SocketConnectOpts, i.e. the options described at + * https://nodejs.org/api/net.html#net_socket_connect_options_connectlistener. + * Those are in turn a subset of the options that can be passed to http2.connect. + */ +export interface SubchannelAddress { + port?: number; + host?: string; + path?: string; +} + +export function subchannelAddressEqual(address1: SubchannelAddress, address2: SubchannelAddress) : boolean { + return address1.port === address2.port && address1.host === address2.host && address1.path === address2.path; +} + export class Subchannel { /** * The subchannel's current connectivity state. Invariant: `session` === `null` @@ -135,6 +152,11 @@ export class Subchannel { */ private refcount = 0; + /** + * A string representation of the subchannel address, for logging/tracing + */ + private subchannelAddressString: string; + /** * A class representing a connection to a single backend. * @param channelTarget The target string for the channel as a whole @@ -147,7 +169,7 @@ export class Subchannel { */ constructor( private channelTarget: string, - private subchannelAddress: string, + private subchannelAddress: SubchannelAddress, private options: ChannelOptions, private credentials: ChannelCredentials ) { @@ -187,6 +209,11 @@ export class Subchannel { ); } }, backoffOptions); + if (subchannelAddress.host || subchannelAddress.port) { + this.subchannelAddressString = `${subchannelAddress.host}:${subchannelAddress.port}`; + } else { + this.subchannelAddressString = `${subchannelAddress.path}`; + } } /** @@ -225,10 +252,11 @@ export class Subchannel { } private startConnectingInternal() { - const connectionOptions: http2.SecureClientSessionOptions = + let connectionOptions: http2.SecureClientSessionOptions = this.credentials._getConnectionOptions() || {}; let addressScheme = 'http://'; if ('secureContext' in connectionOptions) { + connectionOptions.protocol = 'https:'; addressScheme = 'https://'; // If provided, the value of grpc.ssl_target_name_override should be used // to override the target hostname when checking server identity. @@ -248,8 +276,21 @@ export class Subchannel { connectionOptions.servername = getDefaultAuthority(this.channelTarget); } } + connectionOptions = Object.assign(connectionOptions, this.subchannelAddress); + /* http2.connect uses the options here: + * https://github.com/nodejs/node/blob/70c32a6d190e2b5d7b9ff9d5b6a459d14e8b7d59/lib/internal/http2/core.js#L3028-L3036 + * The spread operator overides earlier values with later ones, so any port + * or host values in the options will be used rather than any values extracted + * from the first argument. In addition, the path overrides the host and port, + * as documented for plaintext connections here: + * https://nodejs.org/api/net.html#net_socket_connect_options_connectlistener + * and for TLS connections here: + * https://nodejs.org/api/tls.html#tls_tls_connect_options_callback. + * The first argument just needs to be parseable as a URL and the scheme + * determines whether the connection will be established over TLS or not. + */ const session = http2.connect( - addressScheme + this.subchannelAddress, + addressScheme + getDefaultAuthority(this.channelTarget), connectionOptions ); this.session = session; @@ -328,7 +369,7 @@ export class Subchannel { return false; } trace( - this.subchannelAddress + + this.subchannelAddressString + ' ' + ConnectivityState[this.connectivityState] + ' -> ' + @@ -400,7 +441,7 @@ export class Subchannel { callRef() { trace( - this.subchannelAddress + + this.subchannelAddressString + ' callRefcount ' + this.callRefcount + ' -> ' + @@ -417,7 +458,7 @@ export class Subchannel { callUnref() { trace( - this.subchannelAddress + + this.subchannelAddressString + ' callRefcount ' + this.callRefcount + ' -> ' + @@ -435,7 +476,7 @@ export class Subchannel { ref() { trace( - this.subchannelAddress + + this.subchannelAddressString + ' callRefcount ' + this.refcount + ' -> ' + @@ -446,7 +487,7 @@ export class Subchannel { unref() { trace( - this.subchannelAddress + + this.subchannelAddressString + ' callRefcount ' + this.refcount + ' -> ' + @@ -557,6 +598,6 @@ export class Subchannel { } getAddress(): string { - return this.subchannelAddress; + return this.subchannelAddressString; } } diff --git a/packages/grpc-js/test/test-resolver.ts b/packages/grpc-js/test/test-resolver.ts index 951291a6..fc158510 100644 --- a/packages/grpc-js/test/test-resolver.ts +++ b/packages/grpc-js/test/test-resolver.ts @@ -21,6 +21,7 @@ import * as assert from 'assert'; import * as resolverManager from '../src/resolver'; import { ServiceConfig } from '../src/service-config'; import { StatusObject } from '../src/call-stream'; +import { SubchannelAddress } from '../src/subchannel'; describe('Name Resolver', () => { describe('DNS Names', function() { @@ -33,11 +34,11 @@ describe('Name Resolver', () => { const target = 'localhost:50051'; const listener: resolverManager.ResolverListener = { onSuccessfulResolution: ( - addressList: string[], + addressList: SubchannelAddress[], serviceConfig: ServiceConfig | null, serviceConfigError: StatusObject | null ) => { - assert(addressList.includes('127.0.0.1:50051')); + assert(addressList.some(addr => addr.host === '127.0.0.1' && addr.port === 50051)); // We would check for the IPv6 address but it needs to be omitted on some Node versions done(); }, @@ -52,11 +53,11 @@ describe('Name Resolver', () => { const target = 'localhost'; const listener: resolverManager.ResolverListener = { onSuccessfulResolution: ( - addressList: string[], + addressList: SubchannelAddress[], serviceConfig: ServiceConfig | null, serviceConfigError: StatusObject | null ) => { - assert(addressList.includes('127.0.0.1:443')); + assert(addressList.some(addr => addr.host === '127.0.0.1' && addr.port === 443)); // We would check for the IPv6 address but it needs to be omitted on some Node versions done(); }, @@ -71,11 +72,11 @@ describe('Name Resolver', () => { const target = '1.2.3.4'; const listener: resolverManager.ResolverListener = { onSuccessfulResolution: ( - addressList: string[], + addressList: SubchannelAddress[], serviceConfig: ServiceConfig | null, serviceConfigError: StatusObject | null ) => { - assert(addressList.includes('1.2.3.4:443')); + assert(addressList.some(addr => addr.host === '1.2.3.4' && addr.port === 443)); // We would check for the IPv6 address but it needs to be omitted on some Node versions done(); }, @@ -90,11 +91,11 @@ describe('Name Resolver', () => { const target = '::1'; const listener: resolverManager.ResolverListener = { onSuccessfulResolution: ( - addressList: string[], + addressList: SubchannelAddress[], serviceConfig: ServiceConfig | null, serviceConfigError: StatusObject | null ) => { - assert(addressList.includes('[::1]:443')); + assert(addressList.some(addr => addr.host === '::1' && addr.port === 443)); // We would check for the IPv6 address but it needs to be omitted on some Node versions done(); }, @@ -109,11 +110,11 @@ describe('Name Resolver', () => { const target = '[::1]:50051'; const listener: resolverManager.ResolverListener = { onSuccessfulResolution: ( - addressList: string[], + addressList: SubchannelAddress[], serviceConfig: ServiceConfig | null, serviceConfigError: StatusObject | null ) => { - assert(addressList.includes('[::1]:50051')); + assert(addressList.some(addr => addr.host === '::1' && addr.port === 50051)); // We would check for the IPv6 address but it needs to be omitted on some Node versions done(); }, @@ -128,7 +129,7 @@ describe('Name Resolver', () => { const target = 'example.com'; const listener: resolverManager.ResolverListener = { onSuccessfulResolution: ( - addressList: string[], + addressList: SubchannelAddress[], serviceConfig: ServiceConfig | null, serviceConfigError: StatusObject | null ) => { @@ -146,7 +147,7 @@ describe('Name Resolver', () => { const target = 'loopback4.unittest.grpc.io'; const listener: resolverManager.ResolverListener = { onSuccessfulResolution: ( - addressList: string[], + addressList: SubchannelAddress[], serviceConfig: ServiceConfig | null, serviceConfigError: StatusObject | null ) => { @@ -166,7 +167,7 @@ describe('Name Resolver', () => { const target = 'network-tools.com'; const listener: resolverManager.ResolverListener = { onSuccessfulResolution: ( - addressList: string[], + addressList: SubchannelAddress[], serviceConfig: ServiceConfig | null, serviceConfigError: StatusObject | null ) => { @@ -196,7 +197,7 @@ describe('Name Resolver', () => { const target2 = 'grpc-test4.sandbox.googleapis.com'; const listener: resolverManager.ResolverListener = { onSuccessfulResolution: ( - addressList: string[], + addressList: SubchannelAddress[], serviceConfig: ServiceConfig | null, serviceConfigError: StatusObject | null ) => { @@ -218,11 +219,11 @@ describe('Name Resolver', () => { const target = 'unix:socket'; const listener: resolverManager.ResolverListener = { onSuccessfulResolution: ( - addressList: string[], + addressList: SubchannelAddress[], serviceConfig: ServiceConfig | null, serviceConfigError: StatusObject | null ) => { - assert(addressList.includes('socket')); + assert(addressList.some(addr => addr.path = 'socket')); done(); }, onError: (error: StatusObject) => { @@ -236,11 +237,11 @@ describe('Name Resolver', () => { const target = 'unix:///tmp/socket'; const listener: resolverManager.ResolverListener = { onSuccessfulResolution: ( - addressList: string[], + addressList: SubchannelAddress[], serviceConfig: ServiceConfig | null, serviceConfigError: StatusObject | null ) => { - assert(addressList.includes('/tmp/socket')); + assert(addressList.some(addr => addr.path = '/tmp/socket')); done(); }, onError: (error: StatusObject) => { From c5428c57330d6a5f52e3edd9600f021e5f158123 Mon Sep 17 00:00:00 2001 From: murgatroid99 Date: Wed, 29 Jan 2020 09:56:49 -0800 Subject: [PATCH 16/28] lint and formatting fixes --- packages/grpc-js/src/channel-credentials.ts | 4 +-- packages/grpc-js/src/channel.ts | 4 ++- .../grpc-js/src/load-balancer-pick-first.ts | 6 +++- .../grpc-js/src/load-balancer-round-robin.ts | 6 +++- packages/grpc-js/src/resolver-dns.ts | 19 ++++++++---- packages/grpc-js/src/resolver-uds.ts | 2 +- packages/grpc-js/src/server-credentials.ts | 4 +-- packages/grpc-js/src/server.ts | 9 ++++-- packages/grpc-js/src/subchannel-pool.ts | 15 +++++++--- packages/grpc-js/src/subchannel.ts | 18 ++++++++--- packages/grpc-js/src/tls-helpers.ts | 5 ++-- packages/grpc-js/test/test-resolver.ts | 30 ++++++++++++++----- 12 files changed, 89 insertions(+), 33 deletions(-) diff --git a/packages/grpc-js/src/channel-credentials.ts b/packages/grpc-js/src/channel-credentials.ts index f42c7e93..5d5b87d5 100644 --- a/packages/grpc-js/src/channel-credentials.ts +++ b/packages/grpc-js/src/channel-credentials.ts @@ -18,7 +18,7 @@ import { ConnectionOptions, createSecureContext, PeerCertificate } from 'tls'; import { CallCredentials } from './call-credentials'; -import {CIPHER_SUITES, getDefaultRootsData} from './tls-helpers'; +import { CIPHER_SUITES, getDefaultRootsData } from './tls-helpers'; // tslint:disable-next-line:no-any function verifyIsBufferOrNull(obj: any, friendlyName: string): void { @@ -190,7 +190,7 @@ class SecureChannelCredentialsImpl extends ChannelCredentials { ca: rootCerts || undefined, key: privateKey || undefined, cert: certChain || undefined, - ciphers: CIPHER_SUITES + ciphers: CIPHER_SUITES, }); this.connectionOptions = { secureContext }; if (verifyOptions && verifyOptions.checkServerIdentity) { diff --git a/packages/grpc-js/src/channel.ts b/packages/grpc-js/src/channel.ts index a19cc217..d43da0e5 100644 --- a/packages/grpc-js/src/channel.ts +++ b/packages/grpc-js/src/channel.ts @@ -143,7 +143,9 @@ export class ChannelImplementation implements Channel { ) { /* The global boolean parameter to getSubchannelPool has the inverse meaning to what * the grpc.use_local_subchannel_pool channel option means. */ - this.subchannelPool = getSubchannelPool((options['grpc.use_local_subchannel_pool'] ?? 0) === 0); + this.subchannelPool = getSubchannelPool( + (options['grpc.use_local_subchannel_pool'] ?? 0) === 0 + ); const channelControlHelper: ChannelControlHelper = { createSubchannel: ( subchannelAddress: SubchannelAddress, diff --git a/packages/grpc-js/src/load-balancer-pick-first.ts b/packages/grpc-js/src/load-balancer-pick-first.ts index fffb2a2a..52ce8457 100644 --- a/packages/grpc-js/src/load-balancer-pick-first.ts +++ b/packages/grpc-js/src/load-balancer-pick-first.ts @@ -30,7 +30,11 @@ import { UnavailablePicker, } from './picker'; import { LoadBalancingConfig } from './load-balancing-config'; -import { Subchannel, ConnectivityStateListener, SubchannelAddress } from './subchannel'; +import { + Subchannel, + ConnectivityStateListener, + SubchannelAddress, +} from './subchannel'; import * as logging from './logging'; import { LogVerbosity } from './constants'; diff --git a/packages/grpc-js/src/load-balancer-round-robin.ts b/packages/grpc-js/src/load-balancer-round-robin.ts index 2aeda430..4956e11e 100644 --- a/packages/grpc-js/src/load-balancer-round-robin.ts +++ b/packages/grpc-js/src/load-balancer-round-robin.ts @@ -30,7 +30,11 @@ import { UnavailablePicker, } from './picker'; import { LoadBalancingConfig } from './load-balancing-config'; -import { Subchannel, ConnectivityStateListener, SubchannelAddress } from './subchannel'; +import { + Subchannel, + ConnectivityStateListener, + SubchannelAddress, +} from './subchannel'; const TYPE_NAME = 'round_robin'; diff --git a/packages/grpc-js/src/resolver-dns.ts b/packages/grpc-js/src/resolver-dns.ts index 9d357996..a5cd028a 100644 --- a/packages/grpc-js/src/resolver-dns.ts +++ b/packages/grpc-js/src/resolver-dns.ts @@ -131,7 +131,7 @@ function parseIP(target: string): SubchannelAddress[] | null { } else { port = DEFAULT_PORT; } - return [{host: addr, port: +port}]; + return [{ host: addr, port: +port }]; } /** @@ -223,8 +223,9 @@ class DnsResolver implements Resolver { this.pendingResultPromise.then( ([addressList, txtRecord]) => { this.pendingResultPromise = null; - const ip4Addresses: dns.LookupAddress[] = addressList - .filter(addr => addr.family === 4); + const ip4Addresses: dns.LookupAddress[] = addressList.filter( + addr => addr.family === 4 + ); let ip6Addresses: dns.LookupAddress[]; if (semver.satisfies(process.version, IPV6_SUPPORT_RANGE)) { ip6Addresses = addressList.filter(addr => addr.family === 6); @@ -234,10 +235,16 @@ class DnsResolver implements Resolver { const allAddresses: SubchannelAddress[] = mergeArrays( ip4Addresses, ip6Addresses - ).map(addr => {return {host: addr.address, port: +this.port!};}); - const allAddressesString: string = '[' + allAddresses.map(addr => addr.host + ':' + addr.port).join(',') + ']'; + ).map(addr => ({ host: addr.address, port: +this.port! })); + const allAddressesString: string = + '[' + + allAddresses.map(addr => addr.host + ':' + addr.port).join(',') + + ']'; trace( - 'Resolved addresses for target ' + this.target + ': ' + allAddressesString + 'Resolved addresses for target ' + + this.target + + ': ' + + allAddressesString ); if (allAddresses.length === 0) { this.listener.onError(this.defaultResolutionError); diff --git a/packages/grpc-js/src/resolver-uds.ts b/packages/grpc-js/src/resolver-uds.ts index 64c628f3..91128d2c 100644 --- a/packages/grpc-js/src/resolver-uds.ts +++ b/packages/grpc-js/src/resolver-uds.ts @@ -37,7 +37,7 @@ function getUdsName(target: string): string { class UdsResolver implements Resolver { private addresses: SubchannelAddress[] = []; constructor(target: string, private listener: ResolverListener) { - this.addresses = [{path: getUdsName(target)}]; + this.addresses = [{ path: getUdsName(target) }]; } updateResolution(): void { process.nextTick( diff --git a/packages/grpc-js/src/server-credentials.ts b/packages/grpc-js/src/server-credentials.ts index b56cb68a..17ab2980 100644 --- a/packages/grpc-js/src/server-credentials.ts +++ b/packages/grpc-js/src/server-credentials.ts @@ -16,7 +16,7 @@ */ import { SecureServerOptions } from 'http2'; -import {CIPHER_SUITES, getDefaultRootsData} from './tls-helpers'; +import { CIPHER_SUITES, getDefaultRootsData } from './tls-helpers'; export interface KeyCertPair { private_key: Buffer; @@ -75,7 +75,7 @@ export abstract class ServerCredentials { cert, key, requestCert: checkClientCertificate, - ciphers: CIPHER_SUITES + ciphers: CIPHER_SUITES, }); } } diff --git a/packages/grpc-js/src/server.ts b/packages/grpc-js/src/server.ts index 03fcfaf9..a2db30be 100644 --- a/packages/grpc-js/src/server.ts +++ b/packages/grpc-js/src/server.ts @@ -203,11 +203,16 @@ export class Server { const options: ListenOptions = { host: url.hostname, port: +url.port }; const serverOptions: http2.ServerOptions = {}; if ('grpc.max_concurrent_streams' in this.options) { - serverOptions.settings = {maxConcurrentStreams: this.options['grpc.max_concurrent_streams']}; + serverOptions.settings = { + maxConcurrentStreams: this.options['grpc.max_concurrent_streams'], + }; } if (creds._isSecure()) { - const secureServerOptions = Object.assign(serverOptions, creds._getSettings()!); + const secureServerOptions = Object.assign( + serverOptions, + creds._getSettings()! + ); this.http2Server = http2.createSecureServer(secureServerOptions); } else { this.http2Server = http2.createServer(serverOptions); diff --git a/packages/grpc-js/src/subchannel-pool.ts b/packages/grpc-js/src/subchannel-pool.ts index 3a49295b..61a4e13c 100644 --- a/packages/grpc-js/src/subchannel-pool.ts +++ b/packages/grpc-js/src/subchannel-pool.ts @@ -16,7 +16,11 @@ */ import { ChannelOptions, channelOptionsEqual } from './channel-options'; -import { Subchannel, SubchannelAddress, subchannelAddressEqual } from './subchannel'; +import { + Subchannel, + SubchannelAddress, + subchannelAddressEqual, +} from './subchannel'; import { ChannelCredentials } from './channel-credentials'; // 10 seconds in milliseconds. This value is arbitrary. @@ -72,8 +76,8 @@ export class SubchannelPool { } /* For each subchannel in the pool, try to unref it if it has - * exactly one ref (which is the ref from the pool itself). If that - * does happen, remove the subchannel from the pool */ + * exactly one ref (which is the ref from the pool itself). If that + * does happen, remove the subchannel from the pool */ this.pool[channelTarget] = refedSubchannels; } /* Currently we do not delete keys with empty values. If that results @@ -120,7 +124,10 @@ export class SubchannelPool { const subchannelObjArray = this.pool[channelTarget]; for (const subchannelObj of subchannelObjArray) { if ( - subchannelAddressEqual(subchannelTarget, subchannelObj.subchannelAddress) && + subchannelAddressEqual( + subchannelTarget, + subchannelObj.subchannelAddress + ) && channelOptionsEqual( channelArguments, subchannelObj.channelArguments diff --git a/packages/grpc-js/src/subchannel.ts b/packages/grpc-js/src/subchannel.ts index 2a123f04..ae6f206b 100644 --- a/packages/grpc-js/src/subchannel.ts +++ b/packages/grpc-js/src/subchannel.ts @@ -86,8 +86,15 @@ export interface SubchannelAddress { path?: string; } -export function subchannelAddressEqual(address1: SubchannelAddress, address2: SubchannelAddress) : boolean { - return address1.port === address2.port && address1.host === address2.host && address1.path === address2.path; +export function subchannelAddressEqual( + address1: SubchannelAddress, + address2: SubchannelAddress +): boolean { + return ( + address1.port === address2.port && + address1.host === address2.host && + address1.path === address2.path + ); } export class Subchannel { @@ -194,7 +201,7 @@ export class Subchannel { clearTimeout(this.keepaliveTimeoutId); const backoffOptions: BackoffOptions = { initialDelay: options['grpc.initial_reconnect_backoff_ms'], - maxDelay: options['grpc.max_reconnect_backoff_ms'] + maxDelay: options['grpc.max_reconnect_backoff_ms'], }; this.backoffTimeout = new BackoffTimeout(() => { if (this.continueConnecting) { @@ -276,7 +283,10 @@ export class Subchannel { connectionOptions.servername = getDefaultAuthority(this.channelTarget); } } - connectionOptions = Object.assign(connectionOptions, this.subchannelAddress); + connectionOptions = Object.assign( + connectionOptions, + this.subchannelAddress + ); /* http2.connect uses the options here: * https://github.com/nodejs/node/blob/70c32a6d190e2b5d7b9ff9d5b6a459d14e8b7d59/lib/internal/http2/core.js#L3028-L3036 * The spread operator overides earlier values with later ones, so any port diff --git a/packages/grpc-js/src/tls-helpers.ts b/packages/grpc-js/src/tls-helpers.ts index 161666ed..3f7a62e7 100644 --- a/packages/grpc-js/src/tls-helpers.ts +++ b/packages/grpc-js/src/tls-helpers.ts @@ -17,7 +17,8 @@ import * as fs from 'fs'; -export const CIPHER_SUITES: string | undefined = process.env.GRPC_SSL_CIPHER_SUITES; +export const CIPHER_SUITES: string | undefined = + process.env.GRPC_SSL_CIPHER_SUITES; const DEFAULT_ROOTS_FILE_PATH = process.env.GRPC_DEFAULT_SSL_ROOTS_FILE_PATH; @@ -31,4 +32,4 @@ export function getDefaultRootsData(): Buffer | null { return defaultRootsData; } return null; -} \ No newline at end of file +} diff --git a/packages/grpc-js/test/test-resolver.ts b/packages/grpc-js/test/test-resolver.ts index fc158510..38ed5069 100644 --- a/packages/grpc-js/test/test-resolver.ts +++ b/packages/grpc-js/test/test-resolver.ts @@ -38,7 +38,11 @@ describe('Name Resolver', () => { serviceConfig: ServiceConfig | null, serviceConfigError: StatusObject | null ) => { - assert(addressList.some(addr => addr.host === '127.0.0.1' && addr.port === 50051)); + assert( + addressList.some( + addr => addr.host === '127.0.0.1' && addr.port === 50051 + ) + ); // We would check for the IPv6 address but it needs to be omitted on some Node versions done(); }, @@ -57,7 +61,11 @@ describe('Name Resolver', () => { serviceConfig: ServiceConfig | null, serviceConfigError: StatusObject | null ) => { - assert(addressList.some(addr => addr.host === '127.0.0.1' && addr.port === 443)); + assert( + addressList.some( + addr => addr.host === '127.0.0.1' && addr.port === 443 + ) + ); // We would check for the IPv6 address but it needs to be omitted on some Node versions done(); }, @@ -76,7 +84,11 @@ describe('Name Resolver', () => { serviceConfig: ServiceConfig | null, serviceConfigError: StatusObject | null ) => { - assert(addressList.some(addr => addr.host === '1.2.3.4' && addr.port === 443)); + assert( + addressList.some( + addr => addr.host === '1.2.3.4' && addr.port === 443 + ) + ); // We would check for the IPv6 address but it needs to be omitted on some Node versions done(); }, @@ -95,7 +107,9 @@ describe('Name Resolver', () => { serviceConfig: ServiceConfig | null, serviceConfigError: StatusObject | null ) => { - assert(addressList.some(addr => addr.host === '::1' && addr.port === 443)); + assert( + addressList.some(addr => addr.host === '::1' && addr.port === 443) + ); // We would check for the IPv6 address but it needs to be omitted on some Node versions done(); }, @@ -114,7 +128,9 @@ describe('Name Resolver', () => { serviceConfig: ServiceConfig | null, serviceConfigError: StatusObject | null ) => { - assert(addressList.some(addr => addr.host === '::1' && addr.port === 50051)); + assert( + addressList.some(addr => addr.host === '::1' && addr.port === 50051) + ); // We would check for the IPv6 address but it needs to be omitted on some Node versions done(); }, @@ -223,7 +239,7 @@ describe('Name Resolver', () => { serviceConfig: ServiceConfig | null, serviceConfigError: StatusObject | null ) => { - assert(addressList.some(addr => addr.path = 'socket')); + assert(addressList.some(addr => (addr.path = 'socket'))); done(); }, onError: (error: StatusObject) => { @@ -241,7 +257,7 @@ describe('Name Resolver', () => { serviceConfig: ServiceConfig | null, serviceConfigError: StatusObject | null ) => { - assert(addressList.some(addr => addr.path = '/tmp/socket')); + assert(addressList.some(addr => (addr.path = '/tmp/socket'))); done(); }, onError: (error: StatusObject) => { From 4f55a83b670c10507d73fb3d81efd65fc1028310 Mon Sep 17 00:00:00 2001 From: murgatroid99 Date: Wed, 29 Jan 2020 10:21:47 -0800 Subject: [PATCH 17/28] Remove extraneous line of code --- packages/grpc-js/src/subchannel.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/grpc-js/src/subchannel.ts b/packages/grpc-js/src/subchannel.ts index ae6f206b..b03205c7 100644 --- a/packages/grpc-js/src/subchannel.ts +++ b/packages/grpc-js/src/subchannel.ts @@ -263,7 +263,6 @@ export class Subchannel { this.credentials._getConnectionOptions() || {}; let addressScheme = 'http://'; if ('secureContext' in connectionOptions) { - connectionOptions.protocol = 'https:'; addressScheme = 'https://'; // If provided, the value of grpc.ssl_target_name_override should be used // to override the target hostname when checking server identity. From 1fe6432d92d21459cc5699c4c305aff227f59b1f Mon Sep 17 00:00:00 2001 From: murgatroid99 Date: Wed, 29 Jan 2020 16:50:29 -0800 Subject: [PATCH 18/28] Differentiate more strongly between TCP and IPC addresses --- packages/grpc-js/src/resolver-dns.ts | 4 +-- packages/grpc-js/src/subchannel.ts | 44 +++++++++++++++++++------- packages/grpc-js/test/test-resolver.ts | 44 +++++++++++++++++++++----- 3 files changed, 71 insertions(+), 21 deletions(-) diff --git a/packages/grpc-js/src/resolver-dns.ts b/packages/grpc-js/src/resolver-dns.ts index a5cd028a..6885f351 100644 --- a/packages/grpc-js/src/resolver-dns.ts +++ b/packages/grpc-js/src/resolver-dns.ts @@ -30,7 +30,7 @@ import { StatusObject } from './call-stream'; import { Metadata } from './metadata'; import * as logging from './logging'; import { LogVerbosity } from './constants'; -import { SubchannelAddress } from './subchannel'; +import { SubchannelAddress, TcpSubchannelAddress } from './subchannel'; const TRACER_NAME = 'dns_resolver'; @@ -232,7 +232,7 @@ class DnsResolver implements Resolver { } else { ip6Addresses = []; } - const allAddresses: SubchannelAddress[] = mergeArrays( + const allAddresses: TcpSubchannelAddress[] = mergeArrays( ip4Addresses, ip6Addresses ).map(addr => ({ host: addr.address, port: +this.port! })); diff --git a/packages/grpc-js/src/subchannel.ts b/packages/grpc-js/src/subchannel.ts index b03205c7..06f26892 100644 --- a/packages/grpc-js/src/subchannel.ts +++ b/packages/grpc-js/src/subchannel.ts @@ -26,7 +26,7 @@ import { BackoffTimeout, BackoffOptions } from './backoff-timeout'; import { getDefaultAuthority } from './resolver'; import * as logging from './logging'; import { LogVerbosity } from './constants'; -import { SocketConnectOpts } from 'net'; +import * as net from 'net'; const { version: clientVersion } = require('../../package.json'); @@ -74,27 +74,42 @@ function uniformRandom(min: number, max: number) { const tooManyPingsData: Buffer = Buffer.from('too_many_pings', 'ascii'); +export interface TcpSubchannelAddress { + port: number; + host: string; +} + +export interface IpcSubchannelAddress { + path: string; +} + /** * This represents a single backend address to connect to. This interface is a * subset of net.SocketConnectOpts, i.e. the options described at * https://nodejs.org/api/net.html#net_socket_connect_options_connectlistener. * Those are in turn a subset of the options that can be passed to http2.connect. */ -export interface SubchannelAddress { - port?: number; - host?: string; - path?: string; +export type SubchannelAddress = TcpSubchannelAddress | IpcSubchannelAddress; + +export function isTcpSubchannelAddress( + address: SubchannelAddress +): address is TcpSubchannelAddress { + return 'port' in address; } export function subchannelAddressEqual( address1: SubchannelAddress, address2: SubchannelAddress ): boolean { - return ( - address1.port === address2.port && - address1.host === address2.host && - address1.path === address2.path - ); + if (isTcpSubchannelAddress(address1)) { + return ( + isTcpSubchannelAddress(address2) && + address1.host === address2.host && + address1.port === address2.port + ); + } else { + return !isTcpSubchannelAddress(address2) && address1.path === address2.path; + } } export class Subchannel { @@ -216,7 +231,7 @@ export class Subchannel { ); } }, backoffOptions); - if (subchannelAddress.host || subchannelAddress.port) { + if (isTcpSubchannelAddress(subchannelAddress)) { this.subchannelAddressString = `${subchannelAddress.host}:${subchannelAddress.port}`; } else { this.subchannelAddressString = `${subchannelAddress.path}`; @@ -281,6 +296,13 @@ export class Subchannel { } else { connectionOptions.servername = getDefaultAuthority(this.channelTarget); } + } else { + connectionOptions.createConnection = (authority, option) => { + /* net.NetConnectOpts is declared in a way that is more restrictive + * than what net.connect will actually accept, so we use the type + * assertion to work around that. */ + return net.connect(this.subchannelAddress as net.NetConnectOpts); + }; } connectionOptions = Object.assign( connectionOptions, diff --git a/packages/grpc-js/test/test-resolver.ts b/packages/grpc-js/test/test-resolver.ts index 38ed5069..ebb4d567 100644 --- a/packages/grpc-js/test/test-resolver.ts +++ b/packages/grpc-js/test/test-resolver.ts @@ -21,7 +21,7 @@ import * as assert from 'assert'; import * as resolverManager from '../src/resolver'; import { ServiceConfig } from '../src/service-config'; import { StatusObject } from '../src/call-stream'; -import { SubchannelAddress } from '../src/subchannel'; +import { SubchannelAddress, isTcpSubchannelAddress } from '../src/subchannel'; describe('Name Resolver', () => { describe('DNS Names', function() { @@ -40,7 +40,10 @@ describe('Name Resolver', () => { ) => { assert( addressList.some( - addr => addr.host === '127.0.0.1' && addr.port === 50051 + addr => + isTcpSubchannelAddress(addr) && + addr.host === '127.0.0.1' && + addr.port === 50051 ) ); // We would check for the IPv6 address but it needs to be omitted on some Node versions @@ -63,7 +66,10 @@ describe('Name Resolver', () => { ) => { assert( addressList.some( - addr => addr.host === '127.0.0.1' && addr.port === 443 + addr => + isTcpSubchannelAddress(addr) && + addr.host === '127.0.0.1' && + addr.port === 443 ) ); // We would check for the IPv6 address but it needs to be omitted on some Node versions @@ -86,7 +92,10 @@ describe('Name Resolver', () => { ) => { assert( addressList.some( - addr => addr.host === '1.2.3.4' && addr.port === 443 + addr => + isTcpSubchannelAddress(addr) && + addr.host === '1.2.3.4' && + addr.port === 443 ) ); // We would check for the IPv6 address but it needs to be omitted on some Node versions @@ -108,7 +117,12 @@ describe('Name Resolver', () => { serviceConfigError: StatusObject | null ) => { assert( - addressList.some(addr => addr.host === '::1' && addr.port === 443) + addressList.some( + addr => + isTcpSubchannelAddress(addr) && + addr.host === '::1' && + addr.port === 443 + ) ); // We would check for the IPv6 address but it needs to be omitted on some Node versions done(); @@ -129,7 +143,12 @@ describe('Name Resolver', () => { serviceConfigError: StatusObject | null ) => { assert( - addressList.some(addr => addr.host === '::1' && addr.port === 50051) + addressList.some( + addr => + isTcpSubchannelAddress(addr) && + addr.host === '::1' && + addr.port === 50051 + ) ); // We would check for the IPv6 address but it needs to be omitted on some Node versions done(); @@ -239,7 +258,11 @@ describe('Name Resolver', () => { serviceConfig: ServiceConfig | null, serviceConfigError: StatusObject | null ) => { - assert(addressList.some(addr => (addr.path = 'socket'))); + assert( + addressList.some( + addr => !isTcpSubchannelAddress(addr) && addr.path === 'socket' + ) + ); done(); }, onError: (error: StatusObject) => { @@ -257,7 +280,12 @@ describe('Name Resolver', () => { serviceConfig: ServiceConfig | null, serviceConfigError: StatusObject | null ) => { - assert(addressList.some(addr => (addr.path = '/tmp/socket'))); + assert( + addressList.some( + addr => + !isTcpSubchannelAddress(addr) && addr.path === '/tmp/socket' + ) + ); done(); }, onError: (error: StatusObject) => { From 0995c9b0e6ad4c9feb459d4e8b76241333a1e919 Mon Sep 17 00:00:00 2001 From: murgatroid99 Date: Wed, 29 Jan 2020 16:56:05 -0800 Subject: [PATCH 19/28] Update comment with new information --- packages/grpc-js/src/subchannel.ts | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/packages/grpc-js/src/subchannel.ts b/packages/grpc-js/src/subchannel.ts index 06f26892..bb64bd93 100644 --- a/packages/grpc-js/src/subchannel.ts +++ b/packages/grpc-js/src/subchannel.ts @@ -297,6 +297,9 @@ export class Subchannel { connectionOptions.servername = getDefaultAuthority(this.channelTarget); } } else { + /* In all but the most recent versions of Node, http2.connect does not use + * the options when establishing plaintext connections, so we need to + * establish that connection explicitly. */ connectionOptions.createConnection = (authority, option) => { /* net.NetConnectOpts is declared in a way that is more restrictive * than what net.connect will actually accept, so we use the type @@ -316,7 +319,12 @@ export class Subchannel { * as documented for plaintext connections here: * https://nodejs.org/api/net.html#net_socket_connect_options_connectlistener * and for TLS connections here: - * https://nodejs.org/api/tls.html#tls_tls_connect_options_callback. + * https://nodejs.org/api/tls.html#tls_tls_connect_options_callback. In + * earlier versions of Node, http2.connect passes these options to + * tls.connect but not net.connect, so in the insecure case we still need + * to set the createConnection option above to create the connection + * explicitly. We cannot do that in the TLS case because http2.connect + * passes necessary additional options to tls.connect. * The first argument just needs to be parseable as a URL and the scheme * determines whether the connection will be established over TLS or not. */ From 630897244e7f7407c617955f9d0e1f28fb6ea69c Mon Sep 17 00:00:00 2001 From: murgatroid99 Date: Mon, 3 Feb 2020 10:44:58 -0800 Subject: [PATCH 20/28] grpc-js: Destroy http2 stream when a call ends in any way --- packages/grpc-js/src/call-stream.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/grpc-js/src/call-stream.ts b/packages/grpc-js/src/call-stream.ts index c1e9b3b5..ee21d19f 100644 --- a/packages/grpc-js/src/call-stream.ts +++ b/packages/grpc-js/src/call-stream.ts @@ -163,6 +163,9 @@ export class Http2CallStream extends Duplex implements Call { * @param status The status of the call. */ private endCall(status: StatusObject): void { + /* Once endCall is called, we are definitely not using the http2 stream + * anymore, so we can always safely destroy it here */ + this.destroyHttp2Stream(); if (this.finalStatus === null) { this.trace( 'ended with status: code=' + From 4bc642456b5966bbe85f997dea0e662ccbb8fa5f Mon Sep 17 00:00:00 2001 From: murgatroid99 Date: Mon, 3 Feb 2020 11:14:03 -0800 Subject: [PATCH 21/28] grpc-js: Improve tracing around sending data --- packages/grpc-js/src/call-stream.ts | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/packages/grpc-js/src/call-stream.ts b/packages/grpc-js/src/call-stream.ts index c1e9b3b5..02b7f343 100644 --- a/packages/grpc-js/src/call-stream.ts +++ b/packages/grpc-js/src/call-stream.ts @@ -246,9 +246,7 @@ export class Http2CallStream extends Duplex implements Call { private tryPush(messageBytes: Buffer | null): void { if (this.isReadFilterPending) { this.trace( - '[' + - this.callNumber + - '] unfilteredReadMessages.push message of length ' + + 'unfilteredReadMessages.push message of length ' + (messageBytes && messageBytes.length) ); this.unfilteredReadMessages.push(messageBytes); @@ -422,10 +420,15 @@ export class Http2CallStream extends Duplex implements Call { if (!this.pendingWriteCallback) { throw new Error('Invalid state in write handling code'); } + this.trace( + 'sending data chunk of length ' + + this.pendingWrite.length + + ' (deferred)' + ); stream.write(this.pendingWrite, this.pendingWriteCallback); } if (this.pendingFinalCallback) { - this.trace('calling end() on HTTP/2 stream'); + this.trace('calling end() on HTTP/2 stream (deferred)'); stream.end(this.pendingFinalCallback); } } @@ -514,9 +517,13 @@ export class Http2CallStream extends Duplex implements Call { this.trace('write() called with message of length ' + chunk.message.length); this.filterStack.sendMessage(Promise.resolve(chunk)).then(message => { if (this.http2Stream === null) { + this.trace( + 'deferring writing data chunk of length ' + message.message.length + ); this.pendingWrite = message.message; this.pendingWriteCallback = cb; } else { + this.trace('sending data chunk of length ' + message.message.length); this.http2Stream.write(message.message, cb); } }, this.handleFilterError.bind(this)); @@ -525,6 +532,7 @@ export class Http2CallStream extends Duplex implements Call { _final(cb: Function) { this.trace('end() called'); if (this.http2Stream === null) { + this.trace('deferring calling end() on HTTP/2 stream'); this.pendingFinalCallback = cb; } else { this.trace('calling end() on HTTP/2 stream'); From f0e19f1d0d5adef73660bfd840509c5c6eaa0d47 Mon Sep 17 00:00:00 2001 From: murgatroid99 Date: Tue, 4 Feb 2020 10:12:33 -0800 Subject: [PATCH 22/28] grpc-js: Different handling for errors when starting streams --- packages/grpc-js/src/channel.ts | 29 ++++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/packages/grpc-js/src/channel.ts b/packages/grpc-js/src/channel.ts index 6cf987cb..96c1dda7 100644 --- a/packages/grpc-js/src/channel.ts +++ b/packages/grpc-js/src/channel.ts @@ -142,7 +142,9 @@ export class ChannelImplementation implements Channel { ) { /* The global boolean parameter to getSubchannelPool has the inverse meaning to what * the grpc.use_local_subchannel_pool channel option means. */ - this.subchannelPool = getSubchannelPool((options['grpc.use_local_subchannel_pool'] ?? 0) === 0); + this.subchannelPool = getSubchannelPool( + (options['grpc.use_local_subchannel_pool'] ?? 0) === 0 + ); const channelControlHelper: ChannelControlHelper = { createSubchannel: ( subchannelAddress: string, @@ -234,16 +236,25 @@ export class ChannelImplementation implements Channel { callStream ); } catch (error) { - callStream.cancelWithStatus( - Status.UNAVAILABLE, - 'Failed to start call on picked subchannel' - ); + /* An error here indicates thaat something when wrong with + * the picked subchannel's http2 stream right before we + * tried to start the stream. We are handling a promise + * result here, so this asynchronous with respect to the + * original tryPick call, so calling it again is not + * recursive. We call tryPick immediately instead of + * queueing this pick again because handling the queue is + * triggered by state changes, and we want to immediately + * check if the state has already changed since the + * previous tryPick call. We do this instead of cancelling + * the stream because the correct behavior may be + * re-queueing instead, based on the logic in the rest of + * tryPick */ + this.tryPick(callStream, callMetadata); } } else { - callStream.cancelWithStatus( - Status.UNAVAILABLE, - 'Connection dropped while starting call' - ); + /* The logic for doing this here is the same as in the catch + * block above */ + this.tryPick(callStream, callMetadata); } }, (error: Error & { code: number }) => { From 3bba39178b979288cbe35be7b15dbf9ad35ada4d Mon Sep 17 00:00:00 2001 From: murgatroid99 Date: Tue, 4 Feb 2020 10:18:00 -0800 Subject: [PATCH 23/28] Update grpc-js to 0.6.16 --- packages/grpc-js/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/grpc-js/package.json b/packages/grpc-js/package.json index 0a4ec9dd..dfa8d483 100644 --- a/packages/grpc-js/package.json +++ b/packages/grpc-js/package.json @@ -1,6 +1,6 @@ { "name": "@grpc/grpc-js", - "version": "0.6.15", + "version": "0.6.16", "description": "gRPC Library for Node - pure JS implementation", "homepage": "https://grpc.io/", "repository": "https://github.com/grpc/grpc-node/tree/master/packages/grpc-js", From 07fbfa0ac9b69b37cecfbe1a3f167c556641e944 Mon Sep 17 00:00:00 2001 From: murgatroid99 Date: Tue, 4 Feb 2020 10:41:01 -0800 Subject: [PATCH 24/28] Fix comment typos --- packages/grpc-js/src/channel.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/grpc-js/src/channel.ts b/packages/grpc-js/src/channel.ts index 96c1dda7..4d4fb551 100644 --- a/packages/grpc-js/src/channel.ts +++ b/packages/grpc-js/src/channel.ts @@ -236,10 +236,10 @@ export class ChannelImplementation implements Channel { callStream ); } catch (error) { - /* An error here indicates thaat something when wrong with + /* An error here indicates that something went wrong with * the picked subchannel's http2 stream right before we * tried to start the stream. We are handling a promise - * result here, so this asynchronous with respect to the + * result here, so this is asynchronous with respect to the * original tryPick call, so calling it again is not * recursive. We call tryPick immediately instead of * queueing this pick again because handling the queue is From fea6f3dd0b1ba0be305e318d6c9e657e0bf51ace Mon Sep 17 00:00:00 2001 From: murgatroid99 Date: Tue, 4 Feb 2020 15:57:29 -0800 Subject: [PATCH 25/28] Add build script and configs for Kokoro MacOS parallel build --- .../artifacts/build_one_artifact_macos.sh | 56 +++++++++++++++++++ .../kokoro/macos/electron_1.0_ia32.cfg | 35 ++++++++++++ .../release/kokoro/macos/electron_1.0_x64.cfg | 35 ++++++++++++ .../kokoro/macos/electron_1.1_ia32.cfg | 35 ++++++++++++ .../release/kokoro/macos/electron_1.1_x64.cfg | 35 ++++++++++++ .../kokoro/macos/electron_1.2_ia32.cfg | 35 ++++++++++++ .../release/kokoro/macos/electron_1.2_x64.cfg | 35 ++++++++++++ .../kokoro/macos/electron_1.3_ia32.cfg | 35 ++++++++++++ .../release/kokoro/macos/electron_1.3_x64.cfg | 35 ++++++++++++ .../kokoro/macos/electron_1.4_ia32.cfg | 35 ++++++++++++ .../release/kokoro/macos/electron_1.4_x64.cfg | 35 ++++++++++++ .../kokoro/macos/electron_1.5_ia32.cfg | 35 ++++++++++++ .../release/kokoro/macos/electron_1.5_x64.cfg | 35 ++++++++++++ .../kokoro/macos/electron_1.6_ia32.cfg | 35 ++++++++++++ .../release/kokoro/macos/electron_1.6_x64.cfg | 35 ++++++++++++ .../kokoro/macos/electron_1.7_ia32.cfg | 35 ++++++++++++ .../release/kokoro/macos/electron_1.7_x64.cfg | 35 ++++++++++++ .../kokoro/macos/electron_1.8_ia32.cfg | 35 ++++++++++++ .../release/kokoro/macos/electron_1.8_x64.cfg | 35 ++++++++++++ .../kokoro/macos/electron_2.0_ia32.cfg | 35 ++++++++++++ .../release/kokoro/macos/electron_2.0_x64.cfg | 35 ++++++++++++ .../kokoro/macos/electron_3.0_ia32.cfg | 35 ++++++++++++ .../release/kokoro/macos/electron_3.0_x64.cfg | 35 ++++++++++++ .../kokoro/macos/electron_3.1_ia32.cfg | 35 ++++++++++++ .../release/kokoro/macos/electron_3.1_x64.cfg | 35 ++++++++++++ .../kokoro/macos/electron_4.1_ia32.cfg | 35 ++++++++++++ .../release/kokoro/macos/electron_4.1_x64.cfg | 35 ++++++++++++ .../kokoro/macos/electron_4.2_ia32.cfg | 35 ++++++++++++ .../release/kokoro/macos/electron_4.2_x64.cfg | 35 ++++++++++++ .../kokoro/macos/electron_5.0_ia32.cfg | 35 ++++++++++++ .../release/kokoro/macos/electron_5.0_x64.cfg | 35 ++++++++++++ .../kokoro/macos/electron_6.0_ia32.cfg | 35 ++++++++++++ .../release/kokoro/macos/electron_6.0_x64.cfg | 35 ++++++++++++ .../kokoro/macos/electron_6.1_ia32.cfg | 35 ++++++++++++ .../release/kokoro/macos/electron_6.1_x64.cfg | 35 ++++++++++++ .../kokoro/macos/electron_7.0_ia32.cfg | 35 ++++++++++++ .../release/kokoro/macos/electron_7.0_x64.cfg | 35 ++++++++++++ .../kokoro/macos/electron_7.1_ia32.cfg | 35 ++++++++++++ .../release/kokoro/macos/electron_7.1_x64.cfg | 35 ++++++++++++ tools/release/kokoro/macos/node_10_ia32.cfg | 35 ++++++++++++ tools/release/kokoro/macos/node_10_x64.cfg | 35 ++++++++++++ tools/release/kokoro/macos/node_11_ia32.cfg | 35 ++++++++++++ tools/release/kokoro/macos/node_11_x64.cfg | 35 ++++++++++++ tools/release/kokoro/macos/node_12_ia32.cfg | 35 ++++++++++++ tools/release/kokoro/macos/node_12_x64.cfg | 35 ++++++++++++ tools/release/kokoro/macos/node_13_ia32.cfg | 35 ++++++++++++ tools/release/kokoro/macos/node_13_x64.cfg | 35 ++++++++++++ tools/release/kokoro/macos/node_4_ia32.cfg | 35 ++++++++++++ tools/release/kokoro/macos/node_4_x64.cfg | 35 ++++++++++++ tools/release/kokoro/macos/node_5_ia32.cfg | 35 ++++++++++++ tools/release/kokoro/macos/node_5_x64.cfg | 35 ++++++++++++ tools/release/kokoro/macos/node_6_ia32.cfg | 35 ++++++++++++ tools/release/kokoro/macos/node_6_x64.cfg | 35 ++++++++++++ tools/release/kokoro/macos/node_7_ia32.cfg | 35 ++++++++++++ tools/release/kokoro/macos/node_7_x64.cfg | 35 ++++++++++++ tools/release/kokoro/macos/node_8_ia32.cfg | 35 ++++++++++++ tools/release/kokoro/macos/node_8_x64.cfg | 35 ++++++++++++ tools/release/kokoro/macos/node_9_ia32.cfg | 35 ++++++++++++ tools/release/kokoro/macos/node_9_x64.cfg | 35 ++++++++++++ 59 files changed, 2086 insertions(+) create mode 100755 packages/grpc-native-core/tools/run_tests/artifacts/build_one_artifact_macos.sh create mode 100644 tools/release/kokoro/macos/electron_1.0_ia32.cfg create mode 100644 tools/release/kokoro/macos/electron_1.0_x64.cfg create mode 100644 tools/release/kokoro/macos/electron_1.1_ia32.cfg create mode 100644 tools/release/kokoro/macos/electron_1.1_x64.cfg create mode 100644 tools/release/kokoro/macos/electron_1.2_ia32.cfg create mode 100644 tools/release/kokoro/macos/electron_1.2_x64.cfg create mode 100644 tools/release/kokoro/macos/electron_1.3_ia32.cfg create mode 100644 tools/release/kokoro/macos/electron_1.3_x64.cfg create mode 100644 tools/release/kokoro/macos/electron_1.4_ia32.cfg create mode 100644 tools/release/kokoro/macos/electron_1.4_x64.cfg create mode 100644 tools/release/kokoro/macos/electron_1.5_ia32.cfg create mode 100644 tools/release/kokoro/macos/electron_1.5_x64.cfg create mode 100644 tools/release/kokoro/macos/electron_1.6_ia32.cfg create mode 100644 tools/release/kokoro/macos/electron_1.6_x64.cfg create mode 100644 tools/release/kokoro/macos/electron_1.7_ia32.cfg create mode 100644 tools/release/kokoro/macos/electron_1.7_x64.cfg create mode 100644 tools/release/kokoro/macos/electron_1.8_ia32.cfg create mode 100644 tools/release/kokoro/macos/electron_1.8_x64.cfg create mode 100644 tools/release/kokoro/macos/electron_2.0_ia32.cfg create mode 100644 tools/release/kokoro/macos/electron_2.0_x64.cfg create mode 100644 tools/release/kokoro/macos/electron_3.0_ia32.cfg create mode 100644 tools/release/kokoro/macos/electron_3.0_x64.cfg create mode 100644 tools/release/kokoro/macos/electron_3.1_ia32.cfg create mode 100644 tools/release/kokoro/macos/electron_3.1_x64.cfg create mode 100644 tools/release/kokoro/macos/electron_4.1_ia32.cfg create mode 100644 tools/release/kokoro/macos/electron_4.1_x64.cfg create mode 100644 tools/release/kokoro/macos/electron_4.2_ia32.cfg create mode 100644 tools/release/kokoro/macos/electron_4.2_x64.cfg create mode 100644 tools/release/kokoro/macos/electron_5.0_ia32.cfg create mode 100644 tools/release/kokoro/macos/electron_5.0_x64.cfg create mode 100644 tools/release/kokoro/macos/electron_6.0_ia32.cfg create mode 100644 tools/release/kokoro/macos/electron_6.0_x64.cfg create mode 100644 tools/release/kokoro/macos/electron_6.1_ia32.cfg create mode 100644 tools/release/kokoro/macos/electron_6.1_x64.cfg create mode 100644 tools/release/kokoro/macos/electron_7.0_ia32.cfg create mode 100644 tools/release/kokoro/macos/electron_7.0_x64.cfg create mode 100644 tools/release/kokoro/macos/electron_7.1_ia32.cfg create mode 100644 tools/release/kokoro/macos/electron_7.1_x64.cfg create mode 100644 tools/release/kokoro/macos/node_10_ia32.cfg create mode 100644 tools/release/kokoro/macos/node_10_x64.cfg create mode 100644 tools/release/kokoro/macos/node_11_ia32.cfg create mode 100644 tools/release/kokoro/macos/node_11_x64.cfg create mode 100644 tools/release/kokoro/macos/node_12_ia32.cfg create mode 100644 tools/release/kokoro/macos/node_12_x64.cfg create mode 100644 tools/release/kokoro/macos/node_13_ia32.cfg create mode 100644 tools/release/kokoro/macos/node_13_x64.cfg create mode 100644 tools/release/kokoro/macos/node_4_ia32.cfg create mode 100644 tools/release/kokoro/macos/node_4_x64.cfg create mode 100644 tools/release/kokoro/macos/node_5_ia32.cfg create mode 100644 tools/release/kokoro/macos/node_5_x64.cfg create mode 100644 tools/release/kokoro/macos/node_6_ia32.cfg create mode 100644 tools/release/kokoro/macos/node_6_x64.cfg create mode 100644 tools/release/kokoro/macos/node_7_ia32.cfg create mode 100644 tools/release/kokoro/macos/node_7_x64.cfg create mode 100644 tools/release/kokoro/macos/node_8_ia32.cfg create mode 100644 tools/release/kokoro/macos/node_8_x64.cfg create mode 100644 tools/release/kokoro/macos/node_9_ia32.cfg create mode 100644 tools/release/kokoro/macos/node_9_x64.cfg diff --git a/packages/grpc-native-core/tools/run_tests/artifacts/build_one_artifact_macos.sh b/packages/grpc-native-core/tools/run_tests/artifacts/build_one_artifact_macos.sh new file mode 100755 index 00000000..dbfd2a9c --- /dev/null +++ b/packages/grpc-native-core/tools/run_tests/artifacts/build_one_artifact_macos.sh @@ -0,0 +1,56 @@ +#!/bin/bash +# Copyright 2020 gRPC authors. +# +# 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. + +curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.11/install.sh | bash +export NVM_DIR="$HOME/.nvm" +[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" + +nvm install 10 +nvm use 10 +npm install -g npm +# https://github.com/mapbox/node-pre-gyp/issues/362 +npm install -g node-gyp + +set -ex +cd $(dirname $0)/../../../../.. +base_dir=$(pwd) + +cd $base_dir/packages/grpc-native-core + +# Install gRPC and its submodules. +git submodule update --init --recursive + +pip install mako +./tools/buildgen/generate_projects.sh + +export JOBS=8 +export ARTIFACTS_OUT=$base_dir/artifacts + +mkdir -p ${ARTIFACTS_OUT} + +rm -rf build || true + +npm update + +case $RUNTIME in + electron) + HOME=~/.electron-gyp ./node_modules/.bin/node-pre-gyp configure rebuild package --runtime=electron --target=$VERSION --target_arch=$ARCH --disturl=https://atom.io/download/electron + cp -r build/stage/* "${ARTIFACTS_OUT}"/ + ;; + node) + ./node_modules/.bin/node-pre-gyp configure rebuild package --target=$VERSION --target_arch=$ARCH + cp -r build/stage/* "${ARTIFACTS_OUT}"/ + ;; +esac \ No newline at end of file diff --git a/tools/release/kokoro/macos/electron_1.0_ia32.cfg b/tools/release/kokoro/macos/electron_1.0_ia32.cfg new file mode 100644 index 00000000..c14493f1 --- /dev/null +++ b/tools/release/kokoro/macos/electron_1.0_ia32.cfg @@ -0,0 +1,35 @@ +# Copyright 2020 gRPC authors. +# +# 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. + +# Config file for Kokoro (in protobuf text format) + +build_file: "grpc-node/packages/grpc-native-core/tools/run_tests/artifacts/build_one_artifact_macos.sh" +env_vars { + key: "RUNTIME" + value: "electron" +} +env_vars { + key: "ARCH" + value: "ia32" +} +env_vars { + key: "VERSION" + value: "1.0.0" +} +action { + define_artifacts { + regex: "github/grpc-node/artifacts/**", + strip_prefix: "github/grpc-node/artifacts" + } +} diff --git a/tools/release/kokoro/macos/electron_1.0_x64.cfg b/tools/release/kokoro/macos/electron_1.0_x64.cfg new file mode 100644 index 00000000..de01b329 --- /dev/null +++ b/tools/release/kokoro/macos/electron_1.0_x64.cfg @@ -0,0 +1,35 @@ +# Copyright 2020 gRPC authors. +# +# 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. + +# Config file for Kokoro (in protobuf text format) + +build_file: "grpc-node/packages/grpc-native-core/tools/run_tests/artifacts/build_one_artifact_macos.sh" +env_vars { + key: "RUNTIME" + value: "electron" +} +env_vars { + key: "ARCH" + value: "x64" +} +env_vars { + key: "VERSION" + value: "1.0.0" +} +action { + define_artifacts { + regex: "github/grpc-node/artifacts/**", + strip_prefix: "github/grpc-node/artifacts" + } +} diff --git a/tools/release/kokoro/macos/electron_1.1_ia32.cfg b/tools/release/kokoro/macos/electron_1.1_ia32.cfg new file mode 100644 index 00000000..71c370c4 --- /dev/null +++ b/tools/release/kokoro/macos/electron_1.1_ia32.cfg @@ -0,0 +1,35 @@ +# Copyright 2020 gRPC authors. +# +# 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. + +# Config file for Kokoro (in protobuf text format) + +build_file: "grpc-node/packages/grpc-native-core/tools/run_tests/artifacts/build_one_artifact_macos.sh" +env_vars { + key: "RUNTIME" + value: "electron" +} +env_vars { + key: "ARCH" + value: "ia32" +} +env_vars { + key: "VERSION" + value: "1.1.0" +} +action { + define_artifacts { + regex: "github/grpc-node/artifacts/**", + strip_prefix: "github/grpc-node/artifacts" + } +} diff --git a/tools/release/kokoro/macos/electron_1.1_x64.cfg b/tools/release/kokoro/macos/electron_1.1_x64.cfg new file mode 100644 index 00000000..10f9a525 --- /dev/null +++ b/tools/release/kokoro/macos/electron_1.1_x64.cfg @@ -0,0 +1,35 @@ +# Copyright 2020 gRPC authors. +# +# 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. + +# Config file for Kokoro (in protobuf text format) + +build_file: "grpc-node/packages/grpc-native-core/tools/run_tests/artifacts/build_one_artifact_macos.sh" +env_vars { + key: "RUNTIME" + value: "electron" +} +env_vars { + key: "ARCH" + value: "x64" +} +env_vars { + key: "VERSION" + value: "1.1.0" +} +action { + define_artifacts { + regex: "github/grpc-node/artifacts/**", + strip_prefix: "github/grpc-node/artifacts" + } +} diff --git a/tools/release/kokoro/macos/electron_1.2_ia32.cfg b/tools/release/kokoro/macos/electron_1.2_ia32.cfg new file mode 100644 index 00000000..3c2136b7 --- /dev/null +++ b/tools/release/kokoro/macos/electron_1.2_ia32.cfg @@ -0,0 +1,35 @@ +# Copyright 2020 gRPC authors. +# +# 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. + +# Config file for Kokoro (in protobuf text format) + +build_file: "grpc-node/packages/grpc-native-core/tools/run_tests/artifacts/build_one_artifact_macos.sh" +env_vars { + key: "RUNTIME" + value: "electron" +} +env_vars { + key: "ARCH" + value: "ia32" +} +env_vars { + key: "VERSION" + value: "1.2.0" +} +action { + define_artifacts { + regex: "github/grpc-node/artifacts/**", + strip_prefix: "github/grpc-node/artifacts" + } +} diff --git a/tools/release/kokoro/macos/electron_1.2_x64.cfg b/tools/release/kokoro/macos/electron_1.2_x64.cfg new file mode 100644 index 00000000..06f2ce56 --- /dev/null +++ b/tools/release/kokoro/macos/electron_1.2_x64.cfg @@ -0,0 +1,35 @@ +# Copyright 2020 gRPC authors. +# +# 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. + +# Config file for Kokoro (in protobuf text format) + +build_file: "grpc-node/packages/grpc-native-core/tools/run_tests/artifacts/build_one_artifact_macos.sh" +env_vars { + key: "RUNTIME" + value: "electron" +} +env_vars { + key: "ARCH" + value: "x64" +} +env_vars { + key: "VERSION" + value: "1.2.0" +} +action { + define_artifacts { + regex: "github/grpc-node/artifacts/**", + strip_prefix: "github/grpc-node/artifacts" + } +} diff --git a/tools/release/kokoro/macos/electron_1.3_ia32.cfg b/tools/release/kokoro/macos/electron_1.3_ia32.cfg new file mode 100644 index 00000000..cdaace0d --- /dev/null +++ b/tools/release/kokoro/macos/electron_1.3_ia32.cfg @@ -0,0 +1,35 @@ +# Copyright 2020 gRPC authors. +# +# 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. + +# Config file for Kokoro (in protobuf text format) + +build_file: "grpc-node/packages/grpc-native-core/tools/run_tests/artifacts/build_one_artifact_macos.sh" +env_vars { + key: "RUNTIME" + value: "electron" +} +env_vars { + key: "ARCH" + value: "ia32" +} +env_vars { + key: "VERSION" + value: "1.3.0" +} +action { + define_artifacts { + regex: "github/grpc-node/artifacts/**", + strip_prefix: "github/grpc-node/artifacts" + } +} diff --git a/tools/release/kokoro/macos/electron_1.3_x64.cfg b/tools/release/kokoro/macos/electron_1.3_x64.cfg new file mode 100644 index 00000000..59241ec3 --- /dev/null +++ b/tools/release/kokoro/macos/electron_1.3_x64.cfg @@ -0,0 +1,35 @@ +# Copyright 2020 gRPC authors. +# +# 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. + +# Config file for Kokoro (in protobuf text format) + +build_file: "grpc-node/packages/grpc-native-core/tools/run_tests/artifacts/build_one_artifact_macos.sh" +env_vars { + key: "RUNTIME" + value: "electron" +} +env_vars { + key: "ARCH" + value: "x64" +} +env_vars { + key: "VERSION" + value: "1.3.0" +} +action { + define_artifacts { + regex: "github/grpc-node/artifacts/**", + strip_prefix: "github/grpc-node/artifacts" + } +} diff --git a/tools/release/kokoro/macos/electron_1.4_ia32.cfg b/tools/release/kokoro/macos/electron_1.4_ia32.cfg new file mode 100644 index 00000000..f4359b6c --- /dev/null +++ b/tools/release/kokoro/macos/electron_1.4_ia32.cfg @@ -0,0 +1,35 @@ +# Copyright 2020 gRPC authors. +# +# 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. + +# Config file for Kokoro (in protobuf text format) + +build_file: "grpc-node/packages/grpc-native-core/tools/run_tests/artifacts/build_one_artifact_macos.sh" +env_vars { + key: "RUNTIME" + value: "electron" +} +env_vars { + key: "ARCH" + value: "ia32" +} +env_vars { + key: "VERSION" + value: "1.4.0" +} +action { + define_artifacts { + regex: "github/grpc-node/artifacts/**", + strip_prefix: "github/grpc-node/artifacts" + } +} diff --git a/tools/release/kokoro/macos/electron_1.4_x64.cfg b/tools/release/kokoro/macos/electron_1.4_x64.cfg new file mode 100644 index 00000000..eadc22a2 --- /dev/null +++ b/tools/release/kokoro/macos/electron_1.4_x64.cfg @@ -0,0 +1,35 @@ +# Copyright 2020 gRPC authors. +# +# 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. + +# Config file for Kokoro (in protobuf text format) + +build_file: "grpc-node/packages/grpc-native-core/tools/run_tests/artifacts/build_one_artifact_macos.sh" +env_vars { + key: "RUNTIME" + value: "electron" +} +env_vars { + key: "ARCH" + value: "x64" +} +env_vars { + key: "VERSION" + value: "1.4.0" +} +action { + define_artifacts { + regex: "github/grpc-node/artifacts/**", + strip_prefix: "github/grpc-node/artifacts" + } +} diff --git a/tools/release/kokoro/macos/electron_1.5_ia32.cfg b/tools/release/kokoro/macos/electron_1.5_ia32.cfg new file mode 100644 index 00000000..e70c18c0 --- /dev/null +++ b/tools/release/kokoro/macos/electron_1.5_ia32.cfg @@ -0,0 +1,35 @@ +# Copyright 2020 gRPC authors. +# +# 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. + +# Config file for Kokoro (in protobuf text format) + +build_file: "grpc-node/packages/grpc-native-core/tools/run_tests/artifacts/build_one_artifact_macos.sh" +env_vars { + key: "RUNTIME" + value: "electron" +} +env_vars { + key: "ARCH" + value: "ia32" +} +env_vars { + key: "VERSION" + value: "1.5.0" +} +action { + define_artifacts { + regex: "github/grpc-node/artifacts/**", + strip_prefix: "github/grpc-node/artifacts" + } +} diff --git a/tools/release/kokoro/macos/electron_1.5_x64.cfg b/tools/release/kokoro/macos/electron_1.5_x64.cfg new file mode 100644 index 00000000..d2382a17 --- /dev/null +++ b/tools/release/kokoro/macos/electron_1.5_x64.cfg @@ -0,0 +1,35 @@ +# Copyright 2020 gRPC authors. +# +# 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. + +# Config file for Kokoro (in protobuf text format) + +build_file: "grpc-node/packages/grpc-native-core/tools/run_tests/artifacts/build_one_artifact_macos.sh" +env_vars { + key: "RUNTIME" + value: "electron" +} +env_vars { + key: "ARCH" + value: "x64" +} +env_vars { + key: "VERSION" + value: "1.5.0" +} +action { + define_artifacts { + regex: "github/grpc-node/artifacts/**", + strip_prefix: "github/grpc-node/artifacts" + } +} diff --git a/tools/release/kokoro/macos/electron_1.6_ia32.cfg b/tools/release/kokoro/macos/electron_1.6_ia32.cfg new file mode 100644 index 00000000..f074428f --- /dev/null +++ b/tools/release/kokoro/macos/electron_1.6_ia32.cfg @@ -0,0 +1,35 @@ +# Copyright 2020 gRPC authors. +# +# 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. + +# Config file for Kokoro (in protobuf text format) + +build_file: "grpc-node/packages/grpc-native-core/tools/run_tests/artifacts/build_one_artifact_macos.sh" +env_vars { + key: "RUNTIME" + value: "electron" +} +env_vars { + key: "ARCH" + value: "ia32" +} +env_vars { + key: "VERSION" + value: "1.6.0" +} +action { + define_artifacts { + regex: "github/grpc-node/artifacts/**", + strip_prefix: "github/grpc-node/artifacts" + } +} diff --git a/tools/release/kokoro/macos/electron_1.6_x64.cfg b/tools/release/kokoro/macos/electron_1.6_x64.cfg new file mode 100644 index 00000000..0c93e0d7 --- /dev/null +++ b/tools/release/kokoro/macos/electron_1.6_x64.cfg @@ -0,0 +1,35 @@ +# Copyright 2020 gRPC authors. +# +# 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. + +# Config file for Kokoro (in protobuf text format) + +build_file: "grpc-node/packages/grpc-native-core/tools/run_tests/artifacts/build_one_artifact_macos.sh" +env_vars { + key: "RUNTIME" + value: "electron" +} +env_vars { + key: "ARCH" + value: "x64" +} +env_vars { + key: "VERSION" + value: "1.6.0" +} +action { + define_artifacts { + regex: "github/grpc-node/artifacts/**", + strip_prefix: "github/grpc-node/artifacts" + } +} diff --git a/tools/release/kokoro/macos/electron_1.7_ia32.cfg b/tools/release/kokoro/macos/electron_1.7_ia32.cfg new file mode 100644 index 00000000..48d53103 --- /dev/null +++ b/tools/release/kokoro/macos/electron_1.7_ia32.cfg @@ -0,0 +1,35 @@ +# Copyright 2020 gRPC authors. +# +# 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. + +# Config file for Kokoro (in protobuf text format) + +build_file: "grpc-node/packages/grpc-native-core/tools/run_tests/artifacts/build_one_artifact_macos.sh" +env_vars { + key: "RUNTIME" + value: "electron" +} +env_vars { + key: "ARCH" + value: "ia32" +} +env_vars { + key: "VERSION" + value: "1.7.0" +} +action { + define_artifacts { + regex: "github/grpc-node/artifacts/**", + strip_prefix: "github/grpc-node/artifacts" + } +} diff --git a/tools/release/kokoro/macos/electron_1.7_x64.cfg b/tools/release/kokoro/macos/electron_1.7_x64.cfg new file mode 100644 index 00000000..bdef8d3f --- /dev/null +++ b/tools/release/kokoro/macos/electron_1.7_x64.cfg @@ -0,0 +1,35 @@ +# Copyright 2020 gRPC authors. +# +# 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. + +# Config file for Kokoro (in protobuf text format) + +build_file: "grpc-node/packages/grpc-native-core/tools/run_tests/artifacts/build_one_artifact_macos.sh" +env_vars { + key: "RUNTIME" + value: "electron" +} +env_vars { + key: "ARCH" + value: "x64" +} +env_vars { + key: "VERSION" + value: "1.7.0" +} +action { + define_artifacts { + regex: "github/grpc-node/artifacts/**", + strip_prefix: "github/grpc-node/artifacts" + } +} diff --git a/tools/release/kokoro/macos/electron_1.8_ia32.cfg b/tools/release/kokoro/macos/electron_1.8_ia32.cfg new file mode 100644 index 00000000..a0455a72 --- /dev/null +++ b/tools/release/kokoro/macos/electron_1.8_ia32.cfg @@ -0,0 +1,35 @@ +# Copyright 2020 gRPC authors. +# +# 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. + +# Config file for Kokoro (in protobuf text format) + +build_file: "grpc-node/packages/grpc-native-core/tools/run_tests/artifacts/build_one_artifact_macos.sh" +env_vars { + key: "RUNTIME" + value: "electron" +} +env_vars { + key: "ARCH" + value: "ia32" +} +env_vars { + key: "VERSION" + value: "1.8.0" +} +action { + define_artifacts { + regex: "github/grpc-node/artifacts/**", + strip_prefix: "github/grpc-node/artifacts" + } +} diff --git a/tools/release/kokoro/macos/electron_1.8_x64.cfg b/tools/release/kokoro/macos/electron_1.8_x64.cfg new file mode 100644 index 00000000..94b3a0cf --- /dev/null +++ b/tools/release/kokoro/macos/electron_1.8_x64.cfg @@ -0,0 +1,35 @@ +# Copyright 2020 gRPC authors. +# +# 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. + +# Config file for Kokoro (in protobuf text format) + +build_file: "grpc-node/packages/grpc-native-core/tools/run_tests/artifacts/build_one_artifact_macos.sh" +env_vars { + key: "RUNTIME" + value: "electron" +} +env_vars { + key: "ARCH" + value: "x64" +} +env_vars { + key: "VERSION" + value: "1.8.0" +} +action { + define_artifacts { + regex: "github/grpc-node/artifacts/**", + strip_prefix: "github/grpc-node/artifacts" + } +} diff --git a/tools/release/kokoro/macos/electron_2.0_ia32.cfg b/tools/release/kokoro/macos/electron_2.0_ia32.cfg new file mode 100644 index 00000000..137d8ec2 --- /dev/null +++ b/tools/release/kokoro/macos/electron_2.0_ia32.cfg @@ -0,0 +1,35 @@ +# Copyright 2020 gRPC authors. +# +# 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. + +# Config file for Kokoro (in protobuf text format) + +build_file: "grpc-node/packages/grpc-native-core/tools/run_tests/artifacts/build_one_artifact_macos.sh" +env_vars { + key: "RUNTIME" + value: "electron" +} +env_vars { + key: "ARCH" + value: "ia32" +} +env_vars { + key: "VERSION" + value: "2.0.0" +} +action { + define_artifacts { + regex: "github/grpc-node/artifacts/**", + strip_prefix: "github/grpc-node/artifacts" + } +} diff --git a/tools/release/kokoro/macos/electron_2.0_x64.cfg b/tools/release/kokoro/macos/electron_2.0_x64.cfg new file mode 100644 index 00000000..f70f742e --- /dev/null +++ b/tools/release/kokoro/macos/electron_2.0_x64.cfg @@ -0,0 +1,35 @@ +# Copyright 2020 gRPC authors. +# +# 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. + +# Config file for Kokoro (in protobuf text format) + +build_file: "grpc-node/packages/grpc-native-core/tools/run_tests/artifacts/build_one_artifact_macos.sh" +env_vars { + key: "RUNTIME" + value: "electron" +} +env_vars { + key: "ARCH" + value: "x64" +} +env_vars { + key: "VERSION" + value: "2.0.0" +} +action { + define_artifacts { + regex: "github/grpc-node/artifacts/**", + strip_prefix: "github/grpc-node/artifacts" + } +} diff --git a/tools/release/kokoro/macos/electron_3.0_ia32.cfg b/tools/release/kokoro/macos/electron_3.0_ia32.cfg new file mode 100644 index 00000000..eee4f303 --- /dev/null +++ b/tools/release/kokoro/macos/electron_3.0_ia32.cfg @@ -0,0 +1,35 @@ +# Copyright 2020 gRPC authors. +# +# 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. + +# Config file for Kokoro (in protobuf text format) + +build_file: "grpc-node/packages/grpc-native-core/tools/run_tests/artifacts/build_one_artifact_macos.sh" +env_vars { + key: "RUNTIME" + value: "electron" +} +env_vars { + key: "ARCH" + value: "ia32" +} +env_vars { + key: "VERSION" + value: "3.0.0" +} +action { + define_artifacts { + regex: "github/grpc-node/artifacts/**", + strip_prefix: "github/grpc-node/artifacts" + } +} diff --git a/tools/release/kokoro/macos/electron_3.0_x64.cfg b/tools/release/kokoro/macos/electron_3.0_x64.cfg new file mode 100644 index 00000000..52df13a8 --- /dev/null +++ b/tools/release/kokoro/macos/electron_3.0_x64.cfg @@ -0,0 +1,35 @@ +# Copyright 2020 gRPC authors. +# +# 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. + +# Config file for Kokoro (in protobuf text format) + +build_file: "grpc-node/packages/grpc-native-core/tools/run_tests/artifacts/build_one_artifact_macos.sh" +env_vars { + key: "RUNTIME" + value: "electron" +} +env_vars { + key: "ARCH" + value: "x64" +} +env_vars { + key: "VERSION" + value: "3.0.0" +} +action { + define_artifacts { + regex: "github/grpc-node/artifacts/**", + strip_prefix: "github/grpc-node/artifacts" + } +} diff --git a/tools/release/kokoro/macos/electron_3.1_ia32.cfg b/tools/release/kokoro/macos/electron_3.1_ia32.cfg new file mode 100644 index 00000000..12785e3b --- /dev/null +++ b/tools/release/kokoro/macos/electron_3.1_ia32.cfg @@ -0,0 +1,35 @@ +# Copyright 2020 gRPC authors. +# +# 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. + +# Config file for Kokoro (in protobuf text format) + +build_file: "grpc-node/packages/grpc-native-core/tools/run_tests/artifacts/build_one_artifact_macos.sh" +env_vars { + key: "RUNTIME" + value: "electron" +} +env_vars { + key: "ARCH" + value: "ia32" +} +env_vars { + key: "VERSION" + value: "3.1.0" +} +action { + define_artifacts { + regex: "github/grpc-node/artifacts/**", + strip_prefix: "github/grpc-node/artifacts" + } +} diff --git a/tools/release/kokoro/macos/electron_3.1_x64.cfg b/tools/release/kokoro/macos/electron_3.1_x64.cfg new file mode 100644 index 00000000..02d1a8d3 --- /dev/null +++ b/tools/release/kokoro/macos/electron_3.1_x64.cfg @@ -0,0 +1,35 @@ +# Copyright 2020 gRPC authors. +# +# 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. + +# Config file for Kokoro (in protobuf text format) + +build_file: "grpc-node/packages/grpc-native-core/tools/run_tests/artifacts/build_one_artifact_macos.sh" +env_vars { + key: "RUNTIME" + value: "electron" +} +env_vars { + key: "ARCH" + value: "x64" +} +env_vars { + key: "VERSION" + value: "3.1.0" +} +action { + define_artifacts { + regex: "github/grpc-node/artifacts/**", + strip_prefix: "github/grpc-node/artifacts" + } +} diff --git a/tools/release/kokoro/macos/electron_4.1_ia32.cfg b/tools/release/kokoro/macos/electron_4.1_ia32.cfg new file mode 100644 index 00000000..33cf881e --- /dev/null +++ b/tools/release/kokoro/macos/electron_4.1_ia32.cfg @@ -0,0 +1,35 @@ +# Copyright 2020 gRPC authors. +# +# 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. + +# Config file for Kokoro (in protobuf text format) + +build_file: "grpc-node/packages/grpc-native-core/tools/run_tests/artifacts/build_one_artifact_macos.sh" +env_vars { + key: "RUNTIME" + value: "electron" +} +env_vars { + key: "ARCH" + value: "ia32" +} +env_vars { + key: "VERSION" + value: "4.1.0" +} +action { + define_artifacts { + regex: "github/grpc-node/artifacts/**", + strip_prefix: "github/grpc-node/artifacts" + } +} diff --git a/tools/release/kokoro/macos/electron_4.1_x64.cfg b/tools/release/kokoro/macos/electron_4.1_x64.cfg new file mode 100644 index 00000000..5553bce7 --- /dev/null +++ b/tools/release/kokoro/macos/electron_4.1_x64.cfg @@ -0,0 +1,35 @@ +# Copyright 2020 gRPC authors. +# +# 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. + +# Config file for Kokoro (in protobuf text format) + +build_file: "grpc-node/packages/grpc-native-core/tools/run_tests/artifacts/build_one_artifact_macos.sh" +env_vars { + key: "RUNTIME" + value: "electron" +} +env_vars { + key: "ARCH" + value: "x64" +} +env_vars { + key: "VERSION" + value: "4.1.0" +} +action { + define_artifacts { + regex: "github/grpc-node/artifacts/**", + strip_prefix: "github/grpc-node/artifacts" + } +} diff --git a/tools/release/kokoro/macos/electron_4.2_ia32.cfg b/tools/release/kokoro/macos/electron_4.2_ia32.cfg new file mode 100644 index 00000000..41746c21 --- /dev/null +++ b/tools/release/kokoro/macos/electron_4.2_ia32.cfg @@ -0,0 +1,35 @@ +# Copyright 2020 gRPC authors. +# +# 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. + +# Config file for Kokoro (in protobuf text format) + +build_file: "grpc-node/packages/grpc-native-core/tools/run_tests/artifacts/build_one_artifact_macos.sh" +env_vars { + key: "RUNTIME" + value: "electron" +} +env_vars { + key: "ARCH" + value: "ia32" +} +env_vars { + key: "VERSION" + value: "4.2.0" +} +action { + define_artifacts { + regex: "github/grpc-node/artifacts/**", + strip_prefix: "github/grpc-node/artifacts" + } +} diff --git a/tools/release/kokoro/macos/electron_4.2_x64.cfg b/tools/release/kokoro/macos/electron_4.2_x64.cfg new file mode 100644 index 00000000..b6cf5a70 --- /dev/null +++ b/tools/release/kokoro/macos/electron_4.2_x64.cfg @@ -0,0 +1,35 @@ +# Copyright 2020 gRPC authors. +# +# 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. + +# Config file for Kokoro (in protobuf text format) + +build_file: "grpc-node/packages/grpc-native-core/tools/run_tests/artifacts/build_one_artifact_macos.sh" +env_vars { + key: "RUNTIME" + value: "electron" +} +env_vars { + key: "ARCH" + value: "x64" +} +env_vars { + key: "VERSION" + value: "4.2.0" +} +action { + define_artifacts { + regex: "github/grpc-node/artifacts/**", + strip_prefix: "github/grpc-node/artifacts" + } +} diff --git a/tools/release/kokoro/macos/electron_5.0_ia32.cfg b/tools/release/kokoro/macos/electron_5.0_ia32.cfg new file mode 100644 index 00000000..e59cf6a6 --- /dev/null +++ b/tools/release/kokoro/macos/electron_5.0_ia32.cfg @@ -0,0 +1,35 @@ +# Copyright 2020 gRPC authors. +# +# 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. + +# Config file for Kokoro (in protobuf text format) + +build_file: "grpc-node/packages/grpc-native-core/tools/run_tests/artifacts/build_one_artifact_macos.sh" +env_vars { + key: "RUNTIME" + value: "electron" +} +env_vars { + key: "ARCH" + value: "ia32" +} +env_vars { + key: "VERSION" + value: "5.0.0" +} +action { + define_artifacts { + regex: "github/grpc-node/artifacts/**", + strip_prefix: "github/grpc-node/artifacts" + } +} diff --git a/tools/release/kokoro/macos/electron_5.0_x64.cfg b/tools/release/kokoro/macos/electron_5.0_x64.cfg new file mode 100644 index 00000000..47de1345 --- /dev/null +++ b/tools/release/kokoro/macos/electron_5.0_x64.cfg @@ -0,0 +1,35 @@ +# Copyright 2020 gRPC authors. +# +# 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. + +# Config file for Kokoro (in protobuf text format) + +build_file: "grpc-node/packages/grpc-native-core/tools/run_tests/artifacts/build_one_artifact_macos.sh" +env_vars { + key: "RUNTIME" + value: "electron" +} +env_vars { + key: "ARCH" + value: "x64" +} +env_vars { + key: "VERSION" + value: "5.0.0" +} +action { + define_artifacts { + regex: "github/grpc-node/artifacts/**", + strip_prefix: "github/grpc-node/artifacts" + } +} diff --git a/tools/release/kokoro/macos/electron_6.0_ia32.cfg b/tools/release/kokoro/macos/electron_6.0_ia32.cfg new file mode 100644 index 00000000..10ca9f5e --- /dev/null +++ b/tools/release/kokoro/macos/electron_6.0_ia32.cfg @@ -0,0 +1,35 @@ +# Copyright 2020 gRPC authors. +# +# 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. + +# Config file for Kokoro (in protobuf text format) + +build_file: "grpc-node/packages/grpc-native-core/tools/run_tests/artifacts/build_one_artifact_macos.sh" +env_vars { + key: "RUNTIME" + value: "electron" +} +env_vars { + key: "ARCH" + value: "ia32" +} +env_vars { + key: "VERSION" + value: "6.0.0" +} +action { + define_artifacts { + regex: "github/grpc-node/artifacts/**", + strip_prefix: "github/grpc-node/artifacts" + } +} diff --git a/tools/release/kokoro/macos/electron_6.0_x64.cfg b/tools/release/kokoro/macos/electron_6.0_x64.cfg new file mode 100644 index 00000000..312c27d9 --- /dev/null +++ b/tools/release/kokoro/macos/electron_6.0_x64.cfg @@ -0,0 +1,35 @@ +# Copyright 2020 gRPC authors. +# +# 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. + +# Config file for Kokoro (in protobuf text format) + +build_file: "grpc-node/packages/grpc-native-core/tools/run_tests/artifacts/build_one_artifact_macos.sh" +env_vars { + key: "RUNTIME" + value: "electron" +} +env_vars { + key: "ARCH" + value: "x64" +} +env_vars { + key: "VERSION" + value: "6.0.0" +} +action { + define_artifacts { + regex: "github/grpc-node/artifacts/**", + strip_prefix: "github/grpc-node/artifacts" + } +} diff --git a/tools/release/kokoro/macos/electron_6.1_ia32.cfg b/tools/release/kokoro/macos/electron_6.1_ia32.cfg new file mode 100644 index 00000000..45ed07c5 --- /dev/null +++ b/tools/release/kokoro/macos/electron_6.1_ia32.cfg @@ -0,0 +1,35 @@ +# Copyright 2020 gRPC authors. +# +# 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. + +# Config file for Kokoro (in protobuf text format) + +build_file: "grpc-node/packages/grpc-native-core/tools/run_tests/artifacts/build_one_artifact_macos.sh" +env_vars { + key: "RUNTIME" + value: "electron" +} +env_vars { + key: "ARCH" + value: "ia32" +} +env_vars { + key: "VERSION" + value: "6.1.0" +} +action { + define_artifacts { + regex: "github/grpc-node/artifacts/**", + strip_prefix: "github/grpc-node/artifacts" + } +} diff --git a/tools/release/kokoro/macos/electron_6.1_x64.cfg b/tools/release/kokoro/macos/electron_6.1_x64.cfg new file mode 100644 index 00000000..e5167655 --- /dev/null +++ b/tools/release/kokoro/macos/electron_6.1_x64.cfg @@ -0,0 +1,35 @@ +# Copyright 2020 gRPC authors. +# +# 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. + +# Config file for Kokoro (in protobuf text format) + +build_file: "grpc-node/packages/grpc-native-core/tools/run_tests/artifacts/build_one_artifact_macos.sh" +env_vars { + key: "RUNTIME" + value: "electron" +} +env_vars { + key: "ARCH" + value: "x64" +} +env_vars { + key: "VERSION" + value: "6.1.0" +} +action { + define_artifacts { + regex: "github/grpc-node/artifacts/**", + strip_prefix: "github/grpc-node/artifacts" + } +} diff --git a/tools/release/kokoro/macos/electron_7.0_ia32.cfg b/tools/release/kokoro/macos/electron_7.0_ia32.cfg new file mode 100644 index 00000000..5824649e --- /dev/null +++ b/tools/release/kokoro/macos/electron_7.0_ia32.cfg @@ -0,0 +1,35 @@ +# Copyright 2020 gRPC authors. +# +# 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. + +# Config file for Kokoro (in protobuf text format) + +build_file: "grpc-node/packages/grpc-native-core/tools/run_tests/artifacts/build_one_artifact_macos.sh" +env_vars { + key: "RUNTIME" + value: "electron" +} +env_vars { + key: "ARCH" + value: "ia32" +} +env_vars { + key: "VERSION" + value: "7.0.0" +} +action { + define_artifacts { + regex: "github/grpc-node/artifacts/**", + strip_prefix: "github/grpc-node/artifacts" + } +} diff --git a/tools/release/kokoro/macos/electron_7.0_x64.cfg b/tools/release/kokoro/macos/electron_7.0_x64.cfg new file mode 100644 index 00000000..38688281 --- /dev/null +++ b/tools/release/kokoro/macos/electron_7.0_x64.cfg @@ -0,0 +1,35 @@ +# Copyright 2020 gRPC authors. +# +# 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. + +# Config file for Kokoro (in protobuf text format) + +build_file: "grpc-node/packages/grpc-native-core/tools/run_tests/artifacts/build_one_artifact_macos.sh" +env_vars { + key: "RUNTIME" + value: "electron" +} +env_vars { + key: "ARCH" + value: "x64" +} +env_vars { + key: "VERSION" + value: "7.0.0" +} +action { + define_artifacts { + regex: "github/grpc-node/artifacts/**", + strip_prefix: "github/grpc-node/artifacts" + } +} diff --git a/tools/release/kokoro/macos/electron_7.1_ia32.cfg b/tools/release/kokoro/macos/electron_7.1_ia32.cfg new file mode 100644 index 00000000..4a81c57e --- /dev/null +++ b/tools/release/kokoro/macos/electron_7.1_ia32.cfg @@ -0,0 +1,35 @@ +# Copyright 2020 gRPC authors. +# +# 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. + +# Config file for Kokoro (in protobuf text format) + +build_file: "grpc-node/packages/grpc-native-core/tools/run_tests/artifacts/build_one_artifact_macos.sh" +env_vars { + key: "RUNTIME" + value: "electron" +} +env_vars { + key: "ARCH" + value: "ia32" +} +env_vars { + key: "VERSION" + value: "7.1.0" +} +action { + define_artifacts { + regex: "github/grpc-node/artifacts/**", + strip_prefix: "github/grpc-node/artifacts" + } +} diff --git a/tools/release/kokoro/macos/electron_7.1_x64.cfg b/tools/release/kokoro/macos/electron_7.1_x64.cfg new file mode 100644 index 00000000..a8671b17 --- /dev/null +++ b/tools/release/kokoro/macos/electron_7.1_x64.cfg @@ -0,0 +1,35 @@ +# Copyright 2020 gRPC authors. +# +# 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. + +# Config file for Kokoro (in protobuf text format) + +build_file: "grpc-node/packages/grpc-native-core/tools/run_tests/artifacts/build_one_artifact_macos.sh" +env_vars { + key: "RUNTIME" + value: "electron" +} +env_vars { + key: "ARCH" + value: "x64" +} +env_vars { + key: "VERSION" + value: "7.1.0" +} +action { + define_artifacts { + regex: "github/grpc-node/artifacts/**", + strip_prefix: "github/grpc-node/artifacts" + } +} diff --git a/tools/release/kokoro/macos/node_10_ia32.cfg b/tools/release/kokoro/macos/node_10_ia32.cfg new file mode 100644 index 00000000..fd1102df --- /dev/null +++ b/tools/release/kokoro/macos/node_10_ia32.cfg @@ -0,0 +1,35 @@ +# Copyright 2020 gRPC authors. +# +# 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. + +# Config file for Kokoro (in protobuf text format) + +build_file: "grpc-node/packages/grpc-native-core/tools/run_tests/artifacts/build_one_artifact_macos.sh" +env_vars { + key: "RUNTIME" + value: "node" +} +env_vars { + key: "ARCH" + value: "ia32" +} +env_vars { + key: "VERSION" + value: "10.0.0" +} +action { + define_artifacts { + regex: "github/grpc-node/artifacts/**", + strip_prefix: "github/grpc-node/artifacts" + } +} diff --git a/tools/release/kokoro/macos/node_10_x64.cfg b/tools/release/kokoro/macos/node_10_x64.cfg new file mode 100644 index 00000000..ca306e12 --- /dev/null +++ b/tools/release/kokoro/macos/node_10_x64.cfg @@ -0,0 +1,35 @@ +# Copyright 2020 gRPC authors. +# +# 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. + +# Config file for Kokoro (in protobuf text format) + +build_file: "grpc-node/packages/grpc-native-core/tools/run_tests/artifacts/build_one_artifact_macos.sh" +env_vars { + key: "RUNTIME" + value: "node" +} +env_vars { + key: "ARCH" + value: "x64" +} +env_vars { + key: "VERSION" + value: "10.0.0" +} +action { + define_artifacts { + regex: "github/grpc-node/artifacts/**", + strip_prefix: "github/grpc-node/artifacts" + } +} diff --git a/tools/release/kokoro/macos/node_11_ia32.cfg b/tools/release/kokoro/macos/node_11_ia32.cfg new file mode 100644 index 00000000..ecd4f3d0 --- /dev/null +++ b/tools/release/kokoro/macos/node_11_ia32.cfg @@ -0,0 +1,35 @@ +# Copyright 2020 gRPC authors. +# +# 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. + +# Config file for Kokoro (in protobuf text format) + +build_file: "grpc-node/packages/grpc-native-core/tools/run_tests/artifacts/build_one_artifact_macos.sh" +env_vars { + key: "RUNTIME" + value: "node" +} +env_vars { + key: "ARCH" + value: "ia32" +} +env_vars { + key: "VERSION" + value: "11.0.0" +} +action { + define_artifacts { + regex: "github/grpc-node/artifacts/**", + strip_prefix: "github/grpc-node/artifacts" + } +} diff --git a/tools/release/kokoro/macos/node_11_x64.cfg b/tools/release/kokoro/macos/node_11_x64.cfg new file mode 100644 index 00000000..80542311 --- /dev/null +++ b/tools/release/kokoro/macos/node_11_x64.cfg @@ -0,0 +1,35 @@ +# Copyright 2020 gRPC authors. +# +# 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. + +# Config file for Kokoro (in protobuf text format) + +build_file: "grpc-node/packages/grpc-native-core/tools/run_tests/artifacts/build_one_artifact_macos.sh" +env_vars { + key: "RUNTIME" + value: "node" +} +env_vars { + key: "ARCH" + value: "x64" +} +env_vars { + key: "VERSION" + value: "11.0.0" +} +action { + define_artifacts { + regex: "github/grpc-node/artifacts/**", + strip_prefix: "github/grpc-node/artifacts" + } +} diff --git a/tools/release/kokoro/macos/node_12_ia32.cfg b/tools/release/kokoro/macos/node_12_ia32.cfg new file mode 100644 index 00000000..7bf3a9a3 --- /dev/null +++ b/tools/release/kokoro/macos/node_12_ia32.cfg @@ -0,0 +1,35 @@ +# Copyright 2020 gRPC authors. +# +# 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. + +# Config file for Kokoro (in protobuf text format) + +build_file: "grpc-node/packages/grpc-native-core/tools/run_tests/artifacts/build_one_artifact_macos.sh" +env_vars { + key: "RUNTIME" + value: "node" +} +env_vars { + key: "ARCH" + value: "ia32" +} +env_vars { + key: "VERSION" + value: "12.0.0" +} +action { + define_artifacts { + regex: "github/grpc-node/artifacts/**", + strip_prefix: "github/grpc-node/artifacts" + } +} diff --git a/tools/release/kokoro/macos/node_12_x64.cfg b/tools/release/kokoro/macos/node_12_x64.cfg new file mode 100644 index 00000000..a4d7c8d0 --- /dev/null +++ b/tools/release/kokoro/macos/node_12_x64.cfg @@ -0,0 +1,35 @@ +# Copyright 2020 gRPC authors. +# +# 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. + +# Config file for Kokoro (in protobuf text format) + +build_file: "grpc-node/packages/grpc-native-core/tools/run_tests/artifacts/build_one_artifact_macos.sh" +env_vars { + key: "RUNTIME" + value: "node" +} +env_vars { + key: "ARCH" + value: "x64" +} +env_vars { + key: "VERSION" + value: "12.0.0" +} +action { + define_artifacts { + regex: "github/grpc-node/artifacts/**", + strip_prefix: "github/grpc-node/artifacts" + } +} diff --git a/tools/release/kokoro/macos/node_13_ia32.cfg b/tools/release/kokoro/macos/node_13_ia32.cfg new file mode 100644 index 00000000..7fe3a4ea --- /dev/null +++ b/tools/release/kokoro/macos/node_13_ia32.cfg @@ -0,0 +1,35 @@ +# Copyright 2020 gRPC authors. +# +# 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. + +# Config file for Kokoro (in protobuf text format) + +build_file: "grpc-node/packages/grpc-native-core/tools/run_tests/artifacts/build_one_artifact_macos.sh" +env_vars { + key: "RUNTIME" + value: "node" +} +env_vars { + key: "ARCH" + value: "ia32" +} +env_vars { + key: "VERSION" + value: "13.0.0" +} +action { + define_artifacts { + regex: "github/grpc-node/artifacts/**", + strip_prefix: "github/grpc-node/artifacts" + } +} diff --git a/tools/release/kokoro/macos/node_13_x64.cfg b/tools/release/kokoro/macos/node_13_x64.cfg new file mode 100644 index 00000000..156eb6cf --- /dev/null +++ b/tools/release/kokoro/macos/node_13_x64.cfg @@ -0,0 +1,35 @@ +# Copyright 2020 gRPC authors. +# +# 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. + +# Config file for Kokoro (in protobuf text format) + +build_file: "grpc-node/packages/grpc-native-core/tools/run_tests/artifacts/build_one_artifact_macos.sh" +env_vars { + key: "RUNTIME" + value: "node" +} +env_vars { + key: "ARCH" + value: "x64" +} +env_vars { + key: "VERSION" + value: "13.0.0" +} +action { + define_artifacts { + regex: "github/grpc-node/artifacts/**", + strip_prefix: "github/grpc-node/artifacts" + } +} diff --git a/tools/release/kokoro/macos/node_4_ia32.cfg b/tools/release/kokoro/macos/node_4_ia32.cfg new file mode 100644 index 00000000..1411ea92 --- /dev/null +++ b/tools/release/kokoro/macos/node_4_ia32.cfg @@ -0,0 +1,35 @@ +# Copyright 2020 gRPC authors. +# +# 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. + +# Config file for Kokoro (in protobuf text format) + +build_file: "grpc-node/packages/grpc-native-core/tools/run_tests/artifacts/build_one_artifact_macos.sh" +env_vars { + key: "RUNTIME" + value: "node" +} +env_vars { + key: "ARCH" + value: "ia32" +} +env_vars { + key: "VERSION" + value: "4.0.0" +} +action { + define_artifacts { + regex: "github/grpc-node/artifacts/**", + strip_prefix: "github/grpc-node/artifacts" + } +} diff --git a/tools/release/kokoro/macos/node_4_x64.cfg b/tools/release/kokoro/macos/node_4_x64.cfg new file mode 100644 index 00000000..8a330ce5 --- /dev/null +++ b/tools/release/kokoro/macos/node_4_x64.cfg @@ -0,0 +1,35 @@ +# Copyright 2020 gRPC authors. +# +# 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. + +# Config file for Kokoro (in protobuf text format) + +build_file: "grpc-node/packages/grpc-native-core/tools/run_tests/artifacts/build_one_artifact_macos.sh" +env_vars { + key: "RUNTIME" + value: "node" +} +env_vars { + key: "ARCH" + value: "x64" +} +env_vars { + key: "VERSION" + value: "4.0.0" +} +action { + define_artifacts { + regex: "github/grpc-node/artifacts/**", + strip_prefix: "github/grpc-node/artifacts" + } +} diff --git a/tools/release/kokoro/macos/node_5_ia32.cfg b/tools/release/kokoro/macos/node_5_ia32.cfg new file mode 100644 index 00000000..f99f3b69 --- /dev/null +++ b/tools/release/kokoro/macos/node_5_ia32.cfg @@ -0,0 +1,35 @@ +# Copyright 2020 gRPC authors. +# +# 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. + +# Config file for Kokoro (in protobuf text format) + +build_file: "grpc-node/packages/grpc-native-core/tools/run_tests/artifacts/build_one_artifact_macos.sh" +env_vars { + key: "RUNTIME" + value: "node" +} +env_vars { + key: "ARCH" + value: "ia32" +} +env_vars { + key: "VERSION" + value: "5.0.0" +} +action { + define_artifacts { + regex: "github/grpc-node/artifacts/**", + strip_prefix: "github/grpc-node/artifacts" + } +} diff --git a/tools/release/kokoro/macos/node_5_x64.cfg b/tools/release/kokoro/macos/node_5_x64.cfg new file mode 100644 index 00000000..f1436c2f --- /dev/null +++ b/tools/release/kokoro/macos/node_5_x64.cfg @@ -0,0 +1,35 @@ +# Copyright 2020 gRPC authors. +# +# 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. + +# Config file for Kokoro (in protobuf text format) + +build_file: "grpc-node/packages/grpc-native-core/tools/run_tests/artifacts/build_one_artifact_macos.sh" +env_vars { + key: "RUNTIME" + value: "node" +} +env_vars { + key: "ARCH" + value: "x64" +} +env_vars { + key: "VERSION" + value: "5.0.0" +} +action { + define_artifacts { + regex: "github/grpc-node/artifacts/**", + strip_prefix: "github/grpc-node/artifacts" + } +} diff --git a/tools/release/kokoro/macos/node_6_ia32.cfg b/tools/release/kokoro/macos/node_6_ia32.cfg new file mode 100644 index 00000000..2381480d --- /dev/null +++ b/tools/release/kokoro/macos/node_6_ia32.cfg @@ -0,0 +1,35 @@ +# Copyright 2020 gRPC authors. +# +# 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. + +# Config file for Kokoro (in protobuf text format) + +build_file: "grpc-node/packages/grpc-native-core/tools/run_tests/artifacts/build_one_artifact_macos.sh" +env_vars { + key: "RUNTIME" + value: "node" +} +env_vars { + key: "ARCH" + value: "ia32" +} +env_vars { + key: "VERSION" + value: "6.0.0" +} +action { + define_artifacts { + regex: "github/grpc-node/artifacts/**", + strip_prefix: "github/grpc-node/artifacts" + } +} diff --git a/tools/release/kokoro/macos/node_6_x64.cfg b/tools/release/kokoro/macos/node_6_x64.cfg new file mode 100644 index 00000000..10b657ee --- /dev/null +++ b/tools/release/kokoro/macos/node_6_x64.cfg @@ -0,0 +1,35 @@ +# Copyright 2020 gRPC authors. +# +# 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. + +# Config file for Kokoro (in protobuf text format) + +build_file: "grpc-node/packages/grpc-native-core/tools/run_tests/artifacts/build_one_artifact_macos.sh" +env_vars { + key: "RUNTIME" + value: "node" +} +env_vars { + key: "ARCH" + value: "x64" +} +env_vars { + key: "VERSION" + value: "6.0.0" +} +action { + define_artifacts { + regex: "github/grpc-node/artifacts/**", + strip_prefix: "github/grpc-node/artifacts" + } +} diff --git a/tools/release/kokoro/macos/node_7_ia32.cfg b/tools/release/kokoro/macos/node_7_ia32.cfg new file mode 100644 index 00000000..9841a4a2 --- /dev/null +++ b/tools/release/kokoro/macos/node_7_ia32.cfg @@ -0,0 +1,35 @@ +# Copyright 2020 gRPC authors. +# +# 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. + +# Config file for Kokoro (in protobuf text format) + +build_file: "grpc-node/packages/grpc-native-core/tools/run_tests/artifacts/build_one_artifact_macos.sh" +env_vars { + key: "RUNTIME" + value: "node" +} +env_vars { + key: "ARCH" + value: "ia32" +} +env_vars { + key: "VERSION" + value: "7.0.0" +} +action { + define_artifacts { + regex: "github/grpc-node/artifacts/**", + strip_prefix: "github/grpc-node/artifacts" + } +} diff --git a/tools/release/kokoro/macos/node_7_x64.cfg b/tools/release/kokoro/macos/node_7_x64.cfg new file mode 100644 index 00000000..a46516bb --- /dev/null +++ b/tools/release/kokoro/macos/node_7_x64.cfg @@ -0,0 +1,35 @@ +# Copyright 2020 gRPC authors. +# +# 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. + +# Config file for Kokoro (in protobuf text format) + +build_file: "grpc-node/packages/grpc-native-core/tools/run_tests/artifacts/build_one_artifact_macos.sh" +env_vars { + key: "RUNTIME" + value: "node" +} +env_vars { + key: "ARCH" + value: "x64" +} +env_vars { + key: "VERSION" + value: "7.0.0" +} +action { + define_artifacts { + regex: "github/grpc-node/artifacts/**", + strip_prefix: "github/grpc-node/artifacts" + } +} diff --git a/tools/release/kokoro/macos/node_8_ia32.cfg b/tools/release/kokoro/macos/node_8_ia32.cfg new file mode 100644 index 00000000..4c6f268c --- /dev/null +++ b/tools/release/kokoro/macos/node_8_ia32.cfg @@ -0,0 +1,35 @@ +# Copyright 2020 gRPC authors. +# +# 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. + +# Config file for Kokoro (in protobuf text format) + +build_file: "grpc-node/packages/grpc-native-core/tools/run_tests/artifacts/build_one_artifact_macos.sh" +env_vars { + key: "RUNTIME" + value: "node" +} +env_vars { + key: "ARCH" + value: "ia32" +} +env_vars { + key: "VERSION" + value: "8.0.0" +} +action { + define_artifacts { + regex: "github/grpc-node/artifacts/**", + strip_prefix: "github/grpc-node/artifacts" + } +} diff --git a/tools/release/kokoro/macos/node_8_x64.cfg b/tools/release/kokoro/macos/node_8_x64.cfg new file mode 100644 index 00000000..2034ac8d --- /dev/null +++ b/tools/release/kokoro/macos/node_8_x64.cfg @@ -0,0 +1,35 @@ +# Copyright 2020 gRPC authors. +# +# 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. + +# Config file for Kokoro (in protobuf text format) + +build_file: "grpc-node/packages/grpc-native-core/tools/run_tests/artifacts/build_one_artifact_macos.sh" +env_vars { + key: "RUNTIME" + value: "node" +} +env_vars { + key: "ARCH" + value: "x64" +} +env_vars { + key: "VERSION" + value: "8.0.0" +} +action { + define_artifacts { + regex: "github/grpc-node/artifacts/**", + strip_prefix: "github/grpc-node/artifacts" + } +} diff --git a/tools/release/kokoro/macos/node_9_ia32.cfg b/tools/release/kokoro/macos/node_9_ia32.cfg new file mode 100644 index 00000000..f51cf728 --- /dev/null +++ b/tools/release/kokoro/macos/node_9_ia32.cfg @@ -0,0 +1,35 @@ +# Copyright 2020 gRPC authors. +# +# 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. + +# Config file for Kokoro (in protobuf text format) + +build_file: "grpc-node/packages/grpc-native-core/tools/run_tests/artifacts/build_one_artifact_macos.sh" +env_vars { + key: "RUNTIME" + value: "node" +} +env_vars { + key: "ARCH" + value: "ia32" +} +env_vars { + key: "VERSION" + value: "9.0.0" +} +action { + define_artifacts { + regex: "github/grpc-node/artifacts/**", + strip_prefix: "github/grpc-node/artifacts" + } +} diff --git a/tools/release/kokoro/macos/node_9_x64.cfg b/tools/release/kokoro/macos/node_9_x64.cfg new file mode 100644 index 00000000..083e1ee8 --- /dev/null +++ b/tools/release/kokoro/macos/node_9_x64.cfg @@ -0,0 +1,35 @@ +# Copyright 2020 gRPC authors. +# +# 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. + +# Config file for Kokoro (in protobuf text format) + +build_file: "grpc-node/packages/grpc-native-core/tools/run_tests/artifacts/build_one_artifact_macos.sh" +env_vars { + key: "RUNTIME" + value: "node" +} +env_vars { + key: "ARCH" + value: "x64" +} +env_vars { + key: "VERSION" + value: "9.0.0" +} +action { + define_artifacts { + regex: "github/grpc-node/artifacts/**", + strip_prefix: "github/grpc-node/artifacts" + } +} From 8d4e334b64c5f70bd904504a6674af0ec1e7529f Mon Sep 17 00:00:00 2001 From: murgatroid99 Date: Tue, 4 Feb 2020 16:24:34 -0800 Subject: [PATCH 26/28] Apparently I need a config for the root job --- tools/release/kokoro/macos.cfg | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 tools/release/kokoro/macos.cfg diff --git a/tools/release/kokoro/macos.cfg b/tools/release/kokoro/macos.cfg new file mode 100644 index 00000000..ff22f270 --- /dev/null +++ b/tools/release/kokoro/macos.cfg @@ -0,0 +1,15 @@ +# Copyright 2020 gRPC authors. +# +# 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. + +# Config file for Kokoro (in protobuf text format) From d643d105f64645819328566ba9416624a57ddb27 Mon Sep 17 00:00:00 2001 From: Nicolas Noble Date: Wed, 5 Feb 2020 09:03:16 -0800 Subject: [PATCH 27/28] Adding a build_file field, as this seems necessary --- tools/release/kokoro/macos.cfg | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tools/release/kokoro/macos.cfg b/tools/release/kokoro/macos.cfg index ff22f270..b52902e5 100644 --- a/tools/release/kokoro/macos.cfg +++ b/tools/release/kokoro/macos.cfg @@ -13,3 +13,5 @@ # limitations under the License. # Config file for Kokoro (in protobuf text format) + +build_file: "grpc-node/packages/grpc-native-core/tools/run_tests/artifacts/workflow.sh" From d6ed6facc57b40df2733e3709a1a21e113ca69b6 Mon Sep 17 00:00:00 2001 From: Nicolas Noble Date: Wed, 5 Feb 2020 09:04:35 -0800 Subject: [PATCH 28/28] Create workflow.sh --- .../tools/run_tests/artifacts/workflow.sh | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 packages/grpc-native-core/tools/run_tests/artifacts/workflow.sh diff --git a/packages/grpc-native-core/tools/run_tests/artifacts/workflow.sh b/packages/grpc-native-core/tools/run_tests/artifacts/workflow.sh new file mode 100644 index 00000000..20c5ec54 --- /dev/null +++ b/packages/grpc-native-core/tools/run_tests/artifacts/workflow.sh @@ -0,0 +1,14 @@ +#!/bin/sh +# Copyright 2020 gRPC authors. +# +# 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.