github.com/cloud-green/juju@v0.0.0-20151002100041-a00291338d3d/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  	InstanceId   string
   157  	AttachedDisk *compute.AttachedDisk
   158  	DeviceName   string
   159  	ComputeDisk  *compute.Disk
   160  }
   161  
   162  type fakeConn struct {
   163  	Calls []fakeCall
   164  
   165  	Project       *compute.Project
   166  	Instance      *compute.Instance
   167  	Instances     []*compute.Instance
   168  	Firewall      *compute.Firewall
   169  	Zones         []*compute.Zone
   170  	Err           error
   171  	FailOnCall    int
   172  	Disks         []*compute.Disk
   173  	Disk          *compute.Disk
   174  	AttachedDisks []*compute.AttachedDisk
   175  }
   176  
   177  func (rc *fakeConn) GetProject(projectID string) (*compute.Project, error) {
   178  	call := fakeCall{
   179  		FuncName:  "GetProject",
   180  		ProjectID: projectID,
   181  	}
   182  	rc.Calls = append(rc.Calls, call)
   183  
   184  	err := rc.Err
   185  	if len(rc.Calls) != rc.FailOnCall+1 {
   186  		err = nil
   187  	}
   188  	return rc.Project, err
   189  }
   190  
   191  func (rc *fakeConn) GetInstance(projectID, zone, id string) (*compute.Instance, error) {
   192  	call := fakeCall{
   193  		FuncName:  "GetInstance",
   194  		ProjectID: projectID,
   195  		ZoneName:  zone,
   196  		ID:        id,
   197  	}
   198  	rc.Calls = append(rc.Calls, call)
   199  
   200  	err := rc.Err
   201  	if len(rc.Calls) != rc.FailOnCall+1 {
   202  		err = nil
   203  	}
   204  	return rc.Instance, err
   205  }
   206  
   207  func (rc *fakeConn) ListInstances(projectID, prefix string, statuses ...string) ([]*compute.Instance, error) {
   208  	call := fakeCall{
   209  		FuncName:  "ListInstances",
   210  		ProjectID: projectID,
   211  		Prefix:    prefix,
   212  		Statuses:  statuses,
   213  	}
   214  	rc.Calls = append(rc.Calls, call)
   215  
   216  	err := rc.Err
   217  	if len(rc.Calls) != rc.FailOnCall+1 {
   218  		err = nil
   219  	}
   220  	return rc.Instances, err
   221  }
   222  
   223  func (rc *fakeConn) AddInstance(projectID, zoneName string, spec *compute.Instance) error {
   224  	call := fakeCall{
   225  		FuncName:  "AddInstance",
   226  		ProjectID: projectID,
   227  		ZoneName:  zoneName,
   228  		Instance:  spec,
   229  		InstValue: *spec,
   230  	}
   231  	rc.Calls = append(rc.Calls, call)
   232  
   233  	err := rc.Err
   234  	if len(rc.Calls) != rc.FailOnCall+1 {
   235  		err = nil
   236  	}
   237  	return err
   238  }
   239  
   240  func (rc *fakeConn) RemoveInstance(projectID, zone, id string) error {
   241  	call := fakeCall{
   242  		FuncName:  "RemoveInstance",
   243  		ProjectID: projectID,
   244  		ID:        id,
   245  		ZoneName:  zone,
   246  	}
   247  	rc.Calls = append(rc.Calls, call)
   248  
   249  	err := rc.Err
   250  	if len(rc.Calls) != rc.FailOnCall+1 {
   251  		err = nil
   252  	}
   253  	return err
   254  }
   255  
   256  func (rc *fakeConn) GetFirewall(projectID, name string) (*compute.Firewall, error) {
   257  	call := fakeCall{
   258  		FuncName:  "GetFirewall",
   259  		ProjectID: projectID,
   260  		Name:      name,
   261  	}
   262  	rc.Calls = append(rc.Calls, call)
   263  
   264  	err := rc.Err
   265  	if len(rc.Calls) != rc.FailOnCall+1 {
   266  		err = nil
   267  	}
   268  	return rc.Firewall, err
   269  }
   270  
   271  func (rc *fakeConn) AddFirewall(projectID string, firewall *compute.Firewall) error {
   272  	call := fakeCall{
   273  		FuncName:  "AddFirewall",
   274  		ProjectID: projectID,
   275  		Firewall:  firewall,
   276  	}
   277  	rc.Calls = append(rc.Calls, call)
   278  
   279  	err := rc.Err
   280  	if len(rc.Calls) != rc.FailOnCall+1 {
   281  		err = nil
   282  	}
   283  	return err
   284  }
   285  
   286  func (rc *fakeConn) UpdateFirewall(projectID, name string, firewall *compute.Firewall) error {
   287  	call := fakeCall{
   288  		FuncName:  "UpdateFirewall",
   289  		ProjectID: projectID,
   290  		Name:      name,
   291  		Firewall:  firewall,
   292  	}
   293  	rc.Calls = append(rc.Calls, call)
   294  
   295  	err := rc.Err
   296  	if len(rc.Calls) != rc.FailOnCall+1 {
   297  		err = nil
   298  	}
   299  	return err
   300  }
   301  
   302  func (rc *fakeConn) RemoveFirewall(projectID, name string) error {
   303  	call := fakeCall{
   304  		FuncName:  "RemoveFirewall",
   305  		ProjectID: projectID,
   306  		Name:      name,
   307  	}
   308  	rc.Calls = append(rc.Calls, call)
   309  
   310  	err := rc.Err
   311  	if len(rc.Calls) != rc.FailOnCall+1 {
   312  		err = nil
   313  	}
   314  	return err
   315  }
   316  
   317  func (rc *fakeConn) ListAvailabilityZones(projectID, region string) ([]*compute.Zone, error) {
   318  	call := fakeCall{
   319  		FuncName:  "ListAvailabilityZones",
   320  		ProjectID: projectID,
   321  		Region:    region,
   322  	}
   323  	rc.Calls = append(rc.Calls, call)
   324  
   325  	err := rc.Err
   326  	if len(rc.Calls) != rc.FailOnCall+1 {
   327  		err = nil
   328  	}
   329  	return rc.Zones, err
   330  }
   331  
   332  func (rc *fakeConn) CreateDisk(project, zone string, spec *compute.Disk) error {
   333  	call := fakeCall{
   334  		FuncName:    "CreateDisk",
   335  		ProjectID:   project,
   336  		ZoneName:    zone,
   337  		ComputeDisk: spec,
   338  	}
   339  	rc.Calls = append(rc.Calls, call)
   340  
   341  	err := rc.Err
   342  	if len(rc.Calls) != rc.FailOnCall+1 {
   343  		err = nil
   344  	}
   345  	return err
   346  }
   347  
   348  func (rc *fakeConn) ListDisks(project, zone string) ([]*compute.Disk, error) {
   349  	call := fakeCall{
   350  		FuncName:  "ListDisks",
   351  		ProjectID: project,
   352  		ZoneName:  zone,
   353  	}
   354  	rc.Calls = append(rc.Calls, call)
   355  
   356  	err := rc.Err
   357  	if len(rc.Calls) != rc.FailOnCall+1 {
   358  		err = nil
   359  	}
   360  	return rc.Disks, err
   361  }
   362  
   363  func (rc *fakeConn) RemoveDisk(project, zone, id string) error {
   364  	call := fakeCall{
   365  		FuncName:  "RemoveDisk",
   366  		ProjectID: project,
   367  		ZoneName:  zone,
   368  		ID:        id,
   369  	}
   370  	rc.Calls = append(rc.Calls, call)
   371  
   372  	err := rc.Err
   373  	if len(rc.Calls) != rc.FailOnCall+1 {
   374  		err = nil
   375  	}
   376  	return err
   377  }
   378  
   379  func (rc *fakeConn) GetDisk(project, zone, id string) (*compute.Disk, error) {
   380  	call := fakeCall{
   381  		FuncName:  "GetDisk",
   382  		ProjectID: project,
   383  		ZoneName:  zone,
   384  		ID:        id,
   385  	}
   386  	rc.Calls = append(rc.Calls, call)
   387  
   388  	err := rc.Err
   389  	if len(rc.Calls) != rc.FailOnCall+1 {
   390  		err = nil
   391  	}
   392  	return rc.Disk, err
   393  }
   394  
   395  func (rc *fakeConn) AttachDisk(project, zone, instanceId string, attachedDisk *compute.AttachedDisk) error {
   396  	call := fakeCall{
   397  		FuncName:     "AttachDisk",
   398  		ProjectID:    project,
   399  		ZoneName:     zone,
   400  		InstanceId:   instanceId,
   401  		AttachedDisk: attachedDisk,
   402  	}
   403  	rc.Calls = append(rc.Calls, call)
   404  
   405  	err := rc.Err
   406  	if len(rc.Calls) != rc.FailOnCall+1 {
   407  		err = nil
   408  	}
   409  	return err
   410  }
   411  
   412  func (rc *fakeConn) DetachDisk(project, zone, instanceId, diskDeviceName string) error {
   413  	call := fakeCall{
   414  		FuncName:   "DetachDisk",
   415  		ProjectID:  project,
   416  		ZoneName:   zone,
   417  		InstanceId: instanceId,
   418  		DeviceName: diskDeviceName,
   419  	}
   420  	rc.Calls = append(rc.Calls, call)
   421  
   422  	err := rc.Err
   423  	if len(rc.Calls) != rc.FailOnCall+1 {
   424  		err = nil
   425  	}
   426  	return err
   427  }
   428  
   429  func (rc *fakeConn) InstanceDisks(project, zone, instanceId string) ([]*compute.AttachedDisk, error) {
   430  	call := fakeCall{
   431  		FuncName:   "InstanceDisks",
   432  		ProjectID:  project,
   433  		ZoneName:   zone,
   434  		InstanceId: instanceId,
   435  	}
   436  	rc.Calls = append(rc.Calls, call)
   437  
   438  	err := rc.Err
   439  	if len(rc.Calls) != rc.FailOnCall+1 {
   440  		err = nil
   441  	}
   442  	return rc.AttachedDisks, err
   443  }