7
7
8
8
"github.com/golang/glog"
9
9
10
+ "k8s.io/apimachinery/pkg/api/errors"
10
11
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
12
+ "k8s.io/apimachinery/pkg/util/validation/field"
11
13
"k8s.io/apiserver/pkg/admission"
12
14
restclient "k8s.io/client-go/rest"
13
15
"k8s.io/kubernetes/pkg/api"
@@ -21,7 +23,7 @@ import (
21
23
func init () {
22
24
admission .RegisterPlugin ("openshift.io/BuildConfigSecretInjector" , func (config io.Reader ) (admission.Interface , error ) {
23
25
return & secretInjector {
24
- Handler : admission .NewHandler (admission .Create ),
26
+ Handler : admission .NewHandler (admission .Create , admission . Update ),
25
27
}, nil
26
28
})
27
29
}
@@ -34,11 +36,20 @@ type secretInjector struct {
34
36
var _ = oadmission .WantsRESTClientConfig (& secretInjector {})
35
37
36
38
func (si * secretInjector ) Admit (attr admission.Attributes ) (err error ) {
37
- bc , ok := attr .GetObject ().(* buildapi.BuildConfig )
38
- if ! ok {
39
- return nil
39
+ obj := attr .GetObject ()
40
+
41
+ if bc , ok := obj .(* buildapi.BuildConfig ); ok && attr .GetOperation () == admission .Create {
42
+ return si .admitNewBuildConfig (attr , bc )
40
43
}
41
44
45
+ if secret , ok := obj .(* api.Secret ); ok {
46
+ return si .admitSecret (attr , secret )
47
+ }
48
+
49
+ return nil
50
+ }
51
+
52
+ func (si * secretInjector ) admitNewBuildConfig (attr admission.Attributes , bc * buildapi.BuildConfig ) (err error ) {
42
53
if bc .Spec .Source .SourceSecret != nil || bc .Spec .Source .Git == nil {
43
54
return nil
44
55
}
@@ -98,6 +109,30 @@ func (si *secretInjector) Admit(attr admission.Attributes) (err error) {
98
109
return nil
99
110
}
100
111
112
+ func (si * secretInjector ) admitSecret (attr admission.Attributes , secret * api.Secret ) (err error ) {
113
+ errs := field.ErrorList {}
114
+
115
+ for k , v := range secret .GetAnnotations () {
116
+ if strings .HasPrefix (k , buildapi .BuildSourceSecretMatchURIAnnotationPrefix ) {
117
+ v = strings .TrimSpace (v )
118
+ if v == "" {
119
+ continue
120
+ }
121
+
122
+ _ , err := urlpattern .NewURLPattern (v )
123
+ if err != nil {
124
+ errs = append (errs , field .Invalid (field .NewPath ("metadata.annotations" , k ), v , err .Error ()))
125
+ }
126
+ }
127
+ }
128
+
129
+ if len (errs ) > 0 {
130
+ return errors .NewInvalid (api .Kind ("secret" ), secret .Name , errs )
131
+ }
132
+
133
+ return nil
134
+ }
135
+
101
136
func (si * secretInjector ) SetRESTClientConfig (restClientConfig restclient.Config ) {
102
137
si .restClientConfig = restClientConfig
103
138
}
0 commit comments