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 }