| #!/bin/bash |
| # Startup script that initializes a grpc-dev GCE machine. |
| # |
| # A grpc-docker GCE machine is based on docker container image. |
| # |
| # On startup, it copies the grpc dockerfiles to a local directory, and update its address |
| # so that the docker containers within it have git-on-borg-access. |
| |
| # _load_metadata curls a metadata url |
| _load_metadata() { |
| local metadata_root=http://metadata/computeMetadata/v1 |
| local uri=$1 |
| [[ -n $uri ]] || { echo "missing arg: uri" >&2; return 1; } |
| |
| if [[ $uri =~ ^'attributes/' ]] |
| then |
| for a in $(curl -H "X-Google-Metadata-Request: True" $metadata_root/instance/attributes/) |
| do |
| [[ $uri =~ "/$a"$ ]] && { curl $metadata_root/instance/$uri -H "X-Google-Metadata-Request: True"; return; } |
| done |
| fi |
| |
| # if the uri is a full request uri |
| [[ $uri =~ ^$metadata_root ]] && { curl $uri -H "X-Google-Metadata-Request: True"; return; } |
| } |
| |
| _source_gs_script() { |
| local script_attr=$1 |
| [[ -n $script_attr ]] || { echo "missing arg: script_attr" >&2; return 1; } |
| |
| local gs_uri=$(_load_metadata "attributes/$script_attr") |
| [[ -n $gs_uri ]] || { echo "missing metadata: $script_attr" >&2; return 1; } |
| |
| local out_dir='/var/local/startup_scripts' |
| local script_path=$out_dir/$(basename $gs_uri) |
| mkdir -p $out_dir |
| gsutil cp $gs_uri $script_path || { |
| echo "could not cp $gs_uri -> $script_path" |
| return 1 |
| } |
| chmod a+rwx $out_dir $script_path |
| source $script_path |
| } |
| |
| main() { |
| local script_attr='shared_startup_script_url' |
| _source_gs_script $script_attr || { |
| echo "halting, script 'attributes/$script_attr' could not be sourced" |
| return 1 |
| } |
| grpc_dockerfile_pull |
| chmod -R a+rw /var/local/dockerfile |
| |
| # Install git and emacs |
| apt-get update && apt-get install -y git emacs || return 1 |
| |
| # Enable access to git repos on git-on-borg |
| local git_root='/var/local/git' |
| install_gob_daemon $git_root/gerrit-gcompute-tools || return 1 |
| |
| # Startup the docker registry |
| grpc_docker_launch_registry && grpc_docker_pull_known |
| |
| # Add a sentinel file to indicate that startup has completed. |
| local sentinel_file=/var/log/GRPC_DOCKER_IS_UP |
| touch $sentinel_file |
| } |
| |
| set -x |
| main "$@" |