Skip to content

Commit ce7c72a

Browse files
authored
CLOUDP-329793: Replace L1 transport (#4096)
1 parent 4a49db9 commit ce7c72a

File tree

6 files changed

+38
-121
lines changed

6 files changed

+38
-121
lines changed

internal/api/executor.go

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@ import (
2222

2323
"github.com/mongodb/mongodb-atlas-cli/atlascli/internal/config"
2424
"github.com/mongodb/mongodb-atlas-cli/atlascli/internal/log"
25-
storeTransport "github.com/mongodb/mongodb-atlas-cli/atlascli/internal/transport"
25+
"github.com/mongodb/mongodb-atlas-cli/atlascli/internal/store"
26+
"github.com/mongodb/mongodb-atlas-cli/atlascli/internal/transport"
2627
)
2728

2829
var (
@@ -71,8 +72,9 @@ func NewExecutor(commandConverter CommandConverter, httpClient Doer, formatter R
7172
func NewDefaultExecutor(formatter ResponseFormatter) (*Executor, error) {
7273
profile := config.Default()
7374

74-
client := &http.Client{
75-
Transport: authenticatedTransport(profile, storeTransport.Default()),
75+
client, err := store.HTTPClient(profile, transport.Default())
76+
if err != nil {
77+
return nil, err
7678
}
7779

7880
configWrapper := NewAuthenticatedConfigWrapper(profile)

internal/api/transport.go

Lines changed: 0 additions & 54 deletions
This file was deleted.

internal/store/store.go

Lines changed: 23 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -40,45 +40,39 @@ const (
4040
var errUnsupportedService = errors.New("unsupported service")
4141

4242
type Store struct {
43-
service string
44-
baseURL string
45-
telemetry bool
46-
authType config.AuthMechanism
47-
username string
48-
password string
49-
accessToken *atlasauth.Token
50-
clientID string
51-
clientSecret string
52-
client *atlas.Client
43+
service string
44+
baseURL string
45+
telemetry bool
46+
httpClient *http.Client
47+
client *atlas.Client
5348
// Latest release of the autogenerated Atlas V2 API Client
5449
clientv2 *atlasv2.APIClient
5550
// Pinnned version to the most recent version that's working for clusters
5651
clientClusters *atlasClustersPinned.APIClient
5752
ctx context.Context
5853
}
5954

60-
func (s *Store) httpClient(httpTransport http.RoundTripper) (*http.Client, error) {
61-
switch s.authType {
55+
func HTTPClient(c CredentialsGetter, httpTransport http.RoundTripper) (*http.Client, error) {
56+
switch c.AuthType() {
6257
case config.APIKeys:
63-
t := transport.NewDigestTransport(s.username, s.password, httpTransport)
58+
t := transport.NewDigestTransport(c.PublicAPIKey(), c.PrivateAPIKey(), httpTransport)
6459
return t.Client()
6560
case config.UserAccount:
66-
tr, err := transport.NewAccessTokenTransport(s.accessToken, httpTransport, func(t *atlasauth.Token) error {
61+
token, err := c.Token()
62+
if err != nil {
63+
return nil, err
64+
}
65+
tr, err := transport.NewAccessTokenTransport(token, httpTransport, func(t *atlasauth.Token) error {
6766
config.SetAccessToken(t.AccessToken)
6867
config.SetRefreshToken(t.RefreshToken)
6968
return config.Save()
7069
})
7170
if err != nil {
7271
return nil, err
7372
}
74-
7573
return &http.Client{Transport: tr}, nil
7674
case config.ServiceAccount:
77-
tr, err := transport.NewServiceAccountTransport(s.clientID, s.clientSecret, httpTransport)
78-
if err != nil {
79-
return nil, err
80-
}
81-
return &http.Client{Transport: tr}, nil
75+
return transport.NewServiceAccountClient(c.ClientID(), c.ClientSecret()), nil
8276
default:
8377
return &http.Client{Transport: httpTransport}, nil
8478
}
@@ -149,23 +143,11 @@ type CredentialsGetter interface {
149143
// WithAuthentication sets the store credentials.
150144
func WithAuthentication(c CredentialsGetter) Option {
151145
return func(s *Store) error {
152-
s.authType = c.AuthType()
153-
switch s.authType {
154-
case config.APIKeys:
155-
s.username = c.PublicAPIKey()
156-
s.password = c.PrivateAPIKey()
157-
case config.ServiceAccount:
158-
s.clientID = c.ClientID()
159-
s.clientSecret = c.ClientSecret()
160-
case config.UserAccount:
161-
fallthrough
162-
default:
163-
t, err := c.Token()
164-
if err != nil {
165-
return err
166-
}
167-
s.accessToken = t
146+
client, err := HTTPClient(c, s.transport())
147+
if err != nil {
148+
return err
168149
}
150+
s.httpClient = client
169151
return nil
170152
}
171153
}
@@ -179,25 +161,25 @@ func WithContext(ctx context.Context) Option {
179161
}
180162

181163
// setAtlasClient sets the internal client to use an Atlas client and methods.
182-
func (s *Store) setAtlasClient(client *http.Client) error {
164+
func (s *Store) setAtlasClient() error {
183165
opts := []atlas.ClientOpt{atlas.SetUserAgent(config.UserAgent)}
184166
if s.baseURL != "" {
185167
opts = append(opts, atlas.SetBaseURL(s.baseURL))
186168
}
187169
if log.IsDebugLevel() {
188170
opts = append(opts, atlas.SetWithRaw())
189171
}
190-
c, err := atlas.New(client, opts...)
172+
c, err := atlas.New(s.httpClient, opts...)
191173
if err != nil {
192174
return err
193175
}
194176

195-
err = s.createV2Client(client)
177+
err = s.createV2Client(s.httpClient)
196178
if err != nil {
197179
return err
198180
}
199181

200-
err = s.createClustersClient(client)
182+
err = s.createClustersClient(s.httpClient)
201183
if err != nil {
202184
return err
203185
}
@@ -318,11 +300,7 @@ func New(opts ...Option) (*Store, error) {
318300
}
319301
}
320302

321-
client, err := store.httpClient(store.transport())
322-
if err != nil {
323-
return nil, err
324-
}
325-
if err = store.setAtlasClient(client); err != nil {
303+
if err := store.setAtlasClient(); err != nil {
326304
return nil, err
327305
}
328306

internal/store/store_test.go

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -151,11 +151,9 @@ func TestWithAuthentication(t *testing.T) {
151151
t.Run(tt.name, func(t *testing.T) {
152152
c, err := New(Service("cloud"), WithAuthentication(tt.a))
153153
require.NoError(t, err)
154-
require.Equal(t, c.username, tt.a.username)
155-
require.Equal(t, c.password, tt.a.password)
156-
require.Equal(t, c.clientID, tt.a.clientID)
157-
require.Equal(t, c.clientSecret, tt.a.clientSecret)
158-
require.Equal(t, c.accessToken, tt.a.accessToken)
154+
require.NotNil(t, c.httpClient)
155+
require.NotNil(t, c.httpClient.Transport)
156+
require.NotEqual(t, c.transport(), c.httpClient.Transport) // Check transport is not default
159157
})
160158
}
161159
}

internal/transport/transport.go

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ import (
2525
"github.com/mongodb/mongodb-atlas-cli/atlascli/internal/oauth"
2626
"go.mongodb.org/atlas-sdk/v20250312005/auth/clientcredentials"
2727
atlasauth "go.mongodb.org/atlas/auth"
28-
"golang.org/x/oauth2"
2928
)
3029

3130
const (
@@ -114,17 +113,13 @@ func (tr *tokenTransport) RoundTrip(req *http.Request) (*http.Response, error) {
114113
return tr.base.RoundTrip(req)
115114
}
116115

117-
func NewServiceAccountTransport(clientID, clientSecret string, base http.RoundTripper) (http.RoundTripper, error) {
116+
// NewServiceAccountClient creates a new HTTP client configured for service account authentication.
117+
// This function does not return http.RoundTripper as atlas-sdk already packages a transport with the client.
118+
func NewServiceAccountClient(clientID, clientSecret string) *http.Client {
118119
cfg := clientcredentials.NewConfig(clientID, clientSecret)
119120
if config.OpsManagerURL() != "" {
120121
cfg.RevokeURL = config.OpsManagerURL() + "api/oauth/revoke"
121122
cfg.TokenURL = config.OpsManagerURL() + "api/oauth/token"
122123
}
123-
124-
ctx := context.Background()
125-
126-
return &oauth2.Transport{
127-
Base: base,
128-
Source: cfg.TokenSource(ctx),
129-
}, nil
124+
return cfg.Client(context.Background())
130125
}

internal/transport/transport_test.go

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -66,11 +66,9 @@ func TestNewServiceAccountTransport(t *testing.T) {
6666

6767
clientID := "mock-client-id"
6868
clientSecret := "mock-client-secret" //nolint:gosec
69-
base := http.DefaultTransport
7069

71-
tr, err := NewServiceAccountTransport(clientID, clientSecret, base)
72-
require.NoError(t, err)
73-
require.NotNil(t, tr)
70+
client := NewServiceAccountClient(clientID, clientSecret)
71+
require.NotNil(t, client)
7472

7573
// Create request to check authentication header
7674
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
@@ -82,7 +80,7 @@ func TestNewServiceAccountTransport(t *testing.T) {
8280
defer server.Close()
8381

8482
req := httptest.NewRequest(http.MethodGet, server.URL, nil)
85-
resp, err := tr.RoundTrip(req)
83+
resp, err := client.Transport.RoundTrip(req)
8684
require.NoError(t, err)
8785
require.NotNil(t, resp)
8886
}

0 commit comments

Comments
 (0)