| #!/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 "$@" |