# googleapis-raw
These are raw bindings for Google APIs based on [`grpcio`](https://github.com/pingcap/grpc-rs).
## Version notes
This library is currently locked to grpcio 0.13.0 and protobuf 2.28.0. This is due to
an [internal dependency of grpcio](https://github.com/tikv/grpc-rs/issues/584). Be sure that you match
these library versions in your library or application.
## Documentation
To generate and open documentation, run:
```sh
cargo doc --open
```
## Examples
To run hand-written examples, try:
```sh
cargo run --example spanner-query
cargo run --example bigtable-query
```
## Setting up Google Cloud SDK
Before running examples, make sure the Google Cloud SDK is set up in your environment.
If you need help, follow these guides:
1. [Installing the SDK](https://cloud.google.com/sdk/install)
2. [Setting up the SDK](https://cloud.google.com/sdk/docs/initializing)
3. [Getting started with Authentication](https://cloud.google.com/docs/authentication/getting-started)
As a final check:
* Run `gcloud info` to see the SDK configuration.
* Run `echo $GOOGLE_APPLICATION_CREDENTIALS` to verify that the credentials have been set up.
* Run `gcloud auth login` to login into Google Cloud
There is Docker setup available that installs all necessary tools, libraries, see the [README](../docker/README.md)
inside the `./docker` folder.
Useful links for setting up specific Google services:
* [Setting up Spanner](https://cloud.google.com/spanner/docs/getting-started/set-up)
* [Installing the Cloud SDK for Cloud Bigtable](https://cloud.google.com/bigtable/docs/installing-cloud-sdk)
* [Quickstart using the Pub/Sub CLI tool](https://cloud.google.com/pubsub/docs/quickstart-cli)
## Generating Rust bindings from `.proto` files
**NOTE:** You may need to update these bindings after protobuf updates.
The process requires an update to the `protobuf-codegen` cargo plugin.
This requires the installation of [protobuf](https://google.github.io/proto-lens/installing-protoc.html) library
and [protoc-gen-rust](https://github.com/stepancheg/rust-protobuf/tree/master/protobuf-codegen), a plugin
for protobuf. The installed protobuf version and the protobuf crate should have the same version, e.g. `2.7.0`.
Installation of the protoc-gen-rust plugin is done via `cargo`:
```sh
cargo install protobuf-codegen
```
Make sure the `protoc-gen-rust` binary is available in your `$PATH` env variable.
Then:
1) In the `./src` directory, remove all the `*.rs` that are not
`mod.rs` [1]. You may wish to run the `prepare.sh` script.
2) Run the `./generate.sh` script
ensure that a proper build works by running `cargo build`.
_[1] The `generate.sh` script will NOT generate the required `mod.rs` files for the directories. In addition, the generated rust modules will look for several modules that are `super` to their package. `protoc` may not overwrite an existing, generated rust file which could lead to complications. It's easiest if you simily leave the `mod.rs` files in place and remove the other rust files, or copy the `mod.rs` files from a backup. Running a `cargo build` will definitely identify the modules that may be missing and that you'll have to add via a line like:_
```rust
pub(crate) use crate::{
empty,
iam::v1::{iam_policy, policy},
longrunning::operations,
};
```
_(which was taken from `src/rpc/spanner/admin/instance/v1/mod.rs`)_
Please note that the source grpc repo may contiain one or more older submodule references that may
need to be updated (e.g. `.grpc/third_party/googleapis`). This may require manual updating as well
as manunal updating/correction of the various, `mod.rs` files. Pay close attention to interdependencies.
These may need to be specified in the directory mods (see `.src/storage/v1/mod.rs` for an example.
Remember, you can use the `r#` prefix in rust to except a reserved name for use, e.g.
`use mod crate::r#type`)
## Monitoring for changes
Google will introduce changes and modifications to the GRPC interface for spanner, bigtable and other service. You are STRONGLY encouraged to monitor the [project release notes](https://cloud.google.com/release-notes/all) (particularly for [Spanner](https://cloud.google.com/spanner/docs/release-notes) and [BigTable](https://cloud.google.com/bigtable/docs/release-notes), as well as any other service this library should start to support). RSS feeds are available for these release notes, and are listed on their respective pages.
### When Updating
When initializing the submodule dependencies, you can use
`git submodule update --init --recursive`
to do a targeted update of the grpc code:
```bash
git submodule update --remote grpc
pushd grpc/third_party
git submodule update --remote protobuf
git submodule update --remote googleapis
popd
```
to pull a version of the libraries you require. Unfortunately, I have found that `git submodule update` does **NOT** always properly update dependencies to the latest master/main version.
Be sure that the `grpc/third_party/googleapis` submodule is updated at least once per quarter. This directory contains the Protobuf declarations and can often contain undisclosed changes that need to be reflected into the generated code.
**NOTE**: this may alter the pre-generated mod files requiring old
modules to be dropped or new modules to be added. Ensure that the
various `mod.rs` files capture these changes.
## Google Cloud Console
Links to Google Cloud Console for our testing environment:
* [Spanner Console](https://console.cloud.google.com/spanner/instances?project=mozilla-rust-sdk-dev)
* [Bigtable Console](https://console.cloud.google.com/bigtable/instances?project=mozilla-rust-sdk-dev)
* [Pub/Sub Console](https://console.cloud.google.com/cloudpubsub/topic/detail/mytopic?project=mozilla-rust-sdk-dev)
## References
Google APIs and their `.proto` files:
* [Spanner](https://github.com/googleapis/googleapis/tree/master/google/spanner)
* [Bigtable](https://github.com/googleapis/googleapis/tree/master/google/bigtable)
* [Pub/Sub](https://github.com/googleapis/googleapis/tree/master/google/pubsub)
Golang clients:
* [Spanner client](https://github.com/googleapis/google-cloud-go/tree/master/spanner)
([docs](https://godoc.org/cloud.google.com/go/spanner))
* [Bigtable client](https://github.com/googleapis/google-cloud-go/tree/master/bigtable)
([docs](https://godoc.org/cloud.google.com/go/bigtable))
* [Pub/Sub client](https://github.com/googleapis/google-cloud-go/tree/master/pubsub)
([docs](https://godoc.org/cloud.google.com/go/pubsub))