github.com/Pankov404/juju@v0.0.0-20150703034450-be266991dceb/provider/gce/google/testing_test.go (about) 1 // Copyright 2014 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package google 5 6 import ( 7 "google.golang.org/api/compute/v1" 8 gc "gopkg.in/check.v1" 9 10 "github.com/juju/juju/network" 11 "github.com/juju/juju/testing" 12 ) 13 14 type BaseSuite struct { 15 testing.BaseSuite 16 17 Credentials *Credentials 18 ConnCfg ConnectionConfig 19 Conn *Connection 20 FakeConn *fakeConn 21 22 DiskSpec DiskSpec 23 AttachedDisk compute.AttachedDisk 24 NetworkSpec NetworkSpec 25 NetworkInterface compute.NetworkInterface 26 Addresses []network.Address 27 RawMetadata compute.Metadata 28 Metadata map[string]string 29 RawInstance compute.Instance 30 RawInstanceFull compute.Instance 31 InstanceSpec InstanceSpec 32 Instance Instance 33 } 34 35 var _ = gc.Suite(&BaseSuite{}) 36 37 func (s *BaseSuite) SetUpTest(c *gc.C) { 38 s.BaseSuite.SetUpTest(c) 39 40 s.Credentials = &Credentials{ 41 ClientID: "spam", 42 ClientEmail: "user@mail.com", 43 PrivateKey: []byte("<some-key>"), 44 JSONKey: []byte(` 45 { 46 "private_key_id": "mnopq", 47 "private_key": "<some-key>", 48 "client_email": "user@mail.com", 49 "client_id": "spam", 50 "type": "service_account" 51 }`[1:]), 52 } 53 s.ConnCfg = ConnectionConfig{ 54 Region: "a", 55 ProjectID: "spam", 56 } 57 fake := &fakeConn{} 58 s.Conn = &Connection{ 59 raw: fake, 60 region: "a", 61 projectID: "spam", 62 } 63 s.FakeConn = fake 64 65 s.DiskSpec = DiskSpec{ 66 SizeHintGB: 15, 67 ImageURL: "some/image/path", 68 Boot: true, 69 Scratch: false, 70 Readonly: false, 71 AutoDelete: true, 72 } 73 s.AttachedDisk = compute.AttachedDisk{ 74 Type: "PERSISTENT", 75 Boot: true, 76 Mode: "READ_WRITE", 77 AutoDelete: true, 78 InitializeParams: &compute.AttachedDiskInitializeParams{ 79 DiskSizeGb: 10, 80 SourceImage: "some/image/path", 81 }, 82 } 83 s.NetworkSpec = NetworkSpec{ 84 Name: "somenetwork", 85 } 86 s.NetworkInterface = compute.NetworkInterface{ 87 Network: "global/networks/somenetwork", 88 NetworkIP: "10.0.0.1", 89 AccessConfigs: []*compute.AccessConfig{{ 90 Name: "somenetif", 91 Type: NetworkAccessOneToOneNAT, 92 }}, 93 } 94 s.Addresses = []network.Address{{ 95 Value: "10.0.0.1", 96 Type: network.IPv4Address, 97 Scope: network.ScopeCloudLocal, 98 }} 99 s.RawMetadata = compute.Metadata{Items: []*compute.MetadataItems{{ 100 Key: "eggs", 101 Value: "steak", 102 }}} 103 s.Metadata = map[string]string{ 104 "eggs": "steak", 105 } 106 s.RawInstance = compute.Instance{ 107 Name: "spam", 108 Status: StatusRunning, 109 NetworkInterfaces: []*compute.NetworkInterface{&s.NetworkInterface}, 110 Metadata: &s.RawMetadata, 111 Disks: []*compute.AttachedDisk{&s.AttachedDisk}, 112 Tags: &compute.Tags{Items: []string{"spam"}}, 113 } 114 s.RawInstanceFull = s.RawInstance 115 s.RawInstanceFull.Zone = "a-zone" 116 s.RawInstanceFull.Status = StatusRunning 117 s.RawInstanceFull.MachineType = "zones/a-zone/machineTypes/mtype" 118 s.InstanceSpec = InstanceSpec{ 119 ID: "spam", 120 Type: "mtype", 121 Disks: []DiskSpec{s.DiskSpec}, 122 Network: s.NetworkSpec, 123 NetworkInterfaces: []string{"somenetif"}, 124 Metadata: s.Metadata, 125 Tags: []string{"spam"}, 126 } 127 s.Instance = Instance{ 128 InstanceSummary: InstanceSummary{ 129 ID: "spam", 130 ZoneName: "a-zone", 131 Status: StatusRunning, 132 Metadata: s.Metadata, 133 Addresses: s.Addresses, 134 }, 135 spec: &s.InstanceSpec, 136 } 137 } 138 139 func (s *BaseSuite) NewWaitError(op *compute.Operation, cause error) error { 140 return waitError{op, cause} 141 } 142 143 type fakeCall struct { 144 FuncName string 145 146 ProjectID string 147 Region string 148 ZoneName string 149 Name string 150 ID string 151 Prefix string 152 Statuses []string 153 Instance *compute.Instance 154 InstValue compute.Instance 155 Firewall *compute.Firewall 156 } 157 158 type fakeConn struct { 159 Calls []fakeCall 160 161 Project *compute.Project 162 Instance *compute.Instance 163 Instances []*compute.Instance 164 Firewall *compute.Firewall 165 Zones []*compute.Zone 166 Err error 167 FailOnCall int 168 } 169 170 func (rc *fakeConn) GetProject(projectID string) (*compute.Project, error) { 171 call := fakeCall{ 172 FuncName: "GetProject", 173 ProjectID: projectID, 174 } 175 rc.Calls = append(rc.Calls, call) 176 177 err := rc.Err 178 if len(rc.Calls) != rc.FailOnCall+1 { 179 err = nil 180 } 181 return rc.Project, err 182 } 183 184 func (rc *fakeConn) GetInstance(projectID, zone, id string) (*compute.Instance, error) { 185 call := fakeCall{ 186 FuncName: "GetInstance", 187 ProjectID: projectID, 188 ZoneName: zone, 189 ID: id, 190 } 191 rc.Calls = append(rc.Calls, call) 192 193 err := rc.Err 194 if len(rc.Calls) != rc.FailOnCall+1 { 195 err = nil 196 } 197 return rc.Instance, err 198 } 199 200 func (rc *fakeConn) ListInstances(projectID, prefix string, statuses ...string) ([]*compute.Instance, error) { 201 call := fakeCall{ 202 FuncName: "ListInstances", 203 ProjectID: projectID, 204 Prefix: prefix, 205 Statuses: statuses, 206 } 207 rc.Calls = append(rc.Calls, call) 208 209 err := rc.Err 210 if len(rc.Calls) != rc.FailOnCall+1 { 211 err = nil 212 } 213 return rc.Instances, err 214 } 215 216 func (rc *fakeConn) AddInstance(projectID, zoneName string, spec *compute.Instance) error { 217 call := fakeCall{ 218 FuncName: "AddInstance", 219 ProjectID: projectID, 220 ZoneName: zoneName, 221 Instance: spec, 222 InstValue: *spec, 223 } 224 rc.Calls = append(rc.Calls, call) 225 226 err := rc.Err 227 if len(rc.Calls) != rc.FailOnCall+1 { 228 err = nil 229 } 230 return err 231 } 232 233 func (rc *fakeConn) RemoveInstance(projectID, zone, id string) error { 234 call := fakeCall{ 235 FuncName: "RemoveInstance", 236 ProjectID: projectID, 237 ID: id, 238 ZoneName: zone, 239 } 240 rc.Calls = append(rc.Calls, call) 241 242 err := rc.Err 243 if len(rc.Calls) != rc.FailOnCall+1 { 244 err = nil 245 } 246 return err 247 } 248 249 func (rc *fakeConn) GetFirewall(projectID, name string) (*compute.Firewall, error) { 250 call := fakeCall{ 251 FuncName: "GetFirewall", 252 ProjectID: projectID, 253 Name: name, 254 } 255 rc.Calls = append(rc.Calls, call) 256 257 err := rc.Err 258 if len(rc.Calls) != rc.FailOnCall+1 { 259 err = nil 260 } 261 return rc.Firewall, err 262 } 263 264 func (rc *fakeConn) AddFirewall(projectID string, firewall *compute.Firewall) error { 265 call := fakeCall{ 266 FuncName: "AddFirewall", 267 ProjectID: projectID, 268 Firewall: firewall, 269 } 270 rc.Calls = append(rc.Calls, call) 271 272 err := rc.Err 273 if len(rc.Calls) != rc.FailOnCall+1 { 274 err = nil 275 } 276 return err 277 } 278 279 func (rc *fakeConn) UpdateFirewall(projectID, name string, firewall *compute.Firewall) error { 280 call := fakeCall{ 281 FuncName: "UpdateFirewall", 282 ProjectID: projectID, 283 Name: name, 284 Firewall: firewall, 285 } 286 rc.Calls = append(rc.Calls, call) 287 288 err := rc.Err 289 if len(rc.Calls) != rc.FailOnCall+1 { 290 err = nil 291 } 292 return err 293 } 294 295 func (rc *fakeConn) RemoveFirewall(projectID, name string) error { 296 call := fakeCall{ 297 FuncName: "RemoveFirewall", 298 ProjectID: projectID, 299 Name: name, 300 } 301 rc.Calls = append(rc.Calls, call) 302 303 err := rc.Err 304 if len(rc.Calls) != rc.FailOnCall+1 { 305 err = nil 306 } 307 return err 308 } 309 310 func (rc *fakeConn) ListAvailabilityZones(projectID, region string) ([]*compute.Zone, error) { 311 call := fakeCall{ 312 FuncName: "ListAvailabilityZones", 313 ProjectID: projectID, 314 Region: region, 315 } 316 rc.Calls = append(rc.Calls, call) 317 318 err := rc.Err 319 if len(rc.Calls) != rc.FailOnCall+1 { 320 err = nil 321 } 322 return rc.Zones, err 323 }