Skip to content

Commit

Permalink
Allow to specify the run policy for builds
Browse files Browse the repository at this point in the history
  • Loading branch information
mfojtik committed May 2, 2016
1 parent 5c67d2b commit bd47008
Show file tree
Hide file tree
Showing 45 changed files with 1,343 additions and 28 deletions.
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"
)

// 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

0 comments on commit bd47008

Please sign in to comment.