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

     1  // Copyright 2012 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package manual
     5  
     6  import (
     7  	"errors"
     8  	"strings"
     9  
    10  	jc "github.com/juju/testing/checkers"
    11  	gc "launchpad.net/gocheck"
    12  
    13  	"github.com/juju/juju/constraints"
    14  	"github.com/juju/juju/environs"
    15  	"github.com/juju/juju/environs/manual"
    16  	"github.com/juju/juju/environs/storage"
    17  	"github.com/juju/juju/environs/tools"
    18  	"github.com/juju/juju/instance"
    19  	"github.com/juju/juju/juju/arch"
    20  	coretesting "github.com/juju/juju/testing"
    21  )
    22  
    23  type environSuite struct {
    24  	coretesting.FakeJujuHomeSuite
    25  	env *manualEnviron
    26  }
    27  
    28  type dummyStorage struct {
    29  	storage.Storage
    30  }
    31  
    32  var _ = gc.Suite(&environSuite{})
    33  
    34  func (s *environSuite) SetUpTest(c *gc.C) {
    35  	s.FakeJujuHomeSuite.SetUpTest(c)
    36  	env, err := manualProvider{}.Open(MinimalConfig(c))
    37  	c.Assert(err, gc.IsNil)
    38  	s.env = env.(*manualEnviron)
    39  }
    40  
    41  func (s *environSuite) TestSetConfig(c *gc.C) {
    42  	err := s.env.SetConfig(MinimalConfig(c))
    43  	c.Assert(err, gc.IsNil)
    44  
    45  	testConfig := MinimalConfig(c)
    46  	testConfig, err = testConfig.Apply(map[string]interface{}{"bootstrap-host": ""})
    47  	c.Assert(err, gc.IsNil)
    48  	err = s.env.SetConfig(testConfig)
    49  	c.Assert(err, gc.ErrorMatches, "bootstrap-host must be specified")
    50  }
    51  
    52  func (s *environSuite) TestInstances(c *gc.C) {
    53  	var ids []instance.Id
    54  
    55  	instances, err := s.env.Instances(ids)
    56  	c.Assert(err, gc.Equals, environs.ErrNoInstances)
    57  	c.Assert(instances, gc.HasLen, 0)
    58  
    59  	ids = append(ids, manual.BootstrapInstanceId)
    60  	instances, err = s.env.Instances(ids)
    61  	c.Assert(err, gc.IsNil)
    62  	c.Assert(instances, gc.HasLen, 1)
    63  	c.Assert(instances[0], gc.NotNil)
    64  
    65  	ids = append(ids, manual.BootstrapInstanceId)
    66  	instances, err = s.env.Instances(ids)
    67  	c.Assert(err, gc.IsNil)
    68  	c.Assert(instances, gc.HasLen, 2)
    69  	c.Assert(instances[0], gc.NotNil)
    70  	c.Assert(instances[1], gc.NotNil)
    71  
    72  	ids = append(ids, instance.Id("invalid"))
    73  	instances, err = s.env.Instances(ids)
    74  	c.Assert(err, gc.Equals, environs.ErrPartialInstances)
    75  	c.Assert(instances, gc.HasLen, 3)
    76  	c.Assert(instances[0], gc.NotNil)
    77  	c.Assert(instances[1], gc.NotNil)
    78  	c.Assert(instances[2], gc.IsNil)
    79  
    80  	ids = []instance.Id{instance.Id("invalid")}
    81  	instances, err = s.env.Instances(ids)
    82  	c.Assert(err, gc.Equals, environs.ErrNoInstances)
    83  	c.Assert(instances, gc.HasLen, 1)
    84  	c.Assert(instances[0], gc.IsNil)
    85  }
    86  
    87  func (s *environSuite) TestDestroy(c *gc.C) {
    88  	var resultStderr string
    89  	var resultErr error
    90  	runSSHCommandTesting := func(host string, command []string, stdin string) (string, error) {
    91  		c.Assert(host, gc.Equals, "ubuntu@hostname")
    92  		c.Assert(command, gc.DeepEquals, []string{"sudo", "/bin/bash"})
    93  		c.Assert(stdin, gc.DeepEquals, `
    94  set -x
    95  pkill -6 jujud && exit
    96  stop juju-db
    97  rm -f /etc/init/juju*
    98  rm -f /etc/rsyslog.d/*juju*
    99  rm -fr '/var/lib/juju' '/var/log/juju'
   100  exit 0
   101  `)
   102  		return resultStderr, resultErr
   103  	}
   104  	s.PatchValue(&runSSHCommand, runSSHCommandTesting)
   105  	type test struct {
   106  		stderr string
   107  		err    error
   108  		match  string
   109  	}
   110  	tests := []test{
   111  		{"", nil, ""},
   112  		{"abc", nil, ""},
   113  		{"", errors.New("oh noes"), "oh noes"},
   114  		{"123", errors.New("abc"), "abc \\(123\\)"},
   115  	}
   116  	for i, t := range tests {
   117  		c.Logf("test %d: %v", i, t)
   118  		resultStderr, resultErr = t.stderr, t.err
   119  		err := s.env.Destroy()
   120  		if t.match == "" {
   121  			c.Assert(err, gc.IsNil)
   122  		} else {
   123  			c.Assert(err, gc.ErrorMatches, t.match)
   124  		}
   125  	}
   126  }
   127  
   128  func (s *environSuite) TestLocalStorageConfig(c *gc.C) {
   129  	c.Assert(s.env.StorageDir(), gc.Equals, "/var/lib/juju/storage")
   130  	c.Assert(s.env.cfg.storageListenAddr(), gc.Equals, ":8040")
   131  	c.Assert(s.env.StorageAddr(), gc.Equals, s.env.cfg.storageListenAddr())
   132  	c.Assert(s.env.SharedStorageAddr(), gc.Equals, "")
   133  	c.Assert(s.env.SharedStorageDir(), gc.Equals, "")
   134  }
   135  
   136  func (s *environSuite) TestEnvironSupportsCustomSources(c *gc.C) {
   137  	sources, err := tools.GetMetadataSources(s.env)
   138  	c.Assert(err, gc.IsNil)
   139  	c.Assert(len(sources), gc.Equals, 2)
   140  	url, err := sources[0].URL("")
   141  	c.Assert(err, gc.IsNil)
   142  	c.Assert(strings.Contains(url, "/tools"), jc.IsTrue)
   143  }
   144  
   145  func (s *environSuite) TestSupportedArchitectures(c *gc.C) {
   146  	arches, err := s.env.SupportedArchitectures()
   147  	c.Assert(err, gc.IsNil)
   148  	c.Assert(arches, gc.DeepEquals, arch.AllSupportedArches)
   149  }
   150  
   151  func (s *environSuite) TestSupportNetworks(c *gc.C) {
   152  	c.Assert(s.env.SupportNetworks(), jc.IsFalse)
   153  }
   154  
   155  func (s *environSuite) TestConstraintsValidator(c *gc.C) {
   156  	validator, err := s.env.ConstraintsValidator()
   157  	c.Assert(err, gc.IsNil)
   158  	cons := constraints.MustParse("arch=amd64 instance-type=foo tags=bar cpu-power=10 cpu-cores=2 mem=1G")
   159  	unsupported, err := validator.Validate(cons)
   160  	c.Assert(err, gc.IsNil)
   161  	c.Assert(unsupported, jc.SameContents, []string{"cpu-power", "instance-type", "tags"})
   162  }