func (s *S) TestAddNewRouteForwardNoWeb(c *check.C) { app := provisiontest.NewFakeApp("myapp", "python", 1) routertest.FakeRouter.AddBackend(app.GetName()) defer routertest.FakeRouter.RemoveBackend(app.GetName()) imageName := "tsuru/app-" + app.GetName() customData := map[string]interface{}{ "processes": map[string]interface{}{ "api": "python myapi.py", }, } err := saveImageCustomData(imageName, customData) c.Assert(err, check.IsNil) cont1 := container.Container{ID: "ble-1", AppName: app.GetName(), ProcessName: "api", HostAddr: "127.0.0.1", HostPort: "1234"} cont2 := container.Container{ID: "ble-2", AppName: app.GetName(), ProcessName: "api", HostAddr: "127.0.0.2", HostPort: "4321"} defer cont1.Remove(s.p) defer cont2.Remove(s.p) args := changeUnitsPipelineArgs{ app: app, provisioner: s.p, imageId: imageName, } context := action.FWContext{Previous: []container.Container{cont1, cont2}, Params: []interface{}{args}} r, err := addNewRoutes.Forward(context) c.Assert(err, check.IsNil) containers := r.([]container.Container) hasRoute := routertest.FakeRouter.HasRoute(app.GetName(), cont1.Address().String()) c.Assert(hasRoute, check.Equals, true) hasRoute = routertest.FakeRouter.HasRoute(app.GetName(), cont2.Address().String()) c.Assert(hasRoute, check.Equals, true) c.Assert(containers, check.HasLen, 2) c.Assert(containers[0].Routable, check.Equals, true) c.Assert(containers[0].ID, check.Equals, "ble-1") c.Assert(containers[1].Routable, check.Equals, true) c.Assert(containers[1].ID, check.Equals, "ble-2") }
func (s *S) TestRemoveOldRoutesForwardFailInMiddle(c *check.C) { app := provisiontest.NewFakeApp("myapp", "python", 1) routertest.FakeRouter.AddBackend(app.GetName()) defer routertest.FakeRouter.RemoveBackend(app.GetName()) cont := container.Container{ID: "ble-1", AppName: app.GetName(), ProcessName: "web", HostAddr: "addr1"} cont2 := container.Container{ID: "ble-2", AppName: app.GetName(), ProcessName: "web", HostAddr: "addr2"} defer cont.Remove(s.p) defer cont2.Remove(s.p) err := routertest.FakeRouter.AddRoute(app.GetName(), cont.Address()) c.Assert(err, check.IsNil) err = routertest.FakeRouter.AddRoute(app.GetName(), cont2.Address()) c.Assert(err, check.IsNil) routertest.FakeRouter.FailForIp(cont2.Address().String()) args := changeUnitsPipelineArgs{ app: app, toRemove: []container.Container{cont, cont2}, provisioner: s.p, } context := action.FWContext{Previous: []container.Container{}, Params: []interface{}{args}} _, err = removeOldRoutes.Forward(context) c.Assert(err, check.Equals, routertest.ErrForcedFailure) hasRoute := routertest.FakeRouter.HasRoute(app.GetName(), cont.Address().String()) c.Assert(hasRoute, check.Equals, true) hasRoute = routertest.FakeRouter.HasRoute(app.GetName(), cont2.Address().String()) c.Assert(hasRoute, check.Equals, true) c.Assert(args.toRemove[0].Routable, check.Equals, true) c.Assert(args.toRemove[1].Routable, check.Equals, false) }
func (s *S) TestAddNewRouteBackward(c *check.C) { app := provisiontest.NewFakeApp("myapp", "python", 1) routertest.FakeRouter.AddBackend(app.GetName()) defer routertest.FakeRouter.RemoveBackend(app.GetName()) cont1 := container.Container{ID: "ble-1", AppName: app.GetName(), ProcessName: "web", HostAddr: "127.0.0.1", HostPort: "1234"} cont2 := container.Container{ID: "ble-2", AppName: app.GetName(), ProcessName: "web", HostAddr: "127.0.0.2", HostPort: "4321"} cont3 := container.Container{ID: "ble-3", AppName: app.GetName(), ProcessName: "worker", HostAddr: "127.0.0.3", HostPort: "8080"} defer cont1.Remove(s.p) defer cont2.Remove(s.p) defer cont3.Remove(s.p) err := routertest.FakeRouter.AddRoute(app.GetName(), cont1.Address()) c.Assert(err, check.IsNil) err = routertest.FakeRouter.AddRoute(app.GetName(), cont2.Address()) c.Assert(err, check.IsNil) args := changeUnitsPipelineArgs{ app: app, provisioner: s.p, } cont1.Routable = true cont2.Routable = true context := action.BWContext{FWResult: []container.Container{cont1, cont2, cont3}, Params: []interface{}{args}} addNewRoutes.Backward(context) hasRoute := routertest.FakeRouter.HasRoute(app.GetName(), cont1.Address().String()) c.Assert(hasRoute, check.Equals, false) hasRoute = routertest.FakeRouter.HasRoute(app.GetName(), cont2.Address().String()) c.Assert(hasRoute, check.Equals, false) hasRoute = routertest.FakeRouter.HasRoute(app.GetName(), cont3.Address().String()) c.Assert(hasRoute, check.Equals, false) }
func (p *dockerProvisioner) fixContainer(container *container.Container, info container.NetworkInfo) error { if info.HTTPHostPort == "" { return nil } appInstance, err := app.GetByName(container.AppName) if err != nil { return err } r, err := getRouterForApp(appInstance) if err != nil { return err } err = r.RemoveRoute(container.AppName, container.Address()) if err != nil && err != router.ErrRouteNotFound { return err } container.IP = info.IP container.HostPort = info.HTTPHostPort err = r.AddRoute(container.AppName, container.Address()) if err != nil && err != router.ErrRouteExists { return err } coll := p.Collection() defer coll.Close() return coll.Update(bson.M{"id": container.ID}, container) }
func (s *S) TestRemoveOldRoutesForward(c *check.C) { app := provisiontest.NewFakeApp("myapp", "python", 1) routertest.FakeRouter.AddBackend(app.GetName()) defer routertest.FakeRouter.RemoveBackend(app.GetName()) cont1 := container.Container{ID: "ble-1", AppName: app.GetName(), ProcessName: "web", HostAddr: "127.0.0.1", HostPort: "1234"} cont2 := container.Container{ID: "ble-2", AppName: app.GetName(), ProcessName: "web", HostAddr: "127.0.0.2", HostPort: "4321"} cont3 := container.Container{ID: "ble-3", AppName: app.GetName(), ProcessName: "worker", HostAddr: "127.0.0.3", HostPort: "8080"} defer cont1.Remove(s.p) defer cont2.Remove(s.p) defer cont3.Remove(s.p) err := routertest.FakeRouter.AddRoute(app.GetName(), cont1.Address()) c.Assert(err, check.IsNil) err = routertest.FakeRouter.AddRoute(app.GetName(), cont2.Address()) c.Assert(err, check.IsNil) args := changeUnitsPipelineArgs{ app: app, toRemove: []container.Container{cont1, cont2, cont3}, provisioner: s.p, } context := action.FWContext{Previous: []container.Container{}, Params: []interface{}{args}} r, err := removeOldRoutes.Forward(context) c.Assert(err, check.IsNil) hasRoute := routertest.FakeRouter.HasRoute(app.GetName(), cont1.Address().String()) c.Assert(hasRoute, check.Equals, false) hasRoute = routertest.FakeRouter.HasRoute(app.GetName(), cont2.Address().String()) c.Assert(hasRoute, check.Equals, false) containers := r.([]container.Container) c.Assert(containers, check.DeepEquals, []container.Container{}) c.Assert(args.toRemove[0].Routable, check.Equals, true) c.Assert(args.toRemove[1].Routable, check.Equals, true) c.Assert(args.toRemove[2].Routable, check.Equals, false) }
func (s *S) TestAddNewRouteForwardDoesNotAddWhenHostPortIsEmpty(c *check.C) { app := provisiontest.NewFakeApp("myapp", "python", 1) routertest.FakeRouter.AddBackend(app.GetName()) defer routertest.FakeRouter.RemoveBackend(app.GetName()) cont := container.Container{ID: "ble-1", AppName: app.GetName(), ProcessName: "", HostAddr: "addr1", HostPort: ""} cont2 := container.Container{ID: "ble-2", AppName: app.GetName(), ProcessName: "", HostAddr: "addr2", HostPort: "4321"} defer cont.Remove(s.p) defer cont2.Remove(s.p) args := changeUnitsPipelineArgs{ app: app, provisioner: s.p, } prevContainers := []container.Container{cont, cont2} context := action.FWContext{Previous: prevContainers, Params: []interface{}{args}} _, err := addNewRoutes.Forward(context) c.Assert(err, check.Equals, nil) hasRoute := routertest.FakeRouter.HasRoute(app.GetName(), cont.Address().String()) c.Assert(hasRoute, check.Equals, false) hasRoute = routertest.FakeRouter.HasRoute(app.GetName(), cont2.Address().String()) c.Assert(hasRoute, check.Equals, true) }
func (s *S) TestRemoveOldRoutesBackward(c *check.C) { app := provisiontest.NewFakeApp("myapp", "python", 1) routertest.FakeRouter.AddBackend(app.GetName()) defer routertest.FakeRouter.RemoveBackend(app.GetName()) cont := container.Container{ID: "ble-1", AppName: app.GetName(), ProcessName: "web"} cont2 := container.Container{ID: "ble-2", AppName: app.GetName(), ProcessName: "web"} defer cont.Remove(s.p) defer cont2.Remove(s.p) cont.Routable = true cont2.Routable = true args := changeUnitsPipelineArgs{ app: app, toRemove: []container.Container{cont, cont2}, provisioner: s.p, } context := action.BWContext{Params: []interface{}{args}} removeOldRoutes.Backward(context) hasRoute := routertest.FakeRouter.HasRoute(app.GetName(), cont.Address().String()) c.Assert(hasRoute, check.Equals, true) hasRoute = routertest.FakeRouter.HasRoute(app.GetName(), cont2.Address().String()) c.Assert(hasRoute, check.Equals, true) }
func (s *S) TestRemoveOldRoutesForwardNoImageData(c *check.C) { app := provisiontest.NewFakeApp("myapp", "python", 1) err := appendAppImageName(app.GetName(), "img1") c.Assert(err, check.IsNil) err = pullAppImageNames(app.GetName(), []string{"img1"}) c.Assert(err, check.IsNil) routertest.FakeRouter.AddBackend(app.GetName()) defer routertest.FakeRouter.RemoveBackend(app.GetName()) cont1 := container.Container{ID: "ble-1", AppName: app.GetName(), ProcessName: "", HostAddr: "127.0.0.1", HostPort: ""} args := changeUnitsPipelineArgs{ app: app, toRemove: []container.Container{cont1}, provisioner: s.p, } context := action.FWContext{Previous: []container.Container{}, Params: []interface{}{args}} r, err := removeOldRoutes.Forward(context) c.Assert(err, check.IsNil) hasRoute := routertest.FakeRouter.HasRoute(app.GetName(), cont1.Address().String()) c.Assert(hasRoute, check.Equals, false) containers := r.([]container.Container) c.Assert(containers, check.DeepEquals, []container.Container{}) c.Assert(args.toRemove[0].Routable, check.Equals, false) }
func (s *S) TestRemoveOldRoutesForwardFailInMiddle(c *check.C) { app := provisiontest.NewFakeApp("myapp", "python", 1) imageName := "tsuru/app-" + app.GetName() customData := map[string]interface{}{ "processes": map[string]interface{}{ "web": "python myapi.py", "worker": "tail -f /dev/null", }, } err := saveImageCustomData(imageName, customData) c.Assert(err, check.IsNil) routertest.FakeRouter.AddBackend(app.GetName()) defer routertest.FakeRouter.RemoveBackend(app.GetName()) cont := container.Container{ID: "ble-1", AppName: app.GetName(), ProcessName: "web", HostAddr: "addr1", HostPort: "1234"} cont2 := container.Container{ID: "ble-2", AppName: app.GetName(), ProcessName: "web", HostAddr: "addr2", HostPort: "1234"} defer cont.Remove(s.p) defer cont2.Remove(s.p) err = routertest.FakeRouter.AddRoute(app.GetName(), cont.Address()) c.Assert(err, check.IsNil) err = routertest.FakeRouter.AddRoute(app.GetName(), cont2.Address()) c.Assert(err, check.IsNil) routertest.FakeRouter.FailForIp(cont2.Address().String()) args := changeUnitsPipelineArgs{ app: app, toRemove: []container.Container{cont, cont2}, provisioner: s.p, } context := action.FWContext{Previous: []container.Container{}, Params: []interface{}{args}} _, err = removeOldRoutes.Forward(context) c.Assert(err, check.Equals, routertest.ErrForcedFailure) hasRoute := routertest.FakeRouter.HasRoute(app.GetName(), cont.Address().String()) c.Assert(hasRoute, check.Equals, true) hasRoute = routertest.FakeRouter.HasRoute(app.GetName(), cont2.Address().String()) c.Assert(hasRoute, check.Equals, true) c.Assert(args.toRemove[0].Routable, check.Equals, true) c.Assert(args.toRemove[1].Routable, check.Equals, true) }
func (s *S) newContainer(opts *newContainerOpts, p *dockerProvisioner) (*container.Container, error) { container := container.Container{ ID: "id", IP: "10.10.10.10", HostPort: "3333", HostAddr: "127.0.0.1", ProcessName: "web", ExposedPort: "8888/tcp", } if p == nil { p = s.p } image := "tsuru/python:latest" var customData map[string]interface{} if opts != nil { if opts.Image != "" { image = opts.Image } container.Status = opts.Status container.AppName = opts.AppName container.ProcessName = opts.ProcessName customData = opts.ImageCustomData if opts.Provisioner != nil { p = opts.Provisioner } } err := s.newFakeImage(p, image, customData) if err != nil { return nil, err } if container.AppName == "" { container.AppName = "container" } routertest.FakeRouter.AddBackend(container.AppName) routertest.FakeRouter.AddRoute(container.AppName, container.Address()) ports := map[docker.Port]struct{}{ docker.Port(s.port + "/tcp"): {}, } config := docker.Config{ Image: image, Cmd: []string{"ps"}, ExposedPorts: ports, } createOptions := docker.CreateContainerOptions{Config: &config} createOptions.Name = randomString() _, c, err := p.Cluster().CreateContainer(createOptions) if err != nil { return nil, err } container.ID = c.ID container.Image = image container.Name = createOptions.Name conn, err := db.Conn() if err != nil { return nil, err } defer conn.Close() err = conn.Collection(s.collName).Insert(&container) if err != nil { return nil, err } imageId, err := appCurrentImageName(container.AppName) if err != nil { return nil, err } err = s.newFakeImage(p, imageId, nil) if err != nil { return nil, err } return &container, nil }