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  }