mirror of
https://github.com/fnproject/fn.git
synced 2022-10-28 21:29:17 +03:00
Merge pull request #184 from fnproject/cli-logs
Display call ID for sync/async calls in CLI
This commit is contained in:
@@ -1,6 +1,7 @@
|
|||||||
package client
|
package client
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"net/http"
|
"net/http"
|
||||||
@@ -8,6 +9,8 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const FN_CALL_ID = "Fn_call_id"
|
||||||
|
|
||||||
func EnvAsHeader(req *http.Request, selectedEnv []string) {
|
func EnvAsHeader(req *http.Request, selectedEnv []string) {
|
||||||
detectedEnv := os.Environ()
|
detectedEnv := os.Environ()
|
||||||
if len(selectedEnv) > 0 {
|
if len(selectedEnv) > 0 {
|
||||||
@@ -21,7 +24,16 @@ func EnvAsHeader(req *http.Request, selectedEnv []string) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func CallFN(u string, content io.Reader, output io.Writer, method string, env []string) error {
|
type apiErr struct {
|
||||||
|
Message string `json:"message"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type callID struct {
|
||||||
|
CallID string `json:"call_id"`
|
||||||
|
Error apiErr `json:"error"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func CallFN(u string, content io.Reader, output io.Writer, method string, env []string, includeCallID bool) error {
|
||||||
if method == "" {
|
if method == "" {
|
||||||
if content == nil {
|
if content == nil {
|
||||||
method = "GET"
|
method = "GET"
|
||||||
@@ -45,8 +57,30 @@ func CallFN(u string, content io.Reader, output io.Writer, method string, env []
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("error running route: %s", err)
|
return fmt.Errorf("error running route: %s", err)
|
||||||
}
|
}
|
||||||
|
// for sync calls
|
||||||
io.Copy(output, resp.Body)
|
if call_id, found := resp.Header[FN_CALL_ID]; found {
|
||||||
|
if includeCallID {
|
||||||
|
fmt.Fprint(os.Stderr, fmt.Sprintf("Call ID: %v\n", call_id[0]))
|
||||||
|
}
|
||||||
|
io.Copy(output, resp.Body)
|
||||||
|
} else {
|
||||||
|
// for async calls and error discovering
|
||||||
|
c := &callID{}
|
||||||
|
err = json.NewDecoder(resp.Body).Decode(c)
|
||||||
|
if err == nil {
|
||||||
|
// decode would not fail in both cases:
|
||||||
|
// - call id in body
|
||||||
|
// - error in body
|
||||||
|
// that's why we need to check values of attributes
|
||||||
|
if c.CallID != "" {
|
||||||
|
fmt.Fprint(os.Stderr, fmt.Sprintf("Call ID: %v\n", c.CallID))
|
||||||
|
} else {
|
||||||
|
fmt.Fprint(output, fmt.Sprintf("Error: %v\n", c.Error.Message))
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if resp.StatusCode >= 400 {
|
if resp.StatusCode >= 400 {
|
||||||
// TODO: parse out error message
|
// TODO: parse out error message
|
||||||
|
|||||||
@@ -60,6 +60,13 @@ var updateRouteFlags = append(routeFlags,
|
|||||||
Usage: "defines whether skip func file or not",
|
Usage: "defines whether skip func file or not",
|
||||||
})
|
})
|
||||||
|
|
||||||
|
var callFnFlags = append(runflags(),
|
||||||
|
cli.BoolFlag{
|
||||||
|
Name: "display-call-id",
|
||||||
|
Usage: "whether display call ID or not",
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
func routes() cli.Command {
|
func routes() cli.Command {
|
||||||
|
|
||||||
r := routesCmd{client: client.APIClient()}
|
r := routesCmd{client: client.APIClient()}
|
||||||
@@ -73,7 +80,7 @@ func routes() cli.Command {
|
|||||||
Usage: "call a route",
|
Usage: "call a route",
|
||||||
ArgsUsage: "<app> </path> [image]",
|
ArgsUsage: "<app> </path> [image]",
|
||||||
Action: r.call,
|
Action: r.call,
|
||||||
Flags: runflags(),
|
Flags: callFnFlags,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Name: "list",
|
Name: "list",
|
||||||
@@ -143,7 +150,7 @@ func call() cli.Command {
|
|||||||
Name: "call",
|
Name: "call",
|
||||||
Usage: "call a remote function",
|
Usage: "call a remote function",
|
||||||
ArgsUsage: "<app> </path>",
|
ArgsUsage: "<app> </path>",
|
||||||
Flags: runflags(),
|
Flags: callFnFlags,
|
||||||
Action: r.call,
|
Action: r.call,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -200,7 +207,7 @@ func (a *routesCmd) call(c *cli.Context) error {
|
|||||||
u.Path = path.Join(u.Path, "r", appName, route)
|
u.Path = path.Join(u.Path, "r", appName, route)
|
||||||
content := stdin()
|
content := stdin()
|
||||||
|
|
||||||
return client.CallFN(u.String(), content, os.Stdout, c.String("method"), c.StringSlice("e"))
|
return client.CallFN(u.String(), content, os.Stdout, c.String("method"), c.StringSlice("e"), c.Bool("display-call-id"))
|
||||||
}
|
}
|
||||||
|
|
||||||
func routeWithFlags(c *cli.Context, rt *fnmodels.Route) {
|
func routeWithFlags(c *cli.Context, rt *fnmodels.Route) {
|
||||||
|
|||||||
@@ -211,7 +211,7 @@ func runremotetest(target string, in *inputMap, expectedOut *outputMap, expected
|
|||||||
os.Setenv(k, v)
|
os.Setenv(k, v)
|
||||||
restrictedEnv = append(restrictedEnv, k)
|
restrictedEnv = append(restrictedEnv, k)
|
||||||
}
|
}
|
||||||
if err := client.CallFN(target, stdin, &stdout, "", restrictedEnv); err != nil {
|
if err := client.CallFN(target, stdin, &stdout, "", restrictedEnv, false); err != nil {
|
||||||
return fmt.Errorf("%v\nstdout:%s\n", err, stdout.String())
|
return fmt.Errorf("%v\nstdout:%s\n", err, stdout.String())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user