96 lines
3.1 KiB
Go
96 lines
3.1 KiB
Go
// Copyright (c) Alex Ellis 2017. All rights reserved.
|
|
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
|
|
package commands
|
|
|
|
import (
|
|
"fmt"
|
|
"io/ioutil"
|
|
"os"
|
|
|
|
"github.com/openfaas/faas-cli/proxy"
|
|
"github.com/openfaas/faas-cli/stack"
|
|
"github.com/spf13/cobra"
|
|
)
|
|
|
|
var (
|
|
contentType string
|
|
query []string
|
|
headers []string
|
|
invokeAsync bool
|
|
httpMethod string
|
|
)
|
|
|
|
func init() {
|
|
// Setup flags that are used by multiple commands (variables defined in faas.go)
|
|
invokeCmd.Flags().StringVar(&functionName, "name", "", "Name of the deployed function")
|
|
invokeCmd.Flags().StringVarP(&gateway, "gateway", "g", defaultGateway, "Gateway URL starting with http(s)://")
|
|
|
|
invokeCmd.Flags().StringVar(&contentType, "content-type", "text/plain", "The content-type HTTP header such as application/json")
|
|
invokeCmd.Flags().StringArrayVar(&query, "query", []string{}, "pass query-string options")
|
|
invokeCmd.Flags().StringArrayVarP(&headers, "header", "H", []string{}, "pass HTTP request header")
|
|
invokeCmd.Flags().BoolVarP(&invokeAsync, "async", "a", false, "Invoke the function asynchronously")
|
|
invokeCmd.Flags().StringVarP(&httpMethod, "method", "m", "POST", "pass HTTP request method")
|
|
|
|
faasCmd.AddCommand(invokeCmd)
|
|
}
|
|
|
|
var invokeCmd = &cobra.Command{
|
|
Use: `invoke FUNCTION_NAME [--gateway GATEWAY_URL] [--content-type CONTENT_TYPE] [--query PARAM=VALUE] [--header PARAM=VALUE] [--method HTTP_METHOD]`,
|
|
Short: "Invoke an OpenFaaS function",
|
|
Long: `Invokes an OpenFaaS function and reads from STDIN for the body of the request`,
|
|
Example: ` faas-cli invoke echo --gateway https://domain:port
|
|
faas-cli invoke echo --gateway https://domain:port --content-type application/json
|
|
faas-cli invoke env --query repo=faas-cli --query org=openfaas
|
|
faas-cli invoke env --header X-Ping-Url=http://request.bin/etc
|
|
faas-cli invoke resize-img --async -H "X-Callback-Url=http://gateway:8080/function/send2slack" < image.png
|
|
faas-cli invoke env -H X-Ping-Url=http://request.bin/etc
|
|
faas-cli invoke flask --method GET`,
|
|
RunE: runInvoke,
|
|
}
|
|
|
|
func runInvoke(cmd *cobra.Command, args []string) error {
|
|
var services stack.Services
|
|
|
|
if len(args) < 1 {
|
|
return fmt.Errorf("please provide a name for the function")
|
|
}
|
|
var yamlGateway string
|
|
functionName = args[0]
|
|
|
|
if len(yamlFile) > 0 {
|
|
parsedServices, err := stack.ParseYAMLFile(yamlFile, regex, filter)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
if parsedServices != nil {
|
|
services = *parsedServices
|
|
yamlGateway = services.Provider.GatewayURL
|
|
}
|
|
}
|
|
|
|
gatewayAddress := getGatewayURL(gateway, defaultGateway, yamlGateway, os.Getenv("OPENFAAS_URL"))
|
|
|
|
stat, _ := os.Stdin.Stat()
|
|
if (stat.Mode() & os.ModeCharDevice) != 0 {
|
|
fmt.Fprintf(os.Stderr, "Reading from STDIN - hit (Control + D) to stop.\n")
|
|
}
|
|
|
|
functionInput, err := ioutil.ReadAll(os.Stdin)
|
|
if err != nil {
|
|
return fmt.Errorf("unable to read standard input: %s", err.Error())
|
|
}
|
|
|
|
response, err := proxy.InvokeFunction(gatewayAddress, functionName, &functionInput, contentType, query, headers, invokeAsync, httpMethod)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
if response != nil {
|
|
os.Stdout.Write(*response)
|
|
}
|
|
|
|
return nil
|
|
}
|