github.com/mwhudson/juju@v0.0.0-20160512215208-90ff01f3497f/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 "bytes" 8 "fmt" 9 "io/ioutil" 10 "net/http" 11 "time" 12 13 "github.com/Azure/azure-sdk-for-go/Godeps/_workspace/src/github.com/Azure/go-autorest/autorest" 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 "github.com/juju/juju/provider/azure" 20 "github.com/juju/juju/provider/azure/internal/azuretesting" 21 "github.com/juju/juju/storage" 22 "github.com/juju/juju/testing" 23 ) 24 25 type environProviderSuite struct { 26 testing.BaseSuite 27 provider environs.EnvironProvider 28 requests []*http.Request 29 sender azuretesting.Senders 30 } 31 32 var _ = gc.Suite(&environProviderSuite{}) 33 34 func (s *environProviderSuite) SetUpTest(c *gc.C) { 35 s.BaseSuite.SetUpTest(c) 36 s.provider, _ = newProviders(c, azure.ProviderConfig{ 37 Sender: &s.sender, 38 RequestInspector: requestRecorder(&s.requests), 39 }) 40 s.sender = nil 41 } 42 43 func (s *environProviderSuite) TestBootstrapConfigWithInternalConfig(c *gc.C) { 44 s.testBootstrapConfigWithInternalConfig(c, "storage-account") 45 } 46 47 func (s *environProviderSuite) testBootstrapConfigWithInternalConfig(c *gc.C, key string) { 48 cfg := makeTestModelConfig(c, testing.Attrs{key: "whatever"}) 49 s.sender = azuretesting.Senders{tokenRefreshSender()} 50 _, err := s.provider.BootstrapConfig(environs.BootstrapConfigParams{ 51 Config: cfg, 52 Credentials: fakeUserPassCredential(), 53 }) 54 c.Check(err, gc.ErrorMatches, fmt.Sprintf(`internal config "%s" must not be specified`, key)) 55 } 56 57 func fakeUserPassCredential() cloud.Credential { 58 return cloud.NewCredential( 59 cloud.UserPassAuthType, 60 map[string]string{ 61 "application-id": "application-id", 62 "subscription-id": "subscription-id", 63 "tenant-id": "tenant-id", 64 "application-password": "application-password", 65 }, 66 ) 67 } 68 69 func (s *environProviderSuite) TestBootstrapConfig(c *gc.C) { 70 cfg := makeTestModelConfig(c) 71 s.sender = azuretesting.Senders{tokenRefreshSender()} 72 cfg, err := s.provider.BootstrapConfig(environs.BootstrapConfigParams{ 73 Config: cfg, 74 CloudRegion: "westus", 75 CloudEndpoint: "https://api.azurestack.local", 76 CloudStorageEndpoint: "https://storage.azurestack.local", 77 Credentials: fakeUserPassCredential(), 78 }) 79 c.Check(err, jc.ErrorIsNil) 80 c.Check(cfg, gc.NotNil) 81 82 attrs := cfg.UnknownAttrs() 83 c.Assert(attrs["location"], gc.Equals, "westus") 84 c.Assert(attrs["endpoint"], gc.Equals, "https://api.azurestack.local") 85 c.Assert(attrs["storage-endpoint"], gc.Equals, "https://storage.azurestack.local") 86 } 87 88 func newProviders(c *gc.C, config azure.ProviderConfig) (environs.EnvironProvider, storage.Provider) { 89 if config.NewStorageClient == nil { 90 var storage azuretesting.MockStorageClient 91 config.NewStorageClient = storage.NewClient 92 } 93 if config.StorageAccountNameGenerator == nil { 94 config.StorageAccountNameGenerator = func() string { 95 return fakeStorageAccount 96 } 97 } 98 if config.RetryClock == nil { 99 config.RetryClock = testing.NewClock(time.Time{}) 100 } 101 environProvider, storageProvider, err := azure.NewProviders(config) 102 c.Assert(err, jc.ErrorIsNil) 103 return environProvider, storageProvider 104 } 105 106 func requestRecorder(requests *[]*http.Request) autorest.PrepareDecorator { 107 if requests == nil { 108 return nil 109 } 110 return func(p autorest.Preparer) autorest.Preparer { 111 return autorest.PreparerFunc(func(req *http.Request) (*http.Request, error) { 112 // Save the request body, since it will be consumed. 113 reqCopy := *req 114 if req.Body != nil { 115 var buf bytes.Buffer 116 if _, err := buf.ReadFrom(req.Body); err != nil { 117 return nil, err 118 } 119 if err := req.Body.Close(); err != nil { 120 return nil, err 121 } 122 reqCopy.Body = ioutil.NopCloser(&buf) 123 req.Body = ioutil.NopCloser(bytes.NewReader(buf.Bytes())) 124 } 125 *requests = append(*requests, &reqCopy) 126 return req, nil 127 }) 128 } 129 }