mirror of https://github.com/grpc/grpc.git
The C based gRPC (C++, Python, Ruby, Objective-C, PHP, C#)
https://grpc.io/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
182 lines
6.5 KiB
182 lines
6.5 KiB
#!/bin/bash |
|
# 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. |
|
|
|
|
|
# Triggers the build of a GCE 'grpc-docker' instance. |
|
# |
|
# Usage: |
|
# /path/to/new_grpc_docker_builder.sh \ |
|
# [--project <cloud-project-id> | -p<cloud-project-id>] \ |
|
# [--instance <instance-to-create> | -i<instance-to-create>] \ |
|
# [--address <named_cloud_static_ip> | -a<named_cloud_static_ip>] |
|
# |
|
# To run a new docker builder instance. |
|
# $ /path/to/new_grpc_docker_builder.sh -pmy-project -imy-instance -amy-ip |
|
# |
|
# See main() for the full list of flags |
|
|
|
function this_dir() { |
|
SCRIPT_PATH="${BASH_SOURCE[0]}"; |
|
if ([ -h "${SCRIPT_PATH}" ]) then |
|
while([ -h "${SCRIPT_PATH}" ]) do SCRIPT_PATH=`readlink "${SCRIPT_PATH}"`; done |
|
fi |
|
pushd . > /dev/null |
|
cd `dirname ${SCRIPT_PATH}` > /dev/null |
|
SCRIPT_PATH=`pwd`; |
|
popd > /dev/null |
|
echo $SCRIPT_PATH |
|
} |
|
|
|
source $(this_dir)/compute_extras.sh |
|
source $(this_dir)/grpc_docker.sh |
|
|
|
cp_startup_script() { |
|
local script_dir=$1 |
|
[[ -n $script_dir ]] || { echo "missing arg: script_dir" 1>&2; return 1; } |
|
|
|
local gs_script_root=$2 |
|
[[ -n $gs_script_root ]] || { echo "missing arg: gs_script_root" 1>&2; return 1; } |
|
|
|
local script_path=$3 |
|
[[ -n $script_path ]] || { echo "missing arg: script_name" 1>&2; return 1; } |
|
|
|
local startup_script=$script_dir/$script_path |
|
local gs_startup_uri=$gs_script_root/$script_path |
|
gsutil cp $startup_script $gs_startup_uri |
|
} |
|
|
|
# add_instance adds a generic instance that runs |
|
# new_grpc_docker_builder_on_startup.sh on startup |
|
add_instance() { |
|
local project=$1 |
|
[[ -n $project ]] || { echo "missing arg: project" 1>&2; return 1; } |
|
local gs_admin_root=$2 |
|
[[ -n $gs_admin_root ]] || { echo "missing arg: gs_admin_root" 1>&2; return 1; } |
|
local instance=$3 |
|
[[ -n $instance ]] || { echo "missing arg: instance" 1>&2; return 1; } |
|
local zone=$4 |
|
[[ -n $zone ]] || { echo "missing arg: zone" 1>&2; return 1; } |
|
local address=$5 |
|
[[ -n $address ]] || { echo "missing arg: address" 1>&2; return 1; } |
|
|
|
local script_dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" |
|
local gs_script_root="$gs_admin_root/startup" |
|
|
|
local on_startup=new_grpc_docker_builder_on_startup.sh |
|
local gs_on_startup=$gs_script_root/$on_startup |
|
cp_startup_script $script_dir $gs_script_root $on_startup || { |
|
echo "Could not save script to $gs_on_startup" 1>&2 |
|
return 1 |
|
} |
|
startup_md="startup-script-url=$gs_on_startup" |
|
|
|
local shared_startup=shared_startup_funcs.sh |
|
local gs_shared_startup=$gs_script_root/$shared_startup |
|
cp_startup_script $script_dir $gs_script_root $shared_startup || { |
|
echo "Could not save script to $gs_shared_startup" 1>&2 |
|
return 1 |
|
} |
|
startup_md+=" shared_startup_script_url=$gs_shared_startup" |
|
|
|
local docker_dir=$(this_dir)/../dockerfile |
|
grpc_push_dockerfiles $docker_dir $gs_admin_root || return 1; |
|
startup_md+=" gs_dockerfile_root=$gs_admin_root/dockerfile" |
|
startup_md+=" gs_docker_reg=$gs_admin_root/docker_images" |
|
|
|
local address_flag="" |
|
local the_address=$(find_named_ip $address) |
|
[[ -n $the_address ]] && address_flag="--address $the_address" |
|
local the_image='container-vm-v20140925' |
|
local scopes='compute-rw storage-full' |
|
scopes+=' https://www.googleapis.com/auth/xapi.zoo' |
|
gcloud --project $project compute instances create $instance \ |
|
$address_flag \ |
|
--image $the_image \ |
|
--image-project google-containers \ |
|
--metadata $startup_md \ |
|
--machine-type='n1-standard-1' \ |
|
--scopes $scopes \ |
|
--tags grpc testing \ |
|
--zone $zone \ |
|
--boot-disk-size 500GB |
|
} |
|
|
|
main() { |
|
local INSTANCE_NAME="grpc-docker-builder" |
|
local PROJECT="stoked-keyword-656" |
|
local GS_ADMIN_ROOT="gs://tmp-grpc-dev/admin" |
|
local ZONE='asia-east1-a' |
|
local ADDRESS_NAME='grpc-php-dev-static-1' # use 'none' if no static ip is needed |
|
|
|
# Parse the options |
|
opts=`getopt -o a::p::g::i::z:: --long address_name::,project::,gs_admin_root::,instance_name::,zone:: -n $0 -- "$@"` |
|
eval set -- "$opts" |
|
while true ; do |
|
case "$1" in |
|
-p|--project) |
|
case "$2" in |
|
"") shift 2 ;; |
|
*) PROJECT=$2; shift 2 ;; |
|
esac ;; |
|
-a|--address_name) |
|
case $2 in |
|
"") shift 2 ;; |
|
*) ADDRESS_NAME=$2; shift 2 ;; |
|
esac ;; |
|
-g|--gs_admin_root) |
|
case "$2" in |
|
"") shift 2 ;; |
|
*) GS_ADMIN_ROOT=$2; shift 2 ;; |
|
esac ;; |
|
-i|--instance_name) |
|
case "$2" in |
|
"") shift 2 ;; |
|
*) INSTANCE_NAME=$2; shift 2 ;; |
|
esac ;; |
|
-z|--zone) |
|
case "$2" in |
|
"") shift 2 ;; |
|
*) ZONE=$2; shift 2 ;; |
|
esac ;; |
|
--) shift ; break ;; |
|
*) echo "Internal error!" ; exit 1 ;; |
|
esac |
|
done |
|
|
|
# verify that the instance does not currently exist |
|
has_instance $PROJECT $INSTANCE_NAME && remove_instance $PROJECT $INSTANCE_NAME $ZONE |
|
has_instance $PROJECT $INSTANCE_NAME && { echo "$INSTANCE_NAME already exists" 1>&2; return 1; } |
|
|
|
# N.B the quotes around are necessary to allow cmds with spaces |
|
add_instance $PROJECT $GS_ADMIN_ROOT $INSTANCE_NAME $ZONE $ADDRESS_NAME |
|
} |
|
|
|
set -x |
|
main "$@"
|
|
|