github.com/cloud-green/juju@v0.0.0-20151002100041-a00291338d3d/provider/cloudsigma/client_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 "fmt" 8 "strings" 9 "time" 10 11 "github.com/altoros/gosigma" 12 "github.com/altoros/gosigma/data" 13 "github.com/altoros/gosigma/mock" 14 "github.com/juju/loggo" 15 "github.com/juju/utils" 16 gc "gopkg.in/check.v1" 17 18 "github.com/juju/juju/cloudconfig/instancecfg" 19 "github.com/juju/juju/constraints" 20 "github.com/juju/juju/environs" 21 "github.com/juju/juju/environs/imagemetadata" 22 "github.com/juju/juju/instance" 23 "github.com/juju/juju/testing" 24 "github.com/juju/juju/tools" 25 "github.com/juju/juju/version" 26 ) 27 28 type clientSuite struct { 29 testing.BaseSuite 30 } 31 32 var _ = gc.Suite(&clientSuite{}) 33 34 func (s *clientSuite) SetUpSuite(c *gc.C) { 35 s.BaseSuite.SetUpSuite(c) 36 mock.Start() 37 } 38 39 func (s *clientSuite) TearDownSuite(c *gc.C) { 40 mock.Stop() 41 s.BaseSuite.TearDownSuite(c) 42 } 43 44 func (s *clientSuite) SetUpTest(c *gc.C) { 45 s.BaseSuite.SetUpTest(c) 46 47 ll := logger.LogLevel() 48 logger.SetLogLevel(loggo.TRACE) 49 s.AddCleanup(func(*gc.C) { logger.SetLogLevel(ll) }) 50 51 mock.Reset() 52 } 53 54 func (s *clientSuite) TearDownTest(c *gc.C) { 55 s.BaseSuite.TearDownTest(c) 56 } 57 58 func testNewClient(c *gc.C, endpoint, username, password string) (*environClient, error) { 59 ecfg := &environConfig{ 60 Config: newConfig(c, testing.Attrs{"name": "client-test", "uuid": "f54aac3a-9dcd-4a0c-86b5-24091478478c"}), 61 attrs: map[string]interface{}{ 62 "region": endpoint, 63 "username": username, 64 "password": password, 65 }, 66 } 67 return newClient(ecfg) 68 } 69 70 func addTestClientServer(c *gc.C, instance, env string) string { 71 json := `{"meta": {` 72 if instance != "" { 73 json += fmt.Sprintf(`"juju-instance": "%s"`, instance) 74 if env != "" { 75 json += fmt.Sprintf(`, "juju-environment": "%s"`, env) 76 } 77 } 78 json += `}, "status": "running"}` 79 r := strings.NewReader(json) 80 s, err := data.ReadServer(r) 81 c.Assert(err, gc.IsNil) 82 mock.AddServer(s) 83 return s.UUID 84 } 85 86 func (s *clientSuite) TestClientInstances(c *gc.C) { 87 addTestClientServer(c, "", "") 88 addTestClientServer(c, jujuMetaInstanceServer, "alien") 89 addTestClientServer(c, jujuMetaInstanceStateServer, "alien") 90 addTestClientServer(c, jujuMetaInstanceServer, "f54aac3a-9dcd-4a0c-86b5-24091478478c") 91 addTestClientServer(c, jujuMetaInstanceServer, "f54aac3a-9dcd-4a0c-86b5-24091478478c") 92 suuid := addTestClientServer(c, jujuMetaInstanceStateServer, "f54aac3a-9dcd-4a0c-86b5-24091478478c") 93 94 cli, err := testNewClient(c, mock.Endpoint(""), mock.TestUser, mock.TestPassword) 95 c.Assert(err, gc.IsNil) 96 97 ss, err := cli.instances() 98 c.Assert(err, gc.IsNil) 99 c.Assert(ss, gc.NotNil) 100 c.Check(ss, gc.HasLen, 3) 101 102 sm, err := cli.instanceMap() 103 c.Assert(err, gc.IsNil) 104 c.Assert(sm, gc.NotNil) 105 c.Check(sm, gc.HasLen, 3) 106 107 ids, err := cli.getStateServerIds() 108 c.Check(err, gc.IsNil) 109 c.Check(len(ids), gc.Equals, 1) 110 c.Check(string(ids[0]), gc.Equals, suuid) 111 } 112 113 func (s *clientSuite) TestClientStopStateInstance(c *gc.C) { 114 addTestClientServer(c, "", "") 115 116 addTestClientServer(c, jujuMetaInstanceServer, "alien") 117 addTestClientServer(c, jujuMetaInstanceStateServer, "alien") 118 addTestClientServer(c, jujuMetaInstanceServer, "client-test") 119 suuid := addTestClientServer(c, jujuMetaInstanceStateServer, "client-test") 120 121 cli, err := testNewClient(c, mock.Endpoint(""), mock.TestUser, mock.TestPassword) 122 c.Assert(err, gc.IsNil) 123 124 err = cli.stopInstance(instance.Id(suuid)) 125 c.Assert(err, gc.IsNil) 126 127 _, err = cli.getStateServerIds() 128 c.Check(err, gc.Equals, environs.ErrNotBootstrapped) 129 } 130 131 func (s *clientSuite) TestClientInvalidStopInstance(c *gc.C) { 132 cli, err := testNewClient(c, mock.Endpoint(""), mock.TestUser, mock.TestPassword) 133 c.Assert(err, gc.IsNil) 134 135 var id instance.Id 136 err = cli.stopInstance(id) 137 c.Check(err, gc.ErrorMatches, "invalid instance id") 138 139 err = cli.stopInstance("1234") 140 c.Check(err, gc.ErrorMatches, "404 Not Found.*") 141 } 142 143 func (s *clientSuite) TestClientInvalidServer(c *gc.C) { 144 cli, err := testNewClient(c, "https://testing.invalid", mock.TestUser, mock.TestPassword) 145 c.Assert(err, gc.IsNil) 146 147 cli.conn.ConnectTimeout(10 * time.Millisecond) 148 149 err = cli.stopInstance("1234") 150 c.Check(err, gc.ErrorMatches, "broken connection") 151 152 _, err = cli.instanceMap() 153 c.Check(err, gc.ErrorMatches, "broken connection") 154 155 _, err = cli.getStateServerIds() 156 c.Check(err, gc.ErrorMatches, "broken connection") 157 } 158 159 func (s *clientSuite) TestClientNewInstanceInvalidParams(c *gc.C) { 160 cli, err := testNewClient(c, mock.Endpoint(""), mock.TestUser, mock.TestPassword) 161 c.Assert(err, gc.IsNil) 162 163 params := environs.StartInstanceParams{ 164 Constraints: constraints.Value{}, 165 } 166 img := &imagemetadata.ImageMetadata{ 167 Id: validImageId, 168 } 169 server, drive, arch, err := cli.newInstance(params, img, nil) 170 c.Check(server, gc.IsNil) 171 c.Check(arch, gc.Equals, "") 172 c.Check(drive, gc.IsNil) 173 c.Check(err, gc.ErrorMatches, "invalid configuration for new instance: InstanceConfig is nil") 174 } 175 176 func (s *clientSuite) TestClientNewInstanceInvalidTemplate(c *gc.C) { 177 cli, err := testNewClient(c, mock.Endpoint(""), mock.TestUser, mock.TestPassword) 178 c.Assert(err, gc.IsNil) 179 180 params := environs.StartInstanceParams{ 181 Constraints: constraints.Value{}, 182 InstanceConfig: &instancecfg.InstanceConfig{ 183 Bootstrap: true, 184 Tools: &tools.Tools{ 185 Version: version.Binary{ 186 Series: "trusty", 187 }, 188 }, 189 }, 190 } 191 img := &imagemetadata.ImageMetadata{ 192 Id: "invalid-id", 193 } 194 server, drive, arch, err := cli.newInstance(params, img, nil) 195 c.Check(server, gc.IsNil) 196 c.Check(arch, gc.Equals, "") 197 c.Check(drive, gc.IsNil) 198 c.Check(err, gc.ErrorMatches, "Failed to query drive template: 404 Not Found, notexist, notfound") 199 } 200 201 func (s *clientSuite) TestClientNewInstance(c *gc.C) { 202 cli, err := testNewClient(c, mock.Endpoint(""), mock.TestUser, mock.TestPassword) 203 c.Assert(err, gc.IsNil) 204 205 cli.conn.OperationTimeout(1 * time.Second) 206 207 params := environs.StartInstanceParams{ 208 Constraints: constraints.Value{}, 209 InstanceConfig: &instancecfg.InstanceConfig{ 210 Bootstrap: true, 211 Tools: &tools.Tools{ 212 Version: version.Binary{ 213 Series: "trusty", 214 }, 215 }, 216 }, 217 } 218 img := &imagemetadata.ImageMetadata{ 219 Id: validImageId, 220 } 221 cs := newConstraints(params.InstanceConfig.Bootstrap, params.Constraints, img) 222 c.Assert(cs, gc.NotNil) 223 c.Check(err, gc.IsNil) 224 225 templateDrive := &data.Drive{ 226 Resource: data.Resource{URI: "uri", UUID: cs.driveTemplate}, 227 LibraryDrive: data.LibraryDrive{ 228 Arch: "64", 229 ImageType: "image-type", 230 OS: "os", 231 Paid: true, 232 }, 233 Size: 2200 * gosigma.Megabyte, 234 Status: "unmounted", 235 } 236 mock.ResetDrives() 237 mock.LibDrives.Add(templateDrive) 238 239 server, drive, arch, err := cli.newInstance(params, img, utils.Gzip([]byte{})) 240 c.Check(server, gc.NotNil) 241 c.Check(drive, gc.NotNil) 242 c.Check(arch, gc.NotNil) 243 c.Check(err, gc.IsNil) 244 }