github.com/axw/juju@v0.0.0-20161005053422-4bd6544d08d4/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  		Series:     "trusty",
    67  		SizeHintGB: 15,
    68  		ImageURL:   "some/image/path",
    69  		Boot:       true,
    70  		Scratch:    false,
    71  		Readonly:   false,
    72  		AutoDelete: true,
    73  	}
    74  	s.AttachedDisk = compute.AttachedDisk{
    75  		Type:       "PERSISTENT",
    76  		Boot:       true,
    77  		Mode:       "READ_WRITE",
    78  		AutoDelete: true,
    79  		InitializeParams: &compute.AttachedDiskInitializeParams{
    80  			DiskSizeGb:  10,
    81  			SourceImage: "some/image/path",
    82  		},
    83  	}
    84  	s.NetworkSpec = NetworkSpec{
    85  		Name: "somenetwork",
    86  	}
    87  	s.NetworkInterface = compute.NetworkInterface{
    88  		Network:   "global/networks/somenetwork",
    89  		NetworkIP: "10.0.0.1",
    90  		AccessConfigs: []*compute.AccessConfig{{
    91  			Name: "somenetif",
    92  			Type: NetworkAccessOneToOneNAT,
    93  		}},
    94  	}
    95  	s.Addresses = []network.Address{{
    96  		Value: "10.0.0.1",
    97  		Type:  network.IPv4Address,
    98  		Scope: network.ScopeCloudLocal,
    99  	}}
   100  	s.RawMetadata = compute.Metadata{Items: []*compute.MetadataItems{{
   101  		Key:   "eggs",
   102  		Value: "steak",
   103  	}}}
   104  	s.Metadata = map[string]string{
   105  		"eggs": "steak",
   106  	}
   107  	s.RawInstance = compute.Instance{
   108  		Name:              "spam",
   109  		Status:            StatusRunning,
   110  		NetworkInterfaces: []*compute.NetworkInterface{&s.NetworkInterface},
   111  		Metadata:          &s.RawMetadata,
   112  		Disks:             []*compute.AttachedDisk{&s.AttachedDisk},
   113  		Tags:              &compute.Tags{Items: []string{"spam"}},
   114  	}
   115  	s.RawInstanceFull = s.RawInstance
   116  	s.RawInstanceFull.Zone = "a-zone"
   117  	s.RawInstanceFull.Status = StatusRunning
   118  	s.RawInstanceFull.MachineType = "zones/a-zone/machineTypes/mtype"
   119  	s.InstanceSpec = InstanceSpec{
   120  		ID:                "spam",
   121  		Type:              "mtype",
   122  		Disks:             []DiskSpec{s.DiskSpec},
   123  		Network:           s.NetworkSpec,
   124  		NetworkInterfaces: []string{"somenetif"},
   125  		Metadata:          s.Metadata,
   126  		Tags:              []string{"spam"},
   127  	}
   128  	s.Instance = Instance{
   129  		InstanceSummary: InstanceSummary{
   130  			ID:        "spam",
   131  			ZoneName:  "a-zone",
   132  			Status:    StatusRunning,
   133  			Metadata:  s.Metadata,
   134  			Addresses: s.Addresses,
   135  		},
   136  		spec: &s.InstanceSpec,
   137  	}
   138  }
   139  
   140  func (s *BaseSuite) NewWaitError(op *compute.Operation, cause error) error {
   141  	return waitError{op, cause}
   142  }
   143  
   144  type fakeCall struct {
   145  	FuncName string
   146  
   147  	ProjectID    string
   148  	Region       string
   149  	ZoneName     string
   150  	Name         string
   151  	ID           string
   152  	Prefix       string
   153  	Statuses     []string
   154  	Instance     *compute.Instance
   155  	InstValue    compute.Instance
   156  	Firewall     *compute.Firewall
   157  	InstanceId   string
   158  	AttachedDisk *compute.AttachedDisk
   159  	DeviceName   string
   160  	ComputeDisk  *compute.Disk
   161  }
   162  
   163  type fakeConn struct {
   164  	Calls []fakeCall
   165  
   166  	Project       *compute.Project
   167  	Instance      *compute.Instance
   168  	Instances     []*compute.Instance
   169  	Firewall      *compute.Firewall
   170  	Zones         []*compute.Zone
   171  	Err           error
   172  	FailOnCall    int
   173  	Disks         []*compute.Disk
   174  	Disk          *compute.Disk
   175  	AttachedDisks []*compute.AttachedDisk
   176  }
   177  
   178  func (rc *fakeConn) GetProject(projectID string) (*compute.Project, error) {
   179  	call := fakeCall{
   180  		FuncName:  "GetProject",
   181  		ProjectID: projectID,
   182  	}
   183  	rc.Calls = append(rc.Calls, call)
   184  
   185  	err := rc.Err
   186  	if len(rc.Calls) != rc.FailOnCall+1 {
   187  		err = nil
   188  	}
   189  	return rc.Project, err
   190  }
   191  
   192  func (rc *fakeConn) GetInstance(projectID, zone, id string) (*compute.Instance, error) {
   193  	call := fakeCall{
   194  		FuncName:  "GetInstance",
   195  		ProjectID: projectID,
   196  		ZoneName:  zone,
   197  		ID:        id,
   198  	}
   199  	rc.Calls = append(rc.Calls, call)
   200  
   201  	err := rc.Err
   202  	if len(rc.Calls) != rc.FailOnCall+1 {
   203  		err = nil
   204  	}
   205  	return rc.Instance, err
   206  }
   207  
   208  func (rc *fakeConn) ListInstances(projectID, prefix string, statuses ...string) ([]*compute.Instance, error) {
   209  	call := fakeCall{
   210  		FuncName:  "ListInstances",
   211  		ProjectID: projectID,
   212  		Prefix:    prefix,
   213  		Statuses:  statuses,
   214  	}
   215  	rc.Calls = append(rc.Calls, call)
   216  
   217  	err := rc.Err
   218  	if len(rc.Calls) != rc.FailOnCall+1 {
   219  		err = nil
   220  	}
   221  	return rc.Instances, err
   222  }
   223  
   224  func (rc *fakeConn) AddInstance(projectID, zoneName string, spec *compute.Instance) error {
   225  	call := fakeCall{
   226  		FuncName:  "AddInstance",
   227  		ProjectID: projectID,
   228  		ZoneName:  zoneName,
   229  		Instance:  spec,
   230  		InstValue: *spec,
   231  	}
   232  	rc.Calls = append(rc.Calls, call)
   233  
   234  	err := rc.Err
   235  	if len(rc.Calls) != rc.FailOnCall+1 {
   236  		err = nil
   237  	}
   238  	return err
   239  }
   240  
   241  func (rc *fakeConn) RemoveInstance(projectID, zone, id string) error {
   242  	call := fakeCall{
   243  		FuncName:  "RemoveInstance",
   244  		ProjectID: projectID,
   245  		ID:        id,
   246  		ZoneName:  zone,
   247  	}
   248  	rc.Calls = append(rc.Calls, call)
   249  
   250  	err := rc.Err
   251  	if len(rc.Calls) != rc.FailOnCall+1 {
   252  		err = nil
   253  	}
   254  	return err
   255  }
   256  
   257  func (rc *fakeConn) GetFirewall(projectID, name string) (*compute.Firewall, error) {
   258  	call := fakeCall{
   259  		FuncName:  "GetFirewall",
   260  		ProjectID: projectID,
   261  		Name:      name,
   262  	}
   263  	rc.Calls = append(rc.Calls, call)
   264  
   265  	err := rc.Err
   266  	if len(rc.Calls) != rc.FailOnCall+1 {
   267  		err = nil
   268  	}
   269  	return rc.Firewall, err
   270  }
   271  
   272  func (rc *fakeConn) AddFirewall(projectID string, firewall *compute.Firewall) error {
   273  	call := fakeCall{
   274  		FuncName:  "AddFirewall",
   275  		ProjectID: projectID,
   276  		Firewall:  firewall,
   277  	}
   278  	rc.Calls = append(rc.Calls, call)
   279  
   280  	err := rc.Err
   281  	if len(rc.Calls) != rc.FailOnCall+1 {
   282  		err = nil
   283  	}
   284  	return err
   285  }
   286  
   287  func (rc *fakeConn) UpdateFirewall(projectID, name string, firewall *compute.Firewall) error {
   288  	call := fakeCall{
   289  		FuncName:  "UpdateFirewall",
   290  		ProjectID: projectID,
   291  		Name:      name,
   292  		Firewall:  firewall,
   293  	}
   294  	rc.Calls = append(rc.Calls, call)
   295  
   296  	err := rc.Err
   297  	if len(rc.Calls) != rc.FailOnCall+1 {
   298  		err = nil
   299  	}
   300  	return err
   301  }
   302  
   303  func (rc *fakeConn) RemoveFirewall(projectID, name string) error {
   304  	call := fakeCall{
   305  		FuncName:  "RemoveFirewall",
   306  		ProjectID: projectID,
   307  		Name:      name,
   308  	}
   309  	rc.Calls = append(rc.Calls, call)
   310  
   311  	err := rc.Err
   312  	if len(rc.Calls) != rc.FailOnCall+1 {
   313  		err = nil
   314  	}
   315  	return err
   316  }
   317  
   318  func (rc *fakeConn) ListAvailabilityZones(projectID, region string) ([]*compute.Zone, error) {
   319  	call := fakeCall{
   320  		FuncName:  "ListAvailabilityZones",
   321  		ProjectID: projectID,
   322  		Region:    region,
   323  	}
   324  	rc.Calls = append(rc.Calls, call)
   325  
   326  	err := rc.Err
   327  	if len(rc.Calls) != rc.FailOnCall+1 {
   328  		err = nil
   329  	}
   330  	return rc.Zones, err
   331  }
   332  
   333  func (rc *fakeConn) CreateDisk(project, zone string, spec *compute.Disk) error {
   334  	call := fakeCall{
   335  		FuncName:    "CreateDisk",
   336  		ProjectID:   project,
   337  		ZoneName:    zone,
   338  		ComputeDisk: spec,
   339  	}
   340  	rc.Calls = append(rc.Calls, call)
   341  
   342  	err := rc.Err
   343  	if len(rc.Calls) != rc.FailOnCall+1 {
   344  		err = nil
   345  	}
   346  	return err
   347  }
   348  
   349  func (rc *fakeConn) ListDisks(project, zone string) ([]*compute.Disk, error) {
   350  	call := fakeCall{
   351  		FuncName:  "ListDisks",
   352  		ProjectID: project,
   353  		ZoneName:  zone,
   354  	}
   355  	rc.Calls = append(rc.Calls, call)
   356  
   357  	err := rc.Err
   358  	if len(rc.Calls) != rc.FailOnCall+1 {
   359  		err = nil
   360  	}
   361  	return rc.Disks, err
   362  }
   363  
   364  func (rc *fakeConn) RemoveDisk(project, zone, id string) error {
   365  	call := fakeCall{
   366  		FuncName:  "RemoveDisk",
   367  		ProjectID: project,
   368  		ZoneName:  zone,
   369  		ID:        id,
   370  	}
   371  	rc.Calls = append(rc.Calls, call)
   372  
   373  	err := rc.Err
   374  	if len(rc.Calls) != rc.FailOnCall+1 {
   375  		err = nil
   376  	}
   377  	return err
   378  }
   379  
   380  func (rc *fakeConn) GetDisk(project, zone, id string) (*compute.Disk, error) {
   381  	call := fakeCall{
   382  		FuncName:  "GetDisk",
   383  		ProjectID: project,
   384  		ZoneName:  zone,
   385  		ID:        id,
   386  	}
   387  	rc.Calls = append(rc.Calls, call)
   388  
   389  	err := rc.Err
   390  	if len(rc.Calls) != rc.FailOnCall+1 {
   391  		err = nil
   392  	}
   393  	return rc.Disk, err
   394  }
   395  
   396  func (rc *fakeConn) AttachDisk(project, zone, instanceId string, attachedDisk *compute.AttachedDisk) error {
   397  	call := fakeCall{
   398  		FuncName:     "AttachDisk",
   399  		ProjectID:    project,
   400  		ZoneName:     zone,
   401  		InstanceId:   instanceId,
   402  		AttachedDisk: attachedDisk,
   403  	}
   404  	rc.Calls = append(rc.Calls, call)
   405  
   406  	err := rc.Err
   407  	if len(rc.Calls) != rc.FailOnCall+1 {
   408  		err = nil
   409  	}
   410  	return err
   411  }
   412  
   413  func (rc *fakeConn) DetachDisk(project, zone, instanceId, diskDeviceName string) error {
   414  	call := fakeCall{
   415  		FuncName:   "DetachDisk",
   416  		ProjectID:  project,
   417  		ZoneName:   zone,
   418  		InstanceId: instanceId,
   419  		DeviceName: diskDeviceName,
   420  	}
   421  	rc.Calls = append(rc.Calls, call)
   422  
   423  	err := rc.Err
   424  	if len(rc.Calls) != rc.FailOnCall+1 {
   425  		err = nil
   426  	}
   427  	return err
   428  }
   429  
   430  func (rc *fakeConn) InstanceDisks(project, zone, instanceId string) ([]*compute.AttachedDisk, error) {
   431  	call := fakeCall{
   432  		FuncName:   "InstanceDisks",
   433  		ProjectID:  project,
   434  		ZoneName:   zone,
   435  		InstanceId: instanceId,
   436  	}
   437  	rc.Calls = append(rc.Calls, call)
   438  
   439  	err := rc.Err
   440  	if len(rc.Calls) != rc.FailOnCall+1 {
   441  		err = nil
   442  	}
   443  	return rc.AttachedDisks, err
   444  }