Skip to content

Commit 9fe85df

Browse files
committed
fix(iam/group): use global CloudControl endpoint for global services
Global services like IAM Group must use cloudcontrol.volcengineapi.com (no regional subdomain) instead of the regional endpoint. Sending any request to cloudcontrol.cn-shanghai.volcengineapi.com causes: RegionNotSupport: service [iam] not support region [cn-shanghai] Add GlobalCloudControlAPIClient to providerData and the Provider interface, initialized with endpoint cloudcontrol.volcengineapi.com. genericResource selects the global client when globalService=true.
1 parent cb494c6 commit 9fe85df

File tree

3 files changed

+43
-14
lines changed

3 files changed

+43
-14
lines changed

internal/generic/resource.go

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -442,7 +442,7 @@ func (r *genericResource) Create(ctx context.Context, request resource.CreateReq
442442

443443
traceEntry(ctx, "Resource.Create")
444444

445-
cloudControlClient := r.provider.CloudControlAPIClient(ctx)
445+
cloudControlClient := r.cloudControlClient(ctx)
446446

447447
tflog.Debug(ctx, "Request.Plan.Raw", map[string]interface{}{
448448
"value": hclog.Fmt("%v", request.Plan.Raw),
@@ -551,7 +551,7 @@ func (r *genericResource) Read(ctx context.Context, request resource.ReadRequest
551551
"value": hclog.Fmt("%v", request.State.Raw),
552552
})
553553

554-
client := r.provider.CloudControlAPIClient(ctx)
554+
client := r.cloudControlClient(ctx)
555555

556556
currentState := &request.State
557557
id, err := r.getId(ctx, currentState)
@@ -625,7 +625,7 @@ func (r *genericResource) Update(ctx context.Context, request resource.UpdateReq
625625

626626
traceEntry(ctx, "Resource.Update")
627627

628-
cloudControlClient := r.provider.CloudControlAPIClient(ctx)
628+
cloudControlClient := r.cloudControlClient(ctx)
629629

630630
currentState := &request.State
631631
id, err := r.getId(ctx, currentState)
@@ -705,7 +705,7 @@ func (r *genericResource) Update(ctx context.Context, request resource.UpdateReq
705705
}
706706

707707
//for update set ,get new resource
708-
description, err := r.describeWithSysTag(ctx, r.provider.CloudControlAPIClient(ctx), id)
708+
description, err := r.describeWithSysTag(ctx, r.cloudControlClient(ctx), id)
709709

710710
if tfresource.NotFound(err) {
711711
response.Diagnostics.Append(ResourceNotFoundAfterWriteDiag(err))
@@ -842,7 +842,7 @@ func (r *genericResource) Delete(ctx context.Context, request resource.DeleteReq
842842

843843
traceEntry(ctx, "Resource.Delete")
844844

845-
conn := r.provider.CloudControlAPIClient(ctx)
845+
conn := r.cloudControlClient(ctx)
846846

847847
id, err := r.getId(ctx, &request.State)
848848

@@ -891,15 +891,23 @@ func (r *genericResource) ConfigValidators(context.Context) []resource.ConfigVal
891891
}
892892

893893
// regionID returns the region string to pass to Cloud Control API calls.
894-
// Global services (e.g. IAM Group) must receive an empty string to avoid
895-
// "RegionNotSupport" errors from the regional Cloud Control endpoint.
894+
// Global services return an empty string since they use a global endpoint.
896895
func (r *genericResource) regionID(ctx context.Context) string {
897896
if r.globalService {
898897
return ""
899898
}
900899
return r.provider.Region(ctx)
901900
}
902901

902+
// cloudControlClient returns the appropriate CloudControl API client for this resource.
903+
// Global services use a client pointed at the global endpoint to avoid "RegionNotSupport" errors.
904+
func (r *genericResource) cloudControlClient(ctx context.Context) *cloudcontrol.CloudControl {
905+
if r.globalService {
906+
return r.provider.GlobalCloudControlAPIClient(ctx)
907+
}
908+
return r.cloudControlClient(ctx)
909+
}
910+
903911
// describe returns the live state of the specified resource.
904912
func (r *genericResource) describe(ctx context.Context, client *cloudcontrol.CloudControl, id string) (*cloudcontrol.GetResourceOutput, error) {
905913
return tfcloudcontrol.FindResourceByTypeNameAndID(ctx, client, r.regionID(ctx), r.ccTypeName, id)
@@ -951,7 +959,7 @@ func (r *genericResource) populateUnknownValues(ctx context.Context, id string,
951959
return nil
952960
}
953961

954-
description, err := r.describe(ctx, r.provider.CloudControlAPIClient(ctx), id)
962+
description, err := r.describe(ctx, r.cloudControlClient(ctx), id)
955963

956964
if tfresource.NotFound(err) {
957965
diags.Append(ResourceNotFoundAfterWriteDiag(err))

internal/provider/provider.go

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -43,15 +43,22 @@ const (
4343
// providerData is returned from the provider's Configure method and
4444
// is passed to each resource and data source in their Configure methods.
4545
type providerData struct {
46-
ccAPIClient *cloudcontrol.CloudControl
47-
logger baselogging.Logger
48-
region string
46+
ccAPIClient *cloudcontrol.CloudControl
47+
globalCCAPIClient *cloudcontrol.CloudControl // client for global (non-regional) services
48+
logger baselogging.Logger
49+
region string
4950
}
5051

5152
func (p *providerData) CloudControlAPIClient(_ context.Context) *cloudcontrol.CloudControl {
5253
return p.ccAPIClient
5354
}
5455

56+
// GlobalCloudControlAPIClient returns a CloudControl client configured with the
57+
// global (non-regional) endpoint for services like IAM that do not support regional routing.
58+
func (p *providerData) GlobalCloudControlAPIClient(_ context.Context) *cloudcontrol.CloudControl {
59+
return p.globalCCAPIClient
60+
}
61+
5562
func (p *providerData) Region(_ context.Context) string {
5663
return p.region
5764
}
@@ -433,10 +440,21 @@ func newProviderData(ctx context.Context, c *configModel) (*providerData, diag.D
433440
return nil, diags
434441
}
435442

443+
// Create a second session with a global (non-regional) endpoint for services like IAM.
444+
globalConfig := config.Copy()
445+
globalConfig.WithEndpoint("cloudcontrol.volcengineapi.com")
446+
globalSess, err := session.NewSession(globalConfig)
447+
if err != nil {
448+
diags.AddError(err.Error(), err.Error())
449+
return nil, diags
450+
}
451+
globalCloudcontrolClient := cloudcontrol.New(globalSess)
452+
436453
providerData := &providerData{
437-
ccAPIClient: cloudcontrolClient,
438-
logger: logger,
439-
region: c.Region.String(),
454+
ccAPIClient: cloudcontrolClient,
455+
globalCCAPIClient: globalCloudcontrolClient,
456+
logger: logger,
457+
region: c.Region.String(),
440458
}
441459

442460
return providerData, diags

internal/service/cloudcontrol/provider.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@ import (
1212
type Provider interface {
1313
CloudControlAPIClient(context.Context) *cloudcontrol.CloudControl
1414

15+
// GlobalCloudControlAPIClient returns a client for global (non-regional) services.
16+
GlobalCloudControlAPIClient(context.Context) *cloudcontrol.CloudControl
17+
1518
Region(ctx context.Context) string
1619

1720
RegisterLogger(ctx context.Context) context.Context

0 commit comments

Comments
 (0)