Skip to main content

Dependencies

One of the most powerful features of Cortex is the ability to define dependencies on other services and resources. This powers many features, including automated notifications to owners when a dependency deprecates its API or makes backwards incompatible changes.

Catalog Descriptor

The x-cortex-dependency field allows you to define a list of dependencies. A dependency may be directed towards a service or resource, or more granularly, to a specific endpoint of that entity.

info:
x-cortex-dependency:
- tag: braavos
method: GET
path: /2.0/users/{username}
description: ensure user has payment information configured
metadata:
tags:
- billing
- identity
prod: true

Cortex automatically discovers dependencies between your services and AWS resources with a matching tag (see Discovery for details), but you can also specify a list of AWS tag key and value pairs to explicitly define dependencies. If you'd like to explicitly define these AWS dependencies, the x-cortex-dependency field should be a map, not a list. A service will have dependencies on all resources in Cortex for which the corresponding AWS resource has at least one tag key value pair matching the pairs in the specified list. For example, the service below will have dependencies on any AWS resource with tag (key = my-key-1, value = my-value-1) or tag (key = my-key-2, value = my-value-2).

x-cortex-dependency:
cortex:
- tag: braavos
method: GET
path: /2.0/users/{username}
description: ensure user has payment information configured
metadata:
tags:
- billing
- identity
prod: true
- tag: charlie
method: GET
path: /2.0/users/
aws:
tags:
- key: my-key-1
value: my-value-1
- key: my-key-2
value: my-value-2
FieldDescriptionOptional?
tagThe tag of the entity this entity depends on, i.e. the callee. See x-cortex-tagNo
methodHTTP method if depending on a specific endpointRequired if path is present
pathThe actual endpoint this dependency reffers toRequired if method is present
descriptionA description of the dependency.Yes
metadataJSON metadata tags for the relationship. Supports arbitrary objects.Yes

Discovery

Cortex can automatically discover dependencies from your integrations. Supported providers:

API

See API Docs for authentication details.

YAML is the source of truth

If a dependency has already been set through the cortex.yml, the API will return an error.

endpoints are optional

A dependency optionally references an endpoint (method and path) of the callee. If no endpoint is referenced it is assumed that the caller depends on all endpoints of the callee.

For all requests method or path are optional, however if one is present the other must also be present.

When interacting with an existing dependency, the method and path must be specified correctly to identify it.

FieldDescriptionOptional?
callerTagThe tag of the caller.No
calleeTagThe tag the caller depends on.No
methodHTTP method if depending on a specific endpointRequired if path is present
pathThe actual endpoint (as defined in the OpenAPI file) the caller depends onRequired if method is present
descriptionA description of the dependency.Yes
metadataJSON metadata tags for the relationship. Supports arbitrary objects.Yes
{
"callerTag": "my-service",
"calleeTag": "braavos",
"path": "/2.0/users/{username}",
"method": "GET",
"description": "ensure user has payment information configured",
"metadata": {
"tags": ["billing", "identity"],
"prod": true
}
}

Create a Dependency

POST /api/v1/catalog/{caller-tag}/dependencies/{callee-tag}?method={method}&path={path}

{
"description": "ensure user has payment information configured",
"metadata": {
"tags": ["billing", "identity"],
"prod": true
}
}

Retrieve a Dependency

GET /api/v1/catalog/{caller-tag}/dependencies/{callee-tag}?method={method}&path={path}

Update a Dependency

PUT /api/v1/catalog/{caller-tag}/dependencies/{callee-tag}?method={method}&path={path}

PUT replaces entire object

The request body is considered a modified version of the already existing entity. Leaving a field out of the JSON will be interpreted as null.

{
"description": "ensure user has payment information configured",
"metadata": {
"tags": ["billing", "identity"],
"prod": false
}
}

Delete a Dependency

DELETE /api/v1/catalog/{caller-tag}/dependencies/{callee-tag}?method={method}&path={path}

Bulk Create or Update Dependencies

PUT /api/v1/catalog/dependencies

PUT replaces entire object

The request body is considered a modified version of the already existing entity. Leaving a field out of the JSON will be interpreted as null.

{
"values": {
"my-service": [
{
"tag": "braavos",
"path": "/2.0/users/{username}",
"method": "GET",
"description": "ensure user has payment information configured",
"metadata": {
"tags": ["billing", "identity"],
"prod": true
}
}
],
"my-other-service": [
{
"tag": "my-service",
"path": "/1.0/widget/{id}",
"method": "GET",
"description": "get widget",
"metadata": {
"tags": ["widget"],
"prod": true
}
}
]
}
}