{"id":49085361,"url":"https://github.com/platformplane/catalog-crossplane","last_synced_at":"2026-04-20T15:10:03.691Z","repository":{"id":327015845,"uuid":"756486999","full_name":"platformplane/catalog-crossplane","owner":"platformplane","description":"Crossplane configuration package containing multiple basic services like a PostgreSQL database for the Platform Plane self-service catalog.","archived":false,"fork":false,"pushed_at":"2026-03-30T14:17:12.000Z","size":807,"stargazers_count":4,"open_issues_count":2,"forks_count":0,"subscribers_count":3,"default_branch":"main","last_synced_at":"2026-03-30T16:25:14.888Z","etag":null,"topics":["crossplane-configuration","platform-engineering"],"latest_commit_sha":null,"homepage":"https://www.openplatformplaneassociation.com/","language":"Dockerfile","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/platformplane.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"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":"2024-02-12T18:58:55.000Z","updated_at":"2025-12-09T15:53:01.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/platformplane/catalog-crossplane","commit_stats":null,"previous_names":["platformplane/catalog-crossplane"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/platformplane/catalog-crossplane","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/platformplane%2Fcatalog-crossplane","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/platformplane%2Fcatalog-crossplane/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/platformplane%2Fcatalog-crossplane/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/platformplane%2Fcatalog-crossplane/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/platformplane","download_url":"https://codeload.github.com/platformplane/catalog-crossplane/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/platformplane%2Fcatalog-crossplane/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32052675,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-20T11:35:06.609Z","status":"ssl_error","status_checked_at":"2026-04-20T11:34:48.899Z","response_time":94,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: 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":["crossplane-configuration","platform-engineering"],"created_at":"2026-04-20T15:10:02.910Z","updated_at":"2026-04-20T15:10:03.684Z","avatar_url":"https://github.com/platformplane.png","language":"Dockerfile","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Common Crossplane Self-Service Catalog Items\n\nCrossplane configuration package containing multiple basic services like a PostgreSQL database for the Platform Plane self-service catalog.\n\n![catalogv2ui](./catalogv2ui.png)\n\n## Repo Overview\n\n- [package](./package/) This is the single build root for the Crossplane configuration package that we publish:\n  - [configuration.yaml](./package/configuration.yaml) Package metadata and dependency constraints for the published configuration package.\n  - [\\\u003ccatalog-item\u003e](./package/redis/) Item-first catalog folders. Most existing items contain two manifest sets:\n    - `v1/definition.yaml` and `v1/composition.yaml` keep the Crossplane v1 claim/composite APIs for already-deployed resources.\n    - `v2/definition.yaml` and `v2/composition.yaml` define the Crossplane v2 namespaced XR API for new resources. The `apiVersion` stays `catalog.cluster.local/v2`; kind naming depends on the item.\n- [examples](./examples/) Ready-to-apply Crossplane v2 examples for the published catalog items. They default to the `catalog-examples` namespace.\n- [future-package-items](./future-package-items/) Work-in-progress items that are intentionally kept outside the published package until they are ready.\n- [Dockerfile](Dockerfile) The Dockerfile uses the Crossplane CLI to build and push the Crossplane configuration package (OCI image) to a registry (may be useful for local testing).\n- [.github/workflows](./.github/workflows/build-publish-images.yml) The GitHub pipeline calculates a version number and builds the Crossplane package on every commit.\n\n## Update Strategy of Catalog Items\n\nCrossplane v1 resources remain part of the package ownership set so existing services continue to reconcile without being garbage-collected during upgrades. New catalog items must be created from the `v2` manifests only, for example with `apiVersion: catalog.cluster.local/v2`.\n\nWe assume that minor versions can be updated without breaking changes. This means that the `spec.forProvider.chart.version` field in the Crossplane configuration can be updated within the same minor version (read the release notes anyways to be sure). Note that there is usually a version mapping table defined at the beginning of the inline template mapping the major product versions to the corresponding Helm chart version. Applying a new version of this Crossplane configuration including new default values for Helm charts will replace the affected Helm releases with the new version and therefore cause downtime and potentially issues for the customers! They can explicitly set the version (instead of relying on the default) to avoid this.\n\n## Create the Crossplane package locally\n\n### Via Dockerfile (no need to install Crossplane CLI)\n\nManually build the Dockerfile like (adjust the URLs to match Docker Hub if needed, not sure whether it works with Docker Hub though as I never successfully tested that):\n\n```bash\nREGISTRY_PASSWORD=... docker buildx build --progress=plain --secret id=registry-password,env=REGISTRY_PASSWORD --build-arg DOCKER_REGISTRY=index.docker.io --build-arg IMAGE_VERSION=0.0.1 --build-arg CACHEBUST=$(date +%s) --build-arg REGISTRY_IMAGE=index.docker.io/platformplane/platform-catalog .\n```\n\nThe CACHEBUST is not really needed but useful when amending git commits or testing locally with the same version number.\n\n### Via Crossplane CLI\n\n```bash\ncd package\necho $REGISTRY_PASSWORD | docker login -u $REGISTRY_USERNAME --password-stdin\ncrossplane xpkg build --package-file catalog-items.xpkg\ncrossplane xpkg push --package-files catalog-items.xpkg index.docker.io/platformplane/platform-catalog:0.0.1\n```\n\n## Catalog Integration\n\nThe Crossplane operator runs in the Platform space and watches the ConfigMap `crossplane` in the namespace `platformplane` which contains a list of Crossplane packages to be installed. This allows us to combine catalog items from different source (e.g. some \"simple common\" items from the platformplane Docker Hub, some Cloud Provider specific items from another repo and some project specific items from those respective registries).\n\n```yaml\napiVersion: v1\nkind: ConfigMap\ndata:\n  packages.yaml: |\n    - name: platform-catalog\n      package: index.docker.io/platformplane/platform-catalog:0.1.0-rc.9\n    - name: platform-catalog-azure\n      package: index.docker.io/platformplane/platform-catalog-azure:0.1.0-rc.2\n```\n\nPlease note that removing an entry from this list will not remove the Crossplane definitions (along with the CRDs and CRs). In case you want to remove all resources of a specific package (inlcuding all instances!), you need to delete the configuration package from `configurations.pkg.crossplane.io`.\n\nIf the packages are to be fetched from private registries, Crossplane needs package pull secrets (similar to ImagePullSecrets) to be able to pull the packages. These are provided by the platform (gitlab-operator). It creates the secret `default-registry` in the `crossplane-system` namespace similar to:\n\n```bash\nkubectl create secret docker-registry default-registry --docker-server=privateregistry.example.com --docker-username=spacename --docker-password=... -n crossplane-system\n```\n\nFurthermore, it adds the username and password again to the data section of this secret so that helm.crossplane.io/v1beta1 resources can reference it in their spec.forProvider.chart.pullSecretRef section.\n\nThe secret will look like this in the cluster:\n\n```yaml\napiVersion: v1\nkind: Secret\ntype: kubernetes.io/dockerconfigjson\ndata:\n  username: Y29tbW9u\n  password: Z2xw...\n  .dockerconfigjson: \u003e-\n    eyJhdX.....\n```\n\nThe encoded part is basically a docker config.json file:\n  \n```json\n{\n  \"auths\": {\n    \"privateregistry.example.com\": {\n      \"username\": \"spacename\",\n      \"password\": \"glpat-...\",\n      \"auth\": \"...\"\n    }\n  }\n}\n```\n\nIn order that the catalog actually shows your items, the Crossplane definition will need a specif label and some specific annotations (e.g. containing an encoded .svc catalog icon, description, etc.). Please refer to the existing items in the `package` folder for examples.\n\n## How to add a new catalog item\n\n- create a new `package/\u003ccatalog-item\u003e` subfolder\n- add two manifests:\n  - `definition.yaml` and `composition.yaml` for the API used by new catalog creations\n- verify that the pipeline builds the Dockerfile successfully\n- use your own platformplane space to test your catalog item by manually applying/deleting the composition and definition files\n- iterate until you are happy\n- update the README.md file if needed\n- create a merge request, assign it to a platform team member and ask for a review\n- merge the merge request after it got approved\n- coordinate the release with the platform team\n  - tag the merge commit with a version number (e.g. `1.40.0`), which will ensure future versions base on this new one\n\n  ```bash\n  # 1. Create a new tag, for example `v1.40.0`:\n  git tag -a v1.40.0 -m \"Release v1.40.0\"\n  \n  # 2. Push the tag to the remote repository:\n   git push origin tag v1.40.0\n  ```\n\n  - update the `crossplane` ConfigMap in the `platformplane` namespace on platform plane so that other developers can use it (via GitOps Repo)\n\n## How to debug e.g. a new helm-based catalog item\n\nSee [here](https://docs.crossplane.io/latest/guides/troubleshoot-crossplane/)\n\n- does the claim exist and what is its state? Describe it to see the status.\n  ```yaml\n  kubectl get dclconstellations\n  kubectl describe dclconstellations sample-dclconstellation\n  ```\n- what is the state of the corresponding composite?\n  ```yaml\n  kubectl get dclconstellationcomposite\n  kubectl get dclconstellationcomposite dclconstellation-sample-hx5hk -o jsonpath='{.status.conditions}'\n  ```\n- what is the state of the managed resource (in this case the helm release)?\n  ```yaml\n  kubectl get releases\n  kubectl get release dclconstellation-sample-hx5hk-n5r6r -o jsonpath='{.status.conditions}'\n  ```\n- what is the status of the pkg.crossplane.io configurations?\n  ```yaml\n  kubectl get configurations\n  kubectl get configuration platform-catalog -o jsonpath='{.status.conditions}'\n  ```\n- what is the status of the pkg.crossplane.io providers?\n  ```yaml\n  kubectl get providers\n  kubectl get providers provider-helm -o jsonpath='{.status.conditions}'\n  ```\n\n## Useful commands to test items\n\n### Elasticsearch\n\n```bash\ncurl http://elasticsearch-sample:9200/_cluster/health?pretty\ncurl -X PUT \"http://elasticsearch-sample:9200/my-index\"\ncurl -X GET \"http://elasticsearch-sample:9200/_cat/indices?v\"\n```\n\n### Kafka\n\n```bash\ncode client.properties\n# paste the following content\nsecurity.protocol=SASL_PLAINTEXT\nsasl.mechanism=PLAIN\nsasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required \\\n    username=\"user\" \\\n    password=\"$(kubectl get secret kafka-sample-kafka-secret --namespace test -o jsonpath='{.data.password}' | base64 -d)\";\n# save the file and run the following commands\nkubectl run kafka-kafka-client --restart='Never' --image docker.io/apache/kafka:4.1.0 --namespace test --command -- sleep infinity\nkubectl cp --namespace test ./client.properties kafka-kafka-client:/tmp/client.properties\nkubectl exec --tty -i kafka-kafka-client --namespace test -- bash\nkafka-console-producer.sh \\\n            --producer.config /tmp/client.properties \\\n            --broker-list kafka-sample-kafka-broker-0.kafka-sample-kafka-broker.test.svc.cluster.local:9092 \\\n            --topic test\n# write some stuff to topic\nkafka-console-consumer.sh \\\n            --consumer.config /tmp/client.properties \\\n            --bootstrap-server kafka-sample-kafka-broker-0.kafka-sample-kafka-broker.test.svc.cluster.local:9092 \\\n            --topic test --from-beginning\n# wait until topic content is shown\n```\n\n### MariaDB\n\n```bash\nkubectl exec -it maria-0 -n test -- mysql -u root -p db\n```\n\n### MinIO\n\n```bash\nmc alias set myminio http://minio-sample:9000 admin kPUMn2JZTc\nmc mb myminio/bucket\nmc ls myminio\n```\n\n### MsSql\n\n```bash\nkubectl run -n test -it --rm --image=mcr.microsoft.com/mssql-tools bash\nsqlcmd -S mssql-sample -U sa\n```\n\n### Redis\n\n```bash\nredis-cli -h redis-master -p 6379 -a bLaesXrA1V\n```\n\n### PostgreSQL\n\n```bash\nkubectl run -n test -it --rm --image=postgres:latest postgres-client -- psql -h 10.96.193.248 -U postgres -d postgres --password\n```\n\n## Known issues\n\n- console intregration does not offer all options shown in UI and sometimes does not seem to show all connection information\n- Several charts (elastic, kafka, mariadb, MsSql which is plain yaml) do not provide the `persistentVolumeClaimRetentionPolicy` parameter which is needed to remove the PVCs when the Helm release is deleted. Therefore, the crossplane operator removes them manually after the catalog item removal. Alternatively, we could create our own PCV with Crossplane as part of the composition and reference that as existingClaim in the Helm release.\n\n### Redis\n\n- `consoel redis client` is not authenticating correctly, see error message when calling e.g. `INFO` command\n\n## Work with functions\n\nRead the article about [Composition Funcitons](https://docs.crossplane.io/latest/concepts/composition-functions/) and the [function-go-tempalting Readme](https://github.com/crossplane-contrib/function-go-templating). Sometimes, also the [Composition Functions design doc](https://github.com/stevendborrelli/crossplane/blob/master/design/design-doc-composition-functions.md) is useful. Regarding the templating syntax, use the [Go Helm template functions doc](https://helm.sh/docs/chart_template_guide/function_list).\n\n```bash\t\ncrossplane beta render examples/mssql-2022.yaml package/mssql/composition.yaml docs/functions.yaml \u003e out.yaml\n```\n\nDebugging to see which keys are available: print this stuff you look for as connectiondetails:\n  \n  ```yaml\n  resources1: {{- range $key, $value := .observed.resources.info.resource.status.atProvider.manifest.data.resourcegroup -}}{{- if $value -}}{{- printf \"%s,\" $key -}}{{- end -}}{{- end -}}\n  ```\n\n  Then an error including the keys is shown in the managed resource status.\n\n## GitHub Action Prerequisites\n\nAdd REGISTRY_URL index.docker.io to the variables section and DOCKERHUB_TOKEN and DOCKERHUB_USERNAME to the secrets section of the GitHub repository settings.\n\n## Further improvements\n\n- add OracleDB and SQLServer catalog item\n- Show \"danger\" emoji at spec.version saying that this may break the application and migration has to be done potentially\n- Make the crossplane operator watching the `crossplane` ConfigMap in the `platformplane` namespace (not copying the file on startup using that value until the pod is killed)\n- add dependabot to the repo\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fplatformplane%2Fcatalog-crossplane","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fplatformplane%2Fcatalog-crossplane","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fplatformplane%2Fcatalog-crossplane/lists"}