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  }