Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 18 additions & 1 deletion backend/cmd/root.go
Original file line number Diff line number Diff line change
Expand Up @@ -253,7 +253,12 @@ func (f *BackendRootCmdFlags) ToBackendOptions(ctx context.Context, cmd *cobra.C
return nil, utils.TrackError(fmt.Errorf("failed to create Azure configuration: %w", err))
}

fpaClientBuilder, err := app.NewFirstPartyApplicationClientBuilder(ctx, f.AzureFirstPartyApplicationCertificateBundlePath, f.AzureFirstPartyApplicationClientID, azureConfig)
fpaTokenCredRetriever, err := app.NewFirstPartyApplicationTokenCredentialRetriever(ctx, f.AzureFirstPartyApplicationCertificateBundlePath, f.AzureFirstPartyApplicationClientID, azureConfig)
if err != nil {
return nil, utils.TrackError(fmt.Errorf("failed to create FPA token credential retriever: %w", err))
}

fpaClientBuilder, err := app.NewFirstPartyApplicationClientBuilder(fpaTokenCredRetriever, azureConfig)
if err != nil {
return nil, utils.TrackError(fmt.Errorf("failed to create FPA client builder: %w", err))
}
Expand All @@ -263,6 +268,16 @@ func (f *BackendRootCmdFlags) ToBackendOptions(ctx context.Context, cmd *cobra.C
return nil, utils.TrackError(fmt.Errorf("failed to create backend identity azure clients: %w", err))
}

fpaMIDataplaneClientBuilder, err := app.NewFirstPartyApplicationManagedIdentitiesDataplaneClientBuilder(
fpaTokenCredRetriever,
f.InsecureAzureManagedIdentityMockCertificateBundlePath, f.InsecureAzureManagedIdentityMockClientID, f.InsecureAzureManagedIdentityMockServicePrincipalID, f.InsecureAzureManagedIdentityMockTenantID,
azureConfig,
)
if err != nil {
return nil, utils.TrackError(fmt.Errorf("error getting FPA MI dataplane client builder: %w", err))
}
smiClientBuilder := app.NewServiceManagedIdentityClientBuilder(fpaMIDataplaneClientBuilder, azureConfig)

cosmosDBClient, err := app.NewCosmosDBClient(
ctx, f.AzureCosmosDBURL, f.AzureCosmosDBName,
*azureConfig.CloudEnvironment.AZCoreClientOptions(),
Expand Down Expand Up @@ -290,6 +305,8 @@ func (f *BackendRootCmdFlags) ToBackendOptions(ctx context.Context, cmd *cobra.C
FPAClientBuilder: fpaClientBuilder,
BackendIdentityAzureClients: backendIdentityAzureClients,
ExitOnPanic: f.ExitOnPanic,
FPAMIDataplaneClientBuilder: fpaMIDataplaneClientBuilder,
SMIClientBuilder: smiClientBuilder,
}

return backendOptions, nil
Expand Down
9 changes: 9 additions & 0 deletions backend/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,11 @@ require (
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.21.0
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.13.1
github.com/Azure/azure-sdk-for-go/sdk/data/azcosmos v1.4.1
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/msi/armmsi v1.3.0
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.2.0
github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.6.4
github.com/Azure/azure-sdk-for-go/sdk/tracing/azotel v0.4.0
github.com/Azure/msi-dataplane v0.4.3
github.com/blang/semver/v4 v4.0.0
github.com/go-logr/logr v1.4.3
github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8
Expand Down Expand Up @@ -42,8 +44,13 @@ require (
dario.cat/mergo v1.0.1 // indirect
github.com/Azure/azure-sdk-for-go v68.0.0+incompatible // indirect
github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.2 // indirect
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal/v3 v3.1.1 // indirect
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/managementgroups/armmanagementgroups v1.2.0 // indirect
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources/v3 v3.0.1 // indirect
github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azsecrets v1.4.0 // indirect
github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v1.2.0 // indirect
github.com/AzureAD/microsoft-authentication-library-for-go v1.6.0 // indirect
github.com/antlr4-go/antlr/v4 v4.13.1 // indirect
github.com/aymerick/douceur v0.2.0 // indirect
github.com/beorn7/perks v1.0.1 // indirect
github.com/bwmarrin/snowflake v0.3.0 // indirect
Expand All @@ -56,6 +63,7 @@ require (
github.com/evanphx/json-patch v5.9.11+incompatible // indirect
github.com/evanphx/json-patch/v5 v5.9.11 // indirect
github.com/felixge/httpsnoop v1.0.4 // indirect
github.com/fsnotify/fsnotify v1.9.0 // indirect
github.com/fxamacker/cbor/v2 v2.9.0 // indirect
github.com/getsentry/sentry-go v0.20.0 // indirect
github.com/go-errors/errors v1.5.1 // indirect
Expand Down Expand Up @@ -119,6 +127,7 @@ require (
go.yaml.in/yaml/v2 v2.4.3 // indirect
go.yaml.in/yaml/v3 v3.0.4 // indirect
golang.org/x/crypto v0.47.0 // indirect
golang.org/x/exp v0.0.0-20250911091902-df9299821621 // indirect
golang.org/x/net v0.49.0 // indirect
golang.org/x/oauth2 v0.34.0 // indirect
golang.org/x/sys v0.40.0 // indirect
Expand Down
20 changes: 20 additions & 0 deletions backend/go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -16,22 +16,38 @@ github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.2 h1:9iefClla7iYpfYWdzPCRDo
github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.2/go.mod h1:XtLgD3ZD34DAaVIIAyG3objl5DynM3CQ/vMcbBNJZGI=
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal/v2 v2.0.0 h1:PTFGRSlMKCQelWwxUyYVEUqseBJVemLyqWJjvMyt0do=
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal/v2 v2.0.0/go.mod h1:LRr2FzBTQlONPPa5HREE5+RjSCTXl7BwOvYOaWTqCaI=
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal/v3 v3.1.1 h1:1kpY4qe+BGAH2ykv4baVSqyx+AY5VjXeJ15SldlU6hs=
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal/v3 v3.1.1/go.mod h1:nT6cWpWdUt+g81yuKmjeYPUtI73Ak3yQIT4PVVsCEEQ=
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/managementgroups/armmanagementgroups v1.2.0 h1:akP6VpxJGgQRpDR1P462piz/8OhYLRCreDj48AyNabc=
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/managementgroups/armmanagementgroups v1.2.0/go.mod h1:8wzvopPfyZYPaQUoKW87Zfdul7jmJMDfp/k7YY3oJyA=
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/msi/armmsi v1.3.0 h1:L7G3dExHBgUxsO3qpTGhk/P2dgnYyW48yn7AO33Tbek=
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/msi/armmsi v1.3.0/go.mod h1:Ms6gYEy0+A2knfKrwdatsggTXYA2+ICKug8w7STorFw=
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armdeployments v0.2.0 h1:bYq3jfB2x36hslKMHyge3+esWzROtJNk/4dCjsKlrl4=
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armdeployments v0.2.0/go.mod h1:fewgRjNVE84QVVh798sIMFb7gPXPp7NmnekGnboSnXk=
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.2.0 h1:Dd+RhdJn0OTtVGaeDLZpcumkIVCtA/3/Fo42+eoYvVM=
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.2.0/go.mod h1:5kakwfW5CjC9KK+Q4wjXAg+ShuIm2mBMua0ZFj2C8PE=
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources/v3 v3.0.1 h1:guyQA4b8XB2sbJZXzUnOF9mn0WDBv/ZT7me9wTipKtE=
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources/v3 v3.0.1/go.mod h1:8h8yhzh9o+0HeSIhUxYny+rEQajScrfIpNktvgYG3Q8=
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.8.1 h1:/Zt+cDPnpC3OVDm/JKLOs7M2DKmLRIIp3XIx9pHHiig=
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.8.1/go.mod h1:Ng3urmn6dYe8gnbCMoHHVl5APYz2txho3koEkV2o2HA=
github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azsecrets v1.4.0 h1:/g8S6wk65vfC6m3FIxJ+i5QDyN9JWwXI8Hb0Img10hU=
github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azsecrets v1.4.0/go.mod h1:gpl+q95AzZlKVI3xSoseF9QPrypk0hQqBiJYeB/cR/I=
github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v1.2.0 h1:nCYfgcSyHZXJI8J0IWE5MsCGlb2xp9fJiXyxWgmOFg4=
github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v1.2.0/go.mod h1:ucUjca2JtSZboY8IoUqyQyuuXvwbMBVwFOm0vdQPNhA=
github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.6.4 h1:jWQK1GI+LeGGUKBADtcH2rRqPxYB1Ljwms5gFA2LqrM=
github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.6.4/go.mod h1:8mwH4klAm9DUgR2EEHyEEAQlRDvLPyg5fQry3y+cDew=
github.com/Azure/azure-sdk-for-go/sdk/tracing/azotel v0.4.0 h1:RTTsXUJWn0jumeX62Mb153wYXykqnrzYBYDeHp0kiuk=
github.com/Azure/azure-sdk-for-go/sdk/tracing/azotel v0.4.0/go.mod h1:k4MMjrPHIEK+umaMGk1GNLgjEybJZ9mHSRDZ+sDFv3Y=
github.com/Azure/msi-dataplane v0.4.3 h1:dWPWzY4b54tLIR9T1Q014Xxd/1DxOsMIp6EjRFAJlQY=
github.com/Azure/msi-dataplane v0.4.3/go.mod h1:yAfxdJyvcnvSDfSyOFV9qm4fReEQDl+nZLGeH2ZWSmw=
github.com/AzureAD/microsoft-authentication-extensions-for-go/cache v0.1.1 h1:WJTmL004Abzc5wDB5VtZG2PJk5ndYDgVacGqfirKxjM=
github.com/AzureAD/microsoft-authentication-extensions-for-go/cache v0.1.1/go.mod h1:tCcJZ0uHAmvjsVYzEFivsRTN00oz5BEsRgQHu5JZ9WE=
github.com/AzureAD/microsoft-authentication-library-for-go v1.6.0 h1:XRzhVemXdgvJqCH0sFfrBUTnUJSBrBf7++ypk+twtRs=
github.com/AzureAD/microsoft-authentication-library-for-go v1.6.0/go.mod h1:HKpQxkWaGLJ+D/5H8QRpyQXA1eKjxkFlOMwck5+33Jk=
github.com/Masterminds/semver/v3 v3.4.0 h1:Zog+i5UMtVoCU8oKka5P7i9q9HgrJeGzI9SA1Xbatp0=
github.com/Masterminds/semver/v3 v3.4.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM=
github.com/antlr4-go/antlr/v4 v4.13.1 h1:SqQKkuVZ+zWkMMNkjy5FZe5mr5WURWnlpmOuzYWrPrQ=
github.com/antlr4-go/antlr/v4 v4.13.1/go.mod h1:GKmUxMtwp6ZgGwZSva4eWPC5mS6vUAmOABFgjdkM7Nw=
github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk=
github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4=
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
Expand Down Expand Up @@ -61,6 +77,8 @@ github.com/evanphx/json-patch/v5 v5.9.11 h1:/8HVnzMq13/3x9TPvjG08wUGqBTmZBsCWzjT
github.com/evanphx/json-patch/v5 v5.9.11/go.mod h1:3j+LviiESTElxA4p3EMKAB9HXj3/XEtnUf6OZxqIQTM=
github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg=
github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k=
github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0=
github.com/fxamacker/cbor/v2 v2.9.0 h1:NpKPmjDBgUfBms6tr6JZkTHtfFGcMKsw3eGcmD/sapM=
github.com/fxamacker/cbor/v2 v2.9.0/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ=
github.com/getsentry/sentry-go v0.20.0 h1:bwXW98iMRIWxn+4FgPW7vMrjmbym6HblXALmhjHmQaQ=
Expand Down Expand Up @@ -292,6 +310,8 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.47.0 h1:V6e3FRj+n4dbpw86FJ8Fv7XVOql7TEwpHapKoMJ/GO8=
golang.org/x/crypto v0.47.0/go.mod h1:ff3Y9VzzKbwSSEzWqJsJVBnWmRwRSHt/6Op5n9bQc4A=
golang.org/x/exp v0.0.0-20250911091902-df9299821621 h1:2id6c1/gto0kaHYyrixvknJ8tUK/Qs5IsmBtrc+FtgU=
golang.org/x/exp v0.0.0-20250911091902-df9299821621/go.mod h1:TwQYMMnGpvZyc+JpB/UAuTNIsVJifOlSkrZkhcvpVUk=
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.32.0 h1:9F4d3PHLljb6x//jOyokMv3eX+YDeepZSEo3mFJy93c=
Expand Down
10 changes: 9 additions & 1 deletion backend/pkg/app/backend.go
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,8 @@ type BackendOptions struct {
FPAClientBuilder azureclient.FirstPartyApplicationClientBuilder
BackendIdentityAzureClients *azureclient.BackendIdentityAzureClients
ExitOnPanic bool
FPAMIDataplaneClientBuilder azureclient.FPAMIDataplaneClientBuilder

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We define FPAMIDataplaneClientBuilder here already although not yet used. The reason is that in the near future we will start leveraging it directly too. For example, we have #4192 where we would start using it. It is also going to be used by functionalities that require retrieving MSI-based Managed Identities credentials as well as information about them.

SMIClientBuilder azureclient.ServiceManagedIdentityClientBuilder
}

func (o *BackendOptions) RunBackend(ctx context.Context) error {
Expand Down Expand Up @@ -371,13 +373,18 @@ func (b *Backend) runBackendControllersUnderLeaderElection(ctx context.Context,
b.options.CosmosDBClient,
backendInformers,
)

azureClusterResourceGroupExistenceValidationController := validationcontrollers.NewClusterValidationController(
validations.NewAzureClusterResourceGroupExistenceValidation(b.options.FPAClientBuilder),
activeOperationLister,
b.options.CosmosDBClient,
backendInformers,
)
azureClusterManagedIdentitiesExistenceValidationController := validationcontrollers.NewClusterValidationController(
validations.NewAzureClusterManagedIdentitiesExistenceValidation(b.options.SMIClientBuilder),
activeOperationLister,
b.options.CosmosDBClient,
backendInformers,
)

nodePoolVersionController := upgradecontrollers.NewNodePoolVersionController(
b.options.CosmosDBClient,
Expand Down Expand Up @@ -420,6 +427,7 @@ func (b *Backend) runBackendControllersUnderLeaderElection(ctx context.Context,
go identityMigrationController.Run(ctx, 20)
go azureRPRegistrationValidationController.Run(ctx, 20)
go azureClusterResourceGroupExistenceValidationController.Run(ctx, 20)
go azureClusterManagedIdentitiesExistenceValidationController.Run(ctx, 20)
go nodePoolVersionController.Run(ctx, 20)
},
OnStoppedLeading: func() {
Expand Down
63 changes: 55 additions & 8 deletions backend/pkg/app/fpa_wiring.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,18 +16,20 @@ package app

import (
"context"
"encoding/base64"
"fmt"
"os"
"time"

azureclient "github.com/Azure/ARO-HCP/backend/pkg/azure/client"
azureconfig "github.com/Azure/ARO-HCP/backend/pkg/azure/config"
"github.com/Azure/ARO-HCP/internal/fpa"
)

func NewFirstPartyApplicationClientBuilder(
ctx context.Context, fpaCertBundlePath string, fpaClientID string,
azureConfig *azureconfig.AzureConfig,
) (azureclient.FirstPartyApplicationClientBuilder, error) {
func NewFirstPartyApplicationTokenCredentialRetriever(
ctx context.Context, fpaCertBundlePath string,
fpaClientID string, azureConfig *azureconfig.AzureConfig,
) (fpa.FirstPartyApplicationTokenCredentialRetriever, error) {
if len(fpaCertBundlePath) == 0 || len(fpaClientID) == 0 {
return nil, nil
}
Expand All @@ -42,10 +44,6 @@ func NewFirstPartyApplicationClientBuilder(
return nil, fmt.Errorf("failed to create certificate reader: %w", err)
}

// We create the FPA token credential retriever here. Then we pass it to the cluster inflights controller,
// which then is used to instantiate a validation that uses the FPA token credential retriever. And then the
// validations uses the retriever to retrieve a token credential based on the information associated to the
// cluster(the tenant of the cluster, the subscription id, ...)
fpaTokenCredRetriever, err := fpa.NewFirstPartyApplicationTokenCredentialRetriever(
fpaClientID,
certReader,
Expand All @@ -55,9 +53,58 @@ func NewFirstPartyApplicationClientBuilder(
return nil, fmt.Errorf("failed to create FPA token credential retriever: %w", err)
}

return fpaTokenCredRetriever, nil
}

func NewFirstPartyApplicationClientBuilder(fpaTokenCredRetriever fpa.FirstPartyApplicationTokenCredentialRetriever, azureConfig *azureconfig.AzureConfig) (azureclient.FirstPartyApplicationClientBuilder, error) {
fpaClientBuilder := azureclient.NewFirstPartyApplicationClientBuilder(
fpaTokenCredRetriever, azureConfig.CloudEnvironment.ARMClientOptions(),
)

return fpaClientBuilder, nil
}

func NewFirstPartyApplicationManagedIdentitiesDataplaneClientBuilder(
fpaTokenCredRetriever fpa.FirstPartyApplicationTokenCredentialRetriever,
azureMIMockCertBundlePath string, azureMIMockClientID string, azureMIMockPrincipalID string, azureMIMockTenantID string,
azureConfig *azureconfig.AzureConfig,
) (azureclient.FPAMIDataplaneClientBuilder, error) {
if len(azureMIMockCertBundlePath) > 0 && len(azureMIMockClientID) > 0 && len(azureMIMockPrincipalID) > 0 && len(azureMIMockTenantID) > 0 {
// TODO this can be improved at some point to support detecting when
// the cert bundle path content changes. We could use a file watcher similar
// to the one used in the fpa token credential retriever, and pass the retriever
// to the client builder.
bundle, err := os.ReadFile(azureMIMockCertBundlePath)
if err != nil {
return nil, fmt.Errorf("failed to read bundle file: %w", err)
}
bundleBase64Encoded := base64.StdEncoding.EncodeToString(bundle)
hardcodedIdentity := &azureclient.HardcodedIdentity{
ClientID: azureMIMockClientID,
ClientSecret: bundleBase64Encoded,
PrincipalID: azureMIMockPrincipalID,
TenantID: azureMIMockTenantID,
}
hardcodedIdentityFPAMIDataplaneClientBuilder := azureclient.NewHardcodedIdentityFPAMIDataplaneClientBuilder(
azureConfig.CloudEnvironment.CloudConfiguration(),
hardcodedIdentity,
)
return hardcodedIdentityFPAMIDataplaneClientBuilder, nil
}

fpaMIdataplaneClientBuilder := azureclient.NewFPAMIDataplaneClientBuilder(
azureConfig.AzureRuntimeConfig.ServiceTenantID,
fpaTokenCredRetriever,
azureConfig.AzureRuntimeConfig.ManagedIdentitiesDataPlaneAudienceResource,
azureConfig.CloudEnvironment.AZCoreClientOptions(),
)

return fpaMIdataplaneClientBuilder, nil
}

func NewServiceManagedIdentityClientBuilder(fpaMIdataplaneClientBuilder azureclient.FPAMIDataplaneClientBuilder, azureConfig *azureconfig.AzureConfig) azureclient.ServiceManagedIdentityClientBuilder {
return azureclient.NewServiceManagedIdentityClientBuilder(
fpaMIdataplaneClientBuilder,
azureConfig.CloudEnvironment.ARMClientOptions(),
)
}
9 changes: 9 additions & 0 deletions backend/pkg/azure/client/errors.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,3 +25,12 @@ func IsResourceGroupNotFoundErr(err error) bool {
var azErr *azcore.ResponseError
return errors.As(err, &azErr) && azErr.ErrorCode == "ResourceGroupNotFound"
}

// IsResourceNotFoundErr is used to determine if we are failing to find a resource within azure.
// *WARNING* Not all azure API operations return the `ResourceNotFound` error code when the resource
// is not found, and more specific error codes are returned for some of them e.g `RoleAssignmentNotFound`
// is returned when a role assignement is not found
func IsResourceNotFoundErr(err error) bool {
var azErr *azcore.ResponseError
return errors.As(err, &azErr) && azErr.ErrorCode == "ResourceNotFound"
}
Loading
Loading