func (routeActor routeActor) BindRoute(app models.Application, route models.Route) error { if !app.HasRoute(route) { routeActor.ui.Say(T( "Binding {{.URL}} to {{.AppName}}...", map[string]interface{}{ "URL": terminal.EntityNameColor(route.URL()), "AppName": terminal.EntityNameColor(app.Name), }), ) err := routeActor.routeRepo.Bind(route.GUID, app.GUID) switch err := err.(type) { case nil: routeActor.ui.Ok() routeActor.ui.Say("") return nil case errors.HTTPError: if err.ErrorCode() == errors.InvalidRelation { return errors.New(T( "The route {{.URL}} is already in use.\nTIP: Change the hostname with -n HOSTNAME or use --random-route to generate a new route and then push again.", map[string]interface{}{ "URL": route.URL(), }), ) } } return err } return nil }
func (routeActor RouteActor) BindRoute(app models.Application, route models.Route) { if !app.HasRoute(route) { routeActor.ui.Say("Binding %s to %s...", terminal.EntityNameColor(route.URL()), terminal.EntityNameColor(app.Name)) apiErr := routeActor.routeRepo.Bind(route.Guid, app.Guid) switch apiErr := apiErr.(type) { case nil: routeActor.ui.Ok() routeActor.ui.Say("") return case errors.HttpError: if apiErr.ErrorCode() == errors.INVALID_RELATION { routeActor.ui.Failed("The route %s is already in use.\nTIP: Change the hostname with -n HOSTNAME or use --random-route to generate a new route and then push again.", route.URL()) } } routeActor.ui.Failed(apiErr.Error()) } }
func (routeActor routeActor) FindOrCreateRoute(hostname string, domain models.DomainFields, path string, port int, useRandomPort bool) (models.Route, error) { var route models.Route var err error //if tcp route use random port should skip route lookup if useRandomPort && domain.RouterGroupType == tcp { err = new(errors.ModelNotFoundError) } else { route, err = routeActor.routeRepo.Find(hostname, domain, path, port) } switch err.(type) { case nil: routeActor.ui.Say( T("Using route {{.RouteURL}}", map[string]interface{}{ "RouteURL": terminal.EntityNameColor(route.URL()), }), ) case *errors.ModelNotFoundError: if useRandomPort && domain.RouterGroupType == tcp { route, err = routeActor.CreateRandomTCPRoute(domain) } else { routeActor.ui.Say( T("Creating route {{.Hostname}}...", map[string]interface{}{ "Hostname": terminal.EntityNameColor(domain.URLForHostAndPath(hostname, path, port)), }), ) route, err = routeActor.routeRepo.Create(hostname, domain, path, port, false) } routeActor.ui.Ok() routeActor.ui.Say("") } return route, err }
}) }) Context("when there are routes in different spaces", func() { BeforeEach(func() { routeRepo.ListAllRoutesStub = func(cb func(models.Route) bool) error { space1 := models.SpaceFields{Name: "space-1"} space2 := models.SpaceFields{Name: "space-2"} domain := models.DomainFields{Name: "example.com"} domain2 := models.DomainFields{Name: "cookieclicker.co"} app1 := models.ApplicationFields{Name: "dora"} app2 := models.ApplicationFields{Name: "bora"} route := models.Route{} route.Host = "hostname-1" route.Domain = domain route.Apps = []models.ApplicationFields{app1} route.Space = space1 route.ServiceInstance = models.ServiceInstanceFields{ Name: "test-service", GUID: "service-guid", } route2 := models.Route{} route2.Host = "hostname-2" route2.Path = "/foo" route2.Domain = domain2 route2.Apps = []models.ApplicationFields{app1, app2} route2.Space = space2
reqFactory.LoginSuccess = true }) It("passes requirements when logged in", func() { _, passed := callDeleteOrphanedRoutes("y", []string{}, reqFactory, routeRepo) Expect(passed).To(BeTrue()) }) It("passes when confirmation is provided", func() { var ui *testterm.FakeUI domain := models.DomainFields{Name: "example.com"} domain2 := models.DomainFields{Name: "cookieclicker.co"} app1 := models.ApplicationFields{Name: "dora"} route := models.Route{} route.Host = "hostname-1" route.Domain = domain route.Apps = []models.ApplicationFields{app1} route2 := models.Route{} route2.Guid = "route2-guid" route2.Host = "hostname-2" route2.Domain = domain2 routeRepo.Routes = []models.Route{route, route2} ui, _ = callDeleteOrphanedRoutes("y", []string{}, reqFactory, routeRepo) Expect(ui.Prompts).To(ContainSubstrings( []string{"Really delete orphaned routes"},
runCommand("-n", "host", "my-space", "example.com") Expect(ui.Outputs).To(ContainSubstrings( []string{"Creating route"}, []string{"OK"}, []string{"host.example.com", "already exists"}, )) Expect(routeRepo.CreateInSpaceHost).To(Equal("host")) Expect(routeRepo.CreateInSpaceDomainGuid).To(Equal("domain-guid")) Expect(routeRepo.CreateInSpaceSpaceGuid).To(Equal("my-space-guid")) }) Describe("RouteCreator interface", func() { It("creates a route, given a domain and space", func() { createdRoute := models.Route{} createdRoute.Host = "my-host" createdRoute.Guid = "my-route-guid" routeRepo := &testapi.FakeRouteRepository{ CreateInSpaceCreatedRoute: createdRoute, } cmd := NewCreateRoute(ui, config, routeRepo) route, apiErr := cmd.CreateRoute("my-host", requirementsFactory.Domain, requirementsFactory.Space.SpaceFields) Expect(apiErr).NotTo(HaveOccurred()) Expect(route.Guid).To(Equal(createdRoute.Guid)) Expect(ui.Outputs).To(ContainSubstrings( []string{"Creating route", "my-host.example.com", "my-org", "my-space", "my-user"}, []string{"OK"}, ))
} Context("when not logged in", func() { BeforeEach(func() { requirementsFactory.LoginSuccess = false }) It("does not pass requirements", func() { Expect(runCommand("-n", "my-host", "example.com")).To(BeFalse()) }) }) Context("when logged in successfully", func() { BeforeEach(func() { requirementsFactory.LoginSuccess = true route := models.Route{Guid: "route-guid"} route.Domain = models.DomainFields{ Guid: "domain-guid", Name: "example.com", } routeRepo.FindReturns(route, nil) }) It("fails with usage when given zero args", func() { runCommand() Expect(ui.Outputs).To(ContainSubstrings( []string{"Incorrect Usage", "Requires an argument"}, )) }) It("does not fail with usage when provided with a domain", func() {
}) It("passes requirements when logged in", func() { _, passed := callDeleteOrphanedRoutes("y", []string{}, requirementsFactory, routeRepo) Expect(passed).To(BeTrue()) }) It("passes when confirmation is provided", func() { var ui *testterm.FakeUI domain := models.DomainFields{Name: "example.com"} domain2 := models.DomainFields{Name: "cookieclicker.co"} app1 := models.ApplicationFields{Name: "dora"} routeRepo.ListRoutesStub = func(cb func(models.Route) bool) error { route := models.Route{} route.GUID = "route1-guid" route.Host = "hostname-1" route.Domain = domain route.Apps = []models.ApplicationFields{app1} route2 := models.Route{} route2.GUID = "route2-guid" route2.Host = "hostname-2" route2.Domain = domain2 cb(route) cb(route2) return nil }
It("should fail with usage when provided any arguments", func() { requirementsFactory.LoginSuccess = true requirementsFactory.TargetedSpaceSuccess = true Expect(runCommand("blahblah")).To(BeFalse()) Expect(ui.Outputs).To(ContainSubstrings( []string{"Incorrect Usage", "No argument required"}, )) }) }) Context("when there are routes", func() { BeforeEach(func() { routeRepo.ListRoutesStub = func(cb func(models.Route) bool) error { app1 := models.ApplicationFields{Name: "dora"} route := models.Route{} route.Host = "hostname-1" route.Domain = models.DomainFields{Name: "example.com"} route.Apps = []models.ApplicationFields{app1} cb(route) domain2 := models.DomainFields{Name: "cookieclicker.co"} app2 := models.ApplicationFields{Name: "bora"} route2 := models.Route{} route2.Host = "hostname-2" route2.Path = "/foo" route2.Domain = domain2 route2.Apps = []models.ApplicationFields{app1, app2}
}) }) Describe("when pushing a new app", func() { BeforeEach(func() { appRepo.ReadReturns.Error = errors.NewModelNotFoundError("App", "the-app") zipper.ZipReturns(nil) zipper.GetZipSizeReturns(9001, nil) actor.GatherFilesReturns(nil, nil) actor.UploadAppReturns(nil) }) Context("when the default route for the app already exists", func() { BeforeEach(func() { route := models.Route{} route.Guid = "my-route-guid" route.Host = "my-new-app" route.Domain = domainRepo.ListDomainsForOrgDomains[0] routeRepo.FindByHostAndDomainReturns.Route = route }) It("binds to existing routes", func() { callPush("my-new-app") Expect(routeRepo.CreatedHost).To(BeEmpty()) Expect(routeRepo.CreatedDomainGuid).To(BeEmpty()) Expect(routeRepo.FindByHostAndDomainCalledWith.Host).To(Equal("my-new-app")) Expect(routeRepo.BoundAppGuid).To(Equal("my-new-app-guid")) Expect(routeRepo.BoundRouteGuid).To(Equal("my-route-guid"))
package models_test import ( "github.com/cloudfoundry/cli/cf/models" . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" ) var _ = Describe("Route", func() { Describe("URL", func() { var ( r models.Route host string path string ) AfterEach(func() { host = "" path = "" }) JustBeforeEach(func() { r = models.Route{ Host: host, Domain: models.DomainFields{ Name: "the-domain", }, Path: path, } })
a.Guid = *params.Name + "-guid" a.Name = *params.Name a.State = "stopped" return a, nil } zipper.ZipReturns(nil) zipper.GetZipSizeReturns(9001, nil) actor.GatherFilesReturns(nil, true, nil) actor.UploadAppReturns(nil) }) Context("when the default route for the app already exists", func() { BeforeEach(func() { route := models.Route{} route.Guid = "my-route-guid" route.Host = "app-name" route.Domain = domainRepo.ListDomainsForOrgDomains[0] routeRepo.FindByHostAndDomainReturns.Route = route }) It("notifies users about the error actor.GatherFiles() returns", func() { actor.GatherFilesReturns([]resources.AppFileResource{}, false, errors.New("failed to get file mode")) callPush("app-name") Expect(ui.Outputs).To(ContainSubstrings( []string{"failed to get file mode"}, ))
requirementsFactory.LoginSuccess = true requirementsFactory.TargetedSpaceSuccess = true Expect(runCommand("blahblah")).To(BeFalse()) Expect(ui.FailedWithUsage).To(BeTrue()) }) }) Context("when there are routes", func() { BeforeEach(func() { domain := models.DomainFields{Name: "example.com"} domain2 := models.DomainFields{Name: "cookieclicker.co"} app1 := models.ApplicationFields{Name: "dora"} app2 := models.ApplicationFields{Name: "bora"} route := models.Route{} route.Host = "hostname-1" route.Domain = domain route.Apps = []models.ApplicationFields{app1} route2 := models.Route{} route2.Host = "hostname-2" route2.Domain = domain2 route2.Apps = []models.ApplicationFields{app1, app2} routeRepo.Routes = []models.Route{route, route2} }) It("lists routes", func() { runCommand() Expect(ui.Outputs).To(ContainSubstrings(
appRepo = &testApplication.FakeApplicationRepository{} domainRepo = &testapi.FakeDomainRepository{} sharedDomain := maker.NewSharedDomainFields(maker.Overrides{"name": "foo.cf-app.com", "guid": "foo-domain-guid"}) domainRepo.ListDomainsForOrgDomains = []models.DomainFields{sharedDomain} //save original command dependences and restore later OriginalCommandStart = command_registry.Commands.FindCommand("start") OriginalCommandStop = command_registry.Commands.FindCommand("stop") OriginalCommandServiceBind = command_registry.Commands.FindCommand("bind-service") routeRepo = &testapi.FakeRouteRepository{} routeRepo.CreateStub = func(host string, domain models.DomainFields, path string) (models.Route, error) { // This never returns an error, which means it isn't tested. // This is copied from the old route repo fake. route := models.Route{} route.Guid = host + "-route-guid" route.Domain = domain route.Host = host route.Path = path return route, nil } stackRepo = &testStacks.FakeStackRepository{} serviceRepo = &testapi.FakeServiceRepository{} authRepo = &testapi.FakeAuthenticationRepository{} wordGenerator = new(testwords.FakeWordGenerator) wordGenerator.BabbleReturns("random-host") ui = new(testterm.FakeUI) configRepo = testconfig.NewRepositoryWithDefaults()
It("TestMapRouteRequirements", func() { routeRepo := &testapi.FakeRouteRepository{} requirementsFactory := &testreq.FakeReqFactory{LoginSuccess: true} callMapRoute([]string{"-n", "my-host", "my-app", "my-domain.com"}, requirementsFactory, routeRepo, &testcmd.FakeRouteCreator{}) Expect(testcmd.CommandDidPassRequirements).To(BeTrue()) Expect(requirementsFactory.ApplicationName).To(Equal("my-app")) Expect(requirementsFactory.DomainName).To(Equal("my-domain.com")) }) It("TestMapRouteWhenBinding", func() { domain := models.DomainFields{} domain.Guid = "my-domain-guid" domain.Name = "example.com" route := models.Route{} route.Guid = "my-route-guid" route.Host = "foo" route.Domain = domain app := models.Application{} app.Guid = "my-app-guid" app.Name = "my-app" routeRepo := &testapi.FakeRouteRepository{} requirementsFactory := &testreq.FakeReqFactory{LoginSuccess: true, Application: app, Domain: domain} routeCreator := &testcmd.FakeRouteCreator{ReservedRoute: route} ui := callMapRoute([]string{"-n", "my-host", "my-app", "my-domain.com"}, requirementsFactory, routeRepo, routeCreator) Expect(ui.Outputs).To(ContainSubstrings(