Skip to content

Commit ac9b66b

Browse files
authored
chore: Improves user agent in the provider to include Terraform CLI version (#2085)
1 parent 8dc07dd commit ac9b66b

File tree

4 files changed

+76
-45
lines changed

4 files changed

+76
-45
lines changed

internal/config/client.go

+41-19
Original file line numberDiff line numberDiff line change
@@ -6,25 +6,25 @@ import (
66
"fmt"
77
"net/http"
88
"net/url"
9+
"strings"
910
"time"
1011

11-
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/logging"
12-
"github.com/mongodb-forks/digest"
13-
"github.com/mongodb/terraform-provider-mongodbatlas/version"
14-
"github.com/spf13/cast"
1512
admin20231001002 "go.mongodb.org/atlas-sdk/v20231001002/admin"
1613
"go.mongodb.org/atlas-sdk/v20231115008/admin"
1714
matlasClient "go.mongodb.org/atlas/mongodbatlas"
1815
realmAuth "go.mongodb.org/realm/auth"
1916
"go.mongodb.org/realm/realm"
20-
)
2117

22-
const (
23-
toolName = "terraform-provider-mongodbatlas"
18+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/logging"
19+
"github.com/mongodb-forks/digest"
20+
"github.com/spf13/cast"
21+
22+
"github.com/mongodb/terraform-provider-mongodbatlas/version"
2423
)
2524

26-
var (
27-
userAgent = fmt.Sprintf("%s/%s", toolName, version.ProviderVersion)
25+
const (
26+
toolName = "terraform-provider-mongodbatlas"
27+
terraformPlatformName = "Terraform"
2828
)
2929

3030
// MongoDBClient contains the mongodbatlas clients and configurations
@@ -37,12 +37,13 @@ type MongoDBClient struct {
3737

3838
// Config contains the configurations needed to use SDKs
3939
type Config struct {
40-
AssumeRole *AssumeRole
41-
ProxyPort *int
42-
PublicKey string
43-
PrivateKey string
44-
BaseURL string
45-
RealmBaseURL string
40+
AssumeRole *AssumeRole
41+
ProxyPort *int
42+
PublicKey string
43+
PrivateKey string
44+
BaseURL string
45+
RealmBaseURL string
46+
TerraformVersion string
4647
}
4748

4849
type AssumeRole struct {
@@ -62,6 +63,11 @@ type SecretData struct {
6263
PrivateKey string `json:"private_key"`
6364
}
6465

66+
type PlatformVersion struct {
67+
Name string
68+
Version string
69+
}
70+
6571
// NewClient func...
6672
func (c *Config) NewClient(ctx context.Context) (any, error) {
6773
// setup a transport to handle digest
@@ -83,7 +89,7 @@ func (c *Config) NewClient(ctx context.Context) (any, error) {
8389

8490
client.Transport = logging.NewTransport("MongoDB Atlas", transport)
8591

86-
optsAtlas := []matlasClient.ClientOpt{matlasClient.SetUserAgent(userAgent)}
92+
optsAtlas := []matlasClient.ClientOpt{matlasClient.SetUserAgent(userAgent(c))}
8793
if c.BaseURL != "" {
8894
optsAtlas = append(optsAtlas, matlasClient.SetBaseURL(c.BaseURL))
8995
}
@@ -116,7 +122,7 @@ func (c *Config) NewClient(ctx context.Context) (any, error) {
116122
func (c *Config) newSDKV2Client(client *http.Client) (*admin.APIClient, error) {
117123
opts := []admin.ClientModifier{
118124
admin.UseHTTPClient(client),
119-
admin.UseUserAgent(userAgent),
125+
admin.UseUserAgent(userAgent(c)),
120126
admin.UseBaseURL(c.BaseURL),
121127
admin.UseDebug(false)}
122128

@@ -132,7 +138,7 @@ func (c *Config) newSDKV2Client(client *http.Client) (*admin.APIClient, error) {
132138
func (c *Config) newSDK20231001002Client(client *http.Client) (*admin20231001002.APIClient, error) {
133139
opts := []admin20231001002.ClientModifier{
134140
admin20231001002.UseHTTPClient(client),
135-
admin20231001002.UseUserAgent(userAgent),
141+
admin20231001002.UseUserAgent(userAgent(c)),
136142
admin20231001002.UseBaseURL(c.BaseURL),
137143
admin20231001002.UseDebug(false)}
138144

@@ -151,7 +157,8 @@ func (c *MongoDBClient) GetRealmClient(ctx context.Context) (*realm.Client, erro
151157
return nil, errors.New("please set `public_key` and `private_key` in order to use the realm client")
152158
}
153159

154-
optsRealm := []realm.ClientOpt{realm.SetUserAgent(userAgent)}
160+
optsRealm := []realm.ClientOpt{realm.SetUserAgent(userAgent(c.Config))}
161+
155162
authConfig := realmAuth.NewConfig(nil)
156163
if c.Config.BaseURL != "" && c.Config.RealmBaseURL != "" {
157164
adminURL := c.Config.RealmBaseURL + "api/admin/v3.0/"
@@ -175,3 +182,18 @@ func (c *MongoDBClient) GetRealmClient(ctx context.Context) (*realm.Client, erro
175182

176183
return realmClient, nil
177184
}
185+
186+
func userAgent(c *Config) string {
187+
platformVersions := []PlatformVersion{
188+
{toolName, version.ProviderVersion},
189+
{terraformPlatformName, c.TerraformVersion},
190+
}
191+
192+
var parts []string
193+
for _, info := range platformVersions {
194+
part := fmt.Sprintf("%s/%s", info.Name, info.Version)
195+
parts = append(parts, part)
196+
}
197+
198+
return strings.Join(parts, " ")
199+
}

internal/provider/provider.go

+6-5
Original file line numberDiff line numberDiff line change
@@ -227,11 +227,12 @@ func (p *MongodbtlasProvider) Configure(ctx context.Context, req provider.Config
227227
}
228228

229229
cfg := config.Config{
230-
PublicKey: data.PublicKey.ValueString(),
231-
PrivateKey: data.PrivateKey.ValueString(),
232-
BaseURL: data.BaseURL.ValueString(),
233-
RealmBaseURL: data.RealmBaseURL.ValueString(),
234-
ProxyPort: p.proxyPort,
230+
PublicKey: data.PublicKey.ValueString(),
231+
PrivateKey: data.PrivateKey.ValueString(),
232+
BaseURL: data.BaseURL.ValueString(),
233+
RealmBaseURL: data.RealmBaseURL.ValueString(),
234+
TerraformVersion: req.TerraformVersion,
235+
ProxyPort: p.proxyPort,
235236
}
236237

237238
var assumeRoles []tfAssumeRoleModel

internal/provider/provider_sdk2.go

+12-9
Original file line numberDiff line numberDiff line change
@@ -133,11 +133,13 @@ func NewSdkV2Provider(proxyPort *int) *schema.Provider {
133133
Description: "AWS Security Token Service provided session token.",
134134
},
135135
},
136-
DataSourcesMap: getDataSourcesMap(),
137-
ResourcesMap: getResourcesMap(),
138-
ConfigureContextFunc: providerConfigure(proxyPort),
136+
DataSourcesMap: getDataSourcesMap(),
137+
ResourcesMap: getResourcesMap(),
139138
}
140139
addPreviewFeatures(provider)
140+
141+
provider.ConfigureContextFunc = providerConfigure(provider, proxyPort)
142+
141143
return provider
142144
}
143145

@@ -283,19 +285,20 @@ func addPreviewFeatures(provider *schema.Provider) {
283285
}
284286
}
285287

286-
func providerConfigure(proxyPort *int) func(ctx context.Context, d *schema.ResourceData) (any, diag.Diagnostics) {
288+
func providerConfigure(provider *schema.Provider, proxyPort *int) func(ctx context.Context, d *schema.ResourceData) (any, diag.Diagnostics) {
287289
return func(ctx context.Context, d *schema.ResourceData) (any, diag.Diagnostics) {
288290
diagnostics := setDefaultsAndValidations(d)
289291
if diagnostics.HasError() {
290292
return nil, diagnostics
291293
}
292294

293295
cfg := config.Config{
294-
PublicKey: d.Get("public_key").(string),
295-
PrivateKey: d.Get("private_key").(string),
296-
BaseURL: d.Get("base_url").(string),
297-
RealmBaseURL: d.Get("realm_base_url").(string),
298-
ProxyPort: proxyPort,
296+
PublicKey: d.Get("public_key").(string),
297+
PrivateKey: d.Get("private_key").(string),
298+
BaseURL: d.Get("base_url").(string),
299+
RealmBaseURL: d.Get("realm_base_url").(string),
300+
ProxyPort: proxyPort,
301+
TerraformVersion: provider.TerraformVersion,
299302
}
300303

301304
assumeRoleValue, ok := d.GetOk("assume_role")

internal/service/organization/resource_organization.go

+17-12
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010

1111
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
1212
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
13+
1314
"github.com/mongodb/terraform-provider-mongodbatlas/internal/common/constant"
1415
"github.com/mongodb/terraform-provider-mongodbatlas/internal/common/conversion"
1516
"github.com/mongodb/terraform-provider-mongodbatlas/internal/config"
@@ -100,9 +101,10 @@ func resourceMongoDBAtlasOrganizationCreate(ctx context.Context, d *schema.Resou
100101
// update settings using new keys for this created organization because
101102
// the provider/requesting API keys are not applicable for performing updates/delete for this new organization
102103
cfg := config.Config{
103-
PublicKey: *organization.ApiKey.PublicKey,
104-
PrivateKey: *organization.ApiKey.PrivateKey,
105-
BaseURL: meta.(*config.MongoDBClient).Config.BaseURL,
104+
PublicKey: *organization.ApiKey.PublicKey,
105+
PrivateKey: *organization.ApiKey.PrivateKey,
106+
BaseURL: meta.(*config.MongoDBClient).Config.BaseURL,
107+
TerraformVersion: meta.(*config.Config).TerraformVersion,
106108
}
107109

108110
clients, _ := cfg.NewClient(ctx)
@@ -140,9 +142,10 @@ func resourceMongoDBAtlasOrganizationCreate(ctx context.Context, d *schema.Resou
140142
func resourceMongoDBAtlasOrganizationRead(ctx context.Context, d *schema.ResourceData, meta any) diag.Diagnostics {
141143
// Get client connection.
142144
cfg := config.Config{
143-
PublicKey: d.Get("public_key").(string),
144-
PrivateKey: d.Get("private_key").(string),
145-
BaseURL: meta.(*config.MongoDBClient).Config.BaseURL,
145+
PublicKey: d.Get("public_key").(string),
146+
PrivateKey: d.Get("private_key").(string),
147+
BaseURL: meta.(*config.MongoDBClient).Config.BaseURL,
148+
TerraformVersion: meta.(*config.Config).TerraformVersion,
146149
}
147150

148151
clients, _ := cfg.NewClient(ctx)
@@ -189,9 +192,10 @@ func resourceMongoDBAtlasOrganizationRead(ctx context.Context, d *schema.Resourc
189192
func resourceMongoDBAtlasOrganizationUpdate(ctx context.Context, d *schema.ResourceData, meta any) diag.Diagnostics {
190193
// Get client connection.
191194
cfg := config.Config{
192-
PublicKey: d.Get("public_key").(string),
193-
PrivateKey: d.Get("private_key").(string),
194-
BaseURL: meta.(*config.MongoDBClient).Config.BaseURL,
195+
PublicKey: d.Get("public_key").(string),
196+
PrivateKey: d.Get("private_key").(string),
197+
BaseURL: meta.(*config.MongoDBClient).Config.BaseURL,
198+
TerraformVersion: meta.(*config.Config).TerraformVersion,
195199
}
196200

197201
clients, _ := cfg.NewClient(ctx)
@@ -220,9 +224,10 @@ func resourceMongoDBAtlasOrganizationUpdate(ctx context.Context, d *schema.Resou
220224
func resourceMongoDBAtlasOrganizationDelete(ctx context.Context, d *schema.ResourceData, meta any) diag.Diagnostics {
221225
// Get client connection.
222226
cfg := config.Config{
223-
PublicKey: d.Get("public_key").(string),
224-
PrivateKey: d.Get("private_key").(string),
225-
BaseURL: meta.(*config.MongoDBClient).Config.BaseURL,
227+
PublicKey: d.Get("public_key").(string),
228+
PrivateKey: d.Get("private_key").(string),
229+
BaseURL: meta.(*config.MongoDBClient).Config.BaseURL,
230+
TerraformVersion: meta.(*config.Config).TerraformVersion,
226231
}
227232

228233
clients, _ := cfg.NewClient(ctx)

0 commit comments

Comments
 (0)