Skip to content

Commit ba1f58d

Browse files
authored
bugfix: resource manager account is not initialized correctly (#675)
* bugfix: resource manager account is not initialized correctly * fix context cancelled
1 parent bb8a4f0 commit ba1f58d

File tree

4 files changed

+51
-31
lines changed

4 files changed

+51
-31
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
## Unreleased
22
FEATURES:
33
- `azapi_resource` resource: Support resource move operation, it allows moving resources from `azurerm` provider.
4+
- `azapi_client_config` data source: Support `object_id` field.
45

56
BUG FIXES:
67
- Fix a bug when `body` contains an unknown float number, the provider will crash.

internal/clients/account.go

Lines changed: 48 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package clients
22

33
import (
44
"bytes"
5+
"context"
56
"encoding/base64"
67
"encoding/json"
78
"errors"
@@ -11,30 +12,33 @@ import (
1112
"strings"
1213
"sync"
1314

15+
"github.com/Azure/azure-sdk-for-go/sdk/azcore"
1416
"github.com/Azure/azure-sdk-for-go/sdk/azcore/cloud"
1517
"github.com/Azure/azure-sdk-for-go/sdk/azcore/policy"
1618
)
1719

20+
type ObjectIDProvider func(ctx context.Context) (string, error)
21+
1822
type ResourceManagerAccount struct {
19-
tenantId *string
20-
subscriptionId *string
21-
objectId *string
22-
mutex *sync.Mutex
23-
client *Client
23+
tenantId *string
24+
subscriptionId *string
25+
objectId *string
26+
mutex *sync.Mutex
27+
objectIDProvider ObjectIDProvider
2428
}
2529

26-
func NewResourceManagerAccount(client *Client) ResourceManagerAccount {
30+
func NewResourceManagerAccount(tenantId, subscriptionId string, provider ObjectIDProvider) ResourceManagerAccount {
2731
out := ResourceManagerAccount{
2832
mutex: &sync.Mutex{},
2933
}
30-
if client != nil && client.Account.tenantId != nil && *client.Account.tenantId != "" {
31-
out.tenantId = client.Account.tenantId
34+
if tenantId != "" {
35+
out.tenantId = &tenantId
3236
}
33-
if client != nil && client.Account.subscriptionId != nil && *client.Account.subscriptionId != "" {
34-
out.subscriptionId = client.Account.subscriptionId
37+
if subscriptionId != "" {
38+
out.subscriptionId = &subscriptionId
3539
}
3640
// We lazy load object ID because it's not always needed and could cause a performance hit
37-
out.client = client
41+
out.objectIDProvider = provider
3842
return out
3943
}
4044

@@ -80,36 +84,29 @@ func (account *ResourceManagerAccount) GetSubscriptionId() string {
8084
return *account.subscriptionId
8185
}
8286

83-
func (account *ResourceManagerAccount) GetObjectId() string {
87+
func (account *ResourceManagerAccount) GetObjectId(ctx context.Context) string {
8488
account.mutex.Lock()
8589
defer account.mutex.Unlock()
8690

8791
if account.objectId != nil {
8892
return *account.objectId
8993
}
9094

91-
tok, err := account.client.Option.Cred.GetToken(account.client.StopContext, policy.TokenRequestOptions{
92-
TenantID: account.client.Option.TenantId,
93-
Scopes: []string{account.client.Option.CloudCfg.Services[cloud.ResourceManager].Endpoint + "/.default"}})
94-
if err != nil {
95-
log.Printf("[DEBUG] Error getting requesting token from credentials: %s", err)
96-
}
97-
98-
if tok.Token == "" {
99-
err = account.loadSignedInUserFromAzCmd()
100-
if err != nil {
101-
log.Printf("[DEBUG] Error getting user object ID from az cli: %s", err)
102-
}
103-
} else {
104-
cl, err := parseTokenClaims(tok.Token)
95+
if account.objectIDProvider != nil {
96+
objectId, err := account.objectIDProvider(ctx)
10597
if err != nil {
106-
log.Printf("[DEBUG] Error getting object id from token: %s", err)
98+
log.Printf("[DEBUG] Error getting object ID: %s", err)
10799
}
108-
if cl != nil && cl.ObjectId != "" {
109-
account.objectId = &cl.ObjectId
100+
if objectId != "" {
101+
account.objectId = &objectId
102+
return *account.objectId
110103
}
111104
}
112105

106+
err := account.loadSignedInUserFromAzCmd()
107+
if err != nil {
108+
log.Printf("[DEBUG] Error getting user object ID from az cli: %s", err)
109+
}
113110
if account.objectId == nil {
114111
log.Printf("[DEBUG] No object ID found")
115112
return ""
@@ -215,3 +212,25 @@ type tokenClaims struct {
215212
AppId string `json:"appid,omitempty"`
216213
IdType string `json:"idtyp,omitempty"`
217214
}
215+
216+
func ParsedTokenClaimsObjectIDProvider(cred azcore.TokenCredential, cloudCfg cloud.Configuration) ObjectIDProvider {
217+
return func(ctx context.Context) (string, error) {
218+
tok, err := cred.GetToken(context.Background(), policy.TokenRequestOptions{
219+
EnableCAE: true,
220+
Scopes: []string{cloudCfg.Services[cloud.ResourceManager].Audience + "/.default"}})
221+
if err != nil {
222+
return "", fmt.Errorf("getting requesting token from credentials: %w", err)
223+
}
224+
if tok.Token == "" {
225+
return "", errors.New("token is empty")
226+
}
227+
cl, err := parseTokenClaims(tok.Token)
228+
if err != nil {
229+
return "", fmt.Errorf("getting object id from token: %w", err)
230+
}
231+
if cl == nil || cl.ObjectId == "" {
232+
return "", errors.New("object id is empty")
233+
}
234+
return cl.ObjectId, nil
235+
}
236+
}

internal/clients/client.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ func (client *Client) Build(ctx context.Context, o *Option) error {
133133
}
134134
client.DataPlaneClient = dataPlaneClient
135135

136-
client.Account = NewResourceManagerAccount(client)
136+
client.Account = NewResourceManagerAccount(o.TenantId, o.SubscriptionId, ParsedTokenClaimsObjectIDProvider(o.Cred, o.CloudCfg))
137137

138138
return nil
139139
}

internal/services/azapi_client_config_data_source.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ func (r *ClientConfigDataSource) Read(ctx context.Context, request datasource.Re
9090

9191
subscriptionId := r.ProviderData.Account.GetSubscriptionId()
9292
tenantId := r.ProviderData.Account.GetTenantId()
93-
objectId := r.ProviderData.Account.GetObjectId()
93+
objectId := r.ProviderData.Account.GetObjectId(ctx)
9494

9595
model.ID = types.StringValue(fmt.Sprintf("clientConfigs/subscriptionId=%s;tenantId=%s", subscriptionId, tenantId))
9696
model.SubscriptionID = types.StringValue(subscriptionId)

0 commit comments

Comments
 (0)