/
invokable.go
121 lines (105 loc) · 3.29 KB
/
invokable.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
// MIT License
//
// Copyright (c) 2020 Sebastian Werner
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//
package cli
import (
"fmt"
"github.com/ISE-SMILE/falco"
"github.com/urfave/cli/v2"
)
type InvokerCommand interface {
optionsFromFlags(c *cli.Context, ctx *falco.Context)
deploymentFromFlags(c *cli.Context) falco.Deployment
}
type Invoker struct {
runtime falco.Runtime
platform falco.Invokable
cmd InvokerCommand
}
func (i *Invoker) addFlags(c *cli.Context, ctx *falco.Context) {
readCommonFlags(c, ctx)
ctx.NewIntOption("grouping", c.Int("grouping"))
ctx.NewStingOption("result", c.String("result"))
i.cmd.optionsFromFlags(c, ctx)
}
func (i *Invoker) AddInvokeCommand() *cli.Command {
cmds := make([]*cli.Command, 0)
for _, s := range i.runtime.InvocationStrategies() {
cmd := &cli.Command{
Name: s.StrategyName(),
Usage: s.StrategyUsage(),
ArgsUsage: "[jobname] [bucket] [jobfile]",
Action: func(c *cli.Context) error {
jobname := c.Args().Get(0)
bucket := c.Args().Get(1)
jobfile := c.Args().Get(2)
keys, err := readJobsFile(jobfile)
if err != nil {
return err
}
ctx := falco.NewContext(jobname)
i.addFlags(c, ctx)
ctx.NewStingOption("inputBucket", bucket)
payloads, err := s.InvocationPayload(ctx, bucket, keys...)
if err != nil {
return err
}
collector := falco.NewCollector()
errors := make([]error, 0)
deployment := i.cmd.deploymentFromFlags(c)
for _, payload := range payloads {
err = i.platform.Invoke(deployment, payload, collector)
if err != nil {
fmt.Printf("%s failed with %+v\n", payload.ID(), err)
errors = append(errors, err)
}
}
collector.Print()
if len(errors) > 0 {
return fmt.Errorf("invocation failed with:%+v", errors)
}
return nil
},
}
cmds = append(cmds, cmd)
}
return &cli.Command{
Name: "invoke",
Aliases: []string{"i"},
Usage: "sends an invocation to the deployed runtime",
Flags: []cli.Flag{
&cli.StringFlag{
Name: "result",
Usage: "result File location",
Required: false,
Value: "result.csv",
},
&cli.IntFlag{
Name: "grouping",
Usage: "number of grouped files per payload",
Required: false,
Value: 1,
},
},
Subcommands: cmds,
}
}