github.com/mattyw/juju@v0.0.0-20140610034352-732aecd63861/provider/azure/config_test.go (about)

     1  // Copyright 2013 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package azure
     5  
     6  import (
     7  	"io/ioutil"
     8  	"strings"
     9  
    10  	jc "github.com/juju/testing/checkers"
    11  	gc "launchpad.net/gocheck"
    12  
    13  	"github.com/juju/juju/environs/config"
    14  	"github.com/juju/juju/testing"
    15  )
    16  
    17  type configSuite struct {
    18  	testing.BaseSuite
    19  }
    20  
    21  var _ = gc.Suite(&configSuite{})
    22  
    23  // makeConfigMap creates a minimal map of standard configuration items,
    24  // adds the given extra items to that and returns it.
    25  func makeConfigMap(extra map[string]interface{}) map[string]interface{} {
    26  	return testing.FakeConfig().Merge(testing.Attrs{
    27  		"name": "testenv",
    28  		"type": "azure",
    29  	}).Merge(extra)
    30  }
    31  
    32  var testCert = `
    33  -----BEGIN PRIVATE KEY-----
    34  MIIBCgIBADANBgkqhkiG9w0BAQEFAASB9TCB8gIBAAIxAKQGQxP1i0VfCWn4KmMP
    35  taUFn8sMBKjP/9vHnUYdZRvvmoJCA1C6arBUDp8s2DNX+QIDAQABAjBLRqhwN4dU
    36  LfqHDKJ/Vg1aD8u3Buv4gYRBxdFR5PveyqHSt5eJ4g/x/4ndsvr2OqUCGQDNfNlD
    37  zxHCiEAwZZAPaAkn8jDkFupTljcCGQDMWCujiVZ1NNuBD/N32Yt8P9JDiNzZa08C
    38  GBW7VXLxbExpgnhb1V97vjQmTfthXQjYAwIYSTEjoFXm4+Bk5xuBh2IidgSeGZaC
    39  FFY9AhkAsteo31cyQw2xJ80SWrmsIw+ps7Cvt5W9
    40  -----END PRIVATE KEY-----
    41  -----BEGIN CERTIFICATE-----
    42  MIIBDzCByqADAgECAgkAgIBb3+lSwzEwDQYJKoZIhvcNAQEFBQAwFTETMBEGA1UE
    43  AxQKQEhvc3ROYW1lQDAeFw0xMzA3MTkxNjA1NTRaFw0yMzA3MTcxNjA1NTRaMBUx
    44  EzARBgNVBAMUCkBIb3N0TmFtZUAwTDANBgkqhkiG9w0BAQEFAAM7ADA4AjEApAZD
    45  E/WLRV8JafgqYw+1pQWfywwEqM//28edRh1lG++agkIDULpqsFQOnyzYM1f5AgMB
    46  AAGjDTALMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQEFBQADMQABKfn08tKfzzqMMD2w
    47  PI2fs3bw5bRH8tmGjrsJeEdp9crCBS8I3hKcxCkTTRTowdY=
    48  -----END CERTIFICATE-----
    49  `
    50  
    51  func makeAzureConfigMap(c *gc.C) map[string]interface{} {
    52  	azureConfig := map[string]interface{}{
    53  		"location":                   "location",
    54  		"management-subscription-id": "subscription-id",
    55  		"management-certificate":     testCert,
    56  		"storage-account-name":       "account-name",
    57  	}
    58  	return makeConfigMap(azureConfig)
    59  }
    60  
    61  // createTempFile creates a temporary file.  The file will be cleaned
    62  // up at the end of the test calling this method.
    63  func createTempFile(c *gc.C, content []byte) string {
    64  	file, err := ioutil.TempFile(c.MkDir(), "")
    65  	c.Assert(err, gc.IsNil)
    66  	filename := file.Name()
    67  	err = ioutil.WriteFile(filename, content, 0644)
    68  	c.Assert(err, gc.IsNil)
    69  	return filename
    70  }
    71  
    72  func (*configSuite) TestValidateAcceptsNilOldConfig(c *gc.C) {
    73  	attrs := makeAzureConfigMap(c)
    74  	provider := azureEnvironProvider{}
    75  	config, err := config.New(config.NoDefaults, attrs)
    76  	c.Assert(err, gc.IsNil)
    77  	result, err := provider.Validate(config, nil)
    78  	c.Assert(err, gc.IsNil)
    79  	c.Check(result.Name(), gc.Equals, attrs["name"])
    80  }
    81  
    82  func (*configSuite) TestValidateAcceptsUnchangedConfig(c *gc.C) {
    83  	attrs := makeAzureConfigMap(c)
    84  	provider := azureEnvironProvider{}
    85  	oldConfig, err := config.New(config.NoDefaults, attrs)
    86  	c.Assert(err, gc.IsNil)
    87  	newConfig, err := config.New(config.NoDefaults, attrs)
    88  	c.Assert(err, gc.IsNil)
    89  	result, err := provider.Validate(newConfig, oldConfig)
    90  	c.Assert(err, gc.IsNil)
    91  	c.Check(result.Name(), gc.Equals, attrs["name"])
    92  }
    93  
    94  func (*configSuite) TestValidateChecksConfigChanges(c *gc.C) {
    95  	provider := azureEnvironProvider{}
    96  	oldConfig, err := config.New(config.NoDefaults, makeConfigMap(nil))
    97  	c.Assert(err, gc.IsNil)
    98  	newAttrs := makeConfigMap(map[string]interface{}{
    99  		"name": "different-name",
   100  	})
   101  	newConfig, err := config.New(config.NoDefaults, newAttrs)
   102  	c.Assert(err, gc.IsNil)
   103  	_, err = provider.Validate(newConfig, oldConfig)
   104  	c.Check(err, gc.NotNil)
   105  }
   106  
   107  func (*configSuite) TestValidateParsesAzureConfig(c *gc.C) {
   108  	location := "location"
   109  	managementSubscriptionId := "subscription-id"
   110  	certificate := "certificate content"
   111  	storageAccountName := "account-name"
   112  	forceImageName := "force-image-name"
   113  	unknownFutureSetting := "preserved"
   114  	azureConfig := map[string]interface{}{
   115  		"location":                   location,
   116  		"management-subscription-id": managementSubscriptionId,
   117  		"management-certificate":     certificate,
   118  		"storage-account-name":       storageAccountName,
   119  		"force-image-name":           forceImageName,
   120  		"unknown-future-setting":     unknownFutureSetting,
   121  	}
   122  	attrs := makeConfigMap(azureConfig)
   123  	provider := azureEnvironProvider{}
   124  	config, err := config.New(config.NoDefaults, attrs)
   125  	c.Assert(err, gc.IsNil)
   126  	azConfig, err := provider.newConfig(config)
   127  	c.Assert(err, gc.IsNil)
   128  	c.Check(azConfig.Name(), gc.Equals, attrs["name"])
   129  	c.Check(azConfig.location(), gc.Equals, location)
   130  	c.Check(azConfig.managementSubscriptionId(), gc.Equals, managementSubscriptionId)
   131  	c.Check(azConfig.managementCertificate(), gc.Equals, certificate)
   132  	c.Check(azConfig.storageAccountName(), gc.Equals, storageAccountName)
   133  	c.Check(azConfig.forceImageName(), gc.Equals, forceImageName)
   134  	c.Check(azConfig.UnknownAttrs()["unknown-future-setting"], gc.Equals, unknownFutureSetting)
   135  }
   136  
   137  func (*configSuite) TestValidateReadsCertFile(c *gc.C) {
   138  	certificate := "test certificate"
   139  	certFile := createTempFile(c, []byte(certificate))
   140  	attrs := makeAzureConfigMap(c)
   141  	delete(attrs, "management-certificate")
   142  	attrs["management-certificate-path"] = certFile
   143  	provider := azureEnvironProvider{}
   144  	newConfig, err := config.New(config.NoDefaults, attrs)
   145  	c.Assert(err, gc.IsNil)
   146  	azConfig, err := provider.newConfig(newConfig)
   147  	c.Assert(err, gc.IsNil)
   148  	c.Check(azConfig.managementCertificate(), gc.Equals, certificate)
   149  }
   150  
   151  func (*configSuite) TestChecksExistingCertFile(c *gc.C) {
   152  	nonExistingCertPath := "non-existing-cert-file"
   153  	attrs := makeAzureConfigMap(c)
   154  	delete(attrs, "management-certificate")
   155  	attrs["management-certificate-path"] = nonExistingCertPath
   156  	provider := azureEnvironProvider{}
   157  	newConfig, err := config.New(config.NoDefaults, attrs)
   158  	c.Assert(err, gc.IsNil)
   159  	_, err = provider.Validate(newConfig, nil)
   160  	c.Check(err, gc.ErrorMatches, ".*"+nonExistingCertPath+": no such file or directory.*")
   161  }
   162  
   163  func (*configSuite) TestChecksLocationIsRequired(c *gc.C) {
   164  	attrs := makeAzureConfigMap(c)
   165  	attrs["location"] = ""
   166  	provider := azureEnvironProvider{}
   167  	newConfig, err := config.New(config.NoDefaults, attrs)
   168  	c.Assert(err, gc.IsNil)
   169  	_, err = provider.Validate(newConfig, nil)
   170  	c.Check(err, gc.ErrorMatches, ".*environment has no location.*")
   171  }
   172  
   173  func (*configSuite) TestBoilerplateConfigReturnsAzureConfig(c *gc.C) {
   174  	provider := azureEnvironProvider{}
   175  	boilerPlateConfig := provider.BoilerplateConfig()
   176  	c.Assert(strings.Contains(boilerPlateConfig, "type: azure"), gc.Equals, true)
   177  }
   178  
   179  func (*configSuite) TestSecretAttrsReturnsSensitiveAttributes(c *gc.C) {
   180  	attrs := makeAzureConfigMap(c)
   181  	certificate := "certificate"
   182  	attrs["management-certificate"] = certificate
   183  	config, err := config.New(config.NoDefaults, attrs)
   184  	c.Assert(err, gc.IsNil)
   185  
   186  	provider := azureEnvironProvider{}
   187  	secretAttrs, err := provider.SecretAttrs(config)
   188  	c.Assert(err, gc.IsNil)
   189  
   190  	expectedAttrs := map[string]string{
   191  		"management-certificate": certificate,
   192  	}
   193  	c.Check(secretAttrs, gc.DeepEquals, expectedAttrs)
   194  }
   195  
   196  func (*configSuite) TestEmptyImageStream1dot16Compat(c *gc.C) {
   197  	attrs := makeAzureConfigMap(c)
   198  	attrs["image-stream"] = ""
   199  	provider := azureEnvironProvider{}
   200  	cfg, err := config.New(config.UseDefaults, attrs)
   201  	c.Assert(err, gc.IsNil)
   202  	_, err = provider.Validate(cfg, nil)
   203  	c.Assert(err, gc.IsNil)
   204  }
   205  
   206  func (*configSuite) TestAvailabilitySetsEnabledDefault(c *gc.C) {
   207  	userValues := []interface{}{nil, false, true}
   208  	for _, userValue := range userValues {
   209  		attrs := makeAzureConfigMap(c)
   210  		// If availability-sets-enabled isn't specified, it's set to true.
   211  		checker := jc.IsTrue
   212  		if userValue, ok := userValue.(bool); ok {
   213  			attrs["availability-sets-enabled"] = userValue
   214  			if !userValue {
   215  				checker = jc.IsFalse
   216  			}
   217  		}
   218  		cfg, err := config.New(config.UseDefaults, attrs)
   219  		c.Assert(err, gc.IsNil)
   220  		env, err := azureEnvironProvider{}.Prepare(testing.Context(c), cfg)
   221  		c.Assert(err, gc.IsNil)
   222  		azureEnv := env.(*azureEnviron)
   223  		c.Assert(azureEnv.ecfg.availabilitySetsEnabled(), checker)
   224  	}
   225  }
   226  
   227  func (*configSuite) TestAvailabilitySetsEnabledImmutable(c *gc.C) {
   228  	cfg, err := config.New(config.UseDefaults, makeAzureConfigMap(c))
   229  	c.Assert(err, gc.IsNil)
   230  	env, err := azureEnvironProvider{}.Prepare(testing.Context(c), cfg)
   231  	c.Assert(err, gc.IsNil)
   232  	cfg, err = env.Config().Apply(map[string]interface{}{"availability-sets-enabled": false})
   233  	c.Assert(err, gc.IsNil)
   234  	err = env.SetConfig(cfg)
   235  	c.Assert(err, gc.ErrorMatches, "cannot change availability-sets-enabled")
   236  }