Let webhook accessors construct client/selectors once

This commit is contained in:
Jordan Liggitt 2019-08-20 17:16:21 -04:00
parent a76d7fdf64
commit 14154c2345

View File

@ -17,8 +17,14 @@ limitations under the License.
package webhook package webhook
import ( import (
"sync"
"fmt"
"k8s.io/api/admissionregistration/v1beta1" "k8s.io/api/admissionregistration/v1beta1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/labels"
webhookutil "k8s.io/apiserver/pkg/util/webhook"
"k8s.io/client-go/rest"
) )
// WebhookAccessor provides a common interface to both mutating and validating webhook types. // WebhookAccessor provides a common interface to both mutating and validating webhook types.
@ -29,6 +35,13 @@ type WebhookAccessor interface {
// GetConfigurationName gets the name of the webhook configuration that owns this webhook. // GetConfigurationName gets the name of the webhook configuration that owns this webhook.
GetConfigurationName() string GetConfigurationName() string
// GetRESTClient gets the webhook client
GetRESTClient(clientManager *webhookutil.ClientManager) (*rest.RESTClient, error)
// GetParsedNamespaceSelector gets the webhook NamespaceSelector field.
GetParsedNamespaceSelector() (labels.Selector, error)
// GetParsedObjectSelector gets the webhook ObjectSelector field.
GetParsedObjectSelector() (labels.Selector, error)
// GetName gets the webhook Name field. Note that the name is scoped to the webhook // GetName gets the webhook Name field. Note that the name is scoped to the webhook
// configuration and does not provide a globally unique identity, if a unique identity is // configuration and does not provide a globally unique identity, if a unique identity is
// needed, use GetUID. // needed, use GetUID.
@ -60,134 +73,200 @@ type WebhookAccessor interface {
// NewMutatingWebhookAccessor creates an accessor for a MutatingWebhook. // NewMutatingWebhookAccessor creates an accessor for a MutatingWebhook.
func NewMutatingWebhookAccessor(uid, configurationName string, h *v1beta1.MutatingWebhook) WebhookAccessor { func NewMutatingWebhookAccessor(uid, configurationName string, h *v1beta1.MutatingWebhook) WebhookAccessor {
return mutatingWebhookAccessor{uid: uid, configurationName: configurationName, MutatingWebhook: h} return &mutatingWebhookAccessor{uid: uid, configurationName: configurationName, MutatingWebhook: h}
} }
type mutatingWebhookAccessor struct { type mutatingWebhookAccessor struct {
*v1beta1.MutatingWebhook *v1beta1.MutatingWebhook
uid string uid string
configurationName string configurationName string
initObjectSelector sync.Once
objectSelector labels.Selector
objectSelectorErr error
initNamespaceSelector sync.Once
namespaceSelector labels.Selector
namespaceSelectorErr error
initClient sync.Once
client *rest.RESTClient
clientErr error
} }
func (m mutatingWebhookAccessor) GetUID() string { func (m *mutatingWebhookAccessor) GetUID() string {
return m.uid return m.uid
} }
func (m mutatingWebhookAccessor) GetConfigurationName() string { func (m *mutatingWebhookAccessor) GetConfigurationName() string {
return m.configurationName return m.configurationName
} }
func (m mutatingWebhookAccessor) GetName() string { func (m *mutatingWebhookAccessor) GetRESTClient(clientManager *webhookutil.ClientManager) (*rest.RESTClient, error) {
m.initClient.Do(func() {
m.client, m.clientErr = nil, fmt.Errorf("unimplemented")
})
return m.client, m.clientErr
}
func (m *mutatingWebhookAccessor) GetParsedNamespaceSelector() (labels.Selector, error) {
m.initNamespaceSelector.Do(func() {
m.namespaceSelector, m.namespaceSelectorErr = metav1.LabelSelectorAsSelector(m.NamespaceSelector)
})
return m.namespaceSelector, m.namespaceSelectorErr
}
func (m *mutatingWebhookAccessor) GetParsedObjectSelector() (labels.Selector, error) {
m.initObjectSelector.Do(func() {
m.objectSelector, m.objectSelectorErr = metav1.LabelSelectorAsSelector(m.ObjectSelector)
})
return m.objectSelector, m.objectSelectorErr
}
func (m *mutatingWebhookAccessor) GetName() string {
return m.Name return m.Name
} }
func (m mutatingWebhookAccessor) GetClientConfig() v1beta1.WebhookClientConfig { func (m *mutatingWebhookAccessor) GetClientConfig() v1beta1.WebhookClientConfig {
return m.ClientConfig return m.ClientConfig
} }
func (m mutatingWebhookAccessor) GetRules() []v1beta1.RuleWithOperations { func (m *mutatingWebhookAccessor) GetRules() []v1beta1.RuleWithOperations {
return m.Rules return m.Rules
} }
func (m mutatingWebhookAccessor) GetFailurePolicy() *v1beta1.FailurePolicyType { func (m *mutatingWebhookAccessor) GetFailurePolicy() *v1beta1.FailurePolicyType {
return m.FailurePolicy return m.FailurePolicy
} }
func (m mutatingWebhookAccessor) GetMatchPolicy() *v1beta1.MatchPolicyType { func (m *mutatingWebhookAccessor) GetMatchPolicy() *v1beta1.MatchPolicyType {
return m.MatchPolicy return m.MatchPolicy
} }
func (m mutatingWebhookAccessor) GetNamespaceSelector() *metav1.LabelSelector { func (m *mutatingWebhookAccessor) GetNamespaceSelector() *metav1.LabelSelector {
return m.NamespaceSelector return m.NamespaceSelector
} }
func (m mutatingWebhookAccessor) GetObjectSelector() *metav1.LabelSelector { func (m *mutatingWebhookAccessor) GetObjectSelector() *metav1.LabelSelector {
return m.ObjectSelector return m.ObjectSelector
} }
func (m mutatingWebhookAccessor) GetSideEffects() *v1beta1.SideEffectClass { func (m *mutatingWebhookAccessor) GetSideEffects() *v1beta1.SideEffectClass {
return m.SideEffects return m.SideEffects
} }
func (m mutatingWebhookAccessor) GetTimeoutSeconds() *int32 { func (m *mutatingWebhookAccessor) GetTimeoutSeconds() *int32 {
return m.TimeoutSeconds return m.TimeoutSeconds
} }
func (m mutatingWebhookAccessor) GetAdmissionReviewVersions() []string { func (m *mutatingWebhookAccessor) GetAdmissionReviewVersions() []string {
return m.AdmissionReviewVersions return m.AdmissionReviewVersions
} }
func (m mutatingWebhookAccessor) GetMutatingWebhook() (*v1beta1.MutatingWebhook, bool) { func (m *mutatingWebhookAccessor) GetMutatingWebhook() (*v1beta1.MutatingWebhook, bool) {
return m.MutatingWebhook, true return m.MutatingWebhook, true
} }
func (m mutatingWebhookAccessor) GetValidatingWebhook() (*v1beta1.ValidatingWebhook, bool) { func (m *mutatingWebhookAccessor) GetValidatingWebhook() (*v1beta1.ValidatingWebhook, bool) {
return nil, false return nil, false
} }
// NewValidatingWebhookAccessor creates an accessor for a ValidatingWebhook. // NewValidatingWebhookAccessor creates an accessor for a ValidatingWebhook.
func NewValidatingWebhookAccessor(uid, configurationName string, h *v1beta1.ValidatingWebhook) WebhookAccessor { func NewValidatingWebhookAccessor(uid, configurationName string, h *v1beta1.ValidatingWebhook) WebhookAccessor {
return validatingWebhookAccessor{uid: uid, configurationName: configurationName, ValidatingWebhook: h} return &validatingWebhookAccessor{uid: uid, configurationName: configurationName, ValidatingWebhook: h}
} }
type validatingWebhookAccessor struct { type validatingWebhookAccessor struct {
*v1beta1.ValidatingWebhook *v1beta1.ValidatingWebhook
uid string uid string
configurationName string configurationName string
initObjectSelector sync.Once
objectSelector labels.Selector
objectSelectorErr error
initNamespaceSelector sync.Once
namespaceSelector labels.Selector
namespaceSelectorErr error
initClient sync.Once
client *rest.RESTClient
clientErr error
} }
func (v validatingWebhookAccessor) GetUID() string { func (v *validatingWebhookAccessor) GetUID() string {
return v.uid return v.uid
} }
func (v validatingWebhookAccessor) GetConfigurationName() string { func (v *validatingWebhookAccessor) GetConfigurationName() string {
return v.configurationName return v.configurationName
} }
func (v validatingWebhookAccessor) GetName() string { func (v *validatingWebhookAccessor) GetRESTClient(clientManager *webhookutil.ClientManager) (*rest.RESTClient, error) {
v.initClient.Do(func() {
v.client, v.clientErr = nil, fmt.Errorf("unimplemented")
})
return v.client, v.clientErr
}
func (v *validatingWebhookAccessor) GetParsedNamespaceSelector() (labels.Selector, error) {
v.initNamespaceSelector.Do(func() {
v.namespaceSelector, v.namespaceSelectorErr = metav1.LabelSelectorAsSelector(v.NamespaceSelector)
})
return v.namespaceSelector, v.namespaceSelectorErr
}
func (v *validatingWebhookAccessor) GetParsedObjectSelector() (labels.Selector, error) {
v.initObjectSelector.Do(func() {
v.objectSelector, v.objectSelectorErr = metav1.LabelSelectorAsSelector(v.ObjectSelector)
})
return v.objectSelector, v.objectSelectorErr
}
func (v *validatingWebhookAccessor) GetName() string {
return v.Name return v.Name
} }
func (v validatingWebhookAccessor) GetClientConfig() v1beta1.WebhookClientConfig { func (v *validatingWebhookAccessor) GetClientConfig() v1beta1.WebhookClientConfig {
return v.ClientConfig return v.ClientConfig
} }
func (v validatingWebhookAccessor) GetRules() []v1beta1.RuleWithOperations { func (v *validatingWebhookAccessor) GetRules() []v1beta1.RuleWithOperations {
return v.Rules return v.Rules
} }
func (v validatingWebhookAccessor) GetFailurePolicy() *v1beta1.FailurePolicyType { func (v *validatingWebhookAccessor) GetFailurePolicy() *v1beta1.FailurePolicyType {
return v.FailurePolicy return v.FailurePolicy
} }
func (v validatingWebhookAccessor) GetMatchPolicy() *v1beta1.MatchPolicyType { func (v *validatingWebhookAccessor) GetMatchPolicy() *v1beta1.MatchPolicyType {
return v.MatchPolicy return v.MatchPolicy
} }
func (v validatingWebhookAccessor) GetNamespaceSelector() *metav1.LabelSelector { func (v *validatingWebhookAccessor) GetNamespaceSelector() *metav1.LabelSelector {
return v.NamespaceSelector return v.NamespaceSelector
} }
func (v validatingWebhookAccessor) GetObjectSelector() *metav1.LabelSelector { func (v *validatingWebhookAccessor) GetObjectSelector() *metav1.LabelSelector {
return v.ObjectSelector return v.ObjectSelector
} }
func (v validatingWebhookAccessor) GetSideEffects() *v1beta1.SideEffectClass { func (v *validatingWebhookAccessor) GetSideEffects() *v1beta1.SideEffectClass {
return v.SideEffects return v.SideEffects
} }
func (v validatingWebhookAccessor) GetTimeoutSeconds() *int32 { func (v *validatingWebhookAccessor) GetTimeoutSeconds() *int32 {
return v.TimeoutSeconds return v.TimeoutSeconds
} }
func (v validatingWebhookAccessor) GetAdmissionReviewVersions() []string { func (v *validatingWebhookAccessor) GetAdmissionReviewVersions() []string {
return v.AdmissionReviewVersions return v.AdmissionReviewVersions
} }
func (v validatingWebhookAccessor) GetMutatingWebhook() (*v1beta1.MutatingWebhook, bool) { func (v *validatingWebhookAccessor) GetMutatingWebhook() (*v1beta1.MutatingWebhook, bool) {
return nil, false return nil, false
} }
func (v validatingWebhookAccessor) GetValidatingWebhook() (*v1beta1.ValidatingWebhook, bool) { func (v *validatingWebhookAccessor) GetValidatingWebhook() (*v1beta1.ValidatingWebhook, bool) {
return v.ValidatingWebhook, true return v.ValidatingWebhook, true
} }