-
Notifications
You must be signed in to change notification settings - Fork 3.2k
/
Copy pathroot.go
118 lines (98 loc) · 3.56 KB
/
root.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
package commands
import (
"encoding/json"
"os"
log "github.com/sirupsen/logrus"
"github.com/spf13/cobra"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/tools/clientcmd"
"github.com/argoproj/pkg/cli"
kubecli "github.com/argoproj/pkg/kube/cli"
"github.com/argoproj/argo/v2"
"github.com/argoproj/argo/v2/util"
"github.com/argoproj/argo/v2/util/cmd"
"github.com/argoproj/argo/v2/workflow/common"
"github.com/argoproj/argo/v2/workflow/executor"
"github.com/argoproj/argo/v2/workflow/executor/docker"
"github.com/argoproj/argo/v2/workflow/executor/k8sapi"
"github.com/argoproj/argo/v2/workflow/executor/kubelet"
"github.com/argoproj/argo/v2/workflow/executor/pns"
)
const (
// CLIName is the name of the CLI
CLIName = "argoexec"
)
var (
clientConfig clientcmd.ClientConfig
logLevel string // --loglevel
glogLevel int // --gloglevel
podAnnotationsPath string // --pod-annotations
)
func init() {
cobra.OnInitialize(initConfig)
}
func initConfig() {
log.SetFormatter(&log.TextFormatter{
TimestampFormat: "2006-01-02T15:04:05.000Z",
FullTimestamp: true,
})
cli.SetLogLevel(logLevel)
cli.SetGLogLevel(glogLevel)
}
func NewRootCommand() *cobra.Command {
var command = cobra.Command{
Use: CLIName,
Short: "argoexec is the executor sidecar to workflow containers",
Run: func(cmd *cobra.Command, args []string) {
cmd.HelpFunc()(cmd, args)
},
}
command.AddCommand(NewInitCommand())
command.AddCommand(NewResourceCommand())
command.AddCommand(NewWaitCommand())
command.AddCommand(cmd.NewVersionCmd(CLIName))
clientConfig = kubecli.AddKubectlFlagsToCmd(&command)
command.PersistentFlags().StringVar(&podAnnotationsPath, "pod-annotations", common.PodMetadataAnnotationsPath, "Pod annotations file from k8s downward API")
command.PersistentFlags().StringVar(&logLevel, "loglevel", "info", "Set the logging level. One of: debug|info|warn|error")
command.PersistentFlags().IntVar(&glogLevel, "gloglevel", 0, "Set the glog logging level")
return &command
}
func initExecutor() *executor.WorkflowExecutor {
log.WithField("version", argo.GetVersion().Version).Info("Starting Workflow Executor")
config, err := clientConfig.ClientConfig()
checkErr(err)
namespace, _, err := clientConfig.Namespace()
checkErr(err)
clientset, err := kubernetes.NewForConfig(config)
checkErr(err)
podName, ok := os.LookupEnv(common.EnvVarPodName)
if !ok {
log.Fatalf("Unable to determine pod name from environment variable %s", common.EnvVarPodName)
}
tmpl, err := executor.LoadTemplate(podAnnotationsPath)
checkErr(err)
var cre executor.ContainerRuntimeExecutor
switch os.Getenv(common.EnvVarContainerRuntimeExecutor) {
case common.ContainerRuntimeExecutorK8sAPI:
cre, err = k8sapi.NewK8sAPIExecutor(clientset, config, podName, namespace)
case common.ContainerRuntimeExecutorKubelet:
cre, err = kubelet.NewKubeletExecutor()
case common.ContainerRuntimeExecutorPNS:
cre, err = pns.NewPNSExecutor(clientset, podName, namespace, tmpl.Outputs.HasOutputs())
default:
cre, err = docker.NewDockerExecutor()
}
checkErr(err)
wfExecutor := executor.NewExecutor(clientset, podName, namespace, podAnnotationsPath, cre, *tmpl)
yamlBytes, _ := json.Marshal(&wfExecutor.Template)
vers := argo.GetVersion()
log.Infof("Executor (version: %s, build_date: %s) initialized (pod: %s/%s) with template:\n%s", vers.Version, vers.BuildDate, namespace, podName, string(yamlBytes))
return &wfExecutor
}
// checkErr is a convenience function to panic upon error
func checkErr(err error) {
if err != nil {
util.WriteTeriminateMessage(err.Error())
panic(err.Error())
}
}