Skip to content

Commit

Permalink
Merge pull request #56 from XenitAB/resource-provider-registration
Browse files Browse the repository at this point in the history
Make sure Microsoft.Storage is registered before checking name availability
  • Loading branch information
simongottschlag authored Oct 14, 2022
2 parents 22155a2 + bae8ed2 commit c8d4c2d
Showing 1 changed file with 73 additions and 0 deletions.
73 changes: 73 additions & 0 deletions docker/go-tf-prepare/pkg/azure/azure.go
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,11 @@ func CreateStorageAccount(ctx context.Context, cred azcore.TokenCredential, conf
}

if err != nil && strings.Contains(err.Error(), "ResourceNotFound") {
err := registerResourceProviderIfNeeded(ctx, cred, config, "Microsoft.Storage")
if err != nil {
return err
}

res, err := client.CheckNameAvailability(
ctx,
armstorage.AccountCheckNameAvailabilityParameters{
Expand Down Expand Up @@ -142,6 +147,74 @@ func CreateStorageAccount(ctx context.Context, cred azcore.TokenCredential, conf
return err
}

func registerResourceProviderIfNeeded(ctx context.Context, cred azcore.TokenCredential, config azureConfig, resourceProviderNamespace string) error {
subscriptionID := config.SubscriptionID
log, err := logr.FromContext(ctx)
if err != nil {
return err
}

client, err := armresources.NewProvidersClient(subscriptionID, cred, &arm.ClientOptions{})
if err != nil {
log.Error(err, "armresources.NewProvidersClient")
return err
}

res, err := client.Get(ctx, resourceProviderNamespace, &armresources.ProvidersClientGetOptions{})
if err != nil {
log.Error(err, "client.Get")
return err
}

if *res.RegistrationState == "Registered" {
log.Info("Azure Resource Provider already registered", "resourceProviderNamespace", resourceProviderNamespace, "registrationState", *res.RegistrationState)
return nil
}

regRes, err := client.Register(ctx, resourceProviderNamespace, &armresources.ProvidersClientRegisterOptions{})
if err != nil {
log.Error(err, "client.Register")
return err
}

log.Info("Registering Azure Resource Provider", "resourceProviderNamespace", resourceProviderNamespace, "registrationState", *regRes.RegistrationState)

if *regRes.RegistrationState == "Registered" {
log.Info("Azure Resource Provider registered", "resourceProviderNamespace", resourceProviderNamespace, "registrationState", *regRes.RegistrationState)
return nil
}

currentRegistrationState := ""
for i := 1; i < 10; i++ {
res, err := client.Get(ctx, resourceProviderNamespace, &armresources.ProvidersClientGetOptions{})
if err != nil {
log.Error(err, "client.Get")
return err
}

currentRegistrationState = *res.RegistrationState
if currentRegistrationState == "Registered" {
log.Info("Azure Resource Provider registered", "resourceProviderNamespace", resourceProviderNamespace, "registrationState", currentRegistrationState)
return nil
}

if currentRegistrationState != "Registering" {
err := fmt.Errorf("unknown registration state")
log.Error(err, "Azure Resource Provider in unknown registration state", "resourceProviderNamespace", resourceProviderNamespace, "registrationState", currentRegistrationState)
return err
}

log.Info("Registering Azure Resource Provider", "resourceProviderNamespace", resourceProviderNamespace, "registrationState", currentRegistrationState, "retryCounter", i)

time.Sleep(time.Duration(i*5) * time.Second)
}

err = fmt.Errorf("registration not completed within the specified time period")
log.Error(err, "Unable to register Azure Resource Provider", resourceProviderNamespace, "registrationState", currentRegistrationState)

return err
}

// CreateStorageAccountContainer creates Storage Account Container (if it doesn't exist) or returns error
func CreateStorageAccountContainer(ctx context.Context, cred azcore.TokenCredential, config azureConfig) error {
resourceGroupName := config.ResourceGroupName
Expand Down

0 comments on commit c8d4c2d

Please sign in to comment.