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  }