#!/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 | -p] \ # [--instance | -i] \ # [--address | -a] # # 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 "$@"