launchpad.net/~rogpeppe/juju-core/500-errgo-fix@v0.0.0-20140213181702-000000002356/provider/joyent/config_test.go (about)

     1  // Copyright 2013 Joyent Inc.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package joyent_test
     5  
     6  import (
     7  	gc "launchpad.net/gocheck"
     8  
     9  	"launchpad.net/juju-core/environs"
    10  	"launchpad.net/juju-core/environs/config"
    11  	"launchpad.net/juju-core/provider/joyent"
    12  	"launchpad.net/juju-core/testing"
    13  	"launchpad.net/juju-core/testing/testbase"
    14  )
    15  
    16  func newConfig(c *gc.C, attrs testing.Attrs) *config.Config {
    17  	attrs = testing.FakeConfig().Merge(attrs)
    18  	cfg, err := config.New(config.NoDefaults, attrs)
    19  	c.Assert(err, gc.IsNil)
    20  	return cfg
    21  }
    22  
    23  func validAttrs() testing.Attrs {
    24  	return testing.FakeConfig().Merge(testing.Attrs{
    25  		"type":         "joyent",
    26  		"sdc-user":     "dstroppa",
    27  		"sdc-key-id":   "12:c3:a7:cb:a2:29:e2:90:88:3f:04:53:3b:4e:75:40",
    28  		"sdc-region":   "us-west-1",
    29  		"manta-user":   "dstroppa",
    30  		"manta-key-id": "12:c3:a7:cb:a2:29:e2:90:88:3f:04:53:3b:4e:75:40",
    31  		"manta-region": "us-east",
    32  		"control-dir":  "juju-test",
    33  	})
    34  }
    35  
    36  type ConfigSuite struct {
    37  	testbase.LoggingSuite
    38  	originalValues map[string]testbase.Restorer
    39  }
    40  
    41  var _ = gc.Suite(&ConfigSuite{})
    42  
    43  func (s *ConfigSuite) SetUpSuite(c *gc.C) {
    44  	s.PatchEnvironment(joyent.SdcAccount, "tester")
    45  	s.PatchEnvironment(joyent.SdcKeyId, "11:c4:b6:c0:a3:24:22:96:a8:1f:07:53:3f:8e:14:7a")
    46  	s.PatchEnvironment(joyent.MantaUser, "tester")
    47  	s.PatchEnvironment(joyent.MantaKeyId, "11:c4:b6:c0:a3:24:22:96:a8:1f:07:53:3f:8e:14:7a")
    48  }
    49  
    50  var newConfigTests = []struct {
    51  	info   string
    52  	insert testing.Attrs
    53  	remove []string
    54  	expect testing.Attrs
    55  	err    string
    56  }{{
    57  	info:   "sdc-user is required",
    58  	remove: []string{"sdc-user"},
    59  	err:    "sdc-user: expected string, got nothing",
    60  }, {
    61  	info:   "sdc-user cannot be empty",
    62  	insert: testing.Attrs{"sdc-user": ""},
    63  	err:    "sdc-user: must not be empty",
    64  }, {
    65  	info:   "sdc-key-id is required",
    66  	remove: []string{"sdc-key-id"},
    67  	err:    "sdc-key-id: expected string, got nothing",
    68  }, {
    69  	info:   "sdc-key-id cannot be empty",
    70  	insert: testing.Attrs{"sdc-key-id": ""},
    71  	err:    "sdc-key-id: must not be empty",
    72  }, {
    73  	info:   "sdc-region is inserted if missing",
    74  	expect: testing.Attrs{"sdc-region": "us-west-1"},
    75  }, {
    76  	info:   "sdc-region cannot be empty",
    77  	insert: testing.Attrs{"sdc-region": ""},
    78  	err:    "sdc-region: must not be empty",
    79  }, {
    80  	info:   "sdc-region is untouched if present",
    81  	insert: testing.Attrs{"sdc-region": "us-west-1"},
    82  	expect: testing.Attrs{"sdc-region": "us-west-1"},
    83  }, {
    84  	info:   "manta-user is required",
    85  	remove: []string{"manta-user"},
    86  	err:    "manta-user: expected string, got nothing",
    87  }, {
    88  	info:   "manta-user cannot be empty",
    89  	insert: testing.Attrs{"manta-user": ""},
    90  	err:    "manta-user: must not be empty",
    91  }, {
    92  	info:   "manta-key-id is required",
    93  	remove: []string{"manta-key-id"},
    94  	err:    "manta-key-id: expected string, got nothing",
    95  }, {
    96  	info:   "manta-key-id cannot be empty",
    97  	insert: testing.Attrs{"manta-key-id": ""},
    98  	err:    "manta-key-id: must not be empty",
    99  }, {
   100  	info:   "manta-region is inserted if missing",
   101  	expect: testing.Attrs{"manta-region": "us-east"},
   102  }, {
   103  	info:   "manta-region cannot be empty",
   104  	insert: testing.Attrs{"manta-region": ""},
   105  	err:    "manta-region: must not be empty",
   106  }, {
   107  	info:   "manta-region is untouched if present",
   108  	insert: testing.Attrs{"manta-region": "us-east"},
   109  	expect: testing.Attrs{"manta-region": "us-east"},
   110  }, {
   111  	info:   "unknown field is not touched",
   112  	insert: testing.Attrs{"unknown-field": 12345},
   113  	expect: testing.Attrs{"unknown-field": 12345},
   114  }}
   115  
   116  func (*ConfigSuite) TestNewEnvironConfig(c *gc.C) {
   117  	for i, test := range newConfigTests {
   118  		c.Logf("test %d: %s", i, test.info)
   119  		attrs := validAttrs().Merge(test.insert).Delete(test.remove...)
   120  		testConfig := newConfig(c, attrs)
   121  		environ, err := environs.New(testConfig)
   122  		if test.err == "" {
   123  			c.Assert(err, gc.IsNil)
   124  			attrs := environ.Config().AllAttrs()
   125  			for field, value := range test.expect {
   126  				c.Check(attrs[field], gc.Equals, value)
   127  			}
   128  		} else {
   129  			c.Assert(environ, gc.IsNil)
   130  			c.Check(err, gc.ErrorMatches, test.err)
   131  		}
   132  	}
   133  }
   134  
   135  func (*ConfigSuite) TestValidateNewConfig(c *gc.C) {
   136  	for i, test := range newConfigTests {
   137  		c.Logf("test %d: %s", i, test.info)
   138  		attrs := validAttrs().Merge(test.insert).Delete(test.remove...)
   139  		testConfig := newConfig(c, attrs)
   140  		validatedConfig, err := joyent.Provider.Validate(testConfig, nil)
   141  		if test.err == "" {
   142  			c.Assert(err, gc.IsNil)
   143  			attrs := validatedConfig.AllAttrs()
   144  			for field, value := range test.expect {
   145  				c.Check(attrs[field], gc.Equals, value)
   146  			}
   147  		} else {
   148  			c.Assert(validatedConfig, gc.IsNil)
   149  			c.Check(err, gc.ErrorMatches, "invalid Joyent provider config: "+test.err)
   150  		}
   151  	}
   152  }
   153  
   154  func (*ConfigSuite) TestValidateOldConfig(c *gc.C) {
   155  	knownGoodConfig := newConfig(c, validAttrs())
   156  	for i, test := range newConfigTests {
   157  		c.Logf("test %d: %s", i, test.info)
   158  		attrs := validAttrs().Merge(test.insert).Delete(test.remove...)
   159  		testConfig := newConfig(c, attrs)
   160  		validatedConfig, err := joyent.Provider.Validate(knownGoodConfig, testConfig)
   161  		if test.err == "" {
   162  			c.Assert(err, gc.IsNil)
   163  			attrs := validatedConfig.AllAttrs()
   164  			for field, value := range validAttrs() {
   165  				c.Check(attrs[field], gc.Equals, value)
   166  			}
   167  		} else {
   168  			c.Assert(validatedConfig, gc.IsNil)
   169  			c.Check(err, gc.ErrorMatches, "original Joyent provider config is invalid: "+test.err)
   170  		}
   171  	}
   172  }
   173  
   174  var changeConfigTests = []struct {
   175  	info   string
   176  	insert testing.Attrs
   177  	remove []string
   178  	expect testing.Attrs
   179  	err    string
   180  }{{
   181  	info:   "no change, no error",
   182  	expect: validAttrs(),
   183  }, {
   184  	info:   "can change sdc-user",
   185  	insert: testing.Attrs{"sdc-user": "joyent_user"},
   186  	expect: testing.Attrs{"sdc-user": "joyent_user"},
   187  }, {
   188  	info:   "can change sdc-key-id",
   189  	insert: testing.Attrs{"sdc-key-id": "11:c4:b6:c0:a3:24:22:96:a8:1f:07:53:3f:8e:14:7a"},
   190  	expect: testing.Attrs{"sdc-key-id": "11:c4:b6:c0:a3:24:22:96:a8:1f:07:53:3f:8e:14:7a"},
   191  }, {
   192  	info:   "can change sdc-region",
   193  	insert: testing.Attrs{"sdc-region": "us-west-1"},
   194  	expect: testing.Attrs{"sdc-region": "us-west-1"},
   195  }, {
   196  	info:   "can change manta-user",
   197  	insert: testing.Attrs{"manta-user": "manta_user"},
   198  	expect: testing.Attrs{"manta-user": "manta_user"},
   199  }, {
   200  	info:   "can change manta-key-id",
   201  	insert: testing.Attrs{"manta-key-id": "11:c4:b6:c0:a3:24:22:96:a8:1f:07:53:3f:8e:14:7a"},
   202  	expect: testing.Attrs{"manta-key-id": "11:c4:b6:c0:a3:24:22:96:a8:1f:07:53:3f:8e:14:7a"},
   203  }, {
   204  	info:   "can change manta-region",
   205  	insert: testing.Attrs{"manta-region": "us-east"},
   206  	expect: testing.Attrs{"manta-region": "us-east"},
   207  }, {
   208  	info:   "can insert unknown field",
   209  	insert: testing.Attrs{"unknown": "ignoti"},
   210  	expect: testing.Attrs{"unknown": "ignoti"},
   211  }}
   212  
   213  func (s *ConfigSuite) TestValidateChange(c *gc.C) {
   214  	baseConfig := newConfig(c, validAttrs())
   215  	for i, test := range changeConfigTests {
   216  		c.Logf("test %d: %s", i, test.info)
   217  		attrs := validAttrs().Merge(test.insert).Delete(test.remove...)
   218  		testConfig := newConfig(c, attrs)
   219  		validatedConfig, err := joyent.Provider.Validate(testConfig, baseConfig)
   220  		if test.err == "" {
   221  			c.Assert(err, gc.IsNil)
   222  			attrs := validatedConfig.AllAttrs()
   223  			for field, value := range test.expect {
   224  				c.Check(attrs[field], gc.Equals, value)
   225  			}
   226  		} else {
   227  			c.Assert(validatedConfig, gc.IsNil)
   228  			c.Check(err, gc.ErrorMatches, "invalid config change: "+test.err)
   229  		}
   230  	}
   231  }
   232  
   233  func (s *ConfigSuite) TestSetConfig(c *gc.C) {
   234  	baseConfig := newConfig(c, validAttrs())
   235  	for i, test := range changeConfigTests {
   236  		c.Logf("test %d: %s", i, test.info)
   237  		environ, err := environs.New(baseConfig)
   238  		c.Assert(err, gc.IsNil)
   239  		attrs := validAttrs().Merge(test.insert).Delete(test.remove...)
   240  		testConfig := newConfig(c, attrs)
   241  		err = environ.SetConfig(testConfig)
   242  		newAttrs := environ.Config().AllAttrs()
   243  		if test.err == "" {
   244  			c.Assert(err, gc.IsNil)
   245  			for field, value := range test.expect {
   246  				c.Check(newAttrs[field], gc.Equals, value)
   247  			}
   248  		} else {
   249  			c.Check(err, gc.ErrorMatches, test.err)
   250  			for field, value := range baseConfig.UnknownAttrs() {
   251  				c.Check(newAttrs[field], gc.Equals, value)
   252  			}
   253  		}
   254  	}
   255  }
   256  
   257  var prepareConfigTests = []struct {
   258  	info   string
   259  	insert testing.Attrs
   260  	remove []string
   261  	expect testing.Attrs
   262  	err    string
   263  }{{
   264  	info:   "All value provided, nothig to do",
   265  	expect: validAttrs(),
   266  }, {
   267  	info:   "can get sdc-user from env variable",
   268  	insert: testing.Attrs{"sdc-user": ""},
   269  	expect: testing.Attrs{"sdc-user": "tester"},
   270  }, {
   271  	info:   "can get sdc-key-id from env variable",
   272  	insert: testing.Attrs{"sdc-key-id": ""},
   273  	expect: testing.Attrs{"sdc-key-id": "11:c4:b6:c0:a3:24:22:96:a8:1f:07:53:3f:8e:14:7a"},
   274  }, {
   275  	info:   "can get manta-user from env variable",
   276  	insert: testing.Attrs{"manta-user": ""},
   277  	expect: testing.Attrs{"manta-user": "tester"},
   278  }, {
   279  	info:   "can get manta-key-id from env variable",
   280  	insert: testing.Attrs{"manta-key-id": ""},
   281  	expect: testing.Attrs{"manta-key-id": "11:c4:b6:c0:a3:24:22:96:a8:1f:07:53:3f:8e:14:7a"},
   282  }}
   283  
   284  func (s *ConfigSuite) TestPrepare(c *gc.C) {
   285  	for i, test := range prepareConfigTests {
   286  		c.Logf("test %d: %s", i, test.info)
   287  		attrs := validAttrs().Merge(test.insert).Delete(test.remove...)
   288  		testConfig := newConfig(c, attrs)
   289  		preparedConfig, err := joyent.Provider.Prepare(testConfig)
   290  		if test.err == "" {
   291  			c.Assert(err, gc.IsNil)
   292  			attrs := preparedConfig.Config().AllAttrs()
   293  			for field, value := range test.expect {
   294  				c.Check(attrs[field], gc.Equals, value)
   295  			}
   296  		} else {
   297  			c.Assert(preparedConfig, gc.IsNil)
   298  			c.Check(err, gc.ErrorMatches, "invalid prepare config: "+test.err)
   299  		}
   300  	}
   301  }