blob: 44281f671febe49daba281154fd0e157e8fc97d8 [file] [log] [blame] [view] [edit]
# contrib/
This folder provides some functionality that may not be 100% supported yet.
Things here may break at any time and are not necessarily expected to be updated before the breaking changes are accepted.
## gen_call_scripts, call_templates/ and call_scripts/
The `call_templates` directory contains a set of example json input files for making api calls.
The `call_scripts` directory is an ignored directory generated by the `gen_call_scripts` script.
`gen_call_scripts` will create scripts of the form `service__method` that call their corresponding endpoint.
They look for `service__method_input.json` files and write to `service__method_output.json` in the call_scripts directory.
### Getting Started
To do the generation:
```bash
cd ~/chromiumos/chromite/api/contrib/
./gen_call_scripts
```
Then to run a specific endpoint (e.g. chromite.api.VersionService/Get):
```bash
cd call_scripts/
./version__get
```
Which will produce something like:
```text
Running chromite.api.VersionService/Get
13:16:21: DEBUG: Services registered successfully.
Completed chromite.api.VersionService/Get
Success!
Return Code: 0
Result:
{
"version": {
"major": 1
}
}
```
Everything between `Running ...` and `Completed ...` in the output is the output produced by the endpoint itself.
The `Result:` portion is simply the output.json file contents, e.g. `cat version__get_output.json`.
### Non-execution Runs
The Build API supports a validate-only calls that only validates the provided input,
and mock calls to mock a validation input failure, or provide static mock success or failure outputs without actually executing the endpoint.
These call types allow validating the implementation of a caller against the version of the API it is calling.
For example, the CI recipes will eventually be able to use them to validate the recipes against factory and firmware branches even as we.
These are *not* expected to be terribly useful for manual executions,
but calls with the options set in the API config option to validate their behavior is supported.
By default, it will generate an execution config (i.e. run the endpoint).
### Contributing New Templates
The example templates are just JSON formatted request proto messages.
Currently, only one per endpoint is supported for the generation process,
but providing multiple examples is encouraged for manual use when it makes sense.
`gen_call_scripts` has a `-b`/`--build-target` option that is used when generating the inputs from the example files.
The option allows generating your input files and substituting in a specific build target everywhere.
In order to support this feature, simply replace a specific build target name in the example input (e.g. `"betty"`) with `"%(build_target)s"`.
The templates also support two other variables to make adding generic templates easier: `chroot` and `src_root`.
The `chroot` variable subs in the full, default path to the chroot.
The `src_root` variable subs in the path to your checkout, which is typically somewhere like `~/chromiumos`.
### Notes
The `call_scripts/` input files are only overwritten when generating for a new build target (`-b`/`--build-target`), or using the `--force` option.
The only exception is that new templates in `call_templates/` will replace empty inputs (i.e. those containing just `{}`),
which is what `gen_call_scripts` produces when it has no example input file.
`call_scripts/` may be deleted at any time and will be regenerated from scratch,
you will only lose any custom input files and any previously generated output files.
You must be aware of the context of the endpoints for everything to work properly.
These scripts only provide a more convenient way to call the endpoints, there is no automatic precondition checking or running.
For example, you must manually run the endpoints to create the sysroot and build packages before running `image__create`.
The endpoints are capable of using an existing sysroot, but compatibility is not guaranteed.
This is especially true for endpoints that have specific USE flags that differ from those used to build out your sysroot.
Often endpoints that are extracting data (e.g. the ArtifactsService) will work with any existing sysroot.