github.com/kyma-project/kyma-environment-broker@v0.0.1/common/hyperscaler/azure/provider.go (about) 1 package azure 2 3 import ( 4 "fmt" 5 6 "github.com/Azure/azure-sdk-for-go/services/eventhub/mgmt/2017-04-01/eventhub" 7 "github.com/Azure/azure-sdk-for-go/services/resources/mgmt/2019-05-01/resources" 8 "github.com/Azure/go-autorest/autorest" 9 "github.com/Azure/go-autorest/autorest/adal" 10 "github.com/Azure/go-autorest/autorest/azure" 11 "github.com/sirupsen/logrus" 12 ) 13 14 type HyperscalerProvider interface { 15 GetClient(config *Config, logger logrus.FieldLogger) (Interface, error) 16 } 17 18 var _ HyperscalerProvider = (*azureProvider)(nil) 19 20 type azureProvider struct{} 21 22 func NewAzureProvider() HyperscalerProvider { 23 return &azureProvider{} 24 } 25 26 // GetClient gets a client for interacting with Azure 27 func (ac *azureProvider) GetClient(config *Config, logger logrus.FieldLogger) (Interface, error) { 28 29 environment, err := config.Environment() 30 if err != nil { 31 return nil, err 32 } 33 34 authorizer, err := ac.getResourceManagementAuthorizer(config, environment) 35 if err != nil { 36 return nil, fmt.Errorf("while initializing authorizer: %w", err) 37 } 38 39 // create namespace client 40 nsClient, err := ac.getNamespaceClient(config, authorizer) 41 if err != nil { 42 return nil, fmt.Errorf("while creating namespace client: %w", err) 43 } 44 45 // create resource group client 46 resourceGroupClient, err := ac.getGroupsClient(config, authorizer) 47 if err != nil { 48 return nil, fmt.Errorf("while creating resource group client: %w", err) 49 } 50 51 // create azure client 52 return NewAzureClient(nsClient, resourceGroupClient, logger), nil 53 } 54 55 // getGroupsClient gets a client for handling of Azure Namespaces 56 func (ac *azureProvider) getNamespaceClient(config *Config, authorizer autorest.Authorizer) (eventhub.NamespacesClient, error) { 57 nsClient := eventhub.NewNamespacesClient(config.subscriptionID) 58 nsClient.Authorizer = authorizer 59 60 if err := nsClient.AddToUserAgent(config.userAgent); err != nil { 61 return eventhub.NamespacesClient{}, fmt.Errorf("while adding user agent [%s]: %w", config.userAgent, err) 62 } 63 return nsClient, nil 64 } 65 66 // getGroupsClient gets a client for handling of Azure ResourceGroups 67 func (ac *azureProvider) getGroupsClient(config *Config, authorizer autorest.Authorizer) (resources.GroupsClient, error) { 68 client := resources.NewGroupsClient(config.subscriptionID) 69 client.Authorizer = authorizer 70 71 if err := client.AddToUserAgent(config.userAgent); err != nil { 72 return resources.GroupsClient{}, fmt.Errorf("while adding user agent [%s]: %w", config.userAgent, err) 73 } 74 75 return client, nil 76 } 77 78 func (ac *azureProvider) getResourceManagementAuthorizer(config *Config, environment *azure.Environment) (autorest.Authorizer, error) { 79 armAuthorizer, err := ac.getAuthorizerForResource(config, environment) 80 if err != nil { 81 return nil, fmt.Errorf("while creating resource authorizer: %w", err) 82 } 83 84 return armAuthorizer, err 85 } 86 87 func (ac *azureProvider) getAuthorizerForResource(config *Config, environment *azure.Environment) (autorest.Authorizer, error) { 88 89 oauthConfig, err := adal.NewOAuthConfig(environment.ActiveDirectoryEndpoint, config.tenantID) 90 if err != nil { 91 return nil, fmt.Errorf("while creating OAuth config: %w", err) 92 } 93 94 token, err := adal.NewServicePrincipalToken(*oauthConfig, config.clientID, config.clientSecret, environment.ResourceManagerEndpoint) 95 if err != nil { 96 return nil, fmt.Errorf("while creating service principal token: %w", err) 97 } 98 return autorest.NewBearerAuthorizer(token), nil 99 }