mirror of https://github.com/grpc/grpc.git
commit
0596621ec2
72 changed files with 1374 additions and 449 deletions
@ -0,0 +1,65 @@ |
||||
GRPC Connection Backoff Protocol |
||||
================================ |
||||
|
||||
When we do a connection to a backend which fails, it is typically desirable to |
||||
not retry immediately (to avoid flooding the network or the server with |
||||
requests) and instead do some form of exponential backoff. |
||||
|
||||
We have several parameters: |
||||
1. INITIAL_BACKOFF (how long to wait after the first failure before retrying) |
||||
2. MULTIPLIER (factor with which to multiply backoff after a failed retry) |
||||
3. MAX_BACKOFF (Upper bound on backoff) |
||||
4. MIN_CONNECTION_TIMEOUT |
||||
|
||||
## Proposed Backoff Algorithm |
||||
|
||||
Exponentially back off the start time of connection attempts up to a limit of |
||||
MAX_BACKOFF. |
||||
|
||||
``` |
||||
ConnectWithBackoff() |
||||
current_backoff = INITIAL_BACKOFF |
||||
current_deadline = now() + INITIAL_BACKOFF |
||||
while (TryConnect(Max(current_deadline, MIN_CONNECT_TIMEOUT)) |
||||
!= SUCCESS) |
||||
SleepUntil(current_deadline) |
||||
current_backoff = Min(current_backoff * MULTIPLIER, MAX_BACKOFF) |
||||
current_deadline = now() + current_backoff |
||||
``` |
||||
|
||||
## Historical Algorithm in Stubby |
||||
|
||||
Exponentially increase up to a limit of MAX_BACKOFF the intervals between |
||||
connection attempts. This is what stubby 2 uses, and is equivalent if |
||||
TryConnect() fails instantly. |
||||
|
||||
``` |
||||
LegacyConnectWithBackoff() |
||||
current_backoff = INITIAL_BACKOFF |
||||
while (TryConnect(MIN_CONNECT_TIMEOUT) != SUCCESS) |
||||
SleepFor(current_backoff) |
||||
current_backoff = Min(current_backoff * MULTIPLIER, MAX_BACKOFF) |
||||
``` |
||||
|
||||
The grpc C implementation currently uses this approach with an initial backoff |
||||
of 1 second, multiplier of 2, and maximum backoff of 120 seconds. (This will |
||||
change) |
||||
|
||||
Stubby, or at least rpc2, uses exactly this algorithm with an initial backoff |
||||
of 1 second, multiplier of 1.2, and a maximum backoff of 120 seconds. |
||||
|
||||
## Use Cases to Consider |
||||
|
||||
* Client tries to connect to a server which is down for multiple hours, eg for |
||||
maintenance |
||||
* Client tries to connect to a server which is overloaded |
||||
* User is bringing up both a client and a server at the same time |
||||
* In particular, we would like to avoid a large unnecessary delay if the |
||||
client connects to a server which is about to come up |
||||
* Client/server are misconfigured such that connection attempts always fail |
||||
* We want to make sure these don’t put too much load on the server by |
||||
default. |
||||
* Server is overloaded and wants to transiently make clients back off |
||||
* Application has out of band reason to believe a server is back |
||||
* We should consider an out of band mechanism for the client to hint that |
||||
we should short circuit the backoff. |
@ -0,0 +1,49 @@ |
||||
/*
|
||||
* |
||||
* Copyright 2015, Google Inc. |
||||
* All rights reserved. |
||||
* |
||||
* Redistribution and use in source and binary forms, with or without |
||||
* modification, are permitted provided that the following conditions are |
||||
* met: |
||||
* |
||||
* * Redistributions of source code must retain the above copyright |
||||
* notice, this list of conditions and the following disclaimer. |
||||
* * Redistributions in binary form must reproduce the above |
||||
* copyright notice, this list of conditions and the following disclaimer |
||||
* in the documentation and/or other materials provided with the |
||||
* distribution. |
||||
* * Neither the name of Google Inc. nor the names of its |
||||
* contributors may be used to endorse or promote products derived from |
||||
* this software without specific prior written permission. |
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
* |
||||
*/ |
||||
|
||||
#ifndef GRPC_SUPPORT_SUBPROCESS_H |
||||
#define GRPC_SUPPORT_SUBPROCESS_H |
||||
|
||||
typedef struct gpr_subprocess gpr_subprocess; |
||||
|
||||
/* .exe on windows, empty on unices */ |
||||
char *gpr_subprocess_binary_extension(); |
||||
|
||||
gpr_subprocess *gpr_subprocess_create(int argc, char **argv); |
||||
/* if subprocess has not been joined, kill it */ |
||||
void gpr_subprocess_destroy(gpr_subprocess *p); |
||||
/* returns exit status; can be called at most once */ |
||||
int gpr_subprocess_join(gpr_subprocess *p); |
||||
void gpr_subprocess_interrupt(gpr_subprocess *p); |
||||
|
||||
#endif |
@ -0,0 +1,108 @@ |
||||
/*
|
||||
* |
||||
* Copyright 2015, Google Inc. |
||||
* All rights reserved. |
||||
* |
||||
* Redistribution and use in source and binary forms, with or without |
||||
* modification, are permitted provided that the following conditions are |
||||
* met: |
||||
* |
||||
* * Redistributions of source code must retain the above copyright |
||||
* notice, this list of conditions and the following disclaimer. |
||||
* * Redistributions in binary form must reproduce the above |
||||
* copyright notice, this list of conditions and the following disclaimer |
||||
* in the documentation and/or other materials provided with the |
||||
* distribution. |
||||
* * Neither the name of Google Inc. nor the names of its |
||||
* contributors may be used to endorse or promote products derived from |
||||
* this software without specific prior written permission. |
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
* |
||||
*/ |
||||
|
||||
#include <grpc/support/port_platform.h> |
||||
|
||||
#ifdef GPR_POSIX_SUBPROCESS |
||||
|
||||
#include <grpc/support/subprocess.h> |
||||
|
||||
#include <unistd.h> |
||||
#include <assert.h> |
||||
#include <errno.h> |
||||
#include <stdio.h> |
||||
#include <string.h> |
||||
#include <signal.h> |
||||
#include <stdlib.h> |
||||
#include <sys/types.h> |
||||
#include <sys/wait.h> |
||||
|
||||
#include <grpc/support/alloc.h> |
||||
#include <grpc/support/log.h> |
||||
|
||||
struct gpr_subprocess { |
||||
int pid; |
||||
int joined; |
||||
}; |
||||
|
||||
char *gpr_subprocess_binary_extension() { return ""; } |
||||
|
||||
gpr_subprocess *gpr_subprocess_create(int argc, char **argv) { |
||||
gpr_subprocess *r; |
||||
int pid; |
||||
char **exec_args; |
||||
|
||||
pid = fork(); |
||||
if (pid == -1) { |
||||
return NULL; |
||||
} else if (pid == 0) { |
||||
exec_args = gpr_malloc((argc + 1) * sizeof(char *)); |
||||
memcpy(exec_args, argv, argc * sizeof(char *)); |
||||
exec_args[argc] = NULL; |
||||
execv(exec_args[0], exec_args); |
||||
/* if we reach here, an error has occurred */ |
||||
gpr_log(GPR_ERROR, "execv '%s' failed: %s", exec_args[0], strerror(errno)); |
||||
_exit(1); |
||||
return NULL; |
||||
} else { |
||||
r = gpr_malloc(sizeof(gpr_subprocess)); |
||||
memset(r, 0, sizeof(*r)); |
||||
r->pid = pid; |
||||
return r; |
||||
} |
||||
} |
||||
|
||||
void gpr_subprocess_destroy(gpr_subprocess *p) { |
||||
if (!p->joined) { |
||||
kill(p->pid, SIGKILL); |
||||
gpr_subprocess_join(p); |
||||
} |
||||
gpr_free(p); |
||||
} |
||||
|
||||
int gpr_subprocess_join(gpr_subprocess *p) { |
||||
int status; |
||||
if (waitpid(p->pid, &status, 0) == -1) { |
||||
gpr_log(GPR_ERROR, "waitpid failed: %s", strerror(errno)); |
||||
return -1; |
||||
} |
||||
return status; |
||||
} |
||||
|
||||
void gpr_subprocess_interrupt(gpr_subprocess *p) { |
||||
if (!p->joined) { |
||||
kill(p->pid, SIGINT); |
||||
} |
||||
} |
||||
|
||||
#endif /* GPR_POSIX_SUBPROCESS */ |
@ -0,0 +1,45 @@ |
||||
/*
|
||||
* |
||||
* Copyright 2015, Google Inc. |
||||
* All rights reserved. |
||||
* |
||||
* Redistribution and use in source and binary forms, with or without |
||||
* modification, are permitted provided that the following conditions are |
||||
* met: |
||||
* |
||||
* * Redistributions of source code must retain the above copyright |
||||
* notice, this list of conditions and the following disclaimer. |
||||
* * Redistributions in binary form must reproduce the above |
||||
* copyright notice, this list of conditions and the following disclaimer |
||||
* in the documentation and/or other materials provided with the |
||||
* distribution. |
||||
* * Neither the name of Google Inc. nor the names of its |
||||
* contributors may be used to endorse or promote products derived from |
||||
* this software without specific prior written permission. |
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
* |
||||
*/ |
||||
|
||||
#include <grpc/support/port_platform.h> |
||||
|
||||
#ifdef GPR_PTHREAD_TLS |
||||
|
||||
#include <grpc/support/tls.h> |
||||
|
||||
gpr_intptr gpr_tls_set(struct gpr_pthread_thread_local *tls, gpr_intptr value) { |
||||
GPR_ASSERT(0 == pthread_setspecific(tls->key, (void*)value)); |
||||
return value; |
||||
} |
||||
|
||||
#endif /* GPR_PTHREAD_TLS */ |
@ -1 +0,0 @@ |
||||
gRPC C# is work-in-progress and is not intended to be used. See README. |
@ -0,0 +1,26 @@ |
||||
<?xml version="1.0" encoding="utf-8"?> |
||||
<package> |
||||
<metadata> |
||||
<id>Grpc.Auth</id> |
||||
<title>gRPC C# Auth</title> |
||||
<summary>Auth library for C# implementation of gRPC - an RPC library and framework</summary> |
||||
<description>Auth library for C# implementation of gRPC - an RPC library and framework. See project site for more info.</description> |
||||
<version>0.5.0</version> |
||||
<authors>Google Inc.</authors> |
||||
<owners>jtattermusch</owners> |
||||
<licenseUrl>https://github.com/grpc/grpc/blob/master/LICENSE</licenseUrl> |
||||
<projectUrl>https://github.com/grpc/grpc</projectUrl> |
||||
<requireLicenseAcceptance>false</requireLicenseAcceptance> |
||||
<releaseNotes>Release 0.5.0 of gRPC C#</releaseNotes> |
||||
<copyright>Copyright 2015, Google Inc.</copyright> |
||||
<tags>gRPC RPC Protocol HTTP/2 Auth OAuth2</tags> |
||||
<dependencies> |
||||
<dependency id="BouncyCastle" version="1.7.0" /> |
||||
<dependency id="Google.Apis.Auth" version="1.9.1" /> |
||||
<dependency id="Grpc.Core" version="0.5.0" /> |
||||
</dependencies> |
||||
</metadata> |
||||
<files> |
||||
<file src="bin/Release/Grpc.Auth.dll" target="lib/net45" /> |
||||
</files> |
||||
</package> |
@ -1,23 +1,22 @@ |
||||
<?xml version="1.0" encoding="utf-8"?> |
||||
<package > |
||||
<package> |
||||
<metadata> |
||||
<id>Grpc</id> |
||||
<title>gRPC</title> |
||||
<summary>C# implementation of gRPC - an RPC library and framework</summary> |
||||
<description>C# implementation of gRPC - an RPC library and framework. See project site for more info. |
||||
This is an experimental release, not ready to use. |
||||
</description> |
||||
<version>0.2.0</version> |
||||
<description>C# implementation of gRPC - an RPC library and framework. See project site for more info.</description> |
||||
<version>0.5.0</version> |
||||
<authors>Google Inc.</authors> |
||||
<owners>jtattermusch</owners> |
||||
<licenseUrl>https://github.com/grpc/grpc/blob/master/LICENSE</licenseUrl> |
||||
<projectUrl>https://github.com/grpc/grpc</projectUrl> |
||||
<requireLicenseAcceptance>false</requireLicenseAcceptance> |
||||
<releaseNotes>The first experimental release. Not ready to use.</releaseNotes> |
||||
<releaseNotes>Release 0.5.0 of gRPC C#</releaseNotes> |
||||
<copyright>Copyright 2015, Google Inc.</copyright> |
||||
<tags>gRPC RPC Protocol HTTP/2</tags> |
||||
<dependencies> |
||||
<dependency id="Grpc.Core" version="0.2.0" /> |
||||
<dependency id="Grpc.Core" version="0.5.0" /> |
||||
</dependencies> |
||||
</metadata> |
||||
<files/> |
||||
</package> |
||||
|
@ -0,0 +1,16 @@ |
||||
@rem Builds NuGet packages |
||||
|
||||
@rem Adjust the location of nuget.exe |
||||
set NUGET=C:\nuget\nuget.exe |
||||
|
||||
@call buildall.bat || goto :error |
||||
|
||||
%NUGET% pack Grpc.Core\Grpc.Core.nuspec || goto :error |
||||
%NUGET% pack Grpc.Auth\Grpc.Auth.nuspec || goto :error |
||||
%NUGET% pack Grpc.nuspec || goto :error |
||||
|
||||
goto :EOF |
||||
|
||||
:error |
||||
echo Failed! |
||||
exit /b %errorlevel% |
@ -0,0 +1,18 @@ |
||||
@rem Convenience script to build gRPC C# from command line |
||||
|
||||
setlocal |
||||
@rem Set VS variables (uses Visual Studio 2013) |
||||
@call "%VS120COMNTOOLS%\..\..\vc\vcvarsall.bat" x86 |
||||
|
||||
@rem Build the C# native extension |
||||
msbuild ..\..\vsprojects\grpc.sln /t:grpc_csharp_ext || goto :error |
||||
|
||||
msbuild Grpc.sln /p:Configuration=Debug || goto :error |
||||
msbuild Grpc.sln /p:Configuration=Release || goto :error |
||||
endlocal |
||||
|
||||
goto :EOF |
||||
|
||||
:error |
||||
echo Failed! |
||||
exit /b %errorlevel% |
@ -0,0 +1,50 @@ |
||||
/*
|
||||
* |
||||
* Copyright 2015, Google Inc. |
||||
* All rights reserved. |
||||
* |
||||
* Redistribution and use in source and binary forms, with or without |
||||
* modification, are permitted provided that the following conditions are |
||||
* met: |
||||
* |
||||
* * Redistributions of source code must retain the above copyright |
||||
* notice, this list of conditions and the following disclaimer. |
||||
* * Redistributions in binary form must reproduce the above |
||||
* copyright notice, this list of conditions and the following disclaimer |
||||
* in the documentation and/or other materials provided with the |
||||
* distribution. |
||||
* * Neither the name of Google Inc. nor the names of its |
||||
* contributors may be used to endorse or promote products derived from |
||||
* this software without specific prior written permission. |
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
* |
||||
*/ |
||||
|
||||
#include "completion_queue.h" |
||||
|
||||
#include <php.h> |
||||
|
||||
grpc_completion_queue *completion_queue; |
||||
|
||||
void grpc_php_init_completion_queue(TSRMLS_D) { |
||||
completion_queue = grpc_completion_queue_create(); |
||||
} |
||||
|
||||
void grpc_php_shutdown_completion_queue(TSRMLS_D) { |
||||
grpc_completion_queue_shutdown(completion_queue); |
||||
while (grpc_completion_queue_next(completion_queue, gpr_inf_future).type != |
||||
GRPC_QUEUE_SHUTDOWN) |
||||
; |
||||
grpc_completion_queue_destroy(completion_queue); |
||||
} |
@ -0,0 +1,50 @@ |
||||
/*
|
||||
* |
||||
* Copyright 2015, Google Inc. |
||||
* All rights reserved. |
||||
* |
||||
* Redistribution and use in source and binary forms, with or without |
||||
* modification, are permitted provided that the following conditions are |
||||
* met: |
||||
* |
||||
* * Redistributions of source code must retain the above copyright |
||||
* notice, this list of conditions and the following disclaimer. |
||||
* * Redistributions in binary form must reproduce the above |
||||
* copyright notice, this list of conditions and the following disclaimer |
||||
* in the documentation and/or other materials provided with the |
||||
* distribution. |
||||
* * Neither the name of Google Inc. nor the names of its |
||||
* contributors may be used to endorse or promote products derived from |
||||
* this software without specific prior written permission. |
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
* |
||||
*/ |
||||
|
||||
#ifndef GRPC_PHP_GRPC_COMPLETION_QUEUE_H_ |
||||
#define GRPC_PHP_GRPC_COMPLETION_QUEUE_H_ |
||||
|
||||
#include <php.h> |
||||
|
||||
#include <grpc/grpc.h> |
||||
|
||||
/* The global completion queue for all operations */ |
||||
extern grpc_completion_queue *completion_queue; |
||||
|
||||
/* Initializes the completion queue */ |
||||
void grpc_php_init_completion_queue(TSRMLS_D); |
||||
|
||||
/* Shut down the completion queue */ |
||||
void grpc_php_shutdown_completion_queue(TSRMLS_D); |
||||
|
||||
#endif /* GRPC_PHP_GRPC_COMPLETION_QUEUE_H_ */ |
@ -0,0 +1,66 @@ |
||||
# Copyright 2015, Google Inc. |
||||
# All rights reserved. |
||||
# |
||||
# Redistribution and use in source and binary forms, with or without |
||||
# modification, are permitted provided that the following conditions are |
||||
# met: |
||||
# |
||||
# * Redistributions of source code must retain the above copyright |
||||
# notice, this list of conditions and the following disclaimer. |
||||
# * Redistributions in binary form must reproduce the above |
||||
# copyright notice, this list of conditions and the following disclaimer |
||||
# in the documentation and/or other materials provided with the |
||||
# distribution. |
||||
# * Neither the name of Google Inc. nor the names of its |
||||
# contributors may be used to endorse or promote products derived from |
||||
# this software without specific prior written permission. |
||||
# |
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
|
||||
# Dockerfile for the gRPC Java dev image |
||||
FROM grpc/java_base |
||||
|
||||
# Required by accessing Android's aapt |
||||
RUN apt-get install -y lib32stdc++6 lib32z1 && apt-get clean |
||||
|
||||
# Install Android SDK 24.2 |
||||
RUN curl -L http://dl.google.com/android/android-sdk_r24.2-linux.tgz | tar xz -C /usr/local |
||||
|
||||
# Environment variables |
||||
ENV ANDROID_HOME /usr/local/android-sdk-linux |
||||
ENV PATH $PATH:$ANDROID_HOME/tools |
||||
ENV PATH $PATH:$ANDROID_HOME/platform-tools |
||||
# Some old Docker versions consider '/' as HOME |
||||
ENV HOME /root |
||||
|
||||
# Update sdk for android 5.1 (API level 22) |
||||
RUN echo y | android update sdk --all --filter platform-tools,build-tools-22.0.1,sys-img-armeabi-v7a-android-22,android-22,extra-android-m2repository,extra-google-m2repository --no-ui --force |
||||
|
||||
# Create an AVD with API level 22 |
||||
RUN echo no | android create avd --force -n avd-api-22 -t android-22 |
||||
|
||||
# Pull gRPC Java and trigger download of needed Maven and Gradle artifacts. |
||||
RUN git clone --depth 1 https://github.com/grpc/grpc-java.git /var/local/git/grpc-java && \ |
||||
cd /var/local/git/grpc-java && \ |
||||
./gradlew grpc-core:install grpc-stub:install grpc-okhttp:install grpc-protobuf-nano:install && \ |
||||
rm -r "$(pwd)" |
||||
|
||||
# Pull gRPC Android integration test App |
||||
RUN git clone --depth 1 https://github.com/madongfly/grpc-android-test.git /var/local/git/grpc-android-test |
||||
|
||||
# Config android sdk for gradle |
||||
RUN cd /var/local/git/grpc-android-test && echo "sdk.dir=/usr/local/android-sdk-linux" > local.properties |
||||
|
||||
# Build apks to trigger download of needed Maven and Gradle artifacts. |
||||
RUN cd /var/local/git/grpc-android-test && ./gradlew assembleDebug |
||||
RUN cd /var/local/git/grpc-android-test && ./gradlew assembleDebugAndroidTest |
@ -0,0 +1,42 @@ |
||||
GRPC Android Dockerfile |
||||
==================== |
||||
|
||||
Dockerfile for creating the gRPC Android integration test image |
||||
|
||||
As of 2015/05 this |
||||
- is based on the gRPC Java base |
||||
- installs Android sdk 24.2 |
||||
- creates an AVD for API level 22 |
||||
- Pulls gRpc Android test App from github |
||||
|
||||
Usage |
||||
----- |
||||
|
||||
Start the emulator in a detached container, the argument is the name of the AVD you want to start: |
||||
|
||||
``` |
||||
$ sudo docker run --name=grpc_android_test -d grpc/android /var/local/git/grpc-android-test/start-emulator.sh avd-api-22 |
||||
``` |
||||
|
||||
You can use the following cammand to wait until the emulator is ready: |
||||
``` |
||||
$ sudo docker exec grpc_android_test /var/local/git/grpc-android-test/wait-for-emulator.sh |
||||
``` |
||||
|
||||
When you want to update the apk, run: |
||||
``` |
||||
$ sudo docker exec grpc_android_test /var/local/git/grpc-android-test/update-apk.sh |
||||
``` |
||||
It will pull the fresh code of gRpc Java and our integration test app from github, build and install it to the runing emulator (so you need to make sure there is a runing emulator). |
||||
|
||||
Trigger the integration test: |
||||
``` |
||||
$ sudo docker exec grpc_android_test /var/local/git/grpc-android-test/run-test.sh -e server_host <hostname or ip address> -e server_port 8030 -e server_host_override foo.test.google.fr -e use_tls true -e use_test_ca true |
||||
``` |
||||
|
||||
You can also use the android/adb cammands to get more info, such as: |
||||
``` |
||||
$ sudo docker exec grpc_android_test android list avd |
||||
$ sudo docker exec grpc_android_test adb devices |
||||
$ sudo docker exec grpc_android_test adb logcat |
||||
``` |
File diff suppressed because one or more lines are too long
Loading…
Reference in new issue