Metadata-Version: 2.1
Name: yapi-ci
Version: 0.1.2
Summary: Using yaml to talk to APIs in an automated, descriptive way.
Home-page: https://github.com/bruj0/yapi
Author: Rodrigo Diaz Leven
Author-email: ramakandra@gmail.com
License: MIT
Platform: UNKNOWN
Classifier: Programming Language :: Python :: 3
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: OS Independent
Requires-Python: >=3.6
Description-Content-Type: text/markdown
Requires-Dist: certifi (>=2019.9.11)
Requires-Dist: chardet (>=3.0.4)
Requires-Dist: flatten-json (>=0.1.7)
Requires-Dist: idna (>=2.8)
Requires-Dist: python-box (>=3.4.5)
Requires-Dist: PyYAML (>=5.1.2)
Requires-Dist: requests (>=2.22.0)
Requires-Dist: requests-toolbelt (>=0.9.1)
Requires-Dist: six (>=1.13.0)
Requires-Dist: urllib3 (>=1.25.6)

# Description of yapi

It allows to use declarative language (yaml) to talk to APIs and to save the response for future ones.

The main use case is to talk to [HashiCorp Vault API](https://www.vaultproject.io/api/overview.html).

It is heavily based on [Tavern-ci](https://github.com/taverntesting/tavern)
# How to use it
For this example we will use `http://httpbin.org/put` as `VAULT_ADDR`, this service will echo everything we send plus extra information about our request.

```c
$ export VAULT_ADDR=http://httpbin.org/put
$ export VAULT_CLUSTER=primary
$ python -m yapi examples/vault-init.yaml
2019-11-06 13:19:49,733 [INFO]: Starting yapi 0.1
2019-11-06 13:19:49,738 [INFO]: Loading examples/vault-init.yaml
2019-11-06 13:19:49,738 [INFO]: Start of stage: 01-Init Vault
2019-11-06 13:19:49,739 [INFO]: Body of request:
{
    "keys": [
        "7f921414b13ad05eb844dc349423765d857e8175b48c5854ada0e24e96924ac2"
    ],
    "secret_shares": "1",
    "secret_threshold": "1"
}
2019-11-06 13:19:49,936 [INFO]: Received status code OK 200 == 200
2019-11-06 13:19:49,936 [INFO]: Writing to examples/data/primary/init.json
2019-11-06 13:19:49,937 [INFO]: End of stage: 01-Init Vault
2019-11-06 13:19:49,937 [INFO]: Start of stage: 02-Unseal Vault
2019-11-06 13:19:49,937 [INFO]: Reading examples/data/primary/init.json , sub_vars: True
2019-11-06 13:19:49,938 [INFO]: Body of request:
{
    "keys": "7f921414b13ad05eb844dc349423765d857e8175b48c5854ada0e24e96924ac2"
}
2019-11-06 13:19:50,132 [INFO]: Received status code OK 200 == 200
2019-11-06 13:19:50,132 [INFO]: Writing to examples/data/primary/unsealed_response.json
2019-11-06 13:19:50,133 [INFO]: End of stage: 02-Unseal Vault
2019-11-06 13:19:50,133 [INFO]: Finished examples/vault-init.yaml
```

# Example file vault-init.yaml
```yaml
---
stages:
  - name: 01-Init Vault
    request:
      url: "{env_vars.VAULT_ADDR}"
      method: PUT
      json:
        secret_shares: 1
        secret_threshold: 1
        keys:
           - 7f921414b13ad05eb844dc349423765d857e8175b48c5854ada0e24e96924ac2
    response:
      status_code: 200
      save:
        $ext:
          function: extensions.save_response
          extra_kwargs:
            path: "examples/data/{env_vars.VAULT_CLUSTER}/init.json"
  - name: 02-Unseal Vault
    request:
      url: "{env_vars.VAULT_ADDR}"
      method: PUT
      json:
        keys: "{ext.json_keys_0}"
        $ext:
          function: extensions.read_json
          extra_kwargs:
            path: "examples/data/{env_vars.VAULT_CLUSTER}/init.json"
            sub_vars: True
    response:
      status_code: 200
      save:
        $ext:
          function: extensions.save_response
          extra_kwargs:
            path: "examples/data/{env_vars.VAULT_CLUSTER}/unsealed_response.json"
```

### The first stage called `01-Init Vault`
- `env_vars.VAULT_ADDR` will be replaced by the enviromental variable `$VAULT_ADDR` as is the same with all variables starting with `env_vars.`
- Do a `GET` call to `url`
- The json sent to the API will be:
```json
{
    "keys": [
        "7f921414b13ad05eb844dc349423765d857e8175b48c5854ada0e24e96924ac2"
    ],
    "secret_shares": "1",
    "secret_threshold": "1"
}
```
- It expects a HTTP response of `200` or it will error out.
- It will save the output of the response as a json file under `data/{env_vars.VAULT_CLUSTER}/init.json`

### The second stage called `02-Unseal Vault` 
- Replace replace variables that start with `{env_vars.}` with environmental variables.
- Read `data/{env_vars.VAULT_CLUSTER}/init.json` and replace variables that start with `ext.` in the body with data from the json when `sub_vars` is set to `True`.
```json
  "json": {
    "keys": [
      "7f921414b13ad05eb844dc349423765d857e8175b48c5854ada0e24e96924ac2"
    ], 
```

Becomes:

```yaml
keys: "{ext.json_keys_0}"
```

- Do a `PUT` call to `url`
- With the json:
```json
{
    "keys": "7f921414b13ad05eb844dc349423765d857e8175b48c5854ada0e24e96924ac2"
}
```
- It will expect a `200` response code or error out.
- It will save the response to `data/{env_vars.VAULT_CLUSTER}/unsealed_response.json`


## TODO 
- [ ] Inject response as a variable to the next stage without having to read it
- [ ] Create `PyPi` package for easy installation

