github.com/makyo/juju@v0.0.0-20160425123129-2608902037e9/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 12 "github.com/Azure/azure-sdk-for-go/Godeps/_workspace/src/github.com/Azure/go-autorest/autorest" 13 jc "github.com/juju/testing/checkers" 14 gc "gopkg.in/check.v1" 15 16 "github.com/juju/juju/cloud" 17 "github.com/juju/juju/environs" 18 "github.com/juju/juju/provider/azure" 19 "github.com/juju/juju/provider/azure/internal/azuretesting" 20 "github.com/juju/juju/storage" 21 "github.com/juju/juju/testing" 22 ) 23 24 type environProviderSuite struct { 25 testing.BaseSuite 26 provider environs.EnvironProvider 27 requests []*http.Request 28 sender azuretesting.Senders 29 } 30 31 var _ = gc.Suite(&environProviderSuite{}) 32 33 func (s *environProviderSuite) SetUpTest(c *gc.C) { 34 s.BaseSuite.SetUpTest(c) 35 s.provider, _ = newProviders(c, azure.ProviderConfig{ 36 Sender: &s.sender, 37 RequestInspector: requestRecorder(&s.requests), 38 }) 39 s.sender = nil 40 } 41 42 func (s *environProviderSuite) TestBootstrapConfigWithInternalConfig(c *gc.C) { 43 s.testBootstrapConfigWithInternalConfig(c, "controller-resource-group") 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 cfg, err := cfg.Remove([]string{"controller-resource-group"}) 72 c.Assert(err, jc.ErrorIsNil) 73 74 s.sender = azuretesting.Senders{tokenRefreshSender()} 75 cfg, err = s.provider.BootstrapConfig(environs.BootstrapConfigParams{ 76 Config: cfg, 77 CloudRegion: "westus", 78 CloudEndpoint: "https://api.azurestack.local", 79 CloudStorageEndpoint: "https://storage.azurestack.local", 80 Credentials: fakeUserPassCredential(), 81 }) 82 c.Check(err, jc.ErrorIsNil) 83 c.Check(cfg, gc.NotNil) 84 85 c.Assert( 86 cfg.UnknownAttrs()["controller-resource-group"], 87 gc.Equals, 88 "juju-testenv-model-"+testing.ModelTag.Id(), 89 ) 90 } 91 92 func newProviders(c *gc.C, config azure.ProviderConfig) (environs.EnvironProvider, storage.Provider) { 93 if config.NewStorageClient == nil { 94 var storage azuretesting.MockStorageClient 95 config.NewStorageClient = storage.NewClient 96 } 97 if config.StorageAccountNameGenerator == nil { 98 config.StorageAccountNameGenerator = func() string { 99 return fakeStorageAccount 100 } 101 } 102 environProvider, storageProvider, err := azure.NewProviders(config) 103 c.Assert(err, jc.ErrorIsNil) 104 return environProvider, storageProvider 105 } 106 107 func requestRecorder(requests *[]*http.Request) autorest.PrepareDecorator { 108 if requests == nil { 109 return nil 110 } 111 return func(p autorest.Preparer) autorest.Preparer { 112 return autorest.PreparerFunc(func(req *http.Request) (*http.Request, error) { 113 // Save the request body, since it will be consumed. 114 reqCopy := *req 115 if req.Body != nil { 116 var buf bytes.Buffer 117 if _, err := buf.ReadFrom(req.Body); err != nil { 118 return nil, err 119 } 120 if err := req.Body.Close(); err != nil { 121 return nil, err 122 } 123 reqCopy.Body = ioutil.NopCloser(&buf) 124 req.Body = ioutil.NopCloser(bytes.NewReader(buf.Bytes())) 125 } 126 *requests = append(*requests, &reqCopy) 127 return req, nil 128 }) 129 } 130 }