From 9c2cb799c533820ad8faeb608933b0fcf50b27ef Mon Sep 17 00:00:00 2001 From: Jim Minter Date: Mon, 21 Nov 2016 16:22:13 +0000 Subject: [PATCH] new-app: fix priority of Jenkinsfile, Dockerfile, source when strategy unspecified --- pkg/generate/app/cmd/resolve.go | 23 ++++----- pkg/generate/app/cmd/resolve_test.go | 73 ++++++++++++++++++++++++++++ 2 files changed, 85 insertions(+), 11 deletions(-) create mode 100644 pkg/generate/app/cmd/resolve_test.go diff --git a/pkg/generate/app/cmd/resolve.go b/pkg/generate/app/cmd/resolve.go index e91f417262f0..4abb8bd9db2a 100644 --- a/pkg/generate/app/cmd/resolve.go +++ b/pkg/generate/app/cmd/resolve.go @@ -517,6 +517,18 @@ func AddMissingComponentsToRefBuilder( case info == nil: errs = append(errs, fmt.Errorf("source not detected for repository %q", repo)) continue + + case info.Jenkinsfile && (g.Strategy == generate.StrategyUnspecified || g.Strategy == generate.StrategyPipeline): + refs := b.AddComponents([]string{"pipeline"}, func(input *app.ComponentInput) app.ComponentReference { + input.Resolver = pipelineResolver + input.Use(repo) + input.ExpectToBuild = true + repo.UsedBy(input) + repo.SetStrategy(generate.StrategyPipeline) + return input + }) + result = append(result, refs...) + case info.Dockerfile != nil && (g.Strategy == generate.StrategyUnspecified || g.Strategy == generate.StrategyDocker): node := info.Dockerfile.AST() baseImage := dockerfileutil.LastBaseImage(node) @@ -534,17 +546,6 @@ func AddMissingComponentsToRefBuilder( }) result = append(result, refs...) - case info.Jenkinsfile && (g.Strategy == generate.StrategyUnspecified || g.Strategy == generate.StrategyPipeline): - refs := b.AddComponents([]string{"pipeline"}, func(input *app.ComponentInput) app.ComponentReference { - input.Resolver = pipelineResolver - input.Use(repo) - input.ExpectToBuild = true - repo.UsedBy(input) - repo.SetStrategy(generate.StrategyPipeline) - return input - }) - result = append(result, refs...) - default: // TODO: Add support for searching for more than one language if len(info.Types) > 1 if len(info.Types) == 0 { diff --git a/pkg/generate/app/cmd/resolve_test.go b/pkg/generate/app/cmd/resolve_test.go new file mode 100644 index 000000000000..28c4823d7ed4 --- /dev/null +++ b/pkg/generate/app/cmd/resolve_test.go @@ -0,0 +1,73 @@ +package cmd + +import ( + "testing" + + "github.com/openshift/origin/pkg/generate" + "github.com/openshift/origin/pkg/generate/app" +) + +// TestResolveJenkinsfileAndDockerfile ensures that if a repo has a Jenkinsfile +// and a Dockerfile, we use the Jenkinsfile. +func TestResolveJenkinsfileAndDockerfile(t *testing.T) { + dockerfile, _ := app.NewDockerfile("FROM centos\n") + i := app.SourceRepositoryInfo{Dockerfile: dockerfile, Jenkinsfile: true} + + repo := app.SourceRepository{} + repo.SetInfo(&i) + repositories := app.SourceRepositories{&repo} + + resolvers := Resolvers{} + componentrefs, err := AddMissingComponentsToRefBuilder(&app.ReferenceBuilder{}, repositories, resolvers.DockerfileResolver(), resolvers.SourceResolver(), resolvers.PipelineResolver(), &GenerationInputs{}) + + checkResolveResult(t, componentrefs, err, generate.StrategyPipeline) +} + +// TestResolveJenkinsfileAndSource ensures that if a repo has a Jenkinsfile and +// source, we use the Jenkinsfile. +func TestResolveJenkinsfileAndSource(t *testing.T) { + i := app.SourceRepositoryInfo{Jenkinsfile: true, Types: []app.SourceLanguageType{{Platform: "foo"}}} + + repo := app.SourceRepository{} + repo.SetInfo(&i) + repositories := app.SourceRepositories{&repo} + + resolvers := Resolvers{} + componentrefs, err := AddMissingComponentsToRefBuilder(&app.ReferenceBuilder{}, repositories, resolvers.DockerfileResolver(), resolvers.SourceResolver(), resolvers.PipelineResolver(), &GenerationInputs{}) + + checkResolveResult(t, componentrefs, err, generate.StrategyPipeline) +} + +// TestResolveDockerfileAndSource ensures that if a repo has a Dockerfile and +// source, we use the Dockerfile. +func TestResolveDockerfileAndSource(t *testing.T) { + dockerfile, _ := app.NewDockerfile("FROM centos\n") + i := app.SourceRepositoryInfo{Dockerfile: dockerfile, Types: []app.SourceLanguageType{{Platform: "foo"}}} + + repo := app.SourceRepository{} + repo.SetInfo(&i) + repositories := app.SourceRepositories{&repo} + + resolvers := Resolvers{} + componentrefs, err := AddMissingComponentsToRefBuilder(&app.ReferenceBuilder{}, repositories, resolvers.DockerfileResolver(), resolvers.SourceResolver(), resolvers.PipelineResolver(), &GenerationInputs{}) + + checkResolveResult(t, componentrefs, err, generate.StrategyDocker) +} + +func checkResolveResult(t *testing.T, componentrefs app.ComponentReferences, err error, strategy generate.Strategy) { + if err != nil { + t.Fatal(err) + } + + if len(componentrefs) != 1 { + t.Fatal("expected len(componentrefs) == 1") + } + + if componentrefs[0].Input().Uses == nil { + t.Fatal("expected non-nil componentrefs[0].Input().Uses") + } + + if componentrefs[0].Input().Uses.GetStrategy() != strategy { + t.Fatalf("expected componentrefs[0].Input().Uses.GetStrategy() == %s", strategy) + } +}