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