Skip to content

Allow to specify runPolicy for BuildConfig #8453

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
May 2, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions api/swagger-spec/oapi-v1.json
Original file line number Diff line number Diff line change
Expand Up @@ -17512,6 +17512,10 @@
},
"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."
},
"runPolicy": {
"type": "string",
"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\"."
},
"serviceAccount": {
"type": "string",
"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"
Expand Down
1 change: 1 addition & 0 deletions pkg/api/deep_copy_generated.go
Original file line number Diff line number Diff line change
Expand Up @@ -770,6 +770,7 @@ func deepCopy_api_BuildConfigSpec(in buildapi.BuildConfigSpec, out *buildapi.Bui
} else {
out.Triggers = nil
}
out.RunPolicy = in.RunPolicy
if err := deepCopy_api_BuildSpec(in.BuildSpec, &out.BuildSpec, c); err != nil {
return err
}
Expand Down
4 changes: 4 additions & 0 deletions pkg/api/serialization_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -197,6 +197,10 @@ func fuzzInternalObject(t *testing.T, forVersion unversioned.GroupVersion, item
j.From.Kind = specs[c.Intn(len(specs))]
}
},
func(j *build.BuildConfigSpec, c fuzz.Continue) {
c.FuzzNoCustom(j)
j.RunPolicy = build.BuildRunPolicySerial
},
func(j *build.SourceBuildStrategy, c fuzz.Continue) {
c.FuzzNoCustom(j)
j.From.Kind = "ImageStreamTag"
Expand Down
2 changes: 2 additions & 0 deletions pkg/api/v1/conversion_generated.go
Original file line number Diff line number Diff line change
Expand Up @@ -1041,6 +1041,7 @@ func autoConvert_api_BuildConfigSpec_To_v1_BuildConfigSpec(in *buildapi.BuildCon
} else {
out.Triggers = nil
}
out.RunPolicy = v1.BuildRunPolicy(in.RunPolicy)
if err := Convert_api_BuildSpec_To_v1_BuildSpec(&in.BuildSpec, &out.BuildSpec, s); err != nil {
return err
}
Expand Down Expand Up @@ -1906,6 +1907,7 @@ func autoConvert_v1_BuildConfigSpec_To_api_BuildConfigSpec(in *v1.BuildConfigSpe
} else {
out.Triggers = nil
}
out.RunPolicy = buildapi.BuildRunPolicy(in.RunPolicy)
if err := Convert_v1_BuildSpec_To_api_BuildSpec(&in.BuildSpec, &out.BuildSpec, s); err != nil {
return err
}
Expand Down
1 change: 1 addition & 0 deletions pkg/api/v1/deep_copy_generated.go
Original file line number Diff line number Diff line change
Expand Up @@ -790,6 +790,7 @@ func deepCopy_v1_BuildConfigSpec(in apiv1.BuildConfigSpec, out *apiv1.BuildConfi
} else {
out.Triggers = nil
}
out.RunPolicy = in.RunPolicy
if err := deepCopy_v1_BuildSpec(in.BuildSpec, &out.BuildSpec, c); err != nil {
return err
}
Expand Down
2 changes: 2 additions & 0 deletions pkg/api/v1beta3/conversion_generated.go
Original file line number Diff line number Diff line change
Expand Up @@ -1049,6 +1049,7 @@ func autoConvert_api_BuildConfigSpec_To_v1beta3_BuildConfigSpec(in *buildapi.Bui
} else {
out.Triggers = nil
}
out.RunPolicy = v1beta3.BuildRunPolicy(in.RunPolicy)
if err := Convert_api_BuildSpec_To_v1beta3_BuildSpec(&in.BuildSpec, &out.BuildSpec, s); err != nil {
return err
}
Expand Down Expand Up @@ -1812,6 +1813,7 @@ func autoConvert_v1beta3_BuildConfigSpec_To_api_BuildConfigSpec(in *v1beta3.Buil
} else {
out.Triggers = nil
}
out.RunPolicy = buildapi.BuildRunPolicy(in.RunPolicy)
if err := Convert_v1beta3_BuildSpec_To_api_BuildSpec(&in.BuildSpec, &out.BuildSpec, s); err != nil {
return err
}
Expand Down
1 change: 1 addition & 0 deletions pkg/api/v1beta3/deep_copy_generated.go
Original file line number Diff line number Diff line change
Expand Up @@ -798,6 +798,7 @@ func deepCopy_v1beta3_BuildConfigSpec(in apiv1beta3.BuildConfigSpec, out *apiv1b
} else {
out.Triggers = nil
}
out.RunPolicy = in.RunPolicy
if err := deepCopy_v1beta3_BuildSpec(in.BuildSpec, &out.BuildSpec, c); err != nil {
return err
}
Expand Down
47 changes: 35 additions & 12 deletions pkg/build/api/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@ const (
BuildPodNameAnnotation = "openshift.io/build.pod-name"
// BuildLabel is the key of a Pod label whose value is the Name of a Build which is run.
BuildLabel = "openshift.io/build.name"
// BuildRunPolicyLabel represents the start policy used to to start the build.
BuildRunPolicyLabel = "openshift.io/build.start-policy"
// DefaultDockerLabelNamespace is the key of a Build label, whose values are build metadata.
DefaultDockerLabelNamespace = "io.openshift."
// OriginVersion is an environment variable key that indicates the version of origin that
Expand All @@ -30,6 +32,15 @@ const (
// DropCapabilities is an environment variable that contains a list of capabilities to drop when
// executing a Source build
DropCapabilities = "DROP_CAPS"
// BuildConfigLabel is the key of a Build label whose value is the ID of a BuildConfig
// on which the Build is based.
BuildConfigLabel = "openshift.io/build-config.name"
// BuildConfigLabelDeprecated was used as BuildConfigLabel before adding namespaces.
// We keep it for backward compatibility.
BuildConfigLabelDeprecated = "buildconfig"
// BuildConfigPausedAnnotation is an annotation that marks a BuildConfig as paused.
// New Builds cannot be instantiated from a paused BuildConfig.
BuildConfigPausedAnnotation = "openshift.io/build-config.paused"
)

// Build encapsulates the inputs needed to produce a new deployable image, as well as
Expand Down Expand Up @@ -545,18 +556,6 @@ type BuildOutput struct {
PushSecret *kapi.LocalObjectReference
}

const (
// BuildConfigLabel is the key of a Build label whose value is the ID of a BuildConfig
// on which the Build is based.
BuildConfigLabel = "openshift.io/build-config.name"
// BuildConfigLabelDeprecated was used as BuildConfigLabel before adding namespaces.
// We keep it for backward compatibility.
BuildConfigLabelDeprecated = "buildconfig"
// BuildConfigPausedAnnotation is an annotation that marks a BuildConfig as paused.
// New Builds cannot be instantiated from a paused BuildConfig.
BuildConfigPausedAnnotation = "openshift.io/build-config.paused"
)

// BuildConfig is a template which can be used to create new builds.
type BuildConfig struct {
unversioned.TypeMeta
Expand All @@ -575,10 +574,34 @@ type BuildConfigSpec struct {
// are defined, a new build can only occur as a result of an explicit client build creation.
Triggers []BuildTriggerPolicy

// 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".
RunPolicy BuildRunPolicy

// BuildSpec is the desired build specification
BuildSpec
}

// BuildRunPolicy defines the behaviour of how the new builds are executed
// from the existing build configuration.
type BuildRunPolicy string

const (
// BuildRunPolicyParallel schedules new builds immediately after they are
// created. Builds will be executed in parallel.
BuildRunPolicyParallel BuildRunPolicy = "Parallel"

// BuildRunPolicySerial schedules new builds to execute in a sequence as
// they are created. Every build gets queued up and will execute when the
// previous build completes. This is the default policy.
BuildRunPolicySerial BuildRunPolicy = "Serial"

// BuildRunPolicySerialLatestOnly schedules only the latest build to execute,
// cancelling all the previously queued build.
BuildRunPolicySerialLatestOnly BuildRunPolicy = "SerialLatestOnly"
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

SerialLatestOnly sounds too verbose. How about LatestOnly?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

already discussed... we are going with SerialLatestOnly for now... we can revisit for v2 api.

)

// BuildConfigStatus contains current state of the build config object.
type BuildConfigStatus struct {
// LastVersion is used to inform about number of last triggered build.
Expand Down
5 changes: 5 additions & 0 deletions pkg/build/api/v1/conversion.go
Original file line number Diff line number Diff line change
Expand Up @@ -218,6 +218,11 @@ func Convert_v1_BuildStrategy_To_api_BuildStrategy(in *BuildStrategy, out *newer

func addConversionFuncs(scheme *runtime.Scheme) {
err := scheme.AddDefaultingFuncs(
func(config *BuildConfigSpec) {
if len(config.RunPolicy) == 0 {
config.RunPolicy = BuildRunPolicySerial
}
},
func(source *BuildSource) {
if (source != nil) && (source.Type == BuildSourceBinary) && (source.Binary == nil) {
source.Binary = &BinaryBuildSource{}
Expand Down
5 changes: 3 additions & 2 deletions pkg/build/api/v1/swagger_doc.go
Original file line number Diff line number Diff line change
Expand Up @@ -63,8 +63,9 @@ func (BuildConfigList) SwaggerDoc() map[string]string {
}

var map_BuildConfigSpec = map[string]string{
"": "BuildConfigSpec describes when and how builds are created",
"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.",
"": "BuildConfigSpec describes when and how builds are created",
"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.",
"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\".",
}

func (BuildConfigSpec) SwaggerDoc() map[string]string {
Expand Down
24 changes: 24 additions & 0 deletions pkg/build/api/v1/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -546,10 +546,34 @@ type BuildConfigSpec struct {
// are defined, a new build can only occur as a result of an explicit client build creation.
Triggers []BuildTriggerPolicy `json:"triggers"`

// 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".
RunPolicy BuildRunPolicy `json:"runPolicy,omitempty"`

// BuildSpec is the desired build specification
BuildSpec `json:",inline"`
}

// BuildRunPolicy defines the behaviour of how the new builds are executed
// from the existing build configuration.
type BuildRunPolicy string

const (
// BuildRunPolicyParallel schedules new builds immediately after they are
// created. Builds will be executed in parallel.
BuildRunPolicyParallel BuildRunPolicy = "Parallel"

// BuildRunPolicySerial schedules new builds to execute in a sequence as
// they are created. Every build gets queued up and will execute when the
// previous build completes. This is the default policy.
BuildRunPolicySerial BuildRunPolicy = "Serial"

// BuildRunPolicySerialLatestOnly schedules only the latest build to execute,
// cancelling all the previously queued build.
BuildRunPolicySerialLatestOnly BuildRunPolicy = "SerialLatestOnly"
)

// BuildConfigStatus contains current state of the build config object.
type BuildConfigStatus struct {
// lastVersion is used to inform about number of last triggered build.
Expand Down
5 changes: 5 additions & 0 deletions pkg/build/api/v1beta3/conversion.go
Original file line number Diff line number Diff line change
Expand Up @@ -220,6 +220,11 @@ func Convert_api_BuildStrategy_To_v1beta3_BuildStrategy(in *newer.BuildStrategy,

func addConversionFuncs(scheme *runtime.Scheme) {
err := scheme.AddDefaultingFuncs(
func(config *BuildConfigSpec) {
if len(config.RunPolicy) == 0 {
config.RunPolicy = BuildRunPolicySerial
}
},
func(strategy *BuildStrategy) {
if (strategy != nil) && (strategy.Type == DockerBuildStrategyType) {
// initialize DockerStrategy to a default state if it's not set.
Expand Down
24 changes: 24 additions & 0 deletions pkg/build/api/v1beta3/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -510,9 +510,33 @@ type BuildConfigSpec struct {
// are defined, a new build can only occur as a result of an explicit client build creation.
Triggers []BuildTriggerPolicy `json:"triggers"`

// 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".
RunPolicy BuildRunPolicy `json:"runPolicy,omitempty"`

BuildSpec `json:",inline"`
}

// BuildRunPolicy defines the behaviour of how the new builds are executed
// from the existing build configuration.
type BuildRunPolicy string

const (
// BuildRunPolicyParallel schedules new builds immediately after they are
// created. Builds will be executed in parallel.
BuildRunPolicyParallel BuildRunPolicy = "Parallel"

// BuildRunPolicySerial schedules new builds to execute in a sequence as
// they are created. Every build gets queued up and will execute when the
// previous build completes. This is the default policy.
BuildRunPolicySerial BuildRunPolicy = "Serial"

// BuildRunPolicySerialLatestOnly schedules only the latest build to execute,
// cancelling all the previously queued build.
BuildRunPolicySerialLatestOnly BuildRunPolicy = "SerialLatestOnly"
)

// BuildConfigStatus contains current state of the build config object.
type BuildConfigStatus struct {
// LastVersion is used to inform about number of last triggered build.
Expand Down
7 changes: 7 additions & 0 deletions pkg/build/api/validation/validation.go
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,13 @@ func ValidateBuildConfig(config *buildapi.BuildConfig) field.ErrorList {
fromRefs[fromKey] = struct{}{}
}

switch config.Spec.RunPolicy {
case buildapi.BuildRunPolicyParallel, buildapi.BuildRunPolicySerial, buildapi.BuildRunPolicySerialLatestOnly:
default:
allErrs = append(allErrs, field.Invalid(specPath.Child("runPolicy"), config.Spec.RunPolicy,
"run policy must Parallel, Serial, or SerialLatestOnly"))
}

allErrs = append(allErrs, validateBuildSpec(&config.Spec.BuildSpec, specPath)...)

return allErrs
Expand Down
8 changes: 8 additions & 0 deletions pkg/build/api/validation/validation_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,7 @@ func TestBuildConfigEmptySource(t *testing.T) {
{
ObjectMeta: kapi.ObjectMeta{Name: "config-id", Namespace: "namespace"},
Spec: buildapi.BuildConfigSpec{
RunPolicy: buildapi.BuildRunPolicySerial,
BuildSpec: buildapi.BuildSpec{
Source: buildapi.BuildSource{},
Strategy: buildapi.BuildStrategy{
Expand All @@ -159,6 +160,7 @@ func TestBuildConfigEmptySource(t *testing.T) {
{
ObjectMeta: kapi.ObjectMeta{Name: "config-id", Namespace: "namespace"},
Spec: buildapi.BuildConfigSpec{
RunPolicy: buildapi.BuildRunPolicySerial,
BuildSpec: buildapi.BuildSpec{
Source: buildapi.BuildSource{},
Strategy: buildapi.BuildStrategy{
Expand Down Expand Up @@ -188,6 +190,7 @@ func TestBuildConfigEmptySource(t *testing.T) {
badBuildConfig := buildapi.BuildConfig{
ObjectMeta: kapi.ObjectMeta{Name: "config-id", Namespace: "namespace"},
Spec: buildapi.BuildConfigSpec{
RunPolicy: buildapi.BuildRunPolicySerial,
BuildSpec: buildapi.BuildSpec{
Source: buildapi.BuildSource{},
Strategy: buildapi.BuildStrategy{
Expand Down Expand Up @@ -384,6 +387,7 @@ func TestBuildConfigGitSourceWithProxyFailure(t *testing.T) {
buildConfig := &buildapi.BuildConfig{
ObjectMeta: kapi.ObjectMeta{Name: "config-id", Namespace: "namespace"},
Spec: buildapi.BuildConfigSpec{
RunPolicy: buildapi.BuildRunPolicySerial,
BuildSpec: buildapi.BuildSpec{
Source: buildapi.BuildSource{
Git: &buildapi.GitBuildSource{
Expand Down Expand Up @@ -424,6 +428,7 @@ func TestBuildConfigDockerStrategyImageChangeTrigger(t *testing.T) {
buildConfig := &buildapi.BuildConfig{
ObjectMeta: kapi.ObjectMeta{Name: "config-id", Namespace: "namespace"},
Spec: buildapi.BuildConfigSpec{
RunPolicy: buildapi.BuildRunPolicySerial,
BuildSpec: buildapi.BuildSpec{
Source: buildapi.BuildSource{
Git: &buildapi.GitBuildSource{
Expand Down Expand Up @@ -467,6 +472,7 @@ func TestBuildConfigValidationFailureRequiredName(t *testing.T) {
buildConfig := &buildapi.BuildConfig{
ObjectMeta: kapi.ObjectMeta{Name: "", Namespace: "foo"},
Spec: buildapi.BuildConfigSpec{
RunPolicy: buildapi.BuildRunPolicySerial,
BuildSpec: buildapi.BuildSpec{
Source: buildapi.BuildSource{
Git: &buildapi.GitBuildSource{
Expand Down Expand Up @@ -738,6 +744,7 @@ func TestBuildConfigImageChangeTriggers(t *testing.T) {
buildConfig := &buildapi.BuildConfig{
ObjectMeta: kapi.ObjectMeta{Name: "bar", Namespace: "foo"},
Spec: buildapi.BuildConfigSpec{
RunPolicy: buildapi.BuildRunPolicySerial,
BuildSpec: buildapi.BuildSpec{
Source: buildapi.BuildSource{
Git: &buildapi.GitBuildSource{
Expand Down Expand Up @@ -782,6 +789,7 @@ func TestBuildConfigValidationOutputFailure(t *testing.T) {
buildConfig := &buildapi.BuildConfig{
ObjectMeta: kapi.ObjectMeta{Name: ""},
Spec: buildapi.BuildConfigSpec{
RunPolicy: buildapi.BuildRunPolicySerial,
BuildSpec: buildapi.BuildSpec{
Source: buildapi.BuildSource{
Git: &buildapi.GitBuildSource{
Expand Down
11 changes: 11 additions & 0 deletions pkg/build/client/clients.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package client
import (
buildapi "github.com/openshift/origin/pkg/build/api"
osclient "github.com/openshift/origin/pkg/client"
kapi "k8s.io/kubernetes/pkg/api"
)

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

// BuildLister provides methods for listing the Builds.
type BuildLister interface {
List(namespace string, opts kapi.ListOptions) (*buildapi.BuildList, error)
}

// OSClientBuildClient deletes build create and update operations to the OpenShift client interface
type OSClientBuildClient struct {
Client osclient.Interface
Expand All @@ -57,6 +63,11 @@ func (c OSClientBuildClient) Update(namespace string, build *buildapi.Build) err
return e
}

// List lists the builds using the OpenShift client.
func (c OSClientBuildClient) List(namespace string, opts kapi.ListOptions) (*buildapi.BuildList, error) {
return c.Client.Builds(namespace).List(opts)
}

// BuildCloner provides methods for cloning builds
type BuildCloner interface {
Clone(namespace string, request *buildapi.BuildRequest) (*buildapi.Build, error)
Expand Down
Loading