Skip to content

Commit 868b80b

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

File tree

3 files changed

+80
-2
lines changed

3 files changed

+80
-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

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

51+
func TestInstantiateBinary(t *testing.T) {
52+
generator := mockBuildGenerator()
53+
_, err := generator.Instantiate(kapi.NewDefaultContext(), &buildapi.BuildRequest{Binary: &buildapi.BinaryBuildSource{}})
54+
if err != nil {
55+
t.Errorf("Unexpected error %v", err)
56+
}
57+
// TODO: we should enable this flow.
58+
_, err = generator.Clone(kapi.NewDefaultContext(), &buildapi.BuildRequest{Binary: &buildapi.BinaryBuildSource{}})
59+
if err == nil || !strings.Contains(err.Error(), "can't clone binary Build") {
60+
t.Errorf("Expected error, got different %v", err)
61+
}
62+
}
63+
5164
// TODO(agoldste): I'm not sure the intent of this test. Using the previous logic for
5265
// the generator, which would try to update the build config before creating
5366
// the build, I can see why the UpdateBuildConfigFunc is set up to return an
@@ -83,6 +96,7 @@ func TestInstantiateRetry(t *testing.T) {
8396
*/
8497

8598
func TestInstantiateDeletingError(t *testing.T) {
99+
source := mocks.MockSource()
86100
generator := BuildGenerator{Client: Client{
87101
GetBuildConfigFunc: func(ctx kapi.Context, name string) (*buildapi.BuildConfig, error) {
88102
bc := &buildapi.BuildConfig{
@@ -91,11 +105,31 @@ func TestInstantiateDeletingError(t *testing.T) {
91105
buildapi.BuildConfigPausedAnnotation: "true",
92106
},
93107
},
108+
Spec: buildapi.BuildConfigSpec{
109+
CommonSpec: buildapi.CommonSpec{
110+
Source: source,
111+
Revision: &buildapi.SourceRevision{
112+
Git: &buildapi.GitSourceRevision{
113+
Commit: "1234",
114+
},
115+
},
116+
},
117+
},
94118
}
95119
return bc, nil
96120
},
97121
GetBuildFunc: func(ctx kapi.Context, name string) (*buildapi.Build, error) {
98122
build := &buildapi.Build{
123+
Spec: buildapi.BuildSpec{
124+
CommonSpec: buildapi.CommonSpec{
125+
Source: source,
126+
Revision: &buildapi.SourceRevision{
127+
Git: &buildapi.GitSourceRevision{
128+
Commit: "1234",
129+
},
130+
},
131+
},
132+
},
99133
Status: buildapi.BuildStatus{
100134
Config: &kapi.ObjectReference{
101135
Name: "buildconfig",
@@ -115,6 +149,33 @@ func TestInstantiateDeletingError(t *testing.T) {
115149
}
116150
}
117151

152+
func TestInstantiateBinaryError(t *testing.T) {
153+
generator := BuildGenerator{Client: Client{
154+
GetBuildConfigFunc: func(ctx kapi.Context, name string) (*buildapi.BuildConfig, error) {
155+
bc := &buildapi.BuildConfig{}
156+
return bc, nil
157+
},
158+
GetBuildFunc: func(ctx kapi.Context, name string) (*buildapi.Build, error) {
159+
build := &buildapi.Build{
160+
Status: buildapi.BuildStatus{
161+
Config: &kapi.ObjectReference{
162+
Name: "buildconfig",
163+
},
164+
},
165+
}
166+
return build, nil
167+
},
168+
}}
169+
_, err := generator.Instantiate(kapi.NewDefaultContext(), &buildapi.BuildRequest{})
170+
if err == nil || !strings.Contains(err.Error(), "can't instantiate binary BuildConfig") {
171+
t.Errorf("Expected error, got different %v", err)
172+
}
173+
_, err = generator.Clone(kapi.NewDefaultContext(), &buildapi.BuildRequest{})
174+
if err == nil || !strings.Contains(err.Error(), "can't clone binary Build") {
175+
t.Errorf("Expected error, got different %v", err)
176+
}
177+
}
178+
118179
func TestInstantiateGetBuildConfigError(t *testing.T) {
119180
generator := BuildGenerator{Client: Client{
120181
GetBuildConfigFunc: func(ctx kapi.Context, name string) (*buildapi.BuildConfig, error) {
@@ -240,6 +301,7 @@ func TestInstantiateWithImageTrigger(t *testing.T) {
240301
},
241302
}
242303

304+
source := mocks.MockSource()
243305
for _, tc := range tests {
244306
bc := &buildapi.BuildConfig{
245307
Spec: buildapi.BuildConfigSpec{
@@ -252,6 +314,12 @@ func TestInstantiateWithImageTrigger(t *testing.T) {
252314
},
253315
},
254316
},
317+
Source: source,
318+
Revision: &buildapi.SourceRevision{
319+
Git: &buildapi.GitSourceRevision{
320+
Commit: "1234",
321+
},
322+
},
255323
},
256324
Triggers: tc.triggers,
257325
},

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)