github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/apiserver/facades/agent/diskmanager/diskmanager_test.go (about)

     1  // Copyright 2014 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package diskmanager_test
     5  
     6  import (
     7  	"errors"
     8  
     9  	jc "github.com/juju/testing/checkers"
    10  	gc "gopkg.in/check.v1"
    11  	"gopkg.in/juju/names.v2"
    12  
    13  	"github.com/juju/juju/apiserver/common"
    14  	"github.com/juju/juju/apiserver/facades/agent/diskmanager"
    15  	"github.com/juju/juju/apiserver/params"
    16  	apiservertesting "github.com/juju/juju/apiserver/testing"
    17  	"github.com/juju/juju/state"
    18  	"github.com/juju/juju/storage"
    19  	coretesting "github.com/juju/juju/testing"
    20  )
    21  
    22  var _ = gc.Suite(&DiskManagerSuite{})
    23  
    24  type DiskManagerSuite struct {
    25  	coretesting.BaseSuite
    26  	resources  *common.Resources
    27  	authorizer *apiservertesting.FakeAuthorizer
    28  	st         *mockState
    29  	api        *diskmanager.DiskManagerAPI
    30  }
    31  
    32  func (s *DiskManagerSuite) SetUpTest(c *gc.C) {
    33  	s.BaseSuite.SetUpTest(c)
    34  	s.resources = common.NewResources()
    35  	tag := names.NewMachineTag("0")
    36  	s.authorizer = &apiservertesting.FakeAuthorizer{Tag: tag}
    37  	s.st = &mockState{}
    38  	diskmanager.PatchState(s, s.st)
    39  
    40  	var err error
    41  	s.api, err = diskmanager.NewDiskManagerAPI(nil, nil, s.authorizer)
    42  	c.Assert(err, jc.ErrorIsNil)
    43  }
    44  
    45  func (s *DiskManagerSuite) TestSetMachineBlockDevices(c *gc.C) {
    46  	devices := []storage.BlockDevice{{DeviceName: "sda"}, {DeviceName: "sdb"}}
    47  	results, err := s.api.SetMachineBlockDevices(params.SetMachineBlockDevices{
    48  		MachineBlockDevices: []params.MachineBlockDevices{{
    49  			Machine:      "machine-0",
    50  			BlockDevices: devices,
    51  		}},
    52  	})
    53  	c.Assert(err, jc.ErrorIsNil)
    54  	c.Assert(results, gc.DeepEquals, params.ErrorResults{
    55  		Results: []params.ErrorResult{{Error: nil}},
    56  	})
    57  }
    58  
    59  func (s *DiskManagerSuite) TestSetMachineBlockDevicesEmptyArgs(c *gc.C) {
    60  	results, err := s.api.SetMachineBlockDevices(params.SetMachineBlockDevices{})
    61  	c.Assert(err, jc.ErrorIsNil)
    62  	c.Assert(results.Results, gc.HasLen, 0)
    63  }
    64  
    65  func (s *DiskManagerSuite) TestNewDiskManagerAPINonMachine(c *gc.C) {
    66  	tag := names.NewUnitTag("mysql/0")
    67  	s.authorizer = &apiservertesting.FakeAuthorizer{Tag: tag}
    68  	_, err := diskmanager.NewDiskManagerAPI(nil, nil, s.authorizer)
    69  	c.Assert(err, gc.ErrorMatches, "permission denied")
    70  }
    71  
    72  func (s *DiskManagerSuite) TestSetMachineBlockDevicesInvalidTags(c *gc.C) {
    73  	results, err := s.api.SetMachineBlockDevices(params.SetMachineBlockDevices{
    74  		MachineBlockDevices: []params.MachineBlockDevices{{
    75  			Machine: "machine-0",
    76  		}, {
    77  			Machine: "machine-1",
    78  		}, {
    79  			Machine: "unit-mysql-0",
    80  		}},
    81  	})
    82  	c.Assert(err, jc.ErrorIsNil)
    83  	c.Assert(results, gc.DeepEquals, params.ErrorResults{
    84  		Results: []params.ErrorResult{{
    85  			Error: nil,
    86  		}, {
    87  			Error: &params.Error{Message: "permission denied", Code: "unauthorized access"},
    88  		}, {
    89  			Error: &params.Error{Message: "permission denied", Code: "unauthorized access"},
    90  		}},
    91  	})
    92  	c.Assert(s.st.calls, gc.Equals, 1)
    93  }
    94  
    95  func (s *DiskManagerSuite) TestSetMachineBlockDevicesStateError(c *gc.C) {
    96  	s.st.err = errors.New("boom")
    97  	results, err := s.api.SetMachineBlockDevices(params.SetMachineBlockDevices{
    98  		MachineBlockDevices: []params.MachineBlockDevices{{
    99  			Machine: "machine-0",
   100  		}},
   101  	})
   102  	c.Assert(err, jc.ErrorIsNil)
   103  	c.Assert(results, gc.DeepEquals, params.ErrorResults{
   104  		Results: []params.ErrorResult{{
   105  			Error: &params.Error{Message: "boom", Code: ""},
   106  		}},
   107  	})
   108  }
   109  
   110  type mockState struct {
   111  	calls   int
   112  	devices map[string][]state.BlockDeviceInfo
   113  	err     error
   114  }
   115  
   116  func (st *mockState) SetMachineBlockDevices(machineId string, devices []state.BlockDeviceInfo) error {
   117  	st.calls++
   118  	if st.devices == nil {
   119  		st.devices = make(map[string][]state.BlockDeviceInfo)
   120  	}
   121  	st.devices[machineId] = devices
   122  	return st.err
   123  }