{"id":44456800,"url":"https://github.com/validator-labs/validator","last_synced_at":"2026-02-12T17:37:09.442Z","repository":{"id":190719363,"uuid":"681842767","full_name":"validator-labs/validator","owner":"validator-labs","description":"validator monitors ValidationResults created by one or more validator plugins and uploads them to a configurable sink.","archived":false,"fork":false,"pushed_at":"2026-02-03T22:30:03.000Z","size":2089,"stargazers_count":16,"open_issues_count":22,"forks_count":3,"subscribers_count":3,"default_branch":"main","last_synced_at":"2026-02-04T06:32:14.081Z","etag":null,"topics":["alerting","infrastructure-automation","kubernetes","validation","validator","validators","verification"],"latest_commit_sha":null,"homepage":"https://validator-labs.github.io/docs","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/validator-labs.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"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":"2023-08-22T22:05:20.000Z","updated_at":"2025-08-14T18:55:18.000Z","dependencies_parsed_at":"2023-08-26T03:41:05.022Z","dependency_job_id":"73e3d0cb-77ba-4aba-a671-001c425a1835","html_url":"https://github.com/validator-labs/validator","commit_stats":null,"previous_names":["spectrocloud-labs/valid8or","spectrocloud-labs/validator","validator-labs/validator"],"tags_count":67,"template":false,"template_full_name":null,"purl":"pkg:github/validator-labs/validator","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/validator-labs%2Fvalidator","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/validator-labs%2Fvalidator/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/validator-labs%2Fvalidator/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/validator-labs%2Fvalidator/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/validator-labs","download_url":"https://codeload.github.com/validator-labs/validator/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/validator-labs%2Fvalidator/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29374189,"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":["alerting","infrastructure-automation","kubernetes","validation","validator","validators","verification"],"created_at":"2026-02-12T17:37:09.372Z","updated_at":"2026-02-12T17:37:09.437Z","avatar_url":"https://github.com/validator-labs.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![Contributions Welcome](https://img.shields.io/badge/contributions-welcome-brightgreen.svg?style=flat)](https://github.com/validator-labs/validator/issues)\n[![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)\n![Test](https://github.com/validator-labs/validator/actions/workflows/test.yaml/badge.svg)\n[![Go Report Card](https://goreportcard.com/badge/github.com/validator-labs/validator)](https://goreportcard.com/report/github.com/validator-labs/validator)\n[![codecov](https://codecov.io/gh/validator-labs/validator/graph/badge.svg?token=GVZ4LZ5SOY)](https://codecov.io/gh/validator-labs/validator)\n[![Go Reference](https://pkg.go.dev/badge/github.com/validator-labs/validator.svg)](https://pkg.go.dev/github.com/validator-labs/validator)\n\nvalidator (AKA Validation Controller) monitors ValidationResults created by one or more validator plugins and uploads them to a sink of your choosing, e.g., Slack or Alertmanager.\n\n![validator architecture](./docs/img/validator.png)\n\n## Description\nThe validator repository is fairly minimal - all the heavy lifting is done by the validator plugins. Installation of validator and one or more plugins is accomplished via Helm.\n\nPlugins:\n- [AWS](https://github.com/validator-labs/validator-plugin-aws)\n- [Azure](https://github.com/validator-labs/validator-plugin-azure)\n- [Network](https://github.com/validator-labs/validator-plugin-network)\n- [OCI](https://github.com/validator-labs/validator-plugin-oci)\n- [vSphere](https://github.com/validator-labs/validator-plugin-vsphere)\n- [Kubescape](https://github.com/validator-labs/validator-plugin-kubescape)\n\n## Installation\n\n### Connected\nFor connected installations, two options are supported: the validator CLI, `validatorctl`, and Helm. Using validatorctl is **recommended**, as it provides a text-based user interface (TUI) for configuring validator.\n\n#### Validator CLI\n1. Download the latest release of validatorctl from https://github.com/validator-labs/validatorctl/releases\n2. Execute validatorctl\n   ```bash\n   validatorctl install\n   ```\n\n#### Helm\nInstall Validator by pulling the latest Helm chart and installing it in your cluster. Use the following commands to install the latest version of the chart.\n\n```bash\nhelm repo add validator https://validator-labs.github.io/validator\nhelm repo update\nhelm install validator validator/validator -n validator --create-namespace\n```\n\nCheck out the [Helm install guide](./docs/install.md) for a step-by-step guide for installing and using Validator.\n\n### Air-gapped\nFor air-gapped installations, the recommended approach is to use [Hauler](https://github.com/rancherfederal/hauler). Hauls containing all validator artifacts (container images, Helm charts, and the validator CLI) are generated for multiple platforms (linux/amd64 and linux/arm64) during each validator release.\n\nPrerequisites:\n* A Linux-based air-gapped workstation with:\n  * A container runtime, e.g., [containerd](https://containerd.io/docs/getting-started/), [Docker Engine](https://docs.docker.com/engine/), etc.\n  * If using a container runtime other than Docker Engine, [podman](https://podman.io/docs/installation) must be installed and [Docker CLI emulation](https://podman-desktop.io/docs/migrating-from-docker/emulating-docker-cli-with-podman) configured\n  * [kind](https://github.com/kubernetes-sigs/kind/releases) installed and on your PATH\n  * [hauler](https://github.com/hauler-dev/hauler/releases) installed and on your PATH\n\nOnce the prerequisites are met, the following steps document the air-gapped installation procedure:\n\n1. Download the Hauler Store (then somehow get it across the air-gap)\n   ```bash\n   # Download the Haul for your chosen release and platform, e.g.:\n   curl -L https://github.com/validator-labs/validator/releases/download/v0.0.46/validator-haul-linux-amd64.tar.zst -o validator-haul-linux-amd64.tar.zst\n   ```\n2. Load the Hauler Store (on the air-gapped workstation)\n   ```bash\n   # Load the air-gapped content to your local hauler store.\n   hauler store load validator-haul-linux-amd64.tar.zst\n   ```\n3. Extract validatorctl from the Hauler Store\n   ```bash\n   # Extract the validator CLI binary, validatorctl, from the hauler store.\n   # It's always tagged as \"latest\" within the store, despite being versioned.\n   # This is a hauler defect. The version can be verified via `validatorctl version`.\n   hauler store extract -s store hauler/validatorctl:latest\n   chmod +x validatorctl \u0026\u0026 mv validatorctl /usr/local/bin\n   ```\n4. Serve the Hauler Store\n   ```bash\n   # Serve the content as a registry from the hauler store.\n   # (Defaults to \u003cFQDN or IP\u003e:5000).\n   nohup hauler store serve registry | tee -a hauler.log \u0026\n   \n   # Optionally tail the hauler registry logs\n   tail -f hauler.log\n   ```\n5. Execute validatorctl\n   ```bash\n   validatorctl install\n   ```\n\n## Sinks\nValidator can be configured to emit updates to various event sinks whenever a `ValidationResult` is created or updated. See configuration details below for each supported sink.\n\n### Alertmanager\nIntegrate with the Alertmanager API to emit alerts to all [supported Alertmanager receivers](https://prometheus.io/docs/alerting/latest/configuration/#receiver-integration-settings), including generic webhooks. The only required configuration is an Alertmanager endpoint. HTTP basic authentication and TLS are also supported. See [values.yaml](https://github.com/validator-labs/validator/blob/main/chart/validator/values.yaml) for configuration details.\n\n#### Sample Output\n![Screen Shot 2023-11-15 at 10 42 20 AM](https://github.com/validator-labs/validator/assets/1795270/ce958b8e-96d7-4f5e-8efc-80e2fc2b0b4d)\n\n#### Setup\n1. Install Alertmanager in your cluster (if it isn't installed already)\n2. Configure Alertmanager alert content. Alerts can be formatted/customized via the following labels and annotations:\n\n   Labels\n   - alertname\n   - plugin\n   - validation_result\n   - expected_results\n\n   Annotations\n   - state\n   - validation_rule\n   - validation_type\n   - message\n   - status\n   - detail\n      - pipe-delimited array of detail messages, see sample config for parsing example\n   - failure (also pipe-delimited)\n   - last_validation_time\n\n   Example Alertmanager ConfigMap used to produce the sample output above:\n   ```yaml\n   apiVersion: v1\n   data:\n   alertmanager.yml: |\n      global:\n         slack_api_url: https://slack.com/api/chat.postMessage\n      receivers:\n      - name: default-receiver\n         slack_configs:\n         - channel: \u003cchannel-id\u003e\n         text: |-\n            {{ range .Alerts.Firing -}}\n            *Validation Result: {{ .Labels.validation_result }}/{{ .Labels.expected_results }}*\n\n            {{ range $k, $v := .Annotations }}\n            {{- if $v }}*{{ $k | title }}*:\n            {{- if match \"\\\\|\" $v }}\n            - {{ reReplaceAll \"\\\\|\" \"\\n- \" $v -}}\n            {{- else }}\n            {{- printf \" %s\" $v -}}\n            {{- end }}\n            {{- end }}\n            {{ end }}\n\n            {{ end }}\n         title: \"{{ (index .Alerts 0).Labels.plugin }}: {{ (index .Alerts 0).Labels.alertname }}\\n\"\n         http_config:\n            authorization:\n               credentials: xoxb--\u003cbot\u003e-\u003ctoken\u003e\n         send_resolved: false\n      route:\n         group_interval: 10s\n         group_wait: 10s\n         receiver: default-receiver\n         repeat_interval: 1h\n      templates:\n      - /etc/alertmanager/*.tmpl\n   kind: ConfigMap\n   metadata:\n   name: alertmanager\n   namespace: alertmanager\n   ```\n\n2. Install validator and/or upgrade your validator Helm release, configuring `values.sink` accordingly.\n\n### Slack\n\n#### Sample Output\n\u003cimg width=\"704\" alt=\"Screen Shot 2023-11-10 at 4 30 12 PM\" src=\"https://github.com/validator-labs/validator/assets/1795270/c011143a-4d4b-4299-b88b-699188f4bda2\"\u003e\n\u003cimg width=\"700\" alt=\"Screen Shot 2023-11-10 at 4 18 22 PM\" src=\"https://github.com/validator-labs/validator/assets/1795270/9f2c4ab7-34d6-496a-9f60-68655a7ee3d6\"\u003e\n\n#### Setup\n1. Go to https://api.slack.com/apps and click **Create New App**, then select **From scratch**. Pick an App Name and Slack Workspace, then click **Create App**.\n\n   \u003cimg src=\"https://github.com/validator-labs/validator/assets/1795270/58cbb5a0-12a4-4a83-a0dd-20ae87a8105d\" width=\"500\"\u003e\n\n2. Go to `OAuth \u0026 Permissions` and copy the `Bot User OAuth Token` under the `OAuth Tokens for Your Workspace` section. Save it somewhere for later. Scroll down to `Scopes` and click **Add an OAuth Scope**. Enable the `chat:write` scope for your bot.\n\n   \u003cimg src=\"https://github.com/validator-labs/validator/assets/1795270/7b4d80be-5799-497a-9a4b-480793b26d59\" width=\"500\"\u003e\n\n3. Find and/or create a channel in Slack and note its Channel ID (at the very bottom of the modal when you view channel details). Add the bot you just created to the channel via `View channel details \u003e Integrations \u003e Apps \u003e Add apps`.\n\n   \u003cimg src=\"https://github.com/validator-labs/validator/assets/1795270/a78c852c-7aeb-41a4-aa76-6afbe9b2ec81\" width=\"500\"\u003e\n\n4. Install validator and/or upgrade your validator Helm release, configuring `values.sink` accordingly.\n\n## Development\nYou’ll need a Kubernetes cluster to run against. You can use [kind](https://sigs.k8s.io/kind) to get a local cluster for testing, or run against a remote cluster.\n**Note:** Your controller will automatically use the current context in your kubeconfig file (i.e. whatever cluster `kubectl cluster-info` shows).\n\n### Running on the cluster\n1. Install Instances of Custom Resources:\n\n```sh\nkubectl apply -f config/samples/\n```\n\n2. Build and push your image to the location specified by `IMG`:\n\n```sh\nmake docker-build docker-push IMG=\u003csome-registry\u003e/validator:tag\n```\n\n3. Deploy the controller to the cluster with the image specified by `IMG`:\n\n```sh\nmake deploy IMG=\u003csome-registry\u003e/validator:tag\n```\n\n### Uninstall CRDs\nTo delete the CRDs from the cluster:\n\n```sh\nmake uninstall\n```\n\n### Undeploy controller\nUnDeploy the controller from the cluster:\n\n```sh\nmake undeploy\n```\n\n## Contributing\nAll contributions are welcome! Feel free to reach out on the [Spectro Cloud community Slack](https://spectrocloudcommunity.slack.com/join/shared_invite/zt-g8gfzrhf-cKavsGD_myOh30K24pImLA#/shared-invite/email).\n\nMake sure `pre-commit` is [installed](https://pre-commit.com#install).\n\nInstall the `pre-commit` scripts:\n\n```console\npre-commit install --hook-type commit-msg\npre-commit install --hook-type pre-commit\n```\n\n### How it works\nThis project aims to follow the Kubernetes [Operator pattern](https://kubernetes.io/docs/concepts/extend-kubernetes/operator/).\n\nIt uses [Controllers](https://kubernetes.io/docs/concepts/architecture/controller/),\nwhich provide a reconcile function responsible for synchronizing resources until the desired state is reached on the cluster.\n\n### Test It Out\n1. Install the CRDs into the cluster:\n\n```sh\nmake install\n```\n\n2. Run your controller (this will run in the foreground, so switch to a new terminal if you want to leave it running):\n\n```sh\nmake run\n```\n\n**NOTE:** You can also run this in one step by running: `make install run`\n\n### Modifying the API definitions\nIf you are editing the API definitions, generate the manifests such as CRs or CRDs using:\n\n```sh\nmake manifests\n```\n\n**NOTE:** Run `make --help` for more information on all potential `make` targets\n\nMore information can be found via the [Kubebuilder Documentation](https://book.kubebuilder.io/introduction.html)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvalidator-labs%2Fvalidator","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fvalidator-labs%2Fvalidator","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvalidator-labs%2Fvalidator/lists"}