Skip to content

Commit c5b38be

Browse files
authoredNov 8, 2017
Merge pull request #17108 from jim-minter/issue17074
Automatic merge from submit-queue. allow image trigger controller to create custom builds fixes #17074
2 parents 04a02a6 + 9d9243a commit c5b38be

File tree

10 files changed

+291
-13
lines changed

10 files changed

+291
-13
lines changed
 

‎pkg/cmd/server/bootstrappolicy/controller_policy.go

+1
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,7 @@ func init() {
213213
rbac.NewRule("create").Groups(buildGroup, legacyBuildGroup).Resources(
214214
authorizationapi.SourceBuildResource,
215215
authorizationapi.DockerBuildResource,
216+
authorizationapi.CustomBuildResource,
216217
authorizationapi.OptimizedDockerBuildResource,
217218
authorizationapi.JenkinsPipelineBuildResource,
218219
).RuleOrDie(),

‎pkg/cmd/server/origin/controller/image.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ func (c *ImageTriggerControllerConfig) RunController(ctx ControllerContext) (boo
6868
Informer: ctx.BuildInformers.Build().InternalVersion().BuildConfigs().Informer(),
6969
Store: ctx.BuildInformers.Build().InternalVersion().BuildConfigs().Informer().GetIndexer(),
7070
TriggerFn: triggerbuildconfigs.NewBuildConfigTriggerIndexer,
71-
Reactor: &triggerbuildconfigs.BuildConfigReactor{Instantiator: bcInstantiator},
71+
Reactor: triggerbuildconfigs.NewBuildConfigReactor(bcInstantiator, kclient.Core().RESTClient()),
7272
})
7373
}
7474
if !c.HasDeploymentsEnabled {

‎pkg/image/controller/trigger/image_trigger_controller_test.go

+2-6
Original file line numberDiff line numberDiff line change
@@ -297,9 +297,7 @@ func TestTriggerControllerSyncBuildConfigResource(t *testing.T) {
297297
},
298298
}
299299
inst := fakeBuildConfigInstantiator(test.bc, test.is)
300-
reaction := &buildconfigs.BuildConfigReactor{
301-
Instantiator: inst,
302-
}
300+
reaction := buildconfigs.NewBuildConfigReactor(inst, nil)
303301
controller := TriggerController{
304302
triggerCache: NewTriggerCache(),
305303
lister: lister,
@@ -398,9 +396,7 @@ func TestTriggerControllerSyncBuildConfigResourceErrorHandling(t *testing.T) {
398396
if test.err != nil {
399397
inst.err = test.err
400398
}
401-
reaction := &buildconfigs.BuildConfigReactor{
402-
Instantiator: inst,
403-
}
399+
reaction := buildconfigs.NewBuildConfigReactor(inst, nil)
404400
controller := TriggerController{
405401
triggerCache: NewTriggerCache(),
406402
lister: lister,

‎pkg/image/trigger/buildconfigs/buildconfigs.go

+26-5
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,16 @@
11
package buildconfigs
22

33
import (
4+
"fmt"
45
"reflect"
56

67
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
8+
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
9+
v1core "k8s.io/client-go/kubernetes/typed/core/v1"
10+
clientv1 "k8s.io/client-go/pkg/api/v1"
11+
"k8s.io/client-go/rest"
712
"k8s.io/client-go/tools/cache"
13+
"k8s.io/client-go/tools/record"
814
kapi "k8s.io/kubernetes/pkg/api"
915

1016
"github.com/golang/glog"
@@ -107,15 +113,25 @@ type BuildConfigInstantiator interface {
107113
Instantiate(namespace string, request *buildapi.BuildRequest) (*buildapi.Build, error)
108114
}
109115

110-
// BuildConfigReactor converts trigger changes into new builds. It will request a build if
116+
// buildConfigReactor converts trigger changes into new builds. It will request a build if
111117
// at least one image is out of date.
112-
type BuildConfigReactor struct {
113-
Instantiator BuildConfigInstantiator
118+
type buildConfigReactor struct {
119+
instantiator BuildConfigInstantiator
120+
eventRecorder record.EventRecorder
121+
}
122+
123+
// NewBuildConfigReactor creates a new buildConfigReactor
124+
func NewBuildConfigReactor(instantiator BuildConfigInstantiator, restclient rest.Interface) trigger.ImageReactor {
125+
eventBroadcaster := record.NewBroadcaster()
126+
eventBroadcaster.StartRecordingToSink(&v1core.EventSinkImpl{Interface: v1core.New(restclient).Events("")})
127+
eventRecorder := eventBroadcaster.NewRecorder(kapi.Scheme, clientv1.EventSource{Component: "buildconfig-controller"})
128+
129+
return &buildConfigReactor{instantiator: instantiator, eventRecorder: eventRecorder}
114130
}
115131

116132
// ImageChanged is passed a build config and a set of changes and updates the object if
117133
// necessary.
118-
func (r *BuildConfigReactor) ImageChanged(obj interface{}, tagRetriever trigger.TagRetriever) error {
134+
func (r *buildConfigReactor) ImageChanged(obj interface{}, tagRetriever trigger.TagRetriever) error {
119135
bc := obj.(*buildapi.BuildConfig)
120136

121137
var request *buildapi.BuildRequest
@@ -193,6 +209,11 @@ func (r *BuildConfigReactor) ImageChanged(obj interface{}, tagRetriever trigger.
193209

194210
// instantiate new build
195211
glog.V(4).Infof("Requesting build for BuildConfig based on image triggers %s/%s: %#v", bc.Namespace, bc.Name, request)
196-
_, err := r.Instantiator.Instantiate(bc.Namespace, request)
212+
_, err := r.instantiator.Instantiate(bc.Namespace, request)
213+
if err != nil {
214+
instantiateErr := fmt.Errorf("error triggering Build for BuildConfig %s/%s: %v", bc.Namespace, bc.Name, err)
215+
utilruntime.HandleError(instantiateErr)
216+
r.eventRecorder.Event(bc, kapi.EventTypeWarning, "BuildConfigTriggerFailed", instantiateErr.Error())
217+
}
197218
return err
198219
}

‎pkg/image/trigger/buildconfigs/buildconfigs_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -246,7 +246,7 @@ func TestBuildConfigReactor(t *testing.T) {
246246

247247
for i, test := range testCases {
248248
instantiator := &instantiator{build: test.response}
249-
r := BuildConfigReactor{Instantiator: instantiator}
249+
r := buildConfigReactor{instantiator: instantiator}
250250
initial, err := kapi.Scheme.DeepCopy(test.obj)
251251
if err != nil {
252252
t.Fatal(err)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package builds
2+
3+
import (
4+
"time"
5+
6+
g "github.com/onsi/ginkgo"
7+
o "github.com/onsi/gomega"
8+
9+
kerrors "k8s.io/apimachinery/pkg/api/errors"
10+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
11+
"k8s.io/apimachinery/pkg/util/wait"
12+
13+
exutil "github.com/openshift/origin/test/extended/util"
14+
)
15+
16+
var _ = g.Describe("[Feature:Builds][Conformance] imagechangetriggers", func() {
17+
defer g.GinkgoRecover()
18+
19+
var (
20+
buildFixture = exutil.FixturePath("testdata", "builds", "test-imagechangetriggers.yaml")
21+
oc = exutil.NewCLI("imagechangetriggers", exutil.KubeConfigPath())
22+
)
23+
24+
g.Context("", func() {
25+
g.JustBeforeEach(func() {
26+
g.By("waiting for builder service account")
27+
err := exutil.WaitForBuilderAccount(oc.AdminKubeClient().Core().ServiceAccounts(oc.Namespace()))
28+
o.Expect(err).NotTo(o.HaveOccurred())
29+
})
30+
31+
g.AfterEach(func() {
32+
if g.CurrentGinkgoTestDescription().Failed {
33+
exutil.DumpPodStates(oc)
34+
exutil.DumpPodLogsStartingWith("", oc)
35+
}
36+
})
37+
38+
g.It("imagechangetriggers should trigger builds of all types", func() {
39+
err := oc.AsAdmin().Run("create").Args("-f", buildFixture).Execute()
40+
o.Expect(err).NotTo(o.HaveOccurred())
41+
42+
err = wait.Poll(time.Second, 30*time.Second, func() (done bool, err error) {
43+
for _, build := range []string{"bc-docker-1", "bc-jenkins-1", "bc-source-1", "bc-custom-1"} {
44+
_, err := oc.BuildClient().Build().Builds(oc.Namespace()).Get(build, metav1.GetOptions{})
45+
if err == nil {
46+
continue
47+
}
48+
if kerrors.IsNotFound(err) {
49+
return false, nil
50+
}
51+
return false, err
52+
}
53+
return true, nil
54+
})
55+
o.Expect(err).NotTo(o.HaveOccurred())
56+
})
57+
})
58+
})

‎test/extended/testdata/bindata.go

+110
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
kind: List
2+
apiVersion: v1
3+
items:
4+
- kind: ImageStream
5+
apiVersion: v1
6+
metadata:
7+
name: nodejs-ex
8+
spec:
9+
tags:
10+
- name: latest
11+
from:
12+
kind: DockerImage
13+
name: centos/nodejs-6-centos7:latest
14+
15+
- kind: BuildConfig
16+
apiVersion: v1
17+
metadata:
18+
name: bc-source
19+
spec:
20+
source:
21+
type: Git
22+
git:
23+
uri: https://github.com/openshift/nodejs-ex.git
24+
strategy:
25+
type: Source
26+
sourceStrategy:
27+
from:
28+
kind: ImageStreamTag
29+
name: nodejs-ex:latest
30+
triggers:
31+
- type: ImageChange
32+
imageChange:
33+
from:
34+
kind: ImageStreamTag
35+
name: nodejs-ex:latest
36+
37+
- kind: BuildConfig
38+
apiVersion: v1
39+
metadata:
40+
name: bc-docker
41+
spec:
42+
source:
43+
type: Dockerfile
44+
dockerfile: FROM nodejs
45+
strategy:
46+
type: Docker
47+
dockerStrategy:
48+
from:
49+
kind: ImageStreamTag
50+
name: nodejs-ex:latest
51+
triggers:
52+
- type: ImageChange
53+
imageChange:
54+
from:
55+
kind: ImageStreamTag
56+
name: nodejs-ex:latest
57+
58+
- kind: BuildConfig
59+
apiVersion: v1
60+
metadata:
61+
name: bc-custom
62+
spec:
63+
strategy:
64+
type: Custom
65+
customStrategy:
66+
from:
67+
kind: ImageStreamTag
68+
name: nodejs-ex:latest
69+
triggers:
70+
- type: ImageChange
71+
imageChange:
72+
from:
73+
kind: ImageStreamTag
74+
name: nodejs-ex:latest
75+
76+
- kind: BuildConfig
77+
apiVersion: v1
78+
metadata:
79+
name: bc-jenkins
80+
spec:
81+
strategy:
82+
type: Jenkins
83+
jenkinsPipelineStrategy:
84+
jenkinsfile: node {}
85+
triggers:
86+
- type: ImageChange
87+
imageChange:
88+
from:
89+
kind: ImageStreamTag
90+
name: nodejs-ex:latest

‎test/testdata/bootstrappolicy/bootstrap_cluster_roles.yaml

+1
Original file line numberDiff line numberDiff line change
@@ -3299,6 +3299,7 @@ items:
32993299
- ""
33003300
- build.openshift.io
33013301
resources:
3302+
- builds/custom
33023303
- builds/docker
33033304
- builds/jenkinspipeline
33043305
- builds/optimizeddocker

‎test/testdata/bootstrappolicy/bootstrap_policy_file.yaml

+1
Original file line numberDiff line numberDiff line change
@@ -3602,6 +3602,7 @@ items:
36023602
- build.openshift.io
36033603
attributeRestrictions: null
36043604
resources:
3605+
- builds/custom
36053606
- builds/docker
36063607
- builds/jenkinspipeline
36073608
- builds/optimizeddocker

0 commit comments

Comments
 (0)
Please sign in to comment.