forked from openshift/library-go
/
timeoutadmission.go
68 lines (57 loc) · 1.88 KB
/
timeoutadmission.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
package admissiontimeout
import (
"context"
"fmt"
"time"
"k8s.io/apimachinery/pkg/api/errors"
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
"k8s.io/apiserver/pkg/admission"
)
type pluginHandlerWithTimeout struct {
name string
admissionPlugin admission.Interface
timeout time.Duration
}
var _ admission.ValidationInterface = &pluginHandlerWithTimeout{}
var _ admission.MutationInterface = &pluginHandlerWithTimeout{}
func (p pluginHandlerWithTimeout) Handles(operation admission.Operation) bool {
return p.admissionPlugin.Handles(operation)
}
func (p pluginHandlerWithTimeout) Admit(ctx context.Context, a admission.Attributes, o admission.ObjectInterfaces) error {
mutatingHandler, ok := p.admissionPlugin.(admission.MutationInterface)
if !ok {
return nil
}
admissionDone := make(chan struct{})
admissionErr := fmt.Errorf("default to mutation error")
go func() {
defer utilruntime.HandleCrash()
defer close(admissionDone)
admissionErr = mutatingHandler.Admit(ctx, a, o)
}()
select {
case <-admissionDone:
return admissionErr
case <-time.After(p.timeout):
return errors.NewInternalError(fmt.Errorf("admission plugin %q failed to complete mutation in %v", p.name, p.timeout))
}
}
func (p pluginHandlerWithTimeout) Validate(ctx context.Context, a admission.Attributes, o admission.ObjectInterfaces) error {
validatingHandler, ok := p.admissionPlugin.(admission.ValidationInterface)
if !ok {
return nil
}
admissionDone := make(chan struct{})
admissionErr := fmt.Errorf("default to validation error")
go func() {
defer utilruntime.HandleCrash()
defer close(admissionDone)
admissionErr = validatingHandler.Validate(ctx, a, o)
}()
select {
case <-admissionDone:
return admissionErr
case <-time.After(p.timeout):
return errors.NewInternalError(fmt.Errorf("admission plugin %q failed to complete validation in %v", p.name, p.timeout))
}
}