github.com/altoros/juju-vmware@v0.0.0-20150312064031-f19ae857ccca/apiserver/common/setstatus_test.go (about)

     1  // Copyright 2013 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package common_test
     5  
     6  import (
     7  	"fmt"
     8  
     9  	jc "github.com/juju/testing/checkers"
    10  	gc "gopkg.in/check.v1"
    11  
    12  	"github.com/juju/juju/apiserver/common"
    13  	"github.com/juju/juju/apiserver/params"
    14  	apiservertesting "github.com/juju/juju/apiserver/testing"
    15  	"github.com/juju/juju/state"
    16  	"github.com/juju/names"
    17  )
    18  
    19  type statusSetterSuite struct{}
    20  
    21  var _ = gc.Suite(&statusSetterSuite{})
    22  
    23  var _ state.StatusSetter = new(fakeStatusSetter)
    24  
    25  type fakeStatusSetter struct {
    26  	state.Entity
    27  	status state.Status
    28  	info   string
    29  	data   map[string]interface{}
    30  	err    error
    31  	fetchError
    32  }
    33  
    34  func (s *fakeStatusSetter) SetStatus(status state.Status, info string, data map[string]interface{}) error {
    35  	s.status = status
    36  	s.info = info
    37  	s.data = data
    38  	return s.err
    39  }
    40  
    41  func (s *fakeStatusSetter) Status() (status state.Status, info string, data map[string]interface{}, err error) {
    42  	return s.status, s.info, s.data, nil
    43  }
    44  
    45  func (s *fakeStatusSetter) UpdateStatus(data map[string]interface{}) error {
    46  	for k, v := range data {
    47  		s.data[k] = v
    48  	}
    49  	return s.err
    50  }
    51  
    52  func (*statusSetterSuite) TestSetStatus(c *gc.C) {
    53  	st := &fakeState{
    54  		entities: map[names.Tag]entityWithError{
    55  			u("x/0"): &fakeStatusSetter{status: state.StatusAllocating, info: "blah", err: fmt.Errorf("x0 fails")},
    56  			u("x/1"): &fakeStatusSetter{status: state.StatusInstalling, info: "blah"},
    57  			u("x/2"): &fakeStatusSetter{status: state.StatusActive, info: "foo"},
    58  			u("x/3"): &fakeStatusSetter{status: state.StatusError, info: "some info"},
    59  			u("x/4"): &fakeStatusSetter{fetchError: "x3 error"},
    60  			u("x/5"): &fakeStatusSetter{status: state.StatusStopping, info: "blah"},
    61  		},
    62  	}
    63  	getCanModify := func() (common.AuthFunc, error) {
    64  		x0 := u("x/0")
    65  		x1 := u("x/1")
    66  		x2 := u("x/2")
    67  		x3 := u("x/3")
    68  		x4 := u("x/4")
    69  		x5 := u("x/5")
    70  		return func(tag names.Tag) bool {
    71  			return tag == x0 || tag == x1 || tag == x2 || tag == x3 || tag == x4 || tag == x5
    72  		}, nil
    73  	}
    74  	s := common.NewStatusSetter(st, getCanModify)
    75  	args := params.SetStatus{
    76  		Entities: []params.EntityStatus{
    77  			{"unit-x-0", params.StatusInstalling, "bar", nil},
    78  			{"unit-x-1", params.StatusActive, "bar", nil},
    79  			{"unit-x-2", params.StatusStopping, "", nil},
    80  			{"unit-x-3", params.StatusAllocating, "not really", nil},
    81  			{"unit-x-4", params.StatusStopping, "", nil},
    82  			{"unit-x-5", params.StatusError, "blarg", nil},
    83  			{"unit-x-6", params.StatusActive, "42", nil},
    84  			{"unit-x-7", params.StatusActive, "bar", nil},
    85  		},
    86  	}
    87  	result, err := s.SetStatus(args)
    88  	c.Assert(err, jc.ErrorIsNil)
    89  	c.Assert(result, gc.DeepEquals, params.ErrorResults{
    90  		Results: []params.ErrorResult{
    91  			{&params.Error{Message: "x0 fails"}},
    92  			{nil},
    93  			{nil},
    94  			{nil},
    95  			{&params.Error{Message: "x3 error"}},
    96  			{nil},
    97  			{apiservertesting.ErrUnauthorized},
    98  			{apiservertesting.ErrUnauthorized},
    99  		},
   100  	})
   101  	get := func(tag names.Tag) *fakeStatusSetter {
   102  		return st.entities[tag].(*fakeStatusSetter)
   103  	}
   104  	c.Assert(get(u("x/1")).status, gc.Equals, state.StatusActive)
   105  	c.Assert(get(u("x/1")).info, gc.Equals, "bar")
   106  	c.Assert(get(u("x/2")).status, gc.Equals, state.StatusStopping)
   107  	c.Assert(get(u("x/2")).info, gc.Equals, "")
   108  	c.Assert(get(u("x/3")).status, gc.Equals, state.StatusAllocating)
   109  	c.Assert(get(u("x/3")).info, gc.Equals, "not really")
   110  	c.Assert(get(u("x/5")).status, gc.Equals, state.StatusError)
   111  	c.Assert(get(u("x/5")).info, gc.Equals, "blarg")
   112  }
   113  
   114  func (*statusSetterSuite) TestSetStatusError(c *gc.C) {
   115  	getCanModify := func() (common.AuthFunc, error) {
   116  		return nil, fmt.Errorf("pow")
   117  	}
   118  	s := common.NewStatusSetter(&fakeState{}, getCanModify)
   119  	args := params.SetStatus{
   120  		Entities: []params.EntityStatus{{"x0", "", "", nil}},
   121  	}
   122  	_, err := s.SetStatus(args)
   123  	c.Assert(err, gc.ErrorMatches, "pow")
   124  }
   125  
   126  func (*statusSetterSuite) TestSetStatusNoArgsNoError(c *gc.C) {
   127  	getCanModify := func() (common.AuthFunc, error) {
   128  		return nil, fmt.Errorf("pow")
   129  	}
   130  	s := common.NewStatusSetter(&fakeState{}, getCanModify)
   131  	result, err := s.SetStatus(params.SetStatus{})
   132  	c.Assert(err, jc.ErrorIsNil)
   133  	c.Assert(result.Results, gc.HasLen, 0)
   134  }
   135  
   136  func (*statusSetterSuite) TestUpdateStatus(c *gc.C) {
   137  	st := &fakeState{
   138  		entities: map[names.Tag]entityWithError{
   139  			m("0"): &fakeStatusSetter{status: state.StatusAllocating, info: "blah", err: fmt.Errorf("x0 fails")},
   140  			m("1"): &fakeStatusSetter{status: state.StatusError, info: "foo", data: map[string]interface{}{"foo": "blah"}},
   141  			m("2"): &fakeStatusSetter{status: state.StatusError, info: "some info"},
   142  			m("3"): &fakeStatusSetter{fetchError: "x3 error"},
   143  			m("4"): &fakeStatusSetter{status: state.StatusActive},
   144  			m("5"): &fakeStatusSetter{status: state.StatusStopping, info: ""},
   145  		},
   146  	}
   147  	getCanModify := func() (common.AuthFunc, error) {
   148  		x0 := m("0")
   149  		x1 := m("1")
   150  		x2 := m("2")
   151  		x3 := m("3")
   152  		x4 := m("4")
   153  		return func(tag names.Tag) bool {
   154  			return tag == x0 || tag == x1 || tag == x2 || tag == x3 || tag == x4
   155  		}, nil
   156  	}
   157  	s := common.NewStatusSetter(st, getCanModify)
   158  	args := params.SetStatus{
   159  		Entities: []params.EntityStatus{
   160  			{Tag: "machine-0", Data: nil},
   161  			{Tag: "machine-1", Data: nil},
   162  			{Tag: "machine-2", Data: map[string]interface{}{"foo": "bar"}},
   163  			{Tag: "machine-3", Data: map[string]interface{}{"foo": "bar"}},
   164  			{Tag: "machine-4", Data: map[string]interface{}{"foo": "bar"}},
   165  			{Tag: "machine-5", Data: map[string]interface{}{"foo": "bar"}},
   166  			{Tag: "machine-6", Data: nil},
   167  		},
   168  	}
   169  	result, err := s.UpdateStatus(args)
   170  	c.Assert(err, jc.ErrorIsNil)
   171  	c.Assert(result, gc.DeepEquals, params.ErrorResults{
   172  		Results: []params.ErrorResult{
   173  			{&params.Error{Message: "x0 fails"}},
   174  			{nil},
   175  			{nil},
   176  			{&params.Error{Message: "x3 error"}},
   177  			{&params.Error{Message: "machine 4 is not in an error state"}},
   178  			{apiservertesting.ErrUnauthorized},
   179  			{apiservertesting.ErrUnauthorized},
   180  		},
   181  	})
   182  	get := func(tag names.Tag) *fakeStatusSetter {
   183  		return st.entities[tag].(*fakeStatusSetter)
   184  	}
   185  	c.Assert(get(m("1")).status, gc.Equals, state.StatusError)
   186  	c.Assert(get(m("1")).info, gc.Equals, "foo")
   187  	c.Assert(get(m("1")).data, gc.DeepEquals, map[string]interface{}{"foo": "blah"})
   188  	c.Assert(get(m("2")).status, gc.Equals, state.StatusError)
   189  	c.Assert(get(m("2")).info, gc.Equals, "some info")
   190  	c.Assert(get(m("2")).data, gc.DeepEquals, map[string]interface{}{"foo": "bar"})
   191  }