Skip to content

Commit acd12a1

Browse files
committed
add custom poller for create
1 parent b06f002 commit acd12a1

File tree

6 files changed

+404
-31
lines changed

6 files changed

+404
-31
lines changed

internal/services/applications/application_flexible_federated_identity_credential_resource.go

Lines changed: 9 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,14 @@ import (
1414
"github.com/hashicorp/go-azure-sdk/microsoft-graph/applications/beta/federatedidentitycredential"
1515
"github.com/hashicorp/go-azure-sdk/microsoft-graph/common-types/beta"
1616
"github.com/hashicorp/go-azure-sdk/microsoft-graph/common-types/stable"
17+
"github.com/hashicorp/go-azure-sdk/sdk/client/pollers"
1718
"github.com/hashicorp/go-azure-sdk/sdk/nullable"
1819
"github.com/hashicorp/terraform-provider-azuread/internal/helpers/consistency"
1920
"github.com/hashicorp/terraform-provider-azuread/internal/helpers/tf"
2021
"github.com/hashicorp/terraform-provider-azuread/internal/helpers/tf/pluginsdk"
2122
"github.com/hashicorp/terraform-provider-azuread/internal/helpers/tf/validation"
2223
"github.com/hashicorp/terraform-provider-azuread/internal/sdk"
24+
"github.com/hashicorp/terraform-provider-azuread/internal/services/applications/custompollers"
2325
)
2426

2527
type flexibleFederatedIdentityCredentialResource struct{}
@@ -106,7 +108,7 @@ func (f flexibleFederatedIdentityCredentialResource) Create() sdk.ResourceFunc {
106108
Timeout: 15 * time.Minute,
107109
Func: func(ctx context.Context, metadata sdk.ResourceMetaData) error {
108110
client := metadata.Client.Applications.ApplicationClientBeta
109-
federatedIdentityCredentialClient := metadata.Client.Applications.ApplicationFlexibleFederatedIdentityCredential
111+
flexibleFederatedIdentityCredentialClient := metadata.Client.Applications.ApplicationFlexibleFederatedIdentityCredential
110112

111113
data := &flexibleFederatedIdentityCredentialModel{}
112114

@@ -143,7 +145,7 @@ func (f flexibleFederatedIdentityCredentialResource) Create() sdk.ResourceFunc {
143145
Name: data.DisplayName,
144146
}
145147

146-
federatedIdentityCredentialResp, err := federatedIdentityCredentialClient.CreateFederatedIdentityCredential(ctx, *applicationId, credential, federatedidentitycredential.DefaultCreateFederatedIdentityCredentialOperationOptions())
148+
federatedIdentityCredentialResp, err := flexibleFederatedIdentityCredentialClient.CreateFederatedIdentityCredential(ctx, *applicationId, credential, federatedidentitycredential.DefaultCreateFederatedIdentityCredentialOperationOptions())
147149
if err != nil {
148150
return fmt.Errorf("adding flexible federated identity credential for %s", applicationId)
149151
}
@@ -158,35 +160,11 @@ func (f flexibleFederatedIdentityCredentialResource) Create() sdk.ResourceFunc {
158160

159161
id := beta.NewApplicationIdFederatedIdentityCredentialID(applicationId.ApplicationId, *newCredential.Id)
160162

161-
// Wait for the credential to replicate
162-
timeout, _ := ctx.Deadline()
163-
polledForCredential, err := (&pluginsdk.StateChangeConf{ //nolint:staticcheck
164-
Pending: []string{"Waiting"},
165-
Target: []string{"Done"},
166-
Timeout: time.Until(timeout),
167-
MinTimeout: 1 * time.Second,
168-
ContinuousTargetOccurence: 5,
169-
Refresh: func() (interface{}, string, error) {
170-
resp, err := federatedIdentityCredentialClient.GetFederatedIdentityCredential(ctx, id, federatedidentitycredential.DefaultGetFederatedIdentityCredentialOperationOptions())
171-
if err != nil {
172-
if response.WasNotFound(resp.HttpResponse) {
173-
return nil, "Waiting", nil
174-
}
175-
return nil, "Error", err
176-
}
177-
credential := resp.Model
178-
if credential == nil {
179-
return nil, "Waiting", nil
180-
}
181-
182-
return credential, "Done", nil
183-
},
184-
}).WaitForStateContext(ctx)
185-
186-
if err != nil {
187-
return fmt.Errorf("waiting for %s: %+v", id, err)
188-
} else if polledForCredential == nil {
189-
return fmt.Errorf("waiting for flexible federated identity credential %s: flexible federated identity credential not found in application manifest", id)
163+
pollerType := custompollers.NewApplicationFlexibleFederatedCredentialCreationPoller(flexibleFederatedIdentityCredentialClient, id)
164+
poller := pollers.NewPoller(pollerType, 10*time.Second, pollers.DefaultNumberOfDroppedConnectionsToAllow)
165+
// Wait for the credential to replicate - TODO This may need converting to a consistency.WaitForUpdate
166+
if err := poller.PollUntilDone(ctx); err != nil {
167+
return err
190168
}
191169

192170
metadata.SetID(id)
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package custompollers
2+
3+
import (
4+
"context"
5+
"time"
6+
7+
"github.com/hashicorp/go-azure-helpers/lang/response"
8+
flexibleFederatedIdentityCredential "github.com/hashicorp/go-azure-sdk/microsoft-graph/applications/beta/federatedidentitycredential"
9+
"github.com/hashicorp/go-azure-sdk/microsoft-graph/common-types/beta"
10+
"github.com/hashicorp/go-azure-sdk/sdk/client/pollers"
11+
)
12+
13+
var _ pollers.PollerType = &applicationFlexibleFederatedCredentialCreationPoller{}
14+
15+
type applicationFlexibleFederatedCredentialCreationPoller struct {
16+
client *flexibleFederatedIdentityCredential.FederatedIdentityCredentialClient
17+
id beta.ApplicationIdFederatedIdentityCredentialId
18+
}
19+
20+
func NewApplicationFlexibleFederatedCredentialCreationPoller(client *flexibleFederatedIdentityCredential.FederatedIdentityCredentialClient, id beta.ApplicationIdFederatedIdentityCredentialId) *applicationFlexibleFederatedCredentialCreationPoller {
21+
return &applicationFlexibleFederatedCredentialCreationPoller{
22+
client: client,
23+
id: id,
24+
}
25+
}
26+
27+
func (a applicationFlexibleFederatedCredentialCreationPoller) Poll(ctx context.Context) (*pollers.PollResult, error) {
28+
resp, err := a.client.GetFederatedIdentityCredential(ctx, a.id, flexibleFederatedIdentityCredential.DefaultGetFederatedIdentityCredentialOperationOptions())
29+
if err != nil {
30+
if response.WasNotFound(resp.HttpResponse) {
31+
return &pollers.PollResult{
32+
PollInterval: 1 * time.Second,
33+
Status: pollers.PollingStatusInProgress,
34+
}, nil
35+
}
36+
return &pollers.PollResult{
37+
Status: pollers.PollingStatusFailed,
38+
}, err
39+
}
40+
41+
credential := resp.Model
42+
if credential == nil {
43+
return &pollers.PollResult{
44+
PollInterval: 1 * time.Second,
45+
Status: pollers.PollingStatusInProgress,
46+
}, nil
47+
}
48+
49+
return &pollers.PollResult{
50+
PollInterval: 1 * time.Second,
51+
Status: pollers.PollingStatusSucceeded,
52+
}, nil
53+
}

vendor/github.com/hashicorp/go-azure-sdk/sdk/client/pollers/README.md

Lines changed: 7 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

vendor/github.com/hashicorp/go-azure-sdk/sdk/client/pollers/interface.go

Lines changed: 112 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)