-
Notifications
You must be signed in to change notification settings - Fork 4.7k
/
admission.go
129 lines (111 loc) · 3.69 KB
/
admission.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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
package defaults
import (
"io"
"github.com/golang/glog"
"k8s.io/kubernetes/pkg/admission"
kapi "k8s.io/kubernetes/pkg/api"
clientset "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset"
buildadmission "github.com/openshift/origin/pkg/build/admission"
defaultsapi "github.com/openshift/origin/pkg/build/admission/defaults/api"
"github.com/openshift/origin/pkg/build/admission/defaults/api/validation"
buildapi "github.com/openshift/origin/pkg/build/api"
)
func init() {
admission.RegisterPlugin("BuildDefaults", func(c clientset.Interface, config io.Reader) (admission.Interface, error) {
defaultsConfig, err := getConfig(config)
if err != nil {
return nil, err
}
glog.V(5).Infof("Initializing BuildDefaults plugin with config: %#v", defaultsConfig)
return NewBuildDefaults(defaultsConfig), nil
})
}
func getConfig(in io.Reader) (*defaultsapi.BuildDefaultsConfig, error) {
defaultsConfig := &defaultsapi.BuildDefaultsConfig{}
err := buildadmission.ReadPluginConfig(in, defaultsConfig)
if err != nil {
return nil, err
}
errs := validation.ValidateBuildDefaultsConfig(defaultsConfig)
if len(errs) > 0 {
return nil, errs.ToAggregate()
}
return defaultsConfig, nil
}
type buildDefaults struct {
*admission.Handler
defaultsConfig *defaultsapi.BuildDefaultsConfig
}
// NewBuildDefaults returns an admission control for builds that sets build defaults
// based on the plugin configuration
func NewBuildDefaults(defaultsConfig *defaultsapi.BuildDefaultsConfig) admission.Interface {
return &buildDefaults{
Handler: admission.NewHandler(admission.Create),
defaultsConfig: defaultsConfig,
}
}
// Admit applies configured build defaults to a pod that is identified
// as a build pod.
func (a *buildDefaults) Admit(attributes admission.Attributes) error {
if a.defaultsConfig == nil {
return nil
}
if !buildadmission.IsBuildPod(attributes) {
return nil
}
build, version, err := buildadmission.GetBuild(attributes)
if err != nil {
return nil
}
glog.V(4).Infof("Handling build %s/%s", build.Namespace, build.Name)
a.applyBuildDefaults(build)
return buildadmission.SetBuild(attributes, build, version)
}
func (a *buildDefaults) applyBuildDefaults(build *buildapi.Build) {
// Apply default env
buildEnv := getBuildEnv(build)
for _, envVar := range a.defaultsConfig.Env {
glog.V(5).Infof("Adding default environment variable %s=%s to build %s/%s", envVar.Name, envVar.Value, build.Namespace, build.Name)
addDefaultEnvVar(envVar, buildEnv)
}
// Apply git proxy defaults
if build.Spec.Source.Git == nil {
return
}
if len(a.defaultsConfig.GitHTTPProxy) != 0 {
if build.Spec.Source.Git.HTTPProxy == nil {
t := a.defaultsConfig.GitHTTPProxy
glog.V(5).Infof("Setting default Git HTTP proxy of build %s/%s to %s", build.Namespace, build.Name, t)
build.Spec.Source.Git.HTTPProxy = &t
}
}
if len(a.defaultsConfig.GitHTTPSProxy) != 0 {
if build.Spec.Source.Git.HTTPSProxy == nil {
t := a.defaultsConfig.GitHTTPSProxy
glog.V(5).Infof("Setting default Git HTTPS proxy of build %s/%s to %s", build.Namespace, build.Name, t)
build.Spec.Source.Git.HTTPSProxy = &t
}
}
}
func getBuildEnv(build *buildapi.Build) *[]kapi.EnvVar {
switch {
case build.Spec.Strategy.DockerStrategy != nil:
return &build.Spec.Strategy.DockerStrategy.Env
case build.Spec.Strategy.SourceStrategy != nil:
return &build.Spec.Strategy.SourceStrategy.Env
case build.Spec.Strategy.CustomStrategy != nil:
return &build.Spec.Strategy.CustomStrategy.Env
}
return nil
}
func addDefaultEnvVar(v kapi.EnvVar, envVars *[]kapi.EnvVar) {
found := false
for i := range *envVars {
if (*envVars)[i].Name == v.Name {
found = true
}
}
if !found {
*envVars = append(*envVars, v)
}
}