github.com/cloudbase/juju-core@v0.0.0-20140504232958-a7271ac7912f/provider/maas/environprovider_test.go (about) 1 // Copyright 2013 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package maas 5 6 import ( 7 "io/ioutil" 8 9 gc "launchpad.net/gocheck" 10 "launchpad.net/goyaml" 11 12 "launchpad.net/juju-core/environs/config" 13 "launchpad.net/juju-core/juju/osenv" 14 "launchpad.net/juju-core/testing" 15 jc "launchpad.net/juju-core/testing/checkers" 16 "launchpad.net/juju-core/utils" 17 ) 18 19 type EnvironProviderSuite struct { 20 providerSuite 21 } 22 23 var _ = gc.Suite(&EnvironProviderSuite{}) 24 25 func (suite *EnvironProviderSuite) TestSecretAttrsReturnsSensitiveMAASAttributes(c *gc.C) { 26 testJujuHome := c.MkDir() 27 defer osenv.SetJujuHome(osenv.SetJujuHome(testJujuHome)) 28 const oauth = "aa:bb:cc" 29 attrs := testing.FakeConfig().Merge(testing.Attrs{ 30 "type": "maas", 31 "maas-oauth": oauth, 32 "maas-server": "http://maas.testing.invalid/maas/", 33 }) 34 config, err := config.New(config.NoDefaults, attrs) 35 c.Assert(err, gc.IsNil) 36 37 secretAttrs, err := suite.makeEnviron().Provider().SecretAttrs(config) 38 c.Assert(err, gc.IsNil) 39 40 expectedAttrs := map[string]string{"maas-oauth": oauth} 41 c.Check(secretAttrs, gc.DeepEquals, expectedAttrs) 42 } 43 44 func (suite *EnvironProviderSuite) TestUnknownAttrsContainAgentName(c *gc.C) { 45 testJujuHome := c.MkDir() 46 defer osenv.SetJujuHome(osenv.SetJujuHome(testJujuHome)) 47 attrs := testing.FakeConfig().Merge(testing.Attrs{ 48 "type": "maas", 49 "maas-oauth": "aa:bb:cc", 50 "maas-server": "http://maas.testing.invalid/maas/", 51 }) 52 config, err := config.New(config.NoDefaults, attrs) 53 c.Assert(err, gc.IsNil) 54 55 ctx := testing.Context(c) 56 environ, err := suite.makeEnviron().Provider().Prepare(ctx, config) 57 c.Assert(err, gc.IsNil) 58 59 preparedConfig := environ.Config() 60 unknownAttrs := preparedConfig.UnknownAttrs() 61 62 uuid, ok := unknownAttrs["maas-agent-name"] 63 64 c.Assert(ok, jc.IsTrue) 65 c.Assert(uuid, jc.Satisfies, utils.IsValidUUIDString) 66 } 67 68 func (suite *EnvironProviderSuite) TestAgentNameShouldNotBeSetByHand(c *gc.C) { 69 testJujuHome := c.MkDir() 70 defer osenv.SetJujuHome(osenv.SetJujuHome(testJujuHome)) 71 attrs := testing.FakeConfig().Merge(testing.Attrs{ 72 "type": "maas", 73 "maas-oauth": "aa:bb:cc", 74 "maas-server": "http://maas.testing.invalid/maas/", 75 "maas-agent-name": "foobar", 76 }) 77 config, err := config.New(config.NoDefaults, attrs) 78 c.Assert(err, gc.IsNil) 79 80 ctx := testing.Context(c) 81 _, err = suite.makeEnviron().Provider().Prepare(ctx, config) 82 c.Assert(err, gc.Equals, errAgentNameAlreadySet) 83 } 84 85 // create a temporary file with the given content. The file will be cleaned 86 // up at the end of the test calling this method. 87 func createTempFile(c *gc.C, content []byte) string { 88 file, err := ioutil.TempFile(c.MkDir(), "") 89 c.Assert(err, gc.IsNil) 90 filename := file.Name() 91 err = ioutil.WriteFile(filename, content, 0644) 92 c.Assert(err, gc.IsNil) 93 return filename 94 } 95 96 // PublicAddress and PrivateAddress return the hostname of the machine read 97 // from the file _MAASInstanceFilename. 98 func (suite *EnvironProviderSuite) TestPrivatePublicAddressReadsHostnameFromMachineFile(c *gc.C) { 99 hostname := "myhostname" 100 info := machineInfo{hostname} 101 yaml, err := goyaml.Marshal(info) 102 c.Assert(err, gc.IsNil) 103 // Create a temporary file to act as the file where the instanceID 104 // is stored. 105 filename := createTempFile(c, yaml) 106 // "Monkey patch" the value of _MAASInstanceFilename with the path 107 // to the temporary file. 108 old_MAASInstanceFilename := _MAASInstanceFilename 109 _MAASInstanceFilename = filename 110 defer func() { _MAASInstanceFilename = old_MAASInstanceFilename }() 111 112 provider := suite.makeEnviron().Provider() 113 publicAddress, err := provider.PublicAddress() 114 c.Assert(err, gc.IsNil) 115 c.Check(publicAddress, gc.Equals, hostname) 116 privateAddress, err := provider.PrivateAddress() 117 c.Assert(err, gc.IsNil) 118 c.Check(privateAddress, gc.Equals, hostname) 119 } 120 121 func (suite *EnvironProviderSuite) TestOpenReturnsNilInterfaceUponFailure(c *gc.C) { 122 testJujuHome := c.MkDir() 123 defer osenv.SetJujuHome(osenv.SetJujuHome(testJujuHome)) 124 const oauth = "wrongly-formatted-oauth-string" 125 attrs := testing.FakeConfig().Merge(testing.Attrs{ 126 "type": "maas", 127 "maas-oauth": oauth, 128 "maas-server": "http://maas.testing.invalid/maas/", 129 }) 130 config, err := config.New(config.NoDefaults, attrs) 131 c.Assert(err, gc.IsNil) 132 env, err := suite.makeEnviron().Provider().Open(config) 133 // When Open() fails (i.e. returns a non-nil error), it returns an 134 // environs.Environ interface object with a nil value and a nil 135 // type. 136 c.Check(env, gc.Equals, nil) 137 c.Check(err, gc.ErrorMatches, ".*malformed maas-oauth.*") 138 }