Skip to content

Commit 9f7f26f

Browse files
authored
[CLI] configure cmd ask for target server (#3585)
1 parent 28999b9 commit 9f7f26f

File tree

7 files changed

+113
-59
lines changed

7 files changed

+113
-59
lines changed

Makefile

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
VERSION?=dev
1+
export VERSION?=dev
2+
export TRACETEST_DEFAULT_CLOUD_ENDPOINT=https://app.tracetest.io
23
TAG?=$(VERSION)
34
GORELEASER_VERSION=1.23.0-pro
45

agent/config/flags.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ const (
88
)
99

1010
type Flags struct {
11-
Endpoint string
11+
ServerURL string
1212
OrganizationID string
1313
EnvironmentID string
1414
CI bool

agent/runner/runner.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ Once started, Tracetest Agent exposes OTLP ports 4317 and 4318 to ingest traces
5757

5858
s.logger = logger
5959

60-
return s.configurator.Start(ctx, cfg, flags)
60+
return s.configurator.Start(ctx, &cfg, flags)
6161
}
6262

6363
func (s *Runner) onStartAgent(ctx context.Context, cfg config.Config) {

cli/cmd/configure_cmd.go

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,9 @@ var configureCmd = &cobra.Command{
2626
flags := agentConfig.Flags{
2727
CI: configParams.CI,
2828
}
29-
config, err := config.LoadConfig("")
30-
if err != nil {
31-
return "", err
32-
}
3329

3430
if flagProvided(cmd, "server-url") || flagProvided(cmd, "endpoint") {
35-
flags.Endpoint = configParams.ServerURL
31+
flags.ServerURL = configParams.ServerURL
3632
}
3733

3834
if flagProvided(cmd, "token") {
@@ -47,8 +43,7 @@ var configureCmd = &cobra.Command{
4743
flags.OrganizationID = configParams.OrganizationID
4844
}
4945

50-
err = configurator.Start(ctx, config, flags)
51-
return "", err
46+
return "", configurator.Start(ctx, nil, flags)
5247
})),
5348
PostRun: teardownCommand,
5449
}

cli/cmd/start_cmd.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ var startCmd = &cobra.Command{
3030
flags := agentConfig.Flags{
3131
OrganizationID: saveParams.organizationID,
3232
EnvironmentID: saveParams.environmentID,
33-
Endpoint: saveParams.endpoint,
33+
ServerURL: saveParams.endpoint,
3434
AgentApiKey: saveParams.agentApiKey,
3535
Token: saveParams.token,
3636
Mode: agentConfig.Mode(saveParams.mode),

cli/config/config.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,11 @@ type Config struct {
3838
UIEndpoint string `yaml:"uIEndpoint,omitempty"`
3939
}
4040

41+
func (c Config) OAuthEndpoint() string {
42+
return fmt.Sprintf("%s%s", c.URL(), c.Path())
43+
44+
}
45+
4146
func (c Config) URL() string {
4247
if c.Scheme == "" || c.Endpoint == "" {
4348
return ""

cli/config/configurator.go

Lines changed: 101 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,10 @@ import (
77
"strings"
88

99
"github.com/golang-jwt/jwt"
10-
1110
agentConfig "github.com/kubeshop/tracetest/agent/config"
12-
1311
"github.com/kubeshop/tracetest/cli/analytics"
1412
"github.com/kubeshop/tracetest/cli/pkg/oauth"
1513
"github.com/kubeshop/tracetest/cli/pkg/resourcemanager"
16-
1714
cliUI "github.com/kubeshop/tracetest/cli/ui"
1815
)
1916

@@ -42,111 +39,167 @@ func (c Configurator) WithOnFinish(onFinish onFinishFn) Configurator {
4239
return c
4340
}
4441

45-
func (c Configurator) Start(ctx context.Context, prev Config, flags agentConfig.Flags) error {
42+
func (c Configurator) Start(ctx context.Context, prev *Config, flags agentConfig.Flags) error {
4643
c.flags = flags
47-
serverURL := getFirstValidString(flags.Endpoint, prev.UIEndpoint, DefaultCloudEndpoint)
48-
if serverURL == "" {
49-
path := ""
50-
if prev.ServerPath != nil {
51-
path = *prev.ServerPath
44+
serverURL, err := c.getServerURL(prev, flags)
45+
if err != nil {
46+
return err
47+
}
48+
49+
cfg, err := c.createConfig(serverURL)
50+
if err != nil {
51+
return err
52+
}
53+
54+
cfg, err, isOSS := c.populateConfigWithVersionInfo(ctx, cfg)
55+
if err != nil {
56+
return err
57+
}
58+
59+
if isOSS {
60+
// we don't need anything else for OSS
61+
return nil
62+
}
63+
64+
if flags.CI {
65+
err = Save(cfg)
66+
if err != nil {
67+
return err
5268
}
53-
serverURL = c.ui.TextInput("Enter your Tracetest server URL", fmt.Sprintf("%s%s", prev.URL(), path))
69+
return nil
5470
}
5571

56-
if err := ValidateServerURL(serverURL); err != nil {
72+
_, err = c.handleOAuth(ctx, cfg, prev, flags)
73+
if err != nil {
5774
return err
5875
}
5976

77+
return nil
78+
}
79+
80+
func (c Configurator) getServerURL(prev *Config, flags agentConfig.Flags) (string, error) {
81+
var prevUIEndpoint string
82+
if prev != nil {
83+
prevUIEndpoint = prev.UIEndpoint
84+
}
85+
serverURL := getFirstValidString(flags.ServerURL, prevUIEndpoint)
86+
if serverURL == "" {
87+
serverURL = c.ui.TextInput("What tracetest server do you want to use?", DefaultCloudEndpoint)
88+
}
89+
90+
if err := ValidateServerURL(serverURL); err != nil {
91+
return "", err
92+
}
93+
94+
return serverURL, nil
95+
}
96+
97+
func (c Configurator) createConfig(serverURL string) (Config, error) {
6098
scheme, endpoint, path, err := ParseServerURL(serverURL)
6199
if err != nil {
62-
return err
100+
return Config{}, err
63101
}
64102

65103
if strings.Contains(serverURL, DefaultCloudDomain) {
66104
path = &DefaultCloudPath
67105
}
68106

69-
cfg := Config{
107+
return Config{
70108
Scheme: scheme,
71109
Endpoint: endpoint,
72110
ServerPath: path,
73-
}
111+
}, nil
112+
}
74113

114+
func (c Configurator) populateConfigWithVersionInfo(ctx context.Context, cfg Config) (_ Config, _ error, isOSS bool) {
75115
client := GetAPIClient(cfg)
76116
version, err := getVersionMetadata(ctx, client)
77117
if err != nil {
78-
return fmt.Errorf("cannot get version metadata: %w", err)
118+
return Config{}, fmt.Errorf("cannot get version metadata: %w", err), false
79119
}
80120

81121
serverType := version.GetType()
82122
if serverType == "oss" {
83123
err := Save(cfg)
84124
if err != nil {
85-
return fmt.Errorf("could not save configuration: %w", err)
125+
return Config{}, fmt.Errorf("could not save configuration: %w", err), false
86126
}
87127

88128
c.ui.Success("Successfully configured Tracetest CLI")
89-
return nil
129+
return cfg, nil, true
90130
}
91131

92132
cfg.AgentEndpoint = version.GetAgentEndpoint()
93133
cfg.UIEndpoint = version.GetUiEndpoint()
94134
cfg.Scheme, cfg.Endpoint, cfg.ServerPath, err = ParseServerURL(version.GetApiEndpoint())
95135
if err != nil {
96-
return fmt.Errorf("cannot parse server url: %w", err)
136+
return Config{}, fmt.Errorf("cannot parse server url: %w", err), false
97137
}
98138

99-
if flags.CI {
100-
return Save(cfg)
101-
}
102-
103-
oauthEndpoint := fmt.Sprintf("%s%s", cfg.URL(), cfg.Path())
139+
return cfg, nil, false
140+
}
104141

105-
if prev.Jwt != "" {
142+
func (c Configurator) handleOAuth(ctx context.Context, cfg Config, prev *Config, flags agentConfig.Flags) (Config, error) {
143+
if prev != nil && prev.Jwt != "" {
106144
cfg.Jwt = prev.Jwt
107145
cfg.Token = prev.Token
108146
}
109147

110148
if flags.Token != "" {
111-
jwt, err := oauth.ExchangeToken(oauthEndpoint, flags.Token)
112-
if err != nil {
113-
return err
114-
}
115-
116-
cfg.Jwt = jwt
117-
cfg.Token = flags.Token
118-
119-
claims, err := GetTokenClaims(jwt)
149+
var err error
150+
cfg, err = c.exchangeToken(cfg, flags.Token)
120151
if err != nil {
121-
return err
122-
}
123-
124-
organizationId := claims["organization_id"].(string)
125-
environmentId := claims["environment_id"].(string)
126-
127-
if organizationId != "" {
128-
flags.OrganizationID = organizationId
129-
}
130-
if environmentId != "" {
131-
flags.EnvironmentID = environmentId
152+
return Config{}, err
132153
}
133154
}
134155

135156
if flags.AgentApiKey != "" {
136157
cfg.AgentApiKey = flags.AgentApiKey
137158
c.ShowOrganizationSelector(ctx, cfg, flags)
138-
return nil
159+
return cfg, nil
139160
}
140161

141162
if cfg.Jwt != "" {
142163
c.ShowOrganizationSelector(ctx, cfg, flags)
143-
return nil
164+
return cfg, nil
144165
}
145166

146-
oauthServer := oauth.NewOAuthServer(oauthEndpoint, cfg.UIEndpoint)
147-
return oauthServer.WithOnSuccess(c.onOAuthSuccess(ctx, cfg)).
167+
oauthServer := oauth.NewOAuthServer(cfg.OAuthEndpoint(), cfg.UIEndpoint)
168+
err := oauthServer.WithOnSuccess(c.onOAuthSuccess(ctx, cfg)).
148169
WithOnFailure(c.onOAuthFailure).
149170
GetAuthJWT()
171+
if err != nil {
172+
return Config{}, err
173+
}
174+
175+
return cfg, nil
176+
}
177+
178+
func (c Configurator) exchangeToken(cfg Config, token string) (Config, error) {
179+
jwt, err := oauth.ExchangeToken(cfg.OAuthEndpoint(), token)
180+
if err != nil {
181+
return Config{}, err
182+
}
183+
184+
cfg.Jwt = jwt
185+
cfg.Token = token
186+
187+
claims, err := GetTokenClaims(jwt)
188+
if err != nil {
189+
return Config{}, err
190+
}
191+
192+
organizationId := claims["organization_id"].(string)
193+
environmentId := claims["environment_id"].(string)
194+
195+
if organizationId != "" {
196+
c.flags.OrganizationID = organizationId
197+
}
198+
if environmentId != "" {
199+
c.flags.EnvironmentID = environmentId
200+
}
201+
202+
return cfg, nil
150203
}
151204

152205
func getFirstValidString(values ...string) string {

0 commit comments

Comments
 (0)