// WaitForABuild waits for a Build object to match either isOK or isFailed conditions. func WaitForABuild(c client.BuildInterface, name string, isOK, isFailed func(*buildapi.Build) bool) error { // wait 2 minutes for build to exist err := wait.Poll(1*time.Second, 2*time.Minute, func() (bool, error) { if _, err := c.Get(name); err != nil { return false, nil } return true, nil }) if err == wait.ErrWaitTimeout { return fmt.Errorf("Timed out waiting for build %q to be created", name) } if err != nil { return err } // wait longer for the build to run to completion err = wait.Poll(5*time.Second, 60*time.Minute, func() (bool, error) { list, err := c.List(kapi.ListOptions{FieldSelector: fields.Set{"name": name}.AsSelector()}) if err != nil { return false, err } for i := range list.Items { if name == list.Items[i].Name && isOK(&list.Items[i]) { return true, nil } if name != list.Items[i].Name || isFailed(&list.Items[i]) { return false, fmt.Errorf("The build %q status is %q", name, list.Items[i].Status.Phase) } } return false, nil }) if err == wait.ErrWaitTimeout { return fmt.Errorf("Timed out waiting for build %q to complete", name) } return err }
func updateBuildRevision(c client.BuildInterface, build *api.Build, sourceInfo *git.SourceInfo) { if build.Spec.Revision != nil { return } build.Spec.Revision = &api.SourceRevision{ Git: &api.GitSourceRevision{ Commit: sourceInfo.CommitID, Message: sourceInfo.Message, Author: api.SourceControlUser{ Name: sourceInfo.AuthorName, Email: sourceInfo.AuthorEmail, }, Committer: api.SourceControlUser{ Name: sourceInfo.CommitterName, Email: sourceInfo.CommitterEmail, }, }, } // Reset ResourceVersion to avoid a conflict with other updates to the build build.ResourceVersion = "" glog.V(4).Infof("Setting build revision to %#v", build.Spec.Revision.Git) _, err := c.UpdateDetails(build) if err != nil { glog.Warningf("An error occurred saving build revision: %v", err) } }
func createBuild(t *testing.T, buildInterface client.BuildInterface, strategy string) (*buildapi.Build, error) { build := &buildapi.Build{} build.GenerateName = strings.ToLower(string(strategy)) + "-build-" build.Spec.Strategy = strategyForType(strategy) build.Spec.Source.Git = &buildapi.GitBuildSource{URI: "example.org"} return buildInterface.Create(build) }
func createDockerBuild(t *testing.T, buildInterface client.BuildInterface) (*buildapi.Build, error) { dockerBuild := &buildapi.Build{} dockerBuild.GenerateName = "docker-build-" dockerBuild.Spec.Strategy.Type = buildapi.DockerBuildStrategyType dockerBuild.Spec.Source.Type = buildapi.BuildSourceGit dockerBuild.Spec.Source.Git = &buildapi.GitBuildSource{URI: "example.org"} return buildInterface.Create(dockerBuild) }
func createCustomBuild(t *testing.T, buildInterface client.BuildInterface) (*buildapi.Build, error) { dockerBuild := &buildapi.Build{} dockerBuild.GenerateName = "custom-build-" dockerBuild.Spec.Strategy.Type = buildapi.CustomBuildStrategyType dockerBuild.Spec.Strategy.CustomStrategy = &buildapi.CustomBuildStrategy{From: kapi.ObjectReference{Name: "name:tag"}} dockerBuild.Spec.Source.Type = buildapi.BuildSourceGit dockerBuild.Spec.Source.Git = &buildapi.GitBuildSource{URI: "example.org"} return buildInterface.Create(dockerBuild) }
func createBuild(t *testing.T, buildInterface client.BuildInterface, strategy string) (*buildapi.Build, error) { build := &buildapi.Build{} build.ObjectMeta.Labels = map[string]string{ buildapi.BuildConfigLabel: "mock-build-config", buildapi.BuildRunPolicyLabel: string(buildapi.BuildRunPolicyParallel), } build.GenerateName = strings.ToLower(string(strategy)) + "-build-" build.Spec.Strategy = strategyForType(t, strategy) build.Spec.Source.Git = &buildapi.GitBuildSource{URI: "example.org"} return buildInterface.Create(build) }
// WaitForBuildComplete waits for a build identified by the name to complete func WaitForBuildComplete(c osclient.BuildInterface, name string) error { isOK := func(b *buildapi.Build) bool { return b.Status.Phase == buildapi.BuildPhaseComplete } isFailed := func(b *buildapi.Build) bool { return b.Status.Phase == buildapi.BuildPhaseFailed || b.Status.Phase == buildapi.BuildPhaseCancelled || b.Status.Phase == buildapi.BuildPhaseError } for { list, err := c.List(kapi.ListOptions{FieldSelector: fields.Set{"name": name}.AsSelector()}) if err != nil { return err } for i := range list.Items { if name == list.Items[i].Name && isOK(&list.Items[i]) { return nil } if name != list.Items[i].Name || isFailed(&list.Items[i]) { return fmt.Errorf("the build %s/%s status is %q", list.Items[i].Namespace, list.Items[i].Name, list.Items[i].Status.Phase) } } rv := list.ResourceVersion w, err := c.Watch(kapi.ListOptions{FieldSelector: fields.Set{"name": name}.AsSelector(), ResourceVersion: rv}) if err != nil { return err } defer w.Stop() for { val, ok := <-w.ResultChan() if !ok { // reget and re-watch break } if e, ok := val.Object.(*buildapi.Build); ok { if name == e.Name && isOK(e) { return nil } if name != e.Name || isFailed(e) { return fmt.Errorf("The build %s/%s status is %q", e.Namespace, name, e.Status.Phase) } } } } }
// WaitForABuild waits for a Build object to match either isOK or isFailed conditions func WaitForABuild(c client.BuildInterface, name string, isOK, isFailed func(*buildapi.Build) bool) error { for { list, err := c.List(labels.Everything(), fields.Set{"name": name}.AsSelector()) if err != nil { return err } for i := range list.Items { if name == list.Items[i].Name && isOK(&list.Items[i]) { return nil } if name != list.Items[i].Name || isFailed(&list.Items[i]) { return fmt.Errorf("The build %q status is %q", name, &list.Items[i].Status.Phase) } } rv := list.ResourceVersion w, err := c.Watch(labels.Everything(), fields.Set{"name": name}.AsSelector(), rv) if err != nil { return err } defer w.Stop() for { val, ok := <-w.ResultChan() if !ok { // reget and re-watch break } if e, ok := val.Object.(*buildapi.Build); ok { if name == e.Name && isOK(e) { return nil } if name != e.Name || isFailed(e) { return fmt.Errorf("The build %q status is %q", name, e.Status.Phase) } } } } }
func retryBuildStatusUpdate(build *api.Build, client client.BuildInterface, sourceRev *api.SourceRevision) error { return kclient.RetryOnConflict(kclient.DefaultBackoff, func() error { // before updating, make sure we are using the latest version of the build latestBuild, err := client.Get(build.Name) if err != nil { // usually this means we failed to get resources due to the missing // privilleges return err } if sourceRev != nil { latestBuild.Spec.Revision = sourceRev latestBuild.ResourceVersion = "" } latestBuild.Status.Reason = build.Status.Reason latestBuild.Status.Message = build.Status.Message if _, err := client.UpdateDetails(latestBuild); err != nil { return err } return nil }) }
// WaitForABuild waits for a Build object to match either isOK or isFailed conditions. func WaitForABuild(c client.BuildInterface, name string, isOK, isFailed func(*buildapi.Build) bool) error { // wait 2 minutes for build to exist err := wait.Poll(1*time.Second, 2*time.Minute, func() (bool, error) { if _, err := c.Get(name); err != nil { return false, nil } return true, nil }) if err != nil { return err } // wait longer for the build to run to completion return wait.Poll(5*time.Second, 20*time.Minute, func() (bool, error) { list, err := c.List(labels.Everything(), fields.Set{"name": name}.AsSelector()) if err != nil { return false, err } for i := range list.Items { if name == list.Items[i].Name && isOK(&list.Items[i]) { return true, nil } if name != list.Items[i].Name || isFailed(&list.Items[i]) { return false, fmt.Errorf("The build %q status is %q", name, &list.Items[i].Status.Phase) } } rv := list.ResourceVersion w, err := c.Watch(labels.Everything(), fields.Set{"name": name}.AsSelector(), rv) if err != nil { return false, err } defer w.Stop() for { val, ok := <-w.ResultChan() if !ok { // reget and re-watch return false, nil } if e, ok := val.Object.(*buildapi.Build); ok { if name == e.Name && isOK(e) { return true, nil } if name != e.Name || isFailed(e) { return false, fmt.Errorf("The build %q status is %q", name, e.Status.Phase) } } } }) }
func cloneBuild(t *testing.T, buildInterface client.BuildInterface, build *buildapi.Build) (*buildapi.Build, error) { req := &buildapi.BuildRequest{} req.Name = build.Name return buildInterface.Clone(req) }
func updateBuild(t *testing.T, buildInterface client.BuildInterface, build *buildapi.Build) (*buildapi.Build, error) { build.Labels = map[string]string{"updated": "true"} return buildInterface.Update(build) }