/
init.go
123 lines (105 loc) · 2.88 KB
/
init.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
122
123
// Package cli provides easy-to-use commands to manage, monitor, and utilize AIS clusters.
/*
* Copyright (c) 2018-2023, NVIDIA CORPORATION. All rights reserved.
*/
package cli
import (
"fmt"
"os"
"os/exec"
"github.com/NVIDIA/aistore/api"
"github.com/NVIDIA/aistore/api/authn"
"github.com/NVIDIA/aistore/api/env"
"github.com/NVIDIA/aistore/cmd/cli/config"
"github.com/NVIDIA/aistore/cmn"
"github.com/NVIDIA/aistore/cmn/cos"
"github.com/NVIDIA/aistore/cmn/debug"
"github.com/NVIDIA/aistore/tools/docker"
)
var loggedUserToken string
func Init(args []string) (err error) {
cfg, err = config.Load(args, cmdReset)
if err != nil {
return
}
// kubernetes
k8sDetected = detectK8s()
// auth
loggedUserToken = authn.LoadToken("")
// http clients: the main one and the auth, if enabled
clusterURL = _clusterURL(cfg)
var (
cargs = cmn.TransportArgs{
DialTimeout: cfg.Timeout.TCPTimeout,
Timeout: cfg.Timeout.HTTPTimeout,
}
sargs = cmn.TLSArgs{
ClientCA: cfg.Cluster.ClientCA,
Certificate: cfg.Cluster.Certificate,
Key: cfg.Cluster.CertKey,
SkipVerify: cfg.Cluster.SkipVerifyCrt,
}
)
clientH = cmn.NewClient(cargs)
cmn.EnvToTLS(&sargs)
clientTLS = cmn.NewClientTLS(cargs, sargs)
apiBP = api.BaseParams{
URL: clusterURL,
Token: loggedUserToken,
UA: ua,
}
if cos.IsHTTPS(clusterURL) {
apiBP.Client = clientTLS
} else {
apiBP.Client = clientH
}
if authnURL := cliAuthnURL(cfg); authnURL != "" {
authParams = api.BaseParams{
URL: authnURL,
Token: loggedUserToken,
UA: ua,
}
if cos.IsHTTPS(authnURL) {
authParams.Client = clientTLS
} else {
authParams.Client = clientH
}
}
return
}
// resolving order:
// 1. cfg.Cluster.URL; if empty:
// 2. Proxy docker container IP address; if not successful:
// 3. Docker default; if not present:
// 4. Default as cfg.Cluster.DefaultAISHost
func _clusterURL(cfg *config.Config) string {
if envURL := os.Getenv(env.AIS.Endpoint); envURL != "" {
return envURL
}
if cfg.Cluster.URL != "" {
return cfg.Cluster.URL
}
if docker.IsRunning() {
clustersIDs, err := docker.ClusterIDs()
if err != nil {
fmt.Fprintf(os.Stderr, dockerErrMsgFmt, err, cfg.Cluster.DefaultDockerHost)
return cfg.Cluster.DefaultDockerHost
}
debug.Assert(len(clustersIDs) > 0, "There should be at least one cluster running, when docker running detected.")
proxyGateway, err := docker.ClusterEndpoint(clustersIDs[0])
if err != nil {
fmt.Fprintf(os.Stderr, dockerErrMsgFmt, err, cfg.Cluster.DefaultDockerHost)
return cfg.Cluster.DefaultDockerHost
}
if len(clustersIDs) > 1 {
fmt.Fprintf(os.Stderr, "Multiple docker clusters running. Connected to %d via %s.\n", clustersIDs[0], proxyGateway)
}
return "http://" + proxyGateway + ":8080"
}
return cfg.Cluster.DefaultAISHost
}
func detectK8s() bool {
cmd := exec.Command("which", "kubectl")
err := cmd.Run()
return err == nil
}