github.com/cloudbase/juju-core@v0.0.0-20140504232958-a7271ac7912f/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 gc "launchpad.net/gocheck" 11 12 "launchpad.net/juju-core/environs/config" 13 "launchpad.net/juju-core/testing" 14 "launchpad.net/juju-core/testing/testbase" 15 ) 16 17 type configSuite struct { 18 testbase.LoggingSuite 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 }