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 {¶ms.Error{Message: "x0 fails"}}, 92 {nil}, 93 {nil}, 94 {nil}, 95 {¶ms.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 {¶ms.Error{Message: "x0 fails"}}, 174 {nil}, 175 {nil}, 176 {¶ms.Error{Message: "x3 error"}}, 177 {¶ms.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 }