github.com/axw/juju@v0.0.0-20161005053422-4bd6544d08d4/provider/gce/google/conn_instance_test.go (about) 1 // Copyright 2014 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package google_test 5 6 import ( 7 "github.com/juju/errors" 8 jc "github.com/juju/testing/checkers" 9 "google.golang.org/api/compute/v1" 10 gc "gopkg.in/check.v1" 11 12 "github.com/juju/juju/provider/gce/google" 13 ) 14 15 func (s *connSuite) TestConnectionSimpleAddInstance(c *gc.C) { 16 s.FakeConn.Instance = &s.RawInstanceFull 17 18 inst := &s.RawInstance 19 zones := []string{"a-zone"} 20 err := google.ConnAddInstance(s.Conn, inst, "mtype", zones) 21 c.Assert(err, jc.ErrorIsNil) 22 23 c.Check(inst, jc.DeepEquals, &s.RawInstanceFull) 24 } 25 26 func (s *connSuite) TestConnectionSimpleAddInstanceAPI(c *gc.C) { 27 s.FakeConn.Instance = &s.RawInstanceFull 28 expected := s.RawInstance 29 expected.MachineType = "zones/a-zone/machineTypes/mtype" 30 31 inst := &s.RawInstance 32 zones := []string{"a-zone"} 33 err := google.ConnAddInstance(s.Conn, inst, "mtype", zones) 34 c.Assert(err, jc.ErrorIsNil) 35 36 c.Check(s.FakeConn.Calls, gc.HasLen, 2) 37 c.Check(s.FakeConn.Calls[0].FuncName, gc.Equals, "AddInstance") 38 c.Check(s.FakeConn.Calls[0].ProjectID, gc.Equals, "spam") 39 c.Check(s.FakeConn.Calls[0].ZoneName, gc.Equals, "a-zone") 40 c.Check(s.FakeConn.Calls[0].InstValue, gc.DeepEquals, expected) 41 c.Check(s.FakeConn.Calls[1].FuncName, gc.Equals, "GetInstance") 42 c.Check(s.FakeConn.Calls[1].ProjectID, gc.Equals, "spam") 43 c.Check(s.FakeConn.Calls[1].ZoneName, gc.Equals, "a-zone") 44 c.Check(s.FakeConn.Calls[1].ID, gc.Equals, "spam") 45 } 46 47 func (s *instanceSuite) TestConnectionAddInstance(c *gc.C) { 48 s.FakeConn.Instance = &s.RawInstanceFull 49 50 inst, err := s.Conn.AddInstance(s.InstanceSpec, "a-zone") 51 c.Assert(err, jc.ErrorIsNil) 52 53 c.Check(inst.ID, gc.Equals, "spam") 54 c.Check(inst.ZoneName, gc.Equals, "a-zone") 55 c.Check(inst.Status(), gc.Equals, google.StatusRunning) 56 c.Check(inst.Metadata(), jc.DeepEquals, s.Metadata) 57 c.Check(inst.Addresses(), jc.DeepEquals, s.Addresses) 58 spec := google.GetInstanceSpec(inst) 59 c.Check(spec, gc.DeepEquals, &s.InstanceSpec) 60 } 61 62 func (s *instanceSuite) TestConnectionAddInstanceAPI(c *gc.C) { 63 s.FakeConn.Instance = &s.RawInstanceFull 64 65 _, err := s.Conn.AddInstance(s.InstanceSpec, "a-zone") 66 c.Assert(err, jc.ErrorIsNil) 67 68 c.Check(s.FakeConn.Calls, gc.HasLen, 2) 69 c.Check(s.FakeConn.Calls[0].FuncName, gc.Equals, "AddInstance") 70 c.Check(s.FakeConn.Calls[0].ProjectID, gc.Equals, "spam") 71 // We check s.FakeConn.Calls[0].InstValue below. 72 c.Check(s.FakeConn.Calls[0].ZoneName, gc.Equals, "a-zone") 73 c.Check(s.FakeConn.Calls[1].FuncName, gc.Equals, "GetInstance") 74 c.Check(s.FakeConn.Calls[1].ProjectID, gc.Equals, "spam") 75 c.Check(s.FakeConn.Calls[1].ID, gc.Equals, "spam") 76 c.Check(s.FakeConn.Calls[1].ZoneName, gc.Equals, "a-zone") 77 78 metadata := compute.Metadata{Items: []*compute.MetadataItems{{ 79 Key: "eggs", 80 Value: "steak", 81 }}} 82 networkInterfaces := []*compute.NetworkInterface{{ 83 Network: "global/networks/somenetwork", 84 AccessConfigs: []*compute.AccessConfig{{ 85 Name: "somenetif", 86 Type: "ONE_TO_ONE_NAT", 87 }}, 88 }} 89 attachedDisks := []*compute.AttachedDisk{{ 90 Type: "PERSISTENT", 91 Boot: true, 92 Mode: "READ_WRITE", 93 AutoDelete: true, 94 InitializeParams: &compute.AttachedDiskInitializeParams{ 95 DiskSizeGb: 15, 96 SourceImage: "some/image/path", 97 }, 98 }} 99 c.Check(s.FakeConn.Calls[0].InstValue, gc.DeepEquals, compute.Instance{ 100 Name: "spam", 101 MachineType: "zones/a-zone/machineTypes/mtype", 102 Disks: attachedDisks, 103 NetworkInterfaces: networkInterfaces, 104 Metadata: &metadata, 105 Tags: &compute.Tags{Items: []string{"spam"}}, 106 }) 107 } 108 109 func (s *connSuite) TestConnectionAddInstanceFailed(c *gc.C) { 110 s.FakeConn.Instance = &s.RawInstanceFull 111 112 failure := errors.New("unknown") 113 s.FakeConn.Err = failure 114 115 zones := []string{"a-zone"} 116 err := google.ConnAddInstance(s.Conn, &s.RawInstance, "mtype", zones) 117 118 c.Check(errors.Cause(err), gc.Equals, failure) 119 } 120 121 func (s *connSuite) TestConnectionAddInstanceWaitFailed(c *gc.C) { 122 s.FakeConn.Instance = &s.RawInstanceFull 123 124 failure := s.NewWaitError(nil, errors.New("unknown")) 125 s.FakeConn.Err = failure 126 127 zones := []string{"a-zone"} 128 err := google.ConnAddInstance(s.Conn, &s.RawInstance, "mtype", zones) 129 130 c.Check(errors.Cause(err), gc.Equals, failure) 131 } 132 133 func (s *connSuite) TestConnectionAddInstanceGetFailed(c *gc.C) { 134 s.FakeConn.Instance = &s.RawInstanceFull 135 136 failure := errors.New("unknown") 137 s.FakeConn.Err = failure 138 s.FakeConn.FailOnCall = 1 139 140 zones := []string{"a-zone"} 141 err := google.ConnAddInstance(s.Conn, &s.RawInstance, "mtype", zones) 142 143 c.Check(errors.Cause(err), gc.Equals, failure) 144 c.Check(s.FakeConn.Calls, gc.HasLen, 2) 145 } 146 147 func (s *connSuite) TestConnectionInstance(c *gc.C) { 148 s.FakeConn.Instance = &s.RawInstanceFull 149 150 inst, err := s.Conn.Instance("spam", "a-zone") 151 c.Assert(err, jc.ErrorIsNil) 152 153 c.Check(inst.ID, gc.Equals, "spam") 154 c.Check(inst.ZoneName, gc.Equals, "a-zone") 155 c.Check(inst.Status(), gc.Equals, google.StatusRunning) 156 c.Check(inst.Metadata(), jc.DeepEquals, s.Metadata) 157 c.Check(inst.Addresses(), jc.DeepEquals, s.Addresses) 158 spec := google.GetInstanceSpec(&inst) 159 c.Check(spec, gc.IsNil) 160 } 161 162 func (s *connSuite) TestConnectionInstanceAPI(c *gc.C) { 163 s.FakeConn.Instance = &s.RawInstanceFull 164 165 _, err := s.Conn.Instance("ham", "a-zone") 166 c.Assert(err, jc.ErrorIsNil) 167 168 c.Check(s.FakeConn.Calls, gc.HasLen, 1) 169 c.Check(s.FakeConn.Calls[0].FuncName, gc.Equals, "GetInstance") 170 c.Check(s.FakeConn.Calls[0].ProjectID, gc.Equals, "spam") 171 c.Check(s.FakeConn.Calls[0].ID, gc.Equals, "ham") 172 c.Check(s.FakeConn.Calls[0].ZoneName, gc.Equals, "a-zone") 173 } 174 175 func (s *connSuite) TestConnectionInstanceFail(c *gc.C) { 176 failure := errors.New("<unknown>") 177 s.FakeConn.Err = failure 178 179 _, err := s.Conn.Instance("spam", "a-zone") 180 181 c.Check(errors.Cause(err), gc.Equals, failure) 182 } 183 184 func (s *connSuite) TestConnectionInstances(c *gc.C) { 185 s.FakeConn.Instances = []*compute.Instance{&s.RawInstanceFull} 186 187 insts, err := s.Conn.Instances("sp", google.StatusRunning) 188 c.Assert(err, jc.ErrorIsNil) 189 190 google.SetInstanceSpec(&s.Instance, nil) 191 c.Check(insts, jc.DeepEquals, []google.Instance{s.Instance}) 192 } 193 194 func (s *connSuite) TestConnectionInstancesFailure(c *gc.C) { 195 failure := errors.New("<unknown>") 196 s.FakeConn.Err = failure 197 _, err := s.Conn.Instances("sp", google.StatusRunning) 198 199 c.Check(errors.Cause(err), gc.Equals, failure) 200 } 201 202 func (s *connSuite) TestConnectionRemoveInstance(c *gc.C) { 203 err := google.ConnRemoveInstance(s.Conn, "spam", "a-zone") 204 205 c.Check(err, jc.ErrorIsNil) 206 } 207 208 func (s *connSuite) TestConnectionRemoveInstanceAPI(c *gc.C) { 209 err := google.ConnRemoveInstance(s.Conn, "spam", "a-zone") 210 c.Assert(err, jc.ErrorIsNil) 211 212 c.Check(s.FakeConn.Calls, gc.HasLen, 2) 213 c.Check(s.FakeConn.Calls[0].FuncName, gc.Equals, "RemoveInstance") 214 c.Check(s.FakeConn.Calls[0].ProjectID, gc.Equals, "spam") 215 c.Check(s.FakeConn.Calls[0].ZoneName, gc.Equals, "a-zone") 216 c.Check(s.FakeConn.Calls[0].ID, gc.Equals, "spam") 217 c.Check(s.FakeConn.Calls[1].FuncName, gc.Equals, "RemoveFirewall") 218 c.Check(s.FakeConn.Calls[1].ProjectID, gc.Equals, "spam") 219 c.Check(s.FakeConn.Calls[1].Name, gc.Equals, "spam") 220 } 221 222 func (s *connSuite) TestConnectionRemoveInstanceFailed(c *gc.C) { 223 failure := errors.New("<unknown>") 224 s.FakeConn.Err = failure 225 226 err := google.ConnRemoveInstance(s.Conn, "spam", "a-zone") 227 228 c.Check(errors.Cause(err), gc.Equals, failure) 229 } 230 231 func (s *connSuite) TestConnectionRemoveInstanceFirewallFailed(c *gc.C) { 232 failure := errors.New("<unknown>") 233 s.FakeConn.Err = failure 234 s.FakeConn.FailOnCall = 1 235 236 err := google.ConnRemoveInstance(s.Conn, "spam", "a-zone") 237 238 c.Check(errors.Cause(err), gc.Equals, failure) 239 c.Check(s.FakeConn.Calls, gc.HasLen, 2) 240 } 241 242 func (s *connSuite) TestConnectionRemoveInstances(c *gc.C) { 243 s.FakeConn.Instances = []*compute.Instance{&s.RawInstanceFull} 244 245 err := s.Conn.RemoveInstances("sp", "spam") 246 247 c.Check(err, jc.ErrorIsNil) 248 } 249 250 func (s *connSuite) TestConnectionRemoveInstancesAPI(c *gc.C) { 251 s.FakeConn.Instances = []*compute.Instance{&s.RawInstanceFull} 252 253 err := s.Conn.RemoveInstances("sp", "spam") 254 c.Assert(err, jc.ErrorIsNil) 255 256 c.Check(s.FakeConn.Calls, gc.HasLen, 3) 257 c.Check(s.FakeConn.Calls[0].FuncName, gc.Equals, "ListInstances") 258 c.Check(s.FakeConn.Calls[1].FuncName, gc.Equals, "RemoveInstance") 259 c.Check(s.FakeConn.Calls[1].ID, gc.Equals, "spam") 260 c.Check(s.FakeConn.Calls[2].FuncName, gc.Equals, "RemoveFirewall") 261 c.Check(s.FakeConn.Calls[2].Name, gc.Equals, "spam") 262 } 263 264 func (s *connSuite) TestConnectionRemoveInstancesMultiple(c *gc.C) { 265 s.FakeConn.Instances = []*compute.Instance{ 266 &s.RawInstanceFull, 267 &compute.Instance{ 268 Name: "special", 269 Zone: "a-zone", 270 }, 271 } 272 273 err := s.Conn.RemoveInstances("", "spam", "special") 274 c.Assert(err, jc.ErrorIsNil) 275 276 c.Check(s.FakeConn.Calls, gc.HasLen, 5) 277 c.Check(s.FakeConn.Calls[0].FuncName, gc.Equals, "ListInstances") 278 c.Check(s.FakeConn.Calls[1].FuncName, gc.Equals, "RemoveInstance") 279 c.Check(s.FakeConn.Calls[1].ID, gc.Equals, "spam") 280 c.Check(s.FakeConn.Calls[2].FuncName, gc.Equals, "RemoveFirewall") 281 c.Check(s.FakeConn.Calls[2].Name, gc.Equals, "spam") 282 c.Check(s.FakeConn.Calls[3].FuncName, gc.Equals, "RemoveInstance") 283 c.Check(s.FakeConn.Calls[3].ID, gc.Equals, "special") 284 c.Check(s.FakeConn.Calls[4].FuncName, gc.Equals, "RemoveFirewall") 285 c.Check(s.FakeConn.Calls[4].Name, gc.Equals, "special") 286 } 287 288 func (s *connSuite) TestConnectionRemoveInstancesPartialMatch(c *gc.C) { 289 s.FakeConn.Instances = []*compute.Instance{ 290 &s.RawInstanceFull, 291 &compute.Instance{ 292 Name: "special", 293 Zone: "a-zone", 294 }, 295 } 296 297 err := s.Conn.RemoveInstances("", "spam") 298 c.Assert(err, jc.ErrorIsNil) 299 300 c.Check(s.FakeConn.Calls, gc.HasLen, 3) 301 c.Check(s.FakeConn.Calls[0].FuncName, gc.Equals, "ListInstances") 302 c.Check(s.FakeConn.Calls[1].FuncName, gc.Equals, "RemoveInstance") 303 c.Check(s.FakeConn.Calls[1].ID, gc.Equals, "spam") 304 c.Check(s.FakeConn.Calls[2].FuncName, gc.Equals, "RemoveFirewall") 305 c.Check(s.FakeConn.Calls[2].Name, gc.Equals, "spam") 306 } 307 308 func (s *connSuite) TestConnectionRemoveInstancesListFailed(c *gc.C) { 309 failure := errors.New("<unknown>") 310 s.FakeConn.Err = failure 311 312 err := s.Conn.RemoveInstances("sp", "spam") 313 314 c.Check(errors.Cause(err), gc.Equals, failure) 315 } 316 317 func (s *connSuite) TestConnectionRemoveInstancesRemoveFailed(c *gc.C) { 318 s.FakeConn.Instances = []*compute.Instance{&s.RawInstanceFull} 319 failure := errors.New("<unknown>") 320 s.FakeConn.Err = failure 321 s.FakeConn.FailOnCall = 2 322 323 err := s.Conn.RemoveInstances("sp", "spam") 324 325 c.Check(err, gc.ErrorMatches, ".*some instance removals failed: .*") 326 }