{"id":44419256,"url":"https://github.com/trento-project/wanda","last_synced_at":"2026-02-12T09:09:42.849Z","repository":{"id":37499020,"uuid":"498776552","full_name":"trento-project/wanda","owner":"trento-project","description":"Wanda is the Trento Checks Engine","archived":false,"fork":false,"pushed_at":"2026-02-02T15:27:57.000Z","size":17411,"stargazers_count":12,"open_issues_count":4,"forks_count":11,"subscribers_count":4,"default_branch":"main","last_synced_at":"2026-02-03T04:25:47.422Z","etag":null,"topics":["elixir"],"latest_commit_sha":null,"homepage":"","language":"Elixir","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/trento-project.png","metadata":{"files":{"readme":"README.adoc","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.adoc","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2022-06-01T14:44:41.000Z","updated_at":"2026-01-29T09:03:26.000Z","dependencies_parsed_at":"2022-07-09T09:46:22.416Z","dependency_job_id":"824d6c77-4f75-402a-b25a-2514463a13dc","html_url":"https://github.com/trento-project/wanda","commit_stats":null,"previous_names":[],"tags_count":8,"template":false,"template_full_name":null,"purl":"pkg:github/trento-project/wanda","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/trento-project%2Fwanda","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/trento-project%2Fwanda/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/trento-project%2Fwanda/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/trento-project%2Fwanda/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/trento-project","download_url":"https://codeload.github.com/trento-project/wanda/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/trento-project%2Fwanda/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29362246,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-12T08:51:36.827Z","status":"ssl_error","status_checked_at":"2026-02-12T08:51:26.849Z","response_time":55,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["elixir"],"created_at":"2026-02-12T09:09:42.345Z","updated_at":"2026-02-12T09:09:42.843Z","avatar_url":"https://github.com/trento-project.png","language":"Elixir","funding_links":[],"categories":[],"sub_categories":[],"readme":"ifndef::site-gen-antora[:relfileprefix: guides/]\n:github-url: https://github.com/trento-project/wanda\n:ci-workflow: {github-url}/actions/workflows/ci.yaml\n:coverage-url: https://coveralls.io/github/trento-project/wanda?branch=main\n:docs-url: https://trento-project.io/wanda/\n:license-year: 2021-2025\n= Trento Wanda\n\nimage:{ci-workflow}/badge.svg[CI,link={ci-workflow}]\nimage:https://coveralls.io/repos/github/trento-project/wanda/badge.svg?branch=main[Coverage Status,link={coverage-url}]\nimage:https://img.shields.io/badge/documentation-grey.svg[Documentation,link={docs-url}]\n\nA service responsible to orchestrate Checks executions on a target\ninfrastructure.\n\n== Documentation\n\nThe documentation is available at\nlink:https://trento-project.io/wanda/[trento-project.io/wanda].\n\nSwagger UI is available at\nlink:https://trento-project.io/wanda/swaggerui[trento-project.io/wanda/swaggerui].\n\n== Developing Checks\n\nPlease refer to link:https://github.com/trento-project/checks[Trento Checks]\nand link:#testing-executions[testing Checks Executions].\n\n[[testing-executions]]\n== Testing Executions\n\nWith a running setup, it is possible to easily test Checks and their\nExecution by:\n\n* starting the targets\n* consulting the catalog\n* starting a Checks Execution\n* checking the state of an execution\n* debugging the gathered facts\n\n=== *Starting the targets*\n\nThe link:https://github.com/trento-project/agent[trento-agent] must be up and\nrunning on the targets to run a correct execution, otherwise a timeout\nerror is raised.\n\nHere an example on how to start it:\n\n....\n./trento-agent start --api-key \u003capi-key\u003e --facts-service-url amqp://wanda:wanda@localhost:5674\n....\n\n[NOTE]\n====\n`+api-key+` value is not used if the unique goal is to run checks,\nso setting it as `+--api-key 0+` does the work.\n====\n\nKeep in mind that the `+agent_id+` of the targets must match with values\nprovided in the `+targets+` field of the execution request.\n\nThe ID can be obtained running:\n\n....\n./trento-agent id\n....\n\nIf the execution is run in a development/testing environment,\nlink:https://github.com/trento-project/agent#fake-agent-id[faking the agent\nid] might come handy.\n\n=== *Consulting the catalog*\n\nAvailable Checks are part of the *Catalog*, and they can be retrieved by\naccessing the dedicated API\n\n[source,bash]\n----\ncurl -X 'GET' \\\n  'http://localhost:4000/api/v1/checks/catalog' \\\n  -H 'accept: application/json'\n----\n\n=== *Starting a Checks Execution*\n\nA Checks Execution can be started by calling the Start Execution\nendpoint, as follows\n\n[source,bash]\n----\ncurl --request POST 'http://localhost:4000/api/v1/checks/executions/start' \\\n--header 'accept: application/json' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{\n  \"env\": {\n    \"provider\": \"azure\"\n  },\n  \"execution_id\": \"205e326d-0c25-4f4b-9976-43f9ba1c86d3\",\n  \"group_id\": \"3dff9d03-4adf-453e-9513-8533e221bb12\",\n  \"targets\": [\n    {\n      \"agent_id\": \"a644919a-d953-43d4-bd57-7e0bb96ee894\",\n      \"checks\": [\n        \"156F64\"\n      ]\n    },\n    {\n      \"agent_id\": \"02d99b2f-0efd-443c-ac9c-32710323f620\",\n      \"checks\": [\n        \"OTH3R1\"\n      ]\n    }\n  ]\n}'\n----\n\n[NOTE]\n====\n*execution_id* must be new and unique for every new execution. If an\nalready used *execution_id* is provided, starting the execution fails.\n====\n\nIn order to get detailed information for an execution, see\nlink:#getting-execution-details[Getting Execution details].\n\n[NOTE]\n====\nNote that execution is _eventually started_, meaning that a successful\nresponse to the previous API call does not guarantee that the execution\nis running, but that it has been accepted by the system to start.\n====\n\n=== Execution Targets\n\nAn execution target is a target host where the checks are executed. This\nrequires to have the `+trento-agent+` executable running in the host. In\norder to specify an execution order, its `+agent_id+` and a list of\nchecks to be executed are provided. Once the execution is started, a\nfacts gathering request is sent to these targets, facts are gathered and\nsent back to Wanda, where the checks result is evaluated using the\ngathered facts.\n\nThe `+agent_id+` can be obtained just issuing `+trento-agent id+`\ncommand in the target host.\n\nEach target _must_ specify a list of checks, that can be empty. These\nare the selected checks for each agent, that are executed.\n\nGiven two different targets, the same checks can be selected:\n\n[source,bash]\n----\ncurl --request POST 'http://localhost:4000/api/v1/checks/executions/start' \\\n--header 'accept: application/json' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{\n  \"env\": {\n    \"provider\": \"azure\"\n  },\n  \"execution_id\": \"205e326d-0c25-4f4b-9976-43f9ba1c86d3\",\n  \"group_id\": \"3dff9d03-4adf-453e-9513-8533e221bb12\",\n  \"targets\": [\n    {\n      \"agent_id\": \"a644919a-d953-43d4-bd57-7e0bb96ee894\",\n      \"checks\": [\n        \"156F64\",\n        \"45B653\"\n      ]\n    },\n    {\n      \"agent_id\": \"02d99b2f-0efd-443c-ac9c-32710323f620\",\n      \"checks\": [\n        \"156F64\",\n        \"45B653\"\n      ]\n    }\n  ]\n}'\n----\n\nOr completely different ones:\n\n[source,bash]\n----\ncurl --request POST 'http://localhost:4000/api/v1/checks/executions/start' \\\n--header 'accept: application/json' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{\n  \"env\": {\n    \"provider\": \"azure\"\n  },\n  \"execution_id\": \"205e326d-0c25-4f4b-9976-43f9ba1c86d3\",\n  \"group_id\": \"3dff9d03-4adf-453e-9513-8533e221bb12\",\n  \"targets\": [\n    {\n      \"agent_id\": \"a644919a-d953-43d4-bd57-7e0bb96ee894\",\n      \"checks\": [\n        \"156F64\",\n        \"45B653\"\n      ]\n    },\n    {\n      \"agent_id\": \"02d99b2f-0efd-443c-ac9c-32710323f620\",\n      \"checks\": [\n        \"OTH3R1\",\n        \"OTH3R2\"\n      ]\n    }\n  ]\n}'\n----\n\n=== *Getting Execution details*\n\nTo get detailed information about the execution, the following API can\nbe used.\n\n[source,bash]\n----\ncurl --request GET 'http://localhost:4000/api/v1/checks/executions/205e326d-0c25-4f4b-9976-43f9ba1c86d3' \\\n--header 'accept: application/json' \\\n--header 'Content-Type: application/json'\n----\n\n\nNOTE: Calling the execution detail API right after\nlink:#starting-a-checks-execution[starting an execution] might result in\na `404 not found`, because the execution, as mentioned, is _eventually\nstarted_. In this case, retry getting the detail of the execution.\n\nRefer to the link:http://localhost:4000/swaggerui[API doc] for more\ninformation about requests and responses.\n\n==== *Debugging gathered facts*\n\nOften times knowing the returned value of the gathered facts is not a\ntrivial thing, more during the implementation of new checks.\n\nTo better debug the fact gathering process and the returned values, the\n`+facts+` subcommand of `+trento-agent+` is a really useful tool. This\ncommand helps to see in the target itself what the gathered fact looks\nlike. This is specially interesting when the returned value is a complex\nobject or the target under test is modified and the check developer\nwants to see how this affects the gathered fact.\n\nThe command can be used as:\n\n....\n./trento-agent facts gather --gatherer corosync.conf --argument totem.token\n# To see the currently available gatherers and their names\n# ./trento-agent facts list\n....\n\nWhich would return the next where the `+Value+` is the available value\nin the written check:\n\n....\n{\n  \"Name\": \"totem.token\",\n  \"CheckID\": \"\",\n  \"Value\": {\n    \"Value\": 30000\n  },\n  \"Error\": null\n}\n....\n\n== Running a local Wanda instance\n\n=== Running a Development Environment\n\nTo set up a local development environment for Wanda, follow the\ninstructions provided in xref:Development/hack-on-wanda.adoc[how to hack on wanda].\n\nThis guide walks through the process of installing and configuring the\nnecessary dependencies, as well as setting up a local development\nenvironment.\n\n=== Running a Demo Environment\n\nThe demo mode of Wanda allows to showcase checks evaluation without the\nfull setup with actual agents on the host. To run a demo instance,\nfollow the instructions provided in xref:Development/demo.adoc[how to run wanda demo guide].\n\n== Support\n\nPlease only report bugs via\nlink:https://github.com/trento-project/wanda/issues[GitHub issues] and for\nany other inquiry or topic use\nlink:https://github.com/trento-project/wanda/discussions[GitHub discussion].\n\n== Contributing\n\nifdef::site-gen-antora[]\nSee xref:CONTRIBUTING.adoc[contribution guidelines].\nendif::[]\nifndef::site-gen-antora[]\nSee link:CONTRIBUTING.adoc[contribution guidelines].\nendif::[]\n\n== License\n\nCopyright {license-year} LLC\n\nLicensed under the Apache License, Version 2.0 (the \"`License`\"); you\nmay not use any of the source code in this project except in compliance\nwith the License. You may obtain a copy of the License at\n\nlink:https://www.apache.org/licenses/LICENSE-2.0[LICENSE-2.0L]\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"`AS IS`\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftrento-project%2Fwanda","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftrento-project%2Fwanda","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftrento-project%2Fwanda/lists"}