This is page 96 of 126. Use http://codebase.md/controlplaneio-fluxcd/flux-operator?lines=true&page={x} to view the full context.
# Directory Structure
```
├── .github
│ ├── actions
│ │ └── runner-cleanup
│ │ └── action.yml
│ ├── copilot-instructions.md
│ ├── dependabot.yaml
│ └── workflows
│ ├── actions-test.yaml
│ ├── e2e-olm.yaml
│ ├── preview.yaml
│ ├── push-manifests.yaml
│ ├── release.yaml
│ └── test.yaml
├── .gitignore
├── .golangci.yml
├── .goreleaser.yml
├── actions
│ └── setup
│ ├── action.yaml
│ └── README.md
├── AGENTS.md
├── api
│ └── v1
│ ├── common_types_test.go
│ ├── common_types.go
│ ├── fluxinstance_types.go
│ ├── fluxreport_types.go
│ ├── groupversion_info.go
│ ├── history_types_test.go
│ ├── history_types.go
│ ├── resourceset_types.go
│ ├── resourcesetinputprovider_types.go
│ ├── schedule_types.go
│ └── zz_generated.deepcopy.go
├── cmd
│ ├── cli
│ │ ├── build_instance.go
│ │ ├── build_resourceset_test.go
│ │ ├── build_resourceset.go
│ │ ├── build.go
│ │ ├── client.go
│ │ ├── completion_bash.go
│ │ ├── completion_fish.go
│ │ ├── completion_powershell.go
│ │ ├── completion_zsh.go
│ │ ├── completion.go
│ │ ├── create_secret_basicauth_test.go
│ │ ├── create_secret_basicauth.go
│ │ ├── create_secret_githubapp.go
│ │ ├── create_secret_proxy_test.go
│ │ ├── create_secret_proxy.go
│ │ ├── create_secret_registry_test.go
│ │ ├── create_secret_registry.go
│ │ ├── create_secret_sops_test.go
│ │ ├── create_secret_sops.go
│ │ ├── create_secret_ssh.go
│ │ ├── create_secret_tls.go
│ │ ├── create_secret.go
│ │ ├── create.go
│ │ ├── debug_web_cookie.go
│ │ ├── debug_web.go
│ │ ├── debug.go
│ │ ├── delete_inputprovider_test.go
│ │ ├── delete_inputprovider.go
│ │ ├── delete_instance_test.go
│ │ ├── delete_instance.go
│ │ ├── delete_resourceset_test.go
│ │ ├── delete_resourceset.go
│ │ ├── delete.go
│ │ ├── distro_decrypt_manifests_test.go
│ │ ├── distro_decrypt_manifests.go
│ │ ├── distro_decrypt_token_test.go
│ │ ├── distro_decrypt_token.go
│ │ ├── distro_decrypt.go
│ │ ├── distro_encrypt_manifests_test.go
│ │ ├── distro_encrypt_manifests.go
│ │ ├── distro_encrypt_token_test.go
│ │ ├── distro_encrypt_token.go
│ │ ├── distro_encrypt.go
│ │ ├── distro_keygen_enc_test.go
│ │ ├── distro_keygen_enc.go
│ │ ├── distro_keygen_sig_test.go
│ │ ├── distro_keygen_sig.go
│ │ ├── distro_keygen.go
│ │ ├── distro_revoke_license_key_test.go
│ │ ├── distro_revoke_license_key.go
│ │ ├── distro_revoke.go
│ │ ├── distro_sign_artifacts_test.go
│ │ ├── distro_sign_artifacts.go
│ │ ├── distro_sign_license_key_test.go
│ │ ├── distro_sign_license_key.go
│ │ ├── distro_sign_manifests_test.go
│ │ ├── distro_sign_manifests.go
│ │ ├── distro_sign.go
│ │ ├── distro_verify_artifacts_test.go
│ │ ├── distro_verify_artifacts.go
│ │ ├── distro_verify_license_key_test.go
│ │ ├── distro_verify_license_key.go
│ │ ├── distro_verify_manifests_test.go
│ │ ├── distro_verify_manifests.go
│ │ ├── distro_verify.go
│ │ ├── distro.go
│ │ ├── Dockerfile
│ │ ├── export_report_test.go
│ │ ├── export_report.go
│ │ ├── export_resource_test.go
│ │ ├── export_resource.go
│ │ ├── export.go
│ │ ├── get_inputprovider_test.go
│ │ ├── get_inputprovider.go
│ │ ├── get_instance.go
│ │ ├── get_resources.go
│ │ ├── get_resourceset_test.go
│ │ ├── get_resourceset.go
│ │ ├── get.go
│ │ ├── install.go
│ │ ├── main.go
│ │ ├── README.md
│ │ ├── reconcile_inputprovider.go
│ │ ├── reconcile_instance.go
│ │ ├── reconcile_resource.go
│ │ ├── reconcile_resources.go
│ │ ├── reconcile_resourceset.go
│ │ ├── reconcile.go
│ │ ├── resume_inputprovider.go
│ │ ├── resume_instance.go
│ │ ├── resume_resource.go
│ │ ├── resume_resourceset.go
│ │ ├── resume.go
│ │ ├── stats.go
│ │ ├── suite_test.go
│ │ ├── suspend_inputprovider.go
│ │ ├── suspend_instance.go
│ │ ├── suspend_resource.go
│ │ ├── suspend_resourceset.go
│ │ ├── suspend.go
│ │ ├── testdata
│ │ │ └── build_resourceset
│ │ │ ├── golden-labeled.yaml
│ │ │ ├── golden-named.yaml
│ │ │ ├── golden-permuted.yaml
│ │ │ ├── golden.yaml
│ │ │ ├── inputs.yaml
│ │ │ ├── rset-standalone.yaml
│ │ │ ├── rset-with-rsip-labeled.yaml
│ │ │ ├── rset-with-rsip-named.yaml
│ │ │ ├── rset-with-rsip-permuted.yaml
│ │ │ ├── rset-with-rsip.yaml
│ │ │ ├── rsip-labeled.yaml
│ │ │ ├── rsip-named.yaml
│ │ │ └── rsip.yaml
│ │ ├── trace_test.go
│ │ ├── trace_types.go
│ │ ├── trace.go
│ │ ├── tree_helmrelease.go
│ │ ├── tree_kustomization.go
│ │ ├── tree_resourceset_test.go
│ │ ├── tree_resourceset.go
│ │ ├── tree.go
│ │ ├── uninstall.go
│ │ ├── version_test.go
│ │ ├── version.go
│ │ ├── wait_inputprovider_test.go
│ │ ├── wait_inputprovider.go
│ │ ├── wait_instance_test.go
│ │ ├── wait_instance.go
│ │ ├── wait_resourceset_test.go
│ │ ├── wait_resourceset.go
│ │ └── wait.go
│ ├── mcp
│ │ ├── Dockerfile
│ │ ├── k8s
│ │ │ ├── actions_test.go
│ │ │ ├── actions.go
│ │ │ ├── client_test.go
│ │ │ ├── client.go
│ │ │ ├── config.go
│ │ │ ├── events_test.go
│ │ │ ├── events.go
│ │ │ ├── export_test.go
│ │ │ ├── export.go
│ │ │ ├── helm.go
│ │ │ ├── logs.go
│ │ │ ├── metrics.go
│ │ │ └── suite_test.go
│ │ ├── main.go
│ │ ├── prompter
│ │ │ ├── debug_helmrelease_test.go
│ │ │ ├── debug_helmrelease.go
│ │ │ ├── debug_kustomization_test.go
│ │ │ ├── debug_kustomization.go
│ │ │ ├── index.go
│ │ │ └── manager.go
│ │ ├── README.md
│ │ └── toolbox
│ │ ├── apply_manifest_test.go
│ │ ├── apply_manifest.go
│ │ ├── delete_resource_test.go
│ │ ├── delete_resource.go
│ │ ├── get_apis_test.go
│ │ ├── get_apis.go
│ │ ├── get_contexts_test.go
│ │ ├── get_contexts.go
│ │ ├── get_instance_test.go
│ │ ├── get_instance.go
│ │ ├── get_logs_test.go
│ │ ├── get_logs.go
│ │ ├── get_metrics_test.go
│ │ ├── get_metrics.go
│ │ ├── get_resource_test.go
│ │ ├── get_resource.go
│ │ ├── helpers.go
│ │ ├── indexer
│ │ │ └── main.go
│ │ ├── install_instance_test.go
│ │ ├── install_instance.go
│ │ ├── library
│ │ │ ├── bm25_test.go
│ │ │ ├── bm25.go
│ │ │ ├── index.go
│ │ │ ├── index.gob
│ │ │ ├── library.go
│ │ │ ├── search_test.go
│ │ │ ├── search.go
│ │ │ ├── tokenizer_test.go
│ │ │ └── tokenizer.go
│ │ ├── manager_test.go
│ │ ├── manager.go
│ │ ├── reconcile_helmrelease_test.go
│ │ ├── reconcile_helmrelease.go
│ │ ├── reconcile_kustomization_test.go
│ │ ├── reconcile_kustomization.go
│ │ ├── reconcile_resourceset_test.go
│ │ ├── reconcile_resourceset.go
│ │ ├── reconcile_source_test.go
│ │ ├── reconcile_source.go
│ │ ├── resume_reconciliation_test.go
│ │ ├── resume_reconciliation.go
│ │ ├── scopes_test.go
│ │ ├── scopes.go
│ │ ├── search_flux_docs_test.go
│ │ ├── search_flux_docs.go
│ │ ├── set_context_test.go
│ │ ├── set_context.go
│ │ ├── suspend_reconciliation_test.go
│ │ ├── suspend_reconciliation.go
│ │ └── testdata
│ │ ├── kubeconfig_golden.yaml
│ │ └── kubeconfig.yaml
│ └── operator
│ └── main.go
├── config
│ ├── crd
│ │ ├── bases
│ │ │ ├── fluxcd.controlplane.io_fluxinstances.yaml
│ │ │ ├── fluxcd.controlplane.io_fluxreports.yaml
│ │ │ ├── fluxcd.controlplane.io_resourcesetinputproviders.yaml
│ │ │ └── fluxcd.controlplane.io_resourcesets.yaml
│ │ ├── kustomization.yaml
│ │ └── kustomizeconfig.yaml
│ ├── data
│ │ ├── flux
│ │ │ ├── v2.2.3
│ │ │ │ ├── helm-controller.yaml
│ │ │ │ ├── image-automation-controller.yaml
│ │ │ │ ├── image-reflector-controller.yaml
│ │ │ │ ├── kustomize-controller.yaml
│ │ │ │ ├── notification-controller.yaml
│ │ │ │ ├── policies.yaml
│ │ │ │ ├── rbac.yaml
│ │ │ │ └── source-controller.yaml
│ │ │ ├── v2.3.0
│ │ │ │ ├── helm-controller.yaml
│ │ │ │ ├── image-automation-controller.yaml
│ │ │ │ ├── image-reflector-controller.yaml
│ │ │ │ ├── kustomize-controller.yaml
│ │ │ │ ├── notification-controller.yaml
│ │ │ │ ├── policies.yaml
│ │ │ │ ├── rbac.yaml
│ │ │ │ └── source-controller.yaml
│ │ │ ├── v2.4.0
│ │ │ │ ├── helm-controller.yaml
│ │ │ │ ├── image-automation-controller.yaml
│ │ │ │ ├── image-reflector-controller.yaml
│ │ │ │ ├── kustomize-controller.yaml
│ │ │ │ ├── notification-controller.yaml
│ │ │ │ ├── policies.yaml
│ │ │ │ ├── rbac.yaml
│ │ │ │ └── source-controller.yaml
│ │ │ ├── v2.5.0
│ │ │ │ ├── helm-controller.yaml
│ │ │ │ ├── image-automation-controller.yaml
│ │ │ │ ├── image-reflector-controller.yaml
│ │ │ │ ├── kustomize-controller.yaml
│ │ │ │ ├── notification-controller.yaml
│ │ │ │ ├── policies.yaml
│ │ │ │ ├── rbac.yaml
│ │ │ │ └── source-controller.yaml
│ │ │ ├── v2.5.1
│ │ │ │ ├── helm-controller.yaml
│ │ │ │ ├── image-automation-controller.yaml
│ │ │ │ ├── image-reflector-controller.yaml
│ │ │ │ ├── kustomize-controller.yaml
│ │ │ │ ├── notification-controller.yaml
│ │ │ │ ├── policies.yaml
│ │ │ │ ├── rbac.yaml
│ │ │ │ └── source-controller.yaml
│ │ │ ├── v2.6.0
│ │ │ │ ├── helm-controller.yaml
│ │ │ │ ├── image-automation-controller.yaml
│ │ │ │ ├── image-reflector-controller.yaml
│ │ │ │ ├── kustomize-controller.yaml
│ │ │ │ ├── notification-controller.yaml
│ │ │ │ ├── policies.yaml
│ │ │ │ ├── rbac.yaml
│ │ │ │ └── source-controller.yaml
│ │ │ ├── v2.6.1
│ │ │ │ ├── helm-controller.yaml
│ │ │ │ ├── image-automation-controller.yaml
│ │ │ │ ├── image-reflector-controller.yaml
│ │ │ │ ├── kustomize-controller.yaml
│ │ │ │ ├── notification-controller.yaml
│ │ │ │ ├── policies.yaml
│ │ │ │ ├── rbac.yaml
│ │ │ │ └── source-controller.yaml
│ │ │ ├── v2.6.2
│ │ │ │ ├── helm-controller.yaml
│ │ │ │ ├── image-automation-controller.yaml
│ │ │ │ ├── image-reflector-controller.yaml
│ │ │ │ ├── kustomize-controller.yaml
│ │ │ │ ├── notification-controller.yaml
│ │ │ │ ├── policies.yaml
│ │ │ │ ├── rbac.yaml
│ │ │ │ └── source-controller.yaml
│ │ │ ├── v2.6.3
│ │ │ │ ├── helm-controller.yaml
│ │ │ │ ├── image-automation-controller.yaml
│ │ │ │ ├── image-reflector-controller.yaml
│ │ │ │ ├── kustomize-controller.yaml
│ │ │ │ ├── notification-controller.yaml
│ │ │ │ ├── policies.yaml
│ │ │ │ ├── rbac.yaml
│ │ │ │ └── source-controller.yaml
│ │ │ ├── v2.6.4
│ │ │ │ ├── helm-controller.yaml
│ │ │ │ ├── image-automation-controller.yaml
│ │ │ │ ├── image-reflector-controller.yaml
│ │ │ │ ├── kustomize-controller.yaml
│ │ │ │ ├── notification-controller.yaml
│ │ │ │ ├── policies.yaml
│ │ │ │ ├── rbac.yaml
│ │ │ │ └── source-controller.yaml
│ │ │ ├── v2.7.0
│ │ │ │ ├── helm-controller.yaml
│ │ │ │ ├── image-automation-controller.yaml
│ │ │ │ ├── image-reflector-controller.yaml
│ │ │ │ ├── kustomize-controller.yaml
│ │ │ │ ├── notification-controller.yaml
│ │ │ │ ├── policies.yaml
│ │ │ │ ├── rbac.yaml
│ │ │ │ ├── source-controller.yaml
│ │ │ │ └── source-watcher.yaml
│ │ │ ├── v2.7.1
│ │ │ │ ├── helm-controller.yaml
│ │ │ │ ├── image-automation-controller.yaml
│ │ │ │ ├── image-reflector-controller.yaml
│ │ │ │ ├── kustomize-controller.yaml
│ │ │ │ ├── notification-controller.yaml
│ │ │ │ ├── policies.yaml
│ │ │ │ ├── rbac.yaml
│ │ │ │ ├── source-controller.yaml
│ │ │ │ └── source-watcher.yaml
│ │ │ ├── v2.7.2
│ │ │ │ ├── helm-controller.yaml
│ │ │ │ ├── image-automation-controller.yaml
│ │ │ │ ├── image-reflector-controller.yaml
│ │ │ │ ├── kustomize-controller.yaml
│ │ │ │ ├── notification-controller.yaml
│ │ │ │ ├── policies.yaml
│ │ │ │ ├── rbac.yaml
│ │ │ │ ├── source-controller.yaml
│ │ │ │ └── source-watcher.yaml
│ │ │ ├── v2.7.3
│ │ │ │ ├── helm-controller.yaml
│ │ │ │ ├── image-automation-controller.yaml
│ │ │ │ ├── image-reflector-controller.yaml
│ │ │ │ ├── kustomize-controller.yaml
│ │ │ │ ├── notification-controller.yaml
│ │ │ │ ├── policies.yaml
│ │ │ │ ├── rbac.yaml
│ │ │ │ ├── source-controller.yaml
│ │ │ │ └── source-watcher.yaml
│ │ │ ├── v2.7.4
│ │ │ │ ├── helm-controller.yaml
│ │ │ │ ├── image-automation-controller.yaml
│ │ │ │ ├── image-reflector-controller.yaml
│ │ │ │ ├── kustomize-controller.yaml
│ │ │ │ ├── notification-controller.yaml
│ │ │ │ ├── policies.yaml
│ │ │ │ ├── rbac.yaml
│ │ │ │ ├── source-controller.yaml
│ │ │ │ └── source-watcher.yaml
│ │ │ └── v2.7.5
│ │ │ ├── helm-controller.yaml
│ │ │ ├── image-automation-controller.yaml
│ │ │ ├── image-reflector-controller.yaml
│ │ │ ├── kustomize-controller.yaml
│ │ │ ├── notification-controller.yaml
│ │ │ ├── policies.yaml
│ │ │ ├── rbac.yaml
│ │ │ ├── source-controller.yaml
│ │ │ └── source-watcher.yaml
│ │ ├── flux-images
│ │ │ ├── v2.2.0
│ │ │ │ ├── enterprise-alpine.yaml
│ │ │ │ ├── enterprise-distroless.yaml
│ │ │ │ └── upstream-alpine.yaml
│ │ │ ├── v2.2.1
│ │ │ │ ├── enterprise-alpine.yaml
│ │ │ │ ├── enterprise-distroless.yaml
│ │ │ │ └── upstream-alpine.yaml
│ │ │ ├── v2.2.2
│ │ │ │ ├── enterprise-alpine.yaml
│ │ │ │ ├── enterprise-distroless.yaml
│ │ │ │ └── upstream-alpine.yaml
│ │ │ ├── v2.2.3
│ │ │ │ ├── enterprise-alpine.yaml
│ │ │ │ ├── enterprise-distroless.yaml
│ │ │ │ └── upstream-alpine.yaml
│ │ │ ├── v2.3.0
│ │ │ │ ├── enterprise-alpine.yaml
│ │ │ │ ├── enterprise-distroless.yaml
│ │ │ │ └── upstream-alpine.yaml
│ │ │ ├── v2.4.0
│ │ │ │ ├── enterprise-alpine.yaml
│ │ │ │ ├── enterprise-distroless.yaml
│ │ │ │ └── upstream-alpine.yaml
│ │ │ ├── v2.5.0
│ │ │ │ ├── enterprise-alpine.yaml
│ │ │ │ ├── enterprise-distroless.yaml
│ │ │ │ └── upstream-alpine.yaml
│ │ │ ├── v2.5.1
│ │ │ │ ├── enterprise-alpine.yaml
│ │ │ │ ├── enterprise-distroless-fips.yaml
│ │ │ │ ├── enterprise-distroless.yaml
│ │ │ │ └── upstream-alpine.yaml
│ │ │ ├── v2.6.0
│ │ │ │ ├── enterprise-alpine.yaml
│ │ │ │ ├── enterprise-distroless.yaml
│ │ │ │ └── upstream-alpine.yaml
│ │ │ ├── v2.6.1
│ │ │ │ ├── enterprise-alpine.yaml
│ │ │ │ ├── enterprise-distroless.yaml
│ │ │ │ └── upstream-alpine.yaml
│ │ │ ├── v2.6.2
│ │ │ │ ├── enterprise-alpine.yaml
│ │ │ │ ├── enterprise-distroless.yaml
│ │ │ │ └── upstream-alpine.yaml
│ │ │ ├── v2.6.3
│ │ │ │ ├── enterprise-alpine.yaml
│ │ │ │ ├── enterprise-distroless.yaml
│ │ │ │ └── upstream-alpine.yaml
│ │ │ ├── v2.6.4
│ │ │ │ ├── enterprise-alpine.yaml
│ │ │ │ ├── enterprise-distroless-fips.yaml
│ │ │ │ ├── enterprise-distroless.yaml
│ │ │ │ └── upstream-alpine.yaml
│ │ │ ├── v2.7.0
│ │ │ │ ├── enterprise-alpine.yaml
│ │ │ │ ├── enterprise-distroless.yaml
│ │ │ │ └── upstream-alpine.yaml
│ │ │ ├── v2.7.1
│ │ │ │ ├── enterprise-alpine.yaml
│ │ │ │ ├── enterprise-distroless.yaml
│ │ │ │ └── upstream-alpine.yaml
│ │ │ ├── v2.7.2
│ │ │ │ ├── enterprise-alpine.yaml
│ │ │ │ ├── enterprise-distroless.yaml
│ │ │ │ └── upstream-alpine.yaml
│ │ │ ├── v2.7.3
│ │ │ │ ├── enterprise-alpine.yaml
│ │ │ │ ├── enterprise-distroless.yaml
│ │ │ │ └── upstream-alpine.yaml
│ │ │ ├── v2.7.4
│ │ │ │ ├── enterprise-alpine.yaml
│ │ │ │ ├── enterprise-distroless.yaml
│ │ │ │ └── upstream-alpine.yaml
│ │ │ ├── v2.7.5
│ │ │ │ ├── enterprise-alpine.yaml
│ │ │ │ ├── enterprise-distroless-fips.yaml
│ │ │ │ ├── enterprise-distroless.yaml
│ │ │ │ └── upstream-alpine.yaml
│ │ │ └── VERSION
│ │ └── flux-vex
│ │ ├── v2.2.json
│ │ ├── v2.3.json
│ │ ├── v2.4.json
│ │ ├── v2.5.json
│ │ ├── v2.6.json
│ │ └── v2.7.json
│ ├── default
│ │ ├── kustomization.yaml
│ │ ├── namespace.yaml
│ │ └── rbac.yaml
│ ├── manager
│ │ ├── account.yaml
│ │ ├── deployment.yaml
│ │ ├── kustomization.yaml
│ │ └── service.yaml
│ ├── mcp
│ │ ├── deployment.yaml
│ │ ├── kustomization.yaml
│ │ └── service.yaml
│ ├── monitoring
│ │ ├── dashboards
│ │ │ ├── flux-k8s-api-performance.json
│ │ │ └── flux-performance.json
│ │ ├── flux-controllers.yaml
│ │ ├── flux-operator.yaml
│ │ └── kustomization.yaml
│ ├── olm
│ │ ├── build
│ │ │ └── Dockerfile
│ │ ├── bundle
│ │ │ ├── manifests
│ │ │ │ ├── flux-operator.clusterserviceversion.yaml
│ │ │ │ ├── flux-operator.service.yaml
│ │ │ │ ├── fluxinstances.fluxcd.controlplane.io.crd.yaml
│ │ │ │ ├── fluxreports.fluxcd.controlplane.io.crd.yaml
│ │ │ │ ├── resourcesetinputproviders.fluxcd.controlplane.io.crd.yaml
│ │ │ │ └── resourcesets.fluxcd.controlplane.io.crd.yaml
│ │ │ ├── metadata
│ │ │ │ └── annotations.yaml
│ │ │ └── tests
│ │ │ └── scorecard
│ │ │ └── config.yaml
│ │ ├── ci.yaml
│ │ └── test
│ │ ├── bundle.Dockerfile
│ │ ├── olm.yaml
│ │ └── opm.Dockerfile
│ ├── rbac
│ │ ├── fluxinstance_editor_role.yaml
│ │ ├── fluxinstance_viewer_role.yaml
│ │ ├── fluxreport_editor_role.yaml
│ │ ├── fluxreport_viewer_role.yaml
│ │ ├── kustomization.yaml
│ │ ├── leader_election_role_binding.yaml
│ │ ├── leader_election_role.yaml
│ │ ├── resourceset_editor_role.yaml
│ │ ├── resourceset_viewer_role.yaml
│ │ ├── role_binding.yaml
│ │ ├── role.yaml
│ │ └── service_account.yaml
│ ├── samples
│ │ ├── fluxcd_v1_fluxinstance.yaml
│ │ ├── fluxcd_v1_fluxreport.yaml
│ │ ├── fluxcd_v1_resourceset.yaml
│ │ ├── fluxcd_v1_resourcesetinputprovider.yaml
│ │ └── kustomization.yaml
│ └── terraform
│ ├── main.tf
│ ├── outputs.tf
│ ├── providers.tf
│ ├── README.md
│ ├── values
│ │ └── components.yaml
│ ├── variables.tf
│ └── versions.tf
├── CONTRIBUTING.md
├── Dockerfile
├── docs
│ ├── api
│ │ └── v1
│ │ ├── fluxinstance.md
│ │ ├── fluxreport.md
│ │ ├── resourceset.md
│ │ └── resourcesetinputprovider.md
│ ├── dev
│ │ └── README.md
│ ├── guides
│ │ ├── instance
│ │ │ ├── instance-controllers.md
│ │ │ ├── instance-customization.md
│ │ │ ├── instance-monitoring.md
│ │ │ ├── instance-sharding.md
│ │ │ └── instance-sync.md
│ │ ├── operator
│ │ │ ├── operator-install.md
│ │ │ └── operator-migration.md
│ │ └── resourcesets
│ │ ├── rset-app-definition.md
│ │ ├── rset-github-pull-requests.md
│ │ ├── rset-gitlab-environments.md
│ │ ├── rset-gitlab-merge-requests.md
│ │ ├── rset-image-automation.md
│ │ ├── rset-introduction.md
│ │ └── rset-time-based-delivery.md
│ ├── lkm
│ │ └── README.md
│ ├── logo
│ │ ├── flux-operator-banner.png
│ │ ├── flux-operator-banner.svg
│ │ ├── flux-operator-icon.png
│ │ ├── flux-operator-icon.svg
│ │ ├── flux-operator-logo.png
│ │ └── flux-operator-logo.svg
│ ├── mcp
│ │ ├── instructions.md
│ │ ├── mcp-config.md
│ │ ├── mcp-install.md
│ │ ├── mcp-prompting.md
│ │ ├── prompts.md
│ │ └── tools.md
│ └── web
│ ├── web-config-api.md
│ ├── web-ingress.md
│ ├── web-sso-dex.md
│ ├── web-sso-keycloak.md
│ ├── web-sso-openshift.md
│ ├── web-standalone.md
│ └── web-user-management.md
├── go.mod
├── go.sum
├── hack
│ ├── boilerplate.go.txt
│ ├── build-dist-manifests.sh
│ ├── build-olm-images.sh
│ ├── build-olm-manifests.sh
│ ├── install-operator-sdk.sh
│ ├── prep-release.sh
│ ├── vendor-flux-manifests.sh
│ └── web-ui-load-test.sh
├── internal
│ ├── builder
│ │ ├── build_test.go
│ │ ├── build.go
│ │ ├── components.go
│ │ ├── digest.go
│ │ ├── images_test.go
│ │ ├── images.go
│ │ ├── options.go
│ │ ├── preflight_test.go
│ │ ├── preflight.go
│ │ ├── profiles.go
│ │ ├── pull.go
│ │ ├── resourceset_test.go
│ │ ├── resourceset.go
│ │ ├── result.go
│ │ ├── semver_test.go
│ │ ├── semver.go
│ │ ├── templates.go
│ │ ├── testdata
│ │ │ ├── flux
│ │ │ │ ├── v2.2.0
│ │ │ │ │ └── .gitkeep
│ │ │ │ ├── v2.2.1
│ │ │ │ │ └── .gitkeep
│ │ │ │ └── v2.3.0
│ │ │ │ └── .gitkeep
│ │ │ ├── flux-images
│ │ │ │ └── v2.3.0
│ │ │ │ ├── enterprise-alpine.yaml
│ │ │ │ ├── enterprise-distroless.yaml
│ │ │ │ └── upstream-alpine.yaml
│ │ │ ├── resourceset
│ │ │ │ ├── dedup.golden.yaml
│ │ │ │ ├── dedup.yaml
│ │ │ │ ├── empty.yaml
│ │ │ │ ├── exclude.golden.yaml
│ │ │ │ ├── exclude.yaml
│ │ │ │ ├── invalid-output.yaml
│ │ │ │ ├── missing-inputs.yaml
│ │ │ │ ├── multi-doc-template.golden.yaml
│ │ │ │ ├── multi-doc-template.yaml
│ │ │ │ ├── nestedinputs.golden.yaml
│ │ │ │ ├── nestedinputs.yaml
│ │ │ │ ├── noinputs.golden.yaml
│ │ │ │ ├── noinputs.yaml
│ │ │ │ ├── slugify.golden.yaml
│ │ │ │ └── slugify.yaml
│ │ │ ├── v2.3.0
│ │ │ │ ├── helm-controller.yaml
│ │ │ │ ├── image-automation-controller.yaml
│ │ │ │ ├── image-reflector-controller.yaml
│ │ │ │ ├── kustomize-controller.yaml
│ │ │ │ ├── notification-controller.yaml
│ │ │ │ ├── policies.yaml
│ │ │ │ ├── rbac.yaml
│ │ │ │ └── source-controller.yaml
│ │ │ ├── v2.3.0-golden
│ │ │ │ ├── default.kustomization.yaml
│ │ │ │ ├── patches.kustomization.yaml
│ │ │ │ ├── profiles.kustomization.yaml
│ │ │ │ ├── sharding.kustomization.yaml
│ │ │ │ ├── storage.kustomization.yaml
│ │ │ │ └── sync.kustomization.yaml
│ │ │ ├── v2.6.0
│ │ │ │ ├── helm-controller.yaml
│ │ │ │ ├── image-automation-controller.yaml
│ │ │ │ ├── image-reflector-controller.yaml
│ │ │ │ ├── kustomize-controller.yaml
│ │ │ │ ├── notification-controller.yaml
│ │ │ │ ├── policies.yaml
│ │ │ │ ├── rbac.yaml
│ │ │ │ └── source-controller.yaml
│ │ │ ├── v2.6.0-golden
│ │ │ │ ├── shard1.kustomization.yaml
│ │ │ │ ├── shard2.kustomization.yaml
│ │ │ │ ├── sharding.kustomization.yaml
│ │ │ │ ├── size.large.kustomization.yaml
│ │ │ │ ├── size.medium.kustomization.yaml
│ │ │ │ └── size.small.kustomization.yaml
│ │ │ ├── v2.7.0
│ │ │ │ ├── helm-controller.yaml
│ │ │ │ ├── image-automation-controller.yaml
│ │ │ │ ├── image-reflector-controller.yaml
│ │ │ │ ├── kustomize-controller.yaml
│ │ │ │ ├── notification-controller.yaml
│ │ │ │ ├── policies.yaml
│ │ │ │ ├── rbac.yaml
│ │ │ │ ├── source-controller.yaml
│ │ │ │ └── source-watcher.yaml
│ │ │ └── v2.7.0-golden
│ │ │ └── source-watcher.kustomization.yaml
│ │ └── workload_identity.go
│ ├── controller
│ │ ├── common.go
│ │ ├── entitlement_controller_test.go
│ │ ├── entitlement_controller.go
│ │ ├── fluxinstance_artifact_controller_test.go
│ │ ├── fluxinstance_artifact_controller.go
│ │ ├── fluxinstance_artifact_manager_test.go
│ │ ├── fluxinstance_artifact_manager.go
│ │ ├── fluxinstance_controller_test.go
│ │ ├── fluxinstance_controller.go
│ │ ├── fluxinstance_manager.go
│ │ ├── fluxinstance_migrator.go
│ │ ├── fluxinstance_uninstaller.go
│ │ ├── fluxreport_controller_test.go
│ │ ├── fluxreport_controller.go
│ │ ├── resourceset_controller_test.go
│ │ ├── resourceset_controller.go
│ │ ├── resourceset_manager_test.go
│ │ ├── resourceset_manager.go
│ │ ├── resourcesetinputprovider_controller_git_test.go
│ │ ├── resourcesetinputprovider_controller_oci_test.go
│ │ ├── resourcesetinputprovider_controller_test.go
│ │ ├── resourcesetinputprovider_controller.go
│ │ ├── resourcesetinputprovider_manager.go
│ │ ├── suite_test.go
│ │ └── testdata
│ │ └── rsa-private-key.pem
│ ├── entitlement
│ │ ├── aws.go
│ │ ├── client_test.go
│ │ ├── client.go
│ │ ├── default_test.go
│ │ └── default.go
│ ├── filtering
│ │ ├── filters_test.go
│ │ └── filters.go
│ ├── gitprovider
│ │ ├── azuredevops_test.go
│ │ ├── azuredevops.go
│ │ ├── github_test.go
│ │ ├── github.go
│ │ ├── gitlab_test.go
│ │ ├── gitlab.go
│ │ ├── interface.go
│ │ ├── options.go
│ │ ├── result_test.go
│ │ └── result.go
│ ├── inputs
│ │ ├── combine_test.go
│ │ ├── combine.go
│ │ ├── flattener.go
│ │ ├── id.go
│ │ ├── json_test.go
│ │ ├── json.go
│ │ ├── keys_test.go
│ │ ├── keys.go
│ │ ├── permuter_test.go
│ │ ├── permuter.go
│ │ └── provider.go
│ ├── install
│ │ ├── autoupdate.go
│ │ ├── client.go
│ │ ├── credentials.go
│ │ ├── deploy.go
│ │ ├── download.go
│ │ ├── events.go
│ │ ├── installer.go
│ │ ├── options.go
│ │ └── uninstall.go
│ ├── inventory
│ │ ├── inventory_test.go
│ │ ├── inventory.go
│ │ ├── reader_test.go
│ │ ├── reader.go
│ │ └── testdata
│ │ ├── inventory1.yaml
│ │ └── inventory2.yaml
│ ├── lkm
│ │ ├── artifacts_attestation_test.go
│ │ ├── artifacts_attestation.go
│ │ ├── attestation_test.go
│ │ ├── attestation.go
│ │ ├── doc.go
│ │ ├── errors.go
│ │ ├── fetch_test.go
│ │ ├── fetch.go
│ │ ├── jwe_test.go
│ │ ├── jwe.go
│ │ ├── jwt_test.go
│ │ ├── jwt.go
│ │ ├── keygen_test.go
│ │ ├── keygen.go
│ │ ├── keyset_test.go
│ │ ├── keyset.go
│ │ ├── license_test.go
│ │ ├── license.go
│ │ ├── licensekey.go
│ │ ├── manifests_attestation_test.go
│ │ ├── manifests_attestation.go
│ │ ├── revocation_test.go
│ │ └── revocation.go
│ ├── notifier
│ │ └── notifier.go
│ ├── reporter
│ │ ├── cluster.go
│ │ ├── components.go
│ │ ├── crds.go
│ │ ├── distribution.go
│ │ ├── metrics_test.go
│ │ ├── metrics.go
│ │ ├── reconcilers.go
│ │ ├── reporter.go
│ │ └── sync.go
│ ├── schedule
│ │ ├── scheduler_test.go
│ │ └── scheduler.go
│ ├── tests
│ │ ├── fluxinstance
│ │ │ ├── health_check_test.go
│ │ │ └── suite_test.go
│ │ └── resourceset
│ │ ├── health_check_test.go
│ │ └── suite_test.go
│ ├── testutils
│ │ ├── log.go
│ │ └── time.go
│ └── web
│ ├── action_test.go
│ ├── action.go
│ ├── auth
│ │ ├── claims_test.go
│ │ ├── claims.go
│ │ ├── cookies_test.go
│ │ ├── cookies.go
│ │ ├── errors_test.go
│ │ ├── errors.go
│ │ ├── middlewares_test.go
│ │ ├── middlewares.go
│ │ ├── oauth2_test.go
│ │ ├── oauth2.go
│ │ └── oidc.go
│ ├── config
│ │ ├── authentication_types_test.go
│ │ ├── authentication_types.go
│ │ ├── config_types_test.go
│ │ ├── config_types.go
│ │ ├── groupversion_info.go
│ │ ├── loader_test.go
│ │ ├── loader.go
│ │ ├── user_actions_types_test.go
│ │ ├── user_actions_types.go
│ │ └── watcher.go
│ ├── events_test.go
│ ├── events.go
│ ├── favorites_test.go
│ ├── favorites.go
│ ├── fs.go
│ ├── handler.go
│ ├── inventory.go
│ ├── kubeclient
│ │ ├── client_test.go
│ │ ├── client.go
│ │ └── suite_test.go
│ ├── middlewares_test.go
│ ├── middlewares.go
│ ├── report_test.go
│ ├── report.go
│ ├── resource_test.go
│ ├── resource.go
│ ├── resources_test.go
│ ├── resources.go
│ ├── search_test.go
│ ├── search.go
│ ├── server_test.go
│ ├── server.go
│ ├── source.go
│ ├── suite_test.go
│ ├── user
│ │ ├── user_test.go
│ │ └── user.go
│ ├── workload_test.go
│ ├── workload.go
│ ├── workloads_test.go
│ └── workloads.go
├── LICENSE
├── Makefile
├── PROJECT
├── README.md
├── SECURITY.md
├── test
│ ├── e2e
│ │ ├── e2e_suite_test.go
│ │ ├── e2e_test.go
│ │ ├── instance_test.go
│ │ └── utils.go
│ └── olm
│ ├── e2e_suite_test.go
│ ├── e2e_test.go
│ ├── instance_test.go
│ └── scorecard_test.go
└── web
├── .gitignore
├── embed.go
├── eslint.config.js
├── index.html
├── package-lock.json
├── package.json
├── postcss.config.js
├── public
│ ├── favicon.svg
│ └── fonts
│ └── inter.woff2
├── README.md
├── src
│ ├── app.jsx
│ ├── app.test.jsx
│ ├── components
│ │ ├── auth
│ │ │ ├── LoginPage.jsx
│ │ │ └── LoginPage.test.jsx
│ │ ├── dashboards
│ │ │ ├── cluster
│ │ │ │ ├── ClusterPage.jsx
│ │ │ │ ├── ClusterPage.test.jsx
│ │ │ │ ├── ControllersPanel.jsx
│ │ │ │ ├── ControllersPanel.test.jsx
│ │ │ │ ├── InfoPanel.jsx
│ │ │ │ ├── InfoPanel.test.jsx
│ │ │ │ ├── OverallStatusPanel.jsx
│ │ │ │ ├── OverallStatusPanel.test.jsx
│ │ │ │ ├── ReconcilersPanel.jsx
│ │ │ │ ├── ReconcilersPanel.test.jsx
│ │ │ │ ├── SyncPanel.jsx
│ │ │ │ └── SyncPanel.test.jsx
│ │ │ ├── common
│ │ │ │ ├── panel.jsx
│ │ │ │ ├── panel.test.jsx
│ │ │ │ ├── yaml.jsx
│ │ │ │ └── yaml.test.jsx
│ │ │ └── resource
│ │ │ ├── ActionBar.jsx
│ │ │ ├── ActionBar.test.jsx
│ │ │ ├── ArtifactPanel.jsx
│ │ │ ├── ArtifactPanel.test.jsx
│ │ │ ├── ExportedInputsPanel.jsx
│ │ │ ├── ExportedInputsPanel.test.jsx
│ │ │ ├── GraphTabContent.jsx
│ │ │ ├── GraphTabContent.test.jsx
│ │ │ ├── HistoryTimeline.jsx
│ │ │ ├── HistoryTimeline.test.jsx
│ │ │ ├── InputsPanel.jsx
│ │ │ ├── InputsPanel.test.jsx
│ │ │ ├── InventoryPanel.jsx
│ │ │ ├── InventoryPanel.test.jsx
│ │ │ ├── ReconcilerPanel.jsx
│ │ │ ├── ReconcilerPanel.test.jsx
│ │ │ ├── ResourcePage.jsx
│ │ │ ├── ResourcePage.test.jsx
│ │ │ ├── SourcePanel.jsx
│ │ │ ├── SourcePanel.test.jsx
│ │ │ ├── WorkloadsTabContent.jsx
│ │ │ └── WorkloadsTabContent.test.jsx
│ │ ├── favorites
│ │ │ ├── FavoriteCard.jsx
│ │ │ ├── FavoriteCard.test.jsx
│ │ │ ├── FavoritesHeader.jsx
│ │ │ ├── FavoritesHeader.test.jsx
│ │ │ ├── FavoritesPage.jsx
│ │ │ ├── FavoritesPage.test.jsx
│ │ │ ├── FavoritesSearch.jsx
│ │ │ └── FavoritesSearch.test.jsx
│ │ ├── layout
│ │ │ ├── ConnectionStatus.jsx
│ │ │ ├── ConnectionStatus.test.jsx
│ │ │ ├── Footer.jsx
│ │ │ ├── Footer.test.jsx
│ │ │ ├── Header.jsx
│ │ │ ├── Header.test.jsx
│ │ │ ├── Icons.jsx
│ │ │ ├── NotFoundPage.jsx
│ │ │ ├── NotFoundPage.test.jsx
│ │ │ ├── ThemeToggle.jsx
│ │ │ ├── ThemeToggle.test.jsx
│ │ │ ├── UserMenu.jsx
│ │ │ └── UserMenu.test.jsx
│ │ └── search
│ │ ├── EventList.jsx
│ │ ├── EventList.test.jsx
│ │ ├── FilterForm.jsx
│ │ ├── FilterForm.test.jsx
│ │ ├── QuickSearch.jsx
│ │ ├── QuickSearch.test.jsx
│ │ ├── ResourceDetailsView.jsx
│ │ ├── ResourceDetailsView.test.jsx
│ │ ├── ResourceList.jsx
│ │ ├── ResourceList.test.jsx
│ │ ├── StatusChart.jsx
│ │ └── StatusChart.test.jsx
│ ├── index.css
│ ├── main.jsx
│ ├── mock
│ │ ├── action.js
│ │ ├── events.js
│ │ ├── events.test.js
│ │ ├── report.js
│ │ ├── resource.js
│ │ ├── resources.js
│ │ ├── resources.test.js
│ │ ├── workload.js
│ │ └── workload.test.js
│ └── utils
│ ├── constants.js
│ ├── cookies.js
│ ├── cookies.test.js
│ ├── favorites.js
│ ├── favorites.test.js
│ ├── fetch.js
│ ├── fetch.test.js
│ ├── hash.js
│ ├── hash.test.js
│ ├── meta.js
│ ├── meta.test.js
│ ├── navHistory.js
│ ├── navHistory.test.js
│ ├── routing.js
│ ├── routing.test.js
│ ├── scroll.js
│ ├── scroll.test.js
│ ├── status.js
│ ├── status.test.js
│ ├── theme.js
│ ├── theme.test.js
│ ├── time.js
│ ├── time.test.js
│ ├── version.js
│ └── version.test.js
├── tailwind.config.js
├── vite.config.js
└── vitest.setup.js
```
# Files
--------------------------------------------------------------------------------
/web/src/mock/resource.js:
--------------------------------------------------------------------------------
```javascript
1 | // Copyright 2025 Stefan Prodan.
2 | // SPDX-License-Identifier: AGPL-3.0
3 |
4 | // Mock data for individual resource endpoint (GET /api/v1/resource)
5 | // Generated from real cluster API responses
6 |
7 | // Array containing all mock resources
8 | export const mockResourcesArray =
9 | [
10 | {
11 | "apiVersion": "fluxcd.controlplane.io/v1",
12 | "kind": "FluxInstance",
13 | "metadata": {
14 | "name": "flux",
15 | "namespace": "flux-system"
16 | },
17 | "spec": {
18 | "cluster": {
19 | "domain": "cluster.local",
20 | "multitenant": false,
21 | "multitenantWorkloadIdentity": false,
22 | "networkPolicy": true,
23 | "size": "medium",
24 | "type": "kubernetes"
25 | },
26 | "components": [
27 | "source-controller",
28 | "source-watcher",
29 | "kustomize-controller",
30 | "helm-controller",
31 | "notification-controller",
32 | "image-reflector-controller",
33 | "image-automation-controller"
34 | ],
35 | "distribution": {
36 | "artifact": "oci://ghcr.io/controlplaneio-fluxcd/flux-operator-manifests:latest",
37 | "registry": "ghcr.io/fluxcd",
38 | "version": "2.x"
39 | },
40 | "migrateResources": true,
41 | "sync": {
42 | "interval": "1m",
43 | "kind": "GitRepository",
44 | "path": "./clusters/homelab",
45 | "pullSecret": "github-auth",
46 | "ref": "refs/heads/main",
47 | "url": "https://github.com/stefanprodan/homelab.git"
48 | },
49 | "wait": true
50 | },
51 | "status": {
52 | "reconcilerRef": {
53 | "status": "Ready",
54 | "message": "Reconciliation finished in 2s",
55 | "lastReconciled": "2025-11-18T11:10:59Z",
56 | "managedBy": ""
57 | },
58 | "components": [
59 | {
60 | "digest": "sha256:5be9b7257270fa1a98c3c42af2f254a35bd64375e719090fe2ffc24915d8be06",
61 | "name": "source-controller",
62 | "repository": "ghcr.io/fluxcd/source-controller",
63 | "tag": "v1.7.3"
64 | },
65 | {
66 | "digest": "sha256:188a1adb89a16f7fcdd4ed79855301ec71950dcc833b6e0b3d0a053743ecac85",
67 | "name": "source-watcher",
68 | "repository": "ghcr.io/fluxcd/source-watcher",
69 | "tag": "v2.0.2"
70 | },
71 | {
72 | "digest": "sha256:477b4290a2fa2489bf87668bd7dcb77f0ae19bf944fef955600acbcde465ad98",
73 | "name": "kustomize-controller",
74 | "repository": "ghcr.io/fluxcd/kustomize-controller",
75 | "tag": "v1.7.2"
76 | },
77 | {
78 | "digest": "sha256:d741dffd2a552b31cf215a1fcf1367ec7bc4dd3609b90e87595ae362d05d022c",
79 | "name": "helm-controller",
80 | "repository": "ghcr.io/fluxcd/helm-controller",
81 | "tag": "v1.4.3"
82 | },
83 | {
84 | "digest": "sha256:350600b64cecb6cc10366c2bc41ec032fd604c81862298d02c303556a2fa6461",
85 | "name": "notification-controller",
86 | "repository": "ghcr.io/fluxcd/notification-controller",
87 | "tag": "v1.7.4"
88 | },
89 | {
90 | "digest": "sha256:a5c718caddfae3022c109a6ef0eb6772a3cc6211aab39feca7c668dfeb151a2e",
91 | "name": "image-reflector-controller",
92 | "repository": "ghcr.io/fluxcd/image-reflector-controller",
93 | "tag": "v1.0.3"
94 | },
95 | {
96 | "digest": "sha256:2577ace8d1660b77df5297db239e9cf30520b336f9a74c3b4174d2773211319d",
97 | "name": "image-automation-controller",
98 | "repository": "ghcr.io/fluxcd/image-automation-controller",
99 | "tag": "v1.0.3"
100 | }
101 | ],
102 | "conditions": [
103 | {
104 | "lastTransitionTime": "2025-11-18T11:10:59Z",
105 | "message": "Reconciliation finished in 2s",
106 | "observedGeneration": 1,
107 | "reason": "ReconciliationSucceeded",
108 | "status": "True",
109 | "type": "Ready"
110 | }
111 | ],
112 | "history": [
113 | {
114 | "digest": "sha256:d8fc4a3a7b06f200e0565c35d694b9d36cbe43233d8418a78525adc3ca9a16dd",
115 | "firstReconciled": "2025-11-01T23:31:08Z",
116 | "lastReconciled": "2025-11-18T11:10:59Z",
117 | "lastReconciledDuration": "1.605875375s",
118 | "lastReconciledStatus": "ReconciliationSucceeded",
119 | "metadata": {
120 | "flux": "v2.7.3"
121 | },
122 | "totalReconciliations": 397
123 | }
124 | ],
125 | "inventory": [
126 | {
127 | "apiVersion": "apiextensions.k8s.io/v1",
128 | "kind": "CustomResourceDefinition",
129 | "name": "alerts.notification.toolkit.fluxcd.io",
130 | "namespace": ""
131 | },
132 | {
133 | "apiVersion": "apiextensions.k8s.io/v1",
134 | "kind": "CustomResourceDefinition",
135 | "name": "artifactgenerators.source.extensions.fluxcd.io",
136 | "namespace": ""
137 | },
138 | {
139 | "apiVersion": "apiextensions.k8s.io/v1",
140 | "kind": "CustomResourceDefinition",
141 | "name": "buckets.source.toolkit.fluxcd.io",
142 | "namespace": ""
143 | },
144 | {
145 | "apiVersion": "apiextensions.k8s.io/v1",
146 | "kind": "CustomResourceDefinition",
147 | "name": "externalartifacts.source.toolkit.fluxcd.io",
148 | "namespace": ""
149 | },
150 | {
151 | "apiVersion": "apiextensions.k8s.io/v1",
152 | "kind": "CustomResourceDefinition",
153 | "name": "gitrepositories.source.toolkit.fluxcd.io",
154 | "namespace": ""
155 | },
156 | {
157 | "apiVersion": "apiextensions.k8s.io/v1",
158 | "kind": "CustomResourceDefinition",
159 | "name": "helmcharts.source.toolkit.fluxcd.io",
160 | "namespace": ""
161 | },
162 | {
163 | "apiVersion": "apiextensions.k8s.io/v1",
164 | "kind": "CustomResourceDefinition",
165 | "name": "helmreleases.helm.toolkit.fluxcd.io",
166 | "namespace": ""
167 | },
168 | {
169 | "apiVersion": "apiextensions.k8s.io/v1",
170 | "kind": "CustomResourceDefinition",
171 | "name": "helmrepositories.source.toolkit.fluxcd.io",
172 | "namespace": ""
173 | },
174 | {
175 | "apiVersion": "apiextensions.k8s.io/v1",
176 | "kind": "CustomResourceDefinition",
177 | "name": "imagepolicies.image.toolkit.fluxcd.io",
178 | "namespace": ""
179 | },
180 | {
181 | "apiVersion": "apiextensions.k8s.io/v1",
182 | "kind": "CustomResourceDefinition",
183 | "name": "imagerepositories.image.toolkit.fluxcd.io",
184 | "namespace": ""
185 | },
186 | {
187 | "apiVersion": "apiextensions.k8s.io/v1",
188 | "kind": "CustomResourceDefinition",
189 | "name": "imageupdateautomations.image.toolkit.fluxcd.io",
190 | "namespace": ""
191 | },
192 | {
193 | "apiVersion": "apiextensions.k8s.io/v1",
194 | "kind": "CustomResourceDefinition",
195 | "name": "kustomizations.kustomize.toolkit.fluxcd.io",
196 | "namespace": ""
197 | },
198 | {
199 | "apiVersion": "apiextensions.k8s.io/v1",
200 | "kind": "CustomResourceDefinition",
201 | "name": "ocirepositories.source.toolkit.fluxcd.io",
202 | "namespace": ""
203 | },
204 | {
205 | "apiVersion": "apiextensions.k8s.io/v1",
206 | "kind": "CustomResourceDefinition",
207 | "name": "providers.notification.toolkit.fluxcd.io",
208 | "namespace": ""
209 | },
210 | {
211 | "apiVersion": "apiextensions.k8s.io/v1",
212 | "kind": "CustomResourceDefinition",
213 | "name": "receivers.notification.toolkit.fluxcd.io",
214 | "namespace": ""
215 | },
216 | {
217 | "apiVersion": "v1",
218 | "kind": "Namespace",
219 | "name": "flux-system",
220 | "namespace": ""
221 | },
222 | {
223 | "apiVersion": "rbac.authorization.k8s.io/v1",
224 | "kind": "ClusterRole",
225 | "name": "crd-controller-flux-system",
226 | "namespace": ""
227 | },
228 | {
229 | "apiVersion": "rbac.authorization.k8s.io/v1",
230 | "kind": "ClusterRole",
231 | "name": "flux-edit-flux-system",
232 | "namespace": ""
233 | },
234 | {
235 | "apiVersion": "rbac.authorization.k8s.io/v1",
236 | "kind": "ClusterRole",
237 | "name": "flux-view-flux-system",
238 | "namespace": ""
239 | },
240 | {
241 | "apiVersion": "rbac.authorization.k8s.io/v1",
242 | "kind": "ClusterRoleBinding",
243 | "name": "cluster-reconciler-flux-system",
244 | "namespace": ""
245 | },
246 | {
247 | "apiVersion": "rbac.authorization.k8s.io/v1",
248 | "kind": "ClusterRoleBinding",
249 | "name": "crd-controller-flux-system",
250 | "namespace": ""
251 | },
252 | {
253 | "apiVersion": "v1",
254 | "kind": "ResourceQuota",
255 | "name": "critical-pods-flux-system",
256 | "namespace": "flux-system"
257 | },
258 | {
259 | "apiVersion": "v1",
260 | "kind": "ServiceAccount",
261 | "name": "helm-controller",
262 | "namespace": "flux-system"
263 | },
264 | {
265 | "apiVersion": "v1",
266 | "kind": "ServiceAccount",
267 | "name": "image-automation-controller",
268 | "namespace": "flux-system"
269 | },
270 | {
271 | "apiVersion": "v1",
272 | "kind": "ServiceAccount",
273 | "name": "image-reflector-controller",
274 | "namespace": "flux-system"
275 | },
276 | {
277 | "apiVersion": "v1",
278 | "kind": "ServiceAccount",
279 | "name": "kustomize-controller",
280 | "namespace": "flux-system"
281 | },
282 | {
283 | "apiVersion": "v1",
284 | "kind": "ServiceAccount",
285 | "name": "notification-controller",
286 | "namespace": "flux-system"
287 | },
288 | {
289 | "apiVersion": "v1",
290 | "kind": "ServiceAccount",
291 | "name": "source-controller",
292 | "namespace": "flux-system"
293 | },
294 | {
295 | "apiVersion": "v1",
296 | "kind": "ServiceAccount",
297 | "name": "source-watcher",
298 | "namespace": "flux-system"
299 | },
300 | {
301 | "apiVersion": "v1",
302 | "kind": "Service",
303 | "name": "notification-controller",
304 | "namespace": "flux-system"
305 | },
306 | {
307 | "apiVersion": "v1",
308 | "kind": "Service",
309 | "name": "source-controller",
310 | "namespace": "flux-system"
311 | },
312 | {
313 | "apiVersion": "v1",
314 | "kind": "Service",
315 | "name": "source-watcher",
316 | "namespace": "flux-system"
317 | },
318 | {
319 | "apiVersion": "v1",
320 | "kind": "Service",
321 | "name": "webhook-receiver",
322 | "namespace": "flux-system"
323 | },
324 | {
325 | "apiVersion": "apps/v1",
326 | "kind": "Deployment",
327 | "name": "helm-controller",
328 | "namespace": "flux-system"
329 | },
330 | {
331 | "apiVersion": "apps/v1",
332 | "kind": "Deployment",
333 | "name": "image-automation-controller",
334 | "namespace": "flux-system"
335 | },
336 | {
337 | "apiVersion": "apps/v1",
338 | "kind": "Deployment",
339 | "name": "image-reflector-controller",
340 | "namespace": "flux-system"
341 | },
342 | {
343 | "apiVersion": "apps/v1",
344 | "kind": "Deployment",
345 | "name": "kustomize-controller",
346 | "namespace": "flux-system"
347 | },
348 | {
349 | "apiVersion": "apps/v1",
350 | "kind": "Deployment",
351 | "name": "notification-controller",
352 | "namespace": "flux-system"
353 | },
354 | {
355 | "apiVersion": "apps/v1",
356 | "kind": "Deployment",
357 | "name": "source-controller",
358 | "namespace": "flux-system"
359 | },
360 | {
361 | "apiVersion": "apps/v1",
362 | "kind": "Deployment",
363 | "name": "source-watcher",
364 | "namespace": "flux-system"
365 | },
366 | {
367 | "apiVersion": "kustomize.toolkit.fluxcd.io/v1",
368 | "kind": "Kustomization",
369 | "name": "flux-system",
370 | "namespace": "flux-system"
371 | },
372 | {
373 | "apiVersion": "networking.k8s.io/v1",
374 | "kind": "NetworkPolicy",
375 | "name": "allow-egress",
376 | "namespace": "flux-system"
377 | },
378 | {
379 | "apiVersion": "networking.k8s.io/v1",
380 | "kind": "NetworkPolicy",
381 | "name": "allow-scraping",
382 | "namespace": "flux-system"
383 | },
384 | {
385 | "apiVersion": "networking.k8s.io/v1",
386 | "kind": "NetworkPolicy",
387 | "name": "allow-webhooks",
388 | "namespace": "flux-system"
389 | },
390 | {
391 | "apiVersion": "source.toolkit.fluxcd.io/v1",
392 | "kind": "GitRepository",
393 | "name": "flux-system",
394 | "namespace": "flux-system"
395 | }
396 | ],
397 | "lastAppliedRevision": "v2.7.3@sha256:d8fc4a3a7b06f200e0565c35d694b9d36cbe43233d8418a78525adc3ca9a16dd",
398 | "lastArtifactRevision": "sha256:043536cc6ec06ff978777ca31cf0adc3d654575a2aa8050988aadf90b9f9877c",
399 | "lastAttemptedRevision": "v2.7.3@sha256:d8fc4a3a7b06f200e0565c35d694b9d36cbe43233d8418a78525adc3ca9a16dd",
400 | "lastHandledReconcileAt": "2025-11-07T12:20:38.600281345Z"
401 | }
402 | },
403 | {
404 | "apiVersion": "source.toolkit.fluxcd.io/v1",
405 | "kind": "GitRepository",
406 | "metadata": {
407 | "annotations": {
408 | "kustomize.toolkit.fluxcd.io/prune": "Disabled",
409 | "kustomize.toolkit.fluxcd.io/ssa": "Ignore"
410 | },
411 | "labels": {
412 | "app.kubernetes.io/instance": "flux-system",
413 | "app.kubernetes.io/managed-by": "flux-operator",
414 | "app.kubernetes.io/part-of": "flux",
415 | "app.kubernetes.io/version": "v2.7.3"
416 | },
417 | "name": "flux-system",
418 | "namespace": "flux-system"
419 | },
420 | "spec": {
421 | "interval": "1m0s",
422 | "ref": {
423 | "name": "refs/heads/main"
424 | },
425 | "secretRef": {
426 | "name": "github-auth"
427 | },
428 | "timeout": "60s",
429 | "url": "https://github.com/stefanprodan/homelab.git"
430 | },
431 | "status": {
432 | "reconcilerRef": {
433 | "status": "Ready",
434 | "message": "stored artifact for revision 'refs/heads/main@sha1:d676e33990dc2865d67c022d26dea93d5e3236ff'",
435 | "lastReconciled": "2025-11-11T14:07:19Z",
436 | "managedBy": "FluxInstance/flux-system/flux"
437 | },
438 | "artifact": {
439 | "digest": "sha256:fe0450de125a2359c0e14106830910855756014b0f78b4cf3b21339505a5bf74",
440 | "lastUpdateTime": "2025-11-06T21:36:36Z",
441 | "path": "gitrepository/flux-system/flux-system/d676e33990dc2865d67c022d26dea93d5e3236ff.tar.gz",
442 | "revision": "refs/heads/main@sha1:d676e33990dc2865d67c022d26dea93d5e3236ff",
443 | "size": 13059,
444 | "url": "http://source-controller.flux-system.svc.cluster.local./gitrepository/flux-system/flux-system/d676e33990dc2865d67c022d26dea93d5e3236ff.tar.gz"
445 | },
446 | "conditions": [
447 | {
448 | "lastTransitionTime": "2025-11-11T14:07:19Z",
449 | "message": "stored artifact for revision 'refs/heads/main@sha1:d676e33990dc2865d67c022d26dea93d5e3236ff'",
450 | "observedGeneration": 1,
451 | "reason": "Succeeded",
452 | "status": "True",
453 | "type": "Ready"
454 | },
455 | {
456 | "lastTransitionTime": "2025-11-06T21:36:36Z",
457 | "message": "stored artifact for revision 'refs/heads/main@sha1:d676e33990dc2865d67c022d26dea93d5e3236ff'",
458 | "observedGeneration": 1,
459 | "reason": "Succeeded",
460 | "status": "True",
461 | "type": "ArtifactInStorage"
462 | }
463 | ],
464 | "lastHandledReconcileAt": "2025-11-06T23:35:15.038685+02:00",
465 | "observedGeneration": 1
466 | }
467 | },
468 | {
469 | "apiVersion": "source.toolkit.fluxcd.io/v1",
470 | "kind": "HelmChart",
471 | "metadata": {
472 | "name": "registry-zot-registry",
473 | "namespace": "registry"
474 | },
475 | "spec": {
476 | "chart": "zot",
477 | "interval": "24h0m0s",
478 | "reconcileStrategy": "ChartVersion",
479 | "sourceRef": {
480 | "kind": "HelmRepository",
481 | "name": "zot-registry"
482 | },
483 | "version": "*"
484 | },
485 | "status": {
486 | "reconcilerRef": {
487 | "status": "Ready",
488 | "message": "pulled 'zot' chart with version '0.1.89'",
489 | "lastReconciled": "2025-11-01T23:31:41Z",
490 | "managedBy": ""
491 | },
492 | "artifact": {
493 | "digest": "sha256:8c3ab9d44828c879be47874f0c3dca2603a0f0584ef383c18ad50a4a27829d67",
494 | "lastUpdateTime": "2025-11-01T23:31:41Z",
495 | "path": "helmchart/registry/registry-zot-registry/zot-0.1.89.tgz",
496 | "revision": "0.1.89",
497 | "size": 9429,
498 | "url": "http://source-controller.flux-system.svc.cluster.local./helmchart/registry/registry-zot-registry/zot-0.1.89.tgz"
499 | },
500 | "conditions": [
501 | {
502 | "lastTransitionTime": "2025-11-01T23:31:41Z",
503 | "message": "pulled 'zot' chart with version '0.1.89'",
504 | "observedGeneration": 1,
505 | "reason": "ChartPullSucceeded",
506 | "status": "True",
507 | "type": "Ready"
508 | },
509 | {
510 | "lastTransitionTime": "2025-11-01T23:31:41Z",
511 | "message": "pulled 'zot' chart with version '0.1.89'",
512 | "observedGeneration": 1,
513 | "reason": "ChartPullSucceeded",
514 | "status": "True",
515 | "type": "ArtifactInStorage"
516 | }
517 | ],
518 | "observedChartName": "zot",
519 | "observedGeneration": 1,
520 | "observedSourceArtifactRevision": "sha256:2b1fdd97e969c82ee149a7ee8b00f55061760832f23c39a3235936f0912f2125",
521 | "url": "http://source-controller.flux-system.svc.cluster.local./helmchart/registry/registry-zot-registry/latest.tar.gz"
522 | }
523 | },
524 | {
525 | "apiVersion": "source.toolkit.fluxcd.io/v1",
526 | "kind": "HelmChart",
527 | "metadata": {
528 | "name": "tailscale-tailscale-operator",
529 | "namespace": "tailscale"
530 | },
531 | "spec": {
532 | "chart": "tailscale-operator",
533 | "interval": "24h0m0s",
534 | "reconcileStrategy": "ChartVersion",
535 | "sourceRef": {
536 | "kind": "HelmRepository",
537 | "name": "tailscale-operator"
538 | },
539 | "version": "*"
540 | },
541 | "status": {
542 | "reconcilerRef": {
543 | "status": "Ready",
544 | "message": "pulled 'tailscale-operator' chart with version '1.90.6'",
545 | "lastReconciled": "2025-11-01T23:31:02Z",
546 | "managedBy": ""
547 | },
548 | "artifact": {
549 | "digest": "sha256:08247dd90325a32ae95c5b116917015458b569eadbd66e7116dcdc7502a82bd9",
550 | "lastUpdateTime": "2025-11-01T23:31:02Z",
551 | "path": "helmchart/tailscale/tailscale-tailscale-operator/tailscale-operator-1.90.6.tgz",
552 | "revision": "1.90.6",
553 | "size": 42432,
554 | "url": "http://source-controller.flux-system.svc.cluster.local./helmchart/tailscale/tailscale-tailscale-operator/tailscale-operator-1.90.6.tgz"
555 | },
556 | "conditions": [
557 | {
558 | "lastTransitionTime": "2025-11-01T23:31:02Z",
559 | "message": "pulled 'tailscale-operator' chart with version '1.90.6'",
560 | "observedGeneration": 1,
561 | "reason": "ChartPullSucceeded",
562 | "status": "True",
563 | "type": "Ready"
564 | },
565 | {
566 | "lastTransitionTime": "2025-11-01T23:31:02Z",
567 | "message": "pulled 'tailscale-operator' chart with version '1.90.6'",
568 | "observedGeneration": 1,
569 | "reason": "ChartPullSucceeded",
570 | "status": "True",
571 | "type": "ArtifactInStorage"
572 | }
573 | ],
574 | "observedChartName": "tailscale-operator",
575 | "observedGeneration": 1,
576 | "observedSourceArtifactRevision": "sha256:578d082975ad264ba4d09368febb298c3beb7f18e459bb9d323d3b7c2fc4d475",
577 | "url": "http://source-controller.flux-system.svc.cluster.local./helmchart/tailscale/tailscale-tailscale-operator/latest.tar.gz"
578 | }
579 | },
580 | {
581 | "apiVersion": "helm.toolkit.fluxcd.io/v2",
582 | "kind": "HelmRelease",
583 | "metadata": {
584 | "labels": {
585 | "app.kubernetes.io/name": "cert-manager"
586 | },
587 | "name": "cert-manager",
588 | "namespace": "cert-manager"
589 | },
590 | "spec": {
591 | "chartRef": {
592 | "kind": "OCIRepository",
593 | "name": "cert-manager"
594 | },
595 | "install": {
596 | "strategy": {
597 | "name": "RetryOnFailure",
598 | "retryInterval": "2m"
599 | }
600 | },
601 | "interval": "24h",
602 | "releaseName": "cert-manager",
603 | "upgrade": {
604 | "strategy": {
605 | "name": "RetryOnFailure",
606 | "retryInterval": "3m"
607 | }
608 | },
609 | "values": {
610 | "crds": {
611 | "enabled": true,
612 | "keep": false
613 | }
614 | }
615 | },
616 | "status": {
617 | "reconcilerRef": {
618 | "status": "Ready",
619 | "message": "Helm install succeeded for release cert-manager/cert-manager.v1 with chart [email protected]+9578566b26b2",
620 | "lastReconciled": "2025-11-01T23:31:36Z",
621 | "managedBy": "ResourceSet/flux-system/cert-manager"
622 | },
623 | "conditions": [
624 | {
625 | "lastTransitionTime": "2025-11-01T23:31:36Z",
626 | "message": "Helm install succeeded for release cert-manager/cert-manager.v1 with chart [email protected]+9578566b26b2",
627 | "observedGeneration": 1,
628 | "reason": "InstallSucceeded",
629 | "status": "True",
630 | "type": "Ready"
631 | },
632 | {
633 | "lastTransitionTime": "2025-11-01T23:31:36Z",
634 | "message": "Helm install succeeded for release cert-manager/cert-manager.v1 with chart [email protected]+9578566b26b2",
635 | "observedGeneration": 1,
636 | "reason": "InstallSucceeded",
637 | "status": "True",
638 | "type": "Released"
639 | }
640 | ],
641 | "history": [
642 | {
643 | "appVersion": "v1.19.1",
644 | "chartName": "cert-manager",
645 | "chartVersion": "1.19.1+9578566b26b2",
646 | "configDigest": "sha256:c4de42eac3a72305e609d1d9de974488e24310a5241ed6eea8da43b39042a4d0",
647 | "digest": "sha256:b6eda3ef50097eb669b52c31d0b9824ef2303373784ebd4f231675efbc23b82b",
648 | "firstDeployed": "2025-11-01T23:31:03Z",
649 | "lastDeployed": "2025-11-01T23:31:03Z",
650 | "name": "cert-manager",
651 | "namespace": "cert-manager",
652 | "ociDigest": "sha256:9578566b26b2258bcb9a0be27feeaa7c0adaed635cc0f85b6293e42a80c58cc9",
653 | "status": "deployed",
654 | "version": 1
655 | }
656 | ],
657 | "inventory": [
658 | {
659 | "apiVersion": "v1",
660 | "kind": "ServiceAccount",
661 | "name": "cert-manager-cainjector",
662 | "namespace": "cert-manager"
663 | },
664 | {
665 | "apiVersion": "v1",
666 | "kind": "ServiceAccount",
667 | "name": "cert-manager",
668 | "namespace": "cert-manager"
669 | },
670 | {
671 | "apiVersion": "v1",
672 | "kind": "ServiceAccount",
673 | "name": "cert-manager-webhook",
674 | "namespace": "cert-manager"
675 | },
676 | {
677 | "apiVersion": "apiextensions.k8s.io/v1",
678 | "kind": "CustomResourceDefinition",
679 | "name": "challenges.acme.cert-manager.io",
680 | "namespace": ""
681 | },
682 | {
683 | "apiVersion": "apiextensions.k8s.io/v1",
684 | "kind": "CustomResourceDefinition",
685 | "name": "orders.acme.cert-manager.io",
686 | "namespace": ""
687 | },
688 | {
689 | "apiVersion": "apiextensions.k8s.io/v1",
690 | "kind": "CustomResourceDefinition",
691 | "name": "certificaterequests.cert-manager.io",
692 | "namespace": ""
693 | },
694 | {
695 | "apiVersion": "apiextensions.k8s.io/v1",
696 | "kind": "CustomResourceDefinition",
697 | "name": "certificates.cert-manager.io",
698 | "namespace": ""
699 | },
700 | {
701 | "apiVersion": "apiextensions.k8s.io/v1",
702 | "kind": "CustomResourceDefinition",
703 | "name": "clusterissuers.cert-manager.io",
704 | "namespace": ""
705 | },
706 | {
707 | "apiVersion": "apiextensions.k8s.io/v1",
708 | "kind": "CustomResourceDefinition",
709 | "name": "issuers.cert-manager.io",
710 | "namespace": ""
711 | },
712 | {
713 | "apiVersion": "rbac.authorization.k8s.io/v1",
714 | "kind": "ClusterRole",
715 | "name": "cert-manager-cainjector",
716 | "namespace": ""
717 | },
718 | {
719 | "apiVersion": "rbac.authorization.k8s.io/v1",
720 | "kind": "ClusterRole",
721 | "name": "cert-manager-controller-issuers",
722 | "namespace": ""
723 | },
724 | {
725 | "apiVersion": "rbac.authorization.k8s.io/v1",
726 | "kind": "ClusterRole",
727 | "name": "cert-manager-controller-clusterissuers",
728 | "namespace": ""
729 | },
730 | {
731 | "apiVersion": "rbac.authorization.k8s.io/v1",
732 | "kind": "ClusterRole",
733 | "name": "cert-manager-controller-certificates",
734 | "namespace": ""
735 | },
736 | {
737 | "apiVersion": "rbac.authorization.k8s.io/v1",
738 | "kind": "ClusterRole",
739 | "name": "cert-manager-controller-orders",
740 | "namespace": ""
741 | },
742 | {
743 | "apiVersion": "rbac.authorization.k8s.io/v1",
744 | "kind": "ClusterRole",
745 | "name": "cert-manager-controller-challenges",
746 | "namespace": ""
747 | },
748 | {
749 | "apiVersion": "rbac.authorization.k8s.io/v1",
750 | "kind": "ClusterRole",
751 | "name": "cert-manager-controller-ingress-shim",
752 | "namespace": ""
753 | },
754 | {
755 | "apiVersion": "rbac.authorization.k8s.io/v1",
756 | "kind": "ClusterRole",
757 | "name": "cert-manager-cluster-view",
758 | "namespace": ""
759 | },
760 | {
761 | "apiVersion": "rbac.authorization.k8s.io/v1",
762 | "kind": "ClusterRole",
763 | "name": "cert-manager-view",
764 | "namespace": ""
765 | },
766 | {
767 | "apiVersion": "rbac.authorization.k8s.io/v1",
768 | "kind": "ClusterRole",
769 | "name": "cert-manager-edit",
770 | "namespace": ""
771 | },
772 | {
773 | "apiVersion": "rbac.authorization.k8s.io/v1",
774 | "kind": "ClusterRole",
775 | "name": "cert-manager-controller-approve:cert-manager-io",
776 | "namespace": ""
777 | },
778 | {
779 | "apiVersion": "rbac.authorization.k8s.io/v1",
780 | "kind": "ClusterRole",
781 | "name": "cert-manager-controller-certificatesigningrequests",
782 | "namespace": ""
783 | },
784 | {
785 | "apiVersion": "rbac.authorization.k8s.io/v1",
786 | "kind": "ClusterRole",
787 | "name": "cert-manager-webhook:subjectaccessreviews",
788 | "namespace": ""
789 | },
790 | {
791 | "apiVersion": "rbac.authorization.k8s.io/v1",
792 | "kind": "ClusterRoleBinding",
793 | "name": "cert-manager-cainjector",
794 | "namespace": ""
795 | },
796 | {
797 | "apiVersion": "rbac.authorization.k8s.io/v1",
798 | "kind": "ClusterRoleBinding",
799 | "name": "cert-manager-controller-issuers",
800 | "namespace": ""
801 | },
802 | {
803 | "apiVersion": "rbac.authorization.k8s.io/v1",
804 | "kind": "ClusterRoleBinding",
805 | "name": "cert-manager-controller-clusterissuers",
806 | "namespace": ""
807 | },
808 | {
809 | "apiVersion": "rbac.authorization.k8s.io/v1",
810 | "kind": "ClusterRoleBinding",
811 | "name": "cert-manager-controller-certificates",
812 | "namespace": ""
813 | },
814 | {
815 | "apiVersion": "rbac.authorization.k8s.io/v1",
816 | "kind": "ClusterRoleBinding",
817 | "name": "cert-manager-controller-orders",
818 | "namespace": ""
819 | },
820 | {
821 | "apiVersion": "rbac.authorization.k8s.io/v1",
822 | "kind": "ClusterRoleBinding",
823 | "name": "cert-manager-controller-challenges",
824 | "namespace": ""
825 | },
826 | {
827 | "apiVersion": "rbac.authorization.k8s.io/v1",
828 | "kind": "ClusterRoleBinding",
829 | "name": "cert-manager-controller-ingress-shim",
830 | "namespace": ""
831 | },
832 | {
833 | "apiVersion": "rbac.authorization.k8s.io/v1",
834 | "kind": "ClusterRoleBinding",
835 | "name": "cert-manager-controller-approve:cert-manager-io",
836 | "namespace": ""
837 | },
838 | {
839 | "apiVersion": "rbac.authorization.k8s.io/v1",
840 | "kind": "ClusterRoleBinding",
841 | "name": "cert-manager-controller-certificatesigningrequests",
842 | "namespace": ""
843 | },
844 | {
845 | "apiVersion": "rbac.authorization.k8s.io/v1",
846 | "kind": "ClusterRoleBinding",
847 | "name": "cert-manager-webhook:subjectaccessreviews",
848 | "namespace": ""
849 | },
850 | {
851 | "apiVersion": "rbac.authorization.k8s.io/v1",
852 | "kind": "Role",
853 | "name": "cert-manager-cainjector:leaderelection",
854 | "namespace": "kube-system"
855 | },
856 | {
857 | "apiVersion": "rbac.authorization.k8s.io/v1",
858 | "kind": "Role",
859 | "name": "cert-manager:leaderelection",
860 | "namespace": "kube-system"
861 | },
862 | {
863 | "apiVersion": "rbac.authorization.k8s.io/v1",
864 | "kind": "Role",
865 | "name": "cert-manager-tokenrequest",
866 | "namespace": "cert-manager"
867 | },
868 | {
869 | "apiVersion": "rbac.authorization.k8s.io/v1",
870 | "kind": "Role",
871 | "name": "cert-manager-webhook:dynamic-serving",
872 | "namespace": "cert-manager"
873 | },
874 | {
875 | "apiVersion": "rbac.authorization.k8s.io/v1",
876 | "kind": "RoleBinding",
877 | "name": "cert-manager-cainjector:leaderelection",
878 | "namespace": "kube-system"
879 | },
880 | {
881 | "apiVersion": "rbac.authorization.k8s.io/v1",
882 | "kind": "RoleBinding",
883 | "name": "cert-manager:leaderelection",
884 | "namespace": "kube-system"
885 | },
886 | {
887 | "apiVersion": "rbac.authorization.k8s.io/v1",
888 | "kind": "RoleBinding",
889 | "name": "cert-manager-tokenrequest",
890 | "namespace": "cert-manager"
891 | },
892 | {
893 | "apiVersion": "rbac.authorization.k8s.io/v1",
894 | "kind": "RoleBinding",
895 | "name": "cert-manager-webhook:dynamic-serving",
896 | "namespace": "cert-manager"
897 | },
898 | {
899 | "apiVersion": "v1",
900 | "kind": "Service",
901 | "name": "cert-manager-cainjector",
902 | "namespace": "cert-manager"
903 | },
904 | {
905 | "apiVersion": "v1",
906 | "kind": "Service",
907 | "name": "cert-manager",
908 | "namespace": "cert-manager"
909 | },
910 | {
911 | "apiVersion": "v1",
912 | "kind": "Service",
913 | "name": "cert-manager-webhook",
914 | "namespace": "cert-manager"
915 | },
916 | {
917 | "apiVersion": "apps/v1",
918 | "kind": "Deployment",
919 | "name": "cert-manager-cainjector",
920 | "namespace": "cert-manager"
921 | },
922 | {
923 | "apiVersion": "apps/v1",
924 | "kind": "Deployment",
925 | "name": "cert-manager",
926 | "namespace": "cert-manager"
927 | },
928 | {
929 | "apiVersion": "apps/v1",
930 | "kind": "Deployment",
931 | "name": "cert-manager-webhook",
932 | "namespace": "cert-manager"
933 | },
934 | {
935 | "apiVersion": "admissionregistration.k8s.io/v1",
936 | "kind": "MutatingWebhookConfiguration",
937 | "name": "cert-manager-webhook",
938 | "namespace": ""
939 | },
940 | {
941 | "apiVersion": "admissionregistration.k8s.io/v1",
942 | "kind": "ValidatingWebhookConfiguration",
943 | "name": "cert-manager-webhook",
944 | "namespace": ""
945 | }
946 | ],
947 | "lastAttemptedConfigDigest": "sha256:c4de42eac3a72305e609d1d9de974488e24310a5241ed6eea8da43b39042a4d0",
948 | "lastAttemptedGeneration": 1,
949 | "lastAttemptedReleaseAction": "install",
950 | "lastAttemptedReleaseActionDuration": "32.702330598s",
951 | "lastAttemptedRevision": "1.19.1+9578566b26b2",
952 | "lastAttemptedRevisionDigest": "sha256:9578566b26b2258bcb9a0be27feeaa7c0adaed635cc0f85b6293e42a80c58cc9",
953 | "observedGeneration": 1,
954 | "sourceRef": {
955 | "kind": "OCIRepository",
956 | "message": "stored artifact for digest 'v1.19.1@sha256:9578566b26b2258bcb9a0be27feeaa7c0adaed635cc0f85b6293e42a80c58cc9'",
957 | "name": "cert-manager",
958 | "namespace": "cert-manager",
959 | "originRevision": "",
960 | "originURL": "https://github.com/cert-manager/cert-manager",
961 | "status": "Ready",
962 | "url": "oci://quay.io/jetstack/charts/cert-manager"
963 | },
964 | "storageNamespace": "cert-manager"
965 | }
966 | },
967 | {
968 | "apiVersion": "helm.toolkit.fluxcd.io/v2",
969 | "kind": "HelmRelease",
970 | "metadata": {
971 | "labels": {
972 | "app.kubernetes.io/name": "metrics-server"
973 | },
974 | "name": "metrics-server",
975 | "namespace": "monitoring"
976 | },
977 | "spec": {
978 | "chartRef": {
979 | "kind": "OCIRepository",
980 | "name": "metrics-server"
981 | },
982 | "install": {
983 | "strategy": {
984 | "name": "RetryOnFailure",
985 | "retryInterval": "2m"
986 | }
987 | },
988 | "interval": "24h",
989 | "releaseName": "metrics-server",
990 | "upgrade": {
991 | "strategy": {
992 | "name": "RetryOnFailure",
993 | "retryInterval": "3m"
994 | }
995 | },
996 | "values": {
997 | "apiService": {
998 | "insecureSkipTLSVerify": false
999 | },
1000 | "args": [
1001 | "--kubelet-insecure-tls"
1002 | ],
1003 | "tls": {
1004 | "type": "cert-manager"
1005 | }
1006 | }
1007 | },
1008 | "status": {
1009 | "reconcilerRef": {
1010 | "status": "Ready",
1011 | "message": "Helm install succeeded for release monitoring/metrics-server.v1 with chart [email protected]+457df0544ec2",
1012 | "lastReconciled": "2025-11-01T23:31:10Z",
1013 | "managedBy": "ResourceSet/flux-system/metrics-server"
1014 | },
1015 | "conditions": [
1016 | {
1017 | "lastTransitionTime": "2025-11-01T23:32:10Z",
1018 | "message": "Helm install succeeded for release monitoring/metrics-server.v1 with chart [email protected]+457df0544ec2",
1019 | "observedGeneration": 1,
1020 | "reason": "InstallSucceeded",
1021 | "status": "True",
1022 | "type": "Ready"
1023 | },
1024 | {
1025 | "lastTransitionTime": "2025-11-01T23:32:10Z",
1026 | "message": "Helm install succeeded for release monitoring/metrics-server.v1 with chart [email protected]+457df0544ec2",
1027 | "observedGeneration": 1,
1028 | "reason": "InstallSucceeded",
1029 | "status": "True",
1030 | "type": "Released"
1031 | }
1032 | ],
1033 | "history": [
1034 | {
1035 | "appVersion": "0.8.0",
1036 | "chartName": "metrics-server",
1037 | "chartVersion": "3.13.0+457df0544ec2",
1038 | "configDigest": "sha256:82b16ed00566b1bcb117ede6537fa4842acd9f6bbbe280b6adb3c1d0e45802c6",
1039 | "digest": "sha256:309c88a5dd4e392c5830d4c0a3b6d7597bcb77afd40e4e94629e5c3b045f2715",
1040 | "firstDeployed": "2025-11-01T23:31:42Z",
1041 | "lastDeployed": "2025-11-01T23:31:42Z",
1042 | "name": "metrics-server",
1043 | "namespace": "monitoring",
1044 | "ociDigest": "sha256:457df0544ec2553176bbaaba70bf5b68af6c400eff510a401b8eba1b13f9a8ad",
1045 | "status": "deployed",
1046 | "version": 1
1047 | }
1048 | ],
1049 | "inventory": [
1050 | {
1051 | "apiVersion": "v1",
1052 | "kind": "ServiceAccount",
1053 | "name": "metrics-server",
1054 | "namespace": "monitoring"
1055 | },
1056 | {
1057 | "apiVersion": "rbac.authorization.k8s.io/v1",
1058 | "kind": "ClusterRole",
1059 | "name": "system:metrics-server-aggregated-reader",
1060 | "namespace": ""
1061 | },
1062 | {
1063 | "apiVersion": "rbac.authorization.k8s.io/v1",
1064 | "kind": "ClusterRole",
1065 | "name": "system:metrics-server",
1066 | "namespace": ""
1067 | },
1068 | {
1069 | "apiVersion": "rbac.authorization.k8s.io/v1",
1070 | "kind": "ClusterRoleBinding",
1071 | "name": "metrics-server:system:auth-delegator",
1072 | "namespace": ""
1073 | },
1074 | {
1075 | "apiVersion": "rbac.authorization.k8s.io/v1",
1076 | "kind": "ClusterRoleBinding",
1077 | "name": "system:metrics-server",
1078 | "namespace": ""
1079 | },
1080 | {
1081 | "apiVersion": "rbac.authorization.k8s.io/v1",
1082 | "kind": "RoleBinding",
1083 | "name": "metrics-server-auth-reader",
1084 | "namespace": "kube-system"
1085 | },
1086 | {
1087 | "apiVersion": "v1",
1088 | "kind": "Service",
1089 | "name": "metrics-server",
1090 | "namespace": "monitoring"
1091 | },
1092 | {
1093 | "apiVersion": "apps/v1",
1094 | "kind": "Deployment",
1095 | "name": "metrics-server",
1096 | "namespace": "monitoring"
1097 | },
1098 | {
1099 | "apiVersion": "apiregistration.k8s.io/v1",
1100 | "kind": "APIService",
1101 | "name": "v1beta1.metrics.k8s.io",
1102 | "namespace": ""
1103 | },
1104 | {
1105 | "apiVersion": "cert-manager.io/v1",
1106 | "kind": "Certificate",
1107 | "name": "metrics-server",
1108 | "namespace": "monitoring"
1109 | },
1110 | {
1111 | "apiVersion": "cert-manager.io/v1",
1112 | "kind": "Issuer",
1113 | "name": "metrics-server-issuer",
1114 | "namespace": "monitoring"
1115 | }
1116 | ],
1117 | "lastAttemptedConfigDigest": "sha256:82b16ed00566b1bcb117ede6537fa4842acd9f6bbbe280b6adb3c1d0e45802c6",
1118 | "lastAttemptedGeneration": 1,
1119 | "lastAttemptedReleaseAction": "install",
1120 | "lastAttemptedReleaseActionDuration": "28.246828513s",
1121 | "lastAttemptedRevision": "3.13.0+457df0544ec2",
1122 | "lastAttemptedRevisionDigest": "sha256:457df0544ec2553176bbaaba70bf5b68af6c400eff510a401b8eba1b13f9a8ad",
1123 | "observedGeneration": 1,
1124 | "sourceRef": {
1125 | "kind": "OCIRepository",
1126 | "message": "stored artifact for digest '3.13.0@sha256:457df0544ec2553176bbaaba70bf5b68af6c400eff510a401b8eba1b13f9a8ad'",
1127 | "name": "metrics-server",
1128 | "namespace": "monitoring",
1129 | "originRevision": "",
1130 | "originURL": "https://github.com/kubernetes-sigs/metrics-server",
1131 | "status": "Ready",
1132 | "url": "oci://ghcr.io/controlplaneio-fluxcd/charts/metrics-server"
1133 | },
1134 | "storageNamespace": "monitoring"
1135 | }
1136 | },
1137 | {
1138 | "apiVersion": "helm.toolkit.fluxcd.io/v2",
1139 | "kind": "HelmRelease",
1140 | "metadata": {
1141 | "labels": {
1142 | "app.kubernetes.io/name": "tailscale"
1143 | },
1144 | "name": "tailscale-operator",
1145 | "namespace": "tailscale"
1146 | },
1147 | "spec": {
1148 | "chart": {
1149 | "spec": {
1150 | "chart": "tailscale-operator",
1151 | "interval": "24h",
1152 | "reconcileStrategy": "ChartVersion",
1153 | "sourceRef": {
1154 | "kind": "HelmRepository",
1155 | "name": "tailscale-operator"
1156 | },
1157 | "version": "*"
1158 | }
1159 | },
1160 | "install": {
1161 | "strategy": {
1162 | "name": "RetryOnFailure",
1163 | "retryInterval": "2m"
1164 | }
1165 | },
1166 | "interval": "24h",
1167 | "releaseName": "tailscale-operator",
1168 | "upgrade": {
1169 | "strategy": {
1170 | "name": "RetryOnFailure",
1171 | "retryInterval": "3m"
1172 | }
1173 | },
1174 | "values": {
1175 | "apiServerProxyConfig": {
1176 | "allowImpersonation": "true",
1177 | "mode": "false"
1178 | },
1179 | "operatorConfig": {
1180 | "hostname": "homelab-operator"
1181 | },
1182 | "resources": {
1183 | "limits": {
1184 | "cpu": "2000m",
1185 | "memory": "1Gi"
1186 | },
1187 | "requests": {
1188 | "cpu": "100m",
1189 | "memory": "128Mi"
1190 | }
1191 | }
1192 | }
1193 | },
1194 | "status": {
1195 | "reconcilerRef": {
1196 | "status": "Ready",
1197 | "message": "Helm install succeeded for release tailscale/tailscale-operator.v1 with chart [email protected]",
1198 | "lastReconciled": "2025-11-01T23:31:10Z",
1199 | "managedBy": "ResourceSet/flux-system/tailscale-operator"
1200 | },
1201 | "conditions": [
1202 | {
1203 | "lastTransitionTime": "2025-11-01T23:31:10Z",
1204 | "message": "Helm install succeeded for release tailscale/tailscale-operator.v1 with chart [email protected]",
1205 | "observedGeneration": 1,
1206 | "reason": "InstallSucceeded",
1207 | "status": "True",
1208 | "type": "Ready"
1209 | },
1210 | {
1211 | "lastTransitionTime": "2025-11-01T23:31:10Z",
1212 | "message": "Helm install succeeded for release tailscale/tailscale-operator.v1 with chart [email protected]",
1213 | "observedGeneration": 1,
1214 | "reason": "InstallSucceeded",
1215 | "status": "True",
1216 | "type": "Released"
1217 | }
1218 | ],
1219 | "helmChart": "tailscale/tailscale-tailscale-operator",
1220 | "history": [
1221 | {
1222 | "appVersion": "v1.90.9",
1223 | "chartName": "tailscale-operator",
1224 | "chartVersion": "1.90.9",
1225 | "configDigest": "sha256:ec864259c2bedeada53e194919f2416a1d6e742b4d5beb3555037ecce7c634d1",
1226 | "digest": "sha256:f00bb59fbdb28284e525bd4d85aea707e728b89653f2acfa6d98cef3b93e28d5",
1227 | "firstDeployed": "2025-11-01T23:31:01Z",
1228 | "lastDeployed": "2025-11-26T19:26:23Z",
1229 | "name": "tailscale-operator",
1230 | "namespace": "tailscale",
1231 | "status": "deployed",
1232 | "version": 3
1233 | },
1234 | {
1235 | "appVersion": "v1.90.8",
1236 | "chartName": "tailscale-operator",
1237 | "chartVersion": "1.90.8",
1238 | "configDigest": "sha256:ec864259c2bedeada53e194919f2416a1d6e742b4d5beb3555037ecce7c634d1",
1239 | "digest": "sha256:0d1e61ba399cbc6b8df9e625cb70009ec90a444d2293c280616884cee2dac132",
1240 | "firstDeployed": "2025-11-01T23:31:01Z",
1241 | "lastDeployed": "2025-11-19T22:22:04Z",
1242 | "name": "tailscale-operator",
1243 | "namespace": "tailscale",
1244 | "status": "superseded",
1245 | "version": 2
1246 | }
1247 | ],
1248 | "inventory": [
1249 | {
1250 | "apiVersion": "v1",
1251 | "kind": "ServiceAccount",
1252 | "name": "kube-apiserver-auth-proxy",
1253 | "namespace": "tailscale"
1254 | },
1255 | {
1256 | "apiVersion": "v1",
1257 | "kind": "ServiceAccount",
1258 | "name": "operator",
1259 | "namespace": "tailscale"
1260 | },
1261 | {
1262 | "apiVersion": "v1",
1263 | "kind": "ServiceAccount",
1264 | "name": "proxies",
1265 | "namespace": "tailscale"
1266 | },
1267 | {
1268 | "apiVersion": "apiextensions.k8s.io/v1",
1269 | "kind": "CustomResourceDefinition",
1270 | "name": "connectors.tailscale.com",
1271 | "namespace": ""
1272 | },
1273 | {
1274 | "apiVersion": "apiextensions.k8s.io/v1",
1275 | "kind": "CustomResourceDefinition",
1276 | "name": "dnsconfigs.tailscale.com",
1277 | "namespace": ""
1278 | },
1279 | {
1280 | "apiVersion": "apiextensions.k8s.io/v1",
1281 | "kind": "CustomResourceDefinition",
1282 | "name": "proxyclasses.tailscale.com",
1283 | "namespace": ""
1284 | },
1285 | {
1286 | "apiVersion": "apiextensions.k8s.io/v1",
1287 | "kind": "CustomResourceDefinition",
1288 | "name": "proxygroups.tailscale.com",
1289 | "namespace": ""
1290 | },
1291 | {
1292 | "apiVersion": "apiextensions.k8s.io/v1",
1293 | "kind": "CustomResourceDefinition",
1294 | "name": "recorders.tailscale.com",
1295 | "namespace": ""
1296 | },
1297 | {
1298 | "apiVersion": "rbac.authorization.k8s.io/v1",
1299 | "kind": "ClusterRole",
1300 | "name": "tailscale-auth-proxy",
1301 | "namespace": ""
1302 | },
1303 | {
1304 | "apiVersion": "rbac.authorization.k8s.io/v1",
1305 | "kind": "ClusterRole",
1306 | "name": "tailscale-operator",
1307 | "namespace": ""
1308 | },
1309 | {
1310 | "apiVersion": "rbac.authorization.k8s.io/v1",
1311 | "kind": "ClusterRoleBinding",
1312 | "name": "tailscale-auth-proxy",
1313 | "namespace": ""
1314 | },
1315 | {
1316 | "apiVersion": "rbac.authorization.k8s.io/v1",
1317 | "kind": "ClusterRoleBinding",
1318 | "name": "tailscale-operator",
1319 | "namespace": ""
1320 | },
1321 | {
1322 | "apiVersion": "rbac.authorization.k8s.io/v1",
1323 | "kind": "Role",
1324 | "name": "operator",
1325 | "namespace": "tailscale"
1326 | },
1327 | {
1328 | "apiVersion": "rbac.authorization.k8s.io/v1",
1329 | "kind": "Role",
1330 | "name": "proxies",
1331 | "namespace": "tailscale"
1332 | },
1333 | {
1334 | "apiVersion": "rbac.authorization.k8s.io/v1",
1335 | "kind": "RoleBinding",
1336 | "name": "operator",
1337 | "namespace": "tailscale"
1338 | },
1339 | {
1340 | "apiVersion": "rbac.authorization.k8s.io/v1",
1341 | "kind": "RoleBinding",
1342 | "name": "proxies",
1343 | "namespace": "tailscale"
1344 | },
1345 | {
1346 | "apiVersion": "apps/v1",
1347 | "kind": "Deployment",
1348 | "name": "operator",
1349 | "namespace": "tailscale"
1350 | },
1351 | {
1352 | "apiVersion": "networking.k8s.io/v1",
1353 | "kind": "IngressClass",
1354 | "name": "tailscale",
1355 | "namespace": ""
1356 | }
1357 | ],
1358 | "lastAttemptedConfigDigest": "sha256:ec864259c2bedeada53e194919f2416a1d6e742b4d5beb3555037ecce7c634d1",
1359 | "lastAttemptedGeneration": 1,
1360 | "lastAttemptedReleaseAction": "install",
1361 | "lastAttemptedReleaseActionDuration": "8.428667129s",
1362 | "lastAttemptedRevision": "1.90.6",
1363 | "observedGeneration": 1,
1364 | "sourceRef": {
1365 | "kind": "HelmRepository",
1366 | "message": "stored artifact: revision 'sha256:578d082975ad264ba4d09368febb298c3beb7f18e459bb9d323d3b7c2fc4d475'",
1367 | "name": "tailscale-operator",
1368 | "namespace": "tailscale",
1369 | "originRevision": "",
1370 | "originURL": "",
1371 | "status": "Ready",
1372 | "url": "https://pkgs.tailscale.com/helmcharts"
1373 | },
1374 | "storageNamespace": "tailscale"
1375 | }
1376 | },
1377 | {
1378 | "apiVersion": "helm.toolkit.fluxcd.io/v2",
1379 | "kind": "HelmRelease",
1380 | "metadata": {
1381 | "labels": {
1382 | "app.kubernetes.io/name": "zot"
1383 | },
1384 | "name": "zot-registry",
1385 | "namespace": "registry"
1386 | },
1387 | "spec": {
1388 | "chart": {
1389 | "spec": {
1390 | "chart": "zot",
1391 | "interval": "24h",
1392 | "reconcileStrategy": "ChartVersion",
1393 | "sourceRef": {
1394 | "kind": "HelmRepository",
1395 | "name": "zot-registry"
1396 | },
1397 | "version": "*"
1398 | }
1399 | },
1400 | "install": {
1401 | "strategy": {
1402 | "name": "RetryOnFailure",
1403 | "retryInterval": "2m"
1404 | }
1405 | },
1406 | "interval": "24h",
1407 | "releaseName": "zot-registry",
1408 | "upgrade": {
1409 | "strategy": {
1410 | "name": "RetryOnFailure",
1411 | "retryInterval": "3m"
1412 | }
1413 | },
1414 | "values": {
1415 | "fullnameOverride": "zot-registry",
1416 | "persistence": true,
1417 | "pvc": {
1418 | "create": true,
1419 | "storage": "20Gi",
1420 | "storageClassName": "standard"
1421 | },
1422 | "resources": {
1423 | "limits": {
1424 | "cpu": "2000m",
1425 | "memory": "1Gi"
1426 | },
1427 | "requests": {
1428 | "cpu": "100m",
1429 | "memory": "128Mi"
1430 | }
1431 | },
1432 | "service": {
1433 | "port": 80,
1434 | "type": "ClusterIP"
1435 | },
1436 | "strategy": {
1437 | "type": "Recreate"
1438 | }
1439 | }
1440 | },
1441 | "status": {
1442 | "reconcilerRef": {
1443 | "status": "Ready",
1444 | "message": "Helm upgrade succeeded for release registry/zot-registry.v3 with chart [email protected]",
1445 | "lastReconciled": "2025-11-02T08:48:52Z",
1446 | "managedBy": "ResourceSet/flux-system/zot-registry"
1447 | },
1448 | "conditions": [
1449 | {
1450 | "lastTransitionTime": "2025-11-02T08:48:52Z",
1451 | "message": "Helm upgrade succeeded for release registry/zot-registry.v3 with chart [email protected]",
1452 | "observedGeneration": 2,
1453 | "reason": "UpgradeSucceeded",
1454 | "status": "True",
1455 | "type": "Ready"
1456 | },
1457 | {
1458 | "lastTransitionTime": "2025-11-02T08:48:52Z",
1459 | "message": "Helm upgrade succeeded for release registry/zot-registry.v3 with chart [email protected]",
1460 | "observedGeneration": 2,
1461 | "reason": "UpgradeSucceeded",
1462 | "status": "True",
1463 | "type": "Released"
1464 | }
1465 | ],
1466 | "helmChart": "registry/registry-zot-registry",
1467 | "history": [
1468 | {
1469 | "appVersion": "v2.1.10",
1470 | "chartName": "zot",
1471 | "chartVersion": "0.1.89",
1472 | "configDigest": "sha256:68a0cb4c346313fbf114884a6849aeff1c22d991dc7921b30d411f8471c38a09",
1473 | "digest": "sha256:afeeb6dd28d7443a8675809da0a137b4957a392c704d8aa5c02bdb7e7ead9a29",
1474 | "firstDeployed": "2025-11-01T23:31:41Z",
1475 | "lastDeployed": "2025-11-02T08:48:38Z",
1476 | "name": "zot-registry",
1477 | "namespace": "registry",
1478 | "status": "deployed",
1479 | "version": 3
1480 | },
1481 | {
1482 | "appVersion": "v2.1.10",
1483 | "chartName": "zot",
1484 | "chartVersion": "0.1.89",
1485 | "configDigest": "sha256:68a0cb4c346313fbf114884a6849aeff1c22d991dc7921b30d411f8471c38a09",
1486 | "digest": "sha256:6fc3a1dfff1edb1f5ca6887801223d713ab874335fe3253d066d47c524571d1b",
1487 | "firstDeployed": "2025-11-01T23:31:41Z",
1488 | "lastDeployed": "2025-11-02T08:45:34Z",
1489 | "name": "zot-registry",
1490 | "namespace": "registry",
1491 | "status": "failed",
1492 | "version": 2
1493 | },
1494 | {
1495 | "appVersion": "v2.1.10",
1496 | "chartName": "zot",
1497 | "chartVersion": "0.1.89",
1498 | "configDigest": "sha256:ddea6042f0d393e8cf3e920373afee22df11c35e730a7eee2519bed800bb2352",
1499 | "digest": "sha256:da4ae11e60ef2fd825af7ff338374761f57a3c9442ace17a7a7f2929d8dd28da",
1500 | "firstDeployed": "2025-11-01T23:31:41Z",
1501 | "lastDeployed": "2025-11-01T23:31:41Z",
1502 | "name": "zot-registry",
1503 | "namespace": "registry",
1504 | "status": "superseded",
1505 | "version": 1
1506 | }
1507 | ],
1508 | "inventory": [
1509 | {
1510 | "apiVersion": "v1",
1511 | "kind": "ServiceAccount",
1512 | "name": "zot-registry",
1513 | "namespace": "registry"
1514 | },
1515 | {
1516 | "apiVersion": "v1",
1517 | "kind": "Service",
1518 | "name": "zot-registry",
1519 | "namespace": "registry"
1520 | },
1521 | {
1522 | "apiVersion": "apps/v1",
1523 | "kind": "StatefulSet",
1524 | "name": "zot-registry",
1525 | "namespace": "registry"
1526 | }
1527 | ],
1528 | "lastAttemptedConfigDigest": "sha256:68a0cb4c346313fbf114884a6849aeff1c22d991dc7921b30d411f8471c38a09",
1529 | "lastAttemptedGeneration": 2,
1530 | "lastAttemptedReleaseAction": "upgrade",
1531 | "lastAttemptedReleaseActionDuration": "14.24459459s",
1532 | "lastAttemptedRevision": "0.1.89",
1533 | "observedGeneration": 2,
1534 | "sourceRef": {
1535 | "kind": "HelmRepository",
1536 | "message": "stored artifact: revision 'sha256:2b1fdd97e969c82ee149a7ee8b00f55061760832f23c39a3235936f0912f2125'",
1537 | "name": "zot-registry",
1538 | "namespace": "registry",
1539 | "originRevision": "",
1540 | "originURL": "",
1541 | "status": "Ready",
1542 | "url": "https://zotregistry.dev/helm-charts"
1543 | },
1544 | "storageNamespace": "registry"
1545 | }
1546 | },
1547 | {
1548 | "apiVersion": "kustomize.toolkit.fluxcd.io/v1",
1549 | "kind": "Kustomization",
1550 | "metadata": {
1551 | "name": "cluster-infra",
1552 | "namespace": "flux-system"
1553 | },
1554 | "spec": {
1555 | "force": false,
1556 | "healthCheckExprs": [
1557 | {
1558 | "apiVersion": "fluxcd.controlplane.io/v1",
1559 | "current": "status.conditions.filter(c, c.type == 'Ready').all(c, c.status == 'True' && c.observedGeneration == metadata.generation)",
1560 | "kind": "ResourceSet"
1561 | }
1562 | ],
1563 | "interval": "1h",
1564 | "path": "infra",
1565 | "prune": true,
1566 | "retryInterval": "2m",
1567 | "sourceRef": {
1568 | "kind": "GitRepository",
1569 | "name": "flux-system"
1570 | },
1571 | "timeout": "6m",
1572 | "wait": true
1573 | },
1574 | "status": {
1575 | "reconcilerRef": {
1576 | "status": "Ready",
1577 | "message": "Applied revision: refs/heads/main@sha1:d676e33990dc2865d67c022d26dea93d5e3236ff",
1578 | "lastReconciled": "2025-11-18T11:09:21Z",
1579 | "managedBy": "Kustomization/flux-system/flux-system"
1580 | },
1581 | "conditions": [
1582 | {
1583 | "lastTransitionTime": "2025-11-18T11:09:21Z",
1584 | "message": "Applied revision: refs/heads/main@sha1:d676e33990dc2865d67c022d26dea93d5e3236ff",
1585 | "observedGeneration": 1,
1586 | "reason": "ReconciliationSucceeded",
1587 | "status": "True",
1588 | "type": "Ready"
1589 | },
1590 | {
1591 | "lastTransitionTime": "2025-11-18T11:09:21Z",
1592 | "message": "Health check passed in 12.565167ms",
1593 | "observedGeneration": 1,
1594 | "reason": "Succeeded",
1595 | "status": "True",
1596 | "type": "Healthy"
1597 | }
1598 | ],
1599 | "history": [
1600 | {
1601 | "digest": "sha256:bbe7aa022b513c7ceb4cf38e9fee0cec579c96fee9bf15afcdeff34bf4eed934",
1602 | "firstReconciled": "2025-11-06T21:36:41Z",
1603 | "lastReconciled": "2025-11-18T11:09:21Z",
1604 | "lastReconciledDuration": "76.890708ms",
1605 | "lastReconciledStatus": "ReconciliationSucceeded",
1606 | "metadata": {
1607 | "revision": "refs/heads/main@sha1:d676e33990dc2865d67c022d26dea93d5e3236ff"
1608 | },
1609 | "totalReconciliations": 279
1610 | },
1611 | {
1612 | "digest": "sha256:bbe7aa022b513c7ceb4cf38e9fee0cec579c96fee9bf15afcdeff34bf4eed934",
1613 | "firstReconciled": "2025-11-11T13:27:39Z",
1614 | "lastReconciled": "2025-11-11T14:15:40Z",
1615 | "lastReconciledDuration": "6m0.068181246s",
1616 | "lastReconciledStatus": "HealthCheckFailed",
1617 | "metadata": {
1618 | "revision": "refs/heads/main@sha1:d676e33990dc2865d67c022d26dea93d5e3236ff"
1619 | },
1620 | "totalReconciliations": 7
1621 | },
1622 | {
1623 | "digest": "sha256:b040c34218f94a8b600cb9686f3db56d931884fb7ce8bfc9355e4cb93f1e036c",
1624 | "firstReconciled": "2025-11-06T21:35:43Z",
1625 | "lastReconciled": "2025-11-06T21:35:43Z",
1626 | "lastReconciledDuration": "5.222284961s",
1627 | "lastReconciledStatus": "ReconciliationSucceeded",
1628 | "metadata": {
1629 | "revision": "refs/heads/main@sha1:7ca2aaecb20927201120b33c3ad3f181294c5b98"
1630 | },
1631 | "totalReconciliations": 1
1632 | },
1633 | {
1634 | "digest": "sha256:7dd5cdd3147fa75fecf07acc8a45d8fce39445af96bb0146c476795e7a2e3099",
1635 | "firstReconciled": "2025-11-06T20:46:34Z",
1636 | "lastReconciled": "2025-11-06T21:07:15Z",
1637 | "lastReconciledDuration": "74.965459ms",
1638 | "lastReconciledStatus": "ReconciliationSucceeded",
1639 | "metadata": {
1640 | "revision": "refs/heads/main@sha1:d1bc4c4c6a8bf788fc776fdf2680ed91c6d0dd37"
1641 | },
1642 | "totalReconciliations": 2
1643 | },
1644 | {
1645 | "digest": "sha256:75e8258dc921750cb17b10831c33931c6f1f6c418e081c8114303e1d0d6bc67f",
1646 | "firstReconciled": "2025-11-03T18:48:35Z",
1647 | "lastReconciled": "2025-11-06T20:08:46Z",
1648 | "lastReconciledDuration": "84.788166ms",
1649 | "lastReconciledStatus": "ReconciliationSucceeded",
1650 | "metadata": {
1651 | "revision": "refs/heads/main@sha1:62a1e87e875328d999dd98090500182a26be833a"
1652 | },
1653 | "totalReconciliations": 74
1654 | }
1655 | ],
1656 | "inventory": [
1657 | {
1658 | "apiVersion": "fluxcd.controlplane.io/v1",
1659 | "kind": "ResourceSet",
1660 | "name": "cert-manager",
1661 | "namespace": "flux-system"
1662 | },
1663 | {
1664 | "apiVersion": "fluxcd.controlplane.io/v1",
1665 | "kind": "ResourceSet",
1666 | "name": "flux-status-server",
1667 | "namespace": "flux-system"
1668 | },
1669 | {
1670 | "apiVersion": "fluxcd.controlplane.io/v1",
1671 | "kind": "ResourceSet",
1672 | "name": "metrics-server",
1673 | "namespace": "flux-system"
1674 | },
1675 | {
1676 | "apiVersion": "fluxcd.controlplane.io/v1",
1677 | "kind": "ResourceSet",
1678 | "name": "tailscale-config",
1679 | "namespace": "flux-system"
1680 | },
1681 | {
1682 | "apiVersion": "fluxcd.controlplane.io/v1",
1683 | "kind": "ResourceSet",
1684 | "name": "tailscale-operator",
1685 | "namespace": "flux-system"
1686 | },
1687 | {
1688 | "apiVersion": "fluxcd.controlplane.io/v1",
1689 | "kind": "ResourceSet",
1690 | "name": "zot-registry",
1691 | "namespace": "flux-system"
1692 | },
1693 | {
1694 | "apiVersion": "fluxcd.controlplane.io/v1",
1695 | "kind": "ResourceSetInputProvider",
1696 | "name": "flux-status-server",
1697 | "namespace": "flux-system"
1698 | }
1699 | ],
1700 | "lastAppliedRevision": "refs/heads/main@sha1:d676e33990dc2865d67c022d26dea93d5e3236ff",
1701 | "lastAttemptedRevision": "refs/heads/main@sha1:d676e33990dc2865d67c022d26dea93d5e3236ff",
1702 | "observedGeneration": 1,
1703 | "sourceRef": {
1704 | "kind": "GitRepository",
1705 | "message": "stored artifact for revision 'refs/heads/main@sha1:d676e33990dc2865d67c022d26dea93d5e3236ff'",
1706 | "name": "flux-system",
1707 | "namespace": "flux-system",
1708 | "originRevision": "",
1709 | "originURL": "",
1710 | "status": "Ready",
1711 | "url": "https://github.com/stefanprodan/homelab.git"
1712 | }
1713 | }
1714 | },
1715 | {
1716 | "apiVersion": "kustomize.toolkit.fluxcd.io/v1",
1717 | "kind": "Kustomization",
1718 | "metadata": {
1719 | "name": "flux-operator",
1720 | "namespace": "flux-system"
1721 | },
1722 | "spec": {
1723 | "commonMetadata": {
1724 | "labels": {
1725 | "app.kubernetes.io/instance": "flux-operator",
1726 | "app.kubernetes.io/name": "flux-operator"
1727 | }
1728 | },
1729 | "deletionPolicy": "Orphan",
1730 | "force": true,
1731 | "interval": "24h",
1732 | "patches": [
1733 | {
1734 | "patch": "- op: replace\n path: \"/spec/selector/matchLabels\"\n value:\n app.kubernetes.io/name: flux-operator\n app.kubernetes.io/instance: flux-operator\n- op: replace\n path: \"/spec/template/metadata/labels\"\n value:\n app.kubernetes.io/name: flux-operator\n app.kubernetes.io/instance: flux-operator\n- op: add\n path: \"/spec/template/spec/containers/0/env/-\"\n value:\n name: REPORTING_INTERVAL\n value: \"30s\"",
1735 | "target": {
1736 | "kind": "Deployment"
1737 | }
1738 | }
1739 | ],
1740 | "path": "./flux-operator",
1741 | "prune": true,
1742 | "retryInterval": "5m",
1743 | "serviceAccountName": "flux-operator",
1744 | "sourceRef": {
1745 | "kind": "OCIRepository",
1746 | "name": "flux-operator"
1747 | },
1748 | "timeout": "5m",
1749 | "wait": true
1750 | },
1751 | "status": {
1752 | "reconcilerRef": {
1753 | "status": "Ready",
1754 | "message": "Applied revision: latest@sha256:043536cc6ec06ff978777ca31cf0adc3d654575a2aa8050988aadf90b9f9877c",
1755 | "lastReconciled": "2025-11-18T00:28:13Z",
1756 | "managedBy": ""
1757 | },
1758 | "conditions": [
1759 | {
1760 | "lastTransitionTime": "2025-11-18T00:28:13Z",
1761 | "message": "Applied revision: latest@sha256:043536cc6ec06ff978777ca31cf0adc3d654575a2aa8050988aadf90b9f9877c",
1762 | "observedGeneration": 1,
1763 | "reason": "ReconciliationSucceeded",
1764 | "status": "True",
1765 | "type": "Ready"
1766 | },
1767 | {
1768 | "lastTransitionTime": "2025-11-18T00:28:13Z",
1769 | "message": "Health check passed in 17.192458ms",
1770 | "observedGeneration": 1,
1771 | "reason": "Succeeded",
1772 | "status": "True",
1773 | "type": "Healthy"
1774 | }
1775 | ],
1776 | "history": [
1777 | {
1778 | "digest": "sha256:cb9b9a44b9d94bd0bfd0cb8e3336e71841ccabf55da588ae1876548a77114759",
1779 | "firstReconciled": "2025-11-01T23:31:13Z",
1780 | "lastReconciled": "2025-11-18T00:28:13Z",
1781 | "lastReconciledDuration": "139.516833ms",
1782 | "lastReconciledStatus": "ReconciliationSucceeded",
1783 | "metadata": {
1784 | "originRevision": "main@sha1:06e1897fcf773428155c5f6b9aadb5538169bb5c",
1785 | "revision": "latest@sha256:043536cc6ec06ff978777ca31cf0adc3d654575a2aa8050988aadf90b9f9877c"
1786 | },
1787 | "totalReconciliations": 19
1788 | }
1789 | ],
1790 | "inventory": [
1791 | {
1792 | "apiVersion": "apiextensions.k8s.io/v1",
1793 | "kind": "CustomResourceDefinition",
1794 | "name": "fluxinstances.fluxcd.controlplane.io",
1795 | "namespace": ""
1796 | },
1797 | {
1798 | "apiVersion": "apiextensions.k8s.io/v1",
1799 | "kind": "CustomResourceDefinition",
1800 | "name": "fluxreports.fluxcd.controlplane.io",
1801 | "namespace": ""
1802 | },
1803 | {
1804 | "apiVersion": "apiextensions.k8s.io/v1",
1805 | "kind": "CustomResourceDefinition",
1806 | "name": "resourcesetinputproviders.fluxcd.controlplane.io",
1807 | "namespace": ""
1808 | },
1809 | {
1810 | "apiVersion": "apiextensions.k8s.io/v1",
1811 | "kind": "CustomResourceDefinition",
1812 | "name": "resourcesets.fluxcd.controlplane.io",
1813 | "namespace": ""
1814 | },
1815 | {
1816 | "apiVersion": "rbac.authorization.k8s.io/v1",
1817 | "kind": "ClusterRole",
1818 | "name": "flux-operator-edit",
1819 | "namespace": ""
1820 | },
1821 | {
1822 | "apiVersion": "rbac.authorization.k8s.io/v1",
1823 | "kind": "ClusterRole",
1824 | "name": "flux-operator-view",
1825 | "namespace": ""
1826 | },
1827 | {
1828 | "apiVersion": "rbac.authorization.k8s.io/v1",
1829 | "kind": "ClusterRoleBinding",
1830 | "name": "flux-operator-cluster-admin",
1831 | "namespace": ""
1832 | },
1833 | {
1834 | "apiVersion": "v1",
1835 | "kind": "ServiceAccount",
1836 | "name": "flux-operator",
1837 | "namespace": "flux-system"
1838 | },
1839 | {
1840 | "apiVersion": "v1",
1841 | "kind": "Service",
1842 | "name": "flux-operator",
1843 | "namespace": "flux-system"
1844 | },
1845 | {
1846 | "apiVersion": "apps/v1",
1847 | "kind": "Deployment",
1848 | "name": "flux-operator",
1849 | "namespace": "flux-system"
1850 | }
1851 | ],
1852 | "lastAppliedOriginRevision": "main@sha1:06e1897fcf773428155c5f6b9aadb5538169bb5c",
1853 | "lastAppliedRevision": "latest@sha256:043536cc6ec06ff978777ca31cf0adc3d654575a2aa8050988aadf90b9f9877c",
1854 | "lastAttemptedRevision": "latest@sha256:043536cc6ec06ff978777ca31cf0adc3d654575a2aa8050988aadf90b9f9877c",
1855 | "observedGeneration": 1,
1856 | "sourceRef": {
1857 | "kind": "OCIRepository",
1858 | "message": "stored artifact for digest 'latest@sha256:043536cc6ec06ff978777ca31cf0adc3d654575a2aa8050988aadf90b9f9877c'",
1859 | "name": "flux-operator",
1860 | "namespace": "flux-system",
1861 | "originRevision": "main@sha1:06e1897fcf773428155c5f6b9aadb5538169bb5c",
1862 | "originURL": "git://github.com/controlplaneio-fluxcd/flux-operator.git",
1863 | "status": "Ready",
1864 | "url": "oci://ghcr.io/controlplaneio-fluxcd/flux-operator-manifests"
1865 | }
1866 | }
1867 | },
1868 | {
1869 | "apiVersion": "kustomize.toolkit.fluxcd.io/v1",
1870 | "kind": "Kustomization",
1871 | "metadata": {
1872 | "annotations": {
1873 | "kustomize.toolkit.fluxcd.io/prune": "Disabled",
1874 | "kustomize.toolkit.fluxcd.io/ssa": "Ignore"
1875 | },
1876 | "labels": {
1877 | "app.kubernetes.io/instance": "flux-system",
1878 | "app.kubernetes.io/managed-by": "flux-operator",
1879 | "app.kubernetes.io/part-of": "flux",
1880 | "app.kubernetes.io/version": "v2.7.3"
1881 | },
1882 | "name": "flux-system",
1883 | "namespace": "flux-system"
1884 | },
1885 | "spec": {
1886 | "force": false,
1887 | "interval": "10m0s",
1888 | "path": "./clusters/homelab",
1889 | "prune": true,
1890 | "sourceRef": {
1891 | "kind": "GitRepository",
1892 | "name": "flux-system"
1893 | }
1894 | },
1895 | "status": {
1896 | "reconcilerRef": {
1897 | "status": "Ready",
1898 | "message": "Applied revision: refs/heads/main@sha1:d676e33990dc2865d67c022d26dea93d5e3236ff",
1899 | "lastReconciled": "2025-11-01T23:31:36Z",
1900 | "managedBy": "FluxInstance/flux-system/flux"
1901 | },
1902 | "conditions": [
1903 | {
1904 | "lastTransitionTime": "2025-11-18T11:49:21Z",
1905 | "message": "Applied revision: refs/heads/main@sha1:d676e33990dc2865d67c022d26dea93d5e3236ff",
1906 | "observedGeneration": 1,
1907 | "reason": "ReconciliationSucceeded",
1908 | "status": "True",
1909 | "type": "Ready"
1910 | }
1911 | ],
1912 | "history": [
1913 | {
1914 | "digest": "sha256:92e6e90f2a0951f761fb9ed43f9814cc8c94b56666ca1a24cd0ecb7e85587331",
1915 | "firstReconciled": "2025-11-01T23:30:57Z",
1916 | "lastReconciled": "2025-11-18T11:49:21Z",
1917 | "lastReconciledDuration": "32.727458ms",
1918 | "lastReconciledStatus": "ReconciliationSucceeded",
1919 | "metadata": {
1920 | "revision": "refs/heads/main@sha1:d676e33990dc2865d67c022d26dea93d5e3236ff"
1921 | },
1922 | "totalReconciliations": 2406
1923 | }
1924 | ],
1925 | "inventory": [
1926 | {
1927 | "apiVersion": "fluxcd.controlplane.io/v1",
1928 | "kind": "FluxInstance",
1929 | "name": "flux",
1930 | "namespace": "flux-system"
1931 | },
1932 | {
1933 | "apiVersion": "fluxcd.controlplane.io/v1",
1934 | "kind": "ResourceSet",
1935 | "name": "cluster-infra",
1936 | "namespace": "flux-system"
1937 | }
1938 | ],
1939 | "lastAppliedRevision": "refs/heads/main@sha1:d676e33990dc2865d67c022d26dea93d5e3236ff",
1940 | "lastAttemptedRevision": "refs/heads/main@sha1:d676e33990dc2865d67c022d26dea93d5e3236ff",
1941 | "lastHandledReconcileAt": "2025-11-06T23:35:16.275132+02:00",
1942 | "observedGeneration": 1,
1943 | "sourceRef": {
1944 | "kind": "GitRepository",
1945 | "message": "stored artifact for revision 'refs/heads/main@sha1:d676e33990dc2865d67c022d26dea93d5e3236ff'",
1946 | "name": "flux-system",
1947 | "namespace": "flux-system",
1948 | "originRevision": "",
1949 | "originURL": "",
1950 | "status": "Ready",
1951 | "url": "https://github.com/stefanprodan/homelab.git"
1952 | }
1953 | }
1954 | },
1955 | {
1956 | "apiVersion": "source.toolkit.fluxcd.io/v1",
1957 | "kind": "OCIRepository",
1958 | "metadata": {
1959 | "labels": {
1960 | "app.kubernetes.io/name": "cert-manager"
1961 | },
1962 | "name": "cert-manager",
1963 | "namespace": "cert-manager"
1964 | },
1965 | "spec": {
1966 | "interval": "24h",
1967 | "layerSelector": {
1968 | "mediaType": "application/vnd.cncf.helm.chart.content.v1.tar+gzip",
1969 | "operation": "copy"
1970 | },
1971 | "provider": "generic",
1972 | "ref": {
1973 | "semver": "*"
1974 | },
1975 | "timeout": "60s",
1976 | "url": "oci://quay.io/jetstack/charts/cert-manager"
1977 | },
1978 | "status": {
1979 | "reconcilerRef": {
1980 | "status": "Ready",
1981 | "message": "stored artifact for digest 'v1.19.1@sha256:9578566b26b2258bcb9a0be27feeaa7c0adaed635cc0f85b6293e42a80c58cc9'",
1982 | "lastReconciled": "2025-11-01T23:31:03Z",
1983 | "managedBy": "ResourceSet/flux-system/cert-manager"
1984 | },
1985 | "artifact": {
1986 | "digest": "sha256:f72a727b1749df3521e7a65af5f18505f93b572d758841890270b150344b2b41",
1987 | "lastUpdateTime": "2025-11-01T23:31:03Z",
1988 | "metadata": {
1989 | "artifacthub.io/category": "security",
1990 | "artifacthub.io/license": "Apache-2.0",
1991 | "artifacthub.io/prerelease": "false",
1992 | "artifacthub.io/signKey": "fingerprint: 1020CF3C033D4F35BAE1C19E1226061C665DF13E\nurl: https://cert-manager.io/public-keys/cert-manager-keyring-2021-09-20-1020CF3C033D4F35BAE1C19E1226061C665DF13E.gpg\n",
1993 | "org.opencontainers.image.authors": "cert-manager-maintainers ([email protected])",
1994 | "org.opencontainers.image.created": "2025-10-15T16:29:51+01:00",
1995 | "org.opencontainers.image.description": "A Helm chart for cert-manager",
1996 | "org.opencontainers.image.source": "https://github.com/cert-manager/cert-manager",
1997 | "org.opencontainers.image.title": "cert-manager",
1998 | "org.opencontainers.image.url": "https://cert-manager.io",
1999 | "org.opencontainers.image.version": "v1.19.1"
2000 | },
2001 | "path": "ocirepository/cert-manager/cert-manager/sha256:9578566b26b2258bcb9a0be27feeaa7c0adaed635cc0f85b6293e42a80c58cc9.tar.gz",
2002 | "revision": "v1.19.1@sha256:9578566b26b2258bcb9a0be27feeaa7c0adaed635cc0f85b6293e42a80c58cc9",
2003 | "size": 140724,
2004 | "url": "http://source-controller.flux-system.svc.cluster.local./ocirepository/cert-manager/cert-manager/sha256:9578566b26b2258bcb9a0be27feeaa7c0adaed635cc0f85b6293e42a80c58cc9.tar.gz"
2005 | },
2006 | "conditions": [
2007 | {
2008 | "lastTransitionTime": "2025-11-01T23:31:03Z",
2009 | "message": "stored artifact for digest 'v1.19.1@sha256:9578566b26b2258bcb9a0be27feeaa7c0adaed635cc0f85b6293e42a80c58cc9'",
2010 | "observedGeneration": 1,
2011 | "reason": "Succeeded",
2012 | "status": "True",
2013 | "type": "Ready"
2014 | },
2015 | {
2016 | "lastTransitionTime": "2025-11-01T23:31:03Z",
2017 | "message": "stored artifact for digest 'v1.19.1@sha256:9578566b26b2258bcb9a0be27feeaa7c0adaed635cc0f85b6293e42a80c58cc9'",
2018 | "observedGeneration": 1,
2019 | "reason": "Succeeded",
2020 | "status": "True",
2021 | "type": "ArtifactInStorage"
2022 | }
2023 | ],
2024 | "observedGeneration": 1,
2025 | "observedLayerSelector": {
2026 | "mediaType": "application/vnd.cncf.helm.chart.content.v1.tar+gzip",
2027 | "operation": "copy"
2028 | },
2029 | "url": "http://source-controller.flux-system.svc.cluster.local./ocirepository/cert-manager/cert-manager/latest.tar.gz"
2030 | }
2031 | },
2032 | {
2033 | "apiVersion": "source.toolkit.fluxcd.io/v1",
2034 | "kind": "OCIRepository",
2035 | "metadata": {
2036 | "name": "flux-operator",
2037 | "namespace": "flux-system"
2038 | },
2039 | "spec": {
2040 | "interval": "1h",
2041 | "provider": "generic",
2042 | "ref": {
2043 | "tag": "latest"
2044 | },
2045 | "verify": {
2046 | "provider": "cosign"
2047 | },
2048 | "timeout": "60s",
2049 | "url": "oci://ghcr.io/controlplaneio-fluxcd/flux-operator-manifests"
2050 | },
2051 | "status": {
2052 | "reconcilerRef": {
2053 | "status": "Ready",
2054 | "message": "stored artifact for digest 'latest@sha256:043536cc6ec06ff978777ca31cf0adc3d654575a2aa8050988aadf90b9f9877c'",
2055 | "lastReconciled": "2025-11-07T12:23:03Z",
2056 | "managedBy": ""
2057 | },
2058 | "artifact": {
2059 | "digest": "sha256:f3084e90b5b4c023321f43e5fee08b6e4b3a6a6d1938c614ae0ee91890fa249c",
2060 | "lastUpdateTime": "2025-11-07T12:23:03Z",
2061 | "metadata": {
2062 | "org.opencontainers.image.created": "2025-11-07T12:12:32Z",
2063 | "org.opencontainers.image.description": "Flux Operator",
2064 | "org.opencontainers.image.revision": "main@sha1:06e1897fcf773428155c5f6b9aadb5538169bb5c",
2065 | "org.opencontainers.image.source": "git://github.com/controlplaneio-fluxcd/flux-operator.git"
2066 | },
2067 | "path": "ocirepository/flux-system/flux-operator/sha256:043536cc6ec06ff978777ca31cf0adc3d654575a2aa8050988aadf90b9f9877c.tar.gz",
2068 | "revision": "latest@sha256:043536cc6ec06ff978777ca31cf0adc3d654575a2aa8050988aadf90b9f9877c",
2069 | "size": 917016,
2070 | "url": "http://source-controller.flux-system.svc.cluster.local./ocirepository/flux-system/flux-operator/sha256:043536cc6ec06ff978777ca31cf0adc3d654575a2aa8050988aadf90b9f9877c.tar.gz"
2071 | },
2072 | "conditions": [
2073 | {
2074 | "lastTransitionTime": "2025-11-11T14:14:47Z",
2075 | "message": "stored artifact for digest 'latest@sha256:043536cc6ec06ff978777ca31cf0adc3d654575a2aa8050988aadf90b9f9877c'",
2076 | "observedGeneration": 1,
2077 | "reason": "Succeeded",
2078 | "status": "True",
2079 | "type": "Ready"
2080 | },
2081 | {
2082 | "lastTransitionTime": "2025-11-07T12:23:03Z",
2083 | "message": "stored artifact for digest 'latest@sha256:043536cc6ec06ff978777ca31cf0adc3d654575a2aa8050988aadf90b9f9877c'",
2084 | "observedGeneration": 1,
2085 | "reason": "Succeeded",
2086 | "status": "True",
2087 | "type": "ArtifactInStorage"
2088 | }
2089 | ],
2090 | "observedGeneration": 1,
2091 | "url": "http://source-controller.flux-system.svc.cluster.local./ocirepository/flux-system/flux-operator/latest.tar.gz"
2092 | }
2093 | },
2094 | {
2095 | "apiVersion": "source.toolkit.fluxcd.io/v1",
2096 | "kind": "OCIRepository",
2097 | "metadata": {
2098 | "labels": {
2099 | "app.kubernetes.io/name": "metrics-server"
2100 | },
2101 | "name": "metrics-server",
2102 | "namespace": "monitoring"
2103 | },
2104 | "spec": {
2105 | "interval": "24h",
2106 | "layerSelector": {
2107 | "mediaType": "application/vnd.cncf.helm.chart.content.v1.tar+gzip",
2108 | "operation": "copy"
2109 | },
2110 | "provider": "generic",
2111 | "ref": {
2112 | "semver": "*"
2113 | },
2114 | "timeout": "60s",
2115 | "url": "oci://ghcr.io/controlplaneio-fluxcd/charts/metrics-server"
2116 | },
2117 | "status": {
2118 | "reconcilerRef": {
2119 | "status": "Ready",
2120 | "message": "stored artifact for digest '3.13.0@sha256:457df0544ec2553176bbaaba70bf5b68af6c400eff510a401b8eba1b13f9a8ad'",
2121 | "lastReconciled": "2025-11-01T23:31:42Z",
2122 | "managedBy": "Kustomization/flux-system/flux-system"
2123 | },
2124 | "artifact": {
2125 | "digest": "sha256:a418dfdeb7b49a244cf6f848c4c3b7ee8eb6b0fdc19b0389cff98ceec4107a48",
2126 | "lastUpdateTime": "2025-11-01T23:31:42Z",
2127 | "metadata": {
2128 | "artifacthub.io/changes": "- kind: added\n description: \"Add chart options to secure the connection between Metrics Server and the Kubernetes API Server.\"\n- kind: added\n description: \"Add `unhealthyPodEvictionPolicy` to the Metrics Server PDB as a user enabled feature.\"\n- kind: changed\n description: \"Update the _Addon Resizer_ OCI image to [`1.8.23`](https://github.com/kubernetes/autoscaler/releases/tag/addon-resizer-1.8.23).\"\n- kind: changed\n description: \"Update the _Metrics Server_ OCI image to [`0.8.0`](https://github.com/kubernetes-sigs/metrics-server/releases/tag/v0.8.0).\"\n",
2129 | "org.opencontainers.image.authors": "stevehipwell, krmichel, endrec",
2130 | "org.opencontainers.image.created": "2025-07-23T04:18:26Z",
2131 | "org.opencontainers.image.description": "Metrics Server is a scalable, efficient source of container resource metrics for Kubernetes built-in autoscaling pipelines.",
2132 | "org.opencontainers.image.source": "https://github.com/kubernetes-sigs/metrics-server",
2133 | "org.opencontainers.image.title": "metrics-server",
2134 | "org.opencontainers.image.url": "https://github.com/kubernetes-sigs/metrics-server",
2135 | "org.opencontainers.image.version": "3.13.0"
2136 | },
2137 | "path": "ocirepository/monitoring/metrics-server/sha256:457df0544ec2553176bbaaba70bf5b68af6c400eff510a401b8eba1b13f9a8ad.tar.gz",
2138 | "revision": "3.13.0@sha256:457df0544ec2553176bbaaba70bf5b68af6c400eff510a401b8eba1b13f9a8ad",
2139 | "size": 13998,
2140 | "url": "http://source-controller.flux-system.svc.cluster.local./ocirepository/monitoring/metrics-server/sha256:457df0544ec2553176bbaaba70bf5b68af6c400eff510a401b8eba1b13f9a8ad.tar.gz"
2141 | },
2142 | "conditions": [
2143 | {
2144 | "lastTransitionTime": "2025-11-01T23:31:42Z",
2145 | "message": "stored artifact for digest '3.13.0@sha256:457df0544ec2553176bbaaba70bf5b68af6c400eff510a401b8eba1b13f9a8ad'",
2146 | "observedGeneration": 1,
2147 | "reason": "Succeeded",
2148 | "status": "True",
2149 | "type": "Ready"
2150 | },
2151 | {
2152 | "lastTransitionTime": "2025-11-01T23:31:42Z",
2153 | "message": "stored artifact for digest '3.13.0@sha256:457df0544ec2553176bbaaba70bf5b68af6c400eff510a401b8eba1b13f9a8ad'",
2154 | "observedGeneration": 1,
2155 | "reason": "Succeeded",
2156 | "status": "True",
2157 | "type": "ArtifactInStorage"
2158 | }
2159 | ],
2160 | "observedGeneration": 1,
2161 | "observedLayerSelector": {
2162 | "mediaType": "application/vnd.cncf.helm.chart.content.v1.tar+gzip",
2163 | "operation": "copy"
2164 | },
2165 | "url": "http://source-controller.flux-system.svc.cluster.local./ocirepository/monitoring/metrics-server/latest.tar.gz"
2166 | }
2167 | },
2168 | {
2169 | "apiVersion": "fluxcd.controlplane.io/v1",
2170 | "kind": "ResourceSet",
2171 | "metadata": {
2172 | "annotations": {
2173 | "fluxcd.controlplane.io/reconcileTimeout": "5m"
2174 | },
2175 | "name": "cert-manager",
2176 | "namespace": "flux-system"
2177 | },
2178 | "spec": {
2179 | "commonMetadata": {
2180 | "labels": {
2181 | "app.kubernetes.io/name": "cert-manager"
2182 | }
2183 | },
2184 | "inputs": [
2185 | {
2186 | "namespace": "cert-manager",
2187 | "version": "*"
2188 | }
2189 | ],
2190 | "resources": [
2191 | {
2192 | "apiVersion": "v1",
2193 | "kind": "Namespace",
2194 | "metadata": {
2195 | "name": "<< inputs.namespace >>"
2196 | }
2197 | },
2198 | {
2199 | "apiVersion": "source.toolkit.fluxcd.io/v1",
2200 | "kind": "OCIRepository",
2201 | "metadata": {
2202 | "name": "<< inputs.provider.name >>",
2203 | "namespace": "<< inputs.namespace >>"
2204 | },
2205 | "spec": {
2206 | "interval": "24h",
2207 | "layerSelector": {
2208 | "mediaType": "application/vnd.cncf.helm.chart.content.v1.tar+gzip",
2209 | "operation": "copy"
2210 | },
2211 | "ref": {
2212 | "semver": "<< inputs.version | quote >>"
2213 | },
2214 | "url": "oci://quay.io/jetstack/charts/cert-manager"
2215 | }
2216 | },
2217 | {
2218 | "apiVersion": "helm.toolkit.fluxcd.io/v2",
2219 | "kind": "HelmRelease",
2220 | "metadata": {
2221 | "name": "<< inputs.provider.name >>",
2222 | "namespace": "<< inputs.namespace >>"
2223 | },
2224 | "spec": {
2225 | "chartRef": {
2226 | "kind": "OCIRepository",
2227 | "name": "<< inputs.provider.name >>"
2228 | },
2229 | "install": {
2230 | "strategy": {
2231 | "name": "RetryOnFailure",
2232 | "retryInterval": "2m"
2233 | }
2234 | },
2235 | "interval": "24h",
2236 | "releaseName": "<< inputs.provider.name >>",
2237 | "upgrade": {
2238 | "strategy": {
2239 | "name": "RetryOnFailure",
2240 | "retryInterval": "3m"
2241 | }
2242 | },
2243 | "values": {
2244 | "crds": {
2245 | "enabled": true,
2246 | "keep": false
2247 | }
2248 | }
2249 | }
2250 | }
2251 | ],
2252 | "wait": true
2253 | },
2254 | "status": {
2255 | "reconcilerRef": {
2256 | "status": "Ready",
2257 | "message": "Reconciliation finished in 35ms",
2258 | "lastReconciled": "2025-11-18T11:52:14Z",
2259 | "managedBy": "Kustomization/flux-system/flux-system"
2260 | },
2261 | "conditions": [
2262 | {
2263 | "lastTransitionTime": "2025-11-18T11:52:14Z",
2264 | "message": "Reconciliation finished in 35ms",
2265 | "observedGeneration": 1,
2266 | "reason": "ReconciliationSucceeded",
2267 | "status": "True",
2268 | "type": "Ready"
2269 | }
2270 | ],
2271 | "history": [
2272 | {
2273 | "digest": "sha256:7fa8d9d91bb4e05001d434630939607ab789ffbb8e34e567bb40fb315248c2f4",
2274 | "firstReconciled": "2025-11-01T23:31:39Z",
2275 | "lastReconciled": "2025-11-18T11:52:14Z",
2276 | "lastReconciledDuration": "34.995209ms",
2277 | "lastReconciledStatus": "ReconciliationSucceeded",
2278 | "metadata": {
2279 | "inputs": "1",
2280 | "resources": "3"
2281 | },
2282 | "totalReconciliations": 398
2283 | }
2284 | ],
2285 | "inventory": [
2286 | {
2287 | "apiVersion": "v1",
2288 | "kind": "Namespace",
2289 | "name": "cert-manager",
2290 | "namespace": ""
2291 | },
2292 | {
2293 | "apiVersion": "helm.toolkit.fluxcd.io/v2",
2294 | "kind": "HelmRelease",
2295 | "name": "cert-manager",
2296 | "namespace": "cert-manager"
2297 | },
2298 | {
2299 | "apiVersion": "source.toolkit.fluxcd.io/v1",
2300 | "kind": "OCIRepository",
2301 | "name": "cert-manager",
2302 | "namespace": "cert-manager"
2303 | }
2304 | ],
2305 | "lastAppliedRevision": "sha256:7fa8d9d91bb4e05001d434630939607ab789ffbb8e34e567bb40fb315248c2f4"
2306 | }
2307 | },
2308 | {
2309 | "apiVersion": "fluxcd.controlplane.io/v1",
2310 | "kind": "ResourceSet",
2311 | "metadata": {
2312 | "annotations": {
2313 | "fluxcd.controlplane.io/reconcileTimeout": "7m"
2314 | },
2315 | "name": "cluster-infra",
2316 | "namespace": "flux-system"
2317 | },
2318 | "spec": {
2319 | "inputs": [
2320 | {
2321 | "source": "GitRepository"
2322 | }
2323 | ],
2324 | "resources": [
2325 | {
2326 | "apiVersion": "kustomize.toolkit.fluxcd.io/v1",
2327 | "kind": "Kustomization",
2328 | "metadata": {
2329 | "name": "<< inputs.provider.name >>",
2330 | "namespace": "<< inputs.provider.namespace >>"
2331 | },
2332 | "spec": {
2333 | "healthCheckExprs": [
2334 | {
2335 | "apiVersion": "fluxcd.controlplane.io/v1",
2336 | "current": "status.conditions.filter(c, c.type == 'Ready').all(c, c.status == 'True' && c.observedGeneration == metadata.generation)",
2337 | "kind": "ResourceSet"
2338 | }
2339 | ],
2340 | "interval": "1h",
2341 | "path": "infra",
2342 | "prune": true,
2343 | "retryInterval": "2m",
2344 | "sourceRef": {
2345 | "kind": "<< inputs.source >>",
2346 | "name": "<< inputs.provider.namespace >>"
2347 | },
2348 | "timeout": "6m",
2349 | "wait": true
2350 | }
2351 | }
2352 | ]
2353 | },
2354 | "status": {
2355 | "reconcilerRef": {
2356 | "status": "Ready",
2357 | "message": "Reconciliation finished in 27ms",
2358 | "lastReconciled": "2025-11-18T11:50:16Z",
2359 | "managedBy": "Kustomization/flux-system/flux-system"
2360 | },
2361 | "conditions": [
2362 | {
2363 | "lastTransitionTime": "2025-11-18T11:50:16Z",
2364 | "message": "Reconciliation finished in 27ms",
2365 | "observedGeneration": 1,
2366 | "reason": "ReconciliationSucceeded",
2367 | "status": "True",
2368 | "type": "Ready"
2369 | }
2370 | ],
2371 | "history": [
2372 | {
2373 | "digest": "sha256:3d97f8ccfa15bbfeae07f0b32c618a8a6ba97ac3d3a11c62bf41e1d8c05625a9",
2374 | "firstReconciled": "2025-11-01T23:30:58Z",
2375 | "lastReconciled": "2025-11-18T11:50:16Z",
2376 | "lastReconciledDuration": "26.626ms",
2377 | "lastReconciledStatus": "ReconciliationSucceeded",
2378 | "metadata": {
2379 | "inputs": "1",
2380 | "resources": "1"
2381 | },
2382 | "totalReconciliations": 397
2383 | }
2384 | ],
2385 | "inventory": [
2386 | {
2387 | "apiVersion": "kustomize.toolkit.fluxcd.io/v1",
2388 | "kind": "Kustomization",
2389 | "name": "cluster-infra",
2390 | "namespace": "flux-system"
2391 | }
2392 | ],
2393 | "lastAppliedRevision": "sha256:3d97f8ccfa15bbfeae07f0b32c618a8a6ba97ac3d3a11c62bf41e1d8c05625a9"
2394 | }
2395 | },
2396 | {
2397 | "apiVersion": "fluxcd.controlplane.io/v1",
2398 | "kind": "ResourceSet",
2399 | "metadata": {
2400 | "annotations": {
2401 | "fluxcd.controlplane.io/reconcileTimeout": "5m"
2402 | },
2403 | "labels": {
2404 | "app.kubernetes.io/instance": "flux-operator",
2405 | "app.kubernetes.io/name": "flux-operator"
2406 | },
2407 | "name": "flux-operator",
2408 | "namespace": "flux-system"
2409 | },
2410 | "spec": {
2411 | "inputs": [
2412 | {
2413 | "interval": "1h",
2414 | "url": "oci://ghcr.io/controlplaneio-fluxcd/flux-operator-manifests"
2415 | }
2416 | ],
2417 | "resources": [
2418 | {
2419 | "apiVersion": "source.toolkit.fluxcd.io/v1",
2420 | "kind": "OCIRepository",
2421 | "metadata": {
2422 | "name": "<< inputs.provider.name >>",
2423 | "namespace": "<< inputs.provider.namespace >>"
2424 | },
2425 | "spec": {
2426 | "interval": "<< inputs.interval | quote >>",
2427 | "ref": {
2428 | "tag": "latest"
2429 | },
2430 | "url": "<< inputs.url | quote >>"
2431 | }
2432 | },
2433 | {
2434 | "apiVersion": "kustomize.toolkit.fluxcd.io/v1",
2435 | "kind": "Kustomization",
2436 | "metadata": {
2437 | "name": "<< inputs.provider.name >>",
2438 | "namespace": "<< inputs.provider.namespace >>"
2439 | },
2440 | "spec": {
2441 | "commonMetadata": {
2442 | "labels": {
2443 | "app.kubernetes.io/instance": "flux-operator",
2444 | "app.kubernetes.io/name": "flux-operator"
2445 | }
2446 | },
2447 | "deletionPolicy": "Orphan",
2448 | "force": true,
2449 | "interval": "24h",
2450 | "patches": [
2451 | {
2452 | "patch": "- op: replace\n path: \"/spec/selector/matchLabels\"\n value:\n app.kubernetes.io/name: flux-operator\n app.kubernetes.io/instance: flux-operator\n- op: replace\n path: \"/spec/template/metadata/labels\"\n value:\n app.kubernetes.io/name: flux-operator\n app.kubernetes.io/instance: flux-operator\n- op: add\n path: \"/spec/template/spec/containers/0/env/-\"\n value:\n name: REPORTING_INTERVAL\n value: \"30s\"",
2453 | "target": {
2454 | "kind": "Deployment"
2455 | }
2456 | }
2457 | ],
2458 | "path": "./flux-operator",
2459 | "prune": true,
2460 | "retryInterval": "5m",
2461 | "serviceAccountName": "<< inputs.provider.name >>",
2462 | "sourceRef": {
2463 | "kind": "OCIRepository",
2464 | "name": "<< inputs.provider.name >>"
2465 | },
2466 | "timeout": "5m",
2467 | "wait": true
2468 | }
2469 | }
2470 | ],
2471 | "wait": true
2472 | },
2473 | "status": {
2474 | "reconcilerRef": {
2475 | "status": "Ready",
2476 | "message": "Reconciliation finished in 35ms",
2477 | "lastReconciled": "2025-11-18T11:30:52Z",
2478 | "managedBy": "Kustomization/flux-system/flux-system"
2479 | },
2480 | "conditions": [
2481 | {
2482 | "lastTransitionTime": "2025-11-18T11:30:52Z",
2483 | "message": "Reconciliation finished in 35ms",
2484 | "observedGeneration": 1,
2485 | "reason": "ReconciliationSucceeded",
2486 | "status": "True",
2487 | "type": "Ready"
2488 | }
2489 | ],
2490 | "history": [
2491 | {
2492 | "digest": "sha256:a324112e52314cc034cacda5c32d623d72fd952b2594149334d1823dd8df21ce",
2493 | "firstReconciled": "2025-11-01T23:31:16Z",
2494 | "lastReconciled": "2025-11-18T11:30:52Z",
2495 | "lastReconciledDuration": "35.366792ms",
2496 | "lastReconciledStatus": "ReconciliationSucceeded",
2497 | "metadata": {
2498 | "inputs": "1",
2499 | "resources": "2"
2500 | },
2501 | "totalReconciliations": 397
2502 | },
2503 | {
2504 | "digest": "sha256:3a9e7101640ce2cbe3c61e846863386fb388d999e987476b756dd2a68d99f5f2",
2505 | "firstReconciled": "2025-11-11T14:06:19Z",
2506 | "lastReconciled": "2025-11-11T14:11:19Z",
2507 | "lastReconciledDuration": "5m0.047161594s",
2508 | "lastReconciledStatus": "ReconciliationFailed",
2509 | "metadata": {
2510 | "inputs": "1",
2511 | "resources": "2"
2512 | },
2513 | "totalReconciliations": 2
2514 | }
2515 | ],
2516 | "inventory": [
2517 | {
2518 | "apiVersion": "kustomize.toolkit.fluxcd.io/v1",
2519 | "kind": "Kustomization",
2520 | "name": "flux-operator",
2521 | "namespace": "flux-system"
2522 | },
2523 | {
2524 | "apiVersion": "source.toolkit.fluxcd.io/v1",
2525 | "kind": "OCIRepository",
2526 | "name": "flux-operator",
2527 | "namespace": "flux-system"
2528 | }
2529 | ],
2530 | "lastAppliedRevision": "sha256:a324112e52314cc034cacda5c32d623d72fd952b2594149334d1823dd8df21ce"
2531 | }
2532 | },
2533 | {
2534 | "apiVersion": "fluxcd.controlplane.io/v1",
2535 | "kind": "ResourceSet",
2536 | "metadata": {
2537 | "annotations": {
2538 | "fluxcd.controlplane.io/reconcile": "enabled",
2539 | "fluxcd.controlplane.io/reconcileTimeout": "5m",
2540 | },
2541 | "name": "flux-status-server",
2542 | "namespace": "flux-system"
2543 | },
2544 | "spec": {
2545 | "commonMetadata": {
2546 | "labels": {
2547 | "app.kubernetes.io/name": "flux-status-server"
2548 | }
2549 | },
2550 | "dependsOn": [
2551 | {
2552 | "apiVersion": "tailscale.com/v1alpha1",
2553 | "kind": "ProxyGroup",
2554 | "name": "homelab-ingress",
2555 | "ready": true,
2556 | "readyExpr": "status.conditions.filter(c, c.type == 'ProxyGroupReady').all(c, c.status == 'True')"
2557 | }
2558 | ],
2559 | "inputsFrom": [
2560 | {
2561 | "kind": "ResourceSetInputProvider",
2562 | "name": "flux-status-server"
2563 | }
2564 | ],
2565 | "resources": [
2566 | {
2567 | "apiVersion": "apps/v1",
2568 | "kind": "Deployment",
2569 | "metadata": {
2570 | "name": "flux-status-server",
2571 | "namespace": "<< inputs.provider.namespace >>"
2572 | },
2573 | "spec": {
2574 | "selector": {
2575 | "matchLabels": {
2576 | "app.kubernetes.io/name": "flux-status-server"
2577 | }
2578 | },
2579 | "template": {
2580 | "metadata": {
2581 | "annotations": {
2582 | "prometheus.io/port": "9797",
2583 | "prometheus.io/scrape": "true"
2584 | },
2585 | "labels": {
2586 | "app.kubernetes.io/name": "flux-status-server"
2587 | }
2588 | },
2589 | "spec": {
2590 | "containers": [
2591 | {
2592 | "args": [
2593 | "--web-server-only",
2594 | "--web-server-port=9080"
2595 | ],
2596 | "image": "homelab-registry.tailbeb47.ts.net/flux-operator:<< inputs.tag >>@<< inputs.digest >>",
2597 | "imagePullPolicy": "IfNotPresent",
2598 | "livenessProbe": {
2599 | "httpGet": {
2600 | "path": "/healthz",
2601 | "port": 8081
2602 | }
2603 | },
2604 | "name": "server",
2605 | "ports": [
2606 | {
2607 | "containerPort": 9080,
2608 | "name": "http-web",
2609 | "protocol": "TCP"
2610 | },
2611 | {
2612 | "containerPort": 8080,
2613 | "name": "http-metrics",
2614 | "protocol": "TCP"
2615 | },
2616 | {
2617 | "containerPort": 8081,
2618 | "name": "http",
2619 | "protocol": "TCP"
2620 | }
2621 | ],
2622 | "readinessProbe": {
2623 | "httpGet": {
2624 | "path": "/readyz",
2625 | "port": 8081
2626 | }
2627 | },
2628 | "resources": {
2629 | "limits": {
2630 | "cpu": "2000m",
2631 | "memory": "512Mi"
2632 | },
2633 | "requests": {
2634 | "cpu": "100m",
2635 | "memory": "64Mi"
2636 | }
2637 | },
2638 | "securityContext": {
2639 | "allowPrivilegeEscalation": false,
2640 | "capabilities": {
2641 | "drop": [
2642 | "ALL"
2643 | ]
2644 | },
2645 | "readOnlyRootFilesystem": true,
2646 | "runAsNonRoot": true
2647 | },
2648 | "volumeMounts": [
2649 | {
2650 | "mountPath": "/data",
2651 | "name": "data"
2652 | }
2653 | ]
2654 | }
2655 | ],
2656 | "securityContext": {
2657 | "fsGroup": 65534,
2658 | "runAsNonRoot": true,
2659 | "runAsUser": 65534,
2660 | "seccompProfile": {
2661 | "type": "RuntimeDefault"
2662 | }
2663 | },
2664 | "serviceAccountName": "flux-operator",
2665 | "volumes": [
2666 | {
2667 | "emptyDir": {},
2668 | "name": "data"
2669 | }
2670 | ]
2671 | }
2672 | }
2673 | }
2674 | },
2675 | {
2676 | "apiVersion": "v1",
2677 | "kind": "Service",
2678 | "metadata": {
2679 | "name": "flux-status-server",
2680 | "namespace": "<< inputs.provider.namespace >>"
2681 | },
2682 | "spec": {
2683 | "ports": [
2684 | {
2685 | "name": "http",
2686 | "port": 9080,
2687 | "protocol": "TCP",
2688 | "targetPort": 9080
2689 | }
2690 | ],
2691 | "selector": {
2692 | "app.kubernetes.io/name": "flux-status-server"
2693 | },
2694 | "type": "ClusterIP"
2695 | }
2696 | },
2697 | {
2698 | "apiVersion": "networking.k8s.io/v1",
2699 | "kind": "Ingress",
2700 | "metadata": {
2701 | "annotations": {
2702 | "tailscale.com/proxy-group": "homelab-ingress"
2703 | },
2704 | "name": "<< inputs.provider.name >>",
2705 | "namespace": "<< inputs.provider.namespace >>"
2706 | },
2707 | "spec": {
2708 | "defaultBackend": {
2709 | "service": {
2710 | "name": "<< inputs.provider.name >>",
2711 | "port": {
2712 | "number": 9080
2713 | }
2714 | }
2715 | },
2716 | "ingressClassName": "tailscale",
2717 | "tls": [
2718 | {
2719 | "hosts": [
2720 | "homelab-status-page"
2721 | ]
2722 | }
2723 | ]
2724 | }
2725 | },
2726 | {
2727 | "apiVersion": "networking.k8s.io/v1",
2728 | "kind": "NetworkPolicy",
2729 | "metadata": {
2730 | "name": "<< inputs.provider.name >>",
2731 | "namespace": "<< inputs.provider.namespace >>"
2732 | },
2733 | "spec": {
2734 | "ingress": [
2735 | {
2736 | "from": [
2737 | {
2738 | "namespaceSelector": {}
2739 | }
2740 | ]
2741 | }
2742 | ],
2743 | "podSelector": {
2744 | "matchLabels": {
2745 | "app.kubernetes.io/name": "<< inputs.provider.name >>"
2746 | }
2747 | },
2748 | "policyTypes": [
2749 | "Ingress"
2750 | ]
2751 | }
2752 | }
2753 | ],
2754 | "wait": true
2755 | },
2756 | "status": {
2757 | "reconcilerRef": {
2758 | "status": "Ready",
2759 | "message": "Reconciliation finished in 50ms",
2760 | "lastReconciled": "2025-11-18T11:39:39Z",
2761 | "managedBy": "Kustomization/flux-system/flux-system"
2762 | },
2763 | "inputProviderRefs":[
2764 | {
2765 | "type":"OCIArtifactTag",
2766 | "name":"flux-status-server",
2767 | "namespace":"flux-system"
2768 | }
2769 | ],
2770 | "conditions": [
2771 | {
2772 | "lastTransitionTime": "2025-11-18T11:39:39Z",
2773 | "message": "Reconciliation finished in 50ms",
2774 | "observedGeneration": 5,
2775 | "reason": "ReconciliationSucceeded",
2776 | "status": "True",
2777 | "type": "Ready"
2778 | }
2779 | ],
2780 | "history": [
2781 | {
2782 | "digest": "sha256:5ffcfb1437cd080bdb2666161275b38461bb115c75117f6f40a5eb07347b989b",
2783 | "firstReconciled": "2025-11-17T23:00:11Z",
2784 | "lastReconciled": "2025-11-18T11:39:39Z",
2785 | "lastReconciledDuration": "49.805625ms",
2786 | "lastReconciledStatus": "ReconciliationSucceeded",
2787 | "metadata": {
2788 | "inputs": "1",
2789 | "resources": "4"
2790 | },
2791 | "totalReconciliations": 14
2792 | },
2793 | {
2794 | "digest": "sha256:20c7b71ba21561fb47538bb33bc3e5fbc57fadfe7ed87e24a6eeb29607ed6f52",
2795 | "firstReconciled": "2025-11-17T11:14:42Z",
2796 | "lastReconciled": "2025-11-17T22:35:06Z",
2797 | "lastReconciledDuration": "51.145541ms",
2798 | "lastReconciledStatus": "ReconciliationSucceeded",
2799 | "metadata": {
2800 | "inputs": "1",
2801 | "resources": "4"
2802 | },
2803 | "totalReconciliations": 13
2804 | },
2805 | {
2806 | "digest": "sha256:fa6bb5c1686a49103f2560c553dce70599dc7827a89b217031fbe063ea3e81a4",
2807 | "firstReconciled": "2025-11-17T00:54:25Z",
2808 | "lastReconciled": "2025-11-17T10:40:44Z",
2809 | "lastReconciledDuration": "50.215125ms",
2810 | "lastReconciledStatus": "ReconciliationSucceeded",
2811 | "metadata": {
2812 | "inputs": "1",
2813 | "resources": "4"
2814 | },
2815 | "totalReconciliations": 11
2816 | },
2817 | {
2818 | "digest": "sha256:3c34079b744ee4dd9f1cd6f6ecfba696d61d53016a2aae175955b4c1c7d3dc29",
2819 | "firstReconciled": "2025-11-06T21:35:38Z",
2820 | "lastReconciled": "2025-11-17T00:34:50Z",
2821 | "lastReconciledDuration": "54.078459ms",
2822 | "lastReconciledStatus": "ReconciliationSucceeded",
2823 | "metadata": {
2824 | "inputs": "1",
2825 | "resources": "4"
2826 | },
2827 | "totalReconciliations": 246
2828 | },
2829 | {
2830 | "digest": "sha256:9d5d73e9806e24c731cfac9bddfa40c2f14bd26b983ff9c08b7bc2a38f3cc503",
2831 | "firstReconciled": "2025-11-06T21:29:37Z",
2832 | "lastReconciled": "2025-11-06T21:33:01Z",
2833 | "lastReconciledDuration": "29.65225ms",
2834 | "lastReconciledStatus": "ReconciliationFailed",
2835 | "metadata": {
2836 | "inputs": "1",
2837 | "resources": "4"
2838 | },
2839 | "totalReconciliations": 10
2840 | }
2841 | ],
2842 | "inventory": [
2843 | {
2844 | "apiVersion": "v1",
2845 | "kind": "Service",
2846 | "name": "flux-status-server",
2847 | "namespace": "flux-system"
2848 | },
2849 | {
2850 | "apiVersion": "apps/v1",
2851 | "kind": "Deployment",
2852 | "name": "flux-status-server",
2853 | "namespace": "flux-system"
2854 | },
2855 | {
2856 | "apiVersion": "networking.k8s.io/v1",
2857 | "kind": "Ingress",
2858 | "name": "flux-status-server",
2859 | "namespace": "flux-system"
2860 | },
2861 | {
2862 | "apiVersion": "networking.k8s.io/v1",
2863 | "kind": "NetworkPolicy",
2864 | "name": "flux-status-server",
2865 | "namespace": "flux-system"
2866 | }
2867 | ],
2868 | "lastAppliedRevision": "sha256:5ffcfb1437cd080bdb2666161275b38461bb115c75117f6f40a5eb07347b989b",
2869 | "lastHandledReconcileAt": "2025-11-06T23:33:00.823725+02:00"
2870 | }
2871 | },
2872 | {
2873 | "apiVersion": "fluxcd.controlplane.io/v1",
2874 | "kind": "ResourceSet",
2875 | "metadata": {
2876 | "annotations": {
2877 | "fluxcd.controlplane.io/reconcileTimeout": "5m"
2878 | },
2879 | "name": "metrics-server",
2880 | "namespace": "flux-system"
2881 | },
2882 | "spec": {
2883 | "commonMetadata": {
2884 | "labels": {
2885 | "app.kubernetes.io/name": "metrics-server"
2886 | }
2887 | },
2888 | "dependsOn": [
2889 | {
2890 | "apiVersion": "fluxcd.controlplane.io/v1",
2891 | "kind": "ResourceSet",
2892 | "name": "cert-manager",
2893 | "namespace": "flux-system",
2894 | "ready": true
2895 | }
2896 | ],
2897 | "inputs": [
2898 | {
2899 | "namespace": "monitoring",
2900 | "version": "*"
2901 | }
2902 | ],
2903 | "resources": [
2904 | {
2905 | "apiVersion": "v1",
2906 | "kind": "Namespace",
2907 | "metadata": {
2908 | "name": "<< inputs.namespace >>"
2909 | }
2910 | },
2911 | {
2912 | "apiVersion": "source.toolkit.fluxcd.io/v1",
2913 | "kind": "OCIRepository",
2914 | "metadata": {
2915 | "name": "<< inputs.provider.name >>",
2916 | "namespace": "<< inputs.namespace >>"
2917 | },
2918 | "spec": {
2919 | "interval": "24h",
2920 | "layerSelector": {
2921 | "mediaType": "application/vnd.cncf.helm.chart.content.v1.tar+gzip",
2922 | "operation": "copy"
2923 | },
2924 | "ref": {
2925 | "semver": "<< inputs.version | quote >>"
2926 | },
2927 | "url": "oci://ghcr.io/controlplaneio-fluxcd/charts/metrics-server"
2928 | }
2929 | },
2930 | {
2931 | "apiVersion": "helm.toolkit.fluxcd.io/v2",
2932 | "kind": "HelmRelease",
2933 | "metadata": {
2934 | "name": "<< inputs.provider.name >>",
2935 | "namespace": "<< inputs.namespace >>"
2936 | },
2937 | "spec": {
2938 | "chartRef": {
2939 | "kind": "OCIRepository",
2940 | "name": "<< inputs.provider.name >>"
2941 | },
2942 | "install": {
2943 | "strategy": {
2944 | "name": "RetryOnFailure",
2945 | "retryInterval": "2m"
2946 | }
2947 | },
2948 | "interval": "24h",
2949 | "releaseName": "<< inputs.provider.name >>",
2950 | "upgrade": {
2951 | "strategy": {
2952 | "name": "RetryOnFailure",
2953 | "retryInterval": "3m"
2954 | }
2955 | },
2956 | "values": {
2957 | "apiService": {
2958 | "insecureSkipTLSVerify": false
2959 | },
2960 | "args": [
2961 | "--kubelet-insecure-tls"
2962 | ],
2963 | "tls": {
2964 | "type": "cert-manager"
2965 | }
2966 | }
2967 | }
2968 | }
2969 | ],
2970 | "wait": true
2971 | },
2972 | "status": {
2973 | "reconcilerRef": {
2974 | "status": "Ready",
2975 | "message": "Reconciliation finished in 36ms",
2976 | "lastReconciled": "2025-11-18T10:56:54Z",
2977 | "managedBy": "Kustomization/flux-system/flux-system"
2978 | },
2979 | "conditions": [
2980 | {
2981 | "lastTransitionTime": "2025-11-18T10:56:54Z",
2982 | "message": "Reconciliation finished in 36ms",
2983 | "observedGeneration": 1,
2984 | "reason": "ReconciliationSucceeded",
2985 | "status": "True",
2986 | "type": "Ready"
2987 | }
2988 | ],
2989 | "history": [
2990 | {
2991 | "digest": "sha256:a2e6b4e28249995ae6a7e25b687b39f6b18101c1405391466a0cba1054c58603",
2992 | "firstReconciled": "2025-11-01T23:32:15Z",
2993 | "lastReconciled": "2025-11-18T10:56:54Z",
2994 | "lastReconciledDuration": "36.074834ms",
2995 | "lastReconciledStatus": "ReconciliationSucceeded",
2996 | "metadata": {
2997 | "inputs": "1",
2998 | "resources": "3"
2999 | },
3000 | "totalReconciliations": 396
3001 | }
3002 | ],
3003 | "inventory": [
3004 | {
3005 | "apiVersion": "v1",
3006 | "kind": "Namespace",
3007 | "name": "monitoring",
3008 | "namespace": ""
3009 | },
3010 | {
3011 | "apiVersion": "helm.toolkit.fluxcd.io/v2",
3012 | "kind": "HelmRelease",
3013 | "name": "metrics-server",
3014 | "namespace": "monitoring"
3015 | },
3016 | {
3017 | "apiVersion": "source.toolkit.fluxcd.io/v1",
3018 | "kind": "OCIRepository",
3019 | "name": "metrics-server",
3020 | "namespace": "monitoring"
3021 | }
3022 | ],
3023 | "lastAppliedRevision": "sha256:a2e6b4e28249995ae6a7e25b687b39f6b18101c1405391466a0cba1054c58603"
3024 | }
3025 | },
3026 | {
3027 | "apiVersion": "fluxcd.controlplane.io/v1",
3028 | "kind": "ResourceSet",
3029 | "metadata": {
3030 | "annotations": {
3031 | "fluxcd.controlplane.io/reconcileTimeout": "5m"
3032 | },
3033 | "name": "tailscale-config",
3034 | "namespace": "flux-system"
3035 | },
3036 | "spec": {
3037 | "commonMetadata": {
3038 | "labels": {
3039 | "app.kubernetes.io/name": "tailscale"
3040 | }
3041 | },
3042 | "dependsOn": [
3043 | {
3044 | "apiVersion": "fluxcd.controlplane.io/v1",
3045 | "kind": "ResourceSet",
3046 | "name": "tailscale-operator",
3047 | "namespace": "flux-system",
3048 | "ready": true
3049 | }
3050 | ],
3051 | "inputs": [
3052 | {
3053 | "hostnamePrefix": "homelab",
3054 | "user": "stefanprodan@github"
3055 | }
3056 | ],
3057 | "resources": [
3058 | {
3059 | "apiVersion": "rbac.authorization.k8s.io/v1",
3060 | "kind": "ClusterRoleBinding",
3061 | "metadata": {
3062 | "name": "homelab-cluster-admin"
3063 | },
3064 | "roleRef": {
3065 | "apiGroup": "rbac.authorization.k8s.io",
3066 | "kind": "ClusterRole",
3067 | "name": "cluster-admin"
3068 | },
3069 | "subjects": [
3070 | {
3071 | "apiGroup": "rbac.authorization.k8s.io",
3072 | "kind": "User",
3073 | "name": "<< inputs.user >>"
3074 | }
3075 | ]
3076 | },
3077 | {
3078 | "apiVersion": "tailscale.com/v1alpha1",
3079 | "kind": "ProxyGroup",
3080 | "metadata": {
3081 | "name": "<< inputs.hostnamePrefix >>-cluster"
3082 | },
3083 | "spec": {
3084 | "kubeAPIServer": {
3085 | "mode": "auth"
3086 | },
3087 | "replicas": 1,
3088 | "tags": [
3089 | "tag:k8s"
3090 | ],
3091 | "type": "kube-apiserver"
3092 | }
3093 | },
3094 | {
3095 | "apiVersion": "tailscale.com/v1alpha1",
3096 | "kind": "ProxyGroup",
3097 | "metadata": {
3098 | "name": "<< inputs.hostnamePrefix >>-ingress"
3099 | },
3100 | "spec": {
3101 | "replicas": 1,
3102 | "tags": [
3103 | "tag:k8s"
3104 | ],
3105 | "type": "ingress"
3106 | }
3107 | }
3108 | ]
3109 | },
3110 | "status": {
3111 | "reconcilerRef": {
3112 | "status": "Ready",
3113 | "message": "Reconciliation finished in 31ms",
3114 | "lastReconciled": "2025-11-18T11:25:10Z",
3115 | "managedBy": "Kustomization/flux-system/flux-system"
3116 | },
3117 | "conditions": [
3118 | {
3119 | "lastTransitionTime": "2025-11-18T11:25:10Z",
3120 | "message": "Reconciliation finished in 31ms",
3121 | "observedGeneration": 2,
3122 | "reason": "ReconciliationSucceeded",
3123 | "status": "True",
3124 | "type": "Ready"
3125 | }
3126 | ],
3127 | "history": [
3128 | {
3129 | "digest": "sha256:2ba728f62df1f679a2d472c9fb24bf46daffe0f80129c30fc334f5fe3169619f",
3130 | "firstReconciled": "2025-11-01T23:31:19Z",
3131 | "lastReconciled": "2025-11-18T11:25:10Z",
3132 | "lastReconciledDuration": "30.827166ms",
3133 | "lastReconciledStatus": "ReconciliationSucceeded",
3134 | "metadata": {
3135 | "inputs": "1",
3136 | "resources": "3"
3137 | },
3138 | "totalReconciliations": 398
3139 | }
3140 | ],
3141 | "inventory": [
3142 | {
3143 | "apiVersion": "rbac.authorization.k8s.io/v1",
3144 | "kind": "ClusterRoleBinding",
3145 | "name": "homelab-cluster-admin",
3146 | "namespace": ""
3147 | },
3148 | {
3149 | "apiVersion": "tailscale.com/v1alpha1",
3150 | "kind": "ProxyGroup",
3151 | "name": "homelab-cluster",
3152 | "namespace": ""
3153 | },
3154 | {
3155 | "apiVersion": "tailscale.com/v1alpha1",
3156 | "kind": "ProxyGroup",
3157 | "name": "homelab-ingress",
3158 | "namespace": ""
3159 | }
3160 | ],
3161 | "lastAppliedRevision": "sha256:2ba728f62df1f679a2d472c9fb24bf46daffe0f80129c30fc334f5fe3169619f"
3162 | }
3163 | },
3164 | {
3165 | "apiVersion": "fluxcd.controlplane.io/v1",
3166 | "kind": "ResourceSet",
3167 | "metadata": {
3168 | "annotations": {
3169 | "fluxcd.controlplane.io/reconcileTimeout": "5m"
3170 | },
3171 | "name": "tailscale-operator",
3172 | "namespace": "flux-system"
3173 | },
3174 | "spec": {
3175 | "commonMetadata": {
3176 | "labels": {
3177 | "app.kubernetes.io/name": "tailscale"
3178 | }
3179 | },
3180 | "inputs": [
3181 | {
3182 | "hostnamePrefix": "homelab",
3183 | "namespace": "tailscale",
3184 | "version": "*"
3185 | }
3186 | ],
3187 | "resources": [
3188 | {
3189 | "apiVersion": "v1",
3190 | "kind": "Namespace",
3191 | "metadata": {
3192 | "name": "<< inputs.namespace >>"
3193 | }
3194 | },
3195 | {
3196 | "apiVersion": "v1",
3197 | "kind": "Secret",
3198 | "metadata": {
3199 | "annotations": {
3200 | "fluxcd.controlplane.io/copyFrom": "flux-system/tailscale-oauth"
3201 | },
3202 | "name": "operator-oauth",
3203 | "namespace": "<< inputs.namespace >>"
3204 | }
3205 | },
3206 | {
3207 | "apiVersion": "source.toolkit.fluxcd.io/v1",
3208 | "kind": "HelmRepository",
3209 | "metadata": {
3210 | "name": "<< inputs.provider.name >>",
3211 | "namespace": "<< inputs.namespace >>"
3212 | },
3213 | "spec": {
3214 | "interval": "24h",
3215 | "url": "https://pkgs.tailscale.com/helmcharts"
3216 | }
3217 | },
3218 | {
3219 | "apiVersion": "helm.toolkit.fluxcd.io/v2",
3220 | "kind": "HelmRelease",
3221 | "metadata": {
3222 | "name": "<< inputs.provider.name >>",
3223 | "namespace": "<< inputs.namespace >>"
3224 | },
3225 | "spec": {
3226 | "chart": {
3227 | "spec": {
3228 | "chart": "tailscale-operator",
3229 | "interval": "24h",
3230 | "sourceRef": {
3231 | "kind": "HelmRepository",
3232 | "name": "<< inputs.provider.name >>"
3233 | },
3234 | "version": "*"
3235 | }
3236 | },
3237 | "install": {
3238 | "strategy": {
3239 | "name": "RetryOnFailure",
3240 | "retryInterval": "2m"
3241 | }
3242 | },
3243 | "interval": "24h",
3244 | "releaseName": "<< inputs.provider.name >>",
3245 | "upgrade": {
3246 | "strategy": {
3247 | "name": "RetryOnFailure",
3248 | "retryInterval": "3m"
3249 | }
3250 | },
3251 | "values": {
3252 | "apiServerProxyConfig": {
3253 | "allowImpersonation": "true",
3254 | "mode": "false"
3255 | },
3256 | "operatorConfig": {
3257 | "hostname": "<< inputs.hostnamePrefix >>-operator"
3258 | },
3259 | "resources": {
3260 | "limits": {
3261 | "cpu": "2000m",
3262 | "memory": "1Gi"
3263 | },
3264 | "requests": {
3265 | "cpu": "100m",
3266 | "memory": "128Mi"
3267 | }
3268 | }
3269 | }
3270 | }
3271 | }
3272 | ],
3273 | "wait": true
3274 | },
3275 | "status": {
3276 | "reconcilerRef": {
3277 | "status": "Ready",
3278 | "message": "Reconciliation finished in 43ms",
3279 | "lastReconciled": "2025-11-18T11:52:24Z",
3280 | "managedBy": "Kustomization/flux-system/flux-system"
3281 | },
3282 | "conditions": [
3283 | {
3284 | "lastTransitionTime": "2025-11-18T11:52:24Z",
3285 | "message": "Reconciliation finished in 43ms",
3286 | "observedGeneration": 2,
3287 | "reason": "ReconciliationSucceeded",
3288 | "status": "True",
3289 | "type": "Ready"
3290 | }
3291 | ],
3292 | "history": [
3293 | {
3294 | "digest": "sha256:35c7432bd251f8eec9a71f0937ac33c9ca086702e340992c56a1a977a65cfeae",
3295 | "firstReconciled": "2025-11-01T23:31:14Z",
3296 | "lastReconciled": "2025-11-18T11:52:24Z",
3297 | "lastReconciledDuration": "43.119459ms",
3298 | "lastReconciledStatus": "ReconciliationSucceeded",
3299 | "metadata": {
3300 | "inputs": "1",
3301 | "resources": "4"
3302 | },
3303 | "totalReconciliations": 398
3304 | }
3305 | ],
3306 | "inventory": [
3307 | {
3308 | "apiVersion": "v1",
3309 | "kind": "Namespace",
3310 | "name": "tailscale",
3311 | "namespace": ""
3312 | },
3313 | {
3314 | "apiVersion": "v1",
3315 | "kind": "Secret",
3316 | "name": "operator-oauth",
3317 | "namespace": "tailscale"
3318 | },
3319 | {
3320 | "apiVersion": "helm.toolkit.fluxcd.io/v2",
3321 | "kind": "HelmRelease",
3322 | "name": "tailscale-operator",
3323 | "namespace": "tailscale"
3324 | },
3325 | {
3326 | "apiVersion": "source.toolkit.fluxcd.io/v1",
3327 | "kind": "HelmRepository",
3328 | "name": "tailscale-operator",
3329 | "namespace": "tailscale"
3330 | }
3331 | ],
3332 | "lastAppliedRevision": "sha256:35c7432bd251f8eec9a71f0937ac33c9ca086702e340992c56a1a977a65cfeae"
3333 | }
3334 | },
3335 | {
3336 | "apiVersion": "fluxcd.controlplane.io/v1",
3337 | "kind": "ResourceSet",
3338 | "metadata": {
3339 | "annotations": {
3340 | "fluxcd.controlplane.io/reconcileTimeout": "5m"
3341 | },
3342 | "name": "zot-registry",
3343 | "namespace": "flux-system"
3344 | },
3345 | "spec": {
3346 | "commonMetadata": {
3347 | "labels": {
3348 | "app.kubernetes.io/name": "zot"
3349 | }
3350 | },
3351 | "dependsOn": [
3352 | {
3353 | "apiVersion": "tailscale.com/v1alpha1",
3354 | "kind": "ProxyGroup",
3355 | "name": "homelab-ingress",
3356 | "ready": true,
3357 | "readyExpr": "status.conditions.filter(c, c.type == 'ProxyGroupReady').all(c, c.status == 'True')"
3358 | }
3359 | ],
3360 | "inputs": [
3361 | {
3362 | "hostnamePrefix": "homelab",
3363 | "namespace": "registry",
3364 | "version": "*"
3365 | }
3366 | ],
3367 | "resources": [
3368 | {
3369 | "apiVersion": "v1",
3370 | "kind": "Namespace",
3371 | "metadata": {
3372 | "name": "<< inputs.namespace >>"
3373 | }
3374 | },
3375 | {
3376 | "apiVersion": "source.toolkit.fluxcd.io/v1",
3377 | "kind": "HelmRepository",
3378 | "metadata": {
3379 | "name": "<< inputs.provider.name >>",
3380 | "namespace": "<< inputs.namespace >>"
3381 | },
3382 | "spec": {
3383 | "interval": "24h",
3384 | "url": "https://zotregistry.dev/helm-charts"
3385 | }
3386 | },
3387 | {
3388 | "apiVersion": "helm.toolkit.fluxcd.io/v2",
3389 | "kind": "HelmRelease",
3390 | "metadata": {
3391 | "name": "<< inputs.provider.name >>",
3392 | "namespace": "<< inputs.namespace >>"
3393 | },
3394 | "spec": {
3395 | "chart": {
3396 | "spec": {
3397 | "chart": "zot",
3398 | "interval": "24h",
3399 | "sourceRef": {
3400 | "kind": "HelmRepository",
3401 | "name": "<< inputs.provider.name >>"
3402 | },
3403 | "version": "*"
3404 | }
3405 | },
3406 | "install": {
3407 | "strategy": {
3408 | "name": "RetryOnFailure",
3409 | "retryInterval": "2m"
3410 | }
3411 | },
3412 | "interval": "24h",
3413 | "releaseName": "<< inputs.provider.name >>",
3414 | "upgrade": {
3415 | "strategy": {
3416 | "name": "RetryOnFailure",
3417 | "retryInterval": "3m"
3418 | }
3419 | },
3420 | "values": {
3421 | "fullnameOverride": "<< inputs.provider.name >>",
3422 | "persistence": true,
3423 | "pvc": {
3424 | "create": true,
3425 | "storage": "20Gi",
3426 | "storageClassName": "standard"
3427 | },
3428 | "resources": {
3429 | "limits": {
3430 | "cpu": "2000m",
3431 | "memory": "1Gi"
3432 | },
3433 | "requests": {
3434 | "cpu": "100m",
3435 | "memory": "128Mi"
3436 | }
3437 | },
3438 | "service": {
3439 | "port": 80,
3440 | "type": "ClusterIP"
3441 | },
3442 | "strategy": {
3443 | "type": "Recreate"
3444 | }
3445 | }
3446 | }
3447 | },
3448 | {
3449 | "apiVersion": "networking.k8s.io/v1",
3450 | "kind": "Ingress",
3451 | "metadata": {
3452 | "annotations": {
3453 | "tailscale.com/proxy-group": "<< inputs.hostnamePrefix >>-ingress"
3454 | },
3455 | "name": "<< inputs.provider.name >>",
3456 | "namespace": "<< inputs.namespace >>"
3457 | },
3458 | "spec": {
3459 | "defaultBackend": {
3460 | "service": {
3461 | "name": "<< inputs.provider.name >>",
3462 | "port": {
3463 | "number": 80
3464 | }
3465 | }
3466 | },
3467 | "ingressClassName": "tailscale",
3468 | "tls": [
3469 | {
3470 | "hosts": [
3471 | "<< inputs.hostnamePrefix >>-registry"
3472 | ]
3473 | }
3474 | ]
3475 | }
3476 | }
3477 | ],
3478 | "wait": true
3479 | },
3480 | "status": {
3481 | "reconcilerRef": {
3482 | "status": "Ready",
3483 | "message": "Reconciliation finished in 41ms",
3484 | "lastReconciled": "2025-11-18T10:54:54Z",
3485 | "managedBy": "Kustomization/flux-system/flux-system"
3486 | },
3487 | "conditions": [
3488 | {
3489 | "lastTransitionTime": "2025-11-18T10:54:54Z",
3490 | "message": "Reconciliation finished in 41ms",
3491 | "observedGeneration": 3,
3492 | "reason": "ReconciliationSucceeded",
3493 | "status": "True",
3494 | "type": "Ready"
3495 | }
3496 | ],
3497 | "history": [
3498 | {
3499 | "digest": "sha256:b08adacc97ecc5b817ea654e7f091944304caca48a6e40334423b6a3dc416fc9",
3500 | "firstReconciled": "2025-11-02T08:48:54Z",
3501 | "lastReconciled": "2025-11-18T10:54:54Z",
3502 | "lastReconciledDuration": "41.419084ms",
3503 | "lastReconciledStatus": "ReconciliationSucceeded",
3504 | "metadata": {
3505 | "inputs": "1",
3506 | "resources": "4"
3507 | },
3508 | "totalReconciliations": 388
3509 | },
3510 | {
3511 | "digest": "sha256:c260cf7082af1c618deaba00548d3c135969f2aa4a63b643698ca4c01588084b",
3512 | "firstReconciled": "2025-11-01T23:32:20Z",
3513 | "lastReconciled": "2025-11-02T08:34:57Z",
3514 | "lastReconciledDuration": "39.261875ms",
3515 | "lastReconciledStatus": "ReconciliationSucceeded",
3516 | "metadata": {
3517 | "inputs": "1",
3518 | "resources": "4"
3519 | },
3520 | "totalReconciliations": 10
3521 | }
3522 | ],
3523 | "inventory": [
3524 | {
3525 | "apiVersion": "v1",
3526 | "kind": "Namespace",
3527 | "name": "registry",
3528 | "namespace": ""
3529 | },
3530 | {
3531 | "apiVersion": "helm.toolkit.fluxcd.io/v2",
3532 | "kind": "HelmRelease",
3533 | "name": "zot-registry",
3534 | "namespace": "registry"
3535 | },
3536 | {
3537 | "apiVersion": "networking.k8s.io/v1",
3538 | "kind": "Ingress",
3539 | "name": "zot-registry",
3540 | "namespace": "registry"
3541 | },
3542 | {
3543 | "apiVersion": "source.toolkit.fluxcd.io/v1",
3544 | "kind": "HelmRepository",
3545 | "name": "zot-registry",
3546 | "namespace": "registry"
3547 | }
3548 | ],
3549 | "lastAppliedRevision": "sha256:b08adacc97ecc5b817ea654e7f091944304caca48a6e40334423b6a3dc416fc9"
3550 | }
3551 | },
3552 | {
3553 | "apiVersion": "fluxcd.controlplane.io/v1",
3554 | "kind": "ResourceSetInputProvider",
3555 | "metadata": {
3556 | "annotations": {
3557 | "fluxcd.controlplane.io/reconcileEvery": "5m",
3558 | },
3559 | "name": "flux-status-server",
3560 | "namespace": "flux-system"
3561 | },
3562 | "spec": {
3563 | "filter": {
3564 | "includeTag": "web",
3565 | "limit": 1
3566 | },
3567 | "type": "OCIArtifactTag",
3568 | "url": "oci://homelab-registry.tailbeb47.ts.net/flux-operator"
3569 | },
3570 | "status": {
3571 | "reconcilerRef": {
3572 | "status": "Ready",
3573 | "message": "Reconciliation finished in 207ms",
3574 | "lastReconciled": "2025-11-18T12:15:29Z",
3575 | "managedBy": "Kustomization/flux-system/flux-system"
3576 | },
3577 | "conditions": [
3578 | {
3579 | "lastTransitionTime": "2025-11-18T12:15:29Z",
3580 | "message": "Reconciliation finished in 207ms",
3581 | "observedGeneration": 2,
3582 | "reason": "ReconciliationSucceeded",
3583 | "status": "True",
3584 | "type": "Ready"
3585 | }
3586 | ],
3587 | "exportedInputs": [
3588 | {
3589 | "digest": "sha256:2af20e4de759d1edf881a2ce1c6d2fd8eec830d2f9d43421ec49c2bf7b89975f",
3590 | "id": "43254079",
3591 | "tag": "web"
3592 | }
3593 | ],
3594 | "lastExportedRevision": "sha256:f9680e09616a9d6a36d4e09538a039b1ee5a5c44871196c64b7b05ef45a9c9a0",
3595 | "lastHandledReconcileAt": "2025-11-04T11:31:53.473116+02:00"
3596 | }
3597 | },
3598 | {
3599 | "apiVersion": "source.toolkit.fluxcd.io/v1",
3600 | "kind": "Bucket",
3601 | "metadata": {
3602 | "name": "aws-configs",
3603 | "namespace": "flux-system"
3604 | },
3605 | "spec": {
3606 | "bucketName": "flux-configs",
3607 | "endpoint": "s3.amazonaws.com",
3608 | "interval": "5m0s",
3609 | "provider": "aws",
3610 | "region": "us-east-1"
3611 | },
3612 | "status": {
3613 | "reconcilerRef": {
3614 | "status": "Failed",
3615 | "message": "authentication failed:\nSTS: AssumeRoleWithWebIdentity, https response error\nPost \"https://sts.arn.amazonaws.com/\": dial tcp: lookupts.arn.amazonaws.com on 10.100.0.10:53: no such host",
3616 | "lastReconciled": "2025-11-18T10:30:00Z",
3617 | "managedBy": "Kustomization/flux-system/flux-system"
3618 | },
3619 | "conditions": [
3620 | {
3621 | "lastTransitionTime": "2025-11-18T10:30:00Z",
3622 | "message": "authentication failed:\nSTS: AssumeRoleWithWebIdentity, https response error\nPost \"https://sts.arn.amazonaws.com/\": dial tcp: lookupts.arn.amazonaws.com on 10.100.0.10:53: no such host",
3623 | "observedGeneration": 1,
3624 | "reason": "AuthenticationFailed",
3625 | "status": "False",
3626 | "type": "Ready"
3627 | }
3628 | ],
3629 | "observedGeneration": 1
3630 | }
3631 | },
3632 | {
3633 | "apiVersion": "source.toolkit.fluxcd.io/v1",
3634 | "kind": "Bucket",
3635 | "metadata": {
3636 | "name": "prod-configs",
3637 | "namespace": "flux-system"
3638 | },
3639 | "spec": {
3640 | "bucketName": "prod-configs",
3641 | "endpoint": "s3.amazonaws.com",
3642 | "interval": "10m0s",
3643 | "provider": "aws",
3644 | "region": "us-west-2"
3645 | },
3646 | "status": {
3647 | "reconcilerRef": {
3648 | "status": "Ready",
3649 | "message": "stored artifact for revision 'sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'",
3650 | "lastReconciled": "2025-11-18T08:30:00Z",
3651 | "managedBy": "Kustomization/flux-system/flux-system"
3652 | },
3653 | "artifact": {
3654 | "digest": "sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
3655 | "lastUpdateTime": "2025-11-18T08:30:00Z",
3656 | "path": "bucket/flux-system/prod-configs/e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855.tar.gz",
3657 | "revision": "sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
3658 | "size": 2048,
3659 | "url": "http://source-controller.flux-system.svc.cluster.local./bucket/flux-system/prod-configs/e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855.tar.gz"
3660 | },
3661 | "conditions": [
3662 | {
3663 | "lastTransitionTime": "2025-11-18T08:30:00Z",
3664 | "message": "stored artifact for revision 'sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'",
3665 | "observedGeneration": 1,
3666 | "reason": "Succeeded",
3667 | "status": "True",
3668 | "type": "Ready"
3669 | },
3670 | {
3671 | "lastTransitionTime": "2025-11-18T08:30:00Z",
3672 | "message": "stored artifact for revision 'sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'",
3673 | "observedGeneration": 1,
3674 | "reason": "Succeeded",
3675 | "status": "True",
3676 | "type": "ArtifactInStorage"
3677 | }
3678 | ],
3679 | "observedGeneration": 1,
3680 | "url": "http://source-controller.flux-system.svc.cluster.local./bucket/flux-system/prod-configs/latest.tar.gz"
3681 | }
3682 | },
3683 | {
3684 | "apiVersion": "source.toolkit.fluxcd.io/v1",
3685 | "kind": "Bucket",
3686 | "metadata": {
3687 | "name": "dev-configs",
3688 | "namespace": "flux-system"
3689 | },
3690 | "spec": {
3691 | "bucketName": "dev-configs",
3692 | "endpoint": "s3.amazonaws.com",
3693 | "interval": "5m0s",
3694 | "provider": "aws",
3695 | "region": "us-west-2"
3696 | },
3697 | "status": {
3698 | "reconcilerRef": {
3699 | "status": "Ready",
3700 | "message": "stored artifact for revision 'sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'",
3701 | "lastReconciled": "2025-11-18T11:00:00Z",
3702 | "managedBy": "Kustomization/flux-system/flux-system"
3703 | },
3704 | "artifact": {
3705 | "digest": "sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
3706 | "lastUpdateTime": "2025-11-18T11:00:00Z",
3707 | "path": "bucket/flux-system/dev-configs/e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855.tar.gz",
3708 | "revision": "sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
3709 | "size": 1024,
3710 | "url": "http://source-controller.flux-system.svc.cluster.local./bucket/flux-system/dev-configs/e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855.tar.gz"
3711 | },
3712 | "conditions": [
3713 | {
3714 | "lastTransitionTime": "2025-11-18T11:00:00Z",
3715 | "message": "stored artifact for revision 'sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'",
3716 | "observedGeneration": 1,
3717 | "reason": "Succeeded",
3718 | "status": "True",
3719 | "type": "Ready"
3720 | },
3721 | {
3722 | "lastTransitionTime": "2025-11-18T11:00:00Z",
3723 | "message": "stored artifact for revision 'sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'",
3724 | "observedGeneration": 1,
3725 | "reason": "Succeeded",
3726 | "status": "True",
3727 | "type": "ArtifactInStorage"
3728 | }
3729 | ],
3730 | "observedGeneration": 1,
3731 | "url": "http://source-controller.flux-system.svc.cluster.local./bucket/flux-system/dev-configs/latest.tar.gz"
3732 | }
3733 | },
3734 | {
3735 | "apiVersion": "source.toolkit.fluxcd.io/v1",
3736 | "kind": "Bucket",
3737 | "metadata": {
3738 | "name": "staging-configs",
3739 | "namespace": "flux-system"
3740 | },
3741 | "spec": {
3742 | "bucketName": "staging-configs",
3743 | "endpoint": "s3.amazonaws.com",
3744 | "interval": "5m0s",
3745 | "provider": "aws",
3746 | "region": "eu-west-1"
3747 | },
3748 | "status": {
3749 | "reconcilerRef": {
3750 | "status": "Progressing",
3751 | "message": "reconciliation in progress: fetching artifact",
3752 | "lastReconciled": "2025-11-18T11:00:00Z",
3753 | "managedBy": "Kustomization/flux-system/flux-system"
3754 | },
3755 | "conditions": [
3756 | {
3757 | "lastTransitionTime": "2025-11-18T11:00:00Z",
3758 | "message": "reconciliation in progress: fetching artifact",
3759 | "observedGeneration": 1,
3760 | "reason": "Progressing",
3761 | "status": "Unknown",
3762 | "type": "Ready"
3763 | }
3764 | ],
3765 | "observedGeneration": 1
3766 | }
3767 | },
3768 | {
3769 | "apiVersion": "source.toolkit.fluxcd.io/v1",
3770 | "kind": "Bucket",
3771 | "metadata": {
3772 | "name": "preview-configs",
3773 | "namespace": "flux-system"
3774 | },
3775 | "spec": {
3776 | "bucketName": "preview-configs",
3777 | "endpoint": "s3.amazonaws.com",
3778 | "interval": "10m0s",
3779 | "provider": "aws",
3780 | "region": "us-east-1",
3781 | "suspend": true
3782 | },
3783 | "status": {
3784 | "reconcilerRef": {
3785 | "status": "Suspended",
3786 | "message": "stored artifact for revision 'sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'",
3787 | "lastReconciled": "2025-11-18T09:00:00Z",
3788 | "managedBy": "Kustomization/flux-system/flux-system"
3789 | },
3790 | "artifact": {
3791 | "digest": "sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
3792 | "lastUpdateTime": "2025-11-18T07:00:00Z",
3793 | "path": "bucket/flux-system/preview-configs/e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855.tar.gz",
3794 | "revision": "sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
3795 | "size": 512,
3796 | "url": "http://source-controller.flux-system.svc.cluster.local./bucket/flux-system/preview-configs/e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855.tar.gz"
3797 | },
3798 | "conditions": [
3799 | {
3800 | "lastTransitionTime": "2025-11-18T09:00:00Z",
3801 | "message": "stored artifact for revision 'sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'",
3802 | "observedGeneration": 1,
3803 | "reason": "Succeeded",
3804 | "status": "True",
3805 | "type": "Ready"
3806 | }
3807 | ],
3808 | "observedGeneration": 1,
3809 | "url": "http://source-controller.flux-system.svc.cluster.local./bucket/flux-system/preview-configs/latest.tar.gz"
3810 | }
3811 | },
3812 | {
3813 | "apiVersion": "source.toolkit.fluxcd.io/v1",
3814 | "kind": "Bucket",
3815 | "metadata": {
3816 | "annotations": {
3817 | "kustomize.toolkit.fluxcd.io/ssa": "Ignore"
3818 | },
3819 | "name": "default-configs",
3820 | "namespace": "default"
3821 | },
3822 | "spec": {
3823 | "bucketName": "default-configs",
3824 | "endpoint": "s3.amazonaws.com",
3825 | "interval": "15m0s",
3826 | "provider": "generic"
3827 | },
3828 | "status": {
3829 | "reconcilerRef": {
3830 | "status": "Unknown",
3831 | "message": "No status information available",
3832 | "lastReconciled": "2025-11-18T09:00:00Z",
3833 | "managedBy": "Kustomization/flux-system/flux-system"
3834 | },
3835 | "observedGeneration": -1
3836 | }
3837 | },
3838 | {
3839 | "apiVersion": "notification.toolkit.fluxcd.io/v1beta3",
3840 | "kind": "Alert",
3841 | "metadata": {
3842 | "name": "slack",
3843 | "namespace": "flux-system"
3844 | },
3845 | "spec": {
3846 | "eventSeverity": "info",
3847 | "eventSources": [
3848 | {
3849 | "kind": "GitRepository",
3850 | "name": "*"
3851 | },
3852 | {
3853 | "kind": "Kustomization",
3854 | "name": "*"
3855 | },
3856 | {
3857 | "kind": "HelmRelease",
3858 | "name": "*"
3859 | }
3860 | ],
3861 | "providerRef": {
3862 | "name": "slack"
3863 | },
3864 | "suspend": false
3865 | },
3866 | "status": {
3867 | "reconcilerRef": {
3868 | "status": "Ready",
3869 | "message": "Valid configuration",
3870 | "lastReconciled": "2025-11-18T09:00:00Z",
3871 | "managedBy": "Kustomization/flux-system/flux-system"
3872 | }
3873 | }
3874 | },
3875 | {
3876 | "apiVersion": "notification.toolkit.fluxcd.io/v1beta3",
3877 | "kind": "Provider",
3878 | "metadata": {
3879 | "name": "slack",
3880 | "namespace": "flux-system"
3881 | },
3882 | "spec": {
3883 | "address": "https://hooks.slack.com/services/YOUR/SLACK/WEBHOOK",
3884 | "channel": "#flux-notifications",
3885 | "secretRef": {
3886 | "name": "slack-webhook-url"
3887 | },
3888 | "type": "slack",
3889 | "username": "Flux"
3890 | },
3891 | "status": {
3892 | "reconcilerRef": {
3893 | "status": "Ready",
3894 | "message": "Valid configuration",
3895 | "lastReconciled": "2025-11-18T09:00:00Z",
3896 | "managedBy": "Kustomization/flux-system/flux-system"
3897 | }
3898 | }
3899 | },
3900 | {
3901 | "apiVersion": "notification.toolkit.fluxcd.io/v1",
3902 | "kind": "Receiver",
3903 | "metadata": {
3904 | "name": "github-webhook",
3905 | "namespace": "flux-system"
3906 | },
3907 | "spec": {
3908 | "events": [
3909 | "push"
3910 | ],
3911 | "resources": [
3912 | {
3913 | "apiVersion": "source.toolkit.fluxcd.io/v1",
3914 | "kind": "GitRepository",
3915 | "name": "flux-system"
3916 | }
3917 | ],
3918 | "secretRef": {
3919 | "name": "github-webhook-token"
3920 | },
3921 | "type": "github"
3922 | },
3923 | "status": {
3924 | "reconcilerRef": {
3925 | "status": "Ready",
3926 | "message": "Receiver initialized for path: /hook/bed6d00b5555b1603e1f59b94d7fdbca58089cb5663633fb83f2815dc626d92b",
3927 | "lastReconciled": "2025-11-18T10:20:00Z",
3928 | "managedBy": "Kustomization/flux-system/flux-system"
3929 | },
3930 | "conditions": [
3931 | {
3932 | "lastTransitionTime": "2025-11-18T10:20:00Z",
3933 | "message": "Receiver initialized for path: /hook/bed6d00b5555b1603e1f59b94d7fdbca58089cb5663633fb83f2815dc626d92b",
3934 | "observedGeneration": 1,
3935 | "reason": "Succeeded",
3936 | "status": "True",
3937 | "type": "Ready"
3938 | }
3939 | ],
3940 | "observedGeneration": 1,
3941 | "webhookPath": "/hook/bed6d00b5555b1603e1f59b94d7fdbca58089cb5663633fb83f2815dc626d92b"
3942 | }
3943 | },
3944 | {
3945 | "apiVersion": "notification.toolkit.fluxcd.io/v1beta3",
3946 | "kind": "Alert",
3947 | "metadata": {
3948 | "name": "msteams",
3949 | "namespace": "automation"
3950 | },
3951 | "spec": {
3952 | "eventSeverity": "info",
3953 | "eventSources": [
3954 | {
3955 | "kind": "GitRepository",
3956 | "name": "*"
3957 | }
3958 | ],
3959 | "providerRef": {
3960 | "name": "msteams"
3961 | },
3962 | "suspend": false
3963 | },
3964 | "status": {
3965 | "reconcilerRef": {
3966 | "status": "Ready",
3967 | "message": "Valid configuration",
3968 | "lastReconciled": "2025-11-18T09:00:00Z",
3969 | "managedBy": "Kustomization/flux-system/flux-system"
3970 | }
3971 | }
3972 | },
3973 | {
3974 | "apiVersion": "notification.toolkit.fluxcd.io/v1beta3",
3975 | "kind": "Provider",
3976 | "metadata": {
3977 | "name": "msteams",
3978 | "namespace": "automation"
3979 | },
3980 | "spec": {
3981 | "address": "https://outlook.office.com/webhook/YOUR/TEAMS/WEBHOOK",
3982 | "secretRef": {
3983 | "name": "msteams-webhook-url"
3984 | },
3985 | "type": "msteams"
3986 | },
3987 | "status": {
3988 | "reconcilerRef": {
3989 | "status": "Ready",
3990 | "message": "Valid configuration",
3991 | "lastReconciled": "2025-11-18T09:00:00Z",
3992 | "managedBy": "Kustomization/flux-system/flux-system"
3993 | }
3994 | }
3995 | },
3996 | {
3997 | "apiVersion": "source.toolkit.fluxcd.io/v1",
3998 | "kind": "HelmRepository",
3999 | "metadata": {
4000 | "name": "zot-registry",
4001 | "namespace": "registry"
4002 | },
4003 | "spec": {
4004 | "interval": "24h0m0s",
4005 | "url": "https://zotregistry.dev/helm-charts"
4006 | },
4007 | "status": {
4008 | "reconcilerRef": {
4009 | "status": "Ready",
4010 | "message": "stored artifact for revision 'sha256:2b1fdd97e969c82ee149a7ee8b00f55061760832f23c39a3235936f0912f2125'",
4011 | "lastReconciled": "2025-11-01T23:31:41Z",
4012 | "managedBy": "ResourceSet/flux-system/zot-registry"
4013 | },
4014 | "artifact": {
4015 | "digest": "sha256:2b1fdd97e969c82ee149a7ee8b00f55061760832f23c39a3235936f0912f2125",
4016 | "lastUpdateTime": "2025-11-01T23:31:41Z",
4017 | "path": "helmrepository/registry/zot-registry/index.yaml",
4018 | "revision": "sha256:2b1fdd97e969c82ee149a7ee8b00f55061760832f23c39a3235936f0912f2125",
4019 | "size": 1024,
4020 | "url": "http://source-controller.flux-system.svc.cluster.local./helmrepository/registry/zot-registry/index.yaml"
4021 | },
4022 | "conditions": [
4023 | {
4024 | "lastTransitionTime": "2025-11-01T23:31:41Z",
4025 | "message": "stored artifact for revision 'sha256:2b1fdd97e969c82ee149a7ee8b00f55061760832f23c39a3235936f0912f2125'",
4026 | "observedGeneration": 1,
4027 | "reason": "Succeeded",
4028 | "status": "True",
4029 | "type": "Ready"
4030 | }
4031 | ]
4032 | }
4033 | },
4034 | {
4035 | "apiVersion": "source.toolkit.fluxcd.io/v1",
4036 | "kind": "HelmRepository",
4037 | "metadata": {
4038 | "name": "tailscale-operator",
4039 | "namespace": "tailscale"
4040 | },
4041 | "spec": {
4042 | "interval": "24h0m0s",
4043 | "url": "https://pkgs.tailscale.com/helmcharts"
4044 | },
4045 | "status": {
4046 | "reconcilerRef": {
4047 | "status": "Ready",
4048 | "message": "stored artifact for revision 'sha256:2b1fdd97e969c82ee149a7ee8b00f55061760832f23c39a3235936f0912f2125'",
4049 | "lastReconciled": "2025-11-01T23:31:02Z",
4050 | "managedBy": "ResourceSet/flux-system/tailscale-operator"
4051 | },
4052 | "artifact": {
4053 | "digest": "sha256:578d082975ad264ba4d09368febb298c3beb7f18e459bb9d323d3b7c2fc4d475",
4054 | "lastUpdateTime": "2025-11-01T23:31:02Z",
4055 | "path": "helmrepository/tailscale/tailscale-operator/index.yaml",
4056 | "revision": "sha256:578d082975ad264ba4d09368febb298c3beb7f18e459bb9d323d3b7c2fc4d475",
4057 | "size": 2048,
4058 | "url": "http://source-controller.flux-system.svc.cluster.local./helmrepository/tailscale/tailscale-operator/index.yaml"
4059 | },
4060 | "conditions": [
4061 | {
4062 | "lastTransitionTime": "2025-11-01T23:31:02Z",
4063 | "message": "stored artifact for revision 'sha256:578d082975ad264ba4d09368febb298c3beb7f18e459bb9d323d3b7c2fc4d475'",
4064 | "observedGeneration": 1,
4065 | "reason": "Succeeded",
4066 | "status": "True",
4067 | "type": "Ready"
4068 | }
4069 | ]
4070 | }
4071 | },
4072 | {
4073 | "apiVersion": "source.toolkit.fluxcd.io/v1",
4074 | "kind": "GitRepository",
4075 | "metadata": {
4076 | "name": "podinfo",
4077 | "namespace": "automation"
4078 | },
4079 | "spec": {
4080 | "interval": "1m0s",
4081 | "ref": {
4082 | "branch": "main"
4083 | },
4084 | "verify": {
4085 | "mode": "HEAD"
4086 | },
4087 | "url": "https://github.com/stefanprodan/podinfo"
4088 | },
4089 | "status": {
4090 | "reconcilerRef": {
4091 | "status": "Ready",
4092 | "message": "stored artifact for revision 'main@sha1:c1b613a1e083a8918185b11b317f3c75e3c1b6d0'",
4093 | "lastReconciled": "2025-11-18T12:00:00Z",
4094 | "managedBy": "Kustomization/flux-system/apps"
4095 | },
4096 | "artifact": {
4097 | "digest": "sha256:9c224393021c31a3ce372812b0eaf81085e5a633c50115b79c1e3f72e21a6b8f",
4098 | "lastUpdateTime": "2025-11-18T12:00:00Z",
4099 | "path": "gitrepository/automation/podinfo/c1b613a1e083a8918185b11b317f3c75e3c1b6d0.tar.gz",
4100 | "revision": "main@sha1:c1b613a1e083a8918185b11b317f3c75e3c1b6d0",
4101 | "size": 12345,
4102 | "url": "http://source-controller.flux-system.svc.cluster.local./gitrepository/automation/podinfo/c1b613a1e083a8918185b11b317f3c75e3c1b6d0.tar.gz"
4103 | },
4104 | "conditions": [
4105 | {
4106 | "lastTransitionTime": "2025-11-18T12:00:00Z",
4107 | "message": "stored artifact for revision 'main@sha1:c1b613a1e083a8918185b11b317f3c75e3c1b6d0'",
4108 | "observedGeneration": 1,
4109 | "reason": "Succeeded",
4110 | "status": "True",
4111 | "type": "Ready"
4112 | }
4113 | ]
4114 | }
4115 | },
4116 | {
4117 | "apiVersion": "image.toolkit.fluxcd.io/v1",
4118 | "kind": "ImageRepository",
4119 | "metadata": {
4120 | "name": "podinfo",
4121 | "namespace": "automation"
4122 | },
4123 | "spec": {
4124 | "image": "ghcr.io/stefanprodan/podinfo",
4125 | "interval": "5m0s"
4126 | },
4127 | "status": {
4128 | "reconcilerRef": {
4129 | "status": "Ready",
4130 | "message": "successful scan, found 211 tags",
4131 | "lastReconciled": "2025-11-18T12:05:00Z",
4132 | "managedBy": "Kustomization/flux-system/apps"
4133 | },
4134 | "canonicalImageName": "ghcr.io/stefanprodan/podinfo",
4135 | "lastScanResult": {
4136 | "latestTags": [
4137 | "6.2.0",
4138 | "6.1.0"
4139 | ],
4140 | "scanTime": "2025-11-18T12:05:00Z",
4141 | "tagCount": 2
4142 | },
4143 | "conditions": [
4144 | {
4145 | "lastTransitionTime": "2025-11-18T12:05:00Z",
4146 | "message": "successful scan, found 211 tags",
4147 | "observedGeneration": 1,
4148 | "reason": "Succeeded",
4149 | "status": "True",
4150 | "type": "Ready"
4151 | }
4152 | ]
4153 | }
4154 | },
4155 | {
4156 | "apiVersion": "image.toolkit.fluxcd.io/v1",
4157 | "kind": "ImagePolicy",
4158 | "metadata": {
4159 | "name": "podinfo",
4160 | "namespace": "automation"
4161 | },
4162 | "spec": {
4163 | "imageRepositoryRef": {
4164 | "name": "podinfo"
4165 | },
4166 | "policy": {
4167 | "semver": {
4168 | "range": ">=6.0.0"
4169 | }
4170 | }
4171 | },
4172 | "status": {
4173 | "reconcilerRef": {
4174 | "status": "Ready",
4175 | "message": "Latest image tag for 'ghcr.io/stefanprodan/podinfo' resolved to 6.2.0",
4176 | "lastReconciled": "2025-11-18T12:10:00Z",
4177 | "managedBy": "Kustomization/flux-system/apps"
4178 | },
4179 | "latestImage": "ghcr.io/stefanprodan/podinfo:6.2.0",
4180 | "conditions": [
4181 | {
4182 | "lastTransitionTime": "2025-11-18T12:10:00Z",
4183 | "message": "Latest image tag for 'ghcr.io/stefanprodan/podinfo' resolved to 6.2.0",
4184 | "observedGeneration": 1,
4185 | "reason": "Succeeded",
4186 | "status": "True",
4187 | "type": "Ready"
4188 | }
4189 | ]
4190 | }
4191 | },
4192 | {
4193 | "apiVersion": "image.toolkit.fluxcd.io/v1",
4194 | "kind": "ImageUpdateAutomation",
4195 | "metadata": {
4196 | "name": "podinfo",
4197 | "namespace": "automation"
4198 | },
4199 | "spec": {
4200 | "git": {
4201 | "checkout": {
4202 | "ref": {
4203 | "branch": "main"
4204 | }
4205 | },
4206 | "commit": {
4207 | "author": {
4208 | "email": "[email protected]",
4209 | "name": "fluxcdbot"
4210 | },
4211 | },
4212 | "push": {
4213 | "branch": "main"
4214 | }
4215 | },
4216 | "interval": "15m0s",
4217 | "sourceRef": {
4218 | "kind": "GitRepository",
4219 | "name": "podinfo"
4220 | },
4221 | "update": {
4222 | "path": "./kustomize",
4223 | "strategy": "Setters"
4224 | }
4225 | },
4226 | "status": {
4227 | "reconcilerRef": {
4228 | "status": "Ready",
4229 | "message": "pushed commit '3ebb95c' to branch 'main'",
4230 | "lastReconciled": "2025-11-18T12:15:00Z",
4231 | "managedBy": "Kustomization/flux-system/apps"
4232 | },
4233 | "lastAutomationRunTime": "2025-11-18T12:15:00Z",
4234 | "lastPushCommit": "c1b613a1e083a8918185b11b317f3c75e3c1b6d0",
4235 | "lastPushTime": "2025-11-18T12:15:00Z",
4236 | "conditions": [
4237 | {
4238 | "lastTransitionTime": "2025-11-18T12:15:00Z",
4239 | "message": "pushed commit '3ebb95c' to branch 'main'",
4240 | "observedGeneration": 1,
4241 | "reason": "Succeeded",
4242 | "status": "True",
4243 | "type": "Ready"
4244 | }
4245 | ]
4246 | }
4247 | },
4248 | {
4249 | "apiVersion": "notification.toolkit.fluxcd.io/v1",
4250 | "kind": "Receiver",
4251 | "metadata": {
4252 | "name": "podinfo-webhook",
4253 | "namespace": "automation"
4254 | },
4255 | "spec": {
4256 | "type": "github",
4257 | "events": [
4258 | "push"
4259 | ],
4260 | "secretRef": {
4261 | "name": "webhook-secret"
4262 | },
4263 | "resources": [
4264 | {
4265 | "kind": "GitRepository",
4266 | "name": "podinfo"
4267 | }
4268 | ]
4269 | },
4270 | "status": {
4271 | "reconcilerRef": {
4272 | "status": "Ready",
4273 | "message": "Receiver initialized for path: /hook/cbdee599b7977a520a36692e5b872c39d09ee53dd75b2e3ae117fea283958fbf",
4274 | "lastReconciled": "2025-11-18T12:00:00Z",
4275 | "managedBy": "Kustomization/flux-system/apps"
4276 | },
4277 | "conditions": [
4278 | {
4279 | "lastTransitionTime": "2025-11-18T12:00:00Z",
4280 | "message": "Receiver initialized for path: /hook/cbdee599b7977a520a36692e5b872c39d09ee53dd75b2e3ae117fea283958fbf",
4281 | "reason": "Succeeded",
4282 | "status": "True",
4283 | "type": "Ready"
4284 | }
4285 | ],
4286 | "url": "/hook/cbdee599b7977a520a36692e5b872c39d09ee53dd75b2e3ae117fea283958fbf",
4287 | "observedGeneration": 1,
4288 | "lastHandledReconcileAt": "2025-11-18T12:00:00Z"
4289 | }
4290 | },
4291 | {
4292 | "apiVersion": "source.toolkit.fluxcd.io/v1",
4293 | "kind": "HelmRepository",
4294 | "metadata": {
4295 | "name": "bitnami",
4296 | "namespace": "flux-system"
4297 | },
4298 | "spec": {
4299 | "interval": "24h",
4300 | "url": "https://charts.bitnami.com/bitnami"
4301 | },
4302 | "status": {
4303 | "reconcilerRef": {
4304 | "status": "Failed",
4305 | "message": "failed to fetch index: unable to connect to the server\nGet \"https://charts.bitnami.com/bitnami/index.yaml\": timeout awaiting response headers",
4306 | "lastReconciled": "2025-11-18T12:00:00Z",
4307 | "managedBy": "Kustomization/flux-system/flux-system"
4308 | },
4309 | "conditions": [
4310 | {
4311 | "lastTransitionTime": "2025-11-18T12:00:00Z",
4312 | "message": "failed to fetch index: unable to connect to the server\nGet \"https://charts.bitnami.com/bitnami/index.yaml\": timeout awaiting response headers",
4313 | "reason": "Failed",
4314 | "status": "False",
4315 | "type": "Ready"
4316 | }
4317 | ],
4318 | "observedGeneration": 1
4319 | }
4320 | },
4321 | {
4322 | "apiVersion": "image.toolkit.fluxcd.io/v1",
4323 | "kind": "ImageRepository",
4324 | "metadata": {
4325 | "name": "redis",
4326 | "namespace": "automation"
4327 | },
4328 | "spec": {
4329 | "suspend": true,
4330 | "image": "redis",
4331 | "interval": "10m0s"
4332 | },
4333 | "status": {
4334 | "reconcilerRef": {
4335 | "status": "Ready",
4336 | "message": "successful scan, found 50 tags",
4337 | "lastReconciled": "2025-11-18T12:00:00Z",
4338 | "managedBy": "Kustomization/flux-system/flux-system"
4339 | },
4340 | "canonicalImageName": "redis",
4341 | "lastScanResult": {
4342 | "latestTags": [
4343 | "7.0.5",
4344 | "6.2.7"
4345 | ],
4346 | "scanTime": "2025-11-18T12:00:00Z",
4347 | "tagCount": 50
4348 | },
4349 | "conditions": [
4350 | {
4351 | "lastTransitionTime": "2025-11-18T12:00:00Z",
4352 | "message": "successful scan, found 50 tags",
4353 | "reason": "Succeeded",
4354 | "status": "True",
4355 | "type": "Ready"
4356 | }
4357 | ]
4358 | }
4359 | },
4360 | {
4361 | "apiVersion": "image.toolkit.fluxcd.io/v1",
4362 | "kind": "ImagePolicy",
4363 | "metadata": {
4364 | "name": "redis",
4365 | "namespace": "automation"
4366 | },
4367 | "spec": {
4368 | "suspend": true,
4369 | "imageRepositoryRef": {
4370 | "name": "redis"
4371 | },
4372 | "policy": {
4373 | "semver": {
4374 | "range": ">=6.0.0"
4375 | }
4376 | }
4377 | },
4378 | "status": {
4379 | "reconcilerRef": {
4380 | "status": "Ready",
4381 | "message": "Latest image tag for 'redis' resolved to 7.0.5",
4382 | "lastReconciled": "2025-11-18T12:00:00Z",
4383 | "managedBy": "Kustomization/flux-system/flux-system"
4384 | },
4385 | "latestImage": "redis:7.0.5",
4386 | "conditions": [
4387 | {
4388 | "lastTransitionTime": "2025-11-18T12:00:00Z",
4389 | "message": "Latest image tag for 'redis' resolved to 7.0.5",
4390 | "reason": "Succeeded",
4391 | "status": "True",
4392 | "type": "Ready"
4393 | }
4394 | ]
4395 | }
4396 | }
4397 | ]
4398 |
4399 | // Export function that returns the appropriate mock resource based on query parameters
4400 | export const getMockResource = (endpoint) => {
4401 | // Parse query params from endpoint URL
4402 | // eslint-disable-next-line no-undef
4403 | const url = new URL(endpoint, 'http://localhost')
4404 | const params = url.searchParams
4405 |
4406 | const kind = params.get('kind')
4407 | const name = params.get('name')
4408 | const namespace = params.get('namespace')
4409 |
4410 | // Search for matching resource in the array
4411 | const resource = mockResourcesArray.find(r =>
4412 | r.kind === kind &&
4413 | r.metadata.name === name &&
4414 | r.metadata.namespace === namespace
4415 | )
4416 |
4417 | if (!resource) {
4418 | return null
4419 | }
4420 |
4421 | // Inject userActions field - array of allowed actions (empty for Bucket)
4422 | const userActions = kind !== 'Bucket' ? ['reconcile', 'suspend', 'resume'] : []
4423 | return {
4424 | ...resource,
4425 | status: {
4426 | ...resource.status,
4427 | userActions
4428 | }
4429 | }
4430 | }
4431 |
```