Skip to content

Commit d0ed003

Browse files
committed
switch build logs to use client, not storage
1 parent 050c9ea commit d0ed003

File tree

5 files changed

+64
-104
lines changed

5 files changed

+64
-104
lines changed

pkg/build/apiserver/apiserver.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -161,12 +161,12 @@ func (c *BuildServerConfig) newV1RESTStorage() (map[string]rest.Storage, error)
161161
v1Storage := map[string]rest.Storage{}
162162
v1Storage["builds"] = buildStorage
163163
v1Storage["builds/clone"] = buildclone.NewStorage(buildGenerator)
164-
v1Storage["builds/log"] = buildlogregistry.NewREST(buildStorage, buildStorage, kubeInternalClient.Core(), nodeConnectionInfoGetter)
164+
v1Storage["builds/log"] = buildlogregistry.NewREST(buildClient.Build(), kubeInternalClient.Core(), nodeConnectionInfoGetter)
165165
v1Storage["builds/details"] = buildDetailsStorage
166166

167167
v1Storage["buildConfigs"] = buildConfigStorage
168168
v1Storage["buildConfigs/webhooks"] = buildConfigWebHooks
169169
v1Storage["buildConfigs/instantiate"] = buildconfiginstantiate.NewStorage(buildGenerator)
170-
v1Storage["buildConfigs/instantiatebinary"] = buildconfiginstantiate.NewBinaryStorage(buildGenerator, buildStorage, kubeInternalClient.Core(), nodeConnectionInfoGetter)
170+
v1Storage["buildConfigs/instantiatebinary"] = buildconfiginstantiate.NewBinaryStorage(buildGenerator, buildClient.Build(), kubeInternalClient.Core(), nodeConnectionInfoGetter)
171171
return v1Storage, nil
172172
}

pkg/build/registry/buildconfiginstantiate/rest.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import (
2727
buildapi "github.com/openshift/origin/pkg/build/apis/build"
2828
buildapiv1 "github.com/openshift/origin/pkg/build/apis/build/v1"
2929
buildstrategy "github.com/openshift/origin/pkg/build/controller/strategy"
30+
buildtypedclient "github.com/openshift/origin/pkg/build/generated/internalclientset/typed/build/internalversion"
3031
"github.com/openshift/origin/pkg/build/generator"
3132
"github.com/openshift/origin/pkg/build/registry"
3233
buildutil "github.com/openshift/origin/pkg/build/util"
@@ -84,10 +85,10 @@ func (s *InstantiateREST) ProducesMIMETypes(verb string) []string {
8485

8586
var _ rest.StorageMetadata = &InstantiateREST{}
8687

87-
func NewBinaryStorage(generator *generator.BuildGenerator, watcher rest.Watcher, podClient kcoreclient.PodsGetter, info kubeletclient.ConnectionInfoGetter) *BinaryInstantiateREST {
88+
func NewBinaryStorage(generator *generator.BuildGenerator, buildClient buildtypedclient.BuildsGetter, podClient kcoreclient.PodsGetter, info kubeletclient.ConnectionInfoGetter) *BinaryInstantiateREST {
8889
return &BinaryInstantiateREST{
8990
Generator: generator,
90-
Watcher: watcher,
91+
BuildClient: buildClient,
9192
PodGetter: &podGetter{podClient},
9293
ConnectionInfo: info,
9394
Timeout: 5 * time.Minute,
@@ -96,7 +97,7 @@ func NewBinaryStorage(generator *generator.BuildGenerator, watcher rest.Watcher,
9697

9798
type BinaryInstantiateREST struct {
9899
Generator *generator.BuildGenerator
99-
Watcher rest.Watcher
100+
BuildClient buildtypedclient.BuildsGetter
100101
PodGetter pod.ResourceGetter
101102
ConnectionInfo kubeletclient.ConnectionInfoGetter
102103
Timeout time.Duration
@@ -224,7 +225,7 @@ func (h *binaryInstantiateHandler) handle(r io.Reader) (runtime.Object, error) {
224225
h.cancelBuild(build)
225226
}()
226227

227-
latest, ok, err := registry.WaitForRunningBuild(h.r.Watcher, h.ctx, build, remaining)
228+
latest, ok, err := registry.WaitForRunningBuild(h.r.BuildClient, build, remaining)
228229

229230
switch {
230231
case latest.Status.Phase == buildapi.BuildPhaseError:

pkg/build/registry/buildlog/rest.go

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -23,19 +23,20 @@ import (
2323

2424
buildapi "github.com/openshift/origin/pkg/build/apis/build"
2525
"github.com/openshift/origin/pkg/build/apis/build/validation"
26+
buildtypedclient "github.com/openshift/origin/pkg/build/generated/internalclientset/typed/build/internalversion"
2627
"github.com/openshift/origin/pkg/build/registry"
2728
buildutil "github.com/openshift/origin/pkg/build/util"
2829
)
2930

3031
// REST is an implementation of RESTStorage for the api server.
3132
type REST struct {
32-
Getter rest.Getter
33-
Watcher rest.Watcher
33+
BuildClient buildtypedclient.BuildsGetter
3434
PodGetter pod.ResourceGetter
3535
ConnectionInfo kubeletclient.ConnectionInfoGetter
3636
Timeout time.Duration
3737
}
3838

39+
// TODO these wrapers shouldb e removed
3940
type podGetter struct {
4041
kcoreclient.PodsGetter
4142
}
@@ -53,10 +54,9 @@ const defaultTimeout time.Duration = 10 * time.Second
5354
// NewREST creates a new REST for BuildLog
5455
// Takes build registry and pod client to get necessary attributes to assemble
5556
// URL to which the request shall be redirected in order to get build logs.
56-
func NewREST(getter rest.Getter, watcher rest.Watcher, pn kcoreclient.PodsGetter, connectionInfo kubeletclient.ConnectionInfoGetter) *REST {
57+
func NewREST(buildClient buildtypedclient.BuildsGetter, pn kcoreclient.PodsGetter, connectionInfo kubeletclient.ConnectionInfoGetter) *REST {
5758
return &REST{
58-
Getter: getter,
59-
Watcher: watcher,
59+
BuildClient: buildClient,
6060
PodGetter: &podGetter{pn},
6161
ConnectionInfo: connectionInfo,
6262
Timeout: defaultTimeout,
@@ -74,21 +74,20 @@ func (r *REST) Get(ctx apirequest.Context, name string, opts runtime.Object) (ru
7474
if errs := validation.ValidateBuildLogOptions(buildLogOpts); len(errs) > 0 {
7575
return nil, errors.NewInvalid(buildapi.Kind("BuildLogOptions"), "", errs)
7676
}
77-
obj, err := r.Getter.Get(ctx, name, &metav1.GetOptions{})
77+
build, err := r.BuildClient.Builds(apirequest.NamespaceValue(ctx)).Get(name, metav1.GetOptions{})
7878
if err != nil {
7979
return nil, err
8080
}
81-
build := obj.(*buildapi.Build)
8281
if buildLogOpts.Previous {
8382
version := buildutil.VersionForBuild(build)
8483
// Use the previous version
8584
version--
8685
previousBuildName := buildutil.BuildNameForConfigVersion(buildutil.ConfigNameForBuild(build), version)
87-
previous, err := r.Getter.Get(ctx, previousBuildName, &metav1.GetOptions{})
86+
previous, err := r.BuildClient.Builds(apirequest.NamespaceValue(ctx)).Get(previousBuildName, metav1.GetOptions{})
8887
if err != nil {
8988
return nil, err
9089
}
91-
build = previous.(*buildapi.Build)
90+
build = previous
9291
}
9392
switch build.Status.Phase {
9493
// Build has not launched, wait until it runs
@@ -99,7 +98,7 @@ func (r *REST) Get(ctx apirequest.Context, name string, opts runtime.Object) (ru
9998
return &genericrest.LocationStreamer{}, nil
10099
}
101100
glog.V(4).Infof("Build %s/%s is in %s state, waiting for Build to start", build.Namespace, build.Name, build.Status.Phase)
102-
latest, ok, err := registry.WaitForRunningBuild(r.Watcher, ctx, build, r.Timeout)
101+
latest, ok, err := registry.WaitForRunningBuild(r.BuildClient, build, r.Timeout)
103102
if err != nil {
104103
return nil, errors.NewBadRequest(fmt.Sprintf("unable to wait for build %s to run: %v", build.Name, err))
105104
}
@@ -126,7 +125,7 @@ func (r *REST) Get(ctx apirequest.Context, name string, opts runtime.Object) (ru
126125

127126
// if we can't at least get the build pod, we're not going to get very far, so
128127
// error out now.
129-
obj, err = r.PodGetter.Get(ctx, buildPodName, &metav1.GetOptions{})
128+
obj, err := r.PodGetter.Get(ctx, buildPodName, &metav1.GetOptions{})
130129
if err != nil {
131130
return nil, errors.NewBadRequest(err.Error())
132131
}

pkg/build/registry/buildlog/rest_test.go

Lines changed: 19 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -8,19 +8,19 @@ import (
88
"testing"
99
"time"
1010

11-
metainternal "k8s.io/apimachinery/pkg/apis/meta/internalversion"
1211
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1312
"k8s.io/apimachinery/pkg/runtime"
1413
"k8s.io/apimachinery/pkg/types"
1514
"k8s.io/apimachinery/pkg/watch"
1615
apirequest "k8s.io/apiserver/pkg/endpoints/request"
1716
genericrest "k8s.io/apiserver/pkg/registry/generic/rest"
1817
"k8s.io/apiserver/pkg/registry/rest"
18+
clientgotesting "k8s.io/client-go/testing"
1919
kapi "k8s.io/kubernetes/pkg/api"
2020
kubeletclient "k8s.io/kubernetes/pkg/kubelet/client"
2121

2222
buildapi "github.com/openshift/origin/pkg/build/apis/build"
23-
"github.com/openshift/origin/pkg/build/registry/test"
23+
buildfakeclient "github.com/openshift/origin/pkg/build/generated/internalclientset/fake"
2424
)
2525

2626
type testPodGetter struct{}
@@ -139,26 +139,20 @@ func TestWaitForBuild(t *testing.T) {
139139

140140
for _, tt := range tests {
141141
build := mockBuild(buildapi.BuildPhasePending, "running", 1)
142-
ch := make(chan watch.Event)
143-
watcher := &buildWatcher{
144-
Build: build,
145-
Watcher: &fakeWatch{
146-
Channel: ch,
147-
},
148-
}
142+
buildClient := buildfakeclient.NewSimpleClientset(build)
143+
fakeWatcher := watch.NewFake()
144+
buildClient.PrependWatchReactor("builds", func(action clientgotesting.Action) (handled bool, ret watch.Interface, err error) {
145+
return true, fakeWatcher, nil
146+
})
149147
storage := REST{
150-
Getter: watcher,
151-
Watcher: watcher,
148+
BuildClient: buildClient.Build(),
152149
PodGetter: &testPodGetter{},
153150
ConnectionInfo: &fakeConnectionInfoGetter{},
154151
Timeout: defaultTimeout,
155152
}
156153
go func() {
157154
for _, status := range tt.status {
158-
ch <- watch.Event{
159-
Type: watch.Modified,
160-
Object: mockBuild(status, "running", 1),
161-
}
155+
fakeWatcher.Modify(mockBuild(status, "running", 1))
162156
}
163157
}()
164158
_, err := storage.Get(ctx, build.Name, &buildapi.BuildLogOptions{})
@@ -172,18 +166,11 @@ func TestWaitForBuild(t *testing.T) {
172166
}
173167

174168
func TestWaitForBuildTimeout(t *testing.T) {
175-
ctx := apirequest.NewDefaultContext()
176169
build := mockBuild(buildapi.BuildPhasePending, "running", 1)
177-
ch := make(chan watch.Event)
178-
watcher := &buildWatcher{
179-
Build: build,
180-
Watcher: &fakeWatch{
181-
Channel: ch,
182-
},
183-
}
170+
buildClient := buildfakeclient.NewSimpleClientset(build)
171+
ctx := apirequest.NewDefaultContext()
184172
storage := REST{
185-
Getter: watcher,
186-
Watcher: watcher,
173+
BuildClient: buildClient.Build(),
187174
PodGetter: &testPodGetter{},
188175
ConnectionInfo: &fakeConnectionInfoGetter{},
189176
Timeout: 100 * time.Millisecond,
@@ -194,44 +181,18 @@ func TestWaitForBuildTimeout(t *testing.T) {
194181
}
195182
}
196183

197-
type buildWatcher struct {
198-
Build *buildapi.Build
199-
Watcher watch.Interface
200-
Err error
201-
}
202-
203-
func (r *buildWatcher) Get(ctx apirequest.Context, name string, options *metav1.GetOptions) (runtime.Object, error) {
204-
return r.Build, nil
205-
}
206-
207-
func (r *buildWatcher) Watch(ctx apirequest.Context, options *metainternal.ListOptions) (watch.Interface, error) {
208-
return r.Watcher, r.Err
209-
}
210-
211-
type fakeWatch struct {
212-
Channel chan watch.Event
213-
}
214-
215-
func (w *fakeWatch) Stop() {
216-
close(w.Channel)
217-
}
218-
219-
func (w *fakeWatch) ResultChan() <-chan watch.Event {
220-
return w.Channel
221-
}
222-
223184
func resourceLocationHelper(BuildPhase buildapi.BuildPhase, podPhase string, ctx apirequest.Context, version int) (string, error) {
224185
expectedBuild := mockBuild(BuildPhase, podPhase, version)
225-
internal := &test.BuildStorage{Build: expectedBuild}
186+
buildClient := buildfakeclient.NewSimpleClientset(expectedBuild)
226187

227188
storage := &REST{
228-
Getter: internal,
189+
BuildClient: buildClient.Build(),
229190
PodGetter: &testPodGetter{},
230191
ConnectionInfo: &fakeConnectionInfoGetter{},
231192
Timeout: defaultTimeout,
232193
}
233194
getter := rest.GetterWithOptions(storage)
234-
obj, err := getter.Get(ctx, "foo-build", &buildapi.BuildLogOptions{NoWait: true})
195+
obj, err := getter.Get(ctx, expectedBuild.Name, &buildapi.BuildLogOptions{NoWait: true})
235196
if err != nil {
236197
return "", err
237198
}
@@ -269,7 +230,8 @@ func mockPod(podPhase kapi.PodPhase, podName string) *kapi.Pod {
269230
func mockBuild(status buildapi.BuildPhase, podName string, version int) *buildapi.Build {
270231
return &buildapi.Build{
271232
ObjectMeta: metav1.ObjectMeta{
272-
Name: podName,
233+
Namespace: "default",
234+
Name: podName,
273235
Annotations: map[string]string{
274236
buildapi.BuildNumberAnnotation: strconv.Itoa(version),
275237
},
@@ -303,10 +265,10 @@ func TestPreviousBuildLogs(t *testing.T) {
303265
first := mockBuild(buildapi.BuildPhaseComplete, "bc-1", 1)
304266
second := mockBuild(buildapi.BuildPhaseComplete, "bc-2", 2)
305267
third := mockBuild(buildapi.BuildPhaseComplete, "bc-3", 3)
306-
internal := &test.BuildStorage{Builds: &buildapi.BuildList{Items: []buildapi.Build{*first, *second, *third}}}
268+
buildClient := buildfakeclient.NewSimpleClientset(first, second, third)
307269

308270
storage := &REST{
309-
Getter: internal,
271+
BuildClient: buildClient.Build(),
310272
PodGetter: &anotherTestPodGetter{},
311273
ConnectionInfo: &fakeConnectionInfoGetter{},
312274
Timeout: defaultTimeout,

pkg/build/registry/rest.go

Lines changed: 28 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,12 @@ import (
44
"fmt"
55
"time"
66

7-
metainternal "k8s.io/apimachinery/pkg/apis/meta/internalversion"
7+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
88
"k8s.io/apimachinery/pkg/fields"
99
"k8s.io/apimachinery/pkg/watch"
10-
apirequest "k8s.io/apiserver/pkg/endpoints/request"
11-
"k8s.io/apiserver/pkg/registry/rest"
1210

1311
buildapi "github.com/openshift/origin/pkg/build/apis/build"
12+
buildtypedclient "github.com/openshift/origin/pkg/build/generated/internalclientset/typed/build/internalversion"
1413
)
1514

1615
var (
@@ -22,39 +21,38 @@ var (
2221
// WaitForRunningBuild waits until the specified build is no longer New or Pending. Returns true if
2322
// the build ran within timeout, false if it did not, and an error if any other error state occurred.
2423
// The last observed Build state is returned.
25-
func WaitForRunningBuild(watcher rest.Watcher, ctx apirequest.Context, build *buildapi.Build, timeout time.Duration) (*buildapi.Build, bool, error) {
24+
func WaitForRunningBuild(buildClient buildtypedclient.BuildsGetter, build *buildapi.Build, timeout time.Duration) (*buildapi.Build, bool, error) {
2625
fieldSelector := fields.OneTermEqualSelector("metadata.name", build.Name)
27-
options := &metainternal.ListOptions{FieldSelector: fieldSelector, ResourceVersion: build.ResourceVersion}
28-
w, err := watcher.Watch(ctx, options)
26+
options := metav1.ListOptions{FieldSelector: fieldSelector.String(), ResourceVersion: build.ResourceVersion}
27+
w, err := buildClient.Builds(build.Namespace).Watch(options)
2928
if err != nil {
3029
return build, false, err
3130
}
32-
defer w.Stop()
3331

3432
observed := build
35-
ch := w.ResultChan()
36-
expire := time.After(timeout)
37-
for {
38-
select {
39-
case event := <-ch:
40-
obj, ok := event.Object.(*buildapi.Build)
41-
if !ok {
42-
return observed, false, fmt.Errorf("received unknown object while watching for builds")
43-
}
44-
observed = obj
45-
46-
if event.Type == watch.Deleted {
47-
return observed, false, ErrBuildDeleted
48-
}
49-
switch obj.Status.Phase {
50-
case buildapi.BuildPhaseRunning, buildapi.BuildPhaseComplete, buildapi.BuildPhaseFailed, buildapi.BuildPhaseError, buildapi.BuildPhaseCancelled:
51-
return observed, true, nil
52-
case buildapi.BuildPhaseNew, buildapi.BuildPhasePending:
53-
default:
54-
return observed, false, ErrUnknownBuildPhase
55-
}
56-
case <-expire:
57-
return observed, false, nil
33+
_, err = watch.Until(timeout, w, func(event watch.Event) (bool, error) {
34+
obj, ok := event.Object.(*buildapi.Build)
35+
if !ok {
36+
return false, fmt.Errorf("received unknown object while watching for builds: %T", event.Object)
5837
}
38+
observed = obj
39+
40+
if event.Type == watch.Deleted {
41+
return false, ErrBuildDeleted
42+
}
43+
switch obj.Status.Phase {
44+
case buildapi.BuildPhaseRunning, buildapi.BuildPhaseComplete, buildapi.BuildPhaseFailed, buildapi.BuildPhaseError, buildapi.BuildPhaseCancelled:
45+
return true, nil
46+
case buildapi.BuildPhaseNew, buildapi.BuildPhasePending:
47+
default:
48+
return false, ErrUnknownBuildPhase
49+
}
50+
51+
return false, nil
52+
})
53+
if err != nil {
54+
return nil, false, err
5955
}
56+
57+
return observed, true, nil
6058
}

0 commit comments

Comments
 (0)