diff --git a/pkg/generate/app/sourcelookup.go b/pkg/generate/app/sourcelookup.go index b80f2ab1d71f..a6752c20aee0 100644 --- a/pkg/generate/app/sourcelookup.go +++ b/pkg/generate/app/sourcelookup.go @@ -314,6 +314,7 @@ func (r *SourceRepository) DetectAuth() error { _, _, err = gitRepo.TimedListRemote(10*time.Second, url.StringNoFragment(), "--heads") if err != nil { r.requiresAuth = true + fmt.Print("warning: Cannot check if git requires authentication.\n") } return nil } diff --git a/pkg/oc/generate/app/cmd/newapp.go b/pkg/oc/generate/app/cmd/newapp.go index ec12059f66a0..0319737cb00f 100644 --- a/pkg/oc/generate/app/cmd/newapp.go +++ b/pkg/oc/generate/app/cmd/newapp.go @@ -649,7 +649,9 @@ func (c *AppConfig) RunQuery() (*QueryResult, error) { } b := &app.ReferenceBuilder{} - if err := AddComponentInputsToRefBuilder(b, &c.Resolvers, &c.ComponentInputs, &c.GenerationInputs); err != nil { + s := &c.SourceRepositories + i := &c.ImageStreams + if err := AddComponentInputsToRefBuilder(b, &c.Resolvers, &c.ComponentInputs, &c.GenerationInputs, s, i); err != nil { return nil, err } components, repositories, errs := b.Result() diff --git a/pkg/oc/generate/app/cmd/newapp_test.go b/pkg/oc/generate/app/cmd/newapp_test.go index 99f762db5fa9..5524fa6e89db 100644 --- a/pkg/oc/generate/app/cmd/newapp_test.go +++ b/pkg/oc/generate/app/cmd/newapp_test.go @@ -124,7 +124,7 @@ func TestValidate(t *testing.T) { continue } - if err := AddComponentInputsToRefBuilder(b, &c.cfg.Resolvers, &c.cfg.ComponentInputs, &c.cfg.GenerationInputs); err != nil { + if err := AddComponentInputsToRefBuilder(b, &c.cfg.Resolvers, &c.cfg.ComponentInputs, &c.cfg.GenerationInputs, &c.cfg.SourceRepositories, &c.cfg.ImageStreams); err != nil { t.Errorf("%s: Unexpected error: %v", n, err) continue } diff --git a/pkg/oc/generate/app/cmd/resolve.go b/pkg/oc/generate/app/cmd/resolve.go index fe51a7d89d48..7251270c0c25 100644 --- a/pkg/oc/generate/app/cmd/resolve.go +++ b/pkg/oc/generate/app/cmd/resolve.go @@ -10,6 +10,7 @@ import ( "github.com/openshift/origin/pkg/generate" "github.com/openshift/origin/pkg/generate/app" + "github.com/openshift/origin/pkg/generate/git" dockerfileutil "github.com/openshift/origin/pkg/util/docker/dockerfile" ) @@ -99,9 +100,11 @@ func Resolve(appConfig *AppConfig) (*ResolvedComponents, error) { r := &appConfig.Resolvers c := &appConfig.ComponentInputs g := &appConfig.GenerationInputs + s := &appConfig.SourceRepositories + i := &appConfig.ImageStreams b := &app.ReferenceBuilder{} - if err := AddComponentInputsToRefBuilder(b, r, c, g); err != nil { + if err := AddComponentInputsToRefBuilder(b, r, c, g, s, i); err != nil { return nil, err } components, repositories, errs := b.Result() @@ -184,14 +187,25 @@ func Resolve(appConfig *AppConfig) (*ResolvedComponents, error) { // AddSourceRepositoriesToRefBuilder adds the provided repositories to the reference builder, identifies which // should be built using Docker, and then returns the full list of source repositories. -func AddSourceRepositoriesToRefBuilder(b *app.ReferenceBuilder, repos []string, g *GenerationInputs) (app.SourceRepositories, error) { +func AddSourceRepositoriesToRefBuilder(b *app.ReferenceBuilder, c *ComponentInputs, g *GenerationInputs, s, i *[]string) (app.SourceRepositories, error) { strategy := g.Strategy if strategy == generate.StrategyUnspecified { strategy = generate.StrategySource } - for _, s := range repos { - if repo, ok := b.AddSourceRepository(s, strategy); ok { - repo.SetContextDir(g.ContextDir) + // when git is installed we keep default logic. sourcelookup.go will do sorting of images, repos + if git.IsGitInstalled() || len(c.SourceRepositories) > 0 { + for _, s := range c.SourceRepositories { + if repo, ok := b.AddSourceRepository(s, strategy); ok { + repo.SetContextDir(g.ContextDir) + } + } + // when git is not installed we need to parse some logic to decide if we got 'new-app -i image code' or 'image -c code' syntax + } else if len(c.Components) > 0 && len(*i) > 0 && len(*s) == 0 || len(c.Components) > 0 && len(*i) == 0 && len(*s) > 0 { + for _, s := range c.Components { + if repo, ok := b.AddSourceRepository(s, strategy); ok { + repo.SetContextDir(g.ContextDir) + c.Components = []string{} + } } } if len(g.Dockerfile) > 0 { @@ -263,18 +277,16 @@ func DetectSource(repositories []*app.SourceRepository, d app.Detector, g *Gener } // AddComponentInputsToRefBuilder set up the components to be used by the reference builder. -func AddComponentInputsToRefBuilder(b *app.ReferenceBuilder, r *Resolvers, c *ComponentInputs, g *GenerationInputs) error { +func AddComponentInputsToRefBuilder(b *app.ReferenceBuilder, r *Resolvers, c *ComponentInputs, g *GenerationInputs, s, i *[]string) error { // lookup source repositories first (before processing the component inputs) - repositories, err := AddSourceRepositoriesToRefBuilder(b, c.SourceRepositories, g) + repositories, err := AddSourceRepositoriesToRefBuilder(b, c, g, s, i) if err != nil { return err } - // identify the types of the provided source locations if err := DetectSource(repositories, r.Detector, g); err != nil { return err } - b.AddComponents(c.DockerImages, func(input *app.ComponentInput) app.ComponentReference { input.Argument = fmt.Sprintf("--docker-image=%q", input.From) input.Searcher = r.DockerSearcher diff --git a/test/cmd/newapp.sh b/test/cmd/newapp.sh index 6bd2b491d07c..979254836bb9 100755 --- a/test/cmd/newapp.sh +++ b/test/cmd/newapp.sh @@ -471,5 +471,45 @@ os::cmd::expect_success_and_not_text 'oc new-app https://github.com/openshift/ru # We permit running new-app against a remote URL which returns a template os::cmd::expect_success 'oc new-app https://raw.githubusercontent.com/openshift/origin/master/examples/wordpress/template/wordpress-mysql.json --dry-run' +# new-app different syntax for new-app functionality +os::cmd::expect_success 'oc new-project new-app-syntax' +os::cmd::expect_success 'oc import-image openshift/ruby-20-centos7:latest --confirm' +os::cmd::expect_success 'oc import-image openshift/php-55-centos7:latest --confirm' +rm -rf ./test/testdata/testapp +git clone https://github.com/openshift/ruby-hello-world.git ./test/testdata/testapp +os::cmd::expect_success 'oc new-app ruby-20-centos7:latest~https://github.com/openshift/ruby-hello-world.git --dry-run' +os::cmd::expect_success 'oc new-app ruby-20-centos7:latest~./test/testdata/testapp --dry-run' +os::cmd::expect_success 'oc new-app -i ruby-20-centos7:latest https://github.com/openshift/ruby-hello-world.git --dry-run' +os::cmd::expect_success 'oc new-app -i ruby-20-centos7:latest ./test/testdata/testapp --dry-run' +os::cmd::expect_success 'oc new-app ruby-20-centos7:latest --code https://github.com/openshift/ruby-hello-world.git --dry-run' +os::cmd::expect_success 'oc new-app ruby-20-centos7:latest --code ./test/testdata/testapp --dry-run' +os::cmd::expect_success 'oc new-app -i ruby-20-centos7:latest --code https://github.com/openshift/ruby-hello-world.git --dry-run' +os::cmd::expect_success 'oc new-app -i ruby-20-centos7:latest --code ./test/testdata/testapp --dry-run' + +os::cmd::expect_success 'oc new-app --code ./test/testdata/testapp --name test' +os::cmd::expect_success_and_text 'oc get bc test --template={{.spec.strategy.dockerStrategy.from.name}}' 'ruby-22-centos7:latest' + +os::cmd::expect_success 'oc new-app -i php-55-centos7:latest --code ./test/testdata/testapp --name test2' +os::cmd::expect_success_and_text 'oc get bc test2 --template={{.spec.strategy.sourceStrategy.from.name}}' 'php-55-centos7:latest' + +os::cmd::expect_success 'oc new-app -i php-55-centos7:latest~https://github.com/openshift/ruby-hello-world.git --name test3' +os::cmd::expect_success_and_text 'oc get bc test3 --template={{.spec.strategy.sourceStrategy.from.name}}' 'php-55-centos7:latest' + +os::cmd::expect_success 'oc new-app php-55-centos7:latest~https://github.com/openshift/ruby-hello-world.git --name test4' +os::cmd::expect_success_and_text 'oc get bc test4 --template={{.spec.strategy.sourceStrategy.from.name}}' 'php-55-centos7:latest' + +os::cmd::expect_success 'oc new-app -i php-55-centos7:latest https://github.com/openshift/ruby-hello-world.git --name test5' +os::cmd::expect_success_and_text 'oc get bc test5 --template={{.spec.strategy.sourceStrategy.from.name}}' 'php-55-centos7:latest' + +os::cmd::expect_success 'oc new-app php-55-centos7:latest --code https://github.com/openshift/ruby-hello-world.git --name test6' +os::cmd::expect_success_and_text 'oc get bc test6 --template={{.spec.strategy.sourceStrategy.from.name}}' 'php-55-centos7:latest' + +os::cmd::expect_success 'oc new-app https://github.com/openshift/ruby-hello-world.git --name test7' +os::cmd::expect_success_and_text 'oc get bc test7 --template={{.spec.strategy.dockerStrategy.from.name}}' 'ruby-22-centos7:latest' + +os::cmd::expect_success 'oc new-app php-55-centos7:latest https://github.com/openshift/ruby-hello-world.git --name test8' +os::cmd::expect_success_and_text 'oc get bc test8 --template={{.spec.strategy.sourceStrategy.from.name}}' 'php-55-centos7:latest' +os::cmd::expect_success 'oc delete project new-app-syntax' + echo "new-app: ok" os::test::junit::declare_suite_end