This is an automated email from the ASF dual-hosted git repository. lburgazzoli pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/camel-k.git
The following commit(s) were added to refs/heads/master by this push: new eaed6b9 Timeout in S2I build #536 eaed6b9 is described below commit eaed6b9fc41f91d8679b2edaa347f4f6b751341d Author: lburgazzoli <lburgazz...@gmail.com> AuthorDate: Wed Mar 13 14:12:21 2019 +0100 Timeout in S2I build #536 --- .../camel/v1alpha1/integrationplatform_types.go | 1 + pkg/builder/builder_steps_test.go | 54 ++++++++++++++++++++++ pkg/builder/s2i/publisher.go | 4 +- pkg/cmd/install.go | 12 +++++ pkg/controller/integrationplatform/initialize.go | 5 ++ pkg/util/kubernetes/wait.go | 13 ++++-- test/builder_integration_test.go | 19 +++++--- 7 files changed, 96 insertions(+), 12 deletions(-) diff --git a/pkg/apis/camel/v1alpha1/integrationplatform_types.go b/pkg/apis/camel/v1alpha1/integrationplatform_types.go index 41e2daf..134017f 100644 --- a/pkg/apis/camel/v1alpha1/integrationplatform_types.go +++ b/pkg/apis/camel/v1alpha1/integrationplatform_types.go @@ -79,6 +79,7 @@ type IntegrationPlatformBuildSpec struct { LocalRepository string `json:"localRepository,omitempty"` Repositories []string `json:"repositories,omitempty"` Registry IntegrationPlatformRegistrySpec `json:"registry,omitempty"` + Timeout metav1.Duration `json:"timeout,omitempty"` } // IntegrationPlatformRegistrySpec -- diff --git a/pkg/builder/builder_steps_test.go b/pkg/builder/builder_steps_test.go index f85a80e..e85bc55 100644 --- a/pkg/builder/builder_steps_test.go +++ b/pkg/builder/builder_steps_test.go @@ -18,9 +18,12 @@ limitations under the License. package builder import ( + "errors" + "sync" "testing" "github.com/apache/camel-k/pkg/apis/camel/v1alpha1" + "github.com/apache/camel-k/pkg/util/cancellable" "github.com/apache/camel-k/pkg/util/defaults" "github.com/apache/camel-k/pkg/util/maven" "github.com/apache/camel-k/pkg/util/test" @@ -292,3 +295,54 @@ func TestSanitizeDependencies(t *testing.T) { Type: "jar", }) } + +func TestFailure(t *testing.T) { + catalog, err := test.DefaultCatalog() + assert.Nil(t, err) + + b := New(nil, "ns") + + var wg sync.WaitGroup + wg.Add(1) + + r := Request{ + C: cancellable.NewContext(), + Catalog: catalog, + RuntimeVersion: defaults.RuntimeVersion, + Steps: []Step{ + NewStep("step1", InitPhase, func(i *Context) error { + return nil + }), + NewStep("step2", ApplicationPublishPhase, func(i *Context) error { + return errors.New("an error") + }), + }, + Platform: v1alpha1.IntegrationPlatformSpec{ + Build: v1alpha1.IntegrationPlatformBuildSpec{ + CamelVersion: catalog.Version, + }, + }, + } + + var res *Result + + b.Submit(r, func(result *Result) { + switch result.Status { + case StatusError: + res = result + wg.Done() + case StatusCompleted: + res = result + wg.Done() + case StatusInterrupted: + res = result + wg.Done() + } + + }) + + wg.Wait() + + assert.NotNil(t, res) + assert.Equal(t, StatusError, res.Status) +} diff --git a/pkg/builder/s2i/publisher.go b/pkg/builder/s2i/publisher.go index 96d80b7..010a2d5 100644 --- a/pkg/builder/s2i/publisher.go +++ b/pkg/builder/s2i/publisher.go @@ -19,7 +19,6 @@ package s2i import ( "io/ioutil" - "time" "k8s.io/apimachinery/pkg/util/json" k8sclient "sigs.k8s.io/controller-runtime/pkg/client" @@ -151,7 +150,8 @@ func Publisher(ctx *builder.Context) error { } } return false, nil - }, 5*time.Minute) + }, ctx.Request.Platform.Build.Timeout.Duration) + if err != nil { return err } diff --git a/pkg/cmd/install.go b/pkg/cmd/install.go index b4a2722..2f2e366 100644 --- a/pkg/cmd/install.go +++ b/pkg/cmd/install.go @@ -20,6 +20,7 @@ package cmd import ( "fmt" "strings" + "time" "github.com/apache/camel-k/deploy" "github.com/apache/camel-k/pkg/apis" @@ -35,6 +36,7 @@ import ( "github.com/apache/camel-k/pkg/util/kubernetes" "github.com/pkg/errors" "github.com/spf13/cobra" + k8serrors "k8s.io/apimachinery/pkg/api/errors" ) @@ -68,6 +70,7 @@ func newCmdInstall(rootCmdOptions *RootCmdOptions) *cobra.Command { cmd.Flags().StringVar(&impl.runtimeVersion, "runtime-version", "", "Set the camel-k runtime version") cmd.Flags().StringVar(&impl.baseImage, "base-image", "", "Set the base image used to run integrations") cmd.Flags().StringSliceVar(&impl.contexts, "context", nil, "Add a camel context to build at startup, by default all known contexts are built") + cmd.Flags().StringVar(&impl.buildTimeout, "build-timeout", "", "Set how long the build process can last") // completion support configureBashAnnotationForFlag( @@ -93,6 +96,7 @@ type installCmdOptions struct { runtimeVersion string baseImage string localRepository string + buildTimeout string repositories []string properties []string contexts []string @@ -182,6 +186,14 @@ func (o *installCmdOptions) install(_ *cobra.Command, _ []string) error { if o.baseImage != "" { platform.Spec.Build.BaseImage = o.baseImage } + if o.buildTimeout != "" { + d, err := time.ParseDuration(o.buildTimeout) + if err != nil { + return err + } + + platform.Spec.Build.Timeout.Duration = d + } platform.Spec.Resources.Contexts = o.contexts diff --git a/pkg/controller/integrationplatform/initialize.go b/pkg/controller/integrationplatform/initialize.go index fe84775..59aead4 100644 --- a/pkg/controller/integrationplatform/initialize.go +++ b/pkg/controller/integrationplatform/initialize.go @@ -19,6 +19,7 @@ package integrationplatform import ( "context" + "time" "github.com/apache/camel-k/pkg/apis/camel/v1alpha1" "github.com/apache/camel-k/pkg/platform" @@ -104,11 +105,15 @@ func (action *initializeAction) Handle(ctx context.Context, ip *v1alpha1.Integra if target.Spec.Build.LocalRepository == "" { target.Spec.Build.LocalRepository = defaults.LocalRepository } + if target.Spec.Build.Timeout.Duration == 0 { + target.Spec.Build.Timeout.Duration = 5 * time.Minute + } action.L.Infof("CamelVersion set to %s", target.Spec.Build.CamelVersion) action.L.Infof("RuntimeVersion set to %s", target.Spec.Build.RuntimeVersion) action.L.Infof("BaseImage set to %s", target.Spec.Build.BaseImage) action.L.Infof("LocalRepository set to %s", target.Spec.Build.LocalRepository) + action.L.Infof("Timeout set to %s", target.Spec.Build.Timeout) for i, r := range target.Spec.Build.Repositories { if i == 0 { diff --git a/pkg/util/kubernetes/wait.go b/pkg/util/kubernetes/wait.go index e4895d7..5c6129b 100644 --- a/pkg/util/kubernetes/wait.go +++ b/pkg/util/kubernetes/wait.go @@ -24,6 +24,8 @@ import ( "github.com/apache/camel-k/pkg/client" "github.com/pkg/errors" "k8s.io/apimachinery/pkg/runtime" + + k8serrors "k8s.io/apimachinery/pkg/api/errors" k8sclient "sigs.k8s.io/controller-runtime/pkg/client" ) @@ -47,14 +49,19 @@ func WaitCondition(ctx context.Context, c client.Client, obj runtime.Object, con for start.Add(maxDuration).After(time.Now()) { err := c.Get(ctx, key, obj) if err != nil { - time.Sleep(sleepTime) - continue + if k8serrors.IsNotFound(err) { + time.Sleep(sleepTime) + continue + } + + return err } satisfied, err := condition(obj) if err != nil { return errors.Wrap(err, "error while evaluating condition") - } else if !satisfied { + } + if !satisfied { time.Sleep(sleepTime) continue } diff --git a/test/builder_integration_test.go b/test/builder_integration_test.go index 293724c..bad83a3 100644 --- a/test/builder_integration_test.go +++ b/test/builder_integration_test.go @@ -26,17 +26,16 @@ import ( "testing" "time" + "github.com/apache/camel-k/pkg/util/cancellable" "github.com/apache/camel-k/pkg/util/defaults" - "github.com/apache/camel-k/pkg/util/test" - "github.com/apache/camel-k/pkg/util/cancellable" - - "k8s.io/apimachinery/pkg/apis/meta/v1" - "github.com/apache/camel-k/pkg/apis/camel/v1alpha1" "github.com/apache/camel-k/pkg/builder" "github.com/apache/camel-k/pkg/builder/s2i" + + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "github.com/stretchr/testify/assert" ) @@ -67,7 +66,7 @@ func TestBuildManagerBuild(t *testing.T) { C: cancellable.NewContext(), Catalog: catalog, RuntimeVersion: defaults.RuntimeVersion, - Meta: v1.ObjectMeta{ + Meta: metav1.ObjectMeta{ Name: "man-test", ResourceVersion: "1", }, @@ -76,6 +75,9 @@ func TestBuildManagerBuild(t *testing.T) { CamelVersion: catalog.Version, RuntimeVersion: defaults.RuntimeVersion, BaseImage: "docker.io/fabric8/s2i-java:3.0-java8", + Timeout: metav1.Duration{ + Duration: 5 * time.Minute, + }, }, }, Dependencies: []string{ @@ -115,7 +117,7 @@ func TestBuildManagerFailedBuild(t *testing.T) { C: cancellable.NewContext(), Catalog: catalog, RuntimeVersion: defaults.RuntimeVersion, - Meta: v1.ObjectMeta{ + Meta: metav1.ObjectMeta{ Name: "man-test", ResourceVersion: "1", }, @@ -124,6 +126,9 @@ func TestBuildManagerFailedBuild(t *testing.T) { CamelVersion: catalog.Version, RuntimeVersion: defaults.RuntimeVersion, BaseImage: "docker.io/fabric8/s2i-java:3.0-java8", + Timeout: metav1.Duration{ + Duration: 5 * time.Minute, + }, }, }, Dependencies: []string{