Support for multiple HTTP verbs in routes/HTTPTrigger (#2064)

* Support for multiple HTTP verbs in routes/HTTPTrigger

Signed-off-by: Sanket Sudake <sanketsudake@gmail.com>

* Update pkg/apis/core/v1/types.go

Co-authored-by: Harsh Thakur <harshthakur9030@gmail.com>

* Fix fallbackurl for ingress

Signed-off-by: Sanket Sudake <sanketsudake@gmail.com>

Co-authored-by: Harsh Thakur <harshthakur9030@gmail.com>
This commit is contained in:
Sanket Sudake
2021-06-14 14:48:27 +05:30
committed by GitHub
co-authored by Harsh Thakur
parent 4038f0384b
commit 673ca25cf2
18 changed files with 166 additions and 39 deletions
+13 -5
View File
@@ -345,9 +345,17 @@ func (opts *CreateSubCommand) run(input cli.Input) error {
if len(prefix) != 0 && len(triggerUrl) > 0 {
console.Warn("Prefix will take precedence over URL/RelativeURL")
}
method, err := httptrigger.GetMethod(input.String(flagkey.HtMethod))
if err != nil {
return errors.Wrap(err, "error getting HTTP trigger method")
methods := input.StringSlice(flagkey.HtMethod)
if len(methods) == 0 {
return errors.New("HTTP methods not mentioned")
}
for _, method := range methods {
_, err := httptrigger.GetMethod(method)
if err != nil {
return err
}
}
triggerName := uuid.NewV4().String()
@@ -359,7 +367,7 @@ func (opts *CreateSubCommand) run(input cli.Input) error {
Spec: fv1.HTTPTriggerSpec{
RelativeURL: triggerUrl,
Prefix: &prefix,
Method: method,
Methods: methods,
FunctionReference: fv1.FunctionReference{
Type: fv1.FunctionReferenceTypeFunctionName,
Name: opts.function.ObjectMeta.Name,
@@ -371,7 +379,7 @@ func (opts *CreateSubCommand) run(input cli.Input) error {
return errors.Wrap(err, "error creating HTTP trigger")
}
fmt.Printf("route created: %v %v -> %v\n", method, triggerUrl, opts.function.ObjectMeta.Name)
fmt.Printf("route created: %v %v -> %v\n", methods, triggerUrl, opts.function.ObjectMeta.Name)
return nil
}
+11 -1
View File
@@ -109,9 +109,19 @@ func (opts *TestSubCommand) do(input cli.Input) error {
defer closeCtx()
}
methods := input.StringSlice(flagkey.HtMethod)
if len(methods) == 0 {
return errors.New("HTTP method not mentioned")
} else if len(methods) > 1 {
return errors.New("More than one HTTP method not supported")
}
method, err := httptrigger.GetMethod(methods[0])
if err != nil {
return err
}
resp, err := doHTTPRequest(ctx, functionUrl.String(),
input.StringSlice(flagkey.FnTestHeader),
input.String(flagkey.HtMethod),
method,
input.String(flagkey.FnTestBody))
if err != nil {
return err
+19 -6
View File
@@ -89,6 +89,7 @@ func (opts *CreateSubCommand) complete(input cli.Input) error {
triggerUrl := input.String(flagkey.HtUrl)
prefix := input.String(flagkey.HtPrefix)
fallbackURL := ""
if triggerUrl == "" && prefix == "" {
console.Error("You need to supply either Prefix or URL/RelativeURL")
@@ -108,10 +109,22 @@ func (opts *CreateSubCommand) complete(input cli.Input) error {
if prefix != "" && !strings.HasPrefix(prefix, "/") {
prefix = "/" + prefix
}
if prefix != "" {
fallbackURL = prefix
} else {
fallbackURL = triggerUrl
}
method, err := GetMethod(input.String(flagkey.HtMethod))
if err != nil {
return err
methods := input.StringSlice(flagkey.HtMethod)
if len(methods) == 0 {
return errors.New("HTTP methods not mentioned")
}
for _, method := range methods {
_, err := GetMethod(method)
if err != nil {
return err
}
}
// For Specs, the spec validate checks for function reference
@@ -146,7 +159,7 @@ func (opts *CreateSubCommand) complete(input cli.Input) error {
createIngress := input.Bool(flagkey.HtIngress)
ingressConfig, err := GetIngressConfig(
input.StringSlice(flagkey.HtIngressAnnotation), input.String(flagkey.HtIngressRule),
input.String(flagkey.HtIngressTLS), triggerUrl, nil)
input.String(flagkey.HtIngressTLS), fallbackURL, nil)
if err != nil {
return errors.Wrap(err, "error parsing ingress configuration")
}
@@ -161,7 +174,7 @@ func (opts *CreateSubCommand) complete(input cli.Input) error {
Spec: fv1.HTTPTriggerSpec{
Host: host,
RelativeURL: triggerUrl,
Method: method,
Methods: methods,
FunctionReference: *functionRef,
CreateIngress: createIngress,
IngressConfig: *ingressConfig,
@@ -220,7 +233,7 @@ func GetMethod(method string) (string, error) {
case http.MethodTrace:
return http.MethodTrace, nil
default:
return "", fmt.Errorf("invalid or unsupported HTTP Method %v", method)
return "", fmt.Errorf("invalid or unsupported HTTP Method '%v'", method)
}
}
+8 -1
View File
@@ -86,8 +86,15 @@ func printHtSummary(triggers []fv1.HTTPTrigger) {
}
ann := strings.Join(msg, ", ")
methods := []string{}
if len(trigger.Spec.Method) > 0 {
methods = append(methods, trigger.Spec.Method)
}
if len(trigger.Spec.Methods) > 0 {
methods = trigger.Spec.Methods
}
fmt.Fprintf(w, "%v\t%v\t%v\t%v\t%v\t%v\t%v\t%v\t%v\n",
trigger.ObjectMeta.Name, trigger.Spec.Method, trigger.Spec.RelativeURL, function, trigger.Spec.CreateIngress, host, path, trigger.Spec.IngressConfig.TLS, ann)
trigger.ObjectMeta.Name, methods, trigger.Spec.RelativeURL, function, trigger.Spec.CreateIngress, host, path, trigger.Spec.IngressConfig.TLS, ann)
}
w.Flush()
}
+9 -2
View File
@@ -80,8 +80,15 @@ func (opts *UpdateSubCommand) complete(input cli.Input) error {
ht.Spec.RelativeURL = triggerUrl
ht.Spec.Prefix = &prefix
if input.IsSet(flagkey.HtMethod) {
ht.Spec.Method = input.String(flagkey.HtMethod)
methods := input.StringSlice(flagkey.HtMethod)
if len(methods) > 0 {
for _, method := range methods {
_, err := GetMethod(method)
if err != nil {
return err
}
}
ht.Spec.Methods = methods
}
if input.IsSet(flagkey.HtFnName) {
+9 -1
View File
@@ -329,8 +329,16 @@ func ShowHTTPTriggers(hts []fv1.HTTPTrigger) {
}
ann := strings.Join(msg, ", ")
methods := []string{}
if len(trigger.Spec.Method) > 0 {
methods = append(methods, trigger.Spec.Method)
}
if len(trigger.Spec.Methods) > 0 {
methods = trigger.Spec.Methods
}
fmt.Fprintf(w, "%v\t%v\t%v\t%v\t%v\t%v\t%v\t%v\t%v\n",
trigger.ObjectMeta.Name, trigger.Spec.Method, trigger.Spec.RelativeURL, function, trigger.Spec.CreateIngress, host, path, trigger.Spec.IngressConfig.TLS, ann)
trigger.ObjectMeta.Name, methods, trigger.Spec.RelativeURL, function, trigger.Spec.CreateIngress, host, path, trigger.Spec.IngressConfig.TLS, ann)
}
fmt.Fprintf(w, "\n")
w.Flush()
+3
View File
@@ -443,6 +443,9 @@ func (fr *FissionResources) Validate(input cli.Input) ([]string, error) {
if len(t.Spec.Host) > 0 {
warnings = append(warnings, "Host in HTTPTrigger spec.Host is now marked as deprecated, see 'help' for details")
}
if len(t.Spec.Method) > 0 {
warnings = append(warnings, "Method in HTTTPTrigger spec.Method is deprecated, use spec.Methods instead")
}
result = multierror.Append(result, t.Validate())
}
for _, t := range fr.KubernetesWatchTriggers {
+1 -1
View File
@@ -116,7 +116,7 @@ var (
FnSubPath = Flag{Type: String, Name: flagkey.FnSubPath, Usage: "Sub Path to check if function internally supports routing"}
HtName = Flag{Type: String, Name: flagkey.HtName, Usage: "HTTP trigger name"}
HtMethod = Flag{Type: String, Name: flagkey.HtMethod, Usage: "HTTP Method: GET|POST|PUT|DELETE|HEAD", DefaultValue: http.MethodGet}
HtMethod = Flag{Type: StringSlice, Name: flagkey.HtMethod, Usage: "HTTP Methods: GET,POST,PUT,DELETE,HEAD. To mention single method: --method GET and for multiple methods --method GET --method POST.", DefaultValue: []string{http.MethodGet}}
HtUrl = Flag{Type: String, Name: flagkey.HtUrl, Usage: "URL pattern (See gorilla/mux supported patterns)"}
HtHost = Flag{Type: String, Name: flagkey.HtHost, Usage: "Use --ingressrule instead", Deprecated: true, Substitute: flagkey.HtIngressRule}
HtIngress = Flag{Type: Bool, Name: flagkey.HtIngress, Usage: "Creates ingress with same URL"}