github.com/juju/juju@v0.0.0-20240430160146-1752b71fcf00/provider/azure/environprovider_test.go (about)

     1  // Copyright 2015 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package azure_test
     5  
     6  import (
     7  	stdcontext "context"
     8  	"net/http"
     9  	"time"
    10  
    11  	"github.com/Azure/azure-sdk-for-go/sdk/azcore"
    12  	"github.com/Azure/azure-sdk-for-go/sdk/azcore/policy"
    13  	"github.com/juju/clock/testclock"
    14  	jc "github.com/juju/testing/checkers"
    15  	gc "gopkg.in/check.v1"
    16  
    17  	"github.com/juju/juju/cloud"
    18  	"github.com/juju/juju/environs"
    19  	environscloudspec "github.com/juju/juju/environs/cloudspec"
    20  	"github.com/juju/juju/provider/azure"
    21  	"github.com/juju/juju/provider/azure/internal/azureauth"
    22  	"github.com/juju/juju/provider/azure/internal/azurecli"
    23  	"github.com/juju/juju/provider/azure/internal/azuretesting"
    24  	"github.com/juju/juju/testing"
    25  )
    26  
    27  type environProviderSuite struct {
    28  	testing.BaseSuite
    29  	provider environs.EnvironProvider
    30  	spec     environscloudspec.CloudSpec
    31  	requests []*http.Request
    32  	sender   azuretesting.Senders
    33  }
    34  
    35  var _ = gc.Suite(&environProviderSuite{})
    36  
    37  func (s *environProviderSuite) SetUpTest(c *gc.C) {
    38  	s.BaseSuite.SetUpTest(c)
    39  	s.provider = newProvider(c, azure.ProviderConfig{
    40  		Sender:           &s.sender,
    41  		RequestInspector: &azuretesting.RequestRecorderPolicy{Requests: &s.requests},
    42  		CreateTokenCredential: func(appId, appPassword, tenantID string, opts azcore.ClientOptions) (azcore.TokenCredential, error) {
    43  			return &azuretesting.FakeCredential{}, nil
    44  		},
    45  	})
    46  	s.spec = environscloudspec.CloudSpec{
    47  		Type:            "azure",
    48  		Name:            "azure",
    49  		Region:          "westus",
    50  		StorageEndpoint: "https://storage.azurestack.local",
    51  		Credential:      fakeServicePrincipalCredential(),
    52  	}
    53  	s.sender = nil
    54  }
    55  
    56  func fakeServicePrincipalCredential() *cloud.Credential {
    57  	cred := cloud.NewCredential(
    58  		"service-principal-secret",
    59  		map[string]string{
    60  			"application-id":          fakeApplicationId,
    61  			"subscription-id":         fakeSubscriptionId,
    62  			"managed-subscription-id": fakeManagedSubscriptionId,
    63  			"application-password":    "opensezme",
    64  		},
    65  	)
    66  	return &cred
    67  }
    68  
    69  func (s *environProviderSuite) TestPrepareConfig(c *gc.C) {
    70  	cfg := makeTestModelConfig(c)
    71  	cfg, err := s.provider.PrepareConfig(environs.PrepareConfigParams{
    72  		Cloud:  s.spec,
    73  		Config: cfg,
    74  	})
    75  	c.Assert(err, jc.ErrorIsNil)
    76  	c.Check(cfg, gc.NotNil)
    77  }
    78  
    79  func (s *environProviderSuite) TestOpen(c *gc.C) {
    80  	s.sender = azuretesting.Senders{
    81  		discoverAuthSender(),
    82  		makeResourceGroupNotFoundSender(".*/resourcegroups/juju-testmodel-model-deadbeef-.*"),
    83  		makeSender(".*/resourcegroups/juju-testmodel-.*", makeResourceGroupResult()),
    84  	}
    85  	env, err := environs.Open(stdcontext.TODO(), s.provider, environs.OpenParams{
    86  		Cloud:  s.spec,
    87  		Config: makeTestModelConfig(c),
    88  	})
    89  	c.Assert(err, jc.ErrorIsNil)
    90  	c.Assert(env, gc.NotNil)
    91  }
    92  
    93  func (s *environProviderSuite) TestOpenMissingCredential(c *gc.C) {
    94  	s.spec.Credential = nil
    95  	s.testOpenError(c, s.spec, `validating cloud spec: missing credential not valid`)
    96  }
    97  
    98  func (s *environProviderSuite) TestOpenUnsupportedCredential(c *gc.C) {
    99  	credential := cloud.NewCredential(cloud.OAuth1AuthType, map[string]string{})
   100  	s.spec.Credential = &credential
   101  	s.testOpenError(c, s.spec, `validating cloud spec: "oauth1" auth-type not supported`)
   102  }
   103  
   104  func (s *environProviderSuite) testOpenError(c *gc.C, spec environscloudspec.CloudSpec, expect string) {
   105  	s.sender = azuretesting.Senders{
   106  		makeResourceGroupNotFoundSender(".*/resourcegroups/juju-testmodel-model-deadbeef-.*"),
   107  		makeSender(".*/resourcegroups/juju-testmodel-.*", makeResourceGroupResult()),
   108  	}
   109  	_, err := environs.Open(stdcontext.TODO(), s.provider, environs.OpenParams{
   110  		Cloud:  spec,
   111  		Config: makeTestModelConfig(c),
   112  	})
   113  	c.Assert(err, gc.ErrorMatches, expect)
   114  }
   115  
   116  func newProvider(c *gc.C, config azure.ProviderConfig) environs.EnvironProvider {
   117  	if config.RetryClock == nil {
   118  		config.RetryClock = testclock.NewClock(time.Time{})
   119  	}
   120  	if config.ServicePrincipalCreator == nil {
   121  		config.ServicePrincipalCreator = &azureauth.ServicePrincipalCreator{}
   122  	}
   123  	if config.AzureCLI == nil {
   124  		config.AzureCLI = azurecli.AzureCLI{}
   125  	}
   126  	config.GenerateSSHKey = func(string) (string, string, error) {
   127  		return "private", "public", nil
   128  	}
   129  	config.Retry = policy.RetryOptions{
   130  		RetryDelay: 0,
   131  		MaxRetries: -1,
   132  	}
   133  	environProvider, err := azure.NewProvider(config)
   134  	c.Assert(err, jc.ErrorIsNil)
   135  	return environProvider
   136  }