1
// Copyright 2015 Canonical Ltd.
2
// Licensed under the AGPLv3, see LICENCE file for details.
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"
16
"github.com/juju/juju/cloudconfig/instancecfg"
17
"github.com/juju/juju/environs"
18
"github.com/juju/juju/environs/config"
19
"github.com/juju/juju/environs/imagemetadata"
20
"github.com/juju/juju/instance"
21
"github.com/juju/juju/testing"
22
"github.com/juju/juju/tools"
25
type environInstanceSuite struct {
27
cloud environs.CloudSpec
28
baseConfig *config.Config
31
var _ = gc.Suite(&environInstanceSuite{})
33
func (s *environInstanceSuite) SetUpSuite(c *gc.C) {
34
s.BaseSuite.SetUpSuite(c)
38
s.cloud = fakeCloudSpec()
39
s.cloud.Endpoint = mock.Endpoint("")
41
attrs := testing.Attrs{
43
"uuid": "f54aac3a-9dcd-4a0c-86b5-24091478478c",
45
s.baseConfig = newConfig(c, validAttrs().Merge(attrs))
48
func (s *environInstanceSuite) TearDownSuite(c *gc.C) {
50
s.BaseSuite.TearDownSuite(c)
53
func (s *environInstanceSuite) SetUpTest(c *gc.C) {
54
s.BaseSuite.SetUpTest(c)
56
ll := logger.LogLevel()
57
logger.SetLogLevel(loggo.TRACE)
58
s.AddCleanup(func(*gc.C) { logger.SetLogLevel(ll) })
63
func (s *environInstanceSuite) TearDownTest(c *gc.C) {
65
s.BaseSuite.TearDownTest(c)
68
func (s *environInstanceSuite) createEnviron(c *gc.C, cfg *config.Config) environs.Environ {
69
s.PatchValue(&findInstanceImage, func([]*imagemetadata.ImageMetadata) (*imagemetadata.ImageMetadata, error) {
70
img := &imagemetadata.ImageMetadata{
79
environ, err := environs.New(environs.OpenParams{
84
c.Assert(err, gc.IsNil)
85
c.Assert(environ, gc.NotNil)
89
func (s *environInstanceSuite) TestInstances(c *gc.C) {
90
env := s.createEnviron(c, nil)
92
instances, err := env.AllInstances()
93
c.Assert(instances, gc.NotNil)
94
c.Assert(err, gc.IsNil)
95
c.Check(instances, gc.HasLen, 0)
97
uuid0 := addTestClientServer(c, jujuMetaInstanceServer, "f54aac3a-9dcd-4a0c-86b5-24091478478c")
98
uuid1 := addTestClientServer(c, jujuMetaInstanceController, "f54aac3a-9dcd-4a0c-86b5-24091478478c")
99
addTestClientServer(c, jujuMetaInstanceServer, "other-model")
100
addTestClientServer(c, jujuMetaInstanceController, "other-model")
102
instances, err = env.AllInstances()
103
c.Assert(instances, gc.NotNil)
104
c.Assert(err, gc.IsNil)
105
c.Check(instances, gc.HasLen, 2)
107
ids := []instance.Id{instance.Id(uuid0), instance.Id(uuid1)}
108
instances, err = env.Instances(ids)
109
c.Assert(instances, gc.NotNil)
110
c.Assert(err, gc.IsNil)
111
c.Check(instances, gc.HasLen, 2)
113
ids = append(ids, instance.Id("fake-instance"))
114
instances, err = env.Instances(ids)
115
c.Assert(instances, gc.NotNil)
116
c.Assert(errors.Cause(err), gc.Equals, environs.ErrPartialInstances)
117
c.Check(instances, gc.HasLen, 3)
118
c.Check(instances[0], gc.NotNil)
119
c.Check(instances[1], gc.NotNil)
120
c.Check(instances[2], gc.IsNil)
122
err = env.StopInstances(ids...)
123
c.Assert(err, gc.ErrorMatches, "404 Not Found.*")
125
instances, err = env.Instances(ids)
126
c.Assert(instances, gc.NotNil)
127
c.Assert(errors.Cause(err), gc.Equals, environs.ErrNoInstances)
128
c.Check(instances, gc.HasLen, 3)
129
c.Check(instances[0], gc.IsNil)
130
c.Check(instances[1], gc.IsNil)
131
c.Check(instances[2], gc.IsNil)
134
func (s *environInstanceSuite) TestInstancesFail(c *gc.C) {
136
newClientFunc := newClient
137
s.PatchValue(&newClient, func(spec environs.CloudSpec, uuid string) (*environClient, error) {
138
spec.Endpoint = "https://0.1.2.3:2000/api/2.0/"
139
cli, err := newClientFunc(spec, uuid)
141
cli.conn.ConnectTimeout(10 * time.Millisecond)
146
environ := s.createEnviron(c, nil)
148
instances, err := environ.AllInstances()
149
c.Assert(instances, gc.IsNil)
150
c.Assert(err, gc.NotNil)
152
instances, err = environ.Instances([]instance.Id{instance.Id("123"), instance.Id("321")})
153
c.Assert(instances, gc.IsNil)
154
c.Assert(err, gc.NotNil)
157
func (s *environInstanceSuite) TestStartInstanceError(c *gc.C) {
158
environ := s.createEnviron(c, nil)
160
res, err := environ.StartInstance(environs.StartInstanceParams{})
161
c.Check(res, gc.IsNil)
162
c.Check(err, gc.ErrorMatches, "instance configuration is nil")
164
toolsVal := &tools.Tools{
165
Version: version.Binary{
168
URL: "https://0.1.2.3:2000/x.y.z.tgz",
171
res, err = environ.StartInstance(environs.StartInstanceParams{
172
InstanceConfig: &instancecfg.InstanceConfig{},
174
c.Check(res, gc.IsNil)
175
c.Check(err, gc.ErrorMatches, "tools not found")
177
icfg := &instancecfg.InstanceConfig{}
178
err = icfg.SetTools(tools.List{toolsVal})
179
c.Assert(err, jc.ErrorIsNil)
180
res, err = environ.StartInstance(environs.StartInstanceParams{
181
Tools: tools.List{toolsVal},
182
InstanceConfig: icfg,
184
c.Check(res, gc.IsNil)
185
c.Check(err, gc.ErrorMatches, "cannot make user data: series \"\" not valid")