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  }