github.com/cloud-green/juju@v0.0.0-20151002100041-a00291338d3d/provider/cloudsigma/environinstance_test.go (about)

     1  // Copyright 2015 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package cloudsigma
     5  
     6  import (
     7  	"time"
     8  
     9  	"github.com/altoros/gosigma/mock"
    10  	"github.com/juju/loggo"
    11  	gc "gopkg.in/check.v1"
    12  
    13  	"github.com/juju/juju/cloudconfig/instancecfg"
    14  	"github.com/juju/juju/environs"
    15  	"github.com/juju/juju/environs/config"
    16  	"github.com/juju/juju/environs/imagemetadata"
    17  	"github.com/juju/juju/instance"
    18  	"github.com/juju/juju/testing"
    19  	"github.com/juju/juju/tools"
    20  	"github.com/juju/juju/version"
    21  )
    22  
    23  type environInstanceSuite struct {
    24  	testing.BaseSuite
    25  	baseConfig *config.Config
    26  }
    27  
    28  var _ = gc.Suite(&environInstanceSuite{})
    29  
    30  func (s *environInstanceSuite) SetUpSuite(c *gc.C) {
    31  	s.BaseSuite.SetUpSuite(c)
    32  
    33  	mock.Start()
    34  
    35  	attrs := testing.Attrs{
    36  		"name":     "testname",
    37  		"uuid":     "f54aac3a-9dcd-4a0c-86b5-24091478478c",
    38  		"region":   mock.Endpoint(""),
    39  		"username": mock.TestUser,
    40  		"password": mock.TestPassword,
    41  	}
    42  	s.baseConfig = newConfig(c, validAttrs().Merge(attrs))
    43  }
    44  
    45  func (s *environInstanceSuite) TearDownSuite(c *gc.C) {
    46  	mock.Stop()
    47  	s.BaseSuite.TearDownSuite(c)
    48  }
    49  
    50  func (s *environInstanceSuite) SetUpTest(c *gc.C) {
    51  	s.BaseSuite.SetUpTest(c)
    52  
    53  	ll := logger.LogLevel()
    54  	logger.SetLogLevel(loggo.TRACE)
    55  	s.AddCleanup(func(*gc.C) { logger.SetLogLevel(ll) })
    56  
    57  	mock.Reset()
    58  }
    59  
    60  func (s *environInstanceSuite) TearDownTest(c *gc.C) {
    61  	mock.Reset()
    62  	s.BaseSuite.TearDownTest(c)
    63  }
    64  
    65  func (s *environInstanceSuite) createEnviron(c *gc.C, cfg *config.Config) environs.Environ {
    66  	s.PatchValue(&findInstanceImage, func(env *environ, ic *imagemetadata.ImageConstraint) (*imagemetadata.ImageMetadata, error) {
    67  		img := &imagemetadata.ImageMetadata{
    68  			Id: validImageId,
    69  		}
    70  		return img, nil
    71  	})
    72  	if cfg == nil {
    73  		cfg = s.baseConfig
    74  	}
    75  	environ, err := environs.New(cfg)
    76  
    77  	c.Assert(err, gc.IsNil)
    78  	c.Assert(environ, gc.NotNil)
    79  	return environ
    80  }
    81  
    82  func (s *environInstanceSuite) TestInstances(c *gc.C) {
    83  	env := s.createEnviron(c, nil)
    84  
    85  	instances, err := env.AllInstances()
    86  	c.Assert(instances, gc.NotNil)
    87  	c.Assert(err, gc.IsNil)
    88  	c.Check(instances, gc.HasLen, 0)
    89  
    90  	uuid0 := addTestClientServer(c, jujuMetaInstanceServer, "f54aac3a-9dcd-4a0c-86b5-24091478478c")
    91  	uuid1 := addTestClientServer(c, jujuMetaInstanceStateServer, "f54aac3a-9dcd-4a0c-86b5-24091478478c")
    92  	addTestClientServer(c, jujuMetaInstanceServer, "other-env")
    93  	addTestClientServer(c, jujuMetaInstanceStateServer, "other-env")
    94  
    95  	instances, err = env.AllInstances()
    96  	c.Assert(instances, gc.NotNil)
    97  	c.Assert(err, gc.IsNil)
    98  	c.Check(instances, gc.HasLen, 2)
    99  
   100  	ids := []instance.Id{instance.Id(uuid0), instance.Id(uuid1)}
   101  	instances, err = env.Instances(ids)
   102  	c.Assert(instances, gc.NotNil)
   103  	c.Assert(err, gc.IsNil)
   104  	c.Check(instances, gc.HasLen, 2)
   105  
   106  	ids = append(ids, instance.Id("fake-instance"))
   107  	instances, err = env.Instances(ids)
   108  	c.Assert(instances, gc.NotNil)
   109  	c.Assert(err, gc.Equals, environs.ErrPartialInstances)
   110  	c.Check(instances, gc.HasLen, 3)
   111  	c.Check(instances[0], gc.NotNil)
   112  	c.Check(instances[1], gc.NotNil)
   113  	c.Check(instances[2], gc.IsNil)
   114  
   115  	err = env.StopInstances(ids...)
   116  	c.Assert(err, gc.ErrorMatches, "404 Not Found.*")
   117  
   118  	instances, err = env.Instances(ids)
   119  	c.Assert(instances, gc.NotNil)
   120  	c.Assert(err, gc.Equals, environs.ErrNoInstances)
   121  	c.Check(instances, gc.HasLen, 3)
   122  	c.Check(instances[0], gc.IsNil)
   123  	c.Check(instances[1], gc.IsNil)
   124  	c.Check(instances[2], gc.IsNil)
   125  }
   126  
   127  func (s *environInstanceSuite) TestInstancesFail(c *gc.C) {
   128  	attrs := testing.Attrs{
   129  		"name":     "testname",
   130  		"region":   "https://0.1.2.3:2000/api/2.0/",
   131  		"username": mock.TestUser,
   132  		"password": mock.TestPassword,
   133  	}
   134  	baseConfig := newConfig(c, validAttrs().Merge(attrs))
   135  
   136  	newClientFunc := newClient
   137  	s.PatchValue(&newClient, func(cfg *environConfig) (*environClient, error) {
   138  		cli, err := newClientFunc(cfg)
   139  		if cli != nil {
   140  			cli.conn.ConnectTimeout(10 * time.Millisecond)
   141  		}
   142  		return cli, err
   143  	})
   144  
   145  	environ := s.createEnviron(c, baseConfig)
   146  
   147  	instances, err := environ.AllInstances()
   148  	c.Assert(instances, gc.IsNil)
   149  	c.Assert(err, gc.NotNil)
   150  
   151  	instances, err = environ.Instances([]instance.Id{instance.Id("123"), instance.Id("321")})
   152  	c.Assert(instances, gc.IsNil)
   153  	c.Assert(err, gc.NotNil)
   154  }
   155  
   156  func (s *environInstanceSuite) TestStartInstanceError(c *gc.C) {
   157  	environ := s.createEnviron(c, nil)
   158  
   159  	res, err := environ.StartInstance(environs.StartInstanceParams{})
   160  	c.Check(res, gc.IsNil)
   161  	c.Check(err, gc.ErrorMatches, "instance configuration is nil")
   162  
   163  	toolsVal := &tools.Tools{
   164  		Version: version.Binary{
   165  			Series: "trusty",
   166  		},
   167  	}
   168  	res, err = environ.StartInstance(environs.StartInstanceParams{
   169  		InstanceConfig: &instancecfg.InstanceConfig{
   170  			Networks: []string{"value"},
   171  			Tools:    toolsVal,
   172  		},
   173  	})
   174  	c.Check(res, gc.IsNil)
   175  	c.Check(err, gc.ErrorMatches, "starting instances with networks is not supported yet")
   176  
   177  	res, err = environ.StartInstance(environs.StartInstanceParams{
   178  		InstanceConfig: &instancecfg.InstanceConfig{},
   179  	})
   180  	c.Check(res, gc.IsNil)
   181  	c.Check(err, gc.ErrorMatches, "tools not found")
   182  
   183  	res, err = environ.StartInstance(environs.StartInstanceParams{
   184  		Tools:          tools.List{toolsVal},
   185  		InstanceConfig: &instancecfg.InstanceConfig{Tools: toolsVal},
   186  	})
   187  	c.Check(res, gc.IsNil)
   188  	c.Check(err, gc.ErrorMatches, "cannot make user data: series \"\" not valid")
   189  }