# Webhook

Webhook based API-Coverage tool uses [ValidatingAdmissionWebhook](https://kubernetes.io/docs/reference/access-authn-authz/admission-controllers/#validatingadmissionwebhook)
which is a web-server that the K8 API-Server calls into for every API-Object
update to verify if the object is valid before storing it into its datastore.
Each validation request has the json representation of the object being
created/modified, that the tool uses to capture coverage data. `webhook`
package inside this folder provides a mechanism for individual repos to
setup ValidatingAdmissionWebhook.

[APICoverageWebhook](webhook.go) type inside the package encapsulates
necessary configuration details and helper methods required to setup
the webhook. Each repo is expected to call into `SetupWebhook()`
providing following three parameters:

1. `http.Handler`: This is the http handler (that implements `ServeHTTP(
   w http.ResponseWriter, r *http.Request)`) that the web server
  created by APICoverageWebhook uses.
1. `rules`: This is an array of `RuleWithOperations` objects
 from the `k8s.io/api/admissionregistration/v1beta1` package
 that the webhook uses for validation on each API Object update.
 e.g: knative-serving while calling this method would
 provide rules that will handle API Objects like `Service`,
 `Configuration`, `Route` and `Revision`.
1. `namespace`: Namespace name where the webhook would be installed.
1. `stop` channel: Channel to terminate webhook's web server.

`SetupWebhook()` method in its implementation creates a TLS based web server
and registers the webhook by creating a ValidatingWebhookConfiguration
object inside the K8 cluster.

[APICoverageRecorder](apicoverage_recorder.go) type inside the package
encapsulates the apicoverage recording capabilities. Repo using this type
is expected to set:

1. `ResourceForest`: Specifying the version and initializing the [ResourceTrees](../resourcetree/resourcetree.go)
1. `ResourceMap`: Identifying the resources whose APICoverage needs to be
 calculated.
1. `NodeRules`: [NodeRules](../resourcetree/rule.go) that are applicable for
 the repo.
1. `FieldRules`: [FieldRules](../resourcetree/rule.go) that are applicable for
 the repo.
1. `DisplayRules`: [DisplayRules](../view/jsontype_display.go) to be used by
 `GetResourceCoverage` method.