71 lines
2.5 KiB
Go
71 lines
2.5 KiB
Go
package deployment
|
|
|
|
import (
|
|
"context"
|
|
|
|
admissionregistrationv1 "k8s.io/api/admissionregistration/v1"
|
|
appsv1 "k8s.io/api/apps/v1"
|
|
"k8s.io/client-go/util/workqueue"
|
|
"k8s.io/klog/v2"
|
|
"sigs.k8s.io/controller-runtime/pkg/client"
|
|
"sigs.k8s.io/controller-runtime/pkg/event"
|
|
"sigs.k8s.io/controller-runtime/pkg/reconcile"
|
|
|
|
"github.com/openkruise/rollouts/api/v1alpha1"
|
|
"github.com/openkruise/rollouts/pkg/webhook/util/configuration"
|
|
)
|
|
|
|
type MutatingWebhookEventHandler struct {
|
|
client.Reader
|
|
}
|
|
|
|
func (m MutatingWebhookEventHandler) Create(evt event.CreateEvent, q workqueue.RateLimitingInterface) {
|
|
config, ok := evt.Object.(*admissionregistrationv1.MutatingWebhookConfiguration)
|
|
if !ok || config == nil || !isKruiseRolloutMutatingConfiguration(config) || config.DeletionTimestamp.IsZero() {
|
|
return
|
|
}
|
|
m.enqueue(q)
|
|
}
|
|
|
|
func (m MutatingWebhookEventHandler) Generic(evt event.GenericEvent, q workqueue.RateLimitingInterface) {
|
|
config, ok := evt.Object.(*admissionregistrationv1.MutatingWebhookConfiguration)
|
|
if !ok || config == nil || !isKruiseRolloutMutatingConfiguration(config) || config.DeletionTimestamp.IsZero() {
|
|
return
|
|
}
|
|
m.enqueue(q)
|
|
}
|
|
|
|
func (m MutatingWebhookEventHandler) Update(evt event.UpdateEvent, q workqueue.RateLimitingInterface) {
|
|
config, ok := evt.ObjectNew.(*admissionregistrationv1.MutatingWebhookConfiguration)
|
|
if !ok || config == nil || !isKruiseRolloutMutatingConfiguration(config) || config.DeletionTimestamp.IsZero() {
|
|
return
|
|
}
|
|
m.enqueue(q)
|
|
}
|
|
|
|
func (m MutatingWebhookEventHandler) Delete(evt event.DeleteEvent, q workqueue.RateLimitingInterface) {
|
|
config, ok := evt.Object.(*admissionregistrationv1.MutatingWebhookConfiguration)
|
|
if !ok || config == nil || !isKruiseRolloutMutatingConfiguration(config) {
|
|
return
|
|
}
|
|
m.enqueue(q)
|
|
}
|
|
|
|
func (m MutatingWebhookEventHandler) enqueue(q workqueue.RateLimitingInterface) {
|
|
deploymentLister := appsv1.DeploymentList{}
|
|
err := m.List(context.TODO(), &deploymentLister, client.MatchingLabels(map[string]string{v1alpha1.AdvancedDeploymentControlLabel: "true"}))
|
|
if err != nil {
|
|
klog.Errorf("Failed to list deployment, error: %v", err)
|
|
}
|
|
for index := range deploymentLister.Items {
|
|
if deploymentLister.Items[index].Spec.Strategy.Type == appsv1.RollingUpdateDeploymentStrategyType {
|
|
continue
|
|
}
|
|
q.Add(reconcile.Request{NamespacedName: client.ObjectKeyFromObject(&deploymentLister.Items[index])})
|
|
}
|
|
}
|
|
|
|
func isKruiseRolloutMutatingConfiguration(object client.Object) bool {
|
|
return object.GetName() == configuration.MutatingWebhookConfigurationName
|
|
}
|