| #!/bin/bash -e |
| # Copyright 2021 The Fuchsia Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| # |
| # See usage() for description. |
| |
| script="$0" |
| script_dir="$(dirname "$script")" |
| project_root="$(readlink -f "$script_dir"/../../..)" |
| |
| function usage() { |
| cat <<EOF |
| Usage: $0 [options] |
| |
| This script updates the public protos needed for reproxy logs collection. |
| |
| options: |
| --reclient-srcdir DIR : location of re-client source |
| If none is provided, then this will checkout the source into a temp dir. |
| --remote-apis-srcdir DIR : location of remote-apis source |
| If none is provided, then this will checkout the source into a temp dir. |
| --googleapis-srcdir DIR : location of googleapis source |
| If none is provided, then this will checkout the source into a temp dir. |
| |
| EOF |
| notice |
| } |
| |
| function notice() { |
| cat <<EOF |
| This populates the Fuchsia source tree with the following (gitignore'd) files: |
| |
| build/rbe/proto/: |
| api/log/log.proto |
| api/log/log_pb2.py |
| api/stats/stats.proto |
| api/stats/stats_pb2.py |
| go/api/command/command.proto |
| go/api/command/command_pb2.py |
| and more... |
| third_party/protobuf/python/: |
| timestamp_pb2.py |
| descriptor_pb2.py |
| and more... |
| EOF |
| } |
| |
| RECLIENT_SRCDIR= |
| REMOTE_APIS_SRCDIR= |
| GOOGLEAPIS_SRCDIR= |
| |
| yes_to_all=0 |
| |
| prev_opt= |
| # Extract script options before -- |
| for opt |
| do |
| # handle --option arg |
| if test -n "$prev_opt" |
| then |
| eval "$prev_opt"=\$opt |
| prev_opt= |
| shift |
| continue |
| fi |
| # Extract optarg from --opt=optarg |
| case "$opt" in |
| *=?*) optarg=$(expr "X$opt" : '[^=]*=\(.*\)') ;; |
| *=) optarg= ;; |
| esac |
| |
| case "$opt" in |
| --help | -h ) usage; exit ;; |
| --reclient-srcdir=*) RECLIENT_SRCDIR="$optarg" ;; |
| --reclient-srcdir) prev_opt=RECLIENT_SRCDIR ;; |
| --remote-apis-srcdir=*) REMOTE_APIS_SRCDIR="$optarg" ;; |
| --remote-apis-srcdir) prev_opt=REMOTE_APIS_SRCDIR ;; |
| --googleapis-srcdir=*) GOOGLEAPIS_SRCDIR="$optarg" ;; |
| --googleapis-srcdir) prev_opt=GOOGLEAPIS_SRCDIR ;; |
| -y ) yes_to_all=1 ;; |
| *) echo "Unknown option: $opt" ; usage ; exit 1 ;; |
| esac |
| shift |
| done |
| |
| readonly DESTDIR="$script_dir" |
| |
| # Prompt. |
| test "$yes_to_all" = 1 || { |
| notice |
| echo |
| echo -n "Proceed? [y/n] " |
| read proceed |
| test "$proceed" = "y" || test "$proceed" = "Y" || { |
| echo "Stopping." |
| exit |
| } |
| } |
| |
| # TODO(fangism): choose a deterministic cache dir, |
| # and pull instead of re-cloning every time. |
| tmpdir="$(mktemp -d -t rbe_proto_refresh.XXXX)" |
| |
| # If reclient-srcdir is not provided, checkout in a tempdir |
| test -n "$RECLIENT_SRCDIR" || { |
| echo "Fetching re-client source." |
| pushd "$tmpdir" |
| git clone sso://team/foundry-x/re-client |
| popd |
| RECLIENT_SRCDIR="$tmpdir"/re-client |
| } |
| |
| echo "Installing protos from $RECLIENT_SRCDIR to $DESTDIR" |
| mkdir -p "$DESTDIR"/api/log |
| grep -v "bq_table.proto" "$RECLIENT_SRCDIR"/api/log/log.proto | \ |
| grep -v "option.*gen_bq_schema" > "$DESTDIR"/api/log/log.proto |
| mkdir -p "$DESTDIR"/api/stat |
| cp "$RECLIENT_SRCDIR"/api/stat/stat.proto "$DESTDIR"/api/stat/ |
| mkdir -p "$DESTDIR"/api/stats |
| cp "$RECLIENT_SRCDIR"/api/stats/stats.proto "$DESTDIR"/api/stats/ |
| |
| |
| test -n "$REMOTE_APIS_SRCDIR" || { |
| echo "Fetching bazelbuild/remote-apis source." |
| pushd "$tmpdir" |
| git clone https://github.com/bazelbuild/remote-apis.git |
| popd |
| REMOTE_APIS_SRCDIR="$tmpdir"/remote-apis |
| } |
| |
| echo "Installing protos from $REMOTE_APIS_SRCDIR to $DESTDIR" |
| readonly re_proto_subdir=build/bazel |
| mkdir -p "$DESTDIR"/"$re_proto_subdir" |
| cp -r "$REMOTE_APIS_SRCDIR"/"$re_proto_subdir"/* "$DESTDIR"/"$re_proto_subdir"/ |
| |
| |
| test -n "$GOOGLEAPIS_SRCDIR" || { |
| echo "Fetching googleapis/googleapis source." |
| pushd "$tmpdir" |
| git clone https://github.com/googleapis/googleapis.git |
| popd |
| GOOGLEAPIS_SRCDIR="$tmpdir"/googleapis |
| } |
| |
| echo "Installing protos from $GOOGLEAPIS_SRCDIR to $DESTDIR" |
| mkdir -p "$DESTDIR"/google |
| cp -r "$GOOGLEAPIS_SRCDIR"/google/{api,longrunning,rpc} "$DESTDIR"/google/ |
| |
| |
| echo "Fetching proto from http://github.com/bazelbuild/remote-apis-sdks" |
| mkdir -p "$DESTDIR"/go/api/command |
| curl https://raw.githubusercontent.com/bazelbuild/remote-apis-sdks/master/go/api/command/command.proto > "$DESTDIR"/go/api/command/command.proto |
| |
| cd "$project_root" |
| # Disable build metrics to avoid upload_reproxy_logs.sh before it is usable. |
| protoc=(env FX_REMOTE_BUILD_METRICS=0 fx host-tool protoc) |
| echo "Compiling protobufs with protoc: ${protoc[@]}" |
| # TODO(fangism): provide prebuilt |
| # Caveat: if fx build-metrics is already enabled with RBE, this fx build may |
| # attempt to process and upload metrics before it is ready, and fail. |
| |
| # relative to $project_root: |
| readonly PROTOBUF_SRC=third_party/protobuf/src |
| readonly PROTOBUF_DEST=third_party/protobuf/python |
| |
| # Walk the proto imports recursive to find what needs to be compiled. |
| function walk_proto_imports() { |
| echo "$1" |
| local this="$1" |
| shift |
| local list |
| list=($(grep "^import" "$this" | cut -d'"' -f2)) |
| for f in "${list[@]}" |
| do |
| if test -f "$f" |
| then walk_proto_imports "$f" |
| else echo "$f" # assume that $f is in a different proto path |
| fi |
| done |
| } |
| |
| pushd build/rbe/proto # under $project_root |
| _proto_compile_list=( |
| # top-level protos: |
| $(walk_proto_imports rbe_metrics.proto) |
| $(walk_proto_imports api/log/log.proto) |
| ) |
| popd |
| |
| # Subset of these protos are in third_party/protobuf/src. |
| proto_compile_list=( |
| $(echo "${_proto_compile_list[@]}" | tr ' ' '\n' | sort -u) |
| ) |
| |
| # NOTE: These generated *_pb2.py are NOT checked-in. |
| echo "Compiling $DESTDIR protos to Python" |
| for proto in "${proto_compile_list[@]}" |
| do |
| case "$proto" in |
| google/protobuf/*) |
| # Generate third_party/protobuf/src -> third_party/protobuf/python. |
| echo " $proto (to $PROTOBUF_DEST) ..." |
| "${protoc[@]}" \ |
| -I="$PROTOBUF_SRC" \ |
| -I="$PROTOBUF_DEST" \ |
| --python_out="$PROTOBUF_DEST" \ |
| "$PROTOBUF_SRC"/"$proto" |
| ;; |
| *) # Everything else expected to be found in-place |
| echo " $proto (to $DESTDIR) ..." |
| "${protoc[@]}" \ |
| -I="$DESTDIR" \ |
| -I="$PROTOBUF_SRC" \ |
| --python_out="$DESTDIR" \ |
| "$DESTDIR"/"$proto" |
| ;; |
| esac |
| done |
| |
| # TODO(fangism): provide prebuilt package with protos already compiled. |
| # Placing these in "$DESTDIR" doesn't work, because imports get confused with |
| # the path to one of two locations with 'google.protobuf'. |
| |
| echo "Done." |
| |