github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/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{
   101  		Items: []*compute.MetadataItems{{
   102  			Key:   "eggs",
   103  			Value: StringPtr("steak"),
   104  		}},
   105  		Fingerprint: "heymumwatchthis",
   106  	}
   107  	s.Metadata = map[string]string{
   108  		"eggs": "steak",
   109  	}
   110  	s.RawInstance = compute.Instance{
   111  		Name:              "spam",
   112  		Status:            StatusRunning,
   113  		NetworkInterfaces: []*compute.NetworkInterface{&s.NetworkInterface},
   114  		Metadata:          &s.RawMetadata,
   115  		Disks:             []*compute.AttachedDisk{&s.AttachedDisk},
   116  		Tags:              &compute.Tags{Items: []string{"spam"}},
   117  	}
   118  	s.RawInstanceFull = s.RawInstance
   119  	s.RawInstanceFull.Zone = "a-zone"
   120  	s.RawInstanceFull.Status = StatusRunning
   121  	s.RawInstanceFull.MachineType = "zones/a-zone/machineTypes/mtype"
   122  	s.InstanceSpec = InstanceSpec{
   123  		ID:                "spam",
   124  		Type:              "mtype",
   125  		Disks:             []DiskSpec{s.DiskSpec},
   126  		Network:           s.NetworkSpec,
   127  		NetworkInterfaces: []string{"somenetif"},
   128  		Metadata:          s.Metadata,
   129  		Tags:              []string{"spam"},
   130  		AvailabilityZone:  "a-zone",
   131  	}
   132  	s.Instance = Instance{
   133  		InstanceSummary: InstanceSummary{
   134  			ID:                "spam",
   135  			ZoneName:          "a-zone",
   136  			Status:            StatusRunning,
   137  			Metadata:          s.Metadata,
   138  			Addresses:         s.Addresses,
   139  			NetworkInterfaces: s.RawInstance.NetworkInterfaces,
   140  		},
   141  		spec: &s.InstanceSpec,
   142  	}
   143  }
   144  
   145  func (s *BaseSuite) NewWaitError(op *compute.Operation, cause error) error {
   146  	return waitError{op, cause}
   147  }
   148  
   149  func StringPtr(val string) *string {
   150  	return &val
   151  }
   152  
   153  type fakeCall struct {
   154  	FuncName string
   155  
   156  	ProjectID        string
   157  	Region           string
   158  	ZoneName         string
   159  	Name             string
   160  	ID               string
   161  	Prefix           string
   162  	Statuses         []string
   163  	Instance         *compute.Instance
   164  	InstValue        compute.Instance
   165  	Firewall         *compute.Firewall
   166  	InstanceId       string
   167  	AttachedDisk     *compute.AttachedDisk
   168  	DeviceName       string
   169  	ComputeDisk      *compute.Disk
   170  	Metadata         *compute.Metadata
   171  	LabelFingerprint string
   172  	Labels           map[string]string
   173  }
   174  
   175  type fakeConn struct {
   176  	Calls []fakeCall
   177  
   178  	Project       *compute.Project
   179  	Instance      *compute.Instance
   180  	Instances     []*compute.Instance
   181  	Firewalls     []*compute.Firewall
   182  	Zones         []*compute.Zone
   183  	Err           error
   184  	FailOnCall    int
   185  	Disks         []*compute.Disk
   186  	Disk          *compute.Disk
   187  	AttachedDisks []*compute.AttachedDisk
   188  	Networks      []*compute.Network
   189  	Subnetworks   []*compute.Subnetwork
   190  }
   191  
   192  func (rc *fakeConn) GetProject(projectID string) (*compute.Project, error) {
   193  	call := fakeCall{
   194  		FuncName:  "GetProject",
   195  		ProjectID: projectID,
   196  	}
   197  	rc.Calls = append(rc.Calls, call)
   198  
   199  	err := rc.Err
   200  	if len(rc.Calls) != rc.FailOnCall+1 {
   201  		err = nil
   202  	}
   203  	return rc.Project, err
   204  }
   205  
   206  func (rc *fakeConn) GetInstance(projectID, zone, id string) (*compute.Instance, error) {
   207  	call := fakeCall{
   208  		FuncName:  "GetInstance",
   209  		ProjectID: projectID,
   210  		ZoneName:  zone,
   211  		ID:        id,
   212  	}
   213  	rc.Calls = append(rc.Calls, call)
   214  
   215  	err := rc.Err
   216  	if len(rc.Calls) != rc.FailOnCall+1 {
   217  		err = nil
   218  	}
   219  	return rc.Instance, err
   220  }
   221  
   222  func (rc *fakeConn) ListInstances(projectID, prefix string, statuses ...string) ([]*compute.Instance, error) {
   223  	call := fakeCall{
   224  		FuncName:  "ListInstances",
   225  		ProjectID: projectID,
   226  		Prefix:    prefix,
   227  		Statuses:  statuses,
   228  	}
   229  	rc.Calls = append(rc.Calls, call)
   230  
   231  	err := rc.Err
   232  	if len(rc.Calls) != rc.FailOnCall+1 {
   233  		err = nil
   234  	}
   235  	return rc.Instances, err
   236  }
   237  
   238  func (rc *fakeConn) AddInstance(projectID, zoneName string, spec *compute.Instance) error {
   239  	call := fakeCall{
   240  		FuncName:  "AddInstance",
   241  		ProjectID: projectID,
   242  		ZoneName:  zoneName,
   243  		Instance:  spec,
   244  		InstValue: *spec,
   245  	}
   246  	rc.Calls = append(rc.Calls, call)
   247  
   248  	err := rc.Err
   249  	if len(rc.Calls) != rc.FailOnCall+1 {
   250  		err = nil
   251  	}
   252  	return err
   253  }
   254  
   255  func (rc *fakeConn) RemoveInstance(projectID, zone, id string) error {
   256  	call := fakeCall{
   257  		FuncName:  "RemoveInstance",
   258  		ProjectID: projectID,
   259  		ID:        id,
   260  		ZoneName:  zone,
   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 err
   269  }
   270  
   271  func (rc *fakeConn) GetFirewalls(projectID, name string) ([]*compute.Firewall, error) {
   272  	call := fakeCall{
   273  		FuncName:  "GetFirewalls",
   274  		ProjectID: projectID,
   275  		Name:      name,
   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 rc.Firewalls, err
   284  }
   285  
   286  func (rc *fakeConn) AddFirewall(projectID string, firewall *compute.Firewall) error {
   287  	call := fakeCall{
   288  		FuncName:  "AddFirewall",
   289  		ProjectID: projectID,
   290  		Firewall:  firewall,
   291  	}
   292  	rc.Calls = append(rc.Calls, call)
   293  
   294  	err := rc.Err
   295  	if len(rc.Calls) != rc.FailOnCall+1 {
   296  		err = nil
   297  	}
   298  	return err
   299  }
   300  
   301  func (rc *fakeConn) UpdateFirewall(projectID, name string, firewall *compute.Firewall) error {
   302  	call := fakeCall{
   303  		FuncName:  "UpdateFirewall",
   304  		ProjectID: projectID,
   305  		Name:      name,
   306  		Firewall:  firewall,
   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) RemoveFirewall(projectID, name string) error {
   318  	call := fakeCall{
   319  		FuncName:  "RemoveFirewall",
   320  		ProjectID: projectID,
   321  		Name:      name,
   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 err
   330  }
   331  
   332  func (rc *fakeConn) ListAvailabilityZones(projectID, region string) ([]*compute.Zone, error) {
   333  	call := fakeCall{
   334  		FuncName:  "ListAvailabilityZones",
   335  		ProjectID: projectID,
   336  		Region:    region,
   337  	}
   338  	rc.Calls = append(rc.Calls, call)
   339  
   340  	err := rc.Err
   341  	if len(rc.Calls) != rc.FailOnCall+1 {
   342  		err = nil
   343  	}
   344  	return rc.Zones, err
   345  }
   346  
   347  func (rc *fakeConn) CreateDisk(project, zone string, spec *compute.Disk) error {
   348  	call := fakeCall{
   349  		FuncName:    "CreateDisk",
   350  		ProjectID:   project,
   351  		ZoneName:    zone,
   352  		ComputeDisk: spec,
   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 err
   361  }
   362  
   363  func (rc *fakeConn) ListDisks(project string) ([]*compute.Disk, error) {
   364  	call := fakeCall{
   365  		FuncName:  "ListDisks",
   366  		ProjectID: project,
   367  	}
   368  	rc.Calls = append(rc.Calls, call)
   369  
   370  	err := rc.Err
   371  	if len(rc.Calls) != rc.FailOnCall+1 {
   372  		err = nil
   373  	}
   374  	return rc.Disks, err
   375  }
   376  
   377  func (rc *fakeConn) RemoveDisk(project, zone, id string) error {
   378  	call := fakeCall{
   379  		FuncName:  "RemoveDisk",
   380  		ProjectID: project,
   381  		ZoneName:  zone,
   382  		ID:        id,
   383  	}
   384  	rc.Calls = append(rc.Calls, call)
   385  
   386  	err := rc.Err
   387  	if len(rc.Calls) != rc.FailOnCall+1 {
   388  		err = nil
   389  	}
   390  	return err
   391  }
   392  
   393  func (rc *fakeConn) GetDisk(project, zone, id string) (*compute.Disk, error) {
   394  	call := fakeCall{
   395  		FuncName:  "GetDisk",
   396  		ProjectID: project,
   397  		ZoneName:  zone,
   398  		ID:        id,
   399  	}
   400  	rc.Calls = append(rc.Calls, call)
   401  
   402  	err := rc.Err
   403  	if len(rc.Calls) != rc.FailOnCall+1 {
   404  		err = nil
   405  	}
   406  	return rc.Disk, err
   407  }
   408  
   409  func (rc *fakeConn) SetDiskLabels(project, zone, id, labelFingerprint string, labels map[string]string) error {
   410  	call := fakeCall{
   411  		FuncName:         "SetDiskLabels",
   412  		ProjectID:        project,
   413  		ZoneName:         zone,
   414  		ID:               id,
   415  		LabelFingerprint: labelFingerprint,
   416  		Labels:           labels,
   417  	}
   418  	rc.Calls = append(rc.Calls, call)
   419  
   420  	err := rc.Err
   421  	if len(rc.Calls) != rc.FailOnCall+1 {
   422  		err = nil
   423  	}
   424  	return err
   425  }
   426  
   427  func (rc *fakeConn) AttachDisk(project, zone, instanceId string, attachedDisk *compute.AttachedDisk) error {
   428  	call := fakeCall{
   429  		FuncName:     "AttachDisk",
   430  		ProjectID:    project,
   431  		ZoneName:     zone,
   432  		InstanceId:   instanceId,
   433  		AttachedDisk: attachedDisk,
   434  	}
   435  	rc.Calls = append(rc.Calls, call)
   436  
   437  	err := rc.Err
   438  	if len(rc.Calls) != rc.FailOnCall+1 {
   439  		err = nil
   440  	}
   441  	return err
   442  }
   443  
   444  func (rc *fakeConn) DetachDisk(project, zone, instanceId, diskDeviceName string) error {
   445  	call := fakeCall{
   446  		FuncName:   "DetachDisk",
   447  		ProjectID:  project,
   448  		ZoneName:   zone,
   449  		InstanceId: instanceId,
   450  		DeviceName: diskDeviceName,
   451  	}
   452  	rc.Calls = append(rc.Calls, call)
   453  
   454  	err := rc.Err
   455  	if len(rc.Calls) != rc.FailOnCall+1 {
   456  		err = nil
   457  	}
   458  	return err
   459  }
   460  
   461  func (rc *fakeConn) InstanceDisks(project, zone, instanceId string) ([]*compute.AttachedDisk, error) {
   462  	call := fakeCall{
   463  		FuncName:   "InstanceDisks",
   464  		ProjectID:  project,
   465  		ZoneName:   zone,
   466  		InstanceId: instanceId,
   467  	}
   468  	rc.Calls = append(rc.Calls, call)
   469  
   470  	err := rc.Err
   471  	if len(rc.Calls) != rc.FailOnCall+1 {
   472  		err = nil
   473  	}
   474  	return rc.AttachedDisks, err
   475  }
   476  
   477  func (rc *fakeConn) ListMachineTypes(projectID, zone string) (*compute.MachineTypeList, error) {
   478  	call := fakeCall{
   479  		FuncName:  "ListMachineTypes",
   480  		ProjectID: projectID,
   481  		ZoneName:  zone,
   482  	}
   483  	rc.Calls = append(rc.Calls, call)
   484  	machineType := compute.MachineTypeList{
   485  		Items: []*compute.MachineType{
   486  			{Name: "type-1", MemoryMb: 1024},
   487  			{Name: "type-2", MemoryMb: 2048},
   488  		},
   489  	}
   490  	return &machineType, nil
   491  
   492  }
   493  
   494  func (rc *fakeConn) SetMetadata(projectID, zone, instanceID string, metadata *compute.Metadata) error {
   495  	call := fakeCall{
   496  		FuncName:   "SetMetadata",
   497  		ProjectID:  projectID,
   498  		ZoneName:   zone,
   499  		InstanceId: instanceID,
   500  		Metadata:   metadata,
   501  	}
   502  	rc.Calls = append(rc.Calls, call)
   503  
   504  	err := rc.Err
   505  	if len(rc.Calls) != rc.FailOnCall+1 {
   506  		err = nil
   507  	}
   508  	return err
   509  }
   510  
   511  func (rc *fakeConn) ListNetworks(projectID string) ([]*compute.Network, error) {
   512  	call := fakeCall{
   513  		FuncName:  "ListNetworks",
   514  		ProjectID: projectID,
   515  	}
   516  	rc.Calls = append(rc.Calls, call)
   517  
   518  	err := rc.Err
   519  	if len(rc.Calls) != rc.FailOnCall+1 {
   520  		err = nil
   521  	}
   522  	if err != nil {
   523  		return nil, err
   524  	}
   525  	return rc.Networks, nil
   526  }
   527  
   528  func (rc *fakeConn) ListSubnetworks(projectID, region string) ([]*compute.Subnetwork, error) {
   529  	call := fakeCall{
   530  		FuncName:  "ListSubnetworks",
   531  		ProjectID: projectID,
   532  		Region:    region,
   533  	}
   534  	rc.Calls = append(rc.Calls, call)
   535  
   536  	err := rc.Err
   537  	if len(rc.Calls) != rc.FailOnCall+1 {
   538  		err = nil
   539  	}
   540  	if err != nil {
   541  		return nil, err
   542  	}
   543  	return rc.Subnetworks, nil
   544  }