diff --git a/tsuru/client/router.go b/tsuru/client/router.go index 9c2f73b5f..8ce24f133 100644 --- a/tsuru/client/router.go +++ b/tsuru/client/router.go @@ -175,6 +175,63 @@ func (c *AppRoutersAdd) Run(context *cmd.Context, client *cmd.Client) error { return nil } +type AppRoutersUpdate struct { + cmd.GuessingCommand + opts cmd.MapFlag + fs *gnuflag.FlagSet +} + +func (c *AppRoutersUpdate) Info() *cmd.Info { + return &cmd.Info{ + Name: "app-router-update", + Usage: "app-router-update [-a/--app appname] [-o/--opts key=value]...", + Desc: "Update router opts in an application.", + MinArgs: 1, + MaxArgs: 1, + } +} + +func (c *AppRoutersUpdate) Flags() *gnuflag.FlagSet { + if c.fs == nil { + c.fs = c.GuessingCommand.Flags() + optsMessage := "Custom options sent directly to router implementation." + c.fs.Var(&c.opts, "o", optsMessage) + c.fs.Var(&c.opts, "opts", optsMessage) + } + return c.fs +} + +func (c *AppRoutersUpdate) Run(context *cmd.Context, client *cmd.Client) error { + appName, err := c.Guess() + if err != nil { + return err + } + routerName := context.Args[0] + url, err := cmd.GetURLVersion("1.5", fmt.Sprintf("/apps/%s/routers/%s", appName, routerName)) + if err != nil { + return err + } + r := appTypes.AppRouter{ + Name: routerName, + Opts: c.opts, + } + val, err := form.EncodeToValues(r) + if err != nil { + return err + } + request, err := http.NewRequest("PUT", url, strings.NewReader(val.Encode())) + if err != nil { + return err + } + request.Header.Set("Content-Type", "application/x-www-form-urlencoded") + _, err = client.Do(request) + if err != nil { + return err + } + fmt.Fprintln(context.Stdout, "Router successfully updated.") + return nil +} + type AppRoutersRemove struct { cmd.GuessingCommand } @@ -194,7 +251,7 @@ func (c *AppRoutersRemove) Run(context *cmd.Context, client *cmd.Client) error { if err != nil { return err } - url, err := cmd.GetURLVersion("1.5", fmt.Sprintf("/apps/%s/routers?name=%s", appName, context.Args[0])) + url, err := cmd.GetURLVersion("1.5", fmt.Sprintf("/apps/%s/routers/%s", appName, context.Args[0])) if err != nil { return err } diff --git a/tsuru/client/router_test.go b/tsuru/client/router_test.go index 469c4d4a6..d070ce428 100644 --- a/tsuru/client/router_test.go +++ b/tsuru/client/router_test.go @@ -138,23 +138,48 @@ func (s *S) TestAppRoutersAddRun(c *check.C) { c.Assert(stdout.String(), check.Equals, expected) } -func (s *S) TestAppRoutersRemoveRun(c *check.C) { +func (s *S) TestAppRoutersUpdateRun(c *check.C) { var stdout, stderr bytes.Buffer context := cmd.Context{ Args: []string{"myrouter"}, Stdout: &stdout, Stderr: &stderr, } - expected := "Router successfully removed.\n" + expected := "Router successfully updated.\n" trans := &cmdtest.ConditionalTransport{ Transport: cmdtest.Transport{Message: "", Status: http.StatusOK}, CondFunc: func(req *http.Request) bool { err := req.ParseForm() c.Assert(err, check.IsNil) c.Assert(req.Form, check.DeepEquals, url.Values{ - "name": []string{"myrouter"}, + "Opts.a": []string{"b"}, + "Opts.x": []string{"y"}, + "Address": []string{""}, + "Name": []string{"myrouter"}, }) - return strings.HasSuffix(req.URL.Path, "/1.5/apps/myapp/routers") && req.Method == "DELETE" + return strings.HasSuffix(req.URL.Path, "/1.5/apps/myapp/routers/myrouter") && req.Method == "PUT" + }, + } + client := cmd.NewClient(&http.Client{Transport: trans}, nil, manager) + command := AppRoutersUpdate{} + command.Flags().Parse(true, []string{"-a", "myapp", "-o", "a=b", "-o", "x=y"}) + err := command.Run(&context, client) + c.Assert(err, check.IsNil) + c.Assert(stdout.String(), check.Equals, expected) +} + +func (s *S) TestAppRoutersRemoveRun(c *check.C) { + var stdout, stderr bytes.Buffer + context := cmd.Context{ + Args: []string{"myrouter"}, + Stdout: &stdout, + Stderr: &stderr, + } + expected := "Router successfully removed.\n" + trans := &cmdtest.ConditionalTransport{ + Transport: cmdtest.Transport{Message: "", Status: http.StatusOK}, + CondFunc: func(req *http.Request) bool { + return strings.HasSuffix(req.URL.Path, "/1.5/apps/myapp/routers/myrouter") && req.Method == "DELETE" }, } client := cmd.NewClient(&http.Client{Transport: trans}, nil, manager) diff --git a/tsuru/main.go b/tsuru/main.go index a7cb06d24..3011c1114 100644 --- a/tsuru/main.go +++ b/tsuru/main.go @@ -161,6 +161,7 @@ func buildManager(name string) *cmd.Manager { m.Register(&client.AppRoutersList{}) m.Register(&client.AppRoutersAdd{}) m.Register(&client.AppRoutersRemove{}) + m.Register(&client.AppRoutersUpdate{}) m.RegisterRemoved("bs-env-set", "You should use `tsuru node-container-update big-sibling` instead.") m.RegisterRemoved("bs-info", "You should use `tsuru node-container-info big-sibling` instead.") m.RegisterRemoved("bs-upgrade", "You should use `tsuru node-container-upgrade big-sibling` instead.")