karmada/pkg/webhook/interpreter/webhook.go

86 lines
2.5 KiB
Go

/*
Copyright 2021 The Karmada Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package interpreter
import (
"context"
"net/http"
"k8s.io/klog/v2"
configv1alpha1 "github.com/karmada-io/karmada/pkg/apis/config/v1alpha1"
)
// Request defines the input for an interpreter handler.
// It contains information to identify the object in
// question (kind, name, namespace), as well as the
// operation in request(e.g. InterpreterOperationInterpretReplica, InterpreterOperationPrune,
// etc), and the object itself.
type Request struct {
configv1alpha1.ResourceInterpreterRequest
}
// Response is the output of an interpreter handler.
type Response struct {
configv1alpha1.ResourceInterpreterResponse
}
// Complete populates any fields that are yet to be set in
// the underlying ResourceInterpreterResponse, It mutates the response.
func (r *Response) Complete(req Request) {
r.UID = req.UID
// ensure that we have a valid status code
if r.Status == nil {
r.Status = &configv1alpha1.RequestStatus{}
}
if r.Status.Code == 0 {
r.Status.Code = http.StatusOK
}
}
// Handler can handle an ResourceInterpreterRequest.
type Handler interface {
// Handle yields a response to an ResourceInterpreterRequest.
//
// The supplied context is extracted from the received http.Request, allowing wrapping
// http.Handlers to inject values into and control cancellation of downstream request processing.
Handle(context.Context, Request) Response
}
// Webhook represents each individual webhook.
type Webhook struct {
// handler actually processes an admission request returning whether it was allowed or denied,
// and potentially patches to apply to the handler.
handler Handler
}
// NewWebhook return a Webhook
func NewWebhook(handler Handler, decoder *Decoder) *Webhook {
if !InjectDecoderInto(decoder, handler) {
klog.Errorf("Inject decoder into handler err")
}
return &Webhook{handler: handler}
}
// Handle processes ResourceInterpreterRequest.
func (wh *Webhook) Handle(ctx context.Context, req Request) Response {
resp := wh.handler.Handle(ctx, req)
resp.Complete(req)
return resp
}