@@ -7,13 +7,10 @@ import (
7
7
"strings"
8
8
9
9
"github.com/golang-jwt/jwt"
10
-
11
10
agentConfig "github.com/kubeshop/tracetest/agent/config"
12
-
13
11
"github.com/kubeshop/tracetest/cli/analytics"
14
12
"github.com/kubeshop/tracetest/cli/pkg/oauth"
15
13
"github.com/kubeshop/tracetest/cli/pkg/resourcemanager"
16
-
17
14
cliUI "github.com/kubeshop/tracetest/cli/ui"
18
15
)
19
16
@@ -42,111 +39,167 @@ func (c Configurator) WithOnFinish(onFinish onFinishFn) Configurator {
42
39
return c
43
40
}
44
41
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 {
46
43
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
52
68
}
53
- serverURL = c . ui . TextInput ( "Enter your Tracetest server URL" , fmt . Sprintf ( "%s%s" , prev . URL (), path ))
69
+ return nil
54
70
}
55
71
56
- if err := ValidateServerURL (serverURL ); err != nil {
72
+ _ , err = c .handleOAuth (ctx , cfg , prev , flags )
73
+ if err != nil {
57
74
return err
58
75
}
59
76
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 ) {
60
98
scheme , endpoint , path , err := ParseServerURL (serverURL )
61
99
if err != nil {
62
- return err
100
+ return Config {}, err
63
101
}
64
102
65
103
if strings .Contains (serverURL , DefaultCloudDomain ) {
66
104
path = & DefaultCloudPath
67
105
}
68
106
69
- cfg := Config {
107
+ return Config {
70
108
Scheme : scheme ,
71
109
Endpoint : endpoint ,
72
110
ServerPath : path ,
73
- }
111
+ }, nil
112
+ }
74
113
114
+ func (c Configurator ) populateConfigWithVersionInfo (ctx context.Context , cfg Config ) (_ Config , _ error , isOSS bool ) {
75
115
client := GetAPIClient (cfg )
76
116
version , err := getVersionMetadata (ctx , client )
77
117
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
79
119
}
80
120
81
121
serverType := version .GetType ()
82
122
if serverType == "oss" {
83
123
err := Save (cfg )
84
124
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
86
126
}
87
127
88
128
c .ui .Success ("Successfully configured Tracetest CLI" )
89
- return nil
129
+ return cfg , nil , true
90
130
}
91
131
92
132
cfg .AgentEndpoint = version .GetAgentEndpoint ()
93
133
cfg .UIEndpoint = version .GetUiEndpoint ()
94
134
cfg .Scheme , cfg .Endpoint , cfg .ServerPath , err = ParseServerURL (version .GetApiEndpoint ())
95
135
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
97
137
}
98
138
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
+ }
104
141
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 != "" {
106
144
cfg .Jwt = prev .Jwt
107
145
cfg .Token = prev .Token
108
146
}
109
147
110
148
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 )
120
151
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
132
153
}
133
154
}
134
155
135
156
if flags .AgentApiKey != "" {
136
157
cfg .AgentApiKey = flags .AgentApiKey
137
158
c .ShowOrganizationSelector (ctx , cfg , flags )
138
- return nil
159
+ return cfg , nil
139
160
}
140
161
141
162
if cfg .Jwt != "" {
142
163
c .ShowOrganizationSelector (ctx , cfg , flags )
143
- return nil
164
+ return cfg , nil
144
165
}
145
166
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 )).
148
169
WithOnFailure (c .onOAuthFailure ).
149
170
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
150
203
}
151
204
152
205
func getFirstValidString (values ... string ) string {
0 commit comments