{"id":22435595,"url":"https://github.com/allanger/shoebill-operator","last_synced_at":"2026-04-28T20:33:31.368Z","repository":{"id":216019287,"uuid":"740250893","full_name":"allanger/shoebill-operator","owner":"allanger","description":null,"archived":false,"fork":false,"pushed_at":"2024-01-08T00:54:28.000Z","size":22,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-02-01T13:23:52.113Z","etag":null,"topics":["devops","kubernetes"],"latest_commit_sha":null,"homepage":"https://git.badhouseplants.net/allanger/shoebill-operator/","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/allanger.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null}},"created_at":"2024-01-08T00:08:22.000Z","updated_at":"2024-01-08T00:47:21.000Z","dependencies_parsed_at":"2024-01-08T02:26:36.162Z","dependency_job_id":"a4376250-2a40-49ac-b552-eec320b33e6b","html_url":"https://github.com/allanger/shoebill-operator","commit_stats":null,"previous_names":["allanger/shoebill-operator"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/allanger%2Fshoebill-operator","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/allanger%2Fshoebill-operator/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/allanger%2Fshoebill-operator/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/allanger%2Fshoebill-operator/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/allanger","download_url":"https://codeload.github.com/allanger/shoebill-operator/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":245807085,"owners_count":20675462,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["devops","kubernetes"],"created_at":"2024-12-05T23:14:41.015Z","updated_at":"2026-04-28T20:33:26.346Z","avatar_url":"https://github.com/allanger.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Shoebill\n\n## !! Be careful !!\n\nThe code is not ready for real use, it can only create secrets, but a lot of errors are not handled, so they are making the controller die, and there is no clean-up at all. Also, reconciliation doesn't work as I would like to work yet. I hope that I'll release the first prod-ready version soon\n\n## What's that?\n\nIt's a **Kubernetes** operator that lets you build new **Secrets** and **ConfigMaps** using ones that exist already as inputs for templates.\n\n## Why does that exist?\n\nI'm one of maintainers of [db-operator](https://github.com/db-operator/db-operator), and there we have implemented a feature that we call **templated credentials**, it lets user define templates that should be used for creating new entries to **Secrets** and **ConfigMaps** that are managed by the operator. Because sometimes you need to have more than just credentials, cause your application may require a custom connection string. But since this feature doesn't exist in any operator, I've created another operator for exactly that.\n\nLet's say you have an operator **some-operator** that should run something that is required for your application to run, and when you apply the CR, the operator is creating something that results in a **Secret** like that:\n\n```yaml\nkind: Secret\nmetadata:\n  name: some-secret\nstringData:\n  password: really-strong-one\n```\n\nand a **ConfigMap**:\n\n```yaml\nkind: ConfigMap\nmetadata:\n  name: some-configmap\ndata:\n  username: application-user\n  hostname: some.app.rocks\n```\n\nBut to use that something, your application require an environment variable in a format like this:\n\n```bash\nSOME_CONNECTION_STRING=${USERNAME}:${PASSWORD}@{$HOSTNAME}\n```\n\nWhat are your options?\n\n- You can get the data from the **Secret** and **ConfigMap** to build a new **Secret** manually and add it as an env var to your application **Deployment**\n- You can write an `initContainer` that will get the data from those sources, and create a formatted connection string, that later might be somehow set as an environment var for you main workload\n- You can have a watcher that is checking those sources and modifies you workload object, setting the desired env\n- _Or maybe you can use something that exists already, but I wanted to try writing an operator in Rust, so I don't care too much_\n\nWith this operator, you can create a **Custom Resource** called **ConfigSet**, that in our case should look like that:\n\n```yaml\nkind: ConfigSet\nspec:\n  inputs:\n    - name: PASSWORD\n      from:\n        kind: Secret\n        name: some-secret\n        key: password\n    - name: USERNAME\n      from:\n        kind: ConfigMap\n        name: some-configmap\n        key: username\n    - name: HOSTNAME\n      from:\n        kind: ConfigMap\n        name: somet-configmap\n        key: hostname\n  targets:\n    - name: app-some-creds\n      target:\n        kind: Secret\n        name: app-some-creds\n  templates:\n    - name: SOME_CONNECTION_STRING\n      template: \"{{USERNAME}}:{{PASSWORD}}@{{HOSTNAME}}\"\n```\n\nAnd after you apply it, there will be a new secret created (or the existing one will be modified), and it will contain\n\n```yaml\nkind: Secret\nmetadata:\n  name: app-some-creds\nstringData:\n  SOME_CONNECTION_STRING: application-user:really-strong-one@some.app.rocks\n```\n\nNow you can simply mount that newly created secret to your workload, and that's it.\n\n## How can I start using it?\n\nOnce it's production ready, I'll start distributing it as a **helm** chart. Currently, since it's should only be used by those one who are developing it, it looks like that\n\n- build an image\n- import that image to you K8s\n- build the tool locally (or use the image too)\n- run `shoebill manifests \u003e /tmp/manifests.yaml`, it will generate all the required manifests for the quick start\n- apply those manifests, and check if the controller is up\n- prepare you secrets and configmaps (or go to `./yaml/example` folder and use manifests from there\n- create you `ConfigSet` manifests and apply it too. Example also can be found in `./yaml/example` dir\n\n## Why Shoebill?\n\nThere is no real connection between the project and the name, I just always wanted to have a project called **Shoebill** because I really like those birds\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fallanger%2Fshoebill-operator","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fallanger%2Fshoebill-operator","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fallanger%2Fshoebill-operator/lists"}