github.com/axw/juju@v0.0.0-20161005053422-4bd6544d08d4/provider/gce/google/conn_instance_test.go (about)

     1  // Copyright 2014 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package google_test
     5  
     6  import (
     7  	"github.com/juju/errors"
     8  	jc "github.com/juju/testing/checkers"
     9  	"google.golang.org/api/compute/v1"
    10  	gc "gopkg.in/check.v1"
    11  
    12  	"github.com/juju/juju/provider/gce/google"
    13  )
    14  
    15  func (s *connSuite) TestConnectionSimpleAddInstance(c *gc.C) {
    16  	s.FakeConn.Instance = &s.RawInstanceFull
    17  
    18  	inst := &s.RawInstance
    19  	zones := []string{"a-zone"}
    20  	err := google.ConnAddInstance(s.Conn, inst, "mtype", zones)
    21  	c.Assert(err, jc.ErrorIsNil)
    22  
    23  	c.Check(inst, jc.DeepEquals, &s.RawInstanceFull)
    24  }
    25  
    26  func (s *connSuite) TestConnectionSimpleAddInstanceAPI(c *gc.C) {
    27  	s.FakeConn.Instance = &s.RawInstanceFull
    28  	expected := s.RawInstance
    29  	expected.MachineType = "zones/a-zone/machineTypes/mtype"
    30  
    31  	inst := &s.RawInstance
    32  	zones := []string{"a-zone"}
    33  	err := google.ConnAddInstance(s.Conn, inst, "mtype", zones)
    34  	c.Assert(err, jc.ErrorIsNil)
    35  
    36  	c.Check(s.FakeConn.Calls, gc.HasLen, 2)
    37  	c.Check(s.FakeConn.Calls[0].FuncName, gc.Equals, "AddInstance")
    38  	c.Check(s.FakeConn.Calls[0].ProjectID, gc.Equals, "spam")
    39  	c.Check(s.FakeConn.Calls[0].ZoneName, gc.Equals, "a-zone")
    40  	c.Check(s.FakeConn.Calls[0].InstValue, gc.DeepEquals, expected)
    41  	c.Check(s.FakeConn.Calls[1].FuncName, gc.Equals, "GetInstance")
    42  	c.Check(s.FakeConn.Calls[1].ProjectID, gc.Equals, "spam")
    43  	c.Check(s.FakeConn.Calls[1].ZoneName, gc.Equals, "a-zone")
    44  	c.Check(s.FakeConn.Calls[1].ID, gc.Equals, "spam")
    45  }
    46  
    47  func (s *instanceSuite) TestConnectionAddInstance(c *gc.C) {
    48  	s.FakeConn.Instance = &s.RawInstanceFull
    49  
    50  	inst, err := s.Conn.AddInstance(s.InstanceSpec, "a-zone")
    51  	c.Assert(err, jc.ErrorIsNil)
    52  
    53  	c.Check(inst.ID, gc.Equals, "spam")
    54  	c.Check(inst.ZoneName, gc.Equals, "a-zone")
    55  	c.Check(inst.Status(), gc.Equals, google.StatusRunning)
    56  	c.Check(inst.Metadata(), jc.DeepEquals, s.Metadata)
    57  	c.Check(inst.Addresses(), jc.DeepEquals, s.Addresses)
    58  	spec := google.GetInstanceSpec(inst)
    59  	c.Check(spec, gc.DeepEquals, &s.InstanceSpec)
    60  }
    61  
    62  func (s *instanceSuite) TestConnectionAddInstanceAPI(c *gc.C) {
    63  	s.FakeConn.Instance = &s.RawInstanceFull
    64  
    65  	_, err := s.Conn.AddInstance(s.InstanceSpec, "a-zone")
    66  	c.Assert(err, jc.ErrorIsNil)
    67  
    68  	c.Check(s.FakeConn.Calls, gc.HasLen, 2)
    69  	c.Check(s.FakeConn.Calls[0].FuncName, gc.Equals, "AddInstance")
    70  	c.Check(s.FakeConn.Calls[0].ProjectID, gc.Equals, "spam")
    71  	// We check s.FakeConn.Calls[0].InstValue below.
    72  	c.Check(s.FakeConn.Calls[0].ZoneName, gc.Equals, "a-zone")
    73  	c.Check(s.FakeConn.Calls[1].FuncName, gc.Equals, "GetInstance")
    74  	c.Check(s.FakeConn.Calls[1].ProjectID, gc.Equals, "spam")
    75  	c.Check(s.FakeConn.Calls[1].ID, gc.Equals, "spam")
    76  	c.Check(s.FakeConn.Calls[1].ZoneName, gc.Equals, "a-zone")
    77  
    78  	metadata := compute.Metadata{Items: []*compute.MetadataItems{{
    79  		Key:   "eggs",
    80  		Value: "steak",
    81  	}}}
    82  	networkInterfaces := []*compute.NetworkInterface{{
    83  		Network: "global/networks/somenetwork",
    84  		AccessConfigs: []*compute.AccessConfig{{
    85  			Name: "somenetif",
    86  			Type: "ONE_TO_ONE_NAT",
    87  		}},
    88  	}}
    89  	attachedDisks := []*compute.AttachedDisk{{
    90  		Type:       "PERSISTENT",
    91  		Boot:       true,
    92  		Mode:       "READ_WRITE",
    93  		AutoDelete: true,
    94  		InitializeParams: &compute.AttachedDiskInitializeParams{
    95  			DiskSizeGb:  15,
    96  			SourceImage: "some/image/path",
    97  		},
    98  	}}
    99  	c.Check(s.FakeConn.Calls[0].InstValue, gc.DeepEquals, compute.Instance{
   100  		Name:              "spam",
   101  		MachineType:       "zones/a-zone/machineTypes/mtype",
   102  		Disks:             attachedDisks,
   103  		NetworkInterfaces: networkInterfaces,
   104  		Metadata:          &metadata,
   105  		Tags:              &compute.Tags{Items: []string{"spam"}},
   106  	})
   107  }
   108  
   109  func (s *connSuite) TestConnectionAddInstanceFailed(c *gc.C) {
   110  	s.FakeConn.Instance = &s.RawInstanceFull
   111  
   112  	failure := errors.New("unknown")
   113  	s.FakeConn.Err = failure
   114  
   115  	zones := []string{"a-zone"}
   116  	err := google.ConnAddInstance(s.Conn, &s.RawInstance, "mtype", zones)
   117  
   118  	c.Check(errors.Cause(err), gc.Equals, failure)
   119  }
   120  
   121  func (s *connSuite) TestConnectionAddInstanceWaitFailed(c *gc.C) {
   122  	s.FakeConn.Instance = &s.RawInstanceFull
   123  
   124  	failure := s.NewWaitError(nil, errors.New("unknown"))
   125  	s.FakeConn.Err = failure
   126  
   127  	zones := []string{"a-zone"}
   128  	err := google.ConnAddInstance(s.Conn, &s.RawInstance, "mtype", zones)
   129  
   130  	c.Check(errors.Cause(err), gc.Equals, failure)
   131  }
   132  
   133  func (s *connSuite) TestConnectionAddInstanceGetFailed(c *gc.C) {
   134  	s.FakeConn.Instance = &s.RawInstanceFull
   135  
   136  	failure := errors.New("unknown")
   137  	s.FakeConn.Err = failure
   138  	s.FakeConn.FailOnCall = 1
   139  
   140  	zones := []string{"a-zone"}
   141  	err := google.ConnAddInstance(s.Conn, &s.RawInstance, "mtype", zones)
   142  
   143  	c.Check(errors.Cause(err), gc.Equals, failure)
   144  	c.Check(s.FakeConn.Calls, gc.HasLen, 2)
   145  }
   146  
   147  func (s *connSuite) TestConnectionInstance(c *gc.C) {
   148  	s.FakeConn.Instance = &s.RawInstanceFull
   149  
   150  	inst, err := s.Conn.Instance("spam", "a-zone")
   151  	c.Assert(err, jc.ErrorIsNil)
   152  
   153  	c.Check(inst.ID, gc.Equals, "spam")
   154  	c.Check(inst.ZoneName, gc.Equals, "a-zone")
   155  	c.Check(inst.Status(), gc.Equals, google.StatusRunning)
   156  	c.Check(inst.Metadata(), jc.DeepEquals, s.Metadata)
   157  	c.Check(inst.Addresses(), jc.DeepEquals, s.Addresses)
   158  	spec := google.GetInstanceSpec(&inst)
   159  	c.Check(spec, gc.IsNil)
   160  }
   161  
   162  func (s *connSuite) TestConnectionInstanceAPI(c *gc.C) {
   163  	s.FakeConn.Instance = &s.RawInstanceFull
   164  
   165  	_, err := s.Conn.Instance("ham", "a-zone")
   166  	c.Assert(err, jc.ErrorIsNil)
   167  
   168  	c.Check(s.FakeConn.Calls, gc.HasLen, 1)
   169  	c.Check(s.FakeConn.Calls[0].FuncName, gc.Equals, "GetInstance")
   170  	c.Check(s.FakeConn.Calls[0].ProjectID, gc.Equals, "spam")
   171  	c.Check(s.FakeConn.Calls[0].ID, gc.Equals, "ham")
   172  	c.Check(s.FakeConn.Calls[0].ZoneName, gc.Equals, "a-zone")
   173  }
   174  
   175  func (s *connSuite) TestConnectionInstanceFail(c *gc.C) {
   176  	failure := errors.New("<unknown>")
   177  	s.FakeConn.Err = failure
   178  
   179  	_, err := s.Conn.Instance("spam", "a-zone")
   180  
   181  	c.Check(errors.Cause(err), gc.Equals, failure)
   182  }
   183  
   184  func (s *connSuite) TestConnectionInstances(c *gc.C) {
   185  	s.FakeConn.Instances = []*compute.Instance{&s.RawInstanceFull}
   186  
   187  	insts, err := s.Conn.Instances("sp", google.StatusRunning)
   188  	c.Assert(err, jc.ErrorIsNil)
   189  
   190  	google.SetInstanceSpec(&s.Instance, nil)
   191  	c.Check(insts, jc.DeepEquals, []google.Instance{s.Instance})
   192  }
   193  
   194  func (s *connSuite) TestConnectionInstancesFailure(c *gc.C) {
   195  	failure := errors.New("<unknown>")
   196  	s.FakeConn.Err = failure
   197  	_, err := s.Conn.Instances("sp", google.StatusRunning)
   198  
   199  	c.Check(errors.Cause(err), gc.Equals, failure)
   200  }
   201  
   202  func (s *connSuite) TestConnectionRemoveInstance(c *gc.C) {
   203  	err := google.ConnRemoveInstance(s.Conn, "spam", "a-zone")
   204  
   205  	c.Check(err, jc.ErrorIsNil)
   206  }
   207  
   208  func (s *connSuite) TestConnectionRemoveInstanceAPI(c *gc.C) {
   209  	err := google.ConnRemoveInstance(s.Conn, "spam", "a-zone")
   210  	c.Assert(err, jc.ErrorIsNil)
   211  
   212  	c.Check(s.FakeConn.Calls, gc.HasLen, 2)
   213  	c.Check(s.FakeConn.Calls[0].FuncName, gc.Equals, "RemoveInstance")
   214  	c.Check(s.FakeConn.Calls[0].ProjectID, gc.Equals, "spam")
   215  	c.Check(s.FakeConn.Calls[0].ZoneName, gc.Equals, "a-zone")
   216  	c.Check(s.FakeConn.Calls[0].ID, gc.Equals, "spam")
   217  	c.Check(s.FakeConn.Calls[1].FuncName, gc.Equals, "RemoveFirewall")
   218  	c.Check(s.FakeConn.Calls[1].ProjectID, gc.Equals, "spam")
   219  	c.Check(s.FakeConn.Calls[1].Name, gc.Equals, "spam")
   220  }
   221  
   222  func (s *connSuite) TestConnectionRemoveInstanceFailed(c *gc.C) {
   223  	failure := errors.New("<unknown>")
   224  	s.FakeConn.Err = failure
   225  
   226  	err := google.ConnRemoveInstance(s.Conn, "spam", "a-zone")
   227  
   228  	c.Check(errors.Cause(err), gc.Equals, failure)
   229  }
   230  
   231  func (s *connSuite) TestConnectionRemoveInstanceFirewallFailed(c *gc.C) {
   232  	failure := errors.New("<unknown>")
   233  	s.FakeConn.Err = failure
   234  	s.FakeConn.FailOnCall = 1
   235  
   236  	err := google.ConnRemoveInstance(s.Conn, "spam", "a-zone")
   237  
   238  	c.Check(errors.Cause(err), gc.Equals, failure)
   239  	c.Check(s.FakeConn.Calls, gc.HasLen, 2)
   240  }
   241  
   242  func (s *connSuite) TestConnectionRemoveInstances(c *gc.C) {
   243  	s.FakeConn.Instances = []*compute.Instance{&s.RawInstanceFull}
   244  
   245  	err := s.Conn.RemoveInstances("sp", "spam")
   246  
   247  	c.Check(err, jc.ErrorIsNil)
   248  }
   249  
   250  func (s *connSuite) TestConnectionRemoveInstancesAPI(c *gc.C) {
   251  	s.FakeConn.Instances = []*compute.Instance{&s.RawInstanceFull}
   252  
   253  	err := s.Conn.RemoveInstances("sp", "spam")
   254  	c.Assert(err, jc.ErrorIsNil)
   255  
   256  	c.Check(s.FakeConn.Calls, gc.HasLen, 3)
   257  	c.Check(s.FakeConn.Calls[0].FuncName, gc.Equals, "ListInstances")
   258  	c.Check(s.FakeConn.Calls[1].FuncName, gc.Equals, "RemoveInstance")
   259  	c.Check(s.FakeConn.Calls[1].ID, gc.Equals, "spam")
   260  	c.Check(s.FakeConn.Calls[2].FuncName, gc.Equals, "RemoveFirewall")
   261  	c.Check(s.FakeConn.Calls[2].Name, gc.Equals, "spam")
   262  }
   263  
   264  func (s *connSuite) TestConnectionRemoveInstancesMultiple(c *gc.C) {
   265  	s.FakeConn.Instances = []*compute.Instance{
   266  		&s.RawInstanceFull,
   267  		&compute.Instance{
   268  			Name: "special",
   269  			Zone: "a-zone",
   270  		},
   271  	}
   272  
   273  	err := s.Conn.RemoveInstances("", "spam", "special")
   274  	c.Assert(err, jc.ErrorIsNil)
   275  
   276  	c.Check(s.FakeConn.Calls, gc.HasLen, 5)
   277  	c.Check(s.FakeConn.Calls[0].FuncName, gc.Equals, "ListInstances")
   278  	c.Check(s.FakeConn.Calls[1].FuncName, gc.Equals, "RemoveInstance")
   279  	c.Check(s.FakeConn.Calls[1].ID, gc.Equals, "spam")
   280  	c.Check(s.FakeConn.Calls[2].FuncName, gc.Equals, "RemoveFirewall")
   281  	c.Check(s.FakeConn.Calls[2].Name, gc.Equals, "spam")
   282  	c.Check(s.FakeConn.Calls[3].FuncName, gc.Equals, "RemoveInstance")
   283  	c.Check(s.FakeConn.Calls[3].ID, gc.Equals, "special")
   284  	c.Check(s.FakeConn.Calls[4].FuncName, gc.Equals, "RemoveFirewall")
   285  	c.Check(s.FakeConn.Calls[4].Name, gc.Equals, "special")
   286  }
   287  
   288  func (s *connSuite) TestConnectionRemoveInstancesPartialMatch(c *gc.C) {
   289  	s.FakeConn.Instances = []*compute.Instance{
   290  		&s.RawInstanceFull,
   291  		&compute.Instance{
   292  			Name: "special",
   293  			Zone: "a-zone",
   294  		},
   295  	}
   296  
   297  	err := s.Conn.RemoveInstances("", "spam")
   298  	c.Assert(err, jc.ErrorIsNil)
   299  
   300  	c.Check(s.FakeConn.Calls, gc.HasLen, 3)
   301  	c.Check(s.FakeConn.Calls[0].FuncName, gc.Equals, "ListInstances")
   302  	c.Check(s.FakeConn.Calls[1].FuncName, gc.Equals, "RemoveInstance")
   303  	c.Check(s.FakeConn.Calls[1].ID, gc.Equals, "spam")
   304  	c.Check(s.FakeConn.Calls[2].FuncName, gc.Equals, "RemoveFirewall")
   305  	c.Check(s.FakeConn.Calls[2].Name, gc.Equals, "spam")
   306  }
   307  
   308  func (s *connSuite) TestConnectionRemoveInstancesListFailed(c *gc.C) {
   309  	failure := errors.New("<unknown>")
   310  	s.FakeConn.Err = failure
   311  
   312  	err := s.Conn.RemoveInstances("sp", "spam")
   313  
   314  	c.Check(errors.Cause(err), gc.Equals, failure)
   315  }
   316  
   317  func (s *connSuite) TestConnectionRemoveInstancesRemoveFailed(c *gc.C) {
   318  	s.FakeConn.Instances = []*compute.Instance{&s.RawInstanceFull}
   319  	failure := errors.New("<unknown>")
   320  	s.FakeConn.Err = failure
   321  	s.FakeConn.FailOnCall = 2
   322  
   323  	err := s.Conn.RemoveInstances("sp", "spam")
   324  
   325  	c.Check(err, gc.ErrorMatches, ".*some instance removals failed: .*")
   326  }