{"id":15130109,"url":"https://github.com/operator-framework/josdk-webhooks","last_synced_at":"2026-01-11T17:45:56.779Z","repository":{"id":41144221,"uuid":"437815431","full_name":"operator-framework/josdk-webhooks","owner":"operator-framework","description":"Framework and tooling to support writing dynamic admission controllers and conversion hooks for Kubernetes in Java","archived":false,"fork":false,"pushed_at":"2025-06-02T15:15:46.000Z","size":581,"stargazers_count":24,"open_issues_count":12,"forks_count":7,"subscribers_count":3,"default_branch":"main","last_synced_at":"2025-06-24T15:05:33.788Z","etag":null,"topics":["controller","conversion-hook","dynamic-admission-controller","java","kubernetes"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/operator-framework.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2021-12-13T09:43:08.000Z","updated_at":"2025-05-28T12:33:15.000Z","dependencies_parsed_at":"2025-05-16T09:28:12.124Z","dependency_job_id":"e344415a-35e1-4f62-9974-45eaa5980e90","html_url":"https://github.com/operator-framework/josdk-webhooks","commit_stats":null,"previous_names":["java-operator-sdk/admission-controller-framework"],"tags_count":13,"template":false,"template_full_name":null,"purl":"pkg:github/operator-framework/josdk-webhooks","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/operator-framework%2Fjosdk-webhooks","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/operator-framework%2Fjosdk-webhooks/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/operator-framework%2Fjosdk-webhooks/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/operator-framework%2Fjosdk-webhooks/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/operator-framework","download_url":"https://codeload.github.com/operator-framework/josdk-webhooks/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/operator-framework%2Fjosdk-webhooks/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":261700468,"owners_count":23196501,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["controller","conversion-hook","dynamic-admission-controller","java","kubernetes"],"created_at":"2024-09-26T02:30:22.796Z","updated_at":"2026-01-11T17:45:56.720Z","avatar_url":"https://github.com/operator-framework.png","language":"Java","readme":"# kubernetes-webhooks-framework\n\nFramework and tooling to support\nimplementing [dynamic admission controllers](https://kubernetes.io/docs/reference/access-authn-authz/extensible-admission-controllers/)\nand [conversion hooks](https://kubernetes.io/docs/tasks/extend-kubernetes/custom-resources/custom-resource-definition-versioning/#webhook-conversion)\nfor Kubernetes in Java. Supports both **quarkus** and **spring boot**. Both **sync** and **async** programing models.\n\n## Documentation\n\n**For more detailed documentation check the [docs](docs).**\n\n## Sample Usage\n\nAdd dependency to you project:\n\n```xml\n\u003cdependency\u003e\n  \u003cgroupId\u003eio.javaoperatorsdk\u003c/groupId\u003e\n  \u003cartifactId\u003ekubernetes-webhooks-framework-core\u003c/artifactId\u003e\n  \u003cversion\u003e${josdk.webhooks.version}\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\n### Dynamic Admission Controllers\n\nDefining a mutation or validation controller is as simple as:\n\n```java\n\n  @Singleton\n  @Named(MUTATING_CONTROLLER)\n  public AdmissionController\u003cIngress\u003e mutatingController() {\n    return new AdmissionController\u003c\u003e((resource, operation) -\u003e {\n      if (resource.getMetadata().getLabels() == null) {\n        resource.getMetadata().setLabels(new HashMap\u003c\u003e());\n      }\n      resource.getMetadata().getLabels().putIfAbsent(APP_NAME_LABEL_KEY, \"mutation-test\");\n      return resource;\n    });\n  }\n  \n  @Singleton\n  @Named(VALIDATING_CONTROLLER)\n  public AdmissionController\u003cIngress\u003e validatingController() {\n    return new AdmissionController\u003c\u003e((resource, oldResource, operation) -\u003e {\n      if (resource.getMetadata().getLabels() == null\n              || resource.getMetadata().getLabels().get(APP_NAME_LABEL_KEY) == null) {\n        throw new NotAllowedException(\"Missing label: \" + APP_NAME_LABEL_KEY);\n      }\n    });\n  }\n\n```\n\nWhat can be simply used in an endpoint:\n\n```java\n  @POST\n  @Path(MUTATE_PATH)\n  @Consumes(MediaType.APPLICATION_JSON)\n  @Produces(MediaType.APPLICATION_JSON)\n  public AdmissionReview mutate(AdmissionReview admissionReview) {\n    return mutationController.handle(admissionReview);\n  }\n\n  @POST\n  @Path(VALIDATE_PATH)\n  @Consumes(MediaType.APPLICATION_JSON)\n  @Produces(MediaType.APPLICATION_JSON)\n  public AdmissionReview validate(AdmissionReview admissionReview) {\n    return validationController.handle(admissionReview);\n  }\n```\n\n\nSee samples also for details.\n\n### Conversion Hooks\n\nConversion hooks follows the same patter described\nin [Kuberbuilder](https://book.kubebuilder.io/multiversion-tutorial/conversion-concepts.html), thus first converts the\ncustom resource from actual version to a hub, and as next step from the hub to the target resource version.\n\nTo create the controller\nregister [mappers](https://github.com/java-operator-sdk/kubernetes-webhooks-framework/blob/main/core/src/main/java/io/javaoperatorsdk/webhook/conversion/Mapper.java)\n:\n\n```java\n  @Singleton\n  public ConversionController conversionController() {\n    var controller = new ConversionController();\n    controller.registerMapper(new V1Mapper());\n    controller.registerMapper(new V2Mapper());\n    return controller;\n  }\n```\n\nand use the controllers in the endpoint:\n\n```java\n  @PostMapping(CONVERSION_PATH)\n  @ResponseBody\n  public ConversionReview convert(@RequestBody ConversionReview conversionReview) {\n    return conversionController.handle(conversionReview);\n  }\n```\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foperator-framework%2Fjosdk-webhooks","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Foperator-framework%2Fjosdk-webhooks","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foperator-framework%2Fjosdk-webhooks/lists"}