github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/api/machinemanager/machinemanager_test.go (about)

     1  // Copyright 2015 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package machinemanager_test
     5  
     6  import (
     7  	"errors"
     8  	"fmt"
     9  
    10  	jc "github.com/juju/testing/checkers"
    11  	gc "gopkg.in/check.v1"
    12  
    13  	basetesting "github.com/juju/juju/api/base/testing"
    14  	"github.com/juju/juju/api/machinemanager"
    15  	"github.com/juju/juju/apiserver/params"
    16  	"github.com/juju/juju/storage"
    17  	coretesting "github.com/juju/juju/testing"
    18  )
    19  
    20  var _ = gc.Suite(&MachinemanagerSuite{})
    21  
    22  type MachinemanagerSuite struct {
    23  	coretesting.BaseSuite
    24  }
    25  
    26  func newClient(f basetesting.APICallerFunc) *machinemanager.Client {
    27  	return machinemanager.NewClient(f)
    28  }
    29  
    30  func (s *MachinemanagerSuite) TestAddMachines(c *gc.C) {
    31  	apiResult := []params.AddMachinesResult{
    32  		{Machine: "machine-1", Error: nil},
    33  		{Machine: "machine-2", Error: nil},
    34  	}
    35  
    36  	var callCount int
    37  	st := newClient(func(objType string, version int, id, request string, arg, result interface{}) error {
    38  		c.Check(objType, gc.Equals, "MachineManager")
    39  		c.Check(version, gc.Equals, 0)
    40  		c.Check(id, gc.Equals, "")
    41  		c.Check(request, gc.Equals, "AddMachines")
    42  		c.Check(arg, gc.DeepEquals, params.AddMachines{
    43  			MachineParams: []params.AddMachineParams{
    44  				{
    45  					Series: "trusty",
    46  					Disks:  []storage.Constraints{{Pool: "loop", Size: 1}},
    47  				},
    48  				{
    49  					Series: "precise",
    50  				},
    51  			},
    52  		})
    53  		c.Assert(result, gc.FitsTypeOf, &params.AddMachinesResults{})
    54  		*(result.(*params.AddMachinesResults)) = params.AddMachinesResults{
    55  			Machines: apiResult,
    56  		}
    57  		callCount++
    58  		return nil
    59  	})
    60  
    61  	machines := []params.AddMachineParams{{
    62  		Series: "trusty",
    63  		Disks:  []storage.Constraints{{Pool: "loop", Size: 1}},
    64  	}, {
    65  		Series: "precise",
    66  	}}
    67  	result, err := st.AddMachines(machines)
    68  	c.Check(err, jc.ErrorIsNil)
    69  	c.Assert(result, jc.DeepEquals, apiResult)
    70  	c.Check(callCount, gc.Equals, 1)
    71  }
    72  
    73  func (s *MachinemanagerSuite) TestAddMachinesClientError(c *gc.C) {
    74  	st := newClient(func(objType string, version int, id, request string, arg, result interface{}) error {
    75  		return errors.New("blargh")
    76  	})
    77  	_, err := st.AddMachines(nil)
    78  	c.Check(err, gc.ErrorMatches, "blargh")
    79  }
    80  
    81  func (s *MachinemanagerSuite) TestAddMachinesServerError(c *gc.C) {
    82  	apiResult := []params.AddMachinesResult{{
    83  		Error: &params.Error{Message: "MSG", Code: "621"},
    84  	}}
    85  
    86  	st := newClient(func(objType string, version int, id, request string, arg, result interface{}) error {
    87  		*(result.(*params.AddMachinesResults)) = params.AddMachinesResults{
    88  			Machines: apiResult,
    89  		}
    90  		return nil
    91  	})
    92  	machines := []params.AddMachineParams{{
    93  		Series: "trusty",
    94  	}}
    95  	results, err := st.AddMachines(machines)
    96  	c.Check(err, jc.ErrorIsNil)
    97  	c.Assert(results, jc.DeepEquals, apiResult)
    98  }
    99  
   100  func (s *MachinemanagerSuite) TestAddMachinesResultCountInvalid(c *gc.C) {
   101  	for _, n := range []int{0, 2} {
   102  		st := newClient(func(objType string, version int, id, request string, arg, result interface{}) error {
   103  			var results []params.AddMachinesResult
   104  			for i := 0; i < n; i++ {
   105  				results = append(results, params.AddMachinesResult{
   106  					Error: &params.Error{Message: "MSG", Code: "621"},
   107  				})
   108  			}
   109  			*(result.(*params.AddMachinesResults)) = params.AddMachinesResults{Machines: results}
   110  			return nil
   111  		})
   112  		machines := []params.AddMachineParams{{
   113  			Series: "trusty",
   114  		}}
   115  		_, err := st.AddMachines(machines)
   116  		c.Check(err, gc.ErrorMatches, fmt.Sprintf("expected 1 result, got %d", n))
   117  	}
   118  }
   119  
   120  func (s *MachinemanagerSuite) TestDestroyMachines(c *gc.C) {
   121  	s.testDestroyMachines(c, "DestroyMachine", (*machinemanager.Client).DestroyMachines)
   122  }
   123  
   124  func (s *MachinemanagerSuite) TestForceDestroyMachines(c *gc.C) {
   125  	s.testDestroyMachines(c, "ForceDestroyMachine", (*machinemanager.Client).ForceDestroyMachines)
   126  }
   127  
   128  func (s *MachinemanagerSuite) testDestroyMachines(
   129  	c *gc.C,
   130  	methodName string,
   131  	method func(*machinemanager.Client, ...string) ([]params.DestroyMachineResult, error),
   132  ) {
   133  	expectedResults := []params.DestroyMachineResult{{
   134  		Error: &params.Error{Message: "boo"},
   135  	}, {
   136  		Info: &params.DestroyMachineInfo{
   137  			DestroyedUnits:   []params.Entity{{Tag: "unit-foo-0"}},
   138  			DestroyedStorage: []params.Entity{{Tag: "storage-pgdata-0"}},
   139  			DetachedStorage:  []params.Entity{{Tag: "storage-pgdata-1"}},
   140  		},
   141  	}}
   142  	client := newClient(func(objType string, version int, id, request string, a, response interface{}) error {
   143  		c.Assert(request, gc.Equals, methodName)
   144  		c.Assert(a, jc.DeepEquals, params.Entities{
   145  			Entities: []params.Entity{
   146  				{Tag: "machine-0"},
   147  				{Tag: "machine-0-lxd-1"},
   148  			},
   149  		})
   150  		c.Assert(response, gc.FitsTypeOf, &params.DestroyMachineResults{})
   151  		out := response.(*params.DestroyMachineResults)
   152  		*out = params.DestroyMachineResults{Results: expectedResults}
   153  		return nil
   154  	})
   155  	results, err := method(client, "0", "0/lxd/1")
   156  	c.Assert(err, jc.ErrorIsNil)
   157  	c.Assert(results, jc.DeepEquals, expectedResults)
   158  }
   159  
   160  func (s *MachinemanagerSuite) TestDestroyMachinesArity(c *gc.C) {
   161  	client := newClient(func(objType string, version int, id, request string, a, response interface{}) error {
   162  		return nil
   163  	})
   164  	_, err := client.DestroyMachines("0")
   165  	c.Assert(err, gc.ErrorMatches, `expected 1 result\(s\), got 0`)
   166  }
   167  
   168  func (s *MachinemanagerSuite) TestDestroyMachinesInvalidIds(c *gc.C) {
   169  	expectedResults := []params.DestroyMachineResult{{
   170  		Error: &params.Error{Message: `machine ID "!" not valid`},
   171  	}, {
   172  		Info: &params.DestroyMachineInfo{},
   173  	}}
   174  	client := newClient(func(objType string, version int, id, request string, a, response interface{}) error {
   175  		out := response.(*params.DestroyMachineResults)
   176  		*out = params.DestroyMachineResults{Results: expectedResults[1:]}
   177  		return nil
   178  	})
   179  	results, err := client.DestroyMachines("!", "0")
   180  	c.Assert(err, jc.ErrorIsNil)
   181  	c.Assert(results, jc.DeepEquals, expectedResults)
   182  }
   183  
   184  func (s *MachinemanagerSuite) TestDestroyMachinesWithParams(c *gc.C) {
   185  	expectedResults := []params.DestroyMachineResult{{
   186  		Error: &params.Error{Message: "boo"},
   187  	}, {
   188  		Info: &params.DestroyMachineInfo{
   189  			DestroyedUnits:   []params.Entity{{Tag: "unit-foo-0"}},
   190  			DestroyedStorage: []params.Entity{{Tag: "storage-pgdata-0"}},
   191  			DetachedStorage:  []params.Entity{{Tag: "storage-pgdata-1"}},
   192  		},
   193  	}}
   194  	client := newClient(func(objType string, version int, id, request string, a, response interface{}) error {
   195  		c.Assert(request, gc.Equals, "DestroyMachineWithParams")
   196  		c.Assert(a, jc.DeepEquals, params.DestroyMachinesParams{
   197  			Keep:  true,
   198  			Force: true,
   199  			MachineTags: []string{
   200  				"machine-0",
   201  				"machine-0-lxd-1",
   202  			},
   203  		})
   204  		c.Assert(response, gc.FitsTypeOf, &params.DestroyMachineResults{})
   205  		out := response.(*params.DestroyMachineResults)
   206  		*out = params.DestroyMachineResults{Results: expectedResults}
   207  		return nil
   208  	})
   209  	results, err := client.DestroyMachinesWithParams(true, true, "0", "0/lxd/1")
   210  	c.Assert(err, jc.ErrorIsNil)
   211  	c.Assert(results, jc.DeepEquals, expectedResults)
   212  }