Skip to content

Commit d3c2897

Browse files
committed
Allow to specify the run policy for builds
1 parent 68d9241 commit d3c2897

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

45 files changed

+1341
-24
lines changed

api/swagger-spec/oapi-v1.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17354,6 +17354,10 @@
1735417354
},
1735517355
"description": "Triggers determine how new Builds can be launched from a BuildConfig. If no triggers are defined, a new build can only occur as a result of an explicit client build creation."
1735617356
},
17357+
"runPolicy": {
17358+
"type": "string",
17359+
"description": "RunPolicy describes how the new build created from this build configuration will be scheduled for execution. This is optional, if not specified we default to \"Serial\"."
17360+
},
1735717361
"serviceAccount": {
1735817362
"type": "string",
1735917363
"description": "ServiceAccount is the name of the ServiceAccount to use to run the pod created by this build. The pod will be allowed to use secrets referenced by the ServiceAccount"

pkg/api/deep_copy_generated.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -770,6 +770,7 @@ func deepCopy_api_BuildConfigSpec(in buildapi.BuildConfigSpec, out *buildapi.Bui
770770
} else {
771771
out.Triggers = nil
772772
}
773+
out.RunPolicy = in.RunPolicy
773774
if err := deepCopy_api_BuildSpec(in.BuildSpec, &out.BuildSpec, c); err != nil {
774775
return err
775776
}

pkg/api/serialization_test.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,10 @@ func fuzzInternalObject(t *testing.T, forVersion unversioned.GroupVersion, item
197197
j.From.Kind = specs[c.Intn(len(specs))]
198198
}
199199
},
200+
func(j *build.BuildConfigSpec, c fuzz.Continue) {
201+
c.FuzzNoCustom(j)
202+
j.RunPolicy = build.BuildRunPolicySerial
203+
},
200204
func(j *build.SourceBuildStrategy, c fuzz.Continue) {
201205
c.FuzzNoCustom(j)
202206
j.From.Kind = "ImageStreamTag"

pkg/api/v1/conversion_generated.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1041,6 +1041,7 @@ func autoConvert_api_BuildConfigSpec_To_v1_BuildConfigSpec(in *buildapi.BuildCon
10411041
} else {
10421042
out.Triggers = nil
10431043
}
1044+
out.RunPolicy = v1.BuildRunPolicy(in.RunPolicy)
10441045
if err := Convert_api_BuildSpec_To_v1_BuildSpec(&in.BuildSpec, &out.BuildSpec, s); err != nil {
10451046
return err
10461047
}
@@ -1883,6 +1884,7 @@ func autoConvert_v1_BuildConfigSpec_To_api_BuildConfigSpec(in *v1.BuildConfigSpe
18831884
} else {
18841885
out.Triggers = nil
18851886
}
1887+
out.RunPolicy = buildapi.BuildRunPolicy(in.RunPolicy)
18861888
if err := Convert_v1_BuildSpec_To_api_BuildSpec(&in.BuildSpec, &out.BuildSpec, s); err != nil {
18871889
return err
18881890
}

pkg/api/v1/deep_copy_generated.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -790,6 +790,7 @@ func deepCopy_v1_BuildConfigSpec(in apiv1.BuildConfigSpec, out *apiv1.BuildConfi
790790
} else {
791791
out.Triggers = nil
792792
}
793+
out.RunPolicy = in.RunPolicy
793794
if err := deepCopy_v1_BuildSpec(in.BuildSpec, &out.BuildSpec, c); err != nil {
794795
return err
795796
}

pkg/api/v1beta3/conversion_generated.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1049,6 +1049,7 @@ func autoConvert_api_BuildConfigSpec_To_v1beta3_BuildConfigSpec(in *buildapi.Bui
10491049
} else {
10501050
out.Triggers = nil
10511051
}
1052+
out.RunPolicy = v1beta3.BuildRunPolicy(in.RunPolicy)
10521053
if err := Convert_api_BuildSpec_To_v1beta3_BuildSpec(&in.BuildSpec, &out.BuildSpec, s); err != nil {
10531054
return err
10541055
}
@@ -1825,6 +1826,7 @@ func autoConvert_v1beta3_BuildConfigSpec_To_api_BuildConfigSpec(in *v1beta3.Buil
18251826
} else {
18261827
out.Triggers = nil
18271828
}
1829+
out.RunPolicy = buildapi.BuildRunPolicy(in.RunPolicy)
18281830
if err := Convert_v1beta3_BuildSpec_To_api_BuildSpec(&in.BuildSpec, &out.BuildSpec, s); err != nil {
18291831
return err
18301832
}

pkg/api/v1beta3/deep_copy_generated.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -798,6 +798,7 @@ func deepCopy_v1beta3_BuildConfigSpec(in apiv1beta3.BuildConfigSpec, out *apiv1b
798798
} else {
799799
out.Triggers = nil
800800
}
801+
out.RunPolicy = in.RunPolicy
801802
if err := deepCopy_v1beta3_BuildSpec(in.BuildSpec, &out.BuildSpec, c); err != nil {
802803
return err
803804
}

pkg/build/api/types.go

Lines changed: 35 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ const (
1919
BuildPodNameAnnotation = "openshift.io/build.pod-name"
2020
// BuildLabel is the key of a Pod label whose value is the Name of a Build which is run.
2121
BuildLabel = "openshift.io/build.name"
22+
// BuildRunPolicyLabel represents the start policy used to to start the build.
23+
BuildRunPolicyLabel = "openshift.io/build.start-policy"
2224
// DefaultDockerLabelNamespace is the key of a Build label, whose values are build metadata.
2325
DefaultDockerLabelNamespace = "io.openshift."
2426
// OriginVersion is an environment variable key that indicates the version of origin that
@@ -30,6 +32,15 @@ const (
3032
// DropCapabilities is an environment variable that contains a list of capabilities to drop when
3133
// executing a Source build
3234
DropCapabilities = "DROP_CAPS"
35+
// BuildConfigLabel is the key of a Build label whose value is the ID of a BuildConfig
36+
// on which the Build is based.
37+
BuildConfigLabel = "openshift.io/build-config.name"
38+
// BuildConfigLabelDeprecated was used as BuildConfigLabel before adding namespaces.
39+
// We keep it for backward compatibility.
40+
BuildConfigLabelDeprecated = "buildconfig"
41+
// BuildConfigPausedAnnotation is an annotation that marks a BuildConfig as paused.
42+
// New Builds cannot be instantiated from a paused BuildConfig.
43+
BuildConfigPausedAnnotation = "openshift.io/build-config.paused"
3344
)
3445

3546
// Build encapsulates the inputs needed to produce a new deployable image, as well as
@@ -529,18 +540,6 @@ type BuildOutput struct {
529540
PushSecret *kapi.LocalObjectReference
530541
}
531542

532-
const (
533-
// BuildConfigLabel is the key of a Build label whose value is the ID of a BuildConfig
534-
// on which the Build is based.
535-
BuildConfigLabel = "openshift.io/build-config.name"
536-
// BuildConfigLabelDeprecated was used as BuildConfigLabel before adding namespaces.
537-
// We keep it for backward compatibility.
538-
BuildConfigLabelDeprecated = "buildconfig"
539-
// BuildConfigPausedAnnotation is an annotation that marks a BuildConfig as paused.
540-
// New Builds cannot be instantiated from a paused BuildConfig.
541-
BuildConfigPausedAnnotation = "openshift.io/build-config.paused"
542-
)
543-
544543
// BuildConfig is a template which can be used to create new builds.
545544
type BuildConfig struct {
546545
unversioned.TypeMeta
@@ -559,10 +558,34 @@ type BuildConfigSpec struct {
559558
// are defined, a new build can only occur as a result of an explicit client build creation.
560559
Triggers []BuildTriggerPolicy
561560

561+
// RunPolicy describes how the new build created from this build
562+
// configuration will be scheduled for execution.
563+
// This is optional, if not specified we default to "Serial".
564+
RunPolicy BuildRunPolicy
565+
562566
// BuildSpec is the desired build specification
563567
BuildSpec
564568
}
565569

570+
// BuildRunPolicy defines the behaviour of how the new builds are executed
571+
// from the existing build configuration.
572+
type BuildRunPolicy string
573+
574+
const (
575+
// BuildRunPolicyParallel schedules new builds immediately after they are
576+
// created. Builds will be executed in parallel.
577+
BuildRunPolicyParallel BuildRunPolicy = "Parallel"
578+
579+
// BuildRunPolicySerial schedules new builds to execute in a sequence as
580+
// they are created. Every build gets queued up and will execute when the
581+
// previous build completes. This is the default policy.
582+
BuildRunPolicySerial BuildRunPolicy = "Serial"
583+
584+
// BuildRunPolicySerialLatestOnly schedules only the latest build to execute,
585+
// cancelling all the previously queued build.
586+
BuildRunPolicySerialLatestOnly BuildRunPolicy = "SerialLatestOnly"
587+
)
588+
566589
// BuildConfigStatus contains current state of the build config object.
567590
type BuildConfigStatus struct {
568591
// LastVersion is used to inform about number of last triggered build.

pkg/build/api/v1/conversion.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,11 @@ func Convert_v1_BuildStrategy_To_api_BuildStrategy(in *BuildStrategy, out *newer
216216

217217
func addConversionFuncs(scheme *runtime.Scheme) {
218218
err := scheme.AddDefaultingFuncs(
219+
func(config *BuildConfigSpec) {
220+
if len(config.RunPolicy) == 0 {
221+
config.RunPolicy = BuildRunPolicySerial
222+
}
223+
},
219224
func(source *BuildSource) {
220225
if (source != nil) && (source.Type == BuildSourceBinary) && (source.Binary == nil) {
221226
source.Binary = &BinaryBuildSource{}

pkg/build/api/v1/swagger_doc.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,8 +63,9 @@ func (BuildConfigList) SwaggerDoc() map[string]string {
6363
}
6464

6565
var map_BuildConfigSpec = map[string]string{
66-
"": "BuildConfigSpec describes when and how builds are created",
67-
"triggers": "Triggers determine how new Builds can be launched from a BuildConfig. If no triggers are defined, a new build can only occur as a result of an explicit client build creation.",
66+
"": "BuildConfigSpec describes when and how builds are created",
67+
"triggers": "Triggers determine how new Builds can be launched from a BuildConfig. If no triggers are defined, a new build can only occur as a result of an explicit client build creation.",
68+
"runPolicy": "RunPolicy describes how the new build created from this build configuration will be scheduled for execution. This is optional, if not specified we default to \"Serial\".",
6869
}
6970

7071
func (BuildConfigSpec) SwaggerDoc() map[string]string {

pkg/build/api/v1/types.go

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -527,10 +527,34 @@ type BuildConfigSpec struct {
527527
// are defined, a new build can only occur as a result of an explicit client build creation.
528528
Triggers []BuildTriggerPolicy `json:"triggers"`
529529

530+
// RunPolicy describes how the new build created from this build
531+
// configuration will be scheduled for execution.
532+
// This is optional, if not specified we default to "Serial".
533+
RunPolicy BuildRunPolicy `json:"runPolicy,omitempty"`
534+
530535
// BuildSpec is the desired build specification
531536
BuildSpec `json:",inline"`
532537
}
533538

539+
// BuildRunPolicy defines the behaviour of how the new builds are executed
540+
// from the existing build configuration.
541+
type BuildRunPolicy string
542+
543+
const (
544+
// BuildRunPolicyParallel schedules new builds immediately after they are
545+
// created. Builds will be executed in parallel.
546+
BuildRunPolicyParallel BuildRunPolicy = "Parallel"
547+
548+
// BuildRunPolicySerial schedules new builds to execute in a sequence as
549+
// they are created. Every build gets queued up and will execute when the
550+
// previous build completes. This is the default policy.
551+
BuildRunPolicySerial BuildRunPolicy = "Serial"
552+
553+
// BuildRunPolicySerialLatestOnly schedules only the latest build to execute,
554+
// cancelling all the previously queued build.
555+
BuildRunPolicySerialLatestOnly BuildRunPolicy = "SerialLatestOnly"
556+
)
557+
534558
// BuildConfigStatus contains current state of the build config object.
535559
type BuildConfigStatus struct {
536560
// LastVersion is used to inform about number of last triggered build.

pkg/build/api/v1beta3/conversion.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,11 @@ func Convert_api_BuildStrategy_To_v1beta3_BuildStrategy(in *newer.BuildStrategy,
220220

221221
func addConversionFuncs(scheme *runtime.Scheme) {
222222
err := scheme.AddDefaultingFuncs(
223+
func(config *BuildConfigSpec) {
224+
if len(config.RunPolicy) == 0 {
225+
config.RunPolicy = BuildRunPolicySerial
226+
}
227+
},
223228
func(strategy *BuildStrategy) {
224229
if (strategy != nil) && (strategy.Type == DockerBuildStrategyType) {
225230
// initialize DockerStrategy to a default state if it's not set.

pkg/build/api/v1beta3/types.go

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -510,9 +510,33 @@ type BuildConfigSpec struct {
510510
// are defined, a new build can only occur as a result of an explicit client build creation.
511511
Triggers []BuildTriggerPolicy `json:"triggers"`
512512

513+
// RunPolicy describes how the new build created from this build
514+
// configuration will be scheduled for execution.
515+
// This is optional, if not specified we default to "Serial".
516+
RunPolicy BuildRunPolicy `json:"runPolicy,omitempty"`
517+
513518
BuildSpec `json:",inline"`
514519
}
515520

521+
// BuildRunPolicy defines the behaviour of how the new builds are executed
522+
// from the existing build configuration.
523+
type BuildRunPolicy string
524+
525+
const (
526+
// BuildRunPolicyParallel schedules new builds immediately after they are
527+
// created. Builds will be executed in parallel.
528+
BuildRunPolicyParallel BuildRunPolicy = "Parallel"
529+
530+
// BuildRunPolicySerial schedules new builds to execute in a sequence as
531+
// they are created. Every build gets queued up and will execute when the
532+
// previous build completes. This is the default policy.
533+
BuildRunPolicySerial BuildRunPolicy = "Serial"
534+
535+
// BuildRunPolicySerialLatestOnly schedules only the latest build to execute,
536+
// cancelling all the previously queued build.
537+
BuildRunPolicySerialLatestOnly BuildRunPolicy = "SerialLatestOnly"
538+
)
539+
516540
// BuildConfigStatus contains current state of the build config object.
517541
type BuildConfigStatus struct {
518542
// LastVersion is used to inform about number of last triggered build.

pkg/build/api/validation/validation.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,13 @@ func ValidateBuildConfig(config *buildapi.BuildConfig) field.ErrorList {
8282
fromRefs[fromKey] = struct{}{}
8383
}
8484

85+
switch config.Spec.RunPolicy {
86+
case buildapi.BuildRunPolicyParallel, buildapi.BuildRunPolicySerial, buildapi.BuildRunPolicySerialLatestOnly:
87+
default:
88+
allErrs = append(allErrs, field.Invalid(specPath.Child("runPolicy"), config.Spec.RunPolicy,
89+
"run policy must Parallel, Serial, or SerialLatestOnly"))
90+
}
91+
8592
allErrs = append(allErrs, validateBuildSpec(&config.Spec.BuildSpec, specPath)...)
8693

8794
return allErrs

pkg/build/api/validation/validation_test.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,7 @@ func TestBuildConfigEmptySource(t *testing.T) {
137137
{
138138
ObjectMeta: kapi.ObjectMeta{Name: "config-id", Namespace: "namespace"},
139139
Spec: buildapi.BuildConfigSpec{
140+
RunPolicy: buildapi.BuildRunPolicySerial,
140141
BuildSpec: buildapi.BuildSpec{
141142
Source: buildapi.BuildSource{},
142143
Strategy: buildapi.BuildStrategy{
@@ -159,6 +160,7 @@ func TestBuildConfigEmptySource(t *testing.T) {
159160
{
160161
ObjectMeta: kapi.ObjectMeta{Name: "config-id", Namespace: "namespace"},
161162
Spec: buildapi.BuildConfigSpec{
163+
RunPolicy: buildapi.BuildRunPolicySerial,
162164
BuildSpec: buildapi.BuildSpec{
163165
Source: buildapi.BuildSource{},
164166
Strategy: buildapi.BuildStrategy{
@@ -188,6 +190,7 @@ func TestBuildConfigEmptySource(t *testing.T) {
188190
badBuildConfig := buildapi.BuildConfig{
189191
ObjectMeta: kapi.ObjectMeta{Name: "config-id", Namespace: "namespace"},
190192
Spec: buildapi.BuildConfigSpec{
193+
RunPolicy: buildapi.BuildRunPolicySerial,
191194
BuildSpec: buildapi.BuildSpec{
192195
Source: buildapi.BuildSource{},
193196
Strategy: buildapi.BuildStrategy{
@@ -384,6 +387,7 @@ func TestBuildConfigGitSourceWithProxyFailure(t *testing.T) {
384387
buildConfig := &buildapi.BuildConfig{
385388
ObjectMeta: kapi.ObjectMeta{Name: "config-id", Namespace: "namespace"},
386389
Spec: buildapi.BuildConfigSpec{
390+
RunPolicy: buildapi.BuildRunPolicySerial,
387391
BuildSpec: buildapi.BuildSpec{
388392
Source: buildapi.BuildSource{
389393
Git: &buildapi.GitBuildSource{
@@ -424,6 +428,7 @@ func TestBuildConfigDockerStrategyImageChangeTrigger(t *testing.T) {
424428
buildConfig := &buildapi.BuildConfig{
425429
ObjectMeta: kapi.ObjectMeta{Name: "config-id", Namespace: "namespace"},
426430
Spec: buildapi.BuildConfigSpec{
431+
RunPolicy: buildapi.BuildRunPolicySerial,
427432
BuildSpec: buildapi.BuildSpec{
428433
Source: buildapi.BuildSource{
429434
Git: &buildapi.GitBuildSource{
@@ -467,6 +472,7 @@ func TestBuildConfigValidationFailureRequiredName(t *testing.T) {
467472
buildConfig := &buildapi.BuildConfig{
468473
ObjectMeta: kapi.ObjectMeta{Name: "", Namespace: "foo"},
469474
Spec: buildapi.BuildConfigSpec{
475+
RunPolicy: buildapi.BuildRunPolicySerial,
470476
BuildSpec: buildapi.BuildSpec{
471477
Source: buildapi.BuildSource{
472478
Git: &buildapi.GitBuildSource{
@@ -738,6 +744,7 @@ func TestBuildConfigImageChangeTriggers(t *testing.T) {
738744
buildConfig := &buildapi.BuildConfig{
739745
ObjectMeta: kapi.ObjectMeta{Name: "bar", Namespace: "foo"},
740746
Spec: buildapi.BuildConfigSpec{
747+
RunPolicy: buildapi.BuildRunPolicySerial,
741748
BuildSpec: buildapi.BuildSpec{
742749
Source: buildapi.BuildSource{
743750
Git: &buildapi.GitBuildSource{
@@ -782,6 +789,7 @@ func TestBuildConfigValidationOutputFailure(t *testing.T) {
782789
buildConfig := &buildapi.BuildConfig{
783790
ObjectMeta: kapi.ObjectMeta{Name: ""},
784791
Spec: buildapi.BuildConfigSpec{
792+
RunPolicy: buildapi.BuildRunPolicySerial,
785793
BuildSpec: buildapi.BuildSpec{
786794
Source: buildapi.BuildSource{
787795
Git: &buildapi.GitBuildSource{

pkg/build/client/clients.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package client
33
import (
44
buildapi "github.com/openshift/origin/pkg/build/api"
55
osclient "github.com/openshift/origin/pkg/client"
6+
kapi "k8s.io/kubernetes/pkg/api"
67
)
78

89
// BuildConfigGetter provides methods for getting BuildConfigs
@@ -41,6 +42,11 @@ type BuildUpdater interface {
4142
Update(namespace string, build *buildapi.Build) error
4243
}
4344

45+
// BuildLister provides methods for listing the Builds.
46+
type BuildLister interface {
47+
List(namespace string, opts kapi.ListOptions) (*buildapi.BuildList, error)
48+
}
49+
4450
// OSClientBuildClient deletes build create and update operations to the OpenShift client interface
4551
type OSClientBuildClient struct {
4652
Client osclient.Interface
@@ -57,6 +63,11 @@ func (c OSClientBuildClient) Update(namespace string, build *buildapi.Build) err
5763
return e
5864
}
5965

66+
// List lists the builds using the OpenShift client.
67+
func (c OSClientBuildClient) List(namespace string, opts kapi.ListOptions) (*buildapi.BuildList, error) {
68+
return c.Client.Builds(namespace).List(opts)
69+
}
70+
6071
// BuildCloner provides methods for cloning builds
6172
type BuildCloner interface {
6273
Clone(namespace string, request *buildapi.BuildRequest) (*buildapi.Build, error)

0 commit comments

Comments
 (0)