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  }