A intel plugin builder for cartogaphy for API supporting OpenAPI.
Project description
cartography-openapi
cartography-openapi is a tool for generating modules for Cartography from specification files in OpenAPI format.
Why ?
Developing modules for Cartography can be confusing, especially regarding the data model and various requirements. Importing multiple resources can also be tedious.
With this in mind, cartography-openapi helps generate the skeleton of a module, allowing developers to focus on added value (drift detection, custom links, etc.).
For more details, refer to the Cartography developer documentation.
Supported formats
cartography-openapi supports importing files in OpenAPI v3 format.
For more details, refer to the OpenAPI Specification
How it's work
Parse
See cartography_openapi.parser.Parser._parse
- Parse the server block to try to determine the API
base_url. - Parse the components:
- List properties that will become fields (with types such as string, int, etc.).
- List properties that will become relationships to other nodes (fields that return another object).
- Parse the paths:
- Keep only paths with the
GETmethod that return known components. - Extract path parameters, query parameters, and body parameters.
- Keep only paths with the
Build
See cartography_openapi.parser.Parser.build_module
- Entities will be built in the order they were declared in the command invocation.
- For each entity, the tool will:
- Find the corresponding component in the API.
- Identify the best path (1) to enumerate the list of these components.
- Identify the best path (1) to access a single component.
- From the identified paths, determine if a parent entity can be defined.
Best path finding (1)
See cartography_openapi.component.Component.set_enumeration_path and cartography_openapi.component.Component.set_direct_path.
This part is the core of the tool’s functionality. It empirically determines:
- The paths used to list all entities.
- The paths used to access a specific component.
The logic is as follows:
If the path to access a Realm is /admin/realm/{realmId} and the path to access a Group is /admin/realm/{realmId}/group/{groupId}, then:
- Group is considered a sub-resource of Realm.
- An edge must exist between the two nodes.
- The enumeration must be handled recursively.
Path evaluation is based on the following criteria:
- No previous path
- Linkable vs non-linkable (the path is a sub-path of the direct path of another component)
- The new path is better because it has less parameters
- The new path is better because it is shorter (allow to prefer x/groups over x/groups-default)
Export
See cartography_openapi.module.Module.export
- The model (nodes & relationships) of each entity is exported to a specific file using a Jinja template.
- Each entity generates an "intel" file containing the logic to sync, get, transform, and load the entity into Cartography.
- The module generates the
__init__.pyfile for the module's intel, which calls each entity-specific file via thesyncfunction. - The
syncfunction, which will be called by Cartography, is built recursively to handle sub-resources:- Example: Synchronizing tenants
- For each tenant, synchronize environments
- For each environment, synchronize resources
- Example: Synchronizing tenants
Install
Using pypi
pip3 install cartography-openapi
Using poetry
poetry install
poetry run python3 cartography_openapi
Usage
Quick start
wget https://www.keycloak.org/docs-api/latest/rest-api/openapi.json
poetry run python3 main.py -v -n Keycloak -f ./openapi.json RealmRepresentation=Realm ClientRepresentation=Client GroupRepresentation=Group UserRepresentation=User
For more examples, refer to the examples folder.
Options & parameters
You must provide the list of API components to include in the module. You can specify a different name for these components (e.g., RealmRepresentation=Realm will import the RealmRepresentation component of the API under the Realm node).
⚠️ WARNING: The order in which components are passed is IMPORTANT. They are resolved in the given order and will only be linked if the parent component (e.g., Realm/Tenant) has already been imported.
| Option | Required | Description |
|---|---|---|
| --name (-n) | YES | Name of the intel module |
| --url (-u) | (*) | URL of the OpenAPI specifications |
| --file (-f) | (*) | Path of the OpenAPI specifications |
| --verbose (-v) | Display debug level messsages | |
| --output (-o) | Output directory (default .) |
|
| --ignore (-i) | Ignore specific paths (e.g. /path/to/ignore or /path/to/*) |
(*) You must provide one (and only one source) for the OpenAPI specification
Export the module
cartography-openapi will generate a <OUTPUT>/<NAME>_module folder containing the necessary files to add the module to Cartography. This folder includes:
- The
modelfolder, which must be moved tocartography/model/<NAME> - The
intelfolder, which must be moved tocartography/intel/<NAME>
⚠️ WARNING: cartography-openapi only generates a skeleton. You must modify, adapt, and test it yourself.
The following operations must be performed manually:
- Add the necessary configuration keys in
cartography/config.py - Add the required parameters in
cartography/cli.py - Import your module in
cartography/sync.py
Known issues & limitations
cartography-openapi is a Proof of Concept, and many features are still missing (we are actively working on them):
- The generated code does not handle authentication for API calls
- The generated code does not support query parameters, body parameters, or headers
- The generated code does not manage links to other entities (except for
sub-resourcelinks) - Only API response with array are supported (not dict like
{'users': [], 'count': 12}) - List components are not supported
- Tests are not generated
- Documentation is not generated
License
This project is licensed under the Apache 2.0 License.
Modules generated
None so far :(
ROADMAP
Here are the topics we are working on for upcoming releases:
- handle API response with dict like
{'users': [], 'count': 12} - handle API response where list are handled as componenet (ex: UserView, UserListVie)
- handle authentication
- handle query with mandatory query_param & body_param
- handle query with variable param in path
- handle "other_links"
- generate Cartography tests
- generate Cartography doc
- generate Carography config
- Generate PR text with checklist
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file cartography_openapi-0.2.0.tar.gz.
File metadata
- Download URL: cartography_openapi-0.2.0.tar.gz
- Upload date:
- Size: 20.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.12.8
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
66272d6a058e4f7d9c1e4cb9d48407a170b8d0ebc7f5397ad2f2b9d0697164d6
|
|
| MD5 |
26c8e88bcc4aa10008b162b31378b8fa
|
|
| BLAKE2b-256 |
effbaf2f05cd32c0a86607bbe9f7e96065ef0d3e36db6a53b4b7b86406234d5a
|
Provenance
The following attestation bundles were made for cartography_openapi-0.2.0.tar.gz:
Publisher:
ci.yml on jychp/cartography-openapi
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
cartography_openapi-0.2.0.tar.gz -
Subject digest:
66272d6a058e4f7d9c1e4cb9d48407a170b8d0ebc7f5397ad2f2b9d0697164d6 - Sigstore transparency entry: 169242718
- Sigstore integration time:
-
Permalink:
jychp/cartography-openapi@f6fc68a0603725b0017afbd94dc2fbaf6d2cb98c -
Branch / Tag:
refs/heads/main - Owner: https://github.com/jychp
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
ci.yml@f6fc68a0603725b0017afbd94dc2fbaf6d2cb98c -
Trigger Event:
push
-
Statement type:
File details
Details for the file cartography_openapi-0.2.0-py3-none-any.whl.
File metadata
- Download URL: cartography_openapi-0.2.0-py3-none-any.whl
- Upload date:
- Size: 24.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.12.8
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
699f5a91e04d5ac2548974b07c4ed8aedbf4d02a99c7456677ce549492eedf2a
|
|
| MD5 |
3710dfbc685672f36e79735a62b6aa3e
|
|
| BLAKE2b-256 |
e3a333234ea72f828479cee00d5cfb0075060f4f317050e10051be0f22dc18de
|
Provenance
The following attestation bundles were made for cartography_openapi-0.2.0-py3-none-any.whl:
Publisher:
ci.yml on jychp/cartography-openapi
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
cartography_openapi-0.2.0-py3-none-any.whl -
Subject digest:
699f5a91e04d5ac2548974b07c4ed8aedbf4d02a99c7456677ce549492eedf2a - Sigstore transparency entry: 169242719
- Sigstore integration time:
-
Permalink:
jychp/cartography-openapi@f6fc68a0603725b0017afbd94dc2fbaf6d2cb98c -
Branch / Tag:
refs/heads/main - Owner: https://github.com/jychp
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
ci.yml@f6fc68a0603725b0017afbd94dc2fbaf6d2cb98c -
Trigger Event:
push
-
Statement type: