Skip to content

Commit 1587b5d

Browse files
committed
reject build requests for binary builds if not providing binary inputs
1 parent e72143c commit 1587b5d

File tree

3 files changed

+96
-2
lines changed

3 files changed

+96
-2
lines changed

pkg/build/generator/generator.go

+7-2
Original file line numberDiff line numberDiff line change
@@ -218,9 +218,11 @@ func (g *BuildGenerator) Instantiate(ctx kapi.Context, request *buildapi.BuildRe
218218
if err != nil {
219219
return nil, err
220220
}
221-
221+
if request.Binary == nil && bc.Spec.Source.Dockerfile == nil && bc.Spec.Source.Git == nil && len(bc.Spec.Source.Images) == 0 {
222+
return nil, errors.NewBadRequest(fmt.Sprintf("can't instantiate binary BuildConfig %s/%s: must provide a build input via --from-dir|--from-file|--from-repo", bc.Namespace, bc.Name))
223+
}
222224
if buildutil.IsPaused(bc) {
223-
return nil, errors.NewInternalError(&GeneratorFatalError{fmt.Sprintf("can't instantiate from BuildConfig %s/%s: BuildConfig is paused", bc.Namespace, bc.Name)})
225+
return nil, errors.NewBadRequest(fmt.Sprintf("can't instantiate from BuildConfig %s/%s: BuildConfig is paused", bc.Namespace, bc.Name))
224226
}
225227

226228
if err := g.checkLastVersion(bc, request.LastVersion); err != nil {
@@ -333,6 +335,9 @@ func (g *BuildGenerator) Clone(ctx kapi.Context, request *buildapi.BuildRequest)
333335
if err != nil && !errors.IsNotFound(err) {
334336
return nil, err
335337
}
338+
if build.Spec.Source.Dockerfile == nil && build.Spec.Source.Git == nil && len(build.Spec.Source.Images) == 0 {
339+
return nil, errors.NewBadRequest(fmt.Sprintf("can't clone binary Build %s/%s: start a new Build from the BuildConfig", build.Namespace, build.Name))
340+
}
336341

337342
if buildutil.IsPaused(buildConfig) {
338343
return nil, errors.NewInternalError(&GeneratorFatalError{fmt.Sprintf("can't instantiate from BuildConfig %s/%s: BuildConfig is paused", buildConfig.Namespace, buildConfig.Name)})

pkg/build/generator/generator_test.go

+84
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,35 @@ func TestInstantiate(t *testing.T) {
4848
}
4949
}
5050

51+
func TestInstantiateBinary(t *testing.T) {
52+
generator := mockBuildGenerator()
53+
/*
54+
generator.Client.GetBuildConfigFunc = func(ctx kapi.Context, name string) (*buildapi.BuildConfig, error) {
55+
bc := &buildapi.BuildConfig{}
56+
return bc, nil
57+
}
58+
generator.Client.GetBuildFunc = func(ctx kapi.Context, name string) (*buildapi.Build, error) {
59+
build := &buildapi.Build{
60+
Status: buildapi.BuildStatus{
61+
Config: &kapi.ObjectReference{
62+
Name: "buildconfig",
63+
},
64+
},
65+
}
66+
return build, nil
67+
}
68+
*/
69+
_, err := generator.Instantiate(kapi.NewDefaultContext(), &buildapi.BuildRequest{Binary: &buildapi.BinaryBuildSource{}})
70+
if err != nil {
71+
t.Errorf("Unexpected error %v", err)
72+
}
73+
// TODO: we should enable this flow.
74+
_, err = generator.Clone(kapi.NewDefaultContext(), &buildapi.BuildRequest{Binary: &buildapi.BinaryBuildSource{}})
75+
if err == nil || !strings.Contains(err.Error(), "can't clone binary Build") {
76+
t.Errorf("Expected error, got different %v", err)
77+
}
78+
}
79+
5180
// TODO(agoldste): I'm not sure the intent of this test. Using the previous logic for
5281
// the generator, which would try to update the build config before creating
5382
// the build, I can see why the UpdateBuildConfigFunc is set up to return an
@@ -83,6 +112,7 @@ func TestInstantiateRetry(t *testing.T) {
83112
*/
84113

85114
func TestInstantiateDeletingError(t *testing.T) {
115+
source := mocks.MockSource()
86116
generator := BuildGenerator{Client: Client{
87117
GetBuildConfigFunc: func(ctx kapi.Context, name string) (*buildapi.BuildConfig, error) {
88118
bc := &buildapi.BuildConfig{
@@ -91,11 +121,31 @@ func TestInstantiateDeletingError(t *testing.T) {
91121
buildapi.BuildConfigPausedAnnotation: "true",
92122
},
93123
},
124+
Spec: buildapi.BuildConfigSpec{
125+
CommonSpec: buildapi.CommonSpec{
126+
Source: source,
127+
Revision: &buildapi.SourceRevision{
128+
Git: &buildapi.GitSourceRevision{
129+
Commit: "1234",
130+
},
131+
},
132+
},
133+
},
94134
}
95135
return bc, nil
96136
},
97137
GetBuildFunc: func(ctx kapi.Context, name string) (*buildapi.Build, error) {
98138
build := &buildapi.Build{
139+
Spec: buildapi.BuildSpec{
140+
CommonSpec: buildapi.CommonSpec{
141+
Source: source,
142+
Revision: &buildapi.SourceRevision{
143+
Git: &buildapi.GitSourceRevision{
144+
Commit: "1234",
145+
},
146+
},
147+
},
148+
},
99149
Status: buildapi.BuildStatus{
100150
Config: &kapi.ObjectReference{
101151
Name: "buildconfig",
@@ -115,6 +165,33 @@ func TestInstantiateDeletingError(t *testing.T) {
115165
}
116166
}
117167

168+
func TestInstantiateBinaryError(t *testing.T) {
169+
generator := BuildGenerator{Client: Client{
170+
GetBuildConfigFunc: func(ctx kapi.Context, name string) (*buildapi.BuildConfig, error) {
171+
bc := &buildapi.BuildConfig{}
172+
return bc, nil
173+
},
174+
GetBuildFunc: func(ctx kapi.Context, name string) (*buildapi.Build, error) {
175+
build := &buildapi.Build{
176+
Status: buildapi.BuildStatus{
177+
Config: &kapi.ObjectReference{
178+
Name: "buildconfig",
179+
},
180+
},
181+
}
182+
return build, nil
183+
},
184+
}}
185+
_, err := generator.Instantiate(kapi.NewDefaultContext(), &buildapi.BuildRequest{})
186+
if err == nil || !strings.Contains(err.Error(), "can't instantiate binary BuildConfig") {
187+
t.Errorf("Expected error, got different %v", err)
188+
}
189+
_, err = generator.Clone(kapi.NewDefaultContext(), &buildapi.BuildRequest{})
190+
if err == nil || !strings.Contains(err.Error(), "can't clone binary Build") {
191+
t.Errorf("Expected error, got different %v", err)
192+
}
193+
}
194+
118195
func TestInstantiateGetBuildConfigError(t *testing.T) {
119196
generator := BuildGenerator{Client: Client{
120197
GetBuildConfigFunc: func(ctx kapi.Context, name string) (*buildapi.BuildConfig, error) {
@@ -240,6 +317,7 @@ func TestInstantiateWithImageTrigger(t *testing.T) {
240317
},
241318
}
242319

320+
source := mocks.MockSource()
243321
for _, tc := range tests {
244322
bc := &buildapi.BuildConfig{
245323
Spec: buildapi.BuildConfigSpec{
@@ -252,6 +330,12 @@ func TestInstantiateWithImageTrigger(t *testing.T) {
252330
},
253331
},
254332
},
333+
Source: source,
334+
Revision: &buildapi.SourceRevision{
335+
Git: &buildapi.GitSourceRevision{
336+
Commit: "1234",
337+
},
338+
},
255339
},
256340
Triggers: tc.triggers,
257341
},

pkg/cmd/cli/cmd/startbuild.go

+5
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,11 @@ func (o *StartBuildOptions) Complete(f *clientcmd.Factory, in io.Reader, out io.
165165
return kcmdutil.UsageError(cmd, "Must pass a name of a build config or specify build name with '--from-build' flag")
166166
}
167167

168+
if len(buildName) != 0 && (len(fromFile) != 0 || len(fromDir) != 0 || len(fromRepo) != 0) {
169+
// TODO: we should support this, it should be possible to clone a build to run again with new uploaded artifacts.
170+
// Doing so requires introducing a new clonebinary endpoint.
171+
return kcmdutil.UsageError(cmd, "Cannot use '--from-build' flag with binary builds")
172+
}
168173
o.AsBinary = len(fromFile) > 0 || len(fromDir) > 0 || len(fromRepo) > 0
169174

170175
namespace, _, err := f.DefaultNamespace()

0 commit comments

Comments
 (0)